{
  "version": 3,
  "sources": ["twenty-sdk-define-stub:__twenty-sdk-define-stub__", "../../../src/constants/universal-identifiers.ts", "../../../src/crypto.ts", "../../../src/types.ts", "../../../src/handlers/shared.ts", "../../../src/handlers/register.ts", "../../../node_modules/twenty-sdk/src/sdk/logic-function/connections/errors/app-connection-auth-failed.error.ts", "../../../node_modules/twenty-shared/dist/application.mjs", "../../../node_modules/twenty-sdk/src/sdk/logic-function/utils/post-graphql-request.util.ts", "../../../node_modules/twenty-sdk/src/sdk/logic-function/connections/get-connection.ts", "../../../node_modules/twenty-sdk/src/sdk/logic-function/connections/list-connections.ts", "../../../node_modules/twenty-sdk/src/sdk/logic-function/connections/find-connection-for-request.ts", "../../../node_modules/twenty-sdk/src/sdk/logic-function/agents/run-agent.ts", "../../../node_modules/twenty-sdk/src/sdk/logic-function/response.ts", "../../../src/config.ts", "../../../src/rateLimiter.ts", "../../../src/relayClient.ts", "../../../src/twentyRepository.ts", "../../../src/routeRuntime.ts", "../../../src/register.logic-function.ts"],
  "sourcesContent": ["\n// Auto-generated stub for twenty-sdk/define injected by the SDK CLI build.\n// Real implementations would pull in zod, twenty-shared and ~1MB of code; at\n// runtime only `default.config.handler` is consumed, so tiny no-ops suffice.\nconst __defineFactoryStub = (config) => ({\n  success: true,\n  config,\n  errors: [],\n});\n\nconst __anyHandler = {\n  get(_target, prop) {\n    if (prop === '__esModule') return true;\n    if (prop === Symbol.toPrimitive) return () => '';\n    if (typeof prop === 'symbol') return undefined;\n    return new Proxy(() => undefined, __anyHandler);\n  },\n  apply() {\n    return new Proxy(() => undefined, __anyHandler);\n  },\n};\nconst __anyStub = new Proxy(() => undefined, __anyHandler);\n\nexport const createValidationResult = __defineFactoryStub;\nexport const defineAgent = __defineFactoryStub;\nexport const defineApplication = __defineFactoryStub;\nexport const defineApplicationRole = __defineFactoryStub;\nexport const defineCommandMenuItem = __defineFactoryStub;\nexport const defineConnectionProvider = __defineFactoryStub;\nexport const defineField = __defineFactoryStub;\nexport const defineFrontComponent = __defineFactoryStub;\nexport const defineIndex = __defineFactoryStub;\nexport const defineLogicFunction = __defineFactoryStub;\nexport const defineNavigationMenuItem = __defineFactoryStub;\nexport const defineObject = __defineFactoryStub;\nexport const definePageLayout = __defineFactoryStub;\nexport const definePageLayoutTab = __defineFactoryStub;\nexport const definePermissionFlag = __defineFactoryStub;\nexport const definePostInstallLogicFunction = __defineFactoryStub;\nexport const definePreInstallLogicFunction = __defineFactoryStub;\nexport const defineRole = __defineFactoryStub;\nexport const defineSkill = __defineFactoryStub;\nexport const defineView = __defineFactoryStub;\nexport const defineViewField = __defineFactoryStub;\nexport const AggregateOperations = __anyStub;\nexport const DateDisplayFormat = __anyStub;\nexport const FieldMetadataSettingsOnClickAction = __anyStub;\nexport const FieldType = __anyStub;\nexport const HTTPMethod = __anyStub;\nexport const NavigationMenuItemType = __anyStub;\nexport const NumberDataType = __anyStub;\nexport const ObjectRecordGroupByDateGranularity = __anyStub;\nexport const OnDeleteAction = __anyStub;\nexport const PageLayoutTabLayoutMode = __anyStub;\nexport const RelationType = __anyStub;\nexport const STANDARD_OBJECT = __anyStub;\nexport const STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS = __anyStub;\nexport const STANDARD_PAGE_LAYOUT = __anyStub;\nexport const STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS = __anyStub;\nexport const SystemPermissionFlag = __anyStub;\nexport const ViewCalendarLayout = __anyStub;\nexport const ViewFilterGroupLogicalOperator = __anyStub;\nexport const ViewFilterOperand = __anyStub;\nexport const ViewKey = __anyStub;\nexport const ViewOpenRecordIn = __anyStub;\nexport const ViewSortDirection = __anyStub;\nexport const ViewType = __anyStub;\nexport const ViewVisibility = __anyStub;\nexport const canAccessFullAdminPanel = __anyStub;\nexport const canImpersonate = __anyStub;\nexport const every = __anyStub;\nexport const everyDefined = __anyStub;\nexport const everyEquals = __anyStub;\nexport const favoriteRecordIds = __anyStub;\nexport const featureFlags = __anyStub;\nexport const generateDefaultFieldUniversalIdentifier = __anyStub;\nexport const hasAnySoftDeleteFilterOnView = __anyStub;\nexport const includes = __anyStub;\nexport const includesEvery = __anyStub;\nexport const isDashboardPageLayoutInEditMode = __anyStub;\nexport const isDefined = __anyStub;\nexport const isInSidePanel = __anyStub;\nexport const isLayoutCustomizationModeEnabled = __anyStub;\nexport const isNonEmptyString = __anyStub;\nexport const isSelectAll = __anyStub;\nexport const none = __anyStub;\nexport const noneDefined = __anyStub;\nexport const noneEquals = __anyStub;\nexport const numberOfSelectedRecords = __anyStub;\nexport const objectMetadataItem = __anyStub;\nexport const objectMetadataLabel = __anyStub;\nexport const objectPermissions = __anyStub;\nexport const pageType = __anyStub;\nexport const selectedRecords = __anyStub;\nexport const some = __anyStub;\nexport const someDefined = __anyStub;\nexport const someEquals = __anyStub;\nexport const someNonEmptyString = __anyStub;\nexport const targetObjectReadPermissions = __anyStub;\nexport const targetObjectWritePermissions = __anyStub;\nexport const validateFields = __anyStub;\n", "export const APP_DISPLAY_NAME = \"Viginti Mobile Push\";\nexport const APP_DESCRIPTION =\n  \"Registers iOS and iPadOS devices for Viginti remote push notifications and relays task assignment events through a Cloudflare Worker to Firebase Cloud Messaging.\";\n\nexport const APPLICATION_UNIVERSAL_IDENTIFIER = \"05ce64a4-c1ee-4f4e-885c-bc1f7123a25b\";\nexport const DEFAULT_ROLE_UNIVERSAL_IDENTIFIER = \"4c8246e5-0a05-4155-816c-9ec4cb79c04b\";\nexport const RELAY_BASE_URL_VARIABLE_UNIVERSAL_IDENTIFIER =\n  \"06000b38-8fe0-413c-9b19-22afb1974ff5\";\nexport const POST_INSTALL_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER =\n  \"f9791ee7-af73-41e2-81aa-08bd9e29c876\";\nexport const STATUS_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER =\n  \"c80d22cf-ce36-485b-8bd3-07d9caf0ba33\";\nexport const REGISTER_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER =\n  \"806f4f64-9676-4af1-825c-bef656ab0fab\";\nexport const UNREGISTER_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER =\n  \"b768f8c5-e660-49ba-a302-e7b7cb7bb2c1\";\nexport const PREFERENCES_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER =\n  \"5b32dcbd-86dc-4f3b-adb6-e98eea298b69\";\nexport const TEST_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER =\n  \"ce6343cd-24f0-4faf-8c34-6ea5f5af4bda\";\nexport const TASK_CREATED_PUSH_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER =\n  \"b845b39b-aaad-42eb-82aa-97ac6742b8b4\";\nexport const TASK_UPDATED_PUSH_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER =\n  \"f7fda668-8229-427f-92f0-fb1521d2a067\";\n\nexport const PUSH_DEVICE_OBJECT_UNIVERSAL_IDENTIFIER =\n  \"9b8388f0-36f5-4cfc-8d4f-aaac5f358c05\";\nexport const PUSH_DEVICE_INDEX_UNIVERSAL_IDENTIFIER =\n  \"995bdfe7-9d9b-4e81-a8e3-f738e2ab5ded\";\nexport const PUSH_DEVICE_FIELD_UNIVERSAL_IDENTIFIERS = {\n  installationId: \"11672460-4bc9-4adc-9815-3a1e4580e4f7\",\n  workspaceMemberId: \"ea864f90-59e2-4f09-8be5-b431416731d5\",\n  fcmToken: \"91d5f03f-5fcc-417c-a97e-5d0ebf689564\",\n  tokenHash: \"7fa4054d-dd2e-4c10-b8fd-91318d1833c9\",\n  platform: \"35fde69d-4fcd-4b6d-b560-00f9bebd0d9d\",\n  environment: \"07e09c4a-d328-42fc-a0ef-d7f74c70262b\",\n  bundleIdentifier: \"4c8c1a24-36d8-4ec5-a983-8468be33f7e6\",\n  appVersion: \"ef80c428-1a95-4532-94be-bdbedea30fcc\",\n  buildNumber: \"220a51d3-a7aa-4ead-822b-7eaa0a8f0e39\",\n  deviceLocale: \"88e14f0c-511e-4671-bfb3-bd938965f893\",\n  timeZone: \"33469cde-22f6-47ca-818c-b4a4485c90d0\",\n  notificationsEnabled: \"081b6f77-1083-4d73-aff5-f210bf8e001a\",\n  taskAssignedEnabled: \"0996e12d-a6c1-4eef-a797-0d0646033736\",\n  taskDueDateChangedEnabled: \"30c399a9-2fd4-4c17-a98a-e1368f614c7e\",\n  taskCompletedEnabled: \"e0689b0a-95fd-4117-9c48-326e02830772\",\n  taskUnassignedEnabled: \"4a91a20a-199f-4f31-8e84-7f00b29e92fc\",\n  lastSeenAt: \"1f29217a-9bf6-4694-bed6-9f318941ead0\",\n  disabledAt: \"d9970b6e-ce54-4e4a-a66d-28b9ec8351d5\",\n  lastDeliveryError: \"cebc6621-f35a-4694-8f11-f04155d3081c\",\n} as const;\n", "/** Web Crypto helpers (Node 18+ / Twenty runtime both expose globalThis.crypto). */\n\nconst encoder = new TextEncoder();\n\nfunction toHex(buffer: ArrayBuffer): string {\n  const bytes = new Uint8Array(buffer);\n  let out = \"\";\n  for (const b of bytes) out += b.toString(16).padStart(2, \"0\");\n  return out;\n}\n\nexport async function sha256Hex(input: string): Promise<string> {\n  const digest = await crypto.subtle.digest(\"SHA-256\", encoder.encode(input));\n  return toHex(digest);\n}\n\n/** Short non-reversible fingerprint of a token for safe storage/search. */\nexport async function tokenFingerprint(token: string, length = 16): Promise<string> {\n  return (await sha256Hex(token)).slice(0, length);\n}\n\n/** HMAC-SHA256 over `timestamp + \".\" + rawBody`, returns lowercase hex. */\nexport async function hmacSignatureHex(\n  secret: string,\n  timestamp: string,\n  rawBody: string,\n): Promise<string> {\n  const key = await crypto.subtle.importKey(\n    \"raw\",\n    encoder.encode(secret),\n    { name: \"HMAC\", hash: \"SHA-256\" },\n    false,\n    [\"sign\"],\n  );\n  const signed = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(`${timestamp}.${rawBody}`));\n  return toHex(signed);\n}\n", "/** Shared DTOs for the Viginti Mobile Push app. */\n\nexport type RemotePushEventType =\n  | \"task_assigned\"\n  | \"task_due_date_changed\"\n  | \"task_completed\"\n  | \"task_unassigned\";\n\nexport type PushPreferenceKey =\n  | \"taskAssignedEnabled\"\n  | \"taskDueDateChangedEnabled\"\n  | \"taskCompletedEnabled\"\n  | \"taskUnassignedEnabled\";\n\n/** Persisted device record (mirror of the PushDevice object). */\nexport interface PushDeviceRecord {\n  id: string;\n  installationId: string;\n  workspaceMemberId: string;\n  fcmToken: string;\n  tokenHash: string;\n  platform: string;\n  environment: string;\n  bundleIdentifier: string;\n  appVersion: string;\n  buildNumber: string;\n  deviceLocale: string;\n  timeZone: string;\n  notificationsEnabled: boolean;\n  taskAssignedEnabled: boolean;\n  taskDueDateChangedEnabled: boolean;\n  taskCompletedEnabled: boolean;\n  taskUnassignedEnabled: boolean;\n  lastSeenAt: string | null;\n  disabledAt: string | null;\n  lastDeliveryError: string | null;\n  createdAt?: string;\n  updatedAt?: string;\n}\n\n/**\n * Trusted server context. The authenticated workspace member is resolved by the\n * Twenty runtime \u2014 NEVER taken from the request body.\n */\nexport interface AuthContext {\n  workspaceId: string;\n  workspaceMemberId: string;\n  isAdmin: boolean;\n}\n\n/** Client payload for POST /push/register (workspaceMember is NOT accepted). */\nexport interface RegisterRequest {\n  installationId: string;\n  fcmToken: string;\n  platform: string;\n  environment: string;\n  bundleIdentifier: string;\n  appVersion: string;\n  buildNumber: string;\n  deviceLocale: string;\n  timeZone: string;\n  notificationsEnabled: boolean;\n}\n\nexport interface UnregisterRequest {\n  installationId: string;\n}\n\nexport interface PreferencesRequest {\n  installationId: string;\n  preferences: Partial<Record<PushPreferenceKey, boolean>>;\n}\n\nexport interface HandlerResult {\n  status: number;\n  body: unknown;\n}\n\nexport class HandlerError extends Error {\n  constructor(\n    readonly status: number,\n    readonly code: string,\n    message: string,\n  ) {\n    super(message);\n  }\n}\n", "import { HandlerError } from \"../types\";\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n  if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n    throw new HandlerError(400, \"invalid_body\", \"Request body must be a JSON object\");\n  }\n  return value as Record<string, unknown>;\n}\n\nexport function requireString(record: Record<string, unknown>, field: string, max = 512): string {\n  const value = record[field];\n  if (typeof value !== \"string\" || value.length === 0) {\n    throw new HandlerError(400, \"invalid_field\", `${field} must be a non-empty string`);\n  }\n  if (value.length > max) {\n    throw new HandlerError(400, \"field_too_long\", `${field} is too long`);\n  }\n  return value;\n}\n\nexport function requireBoolean(record: Record<string, unknown>, field: string): boolean {\n  const value = record[field];\n  if (typeof value !== \"boolean\") {\n    throw new HandlerError(400, \"invalid_field\", `${field} must be a boolean`);\n  }\n  return value;\n}\n\nexport function requireEnum<T extends string>(\n  record: Record<string, unknown>,\n  field: string,\n  allowed: readonly T[],\n): T {\n  const value = requireString(record, field, 64);\n  if (!(allowed as readonly string[]).includes(value)) {\n    throw new HandlerError(400, \"invalid_enum\", `${field} has an unsupported value`);\n  }\n  return value as T;\n}\n", "/**\n * POST /push/register\n *\n * Idempotent device registration keyed on (authenticated workspaceMember,\n * installationId). The workspace member is taken from the trusted server\n * context, never from the body. Token rotation updates the existing record; a\n * previously disabled device is reactivated when a fresh token + enabled push\n * arrive for the same installation.\n */\n\nimport { tokenFingerprint } from \"../crypto\";\nimport type { PushDeviceRepository } from \"../repository\";\nimport type { AuthContext, HandlerResult, PushDeviceRecord } from \"../types\";\nimport { asRecord, requireBoolean, requireEnum, requireString } from \"./shared\";\n\nconst ALLOWED_PLATFORMS = [\"ios\"] as const;\nconst ALLOWED_ENVIRONMENTS = [\"sandbox\", \"production\"] as const;\nconst FCM_TOKEN_MIN = 64;\nconst FCM_TOKEN_MAX = 4096;\n\nexport interface RegisterDeps {\n  repository: PushDeviceRepository;\n  now: () => Date;\n}\n\nexport async function handleRegister(\n  rawBody: unknown,\n  ctx: AuthContext,\n  deps: RegisterDeps,\n): Promise<HandlerResult> {\n  const record = asRecord(rawBody);\n\n  const installationId = requireString(record, \"installationId\", 256);\n  const fcmToken = requireString(record, \"fcmToken\", FCM_TOKEN_MAX);\n  if (fcmToken.length < FCM_TOKEN_MIN) {\n    return { status: 400, body: { success: false, code: \"invalid_token\", error: \"fcmToken is too short\" } };\n  }\n  const platform = requireEnum(record, \"platform\", ALLOWED_PLATFORMS);\n  const environment = requireEnum(record, \"environment\", ALLOWED_ENVIRONMENTS);\n  const bundleIdentifier = requireString(record, \"bundleIdentifier\", 256);\n  const appVersion = requireString(record, \"appVersion\", 64);\n  const buildNumber = requireString(record, \"buildNumber\", 64);\n  const deviceLocale = requireString(record, \"deviceLocale\", 64);\n  const timeZone = requireString(record, \"timeZone\", 64);\n  const notificationsEnabled = requireBoolean(record, \"notificationsEnabled\");\n\n  const tokenHash = await tokenFingerprint(fcmToken);\n  const nowIso = deps.now().toISOString();\n\n  const existing = await deps.repository.findByMemberAndInstallation(\n    ctx.workspaceMemberId,\n    installationId,\n  );\n\n  let device: PushDeviceRecord;\n  if (existing) {\n    const patch: Partial<PushDeviceRecord> = {\n      fcmToken,\n      tokenHash,\n      platform,\n      environment,\n      bundleIdentifier,\n      appVersion,\n      buildNumber,\n      deviceLocale,\n      timeZone,\n      notificationsEnabled,\n      lastSeenAt: nowIso,\n    };\n    // Reactivate a previously disabled device when push is enabled again.\n    if (notificationsEnabled && existing.disabledAt) {\n      patch.disabledAt = null;\n      patch.lastDeliveryError = null;\n    }\n    device = await deps.repository.update(existing.id, patch);\n  } else {\n    device = await deps.repository.create({\n      installationId,\n      workspaceMemberId: ctx.workspaceMemberId,\n      fcmToken,\n      tokenHash,\n      platform,\n      environment,\n      bundleIdentifier,\n      appVersion,\n      buildNumber,\n      deviceLocale,\n      timeZone,\n      notificationsEnabled,\n      lastSeenAt: nowIso,\n    });\n  }\n\n  return {\n    status: 200,\n    body: { success: true, deviceId: device.id, registeredAt: nowIso },\n  };\n}\n", "// Thrown when the platform asks the SDK to operate on a connection whose\n// OAuth refresh failed permanently (`authFailedAt` is set). The end user\n// must reconnect from the app's settings tab — the app cannot recover on\n// its own.\n//\n// `listConnections` filters these out by default (the user can't act on\n// them anyway). `getConnection` throws this when the looked-up connection\n// is in this state, so a stored connection id can be safely retried until\n// it works again.\nexport class AppConnectionAuthFailedError extends Error {\n  readonly connectionId: string;\n\n  constructor(connectionId: string) {\n    super(\n      `App connection ${connectionId} requires the user to reconnect ` +\n        `(authFailedAt is set). Surface a \"Reconnect\" prompt in your UI.`,\n    );\n    this.name = 'AppConnectionAuthFailedError';\n    this.connectionId = connectionId;\n  }\n}\n", "//#region src/application/constants/AssetDirectory.ts\nvar e = \"public\", t = \"TWENTY_API_KEY\", n = \"TWENTY_API_URL\", r = \"TWENTY_APP_ACCESS_TOKEN\", i = \"generated\", a = { js: \"import { createRequire as __createRequire } from 'module';\\nconst require = __createRequire(import.meta.url);\" }, o = \".twenty/output\", s = \"Standard\", c = \"20202020-64aa-4b6f-b003-9c74b97cee20\", l = /* @__PURE__ */ function(e) {\n\treturn e.Object = \"object\", e.Field = \"field\", e.LogicFunction = \"logicFunction\", e.FrontComponent = \"frontComponent\", e.Role = \"role\", e.Skill = \"skill\", e.Agent = \"agent\", e.ConnectionProvider = \"connectionProvider\", e.View = \"view\", e.ViewField = \"viewField\", e.NavigationMenuItem = \"navigationMenuItem\", e.PageLayout = \"pageLayout\", e.PageLayoutTab = \"pageLayoutTab\", e.CommandMenuItem = \"commandMenuItem\", e;\n}({});\n//#endregion\nexport { e as ASSETS_DIR, t as DEFAULT_API_KEY_NAME, n as DEFAULT_API_URL_NAME, r as DEFAULT_APP_ACCESS_TOKEN_NAME, i as GENERATED_DIR, a as NODE_ESM_CJS_BANNER, o as OUTPUT_DIR, l as SyncableEntity, s as TWENTY_STANDARD_APPLICATION_NAME, c as TWENTY_STANDARD_APPLICATION_UNIVERSAL_IDENTIFIER };\n", "import {\n  DEFAULT_API_URL_NAME,\n  DEFAULT_APP_ACCESS_TOKEN_NAME,\n} from 'twenty-shared/application';\n\nexport const postGraphqlRequest = async <TVariables, TData>({\n  query,\n  variables,\n  caller,\n}: {\n  query: string;\n  variables: TVariables;\n  caller: string;\n}): Promise<TData> => {\n  const apiUrl = process.env[DEFAULT_API_URL_NAME];\n  const accessToken = process.env[DEFAULT_APP_ACCESS_TOKEN_NAME];\n\n  if (!apiUrl || !accessToken) {\n    throw new Error(\n      `${caller}() requires the app runtime env vars ` +\n        `${DEFAULT_API_URL_NAME} and ${DEFAULT_APP_ACCESS_TOKEN_NAME}.`,\n    );\n  }\n\n  const response = await fetch(`${apiUrl}/metadata`, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n      Authorization: `Bearer ${accessToken}`,\n    },\n    body: JSON.stringify({ query, variables }),\n  });\n\n  if (!response.ok) {\n    throw new Error(\n      `${caller}() failed: HTTP ${response.status} ${response.statusText}`,\n    );\n  }\n\n  const body = (await response.json()) as {\n    data?: TData;\n    errors?: { message: string }[];\n  };\n\n  if (body.errors && body.errors.length > 0) {\n    throw new Error(\n      `${caller}() failed: ${body.errors.map((error) => error.message).join(', ')}`,\n    );\n  }\n\n  if (!body.data) {\n    throw new Error(`${caller}() failed: response contained no data.`);\n  }\n\n  return body.data;\n};\n", "import { AppConnectionAuthFailedError } from '@/sdk/logic-function/connections/errors/app-connection-auth-failed.error';\nimport { type AppConnection } from '@/sdk/logic-function/connections/types/app-connection.type';\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst GET_APP_CONNECTION_QUERY = `\n  query GetAppConnection($id: ID!) {\n    appConnection(id: $id) {\n      id\n      providerName\n      name\n      handle\n      visibility\n      userWorkspaceId\n      accessToken\n      scopes\n      authFailedAt\n    }\n  }\n`;\n\nexport const getConnection = async (id: string): Promise<AppConnection> => {\n  const { appConnection } = await postGraphqlRequest<\n    { id: string },\n    { appConnection: AppConnection }\n  >({\n    query: GET_APP_CONNECTION_QUERY,\n    variables: { id },\n    caller: 'getConnection',\n  });\n\n  if (appConnection.authFailedAt !== null) {\n    throw new AppConnectionAuthFailedError(appConnection.id);\n  }\n\n  return appConnection;\n};\n", "import { type AppConnection } from '@/sdk/logic-function/connections/types/app-connection.type';\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst LIST_APP_CONNECTIONS_QUERY = `\n  query ListAppConnections($filter: ListAppConnectionsInput) {\n    appConnections(filter: $filter) {\n      id\n      providerName\n      name\n      handle\n      visibility\n      userWorkspaceId\n      accessToken\n      scopes\n      authFailedAt\n    }\n  }\n`;\n\nexport type ListConnectionsFilter = {\n  providerName?: string;\n  userWorkspaceId?: string;\n  visibility?: 'user' | 'workspace';\n};\n\nexport const listConnections = async (\n  filter: ListConnectionsFilter = {},\n): Promise<AppConnection[]> => {\n  const { appConnections } = await postGraphqlRequest<\n    { filter: ListConnectionsFilter },\n    { appConnections: AppConnection[] }\n  >({\n    query: LIST_APP_CONNECTIONS_QUERY,\n    variables: { filter },\n    caller: 'listConnections',\n  });\n\n  return appConnections;\n};\n", "import { type AppConnection } from '@/sdk/logic-function/connections/types/app-connection.type';\n\nexport const findConnectionForRequest = (\n  connections: AppConnection[],\n  event: { userWorkspaceId: string | null },\n): AppConnection | null => {\n  if (event.userWorkspaceId !== null) {\n    const personal = connections.find(\n      (connection) =>\n        connection.visibility === 'user' &&\n        connection.userWorkspaceId === event.userWorkspaceId,\n    );\n\n    if (personal) {\n      return personal;\n    }\n  }\n\n  const workspaceShared = connections.find(\n    (connection) => connection.visibility === 'workspace',\n  );\n\n  return workspaceShared ?? null;\n};\n", "import {\n  type RunAgentInput,\n  type RunAgentResult,\n} from 'twenty-shared/application';\n\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst RUN_AGENT_MUTATION = `\n  mutation RunAgent($input: RunAgentInput!) {\n    runAgent(input: $input) {\n      result\n      error\n      success\n    }\n  }\n`;\n\nexport const runAgent = async (\n  input: RunAgentInput,\n): Promise<RunAgentResult> => {\n  const { runAgent: result } = await postGraphqlRequest<\n    { input: RunAgentInput },\n    { runAgent: RunAgentResult }\n  >({\n    query: RUN_AGENT_MUTATION,\n    variables: { input },\n    caller: 'runAgent',\n  });\n\n  return result;\n};\n", "import { type LogicFunctionHttpResponse } from 'twenty-shared/types';\n\nexport type ResponseInit = {\n  status?: number;\n  headers?: Record<string, string>;\n};\n\nexport class Response implements LogicFunctionHttpResponse {\n  readonly __twentyHttpResponse = true as const;\n  readonly body: unknown;\n  readonly status?: number;\n  readonly headers?: Record<string, string>;\n\n  constructor(body: unknown, init?: ResponseInit) {\n    this.body = body;\n    this.status = init?.status;\n    this.headers = init?.headers;\n  }\n}\n", "/**\n * App configuration resolved from Twenty's injected runtime environment.\n */\nexport interface AppConfig {\n  /** Base URL of the Cloudflare relay, e.g. https://relay.example.workers.dev */\n  relayBaseUrl: string;\n  /** Twenty's application installation id, sent as X-Twenty-Push-Installation. */\n  installationId: string;\n  /** Twenty app access token injected into logic functions/install hooks. */\n  relayAuthToken: string;\n  /** Twenty API URL used by the relay to verify the app access token on install. */\n  twentyApiUrl: string;\n}\n\nexport class AppConfigError extends Error {}\n\nfunction normalizeHttpsUrl(value: string | undefined): string | null {\n  const trimmed = (value ?? \"\").trim().replace(/\\/+$/, \"\");\n  return /^https:\\/\\//.test(trimmed) ? trimmed : null;\n}\n\nfunction resolveTwentyApiUrl(env: Record<string, string | undefined>): string {\n  return (\n    normalizeHttpsUrl(env.API_URL) ??\n    normalizeHttpsUrl(env.TWENTY_API_URL) ??\n    normalizeHttpsUrl(env.SERVER_URL) ??\n    normalizeHttpsUrl(env.TWENTY_SERVER_URL) ??\n    \"https://api.twenty.com\"\n  );\n}\n\nexport function loadAppConfig(env: Record<string, string | undefined>): AppConfig {\n  const relayBaseUrl = normalizeHttpsUrl(env.RELAY_BASE_URL) ?? \"\";\n  const installationId = (env.APPLICATION_ID ?? env.RELAY_INSTALLATION_ID ?? \"\").trim();\n  const relayAuthToken = (env.APP_ACCESS_TOKEN ?? env.TWENTY_APP_ACCESS_TOKEN ?? \"\").trim();\n  const twentyApiUrl = resolveTwentyApiUrl(env);\n\n  if (!relayBaseUrl) {\n    throw new AppConfigError(\"RELAY_BASE_URL must be an https URL\");\n  }\n  if (!installationId) {\n    throw new AppConfigError(\"APPLICATION_ID is missing\");\n  }\n  if (!relayAuthToken) {\n    throw new AppConfigError(\"APP_ACCESS_TOKEN is missing\");\n  }\n  return { relayBaseUrl, installationId, relayAuthToken, twentyApiUrl };\n}\n\n/** True when the relay env is present and valid. Never throws. */\nexport function isRelayConfigured(env: Record<string, string | undefined>): boolean {\n  try {\n    loadAppConfig(env);\n    return true;\n  } catch {\n    return false;\n  }\n}\n", "/**\n * Minimal fixed-window rate limiter. In-memory by default (per app instance);\n * swap for a shared store if stronger guarantees are needed.\n */\nexport interface RateLimiter {\n  /** Returns true if the action is allowed and consumes one unit. */\n  tryConsume(key: string): boolean;\n}\n\nexport class InMemoryRateLimiter implements RateLimiter {\n  private readonly hits = new Map<string, { count: number; windowStart: number }>();\n\n  constructor(\n    private readonly limit: number,\n    private readonly windowMs: number,\n    private readonly now: () => number = () => Date.now(),\n  ) {}\n\n  tryConsume(key: string): boolean {\n    const current = this.now();\n    const entry = this.hits.get(key);\n    if (!entry || current - entry.windowStart >= this.windowMs) {\n      this.hits.set(key, { count: 1, windowStart: current });\n      return true;\n    }\n    if (entry.count >= this.limit) {\n      return false;\n    }\n    entry.count++;\n    return true;\n  }\n}\n\nexport const inMemoryRateLimiter = new InMemoryRateLimiter(3, 60_000);\n", "/**\n * Client for the Cloudflare push relay. Authenticates with Twenty's injected\n * app access token and parses the aggregated result. The app never sends\n * notification text \u2014 only opaque IDs; the relay owns the copy.\n *\n * The relay is reached via this single interface; the app does not know (or\n * care) whether the worker dispatches directly to FCM or, later, via a queue.\n */\n\nimport type { AppConfig } from \"./config\";\nimport type { RemotePushEventType } from \"./types\";\n\nexport interface RelayMessage {\n  deviceId: string;\n  token: string;\n  data: {\n    version: \"1\";\n    type: RemotePushEventType;\n    workspaceId: string;\n    recordId: string;\n    eventId: string;\n  };\n}\n\nexport interface RelayJob {\n  eventId: string;\n  type: RemotePushEventType;\n  messages: RelayMessage[];\n}\n\nexport interface RelayResult {\n  success: boolean;\n  eventId: string;\n  delivered: number;\n  invalidDeviceIds: string[];\n  temporaryFailures: number;\n  permanentFailures: number;\n}\n\nexport type FetchLike = typeof fetch;\n\n/** Interface over the relay so callers don't depend on the concrete client. */\nexport interface RelayDispatcher {\n  dispatch(job: RelayJob): Promise<RelayResult>;\n}\n\nexport class RelayClient implements RelayDispatcher {\n  constructor(\n    private readonly config: AppConfig,\n    private readonly fetchImpl: FetchLike = fetch,\n    private readonly now: () => number = () => Math.floor(Date.now() / 1000),\n  ) {}\n\n  async dispatch(job: RelayJob): Promise<RelayResult> {\n    const timestamp = this.now();\n    const body = JSON.stringify({\n      version: 1,\n      eventId: job.eventId,\n      installationId: this.config.installationId,\n      timestamp,\n      type: job.type,\n      messages: job.messages,\n    });\n\n    const response = await this.fetchImpl(`${this.config.relayBaseUrl}/v1/push`, {\n      method: \"POST\",\n      headers: {\n        \"content-type\": \"application/json\",\n        \"authorization\": `Bearer ${this.config.relayAuthToken}`,\n        \"x-twenty-push-installation\": this.config.installationId,\n      },\n      body,\n    });\n\n    if (!response.ok) {\n      throw new RelayError(`Relay returned HTTP ${response.status}`, response.status);\n    }\n\n    const parsed = (await response.json()) as {\n      success?: boolean;\n      eventId?: string;\n      results?: {\n        delivered?: number;\n        invalidDeviceIds?: string[];\n        temporaryFailures?: number;\n        permanentFailures?: number;\n      };\n    };\n\n    const results = parsed.results ?? {};\n    return {\n      success: parsed.success === true,\n      eventId: parsed.eventId ?? job.eventId,\n      delivered: results.delivered ?? 0,\n      invalidDeviceIds: Array.isArray(results.invalidDeviceIds) ? results.invalidDeviceIds : [],\n      temporaryFailures: results.temporaryFailures ?? 0,\n      permanentFailures: results.permanentFailures ?? 0,\n    };\n  }\n}\n\nexport class RelayError extends Error {\n  constructor(\n    message: string,\n    readonly httpStatus: number,\n  ) {\n    super(message);\n  }\n}\n", "import type { AppConfig } from \"./config\";\nimport type { CreatePushDeviceInput, PushDeviceRepository } from \"./repository\";\nimport type { PushDeviceRecord } from \"./types\";\n\nconst PUSH_DEVICE_FIELDS = `\n  id\n  installationId\n  workspaceMemberId\n  fcmToken\n  tokenHash\n  platform\n  environment\n  bundleIdentifier\n  appVersion\n  buildNumber\n  deviceLocale\n  timeZone\n  notificationsEnabled\n  taskAssignedEnabled\n  taskDueDateChangedEnabled\n  taskCompletedEnabled\n  taskUnassignedEnabled\n  lastSeenAt\n  disabledAt\n  lastDeliveryError\n  createdAt\n  updatedAt\n`;\n\ninterface GraphQLResponse<T> {\n  data?: T;\n  errors?: { message: string }[];\n}\n\ntype PushDeviceConnection = {\n  pushDevices: {\n    edges: { node: PushDeviceRecord }[];\n  };\n};\n\nexport class TwentyGraphQLPushDeviceRepository implements PushDeviceRepository {\n  constructor(\n    private readonly config: AppConfig,\n    private readonly fetchImpl: typeof fetch = fetch,\n  ) {}\n\n  async findByMemberAndInstallation(\n    workspaceMemberId: string,\n    installationId: string,\n  ): Promise<PushDeviceRecord | null> {\n    const data = await this.graphql<PushDeviceConnection>(\n      `query PushDeviceByMemberAndInstallation($workspaceMemberId: String!, $installationId: String!) {\n        pushDevices(\n          first: 1\n          filter: {\n            workspaceMemberId: { eq: $workspaceMemberId }\n            installationId: { eq: $installationId }\n          }\n        ) {\n          edges { node { ${PUSH_DEVICE_FIELDS} } }\n        }\n      }`,\n      { workspaceMemberId, installationId },\n    );\n\n    return data.pushDevices.edges[0]?.node ?? null;\n  }\n\n  async create(input: CreatePushDeviceInput): Promise<PushDeviceRecord> {\n    const data = await this.graphql<{ createPushDevice: PushDeviceRecord }>(\n      `mutation CreatePushDevice($data: PushDeviceCreateInput!) {\n        createPushDevice(data: $data) { ${PUSH_DEVICE_FIELDS} }\n      }`,\n      {\n        data: {\n          ...input,\n          taskAssignedEnabled: true,\n          taskDueDateChangedEnabled: false,\n          taskCompletedEnabled: false,\n          taskUnassignedEnabled: false,\n          disabledAt: null,\n          lastDeliveryError: null,\n        },\n      },\n    );\n\n    return data.createPushDevice;\n  }\n\n  async update(id: string, patch: Partial<PushDeviceRecord>): Promise<PushDeviceRecord> {\n    const data = await this.graphql<{ updatePushDevice: PushDeviceRecord }>(\n      `mutation UpdatePushDevice($id: UUID!, $data: PushDeviceUpdateInput!) {\n        updatePushDevice(id: $id, data: $data) { ${PUSH_DEVICE_FIELDS} }\n      }`,\n      { id, data: sanitizePatch(patch) },\n    );\n\n    return data.updatePushDevice;\n  }\n\n  async findActiveByMember(workspaceMemberId: string): Promise<PushDeviceRecord[]> {\n    const data = await this.graphql<PushDeviceConnection>(\n      `query ActivePushDevices($workspaceMemberId: String!) {\n        pushDevices(\n          first: 100\n          filter: {\n            workspaceMemberId: { eq: $workspaceMemberId }\n            notificationsEnabled: { eq: true }\n            disabledAt: { is: NULL }\n          }\n        ) {\n          edges { node { ${PUSH_DEVICE_FIELDS} } }\n        }\n      }`,\n      { workspaceMemberId },\n    );\n\n    return data.pushDevices.edges.map((edge) => edge.node);\n  }\n\n  async findById(id: string): Promise<PushDeviceRecord | null> {\n    const data = await this.graphql<{ pushDevice: PushDeviceRecord | null }>(\n      `query PushDeviceById($id: UUID!) {\n        pushDevice(filter: { id: { eq: $id } }) { ${PUSH_DEVICE_FIELDS} }\n      }`,\n      { id },\n    );\n\n    return data.pushDevice;\n  }\n\n  private async graphql<T>(query: string, variables: Record<string, unknown>): Promise<T> {\n    const response = await this.fetchImpl(`${this.config.twentyApiUrl}/graphql`, {\n      method: \"POST\",\n      headers: {\n        \"content-type\": \"application/json\",\n        \"authorization\": `Bearer ${this.config.relayAuthToken}`,\n      },\n      body: JSON.stringify({ query, variables }),\n    });\n\n    const body = (await response.json()) as GraphQLResponse<T>;\n    if (!response.ok || body.errors?.length) {\n      const message = body.errors?.map((error) => error.message).join(\"; \") || response.statusText;\n      throw new Error(`Twenty GraphQL request failed: ${message}`);\n    }\n    if (!body.data) {\n      throw new Error(\"Twenty GraphQL request returned no data\");\n    }\n    return body.data;\n  }\n}\n\nfunction sanitizePatch(patch: Partial<PushDeviceRecord>): Partial<PushDeviceRecord> {\n  const { id: _id, createdAt: _createdAt, updatedAt: _updatedAt, ...data } = patch;\n  return data;\n}\n", "import { Response, type RoutePayload } from \"twenty-sdk/logic-function\";\n\nimport { loadAppConfig } from \"./config\";\nimport { inMemoryRateLimiter } from \"./rateLimiter\";\nimport { RelayClient } from \"./relayClient\";\nimport { TwentyGraphQLPushDeviceRepository } from \"./twentyRepository\";\nimport { HandlerError, type AuthContext, type HandlerResult } from \"./types\";\n\nexport interface RuntimeDeps {\n  repository: TwentyGraphQLPushDeviceRepository;\n  relay: RelayClient;\n  rateLimiter: typeof inMemoryRateLimiter;\n  now: () => Date;\n}\n\nexport function routeBody(event: RoutePayload): unknown {\n  if (event.body !== null) {\n    return event.body;\n  }\n  if (event.rawBody && event.rawBody.length > 0) {\n    return JSON.parse(event.rawBody) as unknown;\n  }\n  return {};\n}\n\n/**\n * Resolves the identity of the workspace member behind a Twenty bearer token.\n * Extracted as a seam so the auth check can be unit-tested without network and\n * so the member is resolved from Twenty itself rather than guessed from JWT\n * claims (which OAuth/PKCE access tokens do not carry).\n */\nexport interface IdentityResolver {\n  resolveWorkspaceMemberId(bearerToken: string): Promise<string | null>;\n}\n\nexport async function authContext(\n  event: RoutePayload,\n  identity?: IdentityResolver,\n): Promise<AuthContext> {\n  if (!event.userWorkspaceId) {\n    throw new HandlerError(401, \"unauthenticated\", \"Authentication is required\");\n  }\n\n  const token = bearerToken(event);\n  if (!token) {\n    throw new HandlerError(\n      401,\n      \"personal_session_required\",\n      \"A personal Twenty session is required\",\n    );\n  }\n\n  // The runtime has already accepted the token (userWorkspaceId is set). Ask\n  // Twenty who the member is, using the caller's own token \u2014 this works for\n  // both personal-session JWTs and workspace-agnostic OAuth access tokens.\n  const resolver = identity ?? defaultIdentityResolver();\n  const workspaceMemberId = await resolver.resolveWorkspaceMemberId(token);\n  if (!workspaceMemberId) {\n    throw new HandlerError(\n      401,\n      \"personal_session_required\",\n      \"A personal Twenty session is required\",\n    );\n  }\n\n  return {\n    workspaceId: resolveWorkspaceId(process.env),\n    workspaceMemberId,\n    isAdmin: false,\n  };\n}\n\nfunction bearerToken(event: RoutePayload): string | null {\n  const authorization = Object.entries(event.headers).find(\n    ([name]) => name.toLowerCase() === \"authorization\",\n  )?.[1];\n  return authorization?.match(/^Bearer\\s+(.+)$/i)?.[1] ?? null;\n}\n\nfunction defaultIdentityResolver(): IdentityResolver {\n  const config = loadAppConfig(process.env);\n  return new TwentyIdentityResolver(config.twentyApiUrl);\n}\n\n/**\n * Resolves the current workspace member via Twenty's metadata GraphQL endpoint\n * using the caller's bearer token. `currentUser.workspaceMember.id` is the same\n * field the mobile client already reads after login.\n */\nexport class TwentyIdentityResolver implements IdentityResolver {\n  constructor(\n    private readonly twentyApiUrl: string,\n    private readonly fetchImpl: typeof fetch = fetch,\n  ) {}\n\n  async resolveWorkspaceMemberId(bearerToken: string): Promise<string | null> {\n    let response: Awaited<ReturnType<typeof fetch>>;\n    try {\n      response = await this.fetchImpl(`${this.twentyApiUrl}/metadata`, {\n        method: \"POST\",\n        headers: {\n          \"content-type\": \"application/json\",\n          authorization: `Bearer ${bearerToken}`,\n        },\n        body: JSON.stringify({\n          query:\n            \"query PushAuthContext { currentUser { workspaceMember { id } } }\",\n        }),\n      });\n    } catch {\n      return null;\n    }\n\n    if (!response.ok) {\n      return null;\n    }\n\n    const body = (await response.json()) as {\n      data?: { currentUser?: { workspaceMember?: { id?: string } | null } | null };\n    };\n    return body.data?.currentUser?.workspaceMember?.id ?? null;\n  }\n}\n\nexport function runtimeDeps(): RuntimeDeps {\n  const config = loadAppConfig(process.env);\n  return {\n    repository: new TwentyGraphQLPushDeviceRepository(config),\n    relay: new RelayClient(config),\n    rateLimiter: inMemoryRateLimiter,\n    now: () => new Date(),\n  };\n}\n\nexport function httpResponse(result: HandlerResult): Response {\n  return new Response(result.body, { status: result.status });\n}\n\nexport function errorResponse(error: unknown): Response {\n  if (error instanceof HandlerError) {\n    return new Response(\n      { success: false, code: error.code, error: error.message },\n      { status: error.status },\n    );\n  }\n\n  return new Response(\n    {\n      success: false,\n      code: \"internal_error\",\n      error: error instanceof Error ? error.message : \"Unexpected error\",\n    },\n    { status: 500 },\n  );\n}\n\nfunction resolveWorkspaceId(env: Record<string, string | undefined>): string {\n  const explicit = env.WORKSPACE_ID?.trim();\n  if (explicit) {\n    return explicit;\n  }\n\n  const token = (env.APP_ACCESS_TOKEN ?? env.TWENTY_APP_ACCESS_TOKEN ?? \"\").trim();\n  const parts = token.split(\".\");\n  if (parts.length < 2) {\n    return \"unknown\";\n  }\n\n  try {\n    const payload = JSON.parse(base64UrlDecode(parts[1])) as { workspaceId?: string };\n    return payload.workspaceId ?? \"unknown\";\n  } catch {\n    return \"unknown\";\n  }\n}\n\nfunction base64UrlDecode(value: string): string {\n  const normalized = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n  const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, \"=\");\n  return Buffer.from(padded, \"base64\").toString(\"utf8\");\n}\n", "import { defineLogicFunction } from \"twenty-sdk/define\";\nimport type { RoutePayload } from \"twenty-sdk/logic-function\";\n\nimport { REGISTER_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER } from \"src/constants/universal-identifiers\";\nimport { handleRegister } from \"src/handlers/register\";\nimport {\n  authContext,\n  errorResponse,\n  httpResponse,\n  routeBody,\n  runtimeDeps,\n} from \"src/routeRuntime\";\n\nconst handler = async (event: RoutePayload) => {\n  try {\n    const deps = runtimeDeps();\n    return httpResponse(await handleRegister(routeBody(event), await authContext(event), deps));\n  } catch (error) {\n    return errorResponse(error);\n  }\n};\n\nexport default defineLogicFunction({\n  universalIdentifier: REGISTER_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER,\n  name: \"push-register\",\n  description: \"Registers or updates the authenticated member's mobile push device.\",\n  timeoutSeconds: 10,\n  handler,\n  httpRouteTriggerSettings: {\n    path: \"/push/register\",\n    httpMethod: \"POST\",\n    isAuthRequired: true,\n    forwardedRequestHeaders: [\"authorization\"],\n  },\n});\n"],
  "mappings": "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",
  "names": ["bearerToken"]
}
