twenty-sdk 2.53.0 → 2.54.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/dist/billing/index.cjs.map +1 -1
- package/dist/billing/index.mjs.map +1 -1
- package/dist/define/index.cjs +9 -9
- package/dist/define/index.cjs.map +1 -1
- package/dist/define/index.d.ts +103 -51
- package/dist/define/index.mjs +2859 -2832
- package/dist/define/index.mjs.map +1 -1
- package/dist/front-component/index.cjs +1 -1
- package/dist/front-component/index.cjs.map +1 -1
- package/dist/front-component/index.d.ts +13 -2
- package/dist/front-component/index.mjs +8 -4
- package/dist/front-component/index.mjs.map +1 -1
- package/dist/front-component-renderer/build.cjs +440 -7
- package/dist/front-component-renderer/build.mjs +112125 -47
- package/dist/logic-function/index.cjs +4 -4
- package/dist/logic-function/index.cjs.map +1 -1
- package/dist/logic-function/index.d.ts +12 -2
- package/dist/logic-function/index.mjs +19 -15
- package/dist/logic-function/index.mjs.map +1 -1
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.ts +3 -1
- package/dist/utils/index.mjs +13 -9
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["n","t","e","n","e","n","e"],"sources":["../../../twenty-shared/dist/isDefined-Dtu5EYqP.mjs","../../../twenty-shared/dist/logic-function.mjs","../../src/sdk/logic-function/connections/errors/app-connection-auth-failed.error.ts","../../../twenty-shared/dist/application-runtime.mjs","../../src/sdk/logic-function/connections/utils/with-legacy-connection-visibility.util.ts","../../src/sdk/utils/get-application-access-token.ts","../../src/sdk/logic-function/utils/post-graphql-request.util.ts","../../src/sdk/logic-function/connections/get-connection.ts","../../../twenty-shared/dist/get-ai-model-tier-from-model-id.util-C26DZ9rM.mjs","../../../twenty-shared/dist/capitalize-DFPVt1IM.mjs","../../src/sdk/logic-function/connections/list-connections.ts","../../src/sdk/logic-function/connections/find-connection-for-request.ts","../../src/sdk/logic-function/connections/report-connection-auth-failure.ts","../../src/sdk/logic-function/messaging/message-channel-fields.constant.ts","../../src/sdk/logic-function/messaging/create-message-channel.ts","../../src/sdk/logic-function/messaging/list-message-channels.ts","../../src/sdk/logic-function/messaging/update-message-channel.ts","../../src/sdk/logic-function/messaging/delete-message-channel.ts","../../src/sdk/logic-function/messaging/ingest-messages.ts","../../src/sdk/logic-function/messaging/message-folder-fields.constant.ts","../../src/sdk/logic-function/messaging/list-message-folders.ts","../../src/sdk/logic-function/messaging/sync-message-folders.ts","../../src/sdk/logic-function/agents/run-agent.ts","../../src/sdk/inbox/send-inbox-message.ts","../../src/sdk/inbox/mentions/utils/sanitize-inbox-reference-label.util.ts","../../src/sdk/inbox/mentions/inbox-mention.ts","../../src/sdk/inbox/mentions/utils/compute-inbox-record-label.util.ts","../../src/sdk/inbox/mentions/utils/find-inbox-label-identifier-field.util.ts","../../src/sdk/inbox/mentions/utils/find-inbox-object-metadata-or-throw.util.ts","../../src/sdk/inbox/mentions/inbox-reference-record.ts","../../src/sdk/inbox/mentions/inbox-assistant-mention.ts","../../src/sdk/logic-function/jobs/enqueue-job.ts","../../src/sdk/logic-function/jobs/enqueue-jobs.ts","../../src/sdk/logic-function/jobs/get-jobs.ts","../../src/sdk/logic-function/timeline/create-timeline-activity.ts","../../src/sdk/logic-function/key-value/kv.ts","../../src/sdk/logic-function/response.ts"],"sourcesContent":["import { isNull as e, isUndefined as t } from \"@sniptt/guards\";\n//#region src/utils/validation/isDefined.ts\nvar n = (n) => !t(n) && !e(n);\n//#endregion\nexport { n as t };\n","import { t as e } from \"./isDefined-Dtu5EYqP.mjs\";\nimport { t } from \"./is-record-object-schema-CwzshFdt.mjs\";\nimport { isNonEmptyString as n, isObject as r } from \"@sniptt/guards\";\n//#region src/logic-function/build-tool-input-json-schema.ts\nvar i = (e, t) => {\n\tlet r = n(e) ? t?.(e) : void 0;\n\treturn `Id of the ${n(r) ? r : \"linked\"} record`;\n}, a = (n, o) => {\n\tif (t(n)) return {\n\t\ttype: \"string\",\n\t\tdescription: i(n.objectUniversalIdentifier, o)\n\t};\n\tif (n.type === \"records\") return {\n\t\ttype: \"array\",\n\t\titems: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: i(n.objectUniversalIdentifier, o)\n\t\t}\n\t};\n\tlet { objectUniversalIdentifier: s, multiline: c, label: l, items: u, properties: d, additionalProperties: f, ...p } = n, m = { ...p };\n\treturn e(u) && (m.items = a(u, o)), e(d) && (m.properties = Object.fromEntries(Object.entries(d).map(([e, t]) => [e, a(t, o)]))), e(f) && (m.additionalProperties = r(f) ? a(f, o) : f), m;\n}, o = {\n\ttype: \"object\",\n\tproperties: {}\n}, s = (e) => {\n\tlet t = { type: \"unknown\" };\n\tswitch (e.type) {\n\t\tcase \"string\":\n\t\t\tt.type = \"string\";\n\t\t\tbreak;\n\t\tcase \"number\":\n\t\tcase \"integer\":\n\t\t\tt.type = \"number\";\n\t\t\tbreak;\n\t\tcase \"boolean\":\n\t\t\tt.type = \"boolean\";\n\t\t\tbreak;\n\t\tcase \"array\":\n\t\t\tt.type = \"array\", e.items && (t.items = s(e.items));\n\t\t\tbreak;\n\t\tcase \"object\":\n\t\t\tt.type = \"object\", e.properties && (t.properties = Object.fromEntries(Object.entries(e.properties).map(([e, t]) => [e, s(t)])));\n\t\t\tbreak;\n\t\tcase \"record\":\n\t\t\tt.type = \"record\";\n\t\t\tbreak;\n\t\tcase \"records\":\n\t\t\tt.type = \"records\";\n\t\t\tbreak;\n\t\tdefault: t.type = \"unknown\";\n\t}\n\treturn Array.isArray(e.enum) && (t.enum = e.enum.filter((e) => typeof e == \"string\")), e.multiline === !0 && (t.multiline = !0), n(e.label) && (t.label = e.label), n(e.objectUniversalIdentifier) && (t.objectUniversalIdentifier = e.objectUniversalIdentifier), t;\n}, c = (e) => [s(e)], l = { inputSchema: c({\n\ttype: \"object\",\n\tproperties: {\n\t\ta: { type: \"string\" },\n\t\tb: { type: \"number\" }\n\t}\n}) }, u = async (t) => {\n\tlet { getFunctionInputSchema: n } = await import(\"./get-function-input-schema-GNk3NRLJ.mjs\"), r = n(t)[0];\n\treturn r?.type === \"object\" && e(r.properties) ? {\n\t\ttype: \"object\",\n\t\tproperties: r.properties\n\t} : o;\n}, d = (t) => !e(t) || t === null ? \"unknown\" : typeof t == \"string\" ? \"string\" : typeof t == \"number\" ? \"number\" : typeof t == \"boolean\" ? \"boolean\" : Array.isArray(t) ? \"array\" : \"unknown\", f = (e) => e ? Object.entries(e).reduce((e, [t, n]) => (r(n) && !Array.isArray(n) ? e[t] = {\n\tisLeaf: !1,\n\ttype: \"object\",\n\tlabel: t,\n\tvalue: f(n)\n} : e[t] = {\n\tisLeaf: !0,\n\tvalue: n,\n\ttype: d(n),\n\tlabel: t\n}, e), {}) : {}, p = (e, t) => e ? `${e}.${t}` : t, m = (t, n, r = \"\") => {\n\tlet i = [];\n\tfor (let [a, o] of Object.entries(n)) {\n\t\tlet n = p(r, a), s = t[a];\n\t\tif (!e(s)) {\n\t\t\ti.push(`Missing key \"${n}\" in declared output schema.`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (o.isLeaf !== s.isLeaf) {\n\t\t\ti.push(`Type mismatch at \"${n}\": expected ${o.isLeaf ? o.type : \"object\"} but declared ${s.isLeaf ? s.type : \"object\"}.`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!o.isLeaf && !s.isLeaf) {\n\t\t\ti.push(...m(s.value, o.value, n));\n\t\t\tcontinue;\n\t\t}\n\t\to.isLeaf && s.isLeaf && o.type !== \"unknown\" && s.type !== \"unknown\" && o.type !== s.type && i.push(`Type mismatch at \"${n}\": expected ${o.type} but declared ${s.type}.`);\n\t}\n\treturn i;\n}, h = [\n\t\"string\",\n\t\"number\",\n\t\"boolean\",\n\t\"array\",\n\t\"unknown\"\n], g = (e) => h.includes(e), _ = (e, t) => {\n\tlet n = t.label ?? e;\n\treturn t.type === \"record\" ? {\n\t\tisLeaf: !0,\n\t\ttype: \"string\",\n\t\tlabel: n,\n\t\tvalue: null\n\t} : t.type === \"records\" ? {\n\t\tisLeaf: !0,\n\t\ttype: \"array\",\n\t\tlabel: n,\n\t\tvalue: null\n\t} : t.type === \"object\" ? {\n\t\tisLeaf: !1,\n\t\ttype: \"object\",\n\t\tlabel: n,\n\t\tvalue: r(t.properties) ? v(t.properties) : {}\n\t} : {\n\t\tisLeaf: !0,\n\t\ttype: g(t.type) ? t.type : \"unknown\",\n\t\tlabel: n,\n\t\tvalue: null\n\t};\n}, v = (e) => Object.entries(e).reduce((e, [t, n]) => (e[t] = _(t, n), e), {}), y = (e) => {\n\tlet t = e[0];\n\treturn t?.type !== \"object\" || !r(t.properties) ? {} : v(t.properties);\n}, b = (e) => e?.type === \"records\" && n(e.objectUniversalIdentifier) || e?.type === \"array\" && t(e?.items), x = \"RetryableLogicFunctionError\", S = class extends Error {\n\tconstructor(e) {\n\t\tsuper(e), this.name = x;\n\t}\n};\n//#endregion\nexport { o as DEFAULT_TOOL_INPUT_SCHEMA, x as RETRYABLE_LOGIC_FUNCTION_ERROR_NAME, S as RetryableLogicFunctionError, l as SEED_WORKFLOW_ACTION_TRIGGER_SETTINGS, a as buildToolInputJsonSchema, u as getInputSchemaFromSourceCode, f as getOutputSchemaFromValue, m as getOutputSchemaMismatchIssues, y as inputSchemaToOutputSchema, b as isRecordArraySchema, t as isRecordObjectSchema, c as jsonSchemaToInputSchema };\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-runtime/constants/ConnectionScopeByLegacyVisibility.ts\nvar e = {\n\tuser: \"USER\",\n\tworkspace: \"WORKSPACE\"\n}, t = \"TWENTY_API_KEY\", n = \"TWENTY_API_URL\", r = \"TWENTY_APP_ACCESS_TOKEN\", i = \"TWENTY_APP_APPLICATION_ACCESS_TOKEN\", a = \"TWENTY_FUNCTIONS_URL\", o = {\n\tUSER: \"user\",\n\tWORKSPACE: \"workspace\"\n}, s = [\n\t\"workspace-suspended\",\n\t\"no-subscription\",\n\t\"no-credits\"\n];\n//#endregion\nexport { e as CONNECTION_SCOPE_BY_LEGACY_VISIBILITY, s as CREDIT_UNAVAILABLE_REASONS, t as DEFAULT_API_KEY_NAME, n as DEFAULT_API_URL_NAME, r as DEFAULT_APP_ACCESS_TOKEN_NAME, i as DEFAULT_APP_APPLICATION_ACCESS_TOKEN_NAME, a as DEFAULT_FUNCTIONS_URL_NAME, o as LEGACY_CONNECTION_VISIBILITY_BY_SCOPE };\n","import { LEGACY_CONNECTION_VISIBILITY_BY_SCOPE } from 'twenty-shared/application-runtime';\n\nimport { type AppConnection } from '@/sdk/logic-function/connections/types/app-connection.type';\n\ntype WithoutVisibility<TConnection> = TConnection extends unknown\n ? Omit<TConnection, 'visibility'>\n : never;\n\nexport type AppConnectionWithoutVisibility = WithoutVisibility<AppConnection>;\n\nexport const withLegacyConnectionVisibility = (\n connection: AppConnectionWithoutVisibility,\n): AppConnection => ({\n ...connection,\n visibility: LEGACY_CONNECTION_VISIBILITY_BY_SCOPE[connection.scope],\n});\n","import {\n DEFAULT_APP_ACCESS_TOKEN_NAME,\n DEFAULT_APP_APPLICATION_ACCESS_TOKEN_NAME,\n} from 'twenty-shared/application-runtime';\n\n// These reach the application's own resources, so prefer the application token when the runtime injects one\nexport const getApplicationAccessToken = (): string | undefined =>\n process.env[DEFAULT_APP_APPLICATION_ACCESS_TOKEN_NAME] ??\n process.env[DEFAULT_APP_ACCESS_TOKEN_NAME];\n","import {\n DEFAULT_API_URL_NAME,\n DEFAULT_APP_APPLICATION_ACCESS_TOKEN_NAME,\n} from 'twenty-shared/application-runtime';\n\nimport { getApplicationAccessToken } from '@/sdk/utils/get-application-access-token';\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 = getApplicationAccessToken();\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_APPLICATION_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 {\n type AppConnectionWithoutVisibility,\n withLegacyConnectionVisibility,\n} from '@/sdk/logic-function/connections/utils/with-legacy-connection-visibility.util';\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 externalAccountId\n scope\n userWorkspaceId\n workspaceMemberId\n providerType\n accessToken\n scopes\n authFailedAt\n authFailedReason\n }\n }\n`;\n\nexport const getConnection = async (id: string): Promise<AppConnection> => {\n const { appConnection } = await postGraphqlRequest<\n { id: string },\n { appConnection: AppConnectionWithoutVisibility }\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 withLegacyConnectionVisibility(appConnection);\n};\n","//#region src/ai/constants/agent-chat-assistant-mention-object-name-singular.const.ts\nvar e = \"agentChatAssistant\", t = [\n\t\"extraFast\",\n\t\"fast\",\n\t\"balanced\",\n\t\"smart\",\n\t\"extraSmart\"\n], n = {\n\textraFast: \"default-extra-fast-model\",\n\tfast: \"default-fast-model\",\n\tbalanced: \"default-balanced-model\",\n\tsmart: \"default-smart-model\",\n\textraSmart: \"default-extra-smart-model\"\n}, r = \"workspace-default-model\", i = (e) => /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e), a = ({ objectNameSingular: e, recordId: t, displayName: n }) => e === \"agentChatAssistant\" ? `@${n}` : `[[record:${e}:${t}:${n}]]`, o = ({ skillId: e, label: t }) => `[[skill:${e}:${t}]]`, s = (e) => t.find((t) => n[t] === e);\n//#endregion\nexport { r as a, e as c, i, o as n, n as o, a as r, t as s, s as t };\n","import { isNonEmptyString as e } from \"@sniptt/guards\";\n//#region src/i18n/do-not-translate.ts\nvar t = (e) => e, n = (t) => e(t) ? t.charAt(0).toUpperCase() + t.slice(1) : \"\";\n//#endregion\nexport { t as n, n as t };\n","import { CONNECTION_SCOPE_BY_LEGACY_VISIBILITY } from 'twenty-shared/application-runtime';\nimport { isDefined } from 'twenty-shared/utils';\n\nimport { type AppConnection } from '@/sdk/logic-function/connections/types/app-connection.type';\nimport {\n type AppConnectionWithoutVisibility,\n withLegacyConnectionVisibility,\n} from '@/sdk/logic-function/connections/utils/with-legacy-connection-visibility.util';\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 externalAccountId\n scope\n userWorkspaceId\n workspaceMemberId\n providerType\n accessToken\n scopes\n authFailedAt\n authFailedReason\n }\n }\n`;\n\nexport type ListConnectionsFilter = {\n providerName?: string;\n userWorkspaceId?: string;\n scope?: AppConnection['scope'];\n /** @deprecated Use `scope` instead. */\n visibility?: AppConnection['visibility'];\n};\n\nexport const listConnections = async ({\n visibility,\n ...filter\n}: ListConnectionsFilter = {}): Promise<AppConnection[]> => {\n const { appConnections } = await postGraphqlRequest<\n { filter: Omit<ListConnectionsFilter, 'visibility'> },\n { appConnections: AppConnectionWithoutVisibility[] }\n >({\n query: LIST_APP_CONNECTIONS_QUERY,\n variables: {\n filter: {\n ...filter,\n scope:\n filter.scope ??\n (isDefined(visibility)\n ? CONNECTION_SCOPE_BY_LEGACY_VISIBILITY[visibility]\n : undefined),\n },\n },\n caller: 'listConnections',\n });\n\n return appConnections.map(withLegacyConnectionVisibility);\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.scope === '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.scope === 'WORKSPACE',\n );\n\n return workspaceShared ?? null;\n};\n","import { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst REPORT_APP_CONNECTION_AUTH_FAILURE_MUTATION = `\n mutation ReportAppConnectionAuthFailure($input: ReportAppConnectionAuthFailureInput!) {\n reportAppConnectionAuthFailure(input: $input)\n }\n`;\n\nexport const reportConnectionAuthFailure = async ({\n connectionId,\n reason,\n}: {\n connectionId: string;\n reason?: string;\n}): Promise<void> => {\n await postGraphqlRequest<\n { input: { id: string; reason?: string } },\n { reportAppConnectionAuthFailure: boolean }\n >({\n query: REPORT_APP_CONNECTION_AUTH_FAILURE_MUTATION,\n variables: { input: { id: connectionId, reason } },\n caller: 'reportConnectionAuthFailure',\n });\n};\n","// Shared by every helper, so channels returned by any of them are interchangeable\nexport const APP_MESSAGE_CHANNEL_SELECTION = `\n id\n handle\n displayName\n visibility\n connectedAccountId\n isSyncEnabled\n participantHandleFieldUniversalIdentifier\n messagingProviderUniversalIdentifier\n`;\n","import { type MessageChannelVisibility } from '@/sdk/define/common/types/loose-shared-types.type';\nimport { APP_MESSAGE_CHANNEL_SELECTION } from '@/sdk/logic-function/messaging/message-channel-fields.constant';\nimport { type AppMessageChannel } from '@/sdk/logic-function/messaging/types/app-message-channel.type';\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst CREATE_APP_MESSAGE_CHANNEL_MUTATION = `\n mutation CreateAppMessageChannel($input: CreateAppMessageChannelInput!) {\n createAppMessageChannel(input: $input) {\n ${APP_MESSAGE_CHANNEL_SELECTION}\n }\n }\n`;\n\nexport type CreateMessageChannelInput = {\n // An app connection id (from getConnection/listConnections); the channel speaks through it and inherits who may see it\n connectedAccountId: string;\n // The account's provider identity; inbound participants matching it are treated as the account itself\n handle: string;\n displayName?: string;\n // Required: decides whether one member's conversations are readable by the whole workspace, and only the app\n // knows how private its messages are ('METADATA' for personal inboxes, 'SHARE_EVERYTHING' for shared ones)\n visibility: MessageChannelVisibility;\n // Person field to match participant handles against (handles are then stored in its canonical form); set once\n participantHandleFieldUniversalIdentifier?: string;\n messagingProvider?: { universalIdentifier: string };\n};\n\nexport const createMessageChannel = async ({\n messagingProvider,\n ...input\n}: CreateMessageChannelInput): Promise<AppMessageChannel> => {\n const { createAppMessageChannel } = await postGraphqlRequest<\n {\n input: Omit<CreateMessageChannelInput, 'messagingProvider'> & {\n messagingProviderUniversalIdentifier?: string;\n };\n },\n { createAppMessageChannel: AppMessageChannel }\n >({\n query: CREATE_APP_MESSAGE_CHANNEL_MUTATION,\n variables: {\n input: {\n ...input,\n messagingProviderUniversalIdentifier:\n messagingProvider?.universalIdentifier,\n },\n },\n caller: 'createMessageChannel',\n });\n\n return createAppMessageChannel;\n};\n","import { APP_MESSAGE_CHANNEL_SELECTION } from '@/sdk/logic-function/messaging/message-channel-fields.constant';\nimport { type AppMessageChannel } from '@/sdk/logic-function/messaging/types/app-message-channel.type';\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst LIST_APP_MESSAGE_CHANNELS_QUERY = `\n query ListAppMessageChannels($filter: ListAppMessageChannelsInput) {\n appMessageChannels(filter: $filter) {\n ${APP_MESSAGE_CHANNEL_SELECTION}\n }\n }\n`;\n\nexport type ListMessageChannelsFilter = {\n connectedAccountId?: string;\n};\n\nexport const listMessageChannels = async (\n filter: ListMessageChannelsFilter = {},\n): Promise<AppMessageChannel[]> => {\n const { appMessageChannels } = await postGraphqlRequest<\n { filter: ListMessageChannelsFilter },\n { appMessageChannels: AppMessageChannel[] }\n >({\n query: LIST_APP_MESSAGE_CHANNELS_QUERY,\n variables: { filter },\n caller: 'listMessageChannels',\n });\n\n return appMessageChannels;\n};\n","import { type MessageChannelVisibility } from '@/sdk/define/common/types/loose-shared-types.type';\nimport { APP_MESSAGE_CHANNEL_SELECTION } from '@/sdk/logic-function/messaging/message-channel-fields.constant';\nimport { type AppMessageChannel } from '@/sdk/logic-function/messaging/types/app-message-channel.type';\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst UPDATE_APP_MESSAGE_CHANNEL_MUTATION = `\n mutation UpdateAppMessageChannel($input: UpdateAppMessageChannelInput!) {\n updateAppMessageChannel(input: $input) {\n ${APP_MESSAGE_CHANNEL_SELECTION}\n }\n }\n`;\n\nexport type UpdateMessageChannelInput = {\n id: string;\n // Omitted leaves the current label untouched; null clears it.\n displayName?: string | null;\n // Changes who can read every message already ingested, not just the ones that follow\n visibility?: MessageChannelVisibility;\n // False pauses ingestion (further ingests are rejected) without deleting the history\n isSyncEnabled?: boolean;\n messagingProvider?: { universalIdentifier: string } | null;\n};\n\nexport const updateMessageChannel = async ({\n messagingProvider,\n ...input\n}: UpdateMessageChannelInput): Promise<AppMessageChannel> => {\n const { updateAppMessageChannel } = await postGraphqlRequest<\n {\n input: Omit<UpdateMessageChannelInput, 'messagingProvider'> & {\n messagingProviderUniversalIdentifier?: string | null;\n };\n },\n { updateAppMessageChannel: AppMessageChannel }\n >({\n query: UPDATE_APP_MESSAGE_CHANNEL_MUTATION,\n variables: {\n input: {\n ...input,\n messagingProviderUniversalIdentifier:\n messagingProvider === undefined\n ? undefined\n : (messagingProvider?.universalIdentifier ?? null),\n },\n },\n caller: 'updateMessageChannel',\n });\n\n return updateAppMessageChannel;\n};\n","import { APP_MESSAGE_CHANNEL_SELECTION } from '@/sdk/logic-function/messaging/message-channel-fields.constant';\nimport { type AppMessageChannel } from '@/sdk/logic-function/messaging/types/app-message-channel.type';\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst DELETE_APP_MESSAGE_CHANNEL_MUTATION = `\n mutation DeleteAppMessageChannel($id: UUID!) {\n deleteAppMessageChannel(id: $id) {\n ${APP_MESSAGE_CHANNEL_SELECTION}\n }\n }\n`;\n\n// Also deletes the channel's ingested messages and emptied threads; call from onDisconnect to retire a channel with its credential.\n// To stop ingesting but keep the history, set `isSyncEnabled` to false instead.\nexport const deleteMessageChannel = async (\n id: string,\n): Promise<AppMessageChannel> => {\n const { deleteAppMessageChannel } = await postGraphqlRequest<\n { id: string },\n { deleteAppMessageChannel: AppMessageChannel }\n >({\n query: DELETE_APP_MESSAGE_CHANNEL_MUTATION,\n variables: { id },\n caller: 'deleteMessageChannel',\n });\n\n return deleteAppMessageChannel;\n};\n","import {\n type IngestMessage,\n type IngestedMessage,\n} from '@/sdk/logic-function/messaging/types/ingest-message.type';\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst INGEST_APP_MESSAGES_MUTATION = `\n mutation IngestAppMessages($input: IngestAppMessagesInput!) {\n ingestAppMessages(input: $input) {\n messages {\n externalId\n messageId\n messageThreadId\n }\n }\n }\n`;\n\n// Threading, dedup and privacy are handled server-side. At most 100 messages per call (one transaction\n// within one logic-function timeout), so page provider backfills\nexport const ingestMessages = async ({\n messageChannelId,\n messages,\n}: {\n messageChannelId: string;\n messages: IngestMessage[];\n}): Promise<IngestedMessage[]> => {\n const { ingestAppMessages } = await postGraphqlRequest<\n { input: { messageChannelId: string; messages: IngestMessage[] } },\n { ingestAppMessages: { messages: IngestedMessage[] } }\n >({\n query: INGEST_APP_MESSAGES_MUTATION,\n variables: { input: { messageChannelId, messages } },\n caller: 'ingestMessages',\n });\n\n return ingestAppMessages.messages;\n};\n","export const APP_MESSAGE_FOLDER_SELECTION = `\n id\n externalId\n name\n isSynced\n messageChannelId\n`;\n","import { APP_MESSAGE_FOLDER_SELECTION } from '@/sdk/logic-function/messaging/message-folder-fields.constant';\nimport { type AppMessageFolder } from '@/sdk/logic-function/messaging/types/app-message-folder.type';\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst LIST_APP_MESSAGE_FOLDERS_QUERY = `\n query ListAppMessageFolders($filter: ListAppMessageFoldersInput) {\n appMessageFolders(filter: $filter) {\n ${APP_MESSAGE_FOLDER_SELECTION}\n }\n }\n`;\n\nexport type ListMessageFoldersFilter = {\n messageChannelId?: string;\n};\n\nexport const listMessageFolders = async (\n filter: ListMessageFoldersFilter = {},\n): Promise<AppMessageFolder[]> => {\n const { appMessageFolders } = await postGraphqlRequest<\n { filter: ListMessageFoldersFilter },\n { appMessageFolders: AppMessageFolder[] }\n >({\n query: LIST_APP_MESSAGE_FOLDERS_QUERY,\n variables: { filter },\n caller: 'listMessageFolders',\n });\n\n return appMessageFolders;\n};\n","import { APP_MESSAGE_FOLDER_SELECTION } from '@/sdk/logic-function/messaging/message-folder-fields.constant';\nimport { type AppMessageFolder } from '@/sdk/logic-function/messaging/types/app-message-folder.type';\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst SYNC_APP_MESSAGE_FOLDERS_MUTATION = `\n mutation SyncAppMessageFolders($input: SyncAppMessageFoldersInput!) {\n syncAppMessageFolders(input: $input) {\n ${APP_MESSAGE_FOLDER_SELECTION}\n }\n }\n`;\n\nexport type SyncMessageFoldersInput = {\n messageChannelId: string;\n folders: {\n externalId: string;\n name: string;\n isSynced?: boolean;\n }[];\n};\n\nexport const syncMessageFolders = async (\n input: SyncMessageFoldersInput,\n): Promise<AppMessageFolder[]> => {\n const { syncAppMessageFolders } = await postGraphqlRequest<\n { input: SyncMessageFoldersInput },\n { syncAppMessageFolders: AppMessageFolder[] }\n >({\n query: SYNC_APP_MESSAGE_FOLDERS_MUTATION,\n variables: { input },\n caller: 'syncMessageFolders',\n });\n\n return syncAppMessageFolders;\n};\n","import {\n type RunAgentInput,\n type RunAgentResult,\n} from 'twenty-shared/application';\nimport { isDefined } from 'twenty-shared/utils';\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 threadId\n status\n result\n error\n success\n }\n }\n`;\n\nexport const runAgent = async ({\n input,\n ...rest\n}: RunAgentInput): Promise<RunAgentResult> => {\n const variables = {\n input: isDefined(input)\n ? {\n ...rest,\n input:\n typeof input === 'string'\n ? [{ role: 'user', content: input }]\n : input,\n }\n : rest,\n };\n\n const { runAgent: result } = await postGraphqlRequest<\n typeof variables,\n { runAgent: RunAgentResult }\n >({\n query: RUN_AGENT_MUTATION,\n variables,\n caller: 'runAgent',\n });\n\n return result;\n};\n","import { MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport { type SendInboxMessageResult } from 'twenty-shared/application';\n\nimport { type SendInboxMessageInput } from '@/sdk/define/common/types/loose-shared-types.type';\n\nexport const sendInboxMessage = async (\n input: SendInboxMessageInput,\n): Promise<SendInboxMessageResult> => {\n const client = new MetadataApiClient();\n\n const { sendInboxMessage: result } = await client.mutation({\n sendInboxMessage: {\n __args: { input },\n threadId: true,\n },\n });\n\n return result;\n};\n","const OPENING_BRACKET_PATTERN = /\\[/g;\nconst CLOSING_BRACKET_PATTERN = /\\]/g;\nconst LINE_BREAK_PATTERN = /\\r?\\n/g;\n\nexport const sanitizeInboxReferenceLabel = (label: string): string =>\n label\n .replace(OPENING_BRACKET_PATTERN, '(')\n .replace(CLOSING_BRACKET_PATTERN, ')')\n .replace(LINE_BREAK_PATTERN, ' ')\n .trim();\n","import { isNonEmptyString } from '@sniptt/guards';\nimport { RestApiClient } from 'twenty-client-sdk/rest';\nimport { formatRecordReference } from 'twenty-shared/ai';\n\nimport { sanitizeInboxReferenceLabel } from '@/sdk/inbox/mentions/utils/sanitize-inbox-reference-label.util';\n\ntype WorkspaceMemberResponse = {\n data: {\n workspaceMember: {\n name: { firstName: string | null; lastName: string | null };\n userEmail: string;\n };\n };\n};\n\nexport const inboxMention = async ({\n workspaceMemberId,\n}: {\n workspaceMemberId: string;\n}): Promise<string> => {\n const {\n data: { workspaceMember },\n } = await new RestApiClient().get<WorkspaceMemberResponse>(\n `/rest/workspaceMembers/${workspaceMemberId}`,\n );\n\n const fullName =\n `${workspaceMember.name.firstName ?? ''} ${workspaceMember.name.lastName ?? ''}`.trim();\n\n return formatRecordReference({\n objectNameSingular: 'workspaceMember',\n recordId: workspaceMemberId,\n displayName: sanitizeInboxReferenceLabel(\n isNonEmptyString(fullName) ? fullName : workspaceMember.userEmail,\n ),\n });\n};\n","import { isObject, isString } from '@sniptt/guards';\nimport { isDefined } from 'twenty-shared/utils';\n\nimport { type InboxLabelIdentifierField } from '@/sdk/inbox/mentions/types/inbox-label-identifier-field.type';\n\nconst getFullNamePart = ({\n fullName,\n partName,\n}: {\n fullName: unknown;\n partName: 'firstName' | 'lastName';\n}): string => {\n const part = isObject(fullName) ? Reflect.get(fullName, partName) : undefined;\n\n return isString(part) ? part : '';\n};\n\nexport const computeInboxRecordLabel = ({\n record,\n recordId,\n labelIdentifierField,\n}: {\n record: Record<string, unknown>;\n recordId: string;\n labelIdentifierField: InboxLabelIdentifierField | undefined;\n}): string => {\n if (!isDefined(labelIdentifierField)) {\n return recordId;\n }\n\n const labelValue = record[labelIdentifierField.name];\n\n if (labelIdentifierField.type === 'FULL_NAME') {\n return `${getFullNamePart({ fullName: labelValue, partName: 'firstName' })} ${getFullNamePart({ fullName: labelValue, partName: 'lastName' })}`.trim();\n }\n\n return isDefined(labelValue) ? String(labelValue) : '';\n};\n","import { type MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport { isDefined } from 'twenty-shared/utils';\n\nimport { type InboxLabelIdentifierField } from '@/sdk/inbox/mentions/types/inbox-label-identifier-field.type';\nimport { type InboxObjectMetadata } from '@/sdk/inbox/mentions/types/inbox-object-metadata.type';\n\nexport const findInboxLabelIdentifierField = async ({\n metadataClient,\n objectMetadata,\n}: {\n metadataClient: MetadataApiClient;\n objectMetadata: Pick<\n InboxObjectMetadata,\n 'id' | 'labelIdentifierFieldMetadataId'\n >;\n}): Promise<InboxLabelIdentifierField | undefined> => {\n if (!isDefined(objectMetadata.labelIdentifierFieldMetadataId)) {\n return undefined;\n }\n\n const { object } = await metadataClient.query({\n object: {\n __args: { id: objectMetadata.id },\n fields: {\n __args: {\n filter: { id: { eq: objectMetadata.labelIdentifierFieldMetadataId } },\n paging: { first: 1 },\n },\n edges: { node: { name: true, type: true } },\n },\n },\n });\n\n return object.fields.edges[0]?.node;\n};\n","import { type MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport { isDefined } from 'twenty-shared/utils';\n\nimport { type InboxObjectMetadata } from '@/sdk/inbox/mentions/types/inbox-object-metadata.type';\n\nconst OBJECTS_PAGE_SIZE = 1000;\n\nexport const findInboxObjectMetadataOrThrow = async ({\n metadataClient,\n objectNameSingular,\n}: {\n metadataClient: MetadataApiClient;\n objectNameSingular: string;\n}): Promise<InboxObjectMetadata> => {\n const { objects } = await metadataClient.query({\n objects: {\n __args: { filter: {}, paging: { first: OBJECTS_PAGE_SIZE } },\n edges: {\n node: {\n id: true,\n nameSingular: true,\n namePlural: true,\n labelIdentifierFieldMetadataId: true,\n },\n },\n },\n });\n\n const objectMetadata = objects.edges.find(\n ({ node }) => node.nameSingular === objectNameSingular,\n )?.node;\n\n if (!isDefined(objectMetadata)) {\n throw new Error(`This workspace has no ${objectNameSingular} object.`);\n }\n\n return objectMetadata;\n};\n","import { MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport { RestApiClient } from 'twenty-client-sdk/rest';\nimport { formatRecordReference } from 'twenty-shared/ai';\n\nimport { computeInboxRecordLabel } from '@/sdk/inbox/mentions/utils/compute-inbox-record-label.util';\nimport { findInboxLabelIdentifierField } from '@/sdk/inbox/mentions/utils/find-inbox-label-identifier-field.util';\nimport { findInboxObjectMetadataOrThrow } from '@/sdk/inbox/mentions/utils/find-inbox-object-metadata-or-throw.util';\nimport { sanitizeInboxReferenceLabel } from '@/sdk/inbox/mentions/utils/sanitize-inbox-reference-label.util';\n\nexport const inboxReferenceRecord = async ({\n objectNameSingular,\n recordId,\n}: {\n objectNameSingular: string;\n recordId: string;\n}): Promise<string> => {\n const metadataClient = new MetadataApiClient();\n const objectMetadata = await findInboxObjectMetadataOrThrow({\n metadataClient,\n objectNameSingular,\n });\n\n const [labelIdentifierField, recordResponse] = await Promise.all([\n findInboxLabelIdentifierField({ metadataClient, objectMetadata }),\n new RestApiClient().get<{\n data: Record<string, Record<string, unknown>>;\n }>(`/rest/${objectMetadata.namePlural}/${recordId}`),\n ]);\n\n return formatRecordReference({\n objectNameSingular,\n recordId,\n displayName: sanitizeInboxReferenceLabel(\n computeInboxRecordLabel({\n record: recordResponse.data[objectNameSingular],\n recordId,\n labelIdentifierField,\n }),\n ),\n });\n};\n","import {\n AGENT_CHAT_ASSISTANT_MENTION_OBJECT_NAME_SINGULAR,\n AGENT_CHAT_ASSISTANT_NAME,\n formatRecordReference,\n} from 'twenty-shared/ai';\n\nexport const INBOX_ASSISTANT_MENTION = formatRecordReference({\n objectNameSingular: AGENT_CHAT_ASSISTANT_MENTION_OBJECT_NAME_SINGULAR,\n recordId: AGENT_CHAT_ASSISTANT_MENTION_OBJECT_NAME_SINGULAR,\n displayName: AGENT_CHAT_ASSISTANT_NAME,\n});\n","import { MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport {\n type EnqueueJobInput,\n type EnqueueJobResult,\n} from 'twenty-shared/application';\n\n/**\n * @deprecated Use `enqueueJobs` instead.\n */\nexport const enqueueJob = async (\n input: EnqueueJobInput,\n): Promise<EnqueueJobResult> => {\n const client = new MetadataApiClient();\n\n const { enqueueJob: result } = await client.mutation({\n enqueueJob: {\n __args: { input },\n enqueued: true,\n logicFunctionUniversalIdentifier: true,\n jobId: true,\n },\n });\n\n return result;\n};\n","import { MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport {\n type EnqueueJobsInput,\n type EnqueueJobsResult,\n} from 'twenty-shared/application';\n\nexport const enqueueJobs = async (\n input: EnqueueJobsInput,\n): Promise<EnqueueJobsResult> => {\n const client = new MetadataApiClient();\n\n const { enqueueJobs: result } = await client.mutation({\n enqueueJobs: {\n __args: { input },\n enqueued: true,\n logicFunctionUniversalIdentifier: true,\n enqueuedJobsCount: true,\n jobIds: true,\n },\n });\n\n return result;\n};\n","import { MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport { type JobStatusResult } from 'twenty-shared/application';\n\nexport const getJobs = async (jobIds: string[]): Promise<JobStatusResult[]> => {\n const client = new MetadataApiClient();\n\n const { getJobs: result } = await client.query({\n getJobs: {\n __args: { jobIds },\n jobId: true,\n state: true,\n attemptsMade: true,\n failedReason: true,\n enqueuedAt: true,\n startedAt: true,\n finishedAt: true,\n },\n });\n\n return result;\n};\n","import { MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport { RestApiClient } from 'twenty-client-sdk/rest';\nimport { capitalize, isDefined } from 'twenty-shared/utils';\nimport { type TimelineActivityTypeSnapshot } from 'twenty-shared/timeline';\n\ntype CreateTimelineActivityBaseInput = {\n timelineActivityTypeUniversalIdentifier: string;\n targetObjectUniversalIdentifier: string;\n targetRecordId: string;\n happensAt?: string;\n properties?: Record<string, unknown>;\n};\n\ntype CreateTimelineActivityLinkedRecordInput =\n | {\n linkedRecordId: string;\n linkedObjectMetadataUniversalIdentifier: string;\n }\n | {\n linkedRecordId?: never;\n linkedObjectMetadataUniversalIdentifier?: never;\n };\n\nexport type CreateTimelineActivityInput = CreateTimelineActivityBaseInput &\n CreateTimelineActivityLinkedRecordInput;\n\nexport type CreatedTimelineActivity = {\n id: string;\n timelineActivityTypeId: string;\n timelineActivityTypeSnapshot: TimelineActivityTypeSnapshot;\n};\n\nconst getObjectMetadataSelection = (universalIdentifiers: string[]) => ({\n __args: {\n paging: {\n first: universalIdentifiers.length,\n },\n filter: {\n universalIdentifier: {\n in: universalIdentifiers,\n },\n },\n },\n edges: {\n node: {\n id: true,\n universalIdentifier: true,\n nameSingular: true,\n },\n },\n});\n\n// Apps address manifest entities by universal identifier; the row stores the installation-specific metadata id\nexport const createTimelineActivity = async ({\n timelineActivityTypeUniversalIdentifier,\n targetObjectUniversalIdentifier,\n linkedObjectMetadataUniversalIdentifier,\n targetRecordId,\n ...input\n}: CreateTimelineActivityInput): Promise<CreatedTimelineActivity> => {\n const requiredObjectUniversalIdentifiers = [\n ...new Set(\n [\n targetObjectUniversalIdentifier,\n linkedObjectMetadataUniversalIdentifier,\n ].filter(isDefined),\n ),\n ];\n const metadataClient = new MetadataApiClient();\n const { timelineActivityTypes, objects } = await metadataClient.query({\n timelineActivityTypes: {\n id: true,\n universalIdentifier: true,\n isActive: true,\n },\n objects: getObjectMetadataSelection(requiredObjectUniversalIdentifiers),\n });\n\n const timelineActivityType = timelineActivityTypes.find(\n ({ universalIdentifier }) =>\n universalIdentifier === timelineActivityTypeUniversalIdentifier,\n );\n\n if (!isDefined(timelineActivityType)) {\n throw new Error(\n `Timeline activity type ${timelineActivityTypeUniversalIdentifier} is not installed`,\n );\n }\n\n if (!timelineActivityType.isActive) {\n throw new Error(\n `Timeline activity type ${timelineActivityTypeUniversalIdentifier} is inactive`,\n );\n }\n\n const objectMetadataByUniversalIdentifier = new Map(\n objects.edges.map(({ node }) => [node.universalIdentifier, node]),\n );\n\n const targetObject = objectMetadataByUniversalIdentifier.get(\n targetObjectUniversalIdentifier,\n );\n\n if (!isDefined(targetObject)) {\n throw new Error(\n `Timeline activity target object ${targetObjectUniversalIdentifier} is not installed`,\n );\n }\n\n const targetFieldName = `target${capitalize(targetObject.nameSingular)}Id`;\n const linkedObject = isDefined(linkedObjectMetadataUniversalIdentifier)\n ? objectMetadataByUniversalIdentifier.get(\n linkedObjectMetadataUniversalIdentifier,\n )\n : undefined;\n\n if (\n isDefined(linkedObjectMetadataUniversalIdentifier) &&\n !isDefined(linkedObject)\n ) {\n throw new Error(\n `Timeline activity linked object ${linkedObjectMetadataUniversalIdentifier} is not installed`,\n );\n }\n\n const response = await new RestApiClient().post<{\n data: { createTimelineActivity: CreatedTimelineActivity };\n }>('/rest/timelineActivities', {\n ...input,\n timelineActivityTypeId: timelineActivityType.id,\n linkedObjectMetadataId: linkedObject?.id,\n [targetFieldName]: targetRecordId,\n });\n\n return response.data.createTimelineActivity;\n};\n","import {\n type AppKeyValue,\n type AppKeyValueScope,\n} from 'twenty-shared/application';\n\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst GET_APP_KEY_VALUE_QUERY = `\n query GetAppKeyValue($key: String!, $scope: AppKeyValueScope) {\n appKeyValue(key: $key, scope: $scope) {\n key\n value\n scope\n }\n }\n`;\n\nconst SET_APP_KEY_VALUE_MUTATION = `\n mutation SetAppKeyValue($input: SetAppKeyValueInput!) {\n setAppKeyValue(input: $input) {\n key\n value\n scope\n }\n }\n`;\n\nconst DELETE_APP_KEY_VALUE_MUTATION = `\n mutation DeleteAppKeyValue($key: String!, $scope: AppKeyValueScope) {\n deleteAppKeyValue(key: $key, scope: $scope)\n }\n`;\n\nconst DEFAULT_APP_KEY_VALUE_SCOPE: AppKeyValueScope = 'WORKSPACE';\n\ntype KvOptions = {\n scope?: AppKeyValueScope;\n};\n\nexport const kv = {\n async get<TValue = unknown>(\n key: string,\n options?: KvOptions,\n ): Promise<TValue | null> {\n const { appKeyValue } = await postGraphqlRequest<\n { key: string; scope: AppKeyValueScope },\n { appKeyValue: AppKeyValue | null }\n >({\n query: GET_APP_KEY_VALUE_QUERY,\n variables: { key, scope: options?.scope ?? DEFAULT_APP_KEY_VALUE_SCOPE },\n caller: 'kv.get',\n });\n\n return (appKeyValue?.value ?? null) as TValue | null;\n },\n\n async set<TValue>(\n key: string,\n value: TValue,\n options?: KvOptions,\n ): Promise<void> {\n await postGraphqlRequest<\n {\n input: { key: string; value: TValue; scope: AppKeyValueScope };\n },\n { setAppKeyValue: AppKeyValue }\n >({\n query: SET_APP_KEY_VALUE_MUTATION,\n variables: {\n input: {\n key,\n value,\n scope: options?.scope ?? DEFAULT_APP_KEY_VALUE_SCOPE,\n },\n },\n caller: 'kv.set',\n });\n },\n\n async delete(key: string, options?: KvOptions): Promise<boolean> {\n const { deleteAppKeyValue } = await postGraphqlRequest<\n { key: string; scope: AppKeyValueScope },\n { deleteAppKeyValue: boolean }\n >({\n query: DELETE_APP_KEY_VALUE_MUTATION,\n variables: { key, scope: options?.scope ?? DEFAULT_APP_KEY_VALUE_SCOPE },\n caller: 'kv.delete',\n });\n\n return deleteAppKeyValue;\n },\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["n","t","e","s","n","e","n","e"],"sources":["../../../twenty-shared/dist/isDefined-Dtu5EYqP.mjs","../../../twenty-shared/dist/logic-function.mjs","../../src/sdk/logic-function/connections/errors/app-connection-auth-failed.error.ts","../../../twenty-shared/dist/application-runtime.mjs","../../src/sdk/logic-function/connections/utils/with-legacy-connection-visibility.util.ts","../../src/sdk/utils/get-application-access-token.ts","../../src/sdk/logic-function/utils/post-graphql-request.util.ts","../../src/sdk/logic-function/connections/get-connection.ts","../../../twenty-shared/dist/get-ai-model-tier-from-model-id.util-C26DZ9rM.mjs","../../../twenty-shared/dist/capitalize-DFPVt1IM.mjs","../../src/sdk/logic-function/connections/list-connections.ts","../../src/sdk/logic-function/connections/find-connection-for-request.ts","../../src/sdk/logic-function/connections/report-connection-auth-failure.ts","../../src/sdk/logic-function/messaging/message-channel-fields.constant.ts","../../src/sdk/logic-function/messaging/create-message-channel.ts","../../src/sdk/logic-function/messaging/list-message-channels.ts","../../src/sdk/logic-function/messaging/update-message-channel.ts","../../src/sdk/logic-function/messaging/delete-message-channel.ts","../../src/sdk/logic-function/messaging/ingest-messages.ts","../../src/sdk/logic-function/messaging/message-folder-fields.constant.ts","../../src/sdk/logic-function/messaging/list-message-folders.ts","../../src/sdk/logic-function/messaging/sync-message-folders.ts","../../src/sdk/logic-function/agents/run-agent.ts","../../src/sdk/inbox/send-inbox-message.ts","../../src/sdk/inbox/mentions/utils/sanitize-inbox-reference-label.util.ts","../../src/sdk/inbox/mentions/inbox-mention.ts","../../src/sdk/inbox/mentions/utils/compute-inbox-record-label.util.ts","../../src/sdk/inbox/mentions/utils/find-inbox-label-identifier-field.util.ts","../../src/sdk/inbox/mentions/utils/find-inbox-object-metadata-or-throw.util.ts","../../src/sdk/inbox/mentions/inbox-reference-record.ts","../../src/sdk/inbox/mentions/inbox-assistant-mention.ts","../../src/sdk/inbox/attach-record-to-inbox-thread.ts","../../src/sdk/inbox/detach-record-from-inbox-thread.ts","../../src/sdk/logic-function/jobs/enqueue-job.ts","../../src/sdk/logic-function/jobs/enqueue-jobs.ts","../../src/sdk/logic-function/jobs/get-jobs.ts","../../src/sdk/logic-function/timeline/create-timeline-activity.ts","../../src/sdk/logic-function/key-value/kv.ts","../../src/sdk/logic-function/response.ts"],"sourcesContent":["import { isNull as e, isUndefined as t } from \"@sniptt/guards\";\n//#region src/utils/validation/isDefined.ts\nvar n = (n) => !t(n) && !e(n);\n//#endregion\nexport { n as t };\n","import { t as e } from \"./isDefined-Dtu5EYqP.mjs\";\nimport { t } from \"./is-record-object-schema-CwzshFdt.mjs\";\nimport { isNonEmptyString as n, isObject as r } from \"@sniptt/guards\";\n//#region src/logic-function/build-tool-input-json-schema.ts\nvar i = (e, t) => {\n\tlet r = n(e) ? t?.(e) : void 0;\n\treturn `Id of the ${n(r) ? r : \"linked\"} record`;\n}, a = (n, o) => {\n\tif (t(n)) return {\n\t\ttype: \"string\",\n\t\tdescription: i(n.objectUniversalIdentifier, o)\n\t};\n\tif (n.type === \"records\") return {\n\t\ttype: \"array\",\n\t\titems: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: i(n.objectUniversalIdentifier, o)\n\t\t}\n\t};\n\tlet { objectUniversalIdentifier: s, multiline: c, label: l, items: u, properties: d, additionalProperties: f, ...p } = n, m = { ...p };\n\treturn e(u) && (m.items = a(u, o)), e(d) && (m.properties = Object.fromEntries(Object.entries(d).map(([e, t]) => [e, a(t, o)]))), e(f) && (m.additionalProperties = r(f) ? a(f, o) : f), m;\n}, o = {\n\ttype: \"object\",\n\tproperties: {}\n}, s = (e) => {\n\tlet t = { type: \"unknown\" };\n\tswitch (e.type) {\n\t\tcase \"string\":\n\t\t\tt.type = \"string\";\n\t\t\tbreak;\n\t\tcase \"number\":\n\t\tcase \"integer\":\n\t\t\tt.type = \"number\";\n\t\t\tbreak;\n\t\tcase \"boolean\":\n\t\t\tt.type = \"boolean\";\n\t\t\tbreak;\n\t\tcase \"array\":\n\t\t\tt.type = \"array\", e.items && (t.items = s(e.items));\n\t\t\tbreak;\n\t\tcase \"object\":\n\t\t\tt.type = \"object\", e.properties && (t.properties = Object.fromEntries(Object.entries(e.properties).map(([e, t]) => [e, s(t)])));\n\t\t\tbreak;\n\t\tcase \"record\":\n\t\t\tt.type = \"record\";\n\t\t\tbreak;\n\t\tcase \"records\":\n\t\t\tt.type = \"records\";\n\t\t\tbreak;\n\t\tdefault: t.type = \"unknown\";\n\t}\n\treturn Array.isArray(e.enum) && (t.enum = e.enum.filter((e) => typeof e == \"string\")), e.multiline === !0 && (t.multiline = !0), n(e.label) && (t.label = e.label), n(e.objectUniversalIdentifier) && (t.objectUniversalIdentifier = e.objectUniversalIdentifier), t;\n}, c = (e) => [s(e)], l = { inputSchema: c({\n\ttype: \"object\",\n\tproperties: {\n\t\ta: { type: \"string\" },\n\t\tb: { type: \"number\" }\n\t}\n}) }, u = async (t) => {\n\tlet { getFunctionInputSchema: n } = await import(\"./get-function-input-schema-GNk3NRLJ.mjs\"), r = n(t)[0];\n\treturn r?.type === \"object\" && e(r.properties) ? {\n\t\ttype: \"object\",\n\t\tproperties: r.properties\n\t} : o;\n}, d = (t) => !e(t) || t === null ? \"unknown\" : typeof t == \"string\" ? \"string\" : typeof t == \"number\" ? \"number\" : typeof t == \"boolean\" ? \"boolean\" : Array.isArray(t) ? \"array\" : \"unknown\", f = (e) => e ? Object.entries(e).reduce((e, [t, n]) => (r(n) && !Array.isArray(n) ? e[t] = {\n\tisLeaf: !1,\n\ttype: \"object\",\n\tlabel: t,\n\tvalue: f(n)\n} : e[t] = {\n\tisLeaf: !0,\n\tvalue: n,\n\ttype: d(n),\n\tlabel: t\n}, e), {}) : {}, p = (e, t) => e ? `${e}.${t}` : t, m = (t, n, r = \"\") => {\n\tlet i = [];\n\tfor (let [a, o] of Object.entries(n)) {\n\t\tlet n = p(r, a), s = t[a];\n\t\tif (!e(s)) {\n\t\t\ti.push(`Missing key \"${n}\" in declared output schema.`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (o.isLeaf !== s.isLeaf) {\n\t\t\ti.push(`Type mismatch at \"${n}\": expected ${o.isLeaf ? o.type : \"object\"} but declared ${s.isLeaf ? s.type : \"object\"}.`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!o.isLeaf && !s.isLeaf) {\n\t\t\ti.push(...m(s.value, o.value, n));\n\t\t\tcontinue;\n\t\t}\n\t\to.isLeaf && s.isLeaf && o.type !== \"unknown\" && s.type !== \"unknown\" && o.type !== s.type && i.push(`Type mismatch at \"${n}\": expected ${o.type} but declared ${s.type}.`);\n\t}\n\treturn i;\n}, h = [\n\t\"string\",\n\t\"number\",\n\t\"boolean\",\n\t\"array\",\n\t\"unknown\"\n], g = (e) => h.includes(e), _ = (e, t) => {\n\tlet n = t.label ?? e;\n\treturn t.type === \"record\" ? {\n\t\tisLeaf: !0,\n\t\ttype: \"string\",\n\t\tlabel: n,\n\t\tvalue: null\n\t} : t.type === \"records\" ? {\n\t\tisLeaf: !0,\n\t\ttype: \"array\",\n\t\tlabel: n,\n\t\tvalue: null\n\t} : t.type === \"object\" ? {\n\t\tisLeaf: !1,\n\t\ttype: \"object\",\n\t\tlabel: n,\n\t\tvalue: r(t.properties) ? v(t.properties) : {}\n\t} : {\n\t\tisLeaf: !0,\n\t\ttype: g(t.type) ? t.type : \"unknown\",\n\t\tlabel: n,\n\t\tvalue: null\n\t};\n}, v = (e) => Object.entries(e).reduce((e, [t, n]) => (e[t] = _(t, n), e), {}), y = (e) => {\n\tlet t = e[0];\n\treturn t?.type !== \"object\" || !r(t.properties) ? {} : v(t.properties);\n}, b = (e) => e?.type === \"records\" && n(e.objectUniversalIdentifier) || e?.type === \"array\" && t(e?.items), x = \"RetryableLogicFunctionError\", S = class extends Error {\n\tconstructor(e) {\n\t\tsuper(e), this.name = x;\n\t}\n};\n//#endregion\nexport { o as DEFAULT_TOOL_INPUT_SCHEMA, x as RETRYABLE_LOGIC_FUNCTION_ERROR_NAME, S as RetryableLogicFunctionError, l as SEED_WORKFLOW_ACTION_TRIGGER_SETTINGS, a as buildToolInputJsonSchema, u as getInputSchemaFromSourceCode, f as getOutputSchemaFromValue, m as getOutputSchemaMismatchIssues, y as inputSchemaToOutputSchema, b as isRecordArraySchema, t as isRecordObjectSchema, c as jsonSchemaToInputSchema };\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-runtime/constants/ConnectionScopeByLegacyVisibility.ts\nvar e = {\n\tuser: \"USER\",\n\tworkspace: \"WORKSPACE\"\n}, t = \"TWENTY_API_KEY\", n = \"TWENTY_API_URL\", r = \"TWENTY_APP_ACCESS_TOKEN\", i = \"TWENTY_APP_APPLICATION_ACCESS_TOKEN\", a = \"TWENTY_FUNCTIONS_URL\", o = \"TWENTY_SERVER_ROUTES_URL\", s = {\n\tUSER: \"user\",\n\tWORKSPACE: \"workspace\"\n}, c = [\n\t\"workspace-suspended\",\n\t\"no-subscription\",\n\t\"no-credits\"\n];\n//#endregion\nexport { e as CONNECTION_SCOPE_BY_LEGACY_VISIBILITY, c as CREDIT_UNAVAILABLE_REASONS, t as DEFAULT_API_KEY_NAME, n as DEFAULT_API_URL_NAME, r as DEFAULT_APP_ACCESS_TOKEN_NAME, i as DEFAULT_APP_APPLICATION_ACCESS_TOKEN_NAME, a as DEFAULT_FUNCTIONS_URL_NAME, o as DEFAULT_SERVER_ROUTES_URL_NAME, s as LEGACY_CONNECTION_VISIBILITY_BY_SCOPE };\n","import { LEGACY_CONNECTION_VISIBILITY_BY_SCOPE } from 'twenty-shared/application-runtime';\n\nimport { type AppConnection } from '@/sdk/logic-function/connections/types/app-connection.type';\n\ntype WithoutVisibility<TConnection> = TConnection extends unknown\n ? Omit<TConnection, 'visibility'>\n : never;\n\nexport type AppConnectionWithoutVisibility = WithoutVisibility<AppConnection>;\n\nexport const withLegacyConnectionVisibility = (\n connection: AppConnectionWithoutVisibility,\n): AppConnection => ({\n ...connection,\n visibility: LEGACY_CONNECTION_VISIBILITY_BY_SCOPE[connection.scope],\n});\n","import {\n DEFAULT_APP_ACCESS_TOKEN_NAME,\n DEFAULT_APP_APPLICATION_ACCESS_TOKEN_NAME,\n} from 'twenty-shared/application-runtime';\n\n// These reach the application's own resources, so prefer the application token when the runtime injects one\nexport const getApplicationAccessToken = (): string | undefined =>\n process.env[DEFAULT_APP_APPLICATION_ACCESS_TOKEN_NAME] ??\n process.env[DEFAULT_APP_ACCESS_TOKEN_NAME];\n","import {\n DEFAULT_API_URL_NAME,\n DEFAULT_APP_APPLICATION_ACCESS_TOKEN_NAME,\n} from 'twenty-shared/application-runtime';\n\nimport { getApplicationAccessToken } from '@/sdk/utils/get-application-access-token';\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 = getApplicationAccessToken();\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_APPLICATION_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 {\n type AppConnectionWithoutVisibility,\n withLegacyConnectionVisibility,\n} from '@/sdk/logic-function/connections/utils/with-legacy-connection-visibility.util';\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 externalAccountId\n scope\n userWorkspaceId\n workspaceMemberId\n providerType\n accessToken\n scopes\n authFailedAt\n authFailedReason\n }\n }\n`;\n\nexport const getConnection = async (id: string): Promise<AppConnection> => {\n const { appConnection } = await postGraphqlRequest<\n { id: string },\n { appConnection: AppConnectionWithoutVisibility }\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 withLegacyConnectionVisibility(appConnection);\n};\n","//#region src/ai/constants/agent-chat-assistant-mention-object-name-singular.const.ts\nvar e = \"agentChatAssistant\", t = [\n\t\"extraFast\",\n\t\"fast\",\n\t\"balanced\",\n\t\"smart\",\n\t\"extraSmart\"\n], n = {\n\textraFast: \"default-extra-fast-model\",\n\tfast: \"default-fast-model\",\n\tbalanced: \"default-balanced-model\",\n\tsmart: \"default-smart-model\",\n\textraSmart: \"default-extra-smart-model\"\n}, r = \"workspace-default-model\", i = (e) => /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e), a = ({ objectNameSingular: e, recordId: t, displayName: n }) => e === \"agentChatAssistant\" ? `@${n}` : `[[record:${e}:${t}:${n}]]`, o = ({ skillId: e, label: t }) => `[[skill:${e}:${t}]]`, s = (e) => t.find((t) => n[t] === e);\n//#endregion\nexport { r as a, e as c, i, o as n, n as o, a as r, t as s, s as t };\n","import { isNonEmptyString as e } from \"@sniptt/guards\";\n//#region src/i18n/do-not-translate.ts\nvar t = (e) => e, n = (t) => e(t) ? t.charAt(0).toUpperCase() + t.slice(1) : \"\";\n//#endregion\nexport { t as n, n as t };\n","import { CONNECTION_SCOPE_BY_LEGACY_VISIBILITY } from 'twenty-shared/application-runtime';\nimport { isDefined } from 'twenty-shared/utils';\n\nimport { type AppConnection } from '@/sdk/logic-function/connections/types/app-connection.type';\nimport {\n type AppConnectionWithoutVisibility,\n withLegacyConnectionVisibility,\n} from '@/sdk/logic-function/connections/utils/with-legacy-connection-visibility.util';\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 externalAccountId\n scope\n userWorkspaceId\n workspaceMemberId\n providerType\n accessToken\n scopes\n authFailedAt\n authFailedReason\n }\n }\n`;\n\nexport type ListConnectionsFilter = {\n providerName?: string;\n userWorkspaceId?: string;\n scope?: AppConnection['scope'];\n /** @deprecated Use `scope` instead. */\n visibility?: AppConnection['visibility'];\n};\n\nexport const listConnections = async ({\n visibility,\n ...filter\n}: ListConnectionsFilter = {}): Promise<AppConnection[]> => {\n const { appConnections } = await postGraphqlRequest<\n { filter: Omit<ListConnectionsFilter, 'visibility'> },\n { appConnections: AppConnectionWithoutVisibility[] }\n >({\n query: LIST_APP_CONNECTIONS_QUERY,\n variables: {\n filter: {\n ...filter,\n scope:\n filter.scope ??\n (isDefined(visibility)\n ? CONNECTION_SCOPE_BY_LEGACY_VISIBILITY[visibility]\n : undefined),\n },\n },\n caller: 'listConnections',\n });\n\n return appConnections.map(withLegacyConnectionVisibility);\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.scope === '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.scope === 'WORKSPACE',\n );\n\n return workspaceShared ?? null;\n};\n","import { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst REPORT_APP_CONNECTION_AUTH_FAILURE_MUTATION = `\n mutation ReportAppConnectionAuthFailure($input: ReportAppConnectionAuthFailureInput!) {\n reportAppConnectionAuthFailure(input: $input)\n }\n`;\n\nexport const reportConnectionAuthFailure = async ({\n connectionId,\n reason,\n}: {\n connectionId: string;\n reason?: string;\n}): Promise<void> => {\n await postGraphqlRequest<\n { input: { id: string; reason?: string } },\n { reportAppConnectionAuthFailure: boolean }\n >({\n query: REPORT_APP_CONNECTION_AUTH_FAILURE_MUTATION,\n variables: { input: { id: connectionId, reason } },\n caller: 'reportConnectionAuthFailure',\n });\n};\n","// Shared by every helper, so channels returned by any of them are interchangeable\nexport const APP_MESSAGE_CHANNEL_SELECTION = `\n id\n handle\n displayName\n visibility\n connectedAccountId\n isSyncEnabled\n participantHandleFieldUniversalIdentifier\n messagingProviderUniversalIdentifier\n`;\n","import { type MessageChannelVisibility } from '@/sdk/define/common/types/loose-shared-types.type';\nimport { APP_MESSAGE_CHANNEL_SELECTION } from '@/sdk/logic-function/messaging/message-channel-fields.constant';\nimport { type AppMessageChannel } from '@/sdk/logic-function/messaging/types/app-message-channel.type';\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst CREATE_APP_MESSAGE_CHANNEL_MUTATION = `\n mutation CreateAppMessageChannel($input: CreateAppMessageChannelInput!) {\n createAppMessageChannel(input: $input) {\n ${APP_MESSAGE_CHANNEL_SELECTION}\n }\n }\n`;\n\nexport type CreateMessageChannelInput = {\n // An app connection id (from getConnection/listConnections); the channel speaks through it and inherits who may see it\n connectedAccountId: string;\n // The account's provider identity; inbound participants matching it are treated as the account itself\n handle: string;\n displayName?: string;\n // Required: decides whether one member's conversations are readable by the whole workspace, and only the app\n // knows how private its messages are ('METADATA' for personal inboxes, 'SHARE_EVERYTHING' for shared ones)\n visibility: MessageChannelVisibility;\n // Person field to match participant handles against (handles are then stored in its canonical form); set once\n participantHandleFieldUniversalIdentifier?: string;\n messagingProvider?: { universalIdentifier: string };\n};\n\nexport const createMessageChannel = async ({\n messagingProvider,\n ...input\n}: CreateMessageChannelInput): Promise<AppMessageChannel> => {\n const { createAppMessageChannel } = await postGraphqlRequest<\n {\n input: Omit<CreateMessageChannelInput, 'messagingProvider'> & {\n messagingProviderUniversalIdentifier?: string;\n };\n },\n { createAppMessageChannel: AppMessageChannel }\n >({\n query: CREATE_APP_MESSAGE_CHANNEL_MUTATION,\n variables: {\n input: {\n ...input,\n messagingProviderUniversalIdentifier:\n messagingProvider?.universalIdentifier,\n },\n },\n caller: 'createMessageChannel',\n });\n\n return createAppMessageChannel;\n};\n","import { APP_MESSAGE_CHANNEL_SELECTION } from '@/sdk/logic-function/messaging/message-channel-fields.constant';\nimport { type AppMessageChannel } from '@/sdk/logic-function/messaging/types/app-message-channel.type';\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst LIST_APP_MESSAGE_CHANNELS_QUERY = `\n query ListAppMessageChannels($filter: ListAppMessageChannelsInput) {\n appMessageChannels(filter: $filter) {\n ${APP_MESSAGE_CHANNEL_SELECTION}\n }\n }\n`;\n\nexport type ListMessageChannelsFilter = {\n connectedAccountId?: string;\n};\n\nexport const listMessageChannels = async (\n filter: ListMessageChannelsFilter = {},\n): Promise<AppMessageChannel[]> => {\n const { appMessageChannels } = await postGraphqlRequest<\n { filter: ListMessageChannelsFilter },\n { appMessageChannels: AppMessageChannel[] }\n >({\n query: LIST_APP_MESSAGE_CHANNELS_QUERY,\n variables: { filter },\n caller: 'listMessageChannels',\n });\n\n return appMessageChannels;\n};\n","import { type MessageChannelVisibility } from '@/sdk/define/common/types/loose-shared-types.type';\nimport { APP_MESSAGE_CHANNEL_SELECTION } from '@/sdk/logic-function/messaging/message-channel-fields.constant';\nimport { type AppMessageChannel } from '@/sdk/logic-function/messaging/types/app-message-channel.type';\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst UPDATE_APP_MESSAGE_CHANNEL_MUTATION = `\n mutation UpdateAppMessageChannel($input: UpdateAppMessageChannelInput!) {\n updateAppMessageChannel(input: $input) {\n ${APP_MESSAGE_CHANNEL_SELECTION}\n }\n }\n`;\n\nexport type UpdateMessageChannelInput = {\n id: string;\n // Omitted leaves the current label untouched; null clears it.\n displayName?: string | null;\n // Changes who can read every message already ingested, not just the ones that follow\n visibility?: MessageChannelVisibility;\n // False pauses ingestion (further ingests are rejected) without deleting the history\n isSyncEnabled?: boolean;\n messagingProvider?: { universalIdentifier: string } | null;\n};\n\nexport const updateMessageChannel = async ({\n messagingProvider,\n ...input\n}: UpdateMessageChannelInput): Promise<AppMessageChannel> => {\n const { updateAppMessageChannel } = await postGraphqlRequest<\n {\n input: Omit<UpdateMessageChannelInput, 'messagingProvider'> & {\n messagingProviderUniversalIdentifier?: string | null;\n };\n },\n { updateAppMessageChannel: AppMessageChannel }\n >({\n query: UPDATE_APP_MESSAGE_CHANNEL_MUTATION,\n variables: {\n input: {\n ...input,\n messagingProviderUniversalIdentifier:\n messagingProvider === undefined\n ? undefined\n : (messagingProvider?.universalIdentifier ?? null),\n },\n },\n caller: 'updateMessageChannel',\n });\n\n return updateAppMessageChannel;\n};\n","import { APP_MESSAGE_CHANNEL_SELECTION } from '@/sdk/logic-function/messaging/message-channel-fields.constant';\nimport { type AppMessageChannel } from '@/sdk/logic-function/messaging/types/app-message-channel.type';\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst DELETE_APP_MESSAGE_CHANNEL_MUTATION = `\n mutation DeleteAppMessageChannel($id: UUID!) {\n deleteAppMessageChannel(id: $id) {\n ${APP_MESSAGE_CHANNEL_SELECTION}\n }\n }\n`;\n\n// Also deletes the channel's ingested messages and emptied threads; call from onDisconnect to retire a channel with its credential.\n// To stop ingesting but keep the history, set `isSyncEnabled` to false instead.\nexport const deleteMessageChannel = async (\n id: string,\n): Promise<AppMessageChannel> => {\n const { deleteAppMessageChannel } = await postGraphqlRequest<\n { id: string },\n { deleteAppMessageChannel: AppMessageChannel }\n >({\n query: DELETE_APP_MESSAGE_CHANNEL_MUTATION,\n variables: { id },\n caller: 'deleteMessageChannel',\n });\n\n return deleteAppMessageChannel;\n};\n","import {\n type IngestMessage,\n type IngestedMessage,\n} from '@/sdk/logic-function/messaging/types/ingest-message.type';\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst INGEST_APP_MESSAGES_MUTATION = `\n mutation IngestAppMessages($input: IngestAppMessagesInput!) {\n ingestAppMessages(input: $input) {\n messages {\n externalId\n messageId\n messageThreadId\n }\n }\n }\n`;\n\n// Threading, dedup and privacy are handled server-side. At most 100 messages per call (one transaction\n// within one logic-function timeout), so page provider backfills\nexport const ingestMessages = async ({\n messageChannelId,\n messages,\n}: {\n messageChannelId: string;\n messages: IngestMessage[];\n}): Promise<IngestedMessage[]> => {\n const { ingestAppMessages } = await postGraphqlRequest<\n { input: { messageChannelId: string; messages: IngestMessage[] } },\n { ingestAppMessages: { messages: IngestedMessage[] } }\n >({\n query: INGEST_APP_MESSAGES_MUTATION,\n variables: { input: { messageChannelId, messages } },\n caller: 'ingestMessages',\n });\n\n return ingestAppMessages.messages;\n};\n","export const APP_MESSAGE_FOLDER_SELECTION = `\n id\n externalId\n name\n isSynced\n messageChannelId\n`;\n","import { APP_MESSAGE_FOLDER_SELECTION } from '@/sdk/logic-function/messaging/message-folder-fields.constant';\nimport { type AppMessageFolder } from '@/sdk/logic-function/messaging/types/app-message-folder.type';\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst LIST_APP_MESSAGE_FOLDERS_QUERY = `\n query ListAppMessageFolders($filter: ListAppMessageFoldersInput) {\n appMessageFolders(filter: $filter) {\n ${APP_MESSAGE_FOLDER_SELECTION}\n }\n }\n`;\n\nexport type ListMessageFoldersFilter = {\n messageChannelId?: string;\n};\n\nexport const listMessageFolders = async (\n filter: ListMessageFoldersFilter = {},\n): Promise<AppMessageFolder[]> => {\n const { appMessageFolders } = await postGraphqlRequest<\n { filter: ListMessageFoldersFilter },\n { appMessageFolders: AppMessageFolder[] }\n >({\n query: LIST_APP_MESSAGE_FOLDERS_QUERY,\n variables: { filter },\n caller: 'listMessageFolders',\n });\n\n return appMessageFolders;\n};\n","import { APP_MESSAGE_FOLDER_SELECTION } from '@/sdk/logic-function/messaging/message-folder-fields.constant';\nimport { type AppMessageFolder } from '@/sdk/logic-function/messaging/types/app-message-folder.type';\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst SYNC_APP_MESSAGE_FOLDERS_MUTATION = `\n mutation SyncAppMessageFolders($input: SyncAppMessageFoldersInput!) {\n syncAppMessageFolders(input: $input) {\n ${APP_MESSAGE_FOLDER_SELECTION}\n }\n }\n`;\n\nexport type SyncMessageFoldersInput = {\n messageChannelId: string;\n folders: {\n externalId: string;\n name: string;\n isSynced?: boolean;\n }[];\n};\n\nexport const syncMessageFolders = async (\n input: SyncMessageFoldersInput,\n): Promise<AppMessageFolder[]> => {\n const { syncAppMessageFolders } = await postGraphqlRequest<\n { input: SyncMessageFoldersInput },\n { syncAppMessageFolders: AppMessageFolder[] }\n >({\n query: SYNC_APP_MESSAGE_FOLDERS_MUTATION,\n variables: { input },\n caller: 'syncMessageFolders',\n });\n\n return syncAppMessageFolders;\n};\n","import {\n type RunAgentInput,\n type RunAgentResult,\n} from 'twenty-shared/application';\nimport { isDefined } from 'twenty-shared/utils';\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 threadId\n status\n result\n error\n success\n }\n }\n`;\n\nexport const runAgent = async ({\n input,\n ...rest\n}: RunAgentInput): Promise<RunAgentResult> => {\n const variables = {\n input: isDefined(input)\n ? {\n ...rest,\n input:\n typeof input === 'string'\n ? [{ role: 'user', content: input }]\n : input,\n }\n : rest,\n };\n\n const { runAgent: result } = await postGraphqlRequest<\n typeof variables,\n { runAgent: RunAgentResult }\n >({\n query: RUN_AGENT_MUTATION,\n variables,\n caller: 'runAgent',\n });\n\n return result;\n};\n","import { MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport { type SendInboxMessageResult } from 'twenty-shared/application';\n\nimport { type SendInboxMessageInput } from '@/sdk/define/common/types/loose-shared-types.type';\n\nexport const sendInboxMessage = async (\n input: SendInboxMessageInput,\n): Promise<SendInboxMessageResult> => {\n const client = new MetadataApiClient();\n\n const { sendInboxMessage: result } = await client.mutation({\n sendInboxMessage: {\n __args: { input },\n threadId: true,\n },\n });\n\n return result;\n};\n","const OPENING_BRACKET_PATTERN = /\\[/g;\nconst CLOSING_BRACKET_PATTERN = /\\]/g;\nconst LINE_BREAK_PATTERN = /\\r?\\n/g;\n\nexport const sanitizeInboxReferenceLabel = (label: string): string =>\n label\n .replace(OPENING_BRACKET_PATTERN, '(')\n .replace(CLOSING_BRACKET_PATTERN, ')')\n .replace(LINE_BREAK_PATTERN, ' ')\n .trim();\n","import { isNonEmptyString } from '@sniptt/guards';\nimport { RestApiClient } from 'twenty-client-sdk/rest';\nimport { formatRecordReference } from 'twenty-shared/ai';\n\nimport { sanitizeInboxReferenceLabel } from '@/sdk/inbox/mentions/utils/sanitize-inbox-reference-label.util';\n\ntype WorkspaceMemberResponse = {\n data: {\n workspaceMember: {\n name: { firstName: string | null; lastName: string | null };\n userEmail: string;\n };\n };\n};\n\nexport const inboxMention = async ({\n workspaceMemberId,\n}: {\n workspaceMemberId: string;\n}): Promise<string> => {\n const {\n data: { workspaceMember },\n } = await new RestApiClient().get<WorkspaceMemberResponse>(\n `/rest/workspaceMembers/${workspaceMemberId}`,\n );\n\n const fullName =\n `${workspaceMember.name.firstName ?? ''} ${workspaceMember.name.lastName ?? ''}`.trim();\n\n return formatRecordReference({\n objectNameSingular: 'workspaceMember',\n recordId: workspaceMemberId,\n displayName: sanitizeInboxReferenceLabel(\n isNonEmptyString(fullName) ? fullName : workspaceMember.userEmail,\n ),\n });\n};\n","import { isObject, isString } from '@sniptt/guards';\nimport { isDefined } from 'twenty-shared/utils';\n\nimport { type InboxLabelIdentifierField } from '@/sdk/inbox/mentions/types/inbox-label-identifier-field.type';\n\nconst getFullNamePart = ({\n fullName,\n partName,\n}: {\n fullName: unknown;\n partName: 'firstName' | 'lastName';\n}): string => {\n const part = isObject(fullName) ? Reflect.get(fullName, partName) : undefined;\n\n return isString(part) ? part : '';\n};\n\nexport const computeInboxRecordLabel = ({\n record,\n recordId,\n labelIdentifierField,\n}: {\n record: Record<string, unknown>;\n recordId: string;\n labelIdentifierField: InboxLabelIdentifierField | undefined;\n}): string => {\n if (!isDefined(labelIdentifierField)) {\n return recordId;\n }\n\n const labelValue = record[labelIdentifierField.name];\n\n if (labelIdentifierField.type === 'FULL_NAME') {\n return `${getFullNamePart({ fullName: labelValue, partName: 'firstName' })} ${getFullNamePart({ fullName: labelValue, partName: 'lastName' })}`.trim();\n }\n\n return isDefined(labelValue) ? String(labelValue) : '';\n};\n","import { type MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport { isDefined } from 'twenty-shared/utils';\n\nimport { type InboxLabelIdentifierField } from '@/sdk/inbox/mentions/types/inbox-label-identifier-field.type';\nimport { type InboxObjectMetadata } from '@/sdk/inbox/mentions/types/inbox-object-metadata.type';\n\nexport const findInboxLabelIdentifierField = async ({\n metadataClient,\n objectMetadata,\n}: {\n metadataClient: MetadataApiClient;\n objectMetadata: Pick<\n InboxObjectMetadata,\n 'id' | 'labelIdentifierFieldMetadataId'\n >;\n}): Promise<InboxLabelIdentifierField | undefined> => {\n if (!isDefined(objectMetadata.labelIdentifierFieldMetadataId)) {\n return undefined;\n }\n\n const { object } = await metadataClient.query({\n object: {\n __args: { id: objectMetadata.id },\n fields: {\n __args: {\n filter: { id: { eq: objectMetadata.labelIdentifierFieldMetadataId } },\n paging: { first: 1 },\n },\n edges: { node: { name: true, type: true } },\n },\n },\n });\n\n return object.fields.edges[0]?.node;\n};\n","import { type MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport { isDefined } from 'twenty-shared/utils';\n\nimport { type InboxObjectMetadata } from '@/sdk/inbox/mentions/types/inbox-object-metadata.type';\n\nconst OBJECTS_PAGE_SIZE = 1000;\n\nexport const findInboxObjectMetadataOrThrow = async ({\n metadataClient,\n objectNameSingular,\n}: {\n metadataClient: MetadataApiClient;\n objectNameSingular: string;\n}): Promise<InboxObjectMetadata> => {\n const { objects } = await metadataClient.query({\n objects: {\n __args: { filter: {}, paging: { first: OBJECTS_PAGE_SIZE } },\n edges: {\n node: {\n id: true,\n nameSingular: true,\n namePlural: true,\n labelIdentifierFieldMetadataId: true,\n },\n },\n },\n });\n\n const objectMetadata = objects.edges.find(\n ({ node }) => node.nameSingular === objectNameSingular,\n )?.node;\n\n if (!isDefined(objectMetadata)) {\n throw new Error(`This workspace has no ${objectNameSingular} object.`);\n }\n\n return objectMetadata;\n};\n","import { MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport { RestApiClient } from 'twenty-client-sdk/rest';\nimport { formatRecordReference } from 'twenty-shared/ai';\n\nimport { computeInboxRecordLabel } from '@/sdk/inbox/mentions/utils/compute-inbox-record-label.util';\nimport { findInboxLabelIdentifierField } from '@/sdk/inbox/mentions/utils/find-inbox-label-identifier-field.util';\nimport { findInboxObjectMetadataOrThrow } from '@/sdk/inbox/mentions/utils/find-inbox-object-metadata-or-throw.util';\nimport { sanitizeInboxReferenceLabel } from '@/sdk/inbox/mentions/utils/sanitize-inbox-reference-label.util';\n\nexport const inboxReferenceRecord = async ({\n objectNameSingular,\n recordId,\n}: {\n objectNameSingular: string;\n recordId: string;\n}): Promise<string> => {\n const metadataClient = new MetadataApiClient();\n const objectMetadata = await findInboxObjectMetadataOrThrow({\n metadataClient,\n objectNameSingular,\n });\n\n const [labelIdentifierField, recordResponse] = await Promise.all([\n findInboxLabelIdentifierField({ metadataClient, objectMetadata }),\n new RestApiClient().get<{\n data: Record<string, Record<string, unknown>>;\n }>(`/rest/${objectMetadata.namePlural}/${recordId}`),\n ]);\n\n return formatRecordReference({\n objectNameSingular,\n recordId,\n displayName: sanitizeInboxReferenceLabel(\n computeInboxRecordLabel({\n record: recordResponse.data[objectNameSingular],\n recordId,\n labelIdentifierField,\n }),\n ),\n });\n};\n","import {\n AGENT_CHAT_ASSISTANT_MENTION_OBJECT_NAME_SINGULAR,\n AGENT_CHAT_ASSISTANT_NAME,\n formatRecordReference,\n} from 'twenty-shared/ai';\n\nexport const INBOX_ASSISTANT_MENTION = formatRecordReference({\n objectNameSingular: AGENT_CHAT_ASSISTANT_MENTION_OBJECT_NAME_SINGULAR,\n recordId: AGENT_CHAT_ASSISTANT_MENTION_OBJECT_NAME_SINGULAR,\n displayName: AGENT_CHAT_ASSISTANT_NAME,\n});\n","import { MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport { type InboxThreadRecordInput } from 'twenty-shared/application';\n\nexport const attachRecordToInboxThread = async (\n input: InboxThreadRecordInput,\n): Promise<void> => {\n const client = new MetadataApiClient();\n\n await client.mutation({\n attachRecordToInboxThread: { __args: { input } },\n });\n};\n","import { MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport { type InboxThreadRecordInput } from 'twenty-shared/application';\n\nexport const detachRecordFromInboxThread = async (\n input: InboxThreadRecordInput,\n): Promise<void> => {\n const client = new MetadataApiClient();\n\n await client.mutation({\n detachRecordFromInboxThread: { __args: { input } },\n });\n};\n","import { MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport {\n type EnqueueJobInput,\n type EnqueueJobResult,\n} from 'twenty-shared/application';\n\n/**\n * @deprecated Use `enqueueJobs` instead.\n */\nexport const enqueueJob = async (\n input: EnqueueJobInput,\n): Promise<EnqueueJobResult> => {\n const client = new MetadataApiClient();\n\n const { enqueueJob: result } = await client.mutation({\n enqueueJob: {\n __args: { input },\n enqueued: true,\n logicFunctionUniversalIdentifier: true,\n jobId: true,\n },\n });\n\n return result;\n};\n","import { MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport {\n type EnqueueJobsInput,\n type EnqueueJobsResult,\n} from 'twenty-shared/application';\n\nexport const enqueueJobs = async (\n input: EnqueueJobsInput,\n): Promise<EnqueueJobsResult> => {\n const client = new MetadataApiClient();\n\n const { enqueueJobs: result } = await client.mutation({\n enqueueJobs: {\n __args: { input },\n enqueued: true,\n logicFunctionUniversalIdentifier: true,\n enqueuedJobsCount: true,\n jobIds: true,\n },\n });\n\n return result;\n};\n","import { MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport { type JobStatusResult } from 'twenty-shared/application';\n\nexport const getJobs = async (jobIds: string[]): Promise<JobStatusResult[]> => {\n const client = new MetadataApiClient();\n\n const { getJobs: result } = await client.query({\n getJobs: {\n __args: { jobIds },\n jobId: true,\n state: true,\n attemptsMade: true,\n failedReason: true,\n enqueuedAt: true,\n startedAt: true,\n finishedAt: true,\n },\n });\n\n return result;\n};\n","import { MetadataApiClient } from 'twenty-client-sdk/metadata';\nimport { RestApiClient } from 'twenty-client-sdk/rest';\nimport { capitalize, isDefined } from 'twenty-shared/utils';\nimport { type TimelineActivityTypeSnapshot } from 'twenty-shared/timeline';\n\ntype CreateTimelineActivityBaseInput = {\n timelineActivityTypeUniversalIdentifier: string;\n targetObjectUniversalIdentifier: string;\n targetRecordId: string;\n happensAt?: string;\n properties?: Record<string, unknown>;\n};\n\ntype CreateTimelineActivityLinkedRecordInput =\n | {\n linkedRecordId: string;\n linkedObjectMetadataUniversalIdentifier: string;\n }\n | {\n linkedRecordId?: never;\n linkedObjectMetadataUniversalIdentifier?: never;\n };\n\nexport type CreateTimelineActivityInput = CreateTimelineActivityBaseInput &\n CreateTimelineActivityLinkedRecordInput;\n\nexport type CreatedTimelineActivity = {\n id: string;\n timelineActivityTypeId: string;\n timelineActivityTypeSnapshot: TimelineActivityTypeSnapshot;\n};\n\nconst getObjectMetadataSelection = (universalIdentifiers: string[]) => ({\n __args: {\n paging: {\n first: universalIdentifiers.length,\n },\n filter: {\n universalIdentifier: {\n in: universalIdentifiers,\n },\n },\n },\n edges: {\n node: {\n id: true,\n universalIdentifier: true,\n nameSingular: true,\n },\n },\n});\n\n// Apps address manifest entities by universal identifier; the row stores the installation-specific metadata id\nexport const createTimelineActivity = async ({\n timelineActivityTypeUniversalIdentifier,\n targetObjectUniversalIdentifier,\n linkedObjectMetadataUniversalIdentifier,\n targetRecordId,\n ...input\n}: CreateTimelineActivityInput): Promise<CreatedTimelineActivity> => {\n const requiredObjectUniversalIdentifiers = [\n ...new Set(\n [\n targetObjectUniversalIdentifier,\n linkedObjectMetadataUniversalIdentifier,\n ].filter(isDefined),\n ),\n ];\n const metadataClient = new MetadataApiClient();\n const { timelineActivityTypes, objects } = await metadataClient.query({\n timelineActivityTypes: {\n id: true,\n universalIdentifier: true,\n isActive: true,\n },\n objects: getObjectMetadataSelection(requiredObjectUniversalIdentifiers),\n });\n\n const timelineActivityType = timelineActivityTypes.find(\n ({ universalIdentifier }) =>\n universalIdentifier === timelineActivityTypeUniversalIdentifier,\n );\n\n if (!isDefined(timelineActivityType)) {\n throw new Error(\n `Timeline activity type ${timelineActivityTypeUniversalIdentifier} is not installed`,\n );\n }\n\n if (!timelineActivityType.isActive) {\n throw new Error(\n `Timeline activity type ${timelineActivityTypeUniversalIdentifier} is inactive`,\n );\n }\n\n const objectMetadataByUniversalIdentifier = new Map(\n objects.edges.map(({ node }) => [node.universalIdentifier, node]),\n );\n\n const targetObject = objectMetadataByUniversalIdentifier.get(\n targetObjectUniversalIdentifier,\n );\n\n if (!isDefined(targetObject)) {\n throw new Error(\n `Timeline activity target object ${targetObjectUniversalIdentifier} is not installed`,\n );\n }\n\n const targetFieldName = `target${capitalize(targetObject.nameSingular)}Id`;\n const linkedObject = isDefined(linkedObjectMetadataUniversalIdentifier)\n ? objectMetadataByUniversalIdentifier.get(\n linkedObjectMetadataUniversalIdentifier,\n )\n : undefined;\n\n if (\n isDefined(linkedObjectMetadataUniversalIdentifier) &&\n !isDefined(linkedObject)\n ) {\n throw new Error(\n `Timeline activity linked object ${linkedObjectMetadataUniversalIdentifier} is not installed`,\n );\n }\n\n const response = await new RestApiClient().post<{\n data: { createTimelineActivity: CreatedTimelineActivity };\n }>('/rest/timelineActivities', {\n ...input,\n timelineActivityTypeId: timelineActivityType.id,\n linkedObjectMetadataId: linkedObject?.id,\n [targetFieldName]: targetRecordId,\n });\n\n return response.data.createTimelineActivity;\n};\n","import {\n type AppKeyValue,\n type AppKeyValueScope,\n} from 'twenty-shared/application';\n\nimport { postGraphqlRequest } from '@/sdk/logic-function/utils/post-graphql-request.util';\n\nconst GET_APP_KEY_VALUE_QUERY = `\n query GetAppKeyValue($key: String!, $scope: AppKeyValueScope) {\n appKeyValue(key: $key, scope: $scope) {\n key\n value\n scope\n }\n }\n`;\n\nconst SET_APP_KEY_VALUE_MUTATION = `\n mutation SetAppKeyValue($input: SetAppKeyValueInput!) {\n setAppKeyValue(input: $input) {\n key\n value\n scope\n }\n }\n`;\n\nconst DELETE_APP_KEY_VALUE_MUTATION = `\n mutation DeleteAppKeyValue($key: String!, $scope: AppKeyValueScope) {\n deleteAppKeyValue(key: $key, scope: $scope)\n }\n`;\n\nconst DEFAULT_APP_KEY_VALUE_SCOPE: AppKeyValueScope = 'WORKSPACE';\n\ntype KvOptions = {\n scope?: AppKeyValueScope;\n};\n\nexport const kv = {\n async get<TValue = unknown>(\n key: string,\n options?: KvOptions,\n ): Promise<TValue | null> {\n const { appKeyValue } = await postGraphqlRequest<\n { key: string; scope: AppKeyValueScope },\n { appKeyValue: AppKeyValue | null }\n >({\n query: GET_APP_KEY_VALUE_QUERY,\n variables: { key, scope: options?.scope ?? DEFAULT_APP_KEY_VALUE_SCOPE },\n caller: 'kv.get',\n });\n\n return (appKeyValue?.value ?? null) as TValue | null;\n },\n\n async set<TValue>(\n key: string,\n value: TValue,\n options?: KvOptions,\n ): Promise<void> {\n await postGraphqlRequest<\n {\n input: { key: string; value: TValue; scope: AppKeyValueScope };\n },\n { setAppKeyValue: AppKeyValue }\n >({\n query: SET_APP_KEY_VALUE_MUTATION,\n variables: {\n input: {\n key,\n value,\n scope: options?.scope ?? DEFAULT_APP_KEY_VALUE_SCOPE,\n },\n },\n caller: 'kv.set',\n });\n },\n\n async delete(key: string, options?: KvOptions): Promise<boolean> {\n const { deleteAppKeyValue } = await postGraphqlRequest<\n { key: string; scope: AppKeyValueScope },\n { deleteAppKeyValue: boolean }\n >({\n query: DELETE_APP_KEY_VALUE_MUTATION,\n variables: { key, scope: options?.scope ?? DEFAULT_APP_KEY_VALUE_SCOPE },\n caller: 'kv.delete',\n });\n\n return deleteAppKeyValue;\n },\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"],"mappings":"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"}
|
package/dist/utils/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@sniptt/guards");var t=`TWENTY_API_URL`,n=()=>process.env.TWENTY_APP_APPLICATION_ACCESS_TOKEN??process.env.TWENTY_APP_ACCESS_TOKEN,
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@sniptt/guards");var t=`TWENTY_API_URL`,n=`TWENTY_SERVER_ROUTES_URL`,r=()=>process.env.TWENTY_APP_APPLICATION_ACCESS_TOKEN??process.env.TWENTY_APP_ACCESS_TOKEN,i=e=>{let t=JSON.parse(atob(e.split(`.`)[1]));return{workspaceId:t.workspaceId,applicationId:t.applicationId}},a=e=>{let n=process.env[t],a=r();if(!n||!a)throw Error(`getPublicAssetUrl can only be called from within a logic function or front component`);let{workspaceId:o,applicationId:s}=i(a),c=e.startsWith(`/`)?e.slice(1):e;return`${n}/public-assets/${o}/${s}/${(c.startsWith(`public/`)?c:`public/${c}`).split(`/`).map(encodeURIComponent).join(`/`)}`},o=t=>{let r=process.env[n];if(!(0,e.isNonEmptyString)(r))throw Error(`getServerRouteUrl can only be called from within a logic function of an application`);return`${r}/${t}`},s=t=>!(0,e.isUndefined)(t)&&!(0,e.isNull)(t);exports.getPublicAssetUrl=a,exports.getServerRouteUrl=o,exports.isDefined=s;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/utils/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["n"],"sources":["../../../twenty-shared/dist/application-runtime.mjs","../../src/sdk/utils/get-application-access-token.ts","../../src/sdk/utils/get-public-asset-url.ts","../../../twenty-shared/dist/isDefined-Dtu5EYqP.mjs"],"sourcesContent":["//#region src/application-runtime/constants/ConnectionScopeByLegacyVisibility.ts\nvar e = {\n\tuser: \"USER\",\n\tworkspace: \"WORKSPACE\"\n}, t = \"TWENTY_API_KEY\", n = \"TWENTY_API_URL\", r = \"TWENTY_APP_ACCESS_TOKEN\", i = \"TWENTY_APP_APPLICATION_ACCESS_TOKEN\", a = \"TWENTY_FUNCTIONS_URL\", o = {\n\tUSER: \"user\",\n\tWORKSPACE: \"workspace\"\n},
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["n"],"sources":["../../../twenty-shared/dist/application-runtime.mjs","../../src/sdk/utils/get-application-access-token.ts","../../src/sdk/utils/get-public-asset-url.ts","../../src/sdk/utils/get-server-route-url.ts","../../../twenty-shared/dist/isDefined-Dtu5EYqP.mjs"],"sourcesContent":["//#region src/application-runtime/constants/ConnectionScopeByLegacyVisibility.ts\nvar e = {\n\tuser: \"USER\",\n\tworkspace: \"WORKSPACE\"\n}, t = \"TWENTY_API_KEY\", n = \"TWENTY_API_URL\", r = \"TWENTY_APP_ACCESS_TOKEN\", i = \"TWENTY_APP_APPLICATION_ACCESS_TOKEN\", a = \"TWENTY_FUNCTIONS_URL\", o = \"TWENTY_SERVER_ROUTES_URL\", s = {\n\tUSER: \"user\",\n\tWORKSPACE: \"workspace\"\n}, c = [\n\t\"workspace-suspended\",\n\t\"no-subscription\",\n\t\"no-credits\"\n];\n//#endregion\nexport { e as CONNECTION_SCOPE_BY_LEGACY_VISIBILITY, c as CREDIT_UNAVAILABLE_REASONS, t as DEFAULT_API_KEY_NAME, n as DEFAULT_API_URL_NAME, r as DEFAULT_APP_ACCESS_TOKEN_NAME, i as DEFAULT_APP_APPLICATION_ACCESS_TOKEN_NAME, a as DEFAULT_FUNCTIONS_URL_NAME, o as DEFAULT_SERVER_ROUTES_URL_NAME, s as LEGACY_CONNECTION_VISIBILITY_BY_SCOPE };\n","import {\n DEFAULT_APP_ACCESS_TOKEN_NAME,\n DEFAULT_APP_APPLICATION_ACCESS_TOKEN_NAME,\n} from 'twenty-shared/application-runtime';\n\n// These reach the application's own resources, so prefer the application token when the runtime injects one\nexport const getApplicationAccessToken = (): string | undefined =>\n process.env[DEFAULT_APP_APPLICATION_ACCESS_TOKEN_NAME] ??\n process.env[DEFAULT_APP_ACCESS_TOKEN_NAME];\n","import { DEFAULT_API_URL_NAME } from 'twenty-shared/application-runtime';\n\nimport { getApplicationAccessToken } from '@/sdk/utils/get-application-access-token';\n\nconst decodeTokenPayload = (\n token: string,\n): { workspaceId: string; applicationId: string } => {\n const payload = JSON.parse(atob(token.split('.')[1]));\n\n return {\n workspaceId: payload.workspaceId,\n applicationId: payload.applicationId,\n };\n};\n\n// Path is relative to the app's public/ folder (e.g. \"images/logo.png\")\nexport const getPublicAssetUrl = (path: string): string => {\n const apiUrl = process.env[DEFAULT_API_URL_NAME];\n const token = getApplicationAccessToken();\n\n if (!apiUrl || !token) {\n throw new Error(\n 'getPublicAssetUrl can only be called from within a logic function or front component',\n );\n }\n\n const { workspaceId, applicationId } = decodeTokenPayload(token);\n const withoutLeadingSlash = path.startsWith('/') ? path.slice(1) : path;\n const withPublicPrefix = withoutLeadingSlash.startsWith('public/')\n ? withoutLeadingSlash\n : `public/${withoutLeadingSlash}`;\n\n const encodedPath = withPublicPrefix\n .split('/')\n .map(encodeURIComponent)\n .join('/');\n\n return `${apiUrl}/public-assets/${workspaceId}/${applicationId}/${encodedPath}`;\n};\n","import { isNonEmptyString } from '@sniptt/guards';\nimport { DEFAULT_SERVER_ROUTES_URL_NAME } from 'twenty-shared/application-runtime';\n\nexport const getServerRouteUrl = (\n logicFunctionUniversalIdentifier: string,\n): string => {\n const serverRoutesUrl = process.env[DEFAULT_SERVER_ROUTES_URL_NAME];\n\n if (!isNonEmptyString(serverRoutesUrl)) {\n throw new Error(\n 'getServerRouteUrl can only be called from within a logic function of an application',\n );\n }\n\n return `${serverRoutesUrl}/${logicFunctionUniversalIdentifier}`;\n};\n","import { isNull as e, isUndefined as t } from \"@sniptt/guards\";\n//#region src/utils/validation/isDefined.ts\nvar n = (n) => !t(n) && !e(n);\n//#endregion\nexport { n as t };\n"],"mappings":"uGAIyBA,EAAI,iBAAwH,EAAI,2BCE5I,MACX,QAAQ,IAAA,qCACR,QAAQ,IAAA,wBCJJ,EACJ,GACmD,CACnD,IAAM,EAAU,KAAK,MAAM,KAAK,EAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAEpD,MAAO,CACL,YAAa,EAAQ,YACrB,cAAe,EAAQ,aACzB,CACF,EAGa,EAAqB,GAAyB,CACzD,IAAM,EAAS,QAAQ,IAAI,GACrB,EAAQ,EAA0B,EAExC,GAAI,CAAC,GAAU,CAAC,EACd,MAAU,MACR,sFACF,EAGF,GAAM,CAAE,cAAa,iBAAkB,EAAmB,CAAK,EACzD,EAAsB,EAAK,WAAW,GAAG,EAAI,EAAK,MAAM,CAAC,EAAI,EAUnE,MAAO,GAAG,EAAO,iBAAiB,EAAY,GAAG,EAAc,IATtC,EAAoB,WAAW,SAAS,EAC7D,EACA,UAAU,IAAA,CAGX,MAAM,GAAG,CAAC,CACV,IAAI,kBAAkB,CAAC,CACvB,KAAK,GAE0D,GACpE,ECnCa,EACX,GACW,CACX,IAAM,EAAkB,QAAQ,IAAI,GAEpC,GAAI,EAAA,EAAA,EAAA,iBAAA,CAAkB,CAAe,EACnC,MAAU,MACR,qFACF,EAGF,MAAO,GAAG,EAAgB,GAAG,GAC/B,ECbI,EAAK,GAAM,EAAA,EAAA,EAAA,YAAA,CAAG,CAAC,GAAK,EAAA,EAAA,EAAA,OAAA,CAAG,CAAC"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
declare const getPublicAssetUrl: (path: string) => string;
|
|
2
2
|
|
|
3
|
+
declare const getServerRouteUrl: (logicFunctionUniversalIdentifier: string) => string;
|
|
4
|
+
|
|
3
5
|
declare const isDefined: <T>(value: T | null | undefined) => value is NonNullable<T>;
|
|
4
6
|
|
|
5
|
-
export { getPublicAssetUrl, isDefined };
|
|
7
|
+
export { getPublicAssetUrl, getServerRouteUrl, isDefined };
|
package/dist/utils/index.mjs
CHANGED
|
@@ -1,18 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isNonEmptyString as e, isNull as t, isUndefined as n } from "@sniptt/guards";
|
|
2
2
|
//#region ../twenty-shared/dist/application-runtime.mjs
|
|
3
|
-
var
|
|
3
|
+
var r = "TWENTY_API_URL", i = "TWENTY_SERVER_ROUTES_URL", a = () => process.env.TWENTY_APP_APPLICATION_ACCESS_TOKEN ?? process.env.TWENTY_APP_ACCESS_TOKEN, o = (e) => {
|
|
4
4
|
let t = JSON.parse(atob(e.split(".")[1]));
|
|
5
5
|
return {
|
|
6
6
|
workspaceId: t.workspaceId,
|
|
7
7
|
applicationId: t.applicationId
|
|
8
8
|
};
|
|
9
|
-
},
|
|
10
|
-
let t = process.env[
|
|
11
|
-
if (!t || !
|
|
12
|
-
let { workspaceId:
|
|
13
|
-
return `${t}/public-assets/${
|
|
14
|
-
},
|
|
9
|
+
}, s = (e) => {
|
|
10
|
+
let t = process.env[r], n = a();
|
|
11
|
+
if (!t || !n) throw Error("getPublicAssetUrl can only be called from within a logic function or front component");
|
|
12
|
+
let { workspaceId: i, applicationId: s } = o(n), c = e.startsWith("/") ? e.slice(1) : e;
|
|
13
|
+
return `${t}/public-assets/${i}/${s}/${(c.startsWith("public/") ? c : `public/${c}`).split("/").map(encodeURIComponent).join("/")}`;
|
|
14
|
+
}, c = (t) => {
|
|
15
|
+
let n = process.env[i];
|
|
16
|
+
if (!e(n)) throw Error("getServerRouteUrl can only be called from within a logic function of an application");
|
|
17
|
+
return `${n}/${t}`;
|
|
18
|
+
}, l = (e) => !n(e) && !t(e);
|
|
15
19
|
//#endregion
|
|
16
|
-
export {
|
|
20
|
+
export { s as getPublicAssetUrl, c as getServerRouteUrl, l as isDefined };
|
|
17
21
|
|
|
18
22
|
//# sourceMappingURL=index.mjs.map
|
package/dist/utils/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["n","t","e"],"sources":["../../../twenty-shared/dist/application-runtime.mjs","../../src/sdk/utils/get-application-access-token.ts","../../src/sdk/utils/get-public-asset-url.ts","../../../twenty-shared/dist/isDefined-Dtu5EYqP.mjs"],"sourcesContent":["//#region src/application-runtime/constants/ConnectionScopeByLegacyVisibility.ts\nvar e = {\n\tuser: \"USER\",\n\tworkspace: \"WORKSPACE\"\n}, t = \"TWENTY_API_KEY\", n = \"TWENTY_API_URL\", r = \"TWENTY_APP_ACCESS_TOKEN\", i = \"TWENTY_APP_APPLICATION_ACCESS_TOKEN\", a = \"TWENTY_FUNCTIONS_URL\", o = {\n\tUSER: \"user\",\n\tWORKSPACE: \"workspace\"\n},
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["n","t","e"],"sources":["../../../twenty-shared/dist/application-runtime.mjs","../../src/sdk/utils/get-application-access-token.ts","../../src/sdk/utils/get-public-asset-url.ts","../../src/sdk/utils/get-server-route-url.ts","../../../twenty-shared/dist/isDefined-Dtu5EYqP.mjs"],"sourcesContent":["//#region src/application-runtime/constants/ConnectionScopeByLegacyVisibility.ts\nvar e = {\n\tuser: \"USER\",\n\tworkspace: \"WORKSPACE\"\n}, t = \"TWENTY_API_KEY\", n = \"TWENTY_API_URL\", r = \"TWENTY_APP_ACCESS_TOKEN\", i = \"TWENTY_APP_APPLICATION_ACCESS_TOKEN\", a = \"TWENTY_FUNCTIONS_URL\", o = \"TWENTY_SERVER_ROUTES_URL\", s = {\n\tUSER: \"user\",\n\tWORKSPACE: \"workspace\"\n}, c = [\n\t\"workspace-suspended\",\n\t\"no-subscription\",\n\t\"no-credits\"\n];\n//#endregion\nexport { e as CONNECTION_SCOPE_BY_LEGACY_VISIBILITY, c as CREDIT_UNAVAILABLE_REASONS, t as DEFAULT_API_KEY_NAME, n as DEFAULT_API_URL_NAME, r as DEFAULT_APP_ACCESS_TOKEN_NAME, i as DEFAULT_APP_APPLICATION_ACCESS_TOKEN_NAME, a as DEFAULT_FUNCTIONS_URL_NAME, o as DEFAULT_SERVER_ROUTES_URL_NAME, s as LEGACY_CONNECTION_VISIBILITY_BY_SCOPE };\n","import {\n DEFAULT_APP_ACCESS_TOKEN_NAME,\n DEFAULT_APP_APPLICATION_ACCESS_TOKEN_NAME,\n} from 'twenty-shared/application-runtime';\n\n// These reach the application's own resources, so prefer the application token when the runtime injects one\nexport const getApplicationAccessToken = (): string | undefined =>\n process.env[DEFAULT_APP_APPLICATION_ACCESS_TOKEN_NAME] ??\n process.env[DEFAULT_APP_ACCESS_TOKEN_NAME];\n","import { DEFAULT_API_URL_NAME } from 'twenty-shared/application-runtime';\n\nimport { getApplicationAccessToken } from '@/sdk/utils/get-application-access-token';\n\nconst decodeTokenPayload = (\n token: string,\n): { workspaceId: string; applicationId: string } => {\n const payload = JSON.parse(atob(token.split('.')[1]));\n\n return {\n workspaceId: payload.workspaceId,\n applicationId: payload.applicationId,\n };\n};\n\n// Path is relative to the app's public/ folder (e.g. \"images/logo.png\")\nexport const getPublicAssetUrl = (path: string): string => {\n const apiUrl = process.env[DEFAULT_API_URL_NAME];\n const token = getApplicationAccessToken();\n\n if (!apiUrl || !token) {\n throw new Error(\n 'getPublicAssetUrl can only be called from within a logic function or front component',\n );\n }\n\n const { workspaceId, applicationId } = decodeTokenPayload(token);\n const withoutLeadingSlash = path.startsWith('/') ? path.slice(1) : path;\n const withPublicPrefix = withoutLeadingSlash.startsWith('public/')\n ? withoutLeadingSlash\n : `public/${withoutLeadingSlash}`;\n\n const encodedPath = withPublicPrefix\n .split('/')\n .map(encodeURIComponent)\n .join('/');\n\n return `${apiUrl}/public-assets/${workspaceId}/${applicationId}/${encodedPath}`;\n};\n","import { isNonEmptyString } from '@sniptt/guards';\nimport { DEFAULT_SERVER_ROUTES_URL_NAME } from 'twenty-shared/application-runtime';\n\nexport const getServerRouteUrl = (\n logicFunctionUniversalIdentifier: string,\n): string => {\n const serverRoutesUrl = process.env[DEFAULT_SERVER_ROUTES_URL_NAME];\n\n if (!isNonEmptyString(serverRoutesUrl)) {\n throw new Error(\n 'getServerRouteUrl can only be called from within a logic function of an application',\n );\n }\n\n return `${serverRoutesUrl}/${logicFunctionUniversalIdentifier}`;\n};\n","import { isNull as e, isUndefined as t } from \"@sniptt/guards\";\n//#region src/utils/validation/isDefined.ts\nvar n = (n) => !t(n) && !e(n);\n//#endregion\nexport { n as t };\n"],"mappings":";;IAIyBA,IAAI,kBAAwH,IAAI,4BCE5I,UACX,QAAQ,IAAA,uCACR,QAAQ,IAAA,yBCJJ,KACJ,MACmD;CACnD,IAAM,IAAU,KAAK,MAAM,KAAK,EAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;CAEpD,OAAO;EACL,aAAa,EAAQ;EACrB,eAAe,EAAQ;CACzB;AACF,GAGa,KAAqB,MAAyB;CACzD,IAAM,IAAS,QAAQ,IAAI,IACrB,IAAQ,EAA0B;CAExC,IAAI,CAAC,KAAU,CAAC,GACd,MAAU,MACR,sFACF;CAGF,IAAM,EAAE,gBAAa,qBAAkB,EAAmB,CAAK,GACzD,IAAsB,EAAK,WAAW,GAAG,IAAI,EAAK,MAAM,CAAC,IAAI;CAUnE,OAAO,GAAG,EAAO,iBAAiB,EAAY,GAAG,EAAc,IATtC,EAAoB,WAAW,SAAS,IAC7D,IACA,UAAU,IAAA,CAGX,MAAM,GAAG,CAAC,CACV,IAAI,kBAAkB,CAAC,CACvB,KAAK,GAE0D;AACpE,GCnCa,KACX,MACW;CACX,IAAM,IAAkB,QAAQ,IAAI;CAEpC,IAAI,CAAC,EAAiB,CAAe,GACnC,MAAU,MACR,qFACF;CAGF,OAAO,GAAG,EAAgB,GAAG;AAC/B,GCbI,KAAK,MAAM,CAACC,EAAE,CAAC,KAAK,CAACC,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"url": "git+https://github.com/twentyhq/twenty.git",
|
|
6
6
|
"directory": "packages/twenty-sdk"
|
|
7
7
|
},
|
|
8
|
-
"version": "2.
|
|
8
|
+
"version": "2.54.2",
|
|
9
9
|
"sideEffects": false,
|
|
10
10
|
"files": [
|
|
11
11
|
"dist",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"preact": "^11.0.0",
|
|
68
68
|
"react": "^19.2.0",
|
|
69
69
|
"react-dom": "^19.2.0",
|
|
70
|
-
"twenty-client-sdk": "2.
|
|
70
|
+
"twenty-client-sdk": "2.54.2",
|
|
71
71
|
"uuid": "^13.0.2"
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"rollup-plugin-dts": "^6.4.1",
|
|
82
82
|
"tsc-alias": "^1.8.16",
|
|
83
83
|
"twenty-shared": "0.0.0",
|
|
84
|
-
"twenty-ui": "2.
|
|
84
|
+
"twenty-ui": "2.54.2",
|
|
85
85
|
"vite": "^8.0.0",
|
|
86
86
|
"vite-plugin-dts": "^4.5.4"
|
|
87
87
|
},
|