@gravity-rail/sdk 0.36.1 → 0.40.0
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/README.md +44 -21
- package/dist/agui.d.cts +1 -1
- package/dist/agui.d.ts +1 -1
- package/dist/audio.d.cts +1 -1
- package/dist/audio.d.ts +1 -1
- package/dist/{chat-interaction-CbkSPz3m.d.cts → chat-interaction-BB3ap8_u.d.ts} +8866 -6155
- package/dist/{chat-interaction-DqjEfj7G.d.ts → chat-interaction-Bj1pciwo.d.cts} +8866 -6155
- package/dist/{chunk-P2E6LU7I.js → chunk-67QXTQVL.js} +1 -26
- package/dist/chunk-67QXTQVL.js.map +1 -0
- package/dist/chunk-6KPGCPGW.js +48 -0
- package/dist/chunk-6KPGCPGW.js.map +1 -0
- package/dist/{chunk-HRUMZ46V.js → chunk-72SWNLVD.js} +2 -1
- package/dist/chunk-72SWNLVD.js.map +1 -0
- package/dist/{chunk-R6S5RXW5.js → chunk-ZTUOB4V2.js} +1255 -201
- package/dist/chunk-ZTUOB4V2.js.map +1 -0
- package/dist/helpers.cjs +47 -0
- package/dist/helpers.cjs.map +1 -1
- package/dist/helpers.d.cts +4 -3
- package/dist/helpers.d.ts +4 -3
- package/dist/helpers.js +7 -1
- package/dist/helpers.js.map +1 -1
- package/dist/index.cjs +1365 -330
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -35
- package/dist/index.d.ts +13 -35
- package/dist/index.js +110 -116
- package/dist/index.js.map +1 -1
- package/dist/internal.cjs +1279 -232
- package/dist/internal.cjs.map +1 -1
- package/dist/internal.d.cts +338 -79
- package/dist/internal.d.ts +338 -79
- package/dist/internal.js +66 -15
- package/dist/internal.js.map +1 -1
- package/dist/member-import-D8fZr2Pd.d.cts +46 -0
- package/dist/member-import-YNk9MlEl.d.ts +46 -0
- package/dist/realtime.cjs +91 -20
- package/dist/realtime.cjs.map +1 -1
- package/dist/realtime.d.cts +34 -9
- package/dist/realtime.d.ts +34 -9
- package/dist/realtime.js +90 -20
- package/dist/realtime.js.map +1 -1
- package/dist/{revision-state-92LHz1jQ.d.ts → revision-state-BaJTq3Or.d.ts} +270 -54
- package/dist/{revision-state-CSQ7J3ZU.d.cts → revision-state-CL11FA-T.d.cts} +270 -54
- package/dist/schemas.cjs +58 -81
- package/dist/schemas.cjs.map +1 -1
- package/dist/schemas.d.cts +88 -225
- package/dist/schemas.d.ts +88 -225
- package/dist/schemas.js +58 -76
- package/dist/schemas.js.map +1 -1
- package/dist/{tasks-CrF1qC4G.d.cts → tasks-ByJCQ5BI.d.cts} +2995 -2507
- package/dist/{tasks-CrF1qC4G.d.ts → tasks-ByJCQ5BI.d.ts} +2995 -2507
- package/dist/{types-0c6_NGU4.d.cts → types-DlfADjPR.d.cts} +17 -2
- package/dist/{types-0c6_NGU4.d.ts → types-DlfADjPR.d.ts} +17 -2
- package/package.json +9 -7
- package/dist/chunk-HRUMZ46V.js.map +0 -1
- package/dist/chunk-P2E6LU7I.js.map +0 -1
- package/dist/chunk-R6S5RXW5.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api/abilities.ts","../src/api/resource-workflows.ts","../src/api/bundles.ts","../src/api/installations.ts","../src/api/access-grants.ts","../src/api/agent-tasks.ts","../src/api/agents.ts","../src/api/ai-models.ts","../src/api/api-keys.ts","../src/api/apps.ts","../src/api/assignments.ts","../src/api/voice.ts","../src/api/auth.ts","../src/api/builders.ts","../src/api/calendars.ts","../src/api/calls.ts","../src/api/cel.ts","../src/api/chats.ts","../src/api/confluence.ts","../src/api/custom-toolkits.ts","../src/api/data-types.ts","../src/api/discord-bots.ts","../src/api/slack-apps.ts","../src/api/events.ts","../src/api/features.ts","../src/api/fhir-connections.ts","../src/types/generated/inbound_fax.ts","../src/api/documo-fax.ts","../src/api/healthie.ts","../src/api/files.ts","../src/api/inboxes.ts","../src/api/inquiries.ts","../src/api/app-connections.ts","../src/api/mcp-servers.ts","../src/api/members.ts","../src/api/monday.ts","../src/api/notification-rules.ts","../src/api/operator-groups.ts","../src/api/org.ts","../src/api/oauth.ts","../src/api/phone-numbers.ts","../src/api/pronunciations.ts","../src/api/prompts.ts","../src/api/personas.ts","../src/api/queries.ts","../src/api/qualifications.ts","../src/api/reports.ts","../src/types/generated/communication.ts","../src/api/routing-rules.ts","../src/api/salesforce.ts","../src/api/connection-sync.ts","../src/api/hubspot.ts","../src/api/sites.ts","../src/api/snippets.ts","../src/api/subscriptions.ts","../src/api/support-requests.ts","../src/api/customers.ts","../src/api/resellers.ts","../src/api/supervisors.ts","../src/api/tasks.ts","../src/api/templates.ts","../src/api/toolkits.ts","../src/api/journeys.ts","../src/api/workflows.ts","../src/api/workflow-notes.ts","../src/types/core-types.ts","../src/types/generated/member.ts","../src/types/generated/member_role.ts","../src/types/generated/member_contact_point.ts","../src/types/member-types.ts","../src/types/mcp-server-types.ts","../src/types/toolkit-types.ts","../src/types/event-types.ts","../src/types/generated/credit_stop_service.ts","../src/types/billing-types.ts","../src/types/workspace-types.ts","../src/types/invitation-types.ts","../src/types/generated/ai_model.ts","../src/types/ai-model-types.ts","../src/types/pids-types.ts","../src/types/fhir-connection-types.ts","../src/types/app-connection-types.ts","../src/types/generated/qualification.ts","../src/types/generated/qualification_health_service.ts","../src/types/generated/qualification_health_summary.ts","../src/types/generated/qualification_run_identity.ts","../src/types/qualification-types.ts","../src/types/access-grant-types.ts","../src/types/generated/member_relationship.ts","../src/types/generated/member_relationship_catalog.ts","../src/types/config-health-types.ts","../src/types/generated/ui_prompt.ts","../src/types/experiment-types.ts","../src/types/agent-task-types.ts","../src/api/workspace-invitations.ts","../src/api/workspaces.ts","../src/api/dashboards.ts","../src/api/devices.ts","../src/api/teams-apps.ts","../src/api/experiments.ts","../src/api/patientsync-connections.ts","../src/api/activity.ts","../src/api/motd.ts","../src/api/intervention-requests.ts","../src/api/metrics.ts","../src/api/projects.ts","../src/api/tracked-links.ts","../src/types/generated/bundle_contract.ts","../src/app-context.ts","../src/client/api-modules.ts","../src/client/workspace-client.ts","../src/client/bindings/access-grants.ts","../src/client/bindings/intervention-requests.ts","../src/client/bindings/agent-tasks.ts","../src/client/bindings/agents.ts","../src/client/bindings/tasks.ts","../src/client/bindings/chats.ts","../src/client/bindings/calls.ts","../src/client/bindings/dashboards.ts","../src/client/bindings/activity.ts","../src/client/bindings/motd.ts","../src/client/bindings/tracked-links.ts","../src/client/bindings/data-types.ts","../src/client/bindings/devices.ts","../src/client/bindings/members.ts","../src/client/bindings/workspaces.ts","../src/client/bindings/auth.ts","../src/client/bindings/sites.ts","../src/client/bindings/files.ts","../src/client/bindings/projects.ts","../src/client/bindings/events.ts","../src/client/bindings/experiments.ts","../src/client/bindings/workflows.ts","../src/client/bindings/calendars.ts","../src/client/bindings/communications.ts","../src/client/bindings/toolkits.ts","../src/client/bindings/billing.ts","../src/client/bindings/apps.ts","../src/client/bindings/integrations.ts","../src/client/bindings/operator-groups.ts","../src/client/bindings/org.ts","../src/client/bindings/pronunciations.ts","../src/client/bindings/resource-workflows.ts","../src/client/bindings/bundles.ts","../src/client/bindings/installations.ts","../src/client/bindings/journeys.ts","../src/client/bindings/qualifications.ts","../src/client/bindings/personas.ts","../src/client/bindings/metrics.ts","../src/client/bindings/queries.ts","../src/client/bindings/customers.ts","../src/client/bindings/resellers.ts","../src/client/bindings/prompts.ts","../src/client/bindings/support-requests.ts","../src/client/bindings/routing-rules.ts","../src/client/client.ts","../src/types/ability-types.ts","../src/types/model-config-types.ts","../src/types/query-engine-types.ts","../src/types/generated/channel_message.ts","../src/types/generated/chat.ts","../src/types/generated/ehr_writeback.ts","../src/types/chat-types.ts","../src/types/generated/organization.ts","../src/types/generated/site.ts","../src/types/generated/task.ts","../src/types/generated/workflow.ts","../src/types/widget-domain-types.ts","../src/types/generated/promo_code_service.ts","../src/types/generated/import_skipped_rule.ts","../src/features/registry.ts","../src/constants/chat-types.ts","../src/constants/models.ts","../src/types/resource-metadata.ts","../src/types/generated/digest.ts","../src/types/generated/activity_feed.ts","../src/types/generated/family.ts","../src/types/generated/entity_ref.ts","../src/scopes.ts","../src/utils/revision-state.ts"],"sourcesContent":["import type {\n AbilityResponse,\n AbilityType,\n AbilityTypesResponse,\n CharlestonTestDeliveryRecipientOption,\n} from '../types/ability-types';\nimport { BaseApiClient } from './base';\n\n/**\n * API client for ability types and configured ability instances.\n *\n * Ability *types* are read-only registry introspection. Ability *instances*\n * are configured on a workflow or task scope (never on an agent row directly —\n * the workflow_abilities table has no agent_id).\n */\nexport class AbilitiesApi extends BaseApiClient {\n /**\n * List available ability types from the registry.\n * Pass includeSystem to also return auto-injected system abilities.\n */\n async getAbilityTypes(\n wid: string,\n options: { includeSystem?: boolean } = {}\n ): Promise<AbilityTypesResponse> {\n const params = new URLSearchParams();\n if (options.includeSystem) params.append('includeSystem', 'true');\n const qs = params.toString() ? `?${params.toString()}` : '';\n return this.fetch<AbilityTypesResponse>(`w/${wid}/abilities/types${qs}`);\n }\n\n /** Get the full spec for a single ability type by slug. */\n async getAbilityType(wid: string, slug: string): Promise<AbilityType> {\n return this.fetch<AbilityType>(`w/${wid}/abilities/types/${encodeURIComponent(slug)}`);\n }\n\n /**\n * List configured ability instances for a workflow or task scope.\n * Provide exactly one of:\n * - workflow scope: workflowId (stable root → draft revision) and/or\n * workflowRevisionId (explicit pin)\n * - taskId for task-scoped abilities\n */\n async listAbilities(\n wid: string,\n options: {\n workflowId?: number;\n workflowRevisionId?: number;\n taskId?: number;\n }\n ): Promise<AbilityResponse[]> {\n const params = new URLSearchParams();\n if (options.workflowId !== undefined)\n params.append('workflowId', options.workflowId.toString());\n if (options.workflowRevisionId !== undefined)\n params.append('workflowRevisionId', options.workflowRevisionId.toString());\n if (options.taskId !== undefined) params.append('taskId', options.taskId.toString());\n return this.fetch<AbilityResponse[]>(`w/${wid}/abilities?${params}`);\n }\n\n /** Create (enable) a configured ability on a workflow or task scope. */\n async createAbility(wid: string, body: Record<string, unknown>): Promise<AbilityResponse> {\n return this.fetch<AbilityResponse>(`w/${wid}/abilities`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n /** Update a configured ability (configure / enable / disable) by UUID. */\n async updateAbility(\n wid: string,\n abilityUuid: string,\n body: Record<string, unknown>\n ): Promise<AbilityResponse> {\n return this.fetch<AbilityResponse>(`w/${wid}/abilities/${abilityUuid}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n });\n }\n\n /** Delete a configured ability instance by UUID. */\n async deleteAbility(wid: string, abilityUuid: string): Promise<void> {\n return this.fetch(`w/${wid}/abilities/${abilityUuid}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * List recipient-directory rows approved for Charleston PMD test delivery\n * (CS-150). Returns only {recipientKey, displayLabel} for active,\n * test-delivery-allowed rows with a device id — never the PatientSync\n * recipient_id. Scoped to agents:write + the charleston_nephrology_pmd_paging\n * feature; used by the ability-config test-delivery dropdown. Kept on the\n * ability-configuration API (not generic DataRecords) because the actual\n * ability-editor scopes do not guarantee generic record access.\n */\n async getCharlestonTestDeliveryRecipients(\n wid: string\n ): Promise<CharlestonTestDeliveryRecipientOption[]> {\n return this.fetch<CharlestonTestDeliveryRecipientOption[]>(\n `w/${wid}/app-connections/charleston_nephrology/test-delivery/eligible-recipients`\n );\n }\n}\n","// Published Workflow catalog reads. Authoring uses the workspace editor; Bundles distribute.\nimport { BaseApiClient } from './base';\nimport type {\n ResourceWorkflowDisclosureResponse,\n ResourceWorkflowGraphResponse,\n ResourceWorkflowSummary,\n} from '../types/generated/workflow_contract';\nimport type { PaginatedResponseResourceWorkflowSummary } from '../types/generated/common';\n\nexport type * from '../types/generated/workflow_contract';\nexport type * from '../types/generated/disclosure_contract';\nexport type { PaginatedResponseResourceWorkflowSummary } from '../types/generated/common';\n\n/** Every interpolated value is one path segment — the workspace uuid included. */\nfunction resourceWorkflowsPath(wid: string, ...segments: (string | number)[]): string {\n const tail = segments.map((segment) => encodeURIComponent(String(segment))).join('/');\n const base = `w/${encodeURIComponent(wid)}/resource-workflows`;\n return tail ? `${base}/${tail}` : base;\n}\n\nexport class ResourceWorkflowsApi extends BaseApiClient {\n /** One Workflow's summary, for a viewer that can see it. */\n async getResourceWorkflow(wid: string, workflowUuid: string): Promise<ResourceWorkflowSummary> {\n return this.fetch<ResourceWorkflowSummary>(resourceWorkflowsPath(wid, workflowUuid));\n }\n\n /**\n * One published revision.\n *\n * The response is a union: the owner (or a `full` grantee) receives the\n * complete `ResourceWorkflowGraphResponse`, while a bounded grantee receives\n * the `ResourceWorkflowDisclosureResponse` envelope. Branch on `publishedAt`\n * being present — never assume the full shape. A retained revision stays\n * readable here after a `stop_updates` revocation.\n */\n async getResourceWorkflowRevision(\n wid: string,\n workflowUuid: string,\n revisionUuid: string\n ): Promise<ResourceWorkflowGraphResponse | ResourceWorkflowDisclosureResponse> {\n return this.fetch<ResourceWorkflowGraphResponse | ResourceWorkflowDisclosureResponse>(\n resourceWorkflowsPath(wid, workflowUuid, 'revisions', revisionUuid)\n );\n }\n\n /**\n * List published Workflows owned by or shared with this workspace.\n *\n * The Bundle draft editor reads `publishedRevisionUuid` from each summary to\n * pin a Workflow item; archived Workflows are excluded unless asked for.\n */\n async listResourceWorkflows(\n wid: string,\n params?: { page?: number; pageSize?: number; includeArchived?: boolean }\n ): Promise<PaginatedResponseResourceWorkflowSummary> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n if (params?.includeArchived !== undefined) {\n query.set('includeArchived', String(params.includeArchived));\n }\n const qs = query.toString();\n return this.fetch<PaginatedResponseResourceWorkflowSummary>(\n `w/${encodeURIComponent(wid)}/resource-workflows${qs ? `?${qs}` : ''}`\n );\n }\n}\n","// Bundle catalog authoring: the publisher's draft/publish/grant surface and the\n// read surface a workspace a Bundle is visible to can see.\n//\n// Routes require `workflows:read` or `workflows:admin` as declared. Catalog\n// access also depends on workspace ownership, a live grant, or an admin of the\n// owning organization. Draft authoring is confined to the owning workspace;\n// organization-wide grants require organization-admin authority. Official public\n// solutions are approved through a separate staff catalog.\n//\n// Every wire shape here comes from the generated `bundle_contract` module; this\n// file only decides paths and verbs.\nimport { BaseApiClient } from './base';\nimport type { InstallationResponse } from '../types/generated/installation_contract';\nimport type {\n SolutionReleaseResponse,\n BundleGrantRequest,\n BundleGrantResponse,\n BundleSummary,\n BundleVersionResponse,\n BundleWorkflowCandidate,\n CreateBundleRequest,\n PublishBundleRequest,\n ReplaceBundleDraftRequest,\n UpdateBundleRequest,\n} from '../types/generated/bundle_contract';\nimport type {\n PaginatedResponseBundleSummary,\n PaginatedResponseBundleVersionSummary,\n} from '../types/generated/common';\n\nexport type * from '../types/generated/bundle_contract';\nexport type * from '../types/generated/bundle_scenario_preflight';\nexport type {\n PaginatedResponseBundleSummary,\n PaginatedResponseBundleVersionSummary,\n} from '../types/generated/common';\n\n/** Every interpolated value is one path segment — the workspace uuid included. */\nfunction bundlesPath(wid: string, ...segments: (string | number)[]): string {\n const tail = segments.map((segment) => encodeURIComponent(String(segment))).join('/');\n const base = `w/${encodeURIComponent(wid)}/bundles`;\n return tail ? `${base}/${tail}` : base;\n}\n\n/** `page`/`pageSize` are forwarded when supplied — an explicit `0` included. */\nfunction pageQuery(params?: { page?: number; pageSize?: number }): string {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n const qs = query.toString();\n return qs ? `?${qs}` : '';\n}\n\nexport class BundlesApi extends BaseApiClient {\n /** Official solution metadata, independent of the default workspace Library. */\n async getSolutionRelease(\n slug: SolutionReleaseResponse['slug']\n ): Promise<SolutionReleaseResponse> {\n return this.fetch<SolutionReleaseResponse>(`solutions/${encodeURIComponent(slug)}`);\n }\n\n /** Read an authorized Bundle by UUID, including official solutions hidden from discovery. */\n async getBundle(wid: string, bundleUuid: string): Promise<BundleSummary> {\n return this.fetch<BundleSummary>(bundlesPath(wid, bundleUuid));\n }\n\n async updateBundle(\n wid: string,\n bundleUuid: string,\n data: UpdateBundleRequest\n ): Promise<BundleSummary> {\n return this.fetch<BundleSummary>(\n `w/${encodeURIComponent(wid)}/bundles/${encodeURIComponent(bundleUuid)}`,\n {\n method: 'PATCH',\n body: JSON.stringify(data),\n }\n );\n }\n\n async listBundleInstallations(wid: string, bundleUuid: string): Promise<InstallationResponse[]> {\n return this.fetch<InstallationResponse[]>(\n `w/${encodeURIComponent(wid)}/bundles/${encodeURIComponent(bundleUuid)}/installations`\n );\n }\n\n /**\n * Bundles visible to this workspace through ownership, a live grant, or\n * an administrator of the owning organization.\n */\n async listBundles(\n wid: string,\n params?: { page?: number; pageSize?: number }\n ): Promise<PaginatedResponseBundleSummary> {\n return this.fetch<PaginatedResponseBundleSummary>(`${bundlesPath(wid)}${pageQuery(params)}`);\n }\n\n /**\n * This workspace's Workflows for the Bundle picker. `eligible` pins\n * `revisionUuid` (the active revision when published, else the newest\n * published one); `unpublished` has nothing to pin. `dependenciesChecked` is\n * false until a Bundle add has stored the revision's dependencies; that add\n * surfaces any refusal as a 409 `workflow_not_shareable`. Requires\n * `workflows:admin`.\n */\n async listBundleWorkflowCandidates(wid: string): Promise<BundleWorkflowCandidate[]> {\n return this.fetch<BundleWorkflowCandidate[]>(bundlesPath(wid, 'workflow-candidates'));\n }\n\n /** Create an empty Bundle owned by this workspace. */\n async createBundle(wid: string, data: CreateBundleRequest): Promise<BundleSummary> {\n return this.fetch<BundleSummary>(bundlesPath(wid), {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * The unpublished draft for the owning workspace. A grantee is refused with\n * 404: `version_detail` checks\n * `root.workspace_uuid != viewer.workspace_uuid` for the null version\n * (`lib/db/resources/bundles.py`), after the grantee-inclusive predicate has\n * already admitted them to the Bundle itself.\n *\n * After publication, the next draft contains a copy of the published items.\n * The owner receives it with 200; a grantee receives 404.\n */\n async getBundleDraft(wid: string, bundleUuid: string): Promise<BundleVersionResponse> {\n return this.fetch<BundleVersionResponse>(bundlesPath(wid, bundleUuid, 'draft'));\n }\n\n /** Replace the whole draft item list. 409 when `expectedGeneration` is stale. */\n async replaceBundleDraft(\n wid: string,\n bundleUuid: string,\n data: ReplaceBundleDraftRequest\n ): Promise<BundleVersionResponse> {\n return this.fetch<BundleVersionResponse>(bundlesPath(wid, bundleUuid, 'draft'), {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Cut a new immutable version from the draft. 409 when `expectedGeneration` is stale. */\n async publishBundle(\n wid: string,\n bundleUuid: string,\n data: PublishBundleRequest\n ): Promise<BundleVersionResponse> {\n return this.fetch<BundleVersionResponse>(bundlesPath(wid, bundleUuid, 'publish'), {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Published versions, newest first. */\n async listBundleVersions(\n wid: string,\n bundleUuid: string,\n params?: { page?: number; pageSize?: number }\n ): Promise<PaginatedResponseBundleVersionSummary> {\n return this.fetch<PaginatedResponseBundleVersionSummary>(\n `${bundlesPath(wid, bundleUuid, 'versions')}${pageQuery(params)}`\n );\n }\n\n /** One published version, with its items, declared settings and open slots. */\n async getBundleVersion(\n wid: string,\n bundleUuid: string,\n version: number\n ): Promise<BundleVersionResponse> {\n return this.fetch<BundleVersionResponse>(bundlesPath(wid, bundleUuid, 'versions', version));\n }\n\n /** Who this Bundle is currently granted to. */\n async listBundleGrants(wid: string, bundleUuid: string): Promise<BundleGrantResponse[]> {\n return this.fetch<BundleGrantResponse[]>(bundlesPath(wid, bundleUuid, 'grants'));\n }\n\n /**\n * Share throughout the publisher's organization with organization-admin authority.\n * Workspace-specific and global author grants are refused. Official public\n * solutions use the separate staff approval API.\n */\n async grantBundle(\n wid: string,\n bundleUuid: string,\n data: BundleGrantRequest\n ): Promise<BundleGrantResponse> {\n return this.fetch<BundleGrantResponse>(bundlesPath(wid, bundleUuid, 'grants'), {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Revoke one grant by id. */\n async revokeBundleGrant(wid: string, bundleUuid: string, grantId: number): Promise<void> {\n return this.fetch<void>(bundlesPath(wid, bundleUuid, 'grants', grantId), {\n method: 'DELETE',\n });\n }\n}\n","// What a workspace does with a Bundle it can see: install it, read what it\n// holds, upgrade it, choose whether the publisher may upgrade it, and fill a\n// slot it left open.\n//\n// Installation calls need destination-workspace access and the route's\n// `workflows:read` / `workflows:admin` scope. Acquiring a release also requires\n// publisher-granted access; organization-admin status is not required.\n// `getThemeSettingsSchema` uses a separate `sites:read` route.\n//\n// Two shapes are worth knowing before you call anything. Installing with a\n// required slot left unbound succeeds, and `getInstallationReadiness` reports\n// the gap afterwards. Upgrading requires unbound required Site slots to be\n// supplied before the held release moves. A target that is already captured\n// cannot be moved by `bindInstallationSlots`: changing\n// what an installed Workflow points at is an upgrade or a reinstall, so that\n// call only ever closes a hole.\n//\n// Installation wire shapes come from generated `installation_contract` types;\n// the theme schema uses generated `site` types. This file decides paths and verbs.\nimport { BaseApiClient } from './base';\nimport type {\n BindInstallationSlotsRequest,\n InstallBundleRequest,\n InstallationReadiness,\n InstallationResponse,\n InstallationUpgradePreview,\n SetInstallationPolicyRequest,\n RestoreInstallationFormRequest,\n RestoreInstallationWorkflowResourcesRequest,\n UpgradeInstallationRequest,\n} from '../types/generated/installation_contract';\nimport type { ThemeSettingField } from '../types/generated/site';\nimport type {\n BundleInstallationPreflightRequest,\n BundleInstallationPreflightResponse,\n} from '../types/generated/bundle_installation_preflight';\n\nexport type * from '../types/generated/installation_contract';\nexport type * from '../types/generated/bundle_installation_preflight';\nexport type { ThemeSettingField } from '../types/generated/site';\n\n/** Every interpolated value is one path segment — the workspace uuid included. */\nfunction installationsPath(wid: string, ...segments: (string | number)[]): string {\n const tail = segments.map((segment) => encodeURIComponent(String(segment))).join('/');\n const base = `w/${encodeURIComponent(wid)}/installations`;\n return tail ? `${base}/${tail}` : base;\n}\n\nexport class InstallationsApi extends BaseApiClient {\n /** Inspect one published release and its selected example dependencies. */\n async preflightBundleInstallation(\n wid: string,\n bundleUuid: string,\n data: BundleInstallationPreflightRequest\n ): Promise<BundleInstallationPreflightResponse> {\n return this.fetch<BundleInstallationPreflightResponse>(\n `w/${encodeURIComponent(wid)}/bundles/${encodeURIComponent(bundleUuid)}/installation-preflight`,\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n\n /**\n * Install a published Bundle version into this workspace.\n *\n * A key in `bindings` that this version has no slot or Form item for is\n * refused; a **missing** required slot is not.\n */\n async installBundle(\n wid: string,\n bundleUuid: string,\n data: InstallBundleRequest\n ): Promise<InstallationResponse> {\n return this.fetch<InstallationResponse>(\n `w/${encodeURIComponent(wid)}/bundles/${encodeURIComponent(bundleUuid)}/installations`,\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n\n /** Every installation this workspace holds, oldest first. */\n async listInstallations(wid: string): Promise<InstallationResponse[]> {\n return this.fetch<InstallationResponse[]>(installationsPath(wid));\n }\n\n async getInstallation(wid: string, installationUuid: string): Promise<InstallationResponse> {\n return this.fetch<InstallationResponse>(installationsPath(wid, installationUuid));\n }\n\n /**\n * Open slots, bindings whose target no longer resolves, Forms that drifted\n * from their recipe, missing or changed Workflow dependencies, and archived\n * items. Computed on read, never stored.\n */\n async getInstallationReadiness(\n wid: string,\n installationUuid: string\n ): Promise<InstallationReadiness> {\n return this.fetch<InstallationReadiness>(\n installationsPath(wid, installationUuid, 'readiness')\n );\n }\n\n /**\n * What moving to version `to` would change: per-item differences, the slots\n * that would still be unbound, and the release notes of every version in\n * between. `to` must be newer than the version the installation holds.\n */\n async previewInstallationUpgrade(\n wid: string,\n installationUuid: string,\n to: number\n ): Promise<InstallationUpgradePreview> {\n const query = new URLSearchParams({ to: String(to) });\n return this.fetch<InstallationUpgradePreview>(\n `${installationsPath(wid, installationUuid, 'upgrade-preview')}?${query.toString()}`\n );\n }\n\n /**\n * Move the installation onto a newer published version. The version it\n * already holds, and any earlier one, are refused with 409.\n */\n async upgradeInstallation(\n wid: string,\n installationUuid: string,\n data: UpgradeInstallationRequest\n ): Promise<InstallationResponse> {\n return this.fetch<InstallationResponse>(installationsPath(wid, installationUuid, 'upgrade'), {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Recreate one deleted Form from the version already installed. */\n async restoreInstallationForm(\n wid: string,\n installationUuid: string,\n data: RestoreInstallationFormRequest\n ): Promise<InstallationResponse> {\n return this.fetch<InstallationResponse>(\n installationsPath(wid, installationUuid, 'restore-form'),\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /** Recreate missing dependency resources for an installed Workflow. */\n async restoreInstallationWorkflowResources(\n wid: string,\n installationUuid: string,\n data: RestoreInstallationWorkflowResourcesRequest\n ): Promise<InstallationResponse> {\n return this.fetch<InstallationResponse>(\n installationsPath(wid, installationUuid, 'restore-workflow-resources'),\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n\n /** `pinned` holds the installed version; `auto` follows each publication. */\n async setInstallationPolicy(\n wid: string,\n installationUuid: string,\n data: SetInstallationPolicyRequest\n ): Promise<InstallationResponse> {\n return this.fetch<InstallationResponse>(installationsPath(wid, installationUuid), {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /** Stop future Bundle updates while keeping the workspace's installed content. */\n async unsubscribeInstallation(\n wid: string,\n installationUuid: string\n ): Promise<InstallationResponse> {\n return this.fetch<InstallationResponse>(\n installationsPath(wid, installationUuid, 'unsubscribe'),\n { method: 'POST', body: JSON.stringify({}) }\n );\n }\n\n /** Fill open slots. A slot that already carries a target is refused with 409. */\n async bindInstallationSlots(\n wid: string,\n installationUuid: string,\n data: BindInstallationSlotsRequest\n ): Promise<InstallationResponse> {\n return this.fetch<InstallationResponse>(\n installationsPath(wid, installationUuid, 'bindings'),\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n\n /**\n * Settle an installation left `pending` by an interrupted operation.\n *\n * The body is empty and required: a bodyless cookie-auth POST is forgeable\n * by a cross-site form, so the route demands JSON.\n */\n async reconcileInstallation(\n wid: string,\n installationUuid: string\n ): Promise<InstallationResponse> {\n return this.fetch<InstallationResponse>(\n installationsPath(wid, installationUuid, 'reconcile'),\n { method: 'POST', body: JSON.stringify({}) }\n );\n }\n\n /**\n * The settings a compiled theme declares, for labelling a Site item's slots\n * before any Site exists. 404 for an unknown slug and for `source-site`,\n * whose schema is a per-workspace build artifact rather than a catalog one.\n * Requires `sites:read`; no Bundle installation authority is needed.\n */\n async getThemeSettingsSchema(wid: string, slug: string): Promise<ThemeSettingField[]> {\n return this.fetch<ThemeSettingField[]>(\n `w/${encodeURIComponent(wid)}/themes/${encodeURIComponent(slug)}/settings-schema`\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n AccessGrant,\n CreateAccessGrantRequest,\n PaginatedResponse,\n ResolveGrantRequest,\n RevokeGrantRequest,\n} from '../types';\n\nexport class AccessGrantsApi extends BaseApiClient {\n /** List access grants received by the current member. */\n async getMyReceivedGrants(\n wid: string,\n params?: { status?: string; page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<AccessGrant>> {\n const searchParams = new URLSearchParams();\n if (params?.status) searchParams.set('status', params.status);\n if (params?.page) searchParams.set('page', params.page.toString());\n if (params?.pageSize) searchParams.set('page_size', params.pageSize.toString());\n const qs = searchParams.toString();\n return this.fetch<PaginatedResponse<AccessGrant>>(\n `w/${wid}/access-grants/my/received${qs ? `?${qs}` : ''}`\n );\n }\n\n /** List access grants given by the current member. */\n async getMyGivenGrants(\n wid: string,\n params?: { status?: string; page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<AccessGrant>> {\n const searchParams = new URLSearchParams();\n if (params?.status) searchParams.set('status', params.status);\n if (params?.page) searchParams.set('page', params.page.toString());\n if (params?.pageSize) searchParams.set('page_size', params.pageSize.toString());\n const qs = searchParams.toString();\n return this.fetch<PaginatedResponse<AccessGrant>>(\n `w/${wid}/access-grants/my/given${qs ? `?${qs}` : ''}`\n );\n }\n\n /** Get a single access grant by UUID. */\n async getAccessGrant(wid: string, uuid: string): Promise<AccessGrant> {\n return this.fetch<AccessGrant>(`w/${wid}/access-grants/${uuid}`);\n }\n\n /** Create a new access grant for a resource. */\n async createAccessGrant(wid: string, data: CreateAccessGrantRequest): Promise<AccessGrant> {\n return this.fetch<AccessGrant>(`w/${wid}/access-grants`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Resolve a pending access grant by approving or denying it. */\n async resolveAccessGrant(\n wid: string,\n uuid: string,\n data: ResolveGrantRequest\n ): Promise<AccessGrant> {\n return this.fetch<AccessGrant>(`w/${wid}/access-grants/${uuid}/resolve`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Revoke a previously approved access grant. */\n async revokeAccessGrant(\n wid: string,\n uuid: string,\n data: RevokeGrantRequest\n ): Promise<AccessGrant> {\n return this.fetch<AccessGrant>(`w/${wid}/access-grants/${uuid}/revoke`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** List all access grants with optional filtering by status, resource type, and resource ID. */\n async getAccessGrants(\n wid: string,\n params?: {\n status?: string;\n resourceType?: string;\n resourceId?: number;\n page?: number;\n pageSize?: number;\n }\n ): Promise<PaginatedResponse<AccessGrant>> {\n const searchParams = new URLSearchParams();\n if (params?.status) searchParams.set('status', params.status);\n if (params?.resourceType) searchParams.set('resource_type', params.resourceType);\n if (params?.resourceId) searchParams.set('resource_id', params.resourceId.toString());\n if (params?.page) searchParams.set('page', params.page.toString());\n if (params?.pageSize) searchParams.set('page_size', params.pageSize.toString());\n const qs = searchParams.toString();\n return this.fetch<PaginatedResponse<AccessGrant>>(\n `w/${wid}/access-grants${qs ? `?${qs}` : ''}`\n );\n }\n\n /** Get all access grants for a specific member. */\n async getMemberGrants(wid: string, memberId: number): Promise<AccessGrant[]> {\n const resp = await this.fetch<PaginatedResponse<AccessGrant>>(\n `w/${wid}/access-grants/member/${memberId}`\n );\n return resp.items;\n }\n\n /**\n * List access grants *received* by a member (grantee view) — the\n * \"what can this agent do without asking?\" list. Filter with\n * status=active and/or a capabilityClass (e.g. 'tool.always_allow').\n */\n async getGranteeGrants(\n wid: string,\n memberId: number,\n params?: {\n status?: string;\n capabilityClass?: string;\n page?: number;\n pageSize?: number;\n }\n ): Promise<PaginatedResponse<AccessGrant>> {\n const searchParams = new URLSearchParams();\n if (params?.status) searchParams.set('status', params.status);\n if (params?.capabilityClass) {\n searchParams.set('capability_class', params.capabilityClass);\n }\n if (params?.page) searchParams.set('page', params.page.toString());\n if (params?.pageSize) searchParams.set('page_size', params.pageSize.toString());\n const qs = searchParams.toString();\n return this.fetch<PaginatedResponse<AccessGrant>>(\n `w/${wid}/access-grants/grantee/${memberId}${qs ? `?${qs}` : ''}`\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n AgentTaskMessageResponse,\n AgentTaskResponse,\n CancelAgentTaskResponse,\n GetAgentTaskMessagesParams,\n ListAgentTasksParams,\n} from '../types';\n\nexport class AgentTasksApi extends BaseApiClient {\n async getAgentTasks(wid: string, params?: ListAgentTasksParams): Promise<AgentTaskResponse[]> {\n const searchParams = new URLSearchParams();\n if (params?.status) searchParams.set('status', params.status);\n if (params?.agentMemberId != null)\n searchParams.set('agent_member_id', String(params.agentMemberId));\n if (params?.parentTaskId != null)\n searchParams.set('parent_task_id', String(params.parentTaskId));\n if (params?.limit != null) searchParams.set('limit', String(params.limit));\n const qs = searchParams.toString();\n return this.fetch<AgentTaskResponse[]>(`w/${wid}/agent-tasks${qs ? `?${qs}` : ''}`);\n }\n\n async getAgentTask(wid: string, taskUuid: string): Promise<AgentTaskResponse> {\n return this.fetch<AgentTaskResponse>(`w/${wid}/agent-tasks/${taskUuid}`);\n }\n\n async cancelAgentTask(wid: string, taskUuid: string): Promise<CancelAgentTaskResponse> {\n return this.fetch<CancelAgentTaskResponse>(`w/${wid}/agent-tasks/${taskUuid}/cancel`, {\n method: 'POST',\n });\n }\n\n async getAgentTaskMessages(\n wid: string,\n taskUuid: string,\n params?: GetAgentTaskMessagesParams\n ): Promise<AgentTaskMessageResponse[]> {\n const searchParams = new URLSearchParams();\n if (params?.limit != null) searchParams.set('limit', String(params.limit));\n const qs = searchParams.toString();\n return this.fetch<AgentTaskMessageResponse[]>(\n `w/${wid}/agent-tasks/${taskUuid}/messages${qs ? `?${qs}` : ''}`\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport {\n Agent,\n CreateAgentRequest,\n UpdateAgentRequest,\n PaginatedResponse,\n SortOrder,\n} from '../types';\nimport type { AgentSortField } from '../types/sort-types';\n\nexport type { AgentSortField };\n\nexport class AgentsApi extends BaseApiClient {\n /** List agents in a workspace with optional pagination, sorting, and search. */\n async getAgents(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n sortBy?: AgentSortField;\n sortOrder?: SortOrder;\n search?: string;\n includeArchived?: boolean;\n } = {}\n ): Promise<PaginatedResponse<Agent>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.search) params.append('search', options.search);\n if (options.includeArchived)\n params.append('includeArchived', options.includeArchived.toString());\n\n return this.fetch<PaginatedResponse<Agent>>(\n `w/${wid}/agents${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** Get a single agent by ID. */\n async getAgent(wid: string, id: number): Promise<Agent> {\n return this.fetch<Agent>(`w/${wid}/agents/${id}`);\n }\n\n /** Create a new agent in a workspace. */\n async createAgent(wid: string, agent: CreateAgentRequest): Promise<Agent> {\n return this.fetch<Agent>(`w/${wid}/agents`, {\n method: 'POST',\n body: JSON.stringify(agent),\n });\n }\n\n /** Update an existing agent. */\n async updateAgent(wid: string, id: number, agent: UpdateAgentRequest): Promise<Agent> {\n return this.fetch<Agent>(`w/${wid}/agents/${id}`, {\n method: 'PUT',\n body: JSON.stringify(agent),\n });\n }\n\n /** Delete an agent by ID, optionally forcing deletion of agents with active references. */\n async deleteAgent(wid: string, id: number, force?: boolean): Promise<void> {\n const params = force ? '?force=true' : '';\n return this.fetch(`w/${wid}/agents/${id}${params}`, {\n method: 'DELETE',\n });\n }\n\n /** Archive an agent, hiding it from default listings. */\n async archiveAgent(wid: string, id: number): Promise<Agent> {\n return this.fetch<Agent>(`w/${wid}/agents/${id}/archive`, {\n method: 'POST',\n });\n }\n\n /** Restore an archived agent back to active status. */\n async unarchiveAgent(wid: string, id: number): Promise<Agent> {\n return this.fetch<Agent>(`w/${wid}/agents/${id}/unarchive`, {\n method: 'POST',\n });\n }\n}\n","import type {\n AIModelsResponse,\n AllModelsResponse,\n ManagerModelsResponse,\n STTModelsResponse,\n VoiceModelsResponse,\n VoicePresetsResponse,\n} from '../types/ai-model-types';\nimport { BaseApiClient } from './base';\n\n/**\n * API client for AI model-related operations.\n */\nexport class AIModelsApi extends BaseApiClient {\n /**\n * Get available chat AI models\n */\n async getChatModels(provider?: string): Promise<AIModelsResponse> {\n const searchParams = new URLSearchParams();\n if (provider) searchParams.append('provider', provider);\n\n const queryString = searchParams.toString();\n const url = queryString ? `ai-models/chat?${queryString}` : 'ai-models/chat';\n\n return this.fetch<AIModelsResponse>(url);\n }\n\n /**\n * Get the models a member may pick for the Workspace Manager, in display\n * order. Only models this deployment can serve are listed.\n *\n * `tokenMultiplier` is each model's input + output price per token relative\n * to `baselineModelId`; `defaultModelId` is what the Manager runs with no\n * pick. Send a pick on a Manager chat as `AppContext.managerModel` /\n * `managerReasoningEffort`.\n */\n async getManagerModels(): Promise<ManagerModelsResponse> {\n return this.fetch<ManagerModelsResponse>('ai-models/manager');\n }\n\n /**\n * Get available realtime AI models\n */\n async getRealtimeModels(provider?: string): Promise<AIModelsResponse> {\n const searchParams = new URLSearchParams();\n if (provider) searchParams.append('provider', provider);\n\n const queryString = searchParams.toString();\n const url = queryString ? `ai-models/realtime?${queryString}` : 'ai-models/realtime';\n\n return this.fetch<AIModelsResponse>(url);\n }\n\n /**\n * Get the voice presets offered by the simplified voice picker.\n *\n * A preset bundles a realtime speech-to-speech model with one of its native\n * voices and the settings recommended alongside it, so choosing a voice is\n * a single decision. Apply one by assigning its `config` wholesale; compare\n * against it to tell a preset selection from a customised (\"Custom\") one.\n * The full engine/voice/settings matrix lives on `getRealtimeModels`.\n */\n async getVoicePresets(): Promise<VoicePresetsResponse> {\n return this.fetch<VoicePresetsResponse>('ai-models/voice-presets');\n }\n\n /**\n * Get available voice models with metadata\n */\n async getVoiceModels(provider?: string): Promise<VoiceModelsResponse> {\n const searchParams = new URLSearchParams();\n if (provider) searchParams.append('provider', provider);\n\n const queryString = searchParams.toString();\n const url = queryString ? `ai-models/voices?${queryString}` : 'ai-models/voices';\n\n return this.fetch<VoiceModelsResponse>(url);\n }\n\n /**\n * Get all AI models with full metadata including multipliers\n * Returns models grouped by type (chat, realtime, image, stt, tts)\n */\n async getAllModels(provider?: string, includeUnavailable = false): Promise<AllModelsResponse> {\n const searchParams = new URLSearchParams();\n if (provider) searchParams.append('provider', provider);\n if (includeUnavailable) searchParams.append('include_unavailable', 'true');\n\n const queryString = searchParams.toString();\n const url = queryString ? `ai-models/all?${queryString}` : 'ai-models/all';\n\n return this.fetch<AllModelsResponse>(url);\n }\n\n /**\n * Get available image generation models\n */\n async getImageModels(provider?: string): Promise<AIModelsResponse> {\n const searchParams = new URLSearchParams();\n if (provider) searchParams.append('provider', provider);\n\n const queryString = searchParams.toString();\n const url = queryString ? `ai-models/image?${queryString}` : 'ai-models/image';\n\n return this.fetch<AIModelsResponse>(url);\n }\n\n /**\n * Get available speech-to-text models.\n *\n * Returns the per-shape `STTModelsResponse` so callers see `languages` and\n * `capabilities` on each model (the chat-shape `AIModelsResponse` it used\n * to return doesn't include either).\n */\n async getSTTModels(provider?: string): Promise<STTModelsResponse> {\n const searchParams = new URLSearchParams();\n if (provider) searchParams.append('provider', provider);\n\n const queryString = searchParams.toString();\n const url = queryString ? `ai-models/stt?${queryString}` : 'ai-models/stt';\n\n return this.fetch<STTModelsResponse>(url);\n }\n\n /**\n * Get available text-to-speech models\n */\n async getTTSModels(provider?: string): Promise<AIModelsResponse> {\n const searchParams = new URLSearchParams();\n if (provider) searchParams.append('provider', provider);\n\n const queryString = searchParams.toString();\n const url = queryString ? `ai-models/tts?${queryString}` : 'ai-models/tts';\n\n return this.fetch<AIModelsResponse>(url);\n }\n}\n","import { ApiKey, ApiKeyCreated, ApiKeyFormData } from '../types';\nimport { BaseApiClient } from './base';\n\nexport class ApiKeysApi extends BaseApiClient {\n // Workspace-specific API key methods\n\n /** List all API keys for a workspace. */\n async getApiKeys(wid: string): Promise<ApiKey[]> {\n return this.fetch<ApiKey[]>(`w/${wid}/api-keys`);\n }\n\n /** Create a new API key for a workspace. */\n async createApiKey(wid: string, apiKey: ApiKeyFormData): Promise<ApiKeyCreated> {\n return this.fetch<ApiKeyCreated>(`w/${wid}/api-keys`, {\n method: 'POST',\n body: JSON.stringify(apiKey),\n });\n }\n\n /** Revoke a workspace API key. */\n async revokeApiKey(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/api-keys/${id}`, {\n method: 'DELETE',\n });\n }\n\n // Global (account-level) API key methods\n\n /** List all account-level API keys. */\n async getGlobalApiKeys(): Promise<ApiKey[]> {\n return this.fetch<ApiKey[]>(`account/api-keys`);\n }\n\n /** Create a new account-level API key. */\n async createGlobalApiKey(apiKey: ApiKeyFormData): Promise<ApiKeyCreated> {\n return this.fetch<ApiKeyCreated>(`account/api-keys`, {\n method: 'POST',\n body: JSON.stringify(apiKey),\n });\n }\n\n /** Revoke an account-level API key. */\n async revokeGlobalApiKey(id: number): Promise<void> {\n return this.fetch(`account/api-keys/${id}`, {\n method: 'DELETE',\n });\n }\n}\n","import {\n App,\n AppCredentialResponse,\n AppListResponse,\n CreateAppRequest,\n UpdateAppRequest,\n} from '../types';\nimport { BaseApiClient } from './base';\n\nexport class AppsApi extends BaseApiClient {\n /**\n * List apps - either public apps, account's apps, or all apps visible to a workspace\n */\n async listApps(params?: {\n public?: boolean;\n workspaceUuid?: string;\n builderId?: number;\n }): Promise<AppListResponse> {\n const queryParams = new URLSearchParams();\n if (params?.public) queryParams.append('public', 'true');\n if (params?.workspaceUuid !== undefined)\n queryParams.append('workspace_uuid', params.workspaceUuid);\n if (params?.builderId !== undefined)\n queryParams.append('builder_id', params.builderId.toString());\n const queryString = queryParams.toString();\n return this.fetch<AppListResponse>(`apps${queryString ? `?${queryString}` : ''}`);\n }\n\n /**\n * Create a new app\n */\n async createApp(request: CreateAppRequest): Promise<App> {\n return this.fetch<App>('apps', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get details of a specific app\n */\n async getApp(appId: string): Promise<App> {\n return this.fetch<App>(`apps/${appId}`);\n }\n\n /**\n * Get app by client ID (for OAuth flows)\n */\n async getAppByClientId(clientId: string): Promise<App> {\n return this.fetch<App>(`apps/by-client-id/${clientId}`);\n }\n\n /**\n * Update an app\n */\n async updateApp(appId: string, request: UpdateAppRequest): Promise<App> {\n return this.fetch<App>(`apps/${appId}`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Delete an app\n */\n async deleteApp(appId: string): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`apps/${appId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Regenerate client secret for an app\n */\n async regenerateClientSecret(appId: string): Promise<AppCredentialResponse> {\n return this.fetch<AppCredentialResponse>(`apps/${appId}/regenerate-secret`, {\n method: 'POST',\n });\n }\n}\n","import {\n Assignment,\n AssignmentsQueryParams,\n AssignmentTask,\n ChatMessage,\n CreateAssignmentFormData,\n ExecuteToolResponse,\n OperatorTaskDetailResponse,\n PaginatedResponse,\n ToolsResponse,\n UpdateAssignmentFormData,\n} from '../types';\nimport { BaseApiClient } from './base';\n\nexport class AssignmentsApi extends BaseApiClient {\n /** List assignments with optional filtering, pagination, and sorting. */\n async getAssignments(\n wid: string,\n options: AssignmentsQueryParams = {}\n ): Promise<PaginatedResponse<Assignment>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.mine) params.append('mine', options.mine.toString());\n if (options.taskId) params.append('taskId', options.taskId.toString());\n if (options.memberId !== undefined) params.append('memberId', options.memberId.toString());\n if (options.status) params.append('status', options.status);\n\n return this.fetch<PaginatedResponse<Assignment>>(\n `w/${wid}/assignments${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** Get a single assignment by ID. */\n async getAssignment(wid: string, id: number): Promise<Assignment> {\n return this.fetch<Assignment>(`w/${wid}/assignments/${id}`);\n }\n\n /** Get all chat messages for an assignment. */\n async getAssignmentMessages(wid: string, id: number): Promise<ChatMessage[]> {\n return this.fetch<ChatMessage[]>(`w/${wid}/assignments/${id}/messages`);\n }\n\n /** Update an assignment by ID. */\n async updateAssignment(\n wid: string,\n id: number,\n assignment: UpdateAssignmentFormData\n ): Promise<Assignment> {\n return this.fetch<Assignment>(`w/${wid}/assignments/${id}`, {\n method: 'PUT',\n body: JSON.stringify(assignment),\n });\n }\n\n /** Delete an assignment by ID. */\n async deleteAssignment(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/assignments/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Get a specific task within an assignment. */\n async getAssignmentTask(\n wid: string,\n id: number,\n assignmentTaskId: number\n ): Promise<AssignmentTask> {\n return this.fetch<AssignmentTask>(`w/${wid}/assignments/${id}/tasks/${assignmentTaskId}`);\n }\n\n /** Set the current active task for an assignment. */\n async selectCurrentAssignmentTask(\n wid: string,\n id: number,\n assignmentTaskId: number\n ): Promise<void> {\n return this.fetch(`w/${wid}/assignments/${id}/tasks/${assignmentTaskId}/select`, {\n method: 'PUT',\n });\n }\n\n /** Create a new assignment for a member. */\n async createAssignment(wid: string, data: CreateAssignmentFormData): Promise<Assignment> {\n return this.fetch<Assignment>(`w/${wid}/assignments`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Get the current task detail for an assignment from the operator perspective. */\n async getAssignmentTaskDetail(\n wid: string,\n assignmentId: number\n ): Promise<OperatorTaskDetailResponse> {\n return this.fetch<OperatorTaskDetailResponse>(\n `w/${wid}/assignments/${assignmentId}/current-task-detail`\n );\n }\n\n /** Get the CEL expression evaluation context for an assignment. */\n async getAssignmentCelContext(\n wid: string,\n assignmentId: number\n ): Promise<Record<string, unknown>> {\n return this.fetch<Record<string, unknown>>(\n `w/${wid}/assignments/${assignmentId}/cel-context`\n );\n }\n\n /** Cancel an active assignment with an optional reason. */\n async cancelAssignment(\n wid: string,\n id: number,\n data?: { reason?: string }\n ): Promise<Assignment> {\n return this.fetch<Assignment>(`w/${wid}/assignments/${id}/cancel`, {\n method: 'POST',\n body: JSON.stringify(data ?? {}),\n });\n }\n\n /** List available tools for an assignment. */\n async getAssignmentTools(wid: string, assignmentId: number): Promise<ToolsResponse> {\n return this.fetch<ToolsResponse>(`w/${wid}/assignments/${assignmentId}/tools`);\n }\n\n /** Execute a tool within an assignment context. */\n async executeAssignmentTool(\n wid: string,\n assignmentId: number,\n toolName: string,\n parameters: Record<string, unknown> = {}\n ): Promise<ExecuteToolResponse> {\n return this.fetch<ExecuteToolResponse>(`w/${wid}/assignments/${assignmentId}/execute-tool`, {\n method: 'POST',\n body: JSON.stringify({ toolName, parameters }),\n });\n }\n}\n","import { BaseApiClient } from './base';\n\nexport interface TTSPreviewRequest {\n voiceModel: string; // Canonical voice model ID (e.g., \"openai:voice:ash\", \"xai:voice:leo\")\n phrase?: string;\n}\n\nexport interface ThinkingSoundPreviewRequest {\n sound: string; // Sound name (e.g., \"typing\", \"strumming\")\n volume?: number | null; // Volume level (0-100). Missing or null means full volume.\n}\n\nexport class VoiceApi extends BaseApiClient {\n /** Generate a text-to-speech audio preview for a given voice model. */\n async previewTTS(wid: string, request: TTSPreviewRequest): Promise<ArrayBuffer> {\n const response = await this.fetchRaw(`w/${wid}/agents/tts-preview`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n });\n return response.arrayBuffer();\n }\n\n /** Generate a thinking sound audio preview. */\n async previewThinkingSound(\n wid: string,\n request: ThinkingSoundPreviewRequest\n ): Promise<ArrayBuffer> {\n const response = await this.fetchRaw(`w/${wid}/agents/thinking-sound-preview`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n });\n return response.arrayBuffer();\n }\n}\n","import {\n Account,\n AccountFormData,\n CreateSignupResponse,\n DomainMapping,\n VerifyCodeResponse,\n RequestMagicLinkResponse,\n ValidateMagicLinkResponse,\n} from '../types';\nimport {\n AdminAccountOrgMembership,\n SMSLoginResponse,\n TwoFactorStatus,\n TOTPSetupResponse,\n TwoFactorOperationResponse,\n RecoveryCodesResponse,\n SetupTOTPRequest,\n VerifyTOTPSetupRequest,\n SetupWebAuthnRequest,\n VerifyWebAuthnSetupRequest,\n GenerateRecoveryCodesRequest,\n UpdateTwoFactorMethodRequest,\n CredentialType,\n CredentialChangeRequestResponse,\n CredentialChangeVerifyResponse,\n PendingCredentialChange,\n CancelCredentialChangeResponse,\n CredentialChangeInviteDetails,\n CredentialChangeInviteConfirmResponse,\n SessionExchangeRequest,\n SessionExchangeResponse,\n} from '../types/account-types';\nimport { AcquisitionRequest, AcquisitionResponse } from '../types/acquisition-types';\nimport type { AccountRealtimeWsTokenResponse } from '../types/generated/account_realtime_ws_token';\nimport { BaseApiClient } from './base';\nimport { parsePhoneNumberFromString } from 'libphonenumber-js';\n\n/**\n * Sanitize phone number to E164 format for backend API calls\n * Converts user-friendly formats like \"+1 207 299 0551\" to \"+12072990551\"\n */\nfunction sanitizePhoneForBackend(phoneNumber: string): string {\n try {\n // Try parsing with explicit country first\n let parsed = parsePhoneNumberFromString(phoneNumber);\n\n // If no country code detected, try with US (+1) as default\n if (!parsed) {\n parsed = parsePhoneNumberFromString(phoneNumber, 'US');\n }\n\n if (parsed && parsed.isValid()) {\n return parsed.format('E.164');\n }\n } catch {\n // If parsing fails, return original (backend will handle validation)\n }\n\n return phoneNumber;\n}\n\nexport class AuthApi extends BaseApiClient {\n /** Get the authenticated user's account. */\n async getUserAccount(): Promise<Account> {\n return this.fetch<Account>('account');\n }\n\n /** Update the authenticated user's account information. */\n async updateUserAccount(info: AccountFormData): Promise<Account> {\n return this.fetch('account', {\n method: 'POST',\n body: JSON.stringify(info),\n });\n }\n\n /**\n * Persist the account's FIRST-touch marketing attribution (write-once).\n *\n * Called by the browser at signup completion with its resolved UTM /\n * referrer / landing-page capture. The server keeps the first write and\n * ignores later posts (`recorded: false`), so calling this again is\n * harmless. Marketing context only — never emails, phones, or free text.\n */\n async recordAcquisition(request: AcquisitionRequest): Promise<AcquisitionResponse> {\n return this.fetch<AcquisitionResponse>('account/acquisition', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** Initiate SMS login by sending a verification code to the given phone number. */\n async login(\n phoneNumber: string,\n wid?: string,\n organizationUuid?: string,\n isSignUp = false\n ): Promise<SMSLoginResponse> {\n const params = new URLSearchParams();\n if (wid) params.append('wid', wid);\n const body: any = { phoneNumber: sanitizePhoneForBackend(phoneNumber) };\n if (organizationUuid) body.organizationUuid = organizationUuid;\n if (isSignUp) body.isSignUp = true;\n return await this.fetch<SMSLoginResponse>(`auth/login?${params.toString()}`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n /** Resend the SMS verification code to the given phone number. */\n async resendCode(\n phoneNumber: string,\n organizationUuid?: string,\n isSignUp = false\n ): Promise<SMSLoginResponse> {\n const body: any = { phoneNumber: sanitizePhoneForBackend(phoneNumber) };\n if (organizationUuid) body.organizationUuid = organizationUuid;\n if (isSignUp) body.isSignUp = true;\n return await this.fetch<SMSLoginResponse>('auth/resend-code', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n /** Verify an SMS code and complete authentication, handling 2FA if required. */\n async verifyCodeWith2FA(\n phoneNumber: string,\n code: string,\n organizationUuid?: string,\n isSignUp = false\n ): Promise<VerifyCodeResponse> {\n // Verify code with backend API then complete auth locally if no 2FA required\n const verifyResponse = await this.fetch<VerifyCodeResponse>('auth/verify-with-2fa', {\n method: 'POST',\n body: JSON.stringify({\n phoneNumber: sanitizePhoneForBackend(phoneNumber),\n code,\n organizationUuid,\n isSignUp,\n }),\n });\n\n // If 2FA is not required, set the auth cookies using the local complete endpoint\n if (!verifyResponse.requiresTwoFactor && verifyResponse.token) {\n const completeResponse = await fetch(`/api/auth/complete`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n token: verifyResponse.token,\n orgUuid: organizationUuid, // Pass org UUID for per-org cookie\n }),\n });\n\n if (!completeResponse.ok) {\n const output = await completeResponse.text();\n console.error(`Error completing auth: ${output}`);\n throw new Error('Failed to complete authentication');\n }\n }\n\n return verifyResponse;\n }\n\n /** Log in with email and password credentials. */\n async emailPasswordLogin(\n email: string,\n password: string,\n organizationUuid?: string\n ): Promise<VerifyCodeResponse> {\n return await this.fetch<VerifyCodeResponse>(`auth/email-password-login`, {\n method: 'POST',\n body: JSON.stringify({ email, password, organizationUuid }),\n });\n }\n\n /** Sign up a new account with email and password. */\n async emailPasswordSignup(\n email: string,\n password: string,\n name?: string,\n organizationUuid?: string\n ): Promise<VerifyCodeResponse> {\n return await this.fetch<VerifyCodeResponse>(`auth/email-password-signup`, {\n method: 'POST',\n body: JSON.stringify({ email, password, name, organizationUuid }),\n });\n }\n\n /** Change the current account password by providing the existing password. */\n async changePassword(\n currentPassword: string,\n newPassword: string\n ): Promise<{ success: boolean; message: string }> {\n return await this.fetch<{ success: boolean; message: string }>(`auth/change-password`, {\n method: 'POST',\n body: JSON.stringify({ currentPassword, newPassword }),\n });\n }\n\n /** Set a password for an account that does not yet have one. */\n async setPassword(newPassword: string): Promise<{ success: boolean; message: string }> {\n return await this.fetch<{ success: boolean; message: string }>(`auth/set-password`, {\n method: 'POST',\n body: JSON.stringify({ newPassword }),\n });\n }\n\n /** Check whether the current account has a password set. */\n async getPasswordStatus(): Promise<{ hasPassword: boolean }> {\n return await this.fetch<{ hasPassword: boolean }>(`auth/password-status`);\n }\n\n /** Log out the current session by clearing auth cookies. */\n async logout(): Promise<{ success: boolean }> {\n // this is fetched locally in order to clear the cookie\n const response = await fetch(`/api/auth/logout`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!response.ok) {\n throw new Error('Failed to logout');\n }\n\n return await response.json();\n }\n\n /** Request a cross-domain authentication token for single sign-on across domains. */\n async requestCrossDomainToken(): Promise<{ token: string }> {\n return this.fetch<{ token: string }>('auth/cross-domain-token', {\n method: 'POST',\n });\n }\n\n /** Exchange a cross-domain token for an authenticated session token. */\n async exchangeToken(token: string): Promise<{ token: string }> {\n return this.fetch<{ token: string }>('auth/exchange-token', {\n method: 'POST',\n body: JSON.stringify({ token }),\n });\n }\n\n /** Exchange a global Account login for an opaque org-scoped session handle. */\n async exchangeSession(request: SessionExchangeRequest): Promise<SessionExchangeResponse> {\n return this.fetch<SessionExchangeResponse>('auth/session-exchange', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Mint a single-use, account-bound realtime login token (`gr_wst_`) with\n * this client's credential. Call once per realtime connect attempt; the\n * token is spent on first use and expires in seconds. Only the full browser\n * session may mint one — an API key is refused.\n */\n async createRealtimeLoginToken(): Promise<AccountRealtimeWsTokenResponse> {\n return this.fetch<AccountRealtimeWsTokenResponse>('auth/realtime/ws-token', {\n method: 'POST',\n // The route requires a JSON body (its CSRF barrier); it reads nothing from it.\n body: JSON.stringify({}),\n });\n }\n\n /** Get the organization and workspace mapping for a custom domain. */\n async getDomainMapping(customDomain: string): Promise<DomainMapping> {\n return this.fetch<DomainMapping>(`s/mapping/${customDomain}`);\n }\n\n /** Create a new signup with member and data records for a workspace. */\n async createSignup(\n wid: string,\n data: {\n member?: {\n email?: string;\n phone?: string;\n role?: string;\n name?: string;\n description?: string;\n tosAccepted?: boolean;\n };\n data?: Record<\n string,\n {\n externalId?: string;\n values: Record<string, any>;\n }\n >;\n origin?: string;\n }\n ): Promise<CreateSignupResponse> {\n return this.fetch<CreateSignupResponse>(`w/${wid}/create-signup`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n // ===== MAGIC LINK AUTHENTICATION METHODS =====\n\n /** Request a magic link to be sent to the given email address for passwordless login. */\n async requestMagicLink(\n email: string,\n organizationUuid?: string,\n redirectUrl?: string\n ): Promise<RequestMagicLinkResponse> {\n return await this.fetch<RequestMagicLinkResponse>(`auth/request-magic-link`, {\n method: 'POST',\n body: JSON.stringify({ email, organizationUuid, redirectUrl }),\n });\n }\n\n /** Validate a magic link token to complete authentication. */\n async validateMagicLink(token: string): Promise<ValidateMagicLinkResponse> {\n return await this.fetch<ValidateMagicLinkResponse>(`auth/validate-magic-link`, {\n method: 'POST',\n body: JSON.stringify({ token }),\n });\n }\n\n // ===== EMAIL VERIFICATION METHODS =====\n\n /** Send a verification code to the given email address for login. */\n async sendEmailVerification(\n email: string,\n organizationUuid?: string\n ): Promise<SMSLoginResponse> {\n return await this.fetch<SMSLoginResponse>(`auth/send-email-verification`, {\n method: 'POST',\n body: JSON.stringify({ email, organizationUuid }),\n });\n }\n\n /** Verify an email code and complete authentication, handling 2FA if required. */\n async verifyEmail(\n email: string,\n code: string,\n organizationUuid?: string\n ): Promise<VerifyCodeResponse> {\n // Verify email with backend API then complete auth locally if no 2FA required\n const verifyResponse = await this.fetch<VerifyCodeResponse>(`auth/verify-email`, {\n method: 'POST',\n body: JSON.stringify({ email, code, organizationUuid }),\n });\n\n // If 2FA is not required, set the auth cookies using the local complete endpoint\n if (!verifyResponse.requiresTwoFactor && verifyResponse.token) {\n const completeResponse = await fetch(`/api/auth/complete`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n token: verifyResponse.token,\n orgUuid: organizationUuid, // Pass org UUID for per-org cookie\n }),\n });\n\n if (!completeResponse.ok) {\n throw new Error('Failed to complete authentication');\n }\n }\n\n return verifyResponse;\n }\n\n // ===== TWO-FACTOR AUTHENTICATION METHODS =====\n\n /** Get the current two-factor authentication status and configured methods. */\n async getTwoFactorStatus(): Promise<TwoFactorStatus> {\n return this.fetch<TwoFactorStatus>('auth/2fa/status');\n }\n\n /** Initiate TOTP two-factor setup and receive the secret and QR code URI. */\n async setupTOTP(data: SetupTOTPRequest): Promise<TOTPSetupResponse> {\n return this.fetch<TOTPSetupResponse>('auth/2fa/totp/setup', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Verify a TOTP code to complete two-factor setup. */\n async verifyTOTPSetup(data: VerifyTOTPSetupRequest): Promise<TwoFactorOperationResponse> {\n return this.fetch<TwoFactorOperationResponse>('auth/2fa/totp/verify', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Initiate WebAuthn (passkey/security key) two-factor setup. */\n async setupWebAuthn(data: SetupWebAuthnRequest): Promise<any> {\n return this.fetch<any>('auth/2fa/webauthn/setup', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Verify a WebAuthn assertion to complete two-factor setup. */\n async verifyWebAuthnSetup(\n data: VerifyWebAuthnSetupRequest\n ): Promise<TwoFactorOperationResponse> {\n return this.fetch<TwoFactorOperationResponse>('auth/2fa/webauthn/verify', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Generate new two-factor recovery codes, invalidating any existing ones. */\n async generateRecoveryCodes(\n data: GenerateRecoveryCodesRequest = {}\n ): Promise<RecoveryCodesResponse> {\n return this.fetch<RecoveryCodesResponse>('auth/2fa/recovery-codes/generate', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Disable a specific two-factor authentication method. */\n async disableTwoFactorMethod(methodId: number): Promise<TwoFactorOperationResponse> {\n return this.fetch<TwoFactorOperationResponse>(`auth/2fa/methods/${methodId}`, {\n method: 'DELETE',\n });\n }\n\n /** Update settings for a two-factor authentication method. */\n async updateTwoFactorMethod(\n data: UpdateTwoFactorMethodRequest\n ): Promise<TwoFactorOperationResponse> {\n return this.fetch<TwoFactorOperationResponse>(`auth/2fa/methods/${data.methodId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n // ===== TWO-FACTOR AUTHENTICATION LOGIN METHODS =====\n\n /** Verify a TOTP code during login to complete two-factor authentication. */\n async verifyTOTPAuth(\n tempToken: string,\n code: string\n ): Promise<{ token: string; accountId: number; accountUuid: string }> {\n return this.fetch<{ token: string; accountId: number; accountUuid: string }>(\n 'auth/2fa/auth/totp',\n {\n method: 'POST',\n body: JSON.stringify({\n temp_token: tempToken,\n code,\n }),\n }\n );\n }\n\n /** Verify a recovery code during login to complete two-factor authentication. */\n async verifyRecoveryCodeAuth(\n tempToken: string,\n code: string\n ): Promise<{ token: string; accountId: number; accountUuid: string }> {\n return this.fetch<{ token: string; accountId: number; accountUuid: string }>(\n 'auth/2fa/auth/recovery',\n {\n method: 'POST',\n body: JSON.stringify({\n temp_token: tempToken,\n code,\n }),\n }\n );\n }\n\n /** Get WebAuthn credential request options for two-factor login verification. */\n async getWebAuthnAuthOptions(tempToken: string): Promise<{\n credentialRequestOptions: {\n challenge: string;\n timeout: number;\n rpId: string;\n allowCredentials: Array<{ id: string; type: string }>;\n userVerification: string;\n };\n }> {\n return this.fetch<{\n credentialRequestOptions: {\n challenge: string;\n timeout: number;\n rpId: string;\n allowCredentials: Array<{ id: string; type: string }>;\n userVerification: string;\n };\n }>('auth/2fa/webauthn/options', {\n method: 'POST',\n body: JSON.stringify({\n temp_token: tempToken,\n }),\n });\n }\n\n /** Verify a WebAuthn assertion during login to complete two-factor authentication. */\n async verifyWebAuthnAuth(\n tempToken: string,\n assertionResponse: any\n ): Promise<{ token: string; accountId: number; accountUuid: string }> {\n return this.fetch<{ token: string; accountId: number; accountUuid: string }>(\n 'auth/2fa/webauthn',\n {\n method: 'POST',\n body: JSON.stringify({\n temp_token: tempToken,\n assertion_response: assertionResponse,\n }),\n }\n );\n }\n\n // ===== ORGANIZATION MEMBERSHIP METHODS =====\n\n /** List all organizations the current account belongs to. */\n async getMyOrganizations(): Promise<AdminAccountOrgMembership[]> {\n return this.fetch<AdminAccountOrgMembership[]>('o/mine');\n }\n\n // ===== CREDENTIAL CHANGE METHODS =====\n\n /**\n * Request to change email or phone credential.\n * Sends an OTP to the NEW credential to verify ownership. For phone, the\n * code can be delivered by SMS (default) or read aloud over a voice call\n * (`deliveryMethod: 'voice'`) so landlines can be verified too.\n */\n async requestCredentialChange(\n credentialType: CredentialType,\n newValue: string,\n deliveryMethod: 'sms' | 'voice' = 'sms'\n ): Promise<CredentialChangeRequestResponse> {\n return this.fetch<CredentialChangeRequestResponse>('account/request-credential-change', {\n method: 'POST',\n body: JSON.stringify({\n credential_type: credentialType,\n new_value: newValue,\n delivery_method: deliveryMethod,\n }),\n });\n }\n\n /**\n * Verify a credential change request with OTP code.\n * On success, applies the credential change to the account.\n */\n async verifyCredentialChange(\n requestId: number,\n otpCode: string\n ): Promise<CredentialChangeVerifyResponse> {\n return this.fetch<CredentialChangeVerifyResponse>('account/verify-credential-change', {\n method: 'POST',\n body: JSON.stringify({\n request_id: requestId,\n otp_code: otpCode,\n }),\n });\n }\n\n /**\n * Get all pending (non-applied) credential change requests.\n */\n async getPendingCredentialChanges(): Promise<PendingCredentialChange[]> {\n return this.fetch<PendingCredentialChange[]>('account/pending-credential-changes');\n }\n\n /**\n * Cancel a pending credential change request.\n */\n async cancelCredentialChange(requestId: number): Promise<CancelCredentialChangeResponse> {\n return this.fetch<CancelCredentialChangeResponse>(\n `account/cancel-credential-change/${requestId}`,\n { method: 'DELETE' }\n );\n }\n\n // ===== CREDENTIAL CHANGE INVITE METHODS =====\n\n /**\n * Get details of a credential change invitation.\n * The user must be logged in and be the target of the invitation.\n */\n async getCredentialChangeInviteDetails(token: string): Promise<CredentialChangeInviteDetails> {\n return this.fetch<CredentialChangeInviteDetails>(`account/credential-change-invite/${token}`);\n }\n\n /**\n * Confirm a credential change invitation.\n * The user must be logged in and be the target of the invitation.\n */\n async confirmCredentialChangeInvite(\n token: string\n ): Promise<CredentialChangeInviteConfirmResponse> {\n return this.fetch<CredentialChangeInviteConfirmResponse>(\n `account/credential-change-invite/${token}/confirm`,\n { method: 'POST' }\n );\n }\n\n /** Get current consent state for the authenticated account. */\n async getConsentState(): Promise<ConsentStateResponse> {\n return this.fetch<ConsentStateResponse>('account/consent');\n }\n\n /** Record consent decisions (batch). */\n async updateConsent(\n consents: Array<{ consent_type: string; granted: boolean; policy_version?: string }>\n ): Promise<ConsentStateResponse> {\n return this.fetch<ConsentStateResponse>('account/consent', {\n method: 'POST',\n body: JSON.stringify({ consents }),\n });\n }\n}\n\nexport interface ConsentStateItem {\n consent_type: string;\n granted: boolean;\n updated_at: string;\n policy_version: string | null;\n}\n\nexport interface ConsentStateResponse {\n consents: ConsentStateItem[];\n}\n","import type { AppListResponse } from '../types/app-types';\nimport type {\n Builder,\n BuilderListResponse,\n CreateBuilderRequest,\n UpdateBuilderRequest,\n} from '../types/builder-types';\nimport { BaseApiClient } from './base';\n\n/**\n * Builders API client\n */\nexport class BuildersApi extends BaseApiClient {\n /**\n * List all builders (optionally all with superuser access)\n */\n async listBuilders(all?: boolean): Promise<BuilderListResponse> {\n const params = new URLSearchParams();\n if (all !== undefined) params.append('all', String(all));\n\n const queryString = params.toString();\n const url = `builders${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<BuilderListResponse>(url);\n }\n\n /**\n * Get a specific builder by UUID\n */\n async getBuilder(builderId: string): Promise<Builder> {\n return this.fetch<Builder>(`builders/${builderId}`);\n }\n\n /**\n * Create a new builder\n */\n async createBuilder(request: CreateBuilderRequest): Promise<Builder> {\n return this.fetch<Builder>('builders', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Update an existing builder\n */\n async updateBuilder(builderId: string, request: UpdateBuilderRequest): Promise<Builder> {\n return this.fetch<Builder>(`builders/${builderId}`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Delete a builder\n */\n async deleteBuilder(builderId: string): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`builders/${builderId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Get apps for a specific builder\n */\n async getBuilderApps(builderId: string): Promise<AppListResponse> {\n return this.fetch<AppListResponse>(`builders/${builderId}/apps`);\n }\n}\n","import type {\n AvailabilityCheck,\n AvailabilityResponse,\n AvailableSlotsRequest,\n AvailableSlotsResponse,\n Calendar,\n CalendarEvent,\n CalendarEventFormData,\n CalendarEventType,\n CalendarEventTypeFormData,\n CalendarEventsQueryParams,\n CalendarFormData,\n CalendarSchedule,\n CalendarScheduleFormData,\n GoogleCalendarInfo,\n GoogleCalendarInsufficientScopesResponse,\n GoogleCalendarStatusResponse,\n ICalFeedTokenResponse,\n ICalFeedUrlResponse,\n LinkCalendarRequest,\n LinkCalendarResponse,\n PaginatedResponse,\n SyncCalendarResponse,\n UnlinkCalendarResponse,\n UpdateAttendeeRequest,\n} from '../types';\nimport { BaseApiClient } from './base';\n\nexport class CalendarsApi extends BaseApiClient {\n /** List calendars in a workspace with optional pagination. */\n async getCalendars(\n wid: string,\n params?: { page?: number; pageSize?: number; includeSchedules?: boolean }\n ): Promise<PaginatedResponse<Calendar>> {\n const queryParams = new URLSearchParams();\n if (params?.page) queryParams.append('page', params.page.toString());\n if (params?.pageSize) queryParams.append('pageSize', params.pageSize.toString());\n if (params?.includeSchedules) queryParams.append('includeSchedules', 'true');\n\n const queryString = queryParams.toString();\n return this.fetch<PaginatedResponse<Calendar>>(\n `w/${wid}/calendars${queryString ? `?${queryString}` : ''}`\n );\n }\n\n /** Get a single calendar by ID, optionally including its schedules. */\n async getCalendar(wid: string, id: number, includeSchedules?: boolean): Promise<Calendar> {\n const params = new URLSearchParams();\n if (includeSchedules) params.append('include_schedules', 'true');\n return this.fetch<Calendar>(\n `w/${wid}/calendars/${id}${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** Create a new calendar in the workspace. */\n async createCalendar(wid: string, calendar: CalendarFormData): Promise<Calendar> {\n return this.fetch<Calendar>(`w/${wid}/calendars`, {\n method: 'POST',\n body: JSON.stringify(calendar),\n });\n }\n\n /** Update a calendar's configuration. */\n async updateCalendar(\n wid: string,\n id: number,\n calendar: Partial<CalendarFormData>\n ): Promise<Calendar> {\n return this.fetch<Calendar>(`w/${wid}/calendars/${id}`, {\n method: 'PUT',\n body: JSON.stringify(calendar),\n });\n }\n\n /** Delete a calendar by ID. */\n async deleteCalendar(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/calendars/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** List all schedules for a calendar. */\n async getCalendarSchedules(wid: string, calendarId: number): Promise<CalendarSchedule[]> {\n return this.fetch<CalendarSchedule[]>(`w/${wid}/calendars/${calendarId}/schedules`);\n }\n\n /** Create a new schedule for a calendar. */\n async createCalendarSchedule(\n wid: string,\n calendarId: number,\n schedule: CalendarScheduleFormData\n ): Promise<CalendarSchedule> {\n return this.fetch<CalendarSchedule>(`w/${wid}/calendars/${calendarId}/schedules`, {\n method: 'POST',\n body: JSON.stringify(schedule),\n });\n }\n\n /** Update an existing calendar schedule. */\n async updateCalendarSchedule(\n wid: string,\n calendarId: number,\n scheduleId: number,\n schedule: Partial<CalendarScheduleFormData>\n ): Promise<CalendarSchedule> {\n return this.fetch<CalendarSchedule>(\n `w/${wid}/calendars/${calendarId}/schedules/${scheduleId}`,\n {\n method: 'PUT',\n body: JSON.stringify(schedule),\n }\n );\n }\n\n /** Delete a calendar schedule. */\n async deleteCalendarSchedule(\n wid: string,\n calendarId: number,\n scheduleId: number\n ): Promise<void> {\n return this.fetch(`w/${wid}/calendars/${calendarId}/schedules/${scheduleId}`, {\n method: 'DELETE',\n });\n }\n\n /** Check availability for a time range on a calendar. */\n async checkAvailability(\n wid: string,\n calendarId: number,\n check: AvailabilityCheck\n ): Promise<AvailabilityResponse> {\n return this.fetch<AvailabilityResponse>(`w/${wid}/calendars/${calendarId}/availability`, {\n method: 'POST',\n body: JSON.stringify(check),\n });\n }\n\n /** Get available booking slots for a calendar within a date range. */\n async getAvailableSlots(\n wid: string,\n calendarId: number,\n request: AvailableSlotsRequest\n ): Promise<AvailableSlotsResponse> {\n return this.fetch<AvailableSlotsResponse>(\n `w/${wid}/calendars/${calendarId}/available-slots`,\n {\n method: 'POST',\n body: JSON.stringify(request),\n }\n );\n }\n\n /** List calendar events with optional filtering by date range, status, and member. */\n async getCalendarEvents(\n wid: string,\n options: CalendarEventsQueryParams = {}\n ): Promise<PaginatedResponse<CalendarEvent>> {\n const params = new URLSearchParams();\n if (options.calendarId) params.append('calendarId', options.calendarId.toString());\n if (options.startDate) params.append('startDate', options.startDate);\n if (options.endDate) params.append('endDate', options.endDate);\n if (options.status) params.append('status', options.status);\n if (options.memberId) params.append('memberId', options.memberId.toString());\n if (options.limit) params.append('limit', options.limit.toString());\n if (options.offset) params.append('offset', options.offset.toString());\n\n return this.fetch<PaginatedResponse<CalendarEvent>>(\n `w/${wid}/calendar-events${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** Get a single calendar event by ID. */\n async getCalendarEvent(wid: string, eventId: number): Promise<CalendarEvent> {\n return this.fetch<CalendarEvent>(`w/${wid}/calendar-events/${eventId}`);\n }\n\n /** Create a new calendar event. */\n async createCalendarEvent(wid: string, event: CalendarEventFormData): Promise<CalendarEvent> {\n return this.fetch<CalendarEvent>(`w/${wid}/calendar-events`, {\n method: 'POST',\n body: JSON.stringify(event),\n });\n }\n\n /** Update an existing calendar event. */\n async updateCalendarEvent(\n wid: string,\n eventId: number,\n event: Partial<CalendarEventFormData>\n ): Promise<CalendarEvent> {\n return this.fetch<CalendarEvent>(`w/${wid}/calendar-events/${eventId}`, {\n method: 'PUT',\n body: JSON.stringify(event),\n });\n }\n\n /** Cancel a calendar event with an optional reason. */\n async cancelCalendarEvent(\n wid: string,\n eventId: number,\n reason?: string\n ): Promise<CalendarEvent> {\n return this.fetch<CalendarEvent>(`w/${wid}/calendar-events/${eventId}/cancel`, {\n method: 'POST',\n body: JSON.stringify({ cancellationReason: reason }),\n });\n }\n\n /** Delete a calendar event by ID. */\n async deleteCalendarEvent(wid: string, eventId: number): Promise<void> {\n return this.fetch(`w/${wid}/calendar-events/${eventId}`, {\n method: 'DELETE',\n });\n }\n\n /** Update an attendee's details on a calendar event. */\n async updateEventAttendee(\n wid: string,\n eventId: number,\n attendeeId: number,\n update: UpdateAttendeeRequest\n ): Promise<void> {\n return this.fetch(`w/${wid}/calendar-events/${eventId}/attendees/${attendeeId}`, {\n method: 'PUT',\n body: JSON.stringify(update),\n });\n }\n\n /** List all calendar event types in the workspace. */\n async getEventTypes(\n wid: string,\n options?: { page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<CalendarEventType>> {\n const params = new URLSearchParams();\n if (options?.page !== undefined) params.set('page', String(options.page));\n if (options?.pageSize !== undefined) params.set('pageSize', String(options.pageSize));\n const query = params.size ? `?${params}` : '';\n return this.fetch<PaginatedResponse<CalendarEventType>>(\n `w/${wid}/calendar-event-types${query}`\n );\n }\n\n /** Get a single calendar event type by ID. */\n async getEventType(wid: string, id: number): Promise<CalendarEventType> {\n return this.fetch<CalendarEventType>(`w/${wid}/calendar-event-types/${id}`);\n }\n\n /** Create a new calendar event type. */\n async createEventType(\n wid: string,\n eventType: CalendarEventTypeFormData\n ): Promise<CalendarEventType> {\n return this.fetch<CalendarEventType>(`w/${wid}/calendar-event-types`, {\n method: 'POST',\n body: JSON.stringify(eventType),\n });\n }\n\n /** Update an existing calendar event type. */\n async updateEventType(\n wid: string,\n id: number,\n eventType: Partial<CalendarEventTypeFormData>\n ): Promise<CalendarEventType> {\n return this.fetch<CalendarEventType>(`w/${wid}/calendar-event-types/${id}`, {\n method: 'PUT',\n body: JSON.stringify(eventType),\n });\n }\n\n /** Delete a calendar event type by ID. */\n async deleteEventType(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/calendar-event-types/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Generate or regenerate an iCal feed token for a calendar. */\n async generateICalToken(\n wid: string,\n calendarId: number,\n regenerate: boolean = false\n ): Promise<ICalFeedTokenResponse> {\n // Route reads regenerate (and field-inclusion flags) as query params,\n // not JSON body. A body payload is ignored and silently no-ops regenerate.\n const qs = new URLSearchParams();\n qs.set('regenerate', regenerate ? 'true' : 'false');\n return this.fetch<ICalFeedTokenResponse>(\n `w/${wid}/calendars/${calendarId}/ical-token?${qs.toString()}`,\n { method: 'POST' }\n );\n }\n\n /** Revoke the iCal feed token for a calendar, disabling external feed access. */\n async revokeICalToken(\n wid: string,\n calendarId: number\n ): Promise<{ success: boolean; message: string }> {\n return this.fetch<{ success: boolean; message: string }>(\n `w/${wid}/calendars/${calendarId}/ical-token`,\n {\n method: 'DELETE',\n }\n );\n }\n\n /** Get the iCal feed URL for a calendar. */\n async getICalFeedUrl(wid: string, calendarId: number): Promise<ICalFeedUrlResponse> {\n return this.fetch<ICalFeedUrlResponse>(`w/${wid}/calendars/${calendarId}/ical-url`);\n }\n\n /** List Google Calendars available for linking. */\n async listGoogleCalendars(wid: string): Promise<GoogleCalendarInfo[]> {\n return this.fetch<GoogleCalendarInfo[]>(`w/${wid}/calendars/google/list`);\n }\n\n /** Get the Google Calendar integration status for the workspace. */\n async getGoogleCalendarStatus(\n wid: string\n ): Promise<GoogleCalendarStatusResponse | GoogleCalendarInsufficientScopesResponse> {\n return this.fetch<GoogleCalendarStatusResponse | GoogleCalendarInsufficientScopesResponse>(\n `w/${wid}/calendars/google/status`\n );\n }\n\n /** Link a calendar to a Google Calendar for two-way sync. */\n async linkCalendarToGoogle(\n wid: string,\n calendarId: number,\n request: LinkCalendarRequest\n ): Promise<LinkCalendarResponse> {\n return this.fetch<LinkCalendarResponse>(`w/${wid}/calendars/${calendarId}/google/link`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** Unlink a calendar from its connected Google Calendar. */\n async unlinkCalendarFromGoogle(\n wid: string,\n calendarId: number\n ): Promise<UnlinkCalendarResponse> {\n return this.fetch<UnlinkCalendarResponse>(`w/${wid}/calendars/${calendarId}/google/link`, {\n method: 'DELETE',\n });\n }\n\n /** Trigger a manual sync between a calendar and its linked Google Calendar. */\n async syncCalendarWithGoogle(wid: string, calendarId: number): Promise<SyncCalendarResponse> {\n return this.fetch<SyncCalendarResponse>(`w/${wid}/calendars/${calendarId}/google/sync`, {\n method: 'POST',\n });\n }\n}\n","import {\n CallRecordingDownloadUrlResponse,\n MessageTimingResponse,\n PaginatedResponse,\n PhoneCall,\n RecordingInfoResponse,\n RecordingListResponse,\n} from '../types';\nimport { BaseApiClient } from './base';\n\nexport class CallsApi extends BaseApiClient {\n /** List workspace phone calls with optional filtering. */\n async getPhoneCalls(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n phoneNumberId?: number | string;\n chatId?: number;\n workflowId?: number;\n status?: string;\n inbound?: boolean;\n dateFrom?: string;\n dateTo?: string;\n } = {}\n ): Promise<PaginatedResponse<PhoneCall>> {\n const params = new URLSearchParams();\n if (options.page) params.set('page', String(options.page));\n if (options.pageSize) params.set('pageSize', String(options.pageSize));\n if (options.phoneNumberId !== undefined)\n params.set('phoneNumberId', String(options.phoneNumberId));\n if (options.chatId !== undefined) params.set('chatId', String(options.chatId));\n if (options.workflowId !== undefined) params.set('workflowId', String(options.workflowId));\n if (options.status) params.set('status', options.status);\n if (options.inbound !== undefined) params.set('inbound', String(options.inbound));\n if (options.dateFrom) params.set('dateFrom', options.dateFrom);\n if (options.dateTo) params.set('dateTo', options.dateTo);\n\n return this.fetch<PaginatedResponse<PhoneCall>>(\n `w/${wid}/calls${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** Get message timing data for a chat recording. */\n async getMessageTiming(wid: string, chatId: number): Promise<MessageTimingResponse> {\n return this.fetch<MessageTimingResponse>(`w/${wid}/recordings/chat/${chatId}/message-timing`);\n }\n\n /**\n * Get PHI-safe provenance metadata for the recording served by\n * `/audio.wav` — source, encryption, channels, duration, status, etc.\n * Staff-only Twilio SIDs are present only for superusers. Returns 404\n * when the chat has no native recording row (legacy chunk-only playback).\n */\n async getRecordingInfo(wid: string, chatId: number): Promise<RecordingInfoResponse> {\n return this.fetch<RecordingInfoResponse>(`w/${wid}/recordings/chat/${chatId}/info`);\n }\n\n /** List the recorded audio chunks for a chat (metadata only). */\n async listChatRecordings(\n wid: string,\n chatId: number,\n options: { role?: 'assistant' | 'member' } = {}\n ): Promise<RecordingListResponse> {\n const params = new URLSearchParams();\n if (options.role) params.set('role', options.role);\n return this.fetch<RecordingListResponse>(\n `w/${wid}/recordings/chat/${chatId}${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /**\n * Get a single short-lived presigned URL to download the complete call\n * recording as one WAV file. The first request assembles + caches the\n * full-call WAV; later requests reuse it.\n */\n async getCallRecordingDownloadUrl(\n wid: string,\n chatId: number,\n options: { expiresIn?: number } = {}\n ): Promise<CallRecordingDownloadUrlResponse> {\n const params = new URLSearchParams();\n if (options.expiresIn !== undefined) params.set('expires_in', String(options.expiresIn));\n return this.fetch<CallRecordingDownloadUrlResponse>(\n `w/${wid}/recordings/chat/${chatId}/download-url${\n params.toString() ? `?${params.toString()}` : ''\n }`\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n CELContextRequest,\n CELContextResponse,\n CELValidationRequest,\n CELValidationResponse,\n} from '../types/cel-types';\n\nexport class CELApi extends BaseApiClient {\n /**\n * Get available CEL context for expression editing.\n *\n * Returns variables, custom functions, and operators appropriate for the given context\n * (event type, data type, context type, etc.).\n */\n async getCelContext(wid: string, request: CELContextRequest): Promise<CELContextResponse> {\n return this.fetch<CELContextResponse>(`w/${wid}/cel/context`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n async validateCelExpression(\n wid: string,\n request: CELValidationRequest\n ): Promise<CELValidationResponse> {\n return this.fetch<CELValidationResponse>(`w/${wid}/cel/validate`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n}\n","import {\n Chat,\n CreateInteractionSessionRequest,\n InteractionSessionResponse,\n TransitionInteractionSessionRequest,\n ChatFilter,\n ChatFilterFormData,\n ChatFormData,\n ChatModelOverride,\n CreatePhoneVoiceOutboundChatInput,\n CurrentSmsChatResponse,\n EhrWritebackOutcomeListResponse,\n ChatLabel,\n ChatLabelFormData,\n ChatMessage,\n ManagerSkillsResponse,\n ChatTokenUsage,\n GetChatsOptions,\n OutboundCallResponse,\n PaginatedResponse,\n PhoneCall,\n ScheduledCallback,\n ScheduledCallbackListResponse,\n TodoItem,\n ToolsResponse,\n UpdateChatModelOverrideRequest,\n UpdateChatRequest,\n} from '../types';\nimport type { ChatMuteReason, ChatMuteUpdateResponse } from '../types/generated/chat';\nimport type { GetWorkflowFeedbackOptions, WorkflowFeedbackListResponse } from '../types/chat-types';\nimport type { InlineConnectLinkResponse } from '../types/ui-prompt-types';\nimport { BaseApiClient } from './base';\n\n// Live monitor/listen-in status for a chat, straight off the OpenAPI contract.\n// Surfaced here so the frontend can type `GET .../chats/{id}/monitor/status`\n// against the generated shape instead of hand-mirroring it — a hand-written\n// mirror of this response is exactly what drifted to `is_active` and silently\n// disabled the listen-in unmute button. See issue #16865.\nexport type { MonitorStatusResponse } from '../types/generated/monitor';\n\nexport interface BrowserLiveViewResponse {\n signedUrl: string;\n remoteWidth: number;\n remoteHeight: number;\n}\n\n/** Which machine resources are running for a Chat right now. */\nexport interface ChatMachineResourcesResponse {\n codeInterpreterActive: boolean;\n webBrowserActive: boolean;\n}\n\nexport class ChatsApi extends BaseApiClient {\n /**\n * Build URLSearchParams from GetChatsOptions.\n * Excludes pagination params when includePagination is false.\n */\n private buildChatsQueryParams(\n options: GetChatsOptions,\n includePagination: boolean = true\n ): URLSearchParams {\n const params = new URLSearchParams();\n\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n\n if (includePagination) {\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n }\n\n if (options.mine !== undefined) params.append('mine', options.mine.toString());\n if (options.needsResponse !== undefined)\n params.append('needsResponse', options.needsResponse.toString());\n if (options.needsResponseFirst !== undefined)\n params.append('needsResponseFirst', options.needsResponseFirst.toString());\n if (options.paused !== undefined) params.append('paused', options.paused.toString());\n if (options.archived !== undefined) params.append('archived', options.archived.toString());\n if (options.channel) params.append('channel', options.channel);\n\n if (options.chatType) params.append('chatType', options.chatType);\n if (options.memberId !== undefined) params.append('memberId', options.memberId.toString());\n if (options.assistantMemberId !== undefined)\n params.append('assistantMemberId', options.assistantMemberId.toString());\n if (options.search) params.append('search', options.search);\n if (options.isTest !== undefined) params.append('isTest', options.isTest.toString());\n if (options.isAnonymous !== undefined)\n params.append('isAnonymous', options.isAnonymous.toString());\n if (options.filters && options.filters.length > 0) {\n params.append('filters', JSON.stringify(options.filters));\n }\n if (options.query) params.append('query', JSON.stringify(options.query));\n if (options.workflowId !== undefined)\n params.append('workflowId', options.workflowId.toString());\n if (options.workflowRevisionId !== undefined)\n params.append('workflowRevisionId', options.workflowRevisionId.toString());\n if (options.createdAfter) params.append('createdAfter', options.createdAfter);\n if (options.createdBefore) params.append('createdBefore', options.createdBefore);\n\n return params;\n }\n\n /** List chats with optional filtering, sorting, and pagination. */\n async getChats(wid: string, options: GetChatsOptions = {}): Promise<PaginatedResponse<Chat>> {\n const params = this.buildChatsQueryParams(options, true);\n const queryString = params.toString();\n return this.fetch<PaginatedResponse<Chat>>(\n `w/${wid}/chats${queryString ? `?${queryString}` : ''}`\n );\n }\n\n /** Export multiple chats as a downloadable blob. */\n async exportChats(wid: string, options: GetChatsOptions = {}): Promise<Blob> {\n const params = this.buildChatsQueryParams(options, false);\n const queryString = params.toString();\n const response = await this.fetchRaw(\n `w/${wid}/chats/export${queryString ? `?${queryString}` : ''}`\n );\n return response.blob();\n }\n\n /** Export a single chat in the specified format as a downloadable blob. */\n async exportChat(wid: string, chatId: number, format: 'jsonl' = 'jsonl'): Promise<Blob> {\n const response = await this.fetchRaw(`w/${wid}/chats/${chatId}/export?format=${format}`);\n return response.blob();\n }\n\n /** Get a single chat by ID. */\n async getChat(wid: string, id: number): Promise<Chat> {\n return this.fetch<Chat>(`w/${wid}/chats/${id}`);\n }\n\n /**\n * Get a single chat by UUID.\n *\n * The uuid-addressed twin of `getChat`: same access check (own chat,\n * otherwise `chats:read`), same body; a chat the caller may not read is a\n * 404. Activity events and org webhooks name a chat by `uuid` only.\n */\n async getChatByUuid(wid: string, uuid: string): Promise<Chat> {\n return this.fetch<Chat>(`w/${wid}/chats/by-uuid/${uuid}`);\n }\n\n async saveChatBrowserStorage(wid: string, chatId: number): Promise<void> {\n await this.fetchRaw(`w/${wid}/chats/${chatId}/browser/storage/save`, {\n method: 'POST',\n keepalive: true,\n body: JSON.stringify({}),\n });\n }\n\n async clearChatBrowserStorage(wid: string, chatId: number): Promise<void> {\n await this.fetchRaw(`w/${wid}/chats/${chatId}/browser/storage`, { method: 'DELETE' });\n }\n\n /**\n * Get a short-lived, interactive AgentCore browser view for this Chat.\n *\n * The signed URL is deliberately response-local. Callers must keep it in\n * memory only and request a fresh value when reopening the view.\n */\n async getChatBrowserLiveView(\n wid: string,\n chatId: number\n ): Promise<BrowserLiveViewResponse | null> {\n const response = await this.fetchRaw(`w/${wid}/chats/${chatId}/browser/live-view`);\n if (response.status === 204) return null;\n return response.json() as Promise<BrowserLiveViewResponse>;\n }\n\n /**\n * Which machine resources this Chat is running right now.\n *\n * Infrastructure state only — no Chat content — so it is safe to poll while\n * a Chat is open.\n */\n async getChatMachineResources(\n wid: string,\n chatId: number\n ): Promise<ChatMachineResourcesResponse> {\n return this.fetch<ChatMachineResourcesResponse>(`w/${wid}/chats/${chatId}/machine-resources`);\n }\n\n /**\n * Create-chat preflight for SMS: is a conversation already live between this\n * workspace number and this member?\n *\n * An SMS conversation with a member is a single stream — inbound SMS resolves\n * to ONE current chat per (member phone, workspace phone) pair — so creating\n * a new SMS chat SUPERSEDES the existing one and the member's next reply\n * lands on the new chat. Callers use this to say so before committing.\n *\n * Read-only, `chats:read`, and PHI-safe by construction: status and timing\n * only, no message content and no chat title.\n */\n async getCurrentSmsChat(\n wid: string,\n options: { memberId: number; phoneNumberId: number }\n ): Promise<CurrentSmsChatResponse> {\n const params = new URLSearchParams({\n memberId: options.memberId.toString(),\n phoneNumberId: options.phoneNumberId.toString(),\n });\n return this.fetch<CurrentSmsChatResponse>(`w/${wid}/chats/current-sms?${params}`);\n }\n\n /** Get token usage statistics for a chat. */\n async getChatTokenUsage(wid: string, chatId: number): Promise<ChatTokenUsage> {\n return this.fetch<ChatTokenUsage>(`w/${wid}/chats/${chatId}/token-usage`);\n }\n\n /** List scheduled callbacks for a chat (newest first). */\n async getChatCallbacks(wid: string, chatId: number): Promise<ScheduledCallbackListResponse> {\n return this.fetch<ScheduledCallbackListResponse>(`w/${wid}/chats/${chatId}/callbacks`);\n }\n\n /**\n * List EHR write-back outcomes for a chat (newest first).\n *\n * Operator surface: the endpoint requires `chats:read` in addition to the\n * chat's own object authorization, so a chat owner reading their own chat\n * does not reach it. The response carries IDs and closed-vocabulary codes\n * only — no note body, summary, member fields, or provider messages.\n */\n async getChatEhrWritebackOutcomes(\n wid: string,\n chatId: number,\n options: { limit?: number; cursor?: string } = {}\n ): Promise<EhrWritebackOutcomeListResponse> {\n const params = new URLSearchParams();\n if (options.limit !== undefined) params.append('limit', options.limit.toString());\n if (options.cursor) params.append('cursor', options.cursor);\n const queryString = params.toString();\n return this.fetch<EhrWritebackOutcomeListResponse>(\n `w/${wid}/chats/${chatId}/ehr-writeback-outcomes${queryString ? `?${queryString}` : ''}`\n );\n }\n\n /** Cancel a pending scheduled callback on a chat. */\n async cancelChatCallback(\n wid: string,\n chatId: number,\n callbackId: number\n ): Promise<ScheduledCallback> {\n return this.fetch<ScheduledCallback>(\n `w/${wid}/chats/${chatId}/callbacks/${callbackId}/cancel`,\n { method: 'POST' }\n );\n }\n\n /** Get todo items extracted from a chat. */\n async getChatTodos(wid: string, chatId: number): Promise<{ todos: TodoItem[] }> {\n return this.fetch<{ todos: TodoItem[] }>(`w/${wid}/chats/${chatId}/todos`);\n }\n\n /**\n * The caller's own live inline-connect link for a chat.\n *\n * An `inline_connect` prompt (`UiPromptPresented.connect`) names the\n * connection but carries no URL; fetch it here when the member chooses to\n * connect. 404 when nothing is live for the caller in this chat.\n */\n async getInlineConnectLink(\n wid: string,\n chatId: number,\n appSlug: string\n ): Promise<InlineConnectLinkResponse> {\n return this.fetch<InlineConnectLinkResponse>(\n `w/${wid}/chats/${chatId}/inline-connect/${encodeURIComponent(appSlug)}/link`\n );\n }\n\n /** Get loaded and revealed skills for a chat. */\n async getChatSkills(\n wid: string,\n chatId: number\n ): Promise<{\n loadedSkills: string[];\n revealedSkills: string[];\n enabledToolkitTools?: string[];\n }> {\n return this.fetch<{\n loadedSkills: string[];\n revealedSkills: string[];\n enabledToolkitTools?: string[];\n }>(`w/${wid}/chats/${chatId}/skills`);\n }\n\n /** List built-in skills selectable before a Manager Chat (and on Routine manager tasks). */\n async getManagerSkills(wid: string): Promise<ManagerSkillsResponse> {\n return this.fetch<ManagerSkillsResponse>(`w/${wid}/chats/manager/skills`);\n }\n\n /** List chat IDs that need a response. */\n async getChatsNeedsResponse(wid: string): Promise<number[]> {\n return this.fetch<number[]>(`w/${wid}/chats/needs-response`);\n }\n\n /** Get daily chat creation statistics with optional filtering. */\n async getChatsDailyCreationStats(\n wid: string,\n options?: {\n archived?: boolean;\n isTest?: boolean;\n }\n ): Promise<{\n dailyStats: Array<{\n date: string;\n count: number;\n assignment?: number;\n manager?: number;\n dm?: number;\n testing?: number;\n }>;\n }> {\n const params = new URLSearchParams();\n if (options?.archived !== undefined) params.append('archived', options.archived.toString());\n if (options?.isTest !== undefined) params.append('isTest', options.isTest.toString());\n\n const queryString = params.toString();\n return this.fetch(\n `w/${wid}/chats/stats/daily-creation${queryString ? `?${queryString}` : ''}`\n );\n }\n\n /** Archive a chat. */\n async archiveChat(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/chats/${id}/archive`, {\n method: 'PUT',\n });\n }\n\n /** Unarchive a chat. */\n async unarchiveChat(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/chats/${id}/unarchive`, {\n method: 'PUT',\n });\n }\n\n /** Start an interaction within an existing Chat without changing its channel. */\n async createChatInteractionSession(\n wid: string,\n chatId: number,\n request: CreateInteractionSessionRequest\n ): Promise<InteractionSessionResponse> {\n return this.fetch<InteractionSessionResponse>(\n `w/${wid}/chats/${chatId}/interaction-sessions`,\n {\n method: 'POST',\n body: JSON.stringify(request),\n }\n );\n }\n\n /** End one mode session and append its replacement in the same Chat. */\n async transitionChatInteractionSession(\n wid: string,\n chatId: number,\n sessionId: string,\n request: TransitionInteractionSessionRequest\n ): Promise<InteractionSessionResponse> {\n return this.fetch<InteractionSessionResponse>(\n `w/${wid}/chats/${chatId}/interaction-sessions/${encodeURIComponent(sessionId)}/transition`,\n { method: 'POST', body: JSON.stringify(request) }\n );\n }\n\n /** Create a new chat. */\n async createChat(wid: string, chat: ChatFormData): Promise<Chat> {\n const { agentMemberId, ...rest } = chat;\n const payload: ChatFormData =\n agentMemberId !== undefined && rest.assistantMemberId === undefined\n ? { ...rest, assistantMemberId: agentMemberId }\n : rest;\n\n return this.fetch<Chat>(`w/${wid}/chats`, {\n method: 'POST',\n body: JSON.stringify(payload),\n });\n }\n\n /**\n * Create a workflow assignment chat on `phone-voice` and initiate an outbound call\n * to the member (same as POST /chats with channel phone-voice + send_initial_message).\n */\n async createWorkflowOutboundVoiceChat(\n wid: string,\n input: CreatePhoneVoiceOutboundChatInput\n ): Promise<Chat> {\n const { memberId, workflowId, phoneNumberId, title, chatType } = input;\n return this.createChat(wid, {\n channel: 'phone-voice',\n chatType: chatType ?? 'assignment',\n workflowId,\n phoneNumberId,\n memberId,\n title: title ?? `Outbound voice → member ${memberId}`,\n participants: [{ memberId, role: 'user' }],\n });\n }\n\n /** Delete a chat, optionally providing a reason. */\n async deleteChat(wid: string, id: number, reason?: string): Promise<void> {\n return this.fetch(`w/${wid}/chats/${id}`, {\n method: 'DELETE',\n body: reason ? JSON.stringify({ reason }) : undefined,\n });\n }\n\n /** Update a chat's properties. */\n async updateChat(wid: string, id: number, chat: UpdateChatRequest): Promise<Chat> {\n return this.fetch<Chat>(`w/${wid}/chats/${id}`, {\n method: 'PUT',\n body: JSON.stringify(chat),\n });\n }\n\n /**\n * Get per-chat model provenance for the Chat sidebar's model summary area:\n * the effective chat + realtime models, the agent's current default (the\n * reset/inherit target), and pinned/matches flags.\n */\n async getChatModelOverride(wid: string, id: number): Promise<ChatModelOverride> {\n return this.fetch<ChatModelOverride>(`w/${wid}/chats/${id}/model-override`);\n }\n\n /**\n * Pin or reset the per-chat chat/realtime model snapshot. A concrete model id\n * pins that model; an empty/null id resets it to the agent's current default.\n * Only fields present in the payload are touched.\n */\n async updateChatModelOverride(\n wid: string,\n id: number,\n override: UpdateChatModelOverrideRequest\n ): Promise<ChatModelOverride> {\n return this.fetch<ChatModelOverride>(`w/${wid}/chats/${id}/model-override`, {\n method: 'PUT',\n body: JSON.stringify(override),\n });\n }\n\n /** Update the mute status of a chat. */\n async updateChatMute(\n wid: string,\n id: number,\n muted: boolean,\n // Closed vocabulary (GRA-8353) — the backend 422s anything outside it,\n // so the type refuses to express an arbitrary reason string. Required\n // when muting; ignored by the backend when unmuting.\n muteReason?: ChatMuteReason,\n muteExpiresOnInbound?: boolean\n ): Promise<ChatMuteUpdateResponse> {\n return this.fetch<ChatMuteUpdateResponse>(`w/${wid}/chats/${id}/mute`, {\n method: 'PUT',\n body: JSON.stringify({ muted, muteReason, muteExpiresOnInbound }),\n });\n }\n\n /** Generate an AI summary for a chat, optionally updating its labels. */\n async summarizeChat(wid: string, id: number, updateLabels?: boolean): Promise<Chat> {\n const params = new URLSearchParams();\n if (updateLabels !== undefined) {\n params.append('update_labels', updateLabels.toString());\n }\n return this.fetch<Chat>(\n `w/${wid}/chats/${id}/summarize${params.toString() ? `?${params.toString()}` : ''}`,\n {\n method: 'POST',\n }\n );\n }\n\n /** List messages in a chat with optional pagination.\n * ``id`` is the numeric chat id (documented) or the chat uuid (accepted). */\n async getChatMessages(\n wid: string,\n id: number | string,\n limit?: number,\n offset?: number,\n before?: string\n ): Promise<ChatMessage[]> {\n const params = new URLSearchParams();\n if (limit) params.append('limit', limit.toString());\n if (offset) params.append('offset', offset.toString());\n if (before) params.append('before', before);\n return this.fetch<ChatMessage[]>(\n `w/${wid}/chats/${id}/messages${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** List the background-work thread hanging off a message.\n *\n * When a tool trajectory outgrows its turn it detaches and runs in the\n * background (ADR-11 / forked trajectories), writing its messages as a\n * child thread parented at the fork point. Main-history reads exclude\n * them, so this is how the \"show work\" affordance fetches them — lazily,\n * only when a message with a non-zero `childMessageCount` is expanded.\n * Returns the thread in chronological order, empty when there is none.\n *\n * `messageUuid` is the fork point's `ChatMessage.id`. */\n async getChildThreadMessages(\n wid: string,\n chatId: number | string,\n messageUuid: string,\n limit: number = 200,\n offset: number = 0\n ): Promise<ChatMessage[]> {\n const params = new URLSearchParams();\n params.append('limit', limit.toString());\n params.append('offset', offset.toString());\n return this.fetch<ChatMessage[]>(\n `w/${wid}/chats/${chatId}/messages/${messageUuid}/children?${params.toString()}`\n );\n }\n\n /** List messages associated with a specific tool call in a chat. */\n async getChatToolCallMessages(\n wid: string,\n chatId: number,\n callId: string,\n limit: number = 100,\n offset: number = 0\n ): Promise<ChatMessage[]> {\n const params = new URLSearchParams();\n params.append('limit', limit.toString());\n params.append('offset', offset.toString());\n return this.fetch<ChatMessage[]>(\n `w/${wid}/chats/${chatId}/tool-calls/${callId}/messages?${params.toString()}`\n );\n }\n\n /** Get the tools available in a chat. */\n async getChatTools(wid: string, chatId: number): Promise<ToolsResponse> {\n return this.fetch<ToolsResponse>(`w/${wid}/chats/${chatId}/tools`);\n }\n\n /** Initiate an outbound phone call from a chat. */\n async initiateOutboundCall(\n wid: string,\n chatId: number,\n phoneNumberId: number\n ): Promise<OutboundCallResponse> {\n return this.fetch(`w/${wid}/chats/${chatId}/outbound-call`, {\n method: 'POST',\n body: JSON.stringify({ phoneNumberId, chatId }),\n });\n }\n\n /** Send a message as the assistant in a chat, optionally including tool calls. */\n async sendAssistantMessage(\n wid: string,\n chatId: number | string,\n message: string,\n toolCalls?: Array<{\n type: 'function';\n id: string;\n function: {\n name: string;\n arguments: string;\n };\n }>\n ): Promise<{\n success: boolean;\n message: string;\n message_id: string;\n message_uuid: string;\n role: string;\n content: string;\n received_at: string | null;\n }> {\n return this.fetch(`w/${wid}/chats/${chatId}/send-assistant-message`, {\n method: 'POST',\n body: JSON.stringify({\n message,\n tool_calls: toolCalls,\n }),\n });\n }\n\n /**\n * List durable feedback rows for a chat (thumbs, explicit, supervisor, extracted).\n */\n async getChatFeedback(\n wid: string,\n chatId: number,\n options: GetWorkflowFeedbackOptions = {}\n ): Promise<WorkflowFeedbackListResponse> {\n const params = new URLSearchParams();\n if (options.page != null) params.set('page', String(options.page));\n if (options.pageSize != null) params.set('pageSize', String(options.pageSize));\n if (options.source) params.set('source', options.source);\n if (options.rating) params.set('rating', options.rating);\n if (options.authorKind) params.set('authorKind', options.authorKind);\n const qs = params.toString();\n return this.fetch<WorkflowFeedbackListResponse>(\n `w/${wid}/chats/${chatId}/feedback${qs ? `?${qs}` : ''}`\n );\n }\n\n /**\n * Rate a chat message by its UUID.\n * Optional ``comment`` updates free-text details on the same durable rating row.\n */\n async rateMessage(\n wid: string,\n chatId: number,\n messageUuid: string,\n rating: number,\n comment?: string | null\n ): Promise<{ status: string; detail?: string }> {\n const body: { rating: number; comment?: string | null } = { rating };\n if (comment !== undefined) {\n body.comment = comment;\n }\n return this.fetch<{ status: string; detail?: string }>(\n `w/${wid}/chats/${chatId}/messages/${messageUuid}/rate`,\n {\n method: 'POST',\n body: JSON.stringify(body),\n }\n );\n }\n\n /**\n * Find or create a DM chat with a specific member.\n * Returns the Chat object for the DM conversation.\n */\n async findOrCreateDMChat(wid: string, memberId: number): Promise<Chat> {\n return this.fetch<Chat>(`w/${wid}/chats/dm`, {\n method: 'POST',\n body: JSON.stringify({ memberId }),\n });\n }\n\n /**\n * Send a user message in a chat (works for DM and regular chats).\n */\n async sendChatMessage(wid: string, chatId: number, content: string): Promise<ChatMessage> {\n return this.fetch<ChatMessage>(`w/${wid}/chats/${chatId}/messages`, {\n method: 'POST',\n body: JSON.stringify({ content }),\n });\n }\n\n /** Get assignment tasks linked to a chat. */\n async getChatAssignmentTasks(\n wid: string,\n chatId: number\n ): Promise<\n Array<{\n id: number;\n name: string;\n isCurrent: boolean;\n }>\n > {\n return this.fetch(`w/${wid}/chats/${chatId}/assignment-tasks`);\n }\n\n /** Create a chat completion using the OpenAI-compatible API (used by eval scripts). */\n async createChatCompletion(\n wid: string,\n chatId: number,\n data: {\n model?: string;\n // Optional ``id`` on each message lets the backend use the latest\n // user message's ID as the per-turn discriminator for the Temporal\n // inference workflow. Same-id retries attach to the same workflow\n // (idempotent reload); distinct ids start distinct runs even when\n // the prior turn's tail is still finalizing.\n messages: Array<{ role: string; content: string; id?: string }>;\n }\n ): Promise<{\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: {\n role: string;\n content: string;\n };\n finish_reason: string;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n }> {\n return this.fetch(`w/${wid}/web-chat/${chatId}/chat/completions?stream=false`, {\n method: 'POST',\n body: JSON.stringify({\n model: data.model || 'gpt-4',\n messages: data.messages,\n }),\n });\n }\n\n /** List all chat labels in a workspace. */\n async getChatLabels(wid: string): Promise<ChatLabel[]> {\n return this.fetch<ChatLabel[]>(`w/${wid}/chat-labels`);\n }\n\n /** Get a chat label by ID. */\n async getChatLabel(wid: string, id: number): Promise<ChatLabel> {\n return this.fetch<ChatLabel>(`w/${wid}/chat-labels/${id}`);\n }\n\n /** Get a chat label by UUID. */\n async getChatLabelByUuid(wid: string, uuid: string): Promise<ChatLabel> {\n return this.fetch<ChatLabel>(`w/${wid}/chat-labels/${uuid}`);\n }\n\n /** Create a new chat label. */\n async createChatLabel(wid: string, label: ChatLabelFormData): Promise<ChatLabel> {\n return this.fetch<ChatLabel>(`w/${wid}/chat-labels`, {\n method: 'POST',\n body: JSON.stringify(label),\n });\n }\n\n /** Update a chat label. */\n async updateChatLabel(\n wid: string,\n id: number,\n label: Partial<ChatLabelFormData>\n ): Promise<ChatLabel> {\n return this.fetch<ChatLabel>(`w/${wid}/chat-labels/${id}`, {\n method: 'PUT',\n body: JSON.stringify(label),\n });\n }\n\n /** Delete a chat label. */\n async deleteChatLabel(wid: string, id: number): Promise<void> {\n return this.fetch<void>(`w/${wid}/chat-labels/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Get distinct tool call names used across workspace chats. */\n async getToolCallNames(wid: string): Promise<string[]> {\n return this.fetch<string[]>(`w/${wid}/chats/tool-call-names`);\n }\n\n /** List all chat filters in a workspace. */\n async getChatFilters(wid: string): Promise<ChatFilter[]> {\n return this.fetch<ChatFilter[]>(`w/${wid}/chat-filters`);\n }\n\n /** Get a chat filter by ID. */\n async getChatFilter(wid: string, id: number): Promise<ChatFilter> {\n return this.fetch<ChatFilter>(`w/${wid}/chat-filters/${id}`);\n }\n\n /** Get a chat filter by UUID. */\n async getChatFilterByUuid(wid: string, uuid: string): Promise<ChatFilter> {\n return this.fetch<ChatFilter>(`w/${wid}/chat-filters/by-uuid/${uuid}`);\n }\n\n /** Create a new chat filter. */\n async createChatFilter(wid: string, filter: ChatFilterFormData): Promise<ChatFilter> {\n return this.fetch<ChatFilter>(`w/${wid}/chat-filters`, {\n method: 'POST',\n body: JSON.stringify(filter),\n });\n }\n\n /** Update a chat filter. */\n async updateChatFilter(\n wid: string,\n id: number,\n filter: Partial<ChatFilterFormData>\n ): Promise<ChatFilter> {\n return this.fetch<ChatFilter>(`w/${wid}/chat-filters/${id}`, {\n method: 'PUT',\n body: JSON.stringify(filter),\n });\n }\n\n /** Delete a chat filter. */\n async deleteChatFilter(wid: string, id: number): Promise<void> {\n return this.fetch<void>(`w/${wid}/chat-filters/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Get the count of chats matching a saved filter. */\n async getChatFilterCount(wid: string, filterId: number): Promise<{ count: number }> {\n return this.fetch<{ count: number }>(`w/${wid}/chat-filters/${filterId}/count`);\n }\n\n /** Get phone calls associated with a chat. */\n async getChatPhoneCalls(wid: string, chatId: number): Promise<PhoneCall[]> {\n return this.fetch<PhoneCall[]>(`w/${wid}/chats/${chatId}/phone-calls`);\n }\n}\n","import { BaseApiClient } from './base';\n\nexport interface ConfluenceConnectionStatus {\n connectionId: number | null;\n configured: boolean;\n connected: boolean;\n enabled: boolean;\n state: string | null;\n siteUrl: string | null;\n cloudId: string | null;\n authorizeUrl: string | null;\n error: string | null;\n creatorId: number | null;\n authorizedByMemberId: number | null;\n authorizedAt: string | null;\n}\n\nexport interface ConfigureConfluenceRequest {\n clientId: string;\n clientSecret: string;\n}\n\nexport interface ConfluenceSpace {\n id: string;\n key: string;\n name: string;\n type: string;\n}\n\nexport interface ConfluenceSpacesResponse {\n results: ConfluenceSpace[];\n cursor: string | null;\n hasMore: boolean;\n}\n\nexport interface ConfluencePage {\n id: string;\n title: string;\n status: string;\n parentId: string | null;\n}\n\nexport interface ConfluencePagesResponse {\n results: ConfluencePage[];\n cursor: string | null;\n hasMore: boolean;\n}\n\nexport class ConfluenceApi extends BaseApiClient {\n async configureConfluence(\n wid: string,\n data: ConfigureConfluenceRequest\n ): Promise<ConfluenceConnectionStatus> {\n return this.fetch<ConfluenceConnectionStatus>(\n `w/${wid}/app-connections/confluence/configure`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n async startConfluenceOAuth(wid: string): Promise<ConfluenceConnectionStatus> {\n return this.fetch<ConfluenceConnectionStatus>(\n `w/${wid}/app-connections/confluence/oauth/start`,\n {\n method: 'POST',\n }\n );\n }\n\n async getConfluenceStatus(wid: string): Promise<ConfluenceConnectionStatus> {\n return this.fetch<ConfluenceConnectionStatus>(`w/${wid}/app-connections/confluence/status`);\n }\n\n async disconnectConfluence(wid: string): Promise<ConfluenceConnectionStatus> {\n return this.fetch<ConfluenceConnectionStatus>(\n `w/${wid}/app-connections/confluence/disconnect`,\n {\n method: 'DELETE',\n }\n );\n }\n\n async disableConfluence(wid: string): Promise<ConfluenceConnectionStatus> {\n return this.fetch<ConfluenceConnectionStatus>(`w/${wid}/app-connections/confluence/disable`, {\n method: 'POST',\n });\n }\n\n async enableConfluence(wid: string): Promise<ConfluenceConnectionStatus> {\n return this.fetch<ConfluenceConnectionStatus>(`w/${wid}/app-connections/confluence/enable`, {\n method: 'POST',\n });\n }\n\n async deleteConfluence(wid: string): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/app-connections/confluence/delete`, {\n method: 'DELETE',\n });\n }\n\n async listConfluenceSpaces(\n wid: string,\n params?: { cursor?: string; limit?: number }\n ): Promise<ConfluenceSpacesResponse> {\n const qs = new URLSearchParams();\n if (params?.cursor) qs.set('cursor', params.cursor);\n if (params?.limit) qs.set('limit', String(params.limit));\n const query = qs.toString();\n return this.fetch<ConfluenceSpacesResponse>(\n `w/${wid}/app-connections/confluence/spaces${query ? `?${query}` : ''}`\n );\n }\n\n async listConfluencePages(\n wid: string,\n spaceId: string,\n params?: { cursor?: string; limit?: number }\n ): Promise<ConfluencePagesResponse> {\n const qs = new URLSearchParams({ space_id: spaceId });\n if (params?.cursor) qs.set('cursor', params.cursor);\n if (params?.limit) qs.set('limit', String(params.limit));\n return this.fetch<ConfluencePagesResponse>(\n `w/${wid}/app-connections/confluence/pages?${qs.toString()}`\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport {\n CustomToolkit,\n CustomToolkitFormData,\n CustomToolkitUpdateFormData,\n CustomTool,\n CustomToolFormData,\n CustomToolUpdateFormData,\n} from '../types';\n\nexport class CustomToolkitsApi extends BaseApiClient {\n /**\n * List all custom toolkits in a workspace\n */\n async getCustomToolkits(wid: string): Promise<CustomToolkit[]> {\n return this.fetch<CustomToolkit[]>(`w/${wid}/custom-toolkits`);\n }\n\n /**\n * Get a specific custom toolkit\n */\n async getCustomToolkit(wid: string, toolkitId: number): Promise<CustomToolkit> {\n return this.fetch<CustomToolkit>(`w/${wid}/custom-toolkits/${toolkitId}`);\n }\n\n /**\n * Create a new custom toolkit\n */\n async createCustomToolkit(wid: string, data: CustomToolkitFormData): Promise<CustomToolkit> {\n return this.fetch<CustomToolkit>(`w/${wid}/custom-toolkits`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Update an existing custom toolkit\n */\n async updateCustomToolkit(\n wid: string,\n toolkitId: number,\n data: CustomToolkitUpdateFormData\n ): Promise<CustomToolkit> {\n return this.fetch<CustomToolkit>(`w/${wid}/custom-toolkits/${toolkitId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete a custom toolkit\n */\n async deleteCustomToolkit(wid: string, toolkitId: number): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/custom-toolkits/${toolkitId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Enable a custom toolkit\n */\n async enableCustomToolkit(wid: string, toolkitId: number): Promise<CustomToolkit> {\n return this.fetch<CustomToolkit>(`w/${wid}/custom-toolkits/${toolkitId}/enable`, {\n method: 'POST',\n });\n }\n\n /**\n * Disable a custom toolkit\n */\n async disableCustomToolkit(wid: string, toolkitId: number): Promise<CustomToolkit> {\n return this.fetch<CustomToolkit>(`w/${wid}/custom-toolkits/${toolkitId}/disable`, {\n method: 'POST',\n });\n }\n\n /**\n * Create a new custom tool in a toolkit\n */\n async createCustomTool(\n wid: string,\n toolkitId: number,\n data: CustomToolFormData\n ): Promise<CustomTool> {\n return this.fetch<CustomTool>(`w/${wid}/custom-toolkits/${toolkitId}/tools`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Update an existing custom tool\n */\n async updateCustomTool(\n wid: string,\n toolkitId: number,\n toolId: number,\n data: CustomToolUpdateFormData\n ): Promise<CustomTool> {\n return this.fetch<CustomTool>(`w/${wid}/custom-toolkits/${toolkitId}/tools/${toolId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete a custom tool\n */\n async deleteCustomTool(\n wid: string,\n toolkitId: number,\n toolId: number\n ): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(\n `w/${wid}/custom-toolkits/${toolkitId}/tools/${toolId}`,\n {\n method: 'DELETE',\n }\n );\n }\n}\n","import {\n DataRecord,\n DataRecordFilter,\n DataRecordFilterFormData,\n DataRecordFormData,\n DataRecordsPaginatedResponse,\n DataRecordUpdate,\n DataType,\n DataTypeFormData,\n DataTypeDraftResponse,\n DataTypeVersionResponse,\n PublishDataTypeDraftRequest,\n SaveDataTypeDraftRequest,\n FieldSlugRenamePreview,\n FieldSlugRenameResult,\n QueryPredicate,\n} from '../types';\nimport type { AnonymousFormSubmissionResponse } from '../types/generated/anonymous_form_submission';\nimport type { PaginatedResponseAnonymousFormSubmissionResponse } from '../types/generated/common';\nimport { BaseApiClient } from './base';\n\nexport class DataTypesApi extends BaseApiClient {\n /** Read the local Form's draft and optimistic publication counters. */\n async getDataTypeDraft(wid: string, id: number): Promise<DataTypeDraftResponse> {\n return this.fetch<DataTypeDraftResponse>(`w/${wid}/data-types/${id}/schema-draft`);\n }\n\n /** Save a draft without changing the schema used to validate live records. */\n async saveDataTypeDraft(\n wid: string,\n id: number,\n request: SaveDataTypeDraftRequest\n ): Promise<DataTypeDraftResponse> {\n return this.fetch<DataTypeDraftResponse>(`w/${wid}/data-types/${id}/schema-draft`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n /** Publish the expected draft as the next immutable local schema version. */\n async publishDataTypeDraft(\n wid: string,\n id: number,\n request: PublishDataTypeDraftRequest\n ): Promise<DataTypeDraftResponse> {\n return this.fetch<DataTypeDraftResponse>(`w/${wid}/data-types/${id}/schema-publish`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** List schema history newest first; use the last version as the next cursor. */\n async getDataTypeVersions(\n wid: string,\n id: number,\n options?: { beforeVersion?: number; limit?: number }\n ): Promise<DataTypeVersionResponse[]> {\n const params = new URLSearchParams();\n if (options?.beforeVersion !== undefined)\n params.set('beforeVersion', String(options.beforeVersion));\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n const query = params.toString();\n return this.fetch<DataTypeVersionResponse[]>(\n `w/${wid}/data-types/${id}/schema-versions${query ? `?${query}` : ''}`\n );\n }\n\n /** List all data types for a workspace, optionally filtering by archived status. */\n async getDataTypes(wid: string, options?: { archived?: boolean }): Promise<DataType[]> {\n const params = new URLSearchParams();\n if (options?.archived !== undefined) {\n params.append('archived', options.archived.toString());\n }\n const queryString = params.toString();\n return this.fetch<DataType[]>(`w/${wid}/data-types${queryString ? `?${queryString}` : ''}`);\n }\n\n /** Get a single data type by numeric ID, or by UUID when a UUID string is supplied. */\n async getDataType(wid: string, id: number | string): Promise<DataType> {\n if (typeof id === 'string' && isUuid(id)) {\n return this.getDataTypeByUuid(wid, id);\n }\n return this.fetch<DataType>(`w/${wid}/data-types/${id}`);\n }\n\n /** Get a single data type by UUID. */\n async getDataTypeByUuid(wid: string, uuid: string): Promise<DataType> {\n return this.fetch<DataType>(`w/${wid}/data-types/${uuid}`);\n }\n\n /** Get a single data type by its slug. */\n async getDataTypeBySlug(wid: string, slug: string): Promise<DataType> {\n return this.fetch<DataType>(`w/${wid}/data-types/slug/${slug}`);\n }\n\n /** Create a new data type definition in the workspace. */\n async createDataType(wid: string, dataType: DataTypeFormData): Promise<DataType> {\n return this.fetch<DataType>(`w/${wid}/data-types`, {\n method: 'POST',\n body: JSON.stringify(dataType),\n });\n }\n\n /** Update an existing data type definition. */\n async updateDataType(\n wid: string,\n id: number,\n dataType: Partial<DataTypeFormData>\n ): Promise<DataType> {\n return this.fetch<DataType>(`w/${wid}/data-types/${id}`, {\n method: 'PUT',\n body: JSON.stringify(dataType),\n });\n }\n\n /** Delete a data type definition by ID. */\n async deleteDataType(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/data-types/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Archive a data type, hiding it from default listings. */\n async archiveDataType(wid: string, id: number): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/data-types/${id}/archive`, {\n method: 'POST',\n });\n }\n\n /** Restore an archived data type back to active status. */\n async unarchiveDataType(wid: string, id: number): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/data-types/${id}/unarchive`, {\n method: 'POST',\n });\n }\n\n /** Clone a data type with a new name and slug. */\n async cloneDataType(\n wid: string,\n id: number,\n data: { name: string; slug: string }\n ): Promise<DataType> {\n return this.fetch<DataType>(`w/${wid}/data-types/${id}/clone`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** List data records for a data type with optional filtering and pagination. */\n async getDataRecords(\n wid: string,\n dataTypeId: number,\n options?: {\n memberId?: number;\n /** Batch form of memberId — one request hydrates a whole table page. */\n memberIds?: number[];\n search?: string;\n searchField?: string;\n /** Apply a saved data-record filter by id. */\n dataRecordFilterId?: number;\n /** Ad-hoc Query IR predicate (entity=data_record). */\n query?: QueryPredicate;\n page?: number;\n pageSize?: number;\n }\n ): Promise<DataRecordsPaginatedResponse> {\n const params = new URLSearchParams();\n if (options?.memberId !== undefined) params.append('member_id', options.memberId.toString());\n if (options?.memberIds?.length) params.append('member_ids', options.memberIds.join(','));\n if (options?.search) params.append('search', options.search);\n if (options?.searchField) params.append('search_field', options.searchField);\n if (options?.dataRecordFilterId != null) {\n params.append('dataRecordFilterId', options.dataRecordFilterId.toString());\n }\n if (options?.query != null) params.append('query', JSON.stringify(options.query));\n if (options?.page) params.append('page', options.page.toString());\n if (options?.pageSize) params.append('page_size', options.pageSize.toString());\n\n return this.fetch<DataRecordsPaginatedResponse>(\n `w/${wid}/data-types/${dataTypeId}/records${params?.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /**\n * List an anonymous Form's submissions, newest first. Requires\n * `anonymous_submissions:read`. Submissions are immutable: there is no\n * update or delete method.\n */\n async listAnonymousFormSubmissions(\n wid: string,\n dataTypeId: number,\n options?: { page?: number; pageSize?: number }\n ): Promise<PaginatedResponseAnonymousFormSubmissionResponse> {\n const params = new URLSearchParams();\n if (options?.page) params.append('page', options.page.toString());\n if (options?.pageSize) params.append('page_size', options.pageSize.toString());\n const qs = params.toString();\n return this.fetch<PaginatedResponseAnonymousFormSubmissionResponse>(\n `w/${wid}/data-types/${dataTypeId}/anonymous-submissions${qs ? `?${qs}` : ''}`\n );\n }\n\n /** Get one anonymous Form submission by its uuid. Requires `anonymous_submissions:read`. */\n async getAnonymousFormSubmission(\n wid: string,\n dataTypeId: number,\n submissionUuid: string\n ): Promise<AnonymousFormSubmissionResponse> {\n return this.fetch<AnonymousFormSubmissionResponse>(\n `w/${wid}/data-types/${dataTypeId}/anonymous-submissions/${encodeURIComponent(submissionUuid)}`\n );\n }\n\n // Data-record filter APIs (saved Query IR predicates per form)\n\n /** List saved data-record filters, optionally scoped to one DataType. */\n async getDataRecordFilters(\n wid: string,\n options?: { dataTypeId?: number }\n ): Promise<DataRecordFilter[]> {\n const params = new URLSearchParams();\n if (options?.dataTypeId != null) {\n params.append('dataTypeId', options.dataTypeId.toString());\n }\n const qs = params.toString();\n return this.fetch<DataRecordFilter[]>(`w/${wid}/data-record-filters${qs ? `?${qs}` : ''}`);\n }\n\n /** Get a single data-record filter by ID. */\n async getDataRecordFilter(wid: string, filterId: number): Promise<DataRecordFilter> {\n return this.fetch<DataRecordFilter>(`w/${wid}/data-record-filters/${filterId}`);\n }\n\n /** Create a new saved data-record filter. */\n async createDataRecordFilter(\n wid: string,\n data: DataRecordFilterFormData\n ): Promise<DataRecordFilter> {\n return this.fetch<DataRecordFilter>(`w/${wid}/data-record-filters`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update a saved data-record filter. */\n async updateDataRecordFilter(\n wid: string,\n filterId: number,\n data: Partial<DataRecordFilterFormData>\n ): Promise<DataRecordFilter> {\n return this.fetch<DataRecordFilter>(`w/${wid}/data-record-filters/${filterId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Delete a saved data-record filter. */\n async deleteDataRecordFilter(wid: string, filterId: number): Promise<void> {\n return this.fetch(`w/${wid}/data-record-filters/${filterId}`, {\n method: 'DELETE',\n });\n }\n\n /** Get the count of records matching a saved filter. */\n async getDataRecordFilterCount(wid: string, filterId: number): Promise<{ count: number }> {\n return this.fetch<{ count: number }>(`w/${wid}/data-record-filters/${filterId}/count`);\n }\n\n /** Get a single data record by ID. */\n async getDataRecord(wid: string, recordId: number): Promise<DataRecord> {\n return this.fetch<DataRecord>(`w/${wid}/data-types/records/${recordId}`);\n }\n\n /**\n * Get a single data record by UUID.\n *\n * The uuid-addressed twin of `getDataRecord`: same access check, same body.\n * Activity events and org webhooks name a record by `uuid` only.\n */\n async getDataRecordByUuid(wid: string, uuid: string): Promise<DataRecord> {\n return this.fetch<DataRecord>(`w/${wid}/data-types/records/by-uuid/${uuid}`);\n }\n\n /** Create a new data record under the specified data type. */\n async createDataRecord(\n wid: string,\n dataTypeId: number,\n record: DataRecordFormData\n ): Promise<DataRecord> {\n return this.fetch<DataRecord>(`w/${wid}/data-types/${dataTypeId}/records`, {\n method: 'POST',\n body: JSON.stringify(record),\n });\n }\n\n /** Update an existing data record's field values. */\n async updateDataRecord(\n wid: string,\n dataTypeId: number,\n recordId: number,\n record: DataRecordFormData\n ): Promise<DataRecord> {\n return this.fetch<DataRecord>(`w/${wid}/data-types/${dataTypeId}/records/${recordId}`, {\n method: 'PUT',\n body: JSON.stringify(record),\n });\n }\n\n /** Delete a data record by ID. */\n async deleteDataRecord(wid: string, dataTypeId: number, recordId: number): Promise<void> {\n return this.fetch(`w/${wid}/data-types/${dataTypeId}/records/${recordId}`, {\n method: 'DELETE',\n });\n }\n\n /** Get the change history for a data record. */\n async getDataRecordChanges(\n wid: string,\n dataTypeId: number,\n recordId: number\n ): Promise<DataRecordUpdate[]> {\n return this.fetch<DataRecordUpdate[]>(\n `w/${wid}/data-types/${dataTypeId}/records/${recordId}/changes`\n );\n }\n\n /** Upsert a data record by external ID, creating or updating as needed. */\n async upsertDataRecord(\n wid: string,\n dataTypeId: number,\n externalId: string | number,\n data: {\n fieldValues: Record<string, any>;\n memberId?: number | null;\n memberExternalId?: string | null;\n }\n ): Promise<DataRecord> {\n return this.fetch<DataRecord>(`w/${wid}/data-types/${dataTypeId}/upsert/${externalId}`, {\n method: 'POST',\n body: JSON.stringify({\n externalId,\n fieldValues: data.fieldValues,\n memberId: data.memberId,\n memberExternalId: data.memberExternalId,\n }),\n });\n }\n\n /** Toggle search indexing for a data type field. */\n async toggleFieldIndex(\n wid: string,\n dataTypeId: number,\n fieldSlug: string,\n shouldIndex: boolean\n ): Promise<{ status: string; message: string; indexStatus?: string }> {\n return this.fetch(`w/${wid}/data-types/${dataTypeId}/fields/${fieldSlug}/toggle-index`, {\n method: 'POST',\n body: JSON.stringify({ shouldIndex: shouldIndex }),\n });\n }\n\n /** Get the index status for a data type field. */\n async getFieldIndexStatus(\n wid: string,\n dataTypeId: number,\n fieldSlug: string\n ): Promise<{\n fieldSlug: string;\n fieldName: string;\n shouldIndex: string;\n indexStatus: string;\n }> {\n return this.fetch(`w/${wid}/data-types/${dataTypeId}/fields/${fieldSlug}/index-status`);\n }\n\n /**\n * Preview renaming a field's slug — read-only.\n *\n * A field slug is the key its answers are stored under, so a rename moves\n * stored data. This reports whether the new slug is allowed, how many records\n * would move, and every configured place still naming the old slug (CEL,\n * templates, sync maps) which this rename does NOT rewrite.\n */\n async previewRenameFieldSlug(\n wid: string,\n dataTypeId: number,\n fieldSlug: string,\n newSlug: string\n ): Promise<FieldSlugRenamePreview> {\n return this.fetch<FieldSlugRenamePreview>(\n `w/${wid}/data-types/${dataTypeId}/fields/${fieldSlug}/rename-preview`,\n { method: 'POST', body: JSON.stringify({ newSlug }) }\n );\n }\n\n /**\n * Rename a field's slug, preserving stored answers.\n *\n * The schema change commits synchronously; the answers are moved by the\n * existing cleanup workflow, so this resolves on ACCEPTANCE, not completion.\n * Call {@link previewRenameFieldSlug} first — references naming the old slug\n * are reported, never rewritten.\n */\n async renameFieldSlug(\n wid: string,\n dataTypeId: number,\n fieldSlug: string,\n newSlug: string\n ): Promise<FieldSlugRenameResult> {\n return this.fetch<FieldSlugRenameResult>(\n `w/${wid}/data-types/${dataTypeId}/fields/${fieldSlug}/rename`,\n { method: 'POST', body: JSON.stringify({ newSlug }) }\n );\n }\n\n /**\n * Validate if a data type slug is available.\n * Returns availability and a suggested alternative if taken.\n */\n async validateDataTypeSlug(\n wid: string,\n slug: string,\n excludeId?: number\n ): Promise<{ available: boolean; suggestedSlug?: string }> {\n return this.fetch(`w/${wid}/data-types/validate-slug`, {\n method: 'POST',\n body: JSON.stringify({ slug, excludeId }),\n });\n }\n\n /**\n * Get record counts per data type for a specific member.\n * Returns a mapping of data type ID to record count.\n */\n async getMemberRecordCounts(\n wid: string,\n memberId: number\n ): Promise<{ counts: Record<number, number> }> {\n return this.fetch(`w/${wid}/data-types/member-record-counts?member_id=${memberId}`);\n }\n}\n\nfunction isUuid(value: string): boolean {\n return /^[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(value);\n}\n","import { BaseApiClient } from './base';\nimport {\n DiscordBot,\n CreateDiscordBotRequest,\n UpdateDiscordBotRequest,\n DiscordThread,\n DiscordGuild,\n DiscordBotAccount,\n MemberCredential,\n PaginatedResponse,\n DiscordBotSortField,\n SortOrder,\n} from '../types';\nimport {\n CompleteDiscordLinkRequest,\n CompleteDiscordLinkResponse,\n} from '../types/generated/discord_oauth_public';\n\nexport class DiscordBotsApi extends BaseApiClient {\n /**\n * List all Discord bots configured for a workspace.\n */\n async getDiscordBots(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n sortBy?: DiscordBotSortField;\n sortOrder?: SortOrder;\n search?: string;\n } = {}\n ): Promise<PaginatedResponse<DiscordBot>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.search) params.append('search', options.search);\n\n return this.fetch<PaginatedResponse<DiscordBot>>(\n `w/${wid}/app-connections/discord/bots${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /**\n * Get a specific Discord bot by ID.\n */\n async getDiscordBot(wid: string, botId: number): Promise<DiscordBot> {\n return this.fetch<DiscordBot>(`w/${wid}/app-connections/discord/bots/${botId}`);\n }\n\n /**\n * Get a Discord bot by UUID.\n */\n async getDiscordBotByUuid(wid: string, uuid: string): Promise<DiscordBot> {\n return this.fetch<DiscordBot>(`w/${wid}/app-connections/discord/bots/uuid/${uuid}`);\n }\n\n /**\n * Create a new Discord bot configuration.\n */\n async createDiscordBot(wid: string, data: CreateDiscordBotRequest): Promise<DiscordBot> {\n return this.fetch<DiscordBot>(`w/${wid}/app-connections/discord/bots`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Step-up preflight for the Discord account-link flow (GH #20196).\n *\n * A no-side-effect GET enforcing the same authenticated, stepped-up\n * `apps:write` session as authorize/complete-link. Call this through the\n * client *before* the full-page navigation to `/oauth/authorize`: a 401\n * `insufficient_user_authentication` triggers the SDK's enhanced-auth\n * (step-up) modal + retry, so a below-assurance session is prompted here\n * rather than hitting a raw 401 on a top-level browser navigation.\n * Resolves (204) once the session is sufficiently assured.\n */\n async discordLinkPreflight(wid: string): Promise<void> {\n return this.fetch(`w/${wid}/app-connections/discord/oauth/link/preflight`);\n }\n\n /**\n * Complete an authenticated Discord account link (GH #20196).\n *\n * POST-only. Exchanges the one-time opaque handle (issued by the OAuth\n * callback and carried in the `?discord_link_handle=` return param) for a\n * persisted MemberCredential. Requires an authenticated, step-up-protected\n * session with `apps:write`; a 401 `insufficient_user_authentication`\n * triggers the SDK's enhanced-auth (step-up) retry automatically.\n */\n async completeDiscordLink(\n wid: string,\n data: CompleteDiscordLinkRequest\n ): Promise<CompleteDiscordLinkResponse> {\n return this.fetch<CompleteDiscordLinkResponse>(\n `w/${wid}/app-connections/discord/oauth/complete-link`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Update an existing Discord bot configuration.\n */\n async updateDiscordBot(\n wid: string,\n botId: number,\n data: UpdateDiscordBotRequest\n ): Promise<DiscordBot> {\n return this.fetch<DiscordBot>(`w/${wid}/app-connections/discord/bots/${botId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete a Discord bot configuration.\n */\n async deleteDiscordBot(wid: string, botId: number): Promise<void> {\n return this.fetch(`w/${wid}/app-connections/discord/bots/${botId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Register slash commands for a Discord bot.\n */\n async registerSlashCommands(wid: string, botId: number): Promise<void> {\n return this.fetch(`w/${wid}/app-connections/discord/bots/${botId}/register-commands`, {\n method: 'POST',\n });\n }\n\n /**\n * Register role connection metadata schema for Discord Linked Roles.\n * This defines what metadata fields are available for linked roles.\n */\n async registerLinkedRolesMetadata(\n wid: string,\n botId: number\n ): Promise<{ registered: number; fields: string[] }> {\n return this.fetch(\n `w/${wid}/app-connections/discord/bots/${botId}/linked-roles/register-metadata`,\n {\n method: 'POST',\n }\n );\n }\n\n /**\n * Get Discord threads for a bot.\n */\n async getDiscordThreads(\n wid: string,\n botId: number,\n options: {\n page?: number;\n pageSize?: number;\n } = {}\n ): Promise<PaginatedResponse<DiscordThread>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<PaginatedResponse<DiscordThread>>(\n `w/${wid}/app-connections/discord/bots/${botId}/threads${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /**\n * Get the current member's credentials (connected accounts).\n */\n async getMyCredentials(wid: string): Promise<MemberCredential[]> {\n return this.fetch<MemberCredential[]>(`w/${wid}/me/credentials`);\n }\n\n /**\n * Unlink a credential from the current member's account.\n */\n async unlinkCredential(wid: string, credentialId: number): Promise<void> {\n return this.fetch(`w/${wid}/me/credentials/${credentialId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Get Discord guilds (servers) that have interacted with a bot.\n */\n async getDiscordGuilds(\n wid: string,\n botId: number,\n options: {\n page?: number;\n pageSize?: number;\n } = {}\n ): Promise<PaginatedResponse<DiscordGuild>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<PaginatedResponse<DiscordGuild>>(\n `w/${wid}/app-connections/discord/bots/${botId}/guilds${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /**\n * Get Discord account links for a bot (members linked to Discord users).\n */\n async getDiscordBotAccounts(\n wid: string,\n botId: number,\n options: {\n page?: number;\n pageSize?: number;\n } = {}\n ): Promise<PaginatedResponse<DiscordBotAccount>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<PaginatedResponse<DiscordBotAccount>>(\n `w/${wid}/app-connections/discord/bots/${botId}/accounts${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport {\n SlackApp,\n SlackAppInstallation,\n SlackAccount,\n CreateSlackAppRequest,\n UpdateSlackAppRequest,\n SlackThread,\n PaginatedResponse,\n SlackAppSortField,\n SortOrder,\n} from '../types';\n\nexport class SlackAppsApi extends BaseApiClient {\n /**\n * List all Slack apps configured for a workspace.\n */\n async getSlackApps(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n sortBy?: SlackAppSortField;\n sortOrder?: SortOrder;\n search?: string;\n } = {}\n ): Promise<PaginatedResponse<SlackApp>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.search) params.append('search', options.search);\n\n return this.fetch<PaginatedResponse<SlackApp>>(\n `w/${wid}/app-connections/slack/apps${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /**\n * Get a specific Slack app by ID.\n */\n async getSlackApp(wid: string, appId: number): Promise<SlackApp> {\n return this.fetch<SlackApp>(`w/${wid}/app-connections/slack/apps/${appId}`);\n }\n\n /**\n * Create a new Slack app configuration.\n */\n async createSlackApp(wid: string, data: CreateSlackAppRequest): Promise<SlackApp> {\n return this.fetch<SlackApp>(`w/${wid}/app-connections/slack/apps`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Update an existing Slack app configuration.\n */\n async updateSlackApp(\n wid: string,\n appId: number,\n data: UpdateSlackAppRequest\n ): Promise<SlackApp> {\n return this.fetch<SlackApp>(`w/${wid}/app-connections/slack/apps/${appId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete a Slack app configuration.\n */\n async deleteSlackApp(wid: string, appId: number): Promise<void> {\n return this.fetch(`w/${wid}/app-connections/slack/apps/${appId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Get Slack threads for an app.\n */\n async getSlackThreads(\n wid: string,\n appId: number,\n options: {\n page?: number;\n pageSize?: number;\n } = {}\n ): Promise<PaginatedResponse<SlackThread>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<PaginatedResponse<SlackThread>>(\n `w/${wid}/app-connections/slack/apps/${appId}/threads${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /**\n * Get Slack workspace installations for an app.\n */\n async getSlackInstallations(\n wid: string,\n appId: number,\n options: {\n page?: number;\n pageSize?: number;\n } = {}\n ): Promise<PaginatedResponse<SlackAppInstallation>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<PaginatedResponse<SlackAppInstallation>>(\n `w/${wid}/app-connections/slack/apps/${appId}/installations${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /**\n * Get Slack account links for an app (members linked to Slack users).\n */\n async getSlackAppAccounts(\n wid: string,\n appId: number,\n options: {\n page?: number;\n pageSize?: number;\n } = {}\n ): Promise<PaginatedResponse<SlackAccount>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<PaginatedResponse<SlackAccount>>(\n `w/${wid}/app-connections/slack/apps/${appId}/accounts${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport {\n Routine,\n RoutineConfigEvent,\n RoutineRun,\n EventRule,\n EventRuleActionType,\n EventRuleEventType,\n EventRuleFormData,\n EventRuleObjectType,\n RoutinesQueryParams,\n CreateRoutineRequest,\n UpdateRoutineRequest,\n UpdateEventRuleFormData,\n WebhookLog,\n WebhookLogsQueryParams,\n RuleExecution,\n RuleExecutionsQueryParams,\n PaginatedResponse,\n EventRunSortField,\n RoutineVoiceReadinessPreviewRequest,\n RoutineVoiceReadinessPreviewResponse,\n SchedulePreviewRequest,\n SchedulePreviewResponse,\n SortOrder,\n TestWebhookRequest,\n TestWebhookResponse,\n} from '../types';\nimport type { CursorPaginatedResponse } from '../types/core-types';\nimport { EventActionMappingsResponse } from '../types/event-rule-types';\n\nexport class EventsApi extends BaseApiClient {\n /** List event rules in the workspace, paginated. */\n async getEventRules(\n wid: string,\n params?: { page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<EventRule>> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<EventRule>>(`w/${wid}/event-rules${qs}`);\n }\n\n /** Get the available action types that can be used in event rules. */\n async getAvailableActions(wid: string): Promise<EventActionMappingsResponse> {\n return this.fetch<EventActionMappingsResponse>(`w/${wid}/event-rules/actions/available`);\n }\n\n /** Search event rules by object type, event type, action type, and related entities. */\n async searchEventRules(\n wid: string,\n params: {\n objectType?: EventRuleObjectType;\n eventType?: EventRuleEventType;\n actionType?: EventRuleActionType;\n taskId?: number;\n dataTypeId?: number;\n routineId?: number;\n workflowRevisionId?: number;\n journeyStepId?: number;\n includeDisabled?: boolean;\n }\n ): Promise<EventRule[]> {\n const searchParams = new URLSearchParams();\n if (params.objectType) searchParams.append('objectType', params.objectType);\n if (params.eventType) searchParams.append('eventType', params.eventType);\n if (params.actionType) searchParams.append('actionType', params.actionType);\n if (params.taskId) searchParams.append('taskId', params.taskId.toString());\n if (params.dataTypeId) searchParams.append('dataTypeId', params.dataTypeId.toString());\n if (params.routineId) searchParams.append('routineId', params.routineId.toString());\n if (params.workflowRevisionId)\n searchParams.append('workflowRevisionId', params.workflowRevisionId.toString());\n if (params.journeyStepId)\n searchParams.append('journeyStepId', params.journeyStepId.toString());\n if (params.includeDisabled) searchParams.append('includeDisabled', 'true');\n return this.fetch<EventRule[]>(`w/${wid}/event-rules/search?${searchParams.toString()}`);\n }\n\n /** Get a single event rule by ID. */\n async getEventRule(wid: string, id: number): Promise<EventRule> {\n return this.fetch<EventRule>(`w/${wid}/event-rules/${id}`);\n }\n\n /** Create a new event rule in the workspace. */\n async createEventRule(wid: string, rule: EventRuleFormData): Promise<EventRule> {\n return this.fetch<EventRule>(`w/${wid}/event-rules`, {\n method: 'POST',\n body: JSON.stringify(rule),\n });\n }\n\n /** Update an existing event rule. */\n async updateEventRule(\n wid: string,\n id: number,\n rule: UpdateEventRuleFormData\n ): Promise<EventRule> {\n return this.fetch<EventRule>(`w/${wid}/event-rules/${id}`, {\n method: 'PUT',\n body: JSON.stringify(rule),\n });\n }\n\n /** Delete an event rule by ID. */\n async deleteEventRule(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/event-rules/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Send a one-off test webhook for an existing webhook event rule. */\n async testWebhook(\n wid: string,\n id: number,\n request: TestWebhookRequest\n ): Promise<TestWebhookResponse> {\n return this.fetch<TestWebhookResponse>(`w/${wid}/event-rules/${id}/test-webhook`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** Reorder event rules by specifying the desired rule ID sequence. */\n async reorderEventRules(wid: string, ruleIds: number[]): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/event-rules/reorder`, {\n method: 'POST',\n body: JSON.stringify(ruleIds),\n });\n }\n\n /** List webhook logs with optional filtering by event type and success status. */\n async getWebhookLogs(\n wid: string,\n options: WebhookLogsQueryParams = {}\n ): Promise<PaginatedResponse<WebhookLog>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.eventType) params.append('eventType', options.eventType);\n if (options.success !== undefined) params.append('success', options.success.toString());\n\n return this.fetch<PaginatedResponse<WebhookLog>>(\n `w/${wid}/webhook-logs${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** List event rule executions with cursor-based pagination and filtering. */\n async getRuleExecutions(\n wid: string,\n options: RuleExecutionsQueryParams = {}\n ): Promise<CursorPaginatedResponse<RuleExecution>> {\n const params = new URLSearchParams();\n if (options.cursor) params.append('cursor', options.cursor);\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.ruleId) params.append('ruleId', options.ruleId.toString());\n if (options.status) params.append('status', options.status);\n if (options.triggerType) params.append('triggerType', options.triggerType);\n if (options.actionSlug) params.append('actionSlug', options.actionSlug);\n if (options.objectType) params.append('objectType', options.objectType);\n if (options.eventType) params.append('eventType', options.eventType);\n if (options.actionType) params.append('actionType', options.actionType);\n if (options.workflowRevisionId)\n params.append('workflowRevisionId', options.workflowRevisionId.toString());\n\n return this.fetch<CursorPaginatedResponse<RuleExecution>>(\n `w/${wid}/event-rules/executions${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** Preview the next N run times for a cron expression. */\n async previewSchedule(\n wid: string,\n request: SchedulePreviewRequest\n ): Promise<SchedulePreviewResponse> {\n return this.fetch<SchedulePreviewResponse>(`w/${wid}/routines/preview-schedule`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Preview what would stop a draft Routine placing its scheduled outbound\n * calls — the Member voice opt-out, a missing member phone, or a\n * workspace number that is stale, archived, or not voice-enabled.\n * Non-persisting and advisory. The audience is reported as counts only,\n * never as Member rows.\n */\n async previewRoutineVoiceReadiness(\n wid: string,\n request: RoutineVoiceReadinessPreviewRequest\n ): Promise<RoutineVoiceReadinessPreviewResponse> {\n return this.fetch<RoutineVoiceReadinessPreviewResponse>(\n `w/${wid}/routines/preview-voice-readiness`,\n {\n method: 'POST',\n body: JSON.stringify(request),\n }\n );\n }\n\n /** List routines with optional pagination and active status filtering. */\n async getRoutines(\n wid: string,\n options: RoutinesQueryParams = {}\n ): Promise<PaginatedResponse<Routine>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.owner) params.append('owner', options.owner);\n if (options.ownerId) params.append('ownerId', options.ownerId.toString());\n if (options.agentId) params.append('agentId', options.agentId.toString());\n if (options.agentOnly) params.append('agentOnly', 'true');\n\n return this.fetch<PaginatedResponse<Routine>>(\n `w/${wid}/routines${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** Get a single routine by ID. */\n async getRoutine(wid: string, id: number): Promise<Routine> {\n return this.fetch<Routine>(`w/${wid}/routines/${id}`);\n }\n\n /** Create a new routine. */\n async createRoutine(wid: string, routine: CreateRoutineRequest): Promise<Routine> {\n return this.fetch<Routine>(`w/${wid}/routines`, {\n method: 'POST',\n body: JSON.stringify(routine),\n });\n }\n\n /** Update an existing routine. */\n async updateRoutine(wid: string, id: number, routine: UpdateRoutineRequest): Promise<Routine> {\n return this.fetch<Routine>(`w/${wid}/routines/${id}`, {\n method: 'PUT',\n body: JSON.stringify(routine),\n });\n }\n\n /** Delete a routine by ID. */\n async deleteRoutine(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/routines/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Manually trigger a routine for a specific member or member filter. */\n async runRoutine(\n wid: string,\n id: number,\n params: {\n memberId?: number;\n memberFilterId?: number;\n }\n ): Promise<{ status: string; message: string }> {\n const searchParams = new URLSearchParams();\n if (params.memberId) searchParams.append('member_id', params.memberId.toString());\n if (params.memberFilterId)\n searchParams.append('member_filter_id', params.memberFilterId.toString());\n\n return this.fetch(`w/${wid}/routines/${id}/run?${searchParams.toString()}`, {\n method: 'POST',\n });\n }\n\n /**\n * Configuration change history for one routine, newest first.\n *\n * Answers \"who turned this off, when, and why\" — including the\n * platform-initiated pauses (finite-repeat exhaustion, outbound-safety\n * runaway auto-pause) that no other surface exposes.\n *\n * `transitionsOnly` filters to rows that record a real trigger-gate\n * transition. Prefer it for a toggle-focused view: a full-form save always\n * re-sends every field, so unfiltered history includes saves that changed\n * nothing.\n */\n async getRoutineConfigEvents(\n wid: string,\n id: number,\n options: {\n limit?: number;\n beforeId?: number;\n transitionsOnly?: boolean;\n } = {}\n ): Promise<RoutineConfigEvent[]> {\n const params = new URLSearchParams();\n if (options.limit) params.append('limit', options.limit.toString());\n if (options.beforeId) params.append('before_id', options.beforeId.toString());\n if (options.transitionsOnly) params.append('transitions_only', 'true');\n\n return this.fetch<RoutineConfigEvent[]>(\n `w/${wid}/routines/${id}/history${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** List routine run history with optional filtering by routine and status. */\n async getRoutineRuns(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n sortBy?: EventRunSortField;\n sortOrder?: SortOrder;\n routineId?: number;\n status?: string;\n } = {}\n ): Promise<PaginatedResponse<RoutineRun>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.routineId) params.append('routineId', options.routineId.toString());\n if (options.status) params.append('status', options.status);\n\n return this.fetch<PaginatedResponse<RoutineRun>>(\n `w/${wid}/routines/runs?${params.toString()}`\n );\n }\n\n /** Delete all run history for a routine. */\n async resetRoutineRuns(\n wid: string,\n routineId: number\n ): Promise<{ status: string; message: string; deletedRunsCount: number }> {\n return this.fetch(`w/${wid}/routines/${routineId}/runs`, {\n method: 'DELETE',\n });\n }\n}\n","import { FeatureDefinition } from '../features/registry';\nimport { BaseApiClient } from './base';\n\nexport interface FeaturesRegistryResponse {\n features: FeatureDefinition[];\n}\n\nexport class FeaturesApi extends BaseApiClient {\n /**\n * Get the full feature registry with all metadata\n */\n async getFeatureRegistry(): Promise<FeaturesRegistryResponse> {\n return this.fetch<FeaturesRegistryResponse>('features/registry');\n }\n\n /**\n * Get the public feature registry (no auth required).\n * Returns only features marked for product page display.\n */\n async getPublicFeatureRegistry(): Promise<FeaturesRegistryResponse> {\n return this.fetch<FeaturesRegistryResponse>('features/registry/public');\n }\n\n /**\n * Get a specific feature definition by slug\n */\n async getFeatureBySlug(slug: string): Promise<FeatureDefinition> {\n return this.fetch<FeatureDefinition>(`features/${slug}`);\n }\n}\n","import { BaseApiClient } from './base';\nimport {\n CheckFhirPatientLinksRequest,\n FhirConnection,\n FhirMethodResponse,\n FhirPatientLinkCheckResponse,\n CreateFhirConnectionRequest,\n UpdateFhirConnectionRequest,\n FhirFetchEncountersRequest,\n FhirSearchPatientsRequest,\n FhirSearchPractitionersRequest,\n FhirSearchLocationsRequest,\n FhirFetchCareTeamRequest,\n FhirCreateEncounterRequest,\n FhirConnectionSortField,\n FhirCsvImportSettings,\n FhirCsvImportRunSummary,\n FhirCsvImportRunItem,\n FhirCsvInspectResponse,\n UpdateFhirCsvImportSettingsRequest,\n EncounterSyncStatus,\n EncounterSyncRunResponse,\n EncounterSyncHistoryItem,\n UpdateEncounterSyncRequest,\n TriggerPatientRefreshRequest,\n TriggerConnectionBackfillRequest,\n PaginatedResponse,\n SortOrder,\n} from '../types';\n\nexport class FhirConnectionsApi extends BaseApiClient {\n /**\n * List all FHIR connections configured for a workspace.\n */\n async getFhirConnections(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n sortBy?: FhirConnectionSortField;\n sortOrder?: SortOrder;\n search?: string;\n } = {}\n ): Promise<PaginatedResponse<FhirConnection>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.search) params.append('search', options.search);\n\n return this.fetch<PaginatedResponse<FhirConnection>>(\n `w/${wid}/app-connections/fhir/connections${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /**\n * Get a specific FHIR connection by ID.\n */\n async getFhirConnection(wid: string, connectionId: number): Promise<FhirConnection> {\n return this.fetch<FhirConnection>(\n `w/${wid}/app-connections/fhir/connections/${connectionId}`\n );\n }\n\n /**\n * Get a FHIR connection by UUID.\n */\n async getFhirConnectionByUuid(wid: string, uuid: string): Promise<FhirConnection> {\n return this.fetch<FhirConnection>(`w/${wid}/app-connections/fhir/connections/uuid/${uuid}`);\n }\n\n /**\n * Create a new FHIR connection configuration.\n */\n async createFhirConnection(\n wid: string,\n data: CreateFhirConnectionRequest\n ): Promise<FhirConnection> {\n return this.fetch<FhirConnection>(`w/${wid}/app-connections/fhir/connections`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Update an existing FHIR connection configuration.\n */\n async updateFhirConnection(\n wid: string,\n connectionId: number,\n data: UpdateFhirConnectionRequest\n ): Promise<FhirConnection> {\n return this.fetch<FhirConnection>(\n `w/${wid}/app-connections/fhir/connections/${connectionId}`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Delete a FHIR connection configuration.\n */\n async deleteFhirConnection(wid: string, connectionId: number): Promise<void> {\n return this.fetch(`w/${wid}/app-connections/fhir/connections/${connectionId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Test a FHIR connection.\n */\n async testFhirConnection(\n wid: string,\n connectionId: number\n ): Promise<{ success: boolean; message: string }> {\n return this.fetch(`w/${wid}/app-connections/fhir/connections/${connectionId}/test`, {\n method: 'POST',\n });\n }\n\n /**\n * Search for patients via the FHIR connection.\n */\n async fhirSearchPatients(\n wid: string,\n connectionId: number,\n data: FhirSearchPatientsRequest\n ): Promise<FhirMethodResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/patients/search`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Search for practitioners via the FHIR connection.\n */\n async fhirSearchPractitioners(\n wid: string,\n connectionId: number,\n data: FhirSearchPractitionersRequest\n ): Promise<FhirMethodResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/practitioners/search`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Search for locations via the FHIR connection.\n */\n async fhirSearchLocations(\n wid: string,\n connectionId: number,\n data: FhirSearchLocationsRequest\n ): Promise<FhirMethodResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/locations/search`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Fetch care team for a patient via the FHIR connection.\n */\n async fhirFetchCareTeam(\n wid: string,\n connectionId: number,\n data: FhirFetchCareTeamRequest\n ): Promise<FhirMethodResponse> {\n return this.fetch(`w/${wid}/app-connections/fhir/connections/${connectionId}/careteam`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Fetch encounters for a patient via the FHIR connection.\n */\n async fhirFetchEncounters(\n wid: string,\n connectionId: number,\n data: FhirFetchEncountersRequest\n ): Promise<FhirMethodResponse> {\n return this.fetch(`w/${wid}/app-connections/fhir/connections/${connectionId}/encounters`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Create a telephone encounter for a patient via the FHIR connection.\n */\n async fhirCreateEncounter(\n wid: string,\n connectionId: number,\n data: FhirCreateEncounterRequest\n ): Promise<FhirMethodResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/encounters/create`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n // ==================== CSV Inspect & Import ====================\n\n async fhirCsvImportInspect(\n wid: string,\n connectionId: number,\n file: File\n ): Promise<FhirCsvInspectResponse> {\n const formData = new FormData();\n formData.append('file', file);\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/csv-import/inspect`,\n { method: 'POST', body: formData }\n );\n }\n\n async fhirGetCsvImportSettings(\n wid: string,\n connectionId: number\n ): Promise<FhirCsvImportSettings> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/csv-import/settings`\n );\n }\n\n async fhirUpdateCsvImportSettings(\n wid: string,\n connectionId: number,\n data: UpdateFhirCsvImportSettingsRequest\n ): Promise<FhirCsvImportSettings> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/csv-import/settings`,\n { method: 'PUT', body: JSON.stringify(data) }\n );\n }\n\n async fhirCsvImportApply(\n wid: string,\n connectionId: number,\n file: File,\n columns?: { identifierColumn: string; birthdateColumn?: string }\n ): Promise<Response> {\n const formData = new FormData();\n formData.append('file', file);\n if (columns) {\n formData.append('identifierColumn', columns.identifierColumn);\n if (columns.birthdateColumn) {\n formData.append('birthdateColumn', columns.birthdateColumn);\n }\n }\n return this.fetchRaw(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/csv-import/runs`,\n { method: 'POST', body: formData }\n );\n }\n\n async fhirGetCsvImportRuns(\n wid: string,\n connectionId: number,\n limit = 20\n ): Promise<FhirCsvImportRunSummary[]> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/csv-import/runs?limit=${limit}`\n );\n }\n\n async fhirGetCsvImportRunItems(\n wid: string,\n connectionId: number,\n runId: string,\n limit = 500\n ): Promise<FhirCsvImportRunItem[]> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/csv-import/runs/${runId}/items?limit=${limit}`\n );\n }\n\n // ==================== Member Sync ====================\n\n async fhirListLinkedMembers(\n wid: string,\n connectionId: number,\n params?: { page?: number; pageSize?: number; search?: string }\n ): Promise<PaginatedResponse<FhirLinkedMember>> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n if (params?.search?.trim()) query.set('search', params.search.trim());\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<FhirLinkedMember>>(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/linked-members${qs}`\n );\n }\n\n async fhirLinkMember(\n wid: string,\n connectionId: number,\n data: { memberId: number; patientId: string }\n ): Promise<FhirMethodResponse> {\n return this.fetch(`w/${wid}/app-connections/fhir/connections/${connectionId}/link-member`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async fhirUnlinkMember(\n wid: string,\n connectionId: number,\n memberId: number\n ): Promise<FhirMethodResponse> {\n return this.fetch(`w/${wid}/app-connections/fhir/connections/${connectionId}/unlink-member`, {\n method: 'POST',\n body: JSON.stringify({ memberId: memberId }),\n });\n }\n\n async fhirSyncMember(\n wid: string,\n connectionId: number,\n memberId: number\n ): Promise<FhirMethodResponse> {\n return this.fetch(`w/${wid}/app-connections/fhir/connections/${connectionId}/sync-member`, {\n method: 'POST',\n body: JSON.stringify({ memberId: memberId }),\n });\n }\n\n async fhirImportPatient(\n wid: string,\n connectionId: number,\n data: { patientId: string; memberRoleId?: number }\n ): Promise<FhirMethodResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/import-patient`,\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n\n /**\n * Bounded, read-only check of which external patient IDs are already\n * linked on this connection. PHI-minimal: sends/returns external patient\n * IDs only — never demographics.\n */\n async fhirCheckPatientLinks(\n wid: string,\n connectionId: number,\n data: CheckFhirPatientLinksRequest\n ): Promise<FhirPatientLinkCheckResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/linked-members/check`,\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n\n // ==================== Encounter Sync ====================\n\n async fhirGetEncounterSyncStatus(\n wid: string,\n connectionId: number\n ): Promise<EncounterSyncStatus> {\n return this.fetch(`w/${wid}/app-connections/fhir/connections/${connectionId}/encounter-sync`);\n }\n\n async fhirUpdateEncounterSync(\n wid: string,\n connectionId: number,\n data: UpdateEncounterSyncRequest\n ): Promise<EncounterSyncStatus> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/encounter-sync`,\n { method: 'PUT', body: JSON.stringify(data) }\n );\n }\n\n async fhirRunEncounterSync(\n wid: string,\n connectionId: number\n ): Promise<EncounterSyncRunResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/encounter-sync/run`,\n { method: 'POST' }\n );\n }\n\n async fhirGetEncounterSyncRuns(\n wid: string,\n connectionId: number,\n limit = 20\n ): Promise<EncounterSyncHistoryItem[]> {\n const qs = limit !== 20 ? `?limit=${limit}` : '';\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/encounter-sync/runs${qs}`\n );\n }\n\n async fhirRefreshEncounterPatient(\n wid: string,\n connectionId: number,\n data: TriggerPatientRefreshRequest\n ): Promise<EncounterSyncRunResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/encounter-sync/refresh-patient`,\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n\n async fhirBackfillEncounterSync(\n wid: string,\n connectionId: number,\n data: TriggerConnectionBackfillRequest\n ): Promise<EncounterSyncRunResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/encounter-sync/backfill`,\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n}\n\nexport interface FhirLinkedMember {\n memberId: number;\n patientId: string;\n lastSyncedAt: string | null;\n lastSyncStatus: string | null;\n syncCount: number;\n memberName?: string | null;\n memberEmail?: string | null;\n memberPhone?: string | null;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: inbound_fax\n */\n\n\n/**\n * One received fax, as shown in a fax log.\n */\nexport interface InboundFaxLogEntry {\n id: number;\n uuid: string;\n status: InboundFaxStatus;\n senderNumber?: string | null;\n pageCount?: number | null;\n pdfFileId?: number | null;\n pdfFilename?: string | null;\n chatId?: number | null;\n failureCode?: string | null;\n receivedAt?: string | null;\n createdAt?: string | null;\n}\n\nexport type InboundFaxStatus = typeof InboundFaxStatus[keyof typeof InboundFaxStatus];\n\n\nexport const InboundFaxStatus = {\n pending: 'pending',\n received: 'received',\n failed: 'failed',\n} as const;\n","import type {\n DocumoFaxConnectionResponse,\n DocumoFaxSetupResponse,\n} from '../types/generated/documo';\nimport type { PaginatedResponseInboundFaxLogEntry } from '../types/generated/common';\nimport type {\n ConfigureDocumoFaxRequest,\n DocumoFaxStatusResponse,\n} from '../types/generated/documo_fax';\nimport type { InboundFaxStatus } from '../types/generated/inbound_fax';\nimport { BaseApiClient } from './base';\n\nexport type {\n DocumoFaxConnectionResponse,\n DocumoFaxSetupResponse,\n} from '../types/generated/documo';\nexport type {\n ConfigureDocumoFaxRequest,\n DocumoFaxIngestionStats,\n DocumoFaxStatusResponse,\n} from '../types/generated/documo_fax';\nexport type { PaginatedResponseInboundFaxLogEntry } from '../types/generated/common';\n// The row shape is source-agnostic — the phone-number fax log returns the same\n// entries — so it lives with the artifact's own types, not Documo's.\nexport type { InboundFaxLogEntry, InboundFaxStatus } from '../types/generated/inbound_fax';\nexport { InboundFaxStatus as InboundFaxStatusValues } from '../types/generated/inbound_fax';\n\n/**\n * Documo (mFax) inbound fax.\n *\n * `getDocumoFaxSetup` and `rotateDocumoFaxCredentials` return the webhook\n * Basic password. Render it for the admin to copy; never log it.\n */\nexport class DocumoFaxApi extends BaseApiClient {\n async getDocumoFaxStatus(wid: string): Promise<DocumoFaxStatusResponse> {\n return this.fetch<DocumoFaxStatusResponse>(`w/${wid}/app-connections/documo-fax/status`);\n }\n\n async getDocumoFaxSetup(wid: string): Promise<DocumoFaxSetupResponse> {\n return this.fetch<DocumoFaxSetupResponse>(`w/${wid}/app-connections/documo-fax/setup`);\n }\n\n /**\n * Received-fax log for this connection.\n *\n * Entries carry `senderNumber`, which is an unauthenticated claim by the\n * sending machine and is PHI. Render it; never log it.\n *\n * `status` is repeatable — one query entry per value, matching the route's\n * `list[str]` binding. The date bounds filter on when the delivery was\n * recorded, not on `receivedAt`: a fax that failed before storage never\n * gets a `receivedAt`, so bounding that column would hide exactly the\n * failures an operator filtering by date is hunting for.\n */\n async listDocumoFaxes(\n wid: string,\n params?: {\n page?: number;\n pageSize?: number;\n status?: readonly InboundFaxStatus[];\n receivedAfter?: string;\n receivedBefore?: string;\n }\n ): Promise<PaginatedResponseInboundFaxLogEntry> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n params?.status?.forEach((value) => query.append('status', value));\n if (params?.receivedAfter) query.set('receivedAfter', params.receivedAfter);\n if (params?.receivedBefore) query.set('receivedBefore', params.receivedBefore);\n const suffix = query.toString() === '' ? '' : `?${query.toString()}`;\n return this.fetch<PaginatedResponseInboundFaxLogEntry>(\n `w/${wid}/app-connections/documo-fax/faxes${suffix}`\n );\n }\n\n /**\n * The three bodyless POSTs below send `{}` deliberately: the routes require\n * a JSON body as a CSRF barrier (a cross-site HTML form POST cannot set\n * Content-Type: application/json, so it 422s). See GRA-6284.\n */\n async installDocumoFax(wid: string): Promise<DocumoFaxSetupResponse> {\n return this.fetch<DocumoFaxSetupResponse>(`w/${wid}/app-connections/documo-fax/install`, {\n method: 'POST',\n body: JSON.stringify({}),\n });\n }\n\n async configureDocumoFax(\n wid: string,\n data: ConfigureDocumoFaxRequest\n ): Promise<DocumoFaxConnectionResponse> {\n return this.fetch<DocumoFaxConnectionResponse>(\n `w/${wid}/app-connections/documo-fax/configure`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n async verifyDocumoFax(wid: string): Promise<DocumoFaxConnectionResponse> {\n return this.fetch<DocumoFaxConnectionResponse>(`w/${wid}/app-connections/documo-fax/verify`, {\n method: 'POST',\n body: JSON.stringify({}),\n });\n }\n\n async rotateDocumoFaxCredentials(wid: string): Promise<DocumoFaxSetupResponse> {\n return this.fetch<DocumoFaxSetupResponse>(\n `w/${wid}/app-connections/documo-fax/rotate-credentials`,\n { method: 'POST', body: JSON.stringify({}) }\n );\n }\n}\n","// Raw backend response types (routes still on `response_model=dict`):\n// LinkCalendarToHealthieResponse, LinkMemberToHealthieResponse,\n// UnlinkMemberFromHealthieResponse.\nimport type { PaginatedResponse } from '../types/core-types';\nimport type {\n AvailableDayResponse,\n BookAppointmentRequest,\n BookingResultResponse,\n ConfigureHealthieRequest,\n HealthieAppointmentTypeResponse,\n HealthieAvailableSlotsRequest,\n HealthieConnectionStatus,\n HealthieLinkedMemberResponse,\n HealthieLinkMemberRequest,\n HealthiePatientResponse,\n HealthieProviderResponse,\n HealthieReconciliationMatchResponse,\n LinkCalendarToHealthieRequest,\n} from '../types/generated/healthie';\nimport { BaseApiClient } from './base';\n\nexport type {\n AvailableDayResponse,\n BookAppointmentRequest,\n BookingResultResponse,\n ConfigureHealthieRequest,\n HealthieAppointmentTypeResponse,\n HealthieConnectionStatus,\n HealthiePatientResponse,\n LinkCalendarToHealthieRequest,\n} from '../types/generated/healthie';\n\n/** Stable public SDK name for the generated backend response model. */\nexport type HealthieProvider = HealthieProviderResponse;\n\n/** Stable public SDK names for Healthie's generated reconciliation models. */\nexport type LinkedHealthieMember = HealthieLinkedMemberResponse;\nexport type HealthieReconciliationMatch = HealthieReconciliationMatchResponse;\nexport type LinkMemberToHealthieRequest = HealthieLinkMemberRequest;\n\nexport interface LinkCalendarToHealthieResponse {\n status: string;\n calendar_id: number;\n provider_id: string;\n sync: {\n event_types_synced: number;\n events_created: number;\n events_updated: number;\n };\n}\n\n/** Raw-dict response: the backend returns snake_case keys without an OpenAPI model. */\nexport interface LinkMemberToHealthieResponse {\n status: string;\n member_id: number;\n healthie_patient_id: string;\n}\n\n/** Raw-dict response: the backend returns snake_case keys without an OpenAPI model. */\nexport interface UnlinkMemberFromHealthieResponse {\n status: string;\n member_id: number;\n}\n\nexport type GetAvailableSlotsRequest = HealthieAvailableSlotsRequest;\n\nexport class HealthieApi extends BaseApiClient {\n async configureHealthie(\n wid: string,\n data: ConfigureHealthieRequest\n ): Promise<HealthieConnectionStatus> {\n return this.fetch<HealthieConnectionStatus>(`w/${wid}/app-connections/healthie/configure`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async getHealthieStatus(wid: string): Promise<HealthieConnectionStatus> {\n return this.fetch<HealthieConnectionStatus>(`w/${wid}/app-connections/healthie/status`);\n }\n\n async listHealthieProviders(wid: string): Promise<HealthieProvider[]> {\n return this.fetch<HealthieProvider[]>(`w/${wid}/app-connections/healthie/providers`);\n }\n\n async linkCalendarToHealthie(\n wid: string,\n data: LinkCalendarToHealthieRequest\n ): Promise<LinkCalendarToHealthieResponse> {\n return this.fetch<LinkCalendarToHealthieResponse>(\n `w/${wid}/app-connections/healthie/calendar/link`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n async unlinkCalendarFromHealthie(wid: string, calendarId: number): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(\n `w/${wid}/app-connections/healthie/calendar/${calendarId}/link`,\n { method: 'DELETE' }\n );\n }\n\n async syncCalendarWithHealthie(\n wid: string,\n calendarId: number\n ): Promise<LinkCalendarToHealthieResponse> {\n return this.fetch<LinkCalendarToHealthieResponse>(\n `w/${wid}/app-connections/healthie/calendar/${calendarId}/sync`,\n { method: 'POST' }\n );\n }\n\n async getLinkedHealthieMembers(\n wid: string,\n params?: { page?: number; pageSize?: number; search?: string }\n ): Promise<PaginatedResponse<LinkedHealthieMember>> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n if (params?.search?.trim()) query.set('search', params.search.trim());\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<LinkedHealthieMember>>(\n `w/${wid}/app-connections/healthie/reconciliation/linked${qs}`\n );\n }\n\n async getHealthieReconciliationMatches(\n wid: string,\n params?: { limit?: number; offset?: number }\n ): Promise<HealthieReconciliationMatch[]> {\n const query = new URLSearchParams();\n if (params?.limit !== undefined) query.set('limit', String(params.limit));\n if (params?.offset !== undefined) query.set('offset', String(params.offset));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<HealthieReconciliationMatch[]>(\n `w/${wid}/app-connections/healthie/reconciliation/matches${qs}`\n );\n }\n\n async linkMemberToHealthie(\n wid: string,\n data: LinkMemberToHealthieRequest\n ): Promise<LinkMemberToHealthieResponse> {\n return this.fetch(`w/${wid}/app-connections/healthie/reconciliation/link`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async unlinkMemberFromHealthie(\n wid: string,\n memberId: number\n ): Promise<UnlinkMemberFromHealthieResponse> {\n return this.fetch(`w/${wid}/app-connections/healthie/reconciliation/unlink/${memberId}`, {\n method: 'DELETE',\n });\n }\n\n async listHealthieAppointmentTypes(\n wid: string,\n providerId?: string\n ): Promise<HealthieAppointmentTypeResponse[]> {\n const query = new URLSearchParams();\n if (providerId) query.set('provider_id', providerId);\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<HealthieAppointmentTypeResponse[]>(\n `w/${wid}/app-connections/healthie/appointment-types${qs}`\n );\n }\n\n async listHealthiePatients(wid: string, keywords?: string): Promise<HealthiePatientResponse[]> {\n const query = new URLSearchParams();\n if (keywords?.trim()) query.set('keywords', keywords.trim());\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<HealthiePatientResponse[]>(\n `w/${wid}/app-connections/healthie/patients${qs}`\n );\n }\n\n async getHealthieAvailableSlots(\n wid: string,\n request: GetAvailableSlotsRequest\n ): Promise<AvailableDayResponse[]> {\n return this.fetch<AvailableDayResponse[]>(\n `w/${wid}/app-connections/healthie/scheduling/available-slots`,\n {\n method: 'POST',\n body: JSON.stringify(request),\n }\n );\n }\n\n async bookHealthieAppointment(\n wid: string,\n request: BookAppointmentRequest\n ): Promise<BookingResultResponse> {\n return this.fetch<BookingResultResponse>(\n `w/${wid}/app-connections/healthie/scheduling/book`,\n {\n method: 'POST',\n body: JSON.stringify(request),\n }\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport { PaginatedResponse } from '../types';\nimport {\n File,\n FileFormData,\n FileFolder,\n FileFolderFormData,\n FileSortField,\n SortOrder,\n FileLabel,\n FileLabelFormData,\n FileConversionResponse,\n FileUploadRequest,\n FileUploadResponse,\n UploadFileRequest,\n FolderSearchResult,\n FolderSearchParams,\n FileSharingResponse,\n FolderMemberAccessResponse,\n FolderSharingResponse,\n FileRoleAssociationResponse,\n UpdateFileRoleAssociationsRequest,\n UpdateFileSharingRequest,\n PublicFileMetadata,\n PublicFolderContents,\n} from '../types/file-types';\nimport {\n FileVersionDiffResponse,\n FileVersionListResponse,\n FileVersionRestoreResponse,\n} from '../types/file-version-types';\n\nexport class FilesApi extends BaseApiClient {\n /** List files in a workspace with optional folder filtering, sorting, and search. */\n async getFiles(\n wid: string,\n options: {\n folderId?: number;\n page?: number;\n pageSize?: number;\n sortBy?: FileSortField;\n sortOrder?: SortOrder;\n search?: string;\n } = {}\n ): Promise<PaginatedResponse<File>> {\n const params = new URLSearchParams();\n if (options.folderId) params.append('folder_id', options.folderId.toString());\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.search) params.append('search', options.search);\n return this.fetch<PaginatedResponse<File>>(\n `w/${wid}/files${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** Get a single file by ID. */\n async getFile(wid: string, id: number): Promise<File> {\n return this.fetch<File>(`w/${wid}/files/${id}`);\n }\n\n /**\n * Resolve a wiki-style relative path (as authored in a markdown link or\n * image) to a file. `folderId` is the linking document's folder; omit it\n * to resolve from the workspace root. Handles `.`/`..` segments and an\n * omitted `.md` extension server-side.\n */\n async resolveFilePath(wid: string, path: string, folderId?: number | null): Promise<File> {\n const params = new URLSearchParams({ path });\n if (folderId != null) params.append('folderId', String(folderId));\n return this.fetch<File>(`w/${wid}/files/resolve-path?${params.toString()}`);\n }\n\n /**\n * Download one file's bytes via GET ``.../files/{id}/contents/{filename}``.\n *\n * Uses this client's base URL (FastAPI on the app, same-origin ``/api/v2``\n * on scoped site sessions) so the payload does not transit the Next.js\n * ``/api/w/.../files/...`` Lambda proxy, which 500s above the 6MB sync cap.\n */\n async downloadFileContents(wid: string, id: number, filename: string): Promise<Blob> {\n const response = await this.fetchRaw(\n `w/${wid}/files/${id}/contents/${encodeURIComponent(filename)}`\n );\n return response.blob();\n }\n\n /**\n * Download the given files + folders (folders recursively) as a single ZIP.\n * Returns the raw archive bytes for the caller to save.\n */\n async downloadFilesZip(wid: string, fileIds: number[], folderIds: number[]): Promise<Blob> {\n const response = await this.fetchRaw(`w/${wid}/files/download/zip`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ file_ids: fileIds, folder_ids: folderIds }),\n });\n return response.blob();\n }\n\n /** Create a new file record in the workspace. */\n async createFile(wid: string, file: FileFormData): Promise<File> {\n return this.fetch<File>(`w/${wid}/files`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(file),\n });\n }\n\n /** Upload in-memory file content through the API's database-backed file path. */\n async uploadFile(wid: string, request: UploadFileRequest): Promise<File> {\n const mimeType = request.mimeType ?? 'application/octet-stream';\n const bytes = await dataToBytes(request.data);\n return this.createFile(wid, {\n title: request.title ?? request.filename,\n filename: request.filename,\n description: request.description,\n mimeType,\n folderId: request.folderId,\n siteId: request.siteId,\n dataBase64: bytesToBase64(bytes),\n externalId: request.externalId,\n oauthCredentialUuid: request.oauthCredentialUuid,\n access: request.access,\n labelIds: request.labelIds,\n overwrite: request.overwrite,\n });\n }\n\n /** Update an existing file's metadata. */\n async updateFile(wid: string, id: number, file: Partial<FileFormData>): Promise<File> {\n return this.fetch<File>(`w/${wid}/files/${id}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(file),\n });\n }\n\n /** Delete a file by ID. */\n async deleteFile(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/files/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** List a file's version history (newest first). */\n async listFileVersions(wid: string, fileId: number): Promise<FileVersionListResponse> {\n return this.fetch<FileVersionListResponse>(`w/${wid}/files/${fileId}/versions`);\n }\n\n /** Compare two versions of a file. For text files both raw contents are returned. */\n async getFileVersionDiff(\n wid: string,\n fileId: number,\n fromVersion: number,\n toVersion: number\n ): Promise<FileVersionDiffResponse> {\n return this.fetch<FileVersionDiffResponse>(\n `w/${wid}/files/${fileId}/versions/diff?fromVersion=${fromVersion}&toVersion=${toVersion}`\n );\n }\n\n /** Restore an earlier version as the file's current contents. */\n async restoreFileVersion(\n wid: string,\n fileId: number,\n versionNumber: number,\n changeNote?: string\n ): Promise<FileVersionRestoreResponse> {\n return this.fetch<FileVersionRestoreResponse>(\n `w/${wid}/files/${fileId}/versions/${versionNumber}/restore`,\n {\n method: 'POST',\n // Required JSON body: keeps this cookie-auth POST non-forgeable\n // by cross-site HTML forms (backend rejects bodyless requests).\n body: JSON.stringify(changeNote ? { changeNote } : {}),\n }\n );\n }\n\n /**\n * Same-origin proxy URL for a version's raw contents. Mirrors the shape of\n * `FileResponse.cdnUrl`: an app-relative Next.js route that authenticates\n * via session cookies and forwards to the versioned contents endpoint.\n */\n getFileVersionContentsUrl(wid: string, fileId: number, versionNumber: number): string {\n return `/api/w/${wid}/files/${fileId}/versions/${versionNumber}/contents`;\n }\n\n /** Convert a file to the specified format (text, markdown, or PDF). */\n async convertFile(\n wid: string,\n fileId: number,\n format: 'text' | 'markdown' | 'pdf' = 'pdf'\n ): Promise<FileConversionResponse> {\n return this.fetch<FileConversionResponse>(\n `w/${wid}/files/${fileId}/convert?format=${format}`,\n {\n method: 'POST',\n }\n );\n }\n\n /** Generate a pre-signed upload URL for uploading file content. */\n async generateFileUploadUrl(\n wid: string,\n request: FileUploadRequest\n ): Promise<FileUploadResponse> {\n return this.fetch<FileUploadResponse>(`w/${wid}/files/upload-url`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n });\n }\n\n /** List child folders of a given parent folder.\n *\n * `parentId` is required — use the workspace root folder ID from\n * `WorkspaceSettings.workspaceFolderId` as the starting point for\n * workspace-level browsing.\n */\n async getFolders(\n wid: string,\n parentIdOrOpts: number | { parentId: number }\n ): Promise<FileFolder[]> {\n const parentId =\n typeof parentIdOrOpts === 'number' ? parentIdOrOpts : parentIdOrOpts.parentId;\n return this.fetch<FileFolder[]>(`w/${wid}/folders?parent_id=${parentId}`);\n }\n\n /** Get a single folder by ID. */\n async getFolder(wid: string, id: number): Promise<FileFolder> {\n return this.fetch<FileFolder>(`w/${wid}/folders/${id}`);\n }\n\n /** Create a new folder in the workspace. */\n async createFolder(wid: string, directory: FileFolderFormData): Promise<FileFolder> {\n return this.fetch<FileFolder>(`w/${wid}/folders`, {\n method: 'POST',\n body: JSON.stringify(directory),\n });\n }\n\n /** Update a folder's properties. */\n async updateFolder(\n wid: string,\n id: number,\n directory: Partial<FileFolderFormData>\n ): Promise<FileFolder> {\n return this.fetch<FileFolder>(`w/${wid}/folders/${id}`, {\n method: 'PUT',\n body: JSON.stringify(directory),\n });\n }\n\n /** Delete a folder by ID. */\n async deleteFolder(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/folders/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Trigger reindexing of a folder's contents for search. */\n async reindexFolder(wid: string, id: number): Promise<{ status: string; message: string }> {\n return this.fetch<{ status: string; message: string }>(`w/${wid}/folders/${id}/reindex`, {\n method: 'POST',\n });\n }\n\n /** Search for content within a folder using semantic search. */\n async searchFolder(\n wid: string,\n id: number,\n params: FolderSearchParams\n ): Promise<FolderSearchResult[]> {\n const searchParams = new URLSearchParams();\n searchParams.append('query', params.query);\n if (params.topK) searchParams.append('top_k', params.topK.toString());\n\n return this.fetch<FolderSearchResult[]>(\n `w/${wid}/folders/${id}/search?${searchParams.toString()}`\n );\n }\n\n /** List all file labels in the workspace. */\n async getFileLabels(wid: string): Promise<FileLabel[]> {\n return this.fetch<FileLabel[]>(`w/${wid}/file-labels`);\n }\n\n /** Get a single file label by ID. */\n async getFileLabel(wid: string, id: number): Promise<FileLabel> {\n return this.fetch<FileLabel>(`w/${wid}/file-labels/${id}`);\n }\n\n /** Get a single file label by UUID. */\n async getFileLabelByUuid(wid: string, uuid: string): Promise<FileLabel> {\n return this.fetch<FileLabel>(`w/${wid}/file-labels/${uuid}`);\n }\n\n /** Create a new file label in the workspace. */\n async createFileLabel(wid: string, label: FileLabelFormData): Promise<FileLabel> {\n return this.fetch<FileLabel>(`w/${wid}/file-labels`, {\n method: 'POST',\n body: JSON.stringify(label),\n });\n }\n\n /** Update a file label's properties. */\n async updateFileLabel(\n wid: string,\n id: number,\n label: Partial<FileLabelFormData>\n ): Promise<FileLabel> {\n return this.fetch<FileLabel>(`w/${wid}/file-labels/${id}`, {\n method: 'PUT',\n body: JSON.stringify(label),\n });\n }\n\n /** Delete a file label by ID. */\n async deleteFileLabel(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/file-labels/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Get sharing settings for a file. */\n async getFileSharing(wid: string, fileId: number): Promise<FileSharingResponse> {\n return this.fetch<FileSharingResponse>(`w/${wid}/files/${fileId}/sharing`);\n }\n\n /** Update the role associations for a file's sharing permissions. */\n async updateFileRoles(\n wid: string,\n fileId: number,\n data: UpdateFileRoleAssociationsRequest\n ): Promise<FileRoleAssociationResponse[]> {\n return this.fetch<FileRoleAssociationResponse[]>(`w/${wid}/files/${fileId}/sharing/roles`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Remove a role's access to a file. */\n async removeFileRole(wid: string, fileId: number, roleId: number): Promise<void> {\n return this.fetch(`w/${wid}/files/${fileId}/sharing/roles/${roleId}`, {\n method: 'DELETE',\n });\n }\n\n /** Get sharing settings for a folder. */\n async getFolderSharing(wid: string, folderId: number): Promise<FolderSharingResponse> {\n return this.fetch<FolderSharingResponse>(`w/${wid}/folders/${folderId}/sharing`);\n }\n\n /**\n * Ask whether another member can read a folder, evaluated by the real\n * authorizer as that member. Used to tell \"a landing folder is set\" apart\n * from \"the fax owner can actually open it\".\n */\n async getFolderMemberAccess(\n wid: string,\n folderId: number,\n memberId: number\n ): Promise<FolderMemberAccessResponse> {\n return this.fetch<FolderMemberAccessResponse>(\n `w/${wid}/folders/${folderId}/member-access?memberId=${memberId}`\n );\n }\n\n /** Update the role associations for a folder's sharing permissions. */\n async updateFolderRoles(\n wid: string,\n folderId: number,\n data: UpdateFileRoleAssociationsRequest\n ): Promise<FileRoleAssociationResponse[]> {\n return this.fetch<FileRoleAssociationResponse[]>(\n `w/${wid}/folders/${folderId}/sharing/roles`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n }\n\n /** Remove a role's access to a folder. */\n async removeFolderRole(wid: string, folderId: number, roleId: number): Promise<void> {\n return this.fetch(`w/${wid}/folders/${folderId}/sharing/roles/${roleId}`, {\n method: 'DELETE',\n });\n }\n\n /** Update all sharing settings for a file in a single request. */\n async updateFileSharing(\n wid: string,\n fileId: number,\n data: UpdateFileSharingRequest\n ): Promise<FileSharingResponse> {\n return this.fetch<FileSharingResponse>(`w/${wid}/files/${fileId}/sharing`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Update all sharing settings for a folder in a single request. */\n async updateFolderSharing(\n wid: string,\n folderId: number,\n data: UpdateFileSharingRequest\n ): Promise<FolderSharingResponse> {\n return this.fetch<FolderSharingResponse>(`w/${wid}/folders/${folderId}/sharing`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Get metadata for a publicly shared file (unauthenticated). */\n async getPublicFile(wid: string, fileId: number): Promise<PublicFileMetadata> {\n return this.fetch<PublicFileMetadata>(`w/${wid}/sharing/files/${fileId}`);\n }\n\n /** Get contents of a publicly shared folder (unauthenticated). */\n async getPublicFolder(\n wid: string,\n folderId: number,\n page = 1,\n pageSize = 100\n ): Promise<PublicFolderContents> {\n return this.fetch<PublicFolderContents>(\n `w/${wid}/sharing/folders/${folderId}?page=${page}&pageSize=${pageSize}`\n );\n }\n\n /** List files within a publicly shared folder (unauthenticated). */\n async getPublicFolderFiles(\n wid: string,\n folderId: number,\n page = 1,\n pageSize = 100\n ): Promise<{ files: PublicFileMetadata[]; pagination?: any }> {\n return this.fetch<{ files: PublicFileMetadata[]; pagination?: any }>(\n `w/${wid}/sharing/folders/${folderId}/files?page=${page}&pageSize=${pageSize}`\n );\n }\n}\n\nasync function dataToBytes(data: UploadFileRequest['data']): Promise<Uint8Array> {\n if (typeof data === 'string') {\n return new TextEncoder().encode(data);\n }\n if (data instanceof Uint8Array) {\n return data;\n }\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n if (ArrayBuffer.isView(data)) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n if (typeof Blob !== 'undefined' && data instanceof Blob) {\n return new Uint8Array(await data.arrayBuffer());\n }\n throw new Error('Unsupported file data type');\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n if (typeof btoa === 'function') {\n const chunkSize = 0x8000;\n let binary = '';\n for (let i = 0; i < bytes.length; i += chunkSize) {\n binary += String.fromCharCode(...bytes.subarray(i, i + chunkSize));\n }\n return btoa(binary);\n }\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(bytes).toString('base64');\n }\n throw new Error('No base64 encoder is available in this runtime');\n}\n","import {\n AddEmailSenderAsMemberRequest,\n Email,\n EmailSendRequest,\n Inbox,\n InboxCreateRequest,\n InboxUpdateRequest,\n Member,\n PaginatedResponse,\n} from '../types';\nimport {\n ChatEmailsResponse,\n EmailConversionResponse,\n EmailPreviewRequest,\n EmailPreviewResponse,\n EmailReplyPreviewRequest,\n InboxThreadsPageResponse,\n ThreadEmailsResponse,\n} from '../types/communication-types';\nimport { BaseApiClient } from './base';\nimport type { EmailReplyRequest } from '../types/generated/inbox';\n\nexport class InboxesApi extends BaseApiClient {\n /** List all inboxes in a workspace. */\n async getInboxes(wid: string): Promise<PaginatedResponse<Inbox>> {\n return this.fetch<PaginatedResponse<Inbox>>(`w/${wid}/inboxes`);\n }\n\n /**\n * Get an inbox by ID or UUID.\n *\n * The route has always taken either (`inbox_id: str = Path(..., description=\n * \"Inbox ID or UUID\")`); the signature said `number`, which put the UUID path\n * out of reach for a caller holding an inbox ref from the activity feed —\n * where refs are UUID-only by design.\n */\n async getInbox(wid: string, id: number | string): Promise<Inbox> {\n return this.fetch<Inbox>(`w/${wid}/inboxes/${id}`);\n }\n\n /** Create a new inbox. */\n async createInbox(wid: string, inbox: InboxCreateRequest): Promise<Inbox> {\n return this.fetch<Inbox>(`w/${wid}/inboxes`, {\n method: 'POST',\n body: JSON.stringify(inbox),\n });\n }\n\n /** Update an inbox. */\n async updateInbox(wid: string, id: number, inbox: InboxUpdateRequest): Promise<Inbox> {\n return this.fetch<Inbox>(`w/${wid}/inboxes/${id}`, {\n method: 'PUT',\n body: JSON.stringify(inbox),\n });\n }\n\n /** Delete an inbox. */\n async deleteInbox(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/inboxes/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** List emails in an inbox with pagination and optional attachment inclusion. */\n async getInboxEmails(\n wid: string,\n inboxId: number,\n options: {\n page?: number;\n pageSize?: number;\n includeAttachments?: boolean;\n } = {}\n ): Promise<PaginatedResponse<Email>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.includeAttachments)\n params.append('include_attachments', options.includeAttachments.toString());\n\n return this.fetch<PaginatedResponse<Email>>(\n `w/${wid}/inboxes/${inboxId}/emails${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** Get a single email from an inbox. */\n async getInboxEmail(wid: string, inboxId: number, emailId: number): Promise<Email> {\n return this.fetch<Email>(`w/${wid}/inboxes/${inboxId}/emails/${emailId}`);\n }\n\n /** Mark an email as read. */\n async markEmailAsRead(wid: string, inboxId: number, emailId: number): Promise<Email> {\n return this.fetch<Email>(`w/${wid}/inboxes/${inboxId}/emails/${emailId}/mark-read`, {\n method: 'POST',\n });\n }\n\n /** Mark an email as unread. */\n async markEmailAsUnread(wid: string, inboxId: number, emailId: number): Promise<Email> {\n return this.fetch<Email>(`w/${wid}/inboxes/${inboxId}/emails/${emailId}/unread`, {\n method: 'POST',\n });\n }\n\n /** Reply to an email from the inbox. */\n async replyToEmail(\n wid: string,\n inboxId: number,\n emailId: number,\n content: string,\n htmlContent?: string\n ): Promise<Email> {\n const body: EmailReplyRequest = { content, htmlContent };\n return this.fetch<Email>(`w/${wid}/inboxes/${inboxId}/emails/${emailId}/reply`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n /** Compose and send a new email from an inbox. */\n async sendInboxEmail(wid: string, inboxId: number, body: EmailSendRequest): Promise<Email> {\n return this.fetch<Email>(`w/${wid}/inboxes/${inboxId}/emails`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n /**\n * Render a compose or `email:send` template draft through the same\n * outbound body-assembly seam (footer, layout wrapper, markdown fallback)\n * as sending. Preview excludes delivery-specific MIME transformations,\n * including inline-image content IDs.\n */\n async previewInboxEmail(\n wid: string,\n inboxId: number | string,\n body: EmailPreviewRequest\n ): Promise<EmailPreviewResponse> {\n return this.fetch<EmailPreviewResponse>(`w/${wid}/inboxes/${inboxId}/emails/preview`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n /**\n * Render a reply draft, including its quote, through outbound body\n * assembly. Preview excludes delivery-specific MIME transformations,\n * including inline-image content IDs.\n */\n async previewEmailReply(\n wid: string,\n inboxId: number | string,\n emailId: number,\n body: EmailReplyPreviewRequest\n ): Promise<EmailPreviewResponse> {\n return this.fetch<EmailPreviewResponse>(\n `w/${wid}/inboxes/${inboxId}/emails/${emailId}/reply-preview`,\n {\n method: 'POST',\n body: JSON.stringify(body),\n }\n );\n }\n\n /**\n * Make a stored email's sender a Member of this workspace.\n *\n * The explicit alternative to auto-signup for inboxes that accept\n * non-member mail. Requires `members:write` AND `inboxes:read`. Responds\n * 409 when a Member already holds the address — gate the call on\n * `Email.senderIsMember` rather than discovering it from the error.\n */\n async addEmailSenderAsMember(\n wid: string,\n inboxId: number,\n emailId: number,\n body: AddEmailSenderAsMemberRequest\n ): Promise<Member> {\n return this.fetch<Member>(\n `w/${wid}/inboxes/${inboxId}/emails/${emailId}/add-sender-as-member`,\n {\n method: 'POST',\n body: JSON.stringify(body),\n }\n );\n }\n\n /** Convert an email to text, markdown, or PDF format. */\n async convertEmail(\n wid: string,\n inboxId: number,\n emailId: number,\n format: 'text' | 'markdown' | 'pdf' = 'pdf'\n ): Promise<EmailConversionResponse> {\n return this.fetch<EmailConversionResponse>(\n `w/${wid}/inboxes/${inboxId}/emails/${emailId}/convert?format=${format}`,\n {\n method: 'POST',\n }\n );\n }\n\n /** Download an email attachment as raw bytes. */\n async downloadEmailAttachment(\n wid: string,\n inboxId: number,\n emailId: number,\n attachmentId: string\n ): Promise<ArrayBuffer> {\n const response = await this.fetchRaw(\n `w/${wid}/inboxes/${inboxId}/emails/${emailId}/attachments/${attachmentId}`\n );\n return response.arrayBuffer();\n }\n\n /** List email threads in an inbox. */\n async getInboxThreads(wid: string, inboxId: number): Promise<InboxThreadsPageResponse> {\n return this.fetch<InboxThreadsPageResponse>(`w/${wid}/inboxes/${inboxId}/threads`);\n }\n\n /** List emails in a thread by assignment ID with pagination. */\n async getThreadEmails(\n wid: string,\n inboxId: number,\n assignmentId: number,\n options: { page?: number; pageSize?: number; includeAttachments?: boolean } = {}\n ): Promise<ThreadEmailsResponse> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.includeAttachments)\n params.append('include_attachments', options.includeAttachments.toString());\n\n return this.fetch<ThreadEmailsResponse>(\n `w/${wid}/inboxes/${inboxId}/assignments/${assignmentId}/emails${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** List emails associated with a chat with pagination. */\n async getChatEmails(\n wid: string,\n inboxId: number,\n chatId: number,\n options: { page?: number; pageSize?: number; includeAttachments?: boolean } = {}\n ): Promise<ChatEmailsResponse> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.includeAttachments)\n params.append('include_attachments', options.includeAttachments.toString());\n\n return this.fetch<ChatEmailsResponse>(\n `w/${wid}/inboxes/${inboxId}/chats/${chatId}/emails${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n}\n","import type {\n CreateInquiryRequest,\n EnrichInquiryRequest,\n Inquiry,\n InquiryListResponse,\n UpdateInquiryRequest,\n} from '../types/inquiry-types';\nimport { BaseApiClient } from './base';\n\nexport class InquiriesApi extends BaseApiClient {\n /**\n * Create a new inquiry (public endpoint)\n */\n async createInquiry(data: CreateInquiryRequest): Promise<Inquiry> {\n return this.fetch<Inquiry>('inquiries', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Enrich an existing inquiry with additional fields (public endpoint).\n * Uses the inquiry UUID (from cookie) to identify the inquiry.\n */\n async enrichInquiry(inquiryUuid: string, data: EnrichInquiryRequest): Promise<Inquiry> {\n return this.fetch<Inquiry>(`inquiries/enrich/${inquiryUuid}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * List all inquiries (superuser only)\n */\n async listInquiries(params?: {\n page?: number;\n pageSize?: number;\n inquiryType?: string;\n }): Promise<InquiryListResponse> {\n const searchParams = new URLSearchParams();\n if (params?.page) searchParams.append('page', params.page.toString());\n if (params?.pageSize) searchParams.append('page_size', params.pageSize.toString());\n if (params?.inquiryType) searchParams.append('inquiry_type', params.inquiryType);\n\n const queryString = searchParams.toString();\n const url = queryString ? `inquiries?${queryString}` : 'inquiries';\n\n return this.fetch<InquiryListResponse>(url);\n }\n\n /**\n * Get a specific inquiry (superuser only)\n */\n async getInquiry(inquiryId: number): Promise<Inquiry> {\n return this.fetch<Inquiry>(`inquiries/${inquiryId}`);\n }\n\n /**\n * Update an inquiry (superuser only)\n */\n async updateInquiry(inquiryId: number, data: UpdateInquiryRequest): Promise<Inquiry> {\n return this.fetch<Inquiry>(`inquiries/${inquiryId}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete an inquiry (superuser only)\n */\n async deleteInquiry(inquiryId: number): Promise<void> {\n await this.fetch(`inquiries/${inquiryId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Export inquiries to CSV with optional status filtering (superuser only)\n */\n async exportInquiriesCsv(statusFilter?: string): Promise<Blob> {\n const params = new URLSearchParams();\n if (statusFilter) {\n params.append('status_filter', statusFilter);\n }\n\n const queryString = params.toString();\n const url = queryString ? `inquiries/export/csv?${queryString}` : 'inquiries/export/csv';\n\n const response = await fetch(`${this.baseUrl}/api/v2/${url}`, {\n method: 'GET',\n credentials: 'include',\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.detail || 'Export failed');\n }\n\n return response.blob();\n }\n}\n","import {\n AppConnectionDirectoryResponse,\n AppConnectionItem,\n CreateAppConnectionRequest,\n PlatformAppConnectionResponse,\n UpdateAppConnectionRequest,\n} from '../types/app-connection-types';\nimport { BaseApiClient } from './base';\n\n/** GRA-2920: distinct MemberField keys owned by a single app connection. */\nexport interface ConnectionMemberFieldKeysResponse {\n keys: string[];\n}\n\nexport class AppConnectionsApi extends BaseApiClient {\n /**\n * List all app connection definitions the workspace can access.\n * Returns static metadata only (no instance counts or active data).\n */\n async listAvailableAppConnections(wid: string): Promise<AppConnectionDirectoryResponse> {\n return this.fetch<AppConnectionDirectoryResponse>(`w/${wid}/app-connections/available`);\n }\n\n /**\n * List all active app connections across all types.\n * Returns a union of platform apps, MCP servers, Discord bots,\n * Slack apps, and FHIR connections.\n */\n async listAppConnections(wid: string): Promise<AppConnectionItem[]> {\n return this.fetch<AppConnectionItem[]>(`w/${wid}/app-connections`);\n }\n\n /**\n * Enable a platform app connection in the workspace.\n */\n async enablePlatformApp(\n wid: string,\n data: CreateAppConnectionRequest\n ): Promise<PlatformAppConnectionResponse> {\n return this.fetch<PlatformAppConnectionResponse>(`w/${wid}/app-connections/platform-apps`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Get platform app connection details by UUID.\n */\n async getPlatformApp(wid: string, appUuid: string): Promise<PlatformAppConnectionResponse> {\n return this.fetch<PlatformAppConnectionResponse>(\n `w/${wid}/app-connections/platform-apps/${appUuid}`\n );\n }\n\n /**\n * Update platform app config, enabled status, or name.\n */\n async updatePlatformApp(\n wid: string,\n appUuid: string,\n data: UpdateAppConnectionRequest\n ): Promise<PlatformAppConnectionResponse> {\n return this.fetch<PlatformAppConnectionResponse>(\n `w/${wid}/app-connections/platform-apps/${appUuid}`,\n {\n method: 'PATCH',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Disable (soft) or delete (hard) a platform app connection.\n */\n async deletePlatformApp(\n wid: string,\n appUuid: string,\n hard: boolean = false\n ): Promise<{ disabled?: boolean; deleted?: boolean; uuid: string }> {\n const params = hard ? '?hard=true' : '';\n return this.fetch<{ disabled?: boolean; deleted?: boolean; uuid: string }>(\n `w/${wid}/app-connections/platform-apps/${appUuid}${params}`,\n { method: 'DELETE' }\n );\n }\n\n /**\n * List distinct ``MemberField.key`` values scoped to a connection\n * (GRA-2920). Drives the Monday custom-match \"Custom fields\" picker.\n *\n * Returns only the set of keys already in use on this connection;\n * values are intentionally never exposed. Operators can also add a\n * new key via the UI's \"Add custom field key\" free-text action.\n */\n async setDefaultGooglePlatformAccount(\n wid: string,\n connectionUuid: string,\n credentialUuid: string\n ): Promise<{ accounts: unknown[]; total: number }> {\n return this.fetch<{ accounts: unknown[]; total: number }>(\n `w/${wid}/app-connections/google/platform-apps/${connectionUuid}/accounts/${credentialUuid}/default`,\n { method: 'POST' }\n );\n }\n\n async listConnectionMemberFieldKeys(\n wid: string,\n connectionId: number\n ): Promise<ConnectionMemberFieldKeysResponse> {\n return this.fetch<ConnectionMemberFieldKeysResponse>(\n `w/${wid}/app-connections/${connectionId}/member-field-keys`\n );\n }\n}\n","import type {\n McpServerToolsResponse,\n McpServerResourcesResponse,\n McpServerPromptsResponse,\n McpTestConnectionResponse,\n} from '../types/app-connection-types';\nimport { McpServer, McpServerFormData, McpServerUpdateFormData } from '../types';\nimport { BaseApiClient } from './base';\n\nexport class McpServersApi extends BaseApiClient {\n /**\n * List all MCP servers in a workspace\n */\n async getMcpServers(wid: string): Promise<McpServer[]> {\n return this.fetch<McpServer[]>(`w/${wid}/app-connections/mcp-servers`);\n }\n\n /**\n * Get a specific MCP server\n */\n async getMcpServer(wid: string, serverId: number): Promise<McpServer> {\n return this.fetch<McpServer>(`w/${wid}/app-connections/mcp-servers/${serverId}`);\n }\n\n /**\n * Create a new MCP server\n */\n async createMcpServer(wid: string, data: McpServerFormData): Promise<McpServer> {\n return this.fetch<McpServer>(`w/${wid}/app-connections/mcp-servers`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Update an existing MCP server\n */\n async updateMcpServer(\n wid: string,\n serverId: number,\n data: McpServerUpdateFormData\n ): Promise<McpServer> {\n return this.fetch<McpServer>(`w/${wid}/app-connections/mcp-servers/${serverId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete an MCP server\n */\n async deleteMcpServer(wid: string, serverId: number): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`w/${wid}/app-connections/mcp-servers/${serverId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Enable an MCP server\n */\n async enableMcpServer(wid: string, serverId: number): Promise<McpServer> {\n return this.fetch<McpServer>(`w/${wid}/app-connections/mcp-servers/${serverId}/enable`, {\n method: 'POST',\n });\n }\n\n /**\n * Disable an MCP server\n */\n async disableMcpServer(wid: string, serverId: number): Promise<McpServer> {\n return this.fetch<McpServer>(`w/${wid}/app-connections/mcp-servers/${serverId}/disable`, {\n method: 'POST',\n });\n }\n\n /**\n * Get tools for an MCP server.\n *\n * Returns 403 with `detail.code === 'auth_required'` when the\n * current user needs to authenticate first.\n */\n async getMcpServerTools(wid: string, serverId: number): Promise<McpServerToolsResponse> {\n return this.fetch<McpServerToolsResponse>(\n `w/${wid}/app-connections/mcp-servers/${serverId}/tools`\n );\n }\n\n /**\n * Get resources for an MCP server.\n *\n * Returns 403 with `detail.code === 'auth_required'` when the\n * current user needs to authenticate first.\n */\n async getMcpServerResources(wid: string, serverId: number): Promise<McpServerResourcesResponse> {\n return this.fetch<McpServerResourcesResponse>(\n `w/${wid}/app-connections/mcp-servers/${serverId}/resources`\n );\n }\n\n /**\n * Get prompts for an MCP server.\n *\n * Returns 403 with `detail.code === 'auth_required'` when the\n * current user needs to authenticate first.\n */\n async getMcpServerPrompts(wid: string, serverId: number): Promise<McpServerPromptsResponse> {\n return this.fetch<McpServerPromptsResponse>(\n `w/${wid}/app-connections/mcp-servers/${serverId}/prompts`\n );\n }\n\n /**\n * Test connection to an MCP server.\n */\n async testMcpServerConnection(\n wid: string,\n serverId: number\n ): Promise<McpTestConnectionResponse> {\n return this.fetch<McpTestConnectionResponse>(\n `w/${wid}/app-connections/mcp-servers/${serverId}/test`,\n { method: 'POST' }\n );\n }\n\n /**\n * Discover OAuth metadata for an authorization server\n */\n async discoverOAuthMetadata(\n wid: string,\n data: { oauthServerUrl: string }\n ): Promise<{ success: boolean; metadata?: any; error?: string }> {\n return this.fetch<{ success: boolean; metadata?: any; error?: string }>(\n `w/${wid}/app-connections/mcp-servers/oauth-discovery`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n}\n","import {\n CreateWorkspaceMemberRequest,\n Member,\n MemberFilter,\n MemberFilterFormData,\n MemberFormData,\n MemberLabel,\n MemberLabelFormData,\n MemberRole,\n MemberRoleCleanupPlan,\n MemberRoleFormData,\n MergeMemberRolesRequest,\n MergeMemberRolesResult,\n MemberSortField,\n PaginatedResponse,\n SortOrder,\n UpdateWorkspaceMemberRequest,\n} from '../types';\nimport type {\n BulkCreateMembersRequest,\n BulkCreateMembersResponse,\n MemberMemoriesResponse,\n MemoryItem,\n MemoryType,\n} from '../types/member-types';\nimport type { QueryPredicate } from '../types/query-engine-types';\nimport type { PaginatedResponseDataRecordResponse } from '../types/generated/common';\nimport type { MyDataTypeResponse } from '../types/generated/me_record';\nimport type {\n ClearWorkflowVoiceResponse,\n MemberWorkflowVoicesResponse,\n SetWorkflowVoiceRequest,\n WorkflowVoiceRowResponse,\n} from '../types/generated/member_voice_preference';\nimport type {\n CancelCredentialChangeInviteResponse,\n CredentialChangeInviteResponse,\n CredentialType,\n PendingCredentialChangeInvite,\n} from '../types/account-types';\nimport type {\n CreateMemberFieldRequest,\n MemberField,\n MemberFieldDefinitionListResponse,\n MemberFieldListResponse,\n UpdateMemberFieldRequest,\n} from '../types/member-field-types';\nimport type {\n CreateMemberRelationshipRequest,\n MemberRelationshipKindValue,\n MemberRelationshipResponse,\n} from '../types/member-relationship-types';\nimport type {\n AnonymousMemberResolution,\n CurrentMember,\n ExpireAnonymousMemberRequest,\n MemberImportOptions,\n MemberImportPreviewResponse,\n MemberImportStreamEvent,\n MemberSyncLink,\n PendingAnonymousMembersResponse,\n ResolveAnonymousMemberRequest,\n} from '../types/member-types';\nimport { BaseApiClient } from './base';\n\n/**\n * Thrown by previewImportMembers / importMembers when the server returns a\n * structured validation-error payload (`{ message, errors: string[] }`). Carries\n * the per-row error strings (column/field names only — PHI-safe by the server\n * contract) on a typed field instead of an untyped `(error as any)` cast.\n */\nexport class MemberImportValidationError extends Error {\n readonly validationErrors: string[];\n\n constructor(message: string, validationErrors: string[]) {\n super(message);\n this.name = 'MemberImportValidationError';\n this.validationErrors = validationErrors;\n }\n}\n\n/**\n * Throw the right error for a failed preview/import response.\n *\n * CSV-validation failures (e.g. duplicate/invalid columns from `validate_csv`)\n * bubble through the backend's global ValueError handler, which returns `detail`\n * as a JSON-encoded STRING — `{\"detail\": \"{\\\"message\\\":..., \\\"errors\\\":[...]}\"}` —\n * not an object. A naive `typeof detail === 'object'` check misses that and drops\n * the structured per-row errors, so callers lose `validationErrors`. Parse string\n * detail before classifying; fall back to a plain Error for non-structured detail\n * (e.g. \"Only CSV files are allowed\").\n */\nfunction throwMemberImportError(errorBody: { detail?: unknown }, fallback: string): never {\n let detail: unknown = errorBody?.detail;\n if (typeof detail === 'string') {\n try {\n const parsed: unknown = JSON.parse(detail);\n if (parsed && typeof parsed === 'object') detail = parsed;\n } catch {\n // Plain string detail (not a JSON payload) — leave as-is.\n }\n }\n if (detail && typeof detail === 'object') {\n const { message, errors } = detail as { message?: string; errors?: unknown };\n if (Array.isArray(errors)) {\n throw new MemberImportValidationError(message || fallback, errors as string[]);\n }\n }\n throw new Error(typeof detail === 'string' ? detail : fallback);\n}\n\nfunction memberImportUpload(file: Blob, roleId: number, options?: MemberImportOptions) {\n const body = new FormData();\n const filename = 'name' in file && typeof file.name === 'string' ? file.name : 'members.csv';\n body.append('file', file, filename);\n if (options?.resolutions !== undefined) {\n body.append('resolutions', JSON.stringify(options.resolutions));\n }\n const params = new URLSearchParams({ new_member_role_id: String(roleId) });\n if (options?.autoPromoteUniqueContacts !== undefined) {\n params.set('auto_promote_unique_contacts', String(options.autoPromoteUniqueContacts));\n }\n return { body, params };\n}\n\nexport class MembersApi extends BaseApiClient {\n private readonly memberImportPlans = new WeakMap<\n Blob,\n { wid: string; role: number; autoPromote: boolean; token: string; cachedAt: number }\n >();\n /** Get the currently authenticated member for a workspace. */\n async getCurrentMember(wid: string): Promise<CurrentMember> {\n return this.fetch<CurrentMember>(`w/${wid}/me`);\n }\n\n /**\n * One row per workflow available to the member, with its voice state\n * (Custom Voice). Own-data-or-scope: a member reads their OWN rows with\n * no member scope; others need members:read.\n */\n async getMemberWorkflowVoices(\n wid: string,\n memberId: number\n ): Promise<MemberWorkflowVoicesResponse> {\n return this.fetch<MemberWorkflowVoicesResponse>(\n `w/${wid}/members/${memberId}/workflow-voices`\n );\n }\n\n /** Audition a voice the member can pick for this workflow (PCM16). */\n async previewMemberWorkflowVoice(\n wid: string,\n memberId: number,\n workflowId: number,\n body: SetWorkflowVoiceRequest\n ): Promise<ArrayBuffer> {\n const response = await this.fetchRaw(\n `w/${wid}/members/${memberId}/workflow-voices/${workflowId}/preview`,\n { method: 'POST', body: JSON.stringify(body) }\n );\n return response.arrayBuffer();\n }\n\n /** Set the member's preferred voice for one workflow (Custom Voice). */\n async setMemberWorkflowVoice(\n wid: string,\n memberId: number,\n workflowId: number,\n body: SetWorkflowVoiceRequest\n ): Promise<WorkflowVoiceRowResponse> {\n return this.fetch<WorkflowVoiceRowResponse>(\n `w/${wid}/members/${memberId}/workflow-voices/${workflowId}`,\n { method: 'PUT', body: JSON.stringify(body) }\n );\n }\n\n /** Clear the member's preferred voice for one workflow (Custom Voice). */\n async clearMemberWorkflowVoice(\n wid: string,\n memberId: number,\n workflowId: number\n ): Promise<ClearWorkflowVoiceResponse> {\n return this.fetch<ClearWorkflowVoiceResponse>(\n `w/${wid}/members/${memberId}/workflow-voices/${workflowId}`,\n { method: 'DELETE' }\n );\n }\n\n /**\n * Member-scoped DataTypes the current member may use (self-access — works\n * on a Site session, which can hold no records scope by construction).\n */\n async getMyDataTypes(wid: string): Promise<MyDataTypeResponse[]> {\n return this.fetch<MyDataTypeResponse[]>(`w/${wid}/me/data-types`);\n }\n\n /** The current member's own records for one DataType (self-access). */\n async getMyRecords(\n wid: string,\n dataTypeId: number,\n options?: { page?: number; pageSize?: number }\n ): Promise<PaginatedResponseDataRecordResponse> {\n const params = new URLSearchParams({ data_type_id: String(dataTypeId) });\n if (options?.page) params.set('page', String(options.page));\n if (options?.pageSize) params.set('page_size', String(options.pageSize));\n return this.fetch<PaginatedResponseDataRecordResponse>(\n `w/${wid}/me/records?${params.toString()}`\n );\n }\n\n /** Update the currently authenticated member's profile. */\n async updateCurrentMember(wid: string, member: Partial<MemberFormData>): Promise<Member> {\n return this.fetch<Member>(`w/${wid}/me`, {\n method: 'PUT',\n body: JSON.stringify(member),\n });\n }\n\n /** List workspace members with pagination, filtering, and sorting. */\n async getWorkspaceMembers(\n wid: string,\n page: number = 1,\n pageSize: number = 10,\n search?: string,\n role?: string,\n sortBy?: MemberSortField,\n sortOrder?: SortOrder,\n memberType?: 'member' | 'test' | 'anonymous' | 'agent',\n isArchived: boolean = false,\n isManager?: boolean,\n memberTypes?: ('member' | 'test' | 'anonymous' | 'agent')[],\n hasAccount?: boolean,\n excludeIds?: number[],\n /** Apply a saved member filter by id (its query predicate). */\n memberFilterId?: number,\n /** Transient query-engine IR predicate (the unsaved counterpart of a saved filter's query). */\n query?: QueryPredicate\n ): Promise<PaginatedResponse<Member>> {\n const params = new URLSearchParams();\n if (memberFilterId != null) params.append('memberFilterId', memberFilterId.toString());\n if (query != null) params.append('query', JSON.stringify(query));\n if (page) params.append('page', page.toString());\n if (pageSize) params.append('pageSize', pageSize.toString());\n if (sortBy) params.append('sortBy', sortBy);\n if (sortOrder) params.append('sortOrder', sortOrder);\n\n // Handle individual search and role parameters\n if (search) params.append('search', search);\n if (role) params.append('role', role);\n // Filter by multiple member types (takes precedence on server)\n if (memberTypes && memberTypes.length > 0) {\n params.append('member_types', memberTypes.join(','));\n } else if (memberType) {\n // Deprecated: Filter by single member type\n params.append('member_type', memberType);\n }\n // Filter by archived status (defaults to false for non-archived members)\n params.append('is_archived', isArchived.toString());\n // Filter by manage_workspace permission\n if (isManager !== undefined) {\n params.append('is_manager', isManager.toString());\n }\n // Filter by account association\n if (hasAccount !== undefined) {\n params.append('has_account', hasAccount.toString());\n }\n // Exclude specific member IDs\n if (excludeIds && excludeIds.length > 0) {\n params.append('exclude_ids', excludeIds.join(','));\n }\n\n return this.fetch<PaginatedResponse<Member>>(`w/${wid}/members?${params.toString()}`);\n }\n\n /** Get a single workspace member by ID. */\n async getWorkspaceMember(wid: string, memberId: number): Promise<Member> {\n return this.fetch<Member>(`w/${wid}/members/${memberId}`);\n }\n\n /**\n * Get a single workspace member by UUID.\n *\n * The uuid-addressed twin of `getWorkspaceMember`: same access check (self,\n * otherwise `members:read`), same body. Activity events and org webhooks\n * name a member by `uuid` only.\n */\n async getMemberByUuid(wid: string, uuid: string): Promise<Member> {\n return this.fetch<Member>(`w/${wid}/members/by-uuid/${uuid}`);\n }\n\n /**\n * Get one member of an org's workspace, under `org:read`.\n *\n * The same record and the same shape as `getWorkspaceMember`, for a reader\n * whose authority is the org rather than a member row in that workspace —\n * an org Activity pane opening a member it just listed. A workspace outside\n * the org is a 404, indistinguishable from a member id that does not exist.\n */\n async getOrgWorkspaceMember(\n orgUuid: string,\n workspaceUuid: string,\n memberId: number\n ): Promise<Member> {\n return this.fetch<Member>(\n `o/${orgUuid}/activity/workspaces/${workspaceUuid}/members/${memberId}`\n );\n }\n\n /** Create a new workspace member. */\n async createWorkspaceMember(wid: string, data: CreateWorkspaceMemberRequest): Promise<Member> {\n return this.fetch<Member>(`w/${wid}/members`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update a workspace member by ID. */\n async updateMember(\n wid: string,\n memberId: number,\n data: UpdateWorkspaceMemberRequest\n ): Promise<Member> {\n return this.fetch<Member>(`w/${wid}/members/${memberId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Delete a workspace member, optionally forcing removal of associated data. */\n async deleteMember(wid: string, memberId: number, options?: { force?: boolean }): Promise<void> {\n const params = new URLSearchParams();\n if (options?.force) {\n params.append('force', 'true');\n }\n const queryString = params.toString();\n const url = `w/${wid}/members/${memberId}${queryString ? `?${queryString}` : ''}`;\n return this.fetch(url, {\n method: 'DELETE',\n });\n }\n\n /** Archive a workspace member. */\n async archiveMember(wid: string, memberId: number): Promise<Member> {\n return this.fetch<Member>(`w/${wid}/members/${memberId}/archive`, {\n method: 'POST',\n });\n }\n\n /** Unarchive a previously archived workspace member. */\n async unarchiveMember(wid: string, memberId: number): Promise<Member> {\n return this.fetch<Member>(`w/${wid}/members/${memberId}/unarchive`, {\n method: 'POST',\n });\n }\n\n /**\n * Update a workspace member addressed by its external id.\n *\n * The external-id twin of `updateMember`: for an integrator that keys on its\n * own `externalId` and never stores our numeric member id. Same authorization\n * (`members:write`) and same body as `updateMember`.\n */\n async updateMemberByExternalId(\n wid: string,\n externalId: string,\n data: UpdateWorkspaceMemberRequest\n ): Promise<Member> {\n return this.fetch<Member>(\n `w/${wid}/members/by-external-id/${encodeURIComponent(externalId)}`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Archive a workspace member addressed by its external id.\n *\n * The external-id twin of `archiveMember`; same authorization\n * (`members:write` + `members:admin`) and same body.\n */\n async archiveMemberByExternalId(wid: string, externalId: string): Promise<Member> {\n return this.fetch<Member>(\n `w/${wid}/members/by-external-id/${encodeURIComponent(externalId)}/archive`,\n {\n method: 'POST',\n // Required empty JSON body is the route's CSRF barrier (GRA-6284).\n body: JSON.stringify({}),\n }\n );\n }\n\n /**\n * Unarchive a workspace member addressed by its external id.\n *\n * The external-id twin of `unarchiveMember`; same authorization and body.\n */\n async unarchiveMemberByExternalId(wid: string, externalId: string): Promise<Member> {\n return this.fetch<Member>(\n `w/${wid}/members/by-external-id/${encodeURIComponent(externalId)}/unarchive`,\n {\n method: 'POST',\n // Required empty JSON body is the route's CSRF barrier (GRA-6284).\n body: JSON.stringify({}),\n }\n );\n }\n\n /**\n * Send the member an SMS asking them to confirm their phone number. When they\n * reply, a trusted phone auth binding is created so they can use SMS as\n * themselves without an account (member-attested alternative to the\n * members:admin \"Trusted\" override).\n */\n async sendMemberPhoneConfirmation(wid: string, memberId: number): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/members/${memberId}/phone-confirmation`, {\n method: 'POST',\n });\n }\n\n // Member Filter APIs\n /** List all saved member filters for a workspace. */\n async getMemberFilters(wid: string): Promise<MemberFilter[]> {\n return this.fetch<MemberFilter[]>(`w/${wid}/member-filters`);\n }\n\n /** Get a single member filter by ID. */\n async getMemberFilter(wid: string, filterId: number): Promise<MemberFilter> {\n return this.fetch<MemberFilter>(`w/${wid}/member-filters/${filterId}`);\n }\n\n /** Create a new saved member filter. */\n async createMemberFilter(wid: string, data: MemberFilterFormData): Promise<MemberFilter> {\n return this.fetch<MemberFilter>(`w/${wid}/member-filters`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update a saved member filter. */\n async updateMemberFilter(\n wid: string,\n filterId: number,\n data: Partial<MemberFilterFormData>\n ): Promise<MemberFilter> {\n return this.fetch<MemberFilter>(`w/${wid}/member-filters/${filterId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Delete a saved member filter. */\n async deleteMemberFilter(wid: string, filterId: number): Promise<void> {\n return this.fetch(`w/${wid}/member-filters/${filterId}`, {\n method: 'DELETE',\n });\n }\n\n /** Get the count of members matching a saved filter. */\n async getMemberFilterCount(wid: string, filterId: number): Promise<{ count: number }> {\n return this.fetch<{ count: number }>(`w/${wid}/member-filters/${filterId}/count`);\n }\n\n // Member Labels API\n /** List all member labels for a workspace. */\n async getMemberLabels(wid: string): Promise<MemberLabel[]> {\n return this.fetch<MemberLabel[]>(`w/${wid}/member-labels`);\n }\n\n /** Get a single member label by ID. */\n async getMemberLabel(wid: string, id: number): Promise<MemberLabel> {\n return this.fetch<MemberLabel>(`w/${wid}/member-labels/${id}`);\n }\n\n /** Get a single member label by UUID. */\n async getMemberLabelByUuid(wid: string, uuid: string): Promise<MemberLabel> {\n return this.fetch<MemberLabel>(`w/${wid}/member-labels/${uuid}`);\n }\n\n /** Create a new member label. */\n async createMemberLabel(wid: string, label: MemberLabelFormData): Promise<MemberLabel> {\n return this.fetch<MemberLabel>(`w/${wid}/member-labels`, {\n method: 'POST',\n body: JSON.stringify(label),\n });\n }\n\n /** Update a member label. */\n async updateMemberLabel(\n wid: string,\n id: number,\n label: Partial<MemberLabelFormData>\n ): Promise<MemberLabel> {\n return this.fetch<MemberLabel>(`w/${wid}/member-labels/${id}`, {\n method: 'PUT',\n body: JSON.stringify(label),\n });\n }\n\n /** Delete a member label. */\n async deleteMemberLabel(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/member-labels/${id}`, {\n method: 'DELETE',\n });\n }\n\n // Member Roles API\n /** List all member roles for a workspace. */\n async getMemberRoles(wid: string): Promise<MemberRole[]> {\n return this.fetch<MemberRole[]>(`w/${wid}/member-roles`);\n }\n\n /** Get a single member role by ID. */\n async getMemberRole(wid: string, id: number): Promise<MemberRole> {\n return this.fetch<MemberRole>(`w/${wid}/member-roles/${id}`);\n }\n\n /** Get a single member role by UUID. */\n async getMemberRoleByUuid(wid: string, uuid: string): Promise<MemberRole> {\n return this.fetch<MemberRole>(`w/${wid}/member-roles/${uuid}`);\n }\n\n /** Create a new member role. */\n async createMemberRole(wid: string, memberRole: MemberRoleFormData): Promise<MemberRole> {\n return this.fetch<MemberRole>(`w/${wid}/member-roles`, {\n method: 'POST',\n body: JSON.stringify(memberRole),\n });\n }\n\n /** Update a member role. */\n async updateMemberRole(\n wid: string,\n id: number,\n memberRole: MemberRoleFormData\n ): Promise<MemberRole> {\n return this.fetch<MemberRole>(`w/${wid}/member-roles/${id}`, {\n method: 'PUT',\n body: JSON.stringify(memberRole),\n });\n }\n\n /** Delete a member role. Default roles (``systemKey`` set) return 403. */\n async deleteMemberRole(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/member-roles/${id}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Describe legacy duplicate default roles in this workspace. Read-only.\n *\n * Workspaces seeded by older versions of the product can carry the same\n * default role under several spellings (\"manager\" next to \"Manager\"). This\n * reports which ones should be merged and exactly how many members and\n * references each merge would move.\n */\n async getMemberRoleCleanupPlan(wid: string): Promise<MemberRoleCleanupPlan> {\n return this.fetch<MemberRoleCleanupPlan>(`w/${wid}/member-roles/cleanup-plan`);\n }\n\n /**\n * Move every member and reference from one role to another, then delete the\n * source role. Requires `member_roles:admin`. The source cannot be a default\n * role.\n */\n async mergeMemberRoles(\n wid: string,\n request: MergeMemberRolesRequest\n ): Promise<MergeMemberRolesResult> {\n return this.fetch<MergeMemberRolesResult>(`w/${wid}/member-roles/cleanup/merge`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n // Import/Export Members API\n /**\n * Read-only preview classifying each CSV row before any write (GRA-5545).\n *\n * Returns create/update/unchanged/conflict/error counts. For phone-only\n * identity conflicts it also returns existing vs incoming identity so the\n * operator can decide whether to skip or explicitly overwrite before\n * committing. Requires MEMBERS_ADMIN and is bulk-PHI audited server-side.\n */\n async previewImportMembers(\n wid: string,\n file: Blob,\n newMemberRoleId: number,\n options?: Omit<MemberImportOptions, 'identityConflictPolicy'>\n ): Promise<MemberImportPreviewResponse> {\n const { body, params } = memberImportUpload(file, newMemberRoleId, options);\n\n // Route through fetchRaw so API-key auth, cross-domain request tokens,\n // and org/step-up auth headers are applied — a bare\n // fetch() with credentials:'include' only sends cookies and breaks\n // API-key / cross-domain SDK consumers. 400/413 are returned (not thrown)\n // so the structured validation-error payload can be surfaced below.\n const response = await this.fetchRaw(\n `w/${wid}/members/import/preview?${params.toString()}`,\n {\n method: 'POST',\n body,\n },\n [400, 413]\n );\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throwMemberImportError(error, 'Import preview failed');\n }\n\n const preview: MemberImportPreviewResponse = await response.json();\n if (preview.previewPlanToken) {\n this.memberImportPlans.set(file, {\n wid,\n role: newMemberRoleId,\n autoPromote: options?.autoPromoteUniqueContacts ?? true,\n token: preview.previewPlanToken,\n cachedAt: Date.now(),\n });\n } else {\n this.memberImportPlans.delete(file);\n }\n return preview;\n }\n\n /**\n * Import members from a CSV file, streaming progress updates via callback.\n *\n * ``identityConflictPolicy`` (default 'skip') controls how a row matching an\n * existing member ONLY by phone with different identity fields is handled.\n * Send 'overwrite_identity_fields' only after the operator confirms a preview.\n */\n async importMembers(\n wid: string,\n file: Blob,\n newMemberRoleId: number,\n onProgress?: (progress: MemberImportStreamEvent) => void,\n options?: MemberImportOptions\n ): Promise<{ success: boolean; result: MemberImportStreamEvent }> {\n const { body, params } = memberImportUpload(file, newMemberRoleId, options);\n const cachedPlan = this.memberImportPlans.get(file);\n const autoPromote = options?.autoPromoteUniqueContacts ?? true;\n const previewPlanToken =\n options?.previewPlanToken ??\n (cachedPlan?.wid === wid &&\n cachedPlan.role === newMemberRoleId &&\n cachedPlan.autoPromote === autoPromote &&\n Date.now() - cachedPlan.cachedAt < 55 * 60 * 1000\n ? cachedPlan.token\n : (await this.previewImportMembers(wid, file, newMemberRoleId, options))\n .previewPlanToken);\n if (previewPlanToken) body.append('previewPlanToken', previewPlanToken);\n if (options?.identityConflictPolicy) {\n params.append('identity_conflict_policy', options.identityConflictPolicy);\n }\n\n // Route through fetchRaw (see previewImportMembers) so auth/transport\n // headers are applied; 400/413 are returned so the structured\n // validation-error payload can be parsed below.\n const response = await this.fetchRaw(\n `w/${wid}/members/import?${params.toString()}`,\n {\n method: 'POST',\n body,\n },\n [400, 413]\n );\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throwMemberImportError(error, 'Import failed');\n }\n\n if (!response.body) throw new Error('Member import response has no progress stream');\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let result: MemberImportStreamEvent | undefined;\n let hadError = false;\n const consume = (line: string) => {\n if (!line.trim()) return;\n let event: MemberImportStreamEvent;\n try {\n event = JSON.parse(line);\n } catch {\n throw new Error('Invalid member import progress event');\n }\n if (event.type === 'complete') result = event;\n if (event.type === 'error') hadError = true;\n // Callback exceptions belong to the caller and must propagate.\n onProgress?.(event);\n };\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) consume(line);\n }\n buffer += decoder.decode();\n consume(buffer);\n } catch (error) {\n // Stop the response stream on parser/consumer failure. Cancellation\n // does not roll back completed rows; callers must reconcile before retry.\n await reader.cancel().catch(() => undefined);\n throw error;\n } finally {\n reader.releaseLock();\n }\n if (!result) {\n throw new Error('Member import ended before completion; inspect members before retrying');\n }\n return {\n success: !hadError && (result.failed ?? 0) === 0 && (result.conflicted ?? 0) === 0,\n result,\n };\n }\n\n /** Export members as a downloadable file with selected fields and data types. */\n async exportMembers(\n wid: string,\n selectedFields: string[],\n selectedDataTypes: number[],\n memberType?: 'member' | 'test' | 'anonymous'\n ): Promise<Blob> {\n const params = new URLSearchParams();\n selectedFields.forEach((field) => params.append('selected_fields', field));\n selectedDataTypes.forEach((id) => params.append('selected_data_types', id.toString()));\n if (memberType) params.append('member_type', memberType);\n\n const response = await this.fetchRaw(`w/${wid}/members/export?${params.toString()}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n });\n\n return response.blob();\n }\n\n /** Get message activity counts for the specified members over a time period. */\n async getMembersMessageActivity(\n wid: string,\n memberIds: number[],\n days: number = 30\n ): Promise<Record<number, number[]>> {\n const memberIdsStr = memberIds.join(',');\n const params = new URLSearchParams();\n params.append('member_ids', memberIdsStr);\n params.append('days', days.toString());\n\n return this.fetch<Record<number, number[]>>(\n `w/${wid}/members/message-activity?${params.toString()}`\n );\n }\n\n // ============================================================================\n // Member Fields API\n // ============================================================================\n\n /**\n * Get all fields for a member.\n * Returns key-value fields including service-owned fields (which are read-only).\n */\n async getMemberFields(wid: string, memberId: number): Promise<MemberFieldListResponse> {\n return this.fetch<MemberFieldListResponse>(`w/${wid}/members/${memberId}/fields`);\n }\n\n /**\n * Get available field definitions for this workspace.\n * Returns field keys/labels from active app connections and user-created fields.\n */\n async getMemberFieldDefinitions(wid: string): Promise<MemberFieldDefinitionListResponse> {\n return this.fetch<MemberFieldDefinitionListResponse>(`w/${wid}/member-field-definitions`);\n }\n\n /**\n * Create a new field for a member.\n * User-created fields have no service and can be modified/deleted.\n */\n async createMemberField(\n wid: string,\n memberId: number,\n request: CreateMemberFieldRequest\n ): Promise<MemberField> {\n return this.fetch<MemberField>(`w/${wid}/members/${memberId}/fields`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Update a member field value.\n * Only user-created fields (no service_id) can be modified.\n */\n async updateMemberField(\n wid: string,\n memberId: number,\n fieldId: number,\n request: UpdateMemberFieldRequest\n ): Promise<MemberField> {\n return this.fetch<MemberField>(`w/${wid}/members/${memberId}/fields/${fieldId}`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Delete a member field.\n * Only user-created fields (no service_id) can be deleted.\n */\n async deleteMemberField(wid: string, memberId: number, fieldId: number): Promise<void> {\n await this.fetch(`w/${wid}/members/${memberId}/fields/${fieldId}`, {\n method: 'DELETE',\n });\n }\n\n // ============================================================================\n // Credential Change Invitations API\n // ============================================================================\n\n /**\n * Invite a member to update their credential (email or phone).\n * Admin-only. Sends invitation to member's current contact method.\n */\n async inviteMemberCredentialUpdate(\n wid: string,\n memberId: number,\n credentialType: CredentialType,\n newValue: string\n ): Promise<CredentialChangeInviteResponse> {\n return this.fetch<CredentialChangeInviteResponse>(\n `w/${wid}/members/${memberId}/invite-credential-update`,\n {\n method: 'POST',\n body: JSON.stringify({\n credential_type: credentialType,\n new_value: newValue,\n }),\n }\n );\n }\n\n /**\n * Cancel a pending credential update invitation.\n * Admin-only.\n */\n async cancelCredentialUpdateInvite(\n wid: string,\n inviteId: number\n ): Promise<CancelCredentialChangeInviteResponse> {\n return this.fetch<CancelCredentialChangeInviteResponse>(\n `w/${wid}/credential-update-invites/${inviteId}`,\n { method: 'DELETE' }\n );\n }\n\n /**\n * List pending credential update invitations for the workspace, paginated.\n * Admin-only. Optionally filter by member.\n */\n async getCredentialUpdateInvites(\n wid: string,\n memberId?: number,\n pageOpts?: { page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<PendingCredentialChangeInvite>> {\n const params = new URLSearchParams();\n if (memberId) params.append('member_id', memberId.toString());\n if (pageOpts?.page !== undefined) params.set('page', String(pageOpts.page));\n if (pageOpts?.pageSize !== undefined) params.set('pageSize', String(pageOpts.pageSize));\n const qs = params.toString();\n return this.fetch<PaginatedResponse<PendingCredentialChangeInvite>>(\n `w/${wid}/credential-update-invites${qs ? `?${qs}` : ''}`\n );\n }\n\n // ============================================================================\n // Anonymous Member Resolution API\n // ============================================================================\n\n /**\n * List anonymous member resolutions with filtering and pagination.\n * Returns pending resolutions by default.\n */\n async getAnonymousResolutions(\n wid: string,\n options?: {\n status?: 'pending' | 'resolved' | 'expired';\n page?: number;\n pageSize?: number;\n }\n ): Promise<PendingAnonymousMembersResponse> {\n const params = new URLSearchParams();\n if (options?.status) params.append('status', options.status);\n if (options?.page) params.append('page', options.page.toString());\n if (options?.pageSize) params.append('pageSize', options.pageSize.toString());\n\n const queryString = params.toString();\n const url = `w/${wid}/members/anonymous-resolutions${queryString ? `?${queryString}` : ''}`;\n return this.fetch<PendingAnonymousMembersResponse>(url);\n }\n\n /**\n * Get a single anonymous member resolution by ID.\n */\n async getAnonymousResolution(\n wid: string,\n resolutionId: number\n ): Promise<AnonymousMemberResolution> {\n return this.fetch<AnonymousMemberResolution>(\n `w/${wid}/members/anonymous-resolutions/${resolutionId}`\n );\n }\n\n /**\n * Resolve an anonymous member to an existing member.\n * This merges the anonymous member's data into the target member\n * and archives the anonymous member.\n */\n async resolveAnonymousMember(\n wid: string,\n resolutionId: number,\n request: ResolveAnonymousMemberRequest\n ): Promise<AnonymousMemberResolution> {\n return this.fetch<AnonymousMemberResolution>(\n `w/${wid}/members/anonymous-resolutions/${resolutionId}/resolve`,\n {\n method: 'POST',\n body: JSON.stringify(request),\n }\n );\n }\n\n /**\n * Expire an anonymous member without resolving to a real member.\n * This archives the anonymous member without merging their data.\n */\n async expireAnonymousMember(\n wid: string,\n resolutionId: number,\n request?: ExpireAnonymousMemberRequest\n ): Promise<AnonymousMemberResolution> {\n return this.fetch<AnonymousMemberResolution>(\n `w/${wid}/members/anonymous-resolutions/${resolutionId}/expire`,\n {\n method: 'POST',\n body: JSON.stringify(request || {}),\n }\n );\n }\n\n // ===== Member Memories =====\n\n async getMemberMemories(\n wid: string,\n memberId: number,\n options?: { type?: MemoryType | 'all'; query?: string; limit?: number }\n ): Promise<MemberMemoriesResponse> {\n const params = new URLSearchParams();\n if (options?.type) params.append('type', options.type);\n if (options?.query) params.append('query', options.query);\n if (options?.limit) params.append('limit', options.limit.toString());\n const qs = params.toString();\n return this.fetch<MemberMemoriesResponse>(\n `w/${wid}/members/${memberId}/memories${qs ? `?${qs}` : ''}`\n );\n }\n\n async getMemberMemory(wid: string, memberId: number, key: string): Promise<MemoryItem> {\n return this.fetch<MemoryItem>(\n `w/${wid}/members/${memberId}/memories/${encodeURIComponent(key)}`\n );\n }\n\n async createMemberMemory(\n wid: string,\n memberId: number,\n body: { key: string; description: string; content?: string | null; priority?: number }\n ): Promise<MemoryItem> {\n return this.fetch<MemoryItem>(`w/${wid}/members/${memberId}/memories`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n async deleteMemberMemory(\n wid: string,\n memberId: number,\n memoryKey: string,\n options?: { type?: MemoryType }\n ): Promise<void> {\n const params = new URLSearchParams();\n if (options?.type) params.append('type', options.type);\n const qs = params.toString();\n await this.fetch<{ status: string }>(\n `w/${wid}/members/${memberId}/memories/${encodeURIComponent(memoryKey)}${qs ? `?${qs}` : ''}`,\n { method: 'DELETE' }\n );\n }\n\n /** Bulk-create members in a workspace. */\n async bulkCreateMembers(\n wid: string,\n request: BulkCreateMembersRequest\n ): Promise<BulkCreateMembersResponse> {\n return this.fetch<BulkCreateMembersResponse>(`w/${wid}/members/bulk`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** Get all sync links for a member across app connections. */\n async getMemberSyncLinks(wid: string, memberId: number): Promise<MemberSyncLink[]> {\n return this.fetch<MemberSyncLink[]>(`w/${wid}/members/${memberId}/sync-links`);\n }\n\n async getMemberRelationships(\n wid: string,\n memberId: number,\n params?: { page?: number; pageSize?: number; kind?: MemberRelationshipKindValue }\n ): Promise<PaginatedResponse<MemberRelationshipResponse>> {\n const search = new URLSearchParams();\n if (params?.page) search.set('page', String(params.page));\n if (params?.pageSize) search.set('pageSize', String(params.pageSize));\n if (params?.kind) search.set('kind', params.kind);\n const qs = search.toString();\n return this.fetch<PaginatedResponse<MemberRelationshipResponse>>(\n `w/${wid}/members/${memberId}/relationships${qs ? `?${qs}` : ''}`\n );\n }\n\n async createMemberRelationship(\n wid: string,\n memberId: number,\n body: CreateMemberRelationshipRequest\n ): Promise<MemberRelationshipResponse> {\n return this.fetch<MemberRelationshipResponse>(`w/${wid}/members/${memberId}/relationships`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n async archiveMemberRelationship(\n wid: string,\n memberId: number,\n relationshipId: number\n ): Promise<MemberRelationshipResponse> {\n return this.fetch<MemberRelationshipResponse>(\n `w/${wid}/members/${memberId}/relationships/${relationshipId}`,\n { method: 'DELETE' }\n );\n }\n\n async listContactPermissions(\n wid: string,\n params: { destination: string; channel?: 'voice' | 'sms' }\n ): Promise<{\n destination: string;\n rows: Array<{\n id: number;\n channel: string;\n destination: string;\n memberId: number | null;\n decision: string;\n source: string;\n consentDate: string | null;\n channelNote: string | null;\n recordedBy: string;\n recordedAt: string;\n }>;\n }> {\n // POST, not GET: ``destination`` is a patient phone number (PHI), and a\n // query string would carry it into access logs, browser history and\n // Referer — outside the PHI-safe logging path.\n return this.fetch(`w/${wid}/contact-permissions/history`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n async createContactPermission(\n wid: string,\n body: {\n destination: string;\n channel: 'voice' | 'sms';\n decision: 'granted' | 'revoked';\n consentDate?: string | null;\n channelNote?: string | null;\n }\n ): Promise<{\n id: number;\n channel: string;\n destination: string;\n memberId: number | null;\n decision: string;\n source: string;\n consentDate: string | null;\n channelNote: string | null;\n recordedBy: string;\n recordedAt: string;\n }> {\n return this.fetch(`w/${wid}/contact-permissions`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n}\n","import type { CursorPaginatedResponse, PaginatedResponse } from '../types/core-types';\nimport type { RuleExecution } from '../types/event-types';\nimport { BaseApiClient } from './base';\n\nexport interface MondayBoard {\n id: string;\n name: string;\n}\n\n/** Status label from Monday.com column settings */\nexport interface MondayStatusLabel {\n /** The display text of the status */\n label?: string;\n /** The color of the status (CSS color name or hex) */\n color?: string;\n /** The index used when creating webhooks for specific status changes */\n index?: number;\n /** Whether this status is deactivated */\n is_deactivated?: boolean;\n}\n\n/** Column settings - contains labels for status columns */\nexport interface MondayColumnSettings {\n /** Labels for status columns, keyed by index */\n labels?: Record<string, MondayStatusLabel | string>;\n /** Label colors for status columns */\n labels_colors?: Record<string, { color: string; border: string; var_name: string }>;\n}\n\nexport interface MondayColumn {\n id: string;\n title: string;\n type: string;\n /** Column settings - contains labels for status columns */\n settings?: MondayColumnSettings | null;\n}\n\nexport interface BoardsResponse {\n boards: MondayBoard[];\n}\n\nexport interface ColumnsResponse {\n columns: MondayColumn[];\n}\n\nexport interface MondayGroup {\n id: string;\n title: string;\n}\n\nexport interface GroupsResponse {\n groups: MondayGroup[];\n}\n\nexport interface CurrentUserInfoResponse {\n connected: boolean;\n userName?: string;\n userEmail?: string;\n accountName?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Monday.com Connection types (parallel to HubSpot/Salesforce)\n// ---------------------------------------------------------------------------\n\nexport interface MondayConnectionStatus {\n connectionId: number | null;\n /** True once client credentials (Client ID) have been saved. */\n configured: boolean;\n connected: boolean;\n /** False when the connection is installed but disabled. */\n enabled: boolean;\n state: string | null;\n mondayAccountId: string | null;\n accountName: string | null;\n userName: string | null;\n authorizeUrl: string | null;\n /** OAuth callback URL to register in the Monday.com app. */\n callbackUrl: string | null;\n error: string | null;\n authorizedByMemberId: number | null;\n authorizedAt: string | null;\n}\n\nexport interface MondayReconciliationMatch {\n memberId: number;\n mondayItemId: string;\n mondayItemName: string | null;\n boardId: string;\n matchType: string;\n}\n\nexport interface LinkMemberToMondayRequest {\n memberId: number;\n mondayItemId: string;\n boardId: string;\n}\n\nexport interface BulkLinkMondayRequest {\n links: LinkMemberToMondayRequest[];\n}\n\nexport interface LinkedMondayMember {\n memberId: number;\n /**\n * Monday item ID for sync-linked rows. Null for OAuth-only rows where the\n * member has authorized Monday but is not (yet) linked to a board item.\n */\n mondayItemId: string | null;\n /**\n * Board ID for sync-linked rows. Null for OAuth-only rows. The unlink\n * endpoint requires a board ID, so OAuth-only rows cannot be removed\n * via the board-link unlink action.\n */\n boardId: string | null;\n linkSource: 'sync' | 'oauth';\n memberName: string | null;\n memberEmail: string | null;\n memberPhone: string | null;\n lastSyncedAt: string | null;\n lastSyncStatus: string | null;\n}\n\nexport interface LinkedMondayRecord {\n recordId: number;\n externalId: string | null;\n dataTypeId: number;\n dataTypeName: string;\n mondayItemId: string;\n boardId: string;\n}\n\nexport interface MondayImportRequest {\n boardId: string;\n targetType?: 'member' | 'data_record';\n dataTypeId?: number;\n filterExpression?: string;\n createUnmatched?: boolean;\n dryRun?: boolean;\n}\n\nexport interface MondayImportResponse {\n streamKey: string;\n message: string;\n}\n\nexport interface MondaySyncConfigResponse {\n syncConfig: Record<string, unknown> | null;\n managedFields: { key: string; label: string }[];\n warnings?: string[];\n}\n\n/**\n * API for Monday.com integration operations\n */\nexport class MondayIntegrationApi extends BaseApiClient {\n /**\n * Get list of boards from the workspace Monday.com connection\n */\n async getBoards(wid: string): Promise<BoardsResponse> {\n const boards = await this.fetch<MondayBoard[]>(`w/${wid}/app-connections/monday/boards`);\n return { boards };\n }\n\n /**\n * Get columns for a specific Monday.com board\n */\n async getBoardColumns(wid: string, boardId: string): Promise<ColumnsResponse> {\n const columns = await this.fetch<MondayColumn[]>(\n `w/${wid}/app-connections/monday/boards/${boardId}/columns`\n );\n return { columns };\n }\n\n /**\n * Get groups for a specific Monday.com board\n */\n async getBoardGroups(wid: string, boardId: string): Promise<GroupsResponse> {\n const groups = await this.fetch<MondayGroup[]>(\n `w/${wid}/app-connections/monday/boards/${boardId}/groups`\n );\n return { groups };\n }\n\n /**\n * Get info about the current user's Monday.com connection\n */\n async getCurrentUserInfo(wid: string): Promise<CurrentUserInfoResponse> {\n return this.fetch<CurrentUserInfoResponse>(`w/${wid}/app-connections/monday/current-user`);\n }\n\n // -----------------------------------------------------------------------\n // Monday.com Connection management (OAuth, status, sync, reconciliation)\n // -----------------------------------------------------------------------\n\n /**\n * Create the Monday.com connection shell (no credentials yet).\n *\n * First step of the guided setup flow: provisions the connection row so\n * the admin lands on the detail page where the OAuth callback URL is\n * shown — which they need to register their Monday.com app before they\n * have a Client ID / Secret to enter. Idempotent.\n */\n async installMondayConnection(wid: string): Promise<MondayConnectionStatus> {\n return this.fetch<MondayConnectionStatus>(`w/${wid}/app-connections/monday/install`, {\n method: 'POST',\n body: JSON.stringify({}),\n });\n }\n\n async configureMondayConnection(\n wid: string,\n data: { clientId: string; clientSecret: string; signingSecret?: string }\n ): Promise<MondayConnectionStatus> {\n return this.fetch<MondayConnectionStatus>(`w/${wid}/app-connections/monday/configure`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async getMondayConnectionStatus(wid: string): Promise<MondayConnectionStatus> {\n return this.fetch<MondayConnectionStatus>(`w/${wid}/app-connections/monday/status`);\n }\n\n async authorizeMondayConnection(wid: string): Promise<{ authorizeUrl: string }> {\n return this.fetch<{ authorizeUrl: string }>(`w/${wid}/app-connections/monday/authorize`);\n }\n\n async testMondayConnection(\n wid: string\n ): Promise<{ status: string; userName?: string; accountName?: string }> {\n return this.fetch(`w/${wid}/app-connections/monday/test`, { method: 'POST' });\n }\n\n async disconnectMondayConnection(wid: string): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/app-connections/monday/disconnect`, {\n method: 'DELETE',\n });\n }\n\n async disableMondayConnection(wid: string): Promise<MondayConnectionStatus> {\n return this.fetch<MondayConnectionStatus>(`w/${wid}/app-connections/monday/disable`, {\n method: 'POST',\n });\n }\n\n async enableMondayConnection(wid: string): Promise<MondayConnectionStatus> {\n return this.fetch<MondayConnectionStatus>(`w/${wid}/app-connections/monday/enable`, {\n method: 'POST',\n });\n }\n\n async deleteMondayConnection(wid: string): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/app-connections/monday/delete`, {\n method: 'DELETE',\n });\n }\n\n async getMondayConnectionBoards(wid: string): Promise<MondayBoard[]> {\n return this.fetch<MondayBoard[]>(`w/${wid}/app-connections/monday/boards`);\n }\n\n async getMondayConnectionBoardColumns(wid: string, boardId: string): Promise<MondayColumn[]> {\n return this.fetch<MondayColumn[]>(\n `w/${wid}/app-connections/monday/boards/${boardId}/columns`\n );\n }\n\n async getMondayConnectionBoardGroups(wid: string, boardId: string): Promise<MondayGroup[]> {\n return this.fetch<MondayGroup[]>(`w/${wid}/app-connections/monday/boards/${boardId}/groups`);\n }\n\n async getMondaySyncConfig(wid: string): Promise<MondaySyncConfigResponse> {\n return this.fetch<MondaySyncConfigResponse>(`w/${wid}/app-connections/monday/sync-config`);\n }\n\n async updateMondaySyncConfig(\n wid: string,\n syncConfig: Record<string, unknown>\n ): Promise<MondaySyncConfigResponse> {\n return this.fetch<MondaySyncConfigResponse>(`w/${wid}/app-connections/monday/sync-config`, {\n method: 'PUT',\n body: JSON.stringify({ syncConfig }),\n });\n }\n\n async getLinkedMondayMembers(\n wid: string,\n params?: { board_id?: string; page?: number; pageSize?: number; search?: string }\n ): Promise<PaginatedResponse<LinkedMondayMember>> {\n const query = new URLSearchParams();\n if (params?.board_id) query.set('board_id', params.board_id);\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n if (params?.search?.trim()) query.set('search', params.search.trim());\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<LinkedMondayMember>>(\n `w/${wid}/app-connections/monday/reconciliation/linked${qs}`\n );\n }\n\n async getMondayReconciliationMatches(\n wid: string,\n params?: { limit?: number; offset?: number }\n ): Promise<MondayReconciliationMatch[]> {\n const query = new URLSearchParams();\n if (params?.limit !== undefined) query.set('limit', String(params.limit));\n if (params?.offset !== undefined) query.set('offset', String(params.offset));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<MondayReconciliationMatch[]>(\n `w/${wid}/app-connections/monday/reconciliation/matches${qs}`\n );\n }\n\n async linkMemberToMonday(\n wid: string,\n data: LinkMemberToMondayRequest\n ): Promise<{ status: string; memberId: number; mondayItemId: string }> {\n return this.fetch(`w/${wid}/app-connections/monday/reconciliation/link`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async bulkLinkMembersToMonday(\n wid: string,\n data: BulkLinkMondayRequest\n ): Promise<{ linked: number }> {\n return this.fetch(`w/${wid}/app-connections/monday/reconciliation/link/bulk`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async unlinkMemberFromMonday(\n wid: string,\n memberId: number,\n boardId: string\n ): Promise<{ status: string; memberId: number }> {\n return this.fetch(\n `w/${wid}/app-connections/monday/reconciliation/unlink/${memberId}?board_id=${encodeURIComponent(boardId)}`,\n { method: 'DELETE' }\n );\n }\n\n async getLinkedRecords(\n wid: string,\n params?: { board_id?: string; page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<LinkedMondayRecord>> {\n const query = new URLSearchParams();\n if (params?.board_id) query.set('board_id', params.board_id);\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<LinkedMondayRecord>>(\n `w/${wid}/app-connections/monday/linked-records${qs}`\n );\n }\n\n async importFromBoard(wid: string, data: MondayImportRequest): Promise<MondayImportResponse> {\n return this.fetch<MondayImportResponse>(`w/${wid}/app-connections/monday/import`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async autoCreateDataTypeFromBoard(\n wid: string,\n boardId: string\n ): Promise<{\n dataTypeId: number;\n dataTypeName: string;\n fieldCount: number;\n warnings?: string[];\n }> {\n return this.fetch(`w/${wid}/app-connections/monday/boards/${boardId}/auto-create-data-type`, {\n method: 'POST',\n });\n }\n\n /**\n * Managed-rule execution history for this connection (`GET /sync/logs`):\n * the connection's managed EventRule executions, newest first, with the\n * shared cursor pagination. Requires `apps:read`; works while the\n * connection is parked for re-authorization.\n */\n async getMondaySyncLogs(\n wid: string,\n params?: { pageSize?: number; cursor?: string }\n ): Promise<CursorPaginatedResponse<RuleExecution>> {\n const query = new URLSearchParams();\n if (params?.pageSize) query.set('pageSize', String(params.pageSize));\n if (params?.cursor) query.set('cursor', params.cursor);\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<CursorPaginatedResponse<RuleExecution>>(\n `w/${wid}/app-connections/monday/sync/logs${qs}`\n );\n }\n}\n","import { BaseApiClient } from './base';\n\nexport interface NotificationRule {\n id?: number;\n noticeType: string;\n memberId: number;\n workflowId?: number | null;\n prompt?: string | null;\n notifySms: boolean;\n notifyEmail: boolean;\n notifyVoice: boolean;\n}\n\nexport interface NotificationRuleCreate {\n noticeType: string;\n memberId: number;\n workflowId?: number | null;\n prompt?: string | null;\n notifySms: boolean;\n notifyEmail: boolean;\n notifyVoice: boolean;\n}\n\nexport interface NotificationRuleUpdate {\n noticeType?: string;\n memberId?: number;\n workflowId?: number | null;\n prompt?: string | null;\n notifySms?: boolean;\n notifyEmail?: boolean;\n notifyVoice?: boolean;\n}\n\nexport class NotificationRulesApi extends BaseApiClient {\n /** List all notification rules in a workspace. */\n async getNotificationRules(wid: string): Promise<NotificationRule[]> {\n return this.fetch<NotificationRule[]>(`w/${wid}/notification-rules`);\n }\n\n /** Create a new notification rule. */\n async createNotificationRule(\n wid: string,\n rule: NotificationRuleCreate\n ): Promise<NotificationRule> {\n return this.fetch<NotificationRule>(`w/${wid}/notification-rules`, {\n method: 'POST',\n body: JSON.stringify(rule),\n });\n }\n\n /** Update a notification rule. */\n async updateNotificationRule(\n wid: string,\n ruleId: number,\n rule: NotificationRuleUpdate\n ): Promise<NotificationRule> {\n return this.fetch<NotificationRule>(`w/${wid}/notification-rules/${ruleId}`, {\n method: 'PUT',\n body: JSON.stringify(rule),\n });\n }\n\n /** Delete a notification rule. */\n async deleteNotificationRule(wid: string, ruleId: number): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`w/${wid}/notification-rules/${ruleId}`, {\n method: 'DELETE',\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n AddGroupMemberRequest,\n ChatMessage,\n CreateOperatorGroupRequest,\n LiveOperatorsResponse,\n OperatorGroup,\n OperatorGroupMember,\n PresenceStatusResponse,\n UpdateOperatorGroupRequest,\n} from '../types';\n\nexport class OperatorApi extends BaseApiClient {\n /** List all operator groups for a workspace. */\n async getOperatorGroups(wid: string): Promise<OperatorGroup[]> {\n return this.fetch<OperatorGroup[]>(`w/${wid}/operator/groups`);\n }\n\n /** Get a single operator group by ID. */\n async getOperatorGroup(wid: string, groupId: number): Promise<OperatorGroup> {\n return this.fetch<OperatorGroup>(`w/${wid}/operator/groups/${groupId}`);\n }\n\n /** Create a new operator group. */\n async createOperatorGroup(\n wid: string,\n data: CreateOperatorGroupRequest\n ): Promise<OperatorGroup> {\n return this.fetch<OperatorGroup>(`w/${wid}/operator/groups`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update an operator group. */\n async updateOperatorGroup(\n wid: string,\n groupId: number,\n data: UpdateOperatorGroupRequest\n ): Promise<OperatorGroup> {\n return this.fetch<OperatorGroup>(`w/${wid}/operator/groups/${groupId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Delete an operator group. */\n async deleteOperatorGroup(wid: string, groupId: number): Promise<void> {\n return this.fetch(`w/${wid}/operator/groups/${groupId}`, {\n method: 'DELETE',\n });\n }\n\n /** Add a member to an operator group. */\n async addGroupMember(\n wid: string,\n groupId: number,\n data: AddGroupMemberRequest\n ): Promise<OperatorGroupMember> {\n return this.fetch<OperatorGroupMember>(`w/${wid}/operator/groups/${groupId}/members`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Remove a member from an operator group. */\n async removeGroupMember(wid: string, groupId: number, memberId: number): Promise<void> {\n return this.fetch(`w/${wid}/operator/groups/${groupId}/members/${memberId}`, {\n method: 'DELETE',\n });\n }\n\n /** Get all currently live (online) operators in a workspace. */\n async getLiveOperators(wid: string): Promise<LiveOperatorsResponse> {\n return this.fetch<LiveOperatorsResponse>(`w/${wid}/presence/live`);\n }\n\n /** Get the current member's presence status. */\n async getPresenceStatus(wid: string): Promise<PresenceStatusResponse> {\n return this.fetch<PresenceStatusResponse>(`w/${wid}/presence/me`);\n }\n\n // Operator chat message methods\n\n /** Get paginated chat messages for an operator chat. */\n async getOperatorChatMessages(\n wid: string,\n chatId: number,\n limit = 50,\n offset = 0\n ): Promise<ChatMessage[]> {\n return this.fetch<ChatMessage[]>(\n `w/${wid}/operator/chats/${chatId}/messages?limit=${limit}&offset=${offset}`\n );\n }\n\n /** Send a message in an operator chat. */\n async sendOperatorMessage(\n wid: string,\n chatId: number,\n content: string\n ): Promise<{\n id: number;\n uuid: string | null;\n role: string;\n content: string;\n createdAt: string | null;\n }> {\n return this.fetch(`w/${wid}/operator/chats/${chatId}/messages`, {\n method: 'POST',\n body: JSON.stringify({ content }),\n });\n }\n}\n","/**\n * Organization API client for /api/v2/o/{org_uuid}/ routes.\n *\n * This client handles organization-scoped operations using the new org routes\n * that support both numeric IDs and UUIDs (auto-detected on the backend).\n */\nimport {\n AdminOrganization,\n ApiKeyCreatedResponse,\n ApiKeyFormData,\n ApiKeyResponse,\n CreateOrganizationInvitationFormData,\n CurrentOrgMember,\n Invitation,\n InvitationListResponse,\n InvitationStatus,\n MemberOrgView,\n MemberRole,\n OrgCreateWorkspaceFormData,\n OrgJoinWorkspaceRequest,\n OrgJoinWorkspaceResponse,\n OrgMember,\n OrgMemberListResponse,\n OrgWorkspace,\n OrgWorkspaceFormData,\n OrgSettingsUpdateRequest,\n OrgWorkspaceStats,\n OrgWorkspaceSummary,\n OrgWorkspaceUsage,\n PaginatedResponse,\n AvailablePhoneNumber,\n ProviderPhoneNumber,\n SortOrder,\n UpdateInvitationFormData,\n UpdateOrgMemberRequest,\n WorkspaceSortField,\n} from '../types';\nimport type {\n A2PCampaignConfigResponse,\n A2PEvidenceUploadUrlResponse,\n A2PEnrollmentSiteCandidatesResponse,\n BusinessProfileResponse,\n CancelBusinessProfileResponse,\n CreateA2PEvidenceUploadUrlRequest,\n EmailDomainConfig,\n EmailDomainConfigGetResponse,\n EmailDisableImpactResponse,\n EmailDisableResponse,\n EmailVerificationResponse,\n OrgDomain,\n OrgDomainListResponse,\n OwnershipVerificationResponse,\n RegisterA2PEvidenceUploadRequest,\n SiteDomainConfig,\n SiteDomainConfigGetResponse,\n SiteDisableImpactResponse,\n SiteDisableResponse,\n SitePreflightResponse,\n SiteChildHostCreateRequest,\n SiteChildHostResponse,\n SiteChildHostsResponse,\n SiteVerificationResponse,\n OrgSsoConfig,\n SSOConfigRequest,\n SubmitBusinessProfileResponse,\n UpdateA2PCampaignConfigRequest,\n UpdateBusinessProfileRequest,\n LinkA2PEnrollmentSiteRequest,\n ProvisionA2PEnrollmentSiteRequest,\n OrgA2PBrandListResponse,\n OrgA2PBrandDetail,\n OrgA2PBrandUseCasesResponse,\n ActivateA2PNumberResponse,\n CreateLegalEntityRequest,\n LegalEntityListResponse,\n LegalEntitySummary,\n PhoneBillingPricing,\n StartA2PRegistrationResponse,\n SetupVoiceTrustProductRequest,\n SyncVoiceTrustProductsResponse,\n VoiceTrustProductKey,\n VoiceTrustProductsResponse,\n} from '../types/organization-types';\nimport type { OrgBundleCatalogItem } from '../types/generated/bundle_contract';\nimport type { RegistrationDraftResponse } from '../types/generated/registration_draft';\nimport type {\n AttachPhoneVoiceTrustRequest,\n OrgPhoneVoiceTrustResponse,\n PhoneVoiceTrust,\n} from '../types/generated/phone_voice_trust';\nimport type { OrgBillingCustomerResponse } from '../types/generated/organization';\n\n/** The registration drafts a legal entity can hold. Mirrors `DraftKind`. */\nexport type RegistrationDraftKind = 'brand' | 'campaign' | 'voice';\nimport { BaseApiClient } from './base';\n\n/** Union type for organization response - admin view or member view */\nexport type OrganizationResponse = AdminOrganization | MemberOrgView;\n\nexport class OrgApi extends BaseApiClient {\n /**\n * Get organization by ID or UUID.\n * Returns different response based on user's role:\n * - Admins/Owners: AdminOrganization with full details\n * - Members: MemberOrgView with basic info and workspace list\n *\n * Use `viewType` field to determine the response type:\n * - 'admin': AdminOrganization\n * - 'member': MemberOrgView\n */\n async getOrganization(idOrUuid: number | string): Promise<OrganizationResponse> {\n return this.fetch<OrganizationResponse>(`o/${idOrUuid}`);\n }\n\n /**\n * Get the current user's membership in an organization.\n * Returns the user's org membership details including their role and scopes.\n */\n async getCurrentOrgMember(orgIdOrUuid: number | string): Promise<CurrentOrgMember> {\n return this.fetch<CurrentOrgMember>(`o/${orgIdOrUuid}/me`);\n }\n\n /** Bundles this organization owns — read-only catalog for `/o/{uuid}/library`. */\n async listOrgBundles(orgIdOrUuid: number | string): Promise<OrgBundleCatalogItem[]> {\n return this.fetch<OrgBundleCatalogItem[]>(`o/${orgIdOrUuid}/bundles`);\n }\n\n /**\n * Update the settings an org admin owns: name, slug and contact details.\n *\n * Deliberately NOT the admin organization update — `enforceCreditLimit`\n * is superuser-only and is not a field on this endpoint's request model\n * at all.\n */\n async updateOrganizationSettings(\n orgIdOrUuid: number | string,\n data: OrgSettingsUpdateRequest\n ): Promise<AdminOrganization> {\n return this.fetch<AdminOrganization>(`o/${orgIdOrUuid}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Read this organization's SSO configuration.\n *\n * Org-scoped (`org:admin`), unlike the SSO fields on the superuser admin\n * organization update — an org admin owns their own identity provider.\n */\n async getOrgSsoConfig(orgIdOrUuid: number | string): Promise<OrgSsoConfig> {\n return this.fetch<OrgSsoConfig>(`o/${orgIdOrUuid}/sso`);\n }\n\n /** Configure this organization's SSO. Requires `org:admin`. */\n async updateOrgSsoConfig(\n orgIdOrUuid: number | string,\n data: SSOConfigRequest\n ): Promise<OrgSsoConfig> {\n return this.fetch<OrgSsoConfig>(`o/${orgIdOrUuid}/sso`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Remove this organization's SSO configuration. Requires `org:admin`. */\n async deleteOrgSsoConfig(\n orgIdOrUuid: number | string\n ): Promise<{ status: string; message: string }> {\n return this.fetch<{ status: string; message: string }>(`o/${orgIdOrUuid}/sso`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Get the billing customer and this organization's billable subscription.\n *\n * `subscriptionId` is the org-scoped row — never pick the customer's\n * newest subscription from the list endpoint. One customer can bill many\n * organizations.\n *\n * Returns the generated `OrgBillingCustomerResponse` — the contract the\n * route actually emits, `audiences` included. The hand-written mirror that\n * used to live here listed four fields and silently dropped `audiences`,\n * so callers could not see the commercial roles they hold (GRA-8792).\n * Regenerate the shape (`yarn generate:types`) rather than re-declaring it.\n */\n async getOrgBillingCustomer(orgIdOrUuid: number | string): Promise<OrgBillingCustomerResponse> {\n return this.fetch<OrgBillingCustomerResponse>(`o/${orgIdOrUuid}/billing-customer`);\n }\n\n /**\n * Per-workspace usage for this organization's current credit window.\n *\n * Requires a billing role on the organization's billing customer — the\n * same gate `getOrgBillingCustomer().hasAccess` reports, and the one that\n * decides whether the billing tab is shown at all.\n *\n * `creditsUsed` is a real organization-wide total or it is null; it is\n * never a partial sum. There is deliberately no per-workspace \"remaining\"\n * figure — the caps belong to the organization, so `cap - oneWorkspace`\n * describes nothing.\n */\n async getOrgWorkspaceUsage(orgIdOrUuid: number | string): Promise<OrgWorkspaceUsage> {\n return this.fetch<OrgWorkspaceUsage>(`o/${orgIdOrUuid}/usage/workspaces`);\n }\n\n /**\n * List members of an organization.\n */\n async getOrganizationMembers(\n orgIdOrUuid: number | string,\n options?: {\n search?: string;\n page?: number;\n pageSize?: number;\n }\n ): Promise<OrgMemberListResponse> {\n const params = new URLSearchParams();\n if (options?.search) params.append('search', options.search);\n if (options?.page) params.append('page', options.page.toString());\n if (options?.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<OrgMemberListResponse>(`o/${orgIdOrUuid}/members?${params.toString()}`);\n }\n\n /**\n * Check if an account is already a member of an organization.\n */\n async checkAccountMembership(\n orgUuid: string,\n accountUuid: string\n ): Promise<{ isMember: boolean }> {\n return this.fetch<{ isMember: boolean }>(`o/${orgUuid}/members/check/${accountUuid}`);\n }\n\n /**\n * Update an organization member's role and/or org-level display name.\n *\n * `name` is the org's own label for the member (the OrgMember row and the\n * linked OrgAccount); it does not change the person's global Account name.\n */\n async updateOrganizationMember(\n orgIdOrUuid: number | string,\n memberId: number,\n data: UpdateOrgMemberRequest\n ): Promise<OrgMember> {\n return this.fetch<OrgMember>(`o/${orgIdOrUuid}/members/${memberId}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Remove a member from an organization.\n */\n async removeOrganizationMember(orgIdOrUuid: number | string, memberId: number): Promise<void> {\n return this.fetch<void>(`o/${orgIdOrUuid}/members/${memberId}`, {\n method: 'DELETE',\n });\n }\n\n // ============================================================================\n // Organization Invitations API\n // ============================================================================\n\n /**\n * List invitations for an organization.\n */\n async listOrganizationInvitations(\n orgIdOrUuid: number | string,\n options?: {\n status?: InvitationStatus;\n page?: number;\n pageSize?: number;\n }\n ): Promise<InvitationListResponse> {\n const params = new URLSearchParams();\n if (options?.status) params.append('status', options.status);\n if (options?.page) params.append('page', options.page.toString());\n if (options?.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<InvitationListResponse>(\n `o/${orgIdOrUuid}/invitations?${params.toString()}`\n );\n }\n\n /**\n * Create a new invitation to join the organization.\n */\n async createOrganizationInvitation(\n orgIdOrUuid: number | string,\n data: CreateOrganizationInvitationFormData\n ): Promise<Invitation> {\n return this.fetch<Invitation>(`o/${orgIdOrUuid}/invitations`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Get a specific organization invitation.\n */\n async getOrganizationInvitation(\n orgIdOrUuid: number | string,\n invitationId: number\n ): Promise<Invitation> {\n return this.fetch<Invitation>(`o/${orgIdOrUuid}/invitations/${invitationId}`);\n }\n\n /**\n * Update an organization invitation.\n */\n async updateOrganizationInvitation(\n orgIdOrUuid: number | string,\n invitationId: number,\n data: UpdateInvitationFormData\n ): Promise<Invitation> {\n return this.fetch<Invitation>(`o/${orgIdOrUuid}/invitations/${invitationId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete (cancel) an organization invitation.\n */\n async deleteOrganizationInvitation(\n orgIdOrUuid: number | string,\n invitationId: number\n ): Promise<void> {\n return this.fetch<void>(`o/${orgIdOrUuid}/invitations/${invitationId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Resend an organization invitation email.\n */\n async resendOrganizationInvitation(\n orgIdOrUuid: number | string,\n invitationId: number\n ): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(\n `o/${orgIdOrUuid}/invitations/${invitationId}/resend`,\n {\n method: 'POST',\n }\n );\n }\n\n // ============================================================================\n // Organization Workspaces API\n // ============================================================================\n\n /**\n * List workspaces in an organization with pagination.\n */\n async getOrganizationWorkspaces(\n orgIdOrUuid: number | string,\n options?: {\n page?: number;\n pageSize?: number;\n sortBy?: WorkspaceSortField;\n sortOrder?: SortOrder;\n search?: string;\n }\n ): Promise<PaginatedResponse<OrgWorkspace>> {\n const params = new URLSearchParams();\n if (options?.page) params.append('page', options.page.toString());\n if (options?.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options?.sortBy) params.append('sortBy', options.sortBy);\n if (options?.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options?.search) params.append('search', options.search);\n\n return this.fetch<PaginatedResponse<OrgWorkspace>>(\n `o/${orgIdOrUuid}/workspaces?${params.toString()}`\n );\n }\n\n /**\n * Get a single workspace in an organization.\n */\n async getOrganizationWorkspace(\n orgIdOrUuid: number | string,\n workspaceUuid: string\n ): Promise<OrgWorkspace> {\n return this.fetch<OrgWorkspace>(`o/${orgIdOrUuid}/workspaces/${workspaceUuid}`);\n }\n\n /**\n * Workspace cards for the organization page: identity plus the GLB-side\n * counts. Any org member may call it — members get the workspaces they\n * belong to, org:read holders get all of them.\n */\n async getOrganizationWorkspaceSummaries(\n orgIdOrUuid: number | string\n ): Promise<OrgWorkspaceSummary[]> {\n return this.fetch<OrgWorkspaceSummary[]>(`o/${orgIdOrUuid}/workspaces/summary`);\n }\n\n /**\n * Workspace-schema aggregates for one card, plus the caller's own member\n * role. Separate from the list because it opens a session against the\n * workspace's own schema — each card fetches its own.\n */\n async getOrganizationWorkspaceStats(\n orgIdOrUuid: number | string,\n workspaceUuid: string\n ): Promise<OrgWorkspaceStats> {\n return this.fetch<OrgWorkspaceStats>(`o/${orgIdOrUuid}/workspaces/${workspaceUuid}/stats`);\n }\n\n /**\n * Create a workspace in an organization.\n */\n async createOrganizationWorkspace(\n orgIdOrUuid: number | string,\n data: OrgCreateWorkspaceFormData\n ): Promise<OrgWorkspace> {\n return this.fetch<OrgWorkspace>(`o/${orgIdOrUuid}/workspaces`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Update a workspace in an organization.\n */\n async updateOrganizationWorkspace(\n orgIdOrUuid: number | string,\n workspaceUuid: string,\n data: OrgWorkspaceFormData\n ): Promise<OrgWorkspace> {\n return this.fetch<OrgWorkspace>(`o/${orgIdOrUuid}/workspaces/${workspaceUuid}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n // ============================================================================\n // Organization Phone Numbers API\n // ============================================================================\n\n /**\n * List all provider phone numbers owned by this organization.\n */\n async listPhoneNumbers(orgUuid: string): Promise<ProviderPhoneNumber[]> {\n return this.fetch<ProviderPhoneNumber[]>(`o/${orgUuid}/phone-numbers`);\n }\n\n /**\n * Assign a phone number to a workspace.\n */\n async assignPhoneToWorkspace(\n orgUuid: string,\n providerPhoneUuid: string,\n workspaceUuid: string\n ): Promise<ProviderPhoneNumber> {\n return this.fetch<ProviderPhoneNumber>(`o/${orgUuid}/phone-numbers/assign`, {\n method: 'POST',\n body: JSON.stringify({ providerPhoneUuid, workspaceUuid }),\n });\n }\n\n /**\n * Reassign a phone number to a different workspace.\n */\n async reassignPhone(\n orgUuid: string,\n providerPhoneUuid: string,\n newWorkspaceUuid: string\n ): Promise<ProviderPhoneNumber> {\n return this.fetch<ProviderPhoneNumber>(`o/${orgUuid}/phone-numbers/reassign`, {\n method: 'POST',\n body: JSON.stringify({ providerPhoneUuid, newWorkspaceUuid }),\n });\n }\n\n /**\n * Release a phone number from its current workspace.\n */\n async releasePhone(orgUuid: string, providerPhoneUuid: string): Promise<ProviderPhoneNumber> {\n return this.fetch<ProviderPhoneNumber>(`o/${orgUuid}/phone-numbers/release`, {\n method: 'POST',\n body: JSON.stringify({ providerPhoneUuid }),\n });\n }\n\n /**\n * Search for available phone numbers to purchase from Twilio.\n */\n async searchPhoneNumbers(\n orgUuid: string,\n params?: {\n /** ISO 3166-1 alpha-2 country code (e.g. 'US', 'AU'). Defaults to 'US'. */\n country?: string;\n numberType?: 'local' | 'toll_free';\n areaCode?: string;\n contains?: string;\n limit?: number;\n }\n ): Promise<AvailablePhoneNumber[]> {\n const query = new URLSearchParams();\n if (params?.country) query.set('country', params.country);\n if (params?.numberType) query.set('number_type', params.numberType);\n if (params?.areaCode) query.set('area_code', params.areaCode);\n if (params?.contains) query.set('contains', params.contains);\n if (params?.limit) query.set('limit', String(params.limit));\n const qs = query.toString();\n return this.fetch<AvailablePhoneNumber[]>(\n `o/${orgUuid}/phone-numbers/search${qs ? `?${qs}` : ''}`\n );\n }\n\n /**\n * Purchase a phone number from Twilio for this org inventory (org admin only).\n *\n * Numbers in regulated countries (e.g. Australia) require a Twilio regulatory\n * bundle and an address — pass `bundleSid` and `addressSid` for those.\n */\n async purchasePhoneNumber(\n orgUuid: string,\n phoneNumber: string,\n numberType: 'local' | 'toll_free',\n opts?: { country?: string; bundleSid?: string; addressSid?: string }\n ): Promise<ProviderPhoneNumber> {\n return this.fetch<ProviderPhoneNumber>(`o/${orgUuid}/phone-numbers/purchase`, {\n method: 'POST',\n body: JSON.stringify({\n phoneNumber,\n numberType,\n country: opts?.country,\n bundleSid: opts?.bundleSid,\n addressSid: opts?.addressSid,\n }),\n });\n }\n\n /**\n * Delete a phone number from the org (releases from Twilio).\n */\n async deletePhoneNumber(orgUuid: string, providerPhoneUuid: string): Promise<void> {\n await this.fetch(`o/${orgUuid}/phone-numbers/delete`, {\n method: 'POST',\n body: JSON.stringify({ providerPhoneUuid }),\n });\n }\n\n // ============================================================================\n // Organization Domains API\n // ============================================================================\n\n /**\n * List domains registered to an organization.\n */\n async listOrgDomains(orgIdOrUuid: number | string): Promise<OrgDomainListResponse> {\n return this.fetch<OrgDomainListResponse>(`o/${orgIdOrUuid}/domains`);\n }\n\n /**\n * Register a domain with an organization and return the TXT ownership proof.\n */\n async registerOrgDomain(orgIdOrUuid: number | string, domain: string): Promise<OrgDomain> {\n return this.fetch<OrgDomain>(`o/${orgIdOrUuid}/domains`, {\n method: 'POST',\n body: JSON.stringify({ domain }),\n });\n }\n\n /**\n * Get a registered organization domain by UUID.\n */\n async getOrgDomain(orgIdOrUuid: number | string, domainUuid: string): Promise<OrgDomain> {\n return this.fetch<OrgDomain>(`o/${orgIdOrUuid}/domains/${domainUuid}`);\n }\n\n /**\n * Verify domain ownership by checking the _gravity-verify TXT record.\n */\n async verifyOrgDomainOwnership(\n orgIdOrUuid: number | string,\n domainUuid: string\n ): Promise<OwnershipVerificationResponse> {\n return this.fetch<OwnershipVerificationResponse>(\n `o/${orgIdOrUuid}/domains/${domainUuid}/verify-ownership`,\n { method: 'POST' }\n );\n }\n\n /**\n * Delete a registered organization domain.\n */\n async deleteOrgDomain(orgIdOrUuid: number | string, domainUuid: string): Promise<void> {\n await this.fetch<void>(`o/${orgIdOrUuid}/domains/${domainUuid}`, { method: 'DELETE' });\n }\n\n /**\n * Enable email DNS provisioning for a verified org domain.\n */\n async enableOrgDomainEmail(\n orgIdOrUuid: number | string,\n domainUuid: string\n ): Promise<EmailDomainConfig> {\n return this.fetch<EmailDomainConfig>(`o/${orgIdOrUuid}/domains/${domainUuid}/email`, {\n method: 'POST',\n });\n }\n\n /**\n * Get email DNS provisioning and verification status for an org domain.\n */\n async getOrgDomainEmail(\n orgIdOrUuid: number | string,\n domainUuid: string\n ): Promise<EmailDomainConfigGetResponse> {\n return this.fetch<EmailDomainConfigGetResponse>(\n `o/${orgIdOrUuid}/domains/${domainUuid}/email`\n );\n }\n\n /**\n * Verify email DNS records, including MX.\n */\n async verifyOrgDomainEmail(\n orgIdOrUuid: number | string,\n domainUuid: string\n ): Promise<EmailVerificationResponse> {\n return this.fetch<EmailVerificationResponse>(\n `o/${orgIdOrUuid}/domains/${domainUuid}/email/verify`,\n { method: 'POST' }\n );\n }\n\n /**\n * Disable email support for an org domain.\n */\n async disableOrgDomainEmail(\n orgIdOrUuid: number | string,\n domainUuid: string,\n confirm = false\n ): Promise<EmailDisableResponse> {\n const query = `?confirm=${confirm ? 'true' : 'false'}`;\n const response = await this.fetchRaw(\n `o/${orgIdOrUuid}/domains/${domainUuid}/email${query}`,\n { method: 'DELETE' },\n [409]\n );\n if (response.status === 409) {\n const impact = (await response.json()) as EmailDisableImpactResponse;\n return { ok: false, impact };\n }\n return { ok: true };\n }\n\n /**\n * Enable custom site routing for a verified org domain.\n *\n * Pass `{ childHosting: true }` to enable the domain as a **parent**\n * instead: it publishes one `*.<domain>` wildcard CNAME, serves nothing\n * at its own name, and hosts are added beneath it afterwards. The mode\n * is fixed at enable — disable and re-enable to change it.\n *\n * The request always carries a JSON body, `{}` by default: the route\n * requires one as a CSRF barrier.\n */\n async enableOrgDomainSite(\n orgIdOrUuid: number | string,\n domainUuid: string,\n options: { childHosting?: boolean } = {}\n ): Promise<SiteDomainConfig> {\n return this.fetch<SiteDomainConfig>(`o/${orgIdOrUuid}/domains/${domainUuid}/site`, {\n method: 'POST',\n body: JSON.stringify(options),\n });\n }\n\n /**\n * Get site CNAME provisioning and verification status for an org domain.\n */\n async getOrgDomainSite(\n orgIdOrUuid: number | string,\n domainUuid: string\n ): Promise<SiteDomainConfigGetResponse> {\n return this.fetch<SiteDomainConfigGetResponse>(`o/${orgIdOrUuid}/domains/${domainUuid}/site`);\n }\n\n /**\n * Pre-enable DNS check: is the site CNAME resolving to the routing\n * endpoint yet? Pure DNS — consumes no enable budget.\n *\n * Pass `{ childHosting: true }` to check the mode you intend to enable\n * in: the wildcard is probed instead of the domain's own CNAME.\n */\n async preflightOrgDomainSite(\n orgIdOrUuid: number | string,\n domainUuid: string,\n options: { childHosting?: boolean } = {}\n ): Promise<SitePreflightResponse> {\n return this.fetch<SitePreflightResponse>(\n `o/${orgIdOrUuid}/domains/${domainUuid}/site/preflight`,\n // JSON body, `{}` by default: the route requires one as a CSRF barrier.\n { method: 'POST', body: JSON.stringify(options) }\n );\n }\n\n /**\n * Verify the site CNAME points at the Gravity Rail sites domain.\n */\n async verifyOrgDomainSite(\n orgIdOrUuid: number | string,\n domainUuid: string\n ): Promise<SiteVerificationResponse> {\n return this.fetch<SiteVerificationResponse>(\n `o/${orgIdOrUuid}/domains/${domainUuid}/site/verify`,\n { method: 'POST' }\n );\n }\n\n /**\n * Create one child host beneath a child-hosting parent domain.\n *\n * The child gets its own CloudFront tenant and managed certificate and\n * needs no customer DNS: the parent's wildcard CNAME already routes it.\n */\n async createOrgDomainSiteChildHost(\n orgIdOrUuid: number | string,\n parentDomainUuid: string,\n request: SiteChildHostCreateRequest\n ): Promise<SiteChildHostResponse> {\n return this.fetch<SiteChildHostResponse>(\n `o/${orgIdOrUuid}/domains/${parentDomainUuid}/site/children`,\n { method: 'POST', body: JSON.stringify(request) }\n );\n }\n\n /**\n * List the child hosts beneath a child-hosting parent domain, with live\n * per-host status.\n */\n async listOrgDomainSiteChildHosts(\n orgIdOrUuid: number | string,\n parentDomainUuid: string\n ): Promise<SiteChildHostsResponse> {\n return this.fetch<SiteChildHostsResponse>(\n `o/${orgIdOrUuid}/domains/${parentDomainUuid}/site/children`\n );\n }\n\n /**\n * Disable custom site routing for an org domain.\n */\n async disableOrgDomainSite(\n orgIdOrUuid: number | string,\n domainUuid: string,\n confirm = false\n ): Promise<SiteDisableResponse> {\n const query = `?confirm=${confirm ? 'true' : 'false'}`;\n const response = await this.fetchRaw(\n `o/${orgIdOrUuid}/domains/${domainUuid}/site${query}`,\n { method: 'DELETE' },\n [409]\n );\n if (response.status === 409) {\n const impact = (await response.json()) as SiteDisableImpactResponse;\n return { ok: false, impact };\n }\n return { ok: true };\n }\n\n // ============================================================================\n // Organization A2P Brand Registration API\n // ============================================================================\n\n /** Return fixed phone-number and outbound-messaging prices. */\n async getPhoneBillingPricing(orgUuid: string): Promise<PhoneBillingPricing> {\n return this.fetch<PhoneBillingPricing>(`o/${orgUuid}/phone-numbers/pricing`);\n }\n\n /**\n * Start A2P brand registration under a legal entity. `legalEntityUuid`\n * is required — brands register per legal entity (Customer Profile);\n * there is no primary-entity fallback.\n *\n * `soleProprietorMobile` is the proprietor's own mobile number, the one the\n * carrier sends the A2P one-time-password verification to. Required when the\n * entity's registration shape is a sole proprietorship (see\n * `LegalEntitySummaryResponse.requiredBrandType`); ignored otherwise.\n *\n * Three constraints belong to the customer, so the caller must state them:\n * it has to be a US or Canadian **mobile**, it cannot be a number acquired\n * from a CPaaS provider (so never one we provisioned — the carrier rejects\n * it), and the carrier allows it a lifetime maximum of three uses across all\n * A2P brand registrations, counting those made through other vendors.\n *\n * It is forwarded to the registration workflow to reach the carrier as an\n * EndUser attribute and is never stored on our side.\n */\n async startA2PRegistration(\n orgUuid: string,\n legalEntityUuid: string,\n brandName: string,\n brandUuid: string | null = null,\n soleProprietorMobile: string | null = null\n ): Promise<StartA2PRegistrationResponse> {\n return this.fetch<StartA2PRegistrationResponse>(`o/${orgUuid}/phone-numbers/a2p/start`, {\n method: 'POST',\n body: JSON.stringify({\n legalEntityUuid,\n brandName,\n brandUuid,\n soleProprietorMobile,\n }),\n });\n }\n\n /**\n * Approve sample messages for one brand's A2P campaign. Signals the\n * brand's registration workflow to create the TCR campaign.\n */\n async approveA2PMessages(\n orgUuid: string,\n brandUuid: string,\n sampleMessages: string[]\n ): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`o/${orgUuid}/phone-numbers/a2p/approve-messages`, {\n method: 'POST',\n body: JSON.stringify({ brandUuid, sampleMessages }),\n });\n }\n\n /**\n * Activate SMS on a workspace-assigned number: attach it to the given\n * brand's Messaging Service (A2P 10DLC). Preconditions (412 otherwise):\n * campaign VERIFIED, brand has a Messaging Service, phone assigned to a\n * workspace with a Twilio SID.\n */\n async activateA2PNumber(\n orgUuid: string,\n providerPhoneUuid: string,\n brandUuid: string\n ): Promise<ActivateA2PNumberResponse> {\n return this.fetch<ActivateA2PNumberResponse>(\n `o/${orgUuid}/phone-numbers/a2p/activate-number`,\n {\n method: 'POST',\n body: JSON.stringify({ providerPhoneUuid, brandUuid }),\n }\n );\n }\n\n /**\n * Which legal entity's voice trust products (CNAM, SHAKEN/STIR, Voice\n * Integrity) each of the org's numbers carries, read live from Twilio.\n */\n async getPhoneVoiceTrust(orgUuid: string): Promise<OrgPhoneVoiceTrustResponse> {\n return this.fetch<OrgPhoneVoiceTrustResponse>(`o/${orgUuid}/phone-numbers/voice-trust`);\n }\n\n /**\n * Put a number on a legal entity's Customer Profile and approved voice\n * trust products, taking it off any other legal entity's first. The\n * entity's business profile must be approved (400 otherwise).\n */\n async attachPhoneVoiceTrust(\n orgUuid: string,\n providerPhoneUuid: string,\n legalEntityUuid: string\n ): Promise<PhoneVoiceTrust> {\n const body: AttachPhoneVoiceTrustRequest = { providerPhoneUuid, legalEntityUuid };\n return this.fetch<PhoneVoiceTrust>(`o/${orgUuid}/phone-numbers/voice-trust/attach`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n // ============================================================================\n // Organization Business Profile API (Twilio Trust Hub Secondary CP)\n // ============================================================================\n\n /**\n * Live fetch of the org's Twilio Customer Profile + related entities.\n *\n * Response carries both the lifecycle `status` and the compliance\n * `evaluationStatus`. Twilio models lifecycle and evaluation as two\n * separate enums on two separate resources, so the Submit-button gate\n * is `evaluationStatus === 'compliant'` — never `status === 'compliant'`,\n * which is impossible (lifecycle status is one of `draft` /\n * `pending-review` / `in-review` / `twilio-approved` / `twilio-rejected`).\n */\n async getBusinessProfile(\n orgUuid: string,\n legalEntityUuid?: string | null\n ): Promise<BusinessProfileResponse> {\n return this.fetch<BusinessProfileResponse>(businessProfilePath(orgUuid, legalEntityUuid));\n }\n\n /**\n * Upsert the org's business profile. Idempotent via cached SIDs.\n * Returns a fresh BusinessProfileResponse on success — including the\n * compliance evaluation result so the frontend can immediately enable\n * Submit without a second round-trip.\n */\n async updateBusinessProfile(\n orgUuid: string,\n data: UpdateBusinessProfileRequest,\n legalEntityUuid?: string | null\n ): Promise<BusinessProfileResponse> {\n return this.fetch<BusinessProfileResponse>(businessProfilePath(orgUuid, legalEntityUuid), {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Submit the business profile to Twilio for review. Server re-evaluates\n * compliance live and returns 412 if the profile is not currently\n * `compliant`; returns 409 if a review is already in flight.\n */\n async submitBusinessProfile(\n orgUuid: string,\n legalEntityUuid?: string | null\n ): Promise<SubmitBusinessProfileResponse> {\n return this.fetch<SubmitBusinessProfileResponse>(\n `${businessProfilePath(orgUuid, legalEntityUuid)}/submit`,\n { method: 'POST' }\n );\n }\n\n /**\n * Cancel an in-flight Twilio review. Resets the cached profile state\n * to `draft` so the user can edit and resubmit.\n */\n async cancelBusinessProfile(\n orgUuid: string,\n legalEntityUuid?: string | null\n ): Promise<CancelBusinessProfileResponse> {\n return this.fetch<CancelBusinessProfileResponse>(\n `${businessProfilePath(orgUuid, legalEntityUuid)}/cancel`,\n { method: 'POST' }\n );\n }\n\n // ============================================================================\n // Legal entities (Twilio Secondary Customer Profiles)\n // ============================================================================\n\n /** List the org's legal entities (one Customer Profile each). */\n async listLegalEntities(orgUuid: string): Promise<LegalEntityListResponse> {\n return this.fetch<LegalEntityListResponse>(`o/${orgUuid}/legal-entities`);\n }\n\n /** Create a legal entity. Its business profile is edited via the entity-scoped business-profile methods. */\n async createLegalEntity(\n orgUuid: string,\n data: CreateLegalEntityRequest\n ): Promise<LegalEntitySummary> {\n return this.fetch<LegalEntitySummary>(`o/${orgUuid}/legal-entities`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async getLegalEntity(orgUuid: string, legalEntityUuid: string): Promise<LegalEntitySummary> {\n return this.fetch<LegalEntitySummary>(`o/${orgUuid}/legal-entities/${legalEntityUuid}`);\n }\n\n /**\n * Read one registration draft for a legal entity.\n *\n * A draft is what the operator has typed but not submitted. It exists so\n * data entry is never gated on a prerequisite: someone can write down the\n * caller-ID name today and submit it the day the business is verified.\n */\n async getRegistrationDraft(\n orgUuid: string,\n legalEntityUuid: string,\n kind: RegistrationDraftKind\n ): Promise<RegistrationDraftResponse> {\n return this.fetch<RegistrationDraftResponse>(\n `o/${orgUuid}/legal-entities/${legalEntityUuid}/registration-drafts/${kind}`\n );\n }\n\n /**\n * Save one registration draft. Always accepted — the server refuses only\n * an oversized body, never an unfinished one.\n */\n async saveRegistrationDraft(\n orgUuid: string,\n legalEntityUuid: string,\n kind: RegistrationDraftKind,\n data: Record<string, unknown>\n ): Promise<RegistrationDraftResponse> {\n return this.fetch<RegistrationDraftResponse>(\n `o/${orgUuid}/legal-entities/${legalEntityUuid}/registration-drafts/${kind}`,\n { method: 'PUT', body: JSON.stringify({ data }) }\n );\n }\n\n /** Cached voice trust product state (CNAM / SHAKEN-STIR / Voice Integrity) for one legal entity. */\n async getVoiceTrustProducts(\n orgUuid: string,\n legalEntityUuid: string\n ): Promise<VoiceTrustProductsResponse> {\n return this.fetch<VoiceTrustProductsResponse>(\n `o/${orgUuid}/legal-entities/${legalEntityUuid}/trust-products`\n );\n }\n\n /**\n * Reconcile trust product state against Twilio (discovery + status\n * refresh). Returns the refreshed products plus which product keys were\n * newly discovered. Responds 409 when another Trust Hub operation holds\n * this legal entity's lock, failing fast rather than queueing.\n *\n * No `Retry-After` is sent, deliberately (#23601): holders range from a\n * sub-second JSONB write to a multi-minute Twilio sequence, so no interval\n * would be honest. Back off on your own schedule, and re-read before\n * retrying — the operation you collided with may have committed SIDs.\n */\n async syncVoiceTrustProducts(\n orgUuid: string,\n legalEntityUuid: string\n ): Promise<SyncVoiceTrustProductsResponse> {\n return this.fetch<SyncVoiceTrustProductsResponse>(\n `o/${orgUuid}/legal-entities/${legalEntityUuid}/trust-products/sync`,\n // Empty JSON body is the CSRF barrier the route requires (GRA-6284).\n { method: 'POST', body: JSON.stringify({}) }\n );\n }\n\n /**\n * Set up + submit one voice trust product for a legal entity. Requires\n * the entity's business profile to be twilio-approved (412 otherwise).\n */\n async setupVoiceTrustProduct(\n orgUuid: string,\n legalEntityUuid: string,\n product: VoiceTrustProductKey,\n data: SetupVoiceTrustProductRequest\n ): Promise<VoiceTrustProductsResponse> {\n return this.fetch<VoiceTrustProductsResponse>(\n `o/${orgUuid}/legal-entities/${legalEntityUuid}/trust-products/${product}`,\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n\n /**\n * Brand detail with live registration-workflow state (`workflowStatus`,\n * `pendingSampleMessages`) for the sample-approval step.\n */\n async getA2PBrand(orgUuid: string, brandUuid: string): Promise<OrgA2PBrandDetail> {\n return this.fetch<OrgA2PBrandDetail>(`o/${orgUuid}/a2p-brands/${brandUuid}`);\n }\n\n /**\n * List the org's A2P brands (broker resources). The SMS-consent editor uses\n * this to pick which brand's consent config to edit.\n */\n async listA2PBrands(orgUuid: string): Promise<OrgA2PBrandListResponse> {\n return this.fetch<OrgA2PBrandListResponse>(`o/${orgUuid}/a2p-brands`);\n }\n\n /**\n * Live per-brand campaign use-case eligibility. Approved brands only — a\n * brand still under TCR review comes back as a structured 412 the picker\n * renders as the supported-list fallback, not an error.\n */\n async getA2PBrandUseCases(\n orgUuid: string,\n brandUuid: string\n ): Promise<OrgA2PBrandUseCasesResponse> {\n return this.fetch<OrgA2PBrandUseCasesResponse>(\n `o/${orgUuid}/a2p-brands/${brandUuid}/use-cases`\n );\n }\n\n /**\n * Fetch a brand's resolved A2P campaign config. The response carries both the\n * raw `overrides` and the `resolved` payload (defaults + overrides) the editor\n * previews — including the canonical SMS consent text.\n */\n async getA2PCampaignConfig(\n orgUuid: string,\n brandUuid: string\n ): Promise<A2PCampaignConfigResponse> {\n return this.fetch<A2PCampaignConfigResponse>(\n `o/${orgUuid}/a2p-brands/${brandUuid}/campaign-config`\n );\n }\n\n /**\n * Partial-update a brand's A2P campaign config. Returns the freshly resolved\n * config so the editor's live preview updates without a second round-trip.\n */\n async updateA2PCampaignConfig(\n orgUuid: string,\n brandUuid: string,\n data: UpdateA2PCampaignConfigRequest\n ): Promise<A2PCampaignConfigResponse> {\n return this.fetch<A2PCampaignConfigResponse>(\n `o/${orgUuid}/a2p-brands/${brandUuid}/campaign-config`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Resubmit a campaign the carrier rejected, with the brand's current\n * campaign copy. Edits the campaign in place, so no second vetting fee.\n */\n async resubmitA2PCampaign(\n orgUuid: string,\n brandUuid: string\n ): Promise<A2PCampaignConfigResponse> {\n return this.fetch<A2PCampaignConfigResponse>(\n `o/${orgUuid}/a2p-brands/${brandUuid}/resubmit-campaign`,\n { method: 'POST' }\n );\n }\n\n /**\n * Published Sites across the org's workspaces that can be linked as this\n * brand's enrollment (opt-in) surface. Org-authorized, so it works even when\n * the admin isn't a member of the workspace holding the Site.\n */\n async listA2PEnrollmentSiteCandidates(\n orgUuid: string,\n brandUuid: string\n ): Promise<A2PEnrollmentSiteCandidatesResponse> {\n return this.fetch<A2PEnrollmentSiteCandidatesResponse>(\n `o/${orgUuid}/a2p-brands/${brandUuid}/enrollment-site/candidates`\n );\n }\n\n /**\n * Link the brand to a published enrollment Site (sets `site_uuid`). Returns\n * the refreshed campaign config.\n */\n async linkA2PEnrollmentSite(\n orgUuid: string,\n brandUuid: string,\n data: LinkA2PEnrollmentSiteRequest\n ): Promise<A2PCampaignConfigResponse> {\n return this.fetch<A2PCampaignConfigResponse>(\n `o/${orgUuid}/a2p-brands/${brandUuid}/enrollment-site`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Provision (or reuse) a patient-enrollment Site for the brand and link it —\n * the explicit counterpart to the automatic provisioning at brand\n * registration. `workspaceUuid` is required only when the org has multiple\n * workspaces. Returns the refreshed campaign config. Idempotent.\n */\n async provisionA2PEnrollmentSite(\n orgUuid: string,\n brandUuid: string,\n data: ProvisionA2PEnrollmentSiteRequest = {}\n ): Promise<A2PCampaignConfigResponse> {\n return this.fetch<A2PCampaignConfigResponse>(\n `o/${orgUuid}/a2p-brands/${brandUuid}/enrollment-site/provision`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /** Clear the brand's enrollment-site link. */\n async unlinkA2PEnrollmentSite(\n orgUuid: string,\n brandUuid: string\n ): Promise<A2PCampaignConfigResponse> {\n return this.fetch<A2PCampaignConfigResponse>(\n `o/${orgUuid}/a2p-brands/${brandUuid}/enrollment-site`,\n { method: 'DELETE' }\n );\n }\n\n /**\n * Stage one A2P opt-in evidence file: get a presigned POST to send the bytes\n * straight to storage. Nothing is recorded on the brand until\n * {@link registerA2PEvidenceUpload} reads the object back and normalizes it.\n */\n async createA2PEvidenceUploadUrl(\n orgUuid: string,\n brandUuid: string,\n data: CreateA2PEvidenceUploadUrlRequest\n ): Promise<A2PEvidenceUploadUrlResponse> {\n return this.fetch<A2PEvidenceUploadUrlResponse>(\n `o/${orgUuid}/a2p-brands/${brandUuid}/evidence-attachments/upload-url`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Normalize a staged evidence upload and record it on the brand. Returns the\n * refreshed campaign config, so the editor's evidence list updates without a\n * second round trip.\n */\n async registerA2PEvidenceUpload(\n orgUuid: string,\n brandUuid: string,\n data: RegisterA2PEvidenceUploadRequest\n ): Promise<A2PCampaignConfigResponse> {\n return this.fetch<A2PCampaignConfigResponse>(\n `o/${orgUuid}/a2p-brands/${brandUuid}/evidence-attachments`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /** Remove one uploaded evidence artifact. */\n async deleteA2PEvidenceUpload(\n orgUuid: string,\n brandUuid: string,\n attachmentUuid: string\n ): Promise<A2PCampaignConfigResponse> {\n return this.fetch<A2PCampaignConfigResponse>(\n `o/${orgUuid}/a2p-brands/${brandUuid}/evidence-attachments/${encodeURIComponent(\n attachmentUuid\n )}`,\n { method: 'DELETE' }\n );\n }\n\n /**\n * List available member roles for a workspace in the organization.\n */\n async getWorkspaceMemberRoles(\n orgIdOrUuid: number | string,\n workspaceUuid: string\n ): Promise<MemberRole[]> {\n return this.fetch<MemberRole[]>(`o/${orgIdOrUuid}/workspaces/${workspaceUuid}/member-roles`);\n }\n\n /**\n * Join a workspace as the current org admin/owner.\n */\n async joinWorkspace(\n orgIdOrUuid: number | string,\n workspaceUuid: string,\n data: OrgJoinWorkspaceRequest\n ): Promise<OrgJoinWorkspaceResponse> {\n return this.fetch<OrgJoinWorkspaceResponse>(\n `o/${orgIdOrUuid}/workspaces/${workspaceUuid}/join`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n // =========================================================================\n // Organization webhook endpoints (GRA-8314)\n // =========================================================================\n\n async listOrgWebhookEndpoints(\n orgIdOrUuid: number | string\n ): Promise<OrgWebhookEndpointResponse[]> {\n return this.fetch<OrgWebhookEndpointResponse[]>(`o/${orgIdOrUuid}/webhooks`);\n }\n\n async getOrgWebhookEndpoint(\n orgIdOrUuid: number | string,\n endpointUuid: string\n ): Promise<OrgWebhookEndpointResponse> {\n return this.fetch<OrgWebhookEndpointResponse>(`o/${orgIdOrUuid}/webhooks/${endpointUuid}`);\n }\n\n /**\n * The subscribable event-type vocabulary for the org UI's event-type\n * picker — exactly what the create/update validators accept, so the UI\n * never offers a type the API would reject.\n */\n async listOrgWebhookEventTypes(\n orgIdOrUuid: number | string\n ): Promise<OrgWebhookEventTypesResponse> {\n return this.fetch<OrgWebhookEventTypesResponse>(`o/${orgIdOrUuid}/webhooks/event-types`);\n }\n\n async createOrgWebhookEndpoint(\n orgIdOrUuid: number | string,\n data: CreateOrgWebhookEndpointRequest\n ): Promise<CreatedOrgWebhookEndpointResponse> {\n return this.fetch<CreatedOrgWebhookEndpointResponse>(`o/${orgIdOrUuid}/webhooks`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateOrgWebhookEndpoint(\n orgIdOrUuid: number | string,\n endpointUuid: string,\n data: UpdateOrgWebhookEndpointRequest\n ): Promise<OrgWebhookEndpointResponse> {\n return this.fetch<OrgWebhookEndpointResponse>(`o/${orgIdOrUuid}/webhooks/${endpointUuid}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n async deleteOrgWebhookEndpoint(\n orgIdOrUuid: number | string,\n endpointUuid: string\n ): Promise<void> {\n return this.fetch<void>(`o/${orgIdOrUuid}/webhooks/${endpointUuid}`, {\n method: 'DELETE',\n });\n }\n\n async listOrgWebhookEndpointDeliveries(\n orgIdOrUuid: number | string,\n endpointUuid: string,\n limit = 50\n ): Promise<OrgWebhookDeliveryListResponse> {\n return this.fetch<OrgWebhookDeliveryListResponse>(\n `o/${orgIdOrUuid}/webhooks/${endpointUuid}/deliveries?limit=${limit}`\n );\n }\n\n /**\n * A representative delivery body for one event type — what the test-send\n * editor is prefilled with, and the same builder the public event catalog\n * is generated from. Pass `endpointUuid` to have the sample name that\n * endpoint and sit in a workspace it actually covers.\n */\n async getOrgWebhookEventSample(\n orgIdOrUuid: number | string,\n eventType: string,\n endpointUuid?: string\n ): Promise<OrgWebhookSamplePayloadResponse> {\n const query = endpointUuid ? `?endpointUuid=${encodeURIComponent(endpointUuid)}` : '';\n return this.fetch<OrgWebhookSamplePayloadResponse>(\n `o/${orgIdOrUuid}/webhooks/event-types/${encodeURIComponent(eventType)}/sample${query}`\n );\n }\n\n /**\n * Send one payload to the endpoint now and report what came back.\n *\n * Outside the delivery queue: no delivery row, no retry, no effect on the\n * endpoint's status — but the same signing, egress vetting and outcome\n * classification a real delivery goes through.\n */\n async testOrgWebhookEndpoint(\n orgIdOrUuid: number | string,\n endpointUuid: string,\n data: TestOrgWebhookEndpointRequest\n ): Promise<TestOrgWebhookEndpointResponse> {\n return this.fetch<TestOrgWebhookEndpointResponse>(\n `o/${orgIdOrUuid}/webhooks/${endpointUuid}/test`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n // =========================================================================\n // Organization API keys (GRA-9043)\n // =========================================================================\n\n /**\n * List every API key bound to this organization. Never carries the secret.\n *\n * Org-bound keys authenticate as an org-local principal, so one key reaches\n * every current workspace of the organization and every workspace created\n * later. Gated by `org:api_keys`, which `org:admin` holds transitively.\n */\n async listOrgApiKeys(orgIdOrUuid: number | string): Promise<ApiKeyResponse[]> {\n return this.fetch<ApiKeyResponse[]>(`o/${orgIdOrUuid}/api-keys`);\n }\n\n /**\n * Mint an org-bound API key.\n *\n * The payload is the same client-only {@link ApiKeyFormData} the workspace\n * and account routes take — `{name, expiresInDays, scopes}`, no workspace\n * id: the mint location is what binds the key. The response carries `key`,\n * the plaintext secret, which is readable exactly once.\n */\n async createOrgApiKey(\n orgIdOrUuid: number | string,\n apiKey: ApiKeyFormData\n ): Promise<ApiKeyCreatedResponse> {\n return this.fetch<ApiKeyCreatedResponse>(`o/${orgIdOrUuid}/api-keys`, {\n method: 'POST',\n body: JSON.stringify(apiKey),\n });\n }\n\n /** Revoke an org-bound API key by its id. */\n async revokeOrgApiKey(orgIdOrUuid: number | string, keyId: number): Promise<void> {\n return this.fetch<void>(`o/${orgIdOrUuid}/api-keys/${keyId}`, {\n method: 'DELETE',\n });\n }\n}\n\nimport type {\n CreateOrgWebhookEndpointRequest,\n CreatedOrgWebhookEndpointResponse,\n OrgWebhookDeliveryListResponse,\n OrgWebhookEndpointResponse,\n OrgWebhookEventTypesResponse,\n OrgWebhookSamplePayloadResponse,\n TestOrgWebhookEndpointRequest,\n TestOrgWebhookEndpointResponse,\n UpdateOrgWebhookEndpointRequest,\n} from '../types/generated/organization_webhook';\n\n/**\n * Organization webhook endpoint types — the GENERATED contract\n * (``../types/generated/organization_webhook``), re-exported here so every\n * consumer of the SDK's org surface reads the same shapes the backend emits.\n * The pre-redesign hand-written types (``workspaceSelector``, ``exclude``,\n * ``disabled_by_failure``, flattened delivery failure columns) lived here and\n * drifted from the backend; do not reintroduce them — regenerate instead\n * (``yarn generate:types``).\n */\nexport type {\n CreateOrgWebhookEndpointRequest,\n CreatedOrgWebhookEndpointResponse,\n OrgWebhookDeliveryAttemptResponse,\n OrgWebhookDeliveryListResponse,\n OrgWebhookDeliveryResponse,\n OrgWebhookEndpointResponse,\n OrgWebhookEndpointStatusHistoryEntry,\n OrgWebhookEventTypesResponse,\n OrgWebhookSamplePayloadResponse,\n TestOrgWebhookEndpointRequest,\n TestOrgWebhookEndpointResponse,\n UpdateOrgWebhookEndpointRequest,\n UpdateOrgWebhookEndpointRequestStatus,\n} from '../types/generated/organization_webhook';\n\n/**\n * Business-profile base path. Without `legalEntityUuid` this targets the\n * legacy singleton route (resolves the org's primary legal entity); with it,\n * the entity-scoped route — same handlers, explicit entity.\n */\nfunction businessProfilePath(orgUuid: string, legalEntityUuid?: string | null): string {\n return legalEntityUuid\n ? `o/${orgUuid}/legal-entities/${legalEntityUuid}/business-profile`\n : `o/${orgUuid}/business-profile`;\n}\n","import { BaseApiClient } from './base';\n\n// Third-party OAuth connection types\nexport type OAuthProviderSlug = 'google_calendar' | 'gmail' | 'google' | 'gdrive' | 'gsheets';\n\nexport interface OAuthConnectionStatus {\n connected: boolean;\n email?: string;\n}\n\nexport interface OAuthAccountSummary {\n credentialUuid: string;\n displayLabel: string;\n externalEmail?: string;\n}\n\nexport interface OAuthAccountsResponse {\n accounts: OAuthAccountSummary[];\n total: number;\n}\n\nexport interface OAuthAuthorizeResponse {\n authorization_url: string;\n}\n\nexport type OAuthAuthorizeOptions = {\n credentialUuid?: string;\n loginHint?: string;\n /** Frontend URL to return to after OAuth (stored in oauth state). */\n redirect?: string;\n};\n\n/**\n * Build the OAuth endpoint path for a provider\n */\nfunction getOAuthPath(\n providerSlug: OAuthProviderSlug,\n action: 'status' | 'authorize' | 'disconnect' | 'accounts'\n): string {\n if (providerSlug === 'google_calendar') {\n return `oauth/google/calendar/${action}`;\n }\n if (providerSlug === 'gmail') {\n return `oauth/google/gmail/${action}`;\n }\n if (providerSlug === 'gdrive') {\n return `oauth/google/drive/${action}`;\n }\n if (providerSlug === 'gsheets') {\n return `oauth/google/sheets/${action}`;\n }\n return `oauth/${providerSlug}/${action}`;\n}\n\nfunction buildAuthorizeQuery(options?: OAuthAuthorizeOptions): string {\n if (!options) return '';\n const params = new URLSearchParams();\n if (options.credentialUuid) params.set('credentialUuid', options.credentialUuid);\n if (options.loginHint) params.set('loginHint', options.loginHint);\n if (options.redirect) params.set('redirect', options.redirect);\n const qs = params.toString();\n return qs ? `?${qs}` : '';\n}\n\n/**\n * API for managing third-party OAuth connections (Google Calendar, Gmail, Drive, etc.)\n */\nexport class OAuthConnectionsApi extends BaseApiClient {\n async getConnectionStatus(\n providerSlug: OAuthProviderSlug\n ): Promise<OAuthConnectionStatus | null> {\n const path = getOAuthPath(providerSlug, 'status');\n return this.fetchRoot<OAuthConnectionStatus | null>(path);\n }\n\n async listAccounts(providerSlug: OAuthProviderSlug): Promise<OAuthAccountsResponse> {\n const path = getOAuthPath(providerSlug, 'accounts');\n return this.fetchRoot<OAuthAccountsResponse>(path);\n }\n\n async getAuthorizationUrl(\n providerSlug: OAuthProviderSlug,\n options?: OAuthAuthorizeOptions\n ): Promise<OAuthAuthorizeResponse> {\n const path = getOAuthPath(providerSlug, 'authorize') + buildAuthorizeQuery(options);\n return this.fetchRoot<OAuthAuthorizeResponse>(path);\n }\n\n async disconnect(providerSlug: OAuthProviderSlug, credentialUuid?: string): Promise<void> {\n const path = getOAuthPath(providerSlug, 'disconnect');\n const qs = credentialUuid ? `?credentialUuid=${encodeURIComponent(credentialUuid)}` : '';\n return this.fetchRoot<void>(`${path}${qs}`, { method: 'DELETE' });\n }\n}\n\n// Internal OAuth flow types (when Gravity Rail is the OAuth provider)\nexport interface AuthorizeRequest {\n clientId: string;\n workspaceUuid?: string | null;\n scopes: string[];\n redirectUri: string;\n state?: string;\n codeChallenge?: string;\n codeChallengeMethod?: string;\n}\n\nexport interface AuthorizeResponse {\n code: string;\n state?: string;\n}\n\nexport interface TokenRequest {\n grant_type: 'authorization_code' | 'refresh_token';\n code?: string;\n refresh_token?: string;\n client_id: string;\n client_secret: string;\n redirect_uri?: string;\n code_verifier?: string;\n}\n\nexport interface TokenResponse {\n access_token: string;\n token_type: string;\n expires_in: number;\n refresh_token?: string;\n scope: string;\n}\n\nexport interface ApiScope {\n name: string;\n category: string;\n description: string;\n implies: string[];\n dangerous: boolean;\n}\n\nexport interface ScopesListResponse {\n items: ApiScope[];\n categories: string[];\n}\n\nexport class OAuthApi extends BaseApiClient {\n async getAvailableScopes(): Promise<ScopesListResponse> {\n return this.fetch<ScopesListResponse>('oauth/scopes');\n }\n\n async authorize(request: AuthorizeRequest): Promise<AuthorizeResponse> {\n return this.fetch<AuthorizeResponse>('oauth/authorize', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n async exchangeOAuthToken(request: TokenRequest): Promise<TokenResponse> {\n const formData = new URLSearchParams();\n formData.append('grant_type', request.grant_type);\n if (request.code) formData.append('code', request.code);\n if (request.refresh_token) formData.append('refresh_token', request.refresh_token);\n formData.append('client_id', request.client_id);\n formData.append('client_secret', request.client_secret);\n if (request.redirect_uri) formData.append('redirect_uri', request.redirect_uri);\n if (request.code_verifier) formData.append('code_verifier', request.code_verifier);\n\n return this.fetch<TokenResponse>('oauth/token', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: formData.toString(),\n });\n }\n}\n","import { ApiError, BaseApiClient } from './base';\nimport type { InboundFaxLogEntry, InboundFaxStatus } from '../types/generated/inbound_fax';\nimport {\n ArchiveBlockers,\n OutboundCallAnalyticsFilters,\n OutboundCallAnalyticsRowResponse,\n OutboundCallAnalyticsSortKey,\n OutboundCallAnalyticsSummary,\n PhoneNumber,\n PhoneNumberFormData,\n PhoneCall,\n SMSMessage,\n Voicemail,\n VoicemailStatus,\n PaginatedResponse,\n} from '../types';\nimport type { UpdatePhoneNumberRequest } from '../types/generated/phone_number';\n\n/**\n * Append the shared analytics filter set to a query string. `terminationReason`,\n * `answeredBy`, and `memberLabel` are repeatable params (one entry per value).\n */\nfunction appendAnalyticsFilters(\n params: URLSearchParams,\n filters?: OutboundCallAnalyticsFilters\n): void {\n if (!filters) return;\n if (filters.dateFrom) params.set('dateFrom', filters.dateFrom);\n if (filters.dateTo) params.set('dateTo', filters.dateTo);\n filters.terminationReason?.forEach((v) => params.append('terminationReason', v));\n filters.answeredBy?.forEach((v) => params.append('answeredBy', v));\n filters.memberLabel?.forEach((v) => params.append('memberLabel', v));\n}\n\nexport class PhoneNumbersApi extends BaseApiClient {\n /** List phone numbers in a workspace, optionally including archived. */\n async getPhoneNumbers(wid: string, options?: { isArchived?: boolean }): Promise<PhoneNumber[]> {\n const params = new URLSearchParams();\n if (options?.isArchived !== undefined) {\n params.set('is_archived', String(options.isArchived));\n }\n const query = params.toString();\n return this.fetch<PhoneNumber[]>(`w/${wid}/phone-numbers${query ? `?${query}` : ''}`);\n }\n\n /** List phone numbers available for provisioning. */\n async getAvailablePhoneNumbers(\n wid: string\n ): Promise<Array<{ phoneNumber: string; friendlyName: string }>> {\n return this.fetch<Array<{ phoneNumber: string; friendlyName: string }>>(\n `w/${wid}/phone-numbers/available-numbers`\n );\n }\n\n /** Request provisioning of a specific phone number. */\n async requestPhoneNumber(\n wid: string,\n phoneNumber: string\n ): Promise<{ status: string; message: string }> {\n return this.fetch<{ status: string; message: string }>(`w/${wid}/phone-numbers/request`, {\n method: 'POST',\n body: JSON.stringify({ phone_number: phoneNumber }),\n });\n }\n\n /** Get a phone number by ID or UUID. */\n async getPhoneNumber(wid: string, id: number | string): Promise<PhoneNumber> {\n return this.fetch<PhoneNumber>(`w/${wid}/phone-numbers/${id}`);\n }\n\n /** Create a new phone number record. */\n async createPhoneNumber(wid: string, phoneNumber: PhoneNumberFormData): Promise<PhoneNumber> {\n return this.fetch<PhoneNumber>(`w/${wid}/phone-numbers`, {\n method: 'POST',\n body: JSON.stringify(phoneNumber),\n });\n }\n\n /** Update a phone number record. */\n async updatePhoneNumber(\n wid: string,\n id: number,\n phoneNumber: UpdatePhoneNumberRequest\n ): Promise<PhoneNumber> {\n return this.fetch<PhoneNumber>(`w/${wid}/phone-numbers/${id}`, {\n method: 'PUT',\n body: JSON.stringify(phoneNumber),\n });\n }\n\n /** Get archive blockers for a phone number. */\n async getArchiveBlockers(wid: string, id: number): Promise<ArchiveBlockers> {\n return this.fetch<ArchiveBlockers>(`w/${wid}/phone-numbers/${id}/archive-blockers`);\n }\n\n /** Archive a phone number, releasing the Twilio number back to the pool. */\n async archivePhoneNumber(wid: string, id: number): Promise<PhoneNumber> {\n return this.fetch<PhoneNumber>(`w/${wid}/phone-numbers/${id}/archive`, {\n method: 'POST',\n });\n }\n\n /** List paginated call records for a phone number.\n *\n * Routes through the workspace-wide /calls endpoint with a\n * phoneNumberId filter.\n */\n async getPhoneNumberCalls(\n wid: string,\n id: number,\n page: number = 1,\n pageSize: number = 10,\n filters?: {\n status?: string;\n inbound?: boolean;\n dateFrom?: string;\n dateTo?: string;\n /** Narrow the current phone-number listing to one retired Activity target. */\n callId?: number;\n }\n ): Promise<PaginatedResponse<PhoneCall>> {\n const params = new URLSearchParams({\n page: String(page),\n pageSize: String(pageSize),\n phoneNumberId: String(id),\n });\n if (filters?.status) params.set('status', filters.status);\n if (filters?.inbound !== undefined) params.set('inbound', String(filters.inbound));\n if (filters?.dateFrom) params.set('dateFrom', filters.dateFrom);\n if (filters?.dateTo) params.set('dateTo', filters.dateTo);\n if (filters?.callId !== undefined) params.set('callId', String(filters.callId));\n return this.fetch<PaginatedResponse<PhoneCall>>(`w/${wid}/calls?${params}`);\n }\n\n /** List paginated voicemails for a phone number. */\n async getPhoneNumberVoicemails(\n wid: string,\n id: number,\n page: number = 1,\n pageSize: number = 10,\n status?: VoicemailStatus\n ): Promise<PaginatedResponse<Voicemail>> {\n const params = new URLSearchParams({\n page: String(page),\n page_size: String(pageSize),\n });\n if (status) params.set('status', status);\n return this.fetch<PaginatedResponse<Voicemail>>(\n `w/${wid}/phone-numbers/${id}/voicemails?${params}`\n );\n }\n\n /** Fetch voicemail audio through the authenticated client path. */\n async fetchVoicemailAudio(\n wid: string,\n phoneNumberId: number,\n voicemailId: number\n ): Promise<ArrayBuffer> {\n const response = await this.fetchRaw(\n `w/${wid}/phone-numbers/${phoneNumberId}/voicemails/${voicemailId}/audio`\n );\n return response.arrayBuffer();\n }\n\n /** Update voicemail status. */\n async updateVoicemailStatus(\n wid: string,\n phoneNumberId: number,\n voicemailId: number,\n status: VoicemailStatus\n ): Promise<Voicemail> {\n return this.fetch<Voicemail>(\n `w/${wid}/phone-numbers/${phoneNumberId}/voicemails/${voicemailId}?status=${status}`,\n { method: 'PATCH' }\n );\n }\n\n /** List paginated SMS messages for a phone number. */\n async getPhoneNumberMessages(\n wid: string,\n id: number,\n page: number = 1,\n pageSize: number = 10,\n filters?: { status?: string; inbound?: boolean; dateFrom?: string; dateTo?: string }\n ): Promise<PaginatedResponse<SMSMessage>> {\n const params = new URLSearchParams({\n page: String(page),\n pageSize: String(pageSize),\n });\n if (filters?.status) params.set('status', filters.status);\n if (filters?.inbound !== undefined) params.set('inbound', String(filters.inbound));\n if (filters?.dateFrom) params.set('dateFrom', filters.dateFrom);\n if (filters?.dateTo) params.set('dateTo', filters.dateTo);\n return this.fetch<PaginatedResponse<SMSMessage>>(\n `w/${wid}/phone-numbers/${id}/messages?${params}`\n );\n }\n\n /**\n * List received faxes for a phone number.\n *\n * The same log the Documo connection page shows, scoped to a number. Rows\n * carry `senderNumber` — an unauthenticated claim by the sending machine,\n * and PHI. Render it for triage; never log it.\n *\n * Same query vocabulary as `listDocumoFaxes` — one log, one spelling.\n * `status` is repeatable and is validated against the status enum, so a\n * typo is a 422 rather than a silently empty page. The date bounds filter\n * on when the delivery was recorded, not on `receivedAt`: a fax that failed\n * before storage never gets a `receivedAt`, so bounding that column would\n * hide exactly the failures an operator filtering by date is hunting for.\n */\n async getPhoneNumberFaxes(\n wid: string,\n id: number,\n page: number = 1,\n pageSize: number = 10,\n filters?: {\n status?: readonly InboundFaxStatus[];\n receivedAfter?: string;\n receivedBefore?: string;\n }\n ): Promise<PaginatedResponse<InboundFaxLogEntry>> {\n const params = new URLSearchParams({\n page: String(page),\n pageSize: String(pageSize),\n });\n filters?.status?.forEach((value) => params.append('status', value));\n if (filters?.receivedAfter) params.set('receivedAfter', filters.receivedAfter);\n if (filters?.receivedBefore) params.set('receivedBefore', filters.receivedBefore);\n return this.fetch<PaginatedResponse<InboundFaxLogEntry>>(\n `w/${wid}/phone-numbers/${id}/faxes?${params}`\n );\n }\n\n /** List provider phones available for linking to workspace phone numbers. */\n async getLinkablePhones(wid: string): Promise<\n Array<{\n uuid: string;\n phoneNumber: string;\n friendlyName: string | null;\n provider: string;\n isAssigned: boolean;\n workspaceId: number | null;\n linkedInWorkspace: boolean;\n }>\n > {\n return this.fetch(`w/${wid}/phone-numbers/linkable-phones`);\n }\n\n /** Link or unlink a workspace phone number to/from a provider phone. */\n async linkPhoneNumber(\n wid: string,\n id: number,\n providerPhoneUuid: string | null\n ): Promise<PhoneNumber> {\n return this.fetch<PhoneNumber>(`w/${wid}/phone-numbers/${id}/link`, {\n method: 'POST',\n body: JSON.stringify({ providerPhoneUuid }),\n });\n }\n\n async releasePhoneNumber(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/phone-numbers/${id}/release`, {\n method: 'POST',\n });\n }\n\n /**\n * Always-anonymized outbound-call analytics summary for one phone number.\n * No `analyticsSessionId` is sent — the summary carries no row-level PHI.\n */\n async getPhoneNumberOutboundAnalyticsSummary(\n wid: string,\n id: number,\n filters?: OutboundCallAnalyticsFilters\n ): Promise<OutboundCallAnalyticsSummary> {\n const params = new URLSearchParams();\n appendAnalyticsFilters(params, filters);\n const query = params.toString();\n return this.fetch<OutboundCallAnalyticsSummary>(\n `w/${wid}/phone-numbers/${id}/analytics/summary${query ? `?${query}` : ''}`\n );\n }\n\n /**\n * One paginated page of outbound-call analytics detail rows. Anonymized by\n * default; `raw: true` requires the `export:admin` scope server-side and is\n * audited per response. `analyticsSessionId` keeps the callee pseudonyms\n * stable across pagination/sort within one browser session.\n */\n async getPhoneNumberOutboundAnalyticsCalls(\n wid: string,\n id: number,\n options: {\n analyticsSessionId: string;\n filters?: OutboundCallAnalyticsFilters;\n sort?: OutboundCallAnalyticsSortKey;\n sortDirection?: 'asc' | 'desc';\n page?: number;\n pageSize?: number;\n raw?: boolean;\n }\n ): Promise<PaginatedResponse<OutboundCallAnalyticsRowResponse>> {\n const params = new URLSearchParams({\n analyticsSessionId: options.analyticsSessionId,\n page: String(options.page ?? 1),\n pageSize: String(options.pageSize ?? 50),\n });\n if (options.sort) params.set('sort', options.sort);\n if (options.sortDirection) params.set('sortDirection', options.sortDirection);\n if (options.raw) params.set('raw', 'true');\n appendAnalyticsFilters(params, options.filters);\n return this.fetch<PaginatedResponse<OutboundCallAnalyticsRowResponse>>(\n `w/${wid}/phone-numbers/${id}/analytics/calls?${params}`\n );\n }\n\n /**\n * Export outbound-call analytics as a CSV blob (respecting the current\n * filters + raw state). The server returns HTTP 400 when the result set\n * exceeds its export cap; that message is surfaced to the caller via\n * `ApiError` so the UI can toast it.\n */\n async exportPhoneNumberOutboundAnalyticsCsv(\n wid: string,\n id: number,\n options: {\n analyticsSessionId: string;\n filters?: OutboundCallAnalyticsFilters;\n sort?: OutboundCallAnalyticsSortKey;\n sortDirection?: 'asc' | 'desc';\n raw?: boolean;\n }\n ): Promise<Blob> {\n const params = new URLSearchParams({ analyticsSessionId: options.analyticsSessionId });\n if (options.sort) params.set('sort', options.sort);\n if (options.sortDirection) params.set('sortDirection', options.sortDirection);\n if (options.raw) params.set('raw', 'true');\n appendAnalyticsFilters(params, options.filters);\n\n // Allow 400 through so we can surface the (PHI-safe) over-cap message\n // instead of the raw JSON body fetchRaw would otherwise throw.\n const response = await this.fetchRaw(\n `w/${wid}/phone-numbers/${id}/analytics/export?${params}`,\n {},\n [400]\n );\n if (!response.ok) {\n const data = await response.json().catch(() => ({}) as { detail?: string });\n const message =\n typeof data?.detail === 'string' ? data.detail : 'Failed to export analytics';\n throw new ApiError(message, response.status);\n }\n return response.blob();\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n PronunciationEntry,\n CreatePronunciationEntryFormData,\n UpdatePronunciationEntryFormData,\n PronunciationImportEntry,\n PronunciationImportResult,\n RecommendedVoice,\n} from '../types';\n\nexport class PronunciationsApi extends BaseApiClient {\n /** List pronunciation entries for an organization, optionally filtered by scope. */\n async getPronunciationEntries(\n orgUuid: string,\n options: { scope?: 'org' | 'account'; accountId?: number } = {}\n ): Promise<PronunciationEntry[]> {\n const params = new URLSearchParams();\n if (options.scope) params.append('scope', options.scope);\n if (options.accountId) params.append('accountId', options.accountId.toString());\n const response = await this.fetch<{ items: PronunciationEntry[]; total: number }>(\n `o/${orgUuid}/pronunciations${params.toString() ? `?${params.toString()}` : ''}`\n );\n return response.items;\n }\n\n /** Create a new pronunciation entry for an organization. */\n async createPronunciationEntry(\n orgUuid: string,\n data: CreatePronunciationEntryFormData\n ): Promise<PronunciationEntry> {\n return this.fetch<PronunciationEntry>(`o/${orgUuid}/pronunciations`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update an existing organization pronunciation entry. */\n async updatePronunciationEntry(\n orgUuid: string,\n id: number,\n data: UpdatePronunciationEntryFormData\n ): Promise<PronunciationEntry> {\n return this.fetch<PronunciationEntry>(`o/${orgUuid}/pronunciations/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Delete a pronunciation entry from an organization. */\n async deletePronunciationEntry(orgUuid: string, id: number): Promise<void> {\n return this.fetch(`o/${orgUuid}/pronunciations/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Export all pronunciation entries for an organization as term/respelling pairs. */\n async exportPronunciationEntries(\n orgUuid: string\n ): Promise<Array<{ term: string; respelling: string }>> {\n return this.fetch(`o/${orgUuid}/pronunciations/export`);\n }\n\n /** Bulk import pronunciation entries into an organization. */\n async importPronunciationEntries(\n orgUuid: string,\n entries: PronunciationImportEntry[]\n ): Promise<PronunciationImportResult> {\n return this.fetch<PronunciationImportResult>(`o/${orgUuid}/pronunciations/import`, {\n method: 'POST',\n body: JSON.stringify({ entries }),\n });\n }\n\n /** List the current user's personal pronunciation entries. */\n async getMyPronunciations(): Promise<PronunciationEntry[]> {\n const response = await this.fetch<{ items: PronunciationEntry[]; total: number }>(\n 'account/pronunciations'\n );\n return response.items;\n }\n\n /** Create a personal pronunciation entry for the current user. */\n async createMyPronunciation(\n data: Pick<CreatePronunciationEntryFormData, 'term' | 'respelling'>\n ): Promise<PronunciationEntry> {\n return this.fetch<PronunciationEntry>('account/pronunciations', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update a personal pronunciation entry. */\n async updateMyPronunciation(\n id: number,\n data: UpdatePronunciationEntryFormData\n ): Promise<PronunciationEntry> {\n return this.fetch<PronunciationEntry>(`account/pronunciations/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Delete a personal pronunciation entry. */\n async deleteMyPronunciation(id: number): Promise<void> {\n return this.fetch(`account/pronunciations/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Get AI-suggested respellings for a given term. */\n async suggestPronunciations(term: string, language?: string): Promise<string[]> {\n const response = await this.fetch<{ suggestions: string[] }>(\n 'account/pronunciations/suggest',\n {\n method: 'POST',\n body: JSON.stringify({ term, ...(language && { language }) }),\n }\n );\n return response.suggestions;\n }\n\n /** List recommended voices for pronunciation preview. */\n async getRecommendedVoices(): Promise<RecommendedVoice[]> {\n const response = await this.fetch<{ items: RecommendedVoice[] }>(\n 'account/pronunciations/voices'\n );\n return response.items;\n }\n\n /** Generate an audio preview of a pronunciation respelling using a specified voice. */\n async previewPronunciation(data: {\n respelling: string;\n voiceModel: string;\n }): Promise<ArrayBuffer> {\n const response = await this.fetchRaw('account/pronunciations/preview', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n respelling: data.respelling,\n voice_model: data.voiceModel,\n }),\n });\n return response.arrayBuffer();\n }\n}\n","import { BaseApiClient } from './base';\nimport type { PromptInspectionResponse } from '../types/generated/prompt_inspection';\n\n/**\n * The `/prompts/inspect` payload. The response models serialize camelCase\n * (`alias_generator=to_camel`), so this is the generated type rather than a\n * hand-written copy that can drift from it.\n */\nexport type PromptInspectionResult = PromptInspectionResponse;\n\nexport type InspectPromptOptions =\n | { taskId: number; chatId?: never; channel?: string; turn?: number }\n | { chatId: number; taskId?: never; channel?: string; turn?: number };\n\nexport class PromptsApi extends BaseApiClient {\n /** Inspect the full composed prompt for a task (static) or chat (live). */\n async inspectPrompt(\n wid: string,\n options: InspectPromptOptions\n ): Promise<PromptInspectionResult> {\n const params = new URLSearchParams();\n if (options.chatId !== undefined) {\n params.append('chat_id', options.chatId.toString());\n } else if (options.taskId !== undefined) {\n params.append('task_id', options.taskId.toString());\n }\n if (options.channel) params.append('channel', options.channel);\n if (options.turn !== undefined) params.append('turn', options.turn.toString());\n return this.fetch<PromptInspectionResult>(`w/${wid}/prompts/inspect?${params}`);\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n CreatePersonaRequest,\n PaginatedResponse,\n Persona,\n UpdatePersonaRequest,\n} from '../types';\n\nexport class PersonasApi extends BaseApiClient {\n /** List personas in the workspace, paginated. */\n async listPersonas(\n wid: string,\n params?: { page?: number; pageSize?: number; includeArchived?: boolean }\n ): Promise<PaginatedResponse<Persona>> {\n const q = new URLSearchParams();\n if (params?.page !== undefined) q.set('page', String(params.page));\n if (params?.pageSize !== undefined) q.set('pageSize', String(params.pageSize));\n if (params?.includeArchived !== undefined)\n q.set('includeArchived', String(params.includeArchived));\n const qs = q.toString() ? `?${q.toString()}` : '';\n return this.fetch<PaginatedResponse<Persona>>(`w/${wid}/personas${qs}`);\n }\n\n async getPersona(wid: string, id: number): Promise<Persona> {\n return this.fetch<Persona>(`w/${wid}/personas/${id}`);\n }\n\n async createPersona(wid: string, data: CreatePersonaRequest): Promise<Persona> {\n return this.fetch<Persona>(`w/${wid}/personas`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updatePersona(wid: string, id: number, data: UpdatePersonaRequest): Promise<Persona> {\n return this.fetch<Persona>(`w/${wid}/personas/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async archivePersona(wid: string, id: number): Promise<Persona> {\n return this.fetch<Persona>(`w/${wid}/personas/${id}/archive`, {\n method: 'POST',\n body: JSON.stringify({}),\n });\n }\n\n async unarchivePersona(wid: string, id: number): Promise<Persona> {\n return this.fetch<Persona>(`w/${wid}/personas/${id}/unarchive`, {\n method: 'POST',\n body: JSON.stringify({}),\n });\n }\n\n async deletePersona(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/personas/${id}`, { method: 'DELETE' });\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n QueryFieldsResponse,\n QueryIR,\n QueryRunMode,\n RunQueryResponse,\n ValidateQueryResponse,\n} from '../types/query-engine-types';\n\n/**\n * Unified Query Engine API (`/w/{wid}/queries/*`).\n *\n * Carries the JSON Query IR (see `query-engine-types.ts`) — the same tree\n * the query-builder UI renders. PHI note: query operands may be sensitive;\n * never log request bodies.\n */\nexport class QueriesApi extends BaseApiClient {\n /** Queryable namespace: native fields, operators per type, DataType record fields. */\n async getQueryFields(wid: string): Promise<QueryFieldsResponse> {\n return this.fetch<QueryFieldsResponse>(`w/${wid}/queries/fields`, {\n method: 'GET',\n });\n }\n\n /** Structure / field / access / cost validation without execution. */\n async validateQuery(wid: string, query: QueryIR): Promise<ValidateQueryResponse> {\n return this.fetch<ValidateQueryResponse>(`w/${wid}/queries/validate`, {\n method: 'POST',\n body: JSON.stringify({ query }),\n });\n }\n\n /** Bounded sample run (limit capped server-side). */\n async previewQuery(wid: string, query: QueryIR, mode?: QueryRunMode): Promise<RunQueryResponse> {\n return this.fetch<RunQueryResponse>(`w/${wid}/queries/preview`, {\n method: 'POST',\n body: JSON.stringify({ query, mode }),\n });\n }\n\n /** Execute a query (rows / count / aggregate). */\n async runQuery(wid: string, query: QueryIR, mode?: QueryRunMode): Promise<RunQueryResponse> {\n return this.fetch<RunQueryResponse>(`w/${wid}/queries/run`, {\n method: 'POST',\n body: JSON.stringify({ query, mode }),\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n CreateScenarioRequest,\n PaginatedResponse,\n Qualification,\n Scenario,\n ScenarioHealthSummaryListResponse,\n StartTestChatRunRequest,\n StartTestChatRunResponse,\n TestChatRun,\n UpdateScenarioRequest,\n} from '../types';\n\nexport class QualificationsApi extends BaseApiClient {\n /** List qualifications in a workspace, paginated. */\n async getQualifications(\n wid: string,\n params?: { page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<Qualification>> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<Qualification>>(`w/${wid}/qualifications${qs}`);\n }\n\n /** Get a single qualification by ID. */\n async getQualification(wid: string, id: number): Promise<Qualification> {\n return this.fetch<Qualification>(`w/${wid}/qualifications/${id}`);\n }\n\n /** Fetch (auto-creating if absent) the qualification for a workflow. */\n async getOrCreateQualificationForWorkflow(\n wid: string,\n workflowId: number\n ): Promise<Qualification> {\n return this.fetch<Qualification>(\n `w/${wid}/qualifications/workflows/${workflowId}/qualification`\n );\n }\n\n // ===== Scenarios =====\n\n async listScenarios(\n wid: string,\n qualificationId: number,\n params?: { includeArchived?: boolean }\n ): Promise<Scenario[]> {\n const query = new URLSearchParams();\n if (params?.includeArchived) query.set('include_archived', 'true');\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<Scenario[]>(`w/${wid}/qualifications/${qualificationId}/scenarios${qs}`);\n }\n\n async createScenario(\n wid: string,\n qualificationId: number,\n data: CreateScenarioRequest\n ): Promise<Scenario> {\n return this.fetch<Scenario>(`w/${wid}/qualifications/${qualificationId}/scenarios`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async getScenario(wid: string, scenarioId: number): Promise<Scenario> {\n return this.fetch<Scenario>(`w/${wid}/qualifications/scenarios/${scenarioId}`);\n }\n\n async updateScenario(\n wid: string,\n scenarioId: number,\n data: UpdateScenarioRequest\n ): Promise<Scenario> {\n return this.fetch<Scenario>(`w/${wid}/qualifications/scenarios/${scenarioId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async deleteScenario(wid: string, scenarioId: number): Promise<void> {\n return this.fetch(`w/${wid}/qualifications/scenarios/${scenarioId}`, {\n method: 'DELETE',\n });\n }\n\n // ===== Test chat runs =====\n\n /**\n * List a Workflow's test chat runs, newest first (default 50, max 500).\n *\n * `workflowRevisionId` narrows to that revision before the limit applies.\n * `includeEarlierRevisions` widens the window to earlier published\n * revisions and runs whose revision was deleted, and requires\n * `workflowRevisionId`. Omitting both keeps the unfiltered list.\n */\n async listTestChatRuns(\n wid: string,\n workflowId: number,\n params?: {\n scenarioId?: number;\n assistantChatModelId?: string;\n limit?: number;\n workflowRevisionId?: number;\n includeEarlierRevisions?: boolean;\n }\n ): Promise<TestChatRun[]> {\n const query = new URLSearchParams();\n if (params?.scenarioId !== undefined) query.set('scenarioId', String(params.scenarioId));\n if (params?.assistantChatModelId !== undefined) {\n query.set('assistantChatModelId', params.assistantChatModelId);\n }\n if (params?.limit !== undefined) query.set('limit', String(params.limit));\n if (params?.workflowRevisionId !== undefined) {\n query.set('workflow_revision_id', String(params.workflowRevisionId));\n }\n if (params?.includeEarlierRevisions !== undefined) {\n query.set('include_earlier_revisions', String(params.includeEarlierRevisions));\n }\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<TestChatRun[]>(\n `w/${wid}/qualifications/workflows/${workflowId}/test-chat-runs${qs}`\n );\n }\n\n /**\n * Exact scenario health for one revision of a Workflow: every active\n * scenario's server-decided state, caption, counts and per-revision pass\n * rates, plus the board headline. Scenarios arrive in board order.\n *\n * Omit `workflowRevisionId` for the server's current revision (the newest\n * with runs, the Draft counting as newest); the response names the\n * revision it describes and whether it is the current one.\n */\n async listScenarioHealthSummaries(\n wid: string,\n workflowId: number,\n params?: { workflowRevisionId?: number }\n ): Promise<ScenarioHealthSummaryListResponse> {\n const query = new URLSearchParams();\n if (params?.workflowRevisionId !== undefined) {\n query.set('workflow_revision_id', String(params.workflowRevisionId));\n }\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<ScenarioHealthSummaryListResponse>(\n `w/${wid}/qualifications/workflows/${workflowId}/scenario-health-summaries${qs}`\n );\n }\n\n async getTestChatRun(wid: string, runId: number): Promise<TestChatRun> {\n return this.fetch<TestChatRun>(`w/${wid}/qualifications/test-chat-runs/${runId}`);\n }\n\n async startTestChatRun(\n wid: string,\n workflowId: number,\n data: StartTestChatRunRequest = {}\n ): Promise<StartTestChatRunResponse> {\n return this.fetch<StartTestChatRunResponse>(\n `w/${wid}/qualifications/workflows/${workflowId}/test-chat-runs`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n async evaluateTestChatRun(wid: string, runId: number): Promise<void> {\n await this.fetch(`w/${wid}/qualifications/test-chat-runs/${runId}/evaluate`, {\n method: 'POST',\n });\n }\n\n /** Manually end a test chat run (for human-driven runs, which have no\n * simulator workflow to mark them completed). */\n async endTestChatRun(wid: string, runId: number): Promise<TestChatRun> {\n return this.fetch<TestChatRun>(`w/${wid}/qualifications/test-chat-runs/${runId}/end`, {\n method: 'POST',\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n AIUsageReport,\n MemberUsageReport,\n PhoneUsageReport,\n SMSUsageReport,\n VoiceUsageReport,\n} from '../types/generated/reports';\n\n// Wire shapes are generated from the backend Pydantic response models via\n// `yarn generate:types` (the `reports` group; see\n// scripts/types-codegen/type-group-hints.txt). Do not hand-write mirrors of\n// backend types here — every backend schema is already generated; re-export it.\nexport type {\n AIUsageReport,\n AIUsageTypeSummary,\n MemberUsageReport,\n ModelUsageStats,\n PhoneUsageReport,\n PhoneUsageRow,\n ProviderUsageSummary,\n SMSUsageReport,\n SMSUsageRow,\n STTProviderSummary,\n STTUsageRow,\n TTSProviderSummary,\n TTSUsageRow,\n VoiceUsageReport,\n} from '../types/generated/reports';\n\n// ===== CLIENT-ONLY TYPES =====\n// Query parameters and frontend-only aggregation shapes (no backend source).\n\nexport interface AIUsageReportParams {\n start_date?: string;\n end_date?: string;\n}\n\nexport interface SMSUsageReportParams {\n start_date?: string;\n end_date?: string;\n}\n\nexport interface PhoneUsageReportParams {\n start_date?: string;\n end_date?: string;\n}\n\nexport interface MemberUsageReportParams {\n start_date?: string;\n end_date?: string;\n}\n\nexport interface VoiceUsageReportParams {\n start_date?: string;\n end_date?: string;\n}\n\n/** Frontend aggregation of SMSUsageRow entries by phone number. */\nexport interface PhoneAggregatedData {\n phoneNumberId: number;\n phoneNumber: string | null;\n phoneName: string | null;\n totalMessages: number;\n inbound: number;\n outbound: number;\n totalChars: number;\n totalSegments: number;\n}\n\n/** Frontend aggregation of SMSUsageRow entries by day. */\nexport interface DayAggregatedData {\n date: string;\n totalMessages: number;\n inbound: number;\n outbound: number;\n totalChars: number;\n totalSegments: number;\n}\n\n/** Frontend aggregation of PhoneUsageRow entries by phone number. */\nexport interface PhoneCallAggregatedData {\n phoneNumberId: number;\n phoneNumber: string | null;\n phoneName: string | null;\n totalCalls: number;\n inbound: number;\n outbound: number;\n totalDurationSeconds: number;\n}\n\n/** Frontend aggregation of PhoneUsageRow entries by day. */\nexport interface DayCallAggregatedData {\n date: string;\n totalCalls: number;\n inbound: number;\n outbound: number;\n totalDurationSeconds: number;\n}\n\nexport class ReportsApi extends BaseApiClient {\n /** Get AI model usage report for a workspace within an optional date range. */\n async getAIUsageReport(wid: string, params?: AIUsageReportParams): Promise<AIUsageReport> {\n const queryParams = new URLSearchParams();\n if (params?.start_date) {\n queryParams.append('start_date', params.start_date);\n }\n if (params?.end_date) {\n queryParams.append('end_date', params.end_date);\n }\n\n const queryString = queryParams.toString();\n const url = `w/${wid}/reports/ai-usage${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<AIUsageReport>(url);\n }\n\n /** Get SMS usage report for a workspace within an optional date range. */\n async getSMSUsageReport(wid: string, params?: SMSUsageReportParams): Promise<SMSUsageReport> {\n const queryParams = new URLSearchParams();\n if (params?.start_date) {\n queryParams.append('start_date', params.start_date);\n }\n if (params?.end_date) {\n queryParams.append('end_date', params.end_date);\n }\n\n const queryString = queryParams.toString();\n const url = `w/${wid}/reports/sms-usage${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<SMSUsageReport>(url);\n }\n\n /** Get phone call usage report for a workspace within an optional date range. */\n async getPhoneUsageReport(\n wid: string,\n params?: PhoneUsageReportParams\n ): Promise<PhoneUsageReport> {\n const queryParams = new URLSearchParams();\n if (params?.start_date) {\n queryParams.append('start_date', params.start_date);\n }\n if (params?.end_date) {\n queryParams.append('end_date', params.end_date);\n }\n\n const queryString = queryParams.toString();\n const url = `w/${wid}/reports/phone-usage${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<PhoneUsageReport>(url);\n }\n\n /** Get usage report for a specific member within an optional date range. */\n async getMemberUsage(\n wid: string,\n memberId: number,\n params?: MemberUsageReportParams\n ): Promise<MemberUsageReport> {\n const queryParams = new URLSearchParams();\n if (params?.start_date) {\n queryParams.append('start_date', params.start_date);\n }\n if (params?.end_date) {\n queryParams.append('end_date', params.end_date);\n }\n\n const queryString = queryParams.toString();\n const url = `w/${wid}/reports/member-usage/${memberId}${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<MemberUsageReport>(url);\n }\n\n /** Get voice (STT/TTS) usage report for a workspace within an optional date range. */\n async getVoiceUsageReport(\n wid: string,\n params?: VoiceUsageReportParams\n ): Promise<VoiceUsageReport> {\n const queryParams = new URLSearchParams();\n if (params?.start_date) {\n queryParams.append('start_date', params.start_date);\n }\n if (params?.end_date) {\n queryParams.append('end_date', params.end_date);\n }\n\n const queryString = queryParams.toString();\n const url = `w/${wid}/reports/voice-usage${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<VoiceUsageReport>(url);\n }\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: communication\n */\n\nimport type { AgentMemoryConfig, WorkspaceMemberResponse } from './member';\n\n/**\n * Response from approving sample messages.\n */\nexport interface ApproveOrgA2PMessagesResponse {\n status: string;\n}\n\nexport interface ArchiveBlockersResponse {\n canArchive: boolean;\n workflowBlockers: WorkflowBlockerResponse[];\n workspaceDefaultBlocker?: boolean;\n}\n\n/**\n * Summary of an assignment for email thread context.\n */\nexport interface AssignmentSummary {\n id: number;\n workflowId?: number | null;\n workflowRevisionId?: number | null;\n createdAt?: string | null;\n status?: string | null;\n}\n\n/**\n * Metadata for a single audio chunk.\n */\nexport interface AudioChunkMetadata {\n sortKey: string;\n role: string;\n chunkIndex: number;\n s3Key: string;\n startTime: string;\n audioFormat: string;\n sampleRate: number;\n mimeType: string;\n messageIds: string[];\n assistantId?: number | null;\n memberId?: number | null;\n}\n\n/**\n * Response containing presigned download URL.\n */\nexport interface AudioDownloadUrlResponse {\n downloadUrl: string;\n expiresIn: number;\n s3Key: string;\n mimeType: string;\n}\n\n/**\n * Response model for an available phone number from Twilio search.\n */\nexport interface AvailablePhoneNumberResponse {\n phoneNumber: string;\n friendlyName: string;\n locality?: string | null;\n region?: string | null;\n isoCountry?: string;\n phoneNumberType?: string;\n voiceEnabled?: boolean;\n smsEnabled?: boolean;\n mmsEnabled?: boolean;\n}\n\n/**\n * LLM configuration value object used throughout the chat/voice pipeline.\n *\n * Populated from either a BuiltinAssistantConfig or an Agent.\n * The id field is optional — it's None for builtin agents.\n */\nexport interface BaseAssistantResponse {\n id?: number | null;\n name: string;\n identity?: string | null;\n description?: string | null;\n chatModel?: string | null;\n realtimeModel?: string | null;\n chatModelConfig?: BaseAssistantResponseChatModelConfig;\n realtimeModelConfig?: BaseAssistantResponseRealtimeModelConfig;\n tools?: string[];\n codeInterpreterEnabled?: boolean;\n webBrowserEnabled?: boolean;\n memoryConfig?: AgentMemoryConfig | null;\n}\n\nexport type BaseAssistantResponseChatModelConfig = { [key: string]: unknown } | null;\n\nexport type BaseAssistantResponseRealtimeModelConfig = { [key: string]: unknown } | null;\n\n/**\n * Response containing a presigned URL for the assembled call recording.\n */\nexport interface CallRecordingDownloadUrlResponse {\n /** Short-lived presigned URL that downloads the complete call recording as a WAV file. */\n downloadUrl: string;\n /** Number of seconds the URL remains valid, after the server-side maximum is applied. */\n expiresIn: number;\n /** Content type of the downloaded file (always `audio/wav`). */\n mimeType: string;\n}\n\n/**\n * Paginated emails for a chat thread, with chat context.\n */\nexport interface ChatEmailsResponse {\n items: EmailResponse[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n chat?: ChatSummary | null;\n}\n\n/**\n * Summary of a chat for email thread context.\n */\nexport interface ChatSummary {\n id: number;\n assignmentId?: number | null;\n createdAt?: string | null;\n}\n\n/**\n * Response model for email conversion endpoints.\n */\nexport interface ConvertedEmailResponse {\n content: string;\n format: ConvertedEmailResponseFormat;\n subject: string;\n message: string;\n}\n\nexport type ConvertedEmailResponseFormat = typeof ConvertedEmailResponseFormat[keyof typeof ConvertedEmailResponseFormat];\n\n\nexport const ConvertedEmailResponseFormat = {\n text: 'text',\n markdown: 'markdown',\n pdf: 'pdf',\n} as const;\n\n/**\n * One value/count pair of a distribution. ``value`` is null for the\n * NULL bucket (e.g. calls with no ``answered_by`` because AMD was off).\n */\nexport interface DistributionBucket {\n value?: string | null;\n count: number;\n}\n\n/**\n * Median / p90 call duration in seconds, over calls with both\n * ``started_at`` and ``finished_at``. Null when there are no such calls.\n */\nexport interface DurationStats {\n medianSeconds?: number | null;\n p90Seconds?: number | null;\n}\n\n/**\n * Response model for an email attachment.\n */\nexport interface EmailAttachmentResponse {\n id: number;\n uuid: string;\n filename: string;\n contentType: string;\n s3Key: string;\n size?: number | null;\n contentId?: string | null;\n isInline?: boolean | null;\n isSignatureImage?: boolean;\n createdAt: string;\n}\n\n/**\n * Response model for a paginated list of emails.\n */\nexport interface EmailListResponse {\n items: EmailResponse[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n}\n\n/**\n * Response model for an email.\n */\nexport interface EmailResponse {\n id: number;\n uuid: string;\n inboxId: number;\n messageId: string;\n sender: string;\n recipient: string;\n cc?: string | null;\n bcc?: string | null;\n subject?: string | null;\n bodyText?: string | null;\n bodyHtml?: string | null;\n s3Key?: string | null;\n status: string;\n createdAt: string;\n updatedAt: string;\n readAt?: string | null;\n repliedAt?: string | null;\n rawHeaders?: EmailResponseRawHeaders;\n attachments?: EmailAttachmentResponse[] | null;\n senderIsMember: boolean;\n aiProcessed: boolean;\n}\n\nexport type EmailResponseRawHeaders = { [key: string]: unknown } | null;\n\n/**\n * Response model for bulk chat summary generation.\n */\nexport interface GenerateSummariesResponse {\n totalChats: number;\n jobsCreated: number;\n}\n\n/**\n * Response model for a list of inboxes.\n */\nexport interface InboxListResponse {\n items: InboxResponse[];\n total: number;\n}\n\n/**\n * Response model for an inbox mapping.\n */\nexport interface InboxMappingResponse {\n id: number;\n emailAddress: string;\n workspaceId: number;\n workspaceName: string;\n workspaceUuid: string;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Response model for an inbox.\n */\nexport interface InboxResponse {\n id: number;\n uuid: string;\n emailAddress: string;\n name: string;\n slug?: string | null;\n generatedEmailAddress?: string | null;\n rules?: InboxResponseRules;\n createdAt: string;\n updatedAt: string;\n ownerId: number;\n defaultWorkflowId?: number | null;\n directMemberId?: number | null;\n routingMode: RoutingMode;\n autoReplyEnabled: boolean;\n receiveNonMemberEmails: boolean;\n recipient?: string | null;\n emailFooter?: string | null;\n effectiveEmailFooter?: string | null;\n emailCount?: number | null;\n unreadCount?: number | null;\n routingRules: RoutingRuleResponse[];\n}\n\nexport type InboxResponseRules = { [key: string]: unknown } | null;\n\n/**\n * A single email thread grouped by chat_id.\n */\nexport interface InboxThreadResponse {\n chatId: number;\n subject: string;\n participants: string[];\n emailCount: number;\n unreadCount: number;\n latestEmailAt?: string | null;\n preview?: string | null;\n}\n\n/**\n * Paginated threads and unthreaded emails for an inbox.\n */\nexport interface InboxThreadsPageResponse {\n threads: InboxThreadResponse[];\n unthreadedEmails: UnthreadedEmailResponse[];\n totalThreads: number;\n totalUnthreaded: number;\n}\n\n/**\n * Median / p90 message counts, split AI-side vs member-side. Null when\n * there are no matching calls.\n */\nexport interface MessageCountStats {\n aiMedian?: number | null;\n aiP90?: number | null;\n memberMedian?: number | null;\n memberP90?: number | null;\n}\n\n/**\n * Message-timing offsets for call replay synchronisation.\n *\n * ``messages`` maps each message UUID to its offset in milliseconds from the\n * call's anchor time. Served by ``GET /recordings/chat/{chat_id}/message-timing``.\n */\nexport interface MessageTimingResponse {\n anchorTimeIso: string;\n durationMs: number;\n messages: MessageTimingResponseMessages;\n}\n\nexport type MessageTimingResponseMessages = {[key: string]: number};\n\n/**\n * The distinct filter values available for this phone number over the\n * date range (independent of the currently-applied multi-select filters),\n * so the UI can render stable dropdowns.\n */\nexport interface OutboundCallAnalyticsFilterOptions {\n terminationReasons?: string[];\n answeredBy?: string[];\n memberLabels?: string[];\n}\n\n/**\n * One outbound-call row for the phone-number Analytics tab.\n *\n * Anonymized by default: ``toNumber``, ``fromPhoneName``, and ``memberId``\n * are populated ONLY in an explicitly-gated, audited raw response. In the\n * default (anonymized) view they are ``None`` and the callee is represented\n * solely by ``toNumberHash`` (a per-viewing-session HMAC pseudonym) and\n * ``toNumberDisplay`` (a compact ``...abcd`` derived from the HMAC digest —\n * never real phone digits). ``memberId`` is raw-only because a Member primary\n * key is a deterministic re-identifier: any caller with ``members:read`` can\n * join it back to the Member record, which is exactly the anonymized view's\n * purpose to prevent. The service owns this projection; see\n * ``PhoneCallAnalyticsService``.\n */\nexport interface OutboundCallAnalyticsRowResponse {\n id: number;\n createdAt: string;\n startedAt?: string | null;\n finishedAt?: string | null;\n durationSeconds?: number | null;\n status: string;\n toNumberHash: string;\n toNumberDisplay: string;\n toNumber?: string | null;\n fromPhoneName?: string | null;\n memberId?: number | null;\n memberLabels?: string[];\n answeredBy?: string | null;\n callOutcome?: string | null;\n terminationReason?: string | null;\n aiMessageCount?: number;\n memberMessageCount?: number;\n otherMessageCount?: number;\n totalMessages?: number;\n chatId?: number | null;\n}\n\n/**\n * Always-anonymized summary panel for one phone number's outbound calls.\n *\n * Carries no row-level PHI: only aggregate counts, distributions, and\n * percentiles. ``canViewRaw`` tells the UI whether to offer the gated\n * raw-PHI toggle; the summary itself never has a raw mode.\n */\nexport interface OutboundCallAnalyticsSummary {\n phoneNumberId: number;\n reportPeriodStart: string;\n reportPeriodEnd: string;\n totalCalls: number;\n terminationReasonDistribution: DistributionBucket[];\n answeredByDistribution: DistributionBucket[];\n duration: DurationStats;\n messageCounts: MessageCountStats;\n filterOptions: OutboundCallAnalyticsFilterOptions;\n canViewRaw?: boolean;\n}\n\nexport interface PhoneCallResponse {\n id: number;\n /** Public identifier of the call — the uuid the Activity Spine (organization webhooks v2) uses as the `call` subject. */\n uuid: string;\n phoneNumberId: number;\n chatId?: number | null;\n /** Uuid of the chat the call belongs to (`chatId`'s public identifier). Null when the call has no chat. */\n chatUuid?: string | null;\n twilioCallId: string;\n status: string;\n createdAt: string;\n startedAt?: string | null;\n finishedAt?: string | null;\n member?: WorkspaceMemberResponse | null;\n agent?: BaseAssistantResponse | null;\n inbound: boolean;\n credits?: number | null;\n /** Product / app outcome for how the call ended (GRA-6416). Preferred values: `hangup` (assistant ended), `forward` (call forwarded), `handoff`, `completed` (caller hung up / normal end), policy rejects (`voice_disabled`, `anonymous_rejected`, …), `blocked_outbound_safety`, `strict_voice_blocked`, `voicemail`, `amd_unknown`. Legacy rows may also hold carrier strings (`busy`, `no-answer`, …) or transport failures (`connection_reset`, `stream_reset`, `never_connected`); prefer `carrierStatus` / `failureDetail` when present. Null for in-progress/unknown calls. */\n terminationReason?: string | null;\n /** Twilio CallStatus / DialCallStatus terminal value (GRA-6416): `completed`, `busy`, `no-answer`, `failed`, or `canceled`. Independent of product intent — a successful transfer is `terminationReason=forward` + `carrierStatus=completed`; a transfer whose destination was busy is `forward` + `busy`. */\n carrierStatus?: string | null;\n /** Transport / infra failure detail (GRA-6416): `connection_reset` (Twilio ErrorCode on completed call), `stream_reset` (media-stream WebSocket reset, e.g. Twilio 31921), `never_connected` (bridge-leg provisional), `timeout`, `bridge_call_create_failed`, `bridge_call_create_missing_sid`, `fax_t30_failed`, other closed `fax_*` receive codes, or `error`. */\n failureDetail?: string | null;\n /** ID of the workflow associated with this call, resolved via the chat's assignment (PhoneCall.chat_id -> Chat.assignment_id -> Assignment.workflow_revision_id -> WorkflowRevision.workflow_id). Null for direct human-to-human calls with no chat, or chats with no assignment. */\n workflowId?: number | null;\n}\n\n/**\n * The last migration run's own closing record, as persisted on the phone.\n *\n * Present only once a ``PhoneNumberMigrationWorkflow`` has closed (success or\n * failure). It is stored state, not a live Temporal read, so it survives a\n * reload and a number that has already left the platform account (#28273).\n */\nexport interface PhoneMigrationOutcomeResponse {\n workflowId?: string | null;\n mode?: PhoneMigrationOutcomeResponseMode;\n executionStatus?: PhoneMigrationOutcomeResponseExecutionStatus;\n step?: string | null;\n smsActivation?: string | null;\n legalEntityUuid?: string | null;\n}\n\nexport type PhoneMigrationOutcomeResponseExecutionStatus = typeof PhoneMigrationOutcomeResponseExecutionStatus[keyof typeof PhoneMigrationOutcomeResponseExecutionStatus] | null;\n\n\nexport const PhoneMigrationOutcomeResponseExecutionStatus = {\n completed: 'completed',\n failed: 'failed',\n} as const;\n\nexport type PhoneMigrationOutcomeResponseMode = typeof PhoneMigrationOutcomeResponseMode[keyof typeof PhoneMigrationOutcomeResponseMode] | null;\n\n\nexport const PhoneMigrationOutcomeResponseMode = {\n forward: 'forward',\n rollback: 'rollback',\n reattach: 'reattach',\n} as const;\n\nexport interface PhoneNumberResponse {\n id: number;\n uuid: string;\n number: string;\n name: string | null;\n brandName: string | null;\n brandDescription: string | null;\n brandWebsite: string | null;\n createdAt: string;\n updatedAt: string;\n signupMemberRoleId?: number | null;\n ownerMemberId?: number | null;\n faxOwnerMemberId?: number | null;\n faxFolderId?: number | null;\n faxReady?: boolean;\n voiceWorkflowId?: number | null;\n defaultWorkflowId?: number | null;\n directMemberId?: number | null;\n routingMode: RoutingMode;\n enableSms: boolean;\n enableVoice: boolean;\n enableWhatsApp: boolean;\n voiceUnavailableMessage?: string | null;\n voiceGreetingMessage?: string | null;\n voiceRequireConsent?: boolean;\n smsUnavailableMessage?: string | null;\n inboundCallHandling: string;\n isArchived: boolean;\n isMapped: boolean;\n twilioInboundReady: boolean;\n providerPhoneUuid?: string | null;\n operatorGroupId?: number | null;\n twilioNumberSid?: string | null;\n a2pStatus?: PhoneNumberResponseA2pStatus;\n webhookWarning?: string | null;\n routingRules: RoutingRuleResponse[];\n}\n\nexport type PhoneNumberResponseA2pStatus = typeof PhoneNumberResponseA2pStatus[keyof typeof PhoneNumberResponseA2pStatus] | null;\n\n\nexport const PhoneNumberResponseA2pStatus = {\n not_requested: 'not_requested',\n pending: 'pending',\n active: 'active',\n failed: 'failed',\n} as const;\n\n/**\n * Response model for provider phone number (Twilio/etc inventory).\n */\nexport interface ProviderPhoneNumberResponse {\n id: number;\n uuid: string;\n provider: string;\n phoneNumber: string;\n sid: string;\n friendlyName: string | null;\n phoneNumberType: string | null;\n region: string | null;\n isoCountry: string | null;\n locality: string | null;\n postalCode: string | null;\n lata: string | null;\n rateCenter: string | null;\n voiceEnabled: boolean;\n smsEnabled: boolean;\n mmsEnabled: boolean;\n faxEnabled: boolean;\n isAssigned: boolean;\n organizationId: number | null;\n organizationName?: string | null;\n organizationUuid?: string | null;\n workspaceId: number | null;\n workspaceName?: string | null;\n workspaceUuid?: string | null;\n workspacePhoneUuid: string | null;\n workspacePhoneId?: number | null;\n workspacePhoneName?: string | null;\n twilioAccountSid?: string | null;\n a2pStatus?: ProviderPhoneNumberResponseA2pStatus;\n a2pBrandUuid?: string | null;\n a2pBrandName?: string | null;\n a2pCampaignStatus?: string | null;\n onPlatformAccount?: boolean;\n usesPlatformA2p?: boolean;\n migrationOutcome?: PhoneMigrationOutcomeResponse | null;\n createdAt: string;\n updatedAt: string;\n lastSyncedAt: string | null;\n webhookWarning?: string | null;\n}\n\nexport type ProviderPhoneNumberResponseA2pStatus = typeof ProviderPhoneNumberResponseA2pStatus[keyof typeof ProviderPhoneNumberResponseA2pStatus] | null;\n\n\nexport const ProviderPhoneNumberResponseA2pStatus = {\n not_requested: 'not_requested',\n pending: 'pending',\n active: 'active',\n failed: 'failed',\n} as const;\n\n/**\n * Response for listing recordings for a chat.\n */\nexport interface RecordingListResponse {\n chatId: number;\n workspaceUuid: string;\n items: AudioChunkMetadata[];\n total: number;\n}\n\nexport type RoutingActionType = typeof RoutingActionType[keyof typeof RoutingActionType];\n\n\nexport const RoutingActionType = {\n answer_ai: 'answer_ai',\n answer_human: 'answer_human',\n answer_owner: 'answer_owner',\n voicemail: 'voicemail',\n play_message: 'play_message',\n ignore: 'ignore',\n signup: 'signup',\n} as const;\n\nexport type RoutingAudience = typeof RoutingAudience[keyof typeof RoutingAudience];\n\n\nexport const RoutingAudience = {\n anyone: 'anyone',\n anonymous: 'anonymous',\n members: 'members',\n} as const;\n\nexport type RoutingChannel = typeof RoutingChannel[keyof typeof RoutingChannel];\n\n\nexport const RoutingChannel = {\n pstn: 'pstn',\n messaging: 'messaging',\n email: 'email',\n} as const;\n\n/**\n * One weekday's custom window; validate before persisting routing config.\n */\nexport interface RoutingCustomWindow {\n day: RoutingCustomWindowDay;\n enabled: boolean;\n start?: string | null;\n end?: string | null;\n}\n\nexport type RoutingCustomWindowDay = typeof RoutingCustomWindowDay[keyof typeof RoutingCustomWindowDay];\n\n\nexport const RoutingCustomWindowDay = {\n monday: 'monday',\n tuesday: 'tuesday',\n wednesday: 'wednesday',\n thursday: 'thursday',\n friday: 'friday',\n saturday: 'saturday',\n sunday: 'sunday',\n} as const;\n\nexport type RoutingMode = typeof RoutingMode[keyof typeof RoutingMode];\n\n\nexport const RoutingMode = {\n direct: 'direct',\n routed: 'routed',\n} as const;\n\n/**\n * One routing rule as the API returns it. Config only — never PHI.\n */\nexport interface RoutingRuleResponse {\n id: number;\n uuid: string;\n templateUuid: string | null;\n channel: RoutingChannel;\n phoneNumberId: number | null;\n inboxId: number | null;\n order: number;\n schedule: RoutingSchedule;\n audience: RoutingAudience;\n callerMemberFilterId: number | null;\n actionType: RoutingActionType;\n actionParams: RoutingRuleResponseActionParams;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type RoutingRuleResponseActionParams = { [key: string]: unknown } | null;\n\n/**\n * One closed schedule document persisted in ``routing_rules.schedule``.\n */\nexport interface RoutingSchedule {\n kind?: RoutingTimeWindow;\n windows?: RoutingCustomWindow[] | null;\n}\n\nexport type RoutingTimeWindow = typeof RoutingTimeWindow[keyof typeof RoutingTimeWindow];\n\n\nexport const RoutingTimeWindow = {\n always: 'always',\n business_hours: 'business_hours',\n non_business_hours: 'non_business_hours',\n custom: 'custom',\n} as const;\n\nexport interface SMSMessageResponse {\n id: number;\n phoneNumberId: number;\n toNumber: string;\n fromNumber: string;\n fromCity?: string | null;\n fromCountry?: string | null;\n inbound: boolean;\n content: string;\n raw?: string | null;\n receivedAt: string;\n chatId?: number | null;\n messageId?: number | null;\n messageUuid?: string | null;\n deliveryStatus?: string | null;\n deliveryErrorCode?: string | null;\n deliveryUpdatedAt?: string | null;\n channel?: string;\n}\n\n/**\n * Response from starting per-brand A2P registration.\n */\nexport interface StartOrgA2PResponse {\n status: string;\n workflowId: string;\n brandUuid: string;\n}\n\n/**\n * Paginated emails for an assignment thread, with assignment context.\n */\nexport interface ThreadEmailsResponse {\n items: EmailResponse[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n assignment?: AssignmentSummary | null;\n}\n\n/**\n * A single email not associated with any chat thread.\n */\nexport interface UnthreadedEmailResponse {\n id: number;\n subject: string;\n sender: string;\n createdAt?: string | null;\n readAt?: string | null;\n}\n\n/**\n * Response model for voicemail records.\n *\n * NOTE: callerNumber and callerName are PHI (patient contact info).\n * Access is gated by PHONES_READ scope. This follows the same pattern as\n * PhoneCallResponse which exposes fromNumber/toNumber.\n *\n * Audio is captured by Twilio <Record> and stored in S3 during callback\n * ingest. The client uses the authenticated /audio endpoint for playback.\n * Never exposes s3_audio_key, twilio_recording_sid, or recording URLs.\n *\n * ``targetMemberId`` (Routing Rules phase 2) is an internal Member id. It is\n * NOT PHI and is deliberately carried alongside the PHI fields above rather\n * than gated with them.\n */\nexport interface VoicemailResponse {\n id: number;\n uuid: string;\n phoneNumberId?: number | null;\n phoneCallId?: number | null;\n callerNumber?: string | null;\n callerName?: string | null;\n hasRecording?: boolean;\n recordingDuration?: number | null;\n transcript?: string | null;\n transcriptionStatus: string;\n status: string;\n targetMemberId?: number | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface WorkflowBlockerResponse {\n id: number;\n uuid: string;\n name: string;\n}\n","import { BaseApiClient } from './base';\nimport type {\n CreateRoutingRuleRequest,\n PreviewRoutingRuleRequest,\n RoutingRulePreviewResponse,\n UpdateRoutingRuleRequest,\n} from '../types/generated/routing_rule';\nimport type { PaginatedResponseRoutingRuleResponse } from '../types/generated/common';\nimport type { RoutingRuleResponse } from '../types/generated/communication';\nexport {\n RoutingActionType,\n RoutingAudience,\n RoutingChannel,\n RoutingTimeWindow,\n} from '../types/generated/communication';\nexport type {\n CreateRoutingRuleRequest,\n PreviewRoutingRuleRequest,\n ReorderRoutingRulesRequest,\n RoutingRuleConditionFactsResponse,\n RoutingRuleConsiderationResponse,\n RoutingRulePreviewResponse,\n UpdateRoutingRuleRequest,\n} from '../types/generated/routing_rule';\nexport type { PaginatedResponseRoutingRuleResponse } from '../types/generated/common';\nexport type {\n RoutingCustomWindow,\n RoutingRuleResponse,\n RoutingSchedule,\n} from '../types/generated/communication';\nimport type { RoutingChannel } from '../types/generated/communication';\nexport interface ListRoutingRulesParams {\n channel?: RoutingChannel;\n phoneNumberId?: number;\n inboxId?: number;\n page?: number;\n pageSize?: number;\n}\n\nfunction appendFilters(params: URLSearchParams, filters?: ListRoutingRulesParams): void {\n if (!filters) return;\n if (filters.channel !== undefined) params.set('channel', filters.channel);\n if (filters.phoneNumberId !== undefined)\n params.set('phoneNumberId', String(filters.phoneNumberId));\n if (filters.inboxId !== undefined) params.set('inboxId', String(filters.inboxId));\n if (filters.page !== undefined) params.set('page', String(filters.page));\n if (filters.pageSize !== undefined) params.set('pageSize', String(filters.pageSize));\n}\n\n/**\n * CRUD, reorder, and read-only preview for endpoint routing rules.\n *\n * Routing rules use the permissions of the phone number or inbox they belong\n * to: reads need `phones:read` plus read access to the phone number, or\n * `inboxes:read` plus access to the inbox; writes need `phones:write` plus edit\n * access, or `inboxes:write` plus admin access.\n */\nexport class RoutingRulesApi extends BaseApiClient {\n /** List one endpoint's rules. Requires the rule's endpoint read permission (`phones:read`, or `inboxes:read`). */\n async getRoutingRules(\n wid: string,\n filters?: ListRoutingRulesParams\n ): Promise<PaginatedResponseRoutingRuleResponse> {\n const params = new URLSearchParams();\n appendFilters(params, filters);\n const query = params.toString();\n return this.fetch<PaginatedResponseRoutingRuleResponse>(\n `w/${wid}/routing${query ? `?${query}` : ''}`\n );\n }\n /** Read one rule. Requires the rule's endpoint read permission (`phones:read`, or `inboxes:read`). */\n async getRoutingRule(wid: string, ruleUuid: string): Promise<RoutingRuleResponse> {\n return this.fetch<RoutingRuleResponse>(`w/${wid}/routing/${ruleUuid}`);\n }\n /** Create a rule. Requires the rule's endpoint write permission (`phones:write`, or `inboxes:write`). */\n async createRoutingRule(\n wid: string,\n data: CreateRoutingRuleRequest\n ): Promise<RoutingRuleResponse> {\n return this.fetch<RoutingRuleResponse>(`w/${wid}/routing`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n /** Update a rule. Requires the rule's endpoint write permission (`phones:write`, or `inboxes:write`). */\n async updateRoutingRule(\n wid: string,\n ruleUuid: string,\n data: UpdateRoutingRuleRequest\n ): Promise<RoutingRuleResponse> {\n return this.fetch<RoutingRuleResponse>(`w/${wid}/routing/${ruleUuid}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n /** Hard-delete a rule. Requires the rule's endpoint write permission (`phones:write`, or `inboxes:write`); the server audits deletion. */\n async deleteRoutingRule(wid: string, ruleUuid: string): Promise<RoutingRuleResponse> {\n return this.fetch<RoutingRuleResponse>(`w/${wid}/routing/${ruleUuid}`, {\n method: 'DELETE',\n });\n }\n /** Atomically reorder one endpoint/channel scope. Requires the rule's endpoint write permission (`phones:write`, or `inboxes:write`). */\n async reorderRoutingRules(\n wid: string,\n ruleUuids: string[]\n ): Promise<{ status: string; scope: string }> {\n return this.fetch<{ status: string; scope: string }>(`w/${wid}/routing/reorder`, {\n method: 'POST',\n body: JSON.stringify({ ruleUuids }),\n });\n }\n /**\n * Dry-run rule evaluation without placing or sending anything. Requires\n * the rule's endpoint read permission (`phones:read`, or `inboxes:read`); previewing a named Member also requires `members:read`.\n */\n async previewRoutingRule(\n wid: string,\n data: PreviewRoutingRuleRequest\n ): Promise<RoutingRulePreviewResponse> {\n return this.fetch<RoutingRulePreviewResponse>(`w/${wid}/routing/preview`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n}\n","import type {\n ImportSalesforceMembersRequest,\n ImportSalesforceMembersResponse,\n ResyncLinkedMembersRequest,\n ResyncLinkedMembersResponse,\n SalesforceDescribeField,\n SalesforceSearchRequest,\n SalesforceSearchResponse,\n SalesforceSyncConfigResponse,\n UpdateSalesforceSyncConfigRequest,\n} from '../types/app-connection-types';\nexport type {\n ImportSalesforceMembersRequest,\n ImportSalesforceMembersResponse,\n ResyncLinkedMembersRequest,\n ResyncLinkedMembersResponse,\n SalesforceSearchRequest,\n SalesforceSearchResponse,\n};\nimport type { CursorPaginatedResponse, PaginatedResponse } from '../types/core-types';\nimport type { RuleExecution } from '../types/event-types';\nimport { BaseApiClient } from './base';\n\nexport interface SalesforceConnectionStatus {\n connectionId: number | null;\n /** True once client credentials (Client ID) have been saved. */\n configured: boolean;\n connected: boolean;\n /** False when the connection is installed but disabled. */\n enabled: boolean;\n state: string | null;\n instanceUrl: string | null;\n apiVersion: string | null;\n authorizeUrl: string | null;\n /** OAuth callback URL to register in the Salesforce Connected App. */\n callbackUrl: string | null;\n error: string | null;\n authorizedByMemberId: number | null;\n authorizedAt: string | null;\n /** OAuth grant flow in use. */\n authMethod: 'authorization_code' | 'client_credentials';\n}\n\nexport interface InstallSalesforceRequest {\n /** Salesforce login host; determines the OAuth authorize/token host. */\n instanceUrl?: string;\n}\n\nexport interface ConfigureSalesforceRequest {\n clientId: string;\n clientSecret: string;\n instanceUrl: string;\n /** OAuth grant flow. \"client_credentials\" is the server-to-server,\n * long-lived option (tokens minted on demand, no refresh token). */\n authMethod?: 'authorization_code' | 'client_credentials';\n}\n\nexport interface SalesforceReconciliationMatch {\n memberId: number;\n salesforceRecordId: string;\n salesforceName: string | null;\n salesforceEmail: string | null;\n salesforcePhone: string | null;\n matchType: string;\n objectType: string;\n}\n\nexport interface LinkMemberToSalesforceRequest {\n memberId: number;\n salesforceRecordId: string;\n objectType?: string;\n}\n\nexport interface BulkLinkSalesforceRequest {\n links: LinkMemberToSalesforceRequest[];\n}\n\nexport interface LinkUnlinkedSalesforceMembersResponse {\n workflowId: string;\n status: string;\n}\n\nexport interface LinkedSalesforceMember {\n memberId: number;\n salesforceRecordId: string;\n memberName: string | null;\n memberEmail: string | null;\n memberPhone: string | null;\n lastSyncedAt: string | null;\n lastSyncStatus: string | null;\n}\n\nexport class SalesforceApi extends BaseApiClient {\n /**\n * Create the Salesforce connection shell (no credentials yet).\n *\n * First step of the guided setup flow: provisions the connection row so\n * the admin lands on the detail page where the OAuth callback URL is\n * shown — which they need to register their Salesforce Connected App\n * before they have a Client ID / Secret to enter. Idempotent.\n */\n async installSalesforce(\n wid: string,\n data?: InstallSalesforceRequest\n ): Promise<SalesforceConnectionStatus> {\n return this.fetch<SalesforceConnectionStatus>(`w/${wid}/app-connections/salesforce/install`, {\n method: 'POST',\n body: JSON.stringify(data ?? {}),\n });\n }\n\n async configureSalesforce(\n wid: string,\n data: ConfigureSalesforceRequest\n ): Promise<SalesforceConnectionStatus> {\n return this.fetch<SalesforceConnectionStatus>(\n `w/${wid}/app-connections/salesforce/configure`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n async startSalesforceOAuth(wid: string): Promise<SalesforceConnectionStatus> {\n return this.fetch<SalesforceConnectionStatus>(\n `w/${wid}/app-connections/salesforce/oauth/start`,\n {\n method: 'POST',\n }\n );\n }\n\n async getSalesforceStatus(wid: string): Promise<SalesforceConnectionStatus> {\n return this.fetch<SalesforceConnectionStatus>(`w/${wid}/app-connections/salesforce/status`);\n }\n\n async disconnectSalesforce(wid: string): Promise<SalesforceConnectionStatus> {\n return this.fetch<SalesforceConnectionStatus>(\n `w/${wid}/app-connections/salesforce/disconnect`,\n {\n method: 'DELETE',\n }\n );\n }\n\n async disableSalesforce(wid: string): Promise<SalesforceConnectionStatus> {\n return this.fetch<SalesforceConnectionStatus>(`w/${wid}/app-connections/salesforce/disable`, {\n method: 'POST',\n });\n }\n\n async enableSalesforce(wid: string): Promise<SalesforceConnectionStatus> {\n return this.fetch<SalesforceConnectionStatus>(`w/${wid}/app-connections/salesforce/enable`, {\n method: 'POST',\n });\n }\n\n async deleteSalesforce(wid: string): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/app-connections/salesforce/delete`, {\n method: 'DELETE',\n });\n }\n\n async getSalesforceReconciliationMatches(\n wid: string,\n params?: { limit?: number; offset?: number }\n ): Promise<SalesforceReconciliationMatch[]> {\n const query = new URLSearchParams();\n if (params?.limit !== undefined) query.set('limit', String(params.limit));\n if (params?.offset !== undefined) query.set('offset', String(params.offset));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<SalesforceReconciliationMatch[]>(\n `w/${wid}/app-connections/salesforce/reconciliation/matches${qs}`\n );\n }\n\n async linkMemberToSalesforce(\n wid: string,\n data: LinkMemberToSalesforceRequest\n ): Promise<{ status: string; memberId: number; salesforceRecordId: string }> {\n return this.fetch(`w/${wid}/app-connections/salesforce/reconciliation/link`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async bulkLinkMembersToSalesforce(\n wid: string,\n data: BulkLinkSalesforceRequest\n ): Promise<{ linked: number }> {\n return this.fetch(`w/${wid}/app-connections/salesforce/reconciliation/link/bulk`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Start a durable run that links unlinked members by Salesforce Id / email\n * and hydrates them. One run per connection; a second start while one is\n * in flight is 409.\n */\n async linkUnlinkedSalesforceMembersByIdentity(\n wid: string\n ): Promise<LinkUnlinkedSalesforceMembersResponse> {\n return this.fetch<LinkUnlinkedSalesforceMembersResponse>(\n `w/${wid}/app-connections/salesforce/reconciliation/link-unlinked-by-identity`,\n {\n method: 'POST',\n body: JSON.stringify({}),\n }\n );\n }\n\n async unlinkMemberFromSalesforce(\n wid: string,\n memberId: number\n ): Promise<{ status: string; memberId: number }> {\n return this.fetch(`w/${wid}/app-connections/salesforce/reconciliation/unlink/${memberId}`, {\n method: 'DELETE',\n });\n }\n\n async getLinkedSalesforceMembers(\n wid: string,\n params?: { page?: number; pageSize?: number; search?: string }\n ): Promise<PaginatedResponse<LinkedSalesforceMember>> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n if (params?.search?.trim()) query.set('search', params.search.trim());\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<LinkedSalesforceMember>>(\n `w/${wid}/app-connections/salesforce/reconciliation/linked${qs}`\n );\n }\n\n // --- Sync config ---\n\n async getSalesforceSyncConfig(wid: string): Promise<SalesforceSyncConfigResponse> {\n return this.fetch<SalesforceSyncConfigResponse>(\n `w/${wid}/app-connections/salesforce/sync/config`\n );\n }\n\n async updateSalesforceSyncConfig(\n wid: string,\n data: UpdateSalesforceSyncConfigRequest\n ): Promise<SalesforceSyncConfigResponse> {\n return this.fetch<SalesforceSyncConfigResponse>(\n `w/${wid}/app-connections/salesforce/sync/config`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Pull linked members' Salesforce records now, ignoring the sync cursor.\n *\n * The inbound poll only ever returns records modified after the stored\n * cursor, so a member linked to a record that has not changed since is\n * unreachable by any poll and its link never receives a field — silently.\n * This fetches the records by Id and leaves the cursor untouched, so it is\n * safe to call at any time.\n *\n * Omit `memberIds` to resync every linked member (capped server-side).\n */\n async resyncSalesforceLinkedMembers(\n wid: string,\n data: ResyncLinkedMembersRequest = {}\n ): Promise<ResyncLinkedMembersResponse> {\n return this.fetch<ResyncLinkedMembersResponse>(\n `w/${wid}/app-connections/salesforce/sync/resync-members`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * List the sObjects available in the connected org.\n *\n * Backs the Target Object picker: the object set is org-specific (custom\n * objects included), so it must come from the org rather than a hardcoded\n * list.\n */\n async listSalesforceObjects(\n wid: string\n ): Promise<Array<{ name: string; label: string; custom?: boolean }>> {\n return this.fetch(`w/${wid}/app-connections/salesforce/objects`);\n }\n\n async describeSalesforceObject(\n wid: string,\n sobject: string\n ): Promise<{ fields: SalesforceDescribeField[] }> {\n return this.fetch(\n `w/${wid}/app-connections/salesforce/describe/${encodeURIComponent(sobject)}`\n );\n }\n\n // --- Search & Import ---\n\n async searchSalesforceRecords(\n wid: string,\n data: SalesforceSearchRequest\n ): Promise<SalesforceSearchResponse> {\n return this.fetch<SalesforceSearchResponse>(`w/${wid}/app-connections/salesforce/search`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async importSalesforceMembers(\n wid: string,\n data: ImportSalesforceMembersRequest\n ): Promise<ImportSalesforceMembersResponse> {\n return this.fetch<ImportSalesforceMembersResponse>(\n `w/${wid}/app-connections/salesforce/import-members`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Managed-rule execution history for this connection (`GET /sync/logs`):\n * the connection's managed EventRule executions, newest first, with the\n * shared cursor pagination. Requires `apps:read`; works while the\n * connection is parked for re-authorization.\n */\n async getSalesforceSyncLogs(\n wid: string,\n params?: { pageSize?: number; cursor?: string }\n ): Promise<CursorPaginatedResponse<RuleExecution>> {\n const query = new URLSearchParams();\n if (params?.pageSize) query.set('pageSize', String(params.pageSize));\n if (params?.cursor) query.set('cursor', params.cursor);\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<CursorPaginatedResponse<RuleExecution>>(\n `w/${wid}/app-connections/salesforce/sync/logs${qs}`\n );\n }\n}\n","import type {\n ConnectionSyncConfig,\n SyncCapabilities,\n SyncCheckpoint,\n SyncEntityType,\n SyncRunMode,\n} from '../types/app-connection-types';\nimport { BaseApiClient } from './base';\n\nexport type { SyncRunMode };\nexport type SyncRunStatus =\n 'pending' | 'running' | 'completed' | 'failed' | 'completed_with_errors';\n/**\n * What a run means, derived by the server from the stored ``status`` and\n * ``errorMessage`` (never stored). Equal to ``status`` except for two\n * ``failed`` bookkeeping rows:\n *\n * - a start rejected because a sync was already running — stored as\n * ``failed`` + ``already_running`` — reads as ``skipped_already_running``:\n * nothing ran, so it is neither a success nor a failure;\n * - a bounded inbound pass's planned hand-off — stored as ``failed`` +\n * ``pass_budget_reached`` — reads as ``continuation_pending`` (a clean\n * slice; the next scheduled sync continues where it stopped) or\n * ``continuation_pending_with_errors`` (the slice failed records or had a\n * degraded fetch).\n *\n * Read this instead of re-deriving it from the raw fields. When an older\n * server omits it, fall back to ``status`` — never decode ``errorMessage``.\n */\nexport type SyncRunOutcome =\n | 'pending'\n | 'running'\n | 'completed'\n | 'completed_with_errors'\n | 'continuation_pending'\n | 'continuation_pending_with_errors'\n | 'skipped_already_running'\n | 'failed';\nexport type SyncDirection = 'inbound' | 'outbound';\nexport type SyncItemStatus = 'synced' | 'failed' | 'skipped' | 'linked' | 'unlinked';\nexport type SyncRunSource = 'manual' | 'webhook' | 'scheduled';\n\nexport interface SyncRunSummary {\n runId: string;\n connectionUuid: string;\n startedAt: string;\n completedAt: string | null;\n status: SyncRunStatus;\n mode: SyncRunMode;\n dryRun: boolean;\n source?: SyncRunSource;\n total: number;\n synced: number;\n failed: number;\n skipped: number;\n errorMessage: string | null;\n errors: string[];\n /**\n * PHI-safe stack trace for failed runs. Populated from\n * ``traceback.format_tb(exc.__traceback__)`` on the server — never from\n * exception messages or bound SQL parameters — so patient names,\n * emails, and phone numbers are never included. ``null`` on successful\n * runs and runs that predate this field.\n */\n errorTraceback?: string | null;\n /**\n * Run-level scope. ``null`` indicates an unscoped run that processed\n * every enabled entity type. When set, only that entity type was\n * processed.\n */\n entityType?: SyncEntityType | null;\n /**\n * Server-derived meaning of the run; see {@link SyncRunOutcome}. Optional\n * only for compatibility: a server older than this field, or a live-stream\n * frame from an older worker during a rolling deploy, omits it — fall back\n * to ``status`` then.\n */\n outcome?: SyncRunOutcome;\n}\n\nexport interface MemberSyncSummary {\n totalWorkspaceMembers: number;\n linkedMembers: number;\n unlinkedMembers: number;\n erroredLinks: number;\n /**\n * When inbound sync last fully succeeded (the persisted inbound checkpoint\n * stamp), or — for a connection without inbound checkpoints — the newest\n * ``completed`` run among the latest five.\n */\n lastSuccessfulSyncAt: string | null;\n /**\n * Raw stored status of the same run ``lastSyncOutcome`` describes. Newer\n * servers choose the latest run that was not a skipped start; older\n * servers report the newest row.\n */\n lastSyncStatus: SyncRunStatus | null;\n /**\n * Server-derived outcome (see {@link SyncRunOutcome}) of the latest run\n * that was not a ``skipped_already_running`` start — the server passes\n * over skipped starts so they never replace the preceding verdict.\n * ``null`` when no such run exists or the bounded lookup could not find\n * one. Optional only for compatibility with a server older than this\n * field; fall back to ``lastSyncStatus`` then.\n */\n lastSyncOutcome?: SyncRunOutcome | null;\n}\n\n/**\n * One workspace-unique field write that the inbound rule executor\n * skipped because another Member already owned the value. PHI-safe —\n * only the field name and the conflicting Member's row id are\n * serialized (never the raw value or its digest). ``otherMemberId``\n * is only present when the caller has ``members:read``; without that\n * scope the API returns an empty ``uniqueConflicts`` list and the UI\n * falls back to the generic ``detail`` string.\n */\nexport interface SyncRunUniqueFieldConflict {\n field: 'email' | 'phone' | 'external_id';\n otherMemberId: number;\n}\n\nexport interface SyncRunItemDetail {\n index: number;\n direction: SyncDirection;\n status: SyncItemStatus;\n detail: string | null;\n memberId: number | null;\n memberName: string | null;\n remoteRecordId: string | null;\n entityType: SyncEntityType | null;\n localId: number | null;\n scopeType: string | null;\n scopeKey: string | null;\n /**\n * Skipped workspace-unique field writes for the inbound side.\n * Empty for non-conflict items, omitted/empty for old run rows that\n * predate the field, and empty for callers that lack\n * ``members:read``. The frontend uses this to render an inspection\n * link to the conflicting Member when it is non-empty.\n */\n uniqueConflicts?: SyncRunUniqueFieldConflict[];\n}\n\n/**\n * Generic connection sync API — works with any sync-capable connection.\n * Endpoints are under /app-connections/{connectionId}/sync-config and /sync/*.\n */\nexport class ConnectionSyncApi extends BaseApiClient {\n async getConnectionSyncCapabilities(\n wid: string,\n connectionId: number\n ): Promise<SyncCapabilities> {\n return this.fetch<SyncCapabilities>(\n `w/${wid}/app-connections/${connectionId}/sync-capabilities`\n );\n }\n\n async getConnectionSyncConfig(wid: string, connectionId: number): Promise<ConnectionSyncConfig> {\n return this.fetch<ConnectionSyncConfig>(\n `w/${wid}/app-connections/${connectionId}/sync-config`\n );\n }\n\n async updateConnectionSyncConfig(\n wid: string,\n connectionId: number,\n data: ConnectionSyncConfig\n ): Promise<ConnectionSyncConfig> {\n return this.fetch<ConnectionSyncConfig>(\n `w/${wid}/app-connections/${connectionId}/sync-config`,\n { method: 'PUT', body: JSON.stringify(data) }\n );\n }\n\n async getConnectionSyncCheckpoint(\n wid: string,\n connectionId: number,\n direction: SyncDirection = 'inbound',\n syncKey: string = 'default'\n ): Promise<SyncCheckpoint> {\n const query = new URLSearchParams({\n direction,\n sync_key: syncKey,\n });\n return this.fetch<SyncCheckpoint>(\n `w/${wid}/app-connections/${connectionId}/sync/checkpoint?${query}`\n );\n }\n\n /**\n * Start a sync run. Returns the raw Response (SSE stream).\n * Callers should read the stream for sync_run and sync_item events.\n *\n * Pass ``entityType`` to scope the run to a single entity type\n * (members or records). When omitted, the run covers every enabled\n * entity type on the connection.\n *\n * Pass ``boardId`` together with ``entityType`` to further scope the\n * run to a single board mapping within that entity — useful for\n * isolating test/debug runs to one board.\n */\n async startSyncRun(\n wid: string,\n connectionId: number,\n options?: {\n dryRun?: boolean;\n resetCheckpoints?: boolean;\n entityType?: SyncEntityType;\n boardId?: string;\n /**\n * Preview cap (1..200). Server enforces ``dryRun=true`` when\n * this is set. Omit for uncapped runs.\n */\n recordLimit?: number;\n }\n ): Promise<Response> {\n return this.fetchRaw(`w/${wid}/app-connections/${connectionId}/sync/run`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n dryRun: options?.dryRun ?? false,\n resetCheckpoints: options?.resetCheckpoints ?? false,\n ...(options?.entityType ? { entityType: options.entityType } : {}),\n ...(options?.boardId ? { boardId: options.boardId } : {}),\n ...(typeof options?.recordLimit === 'number'\n ? { recordLimit: options.recordLimit }\n : {}),\n }),\n });\n }\n\n async getSyncRuns(\n wid: string,\n connectionId: number,\n limit: number = 20\n ): Promise<SyncRunSummary[]> {\n return this.fetch<SyncRunSummary[]>(\n `w/${wid}/app-connections/${connectionId}/sync/runs?limit=${limit}`\n );\n }\n\n async getMemberSyncSummary(wid: string, connectionId: number): Promise<MemberSyncSummary> {\n return this.fetch<MemberSyncSummary>(\n `w/${wid}/app-connections/${connectionId}/sync/member-summary`\n );\n }\n\n async getSyncRunItems(\n wid: string,\n connectionId: number,\n runId: string,\n limit: number = 500\n ): Promise<SyncRunItemDetail[]> {\n return this.fetch<SyncRunItemDetail[]>(\n `w/${wid}/app-connections/${connectionId}/sync/runs/${runId}/items?limit=${limit}`\n );\n }\n\n /**\n * Clear a manual-unlink exclusion for a member on a connection so\n * subsequent outbound syncs stop silently skipping them. Idempotent:\n * returns ``cleared=false`` when no matching exclusion exists.\n * ``boardId`` is only meaningful for multi-scope connectors (Monday).\n */\n async clearConnectionMemberExclusion(\n wid: string,\n connectionId: number,\n memberId: number,\n options?: { boardId?: string }\n ): Promise<{\n memberId: number;\n connectionId: number;\n scope: string;\n cleared: boolean;\n }> {\n const query = options?.boardId ? `?board_id=${encodeURIComponent(options.boardId)}` : '';\n return this.fetch(\n `w/${wid}/app-connections/${connectionId}/member-exclusions/${memberId}${query}`,\n { method: 'DELETE' }\n );\n }\n}\n","import type {\n HubSpotSearchRequest,\n HubSpotSearchResponse,\n HubSpotPropertyDefinition,\n ImportHubSpotMembersRequest,\n ImportHubSpotMembersResponse,\n ManagedRuleStatus,\n TransformPreset,\n} from '../types/app-connection-types';\nimport type { CursorPaginatedResponse, PaginatedResponse } from '../types/core-types';\nimport type { RuleExecution } from '../types/event-types';\nimport { BaseApiClient } from './base';\n\nexport interface HubspotConnectionStatus {\n connectionId: number | null;\n /** True once client credentials (Client ID) have been saved. */\n configured: boolean;\n connected: boolean;\n /** False when the connection is installed but disabled. */\n enabled: boolean;\n state: string | null;\n portalId: string | null;\n authorizeUrl: string | null;\n /** OAuth callback URL to register in the HubSpot app. */\n callbackUrl: string | null;\n error: string | null;\n authorizedByMemberId: number | null;\n authorizedAt: string | null;\n}\n\nexport interface ConfigureHubspotRequest {\n clientId: string;\n clientSecret: string;\n}\n\nexport interface HubspotReconciliationMatch {\n memberId: number;\n hubspotRecordId: string;\n hubspotName: string | null;\n hubspotEmail: string | null;\n hubspotPhone: string | null;\n matchType: string;\n objectType: string;\n}\n\nexport interface LinkMemberToHubspotRequest {\n memberId: number;\n hubspotRecordId: string;\n objectType?: string;\n}\n\nexport interface BulkLinkHubspotRequest {\n links: LinkMemberToHubspotRequest[];\n}\n\nexport interface LinkedHubspotMember {\n memberId: number;\n hubspotRecordId: string;\n memberName: string | null;\n memberEmail: string | null;\n memberPhone: string | null;\n lastSyncedAt: string | null;\n lastSyncStatus: string | null;\n}\n\nexport class HubspotApi extends BaseApiClient {\n /**\n * Create the HubSpot connection shell (no credentials yet).\n *\n * First step of the guided setup flow: provisions the connection row so\n * the admin lands on the detail page where the OAuth callback URL is\n * shown — which they need to register their HubSpot app before they have\n * a Client ID / Secret to enter. Idempotent.\n */\n async installHubspot(wid: string): Promise<HubspotConnectionStatus> {\n return this.fetch<HubspotConnectionStatus>(`w/${wid}/app-connections/hubspot/install`, {\n method: 'POST',\n body: JSON.stringify({}),\n });\n }\n\n async configureHubspot(\n wid: string,\n data: ConfigureHubspotRequest\n ): Promise<HubspotConnectionStatus> {\n return this.fetch<HubspotConnectionStatus>(`w/${wid}/app-connections/hubspot/configure`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async startHubspotOAuth(wid: string): Promise<HubspotConnectionStatus> {\n return this.fetch<HubspotConnectionStatus>(`w/${wid}/app-connections/hubspot/oauth/start`, {\n method: 'POST',\n });\n }\n\n async getHubspotStatus(wid: string): Promise<HubspotConnectionStatus> {\n return this.fetch<HubspotConnectionStatus>(`w/${wid}/app-connections/hubspot/status`);\n }\n\n async disconnectHubspot(wid: string): Promise<HubspotConnectionStatus> {\n return this.fetch<HubspotConnectionStatus>(`w/${wid}/app-connections/hubspot/disconnect`, {\n method: 'DELETE',\n });\n }\n\n async disableHubspot(wid: string): Promise<HubspotConnectionStatus> {\n return this.fetch<HubspotConnectionStatus>(`w/${wid}/app-connections/hubspot/disable`, {\n method: 'POST',\n });\n }\n\n async enableHubspot(wid: string): Promise<HubspotConnectionStatus> {\n return this.fetch<HubspotConnectionStatus>(`w/${wid}/app-connections/hubspot/enable`, {\n method: 'POST',\n });\n }\n\n async deleteHubspot(wid: string): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/app-connections/hubspot/delete`, {\n method: 'DELETE',\n });\n }\n\n async getHubspotReconciliationMatches(\n wid: string,\n params?: { limit?: number; offset?: number }\n ): Promise<HubspotReconciliationMatch[]> {\n const query = new URLSearchParams();\n if (params?.limit !== undefined) query.set('limit', String(params.limit));\n if (params?.offset !== undefined) query.set('offset', String(params.offset));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<HubspotReconciliationMatch[]>(\n `w/${wid}/app-connections/hubspot/reconciliation/matches${qs}`\n );\n }\n\n async linkMemberToHubspot(\n wid: string,\n data: LinkMemberToHubspotRequest\n ): Promise<{ status: string; memberId: number; hubspotRecordId: string }> {\n return this.fetch(`w/${wid}/app-connections/hubspot/reconciliation/link`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async bulkLinkMembersToHubspot(\n wid: string,\n data: BulkLinkHubspotRequest\n ): Promise<{ linked: number }> {\n return this.fetch(`w/${wid}/app-connections/hubspot/reconciliation/link/bulk`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async unlinkMemberFromHubspot(\n wid: string,\n memberId: number\n ): Promise<{ status: string; memberId: number }> {\n return this.fetch(`w/${wid}/app-connections/hubspot/reconciliation/unlink/${memberId}`, {\n method: 'DELETE',\n });\n }\n\n async getLinkedHubspotMembers(\n wid: string,\n params?: { page?: number; pageSize?: number; search?: string }\n ): Promise<PaginatedResponse<LinkedHubspotMember>> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n if (params?.search?.trim()) query.set('search', params.search.trim());\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<LinkedHubspotMember>>(\n `w/${wid}/app-connections/hubspot/reconciliation/linked${qs}`\n );\n }\n\n async searchHubspotRecords(\n wid: string,\n data: HubSpotSearchRequest\n ): Promise<HubSpotSearchResponse> {\n return this.fetch<HubSpotSearchResponse>(`w/${wid}/app-connections/hubspot/search`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async importHubspotMembers(\n wid: string,\n data: ImportHubSpotMembersRequest\n ): Promise<ImportHubSpotMembersResponse> {\n return this.fetch<ImportHubSpotMembersResponse>(\n `w/${wid}/app-connections/hubspot/import-members`,\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n\n async getHubspotContactProperties(wid: string): Promise<HubSpotPropertyDefinition[]> {\n return this.fetch<HubSpotPropertyDefinition[]>(\n `w/${wid}/app-connections/hubspot/sync-settings/hs-properties`\n );\n }\n\n async getHubspotManagedRules(wid: string): Promise<ManagedRuleStatus[]> {\n return this.fetch<ManagedRuleStatus[]>(`w/${wid}/app-connections/hubspot/managed-rules`);\n }\n\n /**\n * Managed-rule execution history for this connection (`GET /sync/logs`).\n * Rows are the shared rule-execution response (the same shape the Salesforce\n * and Monday twins return), with cursor pagination.\n */\n async getHubspotSyncLogs(\n wid: string,\n params?: { pageSize?: number; cursor?: string }\n ): Promise<CursorPaginatedResponse<RuleExecution>> {\n const query = new URLSearchParams();\n if (params?.pageSize) query.set('pageSize', String(params.pageSize));\n if (params?.cursor) query.set('cursor', params.cursor);\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<CursorPaginatedResponse<RuleExecution>>(\n `w/${wid}/app-connections/hubspot/sync/logs${qs}`\n );\n }\n\n async getHubspotTransformPresets(wid: string): Promise<TransformPreset[]> {\n return this.fetch<TransformPreset[]>(\n `w/${wid}/app-connections/hubspot/sync-settings/transform-presets`\n );\n }\n}\n","import {\n FileUploadRequest,\n FileUploadResponse,\n MenuItem,\n MenuItemFormData,\n MenuTree,\n Page,\n PageFormData,\n PagesQueryParams,\n PaginatedResponse,\n RenderedPage,\n ReorderMenuItemsData,\n Site,\n SiteCountsResponse,\n SiteFormData,\n SiteSharingResponse,\n SiteSignupResponse,\n SiteSlugAvailability,\n UpdateSiteSharingRequest,\n} from '../types';\nimport type {\n SiteSource,\n SiteSourcePublishResponse,\n SiteSourceTemplates,\n ThemeSettingsResponse,\n} from '../types/site-types';\nimport { BaseApiClient } from './base';\n\nexport class SitesApi extends BaseApiClient {\n /** List all sites in a workspace. */\n async getSites(wid: string): Promise<Site[]> {\n return this.fetch<Site[]>(`w/${wid}/sites`);\n }\n\n /** Check whether a site slug is available for use. */\n async checkSiteSlugAvailability(\n wid: string,\n slug: string,\n siteUuid: string | null = null\n ): Promise<SiteSlugAvailability> {\n const params = new URLSearchParams();\n if (siteUuid) params.append('site_uuid', siteUuid);\n return this.fetch<SiteSlugAvailability>(\n `w/${wid}/sites/available/${slug}?${params.toString()}`\n );\n }\n\n /** Check whether a custom domain is available for a site. */\n async checkSiteDomainAvailability(\n wid: string,\n domain: string,\n siteUuid: string | null = null\n ): Promise<{ result: boolean }> {\n const params = new URLSearchParams();\n if (siteUuid) params.append('site_uuid', siteUuid);\n return this.fetch<{ result: boolean }>(\n `w/${wid}/sites/domain-available/${domain}?${params.toString()}`\n );\n }\n\n /** Get a single site by ID. */\n async getSite(wid: string, id: number): Promise<Site> {\n return this.fetch<Site>(`w/${wid}/sites/${id}`);\n }\n\n /** Get a site's sharing settings. */\n async getSiteSharing(wid: string, siteId: number): Promise<SiteSharingResponse> {\n return this.fetch<SiteSharingResponse>(`w/${wid}/sites/${siteId}/sharing`);\n }\n\n /** Update a site's sharing settings. */\n async updateSiteSharing(\n wid: string,\n siteId: number,\n data: UpdateSiteSharingRequest\n ): Promise<SiteSharingResponse> {\n return this.fetch<SiteSharingResponse>(`w/${wid}/sites/${siteId}/sharing`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Get a site's source tree. */\n async getSiteSource(wid: string, siteId: number): Promise<SiteSource> {\n return this.fetch<SiteSource>(`w/${wid}/sites/${siteId}/source`);\n }\n\n /** Starter templates the caller may seed (superuser-only ones filtered server-side). */\n async getSiteSourceTemplates(wid: string, siteId: number): Promise<SiteSourceTemplates> {\n return this.fetch<SiteSourceTemplates>(`w/${wid}/sites/${siteId}/source/templates`);\n }\n\n /** Create a site's source tree with starter files if it does not exist. */\n async createSiteSource(wid: string, siteId: number): Promise<SiteSource> {\n return this.fetch<SiteSource>(`w/${wid}/sites/${siteId}/source`, {\n method: 'POST',\n });\n }\n\n /** Build a site's source without publishing. */\n async buildSiteSource(wid: string, siteId: number): Promise<SiteSourcePublishResponse> {\n return this.fetch<SiteSourcePublishResponse>(`w/${wid}/sites/${siteId}/source/build`, {\n method: 'POST',\n });\n }\n\n /**\n * Build and publish a site's source. Optionally label the published version\n * with a `name` and `note`; both default to null (the UI then shows\n * \"Version {version}\").\n */\n async publishSiteSource(\n wid: string,\n siteId: number,\n options?: { name?: string | null; note?: string | null }\n ): Promise<SiteSourcePublishResponse> {\n return this.fetch<SiteSourcePublishResponse>(`w/${wid}/sites/${siteId}/source/publish`, {\n method: 'POST',\n body: JSON.stringify({\n name: options?.name ?? null,\n note: options?.note ?? null,\n }),\n });\n }\n\n /**\n * Reset a site's source files: load a starter template and/or wipe existing\n * files. `template` selects which starter to seed when `loadDefaults` is set\n * (defaults to \"hello-world\"; \"patient-enrollment\" is the other built-in).\n */\n async resetSiteSource(\n wid: string,\n siteId: number,\n options: { loadDefaults: boolean; deleteExisting: boolean; template?: string }\n ): Promise<SiteSource> {\n return this.fetch<SiteSource>(`w/${wid}/sites/${siteId}/source/reset`, {\n method: 'POST',\n body: JSON.stringify({\n load_defaults: options.loadDefaults,\n delete_existing: options.deleteExisting,\n ...(options.template ? { template: options.template } : {}),\n }),\n });\n }\n\n /**\n * Re-point the published release to a prior version from the history. A pure\n * pointer move (no rebuild); the other versions stay in the history.\n */\n async rollbackSiteSource(wid: string, siteId: number, releaseUuid: string): Promise<SiteSource> {\n return this.fetch<SiteSource>(`w/${wid}/sites/${siteId}/source/rollback`, {\n method: 'POST',\n body: JSON.stringify({ release_uuid: releaseUuid }),\n });\n }\n\n /**\n * Export the site's source tree as a ZIP archive (editor-gated server-side).\n * Returns the raw archive bytes for the caller to save.\n */\n async downloadSiteSourceZip(wid: string, siteId: number): Promise<Blob> {\n const response = await this.fetchRaw(`w/${wid}/sites/${siteId}/source/download`);\n return response.blob();\n }\n\n /**\n * Replace the site's source tree with the contents of an uploaded ZIP\n * (clears the existing source first, like a reset that loads a template).\n */\n async importSiteSourceZip(wid: string, siteId: number, file: Blob): Promise<SiteSource> {\n const form = new FormData();\n form.append('file', file, 'source.zip');\n return this.fetch<SiteSource>(`w/${wid}/sites/${siteId}/source/import`, {\n method: 'POST',\n body: form,\n });\n }\n\n /**\n * Get a theme's settings schema, the site's saved values, and capabilities.\n * Pass `theme` to resolve the schema for a theme other than the saved one\n * (e.g. one the builder has selected but not yet saved).\n */\n async getThemeSettings(\n wid: string,\n siteId: number,\n theme?: string\n ): Promise<ThemeSettingsResponse> {\n const query = theme ? `?theme=${encodeURIComponent(theme)}` : '';\n return this.fetch<ThemeSettingsResponse>(`w/${wid}/sites/${siteId}/theme-settings${query}`);\n }\n\n /** Save values for the active theme's settings (validated against the schema). */\n async updateThemeSettings(\n wid: string,\n siteId: number,\n values: Record<string, unknown>\n ): Promise<ThemeSettingsResponse> {\n return this.fetch<ThemeSettingsResponse>(`w/${wid}/sites/${siteId}/theme-settings`, {\n method: 'PUT',\n body: JSON.stringify({ values }),\n });\n }\n\n /** Get a single site by UUID. */\n async getSiteByUuid(wid: string, uuid: string): Promise<Site> {\n return this.fetch<Site>(`s/${wid}/${uuid}`);\n }\n\n /** Get a fully rendered page from a site by slug or ID. */\n async getSiteRenderedPage(\n wid: string,\n siteUuid: string,\n pageSlugOrId: string | number\n ): Promise<RenderedPage> {\n return this.fetch<RenderedPage>(`s/${wid}/${siteUuid}/pages/${pageSlugOrId}`);\n }\n\n /** Get the rendered navigation menu for a site, including all translations. */\n async getSiteRenderedMenu(wid: string, siteUuid: string): Promise<MenuTree> {\n // Menu always includes all translations - client picks the right one\n return this.fetch<MenuTree>(`s/${wid}/${siteUuid}/menu`);\n }\n\n /** Sign up a new user through a site's public registration. */\n async siteSignup(wid: string, siteUuid: string): Promise<SiteSignupResponse> {\n return this.fetch<SiteSignupResponse>(`s/${wid}/${siteUuid}/signup`, {\n method: 'POST',\n });\n }\n\n /** Send a phone verification code for site-specific authentication. */\n async siteSendPhoneCode(\n wid: string,\n siteUuid: string,\n phoneNumber: string\n ): Promise<{ success: boolean; message: string }> {\n return this.fetch<{ success: boolean; message: string }>(\n `s/${wid}/${siteUuid}/auth/send-phone-code`,\n {\n method: 'POST',\n body: JSON.stringify({ phoneNumber }),\n }\n );\n }\n\n /** Send an email verification code for site-specific authentication. */\n async siteSendEmailCode(\n wid: string,\n siteUuid: string,\n email: string\n ): Promise<{ success: boolean; message: string }> {\n return this.fetch<{ success: boolean; message: string }>(\n `s/${wid}/${siteUuid}/auth/send-email-code`,\n {\n method: 'POST',\n body: JSON.stringify({ email }),\n }\n );\n }\n\n /**\n * Verify a phone or email code and complete site authentication.\n *\n * When the account has 2FA enrolled, the backend returns a temporary token\n * with ``requiresTwoFactor: true`` and this method does **not** mint full\n * session cookies — the caller must complete the 2FA challenge (same handoff\n * as public-site Google OAuth).\n */\n async siteVerifyCode(\n wid: string,\n siteUuid: string,\n code: string,\n phoneNumber?: string,\n email?: string\n ): Promise<{\n token: string;\n accountId: number;\n memberId?: number | null;\n requiresTwoFactor?: boolean;\n availableTwoFactorMethods?: unknown[] | null;\n }> {\n const verifyResponse = await this.fetch<{\n token: string;\n accountId: number;\n memberId?: number | null;\n requiresTwoFactor?: boolean;\n availableTwoFactorMethods?: unknown[] | null;\n }>(`s/${wid}/${siteUuid}/auth/verify`, {\n method: 'POST',\n body: JSON.stringify({ code, phoneNumber, email }),\n });\n\n // Never install a temp 2FA token as a full session cookie.\n if (!verifyResponse.requiresTwoFactor && verifyResponse.token) {\n const completeResponse = await fetch(`/api/auth/complete`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token: verifyResponse.token }),\n });\n\n if (!completeResponse.ok) {\n throw new Error('Failed to complete authentication');\n }\n }\n\n return verifyResponse;\n }\n\n /** Create a new site in the workspace. */\n async createSite(wid: string, site: SiteFormData): Promise<Site> {\n return this.fetch<Site>(`w/${wid}/sites`, {\n method: 'POST',\n body: JSON.stringify(site),\n });\n }\n\n /** Update a site's configuration. */\n async updateSite(wid: string, id: number, site: Partial<SiteFormData>): Promise<Site> {\n return this.fetch<Site>(`w/${wid}/sites/${id}`, {\n method: 'PUT',\n body: JSON.stringify(site),\n });\n }\n\n /** Delete a site by ID. */\n async deleteSite(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/sites/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** List pages for a site with optional pagination, sorting, and search. */\n async getSitePages(\n wid: string,\n siteId: number,\n options: PagesQueryParams = {}\n ): Promise<PaginatedResponse<Page>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.search) params.append('search', options.search);\n\n return this.fetch<PaginatedResponse<Page>>(\n `w/${wid}/sites/${siteId}/pages${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** Get a single page by ID within a site. */\n async getPage(wid: string, siteId: number, pageId: number): Promise<Page> {\n return this.fetch<Page>(`w/${wid}/sites/${siteId}/pages/${pageId}`);\n }\n\n /** Get a single page by its slug within a site. */\n async getPageBySlug(wid: string, siteId: number, slug: string): Promise<Page> {\n return this.fetch<Page>(`w/${wid}/sites/${siteId}/pages/by-slug/${slug}`);\n }\n\n /** Create a new page within a site. */\n async createPage(wid: string, siteId: number, page: PageFormData): Promise<Page> {\n return this.fetch<Page>(`w/${wid}/sites/${siteId}/pages`, {\n method: 'POST',\n body: JSON.stringify(page),\n });\n }\n\n /** Update a page's content or metadata. */\n async updatePage(\n wid: string,\n siteId: number,\n pageId: number,\n page: Partial<PageFormData>\n ): Promise<Page> {\n return this.fetch<Page>(`w/${wid}/sites/${siteId}/pages/${pageId}`, {\n method: 'PUT',\n body: JSON.stringify(page),\n });\n }\n\n /** Delete a page from a site. */\n async deletePage(wid: string, siteId: number, pageId: number): Promise<void> {\n return this.fetch(`w/${wid}/sites/${siteId}/pages/${pageId}`, {\n method: 'DELETE',\n });\n }\n\n /** Get aggregate counts (pages, menu items, etc.) for a site. */\n async getSiteCounts(wid: string, siteId: number): Promise<SiteCountsResponse> {\n return this.fetch<SiteCountsResponse>(`w/${wid}/sites/${siteId}/counts`);\n }\n\n /** Get the full menu tree for a site. */\n async getSiteMenu(wid: string, siteId: number): Promise<MenuTree> {\n return this.fetch<MenuTree>(`w/${wid}/sites/${siteId}/menu`);\n }\n\n /** List menu items for a site, optionally filtered by parent item. */\n async getMenuItems(wid: string, siteId: number, parentId?: number | null): Promise<MenuItem[]> {\n const params = new URLSearchParams();\n if (parentId !== undefined && parentId !== null) {\n params.append('parent_id', parentId.toString());\n }\n const query = params.toString();\n return this.fetch<MenuItem[]>(\n `w/${wid}/sites/${siteId}/menu/items${query ? `?${query}` : ''}`\n );\n }\n\n /** Create a new menu item in a site's navigation. */\n async createMenuItem(wid: string, siteId: number, item: MenuItemFormData): Promise<MenuItem> {\n return this.fetch<MenuItem>(`w/${wid}/sites/${siteId}/menu/items`, {\n method: 'POST',\n body: JSON.stringify(item),\n });\n }\n\n /** Update a menu item's properties. */\n async updateMenuItem(\n wid: string,\n siteId: number,\n itemId: number,\n item: Partial<MenuItemFormData>\n ): Promise<MenuItem> {\n return this.fetch<MenuItem>(`w/${wid}/sites/${siteId}/menu/items/${itemId}`, {\n method: 'PUT',\n body: JSON.stringify(item),\n });\n }\n\n /** Delete a menu item from a site's navigation. */\n async deleteMenuItem(wid: string, siteId: number, itemId: number): Promise<void> {\n return this.fetch(`w/${wid}/sites/${siteId}/menu/items/${itemId}`, {\n method: 'DELETE',\n });\n }\n\n /** Reorder menu items within a site's navigation. */\n async reorderMenuItems(wid: string, siteId: number, data: ReorderMenuItemsData): Promise<void> {\n return this.fetch(`w/${wid}/sites/${siteId}/menu/reorder`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Generate a pre-signed upload URL for site media content. */\n async generateSiteMediaUploadUrl(\n wid: string,\n siteId: number,\n uploadRequest: FileUploadRequest\n ): Promise<FileUploadResponse> {\n return this.fetch<FileUploadResponse>(`w/${wid}/sites/${siteId}/media/upload-url`, {\n method: 'POST',\n body: JSON.stringify(uploadRequest),\n });\n }\n\n /** Initiate Google OAuth flow for site-specific authentication. */\n async siteGoogleOAuthInitiate(\n wid: string,\n siteUuid: string,\n origin: string\n ): Promise<{ authorizationUrl: string }> {\n const params = new URLSearchParams({ origin });\n return this.fetch<{ authorizationUrl: string }>(\n `s/${wid}/${siteUuid}/auth/google/initiate?${params.toString()}`\n );\n }\n}\n","import { BaseApiClient } from './base';\n\nexport interface Snippet {\n id: number;\n uuid: string;\n key: string;\n name: string;\n value: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface SnippetFormData {\n key: string;\n name: string;\n value: string;\n}\n\nexport interface SnippetUsageInfo {\n field: string;\n entityType: string;\n entityName: string;\n entityId: number;\n}\n\nexport interface DeleteSnippetResponse {\n status: string;\n usages: SnippetUsageInfo[];\n}\n\nexport class SnippetsApi extends BaseApiClient {\n async listSnippets(wid: string): Promise<Snippet[]> {\n return this.fetch<Snippet[]>(`w/${wid}/snippets`);\n }\n\n async getSnippet(wid: string, id: number): Promise<Snippet> {\n return this.fetch<Snippet>(`w/${wid}/snippets/${id}`);\n }\n\n async createSnippet(wid: string, data: SnippetFormData): Promise<Snippet> {\n return this.fetch<Snippet>(`w/${wid}/snippets`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateSnippet(wid: string, id: number, data: Partial<SnippetFormData>): Promise<Snippet> {\n return this.fetch<Snippet>(`w/${wid}/snippets/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async deleteSnippet(wid: string, id: number): Promise<DeleteSnippetResponse> {\n return this.fetch<DeleteSnippetResponse>(`w/${wid}/snippets/${id}`, {\n method: 'DELETE',\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport { Product, Subscription, SubscriptionItemResponse } from '../types';\nimport type {\n CheckoutAttemptStatusResponse,\n CheckoutSessionResponse,\n CreateCheckoutSessionRequest,\n CreateCheckoutSessionRequestPlanPeriod,\n} from '../types/generated/subscription_checkout';\nimport type { AddWorkspaceResponse } from '../types/generated/subscription';\nimport type { MemberSubscriptionStatusResponse } from '../types/generated/member_subscription';\nimport type {\n CreateDeviceOrderCheckoutRequest,\n DeviceOrderCheckoutResponse,\n DeviceOrderListResponse,\n} from '../types/generated/device_order';\n\nexport type CheckoutSessionOptions = Omit<CreateCheckoutSessionRequest, 'productId' | 'planPeriod'>;\n\nexport interface MemberCheckoutSessionOptions {\n siteUuid?: string;\n successReturnUrl?: string;\n cancelReturnUrl?: string;\n attemptId?: string;\n}\n\nexport interface MemberCheckoutSessionResponse {\n checkoutUrl: string;\n sessionId: string;\n attemptId: string;\n}\n\nexport interface MemberPortalSessionResponse {\n portalUrl: string;\n}\n\nexport interface MemberPortalSessionOptions {\n returnUrl?: string;\n siteUuid?: string;\n workspaceUuid?: string;\n}\n\nexport type {\n MemberSubscriptionStatusResponse,\n MemberSubscriptionSummary,\n} from '../types/generated/member_subscription';\n\n/** Derived from the generated request so the two can never drift. */\nexport type DeviceOrderCheckoutOptions = Omit<CreateDeviceOrderCheckoutRequest, 'productId'>;\n\n/** Exactly one scope selector — the server 400s both-or-neither. */\nexport type DeviceOrderListScope =\n { siteUuid: string; workspaceUuid?: never } | { workspaceUuid: string; siteUuid?: never };\n\nexport type {\n DeviceOrderCheckoutResponse,\n DeviceOrderListResponse,\n DeviceOrderSummary,\n} from '../types/generated/device_order';\n\nexport class SubscriptionsApi extends BaseApiClient {\n /** List all subscriptions for the current account. */\n async getSubscriptions(): Promise<Subscription[]> {\n return this.fetch<Subscription[]>('subscriptions');\n }\n\n /**\n * Create a Stripe Checkout session to purchase an organization plan.\n * Returns the checkout URL to open in a browser. The organization, billing\n * customer, and subscription are created on payment by the checkout\n * completion handler.\n */\n async createCheckoutSession(\n productId: number,\n planPeriod: CreateCheckoutSessionRequestPlanPeriod = 'month',\n options: CheckoutSessionOptions = {}\n ): Promise<CheckoutSessionResponse> {\n return this.fetch<CheckoutSessionResponse>(`subscriptions/checkout-session`, {\n method: 'POST',\n credentials: 'include',\n body: JSON.stringify({ productId, planPeriod, ...options }),\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n /** Purchase a role-granting membership in an existing workspace. */\n async createMemberCheckoutSession(\n productId: number,\n planPeriod: 'month' | 'year' | 'quarter' = 'month',\n options: MemberCheckoutSessionOptions = {}\n ): Promise<MemberCheckoutSessionResponse> {\n return this.fetch<MemberCheckoutSessionResponse>(`subscriptions/member-checkout-session`, {\n method: 'POST',\n credentials: 'include',\n body: JSON.stringify({ productId, planPeriod, ...options }),\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n /** Read the authenticated Account's own membership state. */\n async getMemberSubscriptionStatus(siteUuid: string): Promise<MemberSubscriptionStatusResponse>;\n async getMemberSubscriptionStatus(options: {\n siteUuid?: string;\n workspaceUuid?: string;\n }): Promise<MemberSubscriptionStatusResponse>;\n async getMemberSubscriptionStatus(\n siteUuidOrOptions: string | { siteUuid?: string; workspaceUuid?: string }\n ): Promise<MemberSubscriptionStatusResponse> {\n const options =\n typeof siteUuidOrOptions === 'string'\n ? { siteUuid: siteUuidOrOptions }\n : siteUuidOrOptions;\n const params = new URLSearchParams();\n if (options.siteUuid) params.set('siteUuid', options.siteUuid);\n if (options.workspaceUuid) params.set('workspaceUuid', options.workspaceUuid);\n return this.fetch<MemberSubscriptionStatusResponse>(\n `subscriptions/member-subscription?${params.toString()}`,\n { credentials: 'include' }\n );\n }\n\n /** Open Stripe's hosted membership-management portal. */\n async createMemberPortalSession(\n options: MemberPortalSessionOptions\n ): Promise<MemberPortalSessionResponse> {\n return this.fetch<MemberPortalSessionResponse>(`subscriptions/member-portal-session`, {\n method: 'POST',\n credentials: 'include',\n body: JSON.stringify(options),\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n /**\n * Purchase one physical companion device (one-time payment; Stripe collects\n * the shipping address in hosted Checkout).\n */\n async createDeviceOrderCheckoutSession(\n productId: number,\n options: DeviceOrderCheckoutOptions = {}\n ): Promise<DeviceOrderCheckoutResponse> {\n return this.fetch<DeviceOrderCheckoutResponse>(`device-orders/checkout-session`, {\n method: 'POST',\n credentials: 'include',\n body: JSON.stringify({ productId, ...options }),\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n /** List the authenticated Account's own device orders in one workspace. */\n async listDeviceOrders(options: DeviceOrderListScope): Promise<DeviceOrderListResponse> {\n const params = new URLSearchParams();\n if (options.siteUuid) params.set('siteUuid', options.siteUuid);\n if (options.workspaceUuid) params.set('workspaceUuid', options.workspaceUuid);\n return this.fetch<DeviceOrderListResponse>(`device-orders?${params.toString()}`, {\n credentials: 'include',\n });\n }\n\n /** Read one authenticated, server-owned checkout attempt. */\n async getCheckoutAttemptStatus(attemptId: string): Promise<CheckoutAttemptStatusResponse> {\n return this.fetch<CheckoutAttemptStatusResponse>(\n `subscriptions/checkout-attempts/${encodeURIComponent(attemptId)}`,\n { credentials: 'include' }\n );\n }\n\n /**\n * List self-service, purchasable organization plans or add-ons. Only products\n * with a Stripe Price are returned; zero-amount plans are allowed.\n */\n async listSelfServeProducts(\n productType?: 'org' | 'addon' | 'member' | 'device'\n ): Promise<Product[]> {\n const qs = productType ? `?product_type=${productType}` : '';\n return this.fetch<Product[]>(`products/self-service${qs}`);\n }\n\n /** List all subscriptions associated with a workspace. */\n async getWorkspaceSubscriptions(wid: string): Promise<Subscription[]> {\n return this.fetch<Subscription[]>(`w/${wid}/subscriptions`);\n }\n\n /** Cancel an active subscription. */\n async cancelSubscription(subscriptionId: number): Promise<void> {\n return this.fetch(`subscriptions/${subscriptionId}/cancel`, {\n method: 'POST',\n credentials: 'include',\n });\n }\n\n /** Reactivate a previously cancelled subscription. */\n async reactivateSubscription(subscriptionId: number): Promise<{ message: string }> {\n return this.fetch(`subscriptions/${subscriptionId}/reactivate`, {\n method: 'POST',\n credentials: 'include',\n });\n }\n\n /** Update a subscription's budget, plan period, or credit settings. */\n async updateSubscription(\n subscriptionId: number,\n updates: {\n planPeriod?: string; // Plan period (e.g., \"month\", \"year\")\n extraUsageEnabled?: boolean;\n reloadAmountCents?: number | null;\n reloadThresholdCents?: number | null;\n monthlyReloadLimitCents?: number | null;\n }\n ): Promise<{ message: string }> {\n return this.fetch(`subscriptions/${subscriptionId}`, {\n method: 'PUT',\n credentials: 'include',\n body: JSON.stringify(updates),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n }\n\n /**\n * Provision a new workspace under an existing org subscription.\n *\n * No product or period: the organization already holds the plan and the new\n * workspace bills through it. Returns before the workspace exists —\n * `provisioning: true` means poll for it.\n */\n async addWorkspaceToSubscription(\n subscriptionId: number,\n data: {\n name?: string;\n slug?: string;\n template_workspace_uuid?: string;\n }\n ): Promise<AddWorkspaceResponse> {\n return this.fetch(`subscriptions/${subscriptionId}/add-workspace`, {\n method: 'POST',\n credentials: 'include',\n body: JSON.stringify(data),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n }\n\n /** List line items for a subscription. */\n async getSubscriptionItems(subscriptionId: number): Promise<SubscriptionItemResponse[]> {\n return this.fetch<SubscriptionItemResponse[]>(`subscriptions/${subscriptionId}/items`);\n }\n\n /** Purchase extra credits on a subscription (org-level). */\n async purchaseCredits(\n subscriptionId: number,\n amountCents: number,\n idempotencyKey: string = crypto.randomUUID()\n ): Promise<{\n success: boolean;\n status: string;\n grantId: number;\n creditsAdded: number;\n creditsPending: number;\n amountChargedCents: number;\n amountSubmittedCents: number;\n newBalance: number;\n }> {\n return this.fetch(`subscriptions/${subscriptionId}/purchase-credits`, {\n method: 'POST',\n credentials: 'include',\n body: JSON.stringify({ amount_cents: amountCents }),\n headers: {\n 'Content-Type': 'application/json',\n 'Idempotency-Key': idempotencyKey,\n },\n });\n }\n}\n","import type {\n CloseSupportRequestRequest,\n CreateSupportRequestCommentRequest,\n CreateSupportRequestRequest,\n RecordResourceClickRequest,\n ReopenSupportRequestRequest,\n SupportRequest,\n SupportRequestListParams,\n} from '../types/support-request-types';\nimport type { PaginatedResponse } from '../types/core-types';\nimport { BaseApiClient } from './base';\n\nfunction supportRequestParams(params?: SupportRequestListParams): string {\n const searchParams = new URLSearchParams();\n if (params?.page) searchParams.append('page', params.page.toString());\n if (params?.pageSize) searchParams.append('pageSize', params.pageSize.toString());\n if (params?.status) searchParams.append('status', params.status);\n if (params?.supportRequestType) {\n searchParams.append('supportRequestType', params.supportRequestType);\n }\n if (params?.severity) searchParams.append('severity', params.severity);\n if (params?.source) searchParams.append('source', params.source);\n if (params?.organizationId !== undefined) {\n searchParams.append('organizationId', params.organizationId.toString());\n }\n if (params?.workspaceId !== undefined) {\n searchParams.append('workspaceId', params.workspaceId.toString());\n }\n if (params?.linearLinked !== undefined) {\n searchParams.append('linearLinked', params.linearLinked.toString());\n }\n const query = searchParams.toString();\n return query ? `?${query}` : '';\n}\n\nexport class SupportRequestsApi extends BaseApiClient {\n async listSupportRequests(\n params?: SupportRequestListParams\n ): Promise<PaginatedResponse<SupportRequest>> {\n return this.fetch<PaginatedResponse<SupportRequest>>(\n `support-requests${supportRequestParams(params)}`\n );\n }\n\n async getSupportRequest(uuid: string): Promise<SupportRequest> {\n return this.fetch<SupportRequest>(`support-requests/${uuid}`);\n }\n\n async createSupportRequest(data: CreateSupportRequestRequest): Promise<SupportRequest> {\n return this.fetch<SupportRequest>('support-requests', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async commentOnSupportRequest(\n uuid: string,\n data: CreateSupportRequestCommentRequest\n ): Promise<SupportRequest> {\n return this.fetch<SupportRequest>(`support-requests/${uuid}/comments`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async listOrgSupportRequests(\n orgUuid: string,\n params?: SupportRequestListParams\n ): Promise<PaginatedResponse<SupportRequest>> {\n return this.fetch<PaginatedResponse<SupportRequest>>(\n `o/${orgUuid}/support-requests${supportRequestParams(params)}`\n );\n }\n\n async getOrgSupportRequest(orgUuid: string, uuid: string): Promise<SupportRequest> {\n return this.fetch<SupportRequest>(`o/${orgUuid}/support-requests/${uuid}`);\n }\n\n async createOrgSupportRequest(\n orgUuid: string,\n data: CreateSupportRequestRequest\n ): Promise<SupportRequest> {\n return this.fetch<SupportRequest>(`o/${orgUuid}/support-requests`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async commentOnOrgSupportRequest(\n orgUuid: string,\n uuid: string,\n data: CreateSupportRequestCommentRequest\n ): Promise<SupportRequest> {\n return this.fetch<SupportRequest>(`o/${orgUuid}/support-requests/${uuid}/comments`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async listWorkspaceSupportRequests(\n workspaceUuid: string,\n params?: SupportRequestListParams\n ): Promise<PaginatedResponse<SupportRequest>> {\n return this.fetch<PaginatedResponse<SupportRequest>>(\n `w/${workspaceUuid}/support-requests${supportRequestParams(params)}`\n );\n }\n\n async getWorkspaceSupportRequest(workspaceUuid: string, uuid: string): Promise<SupportRequest> {\n return this.fetch<SupportRequest>(`w/${workspaceUuid}/support-requests/${uuid}`);\n }\n\n async createWorkspaceSupportRequest(\n workspaceUuid: string,\n data: CreateSupportRequestRequest\n ): Promise<SupportRequest> {\n return this.fetch<SupportRequest>(`w/${workspaceUuid}/support-requests`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async commentOnWorkspaceSupportRequest(\n workspaceUuid: string,\n uuid: string,\n data: CreateSupportRequestCommentRequest\n ): Promise<SupportRequest> {\n return this.fetch<SupportRequest>(`w/${workspaceUuid}/support-requests/${uuid}/comments`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async closeWorkspaceSupportRequest(\n workspaceUuid: string,\n uuid: string,\n data: CloseSupportRequestRequest = {}\n ): Promise<SupportRequest> {\n return this.fetch<SupportRequest>(`w/${workspaceUuid}/support-requests/${uuid}/close`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Reopen a resolved support request (e.g. staff resolved it prematurely).\n * The server rejects requests that are not in the `resolved` state.\n */\n async reopenWorkspaceSupportRequest(\n workspaceUuid: string,\n uuid: string,\n data: ReopenSupportRequestRequest = {}\n ): Promise<SupportRequest> {\n return this.fetch<SupportRequest>(`w/${workspaceUuid}/support-requests/${uuid}/reopen`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Record a click on a pushed resource (Proactive Support). For a\n * manager_prompt, pass the Manager Chat UUID it opened so the\n * resource→chat linkage is preserved.\n */\n async clickWorkspaceSupportRequestResource(\n workspaceUuid: string,\n uuid: string,\n resourceUuid: string,\n data: RecordResourceClickRequest = {}\n ): Promise<SupportRequest> {\n return this.fetch<SupportRequest>(\n `w/${workspaceUuid}/support-requests/${uuid}/resources/${resourceUuid}/click`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n AttachPaymentMethodRequest,\n CreditGrantListResponse,\n Customer,\n CustomerAccount,\n Invoice,\n StripePaymentMethod,\n UpdateCustomerRequest,\n} from '../types';\nimport type { Subscription } from '../types';\n\n// Response type includes the user's role on this customer\nexport interface MyCustomerResponse extends Customer {\n role: string;\n}\n\nexport class CustomersApi extends BaseApiClient {\n async getMyCustomers(): Promise<MyCustomerResponse[]> {\n return this.fetch<MyCustomerResponse[]>('customers');\n }\n\n async getMyCustomer(uuid: string): Promise<MyCustomerResponse> {\n return this.fetch<MyCustomerResponse>(`customers/${uuid}`);\n }\n\n async getMyCustomerAccounts(uuid: string): Promise<CustomerAccount[]> {\n return this.fetch<CustomerAccount[]>(`customers/${uuid}/accounts`);\n }\n\n async getMyCustomerSubscriptions(\n uuid: string,\n opts?: { status?: string; page?: number; pageSize?: number; subscriptionId?: number }\n ): Promise<{ items: Subscription[]; total: number; page: number; pageSize: number }> {\n const params = new URLSearchParams();\n if (opts?.status) params.set('status', opts.status);\n if (opts?.page !== undefined) params.set('page', String(opts.page));\n if (opts?.pageSize !== undefined) params.set('page_size', String(opts.pageSize));\n if (opts?.subscriptionId !== undefined) {\n params.set('subscription_id', String(opts.subscriptionId));\n }\n const qs = params.toString();\n return this.fetch(`customers/${uuid}/subscriptions${qs ? '?' + qs : ''}`);\n }\n\n async getMyCustomerInvoices(uuid: string): Promise<Invoice[]> {\n return this.fetch<Invoice[]>(`customers/${uuid}/invoices`);\n }\n\n async createMyCustomerPortalSession(\n uuid: string,\n returnUrl?: string\n ): Promise<{ portalUrl: string }> {\n return this.fetch(`customers/${uuid}/stripe/portal-session`, {\n method: 'POST',\n body: JSON.stringify({ returnUrl }),\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n async updateMyCustomer(uuid: string, data: UpdateCustomerRequest): Promise<MyCustomerResponse> {\n return this.fetch<MyCustomerResponse>(`customers/${uuid}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n // ===== Payment Methods =====\n\n async createMyCustomerSetupIntent(\n uuid: string\n ): Promise<{ clientSecret: string; setupIntentId: string; status: string }> {\n return this.fetch(`customers/${uuid}/stripe/setup-intent`, { method: 'POST' });\n }\n\n async getMyCustomerPaymentMethods(uuid: string): Promise<StripePaymentMethod[]> {\n return this.fetch<StripePaymentMethod[]>(`customers/${uuid}/stripe/payment-methods`);\n }\n\n async attachMyCustomerPaymentMethod(\n uuid: string,\n paymentMethodId: string,\n setAsDefault: boolean = false\n ): Promise<{ success: boolean; message: string; paymentMethodId: string; type: string }> {\n return this.fetch(`customers/${uuid}/stripe/payment-methods/${paymentMethodId}/attach`, {\n method: 'POST',\n body: JSON.stringify({ setAsDefault } satisfies AttachPaymentMethodRequest),\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n async detachMyCustomerPaymentMethod(\n uuid: string,\n paymentMethodId: string\n ): Promise<{ success: boolean; message: string }> {\n return this.fetch(`customers/${uuid}/stripe/payment-methods/${paymentMethodId}`, {\n method: 'DELETE',\n });\n }\n\n async setDefaultMyCustomerPaymentMethod(\n uuid: string,\n paymentMethodId: string\n ): Promise<{ success: boolean; message: string }> {\n return this.fetch(`customers/${uuid}/stripe/payment-methods/${paymentMethodId}/set-default`, {\n method: 'PUT',\n });\n }\n\n async getMyCustomerCreditGrants(\n uuid: string,\n opts?: { subscriptionId?: number; page?: number; pageSize?: number }\n ): Promise<CreditGrantListResponse> {\n const params = new URLSearchParams();\n if (opts?.subscriptionId !== undefined) {\n params.set('subscription_id', String(opts.subscriptionId));\n }\n if (opts?.page !== undefined) params.set('page', String(opts.page));\n if (opts?.pageSize !== undefined) params.set('page_size', String(opts.pageSize));\n const qs = params.toString();\n return this.fetch(`customers/${uuid}/credit-grants${qs ? '?' + qs : ''}`);\n }\n}\n","import { BaseApiClient } from './base';\nimport type { Reseller, ResellerAccount, UpdateResellerRequest } from '../types';\nimport type { PaginatedResponseSupplierSubscriptionResponse } from '../types';\nimport type { Product } from '../types';\n\n// Response type includes the user's role on this reseller\nexport interface MyResellerResponse extends Reseller {\n role: string;\n}\n\nexport class ResellersApi extends BaseApiClient {\n async getMyResellers(): Promise<MyResellerResponse[]> {\n return this.fetch<MyResellerResponse[]>('resellers');\n }\n\n async getMyReseller(uuid: string): Promise<MyResellerResponse> {\n return this.fetch<MyResellerResponse>(`resellers/${uuid}`);\n }\n\n async getMyResellerAccounts(uuid: string): Promise<ResellerAccount[]> {\n return this.fetch<ResellerAccount[]>(`resellers/${uuid}/accounts`);\n }\n\n async getMyResellerProducts(uuid: string): Promise<Product[]> {\n return this.fetch<Product[]>(`resellers/${uuid}/products`);\n }\n\n async getMyResellerSubscriptions(\n uuid: string,\n opts?: { status?: string; page?: number; pageSize?: number }\n ): Promise<PaginatedResponseSupplierSubscriptionResponse> {\n const params = new URLSearchParams();\n if (opts?.status) params.set('status', opts.status);\n if (opts?.page) params.set('page', String(opts.page));\n if (opts?.pageSize) params.set('page_size', String(opts.pageSize));\n const qs = params.toString();\n return this.fetch(`resellers/${uuid}/subscriptions${qs ? '?' + qs : ''}`);\n }\n\n async updateMyReseller(uuid: string, data: UpdateResellerRequest): Promise<MyResellerResponse> {\n return this.fetch<MyResellerResponse>(`resellers/${uuid}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n headers: { 'Content-Type': 'application/json' },\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport { CustomTool } from '../types';\nimport type { AbilityData } from '../schemas/tasks.js';\n\nexport interface SupervisorFormData {\n name: string;\n displayName?: string;\n description?: string;\n prompt: string;\n chatModel?: string;\n abilities?: AbilityData[];\n suggestResponse?: boolean;\n overrideResponse?: boolean;\n pauseChat?: boolean;\n talkToHuman?: boolean;\n}\n\nexport class SupervisorsApi extends BaseApiClient {\n /** List all supervisors in a workspace. */\n async getSupervisors(wid: string): Promise<CustomTool[]> {\n return this.fetch<CustomTool[]>(`w/${wid}/supervisors`);\n }\n\n /** Get a single supervisor by ID. */\n async getSupervisor(wid: string, id: number): Promise<CustomTool> {\n return this.fetch<CustomTool>(`w/${wid}/supervisors/${id}`);\n }\n\n /** Create a new supervisor in a workspace. */\n async createSupervisor(wid: string, supervisor: SupervisorFormData): Promise<CustomTool> {\n return this.fetch<CustomTool>(`w/${wid}/supervisors`, {\n method: 'POST',\n body: JSON.stringify(supervisor),\n });\n }\n\n /** Update an existing supervisor with partial data. */\n async updateSupervisor(\n wid: string,\n id: number,\n supervisor: Partial<SupervisorFormData>\n ): Promise<CustomTool> {\n return this.fetch<CustomTool>(`w/${wid}/supervisors/${id}`, {\n method: 'PUT',\n body: JSON.stringify(supervisor),\n });\n }\n\n /** Delete a supervisor by ID. */\n async deleteSupervisor(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/supervisors/${id}`, {\n method: 'DELETE',\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport { Task, TaskFormData } from '../types';\n\nexport class TasksApi extends BaseApiClient {\n /**\n * List all tasks in a workspace, optionally filtering by workflow or\n * including archived.\n *\n * `workflowId` is the STABLE workflow root id — the server resolves it to\n * that workflow's draft revision's tasks. `workflowRevisionId` filters an\n * explicit revision (the read-only published-revision view). Pass at most\n * one; passing both that disagree is a 400.\n */\n async getTasks(\n wid: string,\n options: {\n includeArchived?: boolean;\n workflowId?: number;\n workflowRevisionId?: number;\n sortBy?: 'name' | 'createdAt' | 'workflowId';\n sortOrder?: 'asc' | 'desc';\n } = {}\n ): Promise<Task[]> {\n const params = new URLSearchParams();\n if (options.includeArchived) {\n params.append('include_archived', 'true');\n }\n if (options.workflowId) {\n params.append('workflow_id', options.workflowId.toString());\n }\n if (options.workflowRevisionId) {\n params.append('workflow_revision_id', options.workflowRevisionId.toString());\n }\n if (options.sortBy) {\n params.append('sortBy', options.sortBy);\n }\n if (options.sortOrder) {\n params.append('sortOrder', options.sortOrder);\n }\n return this.fetch<Task[]>(\n `w/${wid}/tasks${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** Get a single task by ID. */\n async getTask(wid: string, id: number | string): Promise<Task> {\n return this.fetch<Task>(`w/${wid}/tasks/${id}`);\n }\n\n /** Create a new task in a workspace. */\n async createTask(wid: string, task: TaskFormData): Promise<Task> {\n return this.fetch<Task>(`w/${wid}/tasks`, {\n method: 'POST',\n body: JSON.stringify(task),\n });\n }\n\n /** Update an existing task with partial data. */\n async updateTask(wid: string, id: number, task: Partial<TaskFormData>): Promise<Task> {\n return this.fetch<Task>(`w/${wid}/tasks/${id}`, {\n method: 'PUT',\n body: JSON.stringify(task),\n });\n }\n\n /** Delete a task by ID. */\n async deleteTask(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/tasks/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Archive a task, hiding it from default listings. */\n async archiveTask(wid: string, id: number): Promise<Task> {\n return this.fetch<Task>(`w/${wid}/tasks/${id}/archive`, {\n method: 'PUT',\n });\n }\n\n /** Restore an archived task back to active status. */\n async unarchiveTask(wid: string, id: number): Promise<Task> {\n return this.fetch<Task>(`w/${wid}/tasks/${id}/unarchive`, {\n method: 'PUT',\n });\n }\n\n /**\n * Clone a task with all its dependencies including abilities.\n *\n * This creates a complete copy of the task on the backend, including:\n * - Task properties (name, description, prompt, etc.)\n * - File associations\n * - Data type associations\n * - Event rules\n * - Abilities (task-scoped)\n */\n async cloneTask(wid: string, taskId: number, name: string, slug?: string): Promise<Task> {\n return this.fetch<Task>(`w/${wid}/tasks/${taskId}/clone`, {\n method: 'POST',\n body: JSON.stringify({ name, slug }),\n });\n }\n}\n","import { BaseApiClient } from './base';\n\n/**\n * A template variable available for autocomplete.\n */\nexport interface TemplateVariable {\n path: string; // e.g., \"record.data.title\"\n type: string; // e.g., \"string\", \"number\", \"date\"\n description: string; // e.g., \"Title field from the data record\"\n sampleValue: any; // e.g., \"a-title\" for string fields\n}\n\n/**\n * Parameters for requesting template context.\n */\nexport interface TemplateContextRequest {\n workflowId?: number;\n taskId?: number;\n dataTypeId?: number;\n eventType?: string; // e.g., \"data_record:created\"\n objectType?: string; // e.g., \"data_record\"\n}\n\n/**\n * Response containing available template variables and namespaces.\n */\nexport interface TemplateContextResponse {\n variables: TemplateVariable[];\n namespaces: string[]; // Available top-level namespaces\n sampleContext: Record<string, any>; // Full sample context for preview rendering\n}\n\n/**\n * Parameters for requesting a template preview.\n */\nexport interface TemplatePreviewRequest {\n template: string;\n workflowId?: number;\n taskId?: number;\n dataTypeId?: number;\n eventType?: string;\n objectType?: string;\n}\n\n/**\n * Response containing rendered template and any errors.\n */\nexport interface TemplatePreviewResponse {\n rendered: string;\n errors: string[];\n}\n\n/**\n * A variable from the central registry with extended metadata.\n */\nexport interface RegistryVariable {\n path: string; // e.g., \"member.name\"\n type: string; // e.g., \"string\", \"number\"\n description: string;\n example: any;\n namespace: string;\n deprecated: boolean;\n deprecatedFor?: string | null;\n permissionScope?: string | null;\n}\n\n/**\n * Parameters for requesting variables from the registry.\n */\nexport interface VariableRegistryRequest {\n eventType?: string;\n includeDeprecated?: boolean;\n}\n\n/**\n * Response containing variables from the central registry.\n */\nexport interface VariableRegistryResponse {\n variables: RegistryVariable[];\n namespaces: string[];\n sampleContext: Record<string, any>;\n}\n\nexport class TemplatesApi extends BaseApiClient {\n /**\n * Get available template variables and sample context for template editing.\n *\n * Returns variables appropriate for the given context (event type, data type, etc.)\n * with sample values for live preview.\n */\n async getTemplateContext(\n wid: string,\n request: TemplateContextRequest\n ): Promise<TemplateContextResponse> {\n return this.fetch<TemplateContextResponse>(`w/${wid}/templates/context`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Render a template with sample data for preview.\n *\n * Uses the same Jinja2 renderer as the actual template system,\n * but with sample data instead of real data.\n */\n async previewTemplate(\n wid: string,\n request: TemplatePreviewRequest\n ): Promise<TemplatePreviewResponse> {\n return this.fetch<TemplatePreviewResponse>(`w/${wid}/templates/preview`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get variables from the central variable registry.\n *\n * This provides variables defined in the single source of truth registry\n * with extended metadata including deprecation info and permission scopes.\n */\n async getVariableRegistry(\n wid: string,\n request: VariableRegistryRequest = {}\n ): Promise<VariableRegistryResponse> {\n const params = new URLSearchParams();\n if (request.eventType) {\n params.append('event_type', request.eventType);\n }\n if (request.includeDeprecated) {\n params.append('include_deprecated', 'true');\n }\n const queryString = params.toString();\n const url = queryString\n ? `w/${wid}/templates/variables/registry?${queryString}`\n : `w/${wid}/templates/variables/registry`;\n return this.fetch<VariableRegistryResponse>(url, { method: 'GET' });\n }\n}\n","import type { ToolkitsResponse, ToolResponse } from '../types/toolkit-types';\nimport { BaseApiClient } from './base';\n\n/**\n * API client for toolkit-related operations.\n */\nexport class ToolkitsApi extends BaseApiClient {\n /**\n * Get available toolkits for the workspace\n */\n async getToolkits(wid: string): Promise<ToolkitsResponse> {\n return this.fetch<ToolkitsResponse>(`w/${wid}/toolkits`);\n }\n\n /**\n * Get details for a specific tool by name within a chat context.\n * Searches tools available to the chat's assistant.\n */\n async getTool(wid: string, chatId: number, toolName: string): Promise<ToolResponse> {\n return this.fetch<ToolResponse>(\n `w/${wid}/chats/${chatId}/tool/${encodeURIComponent(toolName)}`\n );\n }\n}\n","import type { PutJourneyDraftRequest } from '../types/generated/journey_draft';\nimport { BaseApiClient } from './base';\nimport type {\n Journey,\n JourneyRead,\n JourneyFormData,\n JourneyFilterOptionResponse,\n JourneyGoal,\n JourneyGoalFormData,\n JourneyHealthResponse,\n JourneyNote,\n JourneyNoteFormData,\n JourneyStep,\n JourneyStepConnectionFormData,\n JourneyStepConnection,\n JourneyStatusLogResponse,\n JourneyStepFormData,\n JourneyV2DefinitionFormData,\n JourneyV2ValidationResponse,\n JourneyTestRunResponse,\n MemberJourney,\n MemberJourneyStep,\n StepMember,\n StepMemberCount,\n EnrollMemberFormData,\n ReenrollMemberFormData,\n UnenrollMemberFormData,\n AdvanceStepFormData,\n SkipStepFormData,\n PaginatedResponse,\n} from '../types';\n\nexport class JourneysApi extends BaseApiClient {\n async putJourneyDraft(\n wid: string,\n journeyId: number,\n data: PutJourneyDraftRequest\n ): Promise<Journey> {\n return this.fetch<Journey>(`w/${wid}/journeys/${journeyId}/draft`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Discard a saved editor draft, keeping the runnable definition.\n *\n * Body-less: a DELETE carries no document, only the resource to remove and\n * `expectedUpdatedAt` — the Journey's `updatedAt` as the caller loaded it —\n * proving they are removing the draft they were looking at. Encoded through\n * `URLSearchParams` because an ISO timestamp with a positive UTC offset\n * contains a `+`, which a raw template string would deliver to the server as\n * a space and turn into a revision conflict nobody can explain.\n *\n * Returns the AUTHORING projection (`Journey`) with `authoringDraft: null`\n * and the advanced `updatedAt`, so the caller can re-derive from the stored\n * definition without a second read.\n *\n * Refusals match the PUT's vocabulary: `journey_v2_definition_conflict`\n * (someone saved first — nothing was removed),\n * `journey_v2_structural_edit_not_allowed` (the Journey is live or archived)\n * and `journey_v2_execution_model_mismatch` (it is legacy). A Journey that\n * has no saved draft is a success, not an error — the state the caller asked\n * for is the state it is in.\n */\n async deleteJourneyDraft(\n wid: string,\n journeyId: number,\n expectedUpdatedAt: string\n ): Promise<Journey> {\n const query = new URLSearchParams({ expectedUpdatedAt });\n return this.fetch<Journey>(`w/${wid}/journeys/${journeyId}/draft?${query.toString()}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * List journeys, optionally including archived, paginated.\n *\n * Returns the READ projection (`JourneyRead`) — CEL-free. Use\n * {@link getJourneyAuthoring} for the editor's expression-carrying shape.\n */\n async getJourneys(\n wid: string,\n includeArchived: boolean = false,\n pageOpts?: { page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<JourneyRead>> {\n const query = new URLSearchParams();\n if (includeArchived) query.set('include_archived', 'true');\n if (pageOpts?.page !== undefined) query.set('page', String(pageOpts.page));\n if (pageOpts?.pageSize !== undefined) query.set('pageSize', String(pageOpts.pageSize));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<JourneyRead>>(`w/${wid}/journeys${qs}`);\n }\n\n /**\n * Get a single journey by ID (includes steps and goals).\n *\n * Returns the READ projection (`JourneyRead`) — nested edges carry no\n * `celCondition` and goals no `completionCel`. The editor uses\n * {@link getJourneyAuthoring} for those.\n */\n async getJourney(wid: string, journeyId: number): Promise<JourneyRead> {\n return this.fetch<JourneyRead>(`w/${wid}/journeys/${journeyId}`);\n }\n\n /**\n * Get a journey's AUTHORING projection (raw edge/goal CEL).\n *\n * journey-decoupling §3.5: the ordinary `getJourney` read projection omits\n * raw edge `celCondition` and goal `completionCel`. This endpoint is the\n * write-authorized surface that carries them for the Journey editor — it\n * requires the `journeys:write` scope, so a read-only caller is denied and\n * must not call it. Returns the authoring superset (`Journey`).\n */\n async getJourneyAuthoring(wid: string, journeyId: number): Promise<Journey> {\n return this.fetch<Journey>(`w/${wid}/journeys/${journeyId}/authoring`);\n }\n\n /**\n * Atomically replace a v2 Journey's whole definition (Journey v2 plan §3.8).\n *\n * ONE request carries the ordered touches, the wait into each touch, the\n * ordered Endings, action associations, goals, and\n * `expectedUpdatedAt` for optimistic concurrency. It is a full replacement,\n * not a patch — omitting `goals` is the one exception and leaves them alone.\n *\n * Returns the AUTHORING projection (`Journey`): the caller just wrote the\n * CEL and holds the `journeys:write` scope that authorizes reading it back.\n *\n * Refusals are HTTP 409 with a stable `code`:\n * * `journey_v2_execution_model_mismatch` — the Journey is legacy; use the\n * step/connection/goal endpoints.\n * * `journey_v2_structural_edit_not_allowed` — it is live; pause it first.\n * * `journey_v2_definition_conflict` — someone saved first; reload.\n * * `journey_v2_invalid_topology` — the resulting graph is not executable;\n * the body carries `issues` (codes and resource uuids, never CEL).\n */\n async putJourneyV2Definition(\n wid: string,\n journeyId: number,\n data: JourneyV2DefinitionFormData\n ): Promise<Journey> {\n return this.fetch<Journey>(`w/${wid}/journeys/${journeyId}/v2-definition`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Dry-run the v2 publish validator against the STORED definition.\n *\n * Answers \"could I activate this right now?\" without attempting the\n * transition. Issues carry closed codes and resource uuids only — never CEL\n * and never member data — so they are safe to render or log.\n */\n async getJourneyV2Validation(\n wid: string,\n journeyId: number\n ): Promise<JourneyV2ValidationResponse> {\n return this.fetch<JourneyV2ValidationResponse>(\n `w/${wid}/journeys/${journeyId}/v2-definition/validation`\n );\n }\n\n /**\n * MemberFilter ids and names, for the Journey authoring picker.\n *\n * A v2 wait, route or Ending may carry a structured MemberFilter predicate\n * and the author selects it by NAME (rule-filters plan §3.10). This is the\n * catalogue for that control and the whole of what it needs: two scalars per\n * filter, no `query` predicate, no rules, no counts.\n *\n * Authorized on `journeys:write` alone — deliberately NOT the Members\n * surface's `MembersApi.getMemberFilters`, which is `members:read`\n * because it returns each filter's predicate. Journey authoring should not\n * require Member-read access to name a cohort.\n */\n async getJourneyFilterOptions(wid: string): Promise<JourneyFilterOptionResponse[]> {\n return this.fetch<JourneyFilterOptionResponse[]>(`w/${wid}/journeys/filter-options`);\n }\n\n /** Copy a supported legacy definition into a separate draft V2 Journey. */\n async cloneJourneyAsV2(wid: string, id: number): Promise<JourneyRead> {\n return this.fetch<JourneyRead>(`w/${wid}/journeys/${id}/clone-v2`, {\n method: 'POST',\n body: JSON.stringify({}),\n });\n }\n\n /** Create a new journey. Returns the READ projection (`JourneyRead`). */\n async createJourney(wid: string, data: JourneyFormData): Promise<JourneyRead> {\n return this.fetch<JourneyRead>(`w/${wid}/journeys`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Update an existing journey. Returns the READ projection (`JourneyRead`).\n *\n * `executionModel` is excluded: it is a CREATE-only field. Flipping a live\n * Journey's engine is a guarded, audited migration operation (Journey v2\n * plan §3.11), so the server has no update counterpart and sending one here\n * would silently do nothing.\n */\n async updateJourney(\n wid: string,\n journeyId: number,\n data: Partial<Omit<JourneyFormData, 'executionModel'>>\n ): Promise<JourneyRead> {\n return this.fetch<JourneyRead>(`w/${wid}/journeys/${journeyId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Archive a journey (soft delete). */\n async archiveJourney(wid: string, journeyId: number): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/journeys/${journeyId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Get Journey Health diagnostics — authoring issues and runtime\n * failures for a single journey. PHI-safe: response carries IDs,\n * counts, error_type strings, and timestamps only.\n */\n async getJourneyHealth(wid: string, journeyId: number): Promise<JourneyHealthResponse> {\n return this.fetch<JourneyHealthResponse>(`w/${wid}/journeys/${journeyId}/health`);\n }\n\n /** Create a step within a journey. */\n async createStep(\n wid: string,\n journeyId: number,\n data: JourneyStepFormData\n ): Promise<JourneyStep> {\n return this.fetch<JourneyStep>(`w/${wid}/journeys/${journeyId}/steps`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update an existing step. */\n async updateStep(\n wid: string,\n journeyId: number,\n stepUuid: string,\n data: Partial<JourneyStepFormData>\n ): Promise<JourneyStep> {\n return this.fetch<JourneyStep>(`w/${wid}/journeys/${journeyId}/steps/${stepUuid}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Archive a step (soft delete). */\n async archiveStep(\n wid: string,\n journeyId: number,\n stepUuid: string\n ): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/journeys/${journeyId}/steps/${stepUuid}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Unarchive a step and backfill active enrollments. Idempotent —\n * repeated calls are harmless. The response's\n * `backfilledEnrollmentCount` reports how many active enrollments\n * received a new step row; a root step may become eligible for all of\n * them on the next journey sweep.\n */\n async unarchiveStep(wid: string, journeyId: number, stepUuid: string): Promise<JourneyStep> {\n return this.fetch<JourneyStep>(`w/${wid}/journeys/${journeyId}/steps/${stepUuid}/unarchive`, {\n method: 'PATCH',\n });\n }\n\n /** Create a connection (DAG edge) between two steps. */\n async createConnection(\n wid: string,\n journeyId: number,\n data: JourneyStepConnectionFormData\n ): Promise<JourneyStepConnection> {\n return this.fetch<JourneyStepConnection>(`w/${wid}/journeys/${journeyId}/connections`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update a connection (edge) by ID. */\n async updateConnection(\n wid: string,\n journeyId: number,\n connectionId: number,\n data: Partial<JourneyStepConnectionFormData>\n ): Promise<JourneyStepConnection> {\n return this.fetch<JourneyStepConnection>(\n `w/${wid}/journeys/${journeyId}/connections/${connectionId}`,\n { method: 'PUT', body: JSON.stringify(data) }\n );\n }\n\n /** Delete a connection by ID. */\n async deleteConnection(\n wid: string,\n journeyId: number,\n connectionId: number\n ): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(\n `w/${wid}/journeys/${journeyId}/connections/${connectionId}`,\n { method: 'DELETE' }\n );\n }\n\n /** Create a goal for a journey. */\n async createGoal(\n wid: string,\n journeyId: number,\n data: JourneyGoalFormData\n ): Promise<JourneyGoal> {\n return this.fetch<JourneyGoal>(`w/${wid}/journeys/${journeyId}/goals`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update an existing goal. */\n async updateGoal(\n wid: string,\n journeyId: number,\n goalUuid: string,\n data: Partial<JourneyGoalFormData>\n ): Promise<JourneyGoal> {\n return this.fetch<JourneyGoal>(`w/${wid}/journeys/${journeyId}/goals/${goalUuid}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Delete a goal. */\n async deleteGoal(wid: string, journeyId: number, goalUuid: string): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/journeys/${journeyId}/goals/${goalUuid}`, {\n method: 'DELETE',\n });\n }\n\n /** List enrolled members for a journey (paginated). */\n async getJourneyMembers(\n wid: string,\n journeyId: number,\n params?: {\n page?: number;\n pageSize?: number;\n search?: string;\n /** MemberJourneyStatus filter (e.g., 'active', 'completed'). */\n status?: string;\n /** ISO 8601 timestamp — only enrollments on/after this time. */\n enrolledAfter?: string;\n /** ISO 8601 timestamp — only enrollments on/before this time. */\n enrolledBefore?: string;\n /** Only enrollments whose current step is this JourneyStep id. */\n currentTaskId?: number;\n /**\n * Only enrollments that have a Journey Health runtime breadcrumb\n * for this edge. The backend validates that the edge belongs to\n * the journey.\n */\n runtimeFailureEdgeId?: number;\n }\n ): Promise<PaginatedResponse<MemberJourney>> {\n const qs = new URLSearchParams();\n if (params?.page) qs.set('page', String(params.page));\n if (params?.pageSize) qs.set('pageSize', String(params.pageSize));\n if (params?.search) qs.set('search', params.search);\n if (params?.status) qs.set('status', params.status);\n if (params?.enrolledAfter) qs.set('enrolledAfter', params.enrolledAfter);\n if (params?.enrolledBefore) qs.set('enrolledBefore', params.enrolledBefore);\n if (params?.currentTaskId !== undefined)\n qs.set('currentTaskId', String(params.currentTaskId));\n if (params?.runtimeFailureEdgeId !== undefined)\n qs.set('runtimeFailureEdgeId', String(params.runtimeFailureEdgeId));\n const query = qs.toString();\n return this.fetch<PaginatedResponse<MemberJourney>>(\n `w/${wid}/journeys/${journeyId}/members${query ? `?${query}` : ''}`\n );\n }\n\n /** Enroll one or more members in a journey. */\n async enrollMembers(\n wid: string,\n journeyId: number,\n data: EnrollMemberFormData\n ): Promise<MemberJourney[]> {\n return this.fetch<MemberJourney[]>(`w/${wid}/journeys/${journeyId}/enroll`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Unenroll one or more members from a journey. */\n async unenrollMembers(\n wid: string,\n journeyId: number,\n data: UnenrollMemberFormData\n ): Promise<MemberJourney[]> {\n return this.fetch<MemberJourney[]>(`w/${wid}/journeys/${journeyId}/unenroll`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Re-enroll a canceled member back to enrolled status. */\n async reenrollMember(\n wid: string,\n journeyId: number,\n data: ReenrollMemberFormData\n ): Promise<MemberJourney> {\n return this.fetch<MemberJourney>(`w/${wid}/journeys/${journeyId}/reenroll`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Hard-delete a canceled enrollment so the member can be re-enrolled fresh. */\n async deleteEnrollment(wid: string, journeyId: number, memberId: number): Promise<void> {\n await this.fetch(`w/${wid}/journeys/${journeyId}/members/${memberId}`, {\n method: 'DELETE',\n });\n }\n\n /** Get all journey enrollments for a member. */\n async getMemberJourneys(wid: string, memberId: number): Promise<MemberJourney[]> {\n return this.fetch<MemberJourney[]>(`w/${wid}/journeys/by-member/${memberId}`);\n }\n\n /**\n * Status history for one enrollment — the per-member journey timeline.\n *\n * This is where a step that completed having emitted nothing shows up as\n * `zeroEmission: true` with its reason, instead of being indistinguishable\n * from a step that sent (GRA-7341). Newest first.\n *\n * PHI-safe: identifiers, closed status codes, operator-authored step names,\n * counts, and timestamps. `entry.reason` is populated only for rows the\n * server allowlists; every other row reports `reasonRedacted: true`.\n *\n * `zeroEmissionOnly` narrows the page to the dropped-send rows. Use it when\n * that is all you need: without it a busy enrollment can push every\n * zero-emission row off the first page, and a caller that renders only what\n * it loaded would report \"nothing was dropped\" — the exact failure this\n * endpoint exists to eliminate. `zeroEmissionCount` is unaffected by the\n * filter and always counts the whole enrollment.\n */\n async getEnrollmentStatusLog(\n wid: string,\n journeyId: number,\n memberJourneyId: number,\n params: { page?: number; pageSize?: number; zeroEmissionOnly?: boolean } = {}\n ): Promise<JourneyStatusLogResponse> {\n const qs = new URLSearchParams();\n // `!== undefined`, not truthiness: `page: 0` and `pageSize: 0` are\n // invalid and must reach the server to be rejected, not be silently\n // swallowed into \"caller passed nothing\".\n if (params.page !== undefined) qs.set('page', String(params.page));\n if (params.pageSize !== undefined) qs.set('pageSize', String(params.pageSize));\n if (params.zeroEmissionOnly !== undefined) {\n qs.set('zeroEmissionOnly', String(params.zeroEmissionOnly));\n }\n const query = qs.toString();\n return this.fetch<JourneyStatusLogResponse>(\n `w/${wid}/journeys/${journeyId}/enrollments/${memberJourneyId}/status-log` +\n (query ? `?${query}` : '')\n );\n }\n\n /** List members currently or historically associated with one journey step. */\n async getStepMembers(\n wid: string,\n journeyId: number,\n stepUuid: string,\n params: {\n status?: string;\n mode?: 'current' | 'all';\n page?: number;\n pageSize?: number;\n } = {}\n ): Promise<PaginatedResponse<StepMember>> {\n const qs = new URLSearchParams();\n if (params.status) qs.set('status', params.status);\n if (params.mode) qs.set('mode', params.mode);\n if (params.page) qs.set('page', String(params.page));\n if (params.pageSize) qs.set('pageSize', String(params.pageSize));\n const query = qs.toString();\n return this.fetch<PaginatedResponse<StepMember>>(\n `w/${wid}/journeys/${journeyId}/steps/${stepUuid}/members${query ? `?${query}` : ''}`\n );\n }\n\n /** Get member counts by status for each journey step. */\n async getStepMemberCounts(wid: string, journeyId: number): Promise<StepMemberCount[]> {\n return this.fetch<StepMemberCount[]>(`w/${wid}/journeys/${journeyId}/step-member-counts`);\n }\n\n /** Advance a journey step in the current execution context. */\n async advanceStep(\n wid: string,\n journeyId: number,\n stepUuid: string,\n data: AdvanceStepFormData = {}\n ): Promise<MemberJourneyStep> {\n return this.fetch<MemberJourneyStep>(\n `w/${wid}/journeys/${journeyId}/steps/${stepUuid}/advance`,\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n\n /** Skip a journey step in the current execution context. */\n async skipStep(\n wid: string,\n journeyId: number,\n stepUuid: string,\n data: SkipStepFormData = {}\n ): Promise<MemberJourneyStep> {\n return this.fetch<MemberJourneyStep>(\n `w/${wid}/journeys/${journeyId}/steps/${stepUuid}/skip`,\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n\n /**\n * Dry-run heartbeat CEL evaluation for an enrolled member.\n *\n * Evaluates all PENDING steps exactly as the heartbeat would, but writes no\n * state changes. Returns step-by-step results for debugging stuck members.\n */\n async testRunJourney(\n wid: string,\n journeyId: number,\n memberId: number\n ): Promise<JourneyTestRunResponse> {\n return this.fetch<JourneyTestRunResponse>(\n `w/${wid}/journeys/${journeyId}/members/${memberId}/test-run`,\n { method: 'POST' }\n );\n }\n\n // ===== JOURNEY NOTES =====\n\n /** List notes for a journey. */\n async getJourneyNotes(wid: string, journeyId: number): Promise<JourneyNote[]> {\n return this.fetch<JourneyNote[]>(`w/${wid}/journeys/${journeyId}/notes`);\n }\n\n /** Create a note on a journey. */\n async createJourneyNote(\n wid: string,\n journeyId: number,\n data: JourneyNoteFormData\n ): Promise<JourneyNote> {\n return this.fetch<JourneyNote>(`w/${wid}/journeys/${journeyId}/notes`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update an existing journey note. */\n async updateJourneyNote(\n wid: string,\n journeyId: number,\n noteId: number,\n data: Partial<JourneyNoteFormData>\n ): Promise<JourneyNote> {\n return this.fetch<JourneyNote>(`w/${wid}/journeys/${journeyId}/notes/${noteId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Delete a journey note. */\n async deleteJourneyNote(wid: string, journeyId: number, noteId: number): Promise<void> {\n return this.fetch<void>(`w/${wid}/journeys/${journeyId}/notes/${noteId}`, {\n method: 'DELETE',\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport type { WorkflowFormData } from '../types';\nimport type {\n WorkflowTemplate,\n CreateWorkflowFromTemplateFormData,\n WorkflowActivity,\n TaskAssignmentStats,\n TaskChatsListResponse,\n WorkflowConfigValidationResponse,\n WorkflowRouteDryRunResponse,\n WorkflowContributor,\n CreateWorkflowContributorRequest,\n UpdateWorkflowContributorRequest,\n WorkflowDetail,\n WorkflowRevision,\n WorkflowListPageResponse,\n WorkflowRevisionSummary,\n WorkflowRevisionListResponse,\n WorkflowRevisionDiffResponse,\n PublishWorkflowRevisionRequest,\n ActivateWorkflowRevisionRequest,\n UpdateWorkflowRevisionMetadataRequest,\n EditRevisionAsDraftRequest,\n} from '../types/task-types';\nimport type { SortOrder } from '../types/core-types';\nimport type { WorkflowSortField } from '../types/sort-types';\nimport type { GetWorkflowFeedbackOptions, WorkflowFeedbackListResponse } from '../types/chat-types';\nimport type {\n WorkspaceBuilderInfo,\n BuildWorkspaceResponse,\n ValidateWorkflowNameResponse,\n} from '../types/workspace-builder-types';\nimport type {\n OpeningTurnConversionReportResponse,\n OpeningTurnConversionResponse,\n} from '../types/generated/workflow_opening_conversion';\n\nexport type OpeningTurnConversionReport = OpeningTurnConversionReportResponse;\nexport type OpeningTurnConversionResult = OpeningTurnConversionResponse;\n\nexport class WorkflowsApi extends BaseApiClient {\n /** List all workflows in a workspace, optionally including archived ones. */\n async getWorkflows(\n wid: string,\n options: {\n archived?: boolean;\n page?: number;\n pageSize?: number;\n sortBy?: WorkflowSortField;\n sortOrder?: SortOrder;\n search?: string;\n } = {}\n ): Promise<WorkflowListPageResponse> {\n const params = new URLSearchParams();\n if (options.archived) params.set('archived', 'true');\n if (options.page) params.set('page', String(options.page));\n if (options.pageSize) params.set('pageSize', String(options.pageSize));\n if (options.sortBy) params.set('sortBy', options.sortBy);\n if (options.sortOrder) params.set('sortOrder', options.sortOrder);\n if (options.search) params.set('search', options.search);\n const qs = params.toString();\n return this.fetch<WorkflowListPageResponse>(`w/${wid}/workflows${qs ? `?${qs}` : ''}`);\n }\n\n /** Get a single workflow by ID (root + draft + active-revision summary). */\n async getWorkflow(wid: string, id: number | string): Promise<WorkflowDetail> {\n return this.fetch<WorkflowDetail>(`w/${wid}/workflows/${id}`);\n }\n\n async getWorkflowOpeningTurnConversionReport(\n wid: string,\n id: number | string\n ): Promise<OpeningTurnConversionReport> {\n return this.fetch(`w/${wid}/workflows/${id}/opening-turn/conversion-report`);\n }\n\n async convertWorkflowStartTaskOpeningMessage(\n wid: string,\n id: number | string,\n expectedRuleId: number\n ): Promise<OpeningTurnConversionResult> {\n return this.fetch(`w/${wid}/workflows/${id}/opening-turn/convert-start-task-message`, {\n method: 'POST',\n body: JSON.stringify({ expectedRuleId }),\n });\n }\n\n /** Get activity metrics for a single workflow. */\n async getWorkflowActivity(\n wid: string,\n id: number,\n options?: { days?: number }\n ): Promise<WorkflowActivity> {\n const params = options?.days ? `?days=${options.days}` : '';\n return this.fetch<WorkflowActivity>(`w/${wid}/workflows/${id}/activity${params}`);\n }\n\n /** Get activity metrics for multiple workflows in a single request. */\n async getWorkflowsActivityBatch(\n wid: string,\n workflowIds: number[],\n options?: { days?: number }\n ): Promise<Record<string, WorkflowActivity>> {\n const params = new URLSearchParams();\n params.set('workflow_ids', workflowIds.join(','));\n if (options?.days) params.set('days', String(options.days));\n return this.fetch<Record<string, WorkflowActivity>>(\n `w/${wid}/workflows/activity/batch?${params.toString()}`\n );\n }\n\n /**\n * Get the Mermaid diagram representation of a workflow.\n *\n * By default only active tasks are rendered. Pass `includeArchived: true`\n * to also render archived tasks (distinctly styled). `taskCount` is always\n * the total (active + archived); `archivedTaskCount` breaks out the archived\n * portion so the active count can be derived.\n */\n async getWorkflowDiagram(\n wid: string,\n id: number,\n options: { includeArchived?: boolean } = {}\n ): Promise<{\n mermaid: string;\n taskCount: number;\n archivedTaskCount: number;\n includeArchived: boolean;\n }> {\n const query = options.includeArchived ? '?include_archived=true' : '';\n return this.fetch(`w/${wid}/workflows/${id}/diagram${query}`);\n }\n\n /**\n * Get workflow thumbnail URL.\n * For cross-domain setups, returns a same-origin proxy URL to ensure cookies are sent.\n * For same-origin setups, returns the direct API URL.\n */\n getWorkflowThumbnailUrl(wid: string, id: number): string {\n if (this.isCrossDomain) {\n // Use same-origin proxy route to ensure cookies are sent with the request\n return `/api/v2/w/${wid}/workflows/${id}/thumbnail`;\n }\n // Same-origin: use direct API URL\n return `${this.baseUrl}/api/v2/w/${wid}/workflows/${id}/thumbnail`;\n }\n\n /** Create a new workflow in a workspace. */\n async createWorkflow(wid: string, workflow: WorkflowFormData): Promise<WorkflowDetail> {\n return this.fetch<WorkflowDetail>(`w/${wid}/workflows`, {\n method: 'POST',\n body: JSON.stringify(workflow),\n });\n }\n\n /** Update an existing workflow's draft revision. */\n async updateWorkflow(\n wid: string,\n id: number,\n workflow: Partial<WorkflowFormData>\n ): Promise<WorkflowDetail> {\n return this.fetch<WorkflowDetail>(`w/${wid}/workflows/${id}`, {\n method: 'PUT',\n body: JSON.stringify(workflow),\n });\n }\n\n /** Preview the impact of deleting a workflow, including affected tasks and assignments. */\n async getWorkflowDeletionPreview(\n wid: string,\n id: number\n ): Promise<{\n items: Array<{ id: number; name: string; description: string | null }>;\n total: number;\n hasAssignments: boolean;\n }> {\n return this.fetch(`w/${wid}/workflows/${id}/deletion-preview`);\n }\n\n /** Delete a workflow, optionally cascading to delete its tasks. */\n async deleteWorkflow(\n wid: string,\n id: number,\n cascade: boolean = false\n ): Promise<{ status: string; deletedTaskCount: number }> {\n const url = cascade ? `w/${wid}/workflows/${id}?cascade=true` : `w/${wid}/workflows/${id}`;\n return this.fetch(url, {\n method: 'DELETE',\n });\n }\n\n /** Archive a workflow. */\n async archiveWorkflow(wid: string, id: number): Promise<{ status: string }> {\n return this.fetch(`w/${wid}/workflows/${id}/archive`, {\n method: 'POST',\n body: JSON.stringify({}),\n });\n }\n\n /** Unarchive a previously archived workflow. */\n async unarchiveWorkflow(wid: string, id: number): Promise<{ status: string }> {\n return this.fetch(`w/${wid}/workflows/${id}/unarchive`, {\n method: 'POST',\n body: JSON.stringify({}),\n });\n }\n\n /** Clone a workflow with a new name. */\n async cloneWorkflow(wid: string, id: number, data: { name: string }): Promise<WorkflowDetail> {\n return this.fetch<WorkflowDetail>(`w/${wid}/workflows/${id}/clone`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** List available workflow templates. */\n async getWorkflowTemplates(wid: string): Promise<WorkflowTemplate[]> {\n return this.fetch<WorkflowTemplate[]>(`w/${wid}/workflows/templates`);\n }\n\n /** Create a new workflow from a template. */\n async createWorkflowFromTemplate(\n wid: string,\n templateUuid: string,\n data: CreateWorkflowFromTemplateFormData\n ): Promise<WorkflowDetail> {\n return this.fetch<WorkflowDetail>(\n `w/${wid}/workflows/templates/${templateUuid}/create-workflow`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /** Get task assignment statistics for a workflow within an optional date range. */\n async getWorkflowTaskAssignmentStats(\n wid: string,\n id: number,\n fromDate?: string,\n toDate?: string,\n workflowRevisionId?: number\n ): Promise<Record<number, TaskAssignmentStats>> {\n const params = new URLSearchParams();\n if (fromDate) params.append('from_date', fromDate);\n if (toDate) params.append('to_date', toDate);\n if (workflowRevisionId) params.append('workflowRevisionId', String(workflowRevisionId));\n\n return this.fetch<Record<number, TaskAssignmentStats>>(\n `w/${wid}/workflows/${id}/task-assignment-stats?${params.toString()}`\n );\n }\n\n /** List chats for a specific task within a workflow. */\n async getTaskChats(\n wid: string,\n workflowId: number,\n taskId: number,\n fromDate?: string,\n toDate?: string,\n limit: number = 100,\n offset: number = 0\n ): Promise<TaskChatsListResponse> {\n const params = new URLSearchParams();\n if (fromDate) params.append('from_date', fromDate);\n if (toDate) params.append('to_date', toDate);\n params.append('limit', limit.toString());\n params.append('offset', offset.toString());\n\n return this.fetch<TaskChatsListResponse>(\n `w/${wid}/workflows/${workflowId}/tasks/${taskId}/chats?${params.toString()}`\n );\n }\n\n async getWorkflowConfigValidation(\n wid: string,\n workflowId: number\n ): Promise<WorkflowConfigValidationResponse> {\n return this.fetch<WorkflowConfigValidationResponse>(\n `w/${wid}/workflows/${workflowId}/validate-config`\n );\n }\n\n /**\n * Replay automatic routing for a Chat without performing the transition.\n *\n * Operator tool: returns a PHI-safe trace describing what the\n * automatic-edge evaluator would do at the next turn. Never returns\n * raw CEL, Form values, Member values, Chat content, or raw\n * exception strings — only IDs, status labels, and the exception\n * class name when the evaluator raises.\n *\n * Requires Workflow edit permission.\n */\n async getWorkflowRouteDryRun(\n wid: string,\n workflowId: number,\n args: {\n chatId: number;\n currentTaskId?: number;\n currentAssignmentTaskId?: number;\n }\n ): Promise<WorkflowRouteDryRunResponse> {\n const params = new URLSearchParams();\n params.set('chat_id', String(args.chatId));\n if (args.currentTaskId !== undefined) {\n params.set('current_task_id', String(args.currentTaskId));\n }\n if (args.currentAssignmentTaskId !== undefined) {\n params.set('current_assignment_task_id', String(args.currentAssignmentTaskId));\n }\n return this.fetch<WorkflowRouteDryRunResponse>(\n `w/${wid}/workflows/${workflowId}/route-dry-run?${params.toString()}`\n );\n }\n\n // Workflow Feedback API\n\n /**\n * List chat feedback for a workflow (thumbs ratings + explicit/extracted rows).\n * First consumer of the workspace-plane chat_feedback table.\n */\n async getWorkflowFeedback(\n wid: string,\n workflowId: number,\n options: GetWorkflowFeedbackOptions = {}\n ): Promise<WorkflowFeedbackListResponse> {\n const params = new URLSearchParams();\n if (options.page != null) params.set('page', String(options.page));\n if (options.pageSize != null) params.set('pageSize', String(options.pageSize));\n if (options.source) params.set('source', options.source);\n if (options.rating) params.set('rating', options.rating);\n if (options.authorKind) params.set('authorKind', options.authorKind);\n if (options.includeTest != null) params.set('includeTest', String(options.includeTest));\n const qs = params.toString();\n return this.fetch<WorkflowFeedbackListResponse>(\n `w/${wid}/workflows/${workflowId}/feedback${qs ? `?${qs}` : ''}`\n );\n }\n\n // Workflow Contributors API\n\n /** List all contributors for a workflow. */\n async getWorkflowContributors(wid: string, workflowId: number): Promise<WorkflowContributor[]> {\n return this.fetch<WorkflowContributor[]>(`w/${wid}/workflows/${workflowId}/contributors`);\n }\n\n /** Add a contributor to a workflow. */\n async createWorkflowContributor(\n wid: string,\n workflowId: number,\n data: CreateWorkflowContributorRequest\n ): Promise<WorkflowContributor> {\n return this.fetch<WorkflowContributor>(`w/${wid}/workflows/${workflowId}/contributors`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update a workflow contributor's settings. */\n async updateWorkflowContributor(\n wid: string,\n workflowId: number,\n contributorId: number,\n data: UpdateWorkflowContributorRequest\n ): Promise<WorkflowContributor> {\n return this.fetch<WorkflowContributor>(\n `w/${wid}/workflows/${workflowId}/contributors/${contributorId}`,\n {\n method: 'PATCH',\n body: JSON.stringify(data),\n }\n );\n }\n\n /** Remove a contributor from a workflow. */\n async deleteWorkflowContributor(\n wid: string,\n workflowId: number,\n contributorId: number\n ): Promise<{ success: boolean }> {\n return this.fetch<{ success: boolean }>(\n `w/${wid}/workflows/${workflowId}/contributors/${contributorId}`,\n {\n method: 'DELETE',\n }\n );\n }\n\n // Workspace Builders API\n\n /**\n * Get list of available workspace builders.\n */\n async getWorkspaceBuilders(wid: string): Promise<WorkspaceBuilderInfo[]> {\n const response = await this.fetch<{ items: WorkspaceBuilderInfo[] }>(`w/${wid}/builders`);\n return response.items;\n }\n\n /**\n * Get information about a specific workspace builder.\n */\n async getWorkspaceBuilder(wid: string, builderId: string): Promise<WorkspaceBuilderInfo> {\n return this.fetch<WorkspaceBuilderInfo>(`w/${wid}/builders/${builderId}`);\n }\n\n /**\n * Build and import a workflow from a builder template in one step.\n * Returns the created workflow ID and UUID.\n */\n async buildWorkspace(\n wid: string,\n builderId: string,\n params: Record<string, unknown>\n ): Promise<BuildWorkspaceResponse> {\n return this.fetch<BuildWorkspaceResponse>(`w/${wid}/builders/build`, {\n method: 'POST',\n body: JSON.stringify({ builderId, params }),\n });\n }\n\n /**\n * Validate if a workflow name is available.\n * Returns availability and a suggested alternative if taken.\n */\n async validateWorkflowName(wid: string, name: string): Promise<ValidateWorkflowNameResponse> {\n return this.fetch<ValidateWorkflowNameResponse>(`w/${wid}/builders/validate-name`, {\n method: 'POST',\n body: JSON.stringify({ name }),\n });\n }\n\n /** List relational revisions for a workflow. */\n async getWorkflowRevisions(\n wid: string,\n workflowId: number | string\n ): Promise<WorkflowRevisionListResponse> {\n return this.fetch<WorkflowRevisionListResponse>(`w/${wid}/workflows/${workflowId}/revisions`);\n }\n\n /** Get full workflow details for one relational workflow revision. */\n async getWorkflowRevision(\n wid: string,\n workflowId: number | string,\n revisionId: number | string\n ): Promise<WorkflowRevision> {\n return this.fetch<WorkflowRevision>(\n `w/${wid}/workflows/${workflowId}/revisions/${revisionId}`\n );\n }\n\n /** Freeze the workflow's draft as a published revision and clone a fresh draft.\n *\n * By default the just-published revision becomes the active revision —\n * live traffic flips to it immediately. Pass `setActive: false` to\n * publish without flipping live traffic (advanced flow).\n */\n async publishWorkflowRevision(\n wid: string,\n workflowId: number | string,\n data: PublishWorkflowRevisionRequest = {}\n ): Promise<WorkflowRevisionSummary> {\n return this.fetch<WorkflowRevisionSummary>(`w/${wid}/workflows/${workflowId}/publish`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Point the workflow's active pointer at a chosen revision (pointer flip only).\n *\n * The target may be any of the workflow's published revisions.\n * Activating the draft requires `allowDraft: true` and a UI warning\n * confirmation.\n */\n async activateWorkflowRevision(\n wid: string,\n workflowId: number | string,\n revisionId: number | string,\n data: ActivateWorkflowRevisionRequest = {}\n ): Promise<WorkflowRevisionSummary> {\n return this.fetch<WorkflowRevisionSummary>(\n `w/${wid}/workflows/${workflowId}/revisions/${revisionId}/activate`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /** Update a revision's curation metadata (label + publish notes).\n *\n * Applies to both the draft and published revisions; it is not a graph\n * change, so it never marks the draft dirty.\n */\n async updateWorkflowRevisionMetadata(\n wid: string,\n workflowId: number | string,\n revisionId: number | string,\n data: UpdateWorkflowRevisionMetadataRequest\n ): Promise<WorkflowRevisionSummary> {\n return this.fetch<WorkflowRevisionSummary>(\n `w/${wid}/workflows/${workflowId}/revisions/${revisionId}`,\n {\n method: 'PATCH',\n body: JSON.stringify(data),\n }\n );\n }\n\n /** Compare two revisions of the same workflow.\n *\n * `against` is a revision id or UUID; when omitted the diff compares the\n * named revision against the workflow's draft. Tasks are matched by\n * stable lineage, so a rename reads as a changed `name` field.\n */\n async diffWorkflowRevisions(\n wid: string,\n workflowId: number | string,\n revisionId: number | string,\n against?: number | string\n ): Promise<WorkflowRevisionDiffResponse> {\n const qs = against !== undefined ? `?against=${encodeURIComponent(String(against))}` : '';\n return this.fetch<WorkflowRevisionDiffResponse>(\n `w/${wid}/workflows/${workflowId}/revisions/${revisionId}/diff${qs}`\n );\n }\n\n /** Branch a published revision into the workflow's draft (\"edit this\n * revision\"): the draft becomes a fresh clone of the named published\n * revision. Pass `discardDraftChanges` to replace a dirty draft.\n */\n async editWorkflowRevisionAsDraft(\n wid: string,\n workflowId: number | string,\n revisionId: number | string,\n data: EditRevisionAsDraftRequest = {}\n ): Promise<WorkflowRevisionSummary> {\n return this.fetch<WorkflowRevisionSummary>(\n `w/${wid}/workflows/${workflowId}/revisions/${revisionId}/edit`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport type { WorkflowNote, WorkflowNoteFormData } from '../types/task-types';\n\nexport interface WorkflowNotesQuery {\n /** Pin notes to this revision of the path's workflow root. */\n workflowRevisionId?: number;\n}\n\nfunction notesPath(\n wid: string,\n workflowId: number,\n noteId?: number,\n query?: WorkflowNotesQuery\n): string {\n const base =\n noteId == null\n ? `w/${wid}/workflows/${workflowId}/notes`\n : `w/${wid}/workflows/${workflowId}/notes/${noteId}`;\n if (query?.workflowRevisionId == null) return base;\n const params = new URLSearchParams({\n workflowRevisionId: String(query.workflowRevisionId),\n });\n return `${base}?${params.toString()}`;\n}\n\nexport class WorkflowNotesApi extends BaseApiClient {\n /** List notes for a workflow root (draft unless `workflowRevisionId` is set). */\n async getWorkflowNotes(\n wid: string,\n workflowId: number,\n query?: WorkflowNotesQuery\n ): Promise<WorkflowNote[]> {\n return this.fetch<WorkflowNote[]>(notesPath(wid, workflowId, undefined, query));\n }\n\n /** Create a new note on a workflow's draft (or a pinned draft revision). */\n async createWorkflowNote(\n wid: string,\n workflowId: number,\n data: WorkflowNoteFormData,\n query?: WorkflowNotesQuery\n ): Promise<WorkflowNote> {\n return this.fetch<WorkflowNote>(notesPath(wid, workflowId, undefined, query), {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update an existing workflow note with partial data. */\n async updateWorkflowNote(\n wid: string,\n workflowId: number,\n noteId: number,\n data: Partial<WorkflowNoteFormData>,\n query?: WorkflowNotesQuery\n ): Promise<WorkflowNote> {\n return this.fetch<WorkflowNote>(notesPath(wid, workflowId, noteId, query), {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Delete a workflow note by ID. */\n async deleteWorkflowNote(\n wid: string,\n workflowId: number,\n noteId: number,\n query?: WorkflowNotesQuery\n ): Promise<void> {\n return this.fetch<void>(notesPath(wid, workflowId, noteId, query), {\n method: 'DELETE',\n });\n }\n}\n","// Core shared types that are used across multiple domains in the application\n\n// Generic pagination interface\nexport interface PaginatedResponse<T> {\n items: T[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n}\n\n// Cursor-based pagination interface\nexport interface CursorPaginatedResponse<T> {\n items: T[];\n nextCursor: string | null;\n hasMore: boolean;\n pageSize: number;\n}\n\n// Basic sort order type\nexport type SortOrder = 'asc' | 'desc';\n\n// Access level enum for general access control\nexport enum AccessLevel {\n PRIVATE = 'private',\n PUBLIC = 'public',\n WORKSPACE = 'workspace',\n}\n\n// Permission constants - bitwise flags\nexport const PERMISSION_NONE = 0; // 0000 0000 - No permissions\nexport const PERMISSION_USE = 1; // 0000 0001 - Can use/read the object\nexport const PERMISSION_EDIT = 2; // 0000 0010 - Can edit/modify the object\nexport const PERMISSION_CREATE = 4; // 0000 0100 - Can create new entries\n/** Allows listing or browsing objects subject to their existing access rules. */\nexport const PERMISSION_LIST = 8; // 0000 1000\nexport const PERMISSION_ADMIN = 16; // 0001 0000 - Admin-level access\nexport const PERMISSION_VERIFY = 32; // 0010 0000 - Can verify record validity without seeing contents\nexport const PERMISSION_GEOLOCATE = 128; // 1000 0000 - Can search records by geographic distance\n/** Allows listing all records regardless of member access; distinct from PERMISSION_LIST. */\nexport const PERMISSION_LIST_ALL = 256; // 1 0000 0000\nexport const PERMISSION_DELETE = 512; // 10 0000 0000 - Can delete records\n\n// Permission flags interface\nexport interface ObjectPermissionFlags {\n use: boolean;\n edit: boolean;\n create: boolean;\n list: boolean;\n verify: boolean;\n geolocate: boolean;\n listAll: boolean;\n delete: boolean;\n}\n\n// Utility functions for permission handling\nexport function decodePermissions(accessMode: number): ObjectPermissionFlags {\n return {\n use: (accessMode & PERMISSION_USE) !== 0,\n edit: (accessMode & PERMISSION_EDIT) !== 0,\n create: (accessMode & PERMISSION_CREATE) !== 0,\n list: (accessMode & PERMISSION_LIST) !== 0,\n verify: (accessMode & PERMISSION_VERIFY) !== 0,\n geolocate: (accessMode & PERMISSION_GEOLOCATE) !== 0,\n listAll: (accessMode & PERMISSION_LIST_ALL) !== 0,\n delete: (accessMode & PERMISSION_DELETE) !== 0,\n };\n}\n\nexport function encodePermissions(permissions: ObjectPermissionFlags): number {\n let accessMode = PERMISSION_NONE;\n if (permissions.use) accessMode |= PERMISSION_USE;\n if (permissions.edit) accessMode |= PERMISSION_EDIT;\n if (permissions.create) accessMode |= PERMISSION_CREATE;\n if (permissions.list) accessMode |= PERMISSION_LIST;\n if (permissions.verify) accessMode |= PERMISSION_VERIFY;\n if (permissions.geolocate) accessMode |= PERMISSION_GEOLOCATE;\n if (permissions.listAll) accessMode |= PERMISSION_LIST_ALL;\n if (permissions.delete) accessMode |= PERMISSION_DELETE;\n return accessMode;\n}\n\n// Individual permission type for type safety\nexport type ObjectPermission =\n 'use' | 'edit' | 'create' | 'list' | 'verify' | 'geolocate' | 'listAll' | 'delete';\n\n/**\n * Permission scopes for workspace access control.\n * Maps to lib/context/scopes.py - keep in sync.\n *\n * Naming convention: NAMESPACE_ACTION\n * Actions: READ, WRITE, ADMIN\n */\nexport enum Scope {\n // Workspace\n WORKSPACE_READ = 'workspace:read',\n WORKSPACE_WRITE = 'workspace:write',\n WORKSPACE_ADMIN = 'workspace:admin',\n\n // Members\n MEMBERS_READ = 'members:read',\n MEMBERS_WRITE = 'members:write',\n MEMBERS_ADMIN = 'members:admin',\n\n // Member Roles\n MEMBER_ROLES_READ = 'member_roles:read',\n MEMBER_ROLES_WRITE = 'member_roles:write',\n MEMBER_ROLES_ADMIN = 'member_roles:admin',\n\n // Chat\n CHATS_READ = 'chats:read',\n CHATS_WRITE = 'chats:write',\n CHATS_ADMIN = 'chats:admin',\n\n // Direct Messages\n DIRECT_MESSAGES_READ = 'dm:read',\n DIRECT_MESSAGES_WRITE = 'dm:write',\n DIRECT_MESSAGES_ADMIN = 'dm:admin',\n\n // Journey\n JOURNEYS_READ = 'journeys:read',\n JOURNEYS_WRITE = 'journeys:write',\n JOURNEYS_ADMIN = 'journeys:admin',\n\n // Experiments\n EXPERIMENTS_READ = 'experiments:read',\n EXPERIMENTS_WRITE = 'experiments:write',\n EXPERIMENTS_ADMIN = 'experiments:admin',\n\n // Workflow\n WORKFLOWS_READ = 'workflows:read',\n WORKFLOWS_WRITE = 'workflows:write',\n WORKFLOWS_ADMIN = 'workflows:admin',\n\n // Assignment\n ASSIGNMENTS_READ = 'assignments:read',\n ASSIGNMENTS_WRITE = 'assignments:write',\n ASSIGNMENTS_ADMIN = 'assignments:admin',\n\n // Automation\n AUTOMATIONS_READ = 'automations:read',\n AUTOMATIONS_WRITE = 'automations:write',\n AUTOMATIONS_ADMIN = 'automations:admin',\n\n // Data Types\n DATATYPES_READ = 'datatypes:read',\n DATATYPES_WRITE = 'datatypes:write',\n DATATYPES_ADMIN = 'datatypes:admin',\n\n // Records (Data instances)\n RECORDS_READ = 'records:read',\n RECORDS_WRITE = 'records:write',\n RECORDS_ADMIN = 'records:admin',\n\n // Files\n FILES_READ = 'files:read',\n FILES_WRITE = 'files:write',\n FILES_ADMIN = 'files:admin',\n\n // Companion devices\n DEVICES_READ = 'devices:read',\n DEVICES_WRITE = 'devices:write',\n DEVICES_ADMIN = 'devices:admin',\n\n // Sites\n SITES_READ = 'sites:read',\n SITES_WRITE = 'sites:write',\n SITES_ADMIN = 'sites:admin',\n\n // Agents\n AGENTS_READ = 'agents:read',\n AGENTS_WRITE = 'agents:write',\n AGENTS_ADMIN = 'agents:admin',\n\n // Calendar\n CALENDARS_READ = 'calendars:read',\n CALENDARS_WRITE = 'calendars:write',\n CALENDARS_ADMIN = 'calendars:admin',\n\n // Inbox\n INBOXES_READ = 'inboxes:read',\n INBOXES_WRITE = 'inboxes:write',\n INBOXES_ADMIN = 'inboxes:admin',\n\n // Phone\n PHONES_READ = 'phones:read',\n PHONES_WRITE = 'phones:write',\n PHONES_ADMIN = 'phones:admin',\n\n // Webhooks\n WEBHOOKS_READ = 'webhooks:read',\n WEBHOOKS_WRITE = 'webhooks:write',\n WEBHOOKS_ADMIN = 'webhooks:admin',\n WEBHOOKS_RAW = 'webhooks:raw', // Access to raw webhook payloads\n\n // Apps\n APPS_READ = 'apps:read',\n APPS_WRITE = 'apps:write',\n APPS_ADMIN = 'apps:admin',\n\n // Labels\n LABELS_READ = 'labels:read',\n /** @deprecated Use parent resource write scope (MEMBERS_WRITE, CHATS_WRITE, FILES_WRITE) */\n LABELS_WRITE = 'labels:write',\n\n // Analytics\n ANALYTICS_READ = 'analytics:read',\n\n // Anonymous Form submissions (read-only)\n ANONYMOUS_SUBMISSIONS_READ = 'anonymous_submissions:read',\n\n // Operator\n OPERATOR_READ = 'operator:read',\n OPERATOR_WRITE = 'operator:write',\n\n // Export\n EXPORT_READ = 'export:read',\n EXPORT_WRITE = 'export:write',\n EXPORT_ADMIN = 'export:admin',\n\n // Organization\n ORG_INFO = 'org:info',\n ORG_READ = 'org:read',\n ORG_WRITE = 'org:write',\n ORG_ADMIN = 'org:admin',\n ORG_MANAGE_ADMINS = 'org:manage_admins',\n ORG_DELETE = 'org:delete', // Delete organization (owner only)\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: member\n */\n\nimport type { ImportContactConflictPolicy } from './member_import_contact_conflict';\n\n/**\n * Response model for agent configuration.\n */\nexport interface AgentConfigResponse {\n id: number;\n chatModelId: string;\n chatModelConfig?: AgentConfigResponseChatModelConfig;\n realtimeModelId?: string | null;\n realtimeModelConfig?: AgentConfigResponseRealtimeModelConfig;\n systemPrompt: string;\n maxDailyActions?: number | null;\n tools?: string[] | null;\n codeInterpreterEnabled?: boolean;\n webBrowserEnabled?: boolean;\n memoryConfig?: AgentMemoryConfig | null;\n presetDigest: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type AgentConfigResponseChatModelConfig = { [key: string]: unknown } | null;\n\nexport type AgentConfigResponseRealtimeModelConfig = { [key: string]: unknown } | null;\n\n/**\n * Memory strategies available to an Agent.\n */\nexport interface AgentMemoryConfig {\n enabled?: boolean;\n preferences?: boolean;\n semantic?: boolean;\n summaries?: boolean;\n episodic?: boolean;\n}\n\n/**\n * Response model for an agent (Member + agent config via JTI).\n *\n * Agents are first-class members that can communicate via DMs, email, SMS, and voice.\n * They have their own identity (name, description) and AI configuration (model, system prompt).\n */\nexport interface AgentResponse {\n id: number;\n uuid: string;\n name?: string | null;\n title?: string | null;\n description?: string | null;\n email?: string | null;\n phone?: string | null;\n externalId?: string | null;\n memberRoleId: number;\n memberRoleName?: string | null;\n memberType?: string;\n isArchived?: boolean;\n homeFolderId?: number | null;\n createdAt: string;\n updatedAt: string;\n labels?: MemberLabelResponse[];\n config: AgentConfigResponse;\n}\n\n/**\n * Summary of the anonymous member's interaction (usually a single call).\n */\nexport interface AnonymousInteractionResponse {\n chatId: number | null;\n chatTitle: string | null;\n chatSummary: string | null;\n callId: number | null;\n callStatus: string | null;\n callCreatedAt: string | null;\n callDurationSeconds: number | null;\n}\n\n/**\n * Response model for anonymous member resolution records.\n */\nexport interface AnonymousMemberResolutionResponse {\n id: number;\n anonymousMemberId: number | null;\n anonymousMemberName: string | null;\n identifierType: string;\n identifierValue: string;\n status: string;\n resolvedToMemberId: number | null;\n resolvedToMemberName: string | null;\n resolvedByMemberId: number | null;\n resolvedByMemberName: string | null;\n resolutionNotes: string | null;\n createdAt: string;\n resolvedAt: string | null;\n interaction: AnonymousInteractionResponse | null;\n}\n\n/**\n * Bulk create members request.\n */\nexport interface BulkCreateMembersRequest {\n /**\n * @minItems 1\n * @maxItems 1000\n */\n members: BulkMemberItem[];\n /** If true, update existing members matched by externalId/email/phone */\n upsert?: boolean;\n}\n\n/**\n * Bulk create members response.\n */\nexport interface BulkCreateMembersResponse {\n importedCount: number;\n totalCount: number;\n success: boolean;\n results: BulkMemberResult[];\n errors?: string[] | null;\n conflictedCount?: number;\n skippedCount?: number;\n}\n\n/**\n * Per-member input for bulk creation.\n */\nexport interface BulkMemberItem {\n email?: string | null;\n phone?: string | null;\n name?: string | null;\n description?: string | null;\n externalId?: string | null;\n memberRoleId?: number | null;\n labels?: string[] | null;\n notifySms?: boolean | null;\n notifyEmail?: boolean | null;\n notifyVoice?: boolean | null;\n notifyWhatsapp?: boolean | null;\n locale?: string | null;\n timezone?: string | null;\n conflictResolution?: ImportContactConflictPolicy;\n}\n\n/**\n * Per-member output for bulk creation.\n *\n * ``conflict`` and ``skipped`` are distinct from ``failed``: nothing was\n * written and the operator can act on the row (resubmit it edited, or with a\n * ``conflictResolution``). ``conflicts`` is populated only for ``conflict``.\n */\nexport interface BulkMemberResult {\n index: number;\n status: BulkMemberResultStatus;\n memberId?: number | null;\n externalId?: string | null;\n error?: string | null;\n conflicts?: ImportContactConflict[] | null;\n sharedContacts?: string[];\n}\n\nexport type BulkMemberResultStatus = typeof BulkMemberResultStatus[keyof typeof BulkMemberResultStatus];\n\n\nexport const BulkMemberResultStatus = {\n created: 'created',\n updated: 'updated',\n failed: 'failed',\n conflict: 'conflict',\n skipped: 'skipped',\n} as const;\n\n/**\n * One unmet requirement of a surface capability.\n *\n * ``subject`` says who can remediate it (workspace admin vs the member),\n * mirroring the ability-requirements finding shape.\n */\nexport interface CapabilityRequirementFinding {\n kind: CapabilityRequirementFindingKind;\n slug: string;\n subject: CapabilityRequirementFindingSubject;\n}\n\nexport type CapabilityRequirementFindingKind = typeof CapabilityRequirementFindingKind[keyof typeof CapabilityRequirementFindingKind];\n\n\nexport const CapabilityRequirementFindingKind = {\n feature: 'feature',\n member_scope: 'member_scope',\n} as const;\n\nexport type CapabilityRequirementFindingSubject = typeof CapabilityRequirementFindingSubject[keyof typeof CapabilityRequirementFindingSubject];\n\n\nexport const CapabilityRequirementFindingSubject = {\n org: 'org',\n workspace: 'workspace',\n member: 'member',\n} as const;\n\n/**\n * Resolved availability of one surface capability for one member.\n *\n * ``enabled`` is the full conjunction (feature available AND authorized).\n * ``missing`` enumerates the unmet requirements with their subjects so the\n * client can render the right affordance without re-deriving the gate.\n */\nexport interface CapabilityStatus {\n slug: string;\n enabled: boolean;\n missing: CapabilityRequirementFinding[];\n}\n\n/**\n * Request to create a member field.\n *\n * When serviceId is provided, the field is created as a managed field\n * owned by the given app connection. The key must match a managed field\n * definition declared by that connection.\n */\nexport interface CreateMemberFieldRequest {\n key: string;\n value: string;\n serviceId?: number | null;\n}\n\n/**\n * Create a new member filter (query-only).\n */\nexport interface CreateMemberFilterRequest {\n name: string;\n description?: string | null;\n pinned?: boolean | null;\n query?: CreateMemberFilterRequestQuery;\n}\n\nexport type CreateMemberFilterRequestQuery = { [key: string]: unknown } | null;\n\n/**\n * Response model for the create-signup endpoint.\n */\nexport interface CreateSignupResponse {\n token: string;\n account: SignupAccountResponse;\n member: SignupMemberResponse;\n wasCreated: boolean;\n warnings?: DataRecordFieldWarning[];\n}\n\n/**\n * Create a new workspace member.\n */\nexport interface CreateWorkspaceMemberRequest {\n email?: string | null;\n phone?: string | null;\n accountUuid?: string | null;\n name?: string | null;\n title?: string | null;\n description?: string | null;\n externalId?: string | null;\n dateOfBirth?: string | null;\n memberRoleId: number;\n notifySms?: boolean | null;\n notifyEmail?: boolean | null;\n notifyVoice?: boolean | null;\n notifyWhatsapp?: boolean | null;\n locale?: string | null;\n timezone?: string | null;\n labelIds?: number[] | null;\n memberType?: string | null;\n releaseContactFromMemberId?: number | null;\n tosAccepted?: boolean | null;\n accountEnabled?: boolean | null;\n isOrgOwner?: boolean | null;\n accountTosAccepted?: boolean | null;\n}\n\n/**\n * Response for the current user's member profile.\n *\n * Extends WorkspaceMemberResponse with scopes and org role - the effective\n * permissions that the API honors for this user in this workspace context.\n */\nexport interface CurrentMemberResponse {\n id: number;\n uuid: string;\n role: string | null;\n tosAccepted: boolean;\n accountTosAccepted: boolean | null;\n accountUuid: string | null;\n createdAt: string;\n updatedAt: string;\n name: string | null;\n title?: string | null;\n description: string | null;\n phone: string | null;\n phoneType: string | null;\n email: string | null;\n externalId: string | null;\n dateOfBirth?: string | null;\n emailVerified?: boolean;\n phoneVerified?: boolean;\n notifySms: boolean;\n notifyEmail: boolean;\n notifyVoice: boolean;\n notifyWhatsapp?: boolean;\n locale: string | null;\n memberRoleId: number;\n memberRoleName: string | null;\n memberRoleSystemKey?: string | null;\n homeFolderId?: number | null;\n labels?: MemberLabelResponse[];\n accountEnabled?: boolean | null;\n isOrgOwner?: boolean | null;\n isSuperuser?: boolean | null;\n orgRole?: string | null;\n timezone?: string | null;\n memberType?: string;\n isArchived?: boolean;\n isImportProtected?: boolean;\n usagePaused?: boolean;\n canLogin?: boolean;\n experimentGroup?: MemberExperimentGroupSummary | null;\n sharedContactPlacements?: SharedContactResponse[];\n scopes?: string[];\n /** Per-member surface-capability decisions. slug → {enabled, missing}. Each capability composes workspace feature availability with this member's scope authorization. See lib/capabilities/surfaces.py for CapabilityStatus and CapabilityRequirementFinding definitions. */\n capabilities?: CurrentMemberResponseCapabilities;\n}\n\n/**\n * Per-member surface-capability decisions. slug → {enabled, missing}. Each capability composes workspace feature availability with this member's scope authorization. See lib/capabilities/surfaces.py for CapabilityStatus and CapabilityRequirementFinding definitions.\n */\nexport type CurrentMemberResponseCapabilities = {[key: string]: CapabilityStatus};\n\n/**\n * A soft-warning entry for a DataRecord field schema mismatch.\n *\n * Emitted when an API caller sends a field slug that is not declared\n * on the target DataType's schema. The server silently skips the\n * field (for backward-compatibility — callers depend on unknown slugs\n * being ignored rather than rejected with 400) and attaches one of\n * these to the response so the caller can surface or fix the drift.\n *\n * API-facing camelCase to match other signup response fields.\n */\nexport interface DataRecordFieldWarning {\n code: 'unknown_data_record_field';\n dataTypeSlug: string;\n fieldSlug: string;\n message: string;\n}\n\n/**\n * One contact field a row disagrees with the matched Account about.\n *\n * ``row_value`` and ``account_value`` are **normalized** (email lower-cased,\n * phone E.164) so the operator compares — and resubmits — the same shape the\n * matcher used.\n *\n * ``account_value`` is ``None`` in cases the client cannot tell apart, by\n * design: the Account holds nothing for the field (keeping the Account then\n * drops the row's value — exactly the loss this conflict surfaces), or the\n * caller is not authorized to read it (no ``MEMBERS_ADMIN``, or the Account has\n * no Member in their workspace). Clients render ``None`` as \"unavailable\";\n * every resolution works either way.\n *\n * PHI: see the module docstring.\n */\nexport interface ImportContactConflict {\n field: ImportContactConflictField;\n rowValue: string;\n accountValue?: string | null;\n}\n\nexport type ImportContactConflictField = typeof ImportContactConflictField[keyof typeof ImportContactConflictField];\n\n\nexport const ImportContactConflictField = {\n email: 'email',\n phone: 'phone',\n} as const;\n\n/**\n * Response model for an organization member.\n *\n * Note: With Verified Credential Architecture, if accountEmail/accountPhone\n * is set, it's verified by construction. No verification flags needed.\n */\nexport interface LibRoutesOrgMembersOrgMemberResponse {\n id: number;\n accountId?: number | null;\n organizationId: number;\n accountUuid?: string | null;\n accountEmail?: string | null;\n accountName?: string | null;\n accountPhone?: string | null;\n name?: string | null;\n externalId?: string | null;\n role: string;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Response model for member credentials.\n */\nexport interface MemberCredentialResponse {\n id: number;\n uuid?: string | null;\n displayName?: string | null;\n isDefault?: boolean;\n provider?: string | null;\n externalUserId?: string | null;\n externalUsername?: string | null;\n externalEmail?: string | null;\n emailVerified?: boolean;\n connectedAt?: string | null;\n lastUsedAt?: string | null;\n createdAt: string;\n appConnectionId?: number | null;\n appConnectionName?: string | null;\n icon?: string | null;\n iconUrl?: string | null;\n}\n\n/**\n * Experiment group assignment included on member list rows when filtered by experiment.\n */\nexport interface MemberExperimentGroupSummary {\n groupId: number;\n groupName: string;\n groupSlug: string;\n isControl: boolean;\n}\n\n/**\n * Response model for list of field definitions available in a workspace.\n */\nexport interface MemberFieldDefinitionListResponse {\n items: MemberFieldDefinitionResponse[];\n}\n\n/**\n * A field definition available in the workspace (from active app connections\n * or user-created fields).\n */\nexport interface MemberFieldDefinitionResponse {\n key: string;\n label: string;\n serviceName?: string | null;\n serviceType?: string | null;\n}\n\n/**\n * Response model for list of member fields.\n */\nexport interface MemberFieldListResponse {\n items: MemberFieldResponse[];\n total: number;\n}\n\n/**\n * Response model for a member field.\n *\n * When id is None, this is a placeholder for a managed field definition\n * that doesn't have a value yet for this member.\n */\nexport interface MemberFieldResponse {\n id: number | null;\n memberId: number;\n key: string;\n value: string;\n serviceId: number | null;\n serviceName: string | null;\n serviceType: string | null;\n createdAt: string | null;\n updatedAt: string | null;\n}\n\n/**\n * Response model for a member filter.\n */\nexport interface MemberFilterResponse {\n id: number;\n uuid: string;\n name: string;\n description?: string | null;\n pinned?: boolean | null;\n createdAt: string;\n updatedAt: string;\n query?: MemberFilterResponseQuery;\n}\n\nexport type MemberFilterResponseQuery = { [key: string]: unknown } | null;\n\n/**\n * Why an import row was refused.\n *\n * ``code`` is a stable identifier: GRA-5545 phone-only identity mismatch\n * (``identity_mismatch_on_phone_match``), GH #22393 import protection\n * (``operator_role`` / ``import_protected``), or a contact disagreement with\n * the matched Account (``contact_conflict_with_account``). ``fields`` is empty\n * for protection refusals.\n *\n * ``conflicts`` is populated only for ``contact_conflict_with_account`` and is\n * the one place a conflict carries VALUES — the operator has to compare the\n * row's value against the Account's to choose a resolution. Its\n * ``accountValue`` is withheld (``None``) unless the caller holds\n * ``MEMBERS_ADMIN``; see ``member_import_contact_conflict``. Never logged.\n */\nexport interface MemberImportConflictInfo {\n code: string;\n fields: string[];\n conflicts?: ImportContactConflict[];\n}\n\n/**\n * Identity values shown to the operator to compare a conflict row.\n *\n * Populated only for conflict rows in the preview response (PHI minimization).\n */\nexport interface MemberImportIdentitySnapshot {\n name?: string | null;\n dateOfBirth?: string | null;\n}\n\n/**\n * Which existing Member an import row matched, and how it matched.\n */\nexport interface MemberImportMatchInfo {\n matchType: MemberImportMatchInfoMatchType;\n memberId: number;\n memberUuid: string;\n}\n\nexport type MemberImportMatchInfoMatchType = typeof MemberImportMatchInfoMatchType[keyof typeof MemberImportMatchInfoMatchType];\n\n\nexport const MemberImportMatchInfoMatchType = {\n id: 'id',\n uuid: 'uuid',\n external_id: 'external_id',\n email: 'email',\n phone: 'phone',\n account_email: 'account_email',\n account_phone: 'account_phone',\n} as const;\n\n/**\n * Read-only classification of an uploaded CSV before any write occurs.\n */\nexport interface MemberImportPreviewResponse {\n previewPlanToken?: string | null;\n totalRows: number;\n summary: MemberImportPreviewSummary;\n rows: MemberImportPreviewRow[];\n}\n\n/**\n * One classified import row in the read-only preview response.\n */\nexport interface MemberImportPreviewRow {\n row: number;\n action: MemberImportPreviewRowAction;\n match?: MemberImportMatchInfo | null;\n conflict?: MemberImportConflictInfo | null;\n existingIdentity?: MemberImportIdentitySnapshot | null;\n incomingIdentity?: MemberImportIdentitySnapshot | null;\n proposedChanges?: string[];\n sharedContacts?: string[];\n error?: string | null;\n}\n\nexport type MemberImportPreviewRowAction = typeof MemberImportPreviewRowAction[keyof typeof MemberImportPreviewRowAction];\n\n\nexport const MemberImportPreviewRowAction = {\n create: 'create',\n update: 'update',\n unchanged: 'unchanged',\n conflict: 'conflict',\n skipped: 'skipped',\n error: 'error',\n} as const;\n\n/**\n * Counts per classified action for an import preview.\n */\nexport interface MemberImportPreviewSummary {\n create?: number;\n update?: number;\n unchanged?: number;\n conflict?: number;\n skipped?: number;\n error?: number;\n}\n\n/**\n * One row's outcome within a run.\n *\n * PHI note: an index, a status, a closed reason code and the written member's\n * surrogate id — never a CSV cell, identifier, name, email, phone or field\n * value.\n */\nexport interface MemberImportRunItemResponse {\n index: number;\n status: string;\n reasonCode?: string;\n detail?: string | null;\n memberId?: number | null;\n}\n\n/**\n * One durable members import run.\n *\n * Counters are the members import's own outcome vocabulary — ``created``,\n * ``updated``, ``unchanged``, ``conflicted``, ``skipped``, ``failed`` — not\n * the connector importer's link-reconciliation counters, which would label\n * rows with something they did not do.\n */\nexport interface MemberImportRunSummaryResponse {\n runId: string;\n startedAt: string;\n completedAt?: string | null;\n status: string;\n total?: number;\n created?: number;\n updated?: number;\n unchanged?: number;\n conflicted?: number;\n skipped?: number;\n failed?: number;\n terminalError?: string | null;\n}\n\n/**\n * Response model for assistant label endpoints.\n */\nexport interface MemberLabelResponse {\n id: number;\n uuid: string;\n name: string;\n slug: string;\n color: string;\n description: string | null;\n}\n\n/**\n * Response model for file access within a member role.\n */\nexport interface MemberRoleFileAccessResponse {\n fileId: number;\n accessMode: number;\n}\n\n/**\n * Response model for folder access within a member role.\n */\nexport interface MemberRoleFolderAccessResponse {\n folderId: number;\n accessMode: number;\n}\n\n/**\n * Response model for member role endpoints.\n */\nexport interface MemberRoleResponse {\n id: number;\n uuid: string;\n name: string;\n systemKey?: string | null;\n grantedScopes?: string[];\n dailyCreditLimit?: number | null;\n siteAudience?: string[];\n fileAccess?: MemberRoleFileAccessResponse[];\n folderAccess?: MemberRoleFolderAccessResponse[];\n memberCount?: number;\n isDefaultForNewMembers?: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface MemoryListResponse {\n items: MemoryResponse[];\n total: number;\n}\n\nexport interface MemoryResponse {\n id?: number | null;\n uuid?: string | null;\n key: string;\n type?: string;\n description: string;\n content?: string | null;\n priority?: number;\n createdAt?: string | null;\n updatedAt?: string | null;\n}\n\n/**\n * Response for merge members operation.\n */\nexport interface MergeMembersResponse {\n member: WorkspaceMemberResponse;\n mergedCount: number;\n dataRecordsTransferred: number;\n}\n\n/**\n * Paginated response for organization members.\n */\nexport interface OrgMemberListResponse {\n items: LibRoutesOrgMembersOrgMemberResponse[];\n total: number;\n page: number;\n pageSize: number;\n}\n\n/**\n * Response with list of pending anonymous member resolutions.\n */\nexport interface PendingAnonymousMembersResponse {\n items: AnonymousMemberResolutionResponse[];\n total: number;\n}\n\n/**\n * Result of triggering an SMS phone-confirmation for a member.\n */\nexport interface SendPhoneConfirmationResponse {\n status: string;\n}\n\n/**\n * A phone/email another member holds as primary, kept as a shared point.\n *\n * Returned on a member create/update so the client can say \"stored as a\n * shared contact\" and offer the explicit take-over\n * (``releaseContactFromMemberId``) without the write having failed. PHI-free:\n * a field NAME, the holding member's surrogate id and whether that member is\n * archived — never the value, which the caller supplied in the first place.\n */\nexport interface SharedContactResponse {\n field: SharedContactResponseField;\n memberId: number;\n archived?: boolean;\n}\n\nexport type SharedContactResponseField = typeof SharedContactResponseField[keyof typeof SharedContactResponseField];\n\n\nexport const SharedContactResponseField = {\n phone: 'phone',\n email: 'email',\n} as const;\n\n/**\n * Response model for account data in signup response.\n */\nexport interface SignupAccountResponse {\n id: number;\n uuid: string;\n email?: string | null;\n phone?: string | null;\n name?: string | null;\n locale?: string | null;\n createdAt: string;\n}\n\n/**\n * Response model for member data in signup response.\n */\nexport interface SignupMemberResponse {\n id: number;\n memberRoleId: number;\n createdAt: string;\n name?: string | null;\n description?: string | null;\n phone?: string | null;\n email?: string | null;\n externalId?: string | null;\n labels?: string[];\n tosAccepted: boolean;\n}\n\n/**\n * Request to update a member field.\n */\nexport interface UpdateMemberFieldRequest {\n value: string;\n}\n\n/**\n * Update a member filter (query-only).\n */\nexport interface UpdateMemberFilterRequest {\n name?: string | null;\n description?: string | null;\n pinned?: boolean | null;\n query?: UpdateMemberFilterRequestQuery;\n}\n\nexport type UpdateMemberFilterRequestQuery = { [key: string]: unknown } | null;\n\n/**\n * Update the settings for a workspace.\n */\nexport interface UpdateWorkspaceMemberRequest {\n tosAccepted?: boolean | null;\n notifySms?: boolean | null;\n notifyEmail?: boolean | null;\n notifyVoice?: boolean | null;\n notifyWhatsapp?: boolean | null;\n memberRoleId?: number | null;\n locale?: string | null;\n timezone?: string | null;\n name?: string | null;\n title?: string | null;\n description?: string | null;\n phone?: string | null;\n email?: string | null;\n externalId?: string | null;\n dateOfBirth?: string | null;\n labelIds?: number[] | null;\n isImportProtected?: boolean | null;\n usagePaused?: boolean | null;\n releaseContactFromMemberId?: number | null;\n accountEnabled?: boolean | null;\n isOrgOwner?: boolean | null;\n accountTosAccepted?: boolean | null;\n isSuperuser?: boolean | null;\n}\n\n/**\n * Aggregate member counts for a workspace (superuser admin view).\n *\n * Returns COUNTs only — never member rows — so no PHI is exposed. Lets a\n * superuser tally members across workspaces they are not a member of, filling\n * the gap where the workspace-scoped member endpoints require membership.\n */\nexport interface WorkspaceMemberCountResponse {\n /** Workspace UUID */\n workspaceUuid: string;\n /** Numeric workspace ID */\n workspaceId: number;\n /** Total member rows (all member types, including archived) */\n totalMembers: number;\n /** Non-archived member rows (all member types) */\n activeMembers: number;\n /** Archived member rows (all member types) */\n archivedMembers: number;\n /** Non-archived member counts keyed by member_type (member, agent, anonymous, test) */\n activeByType?: WorkspaceMemberCountResponseActiveByType;\n}\n\n/**\n * Non-archived member counts keyed by member_type (member, agent, anonymous, test)\n */\nexport type WorkspaceMemberCountResponseActiveByType = {[key: string]: number};\n\nexport interface WorkspaceMemberResponse {\n id: number;\n uuid: string;\n role: string | null;\n tosAccepted: boolean;\n accountTosAccepted: boolean | null;\n accountUuid: string | null;\n createdAt: string;\n updatedAt: string;\n name: string | null;\n title?: string | null;\n description: string | null;\n phone: string | null;\n phoneType: string | null;\n email: string | null;\n externalId: string | null;\n dateOfBirth?: string | null;\n emailVerified?: boolean;\n phoneVerified?: boolean;\n notifySms: boolean;\n notifyEmail: boolean;\n notifyVoice: boolean;\n notifyWhatsapp?: boolean;\n locale: string | null;\n memberRoleId: number;\n memberRoleName: string | null;\n memberRoleSystemKey?: string | null;\n homeFolderId?: number | null;\n labels?: MemberLabelResponse[];\n accountEnabled?: boolean | null;\n isOrgOwner?: boolean | null;\n isSuperuser?: boolean | null;\n orgRole?: string | null;\n timezone?: string | null;\n memberType?: string;\n isArchived?: boolean;\n isImportProtected?: boolean;\n usagePaused?: boolean;\n canLogin?: boolean;\n experimentGroup?: MemberExperimentGroupSummary | null;\n sharedContactPlacements?: SharedContactResponse[];\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: member_role\n */\n\n\n/**\n * Create a new member role.\n *\n * Always creates a *custom* role: ``system_key`` stays NULL. The five seeded\n * default roles are created by the provisioner only.\n */\nexport interface CreateMemberRoleRequest {\n name: string;\n grantedScopes?: string[] | null;\n dailyCreditLimit?: number | null;\n siteAudience?: string[] | null;\n fileAccess?: CreateMemberRoleRequestFileAccess;\n folderAccess?: CreateMemberRoleRequestFolderAccess;\n}\n\nexport type CreateMemberRoleRequestFileAccess = {[key: string]: number}[] | null;\n\nexport type CreateMemberRoleRequestFolderAccess = {[key: string]: number}[] | null;\n\n/**\n * A seeded role whose name or scopes no longer match the canonical set.\n */\nexport interface DriftedSystemRoleResponse {\n roleId: number;\n name: string;\n systemKey: string;\n canonicalName: string;\n nameMatches: boolean;\n missingScopes?: string[];\n extraScopes?: string[];\n}\n\n/**\n * One proposed merge of a legacy duplicate into its seeded counterpart.\n */\nexport interface LegacyRoleSuggestionResponse {\n sourceRoleId: number;\n sourceRoleName: string;\n targetRoleId: number;\n targetRoleName: string;\n systemKey: string;\n /** How confident the match is. 'duplicate_name' — the role folds to the same canonical name as the target, so it is unambiguously the same role written differently; safe to merge. 'legacy_alias' — an older name for the target (e.g. 'admin' for Manager); this is a guess, the role may have been customised into something the workspace relies on, so clients should require explicit review rather than pre-selecting it. */\n matchType: string;\n /** Counts of everything in the workspace that points at the source role and would move. */\n references: RoleReferenceCountsResponse;\n /** Resources the source role can reach that the target cannot. Under the 'union' access strategy these become newly reachable for everyone who already holds the target role. */\n resourcesTargetWouldGain?: number;\n}\n\n/**\n * Result of a canonicalize dry-run or apply.\n */\nexport interface MemberRoleCanonicalizationResponse {\n /** False for a dry-run: the plan describes what would happen. */\n applied: boolean;\n /** True when every seeded role is keyed, canonically named, on the canonical scope set, and nothing is blocked. */\n isCanonical: boolean;\n roles?: SystemRoleCanonicalizationResponse[];\n}\n\n/**\n * Read-only description of a workspace's role hygiene.\n */\nexport interface MemberRoleCleanupPlanResponse {\n suggestions?: LegacyRoleSuggestionResponse[];\n drifted?: DriftedSystemRoleResponse[];\n missingSystemKeys?: string[];\n isClean?: boolean;\n}\n\n/**\n * Fold a legacy duplicate role into another role and delete it.\n *\n * ``accessStrategy`` decides what happens to the source role's *resource*\n * access — see ``AccessMergeStrategy`` in\n * ``lib/services/member_role_cleanup_service.py``. Scopes are not merged:\n * migrated members take the target role's scopes, which is the whole point of\n * consolidating onto a clamped default.\n */\nexport interface MergeMemberRolesRequest {\n sourceRoleId: number;\n targetRoleId: number;\n accessStrategy?: MergeMemberRolesRequestAccessStrategy;\n}\n\nexport type MergeMemberRolesRequestAccessStrategy = typeof MergeMemberRolesRequestAccessStrategy[keyof typeof MergeMemberRolesRequestAccessStrategy];\n\n\nexport const MergeMemberRolesRequestAccessStrategy = {\n union: 'union',\n target_only: 'target_only',\n} as const;\n\n/**\n * What a completed merge actually moved.\n */\nexport interface MergeMemberRolesResponse {\n sourceRoleId: number;\n sourceRoleName: string;\n targetRoleId: number;\n targetRoleName: string;\n strategy: string;\n membersMoved?: number;\n accessRowsMoved?: number;\n accessRowsMerged?: number;\n accessRowsDiscarded?: number;\n signupSitesMoved?: number;\n signupPhoneNumbersMoved?: number;\n signupRoutingRulesMoved?: number;\n anonymousPhoneNumbersMoved?: number;\n personasMoved?: number;\n invitationsMoved?: number;\n productsMoved?: number;\n memberSubscriptionsMoved?: number;\n}\n\n/**\n * Everything in the workspace that points at a role about to be merged.\n */\nexport interface RoleReferenceCountsResponse {\n /** Members holding the role. */\n members?: number;\n /** Site audience, File access and Folder access rows naming the role. */\n resourceAccess?: number;\n /** Sites that assign this role on signup. */\n signupSites?: number;\n /** Phone numbers that assign this role on signup. */\n signupPhoneNumbers?: number;\n /** Routing Rules that give this role to new callers. */\n signupRoutingRules?: number;\n /** Phone numbers whose stored anonymous role names this role. The column is not read at runtime; routing rules name the role for new callers. */\n anonymousPhoneNumbers?: number;\n /** Agent personas that instantiate with this role. */\n personas?: number;\n /** Invitations not yet accepted or declined that would grant this role. */\n pendingInvitations?: number;\n /** MEMBER products whose checkout grants this role. */\n products?: number;\n /** Paid member subscriptions whose granted or previous role points at this role. */\n memberSubscriptions?: number;\n /** Sum of every count above. */\n total?: number;\n}\n\n/**\n * What canonicalizing one platform-seeded role needs (or did).\n */\nexport interface SystemRoleCanonicalizationResponse {\n systemKey: string;\n canonicalName: string;\n /** Null while the role does not exist yet. */\n roleId?: number | null;\n currentName?: string | null;\n /** The role will be/was created. */\n created?: boolean;\n /** A keyless role that already is this seeded role (written differently) will be/was adopted by setting its system_key. */\n adopted?: boolean;\n /** The name will be/was set to the canonical spelling. */\n renamed?: boolean;\n scopesAdded?: string[];\n scopesRemoved?: string[];\n /** Set when a *different* role still holds the canonical name; that role must be merged into this one before the rename can happen. */\n blockedByRoleName?: string | null;\n}\n\n/**\n * Stable identity of a role that Gravity Rail seeds into every workspace.\n *\n * The key — not the name — is the identity. Workspaces seeded over the years\n * carry the same role under different spellings (\"manager\" vs \"Manager\"), so\n * any code that needs \"the Manager role of this workspace\" must resolve it\n * through ``MemberRole.system_key`` rather than by matching ``name``.\n *\n * Roles carrying a key are **clamped**: their name and ``granted_scopes`` are\n * owned by the platform and cannot be edited or deleted through the API. To\n * change permissions, an administrator creates a custom (keyless) role.\n * Site audience and File/Folder access stay editable — only the scope set is\n * clamped.\n */\nexport type SystemRoleKey = typeof SystemRoleKey[keyof typeof SystemRoleKey];\n\n\nexport const SystemRoleKey = {\n manager: 'manager',\n platform_support: 'platform_support',\n user: 'user',\n agent: 'agent',\n external: 'external',\n} as const;\n\n/**\n * Update an existing member role.\n *\n * On a seeded default role (``system_key`` set) the ``name`` and\n * ``grantedScopes`` fields are rejected — those are owned by the platform.\n * Site audience and File/Folder access stay editable on every role,\n * including the defaults: the clamp covers *scopes*, not resource access.\n */\nexport interface UpdateMemberRoleRequest {\n name?: string | null;\n grantedScopes?: string[] | null;\n dailyCreditLimit?: number | null;\n siteAudience?: string[] | null;\n fileAccess?: UpdateMemberRoleRequestFileAccess;\n folderAccess?: UpdateMemberRoleRequestFolderAccess;\n}\n\nexport type UpdateMemberRoleRequestFileAccess = {[key: string]: number}[] | null;\n\nexport type UpdateMemberRoleRequestFolderAccess = {[key: string]: number}[] | null;\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: member_contact_point\n */\n\n\n/**\n * Add one workspace-local contact point to a Member.\n *\n * Schema-only: the scope gate is **not** an unconditional ``ScopedRequest``\n * scope, because a Member may always manage their own contacts without\n * ``members:write``. The self-or-scope decision lives in\n * ``MemberContactPointService._require_write`` so both paths are enforced in\n * one place.\n */\nexport interface CreateMemberContactPointRequest {\n contactType: CreateMemberContactPointRequestContactType;\n /**\n * Phone or email value. Normalized server-side; PHI, never logged.\n * @minLength 1\n * @maxLength 320\n */\n value: string;\n label?: string | null;\n purpose?: CreateMemberContactPointRequestPurpose;\n /**\n * @minimum -10000\n * @maximum 10000\n */\n priority?: number;\n sharing?: CreateMemberContactPointRequestSharing;\n capabilities?: string[];\n observedAt?: string | null;\n}\n\nexport type CreateMemberContactPointRequestContactType = typeof CreateMemberContactPointRequestContactType[keyof typeof CreateMemberContactPointRequestContactType];\n\n\nexport const CreateMemberContactPointRequestContactType = {\n phone: 'phone',\n email: 'email',\n} as const;\n\nexport type CreateMemberContactPointRequestPurpose = typeof CreateMemberContactPointRequestPurpose[keyof typeof CreateMemberContactPointRequestPurpose];\n\n\nexport const CreateMemberContactPointRequestPurpose = {\n general: 'general',\n notification: 'notification',\n billing: 'billing',\n} as const;\n\nexport type CreateMemberContactPointRequestSharing = typeof CreateMemberContactPointRequestSharing[keyof typeof CreateMemberContactPointRequestSharing];\n\n\nexport const CreateMemberContactPointRequestSharing = {\n shared: 'shared',\n individual: 'individual',\n unknown: 'unknown',\n} as const;\n\n/**\n * Whether a *ceremony* confirmed this exact contact point.\n *\n * Bound to the point's normalized value (matched through the binding's\n * ``identifier_hash``), to a real ceremony source, and to the server-owned\n * **value generation** started when the current value was written\n * (``value_generation_at``, the database write-time clock): the ceremony must\n * have happened at or after that generation and, for a retired point, before\n * its retirement. A value retired and readded under a new row, or edited away\n * and back on one live row, therefore does not inherit an older proof. An\n * importer or admin assertion that merely recorded \"the practice said so\" has\n * a non-ceremony ``source`` and reads ``confirmed=False`` — the historical\n * confirmation display never inherits an importer's claim.\n */\nexport interface MemberContactPointConfirmationResponse {\n confirmed: boolean;\n source?: string | null;\n method?: string | null;\n bindingUuid?: string | null;\n confirmedAt?: string | null;\n}\n\nexport interface MemberContactPointListResponse {\n memberId: number;\n contacts: MemberContactPointResponse[];\n}\n\nexport interface MemberContactPointResponse {\n uuid: string;\n memberId: number;\n contactType: string;\n value: string;\n label: string | null;\n purpose: string;\n priority: number;\n sharing: string;\n capabilities: string[];\n sourceSystem: string | null;\n sourceRecordId: string | null;\n observedAt: string | null;\n retiredAt: string | null;\n createdAt: string;\n updatedAt: string;\n isPrimary?: boolean;\n confirmation?: MemberContactPointConfirmationResponse | null;\n}\n\n/**\n * Retire a contact point (a state change, never a hard delete).\n */\nexport interface RetireMemberContactPointRequest { [key: string]: unknown }\n\n/**\n * Change a workspace-local contact point's value and/or annotations.\n */\nexport interface UpdateMemberContactPointRequest {\n contactType?: UpdateMemberContactPointRequestContactType;\n value?: string | null;\n label?: string | null;\n purpose?: UpdateMemberContactPointRequestPurpose;\n priority?: number | null;\n sharing?: UpdateMemberContactPointRequestSharing;\n capabilities?: string[] | null;\n observedAt?: string | null;\n}\n\nexport type UpdateMemberContactPointRequestContactType = typeof UpdateMemberContactPointRequestContactType[keyof typeof UpdateMemberContactPointRequestContactType] | null;\n\n\nexport const UpdateMemberContactPointRequestContactType = {\n phone: 'phone',\n email: 'email',\n} as const;\n\nexport type UpdateMemberContactPointRequestPurpose = typeof UpdateMemberContactPointRequestPurpose[keyof typeof UpdateMemberContactPointRequestPurpose] | null;\n\n\nexport const UpdateMemberContactPointRequestPurpose = {\n general: 'general',\n notification: 'notification',\n billing: 'billing',\n} as const;\n\nexport type UpdateMemberContactPointRequestSharing = typeof UpdateMemberContactPointRequestSharing[keyof typeof UpdateMemberContactPointRequestSharing] | null;\n\n\nexport const UpdateMemberContactPointRequestSharing = {\n shared: 'shared',\n individual: 'individual',\n unknown: 'unknown',\n} as const;\n","// Member-related types.\n// Server response shapes are generated from Pydantic via emit_openapi.py → Orval.\n// Client-only shapes (forms, filters, roles with access grants, merge/normalize\n// flows, anonymous resolution, bulk import, reports, query params) are defined below.\n\n// ===== GENERATED SERVER TYPES =====\n// MemberRoleTaskAccess has no generated equivalent (taskAccess absent from backend response).\n\nimport type {\n AgentMemoryConfig as GeneratedAgentMemoryConfig,\n ImportContactConflict,\n} from './generated/member';\n\nexport type {\n AgentConfigResponse,\n AgentConfigResponse as AgentConfig,\n AgentResponse,\n AgentResponse as Agent,\n AnonymousInteractionResponse,\n AnonymousInteractionResponse as AnonymousInteraction,\n AnonymousMemberResolutionResponse,\n AnonymousMemberResolutionResponse as AnonymousMemberResolution,\n BulkCreateMembersResponse,\n BulkMemberResult,\n CapabilityRequirementFinding,\n CapabilityStatus,\n CreateSignupResponse,\n CurrentMemberResponse,\n CurrentMemberResponse as CurrentMember,\n DataRecordFieldWarning,\n ImportContactConflict,\n ImportContactConflictField,\n MemberCredentialResponse,\n MemberCredentialResponse as MemberCredential,\n MemberFilterResponse,\n MemberFilterResponse as MemberFilter,\n MemberImportConflictInfo,\n MemberImportIdentitySnapshot,\n MemberImportMatchInfo,\n MemberImportPreviewResponse,\n MemberImportPreviewRow,\n MemberImportPreviewSummary,\n MemberImportRunItemResponse,\n MemberImportRunSummaryResponse,\n MemberLabelResponse,\n MemberLabelResponse as MemberLabel,\n MemberRoleFileAccessResponse,\n MemberRoleFileAccessResponse as MemberRoleFileAccess,\n MemberRoleFolderAccessResponse,\n MemberRoleFolderAccessResponse as MemberRoleFolderAccess,\n MemberRoleResponse,\n MemberRoleResponse as MemberRole,\n MemoryListResponse as GeneratedMemoryListResponse,\n MemoryResponse as GeneratedMemoryResponse,\n MergeMembersResponse,\n PendingAnonymousMembersResponse,\n SignupAccountResponse,\n SignupMemberResponse,\n WorkspaceMemberCountResponse,\n WorkspaceMemberCountResponseActiveByType,\n WorkspaceMemberResponse,\n WorkspaceMemberResponse as Member,\n} from './generated/member';\nexport { BulkMemberResultStatus } from './generated/member';\n\n// The legacy-role cleanup shapes live in their own generated group.\nexport type {\n DriftedSystemRoleResponse,\n DriftedSystemRoleResponse as DriftedSystemRole,\n LegacyRoleSuggestionResponse,\n LegacyRoleSuggestionResponse as LegacyRoleSuggestion,\n MemberRoleCleanupPlanResponse,\n MemberRoleCleanupPlanResponse as MemberRoleCleanupPlan,\n MemberRoleCanonicalizationResponse,\n MemberRoleCanonicalizationResponse as MemberRoleCanonicalizationResult,\n SystemRoleCanonicalizationResponse,\n MergeMemberRolesRequest,\n MergeMemberRolesResponse,\n MergeMemberRolesResponse as MergeMemberRolesResult,\n RoleReferenceCountsResponse,\n RoleReferenceCountsResponse as RoleReferenceCounts,\n} from './generated/member_role';\nexport { MergeMemberRolesRequestAccessStrategy } from './generated/member_role';\n\nexport { MemberImportMatchInfoMatchType, MemberImportPreviewRowAction } from './generated/member';\n\n// Member contact points (GRA-8781): typed phone/email with purpose,\n// provenance, retirement and a ceremony-bound confirmation projection.\nexport type {\n CreateMemberContactPointRequest,\n MemberContactPointConfirmationResponse,\n MemberContactPointListResponse,\n MemberContactPointResponse,\n MemberContactPointResponse as MemberContactPoint,\n RetireMemberContactPointRequest,\n UpdateMemberContactPointRequest,\n} from './generated/member_contact_point';\nexport {\n CreateMemberContactPointRequestContactType,\n CreateMemberContactPointRequestPurpose,\n CreateMemberContactPointRequestSharing,\n UpdateMemberContactPointRequestContactType,\n UpdateMemberContactPointRequestPurpose,\n UpdateMemberContactPointRequestSharing,\n} from './generated/member_contact_point';\n\n// Local imports for use in field type annotations\nimport type { ChatModelConfig } from './model-config-types';\nimport type { QueryPredicate } from './query-engine-types';\nimport type {\n MemberFilterResponse as GeneratedMemberFilterResponse,\n MemberRoleFileAccessResponse,\n MemberRoleFolderAccessResponse,\n MemoryListResponse as GeneratedMemoryListResponse,\n MemoryResponse as GeneratedMemoryResponse,\n WorkspaceMemberResponse,\n} from './generated/member';\n\nexport type MemoryItem = GeneratedMemoryResponse;\nexport type MemoryResponse = MemoryItem;\n\nexport type MemberMemoriesResponse = Omit<GeneratedMemoryListResponse, 'items'> & {\n items: MemoryItem[];\n};\n\n// ===== CLIENT-ONLY SURFACE =====\n\nimport type { MemberSortField, SortOrder } from './sort-types';\n// Memory (client-only helpers)\nexport type MemoryType = 'basic' | 'preferences' | 'semantic' | 'summaries' | 'episodic';\n\n// Agent memory config form uses the API-generated canonical strategy set.\nexport type AgentMemoryConfig = GeneratedAgentMemoryConfig;\n\n// Member lifecycle enum (kept as TypeScript enum for backward compatibility)\nexport enum MemberType {\n ANONYMOUS = 'anonymous',\n TEST = 'test',\n MEMBER = 'member',\n AGENT = 'agent',\n}\n\n// ===== CSV IMPORT: PREVIEW + STREAM CONTRACT (GRA-5545) =====\n\n/**\n * How the streaming commit import treats a row that matches an existing member\n * ONLY by phone but carries different identity fields. 'skip' (safe default)\n * writes nothing for the row; 'overwrite_identity_fields' overwrites + audits\n * and is intended to be sent only after a preview.\n */\nexport type IdentityConflictPolicy = 'skip' | 'overwrite_identity_fields';\n\n/** Multipart CSV options shared by preview and commit. */\nexport interface MemberImportOptions {\n /** Opaque saved preview handle; commit reuses these automatic identity decisions. */\n previewPlanToken?: string;\n /** Server-validated per-row decisions from an operator's preview review.\n * The server owns the decision schema, including identity decisions on\n * deployments that support them. Do not log replacement contact values.\n */\n resolutions?: ReadonlyArray<Readonly<Record<string, unknown>>>;\n /** Promote unique contacts when no primary exists (mobile first). Default true. */\n autoPromoteUniqueContacts?: boolean;\n /** Commit only: explicit approval to overwrite a phone-only match's identity. Default skip. */\n identityConflictPolicy?: IdentityConflictPolicy;\n}\n\n/**\n * A conflict detail in the import stream — field NAMES only, EXCEPT\n * `conflicts`: populated only when `code === 'contact_conflict_with_account'`,\n * and the one place a stream conflict carries actual PHI VALUES — the row's\n * and the matched Account's own phone/email, so the operator can compare and\n * resolve it (see `member_import_contact_conflict.py`). Authorized import\n * surface only (`POST /members/import`, `MEMBERS_ADMIN` + `@phi_audit`);\n * never log this or paste it into a ticket.\n */\nexport interface MemberImportStreamConflict {\n code: string;\n fields: string[];\n match: {\n // Mirrors the backend MemberMatchType: the export's explicit\n // 'id'/'uuid' keys match first and are the strongest, account-routed\n // matches are 'account_email' (strong) / 'account_phone' (weak), not a\n // bare 'account'.\n match_type:\n 'id' | 'uuid' | 'external_id' | 'email' | 'phone' | 'account_email' | 'account_phone';\n member_id: number;\n member_uuid: string;\n };\n conflicts?: ImportContactConflict[];\n}\n\n/**\n * One NDJSON event from POST /members/import. Counts, row numbers, codes,\n * field names, and member ids/uuids only — EXCEPT `conflict.conflicts` on a\n * `type: 'conflict'` event and the final `complete` event's own `conflicts`\n * array below, both of which carry the row's and the matched Account's\n * actual phone/email values (see `MemberImportStreamConflict`). Both are\n * authorized-import-surface only (`MEMBERS_ADMIN` + `@phi_audit`) and must\n * never be logged or pasted into a ticket.\n */\nexport interface MemberImportStreamEvent {\n type: 'progress' | 'conflict' | 'skipped' | 'error' | 'complete';\n row?: number;\n message?: string;\n current?: number;\n total?: number;\n success?: number;\n failed?: number;\n conflicted?: number;\n skipped?: number;\n created?: number;\n updated?: number;\n unchanged?: number;\n // Present on 'conflict' events.\n conflict?: MemberImportStreamConflict;\n // Present on the final 'complete' event.\n errors?: string[];\n failedRows?: number[];\n conflictRows?: number[];\n skippedRows?: number[];\n conflicts?: Array<{\n row: number;\n code: string;\n fields: string[];\n member_id: number;\n member_uuid: string;\n conflicts?: ImportContactConflict[];\n }>;\n updatedMembers?: Array<{ row: number; memberId: number; changes: string[] }>;\n}\n\n// Label forms (client)\nexport interface MemberLabelFormData {\n name: string;\n slug?: string;\n description?: string;\n color: string;\n}\n\n// Bulk import (client CSV flow)\nexport interface BulkMemberItem {\n email?: string;\n phone?: string;\n name?: string;\n description?: string;\n externalId?: string;\n memberRoleId?: number;\n labels?: string[];\n notifySms?: boolean;\n notifyEmail?: boolean;\n notifyVoice?: boolean;\n notifyWhatsapp?: boolean;\n locale?: string;\n timezone?: string;\n}\n\nexport interface BulkCreateMembersRequest {\n members: BulkMemberItem[];\n upsert?: boolean;\n}\n\n// Agent config form (partial update)\nexport interface AgentConfigFormData {\n chatModelId?: string;\n chatModelConfig?: Record<string, unknown>;\n realtimeModelId?: string;\n realtimeModelConfig?: Record<string, unknown>;\n systemPrompt?: string;\n maxDailyActions?: number;\n tools?: string[];\n codeInterpreterEnabled?: boolean;\n webBrowserEnabled?: boolean;\n memoryConfig?: AgentMemoryConfig;\n}\n\n/** MemberFilter response with the query-engine predicate column narrowed.\n * The generated type exposes `query` as a loose `{ [key: string]: unknown } | null`\n * (OpenAPI free-form object); this intersection narrows it to the typed\n * client-side `QueryPredicate` IR. */\nexport type MemberFilterWithQuery = GeneratedMemberFilterResponse & {\n query?: QueryPredicate | null;\n};\n\nexport interface MemberFilterFormData {\n name: string;\n description?: string;\n pinned?: boolean;\n /**\n * Query-engine predicate (JSON IR) stored on MemberFilter.query. Required\n * key so a create call can't silently omit the predicate (the backend\n * `create_member_filter` requires one); pass `null` only to deliberately\n * author an empty filter. `updateMemberFilter` takes `Partial<>`, so\n * partial updates that don't touch the query are unaffected.\n */\n query: QueryPredicate | null;\n}\n\n// Task access (no generated backend response schema — kept as client-side shape)\nexport interface MemberRoleTaskAccess {\n taskId: number;\n accessMode: number;\n}\n\n// Member role form data (client editor)\nexport interface MemberRoleFormData {\n name?: string;\n grantedScopes?: string[];\n /**\n * Per-Member daily AI/voice credit cap for Members holding this role.\n * `null` = no cap; `0` = no new metered usage. Nonnegative.\n */\n dailyCreditLimit?: number | null;\n taskAccess?: MemberRoleTaskAccess[];\n /** UUIDs of the Sites this role can sign in through. */\n siteAudience?: string[];\n fileAccess?: MemberRoleFileAccessResponse[];\n folderAccess?: MemberRoleFolderAccessResponse[];\n}\n\n// Member CRUD forms\nexport interface MemberFormData {\n tosAccepted?: boolean;\n memberRoleId?: number;\n notifySms?: boolean;\n notifyEmail?: boolean;\n notifyVoice?: boolean;\n notifyWhatsapp?: boolean;\n name?: string;\n description?: string;\n phone?: string;\n email?: string;\n externalId?: string;\n dateOfBirth?: string | null;\n /**\n * Resolve a contact-uniqueness collision by clearing the colliding value off\n * the member that currently holds it, in the same transaction that claims\n * it. Requires `members:admin`. Only the fields this request is claiming,\n * and only where that member's current value *is* the claimed one, are\n * cleared. See `MemberContactConflict`.\n */\n releaseContactFromMemberId?: number;\n}\n\nexport type MemberContactField = 'phone' | 'email' | 'externalId';\n\n/**\n * Structured 409 body returned when a member's phone / email / external ID is\n * already held by another member in the workspace. Returned by `POST /members`,\n * `PUT /members/{id}` and `PUT /me` alike.\n *\n * Carries the blocking member's **id** only — never their name or contact\n * value. Fetch the record through the normal member endpoints to display it.\n */\nexport interface MemberContactConflict {\n error: true;\n code: 'MEMBER_CONTACT_CONFLICT';\n message: string;\n conflictField: MemberContactField;\n /**\n * `null` on the server's race backstop, which learns that a uniqueness\n * constraint fired but not who holds the value. `canRelease` is always\n * `false` in that case — there is nothing to release *from*.\n */\n conflictingMemberId: number | null;\n conflictingMemberArchived: boolean;\n /** Whether the caller holds `members:admin` and may release the value. */\n canRelease: boolean;\n}\n\n/**\n * Structured 409 body returned when the contact value belongs to another global\n * **Account** in the organization rather than to a member of this workspace.\n *\n * Deliberately carries no member id and no `canRelease`: there is no local\n * record to show, and the remedy is a verified / holder-consented identity\n * flow, not something the caller can resolve in this request.\n */\nexport interface AccountContactConflict {\n error: true;\n code: 'ACCOUNT_CONTACT_CONFLICT';\n message: string;\n conflictField: MemberContactField;\n}\n\nfunction structuredErrorDetail(error: unknown): Record<string, unknown> | null {\n if (!error || typeof error !== 'object') return null;\n const detail = (error as { errorData?: unknown }).errorData;\n if (!detail || typeof detail !== 'object') return null;\n return detail as Record<string, unknown>;\n}\n\n/**\n * Narrow an unknown thrown value to a member contact conflict.\n *\n * Deliberately structural rather than an `instanceof ApiError` check, so the\n * guard works on errors that crossed a React Query boundary or were re-wrapped.\n *\n * A conflict with a null `conflictingMemberId` still matches — it is a real\n * conflict and its message is the right thing to show. Callers that want to\n * render the resolution UI should branch on `canRelease`, which is the field\n * that actually answers \"is there something to do about this\".\n *\n * Only `code` and the id's shape are validated, deliberately. `conflictField`,\n * `canRelease` and `conflictingMemberArchived` come from the same server\n * response as `code`; re-validating them would turn a server that added a new\n * `conflictField` value into a silent \"not a conflict at all\", which is a worse\n * failure than rendering an unfamiliar noun. The id is checked because callers\n * pass it back as a member id.\n */\nexport function isMemberContactConflict(error: unknown): MemberContactConflict | null {\n const d = structuredErrorDetail(error);\n if (!d || d.code !== 'MEMBER_CONTACT_CONFLICT') return null;\n if (d.conflictingMemberId !== null && typeof d.conflictingMemberId !== 'number') {\n return null;\n }\n return d as unknown as MemberContactConflict;\n}\n\n/** Narrow an unknown thrown value to an account-level contact conflict. */\nexport function isAccountContactConflict(error: unknown): AccountContactConflict | null {\n const d = structuredErrorDetail(error);\n if (!d || d.code !== 'ACCOUNT_CONTACT_CONFLICT') return null;\n return d as unknown as AccountContactConflict;\n}\n\n/**\n * The archived member's id when `POST /members` collided with an archived\n * record, or `null`. Unlike a contact conflict, the remedy here is to unarchive\n * that member rather than take a value from them.\n */\nexport function archivedMemberConflictId(error: unknown): number | null {\n const d = structuredErrorDetail(error);\n if (!d || d.code !== 'ARCHIVED_MEMBER_CONFLICT') return null;\n return typeof d.archivedMemberId === 'number' ? d.archivedMemberId : null;\n}\n\n/**\n * A conflict that names the member holding the value.\n *\n * This is what the resolution UI needs: something to show the user. Whether\n * they may also *act* on it is a separate question answered by `canRelease` —\n * a non-admin still benefits from being told who holds the value and to ask an\n * admin. The only conflict excluded here is the server's race backstop, which\n * has no id and so has nothing to display beyond its message.\n */\nexport interface IdentifiedMemberContactConflict extends MemberContactConflict {\n conflictingMemberId: number;\n}\n\nexport function isIdentifiedMemberContactConflict(\n conflict: MemberContactConflict | null\n): conflict is IdentifiedMemberContactConflict {\n return !!conflict && conflict.conflictingMemberId !== null;\n}\n\n/**\n * Narrow a thrown value straight to a displayable member conflict — the common\n * call-site need, since a conflict with no id has no resolution UI and belongs\n * in the ordinary error toast.\n */\nexport function asIdentifiedMemberContactConflict(\n error: unknown\n): IdentifiedMemberContactConflict | null {\n const conflict = isMemberContactConflict(error);\n return isIdentifiedMemberContactConflict(conflict) ? conflict : null;\n}\n\nexport interface CreateWorkspaceMemberRequest {\n email?: string;\n phone?: string;\n accountUuid?: string;\n name?: string;\n description?: string;\n externalId?: string;\n dateOfBirth?: string;\n /**\n * Resolve a contact-uniqueness collision by clearing the colliding value off\n * the member currently holding it, in the same transaction that creates this\n * one. Requires `members:admin`. See `MemberContactConflict`.\n */\n releaseContactFromMemberId?: number;\n memberRoleId: number;\n notifySms?: boolean;\n notifyEmail?: boolean;\n notifyVoice?: boolean;\n notifyWhatsapp?: boolean;\n locale?: string;\n timezone?: string;\n labelIds?: number[];\n tosAccepted?: boolean;\n accountEnabled?: boolean;\n isOrgOwner?: boolean;\n accountTosAccepted?: boolean;\n memberType?: MemberType;\n}\n\nexport interface UpdateWorkspaceMemberRequest {\n name?: string | null;\n description?: string | null;\n phone?: string | null;\n email?: string | null;\n externalId?: string | null;\n dateOfBirth?: string | null;\n memberRoleId?: number;\n labelIds?: number[];\n notifySms?: boolean;\n notifyEmail?: boolean;\n notifyVoice?: boolean;\n notifyWhatsapp?: boolean;\n locale?: string | null;\n timezone?: string | null;\n tosAccepted?: boolean;\n accountEnabled?: boolean;\n isOrgOwner?: boolean;\n isSuperuser?: boolean;\n accountTosAccepted?: boolean;\n memberType?: MemberType;\n /**\n * Resolve a contact-uniqueness collision by clearing the colliding value off\n * the member currently holding it, in the same transaction that claims it\n * here. Requires `members:admin`. See `MemberContactConflict`.\n */\n releaseContactFromMemberId?: number;\n}\n\nexport interface MergeMembersRequest {\n targetMemberId: number;\n sourceMemberIds: number[];\n}\n\nexport interface NormalizeMemberRequest {\n memberId: number;\n}\n\nexport interface NormalizeMemberResponse {\n member: WorkspaceMemberResponse;\n changes: Record<string, { old: string; new: string }>;\n}\n\n// Member reporting\nexport interface MemberReportItem {\n id: number;\n account_uuid: string;\n email?: string | null;\n phone?: string | null;\n name?: string | null;\n external_id?: string | null;\n created_at: string;\n updated_at: string;\n member_role_id: number;\n member_role_name: string;\n}\n\n// Query params\nexport interface MembersQueryParams {\n page?: number;\n pageSize?: number;\n sortBy?: MemberSortField;\n sortOrder?: SortOrder;\n search?: string;\n labelIds?: number[];\n memberRoleId?: number;\n memberType?: string;\n hasAccount?: boolean;\n}\n\n// Message activity (admin analytics)\nexport interface MemberMessageActivity {\n [memberId: number]: number[];\n}\n\n// Agent create/update request forms\nexport interface CreateAgentRequest {\n name: string;\n title?: string;\n description?: string;\n email?: string;\n phone?: string;\n externalId?: string;\n /** Omitted → backend defaults to the workspace's canonical Agent role (#16207). */\n memberRoleId?: number;\n labelIds?: number[];\n chatModelId: string;\n /** `null` clears the stored config. Both agent request bodies are applied\n * with `exclude_unset=True` server-side, so an OMITTED key means \"leave the\n * stored value alone\" — only an explicit null detaches a config from the\n * model family it was keyed to. The generated\n * `CreateAgentRequestChatModelConfig` is the loose OpenAPI free-form object;\n * typing it as the real union here is what makes a misshapen payload a\n * compile error instead of a 400. */\n chatModelConfig?: ChatModelConfig | null;\n realtimeModelId?: string;\n realtimeModelConfig?: Record<string, unknown>;\n systemPrompt: string;\n maxDailyActions?: number;\n tools?: string[];\n codeInterpreterEnabled?: boolean;\n webBrowserEnabled?: boolean;\n memoryConfig?: AgentMemoryConfig;\n}\n\nexport interface UpdateAgentRequest {\n name?: string;\n title?: string;\n description?: string;\n email?: string;\n phone?: string;\n externalId?: string;\n memberRoleId?: number;\n labelIds?: number[];\n archived?: boolean;\n chatModelId?: string;\n /** `null` clears the stored config — see CreateAgentRequest. */\n chatModelConfig?: ChatModelConfig | null;\n realtimeModelId?: string;\n realtimeModelConfig?: Record<string, unknown>;\n systemPrompt?: string;\n maxDailyActions?: number;\n tools?: string[];\n codeInterpreterEnabled?: boolean;\n webBrowserEnabled?: boolean;\n memoryConfig?: AgentMemoryConfig;\n}\n\n// Anonymous member resolution forms (client flows)\nexport type AnonymousMemberResolutionStatus = 'pending' | 'resolved' | 'expired';\n\nexport interface ResolveAnonymousMemberRequest {\n targetMemberId: number;\n notes?: string;\n}\n\nexport interface ExpireAnonymousMemberRequest {\n notes?: string;\n}\n\nexport interface CreateAnonymousMemberRequest {\n identifierType: string;\n identifierValue: string;\n name?: string;\n memberRoleId?: number;\n}\n\n// Sync links (app connection sync state for a member)\nexport interface MemberSyncLink {\n id: number;\n connectionId: number;\n connectionName: string;\n connectionType: string;\n entityType: string;\n remoteId: string;\n lastSyncedAt: string | null;\n lastSyncDirection: string | null;\n lastSyncStatus: string | null;\n lastError: string | null;\n propertiesSynced: number;\n syncCount: number;\n createdAt: string;\n}\n","// MCP Server related types.\n// Server response shapes are generated from Pydantic via emit_openapi.py → Orval.\n// Client-only shapes (state enum, forms) are defined below.\n\n// ===== GENERATED SERVER TYPES =====\n\nexport type {\n McpServerResponse,\n McpServerResponse as McpServer,\n McpToolResponse,\n McpToolResponse as McpTool,\n} from './generated/app_connection';\n\n// Prefer the Orval-generated shape so OpenAPI field constraints stay in sync.\nimport type { McpHeaderSecretInput } from './generated/mcp_server';\nexport type { McpHeaderSecretInput };\n\n// ===== CLIENT-ONLY SURFACE =====\n\nexport enum McpServerState {\n REGISTER = 'register',\n AUTHORIZE = 'authorize',\n READY = 'ready',\n}\n\nexport interface McpServerFormData {\n name: string;\n slug?: string;\n description?: string;\n mcpUrl: string;\n appUuid?: string;\n authToken?: string;\n oauthAccessToken?: string;\n oauthClientId?: string; // For manual OAuth registration\n oauthClientSecret?: string; // For manual OAuth registration\n authMetadata?: Record<string, any>; // OAuth authorization server metadata\n supportsDirectAuth?: boolean;\n headerSecrets?: McpHeaderSecretInput[];\n}\n\nexport interface McpServerUpdateFormData {\n name?: string;\n slug?: string;\n description?: string;\n mcpUrl?: string;\n authToken?: string;\n oauthAccessToken?: string;\n oauthClientId?: string; // For manual OAuth registration\n oauthClientSecret?: string; // For manual OAuth registration\n authMetadata?: Record<string, any>; // OAuth authorization server metadata\n supportsDirectAuth?: boolean;\n /** Full replace when provided; blank values keep existing secrets. */\n headerSecrets?: McpHeaderSecretInput[];\n}\n","// Toolkit and Tool related types.\n// Server response shapes are generated from Pydantic via emit_openapi.py → Orval.\n// Client-only shapes (legacy enum alias, tool parameter helper, execute-tool\n// response re-export) are defined below.\n\n// ===== GENERATED SERVER TYPES =====\n\nexport type {\n Tool,\n ToolInputSchema,\n Toolkit,\n ToolkitConnection,\n ToolkitsResponse,\n ToolResponse,\n ToolsResponse,\n} from './generated/toolkit';\n\nexport type { ExecuteToolResponse } from './generated/task';\n\n// ===== CLIENT-ONLY TYPES =====\n\n/** Legacy enum kept for callers using UPPER_SNAKE member names (e.g. ToolkitState.ENABLED). */\nexport enum ToolkitState {\n DISABLED = 'disabled',\n ENABLED = 'enabled',\n AUTH = 'auth',\n}\n\nexport interface ToolParameter {\n name: string;\n type: string;\n description: string;\n required?: boolean;\n enum?: string[];\n default?: any;\n}\n","// Event-related types for event rules, webhooks, routines, and automation.\n// Server response shapes are generated from Pydantic via emit_openapi.py → Orval.\n// Client-only action params, form data, and query params are defined below.\n\nimport type { SortOrder } from './core-types';\nimport type { MemberNotifyActionParams } from './notification-types';\nimport type {\n EventRunSortField,\n RoutineSortField,\n RuleExecutionSortField,\n WebhookLogSortField,\n} from './sort-types';\n\n// ===== GENERATED SERVER TYPES =====\n\nimport type { EventRuleResponse as GeneratedEventRuleResponse } from './generated/event_rule';\n\nexport type { EventActionMapping, EventActionMappingsResponse } from './generated/event_rule';\n\n/** Client enums — preserve UPPER_SNAKE member names used across the app.\n *\n * OpenAPI codegen emits lowercase const-objects in `generated/event_rule.ts`.\n * The app imports these enums everywhere (config objects, switch statements, i18n\n * keys). We keep hand-written enums here and assert below that every generated\n * string-literal value has a matching client member. When the backend adds a new\n * event/action/object type, add it to the Pydantic model, run `yarn generate:types`,\n * then add the UPPER_SNAKE member here. */\nexport enum EventRuleObjectType {\n TASK = 'task',\n WORKSPACE = 'workspace',\n CHAT = 'chat',\n DATA_RECORD = 'data_record',\n MEMBER = 'member',\n ROUTINE = 'routine',\n WORKFLOW = 'workflow',\n CALENDAR = 'calendar',\n CALENDAR_EVENT_TYPE = 'calendar_event_type',\n JOURNEY = 'journey',\n CALL = 'call',\n VOICEMAIL = 'voicemail',\n FAX = 'fax',\n}\n\nexport enum EventRuleEventType {\n TASK_EXECUTE = 'task:execute',\n TASK_ENTER = 'task:enter',\n TASK_COMMAND = 'task:command',\n TASK_EXIT = 'task:exit',\n MEMBER_JOINED = 'workspace:member_joined',\n MEMBER_LEFT = 'workspace:member_left',\n DATA_RECORD_CREATED = 'data_record:created',\n DATA_RECORD_UPDATED = 'data_record:updated',\n DATA_RECORD_CHANGED = 'data_record:changed',\n CHAT_CREATED = 'chat:created',\n /** Fires after a chat summary is generated on any channel. */\n CHAT_SUMMARY = 'chat:summary',\n /**\n * Fires after a user/assistant Message is persisted (GRA-8699) — every\n * channel, including paused and human-handled chats. Filter by channel /\n * direction / workflow via triggerParams.\n */\n MESSAGE_CREATED = 'message:created',\n /**\n * Fires when a tracked link (`{{links.<key>}}` → `/x/{slug}`) is clicked\n * (GRA-8733). Fires on the FIRST click per member per destination only,\n * attributed clicks only, and only when triggerParams name a scope\n * (`destinationKeys` or `workflowUuids`).\n */\n LINK_CLICKED = 'link:clicked',\n CHAT_CALLBACK = 'chat:callback',\n MEMBER_UPDATED = 'member:updated',\n ROUTINE_TRIGGERED = 'routine:triggered',\n ASSISTANT_MESSAGE = 'workflow:assistant_message',\n USER_MESSAGE = 'workflow:user_message',\n /** Fires when an assignment STARTS — `task:execute` one level up, for\n * workflows that have no tasks to hang a rule off. */\n WORKFLOW_EXECUTE = 'workflow:execute',\n CALENDAR_EVENT_CREATED = 'calendar_event:created',\n CALENDAR_EVENT_UPDATED = 'calendar_event:updated',\n CALENDAR_EVENT_CANCELLED = 'calendar_event:cancelled',\n CALENDAR_EVENT_STARTING = 'calendar_event:starting',\n CALENDAR_EVENT_ENDED = 'calendar_event:ended',\n CALENDAR_EVENT_NO_SHOW = 'calendar_event:no_show',\n CONNECTOR_EVENT = 'connector:event',\n ASSIGNMENT_CONCLUDED = 'assignment:concluded',\n JOURNEY_STEP_EXECUTE = 'journey_step:execute',\n JOURNEY_ENROLLED = 'journey:enrolled',\n JOURNEY_COMPLETED = 'journey:completed',\n CALL_STARTED = 'call:started',\n CALL_COMPLETED = 'call:completed',\n CALL_SUMMARY = 'call:summary',\n VOICEMAIL_RECEIVED = 'voicemail:received',\n FAX_RECEIVED = 'fax:received',\n}\n\nexport enum EventRuleActionType {\n MEMBER_NOTIFY_ACTION = 'member:notify',\n MEMBER_LABEL_ACTION = 'member:label',\n MEMBER_UPSERT = 'member:upsert',\n SEND_WEBHOOK = 'webhook:send',\n SWITCH_TASK_ACTION = 'task:switch',\n ASSISTANT_MESSAGE = 'assistant:message',\n FORM_FIELD_UPDATE = 'form:update_field',\n CEL_MUTATE = 'record:cel_mutate',\n RECORD_COPY_FIELDS = 'record:copy_fields',\n RECORD_UPSERT_LINKED = 'record:upsert_linked',\n RECORD_VERIFY_FIELDS = 'record:verify_fields',\n MESSAGE_VALIDATION = 'message:validation',\n CHAT_CREATE = 'chat:create',\n CHAT_CONTINUE = 'chat:continue',\n CHAT_PAUSE = 'chat:pause',\n CHAT_SUMMARIZE = 'chat:summarize',\n EMAIL_SEND = 'email:send',\n INVOKE_CUSTOM_TOOL = 'custom_tool:invoke',\n MONDAY_UPSERT_ITEM = 'monday:upsert_item',\n MONDAY_REFRESH = 'monday:refresh',\n ASSIGNMENT_CONCLUDE = 'assignment:conclude',\n JOURNEY_ENROLL = 'journey:enroll',\n SMS_SEND = 'sms:send',\n WHATSAPP_SEND = 'whatsapp:send',\n PHONE_CALL = 'phone:call',\n CONNECTION_SYNC = 'connection:sync',\n CONNECTOR_OPERATION = 'connector:operation',\n ECW_REFRESH_MEMBER_ENCOUNTERS = 'ecw:refresh_member_encounters',\n PLAY_AUDIO = 'audio:play',\n CHARLESTON_SEND_PMD_PAGE = 'charleston:send_pmd_page',\n PATIENTSYNC_TRANSFER = 'patientsync:transfer',\n}\n\nimport type {\n EventRuleActionType as GeneratedEventRuleActionType,\n EventRuleEventType as GeneratedEventRuleEventType,\n EventRuleObjectType as GeneratedEventRuleObjectType,\n} from './generated/event_rule';\n\n/** Fail compile if OpenAPI adds a value with no UPPER_SNAKE client enum member. */\ntype _AssertGeneratedEventTypesCovered = GeneratedEventRuleEventType extends `${EventRuleEventType}`\n ? true\n : never;\ntype _AssertGeneratedActionTypesCovered =\n GeneratedEventRuleActionType extends `${EventRuleActionType}` ? true : never;\ntype _AssertGeneratedObjectTypesCovered =\n GeneratedEventRuleObjectType extends `${EventRuleObjectType}` ? true : never;\n\nconst _eventRuleEnumDriftCheck: [\n _AssertGeneratedEventTypesCovered,\n _AssertGeneratedActionTypesCovered,\n _AssertGeneratedObjectTypesCovered,\n] = [true, true, true];\nvoid _eventRuleEnumDriftCheck;\n\n/** Narrow actionParams — OpenAPI types this as Record<string, unknown>. */\nexport function eventRuleActionParams<T>(params: Record<string, unknown> | null | undefined): T {\n return (params ?? {}) as T;\n}\n\n/** Re-bind enum fields to client enums (generated OpenAPI uses string-literal unions). */\nexport type EventRuleResponse = Omit<\n GeneratedEventRuleResponse,\n 'objectType' | 'eventType' | 'actionType' | 'actionParams' | 'triggerParams'\n> & {\n objectType: EventRuleObjectType;\n eventType: EventRuleEventType;\n actionType: EventRuleActionType;\n actionParams: Record<string, unknown> | null;\n triggerParams: Record<string, unknown> | null;\n workflowRevisionId?: number | null;\n};\n\nexport type EventRule = EventRuleResponse;\n\nexport type {\n MemberSummary,\n RoutineConfigEventResponse,\n RoutineConfigEventResponse as RoutineConfigEvent,\n RoutineRunResponse,\n RoutineRunResponse as RoutineRun,\n RoutineVoiceReadinessPreviewResponse,\n RoutineVoiceReadinessWarningResponse,\n SchedulePreviewResponse,\n} from './generated/routine';\n\nimport type {\n RoutineResponse as GeneratedRoutineResponse,\n RoutineRunResponse,\n} from './generated/routine';\n\n/** OpenAPI omits nested last run; list/detail endpoints include it when available. */\nexport type RoutineVisibility = 'private' | 'workspace';\n/**\n * `NONE` (no time trigger — webhook / manual `/run` only) and `MANUAL` are\n * retired modes: no request mints them, but a legacy stored row can still hold\n * one, so a response may carry them.\n */\nexport type RoutineScheduleMode = 'ONCE' | 'CRON' | 'INTERVAL' | 'NONE' | 'MANUAL';\n\nexport interface RoutineResponse extends Omit<\n GeneratedRoutineResponse,\n 'eventRules' | 'visibility' | 'scheduleMode' | 'webhookEnabled'\n> {\n visibility: RoutineVisibility;\n scheduleMode: RoutineScheduleMode;\n webhookEnabled: boolean;\n lastRun?: RoutineRunResponse;\n eventRules?: EventRuleResponse[];\n}\n\nexport type Routine = RoutineResponse;\n\nexport type {\n RuleExecutionResponse,\n RuleExecutionResponse as RuleExecution,\n WebhookLogResponse,\n WebhookLogResponse as WebhookLog,\n} from './generated/rule_execution';\n\n// ===== SECRET HANDLING =====\n\n/**\n * Sentinel value returned by the API when a secret field (like apiToken) is set.\n * The client should detect this value and show a \"secret is set\" state instead\n * of the actual value. When sending updates, if the user hasn't changed the\n * secret, either omit the field or don't include it in the request.\n */\nexport const MASKED_SECRET_SENTINEL = '__SECRET_SET__';\n\n// ===== EVENT RULE ACTION PARAMETERS =====\n\n// Re-export MemberNotifyActionParams for backward compatibility\nexport type { MemberNotifyActionParams };\n\nexport interface MemberLabelActionParams {\n addLabelIds?: string[];\n removeLabelIds?: string[];\n}\n\nexport type MemberUpsertBehavior = 'upsert' | 'create_only' | 'update_only';\n\nexport interface MemberUpsertActionParams {\n /** Controls create/update behavior: 'upsert' (default), 'create_only', or 'update_only' */\n behavior?: MemberUpsertBehavior;\n /** If true and member exists, skip instead of failing (only for create_only) */\n skipIfExists?: boolean;\n /** If true and member not found, skip instead of failing (only for update_only) */\n skipIfNotFound?: boolean;\n}\n\nexport interface WebhookActionParams {\n webhookUrl: string;\n signingSecret?: string;\n}\n\nexport interface TestWebhookRequest {\n webhookUrl: string;\n payload: Record<string, unknown>;\n signingSecret?: string;\n}\n\nexport interface TestWebhookResponse {\n success: boolean;\n statusCode?: number | null;\n responseBody?: string | null;\n errorMessage?: string | null;\n durationMs: number;\n}\n\nexport interface SwitchTaskActionParams {\n taskUUID: string;\n}\n\nexport interface AssistantMessageActionParams {\n message: string;\n suggestions?: string[];\n // Translation support - maps locale to translated message/suggestions\n messageTranslations?: Record<string, string>;\n suggestionTranslations?: Record<string, string[]>;\n // Per-direction overrides (Phase 1). When set and non-empty, these win over\n // `message` for the matching direction; otherwise `message` is used as the\n // universal fallback.\n inboundMessage?: string;\n outboundMessage?: string;\n /**\n * When false, the injected assistant message does NOT end the agent\n * turn — the loop keeps running so a follow-up model response can be\n * generated after the canned filler. Default true preserves the\n * existing \"ends-the-turn\" semantics for every existing rule whose\n * JSON lacks the new key.\n */\n waitForResponse?: boolean;\n}\n\n/** Another field of the same Form, set by the same `form:update_field` write. */\nexport interface FormFieldUpdateAdditionalField {\n fieldSlug: string;\n value: unknown;\n}\n\nexport interface FormFieldUpdateActionParams {\n fieldPath?: string; // Format: \"datatype.field\"\n value: any;\n // More fields of the `fieldPath` Form, written in the same update. Each\n // field may appear once, and not repeat the `fieldPath` field.\n additionalFields?: FormFieldUpdateAdditionalField[];\n updateType?: 'newest' | 'oldest' | 'create' | 'trigger' | 'matchField' | 'selector';\n // Dynamic selection params (updateType: matchField)\n matchField?: string;\n matchValue?: any;\n tiebreaker?: 'newest' | 'oldest';\n // Dynamic selection params (updateType: selector)\n selector?: string;\n // Shared option for matchField / selector: create a new record when none match\n createIfMissing?: boolean;\n}\n\nexport interface MessageValidationActionParams {\n condition?: string; // CEL expression that determines if the message is invalid\n reason?: string; // Custom rejection reason\n}\n\nexport interface ChatCreateActionParams {\n workflowUUID?: string; // New workflow-based approach\n taskUUID?: string; // Legacy task-based approach (for backward compatibility)\n channel?: string; // Single channel: 'phone-sms' | 'phone-voice' | 'email' | 'web-chat'\n channels?: string[]; // Legacy array of channels (for backward compatibility)\n phoneNumberUUID?: string; // Required when phone-sms or phone-voice is selected\n inboxUUID?: string; // Required when email is selected\n initialUserMessage?: string; // Optional synthetic member turn that seeds the AI\n messageTemplate?: string; // Optional opening message the member receives (rung 1 override)\n}\n\nexport interface ChatContinueActionParams {\n assistantPrompt?: string; // Optional prompt to determine if continuation is needed (e.g., \"if the chat has not yet been continued\")\n updateType?: string; // Optional update type\n}\n\nexport interface ChatPauseActionParams {\n message?: string; // Optional assistant message to send when pausing the chat\n}\n\nexport interface ChatSummarizeActionParams {\n summarizationPrompt?: string; // Optional prompt to focus the summarization\n chatModel?: string; // Optional chat model to use for summarization\n}\n\nexport interface InvokeCustomToolActionParams {\n /** UUID of the custom tool to invoke (canonical identifier, issue #10893). */\n customToolUUID?: string;\n /** Legacy integer id of the custom tool. Kept for backward compat with pre-rename rules. */\n customToolId?: number;\n outputMode?: 'none' | 'tool_output' | 'assistant_message';\n}\n\nexport interface ConcludeAssignmentActionParams {\n // Completion outcomes: 'success' | 'failed' | 'referred'\n // Cancellation outcomes: 'caller_hangup' | 'member_unsubscribe' | 'admin_canceled'\n // | 'expired' | 'system_error' | 'busy' | 'no_answer'\n outcome: string;\n reason?: string; // Optional reason for conclusion\n}\n\nexport interface JourneyEnrollActionParams {\n /** UUID of the journey to enroll the member in. */\n journeyUUID: string;\n /**\n * When true, a member whose enrollment in this journey is COMPLETED is\n * restarted from the beginning. Active, paused and canceled enrollments\n * are left unchanged. Omitted (the default) means an existing enrollment\n * in any status is skipped.\n */\n reenrollCompleted?: boolean;\n}\n\n/**\n * Parameters for the ``audio:play`` event-rule action.\n *\n * Plays a pre-recorded workspace audio file on the current voice call.\n * Composes with ``task:execute`` rules + CEL conditions on\n * ``call.answered_by`` to deliver guaranteed-delivery disclosure\n * recordings without the LLM in the loop. See the backend handler at\n * ``lib/rules/actions/builtin/play_audio.py``.\n */\nexport interface PlayAudioActionParams {\n /** UUID of the workspace File row to play. Required. */\n clipFileUuid: string;\n /**\n * When false, the clip plays end-to-end ignoring barge-in. Pair with\n * ``hangUpOnAudioEnd: true`` for compliance recordings that must not\n * be interrupted by speech. Defaults to true.\n */\n allowInterrupt?: boolean;\n /**\n * When true, the call hangs up immediately after the clip finishes\n * streaming — no further LLM turns. Defaults to false.\n */\n hangUpOnAudioEnd?: boolean;\n /**\n * Playback volume as a percent in [0, 100]. ``80`` is the unity\n * baseline — no gain adjustment is applied. Higher values boost,\n * lower values attenuate. Clipped at the int16 ceiling so a 100%\n * setting on already-hot source material won't introduce\n * distortion beyond the source's own. Defaults to 80.\n */\n volume?: number;\n}\n\nexport interface EmailSendActionParams {\n subjectTemplate?: string; // Email subject — required for one-off; with workflowUUID, sends a separate one-off email before opening the workflow chat\n bodyTemplate?: string; // Email body — required for one-off; with workflowUUID, sends a separate one-off email before opening the workflow chat\n inboxUUID: string; // UUID of the inbox to send from\n toEmail?: string; // Comma-separated one-off recipient overrides (maximum 20; defaults to member's email); ignored only by the workflow-chat leg\n contentType?: 'text' | 'html'; // Content type: 'text' for plain text, 'html' for HTML (default: 'text')\n workflowUUID?: string; // Start a conversation with this workflow after sending\n initialUserMessage?: string; // Initial message to send from user when starting conversation\n}\n\nexport interface SmsSendActionParams {\n phoneNumberUUID: string; // UUID of the phone number to send from\n messageTemplate?: string; // SMS body — required for one-off, optional for workflow-only; if provided with workflow, sent as initial message\n workflowUUID?: string; // Start a conversation with this workflow after sending\n initialUserMessage?: string; // Initial message to send from user when starting conversation\n}\n\nexport interface PhoneCallActionParams {\n phoneNumberUUID: string; // Required: UUID of the phone number to call from\n workflowUUID: string; // Required: UUID of the workflow to use for the call\n}\n\n/**\n * Parameters for the ecw:refresh_member_encounters action.\n * Refreshes the local eCW encounter cache for the target member before\n * later actions (such as phone:call) run in the same rule chain.\n */\nexport interface EcwRefreshMemberEncountersActionParams {\n /** ID of the eCW FHIR connection whose encounter cache should be refreshed. */\n connectionId: number;\n /** Days of encounter history to pull on this refresh. Defaults to 30. */\n lookbackDays?: number;\n /**\n * When true (default), a refresh failure raises a non-retryable action\n * error so later rules in the same chain do not run. Set to false only\n * when a time-critical outreach must proceed with stale cache on refresh\n * failure.\n */\n haltOnFailure?: boolean;\n}\n\n/**\n * Column mapping for Monday.com create item action.\n * Stores the column slug (e.g., 'text_abc123') and the user-friendly label\n * along with the Jinja template value.\n */\nexport interface MondayColumnMapping {\n columnId: string; // Monday.com column slug (e.g., 'text_abc123', 'status')\n columnTitle: string; // User-friendly column label (e.g., 'Description', 'Status')\n columnType: string; // Column type (e.g., 'text', 'status', 'date')\n template: string; // Jinja template string for the value\n}\n\n/**\n * Upsert mode for Monday.com item action.\n * Controls whether to create new items, update existing items, or both.\n */\nexport type MondayUpsertMode = 'create_only' | 'update_only' | 'upsert';\n\n/**\n * Lookup type for Monday.com item action.\n * Controls how to find existing items to update.\n */\nexport type MondayLookupType = 'column_value' | 'item_id';\n\n/**\n * Behavior when multiple items match the lookup criteria.\n */\nexport type MultiMatchBehavior = 'fail' | 'update_first' | 'update_all';\n\n/**\n * Parameters for upserting (create or update) a Monday.com item.\n * This is the primary action for Monday.com item operations.\n */\nexport interface MondayUpsertItemActionParams {\n boardId: string; // Monday.com board ID\n groupId?: string; // Optional: Group ID within the board (for new items)\n itemNameTemplate?: string; // Template for item name when creating (required for create modes)\n columnMappings?: MondayColumnMapping[]; // Column mappings with templates\n\n // Lookup configuration - used to find existing items to update\n lookupType?: MondayLookupType; // 'column_value' (default) or 'item_id'\n lookupColumnId?: string; // Column ID to search by (only for column_value lookup)\n lookupValueTemplate?: string; // Template for lookup value or Item ID\n\n // Upsert mode controls the action behavior\n upsertMode?: MondayUpsertMode; // 'create_only' | 'update_only' | 'upsert' (default: 'upsert')\n\n // Behavior flags\n multiMatchBehavior?: MultiMatchBehavior; // Behavior when multiple items match (default: 'fail')\n\n // OAuth token is copied from user's connection at rule creation time\n apiToken?: string; // Monday.com API token (auto-populated from OAuth, encrypted at rest)\n}\n\n/**\n * Column mapping for Monday.com refresh action.\n * Maps Monday.com columns to member or data fields.\n */\nexport interface MondayRefreshColumnMapping {\n columnId: string; // Monday.com column slug (e.g., 'text_abc123')\n columnType: string; // Column type (e.g., 'text', 'email', 'phone', 'status')\n}\n\n/**\n * Parameters for refreshing member data from Monday.com.\n * Fetches data from a Monday.com item and updates the local member record.\n */\nexport interface MondayRefreshActionParams {\n boardId: string; // Monday.com board ID containing the item\n itemIdSource?: string; // Template to get Monday item ID (default: '{{member.external_id}}')\n skipIfNoItemId?: boolean; // Skip if item ID cannot be determined (default: true)\n\n // Member field mappings: field_name -> {columnId, columnType}\n memberFieldMappings?: Record<string, MondayRefreshColumnMapping>;\n\n // Data field mappings for form data\n dataFieldMappings?: Record<string, any>;\n\n // OAuth token is copied from user's connection at rule creation time\n apiToken?: string; // Monday.com API token (auto-populated from OAuth, encrypted at rest)\n}\n\n// ===== CLIENT-ONLY FORM / INPUT TYPES =====\n\nexport interface EventRuleFormData {\n name?: string | null;\n uuid?: string; // Optional - if provided, will be used instead of auto-generated\n // can only set object type on create\n objectType: EventRuleObjectType;\n eventType: EventRuleEventType;\n conditions?: string | null;\n actionType: EventRuleActionType;\n actionParams?: Record<string, any>;\n triggerParams?: Record<string, any>;\n active?: boolean;\n taskId?: number | null;\n dataTypeId?: number | null;\n routineId?: number | null;\n workflowRevisionId?: number | null;\n calendarId?: number | null;\n calendarEventTypeId?: number | null;\n journeyStepId?: number | null;\n delay?: number; // Delay in seconds\n order?: number; // Order of execution\n}\n\nexport interface UpdateEventRuleFormData {\n // Only allow updating these fields after creation\n name?: string | null;\n conditions?: string | null;\n actionParams?: Record<string, any>;\n triggerParams?: Record<string, any>;\n active?: boolean;\n delay?: number; // Delay in seconds\n order?: number; // Order of execution\n // NOTE: objectType, eventType, actionType, and source object fields (taskId, etc.)\n // cannot be updated after creation\n}\n\n/**\n * Input type for batch event rule operations (create/update with parent object).\n * Used when syncing event rules as part of a task or workflow update.\n * UUID is required and used for matching existing rules.\n */\nexport interface EventRuleInput {\n uuid: string; // Required - used for matching/creating rules\n name?: string | null;\n objectType?: EventRuleObjectType; // Optional - inferred from parent object when used inline\n eventType: EventRuleEventType;\n actionType: EventRuleActionType;\n actionParams?: Record<string, any> | null;\n triggerParams?: Record<string, any> | null;\n conditions?: string | null;\n active?: boolean;\n delay?: number; // Delay in seconds (default 0)\n}\n\nexport interface WebhookLogsQueryParams {\n page?: number;\n pageSize?: number;\n sortBy?: WebhookLogSortField;\n sortOrder?: SortOrder;\n eventType?: EventRuleEventType;\n success?: boolean;\n}\n\nexport interface RuleExecutionsQueryParams {\n cursor?: string;\n pageSize?: number;\n sortBy?: RuleExecutionSortField;\n sortOrder?: SortOrder;\n ruleId?: number;\n status?: string;\n triggerType?: string;\n actionSlug?: string;\n objectType?: string;\n eventType?: string;\n actionType?: string;\n workflowRevisionId?: number;\n}\n\n// ===== ROUTINES (CLIENT-ONLY) =====\n\n// prettier-ignore\nexport type RoutineRunStatus =\n | 'PENDING'\n | 'IN_PROGRESS'\n | 'COMPLETED'\n | 'FAILED'\n | 'CANCELLED'\n | 'SKIPPED';\n\nexport interface CreateRoutineRequest {\n name: string;\n description?: string;\n scheduleEnabled?: boolean;\n scheduleMode?: 'ONCE' | 'CRON' | 'INTERVAL';\n scheduledTime?: string;\n intervalSeconds?: number;\n repeatCount?: number;\n cronString?: string;\n /** IANA timezone the cronString is interpreted in (e.g.\n * \"America/Los_Angeles\"). Omit to default to the workspace timezone,\n * else UTC. Only meaningful for CRON mode. */\n timezone?: string;\n startDate?: string;\n memberFilterId?: number | null;\n targetMemberId?: number | null;\n workflowId?: number | null;\n /** Plain instruction executed by the selected Agent or the Workspace Manager. */\n prompt?: string | null;\n /** Agent responsible for executing a plain prompt. */\n agentId?: number | null;\n /** Optional starting skills for the plain prompt. */\n skills?: string[] | null;\n limit?: number;\n visibility?: 'private' | 'workspace';\n /** When true, the server generates a webhook secret and returns its\n * plaintext exactly once in the create response. */\n webhookEnabled?: boolean;\n /** Ordered event rules to attach in the same request. Server syncs by\n * UUID: same-UUID updates, new UUID creates, omitted UUIDs are deleted. */\n eventRules?: EventRuleInput[];\n}\n\nexport interface UpdateRoutineRequest {\n name?: string;\n description?: string;\n scheduleEnabled?: boolean;\n /** A retired mode may be re-sent unchanged on a disabled row; enabling one\n * is rejected by the server. */\n scheduleMode?: 'ONCE' | 'CRON' | 'INTERVAL' | 'NONE' | 'MANUAL';\n scheduledTime?: string;\n intervalSeconds?: number;\n repeatCount?: number;\n cronString?: string;\n /** IANA timezone the cronString is interpreted in. Pass empty string \"\"\n * to reset it to the workspace timezone — the server stores that value\n * explicitly rather than clearing the field. Omit to leave unchanged. */\n timezone?: string;\n /** ISO 8601 datetime string for deferred start. Pass empty string \"\" to clear the start date. */\n startDate?: string;\n memberFilterId?: number | null;\n targetMemberId?: number | null;\n workflowId?: number | null;\n prompt?: string | null;\n agentId?: number | null;\n skills?: string[] | null;\n limit?: number;\n visibility?: 'private' | 'workspace';\n /** Ordered event rules to attach. Server syncs by UUID: same-UUID rows\n * update, new UUIDs create, UUIDs missing from the list are deleted.\n * Omit the field to leave existing rules untouched. */\n eventRules?: EventRuleInput[];\n /** Toggle inbound webhook. Enabling without a stored secret generates one and surfaces plaintext in the response exactly once. */\n webhookEnabled?: boolean;\n /** Rotate the stored secret without toggling enabled. Ignored when webhookEnabled=false. */\n rotateWebhookSecret?: boolean;\n}\n\nexport interface RoutinesQueryParams {\n page?: number;\n pageSize?: number;\n sortBy?: RoutineSortField;\n sortOrder?: SortOrder;\n /**\n * 'mine' = routines I own, 'shared' = workspace-visible from others,\n * 'all' = both. 'all_including_private' = every routine in the\n * workspace; requires AUTOMATIONS_ADMIN and will 403 otherwise.\n */\n owner?: 'mine' | 'shared' | 'all' | 'all_including_private';\n /** Narrow within the visibility filter; never widens it. */\n ownerId?: number;\n /** Narrow to Routines associated with this Agent. Never widens visibility. */\n agentId?: number;\n /** Narrow to Routines associated with an Agent. Never widens visibility. */\n agentOnly?: boolean;\n}\n\nexport interface RoutineRunsQueryParams {\n page?: number;\n pageSize?: number;\n sortBy?: EventRunSortField;\n sortOrder?: SortOrder;\n routineId?: number;\n memberId?: number;\n status?: RoutineRunStatus;\n}\n\nexport interface SchedulePreviewRequest {\n cronString: string;\n count?: number;\n /** IANA timezone the cronString is interpreted in (default UTC) so the\n * previewed run times match what the dispatcher will fire. */\n timezone?: string;\n}\n\n/**\n * Draft input for the non-persisting Routine voice-readiness preview\n * (`POST /routines/preview-voice-readiness`). Hand-written (like\n * {@link SchedulePreviewRequest}) so `eventRules` uses the app's\n * {@link EventRuleInput} shape rather than the generated `EventRuleData`.\n */\nexport interface RoutineVoiceReadinessPreviewRequest {\n /** Set on update-style previews; the route enforces owner-or-admin. */\n routineId?: number | null;\n name?: string | null;\n memberFilterId?: number | null;\n targetMemberId?: number | null;\n eventRules?: EventRuleInput[] | null;\n}\n\nexport interface TaskExportEventRuleRelation {\n taskUuid: string;\n eventRuleUuid: string;\n ruleType: string;\n}\n\nexport interface EventRuleExportItem {\n uuid: string;\n name: string;\n eventType: string;\n objectType: string;\n conditions: string | null;\n actionType: string;\n actionParams: Record<string, any>;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: credit_stop_service\n */\n\n\n/**\n * The remedy for a sending stop, as a bounded customer-action slug.\n *\n * Deliberately a *plan-level* answer, not an audience decision: the server\n * says which remedy clears this subscription's stop, and the caller decides\n * whether this viewer can enact it or must ask the billing owner. See\n * ``resolve_sending_next_step``.\n */\nexport type SendingNextStep = typeof SendingNextStep[keyof typeof SendingNextStep];\n\n\nexport const SendingNextStep = {\n add_credits: 'add_credits',\n subscribe: 'subscribe',\n contact_billing_owner: 'contact_billing_owner',\n} as const;\n\n/**\n * Whether outbound sending is stopped for credits, and why (GRA-9085).\n *\n * The credit states that must not be conflated, plus the healthy one:\n *\n * - ``OK`` — nothing is stopped on the credit axis.\n * - ``CREDITS_SUSPENDED`` — the hard credit gate fired:\n * ``Subscription.usage_suspended`` with reason ``credit_exhaustion``. The\n * platform IS refusing operations right now (HTTP 402, the outbound\n * ``credits_suspended`` pre-dispatch block).\n * - ``OUT_OF_CREDITS`` — the balance is empty but nothing has suspended the\n * org (soft enforcement, or before a hard gate's next check persists).\n * Sending has NOT necessarily stopped, and copy must not claim it has.\n * - ``OPERATOR_SUSPENSION`` — ``usage_suspended`` for any other reason\n * (operator, dunning, dispute, cancel), including a NULL reason, which is\n * treated as operator-controlled — the same conservative default the\n * exhaustion UPDATE uses in ``lib/services/budget_enforcement_helpers.py``.\n * A top-up does NOT clear this.\n * - ``BILLING_UNRESOLVED`` — the organization has subscription history but no\n * *resolvable metered* subscription. This is the case the usage gate\n * **fail-closes** on: ``check_credits_before_operation`` refuses the\n * operation precisely when it finds no metered subscription for an org with\n * prior subscription rows. A surface that reported this as ``OK`` would\n * show \"sending is fine\" for a workspace the gate is refusing — the exact\n * invisibility GRA-9085 exists to remove, so the state is explicit rather\n * than folded into health.\n *\n * A provider/Twilio outage is deliberately NOT a member. ``credits_suspended``\n * and the systemic-terminal provider reasons are disjoint, and the credit\n * surface must never attribute a message-delivery fault to billing.\n */\nexport type SendingStopState = typeof SendingStopState[keyof typeof SendingStopState];\n\n\nexport const SendingStopState = {\n ok: 'ok',\n credits_suspended: 'credits_suspended',\n out_of_credits: 'out_of_credits',\n operator_suspension: 'operator_suspension',\n billing_unresolved: 'billing_unresolved',\n} as const;\n","// Billing and subscription-related types.\n// Server response shapes are generated from Pydantic via emit_openapi.py → Orval.\n// Client-only enums, request bodies, and Stripe form types are defined below.\n\n// ===== GENERATED SERVER TYPES =====\n\nexport type {\n BillingPeriodResponse,\n BillingPeriodResponse as BillingPeriod,\n BillableService,\n BookOfBusinessAcquisitionDistribution,\n BookOfBusinessActiveSubscription,\n BookOfBusinessOrganization,\n BookOfBusinessPlanDistribution,\n BookOfBusinessProduct,\n BookOfBusinessResponse,\n BookOfBusinessSummary,\n CompareWithStripeResponse,\n CreditsByService,\n InvoiceResponse,\n InvoiceResponse as Invoice,\n LocalPlanData,\n LocalPlanData as ProductPlan,\n OrgWorkspaceUsageCard,\n OrgWorkspaceUsageResponse,\n OrgWorkspaceUsageResponse as OrgWorkspaceUsage,\n PaginatedSubscriptionsResponse,\n PlanComparisonResult,\n PlanConfig,\n PlanConfig as PlanConfiguration,\n ProductImage,\n ProductLink,\n ProductMetadata,\n ProductResponse as GeneratedProductResponse,\n ResourceCounts,\n ResourceCounts as BillingResourceCounts,\n StripeComparisonResult,\n StripeCustomerResponse,\n StripeCustomerResponse as StripeCustomer,\n StripePlanDetail,\n StripePriceData,\n StripePriceData as StripePrice,\n StripeProductData,\n StripeProductData as StripeProduct,\n SubscriptionItemResponse,\n SubscriptionItemResponse as SubscriptionItem,\n SubscriptionResponse,\n SubscriptionResponse as GeneratedSubscriptionResponse,\n SupplierSubscriptionResponse,\n SyncProductToStripeResponse,\n UsageDiscrepancy,\n UsageInfo,\n UsageInfo as BillingUsageInfo,\n WorkspaceModelUsage,\n WorkspaceSendingStatusResponse,\n} from './generated/billing';\n\n// Both names are an Orval const object AND a type of the same name, so a value\n// re-export carries both meanings. The sending-status surface switches on them\n// to choose the customer copy and the next-step action. They live in the\n// service's own generated module because the backend declares them in\n// ``lib/services/credit_stop_service.py`` — a transport DTO must not own the\n// domain vocabulary.\nexport { SendingNextStep, SendingStopState } from './generated/credit_stop_service';\n\n// PaginatedResponse[...] wrappers are auto-grouped into the shared `common`\n// module, so the reseller paginated shape is re-exported from there.\nexport type { PaginatedResponseSupplierSubscriptionResponse } from './generated/common';\n\nimport type {\n PlanConfig,\n PlanInfo as GeneratedPlanInfo,\n ProductMetadata,\n ProductResponse as GeneratedProductResponse,\n SubscriptionResponse as GeneratedSubscriptionResponse,\n UsageDashboardResponse as GeneratedUsageDashboardResponse,\n} from './generated/billing';\n\n/**\n * Subscription list/detail shape. OpenAPI marks several denormalized display fields\n * optional (creditPriceCents, cancelAtPeriodEnd, isDirect, …) because the Pydantic\n * model uses Optional — list endpoints still populate them in normal responses.\n */\nexport type Subscription = GeneratedSubscriptionResponse;\n\nexport type SubscriptionItemPriceType = 'plan' | 'overage' | 'phone_number';\n\nexport type PlanInfo = GeneratedPlanInfo;\n\nexport type BillingPlanInfo = PlanInfo;\n\nexport type UsageDashboardResponse = Omit<GeneratedUsageDashboardResponse, 'plan'> & {\n plan: PlanInfo;\n};\n\n// ===== CREDIT GRANT TYPES =====\n\nexport type CreditGrantType = 'plan_inclusion' | 'reload' | 'purchase' | 'promotional';\nexport type CreditGrantStatus = 'pending' | 'active' | 'frozen' | 'depleted' | 'expired' | 'voided';\n\nexport interface CreditGrant {\n id: number;\n uuid: string;\n subscriptionId: number;\n customerId: number;\n customerWorkspaceId: number | null;\n grantType: CreditGrantType;\n amountCents: number;\n priority: number;\n creditUnits: number;\n remainingUnits: number;\n effectiveAt: string;\n expiresAt: string | null;\n status: CreditGrantStatus;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreditGrantListResponse {\n items: CreditGrantSummary[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n}\n\nexport interface CreditGrantSummary {\n id: number;\n uuid: string;\n subscriptionId: number;\n grantType: CreditGrantType;\n creditUnits: number;\n remainingUnits: number;\n amountCents: number;\n status: CreditGrantStatus;\n priority: number;\n reason: string | null;\n effectiveAt: string | null;\n expiresAt: string | null;\n createdAt: string | null;\n}\n\nexport interface CreditBalance {\n balance: number; // remaining credits\n totalGranted: number; // total for this period\n used: number; // consumed this period\n reloadsThisPeriodCents: number;\n extraUsageEnabled: boolean;\n reloadAmountCents: number | null;\n reloadThresholdCents: number | null;\n monthlyReloadLimitCents: number | null;\n}\n\n// ===== PRODUCT TYPES =====\n\n// Product feature interface\nexport interface ProductFeature {\n id: number;\n productId: number;\n featureKey: string;\n createdAt: string;\n}\n\n// ===== PRODUCT FEATURE TYPES =====\n\n/**\n * Workspace product feature flags.\n *\n * Hand-maintained mirror of the Python `WorkspaceFeature` enum in\n * `lib/constants.py`, which is authoritative. Add, remove or rename a member\n * here only together with the Python one.\n */\nexport enum WorkspaceFeature {\n // Communication features\n PHONE = 'phone',\n A2P_REGISTRATION = 'a2p_registration', // Gates A2P 10DLC / toll-free SMS registration\n EMAIL = 'email',\n WHATSAPP = 'whatsapp',\n DISCORD = 'discord',\n SLACK = 'slack',\n TEAMS = 'teams',\n\n // Platform features\n SITES = 'sites',\n // NOTE: Forms is intentionally NOT a feature flag — forms / structured-data\n // tools are always available. Do not re-add a FORMS member; Python removed\n // its own in `41a24f36c0` and says the same thing there.\n MAPS = 'maps',\n BROWSER = 'browser',\n WEB_SEARCH = 'web_search',\n CALENDAR = 'calendar',\n // Journey v2 timeline editor. TEMPORARY internal rollout flag and NOT an\n // access flag: it selects which Journey editor a workspace sees and which\n // execution model the create dialog preselects. Journeys themselves stay\n // ungated (journeys:* scopes), and runtime is chosen solely from the\n // Journey's own executionModel — so turning this off never changes\n // semantics. See the full rationale on the Python member in\n // `lib/constants.py`.\n JOURNEY_V2_EDITOR = 'journey_v2_editor',\n // Experiments is intentionally NOT a feature flag — member-level A/B testing\n // is always available and gated by the experiments:* scopes alone.\n MAILBOX_USER_INPUT = 'mailbox_user_input', // Queue mid-turn input on the chat mailbox\n FORKED_TRAJECTORIES = 'forked_trajectories', // Detach long tool trajectories into fork tasks\n\n // Integration features\n GMAIL = 'gmail',\n GCALENDAR = 'gcalendar',\n GDRIVE = 'gdrive',\n GSHEETS = 'gsheets',\n MONDAY = 'monday',\n DOCUMO_FAX = 'documo_fax', // Documo (mFax) inbound fax\n\n // Reseller features\n RESELL_PRODUCTS = 'resell_products',\n\n // Compliance features\n SOC2_COMPLIANCE = 'soc2_compliance',\n\n // EHR Integration features\n EHR_FHIR = 'ehr_fhir', // Base feature for FHIR/EHR integration UI\n EHR_ECLINICALWORKS = 'ehr_eclinicalworks', // Requires EHR_FHIR\n EHR_HEALTHIE = 'ehr_healthie', // Healthie EHR integration\n\n // CRM Integration features\n CRM_SALESFORCE = 'crm_salesforce', // Salesforce CRM integration\n CRM_HUBSPOT = 'crm_hubspot', // HubSpot CRM integration\n\n // Knowledge base features\n CONFLUENCE = 'confluence', // Confluence knowledge base sync\n\n // AI features\n AGENT_MEMORY = 'agent_memory', // AgentCore long-term memory for agents\n IMAGE_GENERATION = 'image_generation', // AI image generation\n // NOTE: Strict routing on native realtime voice is intentionally NOT a\n // feature flag — it is gated solely by `supports_strict_routing` in the\n // model catalogue. Do not re-add a STRICT_NATIVE_VOICE flag.\n\n // Customer-specific integrations\n CHARLESTON_NEPHROLOGY_PMD_PAGING = 'charleston_nephrology_pmd_paging', // On-call medical paging\n PATIENTSYNC_TRANSFER = 'patientsync_transfer', // In-API PatientSync PSTN transfer tool\n COSAN_PATHWAYS_SCHEDULING = 'cosan_pathways_scheduling', // Cosan first-call times from Rysun Pathways\n}\n\n/**\n * Member product feature flags.\n * Matches the Python MemberFeature enum in lib/constants.py\n */\nexport enum MemberFeature {\n WEB_CHAT = 'web_chat',\n WEB_VOICE = 'web_voice',\n PHONE = 'phone',\n WHATSAPP = 'whatsapp',\n EMAIL = 'email',\n}\n\n/**\n * Organization product feature flags.\n * These features apply at the organization level, affecting all workspaces.\n * Matches the Python OrgFeature enum in lib/constants.py\n */\nexport enum OrgFeature {\n // Authentication & Security\n SSO = 'sso',\n AUDIT_LOGS = 'audit_logs',\n\n // Compliance\n SOC2_COMPLIANCE = 'soc2_compliance',\n\n // Organization management\n CUSTOM_BRANDING = 'custom_branding',\n PRIORITY_SUPPORT = 'priority_support',\n}\n\n/**\n * ProductFeatureKey is the union of all possible product features.\n * It combines WorkspaceFeature, MemberFeature, and OrgFeature.\n * Matches the Python ProductFeatureKey type in lib/constants.py\n */\nexport type ProductFeatureKey = WorkspaceFeature | MemberFeature | OrgFeature;\n\n// ===== RESOURCE ENUM (UNIFIED) =====\n\n/**\n * Unified resource identifiers for usage reporting and overages.\n * Matches the Python Resource enum in lib/constants.py\n * All values use snake_case for consistency with backend.\n */\nexport enum Resource {\n // AI usage\n CREDIT = 'credit',\n STT = 'stt', // Speech-to-text (billed per minute)\n TTS = 'tts', // Text-to-speech (billed per character)\n\n // Communication\n SMS = 'sms',\n EMAIL = 'email',\n PHONE_CALL = 'phone_call', // Twilio phone calls (billed per minute)\n\n // Infrastructure resources\n PHONE_NUMBER = 'phone_number',\n INBOX = 'inbox',\n SITE = 'site',\n MEMBER = 'member', // All members across the organization\n WORKSPACE = 'workspace', // Workspaces (for ORG-level products)\n ORG_ADMIN = 'org_admin', // Organization admins (account.org_admin == True, for ORG products)\n\n // Storage\n STORAGE_MB = 'storage_mb',\n}\n\n/**\n * Overage details for a specific resource.\n * Shows how much was included, used, and the overage cost.\n */\nexport interface ResourceOverage {\n included: number;\n used: number;\n overageAmount: number;\n overageCostCents: number;\n}\n\n/**\n * Simplified platform usage data for display components.\n * This is the shared interface used by PlatformUsageCard across all views:\n * - Workspace billing dashboard (/w/$wid/settings/billing)\n * - Admin workspace billing tab (/admin/workspaces/$wid)\n */\nexport interface PlatformUsageData {\n periodStart: string;\n periodEnd: string;\n usage: Partial<Record<Resource, number>>;\n overages: Partial<Record<Resource, ResourceOverage>>;\n}\n\n/**\n * Product type enum. Mirrors ProductType in lib/models/glb/product.py.\n *\n * Organization plans fund tenant infrastructure. Member plans grant one\n * workspace-local role to one Member.\n */\nexport enum ProductType {\n ORG = 'org', // Organization plan — the plan a customer buys\n ADDON = 'addon', // Feature add-on (scoped by SubscriptionItem.customerWorkspaceId)\n MEMBER = 'member', // Workspace membership granting one MemberRole\n DEVICE = 'device', // Physical companion device sold to a workspace Member\n}\n\n/**\n * Resources that are only valid for ORG-level products.\n * Matches the Python ORG_ONLY_RESOURCES in lib/constants.py\n */\nexport const ORG_ONLY_RESOURCES: Set<Resource> = new Set([\n Resource.WORKSPACE,\n Resource.ORG_ADMIN,\n Resource.PHONE_NUMBER,\n]);\n\n/**\n * Map of billing periods to their plan configurations.\n * Used for defining product pricing across different billing cycles.\n * 'once' is the one-time pseudo-period DEVICE products price under\n * (ONE_TIME_PLAN_PERIOD in lib/models/glb/product.py).\n */\nexport type ProductPlans = Partial<Record<'month' | 'year' | 'quarter' | 'once', PlanConfig>>;\n\n/**\n * Billing statuses a MemberSubscription row can carry — mirrors\n * ck_member_subscriptions_subscription_status\n * (lib/models/glb/member_subscription.py). The backend admin listing\n * constrains its filters to the same vocabulary, so a drifted value here is a\n * 422 rather than a silently empty page.\n */\nexport const MEMBER_SUBSCRIPTION_STATUSES = [\n 'creating',\n 'checkout_pending',\n 'checkout_failed',\n 'incomplete',\n 'incomplete_expired',\n 'trialing',\n 'active',\n 'past_due',\n 'unpaid',\n 'paused',\n 'canceled',\n] as const;\nexport type MemberSubscriptionBillingStatus = (typeof MEMBER_SUBSCRIPTION_STATUSES)[number];\n\n/** Role-grant states — mirrors ck_member_subscriptions_entitlement_status. */\nexport const MEMBER_ENTITLEMENT_STATUSES = [\n 'pending',\n 'grant_pending',\n 'granted',\n 'revoked',\n 'superseded',\n 'needs_reconcile',\n] as const;\nexport type MemberEntitlementStatus = (typeof MEMBER_ENTITLEMENT_STATUSES)[number];\n\n/** Re-bind nullable/string fields the admin UI passes through to request bodies. */\nexport type Product = Omit<\n GeneratedProductResponse,\n | 'productType'\n | 'plans'\n | 'tagline'\n | 'audience'\n | 'stripeProductId'\n | 'icon'\n | 'color'\n | 'publicUrl'\n | 'subscriberUrl'\n | 'templateWorkspaceUuid'\n | 'metadata'\n> & {\n productType: ProductType | string;\n plans: ProductPlans | null;\n tagline?: string | null;\n audience?: string | null;\n stripeProductId?: string | null;\n icon?: string | null;\n color?: string | null;\n publicUrl?: string | null;\n subscriberUrl?: string | null;\n templateWorkspaceUuid?: string | null;\n metadata?: ProductMetadata | null;\n};\n\nexport type ProductResponse = Product;\n\n// ===== PRODUCT MANAGEMENT TYPES =====\n\n// Admin product create request\nexport interface CreateProductRequest {\n workspaceId?: number | null;\n workspaceUuid: string;\n stripeProductId?: string | null;\n name: string;\n tagline?: string | null;\n description: string;\n audience?: string | null;\n productType?: ProductType | string;\n trialPeriodDays?: number;\n icon?: string | null;\n color?: string | null;\n publicUrl?: string | null;\n subscriberUrl?: string | null;\n supportLevels?: string[];\n selfService?: boolean;\n isPopular?: boolean;\n isRecommended?: boolean;\n isFeatured?: boolean;\n isPublic?: boolean;\n /** The plan chosen when a flow must choose silently. One per (workspace, type). */\n isDefault?: boolean;\n concierge?: boolean;\n templateWorkspaceUuid?: string;\n /** MEMBER products only: the workspace-local MemberRole checkout grants. */\n memberRoleUuid?: string | null;\n metadata?: ProductMetadata;\n\n // Feature dependencies and provisions\n requiresFeatures?: string[]; // Features required to enable this product\n providesFeatures?: string[]; // Features this product enables\n\n // ORG products: credit budget\n creditInclusion?: number | null;\n /** Phone lines included across the organization; active inventory above this is billed. */\n phoneLineInclusion?: number;\n aiMultiplier?: number | null;\n serviceRates?: Record<string, number> | null;\n\n // Pricing plans keyed by period\n plans?: ProductPlans | null;\n}\n\n// Admin product update request\nexport interface AdminUpdateProductRequest {\n id: number;\n name?: string;\n tagline?: string | null;\n description?: string;\n stripeProductId?: string | null;\n workspaceId?: number;\n selfService?: boolean;\n audience?: string | null;\n productType?: ProductType | string;\n trialPeriodDays?: number;\n icon?: string | null;\n color?: string | null;\n publicUrl?: string | null;\n subscriberUrl?: string | null;\n isPopular?: boolean;\n isRecommended?: boolean;\n isFeatured?: boolean;\n isPublic?: boolean;\n /** The plan chosen when a flow must choose silently. One per (workspace, type). */\n isDefault?: boolean;\n concierge?: boolean;\n supportLevels?: string[];\n templateWorkspaceUuid?: string;\n /** MEMBER products only: the workspace-local MemberRole checkout grants. */\n memberRoleUuid?: string | null;\n metadata?: ProductMetadata;\n\n // Feature dependencies and provisions\n requiresFeatures?: string[]; // Features required to enable this product\n providesFeatures?: string[]; // Features this product enables\n\n // ORG products: credit budget\n creditInclusion?: number | null;\n /** Phone lines included across the organization; active inventory above this is billed. */\n phoneLineInclusion?: number;\n aiMultiplier?: number | null;\n serviceRates?: Record<string, number> | null;\n\n // Pricing plans keyed by period\n plans?: ProductPlans | null;\n}\n\n// ===== STRIPE ADDRESS TYPES =====\n\nexport interface StripeAddress {\n line1?: string;\n line2?: string;\n city?: string;\n state?: string;\n postal_code?: string;\n country?: string; // Two-letter country code (ISO 3166-1 alpha-2)\n}\n\nexport interface StripeShipping {\n name: string;\n phone?: string;\n address: StripeAddress;\n}\n\nexport interface StripeTax {\n automatic_tax?: string;\n ip_address?: string;\n location?: string;\n}\n\n// ===== STRIPE CUSTOMER TYPES =====\n\nexport interface StripeCustomerCreateRequest {\n name?: string;\n email?: string;\n phone?: string;\n description?: string;\n metadata?: Record<string, string>;\n address?: StripeAddress;\n shipping?: StripeShipping;\n tax?: StripeTax;\n taxExempt?: string; // Customer's tax exemption status: none, exempt, or reverse\n}\n\nexport interface StripeCustomerUpdateRequest {\n name?: string;\n email?: string;\n phone?: string;\n description?: string;\n metadata?: Record<string, string>;\n address?: StripeAddress;\n shipping?: StripeShipping;\n tax?: StripeTax;\n taxExempt?: string; // Customer's tax exemption status: none, exempt, or reverse\n}\n\n// ===== STRIPE PAYMENT METHOD TYPES =====\n\nexport interface StripeCardDetails {\n brand: string;\n last4: string;\n expMonth: number;\n expYear: number;\n funding?: string;\n country?: string;\n}\n\nexport interface StripeUSBankAccountDetails {\n accountHolderType?: string;\n bankName?: string;\n last4: string;\n}\n\nexport interface StripePaymentMethod {\n id: string;\n type: string;\n created: number;\n isDefault?: boolean;\n card?: StripeCardDetails;\n usBankAccount?: StripeUSBankAccountDetails;\n}\n\n// ===== STRIPE SUBSCRIPTION TYPES =====\n\n/**\n * Which organization an admin-created subscription bills — always stated,\n * never inferred (#21230).\n *\n * A union rather than two optional fields, so the compiler enforces what the\n * API's validator enforces: exactly one of `organizationId` and `createNewOrg`,\n * and `organizationName` only alongside the latter. Omitting both used to\n * silently create an organization and anchor the subscription to it, which\n * reads as provisioned while the workspaces it was meant to cover stay cut off.\n */\nexport type OrganizationBillingIntent =\n | {\n /** Existing organization to bill. */\n organizationId: number;\n createNewOrg?: false;\n organizationName?: never;\n }\n | {\n organizationId?: never;\n /** Deliberately create a new organization for this customer. */\n createNewOrg: true;\n /** Name for the organization created by createNewOrg. */\n organizationName?: string;\n };\n\nexport type StripeSubscriptionCreateRequest = OrganizationBillingIntent & {\n productId: number;\n planPeriod: string;\n workspaceId: number;\n trialPeriodDays?: number;\n metadata?: Record<string, string>;\n cancelAtPeriodEnd?: boolean;\n collectionMethod?: string;\n};\n\nexport type DirectSubscriptionCreateRequest = OrganizationBillingIntent & {\n /** Subscription (org) product — priced as planCostPerPeriod. */\n productId: number;\n planPeriod: string;\n /** Reseller workspace whose catalogue the product comes from. */\n workspaceId: number;\n};\n\nexport interface SubscriptionUpdateRequest {\n productId?: number; // Internal product ID to switch to\n planPeriod?: string; // Plan period to switch to (e.g., \"month\", \"year\")\n cancelAtPeriodEnd?: boolean; // Whether to cancel subscription at period end\n metadata?: Record<string, string>; // Additional metadata for the subscription\n trialEnd?: string; // Trial end date (unix timestamp or 'now')\n}\n\nexport interface StripeSubscriptionUpdateRequest {\n metadata?: Record<string, string>;\n cancelAtPeriodEnd?: boolean;\n items?: Array<Record<string, any>>;\n trialEnd?: string;\n}\n\n// ===== STRIPE SYNC TYPES =====\n\nexport interface SyncProductToStripeRequest {\n productId: number;\n syncPlans?: boolean;\n syncOverages?: boolean;\n syncFeatures?: boolean;\n}\n\n// ===== INVOICE TYPES =====\n\nexport interface RecordPaymentRequest {\n paymentReference: string;\n amount?: number; // when supplied, must equal the invoice total\n}\n\nexport interface GenerateInvoiceRequest {\n subscriptionId: number;\n periodStart: string; // ISO datetime\n periodEnd: string; // ISO datetime\n /** Deprecated rolling-deploy compatibility; true is rejected. */\n regenerate?: false;\n}\n","// Workspace-related types.\n// Server response shapes are generated from Pydantic via emit_openapi.py → Orval.\n// Client-only shapes (forms, enums, access types) are defined below.\n\nimport { WorkspaceFeature } from './billing-types';\nimport type { SortOrder } from './core-types';\nimport type { WorkspaceSortField } from './sort-types';\n\nexport { WorkspaceFeature };\n\n// ===== GENERATED SERVER TYPES =====\n\nexport type {\n AdminSiteMappingResponse as GeneratedAdminSiteMappingResponse,\n AdminWorkspaceResponse,\n AdminWorkspaceResponse as AdminWorkspace,\n OrgJoinWorkspaceResponse,\n OrgSettingsUpdateRequest,\n OrgWorkspaceResponse as GeneratedOrgWorkspaceResponse,\n OrgWorkspaceStatsResponse,\n OrgWorkspaceStatsResponse as OrgWorkspaceStats,\n OrgWorkspaceSummaryResponse,\n OrgWorkspaceSummaryResponse as OrgWorkspaceSummary,\n PublicWorkspaceResponse,\n PublicWorkspaceResponse as PublicWorkspace,\n WorkspaceCountsResponse,\n WorkspaceCountsResponse as WorkspaceCounts,\n WorkspaceFeaturesResponse,\n WorkspaceFeatureState,\n WorkspaceJoinResponse,\n WorkspaceResponse,\n WorkspaceResponse as Workspace,\n WorkspaceSettingsResponse,\n WorkspaceSettingsResponse as WorkspaceDefaults,\n} from './generated/workspace';\n\nimport type {\n AdminSiteMappingResponse as GeneratedAdminSiteMappingResponse,\n OrgWorkspaceResponse as GeneratedOrgWorkspaceResponse,\n} from './generated/workspace';\n\nexport type SiteMapping = Omit<GeneratedAdminSiteMappingResponse, 'externalDomain'> & {\n externalDomain: string | null;\n};\nexport type AdminSiteMappingResponse = SiteMapping;\n\nexport type OrgWorkspace = Omit<GeneratedOrgWorkspaceResponse, 'isPublic' | 'allowSignup'> & {\n isPublic: boolean;\n allowSignup: boolean;\n};\nexport type OrgWorkspaceResponse = OrgWorkspace;\n\n// ===== CLIENT-ONLY SURFACE =====\n\nexport type FeatureStatusValue = 'enabled' | 'hidden' | 'upgrade' | 'contact';\n\nexport interface WorkspaceFeatureInfo {\n name: string;\n slug: WorkspaceFeature;\n}\n\nexport type FirstRunMode = 'unset' | 'concierge' | 'explorer' | 'expert';\n\nexport interface FirstRunState {\n mode: FirstRunMode;\n statuses?: Record<string, string>;\n collapsed?: boolean;\n}\n\nexport enum WorkspaceProvisionStatus {\n UNPROVISIONED = 0,\n PROVISIONING = 1,\n AVAILABLE = 2,\n MAINTENANCE = 3,\n DISABLED = 4,\n SCHEMA_MISSING = 5,\n SCHEMA_CREATED = 6,\n DELETED = 7,\n ERROR = 8,\n NEEDS_MIGRATION = 9,\n}\n\nexport interface WorkspaceFormData {\n name: string;\n slug?: string;\n signupCode?: string;\n isPublic?: boolean;\n allowSignup?: boolean;\n locale?: string;\n timezone?: string;\n}\n\nexport interface AdminWorkspaceFormData {\n organizationId?: number;\n name?: string;\n slug?: string;\n signupCode?: string;\n isPublic?: boolean;\n allowSignup?: boolean;\n resellerId?: number;\n ownerId?: number;\n features?: WorkspaceFeature[];\n featuresOverride?: Record<string, boolean> | null;\n templateWorkspaceUuid?: string;\n locale?: string;\n timezone?: string;\n chatClassifierPrompt?: string | null;\n}\n\nexport interface ClientWorkspace {\n id: number;\n name: string;\n uuid: string;\n createdAt: string;\n status: number;\n slug: string;\n}\n\nexport interface WorkspaceStatsResponse {\n sites: number;\n pages: number;\n}\n\nexport interface BusinessHoursDay {\n day: 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday';\n enabled: boolean;\n start: string | null;\n end: string | null;\n}\n\nexport interface WorkspaceDefaultsFormData {\n defaultPhoneNumberId?: number | null;\n defaultAgentId?: number | null;\n escalationBusinessHours?: string | null;\n escalationOnlineMessageTemplate?: string | null;\n escalationOfflineMessageTemplate?: string | null;\n escalationNotifiedMessageTemplate?: string | null;\n escalationPausedMessageTemplate?: string | null;\n emailFooter?: string | null;\n /** Inbox whose address becomes Reply-To on transactional mail; null = platform default. */\n defaultReplyToInboxId?: number | null;\n pauseOnEscalate?: boolean;\n enableAudioRecording?: boolean;\n enableVoicemailDetection?: boolean;\n allowDevices?: boolean;\n shortenUrls?: boolean;\n transcriptionModel?: string | null;\n}\n\nexport interface SiteMappingFormData {\n siteUuid?: string;\n workspaceId?: number;\n externalDomain?: string;\n}\n\nexport type { WorkspaceSortField, SortOrder };\n\nexport interface AvailableMemberRole {\n id: number;\n uuid: string;\n name: string;\n}\n\nexport type WorkspaceGrantReason = 'superuser' | 'org_owner' | 'org_admin';\n\nexport interface WorkspaceAccessDeniedData {\n error: true;\n message: string;\n code: 'WORKSPACE_MEMBERSHIP_REQUIRED';\n canSelfGrant: true;\n grantReason: WorkspaceGrantReason;\n workspaceUuid: string;\n workspaceName: string;\n organizationUuid: string | null;\n organizationName: string | null;\n availableRoles: AvailableMemberRole[];\n}\n\nexport interface WorkspaceJoinRequest {\n memberRoleId: number;\n}\n\nexport interface OrgJoinWorkspaceRequest {\n memberRoleId: number;\n}\n\n/**\n * Adding a workspace is not a purchase — the organization holds the plan and\n * every workspace in it bills through that plan. Hence no product or period.\n */\nexport interface OrgCreateWorkspaceFormData {\n name: string;\n slug?: string;\n templateWorkspaceUuid?: string;\n}\n\nexport interface OrgWorkspaceFormData {\n name?: string;\n slug?: string;\n signupCode?: string;\n isPublic?: boolean;\n allowSignup?: boolean;\n locale?: string;\n timezone?: string;\n}\n","// Invitation-related types for workspace and organization membership.\n// Server response shapes are generated from Pydantic via emit_openapi.py → Orval.\n// Client-only form data and query params are defined below.\n\nimport type { OrgMemberRole } from './account-types';\n\nexport type { OrgMemberRole };\n\nexport type {\n InvitationListResponse as GeneratedInvitationListResponse,\n OrganizationInvitationListResponse,\n} from './generated/invitation';\n\nimport type {\n InvitationListResponse as GeneratedInvitationListResponse,\n InvitationResponse as GeneratedInvitationResponse,\n} from './generated/invitation';\n\n/** Client enum — preserves UPPER_SNAKE member names used across the app. */\nexport enum InvitationStatus {\n REQUESTED = 'requested',\n INVITED = 'invited',\n GRANTED = 'granted',\n DENIED = 'denied',\n DECLINED = 'declined',\n BLOCKED = 'blocked',\n}\n\nexport type InvitationResponse = Omit<GeneratedInvitationResponse, 'status'> & {\n status: InvitationStatus;\n};\n\nexport type Invitation = InvitationResponse;\n\nexport type InvitationListResponse = Omit<GeneratedInvitationListResponse, 'items'> & {\n items: InvitationResponse[];\n};\n\n// ===== CLIENT-ONLY TYPES =====\n\n// Create workspace invitation form data (user-initiated membership request)\n// The workspace is determined from the route path parameter\nexport interface CreateWorkspaceInvitationFormData {\n message?: string;\n siteUuid?: string;\n}\n\n// Create organization invitation form data\nexport interface CreateOrganizationInvitationFormData {\n email: string;\n name?: string;\n role?: OrgMemberRole;\n message?: string;\n}\n\n// Update invitation form data (admin action)\nexport interface UpdateInvitationFormData {\n status?: InvitationStatus;\n role?: OrgMemberRole;\n}\n\n// List invitations query params\nexport interface ListInvitationsParams {\n workspaceId?: number;\n organizationId?: number;\n accountId?: number;\n status?: InvitationStatus;\n page?: number;\n pageSize?: number;\n}\n\n// Invitation details for public view (no auth required)\nexport interface InvitationDetails {\n workspace?: {\n id: number;\n uuid: string;\n name: string;\n } | null;\n organization?: {\n id: number;\n uuid: string;\n name: string;\n } | null;\n invitedAccount?: {\n email: string;\n name?: string | null;\n } | null;\n invitedEmail?: string | null;\n inviter: {\n name?: string | null;\n };\n message?: string | null;\n expiresAt?: string | null;\n role?: OrgMemberRole | null;\n}\n\n// Invitation accepted response\nexport interface InvitationAcceptedResponse {\n message: string;\n workspace?: {\n id: number;\n uuid: string;\n name: string;\n } | null;\n organization?: {\n id: number;\n uuid: string;\n name: string;\n } | null;\n authToken?: string | null;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: ai_model\n */\n\n\n/**\n * Response model for all models combined.\n */\nexport interface AllModelsResponse {\n chat: ModelMetadataResponse[];\n realtime: ModelMetadataResponse[];\n image: ModelMetadataResponse[];\n stt: ModelMetadataResponse[];\n tts: ModelMetadataResponse[];\n}\n\n/**\n * Response model for a chat model.\n */\nexport interface ChatModelResponse {\n id: string;\n name: string;\n provider: ModelProvider;\n type?: ModelType;\n description?: string | null;\n tagline?: string | null;\n state?: string;\n available?: boolean;\n recommended?: boolean;\n replacement?: string | null;\n multiplier?: number;\n inputMultiplier?: number | null;\n outputMultiplier?: number | null;\n cachedMultiplier?: number | null;\n}\n\n/**\n * Response model for chat models list.\n */\nexport interface ChatModelsResponse {\n models: ChatModelResponse[];\n}\n\n/**\n * Response model for an image generation model.\n */\nexport interface ImageModelResponse {\n id: string;\n name: string;\n provider: ModelProvider;\n type?: ModelType;\n description?: string | null;\n state?: string;\n available?: boolean;\n recommended?: boolean;\n replacement?: string | null;\n multiplier?: number;\n}\n\n/**\n * Response model for image models list.\n */\nexport interface ImageModelsResponse {\n models: ImageModelResponse[];\n}\n\n/**\n * Unified response model for any AI model with full metadata.\n */\nexport interface ModelMetadataResponse {\n id: string;\n name: string;\n provider: ModelProvider;\n type: ModelType;\n description?: string | null;\n state?: string;\n available?: boolean;\n recommended?: boolean;\n replacement?: string | null;\n multiplier?: number;\n inputMultiplier?: number | null;\n outputMultiplier?: number | null;\n cachedMultiplier?: number | null;\n}\n\n/**\n * AI model providers.\n */\nexport type ModelProvider = typeof ModelProvider[keyof typeof ModelProvider];\n\n\nexport const ModelProvider = {\n unknown: 'unknown',\n openai: 'openai',\n google: 'google',\n anthropic: 'anthropic',\n aws: 'aws',\n deepgram: 'deepgram',\n xai: 'xai',\n fireworks: 'fireworks',\n vercel: 'vercel',\n custom: 'custom',\n} as const;\n\n/**\n * AI model types.\n */\nexport type ModelType = typeof ModelType[keyof typeof ModelType];\n\n\nexport const ModelType = {\n chat: 'chat',\n realtime: 'realtime',\n image: 'image',\n video: 'video',\n stt: 'stt',\n tts: 'tts',\n} as const;\n\n/**\n * Response model for a realtime model.\n */\nexport interface RealtimeModelResponse {\n id: string;\n name: string;\n provider: ModelProvider;\n type?: ModelType;\n description?: string | null;\n state?: string;\n available?: boolean;\n recommended?: boolean;\n replacement?: string | null;\n voices?: string[];\n serverVad?: boolean;\n clientVad?: boolean;\n multiplier?: number;\n inputMultiplier?: number | null;\n outputMultiplier?: number | null;\n cachedMultiplier?: number | null;\n}\n\n/**\n * Response model for realtime models list.\n */\nexport interface RealtimeModelsResponse {\n models: RealtimeModelResponse[];\n}\n\n/**\n * Capability flags for an STT model — the cross-layer source of truth (#14184).\n *\n * The frontend reads these instead of pattern-matching the model id. Serialized\n * as camelCase (the platform-wide API key convention) via the model's\n * alias_generator; the generated client type uses the same camelCase keys.\n */\nexport interface STTCapabilitiesResponse {\n supportsLanguageHints?: boolean;\n supportsDetectThenLock?: boolean;\n detectThenLockDefault?: boolean;\n}\n\n/**\n * Response model for an STT language option.\n */\nexport interface STTLanguageResponse {\n code: string;\n name: string;\n}\n\n/**\n * Response model for a speech-to-text model.\n */\nexport interface STTModelResponse {\n id: string;\n name: string;\n provider: ModelProvider;\n type?: ModelType;\n description?: string | null;\n state?: string;\n available?: boolean;\n recommended?: boolean;\n replacement?: string | null;\n multiplier?: number;\n languages?: STTLanguageResponse[];\n capabilities?: STTCapabilitiesResponse;\n}\n\n/**\n * Response model for STT models list.\n */\nexport interface STTModelsResponse {\n models: STTModelResponse[];\n}\n\n/**\n * Response model for a text-to-speech model.\n */\nexport interface TTSModelResponse {\n id: string;\n name: string;\n provider: ModelProvider;\n type?: ModelType;\n description?: string | null;\n state?: string;\n available?: boolean;\n recommended?: boolean;\n replacement?: string | null;\n multiplier?: number;\n}\n\n/**\n * Response model for TTS models list.\n */\nexport interface TTSModelsResponse {\n models: TTSModelResponse[];\n}\n\n/**\n * Response model for a voice model.\n */\nexport interface VoiceModelResponse {\n id: string;\n name: string;\n provider: string;\n description?: string | null;\n ttsModels?: string[];\n}\n\n/**\n * Response model for voice models list.\n */\nexport interface VoiceModelsResponse {\n items: VoiceModelResponse[];\n}\n","/**\n * AI Model Types.\n * Server response shapes are generated from Pydantic via emit_openapi.py → Orval.\n * Client-only helpers and model ID constants are defined below.\n */\n\nexport type {\n AllModelsResponse,\n ChatModelResponse,\n ChatModelsResponse as AIModelsResponse,\n ModelMetadataResponse,\n ModelMetadataResponse as AIModel,\n ModelMetadataResponse as AIModelResponse,\n RealtimeModelResponse,\n STTCapabilitiesResponse,\n STTModelResponse,\n STTModelsResponse,\n TTSModelResponse,\n VoiceModelResponse as GeneratedVoiceModelResponse,\n} from './generated/ai_model';\n\nexport { ModelProvider, ModelType } from './generated/ai_model';\n\nexport type {\n ManagerModelResponse,\n ManagerModelsResponse,\n VoicePresetResponse,\n VoicePresetsResponse,\n} from './generated/ai';\n\nimport type {\n ChatModelResponse,\n RealtimeModelResponse,\n STTModelResponse,\n TTSModelResponse,\n VoiceModelResponse as GeneratedVoiceModelResponse,\n VoiceModelsResponse as GeneratedVoiceModelsResponse,\n} from './generated/ai_model';\n\nexport type VoiceModel = Omit<GeneratedVoiceModelResponse, 'description'> & {\n description?: string | null;\n};\nexport type VoiceModelResponse = VoiceModel;\n\nexport type VoiceModelsResponse = Omit<GeneratedVoiceModelsResponse, 'items'> & {\n items: VoiceModelResponse[];\n};\n\n// ===== CLIENT-ONLY TYPES =====\n\nexport type ModelState = 'enabled' | 'disabled' | 'deprecated';\n\n// Helper types for easier usage — use per-type OpenAPI responses (ModelMetadataResponse is a slim union).\nexport type ChatAIModel = ChatModelResponse & { type: 'chat' };\nexport type RealtimeAIModel = Omit<RealtimeModelResponse, 'serverVad' | 'clientVad'> & {\n type: 'realtime';\n serverVad: boolean;\n clientVad: boolean;\n};\nexport type STTAIModel = STTModelResponse & { type: 'stt' };\nexport type TTSAIModel = TTSModelResponse & { type: 'tts' };\n\n// Realtime Model Constants\nexport const REALTIME_MODEL_OPENAI = 'openai:realtime:gpt-realtime';\nexport const REALTIME_MODEL_OPENAI_MINI = 'openai:realtime:gpt-realtime-mini';\nexport const REALTIME_MODEL_OPENAI_2 = 'openai:realtime:gpt-realtime-2';\nexport const REALTIME_MODEL_GEMINI = 'google:aistudio:gemini-3.1-flash-live';\nexport const REALTIME_MODEL_GEMINI_VERTEX = 'google:vertex:gemini-3.1-flash-live';\nexport const REALTIME_MODEL_CUSTOM = 'custom:realtime:composable';\n\n// STT (Speech-to-Text) Model IDs\nexport const STT_MODEL_DEEPGRAM_FLUX = 'deepgram:stt:flux-general-en';\nexport const STT_MODEL_DEEPGRAM_FLUX_SELFHOST = 'deepgram:stt:flux-general-en:selfhost';\nexport const STT_MODEL_DEEPGRAM_FLUX_MULTI = 'deepgram:stt:flux-general-multi';\nexport const STT_MODEL_DEEPGRAM_FLUX_MULTI_SELFHOST = 'deepgram:stt:flux-general-multi:selfhost';\n\n// TTS (Text-to-Speech) Model IDs\nexport const TTS_MODEL_XAI_V1 = 'xai:tts:v1';\nexport const TTS_MODEL_DEEPGRAM_AURA_2 = 'deepgram:tts:aura-2';\nexport const TTS_MODEL_AWS_POLLY_GENERATIVE = 'aws:tts:polly-generative';\nexport const TTS_MODEL_AWS_POLLY_NEURAL = 'aws:tts:polly-neural';\n","// Prompt Injection Detection System (PIDS) admin types.\n//\n// Hand-written mirror of the Pydantic `AdminPidsFindingResponse`\n// (lib/models/glb/responses/pids_finding_responses.py). Server response bodies\n// are camelCase (the app's global alias generator), so these fields are\n// camelCase even though the ORM/Pydantic model is snake_case. When the OpenAPI\n// codegen (`yarn generate:types`) next runs it will emit\n// `AdminPidsFindingResponse` into `generated/`; at that point this file can\n// re-export the generated type instead (same pattern as account-types.ts).\n\n// ===== SERVER RESPONSE TYPES (PIDS) =====\n\n/** A single prompt-injection finding, as returned by the admin API. */\nexport interface AdminPidsFindingResponse {\n id: number;\n langfuseTraceId: string;\n workspaceUuid: string;\n chatId: number | null;\n memberId: number | null;\n channel: string;\n /** Per-category combined confidence (0..1). */\n attackCategories: Record<string, number>;\n confidence: number;\n /** Stage-1 rule names that matched (never raw matched text). */\n stage1MatchedPatterns: string[];\n /** Stage-2 LLM judge verdict (per-category quoted spans = PHI). */\n stage2Verdict: Record<string, unknown> | null;\n stage2Status: string;\n detectorVersion: string;\n /** scheduled | backfill | pre_llm. */\n source: PidsSource;\n reviewedAt: string | null;\n reviewedByMemberId: number | null;\n reviewerDisposition: PidsDisposition | null;\n wazuhEmittedAt: string | null;\n createdAt: string;\n}\n\nexport type { AdminPidsFindingResponse as AdminPidsFinding };\n\n// ===== CLIENT-ONLY ENUMS =====\n\n/** Reviewer disposition values (matches the backend `ReviewerDisposition`). */\nexport const PIDS_DISPOSITIONS = ['true_positive', 'false_positive', 'needs_more_context'] as const;\nexport type PidsDisposition = (typeof PIDS_DISPOSITIONS)[number];\n\n/** Finding source values (matches the backend `FindingSource`). */\nexport const PIDS_SOURCES = ['scheduled', 'backfill', 'pre_llm'] as const;\nexport type PidsSource = (typeof PIDS_SOURCES)[number];\n","/**\n * FHIR Connection types for the Gravity Rail API.\n *\n * FhirConnection represents per-workspace FHIR/EHR integration configurations.\n * Supports vendors like eClinicalWorks, Epic, Cerner, and Athena.\n */\n\n// ===== GENERATED SERVER TYPES =====\n\nexport type {\n EncounterSyncDataTypeSummary,\n EncounterSyncRunResponse,\n EncounterSyncStatusResponse,\n EncounterSyncStatusResponse as EncounterSyncStatus,\n FhirConnectionResponse as GeneratedFhirConnectionResponse,\n FhirMethodResponse,\n WorkflowStartAutomationResponse,\n WorkflowStartAutomationResponse as WorkflowStartAutomation,\n} from './generated/app_connection';\n\nexport type {\n CheckFhirPatientLinksRequest,\n EncounterSyncEncounterDiagnostics,\n FhirPatientLinkCheckResponse,\n} from './generated/fhir';\n\nimport type { EncounterSyncEncounterDiagnostics } from './generated/fhir';\n\nimport type { SyncRunOutcome } from '../api/connection-sync';\n\nimport type {\n FhirConnectionResponse as GeneratedFhirConnectionResponse,\n WorkflowStartAutomationResponse,\n} from './generated/app_connection';\n\nexport type FhirConnection = Omit<\n GeneratedFhirConnectionResponse,\n 'vendor' | 'clientType' | 'state'\n> & {\n vendor: FhirVendor;\n clientType: FhirClientType;\n state: FhirConnectionState;\n};\n\nexport type FhirConnectionResponse = FhirConnection;\n\n// ===== CLIENT-ONLY SURFACE =====\n\n/**\n * Supported FHIR/EHR vendors.\n */\nexport enum FhirVendor {\n ECLINICALWORKS = 'eclinicalworks',\n EPIC = 'epic',\n CERNER = 'cerner',\n ATHENA = 'athena',\n}\n\n/**\n * State of a FHIR connection.\n */\nexport enum FhirConnectionState {\n CONFIGURING = 'configuring',\n CONFIGURED = 'configured',\n ERROR = 'error',\n}\n\n/**\n * Client type for FHIR connections (eCW Backend Services).\n * - backend_bulk: Two-legged auth for bulk data operations\n * - backend_single_patient: Two-legged auth with full patient data access\n */\nexport enum FhirClientType {\n BACKEND_BULK = 'backend_bulk',\n BACKEND_SINGLE_PATIENT = 'backend_single_patient',\n}\n\n/**\n * Form data for creating a FHIR connection.\n */\nexport interface CreateFhirConnectionRequest {\n name: string;\n vendor: FhirVendor;\n clientType?: FhirClientType;\n fhirBaseUrl: string;\n practiceId?: string;\n clientId: string;\n clientSecret?: string;\n tokenEndpoint?: string;\n rateLimitPerMinute?: number;\n vendorConfig?: Record<string, unknown>;\n}\n\n/**\n * Form data for updating a FHIR connection.\n */\nexport interface UpdateFhirConnectionRequest {\n name?: string;\n fhirBaseUrl?: string;\n practiceId?: string;\n clientId?: string;\n clientSecret?: string;\n tokenEndpoint?: string;\n state?: FhirConnectionState;\n enabled?: boolean;\n rateLimitPerMinute?: number;\n vendorConfig?: Record<string, unknown>;\n}\n\n/**\n * Sort fields for FHIR connections.\n */\nexport type FhirConnectionSortField = 'createdAt' | 'updatedAt' | 'name' | 'vendor' | 'state';\n\n/**\n * Request to fetch encounters for a patient.\n */\nexport interface FhirFetchEncountersRequest {\n patientId: string;\n}\n\n/**\n * Request to search for patients.\n */\nexport interface FhirSearchPatientsRequest {\n name?: string;\n family?: string;\n given?: string;\n identifier?: string;\n birthdate?: string;\n}\n\n/**\n * Request to search for practitioners.\n */\nexport interface FhirSearchPractitionersRequest {\n name?: string;\n identifier?: string;\n}\n\n/**\n * Request to search for locations.\n */\nexport interface FhirSearchLocationsRequest {\n name?: string;\n address?: string;\n}\n\n/**\n * Request to fetch care team for a patient.\n */\nexport interface FhirFetchCareTeamRequest {\n patientId: string;\n}\n\n/**\n * Request to create a telephone encounter.\n */\nexport interface FhirCreateEncounterRequest {\n patientId: string;\n reason: string;\n practitionerId?: string;\n locationId?: string;\n notes?: string;\n}\n\n/**\n * Response from FHIR API operations.\n *\n * ``skipped`` distinguishes an intentional no-op (e.g. manual-unlink\n * exclusion) from an execution failure. Clients should surface a\n * non-destructive toast for ``success=true, skipped=true`` results.\n */\n\n// ==================== CSV Inspect Types ====================\n\n/**\n * Identifier classification kind returned by the inspect endpoint.\n */\nexport type FhirCsvIdentifierKind = 'encrypted_patient_id' | 'human_identifier';\n\n/**\n * Per-header classification metadata from the inspect endpoint.\n */\nexport interface FhirCsvColumnMeta {\n identifierKind: FhirCsvIdentifierKind;\n birthdayRequired: boolean;\n}\n\n/**\n * Response from the CSV inspect endpoint (PHI-minimal).\n */\nexport interface FhirCsvInspectResponse {\n headers: string[];\n suggestedIdentifierColumn: string | null;\n suggestedBirthdateColumn: string | null;\n columnMeta: Record<string, FhirCsvColumnMeta>;\n}\n\n// ==================== CSV Import Types ====================\n\n/**\n * CSV import settings stored in FhirConnection.vendor_config.\n */\nexport interface FhirCsvImportSettings {\n allowCreateUnmatched: boolean;\n defaultImportedMemberRoleId: number | null;\n}\n\n/**\n * Request to update CSV import settings.\n */\nexport interface UpdateFhirCsvImportSettingsRequest {\n allowCreateUnmatched?: boolean;\n defaultImportedMemberRoleId?: number | null;\n}\n\n/**\n * Status for a single import row.\n */\nexport type FhirCsvImportRowStatus =\n | 'linked'\n | 'already_linked'\n | 'created'\n | 'skipped'\n | 'ambiguous'\n | 'conflict'\n | 'not_found'\n | 'failed';\n\n/**\n * Import run summary (PHI-minimal, from DynamoDB).\n */\nexport type FhirCsvImportRunStatus =\n 'queued' | 'in_progress' | 'completed' | 'completed_with_errors' | 'failed';\n\nexport interface FhirCsvImportRunSummary {\n runId: string;\n connectionUuid: string;\n startedAt: string;\n completedAt: string | null;\n status: FhirCsvImportRunStatus;\n total: number;\n linked: number;\n alreadyLinked: number;\n created: number;\n skipped: number;\n ambiguous: number;\n conflicted: number;\n notFound: number;\n failed: number;\n terminalError: string | null;\n}\n\n/**\n * Per-row item from a completed import run (PHI-minimal).\n */\nexport interface FhirCsvImportRunItem {\n index: number;\n status: FhirCsvImportRowStatus;\n reasonCode: string;\n detail: string | null;\n memberId: number | null;\n}\n\n// ==================== Encounter Sync Types ====================\n\n/**\n * Request to enable/disable encounter sync and configure freshness knobs.\n * All fields optional — server falls back to documented defaults.\n */\nexport interface UpdateEncounterSyncRequest {\n enabled: boolean;\n /**\n * Opt this connection out of the daily scheduled encounter-sync\n * dispatcher. Demand/manual refresh keep working. Distinct from\n * `enabled`. Omit to preserve the stored value (defaults False).\n */\n scheduledSyncPaused?: boolean;\n refreshTtlMinutes?: number;\n refreshLookbackDays?: number;\n readerLookbackDays?: number;\n manualBackfillLookbackDays?: number;\n postCreateWriteThroughEnabled?: boolean;\n postCreateVerificationEnabled?: boolean;\n postCreateVerificationDelayMinutes?: number;\n workflowStartAutomation?: WorkflowStartAutomationResponse;\n /** Inline-note ``DocumentReference`` ingestion (LOINC 11488-4 / 34117-2 / 11506-3). */\n documentReferenceEnabled?: boolean;\n /** ``ServiceRequest`` referral (SNOMED 3457005) ingestion. */\n serviceRequestReferralsEnabled?: boolean;\n /** ``MedicationRequest`` ingestion. */\n medicationRequestsEnabled?: boolean;\n /** C-CDA Binary fetch + parse path (defaults False). */\n ccdaBinaryEnabled?: boolean;\n /** Persist raw C-CDA XML on section rows (defaults False). */\n storeRawCcdaXml?: boolean;\n /**\n * Per-patient Observation sync (labs, vitals, social history).\n * Connection-level — disables scheduled, manual, and\n * refresh-coordinator observation fetches alike. Omit to preserve the\n * stored value (defaults True).\n */\n observationSyncEnabled?: boolean;\n /** First scheduled-run window for a never-synced connection (feeds compute_poll_since; default 180). */\n initialLookbackDays?: number;\n /** Max age of encounters re-fetched on each scheduled run (feeds compute_poll_since; default 30). */\n rollingLookbackDays?: number;\n /** Re-fetch window (by clinical date) from the last successful run to catch late charting (default 14). */\n overlapDays?: number;\n /** Minimum hours between scheduled runs; daily dispatcher gates via _is_due (default 20 — sub-24 to tolerate run-completion time). */\n cadenceHours?: number;\n}\n\n/**\n * Request to refresh a single linked patient's encounter cache on demand.\n */\nexport interface TriggerPatientRefreshRequest {\n memberId: number;\n patientId: string;\n lookbackDays?: number;\n /** When true, bypass the freshness TTL (operator-initiated repair). */\n force?: boolean;\n}\n\n/**\n * Request to run a manual connection-wide backfill across linked patients.\n */\nexport interface TriggerConnectionBackfillRequest {\n lookbackDays?: number;\n}\n\n/**\n * Per-Member outcomes for one collection of one logical encounter-sync run.\n *\n * `attemptedMemberCount` === written + unchanged + failed.\n * `intentionallySkippedMemberCount` is disjoint from it and means configured\n * work was deliberately not done — most often `no_qualifying_encounter` (no\n * eligible finished Office Visit in the window) or `no_encounter_change` (the\n * nightly steady-state gate), both working as designed. A designed skip\n * never downgrades the run's `status`.\n *\n * Reason tallies are Member counts: `{ remote_api_error: 3 }` means three\n * Members were affected.\n *\n * PHI-safe: closed collection labels, closed reason codes, and integers only.\n */\nexport interface EncounterSyncCollectionAttribution {\n /**\n * Closed label, e.g. \"encounters\" | \"observations\" | \"patient_profile\" |\n * \"conditions\" | \"care_plan\" | \"care_plan_items\" | \"encounter_notes\" |\n * \"referrals\" | \"medications\" | \"ccda_documents\" | \"ccda_sections\".\n */\n collection: string;\n attemptedMemberCount: number;\n writtenMemberCount: number;\n unchangedMemberCount: number;\n intentionallySkippedMemberCount: number;\n failedMemberCount: number;\n /** Closed skip reason -> affected Member count. */\n skipReasonCounts: Record<string, number>;\n /** Closed error reason -> affected Member count. */\n errorReasonCounts: Record<string, number>;\n}\n\n/**\n * Request cross-tab for one normalized FHIR resource type.\n *\n * Scoped to the run's final activity attempt (request telemetry is per\n * attempt), whereas collection outcomes describe the whole logical run.\n * `statusClassCounts` is what distinguishes rate limiting from server errors\n * for a specific resource.\n *\n * PHI-safe: normalized resource-type labels, coarse HTTP status classes,\n * sanitized reason-code tokens, and integers only.\n */\nexport interface EncounterSyncResourceAttribution {\n /** Normalized FHIR resource type, e.g. \"Observation\", or \"Unknown\". */\n resourceType: string;\n requestCount: number;\n errorCount: number;\n /**\n * Subset of `errorCount`: requests whose recognised vendor failure the\n * connector actually recovered from — today only the eCW `patient+page` 400\n * pagination quirk (`patient_page_400`) recovered by the encounter-scoped\n * MedicationRequest fallback.\n *\n * Additive and never a deduction, so `errorCount` keeps its exact meaning:\n * a `patient_page_400` error count that is not fully recovered is a real\n * data gap. Recognition alone does not count — a walk with no quirk\n * callback (Observation, Encounter) truncates silently and reports nothing\n * here, which is why this can legitimately be `0` beside a non-zero\n * `errorCount`.\n */\n recoveredRequestCount: number;\n /** \"2xx\" | \"3xx\" | \"4xx\" | \"5xx\" | \"none\" | \"unknown\" -> count. */\n statusClassCounts: Record<string, number>;\n reasonCodeCounts: Record<string, number>;\n}\n\n/**\n * Bounded attribution for one encounter-sync run.\n *\n * Projected server-side from the run's stored telemetry summary through a\n * version-aware allowlist — never the raw stored map. `null` on the history\n * item for runs with no parseable summary (historical rows, and rows whose\n * summary version the server does not recognize).\n */\nexport interface EncounterSyncRunAttribution {\n schemaVersion: number;\n totalRequests: number;\n totalErrors: number;\n /** Run-level counterpart of `EncounterSyncResourceAttribution.recoveredRequestCount`. */\n totalRecoveredRequests: number;\n collections: EncounterSyncCollectionAttribution[];\n resources: EncounterSyncResourceAttribution[];\n encounters?: EncounterSyncEncounterDiagnostics | null;\n}\n\n/**\n * PHI-safe encounter sync run history row.\n *\n * Derived from the shared ``sync_runs`` DynamoDB table filtered to\n * encounter-sync rows. Counts and sanitized reason codes only — never\n * patient names, encounter content, or other PHI.\n */\nexport interface EncounterSyncHistoryItem {\n runId: string;\n startedAt: string;\n completedAt?: string | null;\n status: string;\n /**\n * Server-derived meaning of the run, the same derivation as the generic\n * run list's ``outcome`` (see {@link SyncRunOutcome}), computed after\n * retry attempts are rolled up. ``status`` / ``errorMessage`` keep the raw\n * stored values. Optional only for compatibility with a server older than\n * this field; fall back to ``status`` then.\n *\n * Intentionally optional although the server model (and the generated\n * ``generated/fhir.ts`` type) marks it required: older servers omit it.\n */\n outcome?: SyncRunOutcome;\n source: string;\n /**\n * Run scope discriminator. \"patient_refresh\" = single-patient refresh,\n * \"full_sweep\" = connection-wide sweep / manual backfill,\n * \"targeted_recovery\" = a bounded replay of only the Members a prior\n * unsafe sweep left uncovered. Null on rows written before the journal\n * started tagging run_kind; callers should treat missing values as\n * full-sweep (legacy default). Deliberately a free-form string rather\n * than a union: a new scope must not be a breaking type change for\n * consumers that only display the value.\n */\n runKind?: string | null;\n total: number;\n synced: number;\n failed: number;\n skipped: number;\n errorMessage?: string | null;\n errors: string[];\n /**\n * Bounded collection / per-resource attribution for this run, or null when\n * the run carries no parseable telemetry summary. Additive: `status`,\n * `errors`, and `errorMessage` above are unchanged, so a reader that\n * ignores this field behaves exactly as before.\n */\n attribution?: EncounterSyncRunAttribution | null;\n}\n","/**\n * Unified app connection types for the Gravity Rail API.\n *\n * AppConnectionDirectoryEntry is the static metadata returned by GET /app-connections/available.\n * AppConnectionItem is the union type returned by GET /app-connections.\n * Each connection type has ONE response shape used by both the unified and per-type endpoints.\n */\n\n// ===== GENERATED SERVER TYPES =====\n\nexport type {\n AppConnectionDirectoryEntry,\n AppConnectionDirectoryResponse,\n ConfluenceConnectionResponse,\n HealthieConnectionResponse,\n HubspotConnectionResponse,\n McpServerResponse,\n McpToolResponse,\n MondayConnectionResponse,\n PlatformAppConnectionResponse,\n SalesforceConnectionResponse,\n SlackSlashCommandConfigResponse,\n SlashCommandConfigResponse,\n SyncCapabilitiesResponse,\n TeamsAppResponse,\n TestConnectionResponse,\n} from './generated/app_connection';\n\nexport type { DocumoFaxConnectionResponse, DocumoFaxSetupResponse } from './generated/documo';\nexport type {\n ConfigureDocumoFaxRequest,\n DocumoFaxIngestionStats,\n DocumoFaxStatusResponse,\n} from './generated/documo_fax';\n\nexport type { DiscordBotResponse } from './discord-bot-types';\nexport type { SlackAppResponse } from './slack-app-types';\n\nexport type { FhirConnectionResponse } from './fhir-connection-types';\n\nexport type { MemberCredentialResponse as MemberCredential } from './generated/member';\n\nimport type {\n ConfluenceConnectionResponse,\n HealthieConnectionResponse,\n HubspotConnectionResponse,\n McpServerResponse,\n MondayConnectionResponse,\n PlatformAppConnectionResponse,\n SalesforceConnectionResponse,\n TeamsAppResponse,\n} from './generated/app_connection';\nimport type { DocumoFaxConnectionResponse } from './generated/documo';\nimport type { DiscordBotResponse } from './discord-bot-types';\nimport type { SlackAppResponse } from './slack-app-types';\nimport type { FhirConnectionResponse } from './fhir-connection-types';\n\nexport type ConnectionMultiplicity = 'singleton' | 'multiple';\n\n/**\n * Connection type discriminator values — mirrors AppConnectionType in lib/app_connections/registry.py.\n */\nexport type AppConnectionType =\n | 'platform_app'\n | 'mcp_server'\n | 'discord_bot'\n | 'slack_app'\n | 'teams_app'\n | 'fhir_connection'\n | 'salesforce_connection'\n | 'hubspot_connection'\n | 'monday_connection'\n | 'confluence_connection'\n | 'healthie_connection'\n | 'documo_fax_connection';\n\n// ---------------------------------------------------------------------------\n// Connection response union — returned by GET /app-connections\n// and by per-type endpoints (e.g. GET /discord-bots/:id)\n// ---------------------------------------------------------------------------\n\n/**\n * Union of all connection types returned by GET /app-connections.\n * Discriminated on `connectionType`.\n */\nexport type AppConnectionItem =\n | PlatformAppConnectionResponse\n | McpServerResponse\n | DiscordBotResponse\n | SlackAppResponse\n | TeamsAppResponse\n | FhirConnectionResponse\n | SalesforceConnectionResponse\n | HubspotConnectionResponse\n | MondayConnectionResponse\n | ConfluenceConnectionResponse\n | HealthieConnectionResponse\n | DocumoFaxConnectionResponse;\n\n// ---------------------------------------------------------------------------\n// Member credentials (shared across all connection types)\n// ---------------------------------------------------------------------------\n\n/** Provider types match AppConnectionType values from backend */\nexport type CredentialProvider =\n | 'platform_app'\n | 'mcp_server'\n | 'discord_bot'\n | 'slack_app'\n | 'teams_app'\n | 'fhir_connection'\n | 'salesforce_connection';\n\n// HubSpot Search & Import types\nexport interface HubSpotSearchRequest {\n query: string;\n objectType: 'contacts' | 'companies';\n limit?: number;\n after?: string | null;\n}\n\nexport interface HubSpotSearchResultMatch {\n memberId: number;\n matchType: 'hubspot_id' | 'email' | 'phone';\n}\n\nexport interface HubSpotSearchResult {\n id: string;\n name: string | null;\n email: string | null;\n phone: string | null;\n company: string | null;\n objectType: string;\n existingMember: HubSpotSearchResultMatch | null;\n}\n\nexport interface HubSpotSearchResponse {\n results: HubSpotSearchResult[];\n hasMore: boolean;\n nextCursor: string | null;\n}\n\nexport interface ImportHubSpotRecordRequest {\n hubspotId: string;\n name?: string | null;\n email?: string | null;\n phone?: string | null;\n objectType?: string;\n}\n\nexport interface ImportHubSpotMembersRequest {\n records: ImportHubSpotRecordRequest[];\n memberRoleId: number;\n addToOrg?: boolean;\n orgRole?: string | null;\n}\n\nexport interface ImportedMemberResult {\n hubspotId: string;\n memberId: number | null;\n name: string | null;\n success: boolean;\n error: string | null;\n}\n\nexport interface ImportHubSpotMembersResponse {\n imported: number;\n failed: number;\n results: ImportedMemberResult[];\n}\n\n// HubSpot Sync Settings types\n\n// Transform preset type\nexport interface TransformPreset {\n slug: string;\n label: string;\n description: string;\n expression: string;\n}\n\n// --- Sync Rule types ---\n\nexport interface SyncRuleOutbound {\n targetField: string; // HubSpot property name\n expression: string; // CEL expression over GR context\n}\n\nexport type SyncRuleInboundTargetType =\n 'member_property' | 'managed_field' | 'label' | 'form_field';\n\nexport interface SyncRuleInbound {\n targetType: SyncRuleInboundTargetType;\n targetKey: string; // e.g. \"name\", \"hubspot:company\"\n expression: string; // CEL expression over remote context\n}\n\nexport interface SyncRule {\n name: string;\n enabled: boolean;\n outbound: SyncRuleOutbound[];\n inbound: SyncRuleInbound[];\n}\n\n// Note/Task sync configs (kept — they create objects, not field mappings)\nexport interface HubSpotNoteSyncConfig {\n dataTypeId: number;\n bodyTemplate: string;\n associateToContact: boolean;\n}\n\nexport type HubSpotTaskPriority = 'NONE' | 'LOW' | 'MEDIUM' | 'HIGH';\nexport type HubSpotTaskStatus = 'NOT_STARTED' | 'IN_PROGRESS' | 'COMPLETED';\n\nexport interface HubSpotTaskSyncConfig {\n dataTypeId: number;\n subjectTemplate: string;\n bodyTemplate: string;\n priority: HubSpotTaskPriority;\n status: HubSpotTaskStatus;\n associateToContact: boolean;\n}\n\n// CRM activity-log config (GRA-8700). Per-kind filters; a kind is enabled by\n// its presence in `activityLog`.\nexport interface ChatNoteSyncFilters {\n workflowIds?: number[];\n excludeTestChats?: boolean;\n channels?: string[];\n direction?: 'inbound' | 'outbound' | null;\n}\n\n// Kind + follow-up shapes come from the generated backend types so the two\n// layers cannot diverge; CrmActivityLogConfig itself stays hand-maintained\n// (stricter required-field contract than the wire format, matching the other\n// types in this file).\nimport type { AcceptedWritebackEmailConfig, ChatNoteFollowUpConfig } from './generated/sync';\n\nexport type { AcceptedWritebackEmailConfig, ChatNoteFollowUpConfig } from './generated/sync';\n\n/**\n * CRM activity-log kind. Hand-maintained UPPER-key enum mirroring the\n * generated lowercase `CrmActivityKind` const (the client convention for\n * enums is UPPER keys; see `EventRuleEventType`).\n */\nexport enum CrmActivityKind {\n MESSAGE = 'message',\n SUMMARY = 'summary',\n CHAT_STARTED = 'chat_started',\n CALL_STARTED = 'call_started',\n CALL_ENDED = 'call_ended',\n}\n\nexport interface CrmActivityLogConfig {\n kind: CrmActivityKind;\n bodyTemplate: string;\n delaySeconds?: number;\n filters?: ChatNoteSyncFilters;\n subjectTemplate?: string;\n followUpTask?: ChatNoteFollowUpConfig | null;\n acceptedWritebackEmail?: AcceptedWritebackEmailConfig | null;\n}\n\n// Managed rule status\nexport interface ManagedRuleStatus {\n id: number;\n name: string | null;\n eventType: string;\n actionType: string;\n active: boolean;\n dataTypeId: number | null;\n}\n\nexport interface HubSpotSyncSettingsRequest {\n outboundEnabled: boolean;\n inboundEnabled: boolean;\n rules: SyncRule[];\n noteSync: HubSpotNoteSyncConfig[];\n taskSync: HubSpotTaskSyncConfig[];\n defaultLifecycleStage?: string | null;\n}\n\nexport interface HubSpotSyncSettingsResponse {\n outboundEnabled: boolean;\n inboundEnabled: boolean;\n rules: SyncRule[];\n noteSync: HubSpotNoteSyncConfig[];\n taskSync: HubSpotTaskSyncConfig[];\n defaultLifecycleStage?: string | null;\n}\n\nexport type SyncRunMode = 'outbound' | 'inbound' | 'both';\n\n// NOTE: `mode` is intentionally absent. The backend derives the run direction\n// from the enabled entity configs and does not accept a client-supplied mode\n// override. This is a type-correction — the wire format never had `mode` on\n// the request body, even when the old TypeScript type required it.\nexport interface SyncRunRequest {\n dryRun?: boolean;\n resetCheckpoints?: boolean;\n /**\n * When set, the run is scoped to a single entity type (members or\n * records). Mode derivation, the \"any direction enabled\" guard, and\n * checkpoint resets are all limited to the matching entity config.\n */\n entityType?: SyncEntityType;\n /**\n * When set, the run is further scoped to a single board mapping within\n * the selected entity. Requires ``entityType`` to be set. Used by the\n * per-mapping sync buttons in the Monday.com UI so a failure on one\n * board does not obscure results on another.\n */\n boardId?: string;\n /**\n * Optional preview-only cap on the number of entities the engine\n * processes. Server enforces ``1 <= recordLimit <= 200`` and\n * additionally requires ``dryRun: true`` — capped runs are the\n * \"test on a small batch\" affordance and never commit writes. The\n * server also withholds inbound checkpoint advancement so a\n * subsequent uncapped sync replays the previewed records. Omit\n * (or pass ``undefined``) for the legacy uncapped behavior.\n */\n recordLimit?: number;\n}\n\nexport interface SyncRunResponse {\n streamKey: string;\n workflowId: string;\n}\n\nexport interface HubSpotPropertyOption {\n label: string;\n value: string;\n}\n\nexport interface HubSpotPropertyDefinition {\n name: string;\n label: string;\n type: string;\n groupName: string;\n options: HubSpotPropertyOption[];\n}\n\nexport type RuleExecutionStatus =\n 'running' | 'success' | 'failed' | 'skipped' | 'dispatched' | 'scheduled';\n\n/**\n * @deprecated Never matched the wire shape (`ruleName` was never sent). The\n * connector sync-log methods (`getHubspotSyncLogs`, `getSalesforceSyncLogs`,\n * `getMondaySyncLogs`) return `CursorPaginatedResponse<RuleExecution>`; use\n * `RuleExecution` for an entry.\n */\nexport interface SyncLogEntry {\n id: number;\n status: RuleExecutionStatus;\n ruleName: string | null;\n createdAt: string;\n errorMessage?: string | null;\n}\n\n/**\n * @deprecated Never matched the wire shape. The connector sync-log methods\n * return `CursorPaginatedResponse<RuleExecution>`; use that instead.\n */\nexport interface SyncLogsResponse {\n items: SyncLogEntry[];\n hasMore: boolean;\n nextCursor?: string;\n}\n\n// --- Salesforce Sync types ---\n\nexport type SalesforceLabelSyncMode = 'multi_select' | 'text';\n\n/**\n * One field from a Salesforce `describe` response.\n *\n * The upsert-eligibility flags are load-bearing, not decorative: picking a\n * field that cannot hold the value we send makes every member create a\n * duplicate record. See `salesforceUpsertFields.ts`.\n */\nexport interface SalesforceDescribeField {\n name: string;\n label: string;\n type: string;\n /** Salesforce can natively upsert on this field (external-ID lookup). */\n idLookup?: boolean;\n externalId?: boolean;\n updateable?: boolean;\n createable?: boolean;\n}\n\nexport type SalesforceRelatedObjectLookupTarget = 'linked_record' | 'member_field';\n\n/**\n * A read-only companion sObject polled alongside `targetSobject`.\n *\n * `targetSobject` stays the member's single outbound target (normally\n * `Contact`). A related object contributes inbound-only fields that live on\n * a different record — e.g. `ServiceProvider__c.VMSLTV__c` — so journeys,\n * member filters and metrics can branch on them. Nothing is written back.\n *\n * `lookupField` is the column ON the related object that reaches a member:\n * with `lookupTarget: 'linked_record'` it holds the linked record's Id;\n * with `'member_field'` it holds another Id (typically `AccountId`) that a\n * prior inbound rule stored on the member as `memberFieldKey`.\n */\nexport interface SalesforceRelatedObject {\n sobject: string;\n lookupField: string;\n lookupTarget: SalesforceRelatedObjectLookupTarget;\n memberFieldKey: string | null;\n inboundEnabled: boolean;\n rules: SyncRule[];\n}\n\nexport interface SalesforceSyncSettings {\n upsertField: string;\n recordTypeId: string | null;\n targetSobject: string;\n noteSobject: string;\n taskSobject: string;\n labelSyncMode: SalesforceLabelSyncMode;\n labelTargetField: string;\n useCompositeApi: boolean;\n inboundPollIntervalMinutes: number;\n relatedObjects: SalesforceRelatedObject[];\n}\n\n/** Salesforce sync uses the same ConnectionSyncConfig as all connectors. */\nexport type SalesforceSyncConfig = ConnectionSyncConfig;\n\nexport interface SalesforceSyncConfigResponse {\n syncConfig: SalesforceSyncConfig;\n salesforceSyncSettings: SalesforceSyncSettings;\n}\n\nexport interface UpdateSalesforceSyncConfigRequest {\n syncConfig: SalesforceSyncConfig;\n salesforceSyncSettings: SalesforceSyncSettings;\n}\n\n/**\n * Targeted, cursor-independent resync of already-linked members.\n *\n * Re-exported from the generated types rather than hand-written: the shapes\n * come straight from the route's Pydantic models, so duplicating them here\n * would only create a second definition free to drift from the backend.\n */\nexport type { ResyncLinkedMembersRequest, ResyncLinkedMembersResponse } from './generated/sync';\n\n// --- Salesforce Search & Import types ---\n\nexport type SalesforceSearchObjectType = 'Contact' | 'Account' | 'Lead';\n\nexport interface SalesforceSearchRequest {\n query: string;\n objectType: SalesforceSearchObjectType;\n limit?: number;\n}\n\nexport interface SalesforceSearchResultMatch {\n memberId: number;\n matchType: 'salesforce_id' | 'email' | 'phone';\n}\n\nexport interface SalesforceSearchResult {\n id: string;\n name: string | null;\n email: string | null;\n phone: string | null;\n company: string | null;\n objectType: string;\n existingMember: SalesforceSearchResultMatch | null;\n}\n\nexport interface SalesforceSearchResponse {\n results: SalesforceSearchResult[];\n totalSize: number;\n}\n\nexport interface ImportSalesforceRecordRequest {\n salesforceId: string;\n name?: string | null;\n email?: string | null;\n phone?: string | null;\n objectType?: string;\n}\n\nexport interface ImportSalesforceMembersRequest {\n records: ImportSalesforceRecordRequest[];\n memberRoleId: number;\n addToOrg?: boolean;\n orgRole?: string | null;\n}\n\nexport interface ImportedSalesforceMemberResult {\n salesforceId: string;\n memberId: number | null;\n name: string | null;\n success: boolean;\n error: string | null;\n}\n\nexport interface ImportSalesforceMembersResponse {\n imported: number;\n failed: number;\n results: ImportedSalesforceMemberResult[];\n}\n\n// --- Sync Capabilities (returned by GET /sync-capabilities) ---\n\n// ===== CLIENT-ONLY SURFACE (sync config, HubSpot/Salesforce helpers) =====\n\nexport interface SyncCapabilities {\n matchStrategies: MatchStrategyMode[];\n conflictModes: ConflictPolicyMode[];\n supportedEntityTypes: SyncEntityType[];\n inboundTargets: string[];\n supportsNoteTask: boolean;\n supportsClear: boolean;\n /** Per-entity direction constraints. Missing key = both directions allowed. */\n entityDirections: Record<string, ('inbound' | 'outbound')[]>;\n}\n\n// --- Generic Connection Sync types ---\n\nexport type MatchStrategyMode = 'linked_id' | 'email' | 'external_id' | 'phone' | 'custom';\n\nexport interface MatchStrategy {\n mode: MatchStrategyMode;\n /**\n * Local field to match against (custom mode only).\n *\n * Interpretation depends on ``localFieldType``:\n * - ``\"column\"`` (default): a Member ORM column name. The Monday\n * backend allow-list is ``name | email | phone | description``.\n * - ``\"member_field\"``: a ``MemberField.key`` scoped by the\n * connection's ``service_id``. Any non-empty key is accepted.\n *\n * Reads accept ``null`` because the backend Pydantic model\n * (``lib/app_connections/sync/types.py::MatchStrategy.localField:\n * str | None``) serializes ``None`` to JSON ``null`` and existing\n * saved configs may carry it. Writes should prefer ``undefined``\n * (or field omission) — JSON ``null`` round-trips back through the\n * load path but ambiguates \"unset\" vs. \"explicitly null\" on save.\n */\n localField?: string | null;\n /**\n * How to interpret ``localField`` for ``mode=\"custom\"`` strategies.\n *\n * ``\"column\"`` is the default for legacy configs and non-custom\n * modes. ``\"member_field\"`` (GRA-2920) lets a Monday board match\n * by a service-scoped ``MemberField`` key — e.g. ``Board A`` writes\n * an MRN via a ``managed_field`` rule, and ``Board B`` matches on\n * that key.\n *\n * Reads accept ``null`` because the backend Pydantic model\n * serializes the default through JSON; writes should pass\n * ``\"column\"`` or ``\"member_field\"`` explicitly, or omit the field\n * for column-backed legacy behavior.\n */\n localFieldType?: 'column' | 'member_field' | null;\n remoteField?: string | null;\n}\n\nexport type ConflictPolicyMode = 'local_wins' | 'remote_wins' | 'skip';\n\nexport interface ConflictPolicy {\n mode: ConflictPolicyMode;\n}\n\nexport type ManagedAutomationPriority = 'NONE' | 'LOW' | 'MEDIUM' | 'HIGH';\nexport type ManagedAutomationStatus = 'NOT_STARTED' | 'IN_PROGRESS' | 'COMPLETED' | 'DEFERRED';\n\nexport interface ManagedAutomationConfig {\n type: 'note' | 'task' | 'labels';\n dataTypeId?: number | null;\n bodyTemplate?: string;\n subjectTemplate?: string;\n priority?: ManagedAutomationPriority;\n status?: ManagedAutomationStatus;\n}\n\nexport type SyncEntityType = 'member' | 'record' | 'calendar_event' | 'file';\n\nexport interface EntitySyncConfig {\n entityType: SyncEntityType;\n outboundEnabled: boolean;\n inboundEnabled: boolean;\n outboundFilter: string | null;\n inboundFilter: string | null;\n rules: SyncRule[];\n matchStrategy: MatchStrategy;\n conflictPolicy: ConflictPolicy;\n entityParams: Record<string, unknown>;\n checkpoints: Record<string, SyncCheckpoint>;\n}\n\nexport interface ConnectionSyncConfig {\n syncKey: string;\n entities: EntitySyncConfig[];\n connectionParams?: Record<string, unknown>;\n automations: ManagedAutomationConfig[];\n noteSync?: HubSpotNoteSyncConfig[];\n taskSync?: HubSpotTaskSyncConfig[];\n defaultLifecycleStage?: string | null;\n activityLog?: CrmActivityLogConfig[];\n}\n\nexport interface SyncCheckpoint {\n cursor: Record<string, unknown>;\n lastSuccessfulAt: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// MCP server tools endpoint types\n// ---------------------------------------------------------------------------\n\nexport interface McpServerToolResponse {\n name: string;\n description: string | null;\n inputSchema: Record<string, unknown> | null;\n}\n\n/**\n * Successful response from GET /app-connections/mcp-servers/{id}/tools.\n *\n * A 403 with `detail.code === 'auth_required'` indicates the user\n * needs to authenticate first.\n */\nexport interface McpServerToolsResponse {\n tools: McpServerToolResponse[];\n}\n\n/**\n * Structured 403 detail returned when MCP server tools require auth.\n */\nexport interface McpServerAuthRequired {\n message: string;\n code: 'auth_required';\n authType: 'oauth' | 'direct_auth';\n authorizeUrl?: string;\n appUuid?: string;\n}\n\n// ---------------------------------------------------------------------------\n// MCP server resources endpoint types\n// ---------------------------------------------------------------------------\n\nexport interface McpResourceResponse {\n uri: string;\n name: string;\n description: string | null;\n mimeType: string | null;\n}\n\nexport interface McpServerResourcesResponse {\n resources: McpResourceResponse[];\n}\n\n// ---------------------------------------------------------------------------\n// MCP server prompts endpoint types\n// ---------------------------------------------------------------------------\n\nexport interface McpPromptArgumentResponse {\n name: string;\n description: string | null;\n required: boolean | null;\n}\n\nexport interface McpPromptResponse {\n name: string;\n description: string | null;\n arguments: McpPromptArgumentResponse[];\n}\n\nexport interface McpServerPromptsResponse {\n prompts: McpPromptResponse[];\n}\n\n// ---------------------------------------------------------------------------\n// MCP server test connection endpoint types\n// ---------------------------------------------------------------------------\n\nexport interface McpTestConnectionResponse {\n success: boolean;\n latencyMs: number | null;\n serverName: string | null;\n serverVersion: string | null;\n error: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Platform app CRUD types\n// ---------------------------------------------------------------------------\n\n/**\n * Request body for enabling a platform app connection.\n */\nexport interface CreateAppConnectionRequest {\n slug: string;\n name?: string;\n config?: Record<string, unknown>;\n}\n\n/**\n * Request body for updating a platform app connection.\n */\nexport interface UpdateAppConnectionRequest {\n config?: Record<string, unknown>;\n enabled?: boolean;\n name?: string;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: qualification\n */\n\n\n/**\n * Create a workspace-scoped Persona.\n */\nexport interface CreatePersonaRequest {\n name: string;\n description?: string | null;\n age?: number | null;\n dateOfBirth?: string | null;\n hasPhone?: boolean;\n notifySms?: boolean | null;\n hasEmail?: boolean;\n memberRoleUuid?: string | null;\n identity?: string | null;\n dataRecords?: CreatePersonaRequestDataRecords;\n}\n\nexport type CreatePersonaRequestDataRecords = { [key: string]: unknown } | null;\n\n/**\n * Create a new scenario under a qualification.\n */\nexport interface CreateScenarioRequest {\n slug: string;\n name: string;\n description?: string | null;\n personaId?: number | null;\n goal?: string | null;\n channel?: string | null;\n dataRecords?: CreateScenarioRequestDataRecords;\n order?: number | null;\n criteria?: CriterionInput[] | null;\n simulatedDatetime?: string | null;\n anonymous?: boolean;\n}\n\nexport type CreateScenarioRequestDataRecords = { [key: string]: unknown } | null;\n\n/**\n * A criterion to create or update as part of a scenario.\n *\n * If ``id`` is set, it refers to an existing criterion (update).\n * If ``id`` is None, a new criterion will be created.\n */\nexport interface CriterionInput {\n id?: number | null;\n name: string;\n description?: string | null;\n criterionType: CriterionType;\n weight?: number;\n celExpression?: string | null;\n evaluationPrompt?: string | null;\n passingThreshold?: number;\n}\n\n/**\n * Per-criterion evaluation result for one TestChatRun.\n *\n * The evaluator (CEL vs LLM) is implied by the parent criterion's\n * ``criterionType`` — no separate ``evaluatorType`` field.\n */\nexport interface CriterionResultResponse {\n id: number;\n testChatRunId: number;\n criterionId: number;\n criterionName?: string | null;\n criterionType?: string | null;\n passingThreshold?: number | null;\n score: number | null;\n passed: boolean | null;\n evaluationData: CriterionResultResponseEvaluationData;\n createdAt: string;\n}\n\nexport type CriterionResultResponseEvaluationData = { [key: string]: unknown } | null;\n\n/**\n * How a criterion is graded.\n *\n * ``EXPRESSION`` is CEL-evaluated (synchronous, deterministic).\n * ``RUBRIC`` is LLM-evaluated (async, probabilistic). The criterion type\n * implies the evaluator — no separate ``EvaluatorType`` enum.\n */\nexport type CriterionType = typeof CriterionType[keyof typeof CriterionType];\n\n\nexport const CriterionType = {\n expression: 'expression',\n rubric: 'rubric',\n} as const;\n\n/**\n * How the user side of a test chat is driven.\n *\n * Used on the API request surface — clients declare intent as a typed\n * enum. The stored representation is just ``TestChatRun.driver_member_id``:\n * ``None`` → AUTO, otherwise → HUMAN (with the driver recorded).\n */\nexport type DriverMode = typeof DriverMode[keyof typeof DriverMode];\n\n\nexport const DriverMode = {\n auto: 'auto',\n human: 'human',\n} as const;\n\n/**\n * One recorded effect intent, IDs and closed vocabularies only (WP-A3).\n *\n * An explicit projection of the typed payload — never the stored JSONB.\n * Fields a capability does not carry stay ``None``.\n */\nexport interface EffectIntentSummaryEventResponse {\n id: number;\n capability: string;\n status: string;\n taskId?: number | null;\n recipientMemberId?: number | null;\n interventionRequestId?: number | null;\n preparedChannels?: string[];\n channel?: string | null;\n inboxId?: number | null;\n recipientRoles?: string[];\n targetChatId?: number | null;\n phoneCallId?: number | null;\n eventRuleId?: number | null;\n eventId?: string | null;\n submission?: string | null;\n}\n\n/**\n * The run's recorded effect intents, bounded (WP-A3).\n *\n * ``truncated`` means the list is incomplete. ``recordingFailed`` means an\n * attempted effect is missing because it could not be recorded (it implies\n * ``truncated``). An empty list cannot tell a run that attempted nothing\n * from one recorded before intents existed.\n */\nexport interface EffectIntentSummaryResponse {\n events: EffectIntentSummaryEventResponse[];\n truncated: boolean;\n recordingFailed?: boolean;\n}\n\n/**\n * Response model for a workspace-scoped Persona.\n */\nexport interface PersonaResponse {\n id: number;\n uuid: string;\n name: string;\n description: string | null;\n age: number | null;\n dateOfBirth: string | null;\n hasPhone: boolean;\n notifySms?: boolean | null;\n hasEmail: boolean;\n memberRoleUuid: string | null;\n identity: string | null;\n dataRecords?: PersonaResponseDataRecords;\n archived: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type PersonaResponseDataRecords = { [key: string]: unknown } | null;\n\n/**\n * Response model for a qualification (per-workflow scenario suite).\n */\nexport interface QualificationResponse {\n id: number;\n uuid: string;\n workflowId: number;\n workflowUuid?: string | null;\n workflowName?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Where one run stands, for health purposes. Exactly one per run.\n *\n * Only ``passed`` and ``failed`` are grades. The others are kept apart so a\n * caption can say *why* there is no grade, and none of them is ever evidence\n * against the Agent.\n */\nexport type RunHealthCategory = typeof RunHealthCategory[keyof typeof RunHealthCategory];\n\n\nexport const RunHealthCategory = {\n passed: 'passed',\n failed: 'failed',\n running: 'running',\n not_applicable: 'not_applicable',\n awaiting_evaluation: 'awaiting_evaluation',\n ungradeable: 'ungradeable',\n incomplete: 'incomplete',\n} as const;\n\n/**\n * Response model for a grading criterion.\n */\nexport interface ScenarioCriterionResponse {\n id: number;\n uuid: string;\n scenarioId: number;\n order: number;\n name: string;\n description: string | null;\n criterionType: string;\n weight: number;\n celExpression: string | null;\n evaluationPrompt: string | null;\n passingThreshold: number;\n archived: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Response model for a scenario with nested criteria.\n */\nexport interface ScenarioResponse {\n id: number;\n uuid: string;\n qualificationId: number;\n order: number;\n slug: string;\n name: string;\n description: string | null;\n personaId?: number | null;\n personaName?: string | null;\n goal?: string | null;\n channel?: string | null;\n dataRecords?: ScenarioResponseDataRecords;\n simulatedDatetime?: string | null;\n anonymous: boolean;\n criteria: ScenarioCriterionResponse[];\n archived: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type ScenarioResponseDataRecords = { [key: string]: unknown } | null;\n\n/**\n * Launch a test chat run under a workflow.\n *\n * If ``scenarioId`` is set, the scenario's persona/goal/channel/data\n * seed the chat and the run is eligible for grading. If omitted, the\n * caller supplies those directly (ad-hoc) and no evaluation will run.\n */\nexport interface StartTestChatRunRequest {\n scenarioId?: number | null;\n workflowRevisionId?: number | null;\n workflowRevisionUuid?: string | null;\n personaId?: number | null;\n testMemberId?: number | null;\n goal?: string | null;\n channel?: string | null;\n dataRecords?: StartTestChatRunRequestDataRecords;\n driver?: DriverMode;\n useDefaultTestIdentity?: boolean;\n anonymous?: boolean | null;\n assistantChatModelId?: string | null;\n assistantChatModelConfig?: StartTestChatRunRequestAssistantChatModelConfig;\n assistantRealtimeModelId?: string | null;\n assistantRealtimeModelConfig?: StartTestChatRunRequestAssistantRealtimeModelConfig;\n evaluateOnCompletion?: boolean;\n}\n\nexport type StartTestChatRunRequestAssistantChatModelConfig = { [key: string]: unknown } | null;\n\nexport type StartTestChatRunRequestAssistantRealtimeModelConfig = { [key: string]: unknown } | null;\n\nexport type StartTestChatRunRequestDataRecords = { [key: string]: unknown } | null;\n\n/**\n * Returned when starting a test chat run. Contains the run plus the\n * chat/test-member handles the UI needs to subscribe and drive.\n */\nexport interface StartTestChatRunResponse {\n run: TestChatRunResponse;\n testMemberId: number;\n driver: string;\n}\n\n/**\n * What a run actually exercised, derived at read time — never stored.\n *\n * Derived from the run's own Chat channel plus the assistant realtime model\n * snapshotted on the run at start, so a later Scenario edit cannot rewrite\n * what a finished run claims to have tested.\n */\nexport type TestChatRunLane = typeof TestChatRunLane[keyof typeof TestChatRunLane];\n\n\nexport const TestChatRunLane = {\n text: 'text',\n web_realtime: 'web_realtime',\n core_agent_only: 'core_agent_only',\n unsupported: 'unsupported',\n unknown: 'unknown',\n} as const;\n\n/**\n * Why a :class:`TestChatRun` stopped.\n *\n * Split three ways: *successful* (the conversation reached a deliberate\n * ending), *gradeable non-success* (something real happened and criteria may\n * read it, but the Agent did not demonstrably achieve the goal), and\n * *unscoreable* (the workspace configuration or the eval rig failed, so the\n * run is not evidence about the Agent at all).\n */\nexport type TestChatRunOutcome = typeof TestChatRunOutcome[keyof typeof TestChatRunOutcome];\n\n\nexport const TestChatRunOutcome = {\n simulator_end: 'simulator_end',\n terminal_tool: 'terminal_tool',\n agent_silent: 'agent_silent',\n max_turns: 'max_turns',\n human_end: 'human_end',\n configuration_failure: 'configuration_failure',\n instrument_failure: 'instrument_failure',\n} as const;\n\n/**\n * Response model for a test chat run with nested criterion results.\n *\n * ``scenarioId`` is optional — NULL means ad-hoc (no scenario linkage,\n * no grading).\n */\nexport interface TestChatRunResponse {\n id: number;\n uuid: string;\n workflowId: number | null;\n workflowUuid?: string | null;\n workflowRevisionId: number | null;\n workflowRevisionUuid?: string | null;\n workflowRevisionNumber?: number | null;\n workflowRevisionName?: string | null;\n definitionCaptured?: boolean;\n scenarioId?: number | null;\n scenarioSlug?: string | null;\n scenarioName?: string | null;\n chatId?: number | null;\n assignmentId?: number | null;\n driverMemberId?: number | null;\n driverMemberName?: string | null;\n startedAt: string;\n completedAt?: string | null;\n failedAt?: string | null;\n failureReason?: string | null;\n outcome: TestChatRunOutcome | null;\n lane: TestChatRunLane;\n healthCategory: RunHealthCategory | null;\n startedAfterTestChange: boolean | null;\n overallScore?: number | null;\n passed?: boolean | null;\n evaluatedAt?: string | null;\n assistantChatModelId?: string | null;\n assistantRealtimeModelId?: string | null;\n timingSummary?: TestChatRunResponseTimingSummary;\n strictTraceSummary?: TestChatRunResponseStrictTraceSummary;\n effectIntents?: EffectIntentSummaryResponse | null;\n criterionResults?: CriterionResultResponse[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport type TestChatRunResponseStrictTraceSummary = { [key: string]: unknown } | null;\n\nexport type TestChatRunResponseTimingSummary = { [key: string]: unknown } | null;\n\n/**\n * Update a workspace-scoped Persona.\n */\nexport interface UpdatePersonaRequest {\n name?: string | null;\n description?: string | null;\n age?: number | null;\n dateOfBirth?: string | null;\n hasPhone?: boolean | null;\n notifySms?: boolean | null;\n hasEmail?: boolean | null;\n memberRoleUuid?: string | null;\n identity?: string | null;\n dataRecords?: UpdatePersonaRequestDataRecords;\n}\n\nexport type UpdatePersonaRequestDataRecords = { [key: string]: unknown } | null;\n\n/**\n * Update an existing scenario.\n */\nexport interface UpdateScenarioRequest {\n slug?: string | null;\n name?: string | null;\n description?: string | null;\n personaId?: number | null;\n goal?: string | null;\n channel?: string | null;\n dataRecords?: UpdateScenarioRequestDataRecords;\n order?: number | null;\n archived?: boolean | null;\n criteria?: CriterionInput[] | null;\n simulatedDatetime?: string | null;\n anonymous?: boolean | null;\n}\n\nexport type UpdateScenarioRequestDataRecords = { [key: string]: unknown } | null;\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: qualification_health_service\n */\n\n\n/**\n * Which sentence the card caption says. The client owns the words.\n *\n * ``recent_passes`` when the card is passing only because its newest 3\n * grades (``RECENT_PASS_STREAK``) passed while an older one since the\n * change failed, so the words can say so rather than \"all passed\".\n * ``pass_ratio`` for any other card with grades since the test last\n * changed. Otherwise the first that applies, over those same runs: runs\n * that could not be graded, runs awaiting evaluation, runs still running;\n * then runs on this revision only from before the test changed, runs only\n * on other revisions, no runs at all.\n */\nexport type ScenarioHealthCaption = typeof ScenarioHealthCaption[keyof typeof ScenarioHealthCaption];\n\n\nexport const ScenarioHealthCaption = {\n recent_passes: 'recent_passes',\n pass_ratio: 'pass_ratio',\n could_not_grade: 'could_not_grade',\n awaiting_evaluation: 'awaiting_evaluation',\n running: 'running',\n not_run_since_test_change: 'not_run_since_test_change',\n not_run_on_revision: 'not_run_on_revision',\n never_run: 'never_run',\n} as const;\n\n/**\n * The board's one-line answer to \"are we all green?\".\n */\nexport type ScenarioHealthHeadline = typeof ScenarioHealthHeadline[keyof typeof ScenarioHealthHeadline];\n\n\nexport const ScenarioHealthHeadline = {\n needs_attention: 'needs_attention',\n no_results: 'no_results',\n all_passing: 'all_passing',\n no_scenarios: 'no_scenarios',\n} as const;\n\n/**\n * A caveat about how much evidence stands behind a green card.\n */\nexport type ScenarioHealthSampleNote = typeof ScenarioHealthSampleNote[keyof typeof ScenarioHealthSampleNote];\n\n\nexport const ScenarioHealthSampleNote = {\n low_sample: 'low_sample',\n} as const;\n\n/**\n * A scenario's health on the selected revision.\n */\nexport type ScenarioHealthState = typeof ScenarioHealthState[keyof typeof ScenarioHealthState];\n\n\nexport const ScenarioHealthState = {\n failing: 'failing',\n flaky: 'flaky',\n no_results: 'no_results',\n passing: 'passing',\n} as const;\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: qualification_health_summary\n */\n\n\n/**\n * Which part of a revision's runs a chart point covers, when not all.\n *\n * Only the board's revision is ever split, and only its runs from before\n * the test last changed are marked; every other point covers all of its\n * revision's runs.\n */\nexport type RevisionHistorySegment = typeof RevisionHistorySegment[keyof typeof RevisionHistorySegment];\n\n\nexport const RevisionHistorySegment = {\n before_test_change: 'before_test_change',\n} as const;\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: qualification_run_identity\n */\n\n\n/**\n * Why a start would be refused before any row is minted.\n *\n * The client maps each code to its own words; a new blocker is a new member\n * here, not a new response field.\n */\nexport type ScenarioRunBlocker = typeof ScenarioRunBlocker[keyof typeof ScenarioRunBlocker];\n\n\nexport const ScenarioRunBlocker = {\n missing_persona: 'missing_persona',\n archived_persona: 'archived_persona',\n} as const;\n","// Qualification and scenario evaluation types.\n// Server response shapes are generated from Pydantic via emit_openapi.py → Orval.\n// Client-only shapes (enums, forms, request bodies) are defined below.\n\n// ===== GENERATED SERVER TYPES =====\n\nexport type {\n CriterionResultResponse,\n QualificationResponse,\n QualificationResponse as Qualification,\n StartTestChatRunResponse,\n TestChatRunResponse,\n} from './generated/qualification';\n\n// Run-honesty vocabulary (backend: lib/services/qualification_run_classification.py).\n// `TestChatRunOutcome` says why a run stopped — a run that stops is not a run\n// that succeeded. `TestChatRunLane` says what it actually exercised, so a\n// `web-voice` scenario driven through the text loop cannot present itself as\n// voice coverage. Re-exported as values, not just types: consumers compare\n// against the members.\n// `RunHealthCategory` is the server's per-run health category, carried on\n// each row of the Workflow run list.\nexport { RunHealthCategory, TestChatRunLane, TestChatRunOutcome } from './generated/qualification';\n\n// Scenario health board (backend: lib/services/qualification_health_service.py).\n// Every state, caption and headline is decided by the server from exact\n// counts; clients render these values and never re-derive them.\nexport type {\n BeforeTestChangeCountsResponse,\n PreviousRevisionGradesResponse,\n ScenarioHealthBoardResponse,\n ScenarioHealthCountsResponse,\n ScenarioHealthSummaryListResponse,\n ScenarioHealthSummaryResponse,\n ScenarioRevisionHistoryPointResponse,\n} from './generated/qualification_health';\nexport {\n ScenarioHealthCaption,\n ScenarioHealthHeadline,\n ScenarioHealthSampleNote,\n ScenarioHealthState,\n} from './generated/qualification_health_service';\n// A card chart point that covers only the board revision's runs from before\n// the scenario's test last changed.\nexport { RevisionHistorySegment } from './generated/qualification_health_summary';\n\n// Why the board cannot start a scenario as it stands (backend:\n// lib/services/qualification_run_identity.py) — the same definition the start\n// route refuses with. A closed code; clients word it, never re-derive it.\nexport { ScenarioRunBlocker } from './generated/qualification_run_identity';\n\nimport type {\n CriterionResultResponse,\n PersonaResponse as GeneratedPersonaResponse,\n ScenarioCriterionResponse as GeneratedScenarioCriterionResponse,\n ScenarioResponse as GeneratedScenarioResponse,\n TestChatRunResponse,\n} from './generated/qualification';\n\n// ===== CLIENT-ONLY TYPES =====\n\nexport enum CriterionType {\n EXPRESSION = 'expression',\n RUBRIC = 'rubric',\n}\n\nexport enum DriverMode {\n AUTO = 'auto',\n HUMAN = 'human',\n}\n\n// ===== Scenario data records (keyed by data-type slug) =====\n\nexport interface ScenarioDataRecord {\n externalId?: string;\n fieldValues: Record<string, unknown>;\n}\n\nexport type ScenarioCriterion = Omit<GeneratedScenarioCriterionResponse, 'criterionType'> & {\n criterionType: CriterionType | string;\n};\nexport type ScenarioCriterionResponse = ScenarioCriterion;\n\nexport type Scenario = Omit<GeneratedScenarioResponse, 'dataRecords'> & {\n dataRecords?: Record<string, ScenarioDataRecord> | null;\n};\nexport type ScenarioResponse = Scenario;\n\nexport type Persona = Omit<GeneratedPersonaResponse, 'dataRecords'> & {\n dataRecords?: Record<string, ScenarioDataRecord> | null;\n};\nexport type PersonaResponse = Persona;\n\nexport type TestChatRun = TestChatRunResponse & {\n workflowUuid?: string | null;\n workflowRevisionId?: number | null;\n workflowRevisionUuid?: string | null;\n workflowRevisionNumber?: number | null;\n workflowRevisionName?: string | null;\n scenarioSlug?: string | null;\n scenarioName?: string | null;\n driverMemberName?: string | null;\n};\n\nexport type CriterionResult = CriterionResultResponse;\n\n// ===== Request types =====\n\nexport interface CriterionInput {\n id?: number;\n name: string;\n description?: string;\n criterionType: CriterionType;\n weight?: number;\n celExpression?: string;\n evaluationPrompt?: string;\n passingThreshold?: number;\n}\n\nexport interface CreateScenarioRequest {\n slug: string;\n name: string;\n description?: string;\n personaId?: number;\n goal?: string;\n channel?: string;\n dataRecords?: Record<string, ScenarioDataRecord>;\n order?: number;\n criteria?: CriterionInput[];\n simulatedDatetime?: string | null;\n}\n\nexport interface UpdateScenarioRequest {\n slug?: string;\n name?: string;\n description?: string;\n personaId?: number;\n goal?: string;\n channel?: string;\n dataRecords?: Record<string, ScenarioDataRecord>;\n order?: number;\n archived?: boolean;\n criteria?: CriterionInput[];\n simulatedDatetime?: string | null;\n}\n\nexport interface CreatePersonaRequest {\n name: string;\n description?: string;\n age?: number;\n /** ISO `YYYY-MM-DD`; identity verification matches against it. On update, `null` clears it. */\n dateOfBirth?: string | null;\n hasPhone?: boolean;\n hasEmail?: boolean;\n notifySms?: boolean | null;\n memberRoleUuid?: string | null;\n identity?: string;\n dataRecords?: Record<string, ScenarioDataRecord>;\n}\n\nexport interface UpdatePersonaRequest {\n name?: string;\n description?: string;\n age?: number;\n /** ISO `YYYY-MM-DD`; identity verification matches against it. On update, `null` clears it. */\n dateOfBirth?: string | null;\n hasPhone?: boolean;\n hasEmail?: boolean;\n notifySms?: boolean | null;\n memberRoleUuid?: string | null;\n identity?: string;\n dataRecords?: Record<string, ScenarioDataRecord>;\n}\n\n/**\n * Start a test chat run on a workflow.\n *\n * With ``scenarioId``: the scenario's persona/goal/channel/data act as\n * defaults (overridable). The run is eligible for grading afterwards.\n *\n * Without ``scenarioId``: an ad-hoc run. ``personaId`` is required; the\n * run has no scenario linkage and cannot be evaluated.\n */\nexport interface StartTestChatRunRequest {\n scenarioId?: number;\n workflowRevisionId?: number;\n workflowRevisionUuid?: string;\n personaId?: number;\n /** Reuse an existing test member instead of minting one from a persona. */\n testMemberId?: number;\n goal?: string;\n channel?: string;\n dataRecords?: Record<string, ScenarioDataRecord>;\n driver?: DriverMode;\n /**\n * Exercise anonymous-caller behavior with a fresh anonymous member.\n * Persona identity fields and DataRecords are not persisted on it.\n * Requires the `chats:admin` scope.\n *\n * @default false\n */\n anonymous?: boolean;\n assistantChatModelId?: string;\n assistantChatModelConfig?: Record<string, unknown>;\n assistantRealtimeModelId?: string;\n assistantRealtimeModelConfig?: Record<string, unknown>;\n /**\n * Grade the run automatically once it completes. The server requests the\n * evaluation itself, so it proceeds with no client connected. Needs a\n * `scenarioId` and `driver: 'auto'`; other runs are refused and are graded\n * with Evaluate once they end.\n *\n * @default false\n */\n evaluateOnCompletion?: boolean;\n}\n","// Access grant types.\n// Server response shapes are generated from Pydantic via emit_openapi.py → Orval.\n\nexport type { AccessGrantResponse as GeneratedAccessGrantResponse } from './generated/access_grant';\n\nimport type { AccessGrantResponse as GeneratedAccessGrantResponse } from './generated/access_grant';\n\nexport type AccessGrant = Omit<GeneratedAccessGrantResponse, 'status'> & {\n status: AccessGrantStatus;\n};\n\nexport type AccessGrantResponse = AccessGrant;\n\nexport enum AccessGrantResourceType {\n DATA_RECORD = 'data_record',\n DATA_TYPE = 'data_type',\n FILE = 'file',\n FOLDER = 'folder',\n CALENDAR = 'calendar',\n INBOX = 'inbox',\n SITE = 'site',\n ASSIGNMENT = 'assignment',\n APP_CONNECTION = 'app_connection',\n CAPABILITY = 'capability',\n}\n\n/** Capability classes grantable via capability-typed grants. */\nexport enum CapabilityClass {\n TOOL_ALWAYS_ALLOW = 'tool.always_allow',\n SCOPE_ALWAYS_ALLOW = 'scope.always_allow',\n SELF_MODIFICATION_SCHEDULE = 'self_modification.schedule',\n ATTENTION_INTERRUPT_RUNG = 'attention.interrupt_rung',\n}\n\nexport enum AccessGrantStatus {\n PENDING = 'pending',\n ACTIVE = 'active',\n DENIED = 'denied',\n EXPIRED = 'expired',\n REVOKED = 'revoked',\n}\n\nexport enum AccessGrantTrigger {\n WORKFLOW_AUTO = 'workflow_auto',\n OPERATOR_REQUEST = 'operator_request',\n ADMIN_OVERRIDE = 'admin_override',\n MEMBER_SELF = 'member_self',\n}\n\nexport enum ConsentMethod {\n AUTO_POLICY = 'auto_policy',\n VERBAL = 'verbal',\n DTMF = 'dtmf',\n TEXT_CONFIRM = 'text_confirm',\n UI_BUTTON = 'ui_button',\n ADMIN_OVERRIDE = 'admin_override',\n}\n\nexport interface CreateAccessGrantRequest {\n granteeMemberId: number;\n resourceType: AccessGrantResourceType;\n resourceId?: number;\n dataTypeId?: number;\n /** Capability grants only (resourceType 'capability'). */\n capabilityClass?: CapabilityClass | string;\n /** Declared structural limits for capability grants — never PHI. */\n bounds?: Record<string, unknown>;\n accessMode?: number;\n trigger: AccessGrantTrigger;\n assignmentId?: number;\n chatId?: number;\n expiresAt?: string;\n consentMethod?: ConsentMethod;\n autoApprove?: boolean;\n}\n\nexport interface ResolveGrantRequest {\n approve: boolean;\n consentMethod?: ConsentMethod;\n expiresAt?: string;\n}\n\nexport interface RevokeGrantRequest {\n reason?: string;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: member_relationship\n */\n\n\n/**\n * Attach a related member, named by their role relative to the path member.\n *\n * Kinship and outreach roles need ``members:write``. Chart-read roles\n * (legal guardian, healthcare agent, doctor, primary contact) also need\n * ``members:admin`` — the service checks that after the kind is resolved.\n */\nexport interface CreateMemberRelationshipRequest {\n /** @minimum 1 */\n relatedMemberId: number;\n relatedRole: RelatedMemberRole;\n}\n\n/**\n * Canonical stored kinds. Source is the responsible / related party.\n */\nexport type MemberRelationshipKind = typeof MemberRelationshipKind[keyof typeof MemberRelationshipKind];\n\n\nexport const MemberRelationshipKind = {\n parent_of: 'parent_of',\n sibling_of: 'sibling_of',\n spouse_of: 'spouse_of',\n caregiver_of: 'caregiver_of',\n emergency_contact_of: 'emergency_contact_of',\n next_of_kin_of: 'next_of_kin_of',\n legal_guardian_of: 'legal_guardian_of',\n healthcare_agent_of: 'healthcare_agent_of',\n doctor_of: 'doctor_of',\n primary_contact_of: 'primary_contact_of',\n} as const;\n\nexport interface MemberRelationshipKindResponse {\n kind: MemberRelationshipKind;\n cardinality: RelationshipCardinality;\n symmetric: boolean;\n grantsChartAccess: boolean;\n roles: RelatedRoleCatalogItem[];\n}\n\nexport interface MemberRelationshipResponse {\n id: number;\n uuid: string;\n kind: MemberRelationshipKind;\n relatedRole: RelatedMemberRole;\n relatedMemberId: number;\n relatedMemberName?: string | null;\n grantsChartAccess: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * The related member's role as seen from the member whose page you are on.\n */\nexport type RelatedMemberRole = typeof RelatedMemberRole[keyof typeof RelatedMemberRole];\n\n\nexport const RelatedMemberRole = {\n parent: 'parent',\n child: 'child',\n sibling: 'sibling',\n spouse: 'spouse',\n caregiver: 'caregiver',\n care_recipient: 'care_recipient',\n emergency_contact: 'emergency_contact',\n emergency_contact_for: 'emergency_contact_for',\n next_of_kin: 'next_of_kin',\n next_of_kin_for: 'next_of_kin_for',\n legal_guardian: 'legal_guardian',\n legal_guardian_for: 'legal_guardian_for',\n healthcare_agent: 'healthcare_agent',\n healthcare_agent_for: 'healthcare_agent_for',\n doctor: 'doctor',\n patient: 'patient',\n primary_contact: 'primary_contact',\n primary_contact_for: 'primary_contact_for',\n} as const;\n\nexport interface RelatedRoleCatalogItem {\n role: RelatedMemberRole;\n label: string;\n inverseLabel: string;\n description: string;\n}\n\n/**\n * many_to_many, one_to_one (both ends), or one_per_target.\n */\nexport type RelationshipCardinality = typeof RelationshipCardinality[keyof typeof RelationshipCardinality];\n\n\nexport const RelationshipCardinality = {\n many_to_many: 'many_to_many',\n one_to_one: 'one_to_one',\n one_per_target: 'one_per_target',\n} as const;\n","/**\n * Generated from lib.models.workspace.member_relationship.KIND_SPECS.\n * Do not edit manually. Regenerated by yarn generate:types.\n */\nimport type { MemberRelationshipKindResponse } from './member_relationship';\n\nexport const MEMBER_RELATIONSHIP_KINDS = [\n {\n \"kind\": \"parent_of\",\n \"cardinality\": \"many_to_many\",\n \"symmetric\": false,\n \"grantsChartAccess\": false,\n \"roles\": [\n {\n \"role\": \"parent\",\n \"label\": \"Parent\",\n \"inverseLabel\": \"Child\",\n \"description\": \"This person is a parent of the member. For a minor, also add Legal guardian if they should read the chart.\"\n },\n {\n \"role\": \"child\",\n \"label\": \"Child\",\n \"inverseLabel\": \"Parent\",\n \"description\": \"This person is a child of the member.\"\n }\n ]\n },\n {\n \"kind\": \"sibling_of\",\n \"cardinality\": \"many_to_many\",\n \"symmetric\": true,\n \"grantsChartAccess\": false,\n \"roles\": [\n {\n \"role\": \"sibling\",\n \"label\": \"Sibling\",\n \"inverseLabel\": \"Sibling\",\n \"description\": \"These members are siblings.\"\n }\n ]\n },\n {\n \"kind\": \"spouse_of\",\n \"cardinality\": \"one_to_one\",\n \"symmetric\": true,\n \"grantsChartAccess\": false,\n \"roles\": [\n {\n \"role\": \"spouse\",\n \"label\": \"Spouse\",\n \"inverseLabel\": \"Spouse\",\n \"description\": \"These members are spouses or partners.\"\n }\n ]\n },\n {\n \"kind\": \"caregiver_of\",\n \"cardinality\": \"many_to_many\",\n \"symmetric\": false,\n \"grantsChartAccess\": false,\n \"roles\": [\n {\n \"role\": \"caregiver\",\n \"label\": \"Caregiver\",\n \"inverseLabel\": \"Care recipient\",\n \"description\": \"This person provides care for the member at home.\"\n },\n {\n \"role\": \"care_recipient\",\n \"label\": \"Care recipient\",\n \"inverseLabel\": \"Caregiver\",\n \"description\": \"This person receives care from the member.\"\n }\n ]\n },\n {\n \"kind\": \"emergency_contact_of\",\n \"cardinality\": \"many_to_many\",\n \"symmetric\": false,\n \"grantsChartAccess\": false,\n \"roles\": [\n {\n \"role\": \"emergency_contact\",\n \"label\": \"Emergency contact\",\n \"inverseLabel\": \"Emergency contact for\",\n \"description\": \"This person is the member's emergency contact.\"\n },\n {\n \"role\": \"emergency_contact_for\",\n \"label\": \"Emergency contact for\",\n \"inverseLabel\": \"Emergency contact\",\n \"description\": \"The member is listed as this person's emergency contact.\"\n }\n ]\n },\n {\n \"kind\": \"next_of_kin_of\",\n \"cardinality\": \"one_per_target\",\n \"symmetric\": false,\n \"grantsChartAccess\": false,\n \"roles\": [\n {\n \"role\": \"next_of_kin\",\n \"label\": \"Next of kin\",\n \"inverseLabel\": \"Next of kin for\",\n \"description\": \"This person is the member's designated next of kin. A member has at most one.\"\n },\n {\n \"role\": \"next_of_kin_for\",\n \"label\": \"Next of kin for\",\n \"inverseLabel\": \"Next of kin\",\n \"description\": \"The member is this person's designated next of kin.\"\n }\n ]\n },\n {\n \"kind\": \"legal_guardian_of\",\n \"cardinality\": \"many_to_many\",\n \"symmetric\": false,\n \"grantsChartAccess\": true,\n \"roles\": [\n {\n \"role\": \"legal_guardian\",\n \"label\": \"Legal guardian\",\n \"inverseLabel\": \"Legal guardian for\",\n \"description\": \"Court-appointed guardian, or parent/person with parental responsibility for a minor.\"\n },\n {\n \"role\": \"legal_guardian_for\",\n \"label\": \"Legal guardian for\",\n \"inverseLabel\": \"Legal guardian\",\n \"description\": \"The member is this person's legal guardian.\"\n }\n ]\n },\n {\n \"kind\": \"healthcare_agent_of\",\n \"cardinality\": \"many_to_many\",\n \"symmetric\": false,\n \"grantsChartAccess\": true,\n \"roles\": [\n {\n \"role\": \"healthcare_agent\",\n \"label\": \"Healthcare agent\",\n \"inverseLabel\": \"Healthcare agent for\",\n \"description\": \"Healthcare power of attorney or health proxy.\"\n },\n {\n \"role\": \"healthcare_agent_for\",\n \"label\": \"Healthcare agent for\",\n \"inverseLabel\": \"Healthcare agent\",\n \"description\": \"The member is this person's healthcare agent (healthcare power of attorney or health proxy).\"\n }\n ]\n },\n {\n \"kind\": \"doctor_of\",\n \"cardinality\": \"many_to_many\",\n \"symmetric\": false,\n \"grantsChartAccess\": true,\n \"roles\": [\n {\n \"role\": \"doctor\",\n \"label\": \"Doctor\",\n \"inverseLabel\": \"Patient\",\n \"description\": \"This person is a treating clinician for the member.\"\n },\n {\n \"role\": \"patient\",\n \"label\": \"Patient\",\n \"inverseLabel\": \"Doctor\",\n \"description\": \"This person is a patient of the member.\"\n }\n ]\n },\n {\n \"kind\": \"primary_contact_of\",\n \"cardinality\": \"one_per_target\",\n \"symmetric\": false,\n \"grantsChartAccess\": true,\n \"roles\": [\n {\n \"role\": \"primary_contact\",\n \"label\": \"Primary contact\",\n \"inverseLabel\": \"Primary contact for\",\n \"description\": \"This person is the organization's primary contact for the member. A member has at most one.\"\n },\n {\n \"role\": \"primary_contact_for\",\n \"label\": \"Primary contact for\",\n \"inverseLabel\": \"Primary contact\",\n \"description\": \"The member is this person's assigned primary contact inside the organization.\"\n }\n ]\n }\n] as const satisfies readonly MemberRelationshipKindResponse[];\n","// Canonical configuration-health types.\n// Server response shapes are generated from Pydantic via emit_openapi.py → Orval.\n//\n// One slim issue contract shared by the customer `configuration-health`\n// dashboard widget, the superuser Customer Health detail section, and the\n// Workflow/Journey editor health dialogs.\n//\n// `provenance` is a DISCRIMINATED union: a real registered Ability is always\n// `{ kind: 'ability' }` — including real `system:*` slugs such as\n// `system:strict_workflow` — and a non-Ability detector is always\n// `{ kind: 'detector' }`. Never infer provenance from a slug prefix.\n\nexport type {\n ConfigHealthAbilityProvenance,\n ConfigHealthCheckStatus,\n ConfigHealthCheckStatusCheckSlug,\n ConfigHealthCheckStatusStatus,\n ConfigHealthCollection,\n ConfigHealthDetectorProvenance,\n ConfigHealthDetectorProvenanceDetector,\n ConfigHealthIssue,\n ConfigHealthIssueCheckSlug,\n ConfigHealthIssueSeverity,\n ConfigHealthRemediation,\n ConfigHealthRemediationDestination,\n ConfigHealthRemediationFocus,\n ConfigHealthRemediationResourceKind,\n ConfigHealthSubject,\n ConfigHealthSummary,\n ConfigHealthSummaryByCheck,\n PaginatedResponseConfigHealthIssue,\n} from './generated/config_health';\n\nimport type {\n ConfigHealthIssueCheckSlug,\n ConfigHealthIssueSeverity,\n} from './generated/config_health';\n\n// ===== CLIENT-ONLY TYPES =====\n\n/**\n * The four families the workspace facade actually evaluates — the only values\n * its `check` query parameter accepts.\n *\n * Derived from the generated item union by subtraction rather than re-typed,\n * so a new family added to the backend arrives here automatically and cannot\n * silently diverge. `journey.runtime` is a legitimate ITEM slug (the Journey\n * editor emits it) but is structurally unreachable from the facade, so the\n * server rejects it as a filter with a 422: a filter value that can never\n * match would page over an empty list and read as a healthy workspace.\n */\nexport type ConfigHealthFacadeCheckSlug = Exclude<ConfigHealthIssueCheckSlug, 'journey.runtime'>;\n\n/**\n * Every accepted `check` filter value, in the facade's display order.\n *\n * `satisfies` proves each entry is a real facade slug; it does NOT prove the\n * list is complete, so a family added to the backend has to be added here too\n * or its chip silently never renders. `isConfigHealthFacadeCheckSlug` below is\n * the only gate the widget's chip list has.\n */\nexport const CONFIG_HEALTH_FACADE_CHECK_SLUGS = [\n 'workflow.config',\n 'journey.authoring',\n 'journey.v2_validation',\n 'workspace.validation',\n] as const satisfies readonly ConfigHealthFacadeCheckSlug[];\n\n/**\n * Narrow an item `checkSlug` to one the facade will accept as a filter.\n *\n * Needed because response items and check statuses are typed with the FIVE\n * member item union: a UI that turns a returned `checkSlug` into a filter\n * chip has to prove the value is filterable first.\n */\nexport function isConfigHealthFacadeCheckSlug(value: string): value is ConfigHealthFacadeCheckSlug {\n return (CONFIG_HEALTH_FACADE_CHECK_SLUGS as readonly string[]).includes(value);\n}\n\n/**\n * Query parameters for the bounded configuration-health read.\n *\n * `check` and `severity` are the server's closed vocabularies — typed here\n * from the generated literal unions so an unknown value is a compile error\n * rather than a 422 at runtime. They narrow the ISSUE LIST server-side, before\n * pagination (so a match on a later page is reachable at all); `summary` and\n * `checks` stay workspace-global on purpose, because a filtered view must\n * never make a workspace look healthy.\n */\nexport interface ConfigHealthQueryParams {\n page?: number;\n pageSize?: number;\n check?: ConfigHealthFacadeCheckSlug;\n severity?: ConfigHealthIssueSeverity;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: ui_prompt\n */\n\n\n/**\n * The member's own hosted form link for a pending UI prompt.\n *\n * Served by ``POST /chats/{chat_id}/form-link`` to the member who minted\n * it — the URL a QR-code-capable device encodes so the prompt can be\n * completed on a second device (``GET``/``POST /form/{token}``). The\n * token is a member-bound bearer: it must not travel in tool results or\n * audit payloads, for the same reason as :class:`InlineConnectLinkResponse`.\n */\nexport interface FormLinkResponse {\n /** Member-bound, short-lived `/form/{token}` URL */\n formUrl: string;\n /** Lifetime of the link from when it was minted */\n expiresInMinutes: number;\n}\n\n/**\n * The member's own live connect link, fetched on demand by the connect card.\n *\n * Served by ``GET /chats/{chat_id}/inline-connect/{app_slug}/link`` to the\n * member the link was minted for, and to nobody else — see\n * :class:`UiPromptConnect` for why it does not travel in the tool result.\n */\nexport interface InlineConnectLinkResponse {\n /** Member-bound, short-lived `/connect/{token}` URL */\n connectUrl: string;\n /** Lifetime of the link from when it was minted */\n expiresInMinutes: number;\n}\n\n/**\n * The connect-card payload of an ``inline_connect`` prompt.\n *\n * Deliberately WITHOUT the link. ``GET /connect/{token}`` is unauthenticated\n * by design (it has to work from a text message on a phone), which makes the\n * URL a bearer credential — and a tool result is the wrong place for one: it\n * is persisted in chat history, replayed into every later model call,\n * exported with the transcript and copied into traces, readable by anyone\n * with ``CHATS_READ`` on the chat for the 15 minutes it stays live. The card\n * fetches the link when the member clicks Connect, from\n * ``GET /chats/{chat_id}/inline-connect/{app_slug}/link``, which answers only\n * for the acting member's own solicitation (:class:`InlineConnectLinkResponse`).\n */\nexport interface UiPromptConnect {\n /** Platform slug, e.g. `gmail`, `gcalendar` */\n appSlug: string;\n /** UUID of the workspace app connection */\n connectionUuid: string;\n /** Human-readable provider name, e.g. `Gmail` */\n label: string;\n /** Lifetime of the connect link, in minutes, from when it was minted */\n expiresInMinutes: number;\n}\n\n/**\n * A UI prompt that has been shown to the member and is awaiting an answer.\n *\n * Serialized as the ``ToolMessage`` content of the tool call that raised it.\n */\nexport interface UiPromptPresented {\n status?: 'presented';\n /** The tool_call_id of the tool call that raised this prompt */\n promptId: string;\n kind: UiPromptPresentedKind;\n /** Heading shown above the UI */\n userPrompt?: string | null;\n /** OpenUI Lang markup for `render_ui` / `present_choice_list` */\n openuiMarkup?: string | null;\n /** Agent-only context for `render_ui`; never shown to the member */\n description?: string | null;\n /** `present_choice_list` allows multiple selections */\n multi?: boolean;\n /** Connect-card payload; `inline_connect` only */\n connect?: UiPromptConnect | null;\n /** LLM-facing guidance: shown, not answered yet — see `presented_instructions` */\n instructions: string;\n}\n\nexport type UiPromptPresentedKind = typeof UiPromptPresentedKind[keyof typeof UiPromptPresentedKind];\n\n\nexport const UiPromptPresentedKind = {\n render_ui: 'render_ui',\n present_choice_list: 'present_choice_list',\n inline_connect: 'inline_connect',\n} as const;\n\n/**\n * The member's answer to a prompt, parsed out of a ``<ui-prompt-response>``\n * user message.\n *\n * ``chosenValue`` carries a single value, or — for\n * ``present_choice_list(multi=True)`` — a JSON array encoded as a string, the\n * convention the multi-select UI already used. ``values`` is the flat\n * field→value map a form submit produces. Exactly one of them is set for\n * ``submitted``; neither is set for ``declined``.\n */\nexport interface UiPromptResponse {\n promptId: string;\n kind: UiPromptResponseKind;\n status: UiPromptResponseStatus;\n chosenValue?: string | null;\n values?: UiPromptResponseValues;\n}\n\nexport type UiPromptResponseKind = typeof UiPromptResponseKind[keyof typeof UiPromptResponseKind];\n\n\nexport const UiPromptResponseKind = {\n render_ui: 'render_ui',\n present_choice_list: 'present_choice_list',\n inline_connect: 'inline_connect',\n} as const;\n\nexport type UiPromptResponseStatus = typeof UiPromptResponseStatus[keyof typeof UiPromptResponseStatus];\n\n\nexport const UiPromptResponseStatus = {\n submitted: 'submitted',\n declined: 'declined',\n} as const;\n\nexport type UiPromptResponseValues = {[key: string]: string} | null;\n","// Experiment (A/B testing) types for member-level experiments.\n\nexport type ExperimentStatus = 'draft' | 'running' | 'paused' | 'completed' | 'archived';\n\nexport type AssignmentSource = 'event_rule' | 'manual' | 'api' | 'import' | 'lazy';\n\n/** Backend returns `\"<5\"` when a count is suppressed for privacy. */\nexport type ExperimentStatCount = number | '<5';\n\n/** Parse a stats count for arithmetic; returns null when suppressed. */\nexport function parseExperimentStatCount(value: ExperimentStatCount): number | null {\n return typeof value === 'number' ? value : null;\n}\n\nexport interface ExperimentGroup {\n id: number;\n uuid: string;\n experimentId: number;\n slug: string;\n name: string;\n allocationWeight: number;\n isControl: boolean;\n order: number;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface Experiment {\n id: number;\n uuid: string;\n slug: string;\n name: string;\n description?: string | null;\n status: ExperimentStatus;\n eligibilityCel?: string | null;\n isClinicalResearch: boolean;\n startedAt?: string | null;\n endedAt?: string | null;\n createdAt: string;\n updatedAt: string;\n groups?: ExperimentGroup[];\n assignmentCount?: number;\n hasRun?: boolean;\n}\n\nexport interface ExperimentFormData {\n slug: string;\n name: string;\n description?: string | null;\n eligibilityCel?: string | null;\n isClinicalResearch?: boolean;\n /** Optional groups to create in the same request (draft experiments only). */\n groups?: ExperimentGroupFormData[];\n}\n\nexport interface ExperimentUpdateData extends Partial<ExperimentFormData> {\n status?: ExperimentStatus;\n}\n\nexport interface ExperimentGroupFormData {\n slug: string;\n name: string;\n allocationWeight: number;\n isControl?: boolean;\n order?: number;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface ExperimentGroupUpdateData extends Partial<ExperimentGroupFormData> {}\n\nexport interface ExperimentGroupStats {\n groupId: number;\n groupUuid: string;\n groupSlug: string;\n groupName: string;\n isControl: boolean;\n assignedCount: ExperimentStatCount;\n exposedCount: ExperimentStatCount;\n}\n\nexport interface ExperimentStats {\n experimentId: number;\n groups: ExperimentGroupStats[];\n}\n\nexport interface ExperimentAssignmentCreateData {\n memberId: number;\n groupId?: number | null;\n}\n\nexport interface ExperimentAssignmentUpdateData {\n groupId: number;\n}\n\nexport interface MemberExperimentAssignment {\n experimentId: number;\n experimentUuid: string;\n experimentSlug: string;\n experimentName: string;\n experimentStatus: ExperimentStatus;\n groupId: number;\n groupUuid: string;\n groupSlug: string;\n groupName: string;\n isControl: boolean;\n assignedAt: string;\n assignmentSource: AssignmentSource;\n}\n","// Agent task types for operator-facing /agent-tasks routes.\n// Server response shapes are generated from Pydantic via emit_openapi.py → Orval.\n// Client-only shapes (canonical status unions, query params) are defined below.\n//\n// These routes return any agent task in the caller's workspace and are gated by\n// workspace-level MEMBERS_READ / MEMBERS_WRITE scopes.\n\n// ===== GENERATED SERVER TYPES =====\n\nexport type {\n AgentTaskMessageResponse,\n AgentTaskResponse,\n CancelAgentTaskResponse,\n} from './generated/agent_task';\n\n// ===== CLIENT-ONLY TYPES =====\n\n// Canonical protobuf TaskState names from a2a-sdk 1.0. The server\n// renders these via `TaskState.Name(int)` so the wire shape matches the\n// a2a-sdk's own `MessageToDict` output. The legacy lowercase short-form\n// (`'submitted'`, `'input-required'`, ...) and the `'unknown'` sentinel\n// were removed in the 1.0 cutover — there is no longer a Pydantic enum\n// to wrap. Any caller comparing `task.status === 'completed'` needs to\n// switch to `'TASK_STATE_COMPLETED'`.\nexport type AgentTaskStatus =\n | 'TASK_STATE_SUBMITTED'\n | 'TASK_STATE_WORKING'\n | 'TASK_STATE_INPUT_REQUIRED'\n | 'TASK_STATE_COMPLETED'\n | 'TASK_STATE_FAILED'\n | 'TASK_STATE_CANCELED'\n | 'TASK_STATE_REJECTED'\n | 'TASK_STATE_AUTH_REQUIRED';\n\n/** Tasks in any of these states cannot transition further. Mirrors\n * `TERMINAL_TASK_STATES` in `lib/models/workspace/agent_task.py`. */\nexport const TERMINAL_TASK_STATES: readonly AgentTaskStatus[] = [\n 'TASK_STATE_COMPLETED',\n 'TASK_STATE_FAILED',\n 'TASK_STATE_CANCELED',\n 'TASK_STATE_REJECTED',\n];\n\nexport type AgentTaskMode = 'async' | 'sync';\n\nexport interface ListAgentTasksParams {\n status?: AgentTaskStatus;\n agentMemberId?: number;\n parentTaskId?: number;\n limit?: number;\n}\n\nexport interface GetAgentTaskMessagesParams {\n limit?: number;\n}\n","import {\n Invitation,\n InvitationListResponse,\n InvitationStatus,\n ListInvitationsParams,\n UpdateInvitationFormData,\n} from '../types';\nimport { BaseApiClient } from './base';\n\nexport class WorkspaceInvitationsApi extends BaseApiClient {\n /**\n * List user's own invitations (both org and workspace).\n * For admin listing of a specific workspace's invitations, use listWorkspaceInvitationsAdmin.\n */\n async listWorkspaceInvitations(params?: ListInvitationsParams): Promise<InvitationListResponse> {\n const queryParams = new URLSearchParams();\n\n if (params?.status) queryParams.append('status', params.status);\n if (params?.page) queryParams.append('page', params.page.toString());\n if (params?.pageSize) queryParams.append('page_size', params.pageSize.toString());\n\n const queryString = queryParams.toString();\n const url = `invitations${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<InvitationListResponse>(url);\n }\n\n async getWorkspaceInvitation(requestId: number): Promise<Invitation> {\n return this.fetch<Invitation>(`invitations/${requestId}`);\n }\n\n async deleteWorkspaceInvitation(requestId: number): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`invitations/${requestId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Request membership to a public workspace.\n * Creates a membership request that workspace admins can approve or deny.\n */\n async requestWorkspaceMembership(workspaceUuid: string, message?: string): Promise<Invitation> {\n return this.fetch<Invitation>(`invitations/workspaces/${workspaceUuid}/request-membership`, {\n method: 'POST',\n body: JSON.stringify({ message }),\n });\n }\n\n // ============================================\n // Workspace-scoped admin methods\n // These require the user to be a workspace member with admin permissions\n // ============================================\n\n /**\n * List invitations for a specific workspace (requires workspace admin permission).\n * Uses the workspace-scoped route: /api/v2/w/{workspaceUuid}/invitations\n */\n async listWorkspaceInvitationsAdmin(\n workspaceUuid: string,\n params?: {\n accountId?: number;\n status?: InvitationStatus;\n page?: number;\n pageSize?: number;\n }\n ): Promise<InvitationListResponse> {\n const queryParams = new URLSearchParams();\n if (params?.accountId) queryParams.append('accountId', params.accountId.toString());\n if (params?.status) queryParams.append('status', params.status);\n if (params?.page) queryParams.append('page', params.page.toString());\n if (params?.pageSize) queryParams.append('page_size', params.pageSize.toString());\n\n const queryString = queryParams.toString();\n const url = `w/${workspaceUuid}/invitations${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<InvitationListResponse>(url);\n }\n\n /**\n * Invite someone to a workspace (requires workspace admin permission).\n * Uses the workspace-scoped route: POST /api/v2/w/{workspaceUuid}/invitations\n */\n async inviteToWorkspace(\n workspaceUuid: string,\n emailOrAccountId: number | string,\n message?: string,\n memberRoleId?: number,\n name?: string\n ): Promise<Invitation> {\n const body: Record<string, unknown> = {\n message,\n memberRoleId,\n name,\n };\n\n // Check if it's an email (string) or accountId (number)\n if (typeof emailOrAccountId === 'string') {\n body.email = emailOrAccountId;\n } else {\n body.accountId = emailOrAccountId;\n }\n\n return this.fetch<Invitation>(`w/${workspaceUuid}/invitations`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n /**\n * Update an invitation status (requires workspace admin permission).\n * Uses the workspace-scoped route: PUT /api/v2/w/{workspaceUuid}/invitations/{id}\n */\n async updateWorkspaceInvitationAdmin(\n workspaceUuid: string,\n invitationId: number,\n data: UpdateInvitationFormData\n ): Promise<Invitation> {\n return this.fetch<Invitation>(`w/${workspaceUuid}/invitations/${invitationId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete an invitation (requires workspace admin permission).\n * Uses the workspace-scoped route: DELETE /api/v2/w/{workspaceUuid}/invitations/{id}\n */\n async deleteWorkspaceInvitationAdmin(\n workspaceUuid: string,\n invitationId: number\n ): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`w/${workspaceUuid}/invitations/${invitationId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Approve an invitation (grant access) - requires workspace admin permission.\n */\n async approveWorkspaceInvitation(\n workspaceUuid: string,\n invitationId: number\n ): Promise<Invitation> {\n return this.updateWorkspaceInvitationAdmin(workspaceUuid, invitationId, {\n status: InvitationStatus.GRANTED,\n });\n }\n\n /**\n * Deny an invitation - requires workspace admin permission.\n */\n async denyWorkspaceInvitation(workspaceUuid: string, invitationId: number): Promise<Invitation> {\n return this.updateWorkspaceInvitationAdmin(workspaceUuid, invitationId, {\n status: InvitationStatus.DENIED,\n });\n }\n\n /**\n * Block an invitation - requires workspace admin permission.\n */\n async blockWorkspaceInvitation(\n workspaceUuid: string,\n invitationId: number\n ): Promise<Invitation> {\n return this.updateWorkspaceInvitationAdmin(workspaceUuid, invitationId, {\n status: InvitationStatus.BLOCKED,\n });\n }\n\n /**\n * Accept an invitation by ID (for invitees accepting their own invitations)\n * Works for both organization and workspace invitations.\n */\n async acceptInvitation(requestId: number): Promise<Invitation> {\n return this.fetch<Invitation>(`invitations/${requestId}/accept`, {\n method: 'POST',\n });\n }\n\n /**\n * Decline an invitation by ID (for invitees declining their own invitations)\n * Works for both organization and workspace invitations.\n */\n async declineInvitation(requestId: number): Promise<Invitation> {\n return this.fetch<Invitation>(`invitations/${requestId}/decline`, {\n method: 'POST',\n });\n }\n}\n","import {\n UsageDashboardResponse,\n ClientWorkspace,\n FirstRunState,\n NoticesResponse,\n Notification,\n PaginatedResponse,\n Product,\n PublicWorkspace,\n ThemesListResponse,\n Workspace,\n WorkspaceCounts,\n WorkspaceDefaults,\n WorkspaceDefaultsFormData,\n WorkspaceFeatureInfo,\n WorkspaceFormData,\n} from '../types';\nimport {\n WorkspaceAutoMapEntities,\n WorkspaceCreateNewEntities,\n WorkspaceExportData,\n WorkspaceImportBinding,\n WorkspaceImportIntent,\n WorkspaceImportMapping,\n WorkspaceImportPreviewResponse,\n} from '../types_workspace_transfer';\nimport type {\n ImportReadinessResponse,\n ImportSkippedRuleResponseStatus,\n ImportSkippedRulesResponse,\n RebuildImportSkippedRulesRequest,\n RebuildImportSkippedRulesResponse,\n} from '../types/generated/import_skipped_rule';\nimport type { WorkspaceImportResponse } from '../types/generated/workspace_transfer';\nimport type { WorkspaceAvailableDomainsResponse } from '../types/organization-types';\nimport type {\n PromoCodeResult,\n PromoPlanTrialRequest,\n PromoPlanTrialResponse,\n} from '../types/generated/promo_code';\nimport type {\n WidgetDomainListResponse,\n WidgetDomainResponse,\n WidgetDomainUpsertRequest,\n} from '../types/widget-domain-types';\nimport { BaseApiClient } from './base';\n\n/**\n * The three request-only fields a template re-apply adds.\n *\n * `bindings` values travel in the request body and nowhere else: they are\n * never read back off a response, and callers must not log them — a binding is\n * a webhook endpoint, a signing secret or a workspace-local identifier chosen\n * for ONE target.\n */\nexport interface WorkspaceImportPlanOptions {\n intent?: WorkspaceImportIntent;\n /** The digest a preview returned. An apply of `template_reapply` needs it. */\n expectedPlanFingerprint?: string;\n bindings?: WorkspaceImportBinding[];\n}\n\n/** Serialize plan options, omitting every key the caller did not set.\n *\n * Presence is the signal on the wire: the server reads an omitted `intent` as\n * the interactive default, and an omitted `bindings` must not become an empty\n * list that changes the source fingerprint.\n */\nfunction planFields(options?: WorkspaceImportPlanOptions): Record<string, unknown> {\n if (!options) return {};\n const fields: Record<string, unknown> = {};\n if (options.intent !== undefined) fields.intent = options.intent;\n if (options.expectedPlanFingerprint !== undefined) {\n fields.expectedPlanFingerprint = options.expectedPlanFingerprint;\n }\n if (options.bindings !== undefined && options.bindings.length > 0) {\n fields.bindings = options.bindings;\n }\n return fields;\n}\n\n/**\n * Workspace-grantable scope metadata.\n * These are scopes that can be assigned to member roles.\n */\nexport interface WorkspaceScope {\n name: string;\n category: string;\n description: string;\n implies: string[];\n dangerous: boolean;\n}\n\n/**\n * Response containing all workspace-grantable scopes.\n */\nexport interface WorkspaceScopesResponse {\n items: WorkspaceScope[];\n categories: string[];\n}\n\n/**\n * Minimal workspace row for device pickers (``GET /api/v2/w/?can_use_device=1``).\n * Identity plus the org step-up pair — a companion device (Lantern) chooses a\n * workspace from this and discovers everything else from inside it.\n */\nexport interface CompactWorkspace {\n id: number;\n uuid: string;\n slug: string;\n name: string;\n requiresOrgAuth: boolean;\n authUrl: string | null;\n}\n\nexport class WorkspacesApi extends BaseApiClient {\n /** List all workspaces accessible to the current user. */\n async getWorkspaces(): Promise<Workspace[]> {\n return this.fetch<Workspace[]>('w/');\n }\n\n /**\n * Compact rows for the workspaces a companion device could enter — the\n * Lantern picker. Filtered by the same admission policy a device\n * credential is gated by, without needing the device credential.\n */\n async getDeviceAdmissibleWorkspaces(): Promise<CompactWorkspace[]> {\n return this.fetch<CompactWorkspace[]>('w/?can_use_device=1');\n }\n\n /** List all publicly visible workspaces. */\n async getPublicWorkspaces(): Promise<PublicWorkspace[]> {\n return this.fetch<PublicWorkspace[]>('w/public');\n }\n\n /** Get a single workspace by ID. */\n async getWorkspace(wid: string): Promise<Workspace> {\n return this.fetch<Workspace>(`w/${wid}`);\n }\n\n /** Create a new workspace. */\n async createWorkspace(workspace: WorkspaceFormData): Promise<Workspace> {\n return this.fetch<Workspace>('w/', {\n method: 'POST',\n body: JSON.stringify(workspace),\n });\n }\n\n /** Update an existing workspace. */\n async updateWorkspace(wid: string, workspace: Partial<WorkspaceFormData>): Promise<Workspace> {\n return this.fetch<Workspace>(`w/${wid}`, {\n method: 'PUT',\n body: JSON.stringify(workspace),\n });\n }\n\n /** Delete a workspace. */\n async deleteWorkspace(wid: string): Promise<void> {\n return this.fetch(`w/${wid}`, {\n method: 'DELETE',\n });\n }\n\n /** Leave a workspace as the current user. */\n async leaveWorkspace(wid: string): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`w/${wid}/me`, {\n method: 'DELETE',\n });\n }\n\n /** Get the default settings for a workspace. */\n async getWorkspaceDefaults(wid: string): Promise<WorkspaceDefaults> {\n return this.fetch<WorkspaceDefaults>(`w/${wid}/defaults`);\n }\n\n /** Update the default settings for a workspace. */\n async updateWorkspaceDefaults(\n wid: string,\n defaults: WorkspaceDefaultsFormData\n ): Promise<WorkspaceDefaults> {\n return this.fetch<WorkspaceDefaults>(`w/${wid}/defaults`, {\n method: 'PUT',\n body: JSON.stringify(defaults),\n });\n }\n\n /** Get the full first-run onboarding state for a workspace. */\n async getFirstRunState(wid: string): Promise<FirstRunState> {\n return this.fetch<FirstRunState>(`w/${wid}/first-run-state`);\n }\n\n /** Update the first-run onboarding state for a workspace. */\n async updateFirstRunState(wid: string, state: FirstRunState): Promise<FirstRunState> {\n return this.fetch<FirstRunState>(`w/${wid}/first-run-state`, {\n method: 'PUT',\n body: JSON.stringify(state),\n });\n }\n\n /** Get entity counts (members, tasks, workflows, etc.) for a workspace. */\n async getWorkspaceCounts(wid: string): Promise<WorkspaceCounts> {\n return this.fetch<WorkspaceCounts>(`w/${wid}/counts`);\n }\n\n /** Check whether the workspace is currently within business hours. */\n async getBusinessHoursStatus(wid: string): Promise<{ isBusinessHours: boolean }> {\n return this.fetch<{ isBusinessHours: boolean }>(`w/${wid}/business-hours-status`);\n }\n\n /** List all available workspace feature flags from the registry. */\n async getAvailableWorkspaceFeatures(): Promise<WorkspaceFeatureInfo[]> {\n const result = await this.fetch<{ features: WorkspaceFeatureInfo[] }>(`features/registry`);\n return result.features;\n }\n\n /** Get active notices for a workspace. */\n async getWorkspaceNotices(wid: string): Promise<NoticesResponse> {\n return this.fetch<NoticesResponse>(`w/${wid}/notices`);\n }\n\n /** List notifications for the current user in a workspace. */\n async getNotifications(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n } = {}\n ): Promise<PaginatedResponse<Notification>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n const queryString = params.toString();\n const url = `w/${wid}/notifications${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<PaginatedResponse<Notification>>(url);\n }\n\n /** Get a single notification by ID. */\n async getNotification(wid: string, id: number): Promise<Notification> {\n return this.fetch<Notification>(`w/${wid}/notifications/${id}`);\n }\n\n /** Get the count of unread notifications for the current user. */\n async getUnreadNotificationCount(wid: string): Promise<number> {\n return this.fetch<number>(`w/${wid}/notifications/unread-count`);\n }\n\n /** Mark a notification as read. */\n async markNotificationAsRead(wid: string, id: number): Promise<Notification> {\n return this.fetch<Notification>(`w/${wid}/notifications/${id}/read`, {\n method: 'POST',\n });\n }\n\n /** Dismiss a single notification. */\n async dismissNotification(wid: string, id: number): Promise<Notification> {\n return this.fetch<Notification>(`w/${wid}/notifications/${id}/dismiss`, {\n method: 'POST',\n });\n }\n\n /** Dismiss all notifications for the current user in a workspace. */\n async dismissAllNotifications(wid: string): Promise<{ dismissedCount: number }> {\n return this.fetch<{ dismissedCount: number }>(`w/${wid}/notifications/dismiss-all`, {\n method: 'POST',\n });\n }\n\n // ===== Push Notifications =====\n\n /** Get the VAPID public key for Web Push subscription registration. */\n async getVapidPublicKey(): Promise<string | null> {\n const response = await this.fetch<{ publicKey: string | null }>('push/vapid-public-key');\n return response.publicKey;\n }\n\n /** Register a Web Push subscription for the current user. */\n async registerPushSubscription(\n wid: string,\n subscription: { endpoint: string; p256dhKey: string; authKey: string; userAgent?: string }\n ): Promise<{ id: number; endpoint: string; createdAt: string }> {\n return this.fetch<{ id: number; endpoint: string; createdAt: string }>(\n `w/${wid}/push-subscriptions`,\n {\n method: 'POST',\n body: JSON.stringify(subscription),\n }\n );\n }\n\n /** Unregister a Web Push subscription by endpoint URL. */\n async unregisterPushSubscription(wid: string, endpoint: string): Promise<{ deleted: boolean }> {\n return this.fetch<{ deleted: boolean }>(\n `w/${wid}/push-subscriptions?endpoint=${encodeURIComponent(endpoint)}`,\n {\n method: 'DELETE',\n }\n );\n }\n\n /** List all active Web Push subscriptions for the current user. */\n async listPushSubscriptions(\n wid: string\n ): Promise<{ id: number; endpoint: string; createdAt: string; userAgent: string | null }[]> {\n return this.fetch<\n { id: number; endpoint: string; createdAt: string; userAgent: string | null }[]\n >(`w/${wid}/push-subscriptions`);\n }\n\n /** List org domains available for workspace email inbox routing. */\n async getWorkspaceEmailDomains(wid: string): Promise<WorkspaceAvailableDomainsResponse> {\n return this.fetch<WorkspaceAvailableDomainsResponse>(`w/${wid}/domains/for-email`);\n }\n\n /** List org domains available for workspace custom site routing. */\n async getWorkspaceSiteDomains(wid: string): Promise<WorkspaceAvailableDomainsResponse> {\n return this.fetch<WorkspaceAvailableDomainsResponse>(`w/${wid}/domains/for-site`);\n }\n\n /**\n * List org domains available for enabling embeddable widgets. Widgets ride\n * on domain-ownership verification only, so the consumer gates selection on\n * `ownershipStatus === 'verified'`.\n */\n async getWorkspaceWidgetDomains(wid: string): Promise<WorkspaceAvailableDomainsResponse> {\n return this.fetch<WorkspaceAvailableDomainsResponse>(`w/${wid}/domains/for-widget`);\n }\n\n /** List this workspace's widget-domain enablement entries. */\n async listWidgetDomains(wid: string): Promise<WidgetDomainListResponse> {\n return this.fetch<WidgetDomainListResponse>(`w/${wid}/widget-domains`);\n }\n\n /**\n * Enable/replace the set of widgets on one verified org domain. Idempotent\n * upsert keyed by `orgDomainUuid`; the server rejects unverified domains\n * (400) and cross-org domains (404).\n */\n async upsertWidgetDomain(\n wid: string,\n orgDomainUuid: string,\n body: WidgetDomainUpsertRequest\n ): Promise<WidgetDomainResponse> {\n return this.fetch<WidgetDomainResponse>(`w/${wid}/widget-domains/${orgDomainUuid}`, {\n method: 'PUT',\n body: JSON.stringify(body),\n });\n }\n\n /** Remove this workspace's widget entry for a domain (disables all widgets). */\n async deleteWidgetDomain(wid: string, orgDomainUuid: string): Promise<void> {\n await this.fetch<void>(`w/${wid}/widget-domains/${orgDomainUuid}`, {\n method: 'DELETE',\n });\n }\n\n /** List client workspaces managed by this reseller workspace, paginated. */\n async getResellerWorkspaces(\n wid: string,\n params?: { page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<ClientWorkspace>> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<ClientWorkspace>>(`w/${wid}/reseller/workspaces${qs}`);\n }\n\n /** Create a new client workspace under a reseller workspace. */\n async createClientWorkspace(\n wid: string,\n data: { name: string; slug?: string }\n ): Promise<ClientWorkspace> {\n return this.fetch<ClientWorkspace>(`w/${wid}/reseller/workspaces`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Get a single client workspace by ID. */\n async getClientWorkspace(wid: string, workspaceId: number): Promise<ClientWorkspace> {\n return this.fetch<ClientWorkspace>(`w/${wid}/reseller/workspaces/${workspaceId}`);\n }\n\n /** Update a client workspace's name or slug. */\n async updateClientWorkspace(\n wid: string,\n workspaceId: number,\n data: { name?: string; slug?: string }\n ): Promise<ClientWorkspace> {\n return this.fetch<ClientWorkspace>(`w/${wid}/reseller/workspaces/${workspaceId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Delete a client workspace. */\n async deleteClientWorkspace(wid: string, workspaceId: number): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`w/${wid}/reseller/workspaces/${workspaceId}`, {\n method: 'DELETE',\n });\n }\n\n /** Provision a client workspace, setting up its database and resources. */\n async provisionClientWorkspace(\n wid: string,\n workspaceId: number\n ): Promise<{ message: string; status: string }> {\n return this.fetch<{ message: string; status: string }>(\n `w/${wid}/reseller/workspaces/${workspaceId}/provision`,\n {\n method: 'POST',\n }\n );\n }\n\n /** List products available from a reseller workspace, optionally filtering by featured status. */\n async getProducts(wid: string, featured?: boolean): Promise<Product[]> {\n const params = featured !== undefined ? `?featured=${featured}` : '';\n return this.fetch<Product[]>(`w/${wid}/reseller/products${params}`);\n }\n\n /** Get a product by ID using the global endpoint. */\n async getProduct(id: number): Promise<Product> {\n // Use global endpoint - access control is handled server-side based on\n // public flag, superuser status, or subscription membership\n return this.fetch<Product>(`products/${id}`);\n }\n\n /** Get a product from a reseller workspace. Requires workspace admin scope. */\n async getWorkspaceProduct(wid: string, id: number): Promise<Product> {\n return this.fetch<Product>(`w/${wid}/reseller/products/${id}`);\n }\n\n /** List public products for a workspace's storefront. No auth required. */\n async getPublicProducts(workspaceUuid: string, featured?: boolean): Promise<Product[]> {\n const params = new URLSearchParams({ workspace_uuid: workspaceUuid });\n if (featured !== undefined) params.set('featured', String(featured));\n return this.fetch<Product[]>(`products?${params.toString()}`);\n }\n\n /**\n * Check whether a promo code is usable, without redeeming it.\n *\n * Reserves nothing, so it is safe to call as a form field settles. Redemption\n * happens server-side after checkout completes, when the organization and its\n * subscription exist.\n */\n async previewPromoCode(\n code: string,\n options?: { signal?: AbortSignal }\n ): Promise<PromoCodeResult> {\n return this.fetch<PromoCodeResult>('promo-codes/preview', {\n method: 'POST',\n body: JSON.stringify({ code }),\n signal: options?.signal,\n });\n }\n\n /** Provision the one-month direct organization plan carried by a promo code. */\n async startPromoPlanTrial(request: PromoPlanTrialRequest): Promise<PromoPlanTrialResponse> {\n return this.fetch<PromoPlanTrialResponse>('promo-codes/plan-trial', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** Get a publicly accessible product by ID. */\n async getPublicProduct(id: number): Promise<Product> {\n return this.fetch<Product>(`products/${id}`);\n }\n\n /** Create a new product for a reseller workspace. */\n async createProduct(wid: string, product: any): Promise<Product> {\n return this.fetch<Product>(`w/${wid}/reseller/products`, {\n method: 'POST',\n body: JSON.stringify(product),\n });\n }\n\n /** Update an existing product. */\n async updateProduct(wid: string, id: number, updates: any): Promise<Product> {\n return this.fetch<Product>(`w/${wid}/reseller/products/${id}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n });\n }\n\n /** Delete a product from a reseller workspace. */\n async deleteProduct(wid: string, id: number): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`w/${wid}/reseller/products/${id}`, {\n method: 'DELETE',\n });\n }\n\n // Workspace Export/Import API\n\n /** Export workspace configuration, optionally scoped to a single workflow or workflows-only.\n * @param workflowId - Export a single workflow by ID\n * @param scope - Export scope (\"workflows\" for all workflows only). Cannot be combined with workflowId.\n * @param exclude - Comma-separated entity categories to exclude (e.g. \"channels\")\n */\n async exportWorkspace(\n wid: string,\n workflowId?: number,\n scope?: 'workflows',\n exclude?: string\n ): Promise<WorkspaceExportData> {\n const searchParams = new URLSearchParams();\n if (workflowId !== undefined) searchParams.set('workflow_id', String(workflowId));\n if (scope !== undefined) searchParams.set('scope', scope);\n if (exclude !== undefined) searchParams.set('exclude', exclude);\n const qs = searchParams.toString();\n return this.fetch<WorkspaceExportData>(`w/${wid}/export${qs ? `?${qs}` : ''}`);\n }\n\n /** Preview the result of importing workspace configuration without applying changes.\n *\n * Pass `options.intent = 'template_reapply'` to get the deterministic\n * re-apply plan: `planRows`, `sourceFingerprint` and `planFingerprint` come\n * back beside the legacy preview items, and the fingerprint is what\n * `importWorkspace` must be given to apply exactly that projection.\n */\n async previewWorkspaceImport(\n wid: string,\n exportData: WorkspaceExportData,\n importMappings: WorkspaceImportMapping,\n createNew: WorkspaceCreateNewEntities,\n autoMap?: WorkspaceAutoMapEntities,\n options?: WorkspaceImportPlanOptions\n ): Promise<WorkspaceImportPreviewResponse> {\n return this.fetch<WorkspaceImportPreviewResponse>(`w/${wid}/preview-import`, {\n method: 'POST',\n body: JSON.stringify({\n exportData,\n importMappings,\n createNew,\n autoMap,\n ...planFields(options),\n }),\n });\n }\n\n /**\n * Plan a workspace export ZIP against this workspace without importing it.\n *\n * The sibling of `previewWorkspaceImport`, and it exists for one reason: a\n * JSON preview has no archive, so it cannot decide whether File BYTES would\n * be replaced — that decision compares the archive's blob digest against the\n * destination's current content digest.\n */\n async previewWorkspaceImportZip(\n wid: string,\n archive: Blob,\n options?: WorkspaceImportPlanOptions & {\n exportData?: WorkspaceExportData;\n importMappings?: WorkspaceImportMapping;\n createNew?: WorkspaceCreateNewEntities;\n autoMap?: WorkspaceAutoMapEntities;\n }\n ): Promise<WorkspaceImportPreviewResponse> {\n const { exportData, importMappings, createNew, autoMap, ...planOptions } = options ?? {};\n const payload: Record<string, unknown> = {\n importMappings: importMappings ?? {},\n createNew: createNew ?? {},\n ...planFields(planOptions),\n };\n // `exportData` defaults to `export.json` inside the ZIP, so it is sent\n // only when the caller means to override it.\n if (exportData) payload.exportData = exportData;\n if (autoMap) payload.autoMap = autoMap;\n const form = new FormData();\n form.append(\n 'request',\n new Blob([JSON.stringify(payload)], { type: 'application/json' }),\n 'import.json'\n );\n form.append('archive', archive, 'workspace-export.zip');\n return this.fetch<WorkspaceImportPreviewResponse>(`w/${wid}/preview-import.zip`, {\n method: 'POST',\n body: form,\n });\n }\n\n /**\n * Everything a template re-apply adds to an import or a preview.\n *\n * `bindings` values are sent in the request body only. They are never\n * projected from a response and must never be logged: the point of a\n * binding is that a webhook endpoint and a signing secret belong to ONE\n * target workspace.\n */\n\n /** Download a workspace export ZIP (``export.json`` + file blobs). */\n async exportWorkspaceZip(\n wid: string,\n workflowId?: number,\n scope?: 'workflows',\n exclude?: string\n ): Promise<ArrayBuffer> {\n const searchParams = new URLSearchParams();\n if (workflowId !== undefined) searchParams.set('workflow_id', String(workflowId));\n if (scope !== undefined) searchParams.set('scope', scope);\n if (exclude !== undefined) searchParams.set('exclude', exclude);\n const qs = searchParams.toString();\n const response = await this.fetchRaw(`w/${wid}/export.zip${qs ? `?${qs}` : ''}`);\n return response.arrayBuffer();\n }\n\n /** Import workspace configuration from exported JSON, or from a ZIP archive.\n * Pass ``archive`` (the ZIP from ``exportWorkspaceZip``) to restore file\n * contents. ``exportData`` may be omitted when the ZIP contains it.\n *\n * ``activateWebhookRules`` is safety-default false: imported\n * ``webhook:send`` EventRules are force-disabled unless the operator\n * opts in. An exported-inactive rule stays inactive either way.\n *\n * With ``options.intent = 'template_reapply'`` this is the GUARDED apply.\n * It requires ``options.expectedPlanFingerprint`` — the digest a preview\n * returned — and answers 200 ``success``, 200 ``noop`` (the target already\n * matched the template, so nothing at all was recorded), 409\n * ``stale_import_plan`` or 409 ``import_plan_refused``. Both 409s commit\n * nothing and carry the complete values-free ``planRows``.\n */\n async importWorkspace(\n wid: string,\n exportData: WorkspaceExportData | undefined,\n importMappings: WorkspaceImportMapping,\n createNew: WorkspaceCreateNewEntities,\n archive?: Blob,\n activateWebhookRules?: boolean,\n autoMap?: WorkspaceAutoMapEntities,\n options?: WorkspaceImportPlanOptions\n ): Promise<WorkspaceImportResponse> {\n if (archive) {\n // One multipart builder for `import.zip`, so the two entry points\n // cannot drift on what the `request` part carries.\n return this.importWorkspaceZip(wid, archive, {\n ...options,\n exportData,\n importMappings,\n createNew,\n autoMap,\n activateWebhookRules,\n });\n }\n if (!exportData) {\n throw new Error('exportData is required for JSON import');\n }\n const payload: {\n exportData?: WorkspaceExportData;\n importMappings: WorkspaceImportMapping;\n createNew: WorkspaceCreateNewEntities;\n activateWebhookRules?: boolean;\n autoMap?: WorkspaceAutoMapEntities;\n intent?: WorkspaceImportIntent;\n expectedPlanFingerprint?: string;\n bindings?: WorkspaceImportBinding[];\n } = {\n exportData,\n importMappings,\n createNew,\n ...planFields(options),\n };\n if (activateWebhookRules) {\n payload.activateWebhookRules = activateWebhookRules;\n }\n // Presence, not emptiness, is the signal. The server distinguishes an\n // OMITTED autoMap (the interactive wizard, which may merge by display\n // name) from an explicitly EMPTY one (\"match nothing by name\") through\n // `model_fields_set`, so a caller that means the latter must send the\n // key. See `lib/workspace_transfer/importing/files.py::_name_match_allowed`.\n if (autoMap) {\n payload.autoMap = autoMap;\n }\n return this.fetch<WorkspaceImportResponse>(`w/${wid}/import`, {\n method: 'POST',\n body: JSON.stringify(payload),\n });\n }\n\n /**\n * Apply a workspace export ZIP to this workspace.\n *\n * The apply sibling of `previewWorkspaceImportZip`, and the same multipart\n * shape: the archive travels as `archive`, everything else as one JSON\n * `request` part. `exportData` defaults to `export.json` inside the ZIP, so\n * it is sent only to override it.\n *\n * With `options.intent = 'template_reapply'` this is the GUARDED apply. It\n * requires `options.expectedPlanFingerprint` — the digest a preview\n * returned — and answers 200 `success`, 200 `noop` (the target already\n * matched the template, so nothing at all was recorded), 409\n * `stale_import_plan` or 409 `import_plan_refused`. Both 409s commit\n * nothing and carry the complete values-free `planRows`.\n *\n * `options.bindings` values are sent in the request body only. They are\n * never projected from a response and must never be logged: the point of a\n * binding is that a webhook endpoint and a signing secret belong to ONE\n * target workspace.\n */\n async importWorkspaceZip(\n wid: string,\n archive: Blob,\n options?: WorkspaceImportPlanOptions & {\n exportData?: WorkspaceExportData;\n importMappings?: WorkspaceImportMapping;\n createNew?: WorkspaceCreateNewEntities;\n autoMap?: WorkspaceAutoMapEntities;\n /** Safety-default false: imported `webhook:send` rules stay disabled. */\n activateWebhookRules?: boolean;\n }\n ): Promise<WorkspaceImportResponse> {\n const {\n exportData,\n importMappings,\n createNew,\n autoMap,\n activateWebhookRules,\n ...planOptions\n } = options ?? {};\n const payload: Record<string, unknown> = {\n importMappings: importMappings ?? {},\n createNew: createNew ?? {},\n ...planFields(planOptions),\n };\n if (exportData) payload.exportData = exportData;\n if (activateWebhookRules) payload.activateWebhookRules = activateWebhookRules;\n // Presence, not emptiness, is the signal — see `importWorkspace`.\n if (autoMap) payload.autoMap = autoMap;\n const form = new FormData();\n form.append(\n 'request',\n new Blob([JSON.stringify(payload)], { type: 'application/json' }),\n 'import.json'\n );\n form.append('archive', archive, 'workspace-export.zip');\n return this.fetch<WorkspaceImportResponse>(`w/${wid}/import.zip`, {\n method: 'POST',\n body: form,\n });\n }\n\n /**\n * Reconnectable EventRules skipped by the latest workspace import, grouped\n * by the missing phone / inbox / member. Templates and action params are\n * not returned.\n */\n async getImportSkippedRules(\n wid: string,\n status?: ImportSkippedRuleResponseStatus\n ): Promise<ImportSkippedRulesResponse> {\n const params = new URLSearchParams();\n if (status !== undefined) {\n params.set('status', status);\n }\n const qs = params.toString();\n return this.fetch<ImportSkippedRulesResponse>(\n `w/${wid}/import/skipped-rules${qs ? `?${qs}` : ''}`\n );\n }\n\n /** Current bounded phone, inbox, and phone-chat binding gaps after an import. */\n async getImportReadiness(wid: string): Promise<ImportReadinessResponse> {\n return this.fetch<ImportReadinessResponse>(`w/${wid}/import/readiness`);\n }\n\n /**\n * Re-point every outstanding skipped EventRule that needed the same source\n * resource onto a re-provisioned one, recreating each rule from its\n * preserved definition. Repeat calls no-op on already-reconnected rows.\n */\n async rebuildImportSkippedRules(\n wid: string,\n body: RebuildImportSkippedRulesRequest\n ): Promise<RebuildImportSkippedRulesResponse> {\n return this.fetch<RebuildImportSkippedRulesResponse>(\n `w/${wid}/import/skipped-rules/rebuild`,\n { method: 'POST', body: JSON.stringify(body) }\n );\n }\n\n /** Preview a workspace import using the legacy untyped interface. */\n // Legacy method for backward compatibility\n async previewImportWorkspace(\n wid: string,\n exportData: any,\n importMappings: any = {},\n createNew: any = {},\n autoMap?: WorkspaceAutoMapEntities\n ): Promise<any> {\n const payload: Record<string, unknown> = { exportData, importMappings, createNew };\n // Presence is the signal — see `importWorkspace`. Preview must send\n // exactly what the apply would, or it previews a different import.\n if (autoMap) {\n payload.autoMap = autoMap;\n }\n return this.fetch<any>(`w/${wid}/preview-import`, {\n method: 'POST',\n body: JSON.stringify(payload),\n });\n }\n\n /**\n * List available themes for a workspace.\n *\n * Read-only: `…/themes` serves GET and nothing else. `Workspace.themes` is\n * an entitlement allowlist — which non-global themes this workspace may\n * select. There was never a `PUT …/themes` route; the\n * `updateWorkspaceThemes` method that targeted one always 405'd (GRA-8892).\n */\n async getWorkspaceThemes(wid: string): Promise<ThemesListResponse> {\n return this.fetch<ThemesListResponse>(`w/${wid}/themes`);\n }\n\n /**\n * Get all workspace-grantable scopes that can be assigned to member roles.\n *\n * Returns the full metadata for all scopes including name, category,\n * description, implied scopes, and whether it's a dangerous scope.\n *\n * Note: This does NOT include organization-level scopes (org:read, org:write, org:admin).\n * Org-level permissions come from OrgMember roles, not workspace member roles.\n */\n async getWorkspaceScopes(): Promise<WorkspaceScopesResponse> {\n return this.fetch<WorkspaceScopesResponse>('w/scopes');\n }\n\n /**\n * Get billing dashboard data for a workspace.\n *\n * This endpoint is available to organization owners (with org:info scope).\n *\n * Returns comprehensive billing information including:\n * - Subscription status and plan details\n * - Current period usage metrics\n * - Overage configurations and amounts\n * - Budget tracking status\n */\n async getUsageDashboard(wid: string): Promise<UsageDashboardResponse> {\n return this.fetch<UsageDashboardResponse>(`w/${wid}/usage/dashboard`);\n }\n}\n","import {\n ChannelStatsResponse,\n ConfigHealthCollection,\n ConfigHealthQueryParams,\n CreateDashboardRequest,\n DashboardResponse,\n UpdateDashboardRequest,\n WorkflowAssignmentStatsResponse,\n} from '../types';\nimport { BaseApiClient } from './base';\n\nexport class DashboardsApi extends BaseApiClient {\n /** List all dashboards for the workspace, in tab order. */\n async getDashboards(wid: string): Promise<DashboardResponse[]> {\n return this.fetch<DashboardResponse[]>(`w/${wid}/dashboards`);\n }\n\n /** Get a dashboard by ID. */\n async getDashboard(wid: string, id: number): Promise<DashboardResponse> {\n return this.fetch<DashboardResponse>(`w/${wid}/dashboards/${id}`);\n }\n\n /** Create a named dashboard, optionally with an initial widget list. */\n async createDashboard(wid: string, body: CreateDashboardRequest): Promise<DashboardResponse> {\n return this.fetch<DashboardResponse>(`w/${wid}/dashboards`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n /** Update a dashboard's name, position, or widget list (full replace). */\n async updateDashboard(\n wid: string,\n id: number,\n body: UpdateDashboardRequest\n ): Promise<DashboardResponse> {\n return this.fetch<DashboardResponse>(`w/${wid}/dashboards/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n });\n }\n\n /** Delete a dashboard. */\n async deleteDashboard(wid: string, id: number): Promise<void> {\n await this.fetch<void>(`w/${wid}/dashboards/${id}`, { method: 'DELETE' });\n }\n\n /** Per-channel chat volume in the window + live needs-response backlog. */\n async getDashboardChannelStats(\n wid: string,\n options?: { hours?: number }\n ): Promise<ChannelStatsResponse> {\n const params = new URLSearchParams();\n if (options?.hours !== undefined) params.append('hours', options.hours.toString());\n const query = params.toString();\n return this.fetch<ChannelStatsResponse>(\n `w/${wid}/dashboards/stats/channels${query ? `?${query}` : ''}`\n );\n }\n\n /**\n * Assignment status rollup per root workflow.\n *\n * `hours` windows the rollup to runs STARTED within the last N hours.\n * Omit it (or pass null) for the all-time rollup.\n */\n async getDashboardWorkflowAssignmentStats(\n wid: string,\n options?: { hours?: number | null }\n ): Promise<WorkflowAssignmentStatsResponse> {\n const params = new URLSearchParams();\n if (options?.hours != null) params.append('hours', options.hours.toString());\n const query = params.toString();\n return this.fetch<WorkflowAssignmentStatsResponse>(\n `w/${wid}/dashboards/stats/workflow-assignments${query ? `?${query}` : ''}`\n );\n }\n\n /**\n * Current saved-configuration health across every family (Workflow\n * configuration, Journey authoring, Workflow access, Routine → Workflow\n * access, and the workspace lint).\n *\n * Requires ALL of `workflows:read`, `journeys:read`, `automations:read`,\n * `datatypes:read`, `members:read`, and `member_roles:read` — a pruned\n * subset would render as \"all configuration is healthy\".\n *\n * `page`/`pageSize` bound the response only; every family is evaluated in\n * full before the issue list is sliced. `check`/`severity` narrow the issue\n * list server-side, before pagination — filtering a single page in the\n * client cannot find a match that lives on a later one. `summary` and\n * `checks` are always workspace-global.\n */\n async getConfigurationHealth(\n wid: string,\n options?: ConfigHealthQueryParams\n ): Promise<ConfigHealthCollection> {\n const params = new URLSearchParams();\n if (options?.page !== undefined) params.append('page', options.page.toString());\n if (options?.pageSize !== undefined) params.append('pageSize', options.pageSize.toString());\n if (options?.check !== undefined) params.append('check', options.check);\n if (options?.severity !== undefined) params.append('severity', options.severity);\n const query = params.toString();\n return this.fetch<ConfigHealthCollection>(\n `w/${wid}/configuration-health${query ? `?${query}` : ''}`\n );\n }\n}\n","import type {\n ClaimDevicePairingRequest,\n DeviceKindResponse,\n DeviceResponse,\n UpdateDeviceRequest,\n} from '../types/generated/device';\nimport { BaseApiClient } from './base';\n\nexport type { ClaimDevicePairingRequest, DeviceKindResponse, DeviceResponse, UpdateDeviceRequest };\n\nexport class DevicesApi extends BaseApiClient {\n /** List devices owned by the current Account. */\n async getDevices(): Promise<DeviceResponse[]> {\n return this.fetch<DeviceResponse[]>('account/devices');\n }\n\n /** Fetch one device owned by the current Account. Other devices return 404. */\n async getDevice(deviceUuid: string): Promise<DeviceResponse> {\n return this.fetch<DeviceResponse>(`account/devices/${deviceUuid}`);\n }\n\n /** List shippable companion-device products (Lantern, later SKUs). */\n async getDeviceKinds(): Promise<DeviceKindResponse[]> {\n return this.fetch<DeviceKindResponse[]>('account/devices/kinds');\n }\n\n /** Claim a pairing code shown on a companion device for the current Account. */\n async claimDevicePairing(body: ClaimDevicePairingRequest): Promise<DeviceResponse> {\n return this.fetch<DeviceResponse>('account/devices/pairing/claim', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n /** Update display name and/or LAN capability flags on an owned device. */\n async updateDevice(deviceUuid: string, body: UpdateDeviceRequest): Promise<DeviceResponse> {\n return this.fetch<DeviceResponse>(`account/devices/${deviceUuid}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n });\n }\n\n /** Revoke an owned device credential. The device must pair again. */\n async revokeDevice(deviceUuid: string): Promise<DeviceResponse> {\n return this.fetch<DeviceResponse>(`account/devices/${deviceUuid}/revoke`, {\n method: 'POST',\n body: JSON.stringify({}),\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport {\n TeamsApp,\n TeamsAppInstallation,\n TeamsAccount,\n CreateTeamsAppRequest,\n UpdateTeamsAppRequest,\n TeamsConversation,\n PaginatedResponse,\n TeamsAppSortField,\n SortOrder,\n} from '../types';\n\nexport class TeamsAppsApi extends BaseApiClient {\n /**\n * List all Teams apps configured for a workspace.\n */\n async getTeamsApps(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n sortBy?: TeamsAppSortField;\n sortOrder?: SortOrder;\n search?: string;\n } = {}\n ): Promise<PaginatedResponse<TeamsApp>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.search) params.append('search', options.search);\n\n return this.fetch<PaginatedResponse<TeamsApp>>(\n `w/${wid}/app-connections/teams/apps${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getTeamsApp(wid: string, appId: number): Promise<TeamsApp> {\n return this.fetch<TeamsApp>(`w/${wid}/app-connections/teams/apps/${appId}`);\n }\n\n async createTeamsApp(wid: string, data: CreateTeamsAppRequest): Promise<TeamsApp> {\n return this.fetch<TeamsApp>(`w/${wid}/app-connections/teams/apps`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateTeamsApp(\n wid: string,\n appId: number,\n data: UpdateTeamsAppRequest\n ): Promise<TeamsApp> {\n return this.fetch<TeamsApp>(`w/${wid}/app-connections/teams/apps/${appId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async deleteTeamsApp(wid: string, appId: number): Promise<void> {\n return this.fetch(`w/${wid}/app-connections/teams/apps/${appId}`, {\n method: 'DELETE',\n });\n }\n\n async getTeamsConversations(\n wid: string,\n appId: number,\n options: { page?: number; pageSize?: number } = {}\n ): Promise<PaginatedResponse<TeamsConversation>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<PaginatedResponse<TeamsConversation>>(\n `w/${wid}/app-connections/teams/apps/${appId}/conversations${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getTeamsInstallations(\n wid: string,\n appId: number,\n options: { page?: number; pageSize?: number } = {}\n ): Promise<PaginatedResponse<TeamsAppInstallation>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<PaginatedResponse<TeamsAppInstallation>>(\n `w/${wid}/app-connections/teams/apps/${appId}/installations${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getTeamsAppAccounts(\n wid: string,\n appId: number,\n options: { page?: number; pageSize?: number } = {}\n ): Promise<PaginatedResponse<TeamsAccount>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<PaginatedResponse<TeamsAccount>>(\n `w/${wid}/app-connections/teams/apps/${appId}/accounts${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n Experiment,\n ExperimentFormData,\n ExperimentGroup,\n ExperimentGroupFormData,\n ExperimentGroupUpdateData,\n ExperimentStats,\n ExperimentUpdateData,\n MemberExperimentAssignment,\n PaginatedResponse,\n} from '../types';\n\nexport class ExperimentsApi extends BaseApiClient {\n /** List experiments with group summaries and assignment counts. */\n async getExperiments(\n wid: string,\n params?: {\n page?: number;\n pageSize?: number;\n includeArchived?: boolean;\n }\n ): Promise<PaginatedResponse<Experiment>> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n if (params?.includeArchived) query.set('includeArchived', 'true');\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<Experiment>>(`w/${wid}/experiments${qs}`);\n }\n\n /** Get a single experiment by ID (includes groups). */\n async getExperiment(wid: string, experimentId: number): Promise<Experiment> {\n return this.fetch<Experiment>(`w/${wid}/experiments/${experimentId}`);\n }\n\n /** Create a draft experiment. */\n async createExperiment(wid: string, data: ExperimentFormData): Promise<Experiment> {\n return this.fetch<Experiment>(`w/${wid}/experiments`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update experiment metadata or lifecycle status. */\n async updateExperiment(\n wid: string,\n experimentId: number,\n data: ExperimentUpdateData\n ): Promise<Experiment> {\n return this.fetch<Experiment>(`w/${wid}/experiments/${experimentId}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /** Hard-delete a draft experiment, or archive otherwise. */\n async deleteExperiment(wid: string, experimentId: number): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/experiments/${experimentId}`, {\n method: 'DELETE',\n });\n }\n\n /** Create a group within an experiment. */\n async createExperimentGroup(\n wid: string,\n experimentId: number,\n data: ExperimentGroupFormData\n ): Promise<ExperimentGroup> {\n return this.fetch<ExperimentGroup>(`w/${wid}/experiments/${experimentId}/groups`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update a group within an experiment. */\n async updateExperimentGroup(\n wid: string,\n experimentId: number,\n groupId: number,\n data: ExperimentGroupUpdateData\n ): Promise<ExperimentGroup> {\n return this.fetch<ExperimentGroup>(`w/${wid}/experiments/${experimentId}/groups/${groupId}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /** Delete a group that has no member assignments. */\n async deleteExperimentGroup(\n wid: string,\n experimentId: number,\n groupId: number\n ): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(\n `w/${wid}/experiments/${experimentId}/groups/${groupId}`,\n { method: 'DELETE' }\n );\n }\n\n /** Aggregate assignment and exposure counts by group. */\n async getExperimentStats(wid: string, experimentId: number): Promise<ExperimentStats> {\n return this.fetch<ExperimentStats>(`w/${wid}/experiments/${experimentId}/stats`);\n }\n\n /** List experiment assignments for a member (member profile panel). */\n async getMemberExperiments(\n wid: string,\n memberId: number\n ): Promise<MemberExperimentAssignment[]> {\n return this.fetch<MemberExperimentAssignment[]>(`w/${wid}/members/${memberId}/experiments`);\n }\n\n /** Manually assign a member to an experiment (optional group, or weighted random). */\n async createExperimentAssignment(\n wid: string,\n experimentId: number,\n data: { memberId: number; groupId?: number | null }\n ): Promise<MemberExperimentAssignment> {\n return this.fetch<MemberExperimentAssignment>(\n `w/${wid}/experiments/${experimentId}/assignments`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /** Move an assigned member to a different experiment group. */\n async updateExperimentAssignment(\n wid: string,\n experimentId: number,\n memberId: number,\n data: { groupId: number }\n ): Promise<MemberExperimentAssignment> {\n return this.fetch<MemberExperimentAssignment>(\n `w/${wid}/experiments/${experimentId}/assignments/${memberId}`,\n {\n method: 'PATCH',\n body: JSON.stringify(data),\n }\n );\n }\n\n /** Remove a member's assignment from an experiment. */\n async deleteExperimentAssignment(\n wid: string,\n experimentId: number,\n memberId: number\n ): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(\n `w/${wid}/experiments/${experimentId}/assignments/${memberId}`,\n { method: 'DELETE' }\n );\n }\n}\n","import { BaseApiClient } from './base';\n\n/**\n * Upsert the workspace's PatientSync connection. On first configure\n * `apiBaseUrl` + `apiKey` are required; later configures apply only the fields\n * provided (so the key can be rotated or the form changed independently).\n * `apiKey` is write-only — it is never returned by any endpoint.\n */\nexport interface ConfigurePatientSyncRequest {\n apiBaseUrl?: string;\n apiKey?: string;\n requestor?: string;\n formSlug?: string;\n fallbackDid?: string;\n enabled?: boolean;\n}\n\n/** Current PatientSync connection state. Never includes the API key. */\nexport interface PatientSyncConnectionStatus {\n configured: boolean;\n enabled: boolean;\n hasApiKey: boolean;\n apiBaseUrl: string | null;\n requestor: string | null;\n formSlug: string | null;\n fallbackDid: string | null;\n}\n\nexport class PatientSyncConnectionsApi extends BaseApiClient {\n /** Create or update the workspace's PatientSync connection (singleton). */\n async configurePatientSync(\n wid: string,\n data: ConfigurePatientSyncRequest\n ): Promise<PatientSyncConnectionStatus> {\n return this.fetch<PatientSyncConnectionStatus>(\n `w/${wid}/app-connections/patientsync/configure`,\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n\n /** Read the PatientSync connection status (never returns the API key). */\n async getPatientSyncStatus(wid: string): Promise<PatientSyncConnectionStatus> {\n return this.fetch<PatientSyncConnectionStatus>(`w/${wid}/app-connections/patientsync/status`);\n }\n\n /** Delete the workspace's PatientSync connection. */\n async deletePatientSyncConnection(wid: string): Promise<void> {\n return this.fetch(`w/${wid}/app-connections/patientsync/`, { method: 'DELETE' });\n }\n}\n","import type {\n ActivityAggregateResponse,\n ActivityCapabilitiesResponse,\n ActivityDigestRequest,\n ActivityDigestResponse,\n ActivityCountsRequest,\n ActivityCountsResponse,\n ActivityEventsResponse,\n ActivityFeedQueryRequest,\n ActivityOneViewRequest,\n ActivityOneViewResponse,\n ActivityLatestSubjectsRequest,\n ActivityLatestSubjectsResponse,\n ActivityOpenItemsRequest,\n ActivityOpenItemsResponse,\n} from '../types/generated/activity_feed';\nimport type {\n ResolveEntityRefsRequest,\n ResolveEntityRefsResponse,\n ResolveGroupedEntityRefsRequest,\n ResolveGroupedEntityRefsResponse,\n} from '../types/generated/entity_ref';\nimport { BaseApiClient } from './base';\n\nexport type {\n ActivityAggregateLine,\n ActivityAggregateResponse,\n ActivityCapabilitiesResponse,\n ActivityCountsRequest,\n ActivityCountsResponse,\n ActivityDigestActor,\n ActivityDigestExample,\n ActivityDigestKey,\n ActivityDigestSlot,\n ActivityDigestRequest,\n ActivityDigestResponse,\n ActivityLineDigest,\n ActivityTypeDigest,\n ActivityEventLine,\n ActivityEventsResponse,\n ActivityFeedQueryRequest,\n ActivityLatestSubjectLine,\n ActivityLatestSubjectsRequest,\n ActivityLatestSubjectsResponse,\n ActivityGroupKey,\n ActivityOccurrenceLine,\n ActivityOneViewRequest,\n ActivityOneViewResponse,\n ActivityOpenItemLine,\n ActivityOpenItemsRequest,\n ActivityOpenItemsResponse,\n ActivityOpenStateResponse,\n ActivityQueryScope,\n ActivityRefResponse,\n ActivityResponseEnvelope,\n ActivitySubjectFilter,\n ActivityTypeCount,\n ActivityWindow,\n} from '../types/generated/activity_feed';\n\nexport type {\n AgentRefSummary,\n CallRefSummary,\n ChatRefSummary,\n EntityRefLookup,\n EscalationRefSummary,\n MemberRefSummary,\n RefResolutionStatus,\n ResolvedEntityRef,\n ResolveEntityRefsRequest,\n ResolveEntityRefsResponse,\n ResolveGroupedEntityRefsRequest,\n ResolveGroupedEntityRefsResponse,\n VoicemailRefSummary,\n WorkflowRevisionRefSummary,\n WorkspaceEntityRefLookups,\n WorkspaceResolvedEntityRefs,\n} from '../types/generated/entity_ref';\n\n/**\n * The Activity Spine's serving API\n * (`docs/projects/active/activity-spine.md` § \"Serving API\").\n *\n * **One query shape, three mounts.** `activity/*` is the caller's account — the\n * workspaces they can see across every org, plus their own private lane;\n * `o/{orgUuid}/activity/*` is one org; `w/{workspaceUuid}/activity/*` is one\n * workspace. Every mount accepts the *same* request body. What differs is the\n * grant set the server compiles, never what the client may ask for — so the\n * three method families below deliberately share one request type rather than\n * growing per-mount shapes.\n *\n * **POST for a read**: requests carry typed refs\n * and a structured scope, and a body stays out of browser history, proxy logs\n * and the ALB access log.\n *\n * PHI notes for callers: responses are ID-only. A line names entities as typed\n * refs (`kind` + `uuid` + the scope chain), never by name — hydrate a ref\n * through the workspace or org API the ref's own chain points at, under the\n * caller's session. Nothing hydrated belongs in a log line.\n *\n * `nextCursor` is opaque and bound to its exact request. Send it back unchanged\n * on an otherwise identical body; anything else is a 400.\n */\nexport class ActivityApi extends BaseApiClient {\n /** The account mount: this caller's whole estate, at any grain. */\n async queryActivity(\n request: ActivityFeedQueryRequest\n ): Promise<ActivityAggregateResponse | ActivityEventsResponse> {\n return this.fetch('activity/query', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Latest admitted event for each workspace-qualified Activity subject.\n * Scope authorization and any event-type leaf authorization are both\n * applied before a subject is returned.\n */\n async queryActivityLatestSubjects(\n request: ActivityLatestSubjectsRequest\n ): Promise<ActivityLatestSubjectsResponse> {\n return this.fetch('activity/latest-subjects', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * The account mount's priority lane — one queue per human. `openedAfter`\n * may bound the active backlog without changing the priority policy.\n */\n async queryActivityOpenItems(\n request: ActivityOpenItemsRequest = {}\n ): Promise<ActivityOpenItemsResponse> {\n return this.fetch('activity/open-items', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * The account mount's one view: one stream of occurrences, some carrying\n * open state. The window bounds the event axis; open items older than it\n * arrive as `olderOpenCount`, never hidden.\n */\n async queryActivityOneView(request: ActivityOneViewRequest): Promise<ActivityOneViewResponse> {\n return this.fetch('activity/one-view', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** The account mount's badge numbers. */\n async getActivityCounts(request: ActivityCountsRequest = {}): Promise<ActivityCountsResponse> {\n return this.fetch('activity/counts', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * What this caller's estate admits, so a client renders honest controls.\n *\n * Account mount only, and deliberately so: the org and workspace mounts\n * answer the same question through the surfaces that already serve their\n * membership. Not an authorization decision — every read re-derives that.\n */\n async getActivityCapabilities(): Promise<ActivityCapabilitiesResponse> {\n return this.fetch('activity/capabilities', { method: 'GET' });\n }\n\n /** The org mount. `org:info` is the entry gate; `org:read` widens the rows. */\n async queryOrgActivity(\n orgUuid: string,\n request: ActivityFeedQueryRequest\n ): Promise<ActivityAggregateResponse | ActivityEventsResponse> {\n return this.fetch(`o/${orgUuid}/activity/query`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n async queryOrgActivityLatestSubjects(\n orgUuid: string,\n request: ActivityLatestSubjectsRequest\n ): Promise<ActivityLatestSubjectsResponse> {\n return this.fetch(`o/${orgUuid}/activity/latest-subjects`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** The org mount's priority lane. */\n async queryOrgActivityOpenItems(\n orgUuid: string,\n request: ActivityOpenItemsRequest = {}\n ): Promise<ActivityOpenItemsResponse> {\n return this.fetch(`o/${orgUuid}/activity/open-items`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** The org mount's one view. */\n async queryOrgActivityOneView(\n orgUuid: string,\n request: ActivityOneViewRequest\n ): Promise<ActivityOneViewResponse> {\n return this.fetch(`o/${orgUuid}/activity/one-view`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** The org mount's badge numbers. */\n async getOrgActivityCounts(\n orgUuid: string,\n request: ActivityCountsRequest = {}\n ): Promise<ActivityCountsResponse> {\n return this.fetch(`o/${orgUuid}/activity/counts`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * The specifics behind a page of aggregate lines, in one round trip.\n *\n * Each entry of `request.lines` is an aggregate line's **own server-issued\n * drill**, POSTed back verbatim, and the response is positional with it — so\n * a caller maps groups back to rows without inventing a key and without a\n * second expression of the slice that could drift from the count above it.\n *\n * Aggregate-shaped, never row-level: counts per PHI-silent key. A digest the\n * server could not finish comes back with `complete: false` and no groups,\n * which a client renders as the plain count phrase rather than as a slice\n * presented as the whole.\n */\n async queryActivityDigest(request: ActivityDigestRequest): Promise<ActivityDigestResponse> {\n return this.fetch('activity/digest', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** The org mount's digest. */\n async queryOrgActivityDigest(\n orgUuid: string,\n request: ActivityDigestRequest\n ): Promise<ActivityDigestResponse> {\n return this.fetch(`o/${orgUuid}/activity/digest`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** The workspace mount's digest. */\n async queryWorkspaceActivityDigest(\n workspaceUuid: string,\n request: ActivityDigestRequest\n ): Promise<ActivityDigestResponse> {\n return this.fetch(`w/${workspaceUuid}/activity/digest`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** The workspace mount. The request's own member session carries its scopes. */\n async queryWorkspaceActivity(\n workspaceUuid: string,\n request: ActivityFeedQueryRequest\n ): Promise<ActivityAggregateResponse | ActivityEventsResponse> {\n return this.fetch(`w/${workspaceUuid}/activity/query`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n async queryWorkspaceActivityLatestSubjects(\n workspaceUuid: string,\n request: ActivityLatestSubjectsRequest\n ): Promise<ActivityLatestSubjectsResponse> {\n return this.fetch(`w/${workspaceUuid}/activity/latest-subjects`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** The workspace mount's priority lane. */\n async queryWorkspaceActivityOpenItems(\n workspaceUuid: string,\n request: ActivityOpenItemsRequest = {}\n ): Promise<ActivityOpenItemsResponse> {\n return this.fetch(`w/${workspaceUuid}/activity/open-items`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** The workspace mount's one view. */\n async queryWorkspaceActivityOneView(\n workspaceUuid: string,\n request: ActivityOneViewRequest\n ): Promise<ActivityOneViewResponse> {\n return this.fetch(`w/${workspaceUuid}/activity/one-view`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** The workspace mount's badge numbers. */\n async getWorkspaceActivityCounts(\n workspaceUuid: string,\n request: ActivityCountsRequest = {}\n ): Promise<ActivityCountsResponse> {\n return this.fetch(`w/${workspaceUuid}/activity/counts`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Hydrate a page of typed refs in one round trip.\n *\n * The relief valve the design names for chatty hydration, and the by-UUID\n * read path most entity kinds otherwise lack: nineteen kinds resolve here,\n * each through the workspace's own live authorizers under the caller's\n * session. One request per workspace per listing, instead of one per ref.\n *\n * **Every requested ref comes back**, in the order it was sent and\n * deduplicated on `(kind, uuid)`. A ref the caller may not see is an entry\n * with `status: 'unresolved'` — never a 404, and never an omission, so a\n * page's ability to render never depends on what it happens to name.\n * `status: 'unsupported'` means this build has no by-UUID path for that\n * kind at all (account, org, workspace, domain, subscription and the\n * commerce kinds; see the resolve registry for each one's reason) — those\n * resolve through the mount that owns them, and retrying here will not\n * help.\n *\n * PHI: resolved labels are member-identifying data. They belong in the UI\n * and nowhere else — never a log line, never an error message.\n */\n async resolveEntityRefs(\n workspaceUuid: string,\n request: ResolveEntityRefsRequest\n ): Promise<ResolveEntityRefsResponse> {\n return this.fetch(`w/${workspaceUuid}/entity-refs/resolve`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Hydrate a page of typed refs spanning an org's workspaces, in one round\n * trip. `org:info` is the gate; what it buys differs per workspace, and the\n * server decides — an `org:read` holder reads every workspace in the org,\n * an `org:info` holder the ones they belong to.\n *\n * The request groups refs by workspace because the same UUID under two\n * workspaces is two entities. A group naming a workspace this caller cannot\n * reach comes back entirely `unresolved` — the same answer a denied ref\n * gets, never an error.\n *\n * Caps: at most 500 refs and 25 workspaces across the whole request, and a\n * workspace may be named at most once in it. Each answered group carries the\n * same per-entry contract as the workspace mount: every requested ref comes\n * back, with a marker status rather than an omission.\n *\n * PHI: resolved labels are member-identifying data. They belong in the UI\n * and nowhere else — never a log line, never an error message.\n */\n async resolveOrgEntityRefs(\n orgUuid: string,\n request: ResolveGroupedEntityRefsRequest\n ): Promise<ResolveGroupedEntityRefsResponse> {\n return this.fetch(`o/${orgUuid}/activity/entity-refs/resolve`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Hydrate a page of typed refs spanning the caller's whole estate.\n *\n * The same grouped body as the org mount, and the same rule that the server\n * chooses each group's authority: a workspace the caller belongs to resolves\n * under their own member row, and a workspace they reach by holding\n * `org:read` on its org resolves under that. A client never states which,\n * because stating it would mean carrying a copy of the policy.\n *\n * PHI: resolved labels are member-identifying data. They belong in the UI\n * and nowhere else — never a log line, never an error message.\n */\n async resolveAccountEntityRefs(\n request: ResolveGroupedEntityRefsRequest\n ): Promise<ResolveGroupedEntityRefsResponse> {\n return this.fetch(`activity/entity-refs/resolve`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n}\n","import { MotdResponse } from '../types';\nimport { BaseApiClient } from './base';\n\nexport class MotdApi extends BaseApiClient {\n /**\n * The Message-of-the-Day tip for the workspace on a given date.\n *\n * `date` is an ISO `YYYY-MM-DD` string (defaults to today, UTC, when\n * omitted); `offset` advances the rotation (\"show another\"). Selection is\n * deterministic — same date + workspace + offset always returns the same\n * tip — and cycles through the tip list.\n */\n async getMotd(wid: string, options?: { date?: string; offset?: number }): Promise<MotdResponse> {\n const params = new URLSearchParams();\n if (options?.date !== undefined) params.append('date', options.date);\n if (options?.offset !== undefined) params.append('offset', options.offset.toString());\n const query = params.toString();\n return this.fetch<MotdResponse>(`w/${wid}/motd${query ? `?${query}` : ''}`);\n }\n}\n","import { BaseApiClient } from './base';\n\n/**\n * One intervention request — the event that a conversation asked for a person,\n * not a per-recipient inbox row. Everyone notified shares this single status.\n */\nexport interface InterventionRequest {\n id: number;\n uuid: string;\n /** escalation | contributor_input | approval */\n kind: string;\n chatId?: number | null;\n requestingMemberId?: number | null;\n reasonCode?: string | null;\n /** handled | approved | denied | cancelled; null while open */\n resolution?: string | null;\n resolvedByMemberId?: number | null;\n resolvedAt?: string | null;\n createdAt: string;\n /** How many people were told. Zero means the escalation reached nobody. */\n notifiedCount: number;\n}\n\nexport interface ListInterventionRequestsParams {\n kind?: string;\n openOnly?: boolean;\n chatId?: number;\n /** Only requests that notified nobody — escalations that reached no one. */\n unroutedOnly?: boolean;\n limit?: number;\n}\n\nexport interface ResolveInterventionRequestParams {\n /** Internal, PHI-capable operator note. It is never sent to the Chat. */\n resolutionNote?: string;\n}\n\n/** Identifier-only attention state for one Chat in Agent Mode. */\nexport interface AgentModeAttentionItem {\n chatId: number;\n chatType: string;\n assistantMemberIds: number[];\n workflowId?: number | null;\n needsResponse: boolean;\n openEscalation: boolean;\n}\n\nexport class InterventionRequestsApi extends BaseApiClient {\n /** List every visible Chat that currently needs attention in Agent Mode. */\n async getAgentModeAttention(wid: string): Promise<AgentModeAttentionItem[]> {\n return this.fetch<AgentModeAttentionItem[]>(`w/${wid}/agent-mode/attention`);\n }\n\n /** List intervention requests in a workspace, newest first. */\n async getInterventionRequests(\n wid: string,\n params: ListInterventionRequestsParams = {}\n ): Promise<InterventionRequest[]> {\n const query = new URLSearchParams();\n if (params.kind) query.set('kind', params.kind);\n if (params.openOnly) query.set('openOnly', 'true');\n if (params.chatId !== undefined) query.set('chatId', String(params.chatId));\n if (params.unroutedOnly) query.set('unroutedOnly', 'true');\n if (params.limit !== undefined) query.set('limit', String(params.limit));\n\n const qs = query.toString();\n return this.fetch<InterventionRequest[]>(\n `w/${wid}/intervention-requests${qs ? `?${qs}` : ''}`\n );\n }\n\n /**\n * Resolve one intervention request. One row, one resolution — whoever takes\n * it closes it for everyone who was notified. Resolving an already-resolved\n * request is a 409 conflict; a non-escalation request is a 409 too.\n *\n * The JSON body (empty when no note is supplied) is required as a CSRF\n * barrier (GRA-6284), so a cross-site form POST cannot reach it.\n */\n async resolveInterventionRequest(\n wid: string,\n requestId: number,\n params: ResolveInterventionRequestParams = {}\n ): Promise<InterventionRequest> {\n return this.fetch<InterventionRequest>(\n `w/${wid}/intervention-requests/${requestId}/resolve`,\n {\n method: 'POST',\n body: JSON.stringify(params),\n }\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport type { PaginatedResponse } from '../types';\nimport type {\n ComputeChatMetricsRequest,\n ComputeChatMetricsResponse,\n CreateMetricRequest,\n MetricObservationResponse,\n MetricResponse,\n MetricSeriesResponse,\n UpdateMetricRequest,\n} from '../types/generated/metric';\n\nexport class MetricsApi extends BaseApiClient {\n /** List metric definitions in the workspace, paginated. */\n async listMetrics(\n wid: string,\n params?: {\n page?: number;\n pageSize?: number;\n includeArchived?: boolean;\n source?: string;\n }\n ): Promise<PaginatedResponse<MetricResponse>> {\n const q = new URLSearchParams();\n if (params?.page !== undefined) q.set('page', String(params.page));\n if (params?.pageSize !== undefined) q.set('pageSize', String(params.pageSize));\n if (params?.includeArchived !== undefined)\n q.set('includeArchived', String(params.includeArchived));\n if (params?.source) q.set('source', params.source);\n const qs = q.toString() ? `?${q.toString()}` : '';\n return this.fetch<PaginatedResponse<MetricResponse>>(`w/${wid}/metrics${qs}`);\n }\n\n async getMetric(wid: string, id: number): Promise<MetricResponse> {\n return this.fetch<MetricResponse>(`w/${wid}/metrics/${id}`);\n }\n\n async createMetric(wid: string, data: CreateMetricRequest): Promise<MetricResponse> {\n return this.fetch<MetricResponse>(`w/${wid}/metrics`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateMetric(wid: string, id: number, data: UpdateMetricRequest): Promise<MetricResponse> {\n return this.fetch<MetricResponse>(`w/${wid}/metrics/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Soft-archive a metric (observations retained). */\n async deleteMetric(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/metrics/${id}`, { method: 'DELETE' });\n }\n\n async listMetricObservations(\n wid: string,\n metricId: number,\n params: {\n start: string;\n end: string;\n page?: number;\n pageSize?: number;\n }\n ): Promise<PaginatedResponse<MetricObservationResponse>> {\n const q = new URLSearchParams();\n q.set('start', params.start);\n q.set('end', params.end);\n if (params.page !== undefined) q.set('page', String(params.page));\n if (params.pageSize !== undefined) q.set('pageSize', String(params.pageSize));\n return this.fetch<PaginatedResponse<MetricObservationResponse>>(\n `w/${wid}/metrics/${metricId}/observations?${q.toString()}`\n );\n }\n\n async getMetricSeries(\n wid: string,\n metricId: number,\n params: {\n start: string;\n end: string;\n bucket?: 'day' | 'week';\n aggregation?: 'avg' | 'sum' | 'count' | 'rate' | 'last' | 'passes';\n }\n ): Promise<MetricSeriesResponse> {\n const q = new URLSearchParams();\n q.set('start', params.start);\n q.set('end', params.end);\n if (params.bucket) q.set('bucket', params.bucket);\n if (params.aggregation) q.set('aggregation', params.aggregation);\n return this.fetch<MetricSeriesResponse>(\n `w/${wid}/metrics/${metricId}/series?${q.toString()}`\n );\n }\n\n /** On-demand compute of enabled chat-source metrics for one chat. */\n async computeChatMetrics(\n wid: string,\n data: ComputeChatMetricsRequest\n ): Promise<ComputeChatMetricsResponse> {\n return this.fetch<ComputeChatMetricsResponse>(`w/${wid}/metrics/compute-for-chat`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport { PaginatedResponse } from '../types';\nimport {\n PlanDetailResponse,\n ProjectDetailResponse,\n ProjectSummaryResponse,\n UpdateProjectDocRequest,\n} from '../types/project-types';\n\n/**\n * Read-only aggregator over the workspace projects/plans file tree\n * (ADR 2026-08-08-16). Writes go through the Files API — these endpoints\n * only resolve and summarize.\n */\nexport class ProjectsApi extends BaseApiClient {\n /** List projects (README frontmatter summaries). */\n async getProjects(\n wid: string,\n options: { page?: number; pageSize?: number } = {}\n ): Promise<PaginatedResponse<ProjectSummaryResponse>> {\n const params = new URLSearchParams();\n if (options.page !== undefined) params.append('page', options.page.toString());\n if (options.pageSize !== undefined) params.append('pageSize', options.pageSize.toString());\n return this.fetch<PaginatedResponse<ProjectSummaryResponse>>(\n `w/${wid}/projects${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** One project: summary + present docs + plan summaries. */\n async getProject(wid: string, slug: string): Promise<ProjectDetailResponse> {\n return this.fetch<ProjectDetailResponse>(`w/${wid}/projects/${encodeURIComponent(slug)}`);\n }\n\n /** One plan: summary + resolved process + flows + run state. */\n async getPlan(wid: string, slug: string, plan: string): Promise<PlanDetailResponse> {\n return this.fetch<PlanDetailResponse>(\n `w/${wid}/projects/${encodeURIComponent(slug)}/plans/${encodeURIComponent(plan)}`\n );\n }\n\n /** Typed update of a project README; absent fields are untouched. */\n async updateProject(\n wid: string,\n slug: string,\n update: UpdateProjectDocRequest\n ): Promise<ProjectDetailResponse> {\n return this.fetch<ProjectDetailResponse>(`w/${wid}/projects/${encodeURIComponent(slug)}`, {\n method: 'PATCH',\n body: JSON.stringify(update),\n });\n }\n\n /** Typed update of a plan README; absent fields are untouched. */\n async updatePlan(\n wid: string,\n slug: string,\n plan: string,\n update: UpdateProjectDocRequest\n ): Promise<PlanDetailResponse> {\n return this.fetch<PlanDetailResponse>(\n `w/${wid}/projects/${encodeURIComponent(slug)}/plans/${encodeURIComponent(plan)}`,\n { method: 'PATCH', body: JSON.stringify(update) }\n );\n }\n}\n","import type { PaginatedResponse } from '../types';\nimport type {\n CreateTrackedLinkDestinationRequest,\n TrackedLinkDestinationResponse,\n TrackedLinkPurgeResponse,\n TrackedLinkStatsResponse,\n TrackedLinkSummaryResponse,\n TrackedLinkTimeseriesResponse,\n UpdateTrackedLinkDestinationRequest,\n} from '../types/generated/short_url';\nimport { BaseApiClient } from './base';\n\n// Wire shapes are generated from the backend Pydantic models via\n// `yarn generate:types`. Re-export rather than hand-mirroring them.\nexport type {\n CreateTrackedLinkDestinationRequest,\n TrackedLinkDestinationResponse,\n TrackedLinkPurgeResponse,\n TrackedLinkStatsResponse,\n TrackedLinkSummaryResponse,\n TrackedLinkTimeseriesPoint,\n TrackedLinkTimeseriesResponse,\n UpdateTrackedLinkDestinationRequest,\n} from '../types/generated/short_url';\n\nexport type TrackedLinkSortField = 'clicks' | 'sent' | 'clickThroughRate' | 'lastClickAt' | 'url';\nexport type TrackedLinkGranularity = 'hour' | 'day';\n\n/** Window + workflow scoping shared by every Tracked Links read. */\nexport interface TrackedLinkFilterParams {\n /** ISO 8601. Defaults to 30 days before `dateTo`. */\n dateFrom?: string;\n /** ISO 8601. Defaults to now. */\n dateTo?: string;\n workflowId?: number;\n}\n\nexport interface TrackedLinkStatsParams extends TrackedLinkFilterParams {\n page?: number;\n pageSize?: number;\n /** Substring match on the destination URL. */\n q?: string;\n sortBy?: TrackedLinkSortField;\n sortOrder?: 'asc' | 'desc';\n}\n\nexport interface TrackedLinkTimeseriesParams extends TrackedLinkFilterParams {\n destinationId?: number;\n /** Defaults to hour for ranges under two weeks, day otherwise. */\n granularity?: TrackedLinkGranularity;\n /** IANA zone the day/hour buckets align to. Defaults to UTC. */\n tz?: string;\n}\n\nfunction withFilters(params: URLSearchParams, options: TrackedLinkFilterParams): URLSearchParams {\n if (options.dateFrom) params.append('dateFrom', options.dateFrom);\n if (options.dateTo) params.append('dateTo', options.dateTo);\n if (options.workflowId !== undefined) params.append('workflowId', String(options.workflowId));\n return params;\n}\n\nfunction suffix(params: URLSearchParams): string {\n const query = params.toString();\n return query ? `?${query}` : '';\n}\n\n/**\n * Tracked Links analytics (issue #10934) — click reporting for the short links\n * that outbound messages carry when `shortenUrls` is on.\n *\n * Everything is grouped by *destination URL*, not by individual short link: a\n * campaign mints one link per message, so the per-link view is noise.\n */\nexport class TrackedLinksApi extends BaseApiClient {\n /** Header counters plus whether shortening is configured and enabled. */\n async getTrackedLinkSummary(\n wid: string,\n options: TrackedLinkFilterParams = {}\n ): Promise<TrackedLinkSummaryResponse> {\n const params = withFilters(new URLSearchParams(), options);\n return this.fetch<TrackedLinkSummaryResponse>(\n `w/${wid}/tracked-links/summary${suffix(params)}`\n );\n }\n\n /**\n * Known destination URLs, most recent first. Powers the \"Clicked link\"\n * member-filter autocomplete, so it stays unaggregated and cheap.\n */\n async getTrackedLinkDestinations(\n wid: string,\n options: { q?: string; limit?: number } = {}\n ): Promise<TrackedLinkDestinationResponse[]> {\n const params = new URLSearchParams();\n if (options.q) params.append('q', options.q);\n if (options.limit !== undefined) params.append('limit', String(options.limit));\n return this.fetch<TrackedLinkDestinationResponse[]>(\n `w/${wid}/tracked-links/destinations${suffix(params)}`\n );\n }\n\n /**\n * Register a destination an author can reference as `{{links.<key>}}`.\n *\n * The URL is deduplicated server-side, so registering one the workspace\n * already knows adopts that destination — including a row the retired\n * auto-harvest left unnamed, whose click history then carries forward\n * under the new key. Registering a URL that already has a *different* key\n * is a 409: renaming is what `updateTrackedLinkDestination` is for.\n *\n * Keys use the same grammar as snippet keys: lowercase letters, digits,\n * underscores and dots, starting with a letter (`intake_form`,\n * `docs.privacy`). No hyphens — Jinja2 reads `links.spring-2026` as\n * subtraction.\n */\n async createTrackedLinkDestination(\n wid: string,\n data: CreateTrackedLinkDestinationRequest\n ): Promise<TrackedLinkDestinationResponse> {\n return this.fetch<TrackedLinkDestinationResponse>(`w/${wid}/tracked-links/destinations`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Re-key or relabel a destination.\n *\n * Changing `key` breaks templates: `{{links.old}}` stops resolving and the\n * message ships without its link. Relabelling (`name`) is always safe.\n * Passing `key: null` releases the handle so another destination can take\n * it — the non-destructive alternative to deleting, which would take the\n * click history with it. The URL is not editable.\n */\n async updateTrackedLinkDestination(\n wid: string,\n destinationId: number,\n data: UpdateTrackedLinkDestinationRequest\n ): Promise<TrackedLinkDestinationResponse> {\n return this.fetch<TrackedLinkDestinationResponse>(\n `w/${wid}/tracked-links/destinations/${destinationId}`,\n { method: 'PUT', body: JSON.stringify(data) }\n );\n }\n\n /** Per-destination sent / clicks / unique clickers / CTR for the window. */\n async getTrackedLinkStats(\n wid: string,\n options: TrackedLinkStatsParams = {}\n ): Promise<PaginatedResponse<TrackedLinkStatsResponse>> {\n const params = withFilters(new URLSearchParams(), options);\n if (options.page !== undefined) params.append('page', String(options.page));\n if (options.pageSize !== undefined) params.append('pageSize', String(options.pageSize));\n if (options.q) params.append('q', options.q);\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n return this.fetch<PaginatedResponse<TrackedLinkStatsResponse>>(\n `w/${wid}/tracked-links${suffix(params)}`\n );\n }\n\n /** Clicks over time for the current filter selection. */\n async getTrackedLinkTimeseries(\n wid: string,\n options: TrackedLinkTimeseriesParams = {}\n ): Promise<TrackedLinkTimeseriesResponse> {\n const params = withFilters(new URLSearchParams(), options);\n if (options.destinationId !== undefined) {\n params.append('destinationId', String(options.destinationId));\n }\n if (options.granularity) params.append('granularity', options.granularity);\n if (options.tz) params.append('tz', options.tz);\n return this.fetch<TrackedLinkTimeseriesResponse>(\n `w/${wid}/tracked-links/timeseries${suffix(params)}`\n );\n }\n\n /**\n * Delete one destination: its short links stop resolving and its recorded\n * clicks are removed.\n *\n * Turning the workspace setting off only stops NEW links being minted —\n * links already delivered to members keep working. This is the deliberate\n * way to break them.\n */\n async deleteTrackedLinkDestination(\n wid: string,\n destinationId: number\n ): Promise<TrackedLinkPurgeResponse> {\n return this.fetch<TrackedLinkPurgeResponse>(\n `w/${wid}/tracked-links/destinations/${destinationId}`,\n { method: 'DELETE' }\n );\n }\n\n /** Delete every destination, its links, and its clicks. Irreversible. */\n async clearTrackedLinkDestinations(wid: string): Promise<TrackedLinkPurgeResponse> {\n return this.fetch<TrackedLinkPurgeResponse>(`w/${wid}/tracked-links/destinations`, {\n method: 'DELETE',\n });\n }\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: bundle_contract\n */\n\nimport type { DisclosureMode } from './disclosure_contract';\nimport type { JourneyBundleItem } from './journey_bundle';\nimport type { SystemRoleKey } from './member_role';\nimport type { EnumOption } from './schema_field';\nimport type { DataTypeRequirement, RequirementSchemaField } from './site';\n\nexport interface BundleGrantRequest {\n granteeType: BundleGrantRequestGranteeType;\n granteeUuid?: string | null;\n expiresAt?: string | null;\n disclosureMode?: DisclosureMode;\n}\n\nexport type BundleGrantRequestGranteeType = typeof BundleGrantRequestGranteeType[keyof typeof BundleGrantRequestGranteeType];\n\n\nexport const BundleGrantRequestGranteeType = {\n organization: 'organization',\n global: 'global',\n} as const;\n\nexport interface BundleGrantResponse {\n granteeName?: string | null;\n id: number;\n granteeType: string;\n granteeUuid: string | null;\n effective?: boolean;\n disclosureMode: string;\n expiresAt: string | null;\n revokedAt: string | null;\n revocationMode?: string | null;\n revocationReason?: string | null;\n}\n\nexport interface BundleItemLabel {\n name: string;\n version?: number | null;\n versionName?: string | null;\n}\n\nexport interface BundleScenarioPreflightRequest {\n /**\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9_]*$\n */\n workflowItemKey: string;\n /**\n * @minItems 1\n * @maxItems 100\n */\n selections: ScenarioSelection[];\n}\n\n/**\n * One Site setting or Journey/Workflow Inbox left for installation.\n *\n * A Site slot is a reference-typed setting naming a workspace\n * entity rather than another item in the version. A Workflow's default Inbox\n * is a required destination slot when its\n * published dependency manifest requires one. Other Workflow references are\n * not slots — an installed Workflow's Abilities carry ordinary\n * export-shaped configuration the installer relocates by identity, and an\n * unmapped dependency refuses the install rather than becoming an open slot\n * somebody may fill later. This is a response projection: the theme vocabulary\n * stays where it is declared.\n */\nexport interface BundleSlot {\n key: string;\n kind: string;\n required: boolean;\n label: string;\n description?: string | null;\n defaultValue?: string | number | boolean | null;\n options?: EnumOption[] | null;\n requirement?: DataTypeRequirement | null;\n}\n\nexport interface BundleSummary {\n uuid: string;\n name: string;\n description: string | null;\n publishedVersion: number | null;\n publishedAt: string | null;\n draftGeneration: number;\n owned: boolean;\n}\n\nexport interface BundleVersionResponse {\n bundleUuid: string;\n version: number | null;\n publishedAt: string | null;\n releaseNotes?: string | null;\n items: (WorkflowBundleItem | FormBundleItem | SiteBundleItem | JourneyBundleItem)[];\n itemLabels?: BundleVersionResponseItemLabels;\n slots?: BundleSlot[];\n draftGeneration: number;\n}\n\nexport type BundleVersionResponseItemLabels = {[key: string]: BundleItemLabel};\n\nexport interface BundleVersionSummary {\n version: number | null;\n publishedAt: string | null;\n releaseNotes?: string | null;\n subscriberCount?: number | null;\n}\n\n/**\n * A local Workflow the Bundle picker lists, and whether it can be added.\n *\n * ``revisionUuid`` is the active revision when it is published, otherwise the\n * newest published revision. ``dependenciesChecked`` is true when dependency\n * validation finds no issues for the acting Member. Listing does not store\n * a manifest; adding the Workflow captures its release.\n */\nexport interface BundleWorkflowCandidate {\n id: number;\n uuid: string;\n name: string;\n status: BundleWorkflowCandidateStatus;\n revisionUuid?: string | null;\n revisionNumber?: number | null;\n revisionName?: string | null;\n dependenciesChecked?: boolean;\n issues?: BundleWorkflowCandidateIssuesItem[];\n problems?: WorkflowReleaseProblem[];\n forms?: FormBundleItem[];\n}\n\nexport type BundleWorkflowCandidateIssuesItem = typeof BundleWorkflowCandidateIssuesItem[keyof typeof BundleWorkflowCandidateIssuesItem];\n\n\nexport const BundleWorkflowCandidateIssuesItem = {\n unsupported_contributor_roles: 'unsupported_contributor_roles',\n unsupported_task_configuration: 'unsupported_task_configuration',\n unsupported_ability: 'unsupported_ability',\n invalid_ability_configuration: 'invalid_ability_configuration',\n file_binding_required: 'file_binding_required',\n file_access_denied: 'file_access_denied',\n missing_rule_label: 'missing_rule_label',\n missing_ability_dependency: 'missing_ability_dependency',\n unsupported_member_role: 'unsupported_member_role',\n unsupported_rule_action: 'unsupported_rule_action',\n invalid_rule_parameters: 'invalid_rule_parameters',\n invalid_rule_form_path: 'invalid_rule_form_path',\n missing_rule_form: 'missing_rule_form',\n missing_session_form: 'missing_session_form',\n missing_form: 'missing_form',\n publication_actor_required: 'publication_actor_required',\n form_access_denied: 'form_access_denied',\n invalid_form_schema: 'invalid_form_schema',\n} as const;\n\nexport type BundleWorkflowCandidateStatus = typeof BundleWorkflowCandidateStatus[keyof typeof BundleWorkflowCandidateStatus];\n\n\nexport const BundleWorkflowCandidateStatus = {\n eligible: 'eligible',\n unpublished: 'unpublished',\n} as const;\n\nexport interface CreateBundleRequest {\n /**\n * @minLength 1\n * @maxLength 255\n */\n name: string;\n description?: string | null;\n}\n\n/**\n * A whole Form definition, created in the installing workspace.\n *\n * ``dataTypeUuid`` is the **source** workspace's DataType identity: the uuid a\n * published Workflow ability names in its ``data_access`` configuration. It is\n * the relocation key — installation maps it to the local DataType it creates\n * — and a new draft must carry it (:class:`ReplaceBundleDraftRequest`).\n *\n * Stored items published before this identity existed omit the key. Reading\n * them back leaves it unset so the version stays readable; installation\n * refuses that item instead of answering 500 or inventing an identity.\n */\nexport interface FormBundleItem {\n /**\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9_]*$\n */\n key: string;\n kind: 'form';\n dataTypeUuid?: string | null;\n /**\n * @minLength 1\n * @maxLength 255\n */\n name: string;\n /**\n * @minLength 1\n * @maxLength 255\n */\n slug: string;\n description?: string | null;\n prompt?: string | null;\n isCollection?: boolean;\n recordScope?: FormBundleItemRecordScope;\n /**\n * @minItems 1\n * @maxItems 100\n */\n fields: RequirementSchemaField[];\n}\n\nexport type FormBundleItemRecordScope = typeof FormBundleItemRecordScope[keyof typeof FormBundleItemRecordScope];\n\n\nexport const FormBundleItemRecordScope = {\n member: 'member',\n workspace: 'workspace',\n anonymous: 'anonymous',\n} as const;\n\n/**\n * Read-only org Library row: identity, latest contents, version history.\n */\nexport interface OrgBundleCatalogItem {\n uuid: string;\n name: string;\n description: string | null;\n workspaceUuid: string;\n workspaceName: string;\n publishedVersion: number | null;\n publishedAt: string | null;\n subscriberCount?: number;\n orgShared?: boolean;\n items?: (WorkflowBundleItem | FormBundleItem | SiteBundleItem | JourneyBundleItem)[];\n versions?: BundleVersionSummary[];\n}\n\nexport interface PublishBundleRequest {\n /** @minimum 0 */\n expectedGeneration: number;\n releaseNotes?: string | null;\n /** @maxItems 100 */\n scenarioSelections?: BundleScenarioPreflightRequest[];\n}\n\nexport interface ReplaceBundleDraftRequest {\n /** @minimum 0 */\n expectedGeneration: number;\n /**\n * @minItems 1\n * @maxItems 100\n */\n items: (WorkflowBundleItem | FormBundleItem | SiteBundleItem | JourneyBundleItem)[];\n}\n\n/**\n * One publisher-selected example and its distribution decisions.\n */\nexport interface ScenarioSelection {\n scenarioUuid: string;\n driver: ScenarioSelectionDriver;\n persona: ScenarioSelectionPersona;\n fixtures: ScenarioSelectionFixtures;\n includeCriteria: boolean;\n contentReviewedForDistribution?: boolean;\n syntheticContentAttested?: boolean;\n}\n\nexport type ScenarioSelectionDriver = typeof ScenarioSelectionDriver[keyof typeof ScenarioSelectionDriver];\n\n\nexport const ScenarioSelectionDriver = {\n human: 'human',\n automated: 'automated',\n} as const;\n\nexport type ScenarioSelectionFixtures = typeof ScenarioSelectionFixtures[keyof typeof ScenarioSelectionFixtures];\n\n\nexport const ScenarioSelectionFixtures = {\n none: 'none',\n include_synthetic: 'include_synthetic',\n recipient_binding: 'recipient_binding',\n} as const;\n\nexport type ScenarioSelectionPersona = typeof ScenarioSelectionPersona[keyof typeof ScenarioSelectionPersona];\n\n\nexport const ScenarioSelectionPersona = {\n none: 'none',\n include_synthetic: 'include_synthetic',\n recipient_binding: 'recipient_binding',\n} as const;\n\n/**\n * A Site, with the theme settings an installation must resolve.\n */\nexport interface SiteBundleItem {\n /**\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9_]*$\n */\n key: string;\n kind: 'site';\n /**\n * @minLength 1\n * @maxLength 255\n */\n name: string;\n slug?: string | null;\n siteUuid?: string | null;\n /** @minLength 1 */\n theme: string;\n isPublic?: boolean;\n allowSignup?: boolean;\n authenticationMethods?: 'name_dob'[];\n memberRoleSystemKeys?: SystemRoleKey[];\n signupMemberRoleSystemKey?: SystemRoleKey | null;\n anonymousForm?: SlotRef | null;\n settings?: SiteBundleItemSettings;\n}\n\nexport type SiteBundleItemSettings = { [key: string]: unknown };\n\n/**\n * A setting whose value is another item in this Bundle version.\n */\nexport interface SlotRef {\n /**\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9_]*$\n */\n slot: string;\n}\n\nexport interface SolutionReleaseResponse {\n slug: SolutionReleaseResponseSlug;\n bundleUuid: string;\n version: number;\n name: string;\n}\n\nexport type SolutionReleaseResponseSlug = typeof SolutionReleaseResponseSlug[keyof typeof SolutionReleaseResponseSlug];\n\n\nexport const SolutionReleaseResponseSlug = {\n 'member-enrollment': 'member-enrollment',\n 'member-reengagement': 'member-reengagement',\n 'treatment-adherence': 'treatment-adherence',\n 'heart-health': 'heart-health',\n 'recovery-checkins': 'recovery-checkins',\n 'care-coordination': 'care-coordination',\n} as const;\n\nexport interface UpdateBundleRequest {\n /**\n * @minLength 1\n * @maxLength 255\n */\n name: string;\n description?: string | null;\n}\n\n/**\n * A pin to an existing published Workflow revision.\n */\nexport interface WorkflowBundleItem {\n /**\n * @minLength 1\n * @maxLength 100\n * @pattern ^[a-z][a-z0-9_]*$\n */\n key: string;\n kind?: 'workflow';\n workflowUuid: string;\n revisionUuid: string;\n}\n\n/**\n * 409 body when a draft save adds a Workflow whose dependencies refuse it.\n */\nexport interface WorkflowNotShareableResponse {\n detail: string;\n code: 'workflow_not_shareable';\n workflowUuid: string;\n issues: WorkflowNotShareableResponseIssuesItem[];\n problems?: WorkflowReleaseProblem[];\n workflows?: WorkflowReleaseRefusal[];\n}\n\nexport type WorkflowNotShareableResponseIssuesItem = typeof WorkflowNotShareableResponseIssuesItem[keyof typeof WorkflowNotShareableResponseIssuesItem];\n\n\nexport const WorkflowNotShareableResponseIssuesItem = {\n unsupported_contributor_roles: 'unsupported_contributor_roles',\n unsupported_task_configuration: 'unsupported_task_configuration',\n unsupported_ability: 'unsupported_ability',\n invalid_ability_configuration: 'invalid_ability_configuration',\n file_binding_required: 'file_binding_required',\n file_access_denied: 'file_access_denied',\n missing_rule_label: 'missing_rule_label',\n missing_ability_dependency: 'missing_ability_dependency',\n unsupported_member_role: 'unsupported_member_role',\n unsupported_rule_action: 'unsupported_rule_action',\n invalid_rule_parameters: 'invalid_rule_parameters',\n invalid_rule_form_path: 'invalid_rule_form_path',\n missing_rule_form: 'missing_rule_form',\n missing_session_form: 'missing_session_form',\n missing_form: 'missing_form',\n publication_actor_required: 'publication_actor_required',\n form_access_denied: 'form_access_denied',\n invalid_form_schema: 'invalid_form_schema',\n} as const;\n\n/**\n * An offending definition, without its configuration or runtime data.\n */\nexport interface WorkflowReleaseProblem {\n code: WorkflowReleaseProblemCode;\n abilityUuid?: string | null;\n abilityType?: string | null;\n abilityTitle?: string | null;\n ruleUuid?: string | null;\n actionType?: string | null;\n taskUuid?: string | null;\n taskId?: number | null;\n taskName?: string | null;\n dependencyKind?: WorkflowReleaseProblemDependencyKind;\n dependencyRef?: string | null;\n dependencyName?: string | null;\n reason?: WorkflowReleaseProblemReason;\n correction?: WorkflowReleaseProblemCorrection;\n resourceId?: number | null;\n}\n\nexport type WorkflowReleaseProblemCode = typeof WorkflowReleaseProblemCode[keyof typeof WorkflowReleaseProblemCode];\n\n\nexport const WorkflowReleaseProblemCode = {\n unsupported_contributor_roles: 'unsupported_contributor_roles',\n unsupported_task_configuration: 'unsupported_task_configuration',\n unsupported_ability: 'unsupported_ability',\n invalid_ability_configuration: 'invalid_ability_configuration',\n file_binding_required: 'file_binding_required',\n file_access_denied: 'file_access_denied',\n missing_rule_label: 'missing_rule_label',\n missing_ability_dependency: 'missing_ability_dependency',\n unsupported_member_role: 'unsupported_member_role',\n unsupported_rule_action: 'unsupported_rule_action',\n invalid_rule_parameters: 'invalid_rule_parameters',\n invalid_rule_form_path: 'invalid_rule_form_path',\n missing_rule_form: 'missing_rule_form',\n missing_session_form: 'missing_session_form',\n missing_form: 'missing_form',\n publication_actor_required: 'publication_actor_required',\n form_access_denied: 'form_access_denied',\n invalid_form_schema: 'invalid_form_schema',\n} as const;\n\nexport type WorkflowReleaseProblemCorrection = typeof WorkflowReleaseProblemCorrection[keyof typeof WorkflowReleaseProblemCorrection] | null;\n\n\nexport const WorkflowReleaseProblemCorrection = {\n edit_workflow: 'edit_workflow',\n open_resource: 'open_resource',\n review_sharing: 'review_sharing',\n upload_file: 'upload_file',\n republish_workflow: 'republish_workflow',\n retry_capture: 'retry_capture',\n} as const;\n\nexport type WorkflowReleaseProblemDependencyKind = typeof WorkflowReleaseProblemDependencyKind[keyof typeof WorkflowReleaseProblemDependencyKind] | null;\n\n\nexport const WorkflowReleaseProblemDependencyKind = {\n form: 'form',\n file: 'file',\n folder: 'folder',\n member_label: 'member_label',\n} as const;\n\nexport type WorkflowReleaseProblemReason = typeof WorkflowReleaseProblemReason[keyof typeof WorkflowReleaseProblemReason] | null;\n\n\nexport const WorkflowReleaseProblemReason = {\n missing_resource: 'missing_resource',\n read_access_required: 'read_access_required',\n share_access_required: 'share_access_required',\n unsupported_file_source: 'unsupported_file_source',\n missing_file_content: 'missing_file_content',\n invalid_configuration: 'invalid_configuration',\n resource_limit: 'resource_limit',\n unsupported_role: 'unsupported_role',\n legacy_label_configuration: 'legacy_label_configuration',\n fixed_member_target: 'fixed_member_target',\n missing_label: 'missing_label',\n republish_required: 'republish_required',\n storage_unavailable: 'storage_unavailable',\n} as const;\n\nexport interface WorkflowReleaseRefusal {\n workflowUuid: string;\n issues: WorkflowReleaseRefusalIssuesItem[];\n problems?: WorkflowReleaseProblem[];\n}\n\nexport type WorkflowReleaseRefusalIssuesItem = typeof WorkflowReleaseRefusalIssuesItem[keyof typeof WorkflowReleaseRefusalIssuesItem];\n\n\nexport const WorkflowReleaseRefusalIssuesItem = {\n unsupported_contributor_roles: 'unsupported_contributor_roles',\n unsupported_task_configuration: 'unsupported_task_configuration',\n unsupported_ability: 'unsupported_ability',\n invalid_ability_configuration: 'invalid_ability_configuration',\n file_binding_required: 'file_binding_required',\n file_access_denied: 'file_access_denied',\n missing_rule_label: 'missing_rule_label',\n missing_ability_dependency: 'missing_ability_dependency',\n unsupported_member_role: 'unsupported_member_role',\n unsupported_rule_action: 'unsupported_rule_action',\n invalid_rule_parameters: 'invalid_rule_parameters',\n invalid_rule_form_path: 'invalid_rule_form_path',\n missing_rule_form: 'missing_rule_form',\n missing_session_form: 'missing_session_form',\n missing_form: 'missing_form',\n publication_actor_required: 'publication_actor_required',\n form_access_denied: 'form_access_denied',\n invalid_form_schema: 'invalid_form_schema',\n} as const;\n","/**\n * App context types - shared between client and server\n *\n * These types represent the current state of the user's interaction with the app,\n * providing context to AI assistants about what the user is viewing/editing.\n */\n\n/**\n * Information about a site in the context\n */\nexport interface SiteContext {\n id: number;\n name?: string;\n slug?: string;\n}\n\n/**\n * Information about a page in the context\n */\nexport interface PageContext {\n id: number;\n name?: string;\n slug?: string;\n}\n\n/**\n * Information about a workflow in the context\n */\nexport interface WorkflowContext {\n id: number;\n name?: string;\n selectedTask?: TaskContext;\n}\n\n/**\n * Information about a task in the context\n */\nexport interface TaskContext {\n id: number;\n name?: string;\n}\n\n/**\n * Information about a data record in the context\n */\nexport interface DataRecordContext {\n id: number;\n type?: string;\n name?: string;\n}\n\n/**\n * Information about a toolkit in the context\n */\nexport interface ToolkitContext {\n id: string;\n name?: string;\n}\n\n/**\n * App context provided to AI assistants\n *\n * This represents the current page/state the user is in,\n * allowing the AI to provide context-aware assistance.\n */\nexport interface AppContext {\n /** Current page URI (e.g., 'app:page:workflows/123') */\n appUri?: string;\n\n /** Current browser URL for linking back to this page */\n pageUrl?: string;\n\n /** Auto-approve all tool calls without HITL interruption */\n autoApprove?: boolean;\n\n /** Enable deep thinking mode for the current session */\n deepThink?: boolean;\n\n /**\n * Workspace Manager chats only: the member's model pick from\n * `getManagerModels()`. A pick outside that catalog falls back to the\n * Manager's default model server-side. Takes precedence over `deepThink`.\n */\n managerModel?: string;\n\n /**\n * Workspace Manager chats only: reasoning effort for `managerModel`. An\n * effort the model does not offer falls back to its default server-side.\n */\n managerReasoningEffort?: string;\n\n /**\n * Client has a local browser the agent can drive (the Gravity Rail desktop\n * app is running and its core is reachable). The server loads the\n * `browser_*` tools ONLY when this is true, so a plain web session does not\n * pay for tool schemas it could never use.\n */\n hasLocalBrowser?: boolean;\n\n /** Server-validated Manager skills selected for the first Chat turn. */\n initialSkills?: string[];\n\n /**\n * Toolkit tool names/URIs for this Manager turn (builtin, custom,\n * app-connection, or MCP). When set (including `[]`), replaces the chat's\n * enabled toolkit tools for this and later turns. When omitted, the prior\n * selection is kept. Concrete tool URIs only — never wildcards.\n */\n initialTools?: string[];\n\n /** Additional structured page state */\n pageState?: {\n /** Route parameters from Next.js */\n routeParams?: Record<string, string | string[]>;\n\n /** Site being viewed/edited */\n site?: SiteContext;\n\n /** Page being viewed/edited */\n page?: PageContext;\n\n /** Workflow being viewed/edited */\n workflow?: WorkflowContext;\n\n /** Data record being viewed/edited */\n dataRecord?: DataRecordContext;\n\n /** Toolkit being viewed */\n toolkit?: ToolkitContext;\n\n /** Open drawers/modals */\n openDrawers?: string[];\n\n /** Selected tabs */\n selectedTabs?: string[];\n\n /** Any other page-specific state */\n [key: string]: any;\n };\n}\n\n/**\n * Format app context as markdown for display in bug reports, etc.\n */\nexport function formatAppContextAsMarkdown(context: AppContext | undefined): string {\n if (!context) {\n return '';\n }\n\n const lines: string[] = [];\n\n // Add page URL as clickable link if available\n if (context.pageUrl) {\n lines.push(`**Page**: [View in App](${context.pageUrl})`);\n } else if (context.appUri) {\n // Fallback to app URI if no pageUrl available\n lines.push(`**Page**: \\`${context.appUri}\\``);\n }\n\n // Add structured context\n if (context.pageState) {\n const { site, page, workflow, dataRecord, toolkit } = context.pageState;\n\n // Site info\n if (site) {\n const siteName = site.name || site.slug;\n lines.push(\n siteName ? `**Site**: ${siteName} (ID: \\`${site.id}\\`)` : `**Site ID**: \\`${site.id}\\``\n );\n }\n\n // Page info\n if (page) {\n const pageName = page.name || page.slug;\n lines.push(\n pageName ? `**Page**: ${pageName} (ID: \\`${page.id}\\`)` : `**Page ID**: \\`${page.id}\\``\n );\n }\n\n // Workflow info\n if (workflow) {\n const workflowName = workflow.name;\n lines.push(\n workflowName\n ? `**Workflow**: ${workflowName} (ID: \\`${workflow.id}\\`)`\n : `**Workflow ID**: \\`${workflow.id}\\``\n );\n\n // Selected task\n if (workflow.selectedTask) {\n const taskName = workflow.selectedTask.name;\n lines.push(\n taskName\n ? `**Selected Task**: ${taskName} (ID: \\`${workflow.selectedTask.id}\\`)`\n : `**Selected Task ID**: \\`${workflow.selectedTask.id}\\``\n );\n }\n }\n\n // Data record info\n if (dataRecord) {\n const recordName = dataRecord.name || dataRecord.type;\n lines.push(\n recordName\n ? `**Data Record**: ${recordName} (ID: \\`${dataRecord.id}\\`)`\n : `**Data Record ID**: \\`${dataRecord.id}\\``\n );\n }\n\n // Toolkit info\n if (toolkit) {\n lines.push(\n toolkit.name\n ? `**Toolkit**: ${toolkit.name} (ID: \\`${toolkit.id}\\`)`\n : `**Toolkit ID**: \\`${toolkit.id}\\``\n );\n }\n\n // Open drawers\n if (context.pageState.openDrawers && context.pageState.openDrawers.length > 0) {\n lines.push(`**Open Drawers**: ${context.pageState.openDrawers.join(', ')}`);\n }\n\n // Selected tabs\n if (context.pageState.selectedTabs && context.pageState.selectedTabs.length > 0) {\n lines.push(`**Selected Tabs**: ${context.pageState.selectedTabs.join(', ')}`);\n }\n }\n\n if (lines.length === 0) {\n return '';\n }\n\n return `### Context\\n\\n${lines.join('\\n')}`;\n}\n","import {\n AbilitiesApi,\n AccessGrantsApi,\n AgentTasksApi,\n AgentsApi,\n AIModelsApi,\n ApiKeysApi,\n AppsApi,\n AssignmentsApi,\n AuthApi,\n BuildersApi,\n CalendarsApi,\n CallsApi,\n CELApi,\n ChatsApi,\n ConfluenceApi,\n ConnectionSyncApi,\n CustomToolkitsApi,\n DashboardsApi,\n DataTypesApi,\n DevicesApi,\n DiscordBotsApi,\n SlackAppsApi,\n TeamsAppsApi,\n EventsApi,\n ExperimentsApi,\n FeaturesApi,\n FhirConnectionsApi,\n PatientSyncConnectionsApi,\n DocumoFaxApi,\n HealthieApi,\n HubspotApi,\n FilesApi,\n ProjectsApi,\n InboxesApi,\n InquiriesApi,\n JourneysApi,\n AppConnectionsApi,\n McpServersApi,\n MembersApi,\n ActivityApi,\n MotdApi,\n TrackedLinksApi,\n MondayIntegrationApi,\n InterventionRequestsApi,\n NotificationRulesApi,\n OAuthApi,\n OperatorApi,\n OrgApi,\n OAuthConnectionsApi,\n PhoneNumbersApi,\n PronunciationsApi,\n PersonasApi,\n MetricsApi,\n QueriesApi,\n QualificationsApi,\n ReportsApi,\n RoutingRulesApi,\n SalesforceApi,\n SitesApi,\n SubscriptionsApi,\n SupportRequestsApi,\n SupervisorsApi,\n TasksApi,\n TemplatesApi,\n ToolkitsApi,\n WorkflowsApi,\n WorkspaceInvitationsApi,\n CustomersApi,\n ResellersApi,\n VoiceApi,\n WorkspacesApi,\n} from '../api';\nimport { BundlesApi } from '../api/bundles';\nimport { InstallationsApi } from '../api/installations';\nimport { ResourceWorkflowsApi } from '../api/resource-workflows';\nimport { PromptsApi } from '../api/prompts';\nimport { WorkflowNotesApi } from '../api/workflow-notes';\n\nexport interface ApiModules {\n abilities: AbilitiesApi;\n accessGrants: AccessGrantsApi;\n agentTasks: AgentTasksApi;\n agents: AgentsApi;\n aiModels: AIModelsApi;\n apiKeys: ApiKeysApi;\n apps: AppsApi;\n assignments: AssignmentsApi;\n auth: AuthApi;\n builders: BuildersApi;\n bundles: BundlesApi;\n installations: InstallationsApi;\n calendars: CalendarsApi;\n calls: CallsApi;\n cel: CELApi;\n chats: ChatsApi;\n confluence: ConfluenceApi;\n customers: CustomersApi;\n resellers: ResellersApi;\n customToolkits: CustomToolkitsApi;\n dashboards: DashboardsApi;\n dataTypes: DataTypesApi;\n devices: DevicesApi;\n discordBots: DiscordBotsApi;\n slackApps: SlackAppsApi;\n teamsApps: TeamsAppsApi;\n events: EventsApi;\n experiments: ExperimentsApi;\n fhirConnections: FhirConnectionsApi;\n patientSyncConnections: PatientSyncConnectionsApi;\n healthie: HealthieApi;\n documoFax: DocumoFaxApi;\n hubspot: HubspotApi;\n features: FeaturesApi;\n files: FilesApi;\n projects: ProjectsApi;\n inboxes: InboxesApi;\n inquiries: InquiriesApi;\n journeys: JourneysApi;\n appConnections: AppConnectionsApi;\n connectionSync: ConnectionSyncApi;\n mcpServers: McpServersApi;\n members: MembersApi;\n activity: ActivityApi;\n motd: MotdApi;\n trackedLinks: TrackedLinksApi;\n mondayIntegration: MondayIntegrationApi;\n interventionRequests: InterventionRequestsApi;\n notificationRules: NotificationRulesApi;\n oauth: OAuthApi;\n operatorGroups: OperatorApi;\n org: OrgApi;\n oauthConnections: OAuthConnectionsApi;\n phoneNumbers: PhoneNumbersApi;\n pronunciations: PronunciationsApi;\n qualifications: QualificationsApi;\n personas: PersonasApi;\n metrics: MetricsApi;\n queries: QueriesApi;\n reports: ReportsApi;\n resourceWorkflows: ResourceWorkflowsApi;\n routingRules: RoutingRulesApi;\n salesforce: SalesforceApi;\n sites: SitesApi;\n subscriptions: SubscriptionsApi;\n supportRequests: SupportRequestsApi;\n supervisors: SupervisorsApi;\n tasks: TasksApi;\n templates: TemplatesApi;\n toolkits: ToolkitsApi;\n workflows: WorkflowsApi;\n workflowNotes: WorkflowNotesApi;\n workspaceInvitations: WorkspaceInvitationsApi;\n prompts: PromptsApi;\n voice: VoiceApi;\n workspaces: WorkspacesApi;\n}\n\nexport function createApiModules(\n apiKey: string | undefined,\n baseUrl: string,\n customFetch?: typeof fetch\n): ApiModules {\n return {\n abilities: new AbilitiesApi(apiKey, baseUrl, customFetch),\n accessGrants: new AccessGrantsApi(apiKey, baseUrl, customFetch),\n agentTasks: new AgentTasksApi(apiKey, baseUrl, customFetch),\n agents: new AgentsApi(apiKey, baseUrl, customFetch),\n aiModels: new AIModelsApi(apiKey, baseUrl, customFetch),\n apiKeys: new ApiKeysApi(apiKey, baseUrl, customFetch),\n apps: new AppsApi(apiKey, baseUrl, customFetch),\n assignments: new AssignmentsApi(apiKey, baseUrl, customFetch),\n auth: new AuthApi(apiKey, baseUrl, customFetch),\n builders: new BuildersApi(apiKey, baseUrl, customFetch),\n bundles: new BundlesApi(apiKey, baseUrl, customFetch),\n installations: new InstallationsApi(apiKey, baseUrl, customFetch),\n calendars: new CalendarsApi(apiKey, baseUrl, customFetch),\n calls: new CallsApi(apiKey, baseUrl, customFetch),\n cel: new CELApi(apiKey, baseUrl, customFetch),\n chats: new ChatsApi(apiKey, baseUrl, customFetch),\n customers: new CustomersApi(apiKey, baseUrl, customFetch),\n resellers: new ResellersApi(apiKey, baseUrl, customFetch),\n customToolkits: new CustomToolkitsApi(apiKey, baseUrl, customFetch),\n dashboards: new DashboardsApi(apiKey, baseUrl, customFetch),\n dataTypes: new DataTypesApi(apiKey, baseUrl, customFetch),\n devices: new DevicesApi(apiKey, baseUrl, customFetch),\n discordBots: new DiscordBotsApi(apiKey, baseUrl, customFetch),\n slackApps: new SlackAppsApi(apiKey, baseUrl, customFetch),\n teamsApps: new TeamsAppsApi(apiKey, baseUrl, customFetch),\n events: new EventsApi(apiKey, baseUrl, customFetch),\n experiments: new ExperimentsApi(apiKey, baseUrl, customFetch),\n fhirConnections: new FhirConnectionsApi(apiKey, baseUrl, customFetch),\n patientSyncConnections: new PatientSyncConnectionsApi(apiKey, baseUrl, customFetch),\n healthie: new HealthieApi(apiKey, baseUrl, customFetch),\n documoFax: new DocumoFaxApi(apiKey, baseUrl, customFetch),\n hubspot: new HubspotApi(apiKey, baseUrl, customFetch),\n features: new FeaturesApi(apiKey, baseUrl, customFetch),\n files: new FilesApi(apiKey, baseUrl, customFetch),\n projects: new ProjectsApi(apiKey, baseUrl, customFetch),\n inboxes: new InboxesApi(apiKey, baseUrl, customFetch),\n inquiries: new InquiriesApi(apiKey, baseUrl, customFetch),\n journeys: new JourneysApi(apiKey, baseUrl, customFetch),\n appConnections: new AppConnectionsApi(apiKey, baseUrl, customFetch),\n connectionSync: new ConnectionSyncApi(apiKey, baseUrl, customFetch),\n mcpServers: new McpServersApi(apiKey, baseUrl, customFetch),\n members: new MembersApi(apiKey, baseUrl, customFetch),\n activity: new ActivityApi(apiKey, baseUrl, customFetch),\n motd: new MotdApi(apiKey, baseUrl, customFetch),\n trackedLinks: new TrackedLinksApi(apiKey, baseUrl, customFetch),\n confluence: new ConfluenceApi(apiKey, baseUrl, customFetch),\n mondayIntegration: new MondayIntegrationApi(apiKey, baseUrl, customFetch),\n interventionRequests: new InterventionRequestsApi(apiKey, baseUrl, customFetch),\n notificationRules: new NotificationRulesApi(apiKey, baseUrl, customFetch),\n oauth: new OAuthApi(apiKey, baseUrl, customFetch),\n operatorGroups: new OperatorApi(apiKey, baseUrl, customFetch),\n org: new OrgApi(apiKey, baseUrl, customFetch),\n oauthConnections: new OAuthConnectionsApi(apiKey, baseUrl, customFetch),\n phoneNumbers: new PhoneNumbersApi(apiKey, baseUrl, customFetch),\n pronunciations: new PronunciationsApi(apiKey, baseUrl, customFetch),\n qualifications: new QualificationsApi(apiKey, baseUrl, customFetch),\n personas: new PersonasApi(apiKey, baseUrl, customFetch),\n metrics: new MetricsApi(apiKey, baseUrl, customFetch),\n queries: new QueriesApi(apiKey, baseUrl, customFetch),\n reports: new ReportsApi(apiKey, baseUrl, customFetch),\n resourceWorkflows: new ResourceWorkflowsApi(apiKey, baseUrl, customFetch),\n routingRules: new RoutingRulesApi(apiKey, baseUrl, customFetch),\n salesforce: new SalesforceApi(apiKey, baseUrl, customFetch),\n sites: new SitesApi(apiKey, baseUrl, customFetch),\n subscriptions: new SubscriptionsApi(apiKey, baseUrl, customFetch),\n supportRequests: new SupportRequestsApi(apiKey, baseUrl, customFetch),\n supervisors: new SupervisorsApi(apiKey, baseUrl, customFetch),\n tasks: new TasksApi(apiKey, baseUrl, customFetch),\n templates: new TemplatesApi(apiKey, baseUrl, customFetch),\n toolkits: new ToolkitsApi(apiKey, baseUrl, customFetch),\n workflows: new WorkflowsApi(apiKey, baseUrl, customFetch),\n workflowNotes: new WorkflowNotesApi(apiKey, baseUrl, customFetch),\n workspaceInvitations: new WorkspaceInvitationsApi(apiKey, baseUrl, customFetch),\n prompts: new PromptsApi(apiKey, baseUrl, customFetch),\n voice: new VoiceApi(apiKey, baseUrl, customFetch),\n workspaces: new WorkspacesApi(apiKey, baseUrl, customFetch),\n };\n}\n","import type { GravityRailClient } from './client';\n\ntype AnyFn = (...args: any[]) => any;\n\nexport const WORKSPACE_METHOD_NAMES = [\n 'activateWorkflowRevision',\n 'addEmailSenderAsMember',\n 'addGroupMember',\n 'advanceStep',\n 'approveWorkspaceInvitation',\n 'archiveAgent',\n 'archiveChat',\n 'archiveDataType',\n 'archiveJourney',\n 'archiveMember',\n 'archiveMemberByExternalId',\n 'archiveMemberRelationship',\n 'archivePersona',\n 'archivePhoneNumber',\n 'archiveStep',\n 'archiveTask',\n 'archiveWorkflow',\n 'authorizeMondayConnection',\n 'autoCreateDataTypeFromBoard',\n 'blockWorkspaceInvitation',\n 'bookHealthieAppointment',\n 'buildSiteSource',\n 'buildWorkspace',\n 'bulkCreateMembers',\n 'bulkLinkMembersToHubspot',\n 'bulkLinkMembersToMonday',\n 'bulkLinkMembersToSalesforce',\n 'cancelAgentTask',\n 'cancelAssignment',\n 'cancelCalendarEvent',\n 'cancelChatCallback',\n 'cancelCredentialUpdateInvite',\n 'checkAvailability',\n 'checkSiteDomainAvailability',\n 'checkSiteSlugAvailability',\n 'claimDevicePairing',\n 'clearConnectionMemberExclusion',\n 'clearTrackedLinkDestinations',\n 'clickWorkspaceSupportRequestResource',\n 'cloneDataType',\n 'cloneTask',\n 'cloneWorkflow',\n 'closeWorkspaceSupportRequest',\n 'commentOnWorkspaceSupportRequest',\n 'completeDiscordLink',\n 'configureConfluence',\n 'configureDocumoFax',\n 'configureHealthie',\n 'configurePatientSync',\n 'configureHubspot',\n 'configureMondayConnection',\n 'configureSalesforce',\n 'convertEmail',\n 'convertFile',\n 'createAbility',\n 'createAccessGrant',\n 'createAgent',\n 'createApiKey',\n 'createAssignment',\n 'bindInstallationSlots',\n 'restoreInstallationForm',\n 'createBundle',\n 'createCalendar',\n 'createCalendarEvent',\n 'createCalendarEventType',\n 'createCalendarSchedule',\n 'createChat',\n 'createChatInteractionSession',\n 'transitionChatInteractionSession',\n 'createChatCompletion',\n 'createChatFilter',\n 'createChatLabel',\n 'createClientWorkspace',\n 'createConnection',\n 'createContactPermission',\n 'createCustomTool',\n 'createCustomToolkit',\n 'createDashboard',\n 'createDataRecord',\n 'createDataRecordFilter',\n 'createDataType',\n 'createDiscordBot',\n 'createEventRule',\n 'createExperiment',\n 'createExperimentAssignment',\n 'createExperimentGroup',\n 'createFhirConnection',\n 'createFile',\n 'createFileLabel',\n 'createFolder',\n 'createGoal',\n 'createInbox',\n 'cloneJourneyAsV2',\n 'createJourney',\n 'createJourneyNote',\n 'createMcpServer',\n 'createMemberField',\n 'createMemberFilter',\n 'createMemberLabel',\n 'createMemberMemory',\n 'createMemberRelationship',\n 'createMemberRole',\n 'createMenuItem',\n 'createNotificationRule',\n 'createOperatorGroup',\n 'createPage',\n 'createPersona',\n 'createPhoneNumber',\n 'createProduct',\n 'createRoutine',\n 'createRoutingRule',\n 'createScenario',\n 'createSignup',\n 'createSite',\n 'createSiteSource',\n 'createSlackApp',\n 'createStep',\n 'createSupervisor',\n 'createTask',\n 'createTeamsApp',\n 'createTrackedLinkDestination',\n 'createWorkflow',\n 'createWorkflowContributor',\n 'createWorkflowFromTemplate',\n 'createWorkflowNote',\n 'createWorkflowOutboundVoiceChat',\n 'createWorkspaceMember',\n 'createWorkspaceSupportRequest',\n 'deleteAbility',\n 'deleteAgent',\n 'deleteAssignment',\n 'deleteCalendar',\n 'deleteCalendarEvent',\n 'deleteCalendarEventType',\n 'deleteCalendarSchedule',\n 'deleteChat',\n 'deleteChatFilter',\n 'deleteChatLabel',\n 'deleteClientWorkspace',\n 'deleteConfluence',\n 'deleteConnection',\n 'deleteCustomTool',\n 'deleteCustomToolkit',\n 'deleteDashboard',\n 'deleteDataRecord',\n 'deleteDataRecordFilter',\n 'deleteDataType',\n 'deleteDiscordBot',\n 'deleteEnrollment',\n 'deleteEventRule',\n 'deleteExperiment',\n 'deleteExperimentAssignment',\n 'deleteExperimentGroup',\n 'deleteFhirConnection',\n 'deletePatientSyncConnection',\n 'deleteFile',\n 'deleteFileLabel',\n 'deleteFolder',\n 'deleteGoal',\n 'deleteHubspot',\n 'deleteInbox',\n 'deleteJourneyDraft',\n 'deleteJourneyNote',\n 'deleteMcpServer',\n 'deleteMember',\n 'deleteMemberField',\n 'deleteMemberFilter',\n 'deleteMemberLabel',\n 'deleteMemberMemory',\n 'deleteMemberRole',\n 'deleteMenuItem',\n 'deleteMondayConnection',\n 'deleteNotificationRule',\n 'deleteOperatorGroup',\n 'deletePage',\n 'deletePersona',\n 'deletePlatformApp',\n 'deleteProduct',\n 'deleteRoutine',\n 'deleteRoutingRule',\n 'deleteSalesforce',\n 'deleteScenario',\n 'deleteSite',\n 'deleteSlackApp',\n 'deleteSupervisor',\n 'deleteTask',\n 'deleteTeamsApp',\n 'deleteTrackedLinkDestination',\n 'deleteWidgetDomain',\n 'deleteWorkflow',\n 'deleteWorkflowContributor',\n 'deleteWorkflowNote',\n 'deleteWorkspace',\n 'deleteWorkspaceInvitationAdmin',\n 'denyWorkspaceInvitation',\n 'describeSalesforceObject',\n 'diffWorkflowRevisions',\n 'disableConfluence',\n 'disableCustomToolkit',\n 'disableHubspot',\n 'disableMcpServer',\n 'disableMondayConnection',\n 'disableSalesforce',\n 'disconnectConfluence',\n 'disconnectHubspot',\n 'disconnectMondayConnection',\n 'disconnectSalesforce',\n 'discordLinkPreflight',\n 'discoverOAuthMetadata',\n 'dismissAllNotifications',\n 'dismissNotification',\n 'downloadEmailAttachment',\n 'downloadFileContents',\n 'downloadFilesZip',\n 'downloadSiteSourceZip',\n 'editWorkflowRevisionAsDraft',\n 'enableConfluence',\n 'enableCustomToolkit',\n 'enableHubspot',\n 'enableMcpServer',\n 'enableMondayConnection',\n 'enablePlatformApp',\n 'enableSalesforce',\n 'endTestChatRun',\n 'enrollMembers',\n 'evaluateTestChatRun',\n 'executeAssignmentTool',\n 'expireAnonymousMember',\n 'exportChat',\n 'exportChats',\n 'exportMembers',\n 'exportPhoneNumberOutboundAnalyticsCsv',\n 'exportWorkspace',\n 'exportWorkspaceZip',\n 'fetchVoicemailAudio',\n 'fhirBackfillEncounterSync',\n 'fhirCheckPatientLinks',\n 'fhirCreateEncounter',\n 'fhirCsvImportApply',\n 'fhirCsvImportInspect',\n 'fhirFetchCareTeam',\n 'fhirFetchEncounters',\n 'fhirGetCsvImportRunItems',\n 'fhirGetCsvImportRuns',\n 'fhirGetCsvImportSettings',\n 'fhirGetEncounterSyncRuns',\n 'fhirGetEncounterSyncStatus',\n 'fhirImportPatient',\n 'fhirLinkMember',\n 'fhirListLinkedMembers',\n 'fhirRefreshEncounterPatient',\n 'fhirRunEncounterSync',\n 'fhirSearchLocations',\n 'fhirSearchPatients',\n 'fhirSearchPractitioners',\n 'fhirSyncMember',\n 'fhirUnlinkMember',\n 'fhirUpdateCsvImportSettings',\n 'fhirUpdateEncounterSync',\n 'findOrCreateDMChat',\n 'generateFileUploadUrl',\n 'generateICalToken',\n 'generateSiteMediaUploadUrl',\n 'getAIUsageReport',\n 'getAbilityType',\n 'getAbilityTypes',\n 'getAccessGrant',\n 'getAccessGrants',\n 'getAgent',\n 'getAgentModeAttention',\n 'getAgentTask',\n 'getAgentTaskMessages',\n 'getAgentTasks',\n 'getAgents',\n 'getAnonymousResolution',\n 'getAnonymousFormSubmission',\n 'getAnonymousResolutions',\n 'getApiKeys',\n 'getArchiveBlockers',\n 'getAssignment',\n 'getAssignmentCelContext',\n 'getAssignmentMessages',\n 'getAssignmentTask',\n 'getAssignmentTaskDetail',\n 'getAssignmentTools',\n 'getAssignments',\n 'getAvailableActions',\n 'getAvailablePhoneNumbers',\n 'getAvailableSlots',\n 'getInstallation',\n 'getInstallationReadiness',\n 'getThemeSettingsSchema',\n 'getBundleDraft',\n 'getBundle',\n 'getBundleVersion',\n 'getBusinessHoursStatus',\n 'getCalendar',\n 'getCalendarEvent',\n 'getCalendarEventType',\n 'getCalendarEventTypes',\n 'getCalendarEvents',\n 'getCalendarSchedules',\n 'getCalendars',\n 'getCallRecordingDownloadUrl',\n 'getCelContext',\n 'getCharlestonTestDeliveryRecipients',\n 'getChat',\n 'getChatByUuid',\n 'getChatAssignmentTasks',\n 'getChatBrowserLiveView',\n 'saveChatBrowserStorage',\n 'clearChatBrowserStorage',\n 'getChatCallbacks',\n 'getChatEhrWritebackOutcomes',\n 'getChatEmails',\n 'getChatFilter',\n 'getChatFilterByUuid',\n 'getChatFilterCount',\n 'getChatFilters',\n 'getChatLabel',\n 'getChatLabelByUuid',\n 'getChatLabels',\n 'getChatMachineResources',\n 'getChatMessages',\n 'getChatModelOverride',\n 'getChatPhoneCalls',\n 'getChatSkills',\n 'getManagerSkills',\n 'getChatTodos',\n 'getChatTokenUsage',\n 'getChatToolCallMessages',\n 'getChatTools',\n 'getChats',\n 'getChatsDailyCreationStats',\n 'getChatsNeedsResponse',\n 'getChildThreadMessages',\n 'getClientWorkspace',\n 'getConfigurationHealth',\n 'getConfluenceStatus',\n 'getConnectionSyncCapabilities',\n 'getConnectionSyncCheckpoint',\n 'getConnectionSyncConfig',\n 'getCredentialUpdateInvites',\n 'getCurrentMember',\n 'clearMemberWorkflowVoice',\n 'getMemberWorkflowVoices',\n 'getMyDataTypes',\n 'getMyRecords',\n 'setMemberWorkflowVoice',\n 'getCurrentSmsChat',\n 'getCustomToolkit',\n 'getCustomToolkits',\n 'getDashboard',\n 'getDashboardChannelStats',\n 'getDashboardWorkflowAssignmentStats',\n 'getDashboards',\n 'getDataRecord',\n 'getDataRecordByUuid',\n 'getDataRecordChanges',\n 'getDataRecordFilter',\n 'getDataRecordFilterCount',\n 'getDataRecordFilters',\n 'getDataRecords',\n 'getDataType',\n 'getDataTypeDraft',\n 'getDataTypeVersions',\n 'getDataTypeByUuid',\n 'getDataTypeBySlug',\n 'getDataTypes',\n 'getDevice',\n 'getDeviceKinds',\n 'getDevices',\n 'getDiscordBot',\n 'getDiscordBotAccounts',\n 'getDiscordBotByUuid',\n 'getDiscordBots',\n 'getDiscordGuilds',\n 'getDiscordThreads',\n 'getDocumoFaxSetup',\n 'listDocumoFaxes',\n 'getDocumoFaxStatus',\n 'getEnrollmentStatusLog',\n 'getEventRule',\n 'getEventRules',\n 'getExperiment',\n 'getExperimentStats',\n 'getExperiments',\n 'getFhirConnection',\n 'getFhirConnectionByUuid',\n 'getFhirConnections',\n 'getFieldIndexStatus',\n 'getFile',\n 'getMondayBoardColumns',\n 'getMondayBoardGroups',\n 'getMondayBoards',\n 'getMondayCurrentUserInfo',\n 'getMotd',\n 'getPhoneNumberOutboundAnalyticsCalls',\n 'getPhoneNumberOutboundAnalyticsSummary',\n 'getQueryFields',\n 'getSiteSharing',\n 'getSiteSource',\n 'getSiteSourceTemplates',\n 'getThemeSettings',\n 'importSiteSourceZip',\n 'installDocumoFax',\n 'listChatRecordings',\n 'previewQuery',\n 'publishSiteSource',\n 'publishDataTypeDraft',\n 'saveDataTypeDraft',\n 'queryWorkspaceActivity',\n 'queryWorkspaceActivityLatestSubjects',\n 'queryWorkspaceActivityOpenItems',\n 'queryWorkspaceActivityOneView',\n 'queryWorkspaceActivityDigest',\n 'registerDiscordSlashCommands',\n 'reopenWorkspaceSupportRequest',\n 'resolveEntityRefs',\n 'resetSiteSource',\n 'resolveFilePath',\n 'getFileLabel',\n 'getFileLabelByUuid',\n 'getFileLabels',\n 'getFileSharing',\n 'getFileVersionContentsUrl',\n 'getFileVersionDiff',\n 'getFiles',\n 'getFirstRunState',\n 'getFolder',\n 'getFolderMemberAccess',\n 'getFolderSharing',\n 'getFolders',\n 'getGoogleCalendarStatus',\n 'getGranteeGrants',\n 'getHealthieAvailableSlots',\n 'getHealthieReconciliationMatches',\n 'getHealthieStatus',\n 'getPatientSyncStatus',\n 'getHubspotContactProperties',\n 'getHubspotManagedRules',\n 'getHubspotReconciliationMatches',\n 'getHubspotStatus',\n 'getHubspotSyncLogs',\n 'getHubspotTransformPresets',\n 'getICalFeedUrl',\n 'getImportSkippedRules',\n 'getImportReadiness',\n 'rebuildImportSkippedRules',\n 'getInbox',\n 'getInboxEmail',\n 'getInboxEmails',\n 'getInboxThreads',\n 'getInboxes',\n 'getInterventionRequests',\n 'getJourney',\n 'getJourneyAuthoring',\n 'getJourneyFilterOptions',\n 'getJourneyHealth',\n 'getJourneyMembers',\n 'getJourneyNotes',\n 'getJourneyV2Validation',\n 'getJourneys',\n 'getLinkablePhones',\n 'getLinkedHealthieMembers',\n 'getLinkedHubspotMembers',\n 'getLinkedMondayMembers',\n 'getLinkedRecords',\n 'getLinkedSalesforceMembers',\n 'getLiveOperators',\n 'getMcpServer',\n 'getMcpServerPrompts',\n 'getMcpServerResources',\n 'getMcpServerTools',\n 'getMcpServers',\n 'getMemberByUuid',\n 'getMemberExperiments',\n 'getMemberFieldDefinitions',\n 'getMemberFields',\n 'getMemberFilter',\n 'getMemberFilterCount',\n 'getMemberFilters',\n 'getMemberGrants',\n 'getMemberJourneys',\n 'getMemberLabel',\n 'getMemberLabelByUuid',\n 'getMemberLabels',\n 'getMemberMemories',\n 'getMemberMemory',\n 'getMemberRecordCounts',\n 'getMemberRelationships',\n 'getMemberRole',\n 'getMemberRoleCleanupPlan',\n 'getMemberRoleByUuid',\n 'getMemberRoles',\n 'getMemberSyncLinks',\n 'getMemberSyncSummary',\n 'getMemberUsage',\n 'getMembersMessageActivity',\n 'getMenuItems',\n 'getMessageTiming',\n 'getMondayConnectionBoardColumns',\n 'getMondayConnectionBoardGroups',\n 'getMondayConnectionBoards',\n 'getMondayConnectionStatus',\n 'getMondayReconciliationMatches',\n 'getMondaySyncConfig',\n 'getMondaySyncLogs',\n 'getMyCredentials',\n 'getMyGivenGrants',\n 'getMyReceivedGrants',\n 'getNotification',\n 'getNotificationRules',\n 'getNotifications',\n 'getOperatorChatMessages',\n 'getOperatorGroup',\n 'getOperatorGroups',\n 'getOrCreateQualificationForWorkflow',\n 'getPage',\n 'getPageBySlug',\n 'getPersona',\n 'getPhoneCalls',\n 'getPhoneNumber',\n 'getPhoneNumberCalls',\n 'getPhoneNumberFaxes',\n 'getPhoneNumberMessages',\n 'getPhoneNumberVoicemails',\n 'getPhoneNumbers',\n 'getPhoneUsageReport',\n 'getPlatformApp',\n 'getPlan',\n 'getPresenceStatus',\n 'getProducts',\n 'getProject',\n 'getProjects',\n 'getPublicFile',\n 'getPublicFolder',\n 'getPublicFolderFiles',\n 'getPublicProducts',\n 'getQualification',\n 'getQualifications',\n 'getRecordingInfo',\n 'getResellerWorkspaces',\n 'getRoutine',\n 'getRoutineConfigEvents',\n 'getRoutineRuns',\n 'getRoutines',\n 'getRoutingRule',\n 'getRoutingRules',\n 'getRuleExecutions',\n 'getSMSUsageReport',\n 'getSalesforceReconciliationMatches',\n 'getSalesforceStatus',\n 'getSalesforceSyncConfig',\n 'getSalesforceSyncLogs',\n 'getScenario',\n 'getSite',\n 'getSiteByUuid',\n 'getSiteCounts',\n 'getSiteMenu',\n 'getSitePages',\n 'getSiteRenderedMenu',\n 'getSiteRenderedPage',\n 'getSites',\n 'getSlackApp',\n 'getSlackAppAccounts',\n 'getSlackApps',\n 'getSlackInstallations',\n 'getSlackThreads',\n 'getStepMemberCounts',\n 'getStepMembers',\n 'getSupervisor',\n 'getSupervisors',\n 'getSyncRunItems',\n 'getSyncRuns',\n 'getTask',\n 'getTaskChats',\n 'getTasks',\n 'getTeamsApp',\n 'getTeamsAppAccounts',\n 'getTeamsApps',\n 'getTeamsConversations',\n 'getTeamsInstallations',\n 'getTemplateContext',\n 'getTestChatRun',\n 'getThreadEmails',\n 'getTool',\n 'getToolCallNames',\n 'getToolkits',\n 'getTrackedLinkDestinations',\n 'getTrackedLinkStats',\n 'getTrackedLinkSummary',\n 'getTrackedLinkTimeseries',\n 'getUnreadNotificationCount',\n 'getUsageDashboard',\n 'getVariableRegistry',\n 'getVoiceUsageReport',\n 'getWebhookLogs',\n 'getWorkflow',\n 'getWorkflowOpeningTurnConversionReport',\n 'getWorkflowActivity',\n 'getWorkflowConfigValidation',\n 'getWorkflowFeedback',\n 'getWorkflowContributors',\n 'getWorkflowDeletionPreview',\n 'getWorkflowDiagram',\n 'getWorkflowNotes',\n 'getWorkflowRevision',\n 'getWorkflowRevisions',\n 'getWorkflowTaskAssignmentStats',\n 'getWorkflowTemplates',\n 'getWorkflowThumbnailUrl',\n 'getWorkflows',\n 'getWorkflowsActivityBatch',\n 'getWorkspace',\n 'getWorkspaceActivityCounts',\n 'getWorkspaceBuilder',\n 'getWorkspaceBuilders',\n 'getWorkspaceCounts',\n 'getWorkspaceDefaults',\n 'getWorkspaceEmailDomains',\n 'getWorkspaceMember',\n 'getWorkspaceMembers',\n 'getWorkspaceNotices',\n 'getWorkspaceProduct',\n 'getWorkspaceSiteDomains',\n 'getWorkspaceWidgetDomains',\n 'getWorkspaceSubscriptions',\n 'getWorkspaceSupportRequest',\n 'getWorkspaceThemes',\n 'installBundle',\n 'grantBundle',\n 'importFromBoard',\n 'importHubspotMembers',\n 'importMembers',\n 'importSalesforceMembers',\n 'importWorkspace',\n 'importWorkspaceZip',\n 'initiateOutboundCall',\n 'inspectPrompt',\n 'installHubspot',\n 'installDocumoFax',\n 'installMondayConnection',\n 'installSalesforce',\n 'inviteMemberCredentialUpdate',\n 'inviteToWorkspace',\n 'leaveWorkspace',\n 'linkCalendarToGoogle',\n 'linkCalendarToHealthie',\n 'linkMemberToHealthie',\n 'linkMemberToHubspot',\n 'linkMemberToMonday',\n 'linkMemberToSalesforce',\n 'linkPhoneNumber',\n 'linkUnlinkedSalesforceMembersByIdentity',\n 'listAbilities',\n 'listAnonymousFormSubmissions',\n 'listAppConnections',\n 'listAvailableAppConnections',\n 'listInstallations',\n 'listBundleGrants',\n 'listBundleVersions',\n 'listBundles',\n 'listBundleWorkflowCandidates',\n 'updateBundle',\n 'listBundleInstallations',\n 'listConfluencePages',\n 'listConfluenceSpaces',\n 'listConnectionMemberFieldKeys',\n 'listContactPermissions',\n 'revokeBundleGrant',\n 'rollbackSiteSource',\n 'rotateDocumoFaxCredentials',\n 'runQuery',\n 'sendMemberPhoneConfirmation',\n 'setDefaultGooglePlatformAccount',\n 'listFileVersions',\n 'listGoogleCalendars',\n 'listHealthieAppointmentTypes',\n 'listHealthiePatients',\n 'listHealthieProviders',\n 'listPersonas',\n 'listMetrics',\n 'getMetric',\n 'createMetric',\n 'updateMetric',\n 'deleteMetric',\n 'listMetricObservations',\n 'getMetricSeries',\n 'computeChatMetrics',\n 'listPushSubscriptions',\n 'listResourceWorkflows',\n 'getResourceWorkflow',\n 'getResourceWorkflowRevision',\n 'listSalesforceObjects',\n 'listScenarioHealthSummaries',\n 'listScenarios',\n 'listTestChatRuns',\n 'listWidgetDomains',\n 'listWorkspaceInvitationsAdmin',\n 'listWorkspaceSupportRequests',\n 'markEmailAsRead',\n 'markEmailAsUnread',\n 'markNotificationAsRead',\n 'mergeMemberRoles',\n 'previewEmailReply',\n 'previewImportMembers',\n 'previewMemberWorkflowVoice',\n 'previewRenameFieldSlug',\n 'previewImportWorkspace',\n 'previewInboxEmail',\n 'preflightBundleInstallation',\n 'previewRoutineVoiceReadiness',\n 'previewSchedule',\n 'previewRoutingRule',\n 'previewTTS',\n 'previewTemplate',\n 'previewThinkingSound',\n 'previewWorkspaceImport',\n 'previewWorkspaceImportZip',\n 'provisionClientWorkspace',\n 'previewInstallationUpgrade',\n 'publishBundle',\n 'publishWorkflowRevision',\n 'putJourneyDraft',\n 'putJourneyV2Definition',\n 'rateMessage',\n 'getChatFeedback',\n 'reenrollMember',\n 'renameFieldSlug',\n 'registerLinkedRolesMetadata',\n 'registerPushSubscription',\n 'reindexFolder',\n 'releasePhoneNumber',\n 'reorderRoutingRules',\n 'removeFileRole',\n 'removeFolderRole',\n 'removeGroupMember',\n 'reorderEventRules',\n 'reorderMenuItems',\n 'reconcileInstallation',\n 'setInstallationPolicy',\n 'upgradeInstallation',\n 'replaceBundleDraft',\n 'replyToEmail',\n 'rotateDocumoFaxCredentials',\n 'requestPhoneNumber',\n 'requestWorkspaceMembership',\n 'resetRoutineRuns',\n 'resolveAccessGrant',\n 'resolveAnonymousMember',\n 'resolveInterventionRequest',\n 'restoreFileVersion',\n 'revokeAccessGrant',\n 'revokeApiKey',\n 'revokeDevice',\n 'revokeICalToken',\n 'runRoutine',\n 'searchEventRules',\n 'searchFolder',\n 'searchHubspotRecords',\n 'searchSalesforceRecords',\n 'selectCurrentAssignmentTask',\n 'sendAssistantMessage',\n 'sendChatMessage',\n 'sendInboxEmail',\n 'sendOperatorMessage',\n 'siteGoogleOAuthInitiate',\n 'siteSendEmailCode',\n 'siteSendPhoneCode',\n 'siteSignup',\n 'siteVerifyCode',\n 'skipStep',\n 'startConfluenceOAuth',\n 'startHubspotOAuth',\n 'startSalesforceOAuth',\n 'startSyncRun',\n 'startTestChatRun',\n 'summarizeChat',\n 'syncCalendarWithGoogle',\n 'syncCalendarWithHealthie',\n 'testFhirConnection',\n 'testMcpServerConnection',\n 'testMondayConnection',\n 'testRunJourney',\n 'testWebhook',\n 'toggleFieldIndex',\n 'unarchiveAgent',\n 'unarchiveChat',\n 'unarchiveDataType',\n 'unarchiveMember',\n 'unarchiveMemberByExternalId',\n 'unarchivePersona',\n 'unarchiveStep',\n 'unarchiveTask',\n 'unarchiveWorkflow',\n 'unenrollMembers',\n 'unlinkCalendarFromGoogle',\n 'unlinkCalendarFromHealthie',\n 'unlinkCredential',\n 'unlinkMemberFromHealthie',\n 'unlinkMemberFromHubspot',\n 'unlinkMemberFromMonday',\n 'unlinkMemberFromSalesforce',\n 'unregisterPushSubscription',\n 'updateAbility',\n 'updateAgent',\n 'updateAssignment',\n 'updateCalendar',\n 'updateCalendarEvent',\n 'updateCalendarEventType',\n 'updateCalendarSchedule',\n 'updateChat',\n 'updateChatFilter',\n 'updateChatLabel',\n 'updateChatModelOverride',\n 'updateChatMute',\n 'updateClientWorkspace',\n 'updateConnection',\n 'updateConnectionSyncConfig',\n 'updateCurrentMember',\n 'updateCustomTool',\n 'updateCustomToolkit',\n 'updateDashboard',\n 'updateDataRecord',\n 'updateDataRecordFilter',\n 'updateDataType',\n 'updateDevice',\n 'updateDiscordBot',\n 'updateEventAttendee',\n 'updateEventRule',\n 'updateExperiment',\n 'updateExperimentAssignment',\n 'updateExperimentGroup',\n 'updateFhirConnection',\n 'updateFile',\n 'updateFileLabel',\n 'updateFileRoles',\n 'updateFileSharing',\n 'updateFirstRunState',\n 'updateFolder',\n 'updateFolderRoles',\n 'updateFolderSharing',\n 'updateGoal',\n 'updateInbox',\n 'updateJourney',\n 'updateJourneyNote',\n 'updateMcpServer',\n 'updateMember',\n 'updateMemberByExternalId',\n 'updateMemberField',\n 'updateMemberFilter',\n 'updateMemberLabel',\n 'updateMemberRole',\n 'updateMenuItem',\n 'updateMondaySyncConfig',\n 'updateNotificationRule',\n 'updateOperatorGroup',\n 'updatePage',\n 'updatePersona',\n 'updatePhoneNumber',\n 'updatePlatformApp',\n 'updatePlan',\n 'updateProduct',\n 'updateProject',\n 'updateRoutine',\n 'updateRoutingRule',\n 'updateSalesforceSyncConfig',\n 'resyncSalesforceLinkedMembers',\n 'updateScenario',\n 'updateSite',\n 'updateSiteSharing',\n 'updateSlackApp',\n 'updateStep',\n 'updateSupervisor',\n 'updateTask',\n 'updateTeamsApp',\n 'updateThemeSettings',\n 'updateTrackedLinkDestination',\n 'uploadFile',\n 'updateVoicemailStatus',\n 'updateWorkflow',\n 'convertWorkflowStartTaskOpeningMessage',\n 'updateWorkflowContributor',\n 'updateWorkflowNote',\n 'updateWorkflowRevisionMetadata',\n 'updateWorkspace',\n 'updateWorkspaceDefaults',\n 'updateWorkspaceInvitationAdmin',\n 'upsertDataRecord',\n 'upsertWidgetDomain',\n 'validateCelExpression',\n 'validateDataTypeSlug',\n 'validateQuery',\n 'validateWorkflowName',\n 'verifyDocumoFax',\n] as const;\n\nconst WORKSPACE_METHOD_NAME_SET = new Set<string>(WORKSPACE_METHOD_NAMES);\n\ntype WorkspaceMethodName = (typeof WORKSPACE_METHOD_NAMES)[number];\ntype WorkspaceMethodKey = Extract<WorkspaceMethodName, keyof GravityRailClient>;\n\ntype WorkspaceBoundMethod<T> = T extends (workspaceUuid: string, ...args: infer Args) => infer R\n ? (...args: Args) => R\n : never;\n\nexport type GravityRailWorkspaceClient = {\n readonly root: GravityRailClient;\n readonly workspaceUuid: string;\n} & {\n [K in WorkspaceMethodKey]: WorkspaceBoundMethod<GravityRailClient[K]>;\n};\n\nexport function createWorkspaceClient(\n root: GravityRailClient,\n workspaceUuid: string\n): GravityRailWorkspaceClient {\n return new Proxy(\n { root, workspaceUuid },\n {\n get(target, prop, receiver) {\n if (prop in target) return Reflect.get(target, prop, receiver);\n if (typeof prop !== 'string' || !WORKSPACE_METHOD_NAME_SET.has(prop)) {\n return undefined;\n }\n\n const value = (root as unknown as Record<PropertyKey, unknown>)[prop];\n if (typeof value !== 'function') return undefined;\n return (...args: unknown[]) => (value as AnyFn).call(root, workspaceUuid, ...args);\n },\n }\n ) as GravityRailWorkspaceClient;\n}\n","import { AccessGrantsApi } from '../../api';\n\nexport interface AccessGrantsBindings {\n getMyReceivedGrants: AccessGrantsApi['getMyReceivedGrants'];\n getMyGivenGrants: AccessGrantsApi['getMyGivenGrants'];\n getAccessGrant: AccessGrantsApi['getAccessGrant'];\n createAccessGrant: AccessGrantsApi['createAccessGrant'];\n resolveAccessGrant: AccessGrantsApi['resolveAccessGrant'];\n revokeAccessGrant: AccessGrantsApi['revokeAccessGrant'];\n getAccessGrants: AccessGrantsApi['getAccessGrants'];\n getMemberGrants: AccessGrantsApi['getMemberGrants'];\n getGranteeGrants: AccessGrantsApi['getGranteeGrants'];\n}\n\nexport function bindAccessGrantsMethods(\n target: AccessGrantsBindings,\n accessGrants: AccessGrantsApi\n): void {\n target.getMyReceivedGrants = accessGrants.getMyReceivedGrants.bind(accessGrants);\n target.getMyGivenGrants = accessGrants.getMyGivenGrants.bind(accessGrants);\n target.getAccessGrant = accessGrants.getAccessGrant.bind(accessGrants);\n target.createAccessGrant = accessGrants.createAccessGrant.bind(accessGrants);\n target.resolveAccessGrant = accessGrants.resolveAccessGrant.bind(accessGrants);\n target.revokeAccessGrant = accessGrants.revokeAccessGrant.bind(accessGrants);\n target.getAccessGrants = accessGrants.getAccessGrants.bind(accessGrants);\n target.getMemberGrants = accessGrants.getMemberGrants.bind(accessGrants);\n target.getGranteeGrants = accessGrants.getGranteeGrants.bind(accessGrants);\n}\n","import { InterventionRequestsApi } from '../../api';\n\nexport interface InterventionRequestsBindings {\n getAgentModeAttention: InterventionRequestsApi['getAgentModeAttention'];\n getInterventionRequests: InterventionRequestsApi['getInterventionRequests'];\n resolveInterventionRequest: InterventionRequestsApi['resolveInterventionRequest'];\n}\n\nexport function bindInterventionRequestsMethods(\n target: InterventionRequestsBindings,\n interventionRequests: InterventionRequestsApi\n): void {\n target.getAgentModeAttention =\n interventionRequests.getAgentModeAttention.bind(interventionRequests);\n target.getInterventionRequests =\n interventionRequests.getInterventionRequests.bind(interventionRequests);\n target.resolveInterventionRequest =\n interventionRequests.resolveInterventionRequest.bind(interventionRequests);\n}\n","import { AgentTasksApi } from '../../api/agent-tasks';\n\nexport interface AgentTasksBindings {\n getAgentTasks: AgentTasksApi['getAgentTasks'];\n getAgentTask: AgentTasksApi['getAgentTask'];\n cancelAgentTask: AgentTasksApi['cancelAgentTask'];\n getAgentTaskMessages: AgentTasksApi['getAgentTaskMessages'];\n}\n\nexport function bindAgentTasksMethods(target: AgentTasksBindings, api: AgentTasksApi): void {\n target.getAgentTasks = api.getAgentTasks.bind(api);\n target.getAgentTask = api.getAgentTask.bind(api);\n target.cancelAgentTask = api.cancelAgentTask.bind(api);\n target.getAgentTaskMessages = api.getAgentTaskMessages.bind(api);\n}\n","import { AgentsApi } from '../../api';\n\nexport interface AgentsBindings {\n getAgents: AgentsApi['getAgents'];\n getAgent: AgentsApi['getAgent'];\n createAgent: AgentsApi['createAgent'];\n updateAgent: AgentsApi['updateAgent'];\n deleteAgent: AgentsApi['deleteAgent'];\n archiveAgent: AgentsApi['archiveAgent'];\n unarchiveAgent: AgentsApi['unarchiveAgent'];\n}\n\nexport function bindAgentsMethods(target: AgentsBindings, agents: AgentsApi): void {\n target.getAgents = agents.getAgents.bind(agents);\n target.getAgent = agents.getAgent.bind(agents);\n target.createAgent = agents.createAgent.bind(agents);\n target.updateAgent = agents.updateAgent.bind(agents);\n target.deleteAgent = agents.deleteAgent.bind(agents);\n target.archiveAgent = agents.archiveAgent.bind(agents);\n target.unarchiveAgent = agents.unarchiveAgent.bind(agents);\n}\n","import { TasksApi } from '../../api';\nimport { AbilitiesApi } from '../../api';\n\nexport interface TasksBindings {\n // Tasks API\n getTasks: TasksApi['getTasks'];\n getTask: TasksApi['getTask'];\n createTask: TasksApi['createTask'];\n updateTask: TasksApi['updateTask'];\n deleteTask: TasksApi['deleteTask'];\n archiveTask: TasksApi['archiveTask'];\n unarchiveTask: TasksApi['unarchiveTask'];\n cloneTask: TasksApi['cloneTask'];\n\n // Abilities API: registry introspection + workflow/task-scoped instance CRUD\n getAbilityTypes: AbilitiesApi['getAbilityTypes'];\n getAbilityType: AbilitiesApi['getAbilityType'];\n listAbilities: AbilitiesApi['listAbilities'];\n createAbility: AbilitiesApi['createAbility'];\n updateAbility: AbilitiesApi['updateAbility'];\n deleteAbility: AbilitiesApi['deleteAbility'];\n getCharlestonTestDeliveryRecipients: AbilitiesApi['getCharlestonTestDeliveryRecipients'];\n}\n\nexport function bindTasksMethods(\n target: TasksBindings,\n tasks: TasksApi,\n abilities: AbilitiesApi\n): void {\n // Tasks API\n target.getTasks = tasks.getTasks.bind(tasks);\n target.getTask = tasks.getTask.bind(tasks);\n target.createTask = tasks.createTask.bind(tasks);\n target.updateTask = tasks.updateTask.bind(tasks);\n target.deleteTask = tasks.deleteTask.bind(tasks);\n target.archiveTask = tasks.archiveTask.bind(tasks);\n target.unarchiveTask = tasks.unarchiveTask.bind(tasks);\n target.cloneTask = tasks.cloneTask.bind(tasks);\n\n // Abilities API: registry introspection + workflow/task-scoped instance CRUD\n target.getAbilityTypes = abilities.getAbilityTypes.bind(abilities);\n target.getAbilityType = abilities.getAbilityType.bind(abilities);\n target.listAbilities = abilities.listAbilities.bind(abilities);\n target.createAbility = abilities.createAbility.bind(abilities);\n target.updateAbility = abilities.updateAbility.bind(abilities);\n target.deleteAbility = abilities.deleteAbility.bind(abilities);\n target.getCharlestonTestDeliveryRecipients =\n abilities.getCharlestonTestDeliveryRecipients.bind(abilities);\n}\n","import { ChatsApi } from '../../api';\n\nexport interface ChatsBindings {\n // Chats API\n createChatInteractionSession: ChatsApi['createChatInteractionSession'];\n transitionChatInteractionSession: ChatsApi['transitionChatInteractionSession'];\n getChats: ChatsApi['getChats'];\n getChat: ChatsApi['getChat'];\n getChatByUuid: ChatsApi['getChatByUuid'];\n saveChatBrowserStorage: ChatsApi['saveChatBrowserStorage'];\n clearChatBrowserStorage: ChatsApi['clearChatBrowserStorage'];\n getChatBrowserLiveView: ChatsApi['getChatBrowserLiveView'];\n getChatMachineResources: ChatsApi['getChatMachineResources'];\n getCurrentSmsChat: ChatsApi['getCurrentSmsChat'];\n getChatCallbacks: ChatsApi['getChatCallbacks'];\n getChatEhrWritebackOutcomes: ChatsApi['getChatEhrWritebackOutcomes'];\n cancelChatCallback: ChatsApi['cancelChatCallback'];\n getChatTokenUsage: ChatsApi['getChatTokenUsage'];\n getChatTodos: ChatsApi['getChatTodos'];\n getChatSkills: ChatsApi['getChatSkills'];\n getManagerSkills: ChatsApi['getManagerSkills'];\n getChatsNeedsResponse: ChatsApi['getChatsNeedsResponse'];\n getChatsDailyCreationStats: ChatsApi['getChatsDailyCreationStats'];\n getToolCallNames: ChatsApi['getToolCallNames'];\n archiveChat: ChatsApi['archiveChat'];\n unarchiveChat: ChatsApi['unarchiveChat'];\n createChat: ChatsApi['createChat'];\n createWorkflowOutboundVoiceChat: ChatsApi['createWorkflowOutboundVoiceChat'];\n deleteChat: ChatsApi['deleteChat'];\n updateChat: ChatsApi['updateChat'];\n getChatModelOverride: ChatsApi['getChatModelOverride'];\n updateChatModelOverride: ChatsApi['updateChatModelOverride'];\n updateChatMute: ChatsApi['updateChatMute'];\n summarizeChat: ChatsApi['summarizeChat'];\n getChatMessages: ChatsApi['getChatMessages'];\n getChildThreadMessages: ChatsApi['getChildThreadMessages'];\n getChatToolCallMessages: ChatsApi['getChatToolCallMessages'];\n getChatTools: ChatsApi['getChatTools'];\n initiateOutboundCall: ChatsApi['initiateOutboundCall'];\n sendAssistantMessage: ChatsApi['sendAssistantMessage'];\n rateMessage: ChatsApi['rateMessage'];\n getChatFeedback: ChatsApi['getChatFeedback'];\n getChatAssignmentTasks: ChatsApi['getChatAssignmentTasks'];\n createChatCompletion: ChatsApi['createChatCompletion'];\n exportChats: ChatsApi['exportChats'];\n exportChat: ChatsApi['exportChat'];\n findOrCreateDMChat: ChatsApi['findOrCreateDMChat'];\n sendChatMessage: ChatsApi['sendChatMessage'];\n getChatPhoneCalls: ChatsApi['getChatPhoneCalls'];\n // Chat Labels API\n getChatLabels: ChatsApi['getChatLabels'];\n getChatLabel: ChatsApi['getChatLabel'];\n getChatLabelByUuid: ChatsApi['getChatLabelByUuid'];\n createChatLabel: ChatsApi['createChatLabel'];\n updateChatLabel: ChatsApi['updateChatLabel'];\n deleteChatLabel: ChatsApi['deleteChatLabel'];\n // Chat Filters API\n getChatFilters: ChatsApi['getChatFilters'];\n getChatFilter: ChatsApi['getChatFilter'];\n getChatFilterByUuid: ChatsApi['getChatFilterByUuid'];\n createChatFilter: ChatsApi['createChatFilter'];\n updateChatFilter: ChatsApi['updateChatFilter'];\n deleteChatFilter: ChatsApi['deleteChatFilter'];\n getChatFilterCount: ChatsApi['getChatFilterCount'];\n}\n\nexport function bindChatsMethods(target: ChatsBindings, chats: ChatsApi): void {\n // Chats API\n target.createChatInteractionSession = chats.createChatInteractionSession.bind(chats);\n target.transitionChatInteractionSession = chats.transitionChatInteractionSession.bind(chats);\n target.getChats = chats.getChats.bind(chats);\n target.getChat = chats.getChat.bind(chats);\n target.getChatByUuid = chats.getChatByUuid.bind(chats);\n target.saveChatBrowserStorage = chats.saveChatBrowserStorage.bind(chats);\n target.clearChatBrowserStorage = chats.clearChatBrowserStorage.bind(chats);\n target.getChatBrowserLiveView = chats.getChatBrowserLiveView.bind(chats);\n target.getChatMachineResources = chats.getChatMachineResources.bind(chats);\n target.getCurrentSmsChat = chats.getCurrentSmsChat.bind(chats);\n target.getChatCallbacks = chats.getChatCallbacks.bind(chats);\n target.getChatEhrWritebackOutcomes = chats.getChatEhrWritebackOutcomes.bind(chats);\n target.cancelChatCallback = chats.cancelChatCallback.bind(chats);\n target.getChatTokenUsage = chats.getChatTokenUsage.bind(chats);\n target.getChatTodos = chats.getChatTodos.bind(chats);\n target.getChatSkills = chats.getChatSkills.bind(chats);\n target.getManagerSkills = chats.getManagerSkills.bind(chats);\n target.getChatsNeedsResponse = chats.getChatsNeedsResponse.bind(chats);\n target.getChatsDailyCreationStats = chats.getChatsDailyCreationStats.bind(chats);\n target.getToolCallNames = chats.getToolCallNames.bind(chats);\n target.archiveChat = chats.archiveChat.bind(chats);\n target.unarchiveChat = chats.unarchiveChat.bind(chats);\n target.createChat = chats.createChat.bind(chats);\n target.createWorkflowOutboundVoiceChat = chats.createWorkflowOutboundVoiceChat.bind(chats);\n target.deleteChat = chats.deleteChat.bind(chats);\n target.updateChat = chats.updateChat.bind(chats);\n target.getChatModelOverride = chats.getChatModelOverride.bind(chats);\n target.updateChatModelOverride = chats.updateChatModelOverride.bind(chats);\n target.updateChatMute = chats.updateChatMute.bind(chats);\n target.summarizeChat = chats.summarizeChat.bind(chats);\n target.getChatMessages = chats.getChatMessages.bind(chats);\n target.getChildThreadMessages = chats.getChildThreadMessages.bind(chats);\n target.getChatToolCallMessages = chats.getChatToolCallMessages.bind(chats);\n target.getChatTools = chats.getChatTools.bind(chats);\n target.initiateOutboundCall = chats.initiateOutboundCall.bind(chats);\n target.sendAssistantMessage = chats.sendAssistantMessage.bind(chats);\n target.rateMessage = chats.rateMessage.bind(chats);\n target.getChatFeedback = chats.getChatFeedback.bind(chats);\n target.getChatAssignmentTasks = chats.getChatAssignmentTasks.bind(chats);\n target.createChatCompletion = chats.createChatCompletion.bind(chats);\n target.exportChats = chats.exportChats.bind(chats);\n target.exportChat = chats.exportChat.bind(chats);\n target.findOrCreateDMChat = chats.findOrCreateDMChat.bind(chats);\n target.sendChatMessage = chats.sendChatMessage.bind(chats);\n target.getChatPhoneCalls = chats.getChatPhoneCalls.bind(chats);\n // Chat Labels API\n target.getChatLabels = chats.getChatLabels.bind(chats);\n target.getChatLabel = chats.getChatLabel.bind(chats);\n target.getChatLabelByUuid = chats.getChatLabelByUuid.bind(chats);\n target.createChatLabel = chats.createChatLabel.bind(chats);\n target.updateChatLabel = chats.updateChatLabel.bind(chats);\n target.deleteChatLabel = chats.deleteChatLabel.bind(chats);\n // Chat Filters API\n target.getChatFilters = chats.getChatFilters.bind(chats);\n target.getChatFilter = chats.getChatFilter.bind(chats);\n target.getChatFilterByUuid = chats.getChatFilterByUuid.bind(chats);\n target.createChatFilter = chats.createChatFilter.bind(chats);\n target.updateChatFilter = chats.updateChatFilter.bind(chats);\n target.deleteChatFilter = chats.deleteChatFilter.bind(chats);\n target.getChatFilterCount = chats.getChatFilterCount.bind(chats);\n}\n","import { CallsApi, CELApi } from '../../api';\n\nexport interface CallsBindings {\n // Calls API\n getPhoneCalls: CallsApi['getPhoneCalls'];\n getMessageTiming: CallsApi['getMessageTiming'];\n getRecordingInfo: CallsApi['getRecordingInfo'];\n listChatRecordings: CallsApi['listChatRecordings'];\n getCallRecordingDownloadUrl: CallsApi['getCallRecordingDownloadUrl'];\n\n // CEL API\n getCelContext: CELApi['getCelContext'];\n validateCelExpression: CELApi['validateCelExpression'];\n}\n\nexport function bindCallsMethods(target: CallsBindings, calls: CallsApi, cel: CELApi): void {\n // Calls API\n target.getPhoneCalls = calls.getPhoneCalls.bind(calls);\n target.getMessageTiming = calls.getMessageTiming.bind(calls);\n target.getRecordingInfo = calls.getRecordingInfo.bind(calls);\n target.listChatRecordings = calls.listChatRecordings.bind(calls);\n target.getCallRecordingDownloadUrl = calls.getCallRecordingDownloadUrl.bind(calls);\n\n // CEL API\n target.getCelContext = cel.getCelContext.bind(cel);\n target.validateCelExpression = cel.validateCelExpression.bind(cel);\n}\n","import { DashboardsApi } from '../../api';\n\nexport interface DashboardsBindings {\n getDashboards: DashboardsApi['getDashboards'];\n getDashboard: DashboardsApi['getDashboard'];\n createDashboard: DashboardsApi['createDashboard'];\n updateDashboard: DashboardsApi['updateDashboard'];\n deleteDashboard: DashboardsApi['deleteDashboard'];\n getDashboardChannelStats: DashboardsApi['getDashboardChannelStats'];\n getDashboardWorkflowAssignmentStats: DashboardsApi['getDashboardWorkflowAssignmentStats'];\n getConfigurationHealth: DashboardsApi['getConfigurationHealth'];\n}\n\nexport function bindDashboardsMethods(target: DashboardsBindings, dashboards: DashboardsApi): void {\n target.getDashboards = dashboards.getDashboards.bind(dashboards);\n target.getDashboard = dashboards.getDashboard.bind(dashboards);\n target.createDashboard = dashboards.createDashboard.bind(dashboards);\n target.updateDashboard = dashboards.updateDashboard.bind(dashboards);\n target.deleteDashboard = dashboards.deleteDashboard.bind(dashboards);\n target.getDashboardChannelStats = dashboards.getDashboardChannelStats.bind(dashboards);\n target.getDashboardWorkflowAssignmentStats =\n dashboards.getDashboardWorkflowAssignmentStats.bind(dashboards);\n target.getConfigurationHealth = dashboards.getConfigurationHealth.bind(dashboards);\n}\n","import { ActivityApi } from '../../api';\n\nexport interface ActivityBindings {\n queryActivity: ActivityApi['queryActivity'];\n queryActivityLatestSubjects: ActivityApi['queryActivityLatestSubjects'];\n queryActivityOpenItems: ActivityApi['queryActivityOpenItems'];\n queryActivityOneView: ActivityApi['queryActivityOneView'];\n queryActivityDigest: ActivityApi['queryActivityDigest'];\n getActivityCounts: ActivityApi['getActivityCounts'];\n getActivityCapabilities: ActivityApi['getActivityCapabilities'];\n queryOrgActivity: ActivityApi['queryOrgActivity'];\n queryOrgActivityLatestSubjects: ActivityApi['queryOrgActivityLatestSubjects'];\n queryOrgActivityOpenItems: ActivityApi['queryOrgActivityOpenItems'];\n queryOrgActivityOneView: ActivityApi['queryOrgActivityOneView'];\n queryOrgActivityDigest: ActivityApi['queryOrgActivityDigest'];\n getOrgActivityCounts: ActivityApi['getOrgActivityCounts'];\n queryWorkspaceActivity: ActivityApi['queryWorkspaceActivity'];\n queryWorkspaceActivityLatestSubjects: ActivityApi['queryWorkspaceActivityLatestSubjects'];\n queryWorkspaceActivityOpenItems: ActivityApi['queryWorkspaceActivityOpenItems'];\n queryWorkspaceActivityOneView: ActivityApi['queryWorkspaceActivityOneView'];\n queryWorkspaceActivityDigest: ActivityApi['queryWorkspaceActivityDigest'];\n getWorkspaceActivityCounts: ActivityApi['getWorkspaceActivityCounts'];\n resolveEntityRefs: ActivityApi['resolveEntityRefs'];\n resolveOrgEntityRefs: ActivityApi['resolveOrgEntityRefs'];\n resolveAccountEntityRefs: ActivityApi['resolveAccountEntityRefs'];\n}\n\nexport function bindActivityMethods(target: ActivityBindings, activity: ActivityApi): void {\n target.queryActivity = activity.queryActivity.bind(activity);\n target.queryActivityLatestSubjects = activity.queryActivityLatestSubjects.bind(activity);\n target.queryActivityOpenItems = activity.queryActivityOpenItems.bind(activity);\n target.queryActivityOneView = activity.queryActivityOneView.bind(activity);\n target.queryActivityDigest = activity.queryActivityDigest.bind(activity);\n target.getActivityCounts = activity.getActivityCounts.bind(activity);\n target.getActivityCapabilities = activity.getActivityCapabilities.bind(activity);\n target.queryOrgActivity = activity.queryOrgActivity.bind(activity);\n target.queryOrgActivityLatestSubjects = activity.queryOrgActivityLatestSubjects.bind(activity);\n target.queryOrgActivityOpenItems = activity.queryOrgActivityOpenItems.bind(activity);\n target.queryOrgActivityOneView = activity.queryOrgActivityOneView.bind(activity);\n target.queryOrgActivityDigest = activity.queryOrgActivityDigest.bind(activity);\n target.getOrgActivityCounts = activity.getOrgActivityCounts.bind(activity);\n target.queryWorkspaceActivity = activity.queryWorkspaceActivity.bind(activity);\n target.queryWorkspaceActivityLatestSubjects =\n activity.queryWorkspaceActivityLatestSubjects.bind(activity);\n target.queryWorkspaceActivityOpenItems = activity.queryWorkspaceActivityOpenItems.bind(activity);\n target.queryWorkspaceActivityOneView = activity.queryWorkspaceActivityOneView.bind(activity);\n target.queryWorkspaceActivityDigest = activity.queryWorkspaceActivityDigest.bind(activity);\n target.getWorkspaceActivityCounts = activity.getWorkspaceActivityCounts.bind(activity);\n target.resolveEntityRefs = activity.resolveEntityRefs.bind(activity);\n target.resolveOrgEntityRefs = activity.resolveOrgEntityRefs.bind(activity);\n target.resolveAccountEntityRefs = activity.resolveAccountEntityRefs.bind(activity);\n}\n","import { MotdApi } from '../../api';\n\nexport interface MotdBindings {\n getMotd: MotdApi['getMotd'];\n}\n\nexport function bindMotdMethods(target: MotdBindings, motd: MotdApi): void {\n target.getMotd = motd.getMotd.bind(motd);\n}\n","import { TrackedLinksApi } from '../../api';\n\nexport interface TrackedLinksBindings {\n getTrackedLinkSummary: TrackedLinksApi['getTrackedLinkSummary'];\n getTrackedLinkDestinations: TrackedLinksApi['getTrackedLinkDestinations'];\n getTrackedLinkStats: TrackedLinksApi['getTrackedLinkStats'];\n getTrackedLinkTimeseries: TrackedLinksApi['getTrackedLinkTimeseries'];\n createTrackedLinkDestination: TrackedLinksApi['createTrackedLinkDestination'];\n updateTrackedLinkDestination: TrackedLinksApi['updateTrackedLinkDestination'];\n deleteTrackedLinkDestination: TrackedLinksApi['deleteTrackedLinkDestination'];\n clearTrackedLinkDestinations: TrackedLinksApi['clearTrackedLinkDestinations'];\n}\n\nexport function bindTrackedLinksMethods(\n target: TrackedLinksBindings,\n trackedLinks: TrackedLinksApi\n): void {\n target.getTrackedLinkSummary = trackedLinks.getTrackedLinkSummary.bind(trackedLinks);\n target.getTrackedLinkDestinations = trackedLinks.getTrackedLinkDestinations.bind(trackedLinks);\n target.getTrackedLinkStats = trackedLinks.getTrackedLinkStats.bind(trackedLinks);\n target.getTrackedLinkTimeseries = trackedLinks.getTrackedLinkTimeseries.bind(trackedLinks);\n target.createTrackedLinkDestination =\n trackedLinks.createTrackedLinkDestination.bind(trackedLinks);\n target.updateTrackedLinkDestination =\n trackedLinks.updateTrackedLinkDestination.bind(trackedLinks);\n target.deleteTrackedLinkDestination =\n trackedLinks.deleteTrackedLinkDestination.bind(trackedLinks);\n target.clearTrackedLinkDestinations =\n trackedLinks.clearTrackedLinkDestinations.bind(trackedLinks);\n}\n","import { DataTypesApi } from '../../api';\n\nexport interface DataTypesBindings {\n // Data Types API\n getDataTypeDraft: DataTypesApi['getDataTypeDraft'];\n saveDataTypeDraft: DataTypesApi['saveDataTypeDraft'];\n publishDataTypeDraft: DataTypesApi['publishDataTypeDraft'];\n getDataTypeVersions: DataTypesApi['getDataTypeVersions'];\n getDataTypes: DataTypesApi['getDataTypes'];\n getDataType: DataTypesApi['getDataType'];\n getDataTypeByUuid: DataTypesApi['getDataTypeByUuid'];\n getDataTypeBySlug: DataTypesApi['getDataTypeBySlug'];\n createDataType: DataTypesApi['createDataType'];\n updateDataType: DataTypesApi['updateDataType'];\n deleteDataType: DataTypesApi['deleteDataType'];\n archiveDataType: DataTypesApi['archiveDataType'];\n unarchiveDataType: DataTypesApi['unarchiveDataType'];\n cloneDataType: DataTypesApi['cloneDataType'];\n getDataRecords: DataTypesApi['getDataRecords'];\n getDataRecord: DataTypesApi['getDataRecord'];\n getDataRecordByUuid: DataTypesApi['getDataRecordByUuid'];\n createDataRecord: DataTypesApi['createDataRecord'];\n updateDataRecord: DataTypesApi['updateDataRecord'];\n deleteDataRecord: DataTypesApi['deleteDataRecord'];\n getDataRecordChanges: DataTypesApi['getDataRecordChanges'];\n upsertDataRecord: DataTypesApi['upsertDataRecord'];\n toggleFieldIndex: DataTypesApi['toggleFieldIndex'];\n previewRenameFieldSlug: DataTypesApi['previewRenameFieldSlug'];\n renameFieldSlug: DataTypesApi['renameFieldSlug'];\n getFieldIndexStatus: DataTypesApi['getFieldIndexStatus'];\n validateDataTypeSlug: DataTypesApi['validateDataTypeSlug'];\n getMemberRecordCounts: DataTypesApi['getMemberRecordCounts'];\n getDataRecordFilters: DataTypesApi['getDataRecordFilters'];\n getDataRecordFilter: DataTypesApi['getDataRecordFilter'];\n createDataRecordFilter: DataTypesApi['createDataRecordFilter'];\n updateDataRecordFilter: DataTypesApi['updateDataRecordFilter'];\n deleteDataRecordFilter: DataTypesApi['deleteDataRecordFilter'];\n getDataRecordFilterCount: DataTypesApi['getDataRecordFilterCount'];\n listAnonymousFormSubmissions: DataTypesApi['listAnonymousFormSubmissions'];\n getAnonymousFormSubmission: DataTypesApi['getAnonymousFormSubmission'];\n}\n\nexport function bindDataTypesMethods(target: DataTypesBindings, dataTypes: DataTypesApi): void {\n target.getDataTypeDraft = dataTypes.getDataTypeDraft.bind(dataTypes);\n target.saveDataTypeDraft = dataTypes.saveDataTypeDraft.bind(dataTypes);\n target.publishDataTypeDraft = dataTypes.publishDataTypeDraft.bind(dataTypes);\n target.getDataTypeVersions = dataTypes.getDataTypeVersions.bind(dataTypes);\n target.getDataTypes = dataTypes.getDataTypes.bind(dataTypes);\n target.getDataType = dataTypes.getDataType.bind(dataTypes);\n target.getDataTypeByUuid = dataTypes.getDataTypeByUuid.bind(dataTypes);\n target.getDataTypeBySlug = dataTypes.getDataTypeBySlug.bind(dataTypes);\n target.createDataType = dataTypes.createDataType.bind(dataTypes);\n target.updateDataType = dataTypes.updateDataType.bind(dataTypes);\n target.deleteDataType = dataTypes.deleteDataType.bind(dataTypes);\n target.archiveDataType = dataTypes.archiveDataType.bind(dataTypes);\n target.unarchiveDataType = dataTypes.unarchiveDataType.bind(dataTypes);\n target.cloneDataType = dataTypes.cloneDataType.bind(dataTypes);\n target.getDataRecords = dataTypes.getDataRecords.bind(dataTypes);\n target.listAnonymousFormSubmissions = dataTypes.listAnonymousFormSubmissions.bind(dataTypes);\n target.getAnonymousFormSubmission = dataTypes.getAnonymousFormSubmission.bind(dataTypes);\n target.getDataRecord = dataTypes.getDataRecord.bind(dataTypes);\n target.getDataRecordByUuid = dataTypes.getDataRecordByUuid.bind(dataTypes);\n target.createDataRecord = dataTypes.createDataRecord.bind(dataTypes);\n target.updateDataRecord = dataTypes.updateDataRecord.bind(dataTypes);\n target.deleteDataRecord = dataTypes.deleteDataRecord.bind(dataTypes);\n target.getDataRecordChanges = dataTypes.getDataRecordChanges.bind(dataTypes);\n target.upsertDataRecord = dataTypes.upsertDataRecord.bind(dataTypes);\n target.toggleFieldIndex = dataTypes.toggleFieldIndex.bind(dataTypes);\n target.previewRenameFieldSlug = dataTypes.previewRenameFieldSlug.bind(dataTypes);\n target.renameFieldSlug = dataTypes.renameFieldSlug.bind(dataTypes);\n target.getFieldIndexStatus = dataTypes.getFieldIndexStatus.bind(dataTypes);\n target.validateDataTypeSlug = dataTypes.validateDataTypeSlug.bind(dataTypes);\n target.getMemberRecordCounts = dataTypes.getMemberRecordCounts.bind(dataTypes);\n target.getDataRecordFilters = dataTypes.getDataRecordFilters.bind(dataTypes);\n target.getDataRecordFilter = dataTypes.getDataRecordFilter.bind(dataTypes);\n target.createDataRecordFilter = dataTypes.createDataRecordFilter.bind(dataTypes);\n target.updateDataRecordFilter = dataTypes.updateDataRecordFilter.bind(dataTypes);\n target.deleteDataRecordFilter = dataTypes.deleteDataRecordFilter.bind(dataTypes);\n target.getDataRecordFilterCount = dataTypes.getDataRecordFilterCount.bind(dataTypes);\n}\n","import { DevicesApi } from '../../api';\n\nexport interface DevicesBindings {\n getDevices: DevicesApi['getDevices'];\n getDevice: DevicesApi['getDevice'];\n getDeviceKinds: DevicesApi['getDeviceKinds'];\n claimDevicePairing: DevicesApi['claimDevicePairing'];\n updateDevice: DevicesApi['updateDevice'];\n revokeDevice: DevicesApi['revokeDevice'];\n}\n\nexport function bindDevicesMethods(target: DevicesBindings, devices: DevicesApi): void {\n target.getDevices = devices.getDevices.bind(devices);\n target.getDevice = devices.getDevice.bind(devices);\n target.getDeviceKinds = devices.getDeviceKinds.bind(devices);\n target.claimDevicePairing = devices.claimDevicePairing.bind(devices);\n target.updateDevice = devices.updateDevice.bind(devices);\n target.revokeDevice = devices.revokeDevice.bind(devices);\n}\n","import { MembersApi } from '../../api';\n\nexport interface MembersBindings {\n // Members API\n getCurrentMember: MembersApi['getCurrentMember'];\n getMyDataTypes: MembersApi['getMyDataTypes'];\n getMyRecords: MembersApi['getMyRecords'];\n getMemberWorkflowVoices: MembersApi['getMemberWorkflowVoices'];\n previewMemberWorkflowVoice: MembersApi['previewMemberWorkflowVoice'];\n setMemberWorkflowVoice: MembersApi['setMemberWorkflowVoice'];\n clearMemberWorkflowVoice: MembersApi['clearMemberWorkflowVoice'];\n updateCurrentMember: MembersApi['updateCurrentMember'];\n getWorkspaceMembers: MembersApi['getWorkspaceMembers'];\n getWorkspaceMember: MembersApi['getWorkspaceMember'];\n getMemberByUuid: MembersApi['getMemberByUuid'];\n getOrgWorkspaceMember: MembersApi['getOrgWorkspaceMember'];\n createWorkspaceMember: MembersApi['createWorkspaceMember'];\n updateMember: MembersApi['updateMember'];\n deleteMember: MembersApi['deleteMember'];\n archiveMember: MembersApi['archiveMember'];\n unarchiveMember: MembersApi['unarchiveMember'];\n updateMemberByExternalId: MembersApi['updateMemberByExternalId'];\n archiveMemberByExternalId: MembersApi['archiveMemberByExternalId'];\n unarchiveMemberByExternalId: MembersApi['unarchiveMemberByExternalId'];\n sendMemberPhoneConfirmation: MembersApi['sendMemberPhoneConfirmation'];\n bulkCreateMembers: MembersApi['bulkCreateMembers'];\n previewImportMembers: MembersApi['previewImportMembers'];\n importMembers: MembersApi['importMembers'];\n exportMembers: MembersApi['exportMembers'];\n getMembersMessageActivity: MembersApi['getMembersMessageActivity'];\n getMemberFilters: MembersApi['getMemberFilters'];\n getMemberFilter: MembersApi['getMemberFilter'];\n createMemberFilter: MembersApi['createMemberFilter'];\n updateMemberFilter: MembersApi['updateMemberFilter'];\n deleteMemberFilter: MembersApi['deleteMemberFilter'];\n getMemberFilterCount: MembersApi['getMemberFilterCount'];\n getMemberLabels: MembersApi['getMemberLabels'];\n getMemberLabel: MembersApi['getMemberLabel'];\n getMemberLabelByUuid: MembersApi['getMemberLabelByUuid'];\n createMemberLabel: MembersApi['createMemberLabel'];\n updateMemberLabel: MembersApi['updateMemberLabel'];\n deleteMemberLabel: MembersApi['deleteMemberLabel'];\n getMemberRoles: MembersApi['getMemberRoles'];\n getMemberRole: MembersApi['getMemberRole'];\n getMemberRoleByUuid: MembersApi['getMemberRoleByUuid'];\n createMemberRole: MembersApi['createMemberRole'];\n updateMemberRole: MembersApi['updateMemberRole'];\n deleteMemberRole: MembersApi['deleteMemberRole'];\n getMemberRoleCleanupPlan: MembersApi['getMemberRoleCleanupPlan'];\n mergeMemberRoles: MembersApi['mergeMemberRoles'];\n // Member Fields\n getMemberFields: MembersApi['getMemberFields'];\n getMemberFieldDefinitions: MembersApi['getMemberFieldDefinitions'];\n createMemberField: MembersApi['createMemberField'];\n updateMemberField: MembersApi['updateMemberField'];\n deleteMemberField: MembersApi['deleteMemberField'];\n // Credential Change Invites (Admin-initiated)\n inviteMemberCredentialUpdate: MembersApi['inviteMemberCredentialUpdate'];\n cancelCredentialUpdateInvite: MembersApi['cancelCredentialUpdateInvite'];\n getCredentialUpdateInvites: MembersApi['getCredentialUpdateInvites'];\n // Anonymous Member Resolutions\n getAnonymousResolutions: MembersApi['getAnonymousResolutions'];\n getAnonymousResolution: MembersApi['getAnonymousResolution'];\n resolveAnonymousMember: MembersApi['resolveAnonymousMember'];\n expireAnonymousMember: MembersApi['expireAnonymousMember'];\n // Member Memories\n getMemberMemories: MembersApi['getMemberMemories'];\n getMemberMemory: MembersApi['getMemberMemory'];\n createMemberMemory: MembersApi['createMemberMemory'];\n deleteMemberMemory: MembersApi['deleteMemberMemory'];\n // Member Sync Links\n getMemberSyncLinks: MembersApi['getMemberSyncLinks'];\n // Member Relationships\n getMemberRelationships: MembersApi['getMemberRelationships'];\n createMemberRelationship: MembersApi['createMemberRelationship'];\n archiveMemberRelationship: MembersApi['archiveMemberRelationship'];\n listContactPermissions: MembersApi['listContactPermissions'];\n createContactPermission: MembersApi['createContactPermission'];\n}\n\nexport function bindMembersMethods(target: MembersBindings, members: MembersApi): void {\n target.getCurrentMember = members.getCurrentMember.bind(members);\n target.getMyDataTypes = members.getMyDataTypes.bind(members);\n target.getMyRecords = members.getMyRecords.bind(members);\n target.getMemberWorkflowVoices = members.getMemberWorkflowVoices.bind(members);\n target.previewMemberWorkflowVoice = members.previewMemberWorkflowVoice.bind(members);\n target.setMemberWorkflowVoice = members.setMemberWorkflowVoice.bind(members);\n target.clearMemberWorkflowVoice = members.clearMemberWorkflowVoice.bind(members);\n target.updateCurrentMember = members.updateCurrentMember.bind(members);\n target.getWorkspaceMembers = members.getWorkspaceMembers.bind(members);\n target.getWorkspaceMember = members.getWorkspaceMember.bind(members);\n target.getMemberByUuid = members.getMemberByUuid.bind(members);\n target.getOrgWorkspaceMember = members.getOrgWorkspaceMember.bind(members);\n target.createWorkspaceMember = members.createWorkspaceMember.bind(members);\n target.updateMember = members.updateMember.bind(members);\n target.deleteMember = members.deleteMember.bind(members);\n target.archiveMember = members.archiveMember.bind(members);\n target.unarchiveMember = members.unarchiveMember.bind(members);\n target.updateMemberByExternalId = members.updateMemberByExternalId.bind(members);\n target.archiveMemberByExternalId = members.archiveMemberByExternalId.bind(members);\n target.unarchiveMemberByExternalId = members.unarchiveMemberByExternalId.bind(members);\n target.sendMemberPhoneConfirmation = members.sendMemberPhoneConfirmation.bind(members);\n target.bulkCreateMembers = members.bulkCreateMembers.bind(members);\n target.previewImportMembers = members.previewImportMembers.bind(members);\n target.importMembers = members.importMembers.bind(members);\n target.exportMembers = members.exportMembers.bind(members);\n target.getMembersMessageActivity = members.getMembersMessageActivity.bind(members);\n target.getMemberFilters = members.getMemberFilters.bind(members);\n target.getMemberFilter = members.getMemberFilter.bind(members);\n target.createMemberFilter = members.createMemberFilter.bind(members);\n target.updateMemberFilter = members.updateMemberFilter.bind(members);\n target.deleteMemberFilter = members.deleteMemberFilter.bind(members);\n target.getMemberFilterCount = members.getMemberFilterCount.bind(members);\n target.getMemberLabels = members.getMemberLabels.bind(members);\n target.getMemberLabel = members.getMemberLabel.bind(members);\n target.getMemberLabelByUuid = members.getMemberLabelByUuid.bind(members);\n target.createMemberLabel = members.createMemberLabel.bind(members);\n target.updateMemberLabel = members.updateMemberLabel.bind(members);\n target.deleteMemberLabel = members.deleteMemberLabel.bind(members);\n target.getMemberRoles = members.getMemberRoles.bind(members);\n target.getMemberRole = members.getMemberRole.bind(members);\n target.getMemberRoleByUuid = members.getMemberRoleByUuid.bind(members);\n target.createMemberRole = members.createMemberRole.bind(members);\n target.updateMemberRole = members.updateMemberRole.bind(members);\n target.deleteMemberRole = members.deleteMemberRole.bind(members);\n target.getMemberRoleCleanupPlan = members.getMemberRoleCleanupPlan.bind(members);\n target.mergeMemberRoles = members.mergeMemberRoles.bind(members);\n // Member Fields\n target.getMemberFields = members.getMemberFields.bind(members);\n target.getMemberFieldDefinitions = members.getMemberFieldDefinitions.bind(members);\n target.createMemberField = members.createMemberField.bind(members);\n target.updateMemberField = members.updateMemberField.bind(members);\n target.deleteMemberField = members.deleteMemberField.bind(members);\n // Credential Change Invites (Admin-initiated)\n target.inviteMemberCredentialUpdate = members.inviteMemberCredentialUpdate.bind(members);\n target.cancelCredentialUpdateInvite = members.cancelCredentialUpdateInvite.bind(members);\n target.getCredentialUpdateInvites = members.getCredentialUpdateInvites.bind(members);\n // Anonymous Member Resolutions\n target.getAnonymousResolutions = members.getAnonymousResolutions.bind(members);\n target.getAnonymousResolution = members.getAnonymousResolution.bind(members);\n target.resolveAnonymousMember = members.resolveAnonymousMember.bind(members);\n target.expireAnonymousMember = members.expireAnonymousMember.bind(members);\n // Member Memories\n target.getMemberMemories = members.getMemberMemories.bind(members);\n target.getMemberMemory = members.getMemberMemory.bind(members);\n target.createMemberMemory = members.createMemberMemory.bind(members);\n target.deleteMemberMemory = members.deleteMemberMemory.bind(members);\n // Member Sync Links\n target.getMemberSyncLinks = members.getMemberSyncLinks.bind(members);\n // Member Relationships\n target.getMemberRelationships = members.getMemberRelationships.bind(members);\n target.createMemberRelationship = members.createMemberRelationship.bind(members);\n target.archiveMemberRelationship = members.archiveMemberRelationship.bind(members);\n target.listContactPermissions = members.listContactPermissions.bind(members);\n target.createContactPermission = members.createContactPermission.bind(members);\n}\n","import { WorkspacesApi, WorkspaceInvitationsApi } from '../../api';\n\nexport interface WorkspacesBindings {\n // Workspaces API\n getWorkspaces: WorkspacesApi['getWorkspaces'];\n getDeviceAdmissibleWorkspaces: WorkspacesApi['getDeviceAdmissibleWorkspaces'];\n getPublicWorkspaces: WorkspacesApi['getPublicWorkspaces'];\n getWorkspace: WorkspacesApi['getWorkspace'];\n createWorkspace: WorkspacesApi['createWorkspace'];\n updateWorkspace: WorkspacesApi['updateWorkspace'];\n deleteWorkspace: WorkspacesApi['deleteWorkspace'];\n leaveWorkspace: WorkspacesApi['leaveWorkspace'];\n getWorkspaceDefaults: WorkspacesApi['getWorkspaceDefaults'];\n updateWorkspaceDefaults: WorkspacesApi['updateWorkspaceDefaults'];\n getFirstRunState: WorkspacesApi['getFirstRunState'];\n updateFirstRunState: WorkspacesApi['updateFirstRunState'];\n getWorkspaceCounts: WorkspacesApi['getWorkspaceCounts'];\n getBusinessHoursStatus: WorkspacesApi['getBusinessHoursStatus'];\n getAvailableWorkspaceFeatures: WorkspacesApi['getAvailableWorkspaceFeatures'];\n getWorkspaceNotices: WorkspacesApi['getWorkspaceNotices'];\n getNotifications: WorkspacesApi['getNotifications'];\n getNotification: WorkspacesApi['getNotification'];\n getUnreadNotificationCount: WorkspacesApi['getUnreadNotificationCount'];\n markNotificationAsRead: WorkspacesApi['markNotificationAsRead'];\n dismissNotification: WorkspacesApi['dismissNotification'];\n dismissAllNotifications: WorkspacesApi['dismissAllNotifications'];\n getResellerWorkspaces: WorkspacesApi['getResellerWorkspaces'];\n createClientWorkspace: WorkspacesApi['createClientWorkspace'];\n getClientWorkspace: WorkspacesApi['getClientWorkspace'];\n updateClientWorkspace: WorkspacesApi['updateClientWorkspace'];\n deleteClientWorkspace: WorkspacesApi['deleteClientWorkspace'];\n provisionClientWorkspace: WorkspacesApi['provisionClientWorkspace'];\n getProducts: WorkspacesApi['getProducts'];\n getProduct: WorkspacesApi['getProduct'];\n getWorkspaceProduct: WorkspacesApi['getWorkspaceProduct'];\n getPublicProducts: WorkspacesApi['getPublicProducts'];\n previewPromoCode: WorkspacesApi['previewPromoCode'];\n startPromoPlanTrial: WorkspacesApi['startPromoPlanTrial'];\n getPublicProduct: WorkspacesApi['getPublicProduct'];\n createProduct: WorkspacesApi['createProduct'];\n updateProduct: WorkspacesApi['updateProduct'];\n deleteProduct: WorkspacesApi['deleteProduct'];\n exportWorkspace: WorkspacesApi['exportWorkspace'];\n exportWorkspaceZip: WorkspacesApi['exportWorkspaceZip'];\n previewWorkspaceImport: WorkspacesApi['previewWorkspaceImport'];\n previewWorkspaceImportZip: WorkspacesApi['previewWorkspaceImportZip'];\n importWorkspace: WorkspacesApi['importWorkspace'];\n importWorkspaceZip: WorkspacesApi['importWorkspaceZip'];\n getImportSkippedRules: WorkspacesApi['getImportSkippedRules'];\n getImportReadiness: WorkspacesApi['getImportReadiness'];\n rebuildImportSkippedRules: WorkspacesApi['rebuildImportSkippedRules'];\n previewImportWorkspace: WorkspacesApi['previewImportWorkspace'];\n getWorkspaceThemes: WorkspacesApi['getWorkspaceThemes'];\n getWorkspaceBySlug: WorkspacesApi['getWorkspace'];\n getWorkspaceScopes: WorkspacesApi['getWorkspaceScopes'];\n getUsageDashboard: WorkspacesApi['getUsageDashboard'];\n\n // Push Notifications API\n getVapidPublicKey: WorkspacesApi['getVapidPublicKey'];\n registerPushSubscription: WorkspacesApi['registerPushSubscription'];\n unregisterPushSubscription: WorkspacesApi['unregisterPushSubscription'];\n listPushSubscriptions: WorkspacesApi['listPushSubscriptions'];\n getWorkspaceEmailDomains: WorkspacesApi['getWorkspaceEmailDomains'];\n getWorkspaceSiteDomains: WorkspacesApi['getWorkspaceSiteDomains'];\n getWorkspaceWidgetDomains: WorkspacesApi['getWorkspaceWidgetDomains'];\n listWidgetDomains: WorkspacesApi['listWidgetDomains'];\n upsertWidgetDomain: WorkspacesApi['upsertWidgetDomain'];\n deleteWidgetDomain: WorkspacesApi['deleteWidgetDomain'];\n\n // WorkspaceInvitations API\n listWorkspaceInvitations: WorkspaceInvitationsApi['listWorkspaceInvitations'];\n listWorkspaceInvitationsAdmin: WorkspaceInvitationsApi['listWorkspaceInvitationsAdmin'];\n getWorkspaceInvitation: WorkspaceInvitationsApi['getWorkspaceInvitation'];\n updateWorkspaceInvitationAdmin: WorkspaceInvitationsApi['updateWorkspaceInvitationAdmin'];\n deleteWorkspaceInvitation: WorkspaceInvitationsApi['deleteWorkspaceInvitation'];\n deleteWorkspaceInvitationAdmin: WorkspaceInvitationsApi['deleteWorkspaceInvitationAdmin'];\n requestWorkspaceMembership: WorkspaceInvitationsApi['requestWorkspaceMembership'];\n approveWorkspaceInvitation: WorkspaceInvitationsApi['approveWorkspaceInvitation'];\n denyWorkspaceInvitation: WorkspaceInvitationsApi['denyWorkspaceInvitation'];\n blockWorkspaceInvitation: WorkspaceInvitationsApi['blockWorkspaceInvitation'];\n inviteToWorkspace: WorkspaceInvitationsApi['inviteToWorkspace'];\n acceptInvitation: WorkspaceInvitationsApi['acceptInvitation'];\n declineInvitation: WorkspaceInvitationsApi['declineInvitation'];\n}\n\nexport function bindWorkspacesMethods(\n target: WorkspacesBindings,\n workspaces: WorkspacesApi,\n signupRequests: WorkspaceInvitationsApi\n): void {\n // Workspaces API\n target.getWorkspaces = workspaces.getWorkspaces.bind(workspaces);\n target.getDeviceAdmissibleWorkspaces = workspaces.getDeviceAdmissibleWorkspaces.bind(workspaces);\n target.getPublicWorkspaces = workspaces.getPublicWorkspaces.bind(workspaces);\n target.getWorkspace = workspaces.getWorkspace.bind(workspaces);\n target.createWorkspace = workspaces.createWorkspace.bind(workspaces);\n target.updateWorkspace = workspaces.updateWorkspace.bind(workspaces);\n target.deleteWorkspace = workspaces.deleteWorkspace.bind(workspaces);\n target.leaveWorkspace = workspaces.leaveWorkspace.bind(workspaces);\n target.getWorkspaceDefaults = workspaces.getWorkspaceDefaults.bind(workspaces);\n target.updateWorkspaceDefaults = workspaces.updateWorkspaceDefaults.bind(workspaces);\n target.getFirstRunState = workspaces.getFirstRunState.bind(workspaces);\n target.updateFirstRunState = workspaces.updateFirstRunState.bind(workspaces);\n target.getWorkspaceCounts = workspaces.getWorkspaceCounts.bind(workspaces);\n target.getBusinessHoursStatus = workspaces.getBusinessHoursStatus.bind(workspaces);\n target.getAvailableWorkspaceFeatures = workspaces.getAvailableWorkspaceFeatures.bind(workspaces);\n target.getWorkspaceNotices = workspaces.getWorkspaceNotices.bind(workspaces);\n target.getNotifications = workspaces.getNotifications.bind(workspaces);\n target.getNotification = workspaces.getNotification.bind(workspaces);\n target.getUnreadNotificationCount = workspaces.getUnreadNotificationCount.bind(workspaces);\n target.markNotificationAsRead = workspaces.markNotificationAsRead.bind(workspaces);\n target.dismissNotification = workspaces.dismissNotification.bind(workspaces);\n target.dismissAllNotifications = workspaces.dismissAllNotifications.bind(workspaces);\n target.getResellerWorkspaces = workspaces.getResellerWorkspaces.bind(workspaces);\n target.createClientWorkspace = workspaces.createClientWorkspace.bind(workspaces);\n target.getClientWorkspace = workspaces.getClientWorkspace.bind(workspaces);\n target.updateClientWorkspace = workspaces.updateClientWorkspace.bind(workspaces);\n target.deleteClientWorkspace = workspaces.deleteClientWorkspace.bind(workspaces);\n target.provisionClientWorkspace = workspaces.provisionClientWorkspace.bind(workspaces);\n target.getProducts = workspaces.getProducts.bind(workspaces);\n target.getProduct = workspaces.getProduct.bind(workspaces);\n target.getWorkspaceProduct = workspaces.getWorkspaceProduct.bind(workspaces);\n target.getPublicProducts = workspaces.getPublicProducts.bind(workspaces);\n target.previewPromoCode = workspaces.previewPromoCode.bind(workspaces);\n target.startPromoPlanTrial = workspaces.startPromoPlanTrial.bind(workspaces);\n target.getPublicProduct = workspaces.getPublicProduct.bind(workspaces);\n target.createProduct = workspaces.createProduct.bind(workspaces);\n target.updateProduct = workspaces.updateProduct.bind(workspaces);\n target.deleteProduct = workspaces.deleteProduct.bind(workspaces);\n target.exportWorkspace = workspaces.exportWorkspace.bind(workspaces);\n target.exportWorkspaceZip = workspaces.exportWorkspaceZip.bind(workspaces);\n target.previewWorkspaceImport = workspaces.previewWorkspaceImport.bind(workspaces);\n target.previewWorkspaceImportZip = workspaces.previewWorkspaceImportZip.bind(workspaces);\n target.importWorkspace = workspaces.importWorkspace.bind(workspaces);\n target.importWorkspaceZip = workspaces.importWorkspaceZip.bind(workspaces);\n target.getImportSkippedRules = workspaces.getImportSkippedRules.bind(workspaces);\n target.getImportReadiness = workspaces.getImportReadiness.bind(workspaces);\n target.rebuildImportSkippedRules = workspaces.rebuildImportSkippedRules.bind(workspaces);\n target.previewImportWorkspace = workspaces.previewImportWorkspace.bind(workspaces);\n target.getWorkspaceThemes = workspaces.getWorkspaceThemes.bind(workspaces);\n target.getWorkspaceBySlug = workspaces.getWorkspace.bind(workspaces);\n target.getWorkspaceScopes = workspaces.getWorkspaceScopes.bind(workspaces);\n target.getUsageDashboard = workspaces.getUsageDashboard.bind(workspaces);\n\n // Push Notifications API\n target.getVapidPublicKey = workspaces.getVapidPublicKey.bind(workspaces);\n target.registerPushSubscription = workspaces.registerPushSubscription.bind(workspaces);\n target.unregisterPushSubscription = workspaces.unregisterPushSubscription.bind(workspaces);\n target.listPushSubscriptions = workspaces.listPushSubscriptions.bind(workspaces);\n target.getWorkspaceEmailDomains = workspaces.getWorkspaceEmailDomains.bind(workspaces);\n target.getWorkspaceSiteDomains = workspaces.getWorkspaceSiteDomains.bind(workspaces);\n target.getWorkspaceWidgetDomains = workspaces.getWorkspaceWidgetDomains.bind(workspaces);\n target.listWidgetDomains = workspaces.listWidgetDomains.bind(workspaces);\n target.upsertWidgetDomain = workspaces.upsertWidgetDomain.bind(workspaces);\n target.deleteWidgetDomain = workspaces.deleteWidgetDomain.bind(workspaces);\n\n // WorkspaceInvitations API\n target.listWorkspaceInvitations = signupRequests.listWorkspaceInvitations.bind(signupRequests);\n target.listWorkspaceInvitationsAdmin =\n signupRequests.listWorkspaceInvitationsAdmin.bind(signupRequests);\n target.getWorkspaceInvitation = signupRequests.getWorkspaceInvitation.bind(signupRequests);\n target.updateWorkspaceInvitationAdmin =\n signupRequests.updateWorkspaceInvitationAdmin.bind(signupRequests);\n target.deleteWorkspaceInvitation = signupRequests.deleteWorkspaceInvitation.bind(signupRequests);\n target.deleteWorkspaceInvitationAdmin =\n signupRequests.deleteWorkspaceInvitationAdmin.bind(signupRequests);\n target.requestWorkspaceMembership =\n signupRequests.requestWorkspaceMembership.bind(signupRequests);\n target.approveWorkspaceInvitation =\n signupRequests.approveWorkspaceInvitation.bind(signupRequests);\n target.denyWorkspaceInvitation = signupRequests.denyWorkspaceInvitation.bind(signupRequests);\n target.blockWorkspaceInvitation = signupRequests.blockWorkspaceInvitation.bind(signupRequests);\n target.inviteToWorkspace = signupRequests.inviteToWorkspace.bind(signupRequests);\n target.acceptInvitation = signupRequests.acceptInvitation.bind(signupRequests);\n target.declineInvitation = signupRequests.declineInvitation.bind(signupRequests);\n}\n","import { AssignmentsApi, AuthApi } from '../../api';\n\nexport interface AuthBindings {\n // Auth API\n getUserAccount: AuthApi['getUserAccount'];\n updateUserAccount: AuthApi['updateUserAccount'];\n recordAcquisition: AuthApi['recordAcquisition'];\n login: AuthApi['login'];\n resendCode: AuthApi['resendCode'];\n verifyCodeWith2FA: AuthApi['verifyCodeWith2FA'];\n emailPasswordLogin: AuthApi['emailPasswordLogin'];\n emailPasswordSignup: AuthApi['emailPasswordSignup'];\n requestMagicLink: AuthApi['requestMagicLink'];\n validateMagicLink: AuthApi['validateMagicLink'];\n sendEmailVerification: AuthApi['sendEmailVerification'];\n verifyEmail: AuthApi['verifyEmail'];\n changePassword: AuthApi['changePassword'];\n setPassword: AuthApi['setPassword'];\n getPasswordStatus: AuthApi['getPasswordStatus'];\n logout: AuthApi['logout'];\n requestCrossDomainToken: AuthApi['requestCrossDomainToken'];\n exchangeToken: AuthApi['exchangeToken'];\n createRealtimeLoginToken: AuthApi['createRealtimeLoginToken'];\n getDomainMapping: AuthApi['getDomainMapping'];\n createSignup: AuthApi['createSignup'];\n createAccount: AuthApi['emailPasswordSignup'];\n\n // Two-Factor Authentication methods\n getTwoFactorStatus: AuthApi['getTwoFactorStatus'];\n setupTOTP: AuthApi['setupTOTP'];\n verifyTOTPSetup: AuthApi['verifyTOTPSetup'];\n setupWebAuthn: AuthApi['setupWebAuthn'];\n verifyWebAuthnSetup: AuthApi['verifyWebAuthnSetup'];\n verifyTOTPAuth: AuthApi['verifyTOTPAuth'];\n verifyRecoveryCodeAuth: AuthApi['verifyRecoveryCodeAuth'];\n getWebAuthnAuthOptions: AuthApi['getWebAuthnAuthOptions'];\n verifyWebAuthnAuth: AuthApi['verifyWebAuthnAuth'];\n generateRecoveryCodes: AuthApi['generateRecoveryCodes'];\n disableTwoFactorMethod: AuthApi['disableTwoFactorMethod'];\n updateTwoFactorMethod: AuthApi['updateTwoFactorMethod'];\n\n // Organization membership methods\n getMyOrganizations: AuthApi['getMyOrganizations'];\n\n // Credential change methods (Verified Credential Architecture)\n requestCredentialChange: AuthApi['requestCredentialChange'];\n verifyCredentialChange: AuthApi['verifyCredentialChange'];\n getPendingCredentialChanges: AuthApi['getPendingCredentialChanges'];\n cancelCredentialChange: AuthApi['cancelCredentialChange'];\n // Credential change invite methods (for members to view/confirm admin-initiated invites)\n getCredentialChangeInviteDetails: AuthApi['getCredentialChangeInviteDetails'];\n confirmCredentialChangeInvite: AuthApi['confirmCredentialChangeInvite'];\n\n // Consent (GDPR Art. 7(1))\n getConsentState: AuthApi['getConsentState'];\n updateConsent: AuthApi['updateConsent'];\n\n // Assignments API\n getAssignments: AssignmentsApi['getAssignments'];\n getAssignment: AssignmentsApi['getAssignment'];\n getAssignmentMessages: AssignmentsApi['getAssignmentMessages'];\n updateAssignment: AssignmentsApi['updateAssignment'];\n deleteAssignment: AssignmentsApi['deleteAssignment'];\n getAssignmentTask: AssignmentsApi['getAssignmentTask'];\n selectCurrentAssignmentTask: AssignmentsApi['selectCurrentAssignmentTask'];\n createAssignment: AssignmentsApi['createAssignment'];\n getAssignmentTaskDetail: AssignmentsApi['getAssignmentTaskDetail'];\n getAssignmentCelContext: AssignmentsApi['getAssignmentCelContext'];\n cancelAssignment: AssignmentsApi['cancelAssignment'];\n getAssignmentTools: AssignmentsApi['getAssignmentTools'];\n executeAssignmentTool: AssignmentsApi['executeAssignmentTool'];\n}\n\nexport function bindAuthMethods(\n target: AuthBindings,\n auth: AuthApi,\n assignments: AssignmentsApi\n): void {\n // Auth API\n target.getUserAccount = auth.getUserAccount.bind(auth);\n target.updateUserAccount = auth.updateUserAccount.bind(auth);\n target.recordAcquisition = auth.recordAcquisition.bind(auth);\n target.login = auth.login.bind(auth);\n target.resendCode = auth.resendCode.bind(auth);\n target.verifyCodeWith2FA = auth.verifyCodeWith2FA.bind(auth);\n target.emailPasswordLogin = auth.emailPasswordLogin.bind(auth);\n target.emailPasswordSignup = auth.emailPasswordSignup.bind(auth);\n target.requestMagicLink = auth.requestMagicLink.bind(auth);\n target.validateMagicLink = auth.validateMagicLink.bind(auth);\n target.sendEmailVerification = auth.sendEmailVerification.bind(auth);\n target.verifyEmail = auth.verifyEmail.bind(auth);\n target.changePassword = auth.changePassword.bind(auth);\n target.setPassword = auth.setPassword.bind(auth);\n target.getPasswordStatus = auth.getPasswordStatus.bind(auth);\n target.logout = auth.logout.bind(auth);\n target.requestCrossDomainToken = auth.requestCrossDomainToken.bind(auth);\n target.exchangeToken = auth.exchangeToken.bind(auth);\n target.createRealtimeLoginToken = auth.createRealtimeLoginToken.bind(auth);\n target.getDomainMapping = auth.getDomainMapping.bind(auth);\n target.createSignup = auth.createSignup.bind(auth);\n target.createAccount = auth.emailPasswordSignup.bind(auth);\n\n // Two-Factor Authentication API\n target.getTwoFactorStatus = auth.getTwoFactorStatus.bind(auth);\n target.setupTOTP = auth.setupTOTP.bind(auth);\n target.verifyTOTPSetup = auth.verifyTOTPSetup.bind(auth);\n target.setupWebAuthn = auth.setupWebAuthn.bind(auth);\n target.verifyWebAuthnSetup = auth.verifyWebAuthnSetup.bind(auth);\n target.verifyTOTPAuth = auth.verifyTOTPAuth.bind(auth);\n target.verifyRecoveryCodeAuth = auth.verifyRecoveryCodeAuth.bind(auth);\n target.getWebAuthnAuthOptions = auth.getWebAuthnAuthOptions.bind(auth);\n target.verifyWebAuthnAuth = auth.verifyWebAuthnAuth.bind(auth);\n target.generateRecoveryCodes = auth.generateRecoveryCodes.bind(auth);\n target.disableTwoFactorMethod = auth.disableTwoFactorMethod.bind(auth);\n target.updateTwoFactorMethod = auth.updateTwoFactorMethod.bind(auth);\n\n // Organization membership methods\n target.getMyOrganizations = auth.getMyOrganizations.bind(auth);\n\n // Credential change methods (Verified Credential Architecture)\n target.requestCredentialChange = auth.requestCredentialChange.bind(auth);\n target.verifyCredentialChange = auth.verifyCredentialChange.bind(auth);\n target.getPendingCredentialChanges = auth.getPendingCredentialChanges.bind(auth);\n target.cancelCredentialChange = auth.cancelCredentialChange.bind(auth);\n // Credential change invite methods (for members to view/confirm admin-initiated invites)\n target.getCredentialChangeInviteDetails = auth.getCredentialChangeInviteDetails.bind(auth);\n target.confirmCredentialChangeInvite = auth.confirmCredentialChangeInvite.bind(auth);\n\n // Consent (GDPR Art. 7(1))\n target.getConsentState = auth.getConsentState.bind(auth);\n target.updateConsent = auth.updateConsent.bind(auth);\n\n // Assignments API\n target.getAssignments = assignments.getAssignments.bind(assignments);\n target.getAssignment = assignments.getAssignment.bind(assignments);\n target.getAssignmentMessages = assignments.getAssignmentMessages.bind(assignments);\n target.updateAssignment = assignments.updateAssignment.bind(assignments);\n target.deleteAssignment = assignments.deleteAssignment.bind(assignments);\n target.getAssignmentTask = assignments.getAssignmentTask.bind(assignments);\n target.selectCurrentAssignmentTask = assignments.selectCurrentAssignmentTask.bind(assignments);\n target.createAssignment = assignments.createAssignment.bind(assignments);\n target.getAssignmentTaskDetail = assignments.getAssignmentTaskDetail.bind(assignments);\n target.getAssignmentCelContext = assignments.getAssignmentCelContext.bind(assignments);\n target.cancelAssignment = assignments.cancelAssignment.bind(assignments);\n target.getAssignmentTools = assignments.getAssignmentTools.bind(assignments);\n target.executeAssignmentTool = assignments.executeAssignmentTool.bind(assignments);\n}\n","import { SitesApi } from '../../api';\n\nexport interface SitesBindings {\n // Sites API\n getSites: SitesApi['getSites'];\n checkSiteSlugAvailability: SitesApi['checkSiteSlugAvailability'];\n checkSiteDomainAvailability: SitesApi['checkSiteDomainAvailability'];\n getSite: SitesApi['getSite'];\n getSiteSharing: SitesApi['getSiteSharing'];\n updateSiteSharing: SitesApi['updateSiteSharing'];\n getSiteSource: SitesApi['getSiteSource'];\n getSiteSourceTemplates: SitesApi['getSiteSourceTemplates'];\n createSiteSource: SitesApi['createSiteSource'];\n buildSiteSource: SitesApi['buildSiteSource'];\n publishSiteSource: SitesApi['publishSiteSource'];\n resetSiteSource: SitesApi['resetSiteSource'];\n rollbackSiteSource: SitesApi['rollbackSiteSource'];\n downloadSiteSourceZip: SitesApi['downloadSiteSourceZip'];\n importSiteSourceZip: SitesApi['importSiteSourceZip'];\n getThemeSettings: SitesApi['getThemeSettings'];\n updateThemeSettings: SitesApi['updateThemeSettings'];\n getSiteByUuid: SitesApi['getSiteByUuid'];\n getSiteRenderedPage: SitesApi['getSiteRenderedPage'];\n getSiteRenderedMenu: SitesApi['getSiteRenderedMenu'];\n siteSignup: SitesApi['siteSignup'];\n siteSendPhoneCode: SitesApi['siteSendPhoneCode'];\n siteSendEmailCode: SitesApi['siteSendEmailCode'];\n siteVerifyCode: SitesApi['siteVerifyCode'];\n siteGoogleOAuthInitiate: SitesApi['siteGoogleOAuthInitiate'];\n createSite: SitesApi['createSite'];\n updateSite: SitesApi['updateSite'];\n deleteSite: SitesApi['deleteSite'];\n getSitePages: SitesApi['getSitePages'];\n getPage: SitesApi['getPage'];\n getPageBySlug: SitesApi['getPageBySlug'];\n createPage: SitesApi['createPage'];\n updatePage: SitesApi['updatePage'];\n deletePage: SitesApi['deletePage'];\n getSiteCounts: SitesApi['getSiteCounts'];\n getSiteMenu: SitesApi['getSiteMenu'];\n getMenuItems: SitesApi['getMenuItems'];\n createMenuItem: SitesApi['createMenuItem'];\n updateMenuItem: SitesApi['updateMenuItem'];\n deleteMenuItem: SitesApi['deleteMenuItem'];\n reorderMenuItems: SitesApi['reorderMenuItems'];\n generateSiteMediaUploadUrl: SitesApi['generateSiteMediaUploadUrl'];\n}\n\nexport function bindSitesMethods(target: SitesBindings, sites: SitesApi): void {\n target.getSites = sites.getSites.bind(sites);\n target.checkSiteSlugAvailability = sites.checkSiteSlugAvailability.bind(sites);\n target.checkSiteDomainAvailability = sites.checkSiteDomainAvailability.bind(sites);\n target.getSite = sites.getSite.bind(sites);\n target.getSiteSharing = sites.getSiteSharing.bind(sites);\n target.updateSiteSharing = sites.updateSiteSharing.bind(sites);\n target.getSiteSource = sites.getSiteSource.bind(sites);\n target.getSiteSourceTemplates = sites.getSiteSourceTemplates.bind(sites);\n target.createSiteSource = sites.createSiteSource.bind(sites);\n target.buildSiteSource = sites.buildSiteSource.bind(sites);\n target.publishSiteSource = sites.publishSiteSource.bind(sites);\n target.resetSiteSource = sites.resetSiteSource.bind(sites);\n target.rollbackSiteSource = sites.rollbackSiteSource.bind(sites);\n target.downloadSiteSourceZip = sites.downloadSiteSourceZip.bind(sites);\n target.importSiteSourceZip = sites.importSiteSourceZip.bind(sites);\n target.getThemeSettings = sites.getThemeSettings.bind(sites);\n target.updateThemeSettings = sites.updateThemeSettings.bind(sites);\n target.getSiteByUuid = sites.getSiteByUuid.bind(sites);\n target.getSiteRenderedPage = sites.getSiteRenderedPage.bind(sites);\n target.getSiteRenderedMenu = sites.getSiteRenderedMenu.bind(sites);\n target.siteSignup = sites.siteSignup.bind(sites);\n target.siteSendPhoneCode = sites.siteSendPhoneCode.bind(sites);\n target.siteSendEmailCode = sites.siteSendEmailCode.bind(sites);\n target.siteVerifyCode = sites.siteVerifyCode.bind(sites);\n target.siteGoogleOAuthInitiate = sites.siteGoogleOAuthInitiate.bind(sites);\n target.createSite = sites.createSite.bind(sites);\n target.updateSite = sites.updateSite.bind(sites);\n target.deleteSite = sites.deleteSite.bind(sites);\n target.getSitePages = sites.getSitePages.bind(sites);\n target.getPage = sites.getPage.bind(sites);\n target.getPageBySlug = sites.getPageBySlug.bind(sites);\n target.createPage = sites.createPage.bind(sites);\n target.updatePage = sites.updatePage.bind(sites);\n target.deletePage = sites.deletePage.bind(sites);\n target.getSiteCounts = sites.getSiteCounts.bind(sites);\n target.getSiteMenu = sites.getSiteMenu.bind(sites);\n target.getMenuItems = sites.getMenuItems.bind(sites);\n target.createMenuItem = sites.createMenuItem.bind(sites);\n target.updateMenuItem = sites.updateMenuItem.bind(sites);\n target.deleteMenuItem = sites.deleteMenuItem.bind(sites);\n target.reorderMenuItems = sites.reorderMenuItems.bind(sites);\n target.generateSiteMediaUploadUrl = sites.generateSiteMediaUploadUrl.bind(sites);\n}\n","import { FilesApi } from '../../api';\n\nexport interface FilesBindings {\n // Files API\n getFiles: FilesApi['getFiles'];\n getFile: FilesApi['getFile'];\n downloadFileContents: FilesApi['downloadFileContents'];\n downloadFilesZip: FilesApi['downloadFilesZip'];\n createFile: FilesApi['createFile'];\n uploadFile: FilesApi['uploadFile'];\n updateFile: FilesApi['updateFile'];\n deleteFile: FilesApi['deleteFile'];\n resolveFilePath: FilesApi['resolveFilePath'];\n listFileVersions: FilesApi['listFileVersions'];\n getFileVersionDiff: FilesApi['getFileVersionDiff'];\n restoreFileVersion: FilesApi['restoreFileVersion'];\n getFileVersionContentsUrl: FilesApi['getFileVersionContentsUrl'];\n convertFile: FilesApi['convertFile'];\n generateFileUploadUrl: FilesApi['generateFileUploadUrl'];\n getFolders: FilesApi['getFolders'];\n getFolder: FilesApi['getFolder'];\n createFolder: FilesApi['createFolder'];\n updateFolder: FilesApi['updateFolder'];\n deleteFolder: FilesApi['deleteFolder'];\n reindexFolder: FilesApi['reindexFolder'];\n searchFolder: FilesApi['searchFolder'];\n // File Labels API\n getFileLabels: FilesApi['getFileLabels'];\n getFileLabel: FilesApi['getFileLabel'];\n getFileLabelByUuid: FilesApi['getFileLabelByUuid'];\n createFileLabel: FilesApi['createFileLabel'];\n updateFileLabel: FilesApi['updateFileLabel'];\n deleteFileLabel: FilesApi['deleteFileLabel'];\n // File/Folder Sharing API\n getFileSharing: FilesApi['getFileSharing'];\n updateFileRoles: FilesApi['updateFileRoles'];\n removeFileRole: FilesApi['removeFileRole'];\n getFolderSharing: FilesApi['getFolderSharing'];\n getFolderMemberAccess: FilesApi['getFolderMemberAccess'];\n updateFolderRoles: FilesApi['updateFolderRoles'];\n removeFolderRole: FilesApi['removeFolderRole'];\n // Batch Sharing API\n updateFileSharing: FilesApi['updateFileSharing'];\n updateFolderSharing: FilesApi['updateFolderSharing'];\n // Public Sharing API\n getPublicFile: FilesApi['getPublicFile'];\n getPublicFolder: FilesApi['getPublicFolder'];\n getPublicFolderFiles: FilesApi['getPublicFolderFiles'];\n}\n\nexport function bindFilesMethods(target: FilesBindings, files: FilesApi): void {\n target.getFiles = files.getFiles.bind(files);\n target.getFile = files.getFile.bind(files);\n target.downloadFileContents = files.downloadFileContents.bind(files);\n target.downloadFilesZip = files.downloadFilesZip.bind(files);\n target.createFile = files.createFile.bind(files);\n target.uploadFile = files.uploadFile.bind(files);\n target.updateFile = files.updateFile.bind(files);\n target.deleteFile = files.deleteFile.bind(files);\n target.resolveFilePath = files.resolveFilePath.bind(files);\n target.listFileVersions = files.listFileVersions.bind(files);\n target.getFileVersionDiff = files.getFileVersionDiff.bind(files);\n target.restoreFileVersion = files.restoreFileVersion.bind(files);\n target.getFileVersionContentsUrl = files.getFileVersionContentsUrl.bind(files);\n target.convertFile = files.convertFile.bind(files);\n target.generateFileUploadUrl = files.generateFileUploadUrl.bind(files);\n target.getFolders = files.getFolders.bind(files);\n target.getFolder = files.getFolder.bind(files);\n target.createFolder = files.createFolder.bind(files);\n target.updateFolder = files.updateFolder.bind(files);\n target.deleteFolder = files.deleteFolder.bind(files);\n target.reindexFolder = files.reindexFolder.bind(files);\n target.searchFolder = files.searchFolder.bind(files);\n // Scoped Folders API\n // File Labels API\n target.getFileLabels = files.getFileLabels.bind(files);\n target.getFileLabel = files.getFileLabel.bind(files);\n target.getFileLabelByUuid = files.getFileLabelByUuid.bind(files);\n target.createFileLabel = files.createFileLabel.bind(files);\n target.updateFileLabel = files.updateFileLabel.bind(files);\n target.deleteFileLabel = files.deleteFileLabel.bind(files);\n // File/Folder Sharing API\n target.getFileSharing = files.getFileSharing.bind(files);\n target.updateFileRoles = files.updateFileRoles.bind(files);\n target.removeFileRole = files.removeFileRole.bind(files);\n target.getFolderSharing = files.getFolderSharing.bind(files);\n target.getFolderMemberAccess = files.getFolderMemberAccess.bind(files);\n target.updateFolderRoles = files.updateFolderRoles.bind(files);\n target.removeFolderRole = files.removeFolderRole.bind(files);\n // Batch Sharing API\n target.updateFileSharing = files.updateFileSharing.bind(files);\n target.updateFolderSharing = files.updateFolderSharing.bind(files);\n // Public Sharing API\n target.getPublicFile = files.getPublicFile.bind(files);\n target.getPublicFolder = files.getPublicFolder.bind(files);\n target.getPublicFolderFiles = files.getPublicFolderFiles.bind(files);\n}\n","import { ProjectsApi } from '../../api';\n\nexport interface ProjectsBindings {\n getProjects: ProjectsApi['getProjects'];\n getProject: ProjectsApi['getProject'];\n getPlan: ProjectsApi['getPlan'];\n updateProject: ProjectsApi['updateProject'];\n updatePlan: ProjectsApi['updatePlan'];\n}\n\nexport function bindProjectsMethods(target: ProjectsBindings, projects: ProjectsApi): void {\n target.getProjects = projects.getProjects.bind(projects);\n target.getProject = projects.getProject.bind(projects);\n target.getPlan = projects.getPlan.bind(projects);\n target.updateProject = projects.updateProject.bind(projects);\n target.updatePlan = projects.updatePlan.bind(projects);\n}\n","import { EventsApi } from '../../api';\n\nexport interface EventsBindings {\n // Event Rules API\n getEventRules: EventsApi['getEventRules'];\n getAvailableActions: EventsApi['getAvailableActions'];\n searchEventRules: EventsApi['searchEventRules'];\n getEventRule: EventsApi['getEventRule'];\n createEventRule: EventsApi['createEventRule'];\n updateEventRule: EventsApi['updateEventRule'];\n deleteEventRule: EventsApi['deleteEventRule'];\n testWebhook: EventsApi['testWebhook'];\n reorderEventRules: EventsApi['reorderEventRules'];\n getWebhookLogs: EventsApi['getWebhookLogs'];\n getRuleExecutions: EventsApi['getRuleExecutions'];\n\n // Routines API\n getRoutines: EventsApi['getRoutines'];\n getRoutine: EventsApi['getRoutine'];\n createRoutine: EventsApi['createRoutine'];\n updateRoutine: EventsApi['updateRoutine'];\n deleteRoutine: EventsApi['deleteRoutine'];\n runRoutine: EventsApi['runRoutine'];\n getRoutineConfigEvents: EventsApi['getRoutineConfigEvents'];\n getRoutineRuns: EventsApi['getRoutineRuns'];\n resetRoutineRuns: EventsApi['resetRoutineRuns'];\n previewSchedule: EventsApi['previewSchedule'];\n previewRoutineVoiceReadiness: EventsApi['previewRoutineVoiceReadiness'];\n}\n\nexport function bindEventsMethods(target: EventsBindings, events: EventsApi): void {\n // Event Rules API\n target.getEventRules = events.getEventRules.bind(events);\n target.getAvailableActions = events.getAvailableActions.bind(events);\n target.searchEventRules = events.searchEventRules.bind(events);\n target.getEventRule = events.getEventRule.bind(events);\n target.createEventRule = events.createEventRule.bind(events);\n target.updateEventRule = events.updateEventRule.bind(events);\n target.deleteEventRule = events.deleteEventRule.bind(events);\n target.testWebhook = events.testWebhook.bind(events);\n target.reorderEventRules = events.reorderEventRules.bind(events);\n target.getWebhookLogs = events.getWebhookLogs.bind(events);\n target.getRuleExecutions = events.getRuleExecutions.bind(events);\n\n // Routines API\n target.getRoutines = events.getRoutines.bind(events);\n target.getRoutine = events.getRoutine.bind(events);\n target.createRoutine = events.createRoutine.bind(events);\n target.updateRoutine = events.updateRoutine.bind(events);\n target.deleteRoutine = events.deleteRoutine.bind(events);\n target.runRoutine = events.runRoutine.bind(events);\n target.getRoutineConfigEvents = events.getRoutineConfigEvents.bind(events);\n target.getRoutineRuns = events.getRoutineRuns.bind(events);\n target.resetRoutineRuns = events.resetRoutineRuns.bind(events);\n target.previewSchedule = events.previewSchedule.bind(events);\n target.previewRoutineVoiceReadiness = events.previewRoutineVoiceReadiness.bind(events);\n}\n","import { ExperimentsApi } from '../../api';\n\nexport interface ExperimentsBindings {\n getExperiments: ExperimentsApi['getExperiments'];\n getExperiment: ExperimentsApi['getExperiment'];\n createExperiment: ExperimentsApi['createExperiment'];\n updateExperiment: ExperimentsApi['updateExperiment'];\n deleteExperiment: ExperimentsApi['deleteExperiment'];\n createExperimentGroup: ExperimentsApi['createExperimentGroup'];\n updateExperimentGroup: ExperimentsApi['updateExperimentGroup'];\n deleteExperimentGroup: ExperimentsApi['deleteExperimentGroup'];\n getExperimentStats: ExperimentsApi['getExperimentStats'];\n getMemberExperiments: ExperimentsApi['getMemberExperiments'];\n createExperimentAssignment: ExperimentsApi['createExperimentAssignment'];\n updateExperimentAssignment: ExperimentsApi['updateExperimentAssignment'];\n deleteExperimentAssignment: ExperimentsApi['deleteExperimentAssignment'];\n}\n\nexport function bindExperimentsMethods(\n target: ExperimentsBindings,\n experiments: ExperimentsApi\n): void {\n target.getExperiments = experiments.getExperiments.bind(experiments);\n target.getExperiment = experiments.getExperiment.bind(experiments);\n target.createExperiment = experiments.createExperiment.bind(experiments);\n target.updateExperiment = experiments.updateExperiment.bind(experiments);\n target.deleteExperiment = experiments.deleteExperiment.bind(experiments);\n target.createExperimentGroup = experiments.createExperimentGroup.bind(experiments);\n target.updateExperimentGroup = experiments.updateExperimentGroup.bind(experiments);\n target.deleteExperimentGroup = experiments.deleteExperimentGroup.bind(experiments);\n target.getExperimentStats = experiments.getExperimentStats.bind(experiments);\n target.getMemberExperiments = experiments.getMemberExperiments.bind(experiments);\n target.createExperimentAssignment = experiments.createExperimentAssignment.bind(experiments);\n target.updateExperimentAssignment = experiments.updateExperimentAssignment.bind(experiments);\n target.deleteExperimentAssignment = experiments.deleteExperimentAssignment.bind(experiments);\n}\n","import { WorkflowsApi, VoiceApi, SupervisorsApi } from '../../api';\nimport { WorkflowNotesApi } from '../../api/workflow-notes';\n\nexport interface WorkflowsBindings {\n // Workflows API\n getWorkflows: WorkflowsApi['getWorkflows'];\n getWorkflow: WorkflowsApi['getWorkflow'];\n getWorkflowOpeningTurnConversionReport: WorkflowsApi['getWorkflowOpeningTurnConversionReport'];\n convertWorkflowStartTaskOpeningMessage: WorkflowsApi['convertWorkflowStartTaskOpeningMessage'];\n getWorkflowActivity: WorkflowsApi['getWorkflowActivity'];\n getWorkflowsActivityBatch: WorkflowsApi['getWorkflowsActivityBatch'];\n getWorkflowDiagram: WorkflowsApi['getWorkflowDiagram'];\n getWorkflowThumbnailUrl: WorkflowsApi['getWorkflowThumbnailUrl'];\n createWorkflow: WorkflowsApi['createWorkflow'];\n updateWorkflow: WorkflowsApi['updateWorkflow'];\n getWorkflowDeletionPreview: WorkflowsApi['getWorkflowDeletionPreview'];\n deleteWorkflow: WorkflowsApi['deleteWorkflow'];\n archiveWorkflow: WorkflowsApi['archiveWorkflow'];\n unarchiveWorkflow: WorkflowsApi['unarchiveWorkflow'];\n cloneWorkflow: WorkflowsApi['cloneWorkflow'];\n getWorkflowTemplates: WorkflowsApi['getWorkflowTemplates'];\n createWorkflowFromTemplate: WorkflowsApi['createWorkflowFromTemplate'];\n getWorkflowTaskAssignmentStats: WorkflowsApi['getWorkflowTaskAssignmentStats'];\n getTaskChats: WorkflowsApi['getTaskChats'];\n getWorkflowConfigValidation: WorkflowsApi['getWorkflowConfigValidation'];\n\n // Workflow Notes API\n getWorkflowNotes: WorkflowNotesApi['getWorkflowNotes'];\n createWorkflowNote: WorkflowNotesApi['createWorkflowNote'];\n updateWorkflowNote: WorkflowNotesApi['updateWorkflowNote'];\n deleteWorkflowNote: WorkflowNotesApi['deleteWorkflowNote'];\n\n // Workflow Feedback API\n getWorkflowFeedback: WorkflowsApi['getWorkflowFeedback'];\n\n // Workflow Contributors API\n getWorkflowContributors: WorkflowsApi['getWorkflowContributors'];\n createWorkflowContributor: WorkflowsApi['createWorkflowContributor'];\n updateWorkflowContributor: WorkflowsApi['updateWorkflowContributor'];\n deleteWorkflowContributor: WorkflowsApi['deleteWorkflowContributor'];\n\n // Workflow Revisions API\n getWorkflowRevisions: WorkflowsApi['getWorkflowRevisions'];\n getWorkflowRevision: WorkflowsApi['getWorkflowRevision'];\n publishWorkflowRevision: WorkflowsApi['publishWorkflowRevision'];\n activateWorkflowRevision: WorkflowsApi['activateWorkflowRevision'];\n updateWorkflowRevisionMetadata: WorkflowsApi['updateWorkflowRevisionMetadata'];\n diffWorkflowRevisions: WorkflowsApi['diffWorkflowRevisions'];\n editWorkflowRevisionAsDraft: WorkflowsApi['editWorkflowRevisionAsDraft'];\n\n // Workspace Builders API\n getWorkspaceBuilders: WorkflowsApi['getWorkspaceBuilders'];\n getWorkspaceBuilder: WorkflowsApi['getWorkspaceBuilder'];\n buildWorkspace: WorkflowsApi['buildWorkspace'];\n validateWorkflowName: WorkflowsApi['validateWorkflowName'];\n\n // Voice API\n previewTTS: VoiceApi['previewTTS'];\n previewThinkingSound: VoiceApi['previewThinkingSound'];\n\n // Supervisors API\n getSupervisors: SupervisorsApi['getSupervisors'];\n getSupervisor: SupervisorsApi['getSupervisor'];\n createSupervisor: SupervisorsApi['createSupervisor'];\n updateSupervisor: SupervisorsApi['updateSupervisor'];\n deleteSupervisor: SupervisorsApi['deleteSupervisor'];\n}\n\nexport function bindWorkflowsMethods(\n target: WorkflowsBindings,\n workflows: WorkflowsApi,\n workflowNotes: WorkflowNotesApi,\n voice: VoiceApi,\n supervisors: SupervisorsApi\n): void {\n // Workflows API\n target.getWorkflows = workflows.getWorkflows.bind(workflows);\n target.getWorkflow = workflows.getWorkflow.bind(workflows);\n target.getWorkflowOpeningTurnConversionReport =\n workflows.getWorkflowOpeningTurnConversionReport.bind(workflows);\n target.convertWorkflowStartTaskOpeningMessage =\n workflows.convertWorkflowStartTaskOpeningMessage.bind(workflows);\n target.getWorkflowActivity = workflows.getWorkflowActivity.bind(workflows);\n target.getWorkflowsActivityBatch = workflows.getWorkflowsActivityBatch.bind(workflows);\n target.getWorkflowDiagram = workflows.getWorkflowDiagram.bind(workflows);\n target.getWorkflowThumbnailUrl = workflows.getWorkflowThumbnailUrl.bind(workflows);\n target.createWorkflow = workflows.createWorkflow.bind(workflows);\n target.updateWorkflow = workflows.updateWorkflow.bind(workflows);\n target.getWorkflowDeletionPreview = workflows.getWorkflowDeletionPreview.bind(workflows);\n target.deleteWorkflow = workflows.deleteWorkflow.bind(workflows);\n target.archiveWorkflow = workflows.archiveWorkflow.bind(workflows);\n target.unarchiveWorkflow = workflows.unarchiveWorkflow.bind(workflows);\n target.cloneWorkflow = workflows.cloneWorkflow.bind(workflows);\n target.getWorkflowTemplates = workflows.getWorkflowTemplates.bind(workflows);\n target.createWorkflowFromTemplate = workflows.createWorkflowFromTemplate.bind(workflows);\n target.getWorkflowTaskAssignmentStats = workflows.getWorkflowTaskAssignmentStats.bind(workflows);\n target.getTaskChats = workflows.getTaskChats.bind(workflows);\n target.getWorkflowConfigValidation = workflows.getWorkflowConfigValidation.bind(workflows);\n\n // Workflow Notes API\n target.getWorkflowNotes = workflowNotes.getWorkflowNotes.bind(workflowNotes);\n target.createWorkflowNote = workflowNotes.createWorkflowNote.bind(workflowNotes);\n target.updateWorkflowNote = workflowNotes.updateWorkflowNote.bind(workflowNotes);\n target.deleteWorkflowNote = workflowNotes.deleteWorkflowNote.bind(workflowNotes);\n\n // Workflow Feedback API\n target.getWorkflowFeedback = workflows.getWorkflowFeedback.bind(workflows);\n\n // Workflow Contributors API\n target.getWorkflowContributors = workflows.getWorkflowContributors.bind(workflows);\n target.createWorkflowContributor = workflows.createWorkflowContributor.bind(workflows);\n target.updateWorkflowContributor = workflows.updateWorkflowContributor.bind(workflows);\n target.deleteWorkflowContributor = workflows.deleteWorkflowContributor.bind(workflows);\n\n // Workflow Revisions API\n target.getWorkflowRevisions = workflows.getWorkflowRevisions.bind(workflows);\n target.getWorkflowRevision = workflows.getWorkflowRevision.bind(workflows);\n target.publishWorkflowRevision = workflows.publishWorkflowRevision.bind(workflows);\n target.activateWorkflowRevision = workflows.activateWorkflowRevision.bind(workflows);\n target.updateWorkflowRevisionMetadata = workflows.updateWorkflowRevisionMetadata.bind(workflows);\n target.diffWorkflowRevisions = workflows.diffWorkflowRevisions.bind(workflows);\n target.editWorkflowRevisionAsDraft = workflows.editWorkflowRevisionAsDraft.bind(workflows);\n\n // Workspace Builders API\n target.getWorkspaceBuilders = workflows.getWorkspaceBuilders.bind(workflows);\n target.getWorkspaceBuilder = workflows.getWorkspaceBuilder.bind(workflows);\n target.buildWorkspace = workflows.buildWorkspace.bind(workflows);\n target.validateWorkflowName = workflows.validateWorkflowName.bind(workflows);\n\n // Voice API\n target.previewTTS = voice.previewTTS.bind(voice);\n target.previewThinkingSound = voice.previewThinkingSound.bind(voice);\n\n // Supervisors API\n target.getSupervisors = supervisors.getSupervisors.bind(supervisors);\n target.getSupervisor = supervisors.getSupervisor.bind(supervisors);\n target.createSupervisor = supervisors.createSupervisor.bind(supervisors);\n target.updateSupervisor = supervisors.updateSupervisor.bind(supervisors);\n target.deleteSupervisor = supervisors.deleteSupervisor.bind(supervisors);\n}\n","import { CalendarsApi } from '../../api';\n\nexport interface CalendarsBindings {\n // Calendars API\n getCalendars: CalendarsApi['getCalendars'];\n getCalendar: CalendarsApi['getCalendar'];\n createCalendar: CalendarsApi['createCalendar'];\n updateCalendar: CalendarsApi['updateCalendar'];\n deleteCalendar: CalendarsApi['deleteCalendar'];\n getCalendarSchedules: CalendarsApi['getCalendarSchedules'];\n createCalendarSchedule: CalendarsApi['createCalendarSchedule'];\n updateCalendarSchedule: CalendarsApi['updateCalendarSchedule'];\n deleteCalendarSchedule: CalendarsApi['deleteCalendarSchedule'];\n checkAvailability: CalendarsApi['checkAvailability'];\n getAvailableSlots: CalendarsApi['getAvailableSlots'];\n getCalendarEvents: CalendarsApi['getCalendarEvents'];\n getCalendarEvent: CalendarsApi['getCalendarEvent'];\n createCalendarEvent: CalendarsApi['createCalendarEvent'];\n updateCalendarEvent: CalendarsApi['updateCalendarEvent'];\n cancelCalendarEvent: CalendarsApi['cancelCalendarEvent'];\n deleteCalendarEvent: CalendarsApi['deleteCalendarEvent'];\n updateEventAttendee: CalendarsApi['updateEventAttendee'];\n getCalendarEventTypes: CalendarsApi['getEventTypes'];\n getCalendarEventType: CalendarsApi['getEventType'];\n createCalendarEventType: CalendarsApi['createEventType'];\n updateCalendarEventType: CalendarsApi['updateEventType'];\n deleteCalendarEventType: CalendarsApi['deleteEventType'];\n generateICalToken: CalendarsApi['generateICalToken'];\n revokeICalToken: CalendarsApi['revokeICalToken'];\n getICalFeedUrl: CalendarsApi['getICalFeedUrl'];\n getGoogleCalendarStatus: CalendarsApi['getGoogleCalendarStatus'];\n listGoogleCalendars: CalendarsApi['listGoogleCalendars'];\n linkCalendarToGoogle: CalendarsApi['linkCalendarToGoogle'];\n unlinkCalendarFromGoogle: CalendarsApi['unlinkCalendarFromGoogle'];\n syncCalendarWithGoogle: CalendarsApi['syncCalendarWithGoogle'];\n}\n\nexport function bindCalendarsMethods(target: CalendarsBindings, calendars: CalendarsApi): void {\n // Calendars API\n target.getCalendars = calendars.getCalendars.bind(calendars);\n target.getCalendar = calendars.getCalendar.bind(calendars);\n target.createCalendar = calendars.createCalendar.bind(calendars);\n target.updateCalendar = calendars.updateCalendar.bind(calendars);\n target.deleteCalendar = calendars.deleteCalendar.bind(calendars);\n target.getCalendarSchedules = calendars.getCalendarSchedules.bind(calendars);\n target.createCalendarSchedule = calendars.createCalendarSchedule.bind(calendars);\n target.updateCalendarSchedule = calendars.updateCalendarSchedule.bind(calendars);\n target.deleteCalendarSchedule = calendars.deleteCalendarSchedule.bind(calendars);\n target.checkAvailability = calendars.checkAvailability.bind(calendars);\n target.getAvailableSlots = calendars.getAvailableSlots.bind(calendars);\n target.getCalendarEvents = calendars.getCalendarEvents.bind(calendars);\n target.getCalendarEvent = calendars.getCalendarEvent.bind(calendars);\n target.createCalendarEvent = calendars.createCalendarEvent.bind(calendars);\n target.updateCalendarEvent = calendars.updateCalendarEvent.bind(calendars);\n target.cancelCalendarEvent = calendars.cancelCalendarEvent.bind(calendars);\n target.deleteCalendarEvent = calendars.deleteCalendarEvent.bind(calendars);\n target.updateEventAttendee = calendars.updateEventAttendee.bind(calendars);\n target.getCalendarEventTypes = calendars.getEventTypes.bind(calendars);\n target.getCalendarEventType = calendars.getEventType.bind(calendars);\n target.createCalendarEventType = calendars.createEventType.bind(calendars);\n target.updateCalendarEventType = calendars.updateEventType.bind(calendars);\n target.deleteCalendarEventType = calendars.deleteEventType.bind(calendars);\n target.generateICalToken = calendars.generateICalToken.bind(calendars);\n target.revokeICalToken = calendars.revokeICalToken.bind(calendars);\n target.getICalFeedUrl = calendars.getICalFeedUrl.bind(calendars);\n target.getGoogleCalendarStatus = calendars.getGoogleCalendarStatus.bind(calendars);\n target.listGoogleCalendars = calendars.listGoogleCalendars.bind(calendars);\n target.linkCalendarToGoogle = calendars.linkCalendarToGoogle.bind(calendars);\n target.unlinkCalendarFromGoogle = calendars.unlinkCalendarFromGoogle.bind(calendars);\n target.syncCalendarWithGoogle = calendars.syncCalendarWithGoogle.bind(calendars);\n}\n","import { PhoneNumbersApi, InboxesApi, NotificationRulesApi } from '../../api';\n\nexport interface CommunicationsBindings {\n // Phone Numbers API\n getPhoneNumbers: PhoneNumbersApi['getPhoneNumbers'];\n getAvailablePhoneNumbers: PhoneNumbersApi['getAvailablePhoneNumbers'];\n requestPhoneNumber: PhoneNumbersApi['requestPhoneNumber'];\n getPhoneNumber: PhoneNumbersApi['getPhoneNumber'];\n createPhoneNumber: PhoneNumbersApi['createPhoneNumber'];\n updatePhoneNumber: PhoneNumbersApi['updatePhoneNumber'];\n getArchiveBlockers: PhoneNumbersApi['getArchiveBlockers'];\n archivePhoneNumber: PhoneNumbersApi['archivePhoneNumber'];\n getPhoneNumberCalls: PhoneNumbersApi['getPhoneNumberCalls'];\n getPhoneNumberOutboundAnalyticsSummary: PhoneNumbersApi['getPhoneNumberOutboundAnalyticsSummary'];\n getPhoneNumberOutboundAnalyticsCalls: PhoneNumbersApi['getPhoneNumberOutboundAnalyticsCalls'];\n exportPhoneNumberOutboundAnalyticsCsv: PhoneNumbersApi['exportPhoneNumberOutboundAnalyticsCsv'];\n getPhoneNumberMessages: PhoneNumbersApi['getPhoneNumberMessages'];\n getPhoneNumberFaxes: PhoneNumbersApi['getPhoneNumberFaxes'];\n getPhoneNumberVoicemails: PhoneNumbersApi['getPhoneNumberVoicemails'];\n fetchVoicemailAudio: PhoneNumbersApi['fetchVoicemailAudio'];\n updateVoicemailStatus: PhoneNumbersApi['updateVoicemailStatus'];\n releasePhoneNumber: PhoneNumbersApi['releasePhoneNumber'];\n getLinkablePhones: PhoneNumbersApi['getLinkablePhones'];\n linkPhoneNumber: PhoneNumbersApi['linkPhoneNumber'];\n\n // Inboxes API\n getInboxes: InboxesApi['getInboxes'];\n getInbox: InboxesApi['getInbox'];\n createInbox: InboxesApi['createInbox'];\n updateInbox: InboxesApi['updateInbox'];\n deleteInbox: InboxesApi['deleteInbox'];\n getInboxEmails: InboxesApi['getInboxEmails'];\n getInboxEmail: InboxesApi['getInboxEmail'];\n markEmailAsRead: InboxesApi['markEmailAsRead'];\n markEmailAsUnread: InboxesApi['markEmailAsUnread'];\n addEmailSenderAsMember: InboxesApi['addEmailSenderAsMember'];\n convertEmail: InboxesApi['convertEmail'];\n downloadEmailAttachment: InboxesApi['downloadEmailAttachment'];\n getInboxThreads: InboxesApi['getInboxThreads'];\n getThreadEmails: InboxesApi['getThreadEmails'];\n getChatEmails: InboxesApi['getChatEmails'];\n replyToEmail: InboxesApi['replyToEmail'];\n sendInboxEmail: InboxesApi['sendInboxEmail'];\n previewInboxEmail: InboxesApi['previewInboxEmail'];\n previewEmailReply: InboxesApi['previewEmailReply'];\n\n // Notification Rules API\n getNotificationRules: NotificationRulesApi['getNotificationRules'];\n createNotificationRule: NotificationRulesApi['createNotificationRule'];\n updateNotificationRule: NotificationRulesApi['updateNotificationRule'];\n deleteNotificationRule: NotificationRulesApi['deleteNotificationRule'];\n}\n\nexport function bindCommunicationsMethods(\n target: CommunicationsBindings,\n phoneNumbers: PhoneNumbersApi,\n inboxes: InboxesApi,\n notificationRules: NotificationRulesApi\n): void {\n // Phone Numbers API\n target.getPhoneNumbers = phoneNumbers.getPhoneNumbers.bind(phoneNumbers);\n target.getAvailablePhoneNumbers = phoneNumbers.getAvailablePhoneNumbers.bind(phoneNumbers);\n target.requestPhoneNumber = phoneNumbers.requestPhoneNumber.bind(phoneNumbers);\n target.getPhoneNumber = phoneNumbers.getPhoneNumber.bind(phoneNumbers);\n target.createPhoneNumber = phoneNumbers.createPhoneNumber.bind(phoneNumbers);\n target.updatePhoneNumber = phoneNumbers.updatePhoneNumber.bind(phoneNumbers);\n target.getArchiveBlockers = phoneNumbers.getArchiveBlockers.bind(phoneNumbers);\n target.archivePhoneNumber = phoneNumbers.archivePhoneNumber.bind(phoneNumbers);\n target.getPhoneNumberCalls = phoneNumbers.getPhoneNumberCalls.bind(phoneNumbers);\n target.getPhoneNumberOutboundAnalyticsSummary =\n phoneNumbers.getPhoneNumberOutboundAnalyticsSummary.bind(phoneNumbers);\n target.getPhoneNumberOutboundAnalyticsCalls =\n phoneNumbers.getPhoneNumberOutboundAnalyticsCalls.bind(phoneNumbers);\n target.exportPhoneNumberOutboundAnalyticsCsv =\n phoneNumbers.exportPhoneNumberOutboundAnalyticsCsv.bind(phoneNumbers);\n target.getPhoneNumberMessages = phoneNumbers.getPhoneNumberMessages.bind(phoneNumbers);\n target.getPhoneNumberFaxes = phoneNumbers.getPhoneNumberFaxes.bind(phoneNumbers);\n target.getPhoneNumberVoicemails = phoneNumbers.getPhoneNumberVoicemails.bind(phoneNumbers);\n target.fetchVoicemailAudio = phoneNumbers.fetchVoicemailAudio.bind(phoneNumbers);\n target.updateVoicemailStatus = phoneNumbers.updateVoicemailStatus.bind(phoneNumbers);\n target.releasePhoneNumber = phoneNumbers.releasePhoneNumber.bind(phoneNumbers);\n target.getLinkablePhones = phoneNumbers.getLinkablePhones.bind(phoneNumbers);\n target.linkPhoneNumber = phoneNumbers.linkPhoneNumber.bind(phoneNumbers);\n\n // Inboxes API\n target.getInboxes = inboxes.getInboxes.bind(inboxes);\n target.getInbox = inboxes.getInbox.bind(inboxes);\n target.createInbox = inboxes.createInbox.bind(inboxes);\n target.updateInbox = inboxes.updateInbox.bind(inboxes);\n target.deleteInbox = inboxes.deleteInbox.bind(inboxes);\n target.getInboxEmails = inboxes.getInboxEmails.bind(inboxes);\n target.getInboxEmail = inboxes.getInboxEmail.bind(inboxes);\n target.markEmailAsRead = inboxes.markEmailAsRead.bind(inboxes);\n target.markEmailAsUnread = inboxes.markEmailAsUnread.bind(inboxes);\n target.addEmailSenderAsMember = inboxes.addEmailSenderAsMember.bind(inboxes);\n target.convertEmail = inboxes.convertEmail.bind(inboxes);\n target.downloadEmailAttachment = inboxes.downloadEmailAttachment.bind(inboxes);\n target.getInboxThreads = inboxes.getInboxThreads.bind(inboxes);\n target.getThreadEmails = inboxes.getThreadEmails.bind(inboxes);\n target.getChatEmails = inboxes.getChatEmails.bind(inboxes);\n target.replyToEmail = inboxes.replyToEmail.bind(inboxes);\n target.sendInboxEmail = inboxes.sendInboxEmail.bind(inboxes);\n target.previewInboxEmail = inboxes.previewInboxEmail.bind(inboxes);\n target.previewEmailReply = inboxes.previewEmailReply.bind(inboxes);\n\n // Notification Rules API\n target.getNotificationRules = notificationRules.getNotificationRules.bind(notificationRules);\n target.createNotificationRule = notificationRules.createNotificationRule.bind(notificationRules);\n target.updateNotificationRule = notificationRules.updateNotificationRule.bind(notificationRules);\n target.deleteNotificationRule = notificationRules.deleteNotificationRule.bind(notificationRules);\n}\n","import {\n ToolkitsApi,\n CustomToolkitsApi,\n McpServersApi,\n TemplatesApi,\n FeaturesApi,\n AIModelsApi,\n} from '../../api';\n\nexport interface ToolkitsBindings {\n // Toolkits API\n getToolkits: ToolkitsApi['getToolkits'];\n getTool: ToolkitsApi['getTool'];\n\n // Templates API\n getTemplateContext: TemplatesApi['getTemplateContext'];\n previewTemplate: TemplatesApi['previewTemplate'];\n getVariableRegistry: TemplatesApi['getVariableRegistry'];\n\n // AI Models API\n getChatModels: AIModelsApi['getChatModels'];\n getManagerModels: AIModelsApi['getManagerModels'];\n getRealtimeModels: AIModelsApi['getRealtimeModels'];\n getSTTModels: AIModelsApi['getSTTModels'];\n getTTSModels: AIModelsApi['getTTSModels'];\n getVoiceModels: AIModelsApi['getVoiceModels'];\n getVoicePresets: AIModelsApi['getVoicePresets'];\n getAllModels: AIModelsApi['getAllModels'];\n\n // Custom Toolkits API\n getCustomToolkits: CustomToolkitsApi['getCustomToolkits'];\n getCustomToolkit: CustomToolkitsApi['getCustomToolkit'];\n createCustomToolkit: CustomToolkitsApi['createCustomToolkit'];\n updateCustomToolkit: CustomToolkitsApi['updateCustomToolkit'];\n deleteCustomToolkit: CustomToolkitsApi['deleteCustomToolkit'];\n enableCustomToolkit: CustomToolkitsApi['enableCustomToolkit'];\n disableCustomToolkit: CustomToolkitsApi['disableCustomToolkit'];\n createCustomTool: CustomToolkitsApi['createCustomTool'];\n updateCustomTool: CustomToolkitsApi['updateCustomTool'];\n deleteCustomTool: CustomToolkitsApi['deleteCustomTool'];\n\n // MCP Servers API\n getMcpServers: McpServersApi['getMcpServers'];\n getMcpServer: McpServersApi['getMcpServer'];\n createMcpServer: McpServersApi['createMcpServer'];\n updateMcpServer: McpServersApi['updateMcpServer'];\n deleteMcpServer: McpServersApi['deleteMcpServer'];\n enableMcpServer: McpServersApi['enableMcpServer'];\n disableMcpServer: McpServersApi['disableMcpServer'];\n getMcpServerTools: McpServersApi['getMcpServerTools'];\n getMcpServerResources: McpServersApi['getMcpServerResources'];\n getMcpServerPrompts: McpServersApi['getMcpServerPrompts'];\n testMcpServerConnection: McpServersApi['testMcpServerConnection'];\n discoverOAuthMetadata: McpServersApi['discoverOAuthMetadata'];\n\n // Features API\n getFeatureRegistry: FeaturesApi['getFeatureRegistry'];\n getPublicFeatureRegistry: FeaturesApi['getPublicFeatureRegistry'];\n getFeatureBySlug: FeaturesApi['getFeatureBySlug'];\n}\n\nexport function bindToolkitsMethods(\n target: ToolkitsBindings,\n toolkits: ToolkitsApi,\n templates: TemplatesApi,\n aiModels: AIModelsApi,\n customToolkits: CustomToolkitsApi,\n mcpServers: McpServersApi,\n features: FeaturesApi\n): void {\n // Toolkits API\n target.getToolkits = toolkits.getToolkits.bind(toolkits);\n target.getTool = toolkits.getTool.bind(toolkits);\n\n // Templates API\n target.getTemplateContext = templates.getTemplateContext.bind(templates);\n target.previewTemplate = templates.previewTemplate.bind(templates);\n target.getVariableRegistry = templates.getVariableRegistry.bind(templates);\n\n // AI Models API\n target.getChatModels = aiModels.getChatModels.bind(aiModels);\n target.getManagerModels = aiModels.getManagerModels.bind(aiModels);\n target.getRealtimeModels = aiModels.getRealtimeModels.bind(aiModels);\n target.getSTTModels = aiModels.getSTTModels.bind(aiModels);\n target.getTTSModels = aiModels.getTTSModels.bind(aiModels);\n target.getVoiceModels = aiModels.getVoiceModels.bind(aiModels);\n target.getVoicePresets = aiModels.getVoicePresets.bind(aiModels);\n target.getAllModels = aiModels.getAllModels.bind(aiModels);\n\n // Custom Toolkits API\n target.getCustomToolkits = customToolkits.getCustomToolkits.bind(customToolkits);\n target.getCustomToolkit = customToolkits.getCustomToolkit.bind(customToolkits);\n target.createCustomToolkit = customToolkits.createCustomToolkit.bind(customToolkits);\n target.updateCustomToolkit = customToolkits.updateCustomToolkit.bind(customToolkits);\n target.deleteCustomToolkit = customToolkits.deleteCustomToolkit.bind(customToolkits);\n target.enableCustomToolkit = customToolkits.enableCustomToolkit.bind(customToolkits);\n target.disableCustomToolkit = customToolkits.disableCustomToolkit.bind(customToolkits);\n target.createCustomTool = customToolkits.createCustomTool.bind(customToolkits);\n target.updateCustomTool = customToolkits.updateCustomTool.bind(customToolkits);\n target.deleteCustomTool = customToolkits.deleteCustomTool.bind(customToolkits);\n\n // MCP Servers API\n target.getMcpServers = mcpServers.getMcpServers.bind(mcpServers);\n target.getMcpServer = mcpServers.getMcpServer.bind(mcpServers);\n target.createMcpServer = mcpServers.createMcpServer.bind(mcpServers);\n target.updateMcpServer = mcpServers.updateMcpServer.bind(mcpServers);\n target.deleteMcpServer = mcpServers.deleteMcpServer.bind(mcpServers);\n target.enableMcpServer = mcpServers.enableMcpServer.bind(mcpServers);\n target.disableMcpServer = mcpServers.disableMcpServer.bind(mcpServers);\n target.getMcpServerTools = mcpServers.getMcpServerTools.bind(mcpServers);\n target.getMcpServerResources = mcpServers.getMcpServerResources.bind(mcpServers);\n target.getMcpServerPrompts = mcpServers.getMcpServerPrompts.bind(mcpServers);\n target.testMcpServerConnection = mcpServers.testMcpServerConnection.bind(mcpServers);\n target.discoverOAuthMetadata = mcpServers.discoverOAuthMetadata.bind(mcpServers);\n\n // Features API\n target.getFeatureRegistry = features.getFeatureRegistry.bind(features);\n target.getPublicFeatureRegistry = features.getPublicFeatureRegistry.bind(features);\n target.getFeatureBySlug = features.getFeatureBySlug.bind(features);\n}\n","import { ApiKeysApi, SubscriptionsApi, ReportsApi } from '../../api';\n\nexport interface BillingBindings {\n // API Keys API (Workspace-level)\n getApiKeys: ApiKeysApi['getApiKeys'];\n createApiKey: ApiKeysApi['createApiKey'];\n revokeApiKey: ApiKeysApi['revokeApiKey'];\n\n // API Keys API (Global/Account-level)\n getGlobalApiKeys: ApiKeysApi['getGlobalApiKeys'];\n createGlobalApiKey: ApiKeysApi['createGlobalApiKey'];\n revokeGlobalApiKey: ApiKeysApi['revokeGlobalApiKey'];\n\n // Subscriptions API\n getSubscriptions: SubscriptionsApi['getSubscriptions'];\n getWorkspaceSubscriptions: SubscriptionsApi['getWorkspaceSubscriptions'];\n cancelSubscription: SubscriptionsApi['cancelSubscription'];\n reactivateSubscription: SubscriptionsApi['reactivateSubscription'];\n updateSubscription: SubscriptionsApi['updateSubscription'];\n addWorkspaceToSubscription: SubscriptionsApi['addWorkspaceToSubscription'];\n purchaseCredits: SubscriptionsApi['purchaseCredits'];\n createCheckoutSession: SubscriptionsApi['createCheckoutSession'];\n createMemberCheckoutSession: SubscriptionsApi['createMemberCheckoutSession'];\n createMemberPortalSession: SubscriptionsApi['createMemberPortalSession'];\n getMemberSubscriptionStatus: SubscriptionsApi['getMemberSubscriptionStatus'];\n createDeviceOrderCheckoutSession: SubscriptionsApi['createDeviceOrderCheckoutSession'];\n listDeviceOrders: SubscriptionsApi['listDeviceOrders'];\n getCheckoutAttemptStatus: SubscriptionsApi['getCheckoutAttemptStatus'];\n listSelfServeProducts: SubscriptionsApi['listSelfServeProducts'];\n\n // Reports API\n getAIUsageReport: ReportsApi['getAIUsageReport'];\n getSMSUsageReport: ReportsApi['getSMSUsageReport'];\n getPhoneUsageReport: ReportsApi['getPhoneUsageReport'];\n getVoiceUsageReport: ReportsApi['getVoiceUsageReport'];\n getMemberUsage: ReportsApi['getMemberUsage'];\n}\n\nexport function bindBillingMethods(\n target: BillingBindings,\n apiKeys: ApiKeysApi,\n subscriptions: SubscriptionsApi,\n reports: ReportsApi\n): void {\n // API Keys API (Workspace-level)\n target.getApiKeys = apiKeys.getApiKeys.bind(apiKeys);\n target.createApiKey = apiKeys.createApiKey.bind(apiKeys);\n target.revokeApiKey = apiKeys.revokeApiKey.bind(apiKeys);\n\n // API Keys API (Global/Account-level)\n target.getGlobalApiKeys = apiKeys.getGlobalApiKeys.bind(apiKeys);\n target.createGlobalApiKey = apiKeys.createGlobalApiKey.bind(apiKeys);\n target.revokeGlobalApiKey = apiKeys.revokeGlobalApiKey.bind(apiKeys);\n\n // Subscriptions API\n target.getSubscriptions = subscriptions.getSubscriptions.bind(subscriptions);\n target.getWorkspaceSubscriptions = subscriptions.getWorkspaceSubscriptions.bind(subscriptions);\n target.cancelSubscription = subscriptions.cancelSubscription.bind(subscriptions);\n target.reactivateSubscription = subscriptions.reactivateSubscription.bind(subscriptions);\n target.updateSubscription = subscriptions.updateSubscription.bind(subscriptions);\n target.addWorkspaceToSubscription = subscriptions.addWorkspaceToSubscription.bind(subscriptions);\n target.purchaseCredits = subscriptions.purchaseCredits.bind(subscriptions);\n target.createCheckoutSession = subscriptions.createCheckoutSession.bind(subscriptions);\n target.createMemberCheckoutSession =\n subscriptions.createMemberCheckoutSession.bind(subscriptions);\n target.createMemberPortalSession = subscriptions.createMemberPortalSession.bind(subscriptions);\n target.getMemberSubscriptionStatus =\n subscriptions.getMemberSubscriptionStatus.bind(subscriptions);\n target.createDeviceOrderCheckoutSession =\n subscriptions.createDeviceOrderCheckoutSession.bind(subscriptions);\n target.listDeviceOrders = subscriptions.listDeviceOrders.bind(subscriptions);\n target.getCheckoutAttemptStatus = subscriptions.getCheckoutAttemptStatus.bind(subscriptions);\n target.listSelfServeProducts = subscriptions.listSelfServeProducts.bind(subscriptions);\n\n // Reports API\n target.getAIUsageReport = reports.getAIUsageReport.bind(reports);\n target.getSMSUsageReport = reports.getSMSUsageReport.bind(reports);\n target.getPhoneUsageReport = reports.getPhoneUsageReport.bind(reports);\n target.getVoiceUsageReport = reports.getVoiceUsageReport.bind(reports);\n target.getMemberUsage = reports.getMemberUsage.bind(reports);\n}\n","import { AppsApi, BuildersApi, InquiriesApi, OAuthApi, OAuthConnectionsApi } from '../../api';\n\nexport interface AppsBindings {\n // Apps API\n listApps: AppsApi['listApps'];\n createApp: AppsApi['createApp'];\n getApp: AppsApi['getApp'];\n getAppByClientId: AppsApi['getAppByClientId'];\n updateApp: AppsApi['updateApp'];\n deleteApp: AppsApi['deleteApp'];\n regenerateClientSecret: AppsApi['regenerateClientSecret'];\n\n // Builders API\n listBuilders: BuildersApi['listBuilders'];\n getBuilder: BuildersApi['getBuilder'];\n getBuilderApps: BuildersApi['getBuilderApps'];\n createBuilder: BuildersApi['createBuilder'];\n updateBuilder: BuildersApi['updateBuilder'];\n deleteBuilder: BuildersApi['deleteBuilder'];\n\n // Inquiries API\n createInquiry: InquiriesApi['createInquiry'];\n enrichInquiry: InquiriesApi['enrichInquiry'];\n listInquiries: InquiriesApi['listInquiries'];\n getInquiry: InquiriesApi['getInquiry'];\n updateInquiry: InquiriesApi['updateInquiry'];\n deleteInquiry: InquiriesApi['deleteInquiry'];\n exportInquiriesCsv: InquiriesApi['exportInquiriesCsv'];\n\n // OAuth API (internal OAuth flow)\n authorize: OAuthApi['authorize'];\n exchangeOAuthToken: OAuthApi['exchangeOAuthToken'];\n getAvailableScopes: OAuthApi['getAvailableScopes'];\n\n // OAuth Connections API (third-party providers)\n getOAuthConnectionStatus: OAuthConnectionsApi['getConnectionStatus'];\n listOAuthAccounts: OAuthConnectionsApi['listAccounts'];\n getOAuthAuthorizationUrl: OAuthConnectionsApi['getAuthorizationUrl'];\n disconnectOAuthProvider: OAuthConnectionsApi['disconnect'];\n}\n\nexport function bindAppsMethods(\n target: AppsBindings,\n apps: AppsApi,\n builders: BuildersApi,\n inquiries: InquiriesApi,\n oauth: OAuthApi,\n oauthConnections: OAuthConnectionsApi\n): void {\n // Apps API\n target.listApps = apps.listApps.bind(apps);\n target.createApp = apps.createApp.bind(apps);\n target.getApp = apps.getApp.bind(apps);\n target.getAppByClientId = apps.getAppByClientId.bind(apps);\n target.updateApp = apps.updateApp.bind(apps);\n target.deleteApp = apps.deleteApp.bind(apps);\n target.regenerateClientSecret = apps.regenerateClientSecret.bind(apps);\n\n // Builders API\n target.listBuilders = builders.listBuilders.bind(builders);\n target.getBuilder = builders.getBuilder.bind(builders);\n target.getBuilderApps = builders.getBuilderApps.bind(builders);\n target.createBuilder = builders.createBuilder.bind(builders);\n target.updateBuilder = builders.updateBuilder.bind(builders);\n target.deleteBuilder = builders.deleteBuilder.bind(builders);\n\n // Inquiries API\n target.createInquiry = inquiries.createInquiry.bind(inquiries);\n target.enrichInquiry = inquiries.enrichInquiry.bind(inquiries);\n target.listInquiries = inquiries.listInquiries.bind(inquiries);\n target.getInquiry = inquiries.getInquiry.bind(inquiries);\n target.updateInquiry = inquiries.updateInquiry.bind(inquiries);\n target.deleteInquiry = inquiries.deleteInquiry.bind(inquiries);\n target.exportInquiriesCsv = inquiries.exportInquiriesCsv.bind(inquiries);\n\n // OAuth API (internal OAuth flow)\n target.authorize = oauth.authorize.bind(oauth);\n target.exchangeOAuthToken = oauth.exchangeOAuthToken.bind(oauth);\n target.getAvailableScopes = oauth.getAvailableScopes.bind(oauth);\n\n // OAuth Connections API (third-party providers)\n target.getOAuthConnectionStatus = oauthConnections.getConnectionStatus.bind(oauthConnections);\n target.listOAuthAccounts = oauthConnections.listAccounts.bind(oauthConnections);\n target.getOAuthAuthorizationUrl = oauthConnections.getAuthorizationUrl.bind(oauthConnections);\n target.disconnectOAuthProvider = oauthConnections.disconnect.bind(oauthConnections);\n}\n","import {\n ConfluenceApi,\n ConnectionSyncApi,\n DiscordBotsApi,\n DocumoFaxApi,\n FhirConnectionsApi,\n PatientSyncConnectionsApi,\n HealthieApi,\n HubspotApi,\n AppConnectionsApi,\n MondayIntegrationApi,\n SalesforceApi,\n SlackAppsApi,\n TeamsAppsApi,\n} from '../../api';\n\nexport interface IntegrationsBindings {\n // Monday.com Integration API (workspace-scoped)\n getMondayBoards: MondayIntegrationApi['getBoards'];\n getMondayBoardColumns: MondayIntegrationApi['getBoardColumns'];\n getMondayBoardGroups: MondayIntegrationApi['getBoardGroups'];\n getMondayCurrentUserInfo: MondayIntegrationApi['getCurrentUserInfo'];\n\n // Monday.com Connection API\n installMondayConnection: MondayIntegrationApi['installMondayConnection'];\n configureMondayConnection: MondayIntegrationApi['configureMondayConnection'];\n getMondayConnectionStatus: MondayIntegrationApi['getMondayConnectionStatus'];\n authorizeMondayConnection: MondayIntegrationApi['authorizeMondayConnection'];\n testMondayConnection: MondayIntegrationApi['testMondayConnection'];\n disconnectMondayConnection: MondayIntegrationApi['disconnectMondayConnection'];\n disableMondayConnection: MondayIntegrationApi['disableMondayConnection'];\n enableMondayConnection: MondayIntegrationApi['enableMondayConnection'];\n deleteMondayConnection: MondayIntegrationApi['deleteMondayConnection'];\n getMondayConnectionBoards: MondayIntegrationApi['getMondayConnectionBoards'];\n getMondayConnectionBoardColumns: MondayIntegrationApi['getMondayConnectionBoardColumns'];\n getMondayConnectionBoardGroups: MondayIntegrationApi['getMondayConnectionBoardGroups'];\n getMondaySyncConfig: MondayIntegrationApi['getMondaySyncConfig'];\n getMondaySyncLogs: MondayIntegrationApi['getMondaySyncLogs'];\n updateMondaySyncConfig: MondayIntegrationApi['updateMondaySyncConfig'];\n getLinkedMondayMembers: MondayIntegrationApi['getLinkedMondayMembers'];\n getMondayReconciliationMatches: MondayIntegrationApi['getMondayReconciliationMatches'];\n linkMemberToMonday: MondayIntegrationApi['linkMemberToMonday'];\n bulkLinkMembersToMonday: MondayIntegrationApi['bulkLinkMembersToMonday'];\n unlinkMemberFromMonday: MondayIntegrationApi['unlinkMemberFromMonday'];\n getLinkedRecords: MondayIntegrationApi['getLinkedRecords'];\n importFromBoard: MondayIntegrationApi['importFromBoard'];\n autoCreateDataTypeFromBoard: MondayIntegrationApi['autoCreateDataTypeFromBoard'];\n\n // Discord Bots API\n getDiscordBots: DiscordBotsApi['getDiscordBots'];\n getDiscordBot: DiscordBotsApi['getDiscordBot'];\n getDiscordBotByUuid: DiscordBotsApi['getDiscordBotByUuid'];\n createDiscordBot: DiscordBotsApi['createDiscordBot'];\n updateDiscordBot: DiscordBotsApi['updateDiscordBot'];\n deleteDiscordBot: DiscordBotsApi['deleteDiscordBot'];\n registerDiscordSlashCommands: DiscordBotsApi['registerSlashCommands'];\n registerLinkedRolesMetadata: DiscordBotsApi['registerLinkedRolesMetadata'];\n getDiscordThreads: DiscordBotsApi['getDiscordThreads'];\n getDiscordGuilds: DiscordBotsApi['getDiscordGuilds'];\n getDiscordBotAccounts: DiscordBotsApi['getDiscordBotAccounts'];\n getMyCredentials: DiscordBotsApi['getMyCredentials'];\n unlinkCredential: DiscordBotsApi['unlinkCredential'];\n completeDiscordLink: DiscordBotsApi['completeDiscordLink'];\n discordLinkPreflight: DiscordBotsApi['discordLinkPreflight'];\n\n // Slack Apps API\n getSlackApps: SlackAppsApi['getSlackApps'];\n getSlackApp: SlackAppsApi['getSlackApp'];\n createSlackApp: SlackAppsApi['createSlackApp'];\n updateSlackApp: SlackAppsApi['updateSlackApp'];\n deleteSlackApp: SlackAppsApi['deleteSlackApp'];\n getSlackThreads: SlackAppsApi['getSlackThreads'];\n getSlackInstallations: SlackAppsApi['getSlackInstallations'];\n getSlackAppAccounts: SlackAppsApi['getSlackAppAccounts'];\n\n // Teams Apps API\n getTeamsApps: TeamsAppsApi['getTeamsApps'];\n getTeamsApp: TeamsAppsApi['getTeamsApp'];\n createTeamsApp: TeamsAppsApi['createTeamsApp'];\n updateTeamsApp: TeamsAppsApi['updateTeamsApp'];\n deleteTeamsApp: TeamsAppsApi['deleteTeamsApp'];\n getTeamsConversations: TeamsAppsApi['getTeamsConversations'];\n getTeamsInstallations: TeamsAppsApi['getTeamsInstallations'];\n getTeamsAppAccounts: TeamsAppsApi['getTeamsAppAccounts'];\n\n // FHIR Connections API\n getFhirConnections: FhirConnectionsApi['getFhirConnections'];\n getFhirConnection: FhirConnectionsApi['getFhirConnection'];\n getFhirConnectionByUuid: FhirConnectionsApi['getFhirConnectionByUuid'];\n createFhirConnection: FhirConnectionsApi['createFhirConnection'];\n updateFhirConnection: FhirConnectionsApi['updateFhirConnection'];\n deleteFhirConnection: FhirConnectionsApi['deleteFhirConnection'];\n testFhirConnection: FhirConnectionsApi['testFhirConnection'];\n fhirSearchPatients: FhirConnectionsApi['fhirSearchPatients'];\n fhirSearchPractitioners: FhirConnectionsApi['fhirSearchPractitioners'];\n fhirSearchLocations: FhirConnectionsApi['fhirSearchLocations'];\n fhirFetchCareTeam: FhirConnectionsApi['fhirFetchCareTeam'];\n fhirFetchEncounters: FhirConnectionsApi['fhirFetchEncounters'];\n fhirCreateEncounter: FhirConnectionsApi['fhirCreateEncounter'];\n fhirListLinkedMembers: FhirConnectionsApi['fhirListLinkedMembers'];\n fhirCheckPatientLinks: FhirConnectionsApi['fhirCheckPatientLinks'];\n fhirLinkMember: FhirConnectionsApi['fhirLinkMember'];\n fhirUnlinkMember: FhirConnectionsApi['fhirUnlinkMember'];\n fhirSyncMember: FhirConnectionsApi['fhirSyncMember'];\n fhirImportPatient: FhirConnectionsApi['fhirImportPatient'];\n fhirCsvImportInspect: FhirConnectionsApi['fhirCsvImportInspect'];\n fhirGetCsvImportSettings: FhirConnectionsApi['fhirGetCsvImportSettings'];\n fhirUpdateCsvImportSettings: FhirConnectionsApi['fhirUpdateCsvImportSettings'];\n fhirCsvImportApply: FhirConnectionsApi['fhirCsvImportApply'];\n fhirGetCsvImportRuns: FhirConnectionsApi['fhirGetCsvImportRuns'];\n fhirGetCsvImportRunItems: FhirConnectionsApi['fhirGetCsvImportRunItems'];\n fhirGetEncounterSyncStatus: FhirConnectionsApi['fhirGetEncounterSyncStatus'];\n fhirUpdateEncounterSync: FhirConnectionsApi['fhirUpdateEncounterSync'];\n fhirRunEncounterSync: FhirConnectionsApi['fhirRunEncounterSync'];\n fhirGetEncounterSyncRuns: FhirConnectionsApi['fhirGetEncounterSyncRuns'];\n fhirRefreshEncounterPatient: FhirConnectionsApi['fhirRefreshEncounterPatient'];\n fhirBackfillEncounterSync: FhirConnectionsApi['fhirBackfillEncounterSync'];\n\n // PatientSync Connection API\n configurePatientSync: PatientSyncConnectionsApi['configurePatientSync'];\n getPatientSyncStatus: PatientSyncConnectionsApi['getPatientSyncStatus'];\n deletePatientSyncConnection: PatientSyncConnectionsApi['deletePatientSyncConnection'];\n\n // Healthie API\n configureHealthie: HealthieApi['configureHealthie'];\n getHealthieStatus: HealthieApi['getHealthieStatus'];\n listHealthieProviders: HealthieApi['listHealthieProviders'];\n linkCalendarToHealthie: HealthieApi['linkCalendarToHealthie'];\n unlinkCalendarFromHealthie: HealthieApi['unlinkCalendarFromHealthie'];\n syncCalendarWithHealthie: HealthieApi['syncCalendarWithHealthie'];\n getLinkedHealthieMembers: HealthieApi['getLinkedHealthieMembers'];\n getHealthieReconciliationMatches: HealthieApi['getHealthieReconciliationMatches'];\n linkMemberToHealthie: HealthieApi['linkMemberToHealthie'];\n unlinkMemberFromHealthie: HealthieApi['unlinkMemberFromHealthie'];\n listHealthieAppointmentTypes: HealthieApi['listHealthieAppointmentTypes'];\n listHealthiePatients: HealthieApi['listHealthiePatients'];\n getHealthieAvailableSlots: HealthieApi['getHealthieAvailableSlots'];\n bookHealthieAppointment: HealthieApi['bookHealthieAppointment'];\n\n // Confluence API\n configureConfluence: ConfluenceApi['configureConfluence'];\n startConfluenceOAuth: ConfluenceApi['startConfluenceOAuth'];\n getConfluenceStatus: ConfluenceApi['getConfluenceStatus'];\n disconnectConfluence: ConfluenceApi['disconnectConfluence'];\n disableConfluence: ConfluenceApi['disableConfluence'];\n enableConfluence: ConfluenceApi['enableConfluence'];\n deleteConfluence: ConfluenceApi['deleteConfluence'];\n listConfluenceSpaces: ConfluenceApi['listConfluenceSpaces'];\n listConfluencePages: ConfluenceApi['listConfluencePages'];\n\n // Salesforce API\n installSalesforce: SalesforceApi['installSalesforce'];\n configureSalesforce: SalesforceApi['configureSalesforce'];\n startSalesforceOAuth: SalesforceApi['startSalesforceOAuth'];\n getSalesforceStatus: SalesforceApi['getSalesforceStatus'];\n disconnectSalesforce: SalesforceApi['disconnectSalesforce'];\n disableSalesforce: SalesforceApi['disableSalesforce'];\n enableSalesforce: SalesforceApi['enableSalesforce'];\n deleteSalesforce: SalesforceApi['deleteSalesforce'];\n getSalesforceReconciliationMatches: SalesforceApi['getSalesforceReconciliationMatches'];\n linkMemberToSalesforce: SalesforceApi['linkMemberToSalesforce'];\n linkUnlinkedSalesforceMembersByIdentity: SalesforceApi['linkUnlinkedSalesforceMembersByIdentity'];\n bulkLinkMembersToSalesforce: SalesforceApi['bulkLinkMembersToSalesforce'];\n unlinkMemberFromSalesforce: SalesforceApi['unlinkMemberFromSalesforce'];\n getLinkedSalesforceMembers: SalesforceApi['getLinkedSalesforceMembers'];\n getSalesforceSyncConfig: SalesforceApi['getSalesforceSyncConfig'];\n getSalesforceSyncLogs: SalesforceApi['getSalesforceSyncLogs'];\n updateSalesforceSyncConfig: SalesforceApi['updateSalesforceSyncConfig'];\n resyncSalesforceLinkedMembers: SalesforceApi['resyncSalesforceLinkedMembers'];\n listSalesforceObjects: SalesforceApi['listSalesforceObjects'];\n describeSalesforceObject: SalesforceApi['describeSalesforceObject'];\n searchSalesforceRecords: SalesforceApi['searchSalesforceRecords'];\n importSalesforceMembers: SalesforceApi['importSalesforceMembers'];\n\n // HubSpot API\n installHubspot: HubspotApi['installHubspot'];\n configureHubspot: HubspotApi['configureHubspot'];\n startHubspotOAuth: HubspotApi['startHubspotOAuth'];\n getHubspotStatus: HubspotApi['getHubspotStatus'];\n disconnectHubspot: HubspotApi['disconnectHubspot'];\n disableHubspot: HubspotApi['disableHubspot'];\n enableHubspot: HubspotApi['enableHubspot'];\n deleteHubspot: HubspotApi['deleteHubspot'];\n getHubspotReconciliationMatches: HubspotApi['getHubspotReconciliationMatches'];\n linkMemberToHubspot: HubspotApi['linkMemberToHubspot'];\n bulkLinkMembersToHubspot: HubspotApi['bulkLinkMembersToHubspot'];\n unlinkMemberFromHubspot: HubspotApi['unlinkMemberFromHubspot'];\n getLinkedHubspotMembers: HubspotApi['getLinkedHubspotMembers'];\n searchHubspotRecords: HubspotApi['searchHubspotRecords'];\n importHubspotMembers: HubspotApi['importHubspotMembers'];\n getHubspotContactProperties: HubspotApi['getHubspotContactProperties'];\n getHubspotManagedRules: HubspotApi['getHubspotManagedRules'];\n getHubspotSyncLogs: HubspotApi['getHubspotSyncLogs'];\n getHubspotTransformPresets: HubspotApi['getHubspotTransformPresets'];\n\n // Connection Sync API (generic, works with any sync-capable connection)\n getConnectionSyncCapabilities: ConnectionSyncApi['getConnectionSyncCapabilities'];\n getConnectionSyncConfig: ConnectionSyncApi['getConnectionSyncConfig'];\n updateConnectionSyncConfig: ConnectionSyncApi['updateConnectionSyncConfig'];\n getConnectionSyncCheckpoint: ConnectionSyncApi['getConnectionSyncCheckpoint'];\n startSyncRun: ConnectionSyncApi['startSyncRun'];\n getSyncRuns: ConnectionSyncApi['getSyncRuns'];\n getSyncRunItems: ConnectionSyncApi['getSyncRunItems'];\n getMemberSyncSummary: ConnectionSyncApi['getMemberSyncSummary'];\n clearConnectionMemberExclusion: ConnectionSyncApi['clearConnectionMemberExclusion'];\n\n // App Connections API\n listAvailableAppConnections: AppConnectionsApi['listAvailableAppConnections'];\n listAppConnections: AppConnectionsApi['listAppConnections'];\n enablePlatformApp: AppConnectionsApi['enablePlatformApp'];\n getPlatformApp: AppConnectionsApi['getPlatformApp'];\n updatePlatformApp: AppConnectionsApi['updatePlatformApp'];\n deletePlatformApp: AppConnectionsApi['deletePlatformApp'];\n listConnectionMemberFieldKeys: AppConnectionsApi['listConnectionMemberFieldKeys'];\n getDocumoFaxStatus: DocumoFaxApi['getDocumoFaxStatus'];\n getDocumoFaxSetup: DocumoFaxApi['getDocumoFaxSetup'];\n listDocumoFaxes: DocumoFaxApi['listDocumoFaxes'];\n installDocumoFax: DocumoFaxApi['installDocumoFax'];\n configureDocumoFax: DocumoFaxApi['configureDocumoFax'];\n verifyDocumoFax: DocumoFaxApi['verifyDocumoFax'];\n rotateDocumoFaxCredentials: DocumoFaxApi['rotateDocumoFaxCredentials'];\n setDefaultGooglePlatformAccount: AppConnectionsApi['setDefaultGooglePlatformAccount'];\n}\n\nexport function bindIntegrationsMethods(\n target: IntegrationsBindings,\n mondayIntegration: MondayIntegrationApi,\n discordBots: DiscordBotsApi,\n slackApps: SlackAppsApi,\n teamsApps: TeamsAppsApi,\n fhirConnections: FhirConnectionsApi,\n patientSyncConnections: PatientSyncConnectionsApi,\n healthie: HealthieApi,\n documoFax: DocumoFaxApi,\n salesforce: SalesforceApi,\n hubspot: HubspotApi,\n appConnections: AppConnectionsApi,\n connectionSync: ConnectionSyncApi,\n confluence: ConfluenceApi\n): void {\n // Monday.com Integration API\n target.getMondayBoards = mondayIntegration.getBoards.bind(mondayIntegration);\n target.getMondayBoardColumns = mondayIntegration.getBoardColumns.bind(mondayIntegration);\n target.getMondayBoardGroups = mondayIntegration.getBoardGroups.bind(mondayIntegration);\n target.getMondayCurrentUserInfo = mondayIntegration.getCurrentUserInfo.bind(mondayIntegration);\n\n // Monday.com Connection API\n target.installMondayConnection =\n mondayIntegration.installMondayConnection.bind(mondayIntegration);\n target.configureMondayConnection =\n mondayIntegration.configureMondayConnection.bind(mondayIntegration);\n target.getMondayConnectionStatus =\n mondayIntegration.getMondayConnectionStatus.bind(mondayIntegration);\n target.authorizeMondayConnection =\n mondayIntegration.authorizeMondayConnection.bind(mondayIntegration);\n target.testMondayConnection = mondayIntegration.testMondayConnection.bind(mondayIntegration);\n target.disconnectMondayConnection =\n mondayIntegration.disconnectMondayConnection.bind(mondayIntegration);\n target.disableMondayConnection =\n mondayIntegration.disableMondayConnection.bind(mondayIntegration);\n target.enableMondayConnection = mondayIntegration.enableMondayConnection.bind(mondayIntegration);\n target.deleteMondayConnection = mondayIntegration.deleteMondayConnection.bind(mondayIntegration);\n target.getMondayConnectionBoards =\n mondayIntegration.getMondayConnectionBoards.bind(mondayIntegration);\n target.getMondayConnectionBoardColumns =\n mondayIntegration.getMondayConnectionBoardColumns.bind(mondayIntegration);\n target.getMondayConnectionBoardGroups =\n mondayIntegration.getMondayConnectionBoardGroups.bind(mondayIntegration);\n target.getMondaySyncConfig = mondayIntegration.getMondaySyncConfig.bind(mondayIntegration);\n target.getMondaySyncLogs = mondayIntegration.getMondaySyncLogs.bind(mondayIntegration);\n target.updateMondaySyncConfig = mondayIntegration.updateMondaySyncConfig.bind(mondayIntegration);\n target.getLinkedMondayMembers = mondayIntegration.getLinkedMondayMembers.bind(mondayIntegration);\n target.getMondayReconciliationMatches =\n mondayIntegration.getMondayReconciliationMatches.bind(mondayIntegration);\n target.linkMemberToMonday = mondayIntegration.linkMemberToMonday.bind(mondayIntegration);\n target.bulkLinkMembersToMonday =\n mondayIntegration.bulkLinkMembersToMonday.bind(mondayIntegration);\n target.unlinkMemberFromMonday = mondayIntegration.unlinkMemberFromMonday.bind(mondayIntegration);\n target.getLinkedRecords = mondayIntegration.getLinkedRecords.bind(mondayIntegration);\n target.importFromBoard = mondayIntegration.importFromBoard.bind(mondayIntegration);\n target.autoCreateDataTypeFromBoard =\n mondayIntegration.autoCreateDataTypeFromBoard.bind(mondayIntegration);\n\n // Discord Bots API\n target.getDiscordBots = discordBots.getDiscordBots.bind(discordBots);\n target.getDiscordBot = discordBots.getDiscordBot.bind(discordBots);\n target.getDiscordBotByUuid = discordBots.getDiscordBotByUuid.bind(discordBots);\n target.createDiscordBot = discordBots.createDiscordBot.bind(discordBots);\n target.updateDiscordBot = discordBots.updateDiscordBot.bind(discordBots);\n target.deleteDiscordBot = discordBots.deleteDiscordBot.bind(discordBots);\n target.registerDiscordSlashCommands = discordBots.registerSlashCommands.bind(discordBots);\n target.registerLinkedRolesMetadata = discordBots.registerLinkedRolesMetadata.bind(discordBots);\n target.getDiscordThreads = discordBots.getDiscordThreads.bind(discordBots);\n target.getDiscordGuilds = discordBots.getDiscordGuilds.bind(discordBots);\n target.getDiscordBotAccounts = discordBots.getDiscordBotAccounts.bind(discordBots);\n target.getMyCredentials = discordBots.getMyCredentials.bind(discordBots);\n target.unlinkCredential = discordBots.unlinkCredential.bind(discordBots);\n target.completeDiscordLink = discordBots.completeDiscordLink.bind(discordBots);\n target.discordLinkPreflight = discordBots.discordLinkPreflight.bind(discordBots);\n\n // Slack Apps API\n target.getSlackApps = slackApps.getSlackApps.bind(slackApps);\n target.getSlackApp = slackApps.getSlackApp.bind(slackApps);\n target.createSlackApp = slackApps.createSlackApp.bind(slackApps);\n target.updateSlackApp = slackApps.updateSlackApp.bind(slackApps);\n target.deleteSlackApp = slackApps.deleteSlackApp.bind(slackApps);\n target.getSlackThreads = slackApps.getSlackThreads.bind(slackApps);\n target.getSlackInstallations = slackApps.getSlackInstallations.bind(slackApps);\n target.getSlackAppAccounts = slackApps.getSlackAppAccounts.bind(slackApps);\n\n // Teams Apps API\n target.getTeamsApps = teamsApps.getTeamsApps.bind(teamsApps);\n target.getTeamsApp = teamsApps.getTeamsApp.bind(teamsApps);\n target.createTeamsApp = teamsApps.createTeamsApp.bind(teamsApps);\n target.updateTeamsApp = teamsApps.updateTeamsApp.bind(teamsApps);\n target.deleteTeamsApp = teamsApps.deleteTeamsApp.bind(teamsApps);\n target.getTeamsConversations = teamsApps.getTeamsConversations.bind(teamsApps);\n target.getTeamsInstallations = teamsApps.getTeamsInstallations.bind(teamsApps);\n target.getTeamsAppAccounts = teamsApps.getTeamsAppAccounts.bind(teamsApps);\n\n // FHIR Connections API\n target.getFhirConnections = fhirConnections.getFhirConnections.bind(fhirConnections);\n target.getFhirConnection = fhirConnections.getFhirConnection.bind(fhirConnections);\n target.getFhirConnectionByUuid = fhirConnections.getFhirConnectionByUuid.bind(fhirConnections);\n target.createFhirConnection = fhirConnections.createFhirConnection.bind(fhirConnections);\n target.updateFhirConnection = fhirConnections.updateFhirConnection.bind(fhirConnections);\n target.deleteFhirConnection = fhirConnections.deleteFhirConnection.bind(fhirConnections);\n target.testFhirConnection = fhirConnections.testFhirConnection.bind(fhirConnections);\n target.fhirSearchPatients = fhirConnections.fhirSearchPatients.bind(fhirConnections);\n target.fhirSearchPractitioners = fhirConnections.fhirSearchPractitioners.bind(fhirConnections);\n target.fhirSearchLocations = fhirConnections.fhirSearchLocations.bind(fhirConnections);\n target.fhirFetchCareTeam = fhirConnections.fhirFetchCareTeam.bind(fhirConnections);\n target.fhirFetchEncounters = fhirConnections.fhirFetchEncounters.bind(fhirConnections);\n target.fhirCreateEncounter = fhirConnections.fhirCreateEncounter.bind(fhirConnections);\n target.fhirListLinkedMembers = fhirConnections.fhirListLinkedMembers.bind(fhirConnections);\n target.fhirCheckPatientLinks = fhirConnections.fhirCheckPatientLinks.bind(fhirConnections);\n target.fhirLinkMember = fhirConnections.fhirLinkMember.bind(fhirConnections);\n target.fhirUnlinkMember = fhirConnections.fhirUnlinkMember.bind(fhirConnections);\n target.fhirSyncMember = fhirConnections.fhirSyncMember.bind(fhirConnections);\n target.fhirImportPatient = fhirConnections.fhirImportPatient.bind(fhirConnections);\n target.fhirCsvImportInspect = fhirConnections.fhirCsvImportInspect.bind(fhirConnections);\n target.fhirGetCsvImportSettings = fhirConnections.fhirGetCsvImportSettings.bind(fhirConnections);\n target.fhirUpdateCsvImportSettings =\n fhirConnections.fhirUpdateCsvImportSettings.bind(fhirConnections);\n target.fhirCsvImportApply = fhirConnections.fhirCsvImportApply.bind(fhirConnections);\n target.fhirGetCsvImportRuns = fhirConnections.fhirGetCsvImportRuns.bind(fhirConnections);\n target.fhirGetCsvImportRunItems = fhirConnections.fhirGetCsvImportRunItems.bind(fhirConnections);\n target.fhirGetEncounterSyncStatus =\n fhirConnections.fhirGetEncounterSyncStatus.bind(fhirConnections);\n target.fhirUpdateEncounterSync = fhirConnections.fhirUpdateEncounterSync.bind(fhirConnections);\n target.fhirRunEncounterSync = fhirConnections.fhirRunEncounterSync.bind(fhirConnections);\n target.fhirGetEncounterSyncRuns = fhirConnections.fhirGetEncounterSyncRuns.bind(fhirConnections);\n target.fhirRefreshEncounterPatient =\n fhirConnections.fhirRefreshEncounterPatient.bind(fhirConnections);\n target.fhirBackfillEncounterSync =\n fhirConnections.fhirBackfillEncounterSync.bind(fhirConnections);\n\n // Healthie API\n // PatientSync Connection API\n target.configurePatientSync =\n patientSyncConnections.configurePatientSync.bind(patientSyncConnections);\n target.getPatientSyncStatus =\n patientSyncConnections.getPatientSyncStatus.bind(patientSyncConnections);\n target.deletePatientSyncConnection =\n patientSyncConnections.deletePatientSyncConnection.bind(patientSyncConnections);\n\n // Documo (mFax) inbound fax API\n target.getDocumoFaxStatus = documoFax.getDocumoFaxStatus.bind(documoFax);\n target.getDocumoFaxSetup = documoFax.getDocumoFaxSetup.bind(documoFax);\n target.listDocumoFaxes = documoFax.listDocumoFaxes.bind(documoFax);\n target.installDocumoFax = documoFax.installDocumoFax.bind(documoFax);\n target.configureDocumoFax = documoFax.configureDocumoFax.bind(documoFax);\n target.verifyDocumoFax = documoFax.verifyDocumoFax.bind(documoFax);\n target.rotateDocumoFaxCredentials = documoFax.rotateDocumoFaxCredentials.bind(documoFax);\n\n target.configureHealthie = healthie.configureHealthie.bind(healthie);\n target.getHealthieStatus = healthie.getHealthieStatus.bind(healthie);\n target.listHealthieProviders = healthie.listHealthieProviders.bind(healthie);\n target.linkCalendarToHealthie = healthie.linkCalendarToHealthie.bind(healthie);\n target.unlinkCalendarFromHealthie = healthie.unlinkCalendarFromHealthie.bind(healthie);\n target.syncCalendarWithHealthie = healthie.syncCalendarWithHealthie.bind(healthie);\n target.getLinkedHealthieMembers = healthie.getLinkedHealthieMembers.bind(healthie);\n target.getHealthieReconciliationMatches =\n healthie.getHealthieReconciliationMatches.bind(healthie);\n target.linkMemberToHealthie = healthie.linkMemberToHealthie.bind(healthie);\n target.unlinkMemberFromHealthie = healthie.unlinkMemberFromHealthie.bind(healthie);\n target.listHealthieAppointmentTypes = healthie.listHealthieAppointmentTypes.bind(healthie);\n target.listHealthiePatients = healthie.listHealthiePatients.bind(healthie);\n target.getHealthieAvailableSlots = healthie.getHealthieAvailableSlots.bind(healthie);\n target.bookHealthieAppointment = healthie.bookHealthieAppointment.bind(healthie);\n\n // Confluence API\n target.configureConfluence = confluence.configureConfluence.bind(confluence);\n target.startConfluenceOAuth = confluence.startConfluenceOAuth.bind(confluence);\n target.getConfluenceStatus = confluence.getConfluenceStatus.bind(confluence);\n target.disconnectConfluence = confluence.disconnectConfluence.bind(confluence);\n target.disableConfluence = confluence.disableConfluence.bind(confluence);\n target.enableConfluence = confluence.enableConfluence.bind(confluence);\n target.deleteConfluence = confluence.deleteConfluence.bind(confluence);\n target.listConfluenceSpaces = confluence.listConfluenceSpaces.bind(confluence);\n target.listConfluencePages = confluence.listConfluencePages.bind(confluence);\n\n // Salesforce API\n target.installSalesforce = salesforce.installSalesforce.bind(salesforce);\n target.configureSalesforce = salesforce.configureSalesforce.bind(salesforce);\n target.startSalesforceOAuth = salesforce.startSalesforceOAuth.bind(salesforce);\n target.getSalesforceStatus = salesforce.getSalesforceStatus.bind(salesforce);\n target.disconnectSalesforce = salesforce.disconnectSalesforce.bind(salesforce);\n target.disableSalesforce = salesforce.disableSalesforce.bind(salesforce);\n target.enableSalesforce = salesforce.enableSalesforce.bind(salesforce);\n target.deleteSalesforce = salesforce.deleteSalesforce.bind(salesforce);\n target.getSalesforceReconciliationMatches =\n salesforce.getSalesforceReconciliationMatches.bind(salesforce);\n target.linkMemberToSalesforce = salesforce.linkMemberToSalesforce.bind(salesforce);\n target.linkUnlinkedSalesforceMembersByIdentity =\n salesforce.linkUnlinkedSalesforceMembersByIdentity.bind(salesforce);\n target.bulkLinkMembersToSalesforce = salesforce.bulkLinkMembersToSalesforce.bind(salesforce);\n target.unlinkMemberFromSalesforce = salesforce.unlinkMemberFromSalesforce.bind(salesforce);\n target.getLinkedSalesforceMembers = salesforce.getLinkedSalesforceMembers.bind(salesforce);\n target.getSalesforceSyncConfig = salesforce.getSalesforceSyncConfig.bind(salesforce);\n target.getSalesforceSyncLogs = salesforce.getSalesforceSyncLogs.bind(salesforce);\n target.updateSalesforceSyncConfig = salesforce.updateSalesforceSyncConfig.bind(salesforce);\n target.resyncSalesforceLinkedMembers = salesforce.resyncSalesforceLinkedMembers.bind(salesforce);\n target.listSalesforceObjects = salesforce.listSalesforceObjects.bind(salesforce);\n target.describeSalesforceObject = salesforce.describeSalesforceObject.bind(salesforce);\n target.searchSalesforceRecords = salesforce.searchSalesforceRecords.bind(salesforce);\n target.importSalesforceMembers = salesforce.importSalesforceMembers.bind(salesforce);\n\n // HubSpot API\n target.installHubspot = hubspot.installHubspot.bind(hubspot);\n target.configureHubspot = hubspot.configureHubspot.bind(hubspot);\n target.startHubspotOAuth = hubspot.startHubspotOAuth.bind(hubspot);\n target.getHubspotStatus = hubspot.getHubspotStatus.bind(hubspot);\n target.disconnectHubspot = hubspot.disconnectHubspot.bind(hubspot);\n target.disableHubspot = hubspot.disableHubspot.bind(hubspot);\n target.enableHubspot = hubspot.enableHubspot.bind(hubspot);\n target.deleteHubspot = hubspot.deleteHubspot.bind(hubspot);\n target.getHubspotReconciliationMatches = hubspot.getHubspotReconciliationMatches.bind(hubspot);\n target.linkMemberToHubspot = hubspot.linkMemberToHubspot.bind(hubspot);\n target.bulkLinkMembersToHubspot = hubspot.bulkLinkMembersToHubspot.bind(hubspot);\n target.unlinkMemberFromHubspot = hubspot.unlinkMemberFromHubspot.bind(hubspot);\n target.getLinkedHubspotMembers = hubspot.getLinkedHubspotMembers.bind(hubspot);\n target.searchHubspotRecords = hubspot.searchHubspotRecords.bind(hubspot);\n target.importHubspotMembers = hubspot.importHubspotMembers.bind(hubspot);\n target.getHubspotContactProperties = hubspot.getHubspotContactProperties.bind(hubspot);\n target.getHubspotManagedRules = hubspot.getHubspotManagedRules.bind(hubspot);\n target.getHubspotSyncLogs = hubspot.getHubspotSyncLogs.bind(hubspot);\n target.getHubspotTransformPresets = hubspot.getHubspotTransformPresets.bind(hubspot);\n\n // Connection Sync API\n target.getConnectionSyncCapabilities =\n connectionSync.getConnectionSyncCapabilities.bind(connectionSync);\n target.getConnectionSyncConfig = connectionSync.getConnectionSyncConfig.bind(connectionSync);\n target.updateConnectionSyncConfig =\n connectionSync.updateConnectionSyncConfig.bind(connectionSync);\n target.getConnectionSyncCheckpoint =\n connectionSync.getConnectionSyncCheckpoint.bind(connectionSync);\n target.startSyncRun = connectionSync.startSyncRun.bind(connectionSync);\n target.getSyncRuns = connectionSync.getSyncRuns.bind(connectionSync);\n target.getSyncRunItems = connectionSync.getSyncRunItems.bind(connectionSync);\n target.getMemberSyncSummary = connectionSync.getMemberSyncSummary.bind(connectionSync);\n target.clearConnectionMemberExclusion =\n connectionSync.clearConnectionMemberExclusion.bind(connectionSync);\n\n // App Connections API\n target.listAvailableAppConnections =\n appConnections.listAvailableAppConnections.bind(appConnections);\n target.listAppConnections = appConnections.listAppConnections.bind(appConnections);\n target.enablePlatformApp = appConnections.enablePlatformApp.bind(appConnections);\n target.getPlatformApp = appConnections.getPlatformApp.bind(appConnections);\n target.updatePlatformApp = appConnections.updatePlatformApp.bind(appConnections);\n target.deletePlatformApp = appConnections.deletePlatformApp.bind(appConnections);\n target.listConnectionMemberFieldKeys =\n appConnections.listConnectionMemberFieldKeys.bind(appConnections);\n target.setDefaultGooglePlatformAccount =\n appConnections.setDefaultGooglePlatformAccount.bind(appConnections);\n}\n","import { OperatorApi } from '../../api';\n\nexport interface OperatorBindings {\n getOperatorGroups: OperatorApi['getOperatorGroups'];\n getOperatorGroup: OperatorApi['getOperatorGroup'];\n createOperatorGroup: OperatorApi['createOperatorGroup'];\n updateOperatorGroup: OperatorApi['updateOperatorGroup'];\n deleteOperatorGroup: OperatorApi['deleteOperatorGroup'];\n addGroupMember: OperatorApi['addGroupMember'];\n removeGroupMember: OperatorApi['removeGroupMember'];\n getLiveOperators: OperatorApi['getLiveOperators'];\n getPresenceStatus: OperatorApi['getPresenceStatus'];\n getOperatorChatMessages: OperatorApi['getOperatorChatMessages'];\n sendOperatorMessage: OperatorApi['sendOperatorMessage'];\n}\n\nexport function bindOperatorMethods(target: OperatorBindings, operatorGroups: OperatorApi): void {\n target.getOperatorGroups = operatorGroups.getOperatorGroups.bind(operatorGroups);\n target.getOperatorGroup = operatorGroups.getOperatorGroup.bind(operatorGroups);\n target.createOperatorGroup = operatorGroups.createOperatorGroup.bind(operatorGroups);\n target.updateOperatorGroup = operatorGroups.updateOperatorGroup.bind(operatorGroups);\n target.deleteOperatorGroup = operatorGroups.deleteOperatorGroup.bind(operatorGroups);\n target.addGroupMember = operatorGroups.addGroupMember.bind(operatorGroups);\n target.removeGroupMember = operatorGroups.removeGroupMember.bind(operatorGroups);\n target.getLiveOperators = operatorGroups.getLiveOperators.bind(operatorGroups);\n target.getPresenceStatus = operatorGroups.getPresenceStatus.bind(operatorGroups);\n target.getOperatorChatMessages = operatorGroups.getOperatorChatMessages.bind(operatorGroups);\n target.sendOperatorMessage = operatorGroups.sendOperatorMessage.bind(operatorGroups);\n}\n","import { OrgApi } from '../../api';\n\nexport interface OrgBindings {\n listOrgDomains: OrgApi['listOrgDomains'];\n registerOrgDomain: OrgApi['registerOrgDomain'];\n getOrgDomain: OrgApi['getOrgDomain'];\n verifyOrgDomainOwnership: OrgApi['verifyOrgDomainOwnership'];\n deleteOrgDomain: OrgApi['deleteOrgDomain'];\n enableOrgDomainEmail: OrgApi['enableOrgDomainEmail'];\n getOrgDomainEmail: OrgApi['getOrgDomainEmail'];\n verifyOrgDomainEmail: OrgApi['verifyOrgDomainEmail'];\n disableOrgDomainEmail: OrgApi['disableOrgDomainEmail'];\n enableOrgDomainSite: OrgApi['enableOrgDomainSite'];\n getOrgDomainSite: OrgApi['getOrgDomainSite'];\n preflightOrgDomainSite: OrgApi['preflightOrgDomainSite'];\n createOrgDomainSiteChildHost: OrgApi['createOrgDomainSiteChildHost'];\n listOrgDomainSiteChildHosts: OrgApi['listOrgDomainSiteChildHosts'];\n verifyOrgDomainSite: OrgApi['verifyOrgDomainSite'];\n disableOrgDomainSite: OrgApi['disableOrgDomainSite'];\n getBusinessProfile: OrgApi['getBusinessProfile'];\n updateBusinessProfile: OrgApi['updateBusinessProfile'];\n submitBusinessProfile: OrgApi['submitBusinessProfile'];\n cancelBusinessProfile: OrgApi['cancelBusinessProfile'];\n listLegalEntities: OrgApi['listLegalEntities'];\n getLegalEntity: OrgApi['getLegalEntity'];\n createLegalEntity: OrgApi['createLegalEntity'];\n getRegistrationDraft: OrgApi['getRegistrationDraft'];\n saveRegistrationDraft: OrgApi['saveRegistrationDraft'];\n getVoiceTrustProducts: OrgApi['getVoiceTrustProducts'];\n syncVoiceTrustProducts: OrgApi['syncVoiceTrustProducts'];\n createOrganizationWorkspace: OrgApi['createOrganizationWorkspace'];\n getOrganizationWorkspace: OrgApi['getOrganizationWorkspace'];\n updateOrganizationWorkspace: OrgApi['updateOrganizationWorkspace'];\n getOrgBillingCustomer: OrgApi['getOrgBillingCustomer'];\n getA2PCampaignConfig: OrgApi['getA2PCampaignConfig'];\n updateA2PCampaignConfig: OrgApi['updateA2PCampaignConfig'];\n getOrgWorkspaceUsage: OrgApi['getOrgWorkspaceUsage'];\n updateOrganizationMember: OrgApi['updateOrganizationMember'];\n listOrgWebhookEndpoints: OrgApi['listOrgWebhookEndpoints'];\n getOrgWebhookEndpoint: OrgApi['getOrgWebhookEndpoint'];\n}\n\nexport function bindOrgMethods(target: OrgBindings, org: OrgApi): void {\n target.listOrgDomains = org.listOrgDomains.bind(org);\n target.registerOrgDomain = org.registerOrgDomain.bind(org);\n target.getOrgDomain = org.getOrgDomain.bind(org);\n target.verifyOrgDomainOwnership = org.verifyOrgDomainOwnership.bind(org);\n target.deleteOrgDomain = org.deleteOrgDomain.bind(org);\n target.enableOrgDomainEmail = org.enableOrgDomainEmail.bind(org);\n target.getOrgDomainEmail = org.getOrgDomainEmail.bind(org);\n target.verifyOrgDomainEmail = org.verifyOrgDomainEmail.bind(org);\n target.disableOrgDomainEmail = org.disableOrgDomainEmail.bind(org);\n target.enableOrgDomainSite = org.enableOrgDomainSite.bind(org);\n target.getOrgDomainSite = org.getOrgDomainSite.bind(org);\n target.preflightOrgDomainSite = org.preflightOrgDomainSite.bind(org);\n target.createOrgDomainSiteChildHost = org.createOrgDomainSiteChildHost.bind(org);\n target.listOrgDomainSiteChildHosts = org.listOrgDomainSiteChildHosts.bind(org);\n target.verifyOrgDomainSite = org.verifyOrgDomainSite.bind(org);\n target.disableOrgDomainSite = org.disableOrgDomainSite.bind(org);\n target.getBusinessProfile = org.getBusinessProfile.bind(org);\n target.updateBusinessProfile = org.updateBusinessProfile.bind(org);\n target.submitBusinessProfile = org.submitBusinessProfile.bind(org);\n target.cancelBusinessProfile = org.cancelBusinessProfile.bind(org);\n target.listLegalEntities = org.listLegalEntities.bind(org);\n target.getLegalEntity = org.getLegalEntity.bind(org);\n target.createLegalEntity = org.createLegalEntity.bind(org);\n target.getRegistrationDraft = org.getRegistrationDraft.bind(org);\n target.saveRegistrationDraft = org.saveRegistrationDraft.bind(org);\n target.getVoiceTrustProducts = org.getVoiceTrustProducts.bind(org);\n target.syncVoiceTrustProducts = org.syncVoiceTrustProducts.bind(org);\n target.createOrganizationWorkspace = org.createOrganizationWorkspace.bind(org);\n target.getOrganizationWorkspace = org.getOrganizationWorkspace.bind(org);\n target.updateOrganizationWorkspace = org.updateOrganizationWorkspace.bind(org);\n target.getOrgBillingCustomer = org.getOrgBillingCustomer.bind(org);\n target.getA2PCampaignConfig = org.getA2PCampaignConfig.bind(org);\n target.updateA2PCampaignConfig = org.updateA2PCampaignConfig.bind(org);\n target.getOrgWorkspaceUsage = org.getOrgWorkspaceUsage.bind(org);\n target.updateOrganizationMember = org.updateOrganizationMember.bind(org);\n target.listOrgWebhookEndpoints = org.listOrgWebhookEndpoints.bind(org);\n target.getOrgWebhookEndpoint = org.getOrgWebhookEndpoint.bind(org);\n}\n","import { PronunciationsApi } from '../../api';\n\nexport interface PronunciationsBindings {\n getPronunciationEntries: PronunciationsApi['getPronunciationEntries'];\n createPronunciationEntry: PronunciationsApi['createPronunciationEntry'];\n updatePronunciationEntry: PronunciationsApi['updatePronunciationEntry'];\n deletePronunciationEntry: PronunciationsApi['deletePronunciationEntry'];\n exportPronunciationEntries: PronunciationsApi['exportPronunciationEntries'];\n importPronunciationEntries: PronunciationsApi['importPronunciationEntries'];\n getMyPronunciations: PronunciationsApi['getMyPronunciations'];\n createMyPronunciation: PronunciationsApi['createMyPronunciation'];\n updateMyPronunciation: PronunciationsApi['updateMyPronunciation'];\n deleteMyPronunciation: PronunciationsApi['deleteMyPronunciation'];\n suggestPronunciations: PronunciationsApi['suggestPronunciations'];\n getRecommendedVoices: PronunciationsApi['getRecommendedVoices'];\n previewPronunciation: PronunciationsApi['previewPronunciation'];\n}\n\nexport function bindPronunciationsMethods(\n target: PronunciationsBindings,\n pronunciations: PronunciationsApi\n) {\n target.getPronunciationEntries = pronunciations.getPronunciationEntries.bind(pronunciations);\n target.createPronunciationEntry = pronunciations.createPronunciationEntry.bind(pronunciations);\n target.updatePronunciationEntry = pronunciations.updatePronunciationEntry.bind(pronunciations);\n target.deletePronunciationEntry = pronunciations.deletePronunciationEntry.bind(pronunciations);\n target.exportPronunciationEntries =\n pronunciations.exportPronunciationEntries.bind(pronunciations);\n target.importPronunciationEntries =\n pronunciations.importPronunciationEntries.bind(pronunciations);\n target.getMyPronunciations = pronunciations.getMyPronunciations.bind(pronunciations);\n target.createMyPronunciation = pronunciations.createMyPronunciation.bind(pronunciations);\n target.updateMyPronunciation = pronunciations.updateMyPronunciation.bind(pronunciations);\n target.deleteMyPronunciation = pronunciations.deleteMyPronunciation.bind(pronunciations);\n target.suggestPronunciations = pronunciations.suggestPronunciations.bind(pronunciations);\n target.getRecommendedVoices = pronunciations.getRecommendedVoices.bind(pronunciations);\n target.previewPronunciation = pronunciations.previewPronunciation.bind(pronunciations);\n}\n","import { ResourceWorkflowsApi } from '../../api';\n\nexport interface ResourceWorkflowsBindings {\n getResourceWorkflow: ResourceWorkflowsApi['getResourceWorkflow'];\n getResourceWorkflowRevision: ResourceWorkflowsApi['getResourceWorkflowRevision'];\n}\n\nexport function bindResourceWorkflowsMethods(\n target: ResourceWorkflowsBindings,\n resourceWorkflows: ResourceWorkflowsApi\n): void {\n target.getResourceWorkflow = resourceWorkflows.getResourceWorkflow.bind(resourceWorkflows);\n target.getResourceWorkflowRevision =\n resourceWorkflows.getResourceWorkflowRevision.bind(resourceWorkflows);\n}\n","import { BundlesApi, ResourceWorkflowsApi } from '../../api';\nimport { bindResourceWorkflowsMethods, type ResourceWorkflowsBindings } from './resource-workflows';\n\nexport interface BundlesBindings extends ResourceWorkflowsBindings {\n getSolutionRelease: BundlesApi['getSolutionRelease'];\n updateBundle: BundlesApi['updateBundle'];\n listBundleInstallations: BundlesApi['listBundleInstallations'];\n // Bundles API\n listBundles: BundlesApi['listBundles'];\n listBundleWorkflowCandidates: BundlesApi['listBundleWorkflowCandidates'];\n createBundle: BundlesApi['createBundle'];\n getBundleDraft: BundlesApi['getBundleDraft'];\n replaceBundleDraft: BundlesApi['replaceBundleDraft'];\n publishBundle: BundlesApi['publishBundle'];\n listBundleVersions: BundlesApi['listBundleVersions'];\n getBundle: BundlesApi['getBundle'];\n getBundleVersion: BundlesApi['getBundleVersion'];\n listBundleGrants: BundlesApi['listBundleGrants'];\n grantBundle: BundlesApi['grantBundle'];\n revokeBundleGrant: BundlesApi['revokeBundleGrant'];\n\n // Resource Workflows API — the Bundle draft editor's Workflow picker\n listResourceWorkflows: ResourceWorkflowsApi['listResourceWorkflows'];\n}\n\nexport function bindBundlesMethods(\n target: BundlesBindings,\n bundles: BundlesApi,\n resourceWorkflows: ResourceWorkflowsApi\n): void {\n bindResourceWorkflowsMethods(target, resourceWorkflows);\n target.getSolutionRelease = bundles.getSolutionRelease.bind(bundles);\n target.updateBundle = bundles.updateBundle.bind(bundles);\n target.listBundleInstallations = bundles.listBundleInstallations.bind(bundles);\n target.listBundles = bundles.listBundles.bind(bundles);\n target.listBundleWorkflowCandidates = bundles.listBundleWorkflowCandidates.bind(bundles);\n target.createBundle = bundles.createBundle.bind(bundles);\n target.getBundleDraft = bundles.getBundleDraft.bind(bundles);\n target.replaceBundleDraft = bundles.replaceBundleDraft.bind(bundles);\n target.publishBundle = bundles.publishBundle.bind(bundles);\n target.listBundleVersions = bundles.listBundleVersions.bind(bundles);\n target.getBundle = bundles.getBundle.bind(bundles);\n target.getBundleVersion = bundles.getBundleVersion.bind(bundles);\n target.listBundleGrants = bundles.listBundleGrants.bind(bundles);\n target.grantBundle = bundles.grantBundle.bind(bundles);\n target.revokeBundleGrant = bundles.revokeBundleGrant.bind(bundles);\n\n target.listResourceWorkflows = resourceWorkflows.listResourceWorkflows.bind(resourceWorkflows);\n}\n","import { InstallationsApi } from '../../api';\n\nexport interface InstallationsBindings {\n // Installations API\n preflightBundleInstallation: InstallationsApi['preflightBundleInstallation'];\n installBundle: InstallationsApi['installBundle'];\n listInstallations: InstallationsApi['listInstallations'];\n getInstallation: InstallationsApi['getInstallation'];\n getInstallationReadiness: InstallationsApi['getInstallationReadiness'];\n previewInstallationUpgrade: InstallationsApi['previewInstallationUpgrade'];\n upgradeInstallation: InstallationsApi['upgradeInstallation'];\n setInstallationPolicy: InstallationsApi['setInstallationPolicy'];\n unsubscribeInstallation: InstallationsApi['unsubscribeInstallation'];\n bindInstallationSlots: InstallationsApi['bindInstallationSlots'];\n restoreInstallationForm: InstallationsApi['restoreInstallationForm'];\n restoreInstallationWorkflowResources: InstallationsApi['restoreInstallationWorkflowResources'];\n reconcileInstallation: InstallationsApi['reconcileInstallation'];\n getThemeSettingsSchema: InstallationsApi['getThemeSettingsSchema'];\n}\n\nexport function bindInstallationsMethods(\n target: InstallationsBindings,\n installations: InstallationsApi\n): void {\n target.preflightBundleInstallation =\n installations.preflightBundleInstallation.bind(installations);\n target.installBundle = installations.installBundle.bind(installations);\n target.listInstallations = installations.listInstallations.bind(installations);\n target.getInstallation = installations.getInstallation.bind(installations);\n target.getInstallationReadiness = installations.getInstallationReadiness.bind(installations);\n target.previewInstallationUpgrade = installations.previewInstallationUpgrade.bind(installations);\n target.upgradeInstallation = installations.upgradeInstallation.bind(installations);\n target.setInstallationPolicy = installations.setInstallationPolicy.bind(installations);\n target.unsubscribeInstallation = installations.unsubscribeInstallation.bind(installations);\n target.restoreInstallationForm = installations.restoreInstallationForm.bind(installations);\n target.restoreInstallationWorkflowResources =\n installations.restoreInstallationWorkflowResources.bind(installations);\n target.bindInstallationSlots = installations.bindInstallationSlots.bind(installations);\n target.reconcileInstallation = installations.reconcileInstallation.bind(installations);\n target.getThemeSettingsSchema = installations.getThemeSettingsSchema.bind(installations);\n}\n","import { JourneysApi } from '../../api';\n\nexport interface JourneysBindings {\n getJourneys: JourneysApi['getJourneys'];\n getJourney: JourneysApi['getJourney'];\n getJourneyAuthoring: JourneysApi['getJourneyAuthoring'];\n putJourneyDraft: JourneysApi['putJourneyDraft'];\n deleteJourneyDraft: JourneysApi['deleteJourneyDraft'];\n putJourneyV2Definition: JourneysApi['putJourneyV2Definition'];\n getJourneyV2Validation: JourneysApi['getJourneyV2Validation'];\n getJourneyFilterOptions: JourneysApi['getJourneyFilterOptions'];\n getJourneyHealth: JourneysApi['getJourneyHealth'];\n cloneJourneyAsV2: JourneysApi['cloneJourneyAsV2'];\n createJourney: JourneysApi['createJourney'];\n updateJourney: JourneysApi['updateJourney'];\n archiveJourney: JourneysApi['archiveJourney'];\n createStep: JourneysApi['createStep'];\n updateStep: JourneysApi['updateStep'];\n archiveStep: JourneysApi['archiveStep'];\n unarchiveStep: JourneysApi['unarchiveStep'];\n createConnection: JourneysApi['createConnection'];\n updateConnection: JourneysApi['updateConnection'];\n deleteConnection: JourneysApi['deleteConnection'];\n createGoal: JourneysApi['createGoal'];\n updateGoal: JourneysApi['updateGoal'];\n deleteGoal: JourneysApi['deleteGoal'];\n getJourneyMembers: JourneysApi['getJourneyMembers'];\n enrollMembers: JourneysApi['enrollMembers'];\n unenrollMembers: JourneysApi['unenrollMembers'];\n reenrollMember: JourneysApi['reenrollMember'];\n deleteEnrollment: JourneysApi['deleteEnrollment'];\n getMemberJourneys: JourneysApi['getMemberJourneys'];\n getEnrollmentStatusLog: JourneysApi['getEnrollmentStatusLog'];\n getStepMembers: JourneysApi['getStepMembers'];\n getStepMemberCounts: JourneysApi['getStepMemberCounts'];\n advanceStep: JourneysApi['advanceStep'];\n skipStep: JourneysApi['skipStep'];\n testRunJourney: JourneysApi['testRunJourney'];\n getJourneyNotes: JourneysApi['getJourneyNotes'];\n createJourneyNote: JourneysApi['createJourneyNote'];\n updateJourneyNote: JourneysApi['updateJourneyNote'];\n deleteJourneyNote: JourneysApi['deleteJourneyNote'];\n}\n\nexport function bindJourneysMethods(target: JourneysBindings, journeys: JourneysApi): void {\n target.getJourneys = journeys.getJourneys.bind(journeys);\n target.getJourney = journeys.getJourney.bind(journeys);\n target.getJourneyAuthoring = journeys.getJourneyAuthoring.bind(journeys);\n target.putJourneyDraft = journeys.putJourneyDraft.bind(journeys);\n target.deleteJourneyDraft = journeys.deleteJourneyDraft.bind(journeys);\n target.putJourneyV2Definition = journeys.putJourneyV2Definition.bind(journeys);\n target.getJourneyV2Validation = journeys.getJourneyV2Validation.bind(journeys);\n target.getJourneyFilterOptions = journeys.getJourneyFilterOptions.bind(journeys);\n target.getJourneyHealth = journeys.getJourneyHealth.bind(journeys);\n target.cloneJourneyAsV2 = journeys.cloneJourneyAsV2.bind(journeys);\n target.createJourney = journeys.createJourney.bind(journeys);\n target.updateJourney = journeys.updateJourney.bind(journeys);\n target.archiveJourney = journeys.archiveJourney.bind(journeys);\n target.createStep = journeys.createStep.bind(journeys);\n target.updateStep = journeys.updateStep.bind(journeys);\n target.archiveStep = journeys.archiveStep.bind(journeys);\n target.unarchiveStep = journeys.unarchiveStep.bind(journeys);\n target.createConnection = journeys.createConnection.bind(journeys);\n target.updateConnection = journeys.updateConnection.bind(journeys);\n target.deleteConnection = journeys.deleteConnection.bind(journeys);\n target.createGoal = journeys.createGoal.bind(journeys);\n target.updateGoal = journeys.updateGoal.bind(journeys);\n target.deleteGoal = journeys.deleteGoal.bind(journeys);\n target.getJourneyMembers = journeys.getJourneyMembers.bind(journeys);\n target.enrollMembers = journeys.enrollMembers.bind(journeys);\n target.unenrollMembers = journeys.unenrollMembers.bind(journeys);\n target.reenrollMember = journeys.reenrollMember.bind(journeys);\n target.deleteEnrollment = journeys.deleteEnrollment.bind(journeys);\n target.getMemberJourneys = journeys.getMemberJourneys.bind(journeys);\n target.getEnrollmentStatusLog = journeys.getEnrollmentStatusLog.bind(journeys);\n target.getStepMembers = journeys.getStepMembers.bind(journeys);\n target.getStepMemberCounts = journeys.getStepMemberCounts.bind(journeys);\n target.advanceStep = journeys.advanceStep.bind(journeys);\n target.skipStep = journeys.skipStep.bind(journeys);\n target.testRunJourney = journeys.testRunJourney.bind(journeys);\n target.getJourneyNotes = journeys.getJourneyNotes.bind(journeys);\n target.createJourneyNote = journeys.createJourneyNote.bind(journeys);\n target.updateJourneyNote = journeys.updateJourneyNote.bind(journeys);\n target.deleteJourneyNote = journeys.deleteJourneyNote.bind(journeys);\n}\n","import { QualificationsApi } from '../../api';\n\nexport interface QualificationsBindings {\n getQualifications: QualificationsApi['getQualifications'];\n getQualification: QualificationsApi['getQualification'];\n getOrCreateQualificationForWorkflow: QualificationsApi['getOrCreateQualificationForWorkflow'];\n // Scenarios\n listScenarios: QualificationsApi['listScenarios'];\n createScenario: QualificationsApi['createScenario'];\n getScenario: QualificationsApi['getScenario'];\n updateScenario: QualificationsApi['updateScenario'];\n deleteScenario: QualificationsApi['deleteScenario'];\n // Test chat runs\n listTestChatRuns: QualificationsApi['listTestChatRuns'];\n listScenarioHealthSummaries: QualificationsApi['listScenarioHealthSummaries'];\n getTestChatRun: QualificationsApi['getTestChatRun'];\n startTestChatRun: QualificationsApi['startTestChatRun'];\n evaluateTestChatRun: QualificationsApi['evaluateTestChatRun'];\n endTestChatRun: QualificationsApi['endTestChatRun'];\n}\n\nexport function bindQualificationsMethods(\n target: QualificationsBindings,\n qualifications: QualificationsApi\n): void {\n target.getQualifications = qualifications.getQualifications.bind(qualifications);\n target.getQualification = qualifications.getQualification.bind(qualifications);\n target.getOrCreateQualificationForWorkflow =\n qualifications.getOrCreateQualificationForWorkflow.bind(qualifications);\n // Scenarios\n target.listScenarios = qualifications.listScenarios.bind(qualifications);\n target.createScenario = qualifications.createScenario.bind(qualifications);\n target.getScenario = qualifications.getScenario.bind(qualifications);\n target.updateScenario = qualifications.updateScenario.bind(qualifications);\n target.deleteScenario = qualifications.deleteScenario.bind(qualifications);\n // Test chat runs\n target.listTestChatRuns = qualifications.listTestChatRuns.bind(qualifications);\n target.listScenarioHealthSummaries =\n qualifications.listScenarioHealthSummaries.bind(qualifications);\n target.getTestChatRun = qualifications.getTestChatRun.bind(qualifications);\n target.startTestChatRun = qualifications.startTestChatRun.bind(qualifications);\n target.evaluateTestChatRun = qualifications.evaluateTestChatRun.bind(qualifications);\n target.endTestChatRun = qualifications.endTestChatRun.bind(qualifications);\n}\n","import { PersonasApi } from '../../api';\n\nexport interface PersonasBindings {\n listPersonas: PersonasApi['listPersonas'];\n getPersona: PersonasApi['getPersona'];\n createPersona: PersonasApi['createPersona'];\n updatePersona: PersonasApi['updatePersona'];\n archivePersona: PersonasApi['archivePersona'];\n unarchivePersona: PersonasApi['unarchivePersona'];\n deletePersona: PersonasApi['deletePersona'];\n}\n\nexport function bindPersonasMethods(target: PersonasBindings, personas: PersonasApi): void {\n target.listPersonas = personas.listPersonas.bind(personas);\n target.getPersona = personas.getPersona.bind(personas);\n target.createPersona = personas.createPersona.bind(personas);\n target.updatePersona = personas.updatePersona.bind(personas);\n target.archivePersona = personas.archivePersona.bind(personas);\n target.unarchivePersona = personas.unarchivePersona.bind(personas);\n target.deletePersona = personas.deletePersona.bind(personas);\n}\n","import { MetricsApi } from '../../api';\n\nexport interface MetricsBindings {\n listMetrics: MetricsApi['listMetrics'];\n getMetric: MetricsApi['getMetric'];\n createMetric: MetricsApi['createMetric'];\n updateMetric: MetricsApi['updateMetric'];\n deleteMetric: MetricsApi['deleteMetric'];\n listMetricObservations: MetricsApi['listMetricObservations'];\n getMetricSeries: MetricsApi['getMetricSeries'];\n computeChatMetrics: MetricsApi['computeChatMetrics'];\n}\n\nexport function bindMetricsMethods(target: MetricsBindings, metrics: MetricsApi): void {\n target.listMetrics = metrics.listMetrics.bind(metrics);\n target.getMetric = metrics.getMetric.bind(metrics);\n target.createMetric = metrics.createMetric.bind(metrics);\n target.updateMetric = metrics.updateMetric.bind(metrics);\n target.deleteMetric = metrics.deleteMetric.bind(metrics);\n target.listMetricObservations = metrics.listMetricObservations.bind(metrics);\n target.getMetricSeries = metrics.getMetricSeries.bind(metrics);\n target.computeChatMetrics = metrics.computeChatMetrics.bind(metrics);\n}\n","import { QueriesApi } from '../../api';\n\nexport interface QueriesBindings {\n // Unified Query Engine\n getQueryFields: QueriesApi['getQueryFields'];\n validateQuery: QueriesApi['validateQuery'];\n previewQuery: QueriesApi['previewQuery'];\n runQuery: QueriesApi['runQuery'];\n}\n\nexport function bindQueriesMethods(target: QueriesBindings, queries: QueriesApi): void {\n target.getQueryFields = queries.getQueryFields.bind(queries);\n target.validateQuery = queries.validateQuery.bind(queries);\n target.previewQuery = queries.previewQuery.bind(queries);\n target.runQuery = queries.runQuery.bind(queries);\n}\n","import { CustomersApi } from '../../api';\n\nexport interface CustomersBindings {\n getMyCustomers: CustomersApi['getMyCustomers'];\n getMyCustomer: CustomersApi['getMyCustomer'];\n getMyCustomerAccounts: CustomersApi['getMyCustomerAccounts'];\n getMyCustomerSubscriptions: CustomersApi['getMyCustomerSubscriptions'];\n getMyCustomerInvoices: CustomersApi['getMyCustomerInvoices'];\n createMyCustomerPortalSession: CustomersApi['createMyCustomerPortalSession'];\n updateMyCustomer: CustomersApi['updateMyCustomer'];\n createMyCustomerSetupIntent: CustomersApi['createMyCustomerSetupIntent'];\n getMyCustomerPaymentMethods: CustomersApi['getMyCustomerPaymentMethods'];\n attachMyCustomerPaymentMethod: CustomersApi['attachMyCustomerPaymentMethod'];\n detachMyCustomerPaymentMethod: CustomersApi['detachMyCustomerPaymentMethod'];\n setDefaultMyCustomerPaymentMethod: CustomersApi['setDefaultMyCustomerPaymentMethod'];\n getMyCustomerCreditGrants: CustomersApi['getMyCustomerCreditGrants'];\n}\n\nexport function bindCustomersMethods(target: CustomersBindings, customers: CustomersApi): void {\n target.getMyCustomers = customers.getMyCustomers.bind(customers);\n target.getMyCustomer = customers.getMyCustomer.bind(customers);\n target.getMyCustomerAccounts = customers.getMyCustomerAccounts.bind(customers);\n target.getMyCustomerSubscriptions = customers.getMyCustomerSubscriptions.bind(customers);\n target.getMyCustomerInvoices = customers.getMyCustomerInvoices.bind(customers);\n target.createMyCustomerPortalSession = customers.createMyCustomerPortalSession.bind(customers);\n target.updateMyCustomer = customers.updateMyCustomer.bind(customers);\n target.createMyCustomerSetupIntent = customers.createMyCustomerSetupIntent.bind(customers);\n target.getMyCustomerPaymentMethods = customers.getMyCustomerPaymentMethods.bind(customers);\n target.attachMyCustomerPaymentMethod = customers.attachMyCustomerPaymentMethod.bind(customers);\n target.detachMyCustomerPaymentMethod = customers.detachMyCustomerPaymentMethod.bind(customers);\n target.setDefaultMyCustomerPaymentMethod =\n customers.setDefaultMyCustomerPaymentMethod.bind(customers);\n target.getMyCustomerCreditGrants = customers.getMyCustomerCreditGrants.bind(customers);\n}\n","import { ResellersApi } from '../../api';\n\nexport interface ResellersBindings {\n getMyResellers: ResellersApi['getMyResellers'];\n getMyReseller: ResellersApi['getMyReseller'];\n getMyResellerAccounts: ResellersApi['getMyResellerAccounts'];\n getMyResellerProducts: ResellersApi['getMyResellerProducts'];\n getMyResellerSubscriptions: ResellersApi['getMyResellerSubscriptions'];\n updateMyReseller: ResellersApi['updateMyReseller'];\n}\n\nexport function bindResellersMethods(target: ResellersBindings, resellers: ResellersApi): void {\n target.getMyResellers = resellers.getMyResellers.bind(resellers);\n target.getMyReseller = resellers.getMyReseller.bind(resellers);\n target.getMyResellerAccounts = resellers.getMyResellerAccounts.bind(resellers);\n target.getMyResellerProducts = resellers.getMyResellerProducts.bind(resellers);\n target.getMyResellerSubscriptions = resellers.getMyResellerSubscriptions.bind(resellers);\n target.updateMyReseller = resellers.updateMyReseller.bind(resellers);\n}\n","import { PromptsApi } from '../../api/prompts';\n\nexport interface PromptsBindings {\n inspectPrompt: PromptsApi['inspectPrompt'];\n}\n\nexport function bindPromptsMethods(target: PromptsBindings, prompts: PromptsApi): void {\n target.inspectPrompt = prompts.inspectPrompt.bind(prompts);\n}\n","import { SupportRequestsApi } from '../../api';\n\nexport interface SupportRequestsBindings {\n listSupportRequests: SupportRequestsApi['listSupportRequests'];\n getSupportRequest: SupportRequestsApi['getSupportRequest'];\n createSupportRequest: SupportRequestsApi['createSupportRequest'];\n commentOnSupportRequest: SupportRequestsApi['commentOnSupportRequest'];\n listOrgSupportRequests: SupportRequestsApi['listOrgSupportRequests'];\n getOrgSupportRequest: SupportRequestsApi['getOrgSupportRequest'];\n createOrgSupportRequest: SupportRequestsApi['createOrgSupportRequest'];\n commentOnOrgSupportRequest: SupportRequestsApi['commentOnOrgSupportRequest'];\n listWorkspaceSupportRequests: SupportRequestsApi['listWorkspaceSupportRequests'];\n getWorkspaceSupportRequest: SupportRequestsApi['getWorkspaceSupportRequest'];\n createWorkspaceSupportRequest: SupportRequestsApi['createWorkspaceSupportRequest'];\n commentOnWorkspaceSupportRequest: SupportRequestsApi['commentOnWorkspaceSupportRequest'];\n closeWorkspaceSupportRequest: SupportRequestsApi['closeWorkspaceSupportRequest'];\n reopenWorkspaceSupportRequest: SupportRequestsApi['reopenWorkspaceSupportRequest'];\n clickWorkspaceSupportRequestResource: SupportRequestsApi['clickWorkspaceSupportRequestResource'];\n}\n\nexport function bindSupportRequestMethods(\n target: SupportRequestsBindings,\n supportRequests: SupportRequestsApi\n): void {\n target.listSupportRequests = supportRequests.listSupportRequests.bind(supportRequests);\n target.getSupportRequest = supportRequests.getSupportRequest.bind(supportRequests);\n target.createSupportRequest = supportRequests.createSupportRequest.bind(supportRequests);\n target.commentOnSupportRequest = supportRequests.commentOnSupportRequest.bind(supportRequests);\n target.listOrgSupportRequests = supportRequests.listOrgSupportRequests.bind(supportRequests);\n target.getOrgSupportRequest = supportRequests.getOrgSupportRequest.bind(supportRequests);\n target.createOrgSupportRequest = supportRequests.createOrgSupportRequest.bind(supportRequests);\n target.commentOnOrgSupportRequest =\n supportRequests.commentOnOrgSupportRequest.bind(supportRequests);\n target.listWorkspaceSupportRequests =\n supportRequests.listWorkspaceSupportRequests.bind(supportRequests);\n target.getWorkspaceSupportRequest =\n supportRequests.getWorkspaceSupportRequest.bind(supportRequests);\n target.createWorkspaceSupportRequest =\n supportRequests.createWorkspaceSupportRequest.bind(supportRequests);\n target.commentOnWorkspaceSupportRequest =\n supportRequests.commentOnWorkspaceSupportRequest.bind(supportRequests);\n target.closeWorkspaceSupportRequest =\n supportRequests.closeWorkspaceSupportRequest.bind(supportRequests);\n target.reopenWorkspaceSupportRequest =\n supportRequests.reopenWorkspaceSupportRequest.bind(supportRequests);\n target.clickWorkspaceSupportRequestResource =\n supportRequests.clickWorkspaceSupportRequestResource.bind(supportRequests);\n}\n","import { RoutingRulesApi } from '../../api';\n\nexport interface RoutingRulesBindings {\n getRoutingRules: RoutingRulesApi['getRoutingRules'];\n getRoutingRule: RoutingRulesApi['getRoutingRule'];\n createRoutingRule: RoutingRulesApi['createRoutingRule'];\n updateRoutingRule: RoutingRulesApi['updateRoutingRule'];\n deleteRoutingRule: RoutingRulesApi['deleteRoutingRule'];\n reorderRoutingRules: RoutingRulesApi['reorderRoutingRules'];\n previewRoutingRule: RoutingRulesApi['previewRoutingRule'];\n}\n\nexport function bindRoutingRulesMethods(\n target: RoutingRulesBindings,\n routingRules: RoutingRulesApi\n): void {\n target.getRoutingRules = routingRules.getRoutingRules.bind(routingRules);\n target.getRoutingRule = routingRules.getRoutingRule.bind(routingRules);\n target.createRoutingRule = routingRules.createRoutingRule.bind(routingRules);\n target.updateRoutingRule = routingRules.updateRoutingRule.bind(routingRules);\n target.deleteRoutingRule = routingRules.deleteRoutingRule.bind(routingRules);\n target.reorderRoutingRules = routingRules.reorderRoutingRules.bind(routingRules);\n target.previewRoutingRule = routingRules.previewRoutingRule.bind(routingRules);\n}\n","import { WorkspaceInvitationsApi } from '../api';\nimport { EnhancedAuthHandler, OrgAuthHandler } from '../api/base';\nimport { ApiModules, createApiModules } from './api-modules';\nimport { createWorkspaceClient, type GravityRailWorkspaceClient } from './workspace-client';\nimport {\n AccessGrantsBindings,\n AgentTasksBindings,\n AgentsBindings,\n AppsBindings,\n AuthBindings,\n BillingBindings,\n CalendarsBindings,\n CallsBindings,\n ChatsBindings,\n CommunicationsBindings,\n CustomersBindings,\n ResellersBindings,\n DashboardsBindings,\n bindDashboardsMethods,\n ActivityBindings,\n bindActivityMethods,\n MotdBindings,\n bindMotdMethods,\n TrackedLinksBindings,\n bindTrackedLinksMethods,\n DataTypesBindings,\n DevicesBindings,\n EventsBindings,\n ExperimentsBindings,\n FilesBindings,\n ProjectsBindings,\n IntegrationsBindings,\n InterventionRequestsBindings,\n BundlesBindings,\n InstallationsBindings,\n bindBundlesMethods,\n bindInstallationsMethods,\n JourneysBindings,\n bindJourneysMethods,\n MembersBindings,\n OperatorBindings,\n OrgBindings,\n bindOrgMethods,\n PronunciationsBindings,\n QualificationsBindings,\n PersonasBindings,\n MetricsBindings,\n QueriesBindings,\n bindPronunciationsMethods,\n SitesBindings,\n TasksBindings,\n ToolkitsBindings,\n WorkflowsBindings,\n WorkspacesBindings,\n bindAccessGrantsMethods,\n bindAgentTasksMethods,\n bindAgentsMethods,\n bindAppsMethods,\n bindAuthMethods,\n bindBillingMethods,\n bindCalendarsMethods,\n bindCallsMethods,\n bindChatsMethods,\n bindCommunicationsMethods,\n bindCustomersMethods,\n bindResellersMethods,\n bindDataTypesMethods,\n bindDevicesMethods,\n bindEventsMethods,\n bindExperimentsMethods,\n bindFilesMethods,\n bindProjectsMethods,\n bindIntegrationsMethods,\n bindInterventionRequestsMethods,\n bindMembersMethods,\n bindOperatorMethods,\n bindQualificationsMethods,\n bindPersonasMethods,\n bindMetricsMethods,\n bindQueriesMethods,\n bindSitesMethods,\n bindTasksMethods,\n bindToolkitsMethods,\n bindWorkflowsMethods,\n bindWorkspacesMethods,\n PromptsBindings,\n bindPromptsMethods,\n SupportRequestsBindings,\n bindSupportRequestMethods,\n RoutingRulesBindings,\n bindRoutingRulesMethods,\n} from './bindings';\n\n/**\n * GravityRailClient provides a unified interface to all public Gravity Rail API endpoints.\n *\n * Methods are organized by domain and bound to their respective API modules.\n * See the bindings directory for the organization of methods by domain.\n *\n * This class excludes admin/superuser methods. The full client including\n * admin functionality (`ApiClient`) lives in the private `@gravity-rail/client`\n * package and extends this class.\n */\nexport class GravityRailClient\n implements\n TasksBindings,\n ChatsBindings,\n CallsBindings,\n DataTypesBindings,\n DevicesBindings,\n MembersBindings,\n WorkspacesBindings,\n AuthBindings,\n SitesBindings,\n FilesBindings,\n ProjectsBindings,\n EventsBindings,\n ExperimentsBindings,\n WorkflowsBindings,\n CalendarsBindings,\n CommunicationsBindings,\n ToolkitsBindings,\n BillingBindings,\n AppsBindings,\n IntegrationsBindings,\n AgentTasksBindings,\n AgentsBindings,\n PronunciationsBindings,\n QualificationsBindings,\n PersonasBindings,\n QueriesBindings,\n CustomersBindings,\n ResellersBindings,\n DashboardsBindings,\n ActivityBindings,\n MotdBindings,\n TrackedLinksBindings,\n JourneysBindings,\n BundlesBindings,\n InstallationsBindings,\n OperatorBindings,\n OrgBindings,\n AccessGrantsBindings,\n InterventionRequestsBindings,\n PromptsBindings,\n SupportRequestsBindings,\n RoutingRulesBindings\n{\n // WorkspaceInvitations is exposed publicly for backward compatibility\n public workspaceInvitations: WorkspaceInvitationsApi;\n\n // Store all API modules for cross-cutting operations\n protected apis: ApiModules;\n\n // Tasks API\n getTasks!: TasksBindings['getTasks'];\n getTask!: TasksBindings['getTask'];\n createTask!: TasksBindings['createTask'];\n updateTask!: TasksBindings['updateTask'];\n deleteTask!: TasksBindings['deleteTask'];\n archiveTask!: TasksBindings['archiveTask'];\n unarchiveTask!: TasksBindings['unarchiveTask'];\n cloneTask!: TasksBindings['cloneTask'];\n getAbilityTypes!: TasksBindings['getAbilityTypes'];\n getAbilityType!: TasksBindings['getAbilityType'];\n listAbilities!: TasksBindings['listAbilities'];\n createAbility!: TasksBindings['createAbility'];\n updateAbility!: TasksBindings['updateAbility'];\n deleteAbility!: TasksBindings['deleteAbility'];\n getCharlestonTestDeliveryRecipients!: TasksBindings['getCharlestonTestDeliveryRecipients'];\n\n // Chats API\n getChats!: ChatsBindings['getChats'];\n getChat!: ChatsBindings['getChat'];\n getChatByUuid!: ChatsBindings['getChatByUuid'];\n saveChatBrowserStorage!: ChatsBindings['saveChatBrowserStorage'];\n clearChatBrowserStorage!: ChatsBindings['clearChatBrowserStorage'];\n getChatBrowserLiveView!: ChatsBindings['getChatBrowserLiveView'];\n getChatMachineResources!: ChatsBindings['getChatMachineResources'];\n getCurrentSmsChat!: ChatsBindings['getCurrentSmsChat'];\n getChatCallbacks!: ChatsBindings['getChatCallbacks'];\n getChatEhrWritebackOutcomes!: ChatsBindings['getChatEhrWritebackOutcomes'];\n cancelChatCallback!: ChatsBindings['cancelChatCallback'];\n getChatTokenUsage!: ChatsBindings['getChatTokenUsage'];\n getChatTodos!: ChatsBindings['getChatTodos'];\n getChatSkills!: ChatsBindings['getChatSkills'];\n getManagerSkills!: ChatsBindings['getManagerSkills'];\n getChatsNeedsResponse!: ChatsBindings['getChatsNeedsResponse'];\n getChatsDailyCreationStats!: ChatsBindings['getChatsDailyCreationStats'];\n getToolCallNames!: ChatsBindings['getToolCallNames'];\n archiveChat!: ChatsBindings['archiveChat'];\n unarchiveChat!: ChatsBindings['unarchiveChat'];\n createChat!: ChatsBindings['createChat'];\n createChatInteractionSession!: ChatsBindings['createChatInteractionSession'];\n transitionChatInteractionSession!: ChatsBindings['transitionChatInteractionSession'];\n createWorkflowOutboundVoiceChat!: ChatsBindings['createWorkflowOutboundVoiceChat'];\n deleteChat!: ChatsBindings['deleteChat'];\n updateChat!: ChatsBindings['updateChat'];\n getChatModelOverride!: ChatsBindings['getChatModelOverride'];\n updateChatModelOverride!: ChatsBindings['updateChatModelOverride'];\n updateChatMute!: ChatsBindings['updateChatMute'];\n summarizeChat!: ChatsBindings['summarizeChat'];\n getChatMessages!: ChatsBindings['getChatMessages'];\n getChildThreadMessages!: ChatsBindings['getChildThreadMessages'];\n getChatToolCallMessages!: ChatsBindings['getChatToolCallMessages'];\n getChatTools!: ChatsBindings['getChatTools'];\n initiateOutboundCall!: ChatsBindings['initiateOutboundCall'];\n sendAssistantMessage!: ChatsBindings['sendAssistantMessage'];\n rateMessage!: ChatsBindings['rateMessage'];\n getChatFeedback!: ChatsBindings['getChatFeedback'];\n getChatAssignmentTasks!: ChatsBindings['getChatAssignmentTasks'];\n createChatCompletion!: ChatsBindings['createChatCompletion'];\n exportChats!: ChatsBindings['exportChats'];\n exportChat!: ChatsBindings['exportChat'];\n findOrCreateDMChat!: ChatsBindings['findOrCreateDMChat'];\n sendChatMessage!: ChatsBindings['sendChatMessage'];\n getChatPhoneCalls!: ChatsBindings['getChatPhoneCalls'];\n getChatLabels!: ChatsBindings['getChatLabels'];\n getChatLabel!: ChatsBindings['getChatLabel'];\n getChatLabelByUuid!: ChatsBindings['getChatLabelByUuid'];\n createChatLabel!: ChatsBindings['createChatLabel'];\n updateChatLabel!: ChatsBindings['updateChatLabel'];\n deleteChatLabel!: ChatsBindings['deleteChatLabel'];\n getChatFilters!: ChatsBindings['getChatFilters'];\n getChatFilter!: ChatsBindings['getChatFilter'];\n getChatFilterByUuid!: ChatsBindings['getChatFilterByUuid'];\n createChatFilter!: ChatsBindings['createChatFilter'];\n updateChatFilter!: ChatsBindings['updateChatFilter'];\n deleteChatFilter!: ChatsBindings['deleteChatFilter'];\n getChatFilterCount!: ChatsBindings['getChatFilterCount'];\n\n // Calls API\n getPhoneCalls!: CallsBindings['getPhoneCalls'];\n getMessageTiming!: CallsBindings['getMessageTiming'];\n getRecordingInfo!: CallsBindings['getRecordingInfo'];\n listChatRecordings!: CallsBindings['listChatRecordings'];\n getCallRecordingDownloadUrl!: CallsBindings['getCallRecordingDownloadUrl'];\n getCelContext!: CallsBindings['getCelContext'];\n validateCelExpression!: CallsBindings['validateCelExpression'];\n\n // Data Types API\n getDataTypes!: DataTypesBindings['getDataTypes'];\n getDataTypeDraft!: DataTypesBindings['getDataTypeDraft'];\n saveDataTypeDraft!: DataTypesBindings['saveDataTypeDraft'];\n publishDataTypeDraft!: DataTypesBindings['publishDataTypeDraft'];\n getDataTypeVersions!: DataTypesBindings['getDataTypeVersions'];\n getDataType!: DataTypesBindings['getDataType'];\n getDataTypeByUuid!: DataTypesBindings['getDataTypeByUuid'];\n getDataTypeBySlug!: DataTypesBindings['getDataTypeBySlug'];\n createDataType!: DataTypesBindings['createDataType'];\n updateDataType!: DataTypesBindings['updateDataType'];\n deleteDataType!: DataTypesBindings['deleteDataType'];\n archiveDataType!: DataTypesBindings['archiveDataType'];\n unarchiveDataType!: DataTypesBindings['unarchiveDataType'];\n cloneDataType!: DataTypesBindings['cloneDataType'];\n getDataRecords!: DataTypesBindings['getDataRecords'];\n listAnonymousFormSubmissions!: DataTypesBindings['listAnonymousFormSubmissions'];\n getAnonymousFormSubmission!: DataTypesBindings['getAnonymousFormSubmission'];\n getDataRecord!: DataTypesBindings['getDataRecord'];\n getDataRecordByUuid!: DataTypesBindings['getDataRecordByUuid'];\n createDataRecord!: DataTypesBindings['createDataRecord'];\n updateDataRecord!: DataTypesBindings['updateDataRecord'];\n deleteDataRecord!: DataTypesBindings['deleteDataRecord'];\n getDataRecordChanges!: DataTypesBindings['getDataRecordChanges'];\n upsertDataRecord!: DataTypesBindings['upsertDataRecord'];\n toggleFieldIndex!: DataTypesBindings['toggleFieldIndex'];\n previewRenameFieldSlug!: DataTypesBindings['previewRenameFieldSlug'];\n renameFieldSlug!: DataTypesBindings['renameFieldSlug'];\n getFieldIndexStatus!: DataTypesBindings['getFieldIndexStatus'];\n validateDataTypeSlug!: DataTypesBindings['validateDataTypeSlug'];\n getMemberRecordCounts!: DataTypesBindings['getMemberRecordCounts'];\n getDataRecordFilters!: DataTypesBindings['getDataRecordFilters'];\n getDataRecordFilter!: DataTypesBindings['getDataRecordFilter'];\n createDataRecordFilter!: DataTypesBindings['createDataRecordFilter'];\n updateDataRecordFilter!: DataTypesBindings['updateDataRecordFilter'];\n deleteDataRecordFilter!: DataTypesBindings['deleteDataRecordFilter'];\n getDataRecordFilterCount!: DataTypesBindings['getDataRecordFilterCount'];\n\n // Members API\n getCurrentMember!: MembersBindings['getCurrentMember'];\n getMyDataTypes!: MembersBindings['getMyDataTypes'];\n getMyRecords!: MembersBindings['getMyRecords'];\n getMemberWorkflowVoices!: MembersBindings['getMemberWorkflowVoices'];\n previewMemberWorkflowVoice!: MembersBindings['previewMemberWorkflowVoice'];\n setMemberWorkflowVoice!: MembersBindings['setMemberWorkflowVoice'];\n clearMemberWorkflowVoice!: MembersBindings['clearMemberWorkflowVoice'];\n updateCurrentMember!: MembersBindings['updateCurrentMember'];\n getWorkspaceMembers!: MembersBindings['getWorkspaceMembers'];\n getWorkspaceMember!: MembersBindings['getWorkspaceMember'];\n getMemberByUuid!: MembersBindings['getMemberByUuid'];\n // Org-scoped, so deliberately absent from WORKSPACE_METHOD_NAMES: that proxy\n // passes a workspace uuid as the first argument.\n getOrgWorkspaceMember!: MembersBindings['getOrgWorkspaceMember'];\n createWorkspaceMember!: MembersBindings['createWorkspaceMember'];\n updateMember!: MembersBindings['updateMember'];\n deleteMember!: MembersBindings['deleteMember'];\n archiveMember!: MembersBindings['archiveMember'];\n unarchiveMember!: MembersBindings['unarchiveMember'];\n updateMemberByExternalId!: MembersBindings['updateMemberByExternalId'];\n archiveMemberByExternalId!: MembersBindings['archiveMemberByExternalId'];\n unarchiveMemberByExternalId!: MembersBindings['unarchiveMemberByExternalId'];\n sendMemberPhoneConfirmation!: MembersBindings['sendMemberPhoneConfirmation'];\n bulkCreateMembers!: MembersBindings['bulkCreateMembers'];\n previewImportMembers!: MembersBindings['previewImportMembers'];\n importMembers!: MembersBindings['importMembers'];\n exportMembers!: MembersBindings['exportMembers'];\n getMembersMessageActivity!: MembersBindings['getMembersMessageActivity'];\n getMemberFilters!: MembersBindings['getMemberFilters'];\n getMemberFilter!: MembersBindings['getMemberFilter'];\n createMemberFilter!: MembersBindings['createMemberFilter'];\n updateMemberFilter!: MembersBindings['updateMemberFilter'];\n deleteMemberFilter!: MembersBindings['deleteMemberFilter'];\n getMemberFilterCount!: MembersBindings['getMemberFilterCount'];\n getMemberLabels!: MembersBindings['getMemberLabels'];\n getMemberLabel!: MembersBindings['getMemberLabel'];\n getMemberLabelByUuid!: MembersBindings['getMemberLabelByUuid'];\n createMemberLabel!: MembersBindings['createMemberLabel'];\n updateMemberLabel!: MembersBindings['updateMemberLabel'];\n deleteMemberLabel!: MembersBindings['deleteMemberLabel'];\n getMemberRoles!: MembersBindings['getMemberRoles'];\n getMemberRole!: MembersBindings['getMemberRole'];\n getMemberRoleByUuid!: MembersBindings['getMemberRoleByUuid'];\n createMemberRole!: MembersBindings['createMemberRole'];\n updateMemberRole!: MembersBindings['updateMemberRole'];\n deleteMemberRole!: MembersBindings['deleteMemberRole'];\n getMemberRoleCleanupPlan!: MembersBindings['getMemberRoleCleanupPlan'];\n mergeMemberRoles!: MembersBindings['mergeMemberRoles'];\n // Member Fields\n getMemberFields!: MembersBindings['getMemberFields'];\n getMemberFieldDefinitions!: MembersBindings['getMemberFieldDefinitions'];\n createMemberField!: MembersBindings['createMemberField'];\n updateMemberField!: MembersBindings['updateMemberField'];\n deleteMemberField!: MembersBindings['deleteMemberField'];\n // Credential Change Invites (Admin-initiated)\n inviteMemberCredentialUpdate!: MembersBindings['inviteMemberCredentialUpdate'];\n cancelCredentialUpdateInvite!: MembersBindings['cancelCredentialUpdateInvite'];\n getCredentialUpdateInvites!: MembersBindings['getCredentialUpdateInvites'];\n // Anonymous Member Resolutions\n getAnonymousResolutions!: MembersBindings['getAnonymousResolutions'];\n getAnonymousResolution!: MembersBindings['getAnonymousResolution'];\n resolveAnonymousMember!: MembersBindings['resolveAnonymousMember'];\n expireAnonymousMember!: MembersBindings['expireAnonymousMember'];\n // Member Memories\n getMemberMemories!: MembersBindings['getMemberMemories'];\n getMemberMemory!: MembersBindings['getMemberMemory'];\n createMemberMemory!: MembersBindings['createMemberMemory'];\n deleteMemberMemory!: MembersBindings['deleteMemberMemory'];\n // Member Sync Links\n getMemberSyncLinks!: MembersBindings['getMemberSyncLinks'];\n // Member Relationships\n getMemberRelationships!: MembersBindings['getMemberRelationships'];\n createMemberRelationship!: MembersBindings['createMemberRelationship'];\n archiveMemberRelationship!: MembersBindings['archiveMemberRelationship'];\n listContactPermissions!: MembersBindings['listContactPermissions'];\n createContactPermission!: MembersBindings['createContactPermission'];\n\n // Agent Tasks API (operator-facing async sub-agent inspection/cancel)\n getAgentTasks!: AgentTasksBindings['getAgentTasks'];\n getAgentTask!: AgentTasksBindings['getAgentTask'];\n cancelAgentTask!: AgentTasksBindings['cancelAgentTask'];\n getAgentTaskMessages!: AgentTasksBindings['getAgentTaskMessages'];\n\n // Agents API\n getAgents!: AgentsBindings['getAgents'];\n getAgent!: AgentsBindings['getAgent'];\n createAgent!: AgentsBindings['createAgent'];\n updateAgent!: AgentsBindings['updateAgent'];\n deleteAgent!: AgentsBindings['deleteAgent'];\n archiveAgent!: AgentsBindings['archiveAgent'];\n unarchiveAgent!: AgentsBindings['unarchiveAgent'];\n\n // Qualifications API\n getQualifications!: QualificationsBindings['getQualifications'];\n getQualification!: QualificationsBindings['getQualification'];\n getOrCreateQualificationForWorkflow!: QualificationsBindings['getOrCreateQualificationForWorkflow'];\n listScenarios!: QualificationsBindings['listScenarios'];\n createScenario!: QualificationsBindings['createScenario'];\n getScenario!: QualificationsBindings['getScenario'];\n updateScenario!: QualificationsBindings['updateScenario'];\n deleteScenario!: QualificationsBindings['deleteScenario'];\n listTestChatRuns!: QualificationsBindings['listTestChatRuns'];\n listScenarioHealthSummaries!: QualificationsBindings['listScenarioHealthSummaries'];\n getTestChatRun!: QualificationsBindings['getTestChatRun'];\n startTestChatRun!: QualificationsBindings['startTestChatRun'];\n evaluateTestChatRun!: QualificationsBindings['evaluateTestChatRun'];\n endTestChatRun!: QualificationsBindings['endTestChatRun'];\n\n // Personas API (workspace-scoped test-identity templates)\n // Unified Query Engine\n getQueryFields!: QueriesBindings['getQueryFields'];\n validateQuery!: QueriesBindings['validateQuery'];\n previewQuery!: QueriesBindings['previewQuery'];\n runQuery!: QueriesBindings['runQuery'];\n\n listPersonas!: PersonasBindings['listPersonas'];\n getPersona!: PersonasBindings['getPersona'];\n createPersona!: PersonasBindings['createPersona'];\n updatePersona!: PersonasBindings['updatePersona'];\n archivePersona!: PersonasBindings['archivePersona'];\n unarchivePersona!: PersonasBindings['unarchivePersona'];\n deletePersona!: PersonasBindings['deletePersona'];\n\n // Metrics API (customer-defined outcome metrics)\n listMetrics!: MetricsBindings['listMetrics'];\n getMetric!: MetricsBindings['getMetric'];\n createMetric!: MetricsBindings['createMetric'];\n updateMetric!: MetricsBindings['updateMetric'];\n deleteMetric!: MetricsBindings['deleteMetric'];\n listMetricObservations!: MetricsBindings['listMetricObservations'];\n getMetricSeries!: MetricsBindings['getMetricSeries'];\n computeChatMetrics!: MetricsBindings['computeChatMetrics'];\n\n // Dashboards API\n getDashboards!: DashboardsBindings['getDashboards'];\n getDashboard!: DashboardsBindings['getDashboard'];\n createDashboard!: DashboardsBindings['createDashboard'];\n updateDashboard!: DashboardsBindings['updateDashboard'];\n deleteDashboard!: DashboardsBindings['deleteDashboard'];\n getDashboardChannelStats!: DashboardsBindings['getDashboardChannelStats'];\n getDashboardWorkflowAssignmentStats!: DashboardsBindings['getDashboardWorkflowAssignmentStats'];\n getConfigurationHealth!: DashboardsBindings['getConfigurationHealth'];\n\n // Activity Spine serving API — one query shape, three mounts\n // (docs/projects/active/activity-spine.md).\n queryActivity!: ActivityBindings['queryActivity'];\n queryActivityLatestSubjects!: ActivityBindings['queryActivityLatestSubjects'];\n queryActivityOpenItems!: ActivityBindings['queryActivityOpenItems'];\n queryActivityOneView!: ActivityBindings['queryActivityOneView'];\n queryActivityDigest!: ActivityBindings['queryActivityDigest'];\n getActivityCounts!: ActivityBindings['getActivityCounts'];\n getActivityCapabilities!: ActivityBindings['getActivityCapabilities'];\n queryOrgActivity!: ActivityBindings['queryOrgActivity'];\n queryOrgActivityLatestSubjects!: ActivityBindings['queryOrgActivityLatestSubjects'];\n queryOrgActivityOpenItems!: ActivityBindings['queryOrgActivityOpenItems'];\n queryOrgActivityOneView!: ActivityBindings['queryOrgActivityOneView'];\n queryOrgActivityDigest!: ActivityBindings['queryOrgActivityDigest'];\n getOrgActivityCounts!: ActivityBindings['getOrgActivityCounts'];\n queryWorkspaceActivity!: ActivityBindings['queryWorkspaceActivity'];\n queryWorkspaceActivityLatestSubjects!: ActivityBindings['queryWorkspaceActivityLatestSubjects'];\n queryWorkspaceActivityOpenItems!: ActivityBindings['queryWorkspaceActivityOpenItems'];\n queryWorkspaceActivityOneView!: ActivityBindings['queryWorkspaceActivityOneView'];\n queryWorkspaceActivityDigest!: ActivityBindings['queryWorkspaceActivityDigest'];\n getWorkspaceActivityCounts!: ActivityBindings['getWorkspaceActivityCounts'];\n // Hydration: typed refs in, display summaries out, one round trip. The org\n // variant carries several workspaces' groups in that one trip.\n resolveEntityRefs!: ActivityBindings['resolveEntityRefs'];\n resolveOrgEntityRefs!: ActivityBindings['resolveOrgEntityRefs'];\n resolveAccountEntityRefs!: ActivityBindings['resolveAccountEntityRefs'];\n\n // MOTD API\n getMotd!: MotdBindings['getMotd'];\n\n // Tracked Links analytics (#10934)\n getTrackedLinkSummary!: TrackedLinksBindings['getTrackedLinkSummary'];\n getTrackedLinkDestinations!: TrackedLinksBindings['getTrackedLinkDestinations'];\n getTrackedLinkStats!: TrackedLinksBindings['getTrackedLinkStats'];\n getTrackedLinkTimeseries!: TrackedLinksBindings['getTrackedLinkTimeseries'];\n createTrackedLinkDestination!: TrackedLinksBindings['createTrackedLinkDestination'];\n updateTrackedLinkDestination!: TrackedLinksBindings['updateTrackedLinkDestination'];\n deleteTrackedLinkDestination!: TrackedLinksBindings['deleteTrackedLinkDestination'];\n clearTrackedLinkDestinations!: TrackedLinksBindings['clearTrackedLinkDestinations'];\n\n // Journeys API\n getJourneys!: JourneysBindings['getJourneys'];\n getJourney!: JourneysBindings['getJourney'];\n getJourneyAuthoring!: JourneysBindings['getJourneyAuthoring'];\n putJourneyDraft!: JourneysBindings['putJourneyDraft'];\n deleteJourneyDraft!: JourneysBindings['deleteJourneyDraft'];\n putJourneyV2Definition!: JourneysBindings['putJourneyV2Definition'];\n getJourneyV2Validation!: JourneysBindings['getJourneyV2Validation'];\n getJourneyFilterOptions!: JourneysBindings['getJourneyFilterOptions'];\n getJourneyHealth!: JourneysBindings['getJourneyHealth'];\n cloneJourneyAsV2!: JourneysBindings['cloneJourneyAsV2'];\n createJourney!: JourneysBindings['createJourney'];\n updateJourney!: JourneysBindings['updateJourney'];\n archiveJourney!: JourneysBindings['archiveJourney'];\n createStep!: JourneysBindings['createStep'];\n updateStep!: JourneysBindings['updateStep'];\n archiveStep!: JourneysBindings['archiveStep'];\n unarchiveStep!: JourneysBindings['unarchiveStep'];\n createConnection!: JourneysBindings['createConnection'];\n updateConnection!: JourneysBindings['updateConnection'];\n deleteConnection!: JourneysBindings['deleteConnection'];\n createGoal!: JourneysBindings['createGoal'];\n updateGoal!: JourneysBindings['updateGoal'];\n deleteGoal!: JourneysBindings['deleteGoal'];\n getJourneyMembers!: JourneysBindings['getJourneyMembers'];\n enrollMembers!: JourneysBindings['enrollMembers'];\n unenrollMembers!: JourneysBindings['unenrollMembers'];\n reenrollMember!: JourneysBindings['reenrollMember'];\n deleteEnrollment!: JourneysBindings['deleteEnrollment'];\n getMemberJourneys!: JourneysBindings['getMemberJourneys'];\n getEnrollmentStatusLog!: JourneysBindings['getEnrollmentStatusLog'];\n getStepMembers!: JourneysBindings['getStepMembers'];\n getStepMemberCounts!: JourneysBindings['getStepMemberCounts'];\n advanceStep!: JourneysBindings['advanceStep'];\n skipStep!: JourneysBindings['skipStep'];\n testRunJourney!: JourneysBindings['testRunJourney'];\n getJourneyNotes!: JourneysBindings['getJourneyNotes'];\n createJourneyNote!: JourneysBindings['createJourneyNote'];\n updateJourneyNote!: JourneysBindings['updateJourneyNote'];\n deleteJourneyNote!: JourneysBindings['deleteJourneyNote'];\n\n updateBundle!: BundlesBindings['updateBundle'];\n listBundleInstallations!: BundlesBindings['listBundleInstallations'];\n // Bundles API\n getSolutionRelease!: BundlesBindings['getSolutionRelease'];\n listBundles!: BundlesBindings['listBundles'];\n listBundleWorkflowCandidates!: BundlesBindings['listBundleWorkflowCandidates'];\n createBundle!: BundlesBindings['createBundle'];\n getBundleDraft!: BundlesBindings['getBundleDraft'];\n replaceBundleDraft!: BundlesBindings['replaceBundleDraft'];\n publishBundle!: BundlesBindings['publishBundle'];\n listBundleVersions!: BundlesBindings['listBundleVersions'];\n getBundle!: BundlesBindings['getBundle'];\n getBundleVersion!: BundlesBindings['getBundleVersion'];\n listBundleGrants!: BundlesBindings['listBundleGrants'];\n grantBundle!: BundlesBindings['grantBundle'];\n revokeBundleGrant!: BundlesBindings['revokeBundleGrant'];\n listResourceWorkflows!: BundlesBindings['listResourceWorkflows'];\n\n // Resource Workflows API — published Workflow catalog reads\n getResourceWorkflow!: BundlesBindings['getResourceWorkflow'];\n getResourceWorkflowRevision!: BundlesBindings['getResourceWorkflowRevision'];\n\n // Installations API\n preflightBundleInstallation!: InstallationsBindings['preflightBundleInstallation'];\n installBundle!: InstallationsBindings['installBundle'];\n listInstallations!: InstallationsBindings['listInstallations'];\n getInstallation!: InstallationsBindings['getInstallation'];\n getInstallationReadiness!: InstallationsBindings['getInstallationReadiness'];\n previewInstallationUpgrade!: InstallationsBindings['previewInstallationUpgrade'];\n upgradeInstallation!: InstallationsBindings['upgradeInstallation'];\n setInstallationPolicy!: InstallationsBindings['setInstallationPolicy'];\n unsubscribeInstallation!: InstallationsBindings['unsubscribeInstallation'];\n bindInstallationSlots!: InstallationsBindings['bindInstallationSlots'];\n restoreInstallationForm!: InstallationsBindings['restoreInstallationForm'];\n restoreInstallationWorkflowResources!: InstallationsBindings['restoreInstallationWorkflowResources'];\n reconcileInstallation!: InstallationsBindings['reconcileInstallation'];\n getThemeSettingsSchema!: InstallationsBindings['getThemeSettingsSchema'];\n\n // Experiments API\n getExperiments!: ExperimentsBindings['getExperiments'];\n getExperiment!: ExperimentsBindings['getExperiment'];\n createExperiment!: ExperimentsBindings['createExperiment'];\n updateExperiment!: ExperimentsBindings['updateExperiment'];\n deleteExperiment!: ExperimentsBindings['deleteExperiment'];\n createExperimentGroup!: ExperimentsBindings['createExperimentGroup'];\n updateExperimentGroup!: ExperimentsBindings['updateExperimentGroup'];\n deleteExperimentGroup!: ExperimentsBindings['deleteExperimentGroup'];\n getExperimentStats!: ExperimentsBindings['getExperimentStats'];\n getMemberExperiments!: ExperimentsBindings['getMemberExperiments'];\n createExperimentAssignment!: ExperimentsBindings['createExperimentAssignment'];\n updateExperimentAssignment!: ExperimentsBindings['updateExperimentAssignment'];\n deleteExperimentAssignment!: ExperimentsBindings['deleteExperimentAssignment'];\n\n // Operator Groups API\n getOperatorGroups!: OperatorBindings['getOperatorGroups'];\n getOperatorGroup!: OperatorBindings['getOperatorGroup'];\n createOperatorGroup!: OperatorBindings['createOperatorGroup'];\n updateOperatorGroup!: OperatorBindings['updateOperatorGroup'];\n deleteOperatorGroup!: OperatorBindings['deleteOperatorGroup'];\n addGroupMember!: OperatorBindings['addGroupMember'];\n removeGroupMember!: OperatorBindings['removeGroupMember'];\n getLiveOperators!: OperatorBindings['getLiveOperators'];\n getPresenceStatus!: OperatorBindings['getPresenceStatus'];\n getOperatorChatMessages!: OperatorBindings['getOperatorChatMessages'];\n sendOperatorMessage!: OperatorBindings['sendOperatorMessage'];\n\n // Access Grants API\n getMyReceivedGrants!: AccessGrantsBindings['getMyReceivedGrants'];\n getMyGivenGrants!: AccessGrantsBindings['getMyGivenGrants'];\n getAccessGrant!: AccessGrantsBindings['getAccessGrant'];\n createAccessGrant!: AccessGrantsBindings['createAccessGrant'];\n resolveAccessGrant!: AccessGrantsBindings['resolveAccessGrant'];\n revokeAccessGrant!: AccessGrantsBindings['revokeAccessGrant'];\n getAccessGrants!: AccessGrantsBindings['getAccessGrants'];\n getMemberGrants!: AccessGrantsBindings['getMemberGrants'];\n getGranteeGrants!: AccessGrantsBindings['getGranteeGrants'];\n\n // Intervention Requests API\n getAgentModeAttention!: InterventionRequestsBindings['getAgentModeAttention'];\n getInterventionRequests!: InterventionRequestsBindings['getInterventionRequests'];\n resolveInterventionRequest!: InterventionRequestsBindings['resolveInterventionRequest'];\n\n // Prompts API\n inspectPrompt!: PromptsBindings['inspectPrompt'];\n\n // Workspaces API\n getWorkspaces!: WorkspacesBindings['getWorkspaces'];\n getDeviceAdmissibleWorkspaces!: WorkspacesBindings['getDeviceAdmissibleWorkspaces'];\n getPublicWorkspaces!: WorkspacesBindings['getPublicWorkspaces'];\n getWorkspace!: WorkspacesBindings['getWorkspace'];\n createWorkspace!: WorkspacesBindings['createWorkspace'];\n updateWorkspace!: WorkspacesBindings['updateWorkspace'];\n deleteWorkspace!: WorkspacesBindings['deleteWorkspace'];\n leaveWorkspace!: WorkspacesBindings['leaveWorkspace'];\n getWorkspaceDefaults!: WorkspacesBindings['getWorkspaceDefaults'];\n updateWorkspaceDefaults!: WorkspacesBindings['updateWorkspaceDefaults'];\n getFirstRunState!: WorkspacesBindings['getFirstRunState'];\n updateFirstRunState!: WorkspacesBindings['updateFirstRunState'];\n getWorkspaceCounts!: WorkspacesBindings['getWorkspaceCounts'];\n getBusinessHoursStatus!: WorkspacesBindings['getBusinessHoursStatus'];\n getAvailableWorkspaceFeatures!: WorkspacesBindings['getAvailableWorkspaceFeatures'];\n getWorkspaceNotices!: WorkspacesBindings['getWorkspaceNotices'];\n getNotifications!: WorkspacesBindings['getNotifications'];\n getNotification!: WorkspacesBindings['getNotification'];\n getUnreadNotificationCount!: WorkspacesBindings['getUnreadNotificationCount'];\n markNotificationAsRead!: WorkspacesBindings['markNotificationAsRead'];\n dismissNotification!: WorkspacesBindings['dismissNotification'];\n dismissAllNotifications!: WorkspacesBindings['dismissAllNotifications'];\n getResellerWorkspaces!: WorkspacesBindings['getResellerWorkspaces'];\n createClientWorkspace!: WorkspacesBindings['createClientWorkspace'];\n getClientWorkspace!: WorkspacesBindings['getClientWorkspace'];\n updateClientWorkspace!: WorkspacesBindings['updateClientWorkspace'];\n deleteClientWorkspace!: WorkspacesBindings['deleteClientWorkspace'];\n provisionClientWorkspace!: WorkspacesBindings['provisionClientWorkspace'];\n getProducts!: WorkspacesBindings['getProducts'];\n getProduct!: WorkspacesBindings['getProduct'];\n getWorkspaceProduct!: WorkspacesBindings['getWorkspaceProduct'];\n getPublicProducts!: WorkspacesBindings['getPublicProducts'];\n previewPromoCode!: WorkspacesBindings['previewPromoCode'];\n startPromoPlanTrial!: WorkspacesBindings['startPromoPlanTrial'];\n getPublicProduct!: WorkspacesBindings['getPublicProduct'];\n createProduct!: WorkspacesBindings['createProduct'];\n updateProduct!: WorkspacesBindings['updateProduct'];\n deleteProduct!: WorkspacesBindings['deleteProduct'];\n exportWorkspace!: WorkspacesBindings['exportWorkspace'];\n exportWorkspaceZip!: WorkspacesBindings['exportWorkspaceZip'];\n previewWorkspaceImport!: WorkspacesBindings['previewWorkspaceImport'];\n previewWorkspaceImportZip!: WorkspacesBindings['previewWorkspaceImportZip'];\n importWorkspace!: WorkspacesBindings['importWorkspace'];\n importWorkspaceZip!: WorkspacesBindings['importWorkspaceZip'];\n getImportSkippedRules!: WorkspacesBindings['getImportSkippedRules'];\n getImportReadiness!: WorkspacesBindings['getImportReadiness'];\n rebuildImportSkippedRules!: WorkspacesBindings['rebuildImportSkippedRules'];\n previewImportWorkspace!: WorkspacesBindings['previewImportWorkspace'];\n getWorkspaceThemes!: WorkspacesBindings['getWorkspaceThemes'];\n getWorkspaceBySlug!: WorkspacesBindings['getWorkspaceBySlug'];\n getWorkspaceScopes!: WorkspacesBindings['getWorkspaceScopes'];\n getUsageDashboard!: WorkspacesBindings['getUsageDashboard'];\n getWorkspaceEmailDomains!: WorkspacesBindings['getWorkspaceEmailDomains'];\n getWorkspaceSiteDomains!: WorkspacesBindings['getWorkspaceSiteDomains'];\n getWorkspaceWidgetDomains!: WorkspacesBindings['getWorkspaceWidgetDomains'];\n listWidgetDomains!: WorkspacesBindings['listWidgetDomains'];\n upsertWidgetDomain!: WorkspacesBindings['upsertWidgetDomain'];\n deleteWidgetDomain!: WorkspacesBindings['deleteWidgetDomain'];\n\n // Org API\n listOrgDomains!: OrgBindings['listOrgDomains'];\n registerOrgDomain!: OrgBindings['registerOrgDomain'];\n getOrgDomain!: OrgBindings['getOrgDomain'];\n verifyOrgDomainOwnership!: OrgBindings['verifyOrgDomainOwnership'];\n deleteOrgDomain!: OrgBindings['deleteOrgDomain'];\n enableOrgDomainEmail!: OrgBindings['enableOrgDomainEmail'];\n getOrgDomainEmail!: OrgBindings['getOrgDomainEmail'];\n verifyOrgDomainEmail!: OrgBindings['verifyOrgDomainEmail'];\n disableOrgDomainEmail!: OrgBindings['disableOrgDomainEmail'];\n enableOrgDomainSite!: OrgBindings['enableOrgDomainSite'];\n getOrgDomainSite!: OrgBindings['getOrgDomainSite'];\n preflightOrgDomainSite!: OrgBindings['preflightOrgDomainSite'];\n createOrgDomainSiteChildHost!: OrgBindings['createOrgDomainSiteChildHost'];\n listOrgDomainSiteChildHosts!: OrgBindings['listOrgDomainSiteChildHosts'];\n verifyOrgDomainSite!: OrgBindings['verifyOrgDomainSite'];\n disableOrgDomainSite!: OrgBindings['disableOrgDomainSite'];\n getBusinessProfile!: OrgBindings['getBusinessProfile'];\n updateBusinessProfile!: OrgBindings['updateBusinessProfile'];\n submitBusinessProfile!: OrgBindings['submitBusinessProfile'];\n cancelBusinessProfile!: OrgBindings['cancelBusinessProfile'];\n listLegalEntities!: OrgBindings['listLegalEntities'];\n getLegalEntity!: OrgBindings['getLegalEntity'];\n createLegalEntity!: OrgBindings['createLegalEntity'];\n getRegistrationDraft!: OrgBindings['getRegistrationDraft'];\n saveRegistrationDraft!: OrgBindings['saveRegistrationDraft'];\n getVoiceTrustProducts!: OrgBindings['getVoiceTrustProducts'];\n syncVoiceTrustProducts!: OrgBindings['syncVoiceTrustProducts'];\n createOrganizationWorkspace!: OrgBindings['createOrganizationWorkspace'];\n getOrganizationWorkspace!: OrgBindings['getOrganizationWorkspace'];\n updateOrganizationWorkspace!: OrgBindings['updateOrganizationWorkspace'];\n getOrgBillingCustomer!: OrgBindings['getOrgBillingCustomer'];\n getA2PCampaignConfig!: OrgBindings['getA2PCampaignConfig'];\n updateA2PCampaignConfig!: OrgBindings['updateA2PCampaignConfig'];\n getOrgWorkspaceUsage!: OrgBindings['getOrgWorkspaceUsage'];\n updateOrganizationMember!: OrgBindings['updateOrganizationMember'];\n listOrgWebhookEndpoints!: OrgBindings['listOrgWebhookEndpoints'];\n getOrgWebhookEndpoint!: OrgBindings['getOrgWebhookEndpoint'];\n getVapidPublicKey!: WorkspacesBindings['getVapidPublicKey'];\n registerPushSubscription!: WorkspacesBindings['registerPushSubscription'];\n unregisterPushSubscription!: WorkspacesBindings['unregisterPushSubscription'];\n listPushSubscriptions!: WorkspacesBindings['listPushSubscriptions'];\n listWorkspaceInvitations!: WorkspacesBindings['listWorkspaceInvitations'];\n listWorkspaceInvitationsAdmin!: WorkspacesBindings['listWorkspaceInvitationsAdmin'];\n getWorkspaceInvitation!: WorkspacesBindings['getWorkspaceInvitation'];\n updateWorkspaceInvitationAdmin!: WorkspacesBindings['updateWorkspaceInvitationAdmin'];\n deleteWorkspaceInvitation!: WorkspacesBindings['deleteWorkspaceInvitation'];\n deleteWorkspaceInvitationAdmin!: WorkspacesBindings['deleteWorkspaceInvitationAdmin'];\n requestWorkspaceMembership!: WorkspacesBindings['requestWorkspaceMembership'];\n approveWorkspaceInvitation!: WorkspacesBindings['approveWorkspaceInvitation'];\n denyWorkspaceInvitation!: WorkspacesBindings['denyWorkspaceInvitation'];\n blockWorkspaceInvitation!: WorkspacesBindings['blockWorkspaceInvitation'];\n inviteToWorkspace!: WorkspacesBindings['inviteToWorkspace'];\n acceptInvitation!: WorkspacesBindings['acceptInvitation'];\n declineInvitation!: WorkspacesBindings['declineInvitation'];\n\n // Auth API\n getUserAccount!: AuthBindings['getUserAccount'];\n updateUserAccount!: AuthBindings['updateUserAccount'];\n recordAcquisition!: AuthBindings['recordAcquisition'];\n login!: AuthBindings['login'];\n resendCode!: AuthBindings['resendCode'];\n verifyCodeWith2FA!: AuthBindings['verifyCodeWith2FA'];\n emailPasswordLogin!: AuthBindings['emailPasswordLogin'];\n emailPasswordSignup!: AuthBindings['emailPasswordSignup'];\n requestMagicLink!: AuthBindings['requestMagicLink'];\n validateMagicLink!: AuthBindings['validateMagicLink'];\n sendEmailVerification!: AuthBindings['sendEmailVerification'];\n verifyEmail!: AuthBindings['verifyEmail'];\n changePassword!: AuthBindings['changePassword'];\n setPassword!: AuthBindings['setPassword'];\n getPasswordStatus!: AuthBindings['getPasswordStatus'];\n logout!: AuthBindings['logout'];\n requestCrossDomainToken!: AuthBindings['requestCrossDomainToken'];\n exchangeToken!: AuthBindings['exchangeToken'];\n createRealtimeLoginToken!: AuthBindings['createRealtimeLoginToken'];\n getDomainMapping!: AuthBindings['getDomainMapping'];\n createSignup!: AuthBindings['createSignup'];\n createAccount!: AuthBindings['createAccount'];\n getTwoFactorStatus!: AuthBindings['getTwoFactorStatus'];\n setupTOTP!: AuthBindings['setupTOTP'];\n verifyTOTPSetup!: AuthBindings['verifyTOTPSetup'];\n setupWebAuthn!: AuthBindings['setupWebAuthn'];\n verifyWebAuthnSetup!: AuthBindings['verifyWebAuthnSetup'];\n verifyTOTPAuth!: AuthBindings['verifyTOTPAuth'];\n verifyRecoveryCodeAuth!: AuthBindings['verifyRecoveryCodeAuth'];\n getWebAuthnAuthOptions!: AuthBindings['getWebAuthnAuthOptions'];\n verifyWebAuthnAuth!: AuthBindings['verifyWebAuthnAuth'];\n generateRecoveryCodes!: AuthBindings['generateRecoveryCodes'];\n disableTwoFactorMethod!: AuthBindings['disableTwoFactorMethod'];\n updateTwoFactorMethod!: AuthBindings['updateTwoFactorMethod'];\n getMyOrganizations!: AuthBindings['getMyOrganizations'];\n requestCredentialChange!: AuthBindings['requestCredentialChange'];\n verifyCredentialChange!: AuthBindings['verifyCredentialChange'];\n getPendingCredentialChanges!: AuthBindings['getPendingCredentialChanges'];\n cancelCredentialChange!: AuthBindings['cancelCredentialChange'];\n getCredentialChangeInviteDetails!: AuthBindings['getCredentialChangeInviteDetails'];\n confirmCredentialChangeInvite!: AuthBindings['confirmCredentialChangeInvite'];\n getConsentState!: AuthBindings['getConsentState'];\n updateConsent!: AuthBindings['updateConsent'];\n getAssignments!: AuthBindings['getAssignments'];\n getAssignment!: AuthBindings['getAssignment'];\n getAssignmentMessages!: AuthBindings['getAssignmentMessages'];\n updateAssignment!: AuthBindings['updateAssignment'];\n deleteAssignment!: AuthBindings['deleteAssignment'];\n getAssignmentTask!: AuthBindings['getAssignmentTask'];\n selectCurrentAssignmentTask!: AuthBindings['selectCurrentAssignmentTask'];\n createAssignment!: AuthBindings['createAssignment'];\n getAssignmentTaskDetail!: AuthBindings['getAssignmentTaskDetail'];\n getAssignmentCelContext!: AuthBindings['getAssignmentCelContext'];\n cancelAssignment!: AuthBindings['cancelAssignment'];\n getAssignmentTools!: AuthBindings['getAssignmentTools'];\n executeAssignmentTool!: AuthBindings['executeAssignmentTool'];\n\n // Sites API\n getSites!: SitesBindings['getSites'];\n checkSiteSlugAvailability!: SitesBindings['checkSiteSlugAvailability'];\n checkSiteDomainAvailability!: SitesBindings['checkSiteDomainAvailability'];\n getSite!: SitesBindings['getSite'];\n getSiteSharing!: SitesBindings['getSiteSharing'];\n updateSiteSharing!: SitesBindings['updateSiteSharing'];\n getSiteSource!: SitesBindings['getSiteSource'];\n getSiteSourceTemplates!: SitesBindings['getSiteSourceTemplates'];\n createSiteSource!: SitesBindings['createSiteSource'];\n buildSiteSource!: SitesBindings['buildSiteSource'];\n publishSiteSource!: SitesBindings['publishSiteSource'];\n resetSiteSource!: SitesBindings['resetSiteSource'];\n rollbackSiteSource!: SitesBindings['rollbackSiteSource'];\n downloadSiteSourceZip!: SitesBindings['downloadSiteSourceZip'];\n importSiteSourceZip!: SitesBindings['importSiteSourceZip'];\n getThemeSettings!: SitesBindings['getThemeSettings'];\n updateThemeSettings!: SitesBindings['updateThemeSettings'];\n getSiteByUuid!: SitesBindings['getSiteByUuid'];\n getSiteRenderedPage!: SitesBindings['getSiteRenderedPage'];\n getSiteRenderedMenu!: SitesBindings['getSiteRenderedMenu'];\n siteSignup!: SitesBindings['siteSignup'];\n siteSendPhoneCode!: SitesBindings['siteSendPhoneCode'];\n siteSendEmailCode!: SitesBindings['siteSendEmailCode'];\n siteVerifyCode!: SitesBindings['siteVerifyCode'];\n siteGoogleOAuthInitiate!: SitesBindings['siteGoogleOAuthInitiate'];\n createSite!: SitesBindings['createSite'];\n updateSite!: SitesBindings['updateSite'];\n deleteSite!: SitesBindings['deleteSite'];\n getSitePages!: SitesBindings['getSitePages'];\n getPage!: SitesBindings['getPage'];\n getPageBySlug!: SitesBindings['getPageBySlug'];\n createPage!: SitesBindings['createPage'];\n updatePage!: SitesBindings['updatePage'];\n deletePage!: SitesBindings['deletePage'];\n getSiteCounts!: SitesBindings['getSiteCounts'];\n getSiteMenu!: SitesBindings['getSiteMenu'];\n getMenuItems!: SitesBindings['getMenuItems'];\n createMenuItem!: SitesBindings['createMenuItem'];\n updateMenuItem!: SitesBindings['updateMenuItem'];\n deleteMenuItem!: SitesBindings['deleteMenuItem'];\n reorderMenuItems!: SitesBindings['reorderMenuItems'];\n generateSiteMediaUploadUrl!: SitesBindings['generateSiteMediaUploadUrl'];\n\n // Files API\n getFiles!: FilesBindings['getFiles'];\n getFile!: FilesBindings['getFile'];\n getProjects!: ProjectsBindings['getProjects'];\n getProject!: ProjectsBindings['getProject'];\n getPlan!: ProjectsBindings['getPlan'];\n updateProject!: ProjectsBindings['updateProject'];\n updatePlan!: ProjectsBindings['updatePlan'];\n resolveFilePath!: FilesBindings['resolveFilePath'];\n downloadFileContents!: FilesBindings['downloadFileContents'];\n downloadFilesZip!: FilesBindings['downloadFilesZip'];\n createFile!: FilesBindings['createFile'];\n uploadFile!: FilesBindings['uploadFile'];\n updateFile!: FilesBindings['updateFile'];\n deleteFile!: FilesBindings['deleteFile'];\n listFileVersions!: FilesBindings['listFileVersions'];\n getFileVersionDiff!: FilesBindings['getFileVersionDiff'];\n restoreFileVersion!: FilesBindings['restoreFileVersion'];\n getFileVersionContentsUrl!: FilesBindings['getFileVersionContentsUrl'];\n convertFile!: FilesBindings['convertFile'];\n generateFileUploadUrl!: FilesBindings['generateFileUploadUrl'];\n getFolders!: FilesBindings['getFolders'];\n getFolder!: FilesBindings['getFolder'];\n createFolder!: FilesBindings['createFolder'];\n updateFolder!: FilesBindings['updateFolder'];\n deleteFolder!: FilesBindings['deleteFolder'];\n reindexFolder!: FilesBindings['reindexFolder'];\n searchFolder!: FilesBindings['searchFolder'];\n getFileLabels!: FilesBindings['getFileLabels'];\n getFileLabel!: FilesBindings['getFileLabel'];\n getFileLabelByUuid!: FilesBindings['getFileLabelByUuid'];\n createFileLabel!: FilesBindings['createFileLabel'];\n updateFileLabel!: FilesBindings['updateFileLabel'];\n deleteFileLabel!: FilesBindings['deleteFileLabel'];\n getFileSharing!: FilesBindings['getFileSharing'];\n updateFileRoles!: FilesBindings['updateFileRoles'];\n removeFileRole!: FilesBindings['removeFileRole'];\n getFolderSharing!: FilesBindings['getFolderSharing'];\n getFolderMemberAccess!: FilesBindings['getFolderMemberAccess'];\n updateFolderRoles!: FilesBindings['updateFolderRoles'];\n removeFolderRole!: FilesBindings['removeFolderRole'];\n updateFileSharing!: FilesBindings['updateFileSharing'];\n updateFolderSharing!: FilesBindings['updateFolderSharing'];\n // Public Sharing API\n getPublicFile!: FilesBindings['getPublicFile'];\n getPublicFolder!: FilesBindings['getPublicFolder'];\n getPublicFolderFiles!: FilesBindings['getPublicFolderFiles'];\n\n // Events API\n getEventRules!: EventsBindings['getEventRules'];\n getAvailableActions!: EventsBindings['getAvailableActions'];\n searchEventRules!: EventsBindings['searchEventRules'];\n getEventRule!: EventsBindings['getEventRule'];\n createEventRule!: EventsBindings['createEventRule'];\n updateEventRule!: EventsBindings['updateEventRule'];\n deleteEventRule!: EventsBindings['deleteEventRule'];\n testWebhook!: EventsBindings['testWebhook'];\n reorderEventRules!: EventsBindings['reorderEventRules'];\n getWebhookLogs!: EventsBindings['getWebhookLogs'];\n getRuleExecutions!: EventsBindings['getRuleExecutions'];\n getRoutines!: EventsBindings['getRoutines'];\n getRoutine!: EventsBindings['getRoutine'];\n createRoutine!: EventsBindings['createRoutine'];\n updateRoutine!: EventsBindings['updateRoutine'];\n deleteRoutine!: EventsBindings['deleteRoutine'];\n runRoutine!: EventsBindings['runRoutine'];\n getRoutineConfigEvents!: EventsBindings['getRoutineConfigEvents'];\n getRoutineRuns!: EventsBindings['getRoutineRuns'];\n resetRoutineRuns!: EventsBindings['resetRoutineRuns'];\n previewSchedule!: EventsBindings['previewSchedule'];\n previewRoutineVoiceReadiness!: EventsBindings['previewRoutineVoiceReadiness'];\n\n // Workflows API\n getWorkflows!: WorkflowsBindings['getWorkflows'];\n getWorkflow!: WorkflowsBindings['getWorkflow'];\n getWorkflowOpeningTurnConversionReport!: WorkflowsBindings['getWorkflowOpeningTurnConversionReport'];\n convertWorkflowStartTaskOpeningMessage!: WorkflowsBindings['convertWorkflowStartTaskOpeningMessage'];\n getWorkflowActivity!: WorkflowsBindings['getWorkflowActivity'];\n getWorkflowsActivityBatch!: WorkflowsBindings['getWorkflowsActivityBatch'];\n getWorkflowDiagram!: WorkflowsBindings['getWorkflowDiagram'];\n getWorkflowThumbnailUrl!: WorkflowsBindings['getWorkflowThumbnailUrl'];\n createWorkflow!: WorkflowsBindings['createWorkflow'];\n updateWorkflow!: WorkflowsBindings['updateWorkflow'];\n getWorkflowDeletionPreview!: WorkflowsBindings['getWorkflowDeletionPreview'];\n deleteWorkflow!: WorkflowsBindings['deleteWorkflow'];\n archiveWorkflow!: WorkflowsBindings['archiveWorkflow'];\n unarchiveWorkflow!: WorkflowsBindings['unarchiveWorkflow'];\n cloneWorkflow!: WorkflowsBindings['cloneWorkflow'];\n getWorkflowTemplates!: WorkflowsBindings['getWorkflowTemplates'];\n createWorkflowFromTemplate!: WorkflowsBindings['createWorkflowFromTemplate'];\n getWorkflowTaskAssignmentStats!: WorkflowsBindings['getWorkflowTaskAssignmentStats'];\n getTaskChats!: WorkflowsBindings['getTaskChats'];\n getWorkflowConfigValidation!: WorkflowsBindings['getWorkflowConfigValidation'];\n getWorkflowNotes!: WorkflowsBindings['getWorkflowNotes'];\n createWorkflowNote!: WorkflowsBindings['createWorkflowNote'];\n updateWorkflowNote!: WorkflowsBindings['updateWorkflowNote'];\n deleteWorkflowNote!: WorkflowsBindings['deleteWorkflowNote'];\n getWorkflowFeedback!: WorkflowsBindings['getWorkflowFeedback'];\n getWorkflowContributors!: WorkflowsBindings['getWorkflowContributors'];\n createWorkflowContributor!: WorkflowsBindings['createWorkflowContributor'];\n updateWorkflowContributor!: WorkflowsBindings['updateWorkflowContributor'];\n deleteWorkflowContributor!: WorkflowsBindings['deleteWorkflowContributor'];\n getWorkflowRevisions!: WorkflowsBindings['getWorkflowRevisions'];\n getWorkflowRevision!: WorkflowsBindings['getWorkflowRevision'];\n publishWorkflowRevision!: WorkflowsBindings['publishWorkflowRevision'];\n activateWorkflowRevision!: WorkflowsBindings['activateWorkflowRevision'];\n updateWorkflowRevisionMetadata!: WorkflowsBindings['updateWorkflowRevisionMetadata'];\n diffWorkflowRevisions!: WorkflowsBindings['diffWorkflowRevisions'];\n editWorkflowRevisionAsDraft!: WorkflowsBindings['editWorkflowRevisionAsDraft'];\n getWorkspaceBuilders!: WorkflowsBindings['getWorkspaceBuilders'];\n getWorkspaceBuilder!: WorkflowsBindings['getWorkspaceBuilder'];\n buildWorkspace!: WorkflowsBindings['buildWorkspace'];\n validateWorkflowName!: WorkflowsBindings['validateWorkflowName'];\n previewTTS!: WorkflowsBindings['previewTTS'];\n previewThinkingSound!: WorkflowsBindings['previewThinkingSound'];\n getSupervisors!: WorkflowsBindings['getSupervisors'];\n getSupervisor!: WorkflowsBindings['getSupervisor'];\n createSupervisor!: WorkflowsBindings['createSupervisor'];\n updateSupervisor!: WorkflowsBindings['updateSupervisor'];\n deleteSupervisor!: WorkflowsBindings['deleteSupervisor'];\n\n // Calendars API\n getCalendars!: CalendarsBindings['getCalendars'];\n getCalendar!: CalendarsBindings['getCalendar'];\n createCalendar!: CalendarsBindings['createCalendar'];\n updateCalendar!: CalendarsBindings['updateCalendar'];\n deleteCalendar!: CalendarsBindings['deleteCalendar'];\n getCalendarSchedules!: CalendarsBindings['getCalendarSchedules'];\n createCalendarSchedule!: CalendarsBindings['createCalendarSchedule'];\n updateCalendarSchedule!: CalendarsBindings['updateCalendarSchedule'];\n deleteCalendarSchedule!: CalendarsBindings['deleteCalendarSchedule'];\n checkAvailability!: CalendarsBindings['checkAvailability'];\n getAvailableSlots!: CalendarsBindings['getAvailableSlots'];\n getCalendarEvents!: CalendarsBindings['getCalendarEvents'];\n getCalendarEvent!: CalendarsBindings['getCalendarEvent'];\n createCalendarEvent!: CalendarsBindings['createCalendarEvent'];\n updateCalendarEvent!: CalendarsBindings['updateCalendarEvent'];\n cancelCalendarEvent!: CalendarsBindings['cancelCalendarEvent'];\n deleteCalendarEvent!: CalendarsBindings['deleteCalendarEvent'];\n updateEventAttendee!: CalendarsBindings['updateEventAttendee'];\n getCalendarEventTypes!: CalendarsBindings['getCalendarEventTypes'];\n getCalendarEventType!: CalendarsBindings['getCalendarEventType'];\n createCalendarEventType!: CalendarsBindings['createCalendarEventType'];\n updateCalendarEventType!: CalendarsBindings['updateCalendarEventType'];\n deleteCalendarEventType!: CalendarsBindings['deleteCalendarEventType'];\n generateICalToken!: CalendarsBindings['generateICalToken'];\n revokeICalToken!: CalendarsBindings['revokeICalToken'];\n getICalFeedUrl!: CalendarsBindings['getICalFeedUrl'];\n getGoogleCalendarStatus!: CalendarsBindings['getGoogleCalendarStatus'];\n listGoogleCalendars!: CalendarsBindings['listGoogleCalendars'];\n linkCalendarToGoogle!: CalendarsBindings['linkCalendarToGoogle'];\n unlinkCalendarFromGoogle!: CalendarsBindings['unlinkCalendarFromGoogle'];\n syncCalendarWithGoogle!: CalendarsBindings['syncCalendarWithGoogle'];\n\n // Communications API\n getPhoneNumbers!: CommunicationsBindings['getPhoneNumbers'];\n getAvailablePhoneNumbers!: CommunicationsBindings['getAvailablePhoneNumbers'];\n requestPhoneNumber!: CommunicationsBindings['requestPhoneNumber'];\n getPhoneNumber!: CommunicationsBindings['getPhoneNumber'];\n createPhoneNumber!: CommunicationsBindings['createPhoneNumber'];\n updatePhoneNumber!: CommunicationsBindings['updatePhoneNumber'];\n getArchiveBlockers!: CommunicationsBindings['getArchiveBlockers'];\n archivePhoneNumber!: CommunicationsBindings['archivePhoneNumber'];\n getPhoneNumberCalls!: CommunicationsBindings['getPhoneNumberCalls'];\n getPhoneNumberOutboundAnalyticsSummary!: CommunicationsBindings['getPhoneNumberOutboundAnalyticsSummary'];\n getPhoneNumberOutboundAnalyticsCalls!: CommunicationsBindings['getPhoneNumberOutboundAnalyticsCalls'];\n exportPhoneNumberOutboundAnalyticsCsv!: CommunicationsBindings['exportPhoneNumberOutboundAnalyticsCsv'];\n getPhoneNumberMessages!: CommunicationsBindings['getPhoneNumberMessages'];\n getPhoneNumberFaxes!: CommunicationsBindings['getPhoneNumberFaxes'];\n getPhoneNumberVoicemails!: CommunicationsBindings['getPhoneNumberVoicemails'];\n fetchVoicemailAudio!: CommunicationsBindings['fetchVoicemailAudio'];\n updateVoicemailStatus!: CommunicationsBindings['updateVoicemailStatus'];\n releasePhoneNumber!: CommunicationsBindings['releasePhoneNumber'];\n getLinkablePhones!: CommunicationsBindings['getLinkablePhones'];\n linkPhoneNumber!: CommunicationsBindings['linkPhoneNumber'];\n getInboxes!: CommunicationsBindings['getInboxes'];\n getInbox!: CommunicationsBindings['getInbox'];\n createInbox!: CommunicationsBindings['createInbox'];\n updateInbox!: CommunicationsBindings['updateInbox'];\n deleteInbox!: CommunicationsBindings['deleteInbox'];\n getInboxEmails!: CommunicationsBindings['getInboxEmails'];\n getInboxEmail!: CommunicationsBindings['getInboxEmail'];\n markEmailAsRead!: CommunicationsBindings['markEmailAsRead'];\n markEmailAsUnread!: CommunicationsBindings['markEmailAsUnread'];\n addEmailSenderAsMember!: CommunicationsBindings['addEmailSenderAsMember'];\n convertEmail!: CommunicationsBindings['convertEmail'];\n downloadEmailAttachment!: CommunicationsBindings['downloadEmailAttachment'];\n getInboxThreads!: CommunicationsBindings['getInboxThreads'];\n getThreadEmails!: CommunicationsBindings['getThreadEmails'];\n getChatEmails!: CommunicationsBindings['getChatEmails'];\n replyToEmail!: CommunicationsBindings['replyToEmail'];\n sendInboxEmail!: CommunicationsBindings['sendInboxEmail'];\n previewInboxEmail!: CommunicationsBindings['previewInboxEmail'];\n previewEmailReply!: CommunicationsBindings['previewEmailReply'];\n getNotificationRules!: CommunicationsBindings['getNotificationRules'];\n createNotificationRule!: CommunicationsBindings['createNotificationRule'];\n updateNotificationRule!: CommunicationsBindings['updateNotificationRule'];\n deleteNotificationRule!: CommunicationsBindings['deleteNotificationRule'];\n\n // Toolkits API\n getToolkits!: ToolkitsBindings['getToolkits'];\n getTool!: ToolkitsBindings['getTool'];\n getTemplateContext!: ToolkitsBindings['getTemplateContext'];\n previewTemplate!: ToolkitsBindings['previewTemplate'];\n getVariableRegistry!: ToolkitsBindings['getVariableRegistry'];\n getChatModels!: ToolkitsBindings['getChatModels'];\n getManagerModels!: ToolkitsBindings['getManagerModels'];\n getRealtimeModels!: ToolkitsBindings['getRealtimeModels'];\n getSTTModels!: ToolkitsBindings['getSTTModels'];\n getTTSModels!: ToolkitsBindings['getTTSModels'];\n getVoiceModels!: ToolkitsBindings['getVoiceModels'];\n getVoicePresets!: ToolkitsBindings['getVoicePresets'];\n getAllModels!: ToolkitsBindings['getAllModels'];\n getCustomToolkits!: ToolkitsBindings['getCustomToolkits'];\n getCustomToolkit!: ToolkitsBindings['getCustomToolkit'];\n createCustomToolkit!: ToolkitsBindings['createCustomToolkit'];\n updateCustomToolkit!: ToolkitsBindings['updateCustomToolkit'];\n deleteCustomToolkit!: ToolkitsBindings['deleteCustomToolkit'];\n enableCustomToolkit!: ToolkitsBindings['enableCustomToolkit'];\n disableCustomToolkit!: ToolkitsBindings['disableCustomToolkit'];\n createCustomTool!: ToolkitsBindings['createCustomTool'];\n updateCustomTool!: ToolkitsBindings['updateCustomTool'];\n deleteCustomTool!: ToolkitsBindings['deleteCustomTool'];\n getMcpServers!: ToolkitsBindings['getMcpServers'];\n getMcpServer!: ToolkitsBindings['getMcpServer'];\n createMcpServer!: ToolkitsBindings['createMcpServer'];\n updateMcpServer!: ToolkitsBindings['updateMcpServer'];\n deleteMcpServer!: ToolkitsBindings['deleteMcpServer'];\n enableMcpServer!: ToolkitsBindings['enableMcpServer'];\n disableMcpServer!: ToolkitsBindings['disableMcpServer'];\n getMcpServerTools!: ToolkitsBindings['getMcpServerTools'];\n getMcpServerResources!: ToolkitsBindings['getMcpServerResources'];\n getMcpServerPrompts!: ToolkitsBindings['getMcpServerPrompts'];\n testMcpServerConnection!: ToolkitsBindings['testMcpServerConnection'];\n discoverOAuthMetadata!: ToolkitsBindings['discoverOAuthMetadata'];\n getFeatureRegistry!: ToolkitsBindings['getFeatureRegistry'];\n getPublicFeatureRegistry!: ToolkitsBindings['getPublicFeatureRegistry'];\n getFeatureBySlug!: ToolkitsBindings['getFeatureBySlug'];\n\n // Devices API\n getDevices!: DevicesBindings['getDevices'];\n getDevice!: DevicesBindings['getDevice'];\n getDeviceKinds!: DevicesBindings['getDeviceKinds'];\n claimDevicePairing!: DevicesBindings['claimDevicePairing'];\n updateDevice!: DevicesBindings['updateDevice'];\n revokeDevice!: DevicesBindings['revokeDevice'];\n\n // Billing API\n getApiKeys!: BillingBindings['getApiKeys'];\n createApiKey!: BillingBindings['createApiKey'];\n revokeApiKey!: BillingBindings['revokeApiKey'];\n getGlobalApiKeys!: BillingBindings['getGlobalApiKeys'];\n createGlobalApiKey!: BillingBindings['createGlobalApiKey'];\n revokeGlobalApiKey!: BillingBindings['revokeGlobalApiKey'];\n getSubscriptions!: BillingBindings['getSubscriptions'];\n getWorkspaceSubscriptions!: BillingBindings['getWorkspaceSubscriptions'];\n cancelSubscription!: BillingBindings['cancelSubscription'];\n reactivateSubscription!: BillingBindings['reactivateSubscription'];\n updateSubscription!: BillingBindings['updateSubscription'];\n addWorkspaceToSubscription!: BillingBindings['addWorkspaceToSubscription'];\n purchaseCredits!: BillingBindings['purchaseCredits'];\n createCheckoutSession!: BillingBindings['createCheckoutSession'];\n createMemberCheckoutSession!: BillingBindings['createMemberCheckoutSession'];\n createMemberPortalSession!: BillingBindings['createMemberPortalSession'];\n getMemberSubscriptionStatus!: BillingBindings['getMemberSubscriptionStatus'];\n createDeviceOrderCheckoutSession!: BillingBindings['createDeviceOrderCheckoutSession'];\n listDeviceOrders!: BillingBindings['listDeviceOrders'];\n getCheckoutAttemptStatus!: BillingBindings['getCheckoutAttemptStatus'];\n listSelfServeProducts!: BillingBindings['listSelfServeProducts'];\n getAIUsageReport!: BillingBindings['getAIUsageReport'];\n getSMSUsageReport!: BillingBindings['getSMSUsageReport'];\n getPhoneUsageReport!: BillingBindings['getPhoneUsageReport'];\n getVoiceUsageReport!: BillingBindings['getVoiceUsageReport'];\n getMemberUsage!: BillingBindings['getMemberUsage'];\n\n // Apps API\n listApps!: AppsBindings['listApps'];\n createApp!: AppsBindings['createApp'];\n getApp!: AppsBindings['getApp'];\n getAppByClientId!: AppsBindings['getAppByClientId'];\n updateApp!: AppsBindings['updateApp'];\n deleteApp!: AppsBindings['deleteApp'];\n regenerateClientSecret!: AppsBindings['regenerateClientSecret'];\n listBuilders!: AppsBindings['listBuilders'];\n getBuilder!: AppsBindings['getBuilder'];\n getBuilderApps!: AppsBindings['getBuilderApps'];\n createBuilder!: AppsBindings['createBuilder'];\n updateBuilder!: AppsBindings['updateBuilder'];\n deleteBuilder!: AppsBindings['deleteBuilder'];\n createInquiry!: AppsBindings['createInquiry'];\n enrichInquiry!: AppsBindings['enrichInquiry'];\n listInquiries!: AppsBindings['listInquiries'];\n getInquiry!: AppsBindings['getInquiry'];\n updateInquiry!: AppsBindings['updateInquiry'];\n deleteInquiry!: AppsBindings['deleteInquiry'];\n exportInquiriesCsv!: AppsBindings['exportInquiriesCsv'];\n authorize!: AppsBindings['authorize'];\n exchangeOAuthToken!: AppsBindings['exchangeOAuthToken'];\n getAvailableScopes!: AppsBindings['getAvailableScopes'];\n getOAuthConnectionStatus!: AppsBindings['getOAuthConnectionStatus'];\n listOAuthAccounts!: AppsBindings['listOAuthAccounts'];\n getOAuthAuthorizationUrl!: AppsBindings['getOAuthAuthorizationUrl'];\n disconnectOAuthProvider!: AppsBindings['disconnectOAuthProvider'];\n\n // Integrations API\n getMondayBoards!: IntegrationsBindings['getMondayBoards'];\n getMondayBoardColumns!: IntegrationsBindings['getMondayBoardColumns'];\n getMondayBoardGroups!: IntegrationsBindings['getMondayBoardGroups'];\n getMondayCurrentUserInfo!: IntegrationsBindings['getMondayCurrentUserInfo'];\n\n // Monday.com Connection API\n installMondayConnection!: IntegrationsBindings['installMondayConnection'];\n configureMondayConnection!: IntegrationsBindings['configureMondayConnection'];\n getMondayConnectionStatus!: IntegrationsBindings['getMondayConnectionStatus'];\n authorizeMondayConnection!: IntegrationsBindings['authorizeMondayConnection'];\n testMondayConnection!: IntegrationsBindings['testMondayConnection'];\n disconnectMondayConnection!: IntegrationsBindings['disconnectMondayConnection'];\n disableMondayConnection!: IntegrationsBindings['disableMondayConnection'];\n enableMondayConnection!: IntegrationsBindings['enableMondayConnection'];\n deleteMondayConnection!: IntegrationsBindings['deleteMondayConnection'];\n getMondayConnectionBoards!: IntegrationsBindings['getMondayConnectionBoards'];\n getMondayConnectionBoardColumns!: IntegrationsBindings['getMondayConnectionBoardColumns'];\n getMondayConnectionBoardGroups!: IntegrationsBindings['getMondayConnectionBoardGroups'];\n getMondaySyncConfig!: IntegrationsBindings['getMondaySyncConfig'];\n getMondaySyncLogs!: IntegrationsBindings['getMondaySyncLogs'];\n updateMondaySyncConfig!: IntegrationsBindings['updateMondaySyncConfig'];\n getLinkedMondayMembers!: IntegrationsBindings['getLinkedMondayMembers'];\n getMondayReconciliationMatches!: IntegrationsBindings['getMondayReconciliationMatches'];\n linkMemberToMonday!: IntegrationsBindings['linkMemberToMonday'];\n bulkLinkMembersToMonday!: IntegrationsBindings['bulkLinkMembersToMonday'];\n unlinkMemberFromMonday!: IntegrationsBindings['unlinkMemberFromMonday'];\n getLinkedRecords!: IntegrationsBindings['getLinkedRecords'];\n importFromBoard!: IntegrationsBindings['importFromBoard'];\n autoCreateDataTypeFromBoard!: IntegrationsBindings['autoCreateDataTypeFromBoard'];\n\n // Discord Bots API\n getDiscordBots!: IntegrationsBindings['getDiscordBots'];\n getDiscordBot!: IntegrationsBindings['getDiscordBot'];\n getDiscordBotByUuid!: IntegrationsBindings['getDiscordBotByUuid'];\n createDiscordBot!: IntegrationsBindings['createDiscordBot'];\n updateDiscordBot!: IntegrationsBindings['updateDiscordBot'];\n deleteDiscordBot!: IntegrationsBindings['deleteDiscordBot'];\n registerDiscordSlashCommands!: IntegrationsBindings['registerDiscordSlashCommands'];\n registerLinkedRolesMetadata!: IntegrationsBindings['registerLinkedRolesMetadata'];\n getDiscordThreads!: IntegrationsBindings['getDiscordThreads'];\n getDiscordGuilds!: IntegrationsBindings['getDiscordGuilds'];\n getDiscordBotAccounts!: IntegrationsBindings['getDiscordBotAccounts'];\n getMyCredentials!: IntegrationsBindings['getMyCredentials'];\n unlinkCredential!: IntegrationsBindings['unlinkCredential'];\n completeDiscordLink!: IntegrationsBindings['completeDiscordLink'];\n discordLinkPreflight!: IntegrationsBindings['discordLinkPreflight'];\n\n // Slack Apps API\n getSlackApps!: IntegrationsBindings['getSlackApps'];\n getSlackApp!: IntegrationsBindings['getSlackApp'];\n createSlackApp!: IntegrationsBindings['createSlackApp'];\n updateSlackApp!: IntegrationsBindings['updateSlackApp'];\n deleteSlackApp!: IntegrationsBindings['deleteSlackApp'];\n getSlackThreads!: IntegrationsBindings['getSlackThreads'];\n getSlackInstallations!: IntegrationsBindings['getSlackInstallations'];\n getSlackAppAccounts!: IntegrationsBindings['getSlackAppAccounts'];\n\n // Teams Apps API\n getTeamsApps!: IntegrationsBindings['getTeamsApps'];\n getTeamsApp!: IntegrationsBindings['getTeamsApp'];\n createTeamsApp!: IntegrationsBindings['createTeamsApp'];\n updateTeamsApp!: IntegrationsBindings['updateTeamsApp'];\n deleteTeamsApp!: IntegrationsBindings['deleteTeamsApp'];\n getTeamsConversations!: IntegrationsBindings['getTeamsConversations'];\n getTeamsInstallations!: IntegrationsBindings['getTeamsInstallations'];\n getTeamsAppAccounts!: IntegrationsBindings['getTeamsAppAccounts'];\n\n // FHIR Connections API\n getFhirConnections!: IntegrationsBindings['getFhirConnections'];\n getFhirConnection!: IntegrationsBindings['getFhirConnection'];\n getFhirConnectionByUuid!: IntegrationsBindings['getFhirConnectionByUuid'];\n createFhirConnection!: IntegrationsBindings['createFhirConnection'];\n updateFhirConnection!: IntegrationsBindings['updateFhirConnection'];\n deleteFhirConnection!: IntegrationsBindings['deleteFhirConnection'];\n testFhirConnection!: IntegrationsBindings['testFhirConnection'];\n fhirSearchPatients!: IntegrationsBindings['fhirSearchPatients'];\n fhirSearchPractitioners!: IntegrationsBindings['fhirSearchPractitioners'];\n fhirSearchLocations!: IntegrationsBindings['fhirSearchLocations'];\n fhirFetchCareTeam!: IntegrationsBindings['fhirFetchCareTeam'];\n fhirFetchEncounters!: IntegrationsBindings['fhirFetchEncounters'];\n fhirCreateEncounter!: IntegrationsBindings['fhirCreateEncounter'];\n fhirListLinkedMembers!: IntegrationsBindings['fhirListLinkedMembers'];\n fhirCheckPatientLinks!: IntegrationsBindings['fhirCheckPatientLinks'];\n fhirLinkMember!: IntegrationsBindings['fhirLinkMember'];\n fhirUnlinkMember!: IntegrationsBindings['fhirUnlinkMember'];\n fhirSyncMember!: IntegrationsBindings['fhirSyncMember'];\n fhirImportPatient!: IntegrationsBindings['fhirImportPatient'];\n fhirCsvImportInspect!: IntegrationsBindings['fhirCsvImportInspect'];\n fhirGetCsvImportSettings!: IntegrationsBindings['fhirGetCsvImportSettings'];\n fhirUpdateCsvImportSettings!: IntegrationsBindings['fhirUpdateCsvImportSettings'];\n fhirCsvImportApply!: IntegrationsBindings['fhirCsvImportApply'];\n fhirGetCsvImportRuns!: IntegrationsBindings['fhirGetCsvImportRuns'];\n fhirGetCsvImportRunItems!: IntegrationsBindings['fhirGetCsvImportRunItems'];\n fhirGetEncounterSyncStatus!: IntegrationsBindings['fhirGetEncounterSyncStatus'];\n fhirUpdateEncounterSync!: IntegrationsBindings['fhirUpdateEncounterSync'];\n fhirRunEncounterSync!: IntegrationsBindings['fhirRunEncounterSync'];\n fhirGetEncounterSyncRuns!: IntegrationsBindings['fhirGetEncounterSyncRuns'];\n fhirRefreshEncounterPatient!: IntegrationsBindings['fhirRefreshEncounterPatient'];\n fhirBackfillEncounterSync!: IntegrationsBindings['fhirBackfillEncounterSync'];\n\n // Healthie API\n getDocumoFaxStatus!: IntegrationsBindings['getDocumoFaxStatus'];\n getDocumoFaxSetup!: IntegrationsBindings['getDocumoFaxSetup'];\n listDocumoFaxes!: IntegrationsBindings['listDocumoFaxes'];\n installDocumoFax!: IntegrationsBindings['installDocumoFax'];\n configureDocumoFax!: IntegrationsBindings['configureDocumoFax'];\n verifyDocumoFax!: IntegrationsBindings['verifyDocumoFax'];\n rotateDocumoFaxCredentials!: IntegrationsBindings['rotateDocumoFaxCredentials'];\n configurePatientSync!: IntegrationsBindings['configurePatientSync'];\n getPatientSyncStatus!: IntegrationsBindings['getPatientSyncStatus'];\n deletePatientSyncConnection!: IntegrationsBindings['deletePatientSyncConnection'];\n configureHealthie!: IntegrationsBindings['configureHealthie'];\n getHealthieStatus!: IntegrationsBindings['getHealthieStatus'];\n listHealthieProviders!: IntegrationsBindings['listHealthieProviders'];\n linkCalendarToHealthie!: IntegrationsBindings['linkCalendarToHealthie'];\n unlinkCalendarFromHealthie!: IntegrationsBindings['unlinkCalendarFromHealthie'];\n syncCalendarWithHealthie!: IntegrationsBindings['syncCalendarWithHealthie'];\n getLinkedHealthieMembers!: IntegrationsBindings['getLinkedHealthieMembers'];\n getHealthieReconciliationMatches!: IntegrationsBindings['getHealthieReconciliationMatches'];\n linkMemberToHealthie!: IntegrationsBindings['linkMemberToHealthie'];\n unlinkMemberFromHealthie!: IntegrationsBindings['unlinkMemberFromHealthie'];\n listHealthieAppointmentTypes!: IntegrationsBindings['listHealthieAppointmentTypes'];\n listHealthiePatients!: IntegrationsBindings['listHealthiePatients'];\n getHealthieAvailableSlots!: IntegrationsBindings['getHealthieAvailableSlots'];\n bookHealthieAppointment!: IntegrationsBindings['bookHealthieAppointment'];\n\n // Confluence API\n configureConfluence!: IntegrationsBindings['configureConfluence'];\n startConfluenceOAuth!: IntegrationsBindings['startConfluenceOAuth'];\n getConfluenceStatus!: IntegrationsBindings['getConfluenceStatus'];\n disconnectConfluence!: IntegrationsBindings['disconnectConfluence'];\n disableConfluence!: IntegrationsBindings['disableConfluence'];\n enableConfluence!: IntegrationsBindings['enableConfluence'];\n deleteConfluence!: IntegrationsBindings['deleteConfluence'];\n listConfluenceSpaces!: IntegrationsBindings['listConfluenceSpaces'];\n listConfluencePages!: IntegrationsBindings['listConfluencePages'];\n\n // Salesforce API\n installSalesforce!: IntegrationsBindings['installSalesforce'];\n configureSalesforce!: IntegrationsBindings['configureSalesforce'];\n startSalesforceOAuth!: IntegrationsBindings['startSalesforceOAuth'];\n getSalesforceStatus!: IntegrationsBindings['getSalesforceStatus'];\n disconnectSalesforce!: IntegrationsBindings['disconnectSalesforce'];\n disableSalesforce!: IntegrationsBindings['disableSalesforce'];\n enableSalesforce!: IntegrationsBindings['enableSalesforce'];\n deleteSalesforce!: IntegrationsBindings['deleteSalesforce'];\n getSalesforceReconciliationMatches!: IntegrationsBindings['getSalesforceReconciliationMatches'];\n linkMemberToSalesforce!: IntegrationsBindings['linkMemberToSalesforce'];\n linkUnlinkedSalesforceMembersByIdentity!: IntegrationsBindings['linkUnlinkedSalesforceMembersByIdentity'];\n bulkLinkMembersToSalesforce!: IntegrationsBindings['bulkLinkMembersToSalesforce'];\n unlinkMemberFromSalesforce!: IntegrationsBindings['unlinkMemberFromSalesforce'];\n getLinkedSalesforceMembers!: IntegrationsBindings['getLinkedSalesforceMembers'];\n getSalesforceSyncConfig!: IntegrationsBindings['getSalesforceSyncConfig'];\n getSalesforceSyncLogs!: IntegrationsBindings['getSalesforceSyncLogs'];\n updateSalesforceSyncConfig!: IntegrationsBindings['updateSalesforceSyncConfig'];\n resyncSalesforceLinkedMembers!: IntegrationsBindings['resyncSalesforceLinkedMembers'];\n listSalesforceObjects!: IntegrationsBindings['listSalesforceObjects'];\n describeSalesforceObject!: IntegrationsBindings['describeSalesforceObject'];\n searchSalesforceRecords!: IntegrationsBindings['searchSalesforceRecords'];\n importSalesforceMembers!: IntegrationsBindings['importSalesforceMembers'];\n\n // HubSpot API\n installHubspot!: IntegrationsBindings['installHubspot'];\n configureHubspot!: IntegrationsBindings['configureHubspot'];\n startHubspotOAuth!: IntegrationsBindings['startHubspotOAuth'];\n getHubspotStatus!: IntegrationsBindings['getHubspotStatus'];\n disconnectHubspot!: IntegrationsBindings['disconnectHubspot'];\n disableHubspot!: IntegrationsBindings['disableHubspot'];\n enableHubspot!: IntegrationsBindings['enableHubspot'];\n deleteHubspot!: IntegrationsBindings['deleteHubspot'];\n getHubspotReconciliationMatches!: IntegrationsBindings['getHubspotReconciliationMatches'];\n linkMemberToHubspot!: IntegrationsBindings['linkMemberToHubspot'];\n bulkLinkMembersToHubspot!: IntegrationsBindings['bulkLinkMembersToHubspot'];\n unlinkMemberFromHubspot!: IntegrationsBindings['unlinkMemberFromHubspot'];\n getLinkedHubspotMembers!: IntegrationsBindings['getLinkedHubspotMembers'];\n searchHubspotRecords!: IntegrationsBindings['searchHubspotRecords'];\n importHubspotMembers!: IntegrationsBindings['importHubspotMembers'];\n getHubspotContactProperties!: IntegrationsBindings['getHubspotContactProperties'];\n getHubspotManagedRules!: IntegrationsBindings['getHubspotManagedRules'];\n getHubspotSyncLogs!: IntegrationsBindings['getHubspotSyncLogs'];\n getHubspotTransformPresets!: IntegrationsBindings['getHubspotTransformPresets'];\n\n // Connection Sync API (generic)\n getConnectionSyncCapabilities!: IntegrationsBindings['getConnectionSyncCapabilities'];\n getConnectionSyncConfig!: IntegrationsBindings['getConnectionSyncConfig'];\n updateConnectionSyncConfig!: IntegrationsBindings['updateConnectionSyncConfig'];\n getConnectionSyncCheckpoint!: IntegrationsBindings['getConnectionSyncCheckpoint'];\n startSyncRun!: IntegrationsBindings['startSyncRun'];\n getSyncRuns!: IntegrationsBindings['getSyncRuns'];\n getSyncRunItems!: IntegrationsBindings['getSyncRunItems'];\n getMemberSyncSummary!: IntegrationsBindings['getMemberSyncSummary'];\n clearConnectionMemberExclusion!: IntegrationsBindings['clearConnectionMemberExclusion'];\n\n // App Connections API\n listAvailableAppConnections!: IntegrationsBindings['listAvailableAppConnections'];\n listAppConnections!: IntegrationsBindings['listAppConnections'];\n enablePlatformApp!: IntegrationsBindings['enablePlatformApp'];\n getPlatformApp!: IntegrationsBindings['getPlatformApp'];\n updatePlatformApp!: IntegrationsBindings['updatePlatformApp'];\n deletePlatformApp!: IntegrationsBindings['deletePlatformApp'];\n listConnectionMemberFieldKeys!: IntegrationsBindings['listConnectionMemberFieldKeys'];\n setDefaultGooglePlatformAccount!: IntegrationsBindings['setDefaultGooglePlatformAccount'];\n\n // Pronunciations API\n getPronunciationEntries!: PronunciationsBindings['getPronunciationEntries'];\n createPronunciationEntry!: PronunciationsBindings['createPronunciationEntry'];\n updatePronunciationEntry!: PronunciationsBindings['updatePronunciationEntry'];\n deletePronunciationEntry!: PronunciationsBindings['deletePronunciationEntry'];\n exportPronunciationEntries!: PronunciationsBindings['exportPronunciationEntries'];\n importPronunciationEntries!: PronunciationsBindings['importPronunciationEntries'];\n getMyPronunciations!: PronunciationsBindings['getMyPronunciations'];\n createMyPronunciation!: PronunciationsBindings['createMyPronunciation'];\n updateMyPronunciation!: PronunciationsBindings['updateMyPronunciation'];\n deleteMyPronunciation!: PronunciationsBindings['deleteMyPronunciation'];\n suggestPronunciations!: PronunciationsBindings['suggestPronunciations'];\n getRecommendedVoices!: PronunciationsBindings['getRecommendedVoices'];\n previewPronunciation!: PronunciationsBindings['previewPronunciation'];\n\n // Customers API (self-service billing portal)\n getMyCustomers!: CustomersBindings['getMyCustomers'];\n getMyCustomer!: CustomersBindings['getMyCustomer'];\n getMyCustomerAccounts!: CustomersBindings['getMyCustomerAccounts'];\n getMyCustomerSubscriptions!: CustomersBindings['getMyCustomerSubscriptions'];\n getMyCustomerInvoices!: CustomersBindings['getMyCustomerInvoices'];\n createMyCustomerPortalSession!: CustomersBindings['createMyCustomerPortalSession'];\n updateMyCustomer!: CustomersBindings['updateMyCustomer'];\n createMyCustomerSetupIntent!: CustomersBindings['createMyCustomerSetupIntent'];\n getMyCustomerPaymentMethods!: CustomersBindings['getMyCustomerPaymentMethods'];\n attachMyCustomerPaymentMethod!: CustomersBindings['attachMyCustomerPaymentMethod'];\n detachMyCustomerPaymentMethod!: CustomersBindings['detachMyCustomerPaymentMethod'];\n setDefaultMyCustomerPaymentMethod!: CustomersBindings['setDefaultMyCustomerPaymentMethod'];\n getMyCustomerCreditGrants!: CustomersBindings['getMyCustomerCreditGrants'];\n\n // Resellers API (self-service reseller portal)\n getMyResellers!: ResellersBindings['getMyResellers'];\n getMyReseller!: ResellersBindings['getMyReseller'];\n getMyResellerAccounts!: ResellersBindings['getMyResellerAccounts'];\n getMyResellerProducts!: ResellersBindings['getMyResellerProducts'];\n getMyResellerSubscriptions!: ResellersBindings['getMyResellerSubscriptions'];\n updateMyReseller!: ResellersBindings['updateMyReseller'];\n\n // Support Requests API\n listSupportRequests!: SupportRequestsBindings['listSupportRequests'];\n getSupportRequest!: SupportRequestsBindings['getSupportRequest'];\n createSupportRequest!: SupportRequestsBindings['createSupportRequest'];\n commentOnSupportRequest!: SupportRequestsBindings['commentOnSupportRequest'];\n listOrgSupportRequests!: SupportRequestsBindings['listOrgSupportRequests'];\n getOrgSupportRequest!: SupportRequestsBindings['getOrgSupportRequest'];\n createOrgSupportRequest!: SupportRequestsBindings['createOrgSupportRequest'];\n commentOnOrgSupportRequest!: SupportRequestsBindings['commentOnOrgSupportRequest'];\n listWorkspaceSupportRequests!: SupportRequestsBindings['listWorkspaceSupportRequests'];\n getWorkspaceSupportRequest!: SupportRequestsBindings['getWorkspaceSupportRequest'];\n createWorkspaceSupportRequest!: SupportRequestsBindings['createWorkspaceSupportRequest'];\n commentOnWorkspaceSupportRequest!: SupportRequestsBindings['commentOnWorkspaceSupportRequest'];\n closeWorkspaceSupportRequest!: SupportRequestsBindings['closeWorkspaceSupportRequest'];\n reopenWorkspaceSupportRequest!: SupportRequestsBindings['reopenWorkspaceSupportRequest'];\n clickWorkspaceSupportRequestResource!: SupportRequestsBindings['clickWorkspaceSupportRequestResource'];\n\n // Routing Rules API\n getRoutingRules!: RoutingRulesBindings['getRoutingRules'];\n getRoutingRule!: RoutingRulesBindings['getRoutingRule'];\n createRoutingRule!: RoutingRulesBindings['createRoutingRule'];\n updateRoutingRule!: RoutingRulesBindings['updateRoutingRule'];\n deleteRoutingRule!: RoutingRulesBindings['deleteRoutingRule'];\n reorderRoutingRules!: RoutingRulesBindings['reorderRoutingRules'];\n previewRoutingRule!: RoutingRulesBindings['previewRoutingRule'];\n\n constructor(apiKey: string | undefined, baseUrl: string, customFetch?: typeof fetch) {\n // Create all API modules\n const apis = createApiModules(apiKey, baseUrl, customFetch);\n\n // Store all modules for cross-cutting operations\n this.apis = apis;\n\n // Store workspace invitations for public access\n this.workspaceInvitations = apis.workspaceInvitations;\n\n // Bind all public methods from each domain\n bindTasksMethods(this, apis.tasks, apis.abilities);\n bindChatsMethods(this, apis.chats);\n bindCallsMethods(this, apis.calls, apis.cel);\n bindDataTypesMethods(this, apis.dataTypes);\n bindDevicesMethods(this, apis.devices);\n bindMembersMethods(this, apis.members);\n bindAgentTasksMethods(this, apis.agentTasks);\n bindAgentsMethods(this, apis.agents);\n bindQualificationsMethods(this, apis.qualifications);\n bindPersonasMethods(this, apis.personas);\n bindMetricsMethods(this, apis.metrics);\n bindQueriesMethods(this, apis.queries);\n bindDashboardsMethods(this, apis.dashboards);\n bindActivityMethods(this, apis.activity);\n bindMotdMethods(this, apis.motd);\n bindTrackedLinksMethods(this, apis.trackedLinks);\n bindJourneysMethods(this, apis.journeys);\n bindBundlesMethods(this, apis.bundles, apis.resourceWorkflows);\n bindInstallationsMethods(this, apis.installations);\n bindExperimentsMethods(this, apis.experiments);\n bindOperatorMethods(this, apis.operatorGroups);\n bindOrgMethods(this, apis.org);\n bindAccessGrantsMethods(this, apis.accessGrants);\n bindInterventionRequestsMethods(this, apis.interventionRequests);\n bindPromptsMethods(this, apis.prompts);\n bindWorkspacesMethods(this, apis.workspaces, apis.workspaceInvitations);\n bindAuthMethods(this, apis.auth, apis.assignments);\n bindSitesMethods(this, apis.sites);\n bindFilesMethods(this, apis.files);\n bindProjectsMethods(this, apis.projects);\n bindEventsMethods(this, apis.events);\n bindWorkflowsMethods(this, apis.workflows, apis.workflowNotes, apis.voice, apis.supervisors);\n bindCalendarsMethods(this, apis.calendars);\n bindCommunicationsMethods(this, apis.phoneNumbers, apis.inboxes, apis.notificationRules);\n bindToolkitsMethods(\n this,\n apis.toolkits,\n apis.templates,\n apis.aiModels,\n apis.customToolkits,\n apis.mcpServers,\n apis.features\n );\n bindBillingMethods(this, apis.apiKeys, apis.subscriptions, apis.reports);\n bindAppsMethods(\n this,\n apis.apps,\n apis.builders,\n apis.inquiries,\n apis.oauth,\n apis.oauthConnections\n );\n bindIntegrationsMethods(\n this,\n apis.mondayIntegration,\n apis.discordBots,\n apis.slackApps,\n apis.teamsApps,\n apis.fhirConnections,\n apis.patientSyncConnections,\n apis.healthie,\n apis.documoFax,\n apis.salesforce,\n apis.hubspot,\n apis.appConnections,\n apis.connectionSync,\n apis.confluence\n );\n bindPronunciationsMethods(this, apis.pronunciations);\n bindCustomersMethods(this, apis.customers);\n bindResellersMethods(this, apis.resellers);\n bindSupportRequestMethods(this, apis.supportRequests);\n bindRoutingRulesMethods(this, apis.routingRules);\n }\n\n /**\n * Return a workspace-scoped client facade.\n *\n * Methods on the returned client are the same public SDK methods, but with\n * the workspace UUID pre-bound:\n *\n * ```ts\n * const workspace = client.workspace(\"workspace-uuid\");\n * await workspace.getAccessGrants({ status: \"approved\" });\n * ```\n */\n workspace(workspaceUuid: string): GravityRailWorkspaceClient {\n return createWorkspaceClient(this, workspaceUuid);\n }\n\n /**\n * Set the handler for enhanced authentication requirements (RFC 9470 Step-Up Auth).\n * This handler is called when a 401 response includes WWW-Authenticate header\n * with error=\"insufficient_user_authentication\".\n * Propagates to all API modules.\n */\n setEnhancedAuthHandler(handler: EnhancedAuthHandler | undefined) {\n // Propagate to all API modules\n Object.values(this.apis).forEach((api) => {\n if (typeof api.setEnhancedAuthHandler === 'function') {\n api.setEnhancedAuthHandler(handler);\n }\n });\n }\n\n /**\n * Set the handler for organization authentication requirements.\n * This handler is called when a 401 response includes WWW-Authenticate header\n * with realm=\"org\".\n * Propagates to all API modules.\n */\n setOrgAuthHandler(handler: OrgAuthHandler | undefined) {\n // Propagate to all API modules\n Object.values(this.apis).forEach((api) => {\n if (typeof api.setOrgAuthHandler === 'function') {\n api.setOrgAuthHandler(handler);\n }\n });\n }\n\n /**\n * Set the org session credential for cross-domain / non-browser clients (e.g. CLI).\n * Opaque gr_sess_ values use X-Org-Session. Legacy orgToken JWE values still\n * use X-Org-Token during the migration window.\n *\n * `orgUuid` is the org that issued the session. Pass it so the SDK can\n * detect a stale session (e.g. switching orgs mid-session) and re-fire the\n * org-auth handler instead of silently 401-ing.\n *\n * Propagates to all API modules.\n */\n setOrgSession(session: string | undefined, orgUuid?: string) {\n Object.values(this.apis).forEach((api) => {\n if (typeof api.setOrgSession === 'function') {\n api.setOrgSession(session, orgUuid);\n }\n });\n }\n\n /**\n * @deprecated Legacy compatibility for stateless orgToken JWE credentials.\n * Prefer setOrgSession() for opaque org browser sessions.\n */\n setOrgToken(token: string | undefined, orgUuid?: string) {\n this.setOrgSession(token, orgUuid);\n }\n\n /**\n * Update the API key across all modules.\n * Used after successful re-authentication.\n */\n updateApiKey(newApiKey: string) {\n Object.values(this.apis).forEach((api) => {\n if (typeof api.updateApiKey === 'function') {\n api.updateApiKey(newApiKey);\n }\n });\n }\n}\n","/**\n * Ability types for the Agent Abilities system.\n *\n * Server response shapes are generated from Pydantic via emit_openapi.py → Orval.\n * Client-only shapes (ability type slugs, typed config unions for the ability\n * editor UI) are defined below.\n *\n * Abilities are composable units of agent behavior attached to supported\n * workflow, task, toolkit, custom-tool, or Supervisor surfaces.\n */\n\n// ===== GENERATED SERVER TYPES =====\n\nimport type { AbilityResponse as GeneratedAbilityResponse } from './generated/ability';\n\nexport type {\n AbilityRequirementResponse,\n AbilityRequirementResponseKind,\n AbilityTypeResponseAttachmentScopesItem as AbilityAttachmentScope,\n AbilityTypeResponse,\n AbilityTypeResponse as AbilityType,\n AbilityTypesResponse,\n} from './generated/ability';\n\n// ===== CLIENT-ONLY SURFACE =====\n\n// ============================================================\n// Ability Type Slugs\n// ============================================================\n\n/** Known ability type slugs */\nexport const AbilityTypeSlugs = {\n // Tools\n TOOLKITS: 'tools:toolkits',\n WEB_SEARCH: 'tools:web_search',\n CONVERSATION_HISTORY: 'tools:conversation_history',\n IMAGE_GENERATION: 'tools:image_generation',\n CONVERSATION_CONTROL: 'tools:conversation_control',\n\n // Integration\n CALENDAR_BOOKING: 'integration:calendar_booking',\n FILE_ACCESS: 'integration:file_access',\n DATA_ACCESS: 'integration:data_access',\n GMAIL: 'integration:gmail',\n GOOGLE_CALENDAR: 'integration:google_calendar',\n GOOGLE_DRIVE: 'integration:google_drive',\n GOOGLE_SHEETS: 'integration:google_sheets',\n CHARLESTON_PMD_PAGING: 'integration:charleston_pmd_paging',\n COSAN_PATHWAYS_SCHEDULING: 'integration:cosan_pathways_scheduling',\n\n // Communication\n PHONE_CALL_TOOLS: 'communication:phone_call_tools',\n SEND_SMS: 'communication:send_sms',\n SEND_EMAIL: 'communication:send_email',\n SEND_WHATSAPP: 'communication:send_whatsapp',\n MEMBER_ACCESS: 'communication:member_access',\n AUDIO_PLAYBACK: 'communication:audio_playback',\n\n // Oversight\n SUPERVISOR: 'oversight:supervisor',\n SUPERVISOR_ACTIONS: 'oversight:supervisor_actions',\n ESCALATION: 'oversight:escalation',\n\n // Identity\n MEMBER_FIELD_VERIFICATION: 'identity:member_field_verification',\n\n // Delegation\n CONTRIBUTOR: 'delegation:contributor',\n MANAGE_WORKSPACE: 'delegation:manage_workspace',\n\n // Workflow\n WORKFLOW_RUN: 'workflow:run',\n\n // Access\n MEMBER_ROLE_GATE: 'access:member_role_gate',\n\n // Commerce\n RESELLER: 'commerce:reseller',\n\n // System (auto-injected, hidden from users)\n USER_MESSAGE_RULES: 'system:user_message_rules',\n ASSISTANT_MESSAGE_RULES: 'chat:assistant_message_rules',\n CEL_ROUTING: 'system:cel_routing',\n} as const;\n\n/** Type for ability type slug values */\nexport type AbilityTypeSlug = (typeof AbilityTypeSlugs)[keyof typeof AbilityTypeSlugs];\n\n// ============================================================\n// Ability Config Types\n// ============================================================\n\n/** Config for calendar_booking ability */\nexport interface CalendarBookingAbilityConfig {\n calendarUuid: string;\n /** Optional: specific event type UUID, or undefined to allow all event types */\n eventTypeUuid?: string;\n canEditBookings?: boolean;\n}\n\n/** Config for a single folder access entry */\nexport interface FolderAccessEntry {\n /** ID of the folder to provide access to */\n folderId: number;\n /** Allow reading file contents (default: true) */\n canRead?: boolean;\n /** Allow listing folder contents (default: true) */\n canList?: boolean;\n /** Allow searching files (requires folder to be indexed, default: false) */\n canSearch?: boolean;\n /** Allow creating new files in the folder (default: false) */\n canCreate?: boolean;\n /**\n * Allow speaking these files verbatim to the caller on voice chats\n * (default: false). Separate from canRead: reference material the agent\n * consults is not a script it narrates.\n */\n canReadAloud?: boolean;\n /**\n * Keep narrating chunk-to-chunk without waiting for the listener to ask\n * for more (default: false). Inert unless canReadAloud is also set.\n */\n autoContinueReadAloud?: boolean;\n /** Optional hint for the LLM about when/how to use this folder */\n hint?: string;\n}\n\n/** Config for a single file access entry */\nexport interface FileAccessEntry {\n /** ID of the file to provide access to */\n fileId: number;\n /** Allow reading file contents (default: true) */\n canRead?: boolean;\n /** Allow writing/editing file contents (default: false) */\n canWrite?: boolean;\n /**\n * Allow speaking this file verbatim to the caller on voice chats\n * (default: false). Separate from canRead: reference material the agent\n * consults is not a script it narrates.\n */\n canReadAloud?: boolean;\n /**\n * Keep narrating chunk-to-chunk without waiting for the listener to ask\n * for more (default: false). Inert unless canReadAloud is also set.\n */\n autoContinueReadAloud?: boolean;\n /** Optional hint for the LLM about when/how to use this file */\n hint?: string;\n}\n\n/** Config for file_access ability - supports multiple folders and files */\nexport interface FileAccessAbilityConfig {\n /** List of folders with their access permissions */\n folders?: FolderAccessEntry[];\n /** List of individual files with their access permissions */\n files?: FileAccessEntry[];\n}\n\n/** Config for the oversight:supervisor workflow ability */\nexport interface SupervisorAbilityConfig {\n /** UUID of the supervisor CustomTool (must have tool_type='supervisor') */\n customToolUUID?: string;\n /** Legacy integer id of the supervisor CustomTool (kept for backward compat with pre-#10893 configs) */\n customToolId?: number;\n /** Whether to include full conversation history when invoking the supervisor */\n includeHistory?: boolean;\n}\n\n/** Config for supervisor_actions ability - defines what actions a supervisor can take */\nexport interface SupervisorActionsAbilityConfig {\n /** Allow supervisor to provide suggestions to the main assistant (not visible to user) */\n suggestResponse?: boolean;\n /** Allow supervisor to send messages directly to the user */\n overrideResponse?: boolean;\n /** Allow supervisor to pause the conversation */\n pauseChat?: boolean;\n}\n\n/** Config for toolkits ability */\nexport interface ToolkitsAbilityConfig {\n /** List of tool names to add to the agent (explicit pinned URIs — never a wildcard) */\n tools: string[];\n /**\n * Per-MCP-server snapshot of the tool names known when the selection was\n * last saved, keyed by server id (GRA-6279). The UI compares it against\n * the server's current tool list to badge \"N new tools available\"; it\n * never expands the selection.\n */\n knownMcpTools?: Record<string, string[]> | null;\n}\n\n/** Config for data_access ability */\nexport interface DataAccessAbilityConfig {\n /** UUID of the data type to provide tools for */\n dataTypeUuid: string;\n /** Whether the agent can create new records (default: false) */\n canCreate?: boolean;\n /** Whether the agent can list and search records (default: true) */\n canRead?: boolean;\n /** Whether the agent can update existing records (default: false) */\n canEdit?: boolean;\n /** Whether the agent can verify record data (default: false) */\n canVerify?: boolean;\n /** Whether the agent can list all members' records (default: false) */\n canListAll?: boolean;\n /** Whether the agent can search records by geographic location (default: false) */\n canGeolocate?: boolean;\n /** Whether the agent can delete records (default: false) */\n canDelete?: boolean;\n /** Field slugs the agent can read. If empty/undefined, all fields are readable. */\n readFields?: string[];\n /** Maximum records returned by list and search tools; exact lookup and ZIP geolocate tools are not bounded by it. If empty/undefined, each tool's default page size is used. */\n readLimit?: number;\n /** Field slug, created_at, or updated_at used to order list tool results. */\n readSortField?: string;\n /** Sort direction for list tool results. */\n readSortDirection?: 'asc' | 'desc';\n /** Field slugs the agent can write/update. If empty/undefined, all fields are writable. */\n writeFields?: string[];\n /** Field slugs the agent can set when creating records. If empty/undefined, all fields are available. */\n createFields?: string[];\n /** When true, auto-create a record for the assignment if one doesn't exist (default: false) */\n autoCreate?: boolean;\n /**\n * Scope for the generated agent Form tool record access (reads/writes).\n * Applies to any Form, not only collections.\n * - \"member\" (default): all of the current Member's records, including\n * from prior Assignments (lifetime history).\n * - \"assignment\": only records linked to the current Assignment via\n * AssignmentDataRecordAssociation. Use this when the agent should\n * never see or modify records from a prior Assignment for the\n * same Member.\n *\n * Omit when the value is \"member\" so existing configs round-trip\n * without churn.\n */\n scope?: 'member' | 'assignment';\n}\n\n/** A single forwarding number in the ability config */\nexport interface ForwardingNumberDef {\n /** Human-readable name for this forwarding destination (e.g., 'Billing Department') */\n name: string;\n /** Phone number in E.164 format (e.g., '+15551234567') */\n phoneNumber: string;\n /** Hint for the LLM about when to use this number (e.g., 'for billing inquiries') */\n choicePrompt?: string;\n /** CEL expression that must evaluate to true for this number to be available */\n celCondition?: string;\n}\n\n/** Config for phone_call_tools ability */\nexport interface PhoneCallToolsAbilityConfig {\n /** Allow the agent to forward the call to another number (phone-voice and web-voice) */\n canForward?: boolean;\n /** List of specific forwarding destinations the agent can use */\n forwardingNumbers?: ForwardingNumberDef[];\n /** When true, the agent can also forward to any number (not just configured ones) */\n allowFreeformForwarding?: boolean;\n /** Allow the agent to press keys (DTMF tones) on the active phone call to navigate phone menus. Phone-voice only. */\n canSendDtmf?: boolean;\n}\n\n/** One locale-tagged body for a canned SMS message */\nexport interface SMSMessageVariantDef {\n /** Supported locale tag, e.g. \"es-MX\" */\n locale: string;\n /** Jinja2 template for this locale's message body */\n messageTemplate: string;\n}\n\n/** A single named SMS message in the ability config */\nexport interface SMSMessageDef {\n /** AI-readable title like \"Customer Docs Link\" */\n title: string;\n /**\n * Jinja2 template for the default-locale body. Always sent when the caller\n * is not using a language the message has a variant for.\n */\n messageTemplate: string;\n /**\n * Optional per-locale bodies. The agent picks the one matching the language\n * the caller is speaking or writing; an `en-US` variant outranks the\n * default body for English.\n */\n variants?: SMSMessageVariantDef[];\n}\n\n/** One allowlisted destination for the send_email ability */\nexport interface EmailRecipientDef {\n /** Workspace member ID to send to */\n memberId: number;\n /** AI-readable label (e.g. \"Dr Tristan\") */\n name: string;\n /** Hint for when to use this recipient */\n choicePrompt?: string;\n /** CEL expression that must be true for this recipient to be available */\n celCondition?: string;\n}\n\n/** Config for send_email ability */\nexport interface SendEmailAbilityConfig {\n /**\n * Inbox to send from. When omitted, the workflow's default inbox is used.\n * Set this to send internal summaries from a different inbox than replies.\n */\n inboxUUID?: string;\n /** Allowlisted members the agent may email */\n recipients?: EmailRecipientDef[];\n}\n\n/** Config for send_sms ability */\nexport interface SendSMSAbilityConfig {\n /** If true, the agent can also compose its own messages (default: false) */\n allowFreeformMessage?: boolean;\n /**\n * If true, the agent can send SMS during a voice call to the member's\n * mobile phone (default: true).\n */\n enableOnVoice?: boolean;\n /** List of named messages the agent can send */\n messages?: SMSMessageDef[];\n}\n\n/** Config for escalation ability */\nexport interface EscalationAbilityConfig {\n /** Message shown when chat is paused for escalation. If not set, uses workspace default. */\n pausedMessage?: string | null;\n /** Message shown when agents are notified. If not set, uses workspace default. */\n notifiedMessage?: string | null;\n /** Message shown during business hours. If not set, uses workspace default. */\n onlineMessage?: string | null;\n /** Message shown outside business hours. If not set, uses workspace default. */\n offlineMessage?: string | null;\n /** Whether to pause the chat on escalation. If not set, uses workspace default. */\n pauseOnEscalate?: boolean | null;\n /** List of member IDs to notify first for this workflow/task escalations. */\n priorityMemberIds?: number[] | null;\n /**\n * Operator groups whose members receive escalations for this workflow/task.\n * Members who are online are preferred (and notified in the browser); the\n * group's own broadcast / round-robin strategy is respected.\n */\n operatorGroupIds?: number[] | null;\n}\n\n/** Config for web_search ability */\nexport interface WebSearchAbilityConfig {\n /** Enable web search capability (default: true) */\n web?: boolean;\n /** Enable local search for businesses, restaurants, and POIs (default: false) */\n local?: boolean;\n}\n\n/** Config for conversation_history ability */\nexport interface ConversationHistoryAbilityConfig {\n /** Enable listing prior chat conversations (default: true) */\n list_chats?: boolean;\n /** Enable reading messages from prior chats (default: true) */\n read_messages?: boolean;\n /** Include up to N recent chat summaries directly in the prompt (default: 0) */\n include_chats?: number;\n /** Load saved basic memories into the prompt (default: false) */\n memory_basic_read?: boolean;\n /** Enable tools to save/delete basic memories (default: false) */\n memory_basic_write?: boolean;\n /** Send conversations for automatic memory extraction. Requires agent_memory feature. (default: false) */\n memory_enabled?: boolean;\n /** Recall user preference memories (default: false) */\n memory_preferences?: boolean;\n /** Recall semantic fact memories (default: false) */\n memory_semantic?: boolean;\n /** Recall conversation summary memories (default: false) */\n memory_summaries?: boolean;\n /** Recall episodic memories (default: false) */\n memory_episodic?: boolean;\n}\n\n/** Read-only vs read-write for member-linked Google integrations */\nexport type GoogleWorkspaceAccessMode = 'read_only' | 'read_write';\n\n/** Shared config for the Gmail, Google Calendar, Drive, and Sheets integration abilities */\nexport interface GoogleWorkspaceIntegrationAbilityConfig {\n /**\n * read_only: list linked accounts and read data only.\n * read_write: also create or modify data (and reconnect OAuth for Gmail).\n */\n accessMode?: GoogleWorkspaceAccessMode;\n /**\n * When true AND the workspace app connection is enabled, the agent may\n * help an unconnected member connect their own account mid-conversation\n * (web approval card, or a short-lived secure link on SMS/voice/other\n * channels). Default false: the agent reports not-connected and stops.\n */\n allowConnectInline?: boolean;\n}\n\n/** Config for integration:gmail */\nexport type GmailAbilityConfig = GoogleWorkspaceIntegrationAbilityConfig;\n\n/** Config for integration:google_calendar */\nexport type GoogleCalendarAbilityConfig = GoogleWorkspaceIntegrationAbilityConfig;\n\n/** Config for integration:google_drive */\nexport type GoogleDriveAbilityConfig = GoogleWorkspaceIntegrationAbilityConfig;\n\n/** Config for integration:google_sheets */\nexport type GoogleSheetsAbilityConfig = GoogleWorkspaceIntegrationAbilityConfig;\n\n/** A single audio file entry in the audio_playback ability config */\nexport interface AudioPlaybackFileEntry {\n /** ID of the workspace file to expose for playback (must be a .wav file) */\n fileId: number;\n /** Short label the LLM uses to pick this clip (e.g. 'voicemail_greeting') */\n label: string;\n /** Optional hint for the LLM about when to use this clip */\n hint?: string;\n}\n\n/** Config for audio_playback ability */\nexport interface AudioPlaybackAbilityConfig {\n /** Audio files the agent may play on this task */\n files?: AudioPlaybackFileEntry[];\n}\n\n/** Config for the Charleston Nephrology PMD paging ability. */\nexport interface CharlestonPmdAbilityConfig {\n /**\n * UUID of the workspace OperatorGroup whose members are the roster for\n * manual-escalation notifications and the after-hours escalation-call\n * ladder. Picked from the workspace's OperatorGroup list in the ability\n * config UI.\n */\n operatorGroupUuid: string;\n /**\n * UUID of the workspace Workflow an answered after-hours escalation call\n * is connected to. Required at save time. The final phone ladder is no\n * longer time-window constrained: once both PMD pages go unread on an\n * after-hours-ladder route, group members are always called in priority\n * order.\n *\n * The manual-escalation contact list was removed entirely: manual\n * escalation now sends the OperatorGroup a generic, PHI-free incident\n * notification that links to the incident DataRecord.\n */\n escalationWorkflowUuid?: string | null;\n /**\n * Workflow-scoped PMD paging simulation switch. Absent/null = NORMAL\n * production behavior (real PatientSync pages, real contacts) — production\n * Workflow 7 leaves this unset. Any allowed value makes THIS workflow's\n * pages simulated: PatientSync is never contacted and human contact is\n * restricted to Members labeled 'cna_pmd_simulation_safe_contact'. Set it\n * only on a cloned test Workflow, never production. The value is a PHI-free\n * enum and never changes the send tool's argument schema.\n */\n simulationOutcome?: CharlestonPmdSimulationOutcome | null;\n /**\n * Optional PatientSync call-center backstop: after the escalation ladder is\n * exhausted, POST incident context to PatientSync and dial the returned\n * number with this voice Workflow. Requires patientsync_transfer feature.\n */\n patientsyncBackstopWorkflowUuid?: string | null;\n /** Contact Member who owns the backstop outbound chat (phone overridden at dial). */\n patientsyncBackstopContactMemberUuid?: string | null;\n /**\n * Workflow-scoped PMD TEST DELIVERY (CS-150). Absent/null = normal\n * production delivery. When set, THIS workflow's pages become REAL\n * '[TEST]'-prefixed PatientSync deliveries to the approved stand-in\n * recipient-directory row with this recipient_key, and every human\n * escalation/follow-up contact is fenced to Members labeled\n * 'cna_pmd_simulation_safe_contact'. Mutually exclusive with\n * simulationOutcome. Set it only on a cloned/isolated test Workflow — never\n * production Workflow 7. The value is a PHI-free directory key and never\n * changes the send tool's argument schema.\n */\n testDeliveryRecipientKey?: string | null;\n}\n\n/** Allowed values for the Charleston PMD simulation switch (v1). */\nexport type CharlestonPmdSimulationOutcome =\n 'read' | 'reply' | 'send_failed' | 'no_response_escalate' | 'daytime_followup_unread';\n\n/**\n * One eligible Charleston PMD test-delivery recipient option (CS-150). The\n * options endpoint returns ONLY these PHI-free fields for active,\n * test-delivery-allowed rows — never the PatientSync recipient_id.\n */\nexport interface CharlestonTestDeliveryRecipientOption {\n /** Stable directory key selected into testDeliveryRecipientKey. */\n recipientKey: string;\n /** Operator-facing label for the stand-in device row. */\n displayLabel: string;\n}\n\n/** The Rysun Pathways environment a Cosan practice books in. */\nexport type PathwaysEnvironment = 'production' | 'staging';\n\n/**\n * Config for the Cosan Pathways scheduling ability (Cosan only).\n *\n * `practiceId` is the practice's Rysun Pathways id, the same value the\n * `cosan-enrollment-v2` Site stores as `pathways_practice_id`. It is required:\n * without it the Ability has no practice to search, so the picker's\n * configuration step must collect it before the ability can be attached.\n */\nexport interface CosanPathwaysSchedulingAbilityConfig {\n /** The practice's Rysun Pathways practice id (a positive integer). */\n practiceId: number;\n /** Environment to book in; production unless set. */\n environment?: PathwaysEnvironment;\n}\n\n/** Config for image_generation ability */\nexport interface ImageGenerationAbilityConfig {\n /**\n * Preferred aspect ratio the agent uses when the user doesn't request a\n * specific shape. 'auto' lets the agent choose per request (default: 'auto').\n */\n defaultAspectRatio?: 'auto' | '1:1' | '16:9' | '9:16' | '4:3' | '3:4';\n /** Maximum images the agent may generate in a single request, 1-4 (default: 4) */\n maxImages?: 1 | 2 | 3 | 4;\n}\n\n/** Config for conversation_control ability */\nexport interface ConversationControlAbilityConfig {\n /** Enable scheduling callbacks to continue conversation later (default: true) */\n scheduleCallback?: boolean;\n /** Enable restarting the assignment from scratch (default: false) */\n startOver?: boolean;\n /** Maximum realtime voice-session duration in seconds; unset means unlimited */\n maxRealtimeChatDurationSeconds?: number | null;\n}\n\n/** Config for send_whatsapp ability — no user-configurable options */\nexport type SendWhatsAppAbilityConfig = EmptyAbilityConfig;\n\n/** Config for contributor ability — no user-configurable options */\nexport type ContributorAbilityConfig = EmptyAbilityConfig;\n\n/** Config for manage-workspace ability */\nexport interface ManageWorkspaceAbilityConfig {\n /**\n * Scopes the Workspace Manager may use. Intersected with the current\n * member's live role at every inference resume. Empty means no\n * workspace grant (chat coordination floor only). Reads are not\n * implied. Workflow/automation mutation scopes cannot be granted.\n */\n permittedScopes?: string[];\n}\n\n/** Config for workflow_run ability */\nexport interface WorkflowRunAbilityConfig {\n /** Workflow UUID allowlist. Empty means any authorized Workflow. */\n allowedWorkflowUuids?: string[];\n /** Enabled run modes (default: ['current_chat']) */\n allowedModes?: Array<'current_chat' | 'background'>;\n /** Background run timeout in seconds (default: 600) */\n defaultBackgroundTimeoutSeconds?: number;\n}\n\n/**\n * Config for the Workflow-level member_role_gate ability.\n *\n * Only Members whose role is listed may enter the Workflow. Without this\n * ability on the revision, every Member of the workspace may enter.\n */\nexport interface MemberRoleGateAbilityConfig {\n /**\n * UUIDs of the member roles admitted to this Workflow. Empty admits only the\n * Workflow's owner, Workflow admins and access-grant holders.\n */\n memberRoleUuids: string[];\n /** What a Member outside these roles is told. */\n deniedMessage?: string;\n}\n\n/** Config for reseller ability — no user-configurable options */\nexport type ResellerAbilityConfig = EmptyAbilityConfig;\n\n/** Config for member_field_verification ability */\nexport interface MemberFieldVerificationAbilityConfig {\n /** Enable verification against the Member name on file (default: true) */\n verifyName?: boolean;\n /** Enable verification against the Member email on file (default: false) */\n verifyEmail?: boolean;\n /** Enable verification against the Member phone on file (default: false) */\n verifyPhone?: boolean;\n /** Enable verification against the Member date of birth on file (default: true) */\n verifyDateOfBirth?: boolean;\n}\n\n/** Config for abilities with no configuration */\nexport type EmptyAbilityConfig = Record<string, never>;\n\n/** Union type of all ability configs */\nexport type AbilityConfig =\n | CalendarBookingAbilityConfig\n | FileAccessAbilityConfig\n | SupervisorAbilityConfig\n | SupervisorActionsAbilityConfig\n | ToolkitsAbilityConfig\n | DataAccessAbilityConfig\n | PhoneCallToolsAbilityConfig\n | SendEmailAbilityConfig\n | SendSMSAbilityConfig\n | EscalationAbilityConfig\n | WebSearchAbilityConfig\n | ConversationHistoryAbilityConfig\n | GmailAbilityConfig\n | GoogleCalendarAbilityConfig\n | GoogleDriveAbilityConfig\n | GoogleSheetsAbilityConfig\n | AudioPlaybackAbilityConfig\n | CharlestonPmdAbilityConfig\n | CosanPathwaysSchedulingAbilityConfig\n | ConversationControlAbilityConfig\n | WorkflowRunAbilityConfig\n | MemberRoleGateAbilityConfig\n | ManageWorkspaceAbilityConfig\n | MemberFieldVerificationAbilityConfig\n | ImageGenerationAbilityConfig\n | EmptyAbilityConfig\n | Record<string, unknown>; // Fallback for unknown ability types\n\n/** Re-bind config to typed client union (OpenAPI emits `{ [key: string]: unknown }`). */\nexport type AbilityResponse = Omit<GeneratedAbilityResponse, 'config' | 'id'> & {\n id?: number;\n config: AbilityConfig;\n};\n\nexport type Ability = AbilityResponse;\n","import type { XAIRealtimeModelConfig as GeneratedXAIRealtimeModelConfig } from './generated/realtime_config';\n\n// Model configuration types for AI agents and voice\n// These types are used for agent configuration (realtime models, chat models, TTS, etc.)\n\n// Realtime Model Configuration Types\n\nexport type OpenAITurnDetectionType = 'semantic_vad' | 'server_vad';\nexport type OpenAISemanticVADEagerness = 'low' | 'medium' | 'high' | 'auto';\n\nexport interface OpenAISemanticVADTurnDetection {\n type: 'semantic_vad';\n eagerness?: OpenAISemanticVADEagerness;\n create_response?: boolean; // automatically create response when user turn ends\n interrupt_response?: boolean; // allow user to interrupt the response\n}\n\nexport interface OpenAIServerVADTurnDetection {\n type: 'server_vad';\n threshold?: number; // 0.0 to 1.0\n prefix_padding_ms?: number; // milliseconds\n silence_duration_ms?: number; // milliseconds\n create_response?: boolean; // automatically create response when user turn ends\n interrupt_response?: boolean; // allow user to interrupt the response\n}\n\nexport type OpenAITurnDetection = OpenAISemanticVADTurnDetection | OpenAIServerVADTurnDetection;\n\n/**\n * xAI's server-VAD block: OpenAI's fields plus `idle_timeout_ms`, which xAI\n * documents and OpenAI has no equivalent for. Mirrors\n * `lib/voice/realtime_config.py:XAIServerVADTurnDetection`.\n *\n * A configured `turnDetection` REPLACES xAI's default block wholesale rather\n * than merging with it, so setting `idle_timeout_ms` alone also drops the\n * phone-tuned threshold and prefix padding back to schema defaults.\n */\nexport interface XAIServerVADTurnDetection extends OpenAIServerVADTurnDetection {\n /**\n * Silence (ms) before xAI speaks again unprompted. Unset means\n * re-engagement is off; there is deliberately no platform default. xAI\n * clamps the value up to its own floor, so read back the echoed session\n * when the exact wait matters.\n */\n // `| null` matches the generated type: the Python field is Optional[int]\n // and Pydantic serializes it as null on the wire, so a value read from a\n // response and passed to a function typed here would not compile without\n // it. The other fields on this interface still carry that divergence;\n // this is the one the PR introduces, so it starts aligned.\n idle_timeout_ms?: number | null;\n}\n\nexport type ThinkingSound = 'none' | 'typing' | 'strumming' | 'speech';\nexport type InterruptionSound = 'none' | 'clav' | 'bells' | 'organ' | 'guzheng';\n\n/** Default filler phrases suggested when the user first enables \"speech\" mode. */\nexport const DEFAULT_THINKING_SPEECH_PHRASES: readonly string[] = [\n 'One moment please',\n \"I'll be right with you\",\n 'Just a moment',\n];\nexport type TTSModel =\n | 'native'\n | 'xai:tts:v1'\n | 'openai:tts:tts-1'\n | 'openai:tts:tts-1-hd'\n | 'openai:tts:gpt-4o-mini-tts'\n | 'aws:tts:polly-generative'\n | 'aws:tts:polly-neural'\n | 'google:tts:chirp';\n\n/** Extract the provider from a TTSModel ID (e.g. \"xai:tts:v1\" -> \"xai\"). */\nexport function getTTSProvider(ttsModel: string | null | undefined): string | null {\n if (!ttsModel || ttsModel === 'native') return ttsModel ?? null;\n return ttsModel.split(':')[0] ?? null;\n}\n\n/**\n * Base configuration for all realtime models.\n * Contains common fields that apply to all realtime model providers.\n */\nexport interface BaseRealtimeModelConfig {\n /** Sound to play while the agent is processing tool calls. */\n thinkingSound?: ThinkingSound | null;\n /** Volume level for the thinking sound (0-100). 0 means muted. Missing or null means full volume (100). */\n thinkingSoundVolume?: number | null;\n /** Initial delay in milliseconds before playing thinking sound. Prevents needless interruption on short tool calls. Default: 500ms. */\n thinkingSoundInitialDelay?: number | null;\n /** When `thinkingSound` is 'speech', one of these phrases is spoken while the agent runs a tool. Phrases rotate round-robin per session. */\n thinkingSpeechPhrases?: string[] | null;\n /** Sound to play when user stops speaking after interrupting the assistant. Provides immediate auditory feedback that input was received. Default: none. */\n interruptionSound?: InterruptionSound | null;\n /** Volume level for the interruption sound (0-100). 0 means muted. Missing or null means full volume (100). */\n interruptionSoundVolume?: number | null;\n /** TTS model ID in provider:tts:model format (e.g. 'xai:tts:v1'), or 'native'. */\n ttsModel?: TTSModel | null;\n /** Canonical voice identifier (e.g., xai:voice:lux) that selects the specific agent voice. */\n voiceModel?: string | null;\n /**\n * Settings belonging to the voice architecture that is NOT currently\n * selected, parked so switching between the composable stack and a native\n * speech-to-speech model is lossless and reversible.\n *\n * Declared on the base because the native schemas set `extra=\"forbid\"`\n * server-side: an undeclared key would be rejected on save. Written and\n * read only by the switch itself (`reconcile_realtime_model_config` on the\n * server, `parkComposableConfig` / `restoreComposableConfig` in the\n * editor). Nothing at call time reads it — it is a holding area, never\n * live configuration.\n */\n inactiveConfig?: Record<string, unknown> | null;\n}\n\n/**\n * Native realtime providers always use the model's built-in audio. The\n * backend Pydantic schemas now enforce `ttsModel: \"native\"` and reject\n * external `sttModel`. Mirroring that contract on the client surface\n * keeps the editor in sync — see `useVoiceConfig.buildSubmitConfig`.\n */\nexport interface OpenAIRealtimeModelConfig extends BaseRealtimeModelConfig {\n ttsModel?: 'native' | null;\n turnDetection?: OpenAITurnDetection | null;\n}\n\nexport interface GeminiRealtimeModelConfig extends BaseRealtimeModelConfig {\n ttsModel?: 'native' | null;\n}\n\nexport interface CustomRealtimeModelConfig extends BaseRealtimeModelConfig {\n sttModel?: string | null;\n sttConfig?: Record<string, unknown> | null;\n // Required: model and config for voice inference (no fallback to chatModel)\n inferenceModel: string;\n inferenceModelConfig?: ChatModelConfig | null;\n}\n\n/**\n * xAI Voice Agent realtime config. Only `server_vad` is supported, so\n * the server-side schema rejects `semantic_vad`. Mirrors\n * `lib/voice/realtime_config.py:XAIRealtimeModelConfig`.\n */\nexport interface XAIRealtimeModelConfig extends BaseRealtimeModelConfig {\n ttsModel?: 'native' | null;\n turnDetection?: XAIServerVADTurnDetection | null;\n // Typed from the generated contract rather than restated, so a server-side\n // change to these fields breaks the build instead of drifting silently.\n keyterms?: GeneratedXAIRealtimeModelConfig['keyterms'];\n languageHint?: GeneratedXAIRealtimeModelConfig['languageHint'];\n reasoningEffort?: GeneratedXAIRealtimeModelConfig['reasoningEffort'];\n}\n\n/**\n * xAI Grok Voice background reasoning (\"high\" | \"none\"). Narrower than the\n * chat-model `XAIReasoningEffort`.\n */\nexport type XAIRealtimeReasoningEffort = NonNullable<\n GeneratedXAIRealtimeModelConfig['reasoningEffort']\n>;\n\nexport type RealtimeModelConfig =\n | OpenAIRealtimeModelConfig\n | GeminiRealtimeModelConfig\n | CustomRealtimeModelConfig\n | XAIRealtimeModelConfig;\n\n// Chat Model Configuration Types (for thinking/reasoning)\n\nexport type GeminiThinkingLevel = 'minimal' | 'low' | 'medium' | 'high';\n/**\n * OpenAI GPT-5 reasoning effort. The ACCEPTED SUBSET IS MODEL-DEPENDENT — sending\n * an out-of-set value is a hard 400 at the API. Mirror of the per-family vocab in\n * lib/ai/chat_model_config.py (see getOpenAIReasoningEfforts):\n * gpt-5 (5.0): minimal / low / medium / high\n * gpt-5.1: none / low / medium / high\n * gpt-5.4: none / low / medium / high / xhigh\n * gpt-6.1-sol: low / medium / high / xhigh\n * This union is the superset; the UI filters it down per selected model.\n */\nexport type OpenAIReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';\n/**\n * xAI (Grok) reasoning levels. Note \"none\" disables reasoning entirely\n * (used by Grok 4.3 to switch into non-reasoning mode). Grok 4.6 and 4.7\n * accept \"xhigh\" but not \"none\". xAI does NOT accept OpenAI's \"minimal\".\n * https://docs.x.ai/developers/model-capabilities/text/reasoning#effort-levels\n */\nexport type XAIReasoningEffort = 'none' | 'low' | 'medium' | 'high' | 'xhigh';\n/**\n * Claude 5.5 adaptive-thinking effort. These models take effort as their only\n * thinking control — they reject `thinkingEnabled` / `thinkingBudgetTokens`.\n * Mirror of `ClaudeChatConfig.reasoningEffort` in lib/ai/chat_model_config.py.\n */\nexport type ClaudeReasoningEffort = 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n\n/**\n * Base configuration for all chat models.\n * Can be extended for provider-specific options.\n */\nexport interface BaseChatModelConfig {}\n\nexport interface GeminiChatModelConfig extends BaseChatModelConfig {\n thinkingLevel?: GeminiThinkingLevel | null;\n includeThoughts?: boolean | null;\n}\n\nexport interface ClaudeChatModelConfig extends BaseChatModelConfig {\n thinkingEnabled?: boolean | null;\n thinkingBudgetTokens?: number | null; // 1024-50000\n /** Claude 5.5 only; the 4.5 / 4.6 models use thinkingEnabled instead. */\n reasoningEffort?: ClaudeReasoningEffort | null;\n}\n\nexport interface OpenAIChatModelConfig extends BaseChatModelConfig {\n provider: 'openai';\n reasoningEffort?: OpenAIReasoningEffort | null;\n}\n\nexport interface XAIChatModelConfig extends BaseChatModelConfig {\n provider: 'xai';\n reasoningEffort?: XAIReasoningEffort | null;\n}\n\nexport type ChatModelConfig =\n GeminiChatModelConfig | ClaudeChatModelConfig | OpenAIChatModelConfig | XAIChatModelConfig;\n\n// ===== VOICE MODEL UTILITIES =====\n\n/**\n * Supported TTS preview providers.\n * These are the voice providers that support TTS preview in the UI.\n */\nexport const TTS_PREVIEW_PROVIDERS = ['openai', 'google', 'aws', 'deepgram', 'xai'] as const;\nexport type TTSPreviewProvider = (typeof TTS_PREVIEW_PROVIDERS)[number];\n\n/**\n * Get the canonical voice model ID from a realtime model config.\n *\n * Voice model IDs follow the format: `{provider}:voice:{voiceName}`\n * Examples:\n * - `openai:voice:ash`\n * - `xai:voice:lux`\n * - `google:voice:puck`\n *\n * @param entity - An object with optional realtimeModelConfig\n * @returns The canonical voice model ID, or null if no voice is configured\n */\nexport function getVoiceModelId(entity: {\n realtimeModelConfig?: RealtimeModelConfig | null;\n}): string | null {\n const config = entity.realtimeModelConfig as BaseRealtimeModelConfig | null;\n return config?.voiceModel ?? null;\n}\n\n/**\n * Check if an entity's voice can be previewed.\n *\n * @param entity - An object with optional realtimeModelConfig\n * @returns True if the entity's voice supports TTS preview\n */\nexport function canPreviewVoice(entity: {\n realtimeModelConfig?: RealtimeModelConfig | null;\n}): boolean {\n const voiceModel = getVoiceModelId(entity);\n if (!voiceModel) return false;\n const provider = voiceModel.split(':')[0];\n return TTS_PREVIEW_PROVIDERS.includes(provider as TTSPreviewProvider);\n}\n","/**\n * Unified Query Engine types — hand-written mirror of `lib/query/ir.py`\n * and the `/w/{wid}/queries/*` route models.\n *\n * The JSON IR is the wire format AND the UI's source of truth: the\n * query-builder renders from and edits exactly this tree.\n */\n\nexport type QueryEntityType = 'member' | 'chat' | 'data_record';\n\nexport type QueryComparisonOp =\n | 'eq'\n | 'neq'\n | 'contains'\n | 'notContains'\n | 'startsWith'\n | 'in'\n | 'notIn'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'between'\n | 'notBetween'\n | 'isEmpty'\n | 'notEmpty'\n | 'exists'\n | 'onDay'\n | 'notOnDay';\n\nexport type QueryAggregateOp = 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte';\n\n/** Operators that take no value. */\nexport const QUERY_VALUELESS_OPS: ReadonlySet<QueryComparisonOp> = new Set([\n 'isEmpty',\n 'notEmpty',\n 'exists',\n]);\n\n// ---------------------------------------------------------------------------\n// Value objects\n// ---------------------------------------------------------------------------\n\nexport interface QueryNowValue {\n type: 'now';\n}\n\nexport interface QueryDaysAgoValue {\n type: 'daysAgo';\n days: number;\n /** Optional hour component (legacy \"36h\" duration windows). */\n hours?: number;\n}\n\nexport interface QueryDaysFromNowValue {\n type: 'daysFromNow';\n days: number;\n}\n\nexport interface QueryDayBoundaryValue {\n type: 'dayBoundary';\n /** 'today' | 'tomorrow' | 'yesterday' | ISO date (YYYY-MM-DD) */\n day: string;\n edge?: 'start' | 'end';\n /** Whole-day shift relative to `day` (legacy daysAgoEqual: N). */\n offsetDays?: number;\n /** UTC-pinned day bounds (legacy calendar-event day operators). */\n tz?: 'workspace' | 'utc';\n}\n\nexport type QueryTemporalValue =\n QueryNowValue | QueryDaysAgoValue | QueryDaysFromNowValue | QueryDayBoundaryValue;\n\nexport type QueryScalar = boolean | number | string;\n\nexport type QueryRangeBound = QueryScalar | QueryTemporalValue;\n\nexport interface QueryRangeValue {\n type: 'range';\n min: QueryRangeBound;\n max: QueryRangeBound;\n}\n\nexport type QueryValue = QueryScalar | QueryTemporalValue | QueryRangeValue | QueryScalar[];\n\n// ---------------------------------------------------------------------------\n// Predicate nodes (discriminated on `kind`)\n// ---------------------------------------------------------------------------\n\nexport interface QueryAnd {\n kind: 'and';\n children: QueryPredicate[];\n}\n\nexport interface QueryOr {\n kind: 'or';\n children: QueryPredicate[];\n}\n\nexport interface QueryNot {\n kind: 'not';\n child: QueryPredicate;\n}\n\n/**\n * Explicit \"no filter\" — matches every row the caller is authorized to see,\n * compiling to SQL TRUE.\n *\n * Send this instead of omitting `where` when the filter bar is empty: an\n * omitted predicate lets legacy server-side defaults (e.g. the chats list's\n * implicit `archived == false`) apply invisibly. `and`/`or` need at least one\n * child, so an empty group is not a legal stand-in. It references no field, so\n * it needs no scope and cannot reach a scope-gated column.\n */\nexport interface QueryMatchAll {\n kind: 'all';\n}\n\nexport interface QueryCompare {\n kind: 'compare';\n field: string;\n op: QueryComparisonOp;\n value?: QueryValue | null;\n}\n\nexport interface QueryRecordSelection {\n field: string;\n criterion: 'newest' | 'oldest' | 'highest' | 'lowest' | 'earliest' | 'latest' | 'true' | 'false';\n}\n\n/**\n * Correlated record predicate (#16104): all conditions in `where` must\n * match the SAME DataRecord row.\n *\n * - any → EXISTS(match)\n * - none → NOT EXISTS(match), members with no records DO match\n * - noneWithRecord → NOT EXISTS(match) AND has at least one record\n */\nexport interface QueryRecordMatch {\n kind: 'recordMatch';\n dataType: number | string;\n mode?: 'any' | 'none' | 'noneWithRecord';\n where?: QueryPredicate | null;\n selection?: QueryRecordSelection | null;\n}\n\n/**\n * Correlated EXISTS over a named related-entity relation (the RecordMatch\n * pattern generalized): all conditions in `where` apply to the SAME related\n * row. Relations and their sub-fields come from `QueryFieldsResponse.relations`\n * (e.g. member `workflowEntries` → entry.workflowId / entry.status /\n * entry.enteredAt; `calendarEvents` → event.calendarId / event.typeId /\n * event.startTime).\n *\n * - any → EXISTS(match)\n * - none → NOT EXISTS(match), members with no related rows DO match\n */\nexport interface QueryRelationMatch {\n kind: 'relationMatch';\n relation: string;\n mode?: 'any' | 'none';\n where?: QueryPredicate | null;\n}\n\nexport interface QueryAggregatePredicate {\n kind: 'aggregate';\n source: string;\n /** Narrows a parameterized source (e.g. workflowEntries → workflow ids). */\n sourceIds?: number[] | null;\n metric?: 'count' | 'max';\n op: QueryAggregateOp;\n /** metric=max also accepts an ISO datetime string. */\n value: number | string | QueryNowValue | QueryDaysAgoValue | QueryDaysFromNowValue;\n windowDays?: number | null;\n /** Mutually exclusive with windowDays. */\n windowHours?: number | null;\n emptyPolicy?: 'include' | 'exclude';\n}\n\nexport interface QuerySubQueryRef {\n kind: 'subquery';\n entity: 'member';\n link: string;\n negate?: boolean;\n where?: QueryPredicate | null;\n}\n\nexport interface QuerySavedFilterRef {\n kind: 'savedFilterRef';\n filterType?: 'member';\n filterIds: number[];\n combine?: 'union' | 'intersect';\n}\n\nexport type QueryPredicate =\n | QueryAnd\n | QueryOr\n | QueryNot\n | QueryMatchAll\n | QueryCompare\n | QueryRecordMatch\n | QueryRelationMatch\n | QueryAggregatePredicate\n | QuerySubQueryRef\n | QuerySavedFilterRef;\n\n// ---------------------------------------------------------------------------\n// Query envelope\n// ---------------------------------------------------------------------------\n\nexport interface QuerySortKey {\n field: string;\n dir?: 'asc' | 'desc';\n}\n\nexport interface QueryGroupBy {\n field: string;\n bucket?: 'day' | 'week' | 'month' | null;\n alias?: string | null;\n}\n\nexport interface QueryMetric {\n fn: 'count' | 'countDistinct' | 'sum' | 'avg' | 'min' | 'max';\n of?: string | null;\n as?: string;\n}\n\nexport interface QueryAggregateSpec {\n groupBy?: QueryGroupBy[];\n metrics: QueryMetric[];\n limit?: number;\n}\n\nexport interface QueryIR {\n entity: QueryEntityType;\n dataType?: number | string | null;\n where?: QueryPredicate | null;\n select?: string[] | null;\n sort?: QuerySortKey[] | null;\n limit: number;\n cursor?: string | null;\n aggregate?: QueryAggregateSpec | null;\n includeArchived?: boolean;\n}\n\nexport type QueryRunMode = 'rows' | 'count' | 'aggregate';\n\n// ---------------------------------------------------------------------------\n// API request / response models\n// ---------------------------------------------------------------------------\n\nexport interface RunQueryRequest {\n query: QueryIR;\n mode?: QueryRunMode | null;\n}\n\nexport interface QueryCostInfo {\n score: number;\n budget: number;\n}\n\nexport interface ValidateQueryResponse {\n valid: boolean;\n cost: QueryCostInfo;\n warnings: string[];\n errors: string[];\n}\n\nexport interface RunQueryResponse {\n mode: string;\n items?: Record<string, unknown>[] | null;\n nextCursor?: string | null;\n count?: number | null;\n rows?: Record<string, unknown>[] | null;\n warnings: string[];\n cost?: QueryCostInfo | null;\n}\n\n// ---------------------------------------------------------------------------\n// Field-namespace introspection (drives the builder UI)\n// ---------------------------------------------------------------------------\n\n/** A labeled choice for a field whose raw values are ids/codes. */\nexport interface QueryEnumOption {\n value: string | number;\n label: string;\n /** Display color (bare 6-digit hex, as stored on MemberLabel), if any. */\n color?: string | null;\n}\n\nexport interface QueryFieldInfo {\n path: string;\n type: string;\n operators: string[];\n sortable: boolean;\n selectable: boolean;\n enumValues?: unknown[] | null;\n /**\n * Labeled value options ({value, label}) for fields whose raw values are\n * meaningless to humans (label/role ids). Value stored in the IR is\n * `value`; the UI shows `label`.\n */\n enumOptions?: QueryEnumOption[] | null;\n /** Human picker label when the path tail is misleading (e.g. \"labelId\"). */\n displayName?: string | null;\n /**\n * Semantic group from the registry (profile/contact/notifications/\n * communications/workflows/calendar) — drives builder palette grouping.\n * Optional for older API versions; null = uncategorized.\n */\n category?: string | null;\n}\n\nexport interface QueryRecordFieldInfo {\n slug: string;\n name: string;\n type: string;\n operators: string[];\n enumValues?: unknown[] | null;\n}\n\nexport interface QueryDataTypeInfo {\n id: number;\n slug: string;\n name: string;\n isCollection: boolean;\n recordFields: QueryRecordFieldInfo[];\n}\n\nexport interface QueryFieldsResponse {\n entities: Record<string, QueryFieldInfo[]>;\n aggregateSources: Record<string, string[]>;\n dataTypes: QueryDataTypeInfo[];\n recordSystemFields: QueryFieldInfo[];\n /**\n * RelationMatch palette: entity → relation name → the relation's\n * queryable sub-fields (e.g. member.workflowEntries → entry.workflowId,\n * entry.status, entry.enteredAt). Same raw-ID hiding convention as\n * `entities`. Optional for older API versions.\n */\n relations?: Record<string, Record<string, QueryFieldInfo[]>>;\n /**\n * entity → aggregate source → semantic category. Only categorized sources\n * appear; uncategorized sources are internal (legacy-adapter parity) and\n * should not be offered in builder palettes. Optional for older API\n * versions.\n */\n aggregateSourceCategories?: Record<string, Record<string, string>>;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: channel_message\n */\n\nimport type { ChannelMessagesUnavailableReason } from './chat';\n\n/**\n * Which way the message crossed the wire, from the workspace's point of view.\n */\nexport type ChannelMessageDirection = typeof ChannelMessageDirection[keyof typeof ChannelMessageDirection];\n\n\nexport const ChannelMessageDirection = {\n inbound: 'inbound',\n outbound: 'outbound',\n} as const;\n\n/**\n * One message on this chat's channel that is not part of this chat.\n */\nexport interface ChannelMessageResponse {\n source: ChannelMessageSource;\n /** The chat this message belongs to. Always null for `sms_record` items, which belong to no chat. Present only for chats the caller is authorized to read. */\n sourceChatId?: number | null;\n /** `messages.id`. Null for `sms_record` items. */\n messageId?: number | null;\n /** `sms_messages.id`. Always set for `sms_record` items; also set on an `other_chat` item whose Message is linked to a channel record. */\n smsId?: number | null;\n direction: ChannelMessageDirection;\n /** Message content. PHI — do not log. */\n body: string;\n createdAt: string;\n /** Agent or workflow name that sent an outbound message, when known. Never a member name. */\n senderLabel?: string | null;\n}\n\n/**\n * Where a ghost message came from.\n *\n * The two are not cosmetic variants: ``sms_record`` has no chat behind it at\n * all (a one-off automated send, ``PersistencePolicy.SMS_ONLY``) and so can\n * never be linked to, while ``other_chat`` is a real chat the caller has been\n * authorized to read and can navigate to via ``sourceChatId``.\n */\nexport type ChannelMessageSource = typeof ChannelMessageSource[keyof typeof ChannelMessageSource];\n\n\nexport const ChannelMessageSource = {\n sms_record: 'sms_record',\n other_chat: 'other_chat',\n} as const;\n\n/**\n * A bounded page of ghost messages, oldest first.\n *\n * Not a ``PaginatedResponse``: there is no meaningful total here. The feed is\n * two heterogeneous sources merged inside a time window, so counting it would\n * mean running both queries unbounded — the exact thing the window exists to\n * prevent. Callers page backwards with ``before``.\n */\nexport interface ChannelMessagesResponse {\n items: ChannelMessageResponse[];\n /** More items exist inside the requested window, older than the earliest returned. Page backwards by passing that item's `createdAt` as `before`. */\n hasMore: boolean;\n /** Set only when `items` is empty *by construction* rather than because nothing was found: the chat's channel is not single-stream, it has no workspace phone number, or its member has no phone on file. Null on an ordinary empty result. */\n reason?: ChannelMessagesUnavailableReason | null;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: chat\n */\n\nimport type { AppContext } from './app_context';\nimport type { MultimodalCapabilities } from './generated';\n\n/**\n * Response to an access grant interrupt (connect_service, credential_access, data_access).\n */\nexport interface AccessGrantDecision {\n decision: AccessGrantDecisionDecision;\n interruptId?: string | null;\n context?: AppContext | null;\n}\n\nexport type AccessGrantDecisionDecision = typeof AccessGrantDecisionDecision[keyof typeof AccessGrantDecisionDecision];\n\n\nexport const AccessGrantDecisionDecision = {\n approve: 'approve',\n approve_always: 'approve_always',\n reject: 'reject',\n} as const;\n\n/**\n * Request model for adding a participant to a chat.\n */\nexport interface AddChatParticipantRequest {\n memberId: number;\n role?: AddChatParticipantRequestRole;\n}\n\nexport type AddChatParticipantRequestRole = typeof AddChatParticipantRequestRole[keyof typeof AddChatParticipantRequestRole];\n\n\nexport const AddChatParticipantRequestRole = {\n user: 'user',\n assistant: 'assistant',\n contributor: 'contributor',\n supervisor: 'supervisor',\n} as const;\n\n/**\n * Chat detail with paginated messages for admin review.\n */\nexport interface AdminChatDetailResponse {\n chat: AdminChatResponse;\n messages: PaginatedResponseOpenAIMessageResponse;\n}\n\n/**\n * Lightweight chat summary for admin listing.\n */\nexport interface AdminChatResponse {\n id: number;\n uuid: string;\n title: string | null;\n summary: string | null;\n channel: string;\n chatType: string;\n paused: boolean;\n archived: boolean;\n needsResponse: boolean;\n isTest: boolean;\n messageCount: number;\n createdAt: string;\n updatedAt: string;\n lastMessageReceivedAt: string | null;\n ownerName: string | null;\n ownerMemberId: number | null;\n participants: ChatParticipantResponse[];\n}\n\n/**\n * Why a chat yielded no channel messages, as a closed vocabulary.\n *\n * A typed reason rather than a 4xx, because none of these are caller\n * mistakes: they are properties of the chat that the caller could not have\n * known before asking. Any chat page may issue this read, so answering \"this\n * chat has no parallel wire\" with an error would make a perfectly normal\n * web-chat or voice chat surface as a failure — in error logs, in retry\n * counters, and in whatever the client does with a non-2xx.\n *\n * **This is not a claim that the channel set lives only on the server.** The\n * UI keeps its own copy in ``src/components/chat/channel-ghosts/single-channel-chat.ts``\n * and uses it to decide whether to fetch at all, so in practice this branch is\n * reached only when the two sets disagree. That coupling is real and worth\n * stating plainly: adding a channel to :data:`SINGLE_CHANNEL_CHAT_CHANNELS`\n * changes nothing user-visible until the client set is widened too, and\n * removing one here turns a chat the client still queries into an\n * empty-with-reason result rather than an error. Keep the two in sync\n * deliberately; this enum is what makes the mismatch legible instead of\n * silent.\n */\nexport type ChannelMessagesUnavailableReason = typeof ChannelMessagesUnavailableReason[keyof typeof ChannelMessagesUnavailableReason];\n\n\nexport const ChannelMessagesUnavailableReason = {\n not_single_channel: 'not_single_channel',\n no_phone_number: 'no_phone_number',\n no_counterpart_phone: 'no_counterpart_phone',\n} as const;\n\n/**\n * Response model for chat assignment tasks.\n */\nexport interface ChatAssignmentTaskResponse {\n id: number;\n name: string;\n isCurrent: boolean;\n}\n\n/**\n * Extended chat completion request with app context.\n */\nexport interface ChatCompletionRequest {\n model?: string | null;\n messages?: ChatCompletionRequestMessagesItem[];\n context?: AppContext | null;\n resume?: HITLResponse | AccessGrantDecision | UIChoiceDecision | null;\n multimodal?: MultimodalCapabilities | null;\n interactionSessionId?: string | null;\n interactionTurnId?: string | null;\n}\n\nexport type ChatCompletionRequestMessagesItem = { [key: string]: unknown };\n\n/**\n * Response model for a chat filter.\n */\nexport interface ChatFilterResponse {\n id: number;\n uuid: string;\n name: string;\n description: string | null;\n pinned?: boolean | null;\n createdAt: string;\n updatedAt: string;\n rules: ChatFilterRuleResponse[];\n query?: ChatFilterResponseQuery;\n}\n\nexport type ChatFilterResponseQuery = { [key: string]: unknown } | null;\n\n/**\n * Response model for a chat filter rule.\n */\nexport interface ChatFilterRuleResponse {\n id: number;\n uuid: string;\n chatFilterId: number;\n objectType: string;\n filterType: string;\n objectIds?: number[] | null;\n query?: string | null;\n}\n\n/**\n * Pending HITL interrupt on a chat.\n *\n * Canonical API shape (camelCase) for ``GET /chats/:id`` and AG-UI\n * ``human_input_request`` events. Built from LangGraph ``interrupt()``\n * payloads via ``build_chat_interrupt_response``. Resume via\n * ``POST …/inference/hitl`` echoing ``interruptId`` (request body).\n */\nexport interface ChatInterruptResponse {\n type?: string | null;\n interruptId?: string | null;\n openuiMarkup?: string | null;\n description?: string | null;\n userPrompt?: string | null;\n guided?: ChatInterruptResponseGuided;\n specId?: number | null;\n specTitle?: string | null;\n specData?: ChatInterruptResponseSpecData;\n specStatus?: string | null;\n checkoutUrl?: string | null;\n productName?: string | null;\n price?: string | null;\n paymentComplete?: boolean | null;\n [key: string]: unknown;\n }\n\nexport type ChatInterruptResponseGuided = typeof ChatInterruptResponseGuided[keyof typeof ChatInterruptResponseGuided] | null;\n\n\nexport const ChatInterruptResponseGuided = {\n beat: 'beat',\n question: 'question',\n} as const;\n\nexport type ChatInterruptResponseSpecData = { [key: string]: unknown } | null;\n\n/**\n * Response model for chat label endpoints.\n */\nexport interface ChatLabelResponse {\n id: number;\n uuid: string;\n name: string;\n slug: string;\n color: string;\n description: string | null;\n}\n\n/**\n * Per-chat model provenance for override UI (assignment + legacy chats).\n *\n * Effective models mirror runtime (``get_agent_config``). Upstream is the\n * reset/inherit target: pinned workflow revision for assignment chats, else\n * resolved agent/revision defaults. ``*MatchesUpstream`` is true only when\n * both model id and nested config match — so voice/settings-only forks count.\n */\nexport interface ChatModelOverrideResponse {\n chatModel?: string | null;\n chatModelConfig?: ChatModelOverrideResponseChatModelConfig;\n realtimeModel?: string | null;\n realtimeModelConfig?: ChatModelOverrideResponseRealtimeModelConfig;\n upstreamChatModel?: string | null;\n upstreamChatModelConfig?: ChatModelOverrideResponseUpstreamChatModelConfig;\n upstreamRealtimeModel?: string | null;\n upstreamRealtimeModelConfig?: ChatModelOverrideResponseUpstreamRealtimeModelConfig;\n chatModelMatchesUpstream?: boolean;\n realtimeModelMatchesUpstream?: boolean;\n}\n\nexport type ChatModelOverrideResponseChatModelConfig = { [key: string]: unknown } | null;\n\nexport type ChatModelOverrideResponseRealtimeModelConfig = { [key: string]: unknown } | null;\n\nexport type ChatModelOverrideResponseUpstreamChatModelConfig = { [key: string]: unknown } | null;\n\nexport type ChatModelOverrideResponseUpstreamRealtimeModelConfig = { [key: string]: unknown } | null;\n\n/**\n * Reason recorded when a caller mutes a Chat.\n *\n * ``working`` means work is in progress; ``waiting_on_person`` means another\n * person or a later time is needed; ``resolved_elsewhere`` means no action is\n * due in this Chat; and ``not_mine`` means the Chat is outside the operator's\n * responsibility.\n */\nexport type ChatMuteReason = typeof ChatMuteReason[keyof typeof ChatMuteReason];\n\n\nexport const ChatMuteReason = {\n working: 'working',\n waiting_on_person: 'waiting_on_person',\n resolved_elsewhere: 'resolved_elsewhere',\n not_mine: 'not_mine',\n} as const;\n\n/**\n * Response model for chat mute update.\n *\n * Carries the decision the mute recorded (GRA-8353): the reason from the\n * closed vocabulary, whether it lapses on the member's next inbound, and\n * who muted when — so the UI can show \"muted by X for Y\" instead of a bare\n * boolean. ``muted`` stays the raw stored flag; lapse is a read-time\n * surfacing concern, not a write-time one.\n */\nexport interface ChatMuteUpdateResponse {\n id: number;\n muted: boolean;\n muteReason?: string | null;\n muteExpiresOnInbound?: boolean;\n mutedByMemberId?: number | null;\n mutedAt?: string | null;\n}\n\n/**\n * Response model for adding a participant to a chat.\n */\nexport interface ChatParticipantAddedResponse {\n success: boolean;\n message: string;\n participantId: number;\n}\n\n/**\n * Request model for chat participants.\n *\n * All participants are members (agents are members with member_type='agent').\n */\nexport interface ChatParticipantRequest {\n memberId?: number | null;\n additionalInstructions?: string | null;\n role: ChatParticipantRequestRole;\n}\n\nexport type ChatParticipantRequestRole = typeof ChatParticipantRequestRole[keyof typeof ChatParticipantRequestRole];\n\n\nexport const ChatParticipantRequestRole = {\n user: 'user',\n assistant: 'assistant',\n contributor: 'contributor',\n supervisor: 'supervisor',\n} as const;\n\nexport interface ChatParticipantResponse {\n name: string;\n additionalInstructions?: string | null;\n role: string;\n memberId?: number | null;\n memberType?: string | null;\n chatModel?: string | null;\n realtimeModel?: string | null;\n chatModelConfig?: ChatParticipantResponseChatModelConfig;\n realtimeModelConfig?: ChatParticipantResponseRealtimeModelConfig;\n}\n\nexport type ChatParticipantResponseChatModelConfig = { [key: string]: unknown } | null;\n\nexport type ChatParticipantResponseRealtimeModelConfig = { [key: string]: unknown } | null;\n\n/**\n * Response model for chat endpoints.\n */\nexport interface ChatResponse {\n id: number;\n uuid: string;\n archived: boolean;\n muted: boolean;\n muteReason?: string | null;\n muteExpiresOnInbound?: boolean;\n mutedByMemberId?: number | null;\n mutedAt?: string | null;\n channel: string;\n transport?: ChatResponseTransport;\n direction?: ChatResponseDirection;\n initiator?: ChatResponseInitiator;\n creationSource?: ChatResponseCreationSource;\n hasRealtimeInteraction?: boolean;\n activeInteractionMode?: ChatResponseActiveInteractionMode;\n chatType: string;\n paused: boolean;\n pausedAt: string | null;\n pausedReason: string | null;\n assignmentId: number | null;\n workflowId: number | null;\n workflowRevisionId?: number | null;\n currentTaskName?: string | null;\n fromMessageId: number | null;\n phoneNumberId: number | null;\n inboxId: number | null;\n siteId: number | null;\n folderId: number | null;\n createdAt: string;\n updatedAt: string;\n title: string | null;\n summary: string | null;\n summaryUpdatedAt: string | null;\n lastMessageReceivedAt: string | null;\n messageCount: number;\n participants: ChatParticipantResponse[];\n canSendAsAssistant: boolean;\n labels: ChatLabelResponse[];\n isTest: boolean;\n interrupt?: ChatInterruptResponse | null;\n initialMessageError?: string | null;\n}\n\nexport type ChatResponseActiveInteractionMode = typeof ChatResponseActiveInteractionMode[keyof typeof ChatResponseActiveInteractionMode] | null;\n\n\nexport const ChatResponseActiveInteractionMode = {\n text: 'text',\n push_to_talk: 'push_to_talk',\n realtime: 'realtime',\n} as const;\n\nexport type ChatResponseCreationSource = typeof ChatResponseCreationSource[keyof typeof ChatResponseCreationSource] | null;\n\n\nexport const ChatResponseCreationSource = {\n web_arrival: 'web_arrival',\n inbound_channel: 'inbound_channel',\n outbound_action: 'outbound_action',\n operator_create: 'operator_create',\n background_run: 'background_run',\n qualification_run: 'qualification_run',\n} as const;\n\nexport type ChatResponseDirection = typeof ChatResponseDirection[keyof typeof ChatResponseDirection];\n\n\nexport const ChatResponseDirection = {\n inbound: 'inbound',\n outbound: 'outbound',\n unknown: 'unknown',\n} as const;\n\nexport type ChatResponseInitiator = typeof ChatResponseInitiator[keyof typeof ChatResponseInitiator];\n\n\nexport const ChatResponseInitiator = {\n member: 'member',\n workspace: 'workspace',\n system: 'system',\n unknown: 'unknown',\n} as const;\n\nexport type ChatResponseTransport = typeof ChatResponseTransport[keyof typeof ChatResponseTransport];\n\n\nexport const ChatResponseTransport = {\n web: 'web',\n pstn: 'pstn',\n sms: 'sms',\n whatsapp: 'whatsapp',\n email: 'email',\n fax: 'fax',\n slack: 'slack',\n teams: 'teams',\n discord: 'discord',\n direct_message: 'direct_message',\n a2a: 'a2a',\n routine: 'routine',\n background: 'background',\n cli: 'cli',\n frame: 'frame',\n unknown: 'unknown',\n} as const;\n\n/**\n * Aggregated token usage for a chat.\n */\nexport interface ChatTokenUsageResponse {\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n cachedTokens?: number;\n audioInputTokens?: number;\n audioOutputTokens?: number;\n credits?: number;\n creditsRemaining?: number | null;\n extraUsageEnabled?: boolean | null;\n usageByModel?: ModelUsageResponse[];\n sttUsage?: VoiceUsageResponse[];\n ttsUsage?: VoiceUsageResponse[];\n voiceDurationSeconds?: number | null;\n creditsPerHour?: number | null;\n}\n\n/**\n * Create a new chat.\n */\nexport interface CreateChatRequest {\n channel: CreateChatRequestChannel;\n /** Deprecated browser surface alias; use interactionMode. */\n browserChannel?: CreateChatRequestBrowserChannel;\n /** How a browser Chat opens; does not change its stored channel. */\n interactionMode?: CreateChatRequestInteractionMode;\n chatType?: CreateChatRequestChatType;\n workflowId?: number | null;\n workflowUuid?: string | null;\n workflowRevisionId?: number | null;\n workflowRevisionUuid?: string | null;\n title?: string | null;\n phoneNumberId?: number | null;\n inboxId?: number | null;\n siteId?: number | null;\n memberId?: number | null;\n participants?: ChatParticipantRequest[];\n assistantKind?: CreateChatRequestAssistantKind;\n assistantEnabled?: boolean;\n assistantMemberId?: number | null;\n assistantName?: string | null;\n assistantChatModelId?: string | null;\n assistantChatModelConfig?: CreateChatRequestAssistantChatModelConfig;\n assistantRealtimeModelId?: string | null;\n assistantRealtimeModelConfig?: CreateChatRequestAssistantRealtimeModelConfig;\n isTest?: boolean;\n initialMessage?: string | null;\n}\n\nexport type CreateChatRequestAssistantChatModelConfig = { [key: string]: unknown } | null;\n\nexport type CreateChatRequestAssistantKind = typeof CreateChatRequestAssistantKind[keyof typeof CreateChatRequestAssistantKind] | null;\n\n\nexport const CreateChatRequestAssistantKind = {\n ai: 'ai',\n human: 'human',\n} as const;\n\nexport type CreateChatRequestAssistantRealtimeModelConfig = { [key: string]: unknown } | null;\n\n/**\n * Deprecated browser surface alias; use interactionMode.\n */\nexport type CreateChatRequestBrowserChannel = typeof CreateChatRequestBrowserChannel[keyof typeof CreateChatRequestBrowserChannel] | null;\n\n\nexport const CreateChatRequestBrowserChannel = {\n 'web-chat': 'web-chat',\n 'web-voice': 'web-voice',\n} as const;\n\nexport type CreateChatRequestChannel = typeof CreateChatRequestChannel[keyof typeof CreateChatRequestChannel];\n\n\nexport const CreateChatRequestChannel = {\n cli: 'cli',\n frame: 'frame',\n 'phone-sms': 'phone-sms',\n 'phone-voice': 'phone-voice',\n fax: 'fax',\n 'phone-whatsapp': 'phone-whatsapp',\n email: 'email',\n background: 'background',\n 'web-chat': 'web-chat',\n 'web-voice': 'web-voice',\n discord: 'discord',\n slack: 'slack',\n teams: 'teams',\n 'direct-message': 'direct-message',\n a2a: 'a2a',\n routine: 'routine',\n} as const;\n\nexport type CreateChatRequestChatType = typeof CreateChatRequestChatType[keyof typeof CreateChatRequestChatType];\n\n\nexport const CreateChatRequestChatType = {\n assignment: 'assignment',\n manager: 'manager',\n contributor: 'contributor',\n dm: 'dm',\n} as const;\n\n/**\n * How a browser Chat opens; does not change its stored channel.\n */\nexport type CreateChatRequestInteractionMode = typeof CreateChatRequestInteractionMode[keyof typeof CreateChatRequestInteractionMode] | null;\n\n\nexport const CreateChatRequestInteractionMode = {\n text: 'text',\n push_to_talk: 'push_to_talk',\n realtime: 'realtime',\n} as const;\n\n/**\n * Create-chat preflight: is an SMS conversation already live with this member?\n *\n * An SMS conversation with a member is a single stream — inbound SMS routes to\n * ONE current chat per (member phone, workspace phone) pair\n * (``get_current_chat_for_phone_and_target_member``) — so creating a new SMS\n * chat supersedes the existing one: from the next inbound message onwards the\n * old chat goes quiet. This endpoint lets the create-chat UI warn about that\n * before the operator commits.\n *\n * **PHI-safe by construction.** Status and timing only: no message content, no\n * phone numbers, no member names, and deliberately no chat title (titles are\n * auto-summarised from message content, so they ARE PHI).\n *\n * ``exists is False`` leaves every other field ``None`` — the caller should\n * branch on ``exists``, not on a null id.\n */\nexport interface CurrentSmsChatResponse {\n exists: boolean;\n chatId?: number | null;\n chatUuid?: string | null;\n chatType?: string | null;\n workflowName?: string | null;\n lastActivityAt?: string | null;\n needsResponse?: boolean | null;\n paused?: boolean | null;\n aiAnswering?: boolean | null;\n}\n\n/**\n * Request model for deleting a chat with audit reason.\n */\nexport interface DeleteChatRequest {\n /** Optional reason for deletion (logged for audit) */\n reason?: string | null;\n}\n\n/**\n * Request model for finding or creating a DM chat.\n */\nexport interface FindOrCreateDMChatRequest {\n memberId: number;\n}\n\n/**\n * Request model for generating chat summaries in bulk.\n */\nexport interface GenerateChatSummariesRequest {\n after_date?: string | null;\n only_without_summaries?: boolean;\n}\n\n/**\n * A single decision for a HITL request.\n */\nexport interface HITLDecision {\n type: string;\n editedAction?: HITLDecisionEditedAction;\n message?: string | null;\n}\n\nexport type HITLDecisionEditedAction = { [key: string]: unknown } | null;\n\n/**\n * Response to a HITL interrupt request.\n */\nexport interface HITLResponse {\n decisions: HITLDecision[];\n interruptId?: string | null;\n context?: AppContext | null;\n}\n\n/**\n * Selectable built-in Manager AI skill metadata.\n */\nexport interface ManagerSkillSummary {\n name: string;\n title: string;\n description: string;\n}\n\n/**\n * Skill catalogue for pre-Chat Manager composers (and Routine manager tasks).\n */\nexport interface ManagerSkillsResponse {\n items: ManagerSkillSummary[];\n}\n\n/**\n * Token usage for a single message.\n */\nexport interface MessageTokenUsageResponse {\n model: string;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n cachedTokens?: number;\n credits?: number;\n}\n\n/**\n * Token and credit usage for a specific model.\n */\nexport interface ModelUsageResponse {\n model: string;\n promptTokens?: number;\n completionTokens?: number;\n totalTokens: number;\n cachedTokens?: number;\n credits: number;\n multiplier: number;\n inputMultiplier?: number;\n outputMultiplier?: number;\n cachedMultiplier?: number;\n audioInputTokens?: number;\n audioOutputTokens?: number;\n}\n\n/**\n * Response model for OpenAI function tool calls.\n */\nexport interface OpenAIFunctionToolCall {\n id?: string;\n type?: string;\n function?: OpenAIFunctionToolCallFunction;\n}\n\nexport type OpenAIFunctionToolCallFunction = { [key: string]: unknown };\n\n/**\n * Response model for chat messages in OpenAI format.\n *\n * **Telling a human-sent assistant message from an AI one.** ``role`` no\n * longer answers this: the ``\"operator\"`` value was retired because a human\n * answering IS the assistant, and because an automated consent auto-reply\n * wrote that value too (see\n * ``docs/projects/active/operator-role-collapse.md``). The answer comes from\n * the sender, exactly as it does for participants:\n *\n * const sender = chat.participants.find(\n * (p) => p.role === 'assistant' && p.memberId === message.memberId\n * );\n * const sentByHuman = !!sender && sender.memberType !== 'agent';\n *\n * ``memberId`` is the message's owning member; a human take-over owns their\n * reply through their own ``role=\"assistant\"`` participant, so the lookup\n * hits a participant whose ``memberType`` is not ``\"agent\"``. The AI's turns\n * resolve either to the agent participant (``memberType === 'agent'``) or, on\n * a revision-backed chat whose assistant participant is a member-less\n * persona, to no assistant participant at all — both mean \"AI\", which is why\n * the default above is AI rather than human.\n */\nexport interface OpenAIMessageResponse {\n id?: string | null;\n uuid?: string | null;\n role?: string | null;\n content?: OpenAIMessageResponseContent;\n originalContent?: OpenAIMessageResponseOriginalContent;\n truncationReason?: string | null;\n truncatedAtMs?: number | null;\n sttMetadata?: SttMetadataResponse | null;\n tool_calls?: OpenAIFunctionToolCall[];\n tool_call_id?: string | null;\n suggestions?: string[] | null;\n created_at?: string | null;\n email_id?: number | null;\n inbox_id?: number | null;\n tokenUsage?: MessageTokenUsageResponse | null;\n memberId?: number | null;\n origin?: string | null;\n audience?: string | null;\n toolStatus?: string | null;\n isCanned?: boolean;\n childMessageCount?: number;\n parentMessageId?: string | null;\n taskId?: number | null;\n interactionSessionId?: string | null;\n interactionMode?: OpenAIMessageResponseInteractionMode;\n interactionTurnId?: string | null;\n audioFileUuid?: string | null;\n audioMetadata?: OpenAIMessageResponseAudioMetadata;\n smsDeliveryStatus?: string | null;\n smsDeliveryErrorCode?: string | null;\n smsDeliveryUpdatedAt?: string | null;\n smsDeliveryFailureReason?: string | null;\n userRating?: number | null;\n userRatingComment?: string | null;\n}\n\nexport type OpenAIMessageResponseAudioMetadata = { [key: string]: unknown } | null;\n\nexport type OpenAIMessageResponseContent = string | { [key: string]: unknown }[] | null;\n\nexport type OpenAIMessageResponseInteractionMode = typeof OpenAIMessageResponseInteractionMode[keyof typeof OpenAIMessageResponseInteractionMode] | null;\n\n\nexport const OpenAIMessageResponseInteractionMode = {\n text: 'text',\n push_to_talk: 'push_to_talk',\n realtime: 'realtime',\n} as const;\n\nexport type OpenAIMessageResponseOriginalContent = string | { [key: string]: unknown }[] | null;\n\n/**\n * Request model for initiating outbound calls.\n */\nexport interface OutboundCallRequest {\n phoneNumberId: number;\n chatId: number;\n}\n\nexport interface PaginatedResponseOpenAIMessageResponse {\n items: OpenAIMessageResponse[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n}\n\n/**\n * Request model for rating a chat message.\n */\nexport interface RateMessageRequest {\n rating: number;\n comment?: string | null;\n}\n\n/**\n * Callbacks for one chat.\n */\nexport interface ScheduledCallbackListResponse {\n callbacks: ScheduledCallbackResponse[];\n}\n\n/**\n * One scheduled follow-up on a chat.\n */\nexport interface ScheduledCallbackResponse {\n id: number;\n uuid: string;\n chatId: number;\n memberId: number;\n targetChannel?: string | null;\n reason?: string | null;\n scheduledTime: string;\n status: string;\n statusDetail?: string | null;\n createdChatId?: number | null;\n createdAt: string;\n completedAt?: string | null;\n}\n\n/**\n * Request model for sending a message as the assistant.\n */\nexport interface SendAssistantMessageRequest {\n message: string;\n tool_calls?: SendAssistantMessageRequestToolCalls;\n}\n\nexport type SendAssistantMessageRequestToolCalls = { [key: string]: unknown }[] | null;\n\n/**\n * Request model for sending a user message in a chat.\n */\nexport interface SendUserMessageRequest {\n content: string;\n}\n\n/**\n * Response model for the agent's loaded skills state.\n *\n * Sent as a state.SkillsResponse custom event to sync loaded skills to the client.\n *\n * Attributes:\n * loadedSkills: Skills that are currently loaded (prompts injected into context)\n * revealedSkills: Skills that are visible but not yet loaded\n * enabledToolkitTools: Toolkit tool URIs/names selected for this Manager chat\n */\nexport interface SkillsResponse {\n loadedSkills?: string[];\n revealedSkills?: string[];\n enabledToolkitTools?: string[];\n}\n\n/**\n * Per-turn STT confidence for a voice user turn (#21973).\n *\n * ``extra=\"allow\"`` so a producer that adds a field does not break\n * existing clients before the SDK catches up; ``protected_namespaces``\n * is cleared because the provider key really is called ``model``.\n */\nexport interface SttMetadataResponse {\n model?: string | null;\n eotConfidence?: number | null;\n min?: number | null;\n mean?: number | null;\n words?: SttWordConfidenceResponse[];\n [key: string]: unknown;\n }\n\n/**\n * One transcribed word and how sure the recognizer was about it.\n *\n * Compact keys mirror the stored JSONB (see\n * ``lib.voice.stt_confidence.to_stt_metadata``) — they are per-word on\n * every voice turn, so the shortening is deliberate. ``s``/``e`` are\n * absent on self-hosted Flux, which returns no word timings at all.\n */\nexport interface SttWordConfidenceResponse {\n w: string;\n c: number;\n s?: number | null;\n e?: number | null;\n [key: string]: unknown;\n }\n\n/**\n * Response model for a single todo item.\n */\nexport interface TodoItemResponse {\n id: string;\n content: string;\n status: string;\n notes?: string | null;\n}\n\n/**\n * Response model for the agent's todo list state.\n *\n * Sent as a state.TodosResponse custom event to sync todos to the client.\n */\nexport interface TodosResponse {\n todos?: TodoItemResponse[];\n}\n\n/**\n * Response to a render_ui / present_choice_list interrupt.\n */\nexport interface UIChoiceDecision {\n chosenValue: string;\n interruptId?: string | null;\n context?: AppContext | null;\n}\n\n/**\n * Update an existing chat's per-chat model snapshot from the Chat sidebar.\n *\n * Public API is camelCase. Every field is optional: only fields explicitly\n * present in the request (tracked via ``model_fields_set``) are touched, so a\n * caller can give an old chat voice by sending ``realtimeModelId`` alone.\n *\n * Per-model semantics (applied by ``apply_chat_model_override``):\n * - a concrete, non-empty id → *pin* that model (and its paired config) on the\n * chat's snapshot;\n * - an empty string / null id → *reset* that model to the agent's current\n * default (re-snapshot from the live agent/workflow config). Snapshot\n * semantics stay pure — there is no read-time fallback (PR #19699), so\n * \"inherit\" is implemented as an explicit re-snapshot at write time.\n */\nexport interface UpdateChatModelOverrideRequest {\n chatModelId?: string | null;\n chatModelConfig?: UpdateChatModelOverrideRequestChatModelConfig;\n realtimeModelId?: string | null;\n realtimeModelConfig?: UpdateChatModelOverrideRequestRealtimeModelConfig;\n}\n\nexport type UpdateChatModelOverrideRequestChatModelConfig = { [key: string]: unknown } | null;\n\nexport type UpdateChatModelOverrideRequestRealtimeModelConfig = { [key: string]: unknown } | null;\n\n/**\n * Request model for updating chat mute status.\n *\n * Muting REQUIRES a reason (GRA-8353): an anonymous mute is exactly the\n * shape that made ``needs_response`` unmaintainable, so the closed\n * vocabulary is not optional. ``muteExpiresOnInbound`` defaults to True —\n * the conditional \"until the member replies again\" mute is the default\n * offered, because a permanent mute is how a conversation gets silently\n * lost. Unmuting ignores both fields; the service clears them.\n */\nexport interface UpdateChatMuteRequest {\n muted: boolean;\n muteReason?: ChatMuteReason | null;\n muteExpiresOnInbound?: boolean;\n}\n\n/**\n * Update a chat.\n */\nexport interface UpdateChatRequest {\n title?: string | null;\n assignmentId?: number | null;\n phoneNumberId?: number | null;\n inboxId?: number | null;\n paused?: boolean | null;\n labelIds?: number[] | null;\n}\n\n/**\n * STT or TTS usage for a specific model.\n */\nexport interface VoiceUsageResponse {\n model: string;\n credits: number;\n multiplier: number;\n durationSeconds?: number | null;\n characterCount?: number | null;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: ehr_writeback\n */\n\n\n/**\n * Cursor page of write-back outcomes for one Chat, newest first.\n *\n * ``retentionDays`` is the execution store's TTL. The panel states it so an\n * operator reads an empty older history as \"outside the retention window\",\n * not as \"eCW was never called\".\n */\nexport interface EhrWritebackOutcomeListResponse {\n items: EhrWritebackOutcomeResponse[];\n nextCursor?: string | null;\n hasMore: boolean;\n pageSize: number;\n retentionDays: number;\n}\n\n/**\n * One eCW write-back attempt as the Chat surface sees it.\n */\nexport interface EhrWritebackOutcomeResponse {\n status: EhrWritebackOutcomeResponseStatus;\n executionStatus: EhrWritebackOutcomeResponseExecutionStatus;\n provider: string;\n operation: string;\n attemptId: string;\n sourceEventType?: string | null;\n sourceEventRuleId?: number | null;\n connectionId?: number | null;\n memberId?: number | null;\n chatId: number;\n chatUrl: string;\n workflowId?: number | null;\n channel?: string | null;\n remoteEncounterId?: string | null;\n outcomeCode?: string | null;\n createdAt: string;\n completedAt?: string | null;\n}\n\nexport type EhrWritebackOutcomeResponseExecutionStatus = typeof EhrWritebackOutcomeResponseExecutionStatus[keyof typeof EhrWritebackOutcomeResponseExecutionStatus];\n\n\nexport const EhrWritebackOutcomeResponseExecutionStatus = {\n success: 'success',\n skipped: 'skipped',\n failed: 'failed',\n} as const;\n\nexport type EhrWritebackOutcomeResponseStatus = typeof EhrWritebackOutcomeResponseStatus[keyof typeof EhrWritebackOutcomeResponseStatus];\n\n\nexport const EhrWritebackOutcomeResponseStatus = {\n accepted: 'accepted',\n skipped: 'skipped',\n failed: 'failed',\n} as const;\n","// Chat-related types.\n// Server response shapes are generated from Pydantic via emit_openapi.py → Orval.\n// Client-only shapes (forms, local state, rendering helpers, token usage view\n// models, HITL interrupt shapes, admin list shapes, filter UI types, etc.)\n// are defined below.\n\n// ===== GENERATED SERVER TYPES =====\n\nimport type { QueryPredicate } from './query-engine-types';\n\nexport type {\n AdminChatDetailResponse,\n AdminChatDetailResponse as AdminChatDetail,\n AdminChatResponse,\n AdminChatResponse as AdminChat,\n ChatFilterResponse,\n ChatFilterResponse as ChatFilter,\n ChatFilterRuleResponse,\n ChatFilterRuleResponse as ChatFilterRule,\n ChatInterruptResponse,\n ChatLabelResponse,\n ChatLabelResponse as ChatLabel,\n ChatModelOverrideResponse,\n ChatModelOverrideResponse as ChatModelOverride,\n ChatParticipantResponse,\n ChatParticipantResponse as ChatParticipant,\n ChatResponse,\n ChatResponse as Chat,\n // Create-chat preflight: the live SMS chat a new one would supersede.\n // Status and timing only — deliberately no message content, and no title\n // (titles are auto-summarised from message content, so they ARE PHI).\n CurrentSmsChatResponse,\n UpdateChatRequest,\n UpdateChatModelOverrideRequest,\n ChatMuteUpdateResponse,\n ChatTokenUsageResponse,\n ChatTokenUsageResponse as ChatTokenUsage,\n MessageTokenUsageResponse,\n MessageTokenUsageResponse as MessageTokenUsage,\n ManagerSkillsResponse,\n ManagerSkillSummary,\n ModelUsageResponse,\n ModelUsageResponse as ModelUsage,\n ScheduledCallbackListResponse,\n ScheduledCallbackResponse,\n ScheduledCallbackResponse as ScheduledCallback,\n SkillsResponse,\n TodoItemResponse,\n TodoItemResponse as TodoItem,\n TodosResponse,\n VoiceUsageResponse,\n VoiceUsageResponse as VoiceModelUsage,\n} from './generated/chat';\n\n// Channel messages: the rest of a single-channel chat's phone line — other\n// chats' messages and chat-less automated sends — rendered ghosted in the\n// transcript. Content is PHI; the payload is never logged.\nexport type {\n ChannelMessageResponse,\n ChannelMessageResponse as ChannelMessage,\n ChannelMessagesResponse,\n} from './generated/channel_message';\nexport { ChannelMessageDirection, ChannelMessageSource } from './generated/channel_message';\nexport { ChannelMessagesUnavailableReason } from './generated/chat';\n// Mute decision vocabulary. The const carries both the runtime values and the\n// `ChatMuteReason` type; the hook layer narrows `muteReason` to it so an\n// arbitrary string cannot reach the mute endpoint.\nexport { ChatMuteReason } from './generated/chat';\n\n// eCW telephonic-encounter write-back outcomes, shown on the Chat that\n// triggered them. IDs and closed-vocabulary codes only — never note body,\n// summary, chart text, or a provider message (see lib/context/ehr.py).\nexport type {\n EhrWritebackOutcomeListResponse,\n EhrWritebackOutcomeResponse,\n} from './generated/ehr_writeback';\n// Orval emits the status vocabulary as a const object PLUS a type of the same\n// name, so this is a value export; the UI switches on it for badge copy.\nexport { EhrWritebackOutcomeResponseStatus } from './generated/ehr_writeback';\n\n// Local import for use in field type annotations\nimport type { ChatResponse, MessageTokenUsageResponse } from './generated/chat';\n\nexport type {\n CreateInteractionSessionRequest,\n InteractionSessionResponse,\n TransitionInteractionSessionRequest,\n} from './generated/interaction_session';\nexport type InteractionMode =\n import('./generated/interaction_session').InteractionSessionResponse['mode'];\n\n// ===== CLIENT-ONLY SURFACE =====\n// Forms, local UI state, composer helpers, message rendering, token usage\n// view models, HITL/interrupt shapes, and admin list query options.\n\nimport type { ChatType } from '../constants/chat-types';\nimport type { Channel, ChatCompletionError } from './communication-types';\nimport type { ChatSortField, SortOrder } from './sort-types';\n\n// Chat list UI state\nexport interface ChatState {\n items: ChatResponse[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n sortBy: ChatSortField;\n sortOrder: SortOrder;\n}\n\n// Todo / skill streaming state (AG-UI)\nexport type TodoStatus = 'pending' | 'in_progress' | 'completed' | 'blocked';\n\nexport interface LoadedSkill {\n name: string;\n}\n\nexport interface SkillsState {\n loaded_skills: string[];\n revealed_skills: string[];\n /** Toolkit tool URIs/names enabled for this Manager chat (composer selection). */\n enabled_toolkit_tools?: string[];\n}\n\n// Chat label form (client ergonomics)\nexport interface ChatLabelFormData {\n name: string;\n slug?: string;\n description?: string | null;\n color: string;\n}\n\n// Chat create/update form (the big one used by the composer)\nexport interface ChatFormData {\n id?: number;\n title?: string;\n channel: string;\n chatType?: string;\n workflowId?: number | null;\n workflowUuid?: string | null;\n workflowRevisionId?: number | null;\n workflowRevisionUuid?: string | null;\n phoneNumberId?: number | null;\n inboxId?: number | null;\n siteId?: number | null;\n /**\n * Browser surface that started a web chat. The Chat still persists as\n * `web-chat`; this lets workflow greeting selection distinguish browser\n * voice from browser text when an author configured an override.\n */\n browserChannel?: 'web-chat' | 'web-voice' | null;\n /** How a browser Chat opens. Prefer this over browserChannel. */\n interactionMode?: InteractionMode | null;\n memberId?: number | null;\n participants?: ChatParticipantFormData[];\n /**\n * Who answers this chat. The explicit form of the intent `agentEnabled` used\n * to encode: a boolean cannot tell \"this chat has no AI at all\" (`dm`) apart\n * from \"this chat's AI is suspended while a person takes a shift\"\n * (`assignment` answered by a human), and the server derives `paused` from\n * exactly that difference. Prefer this over `agentEnabled`.\n */\n assistantKind?: 'ai' | 'human';\n /**\n * The chat's user participant, stated explicitly. `memberId` remains the\n * wire field the server reads; this names the same member without the\n * \"…unless it's the caller\" caveat.\n */\n userMemberId?: number | null;\n /** @deprecated Send `assistantKind`. Accepted as an alias: false ⇒ 'human'. */\n agentEnabled?: boolean;\n /** The member acting as assistant. Set iff `assistantKind` is `'human'`. */\n assistantMemberId?: number | null;\n /** Per-chat display-name fork; null/omitted uses the Workflow revision. */\n assistantName?: string | null;\n assistantChatModelId?: string | null;\n assistantChatModelConfig?: Record<string, unknown> | null;\n assistantRealtimeModelId?: string | null;\n assistantRealtimeModelConfig?: Record<string, unknown> | null;\n /** @deprecated Use assistantMemberId. Kept as a client-side alias. */\n agentMemberId?: number | null;\n paused?: boolean;\n muted?: boolean;\n labelIds?: number[];\n /**\n * Assert that this chat is a test chat. **Not authoritative.**\n *\n * The server derives `isTest` from the counterparty member's provenance —\n * the member must be a TEST member, or an anonymous member created by a test\n * run. Sending `true` for an ordinary identified member is rejected with\n * HTTP 400 and the stable code `test_provenance_required`; sending `false`\n * (or omitting it) does not make a test member's chat live.\n *\n * To create a test chat, create or select a test member first.\n */\n isTest?: boolean;\n /**\n * Optional human-typed initial SMS/email message body. Treated as PHI:\n * never log it client-side beyond the textarea state. Empty/whitespace-only\n * values are dropped before sending.\n */\n initialMessage?: string | null;\n}\n\nexport interface ChatParticipantFormData {\n memberId: number;\n role?: string;\n additionalInstructions?: string | undefined;\n}\n\n/** Input for creating a workflow assignment chat that places an outbound PSTN call. */\nexport interface CreatePhoneVoiceOutboundChatInput {\n memberId: number;\n workflowId: number;\n phoneNumberId: number;\n title?: string;\n /** Defaults to `assignment`. */\n chatType?: string;\n}\n\n// Participant types for rendering / composer (discriminated union kept for UI\n// convenience). The role set is `user | assistant | contributor | supervisor`;\n// there is no `operator` PARTICIPANT — a human taking a chat over is written as\n// the assistant participant, distinguished by `memberType !== 'agent'`.\n// `MessageRole` below has no `operator` value either, for the same reason.\nexport interface HumanChatParticipant {\n name: string;\n role: 'user';\n memberId: number;\n}\n\nexport interface AgentChatParticipant {\n name: string;\n role: 'assistant';\n /** Null for a revision-backed assistant, which has no Member row. */\n memberId?: number | null;\n chatModel?: string;\n realtimeModel?: string;\n}\n\nexport interface ContributorChatParticipant {\n name: string;\n role: 'contributor';\n memberId: number;\n additionalInstructions?: string;\n}\n\nexport interface SupervisorChatParticipant {\n name: string;\n role: 'supervisor';\n memberId: number;\n}\n\n// Tool / function calling (client rendering)\nexport interface FunctionTool {\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters: Record<string, unknown>;\n };\n}\n\nexport interface ToolCallFunction {\n name: string;\n arguments: string;\n}\n\nexport interface ToolCall {\n id: string;\n type: 'function';\n function: ToolCallFunction;\n}\n\nexport interface ToolResult {\n tool_call_id: string;\n output:\n | string\n | {\n type: string;\n data: unknown;\n };\n}\n\n// Message content parts (multimodal)\nexport interface TextContent {\n type: 'text';\n text: string;\n}\n\nexport interface ImageUrlContent {\n type: 'image_url';\n image_url: {\n url: string;\n detail?: 'auto' | 'low' | 'high';\n };\n}\n\nexport type MessageContentPart = TextContent | ImageUrlContent;\n\n// There is no `operator` message role. A human operator's reply is a normal\n// ASSISTANT message whose participant/owner is that human; the human-vs-AI\n// distinction comes from the participant's `memberType`, never from a role\n// string. `error` is a client-side pseudo-role for locally rendered failures.\nexport type MessageRole = 'user' | 'assistant' | 'system' | 'tool' | 'function' | 'error';\n\nexport type TruncationReason = 'barge_in' | 'client_interrupt' | 'user_cancel' | 'error';\n\n// Twilio SMS delivery lifecycle states surfaced through OpenAIMessageResponse.\n// `failed` and `undelivered` are the two terminal-failure states that callers\n// (e.g. UnifiedChatMessageItem, SMSDeliveryStatusBadge) need to discriminate\n// to choose between the prominent failure-reason render and the quiet glyph.\nexport type SMSDeliveryStatus =\n 'queued' | 'sending' | 'sent' | 'delivered' | 'undelivered' | 'failed';\n\nexport type SMSDeliveryFailureStatus = Extract<SMSDeliveryStatus, 'failed' | 'undelivered'>;\n\nexport const SMS_DELIVERY_FAILURE_STATUSES: ReadonlySet<SMSDeliveryFailureStatus> = new Set([\n 'failed',\n 'undelivered',\n]);\n\nexport function isSMSDeliveryFailureStatus(\n status: string | null | undefined\n): status is SMSDeliveryFailureStatus {\n return status != null && SMS_DELIVERY_FAILURE_STATUSES.has(status as SMSDeliveryFailureStatus);\n}\n\n// ADR-11 provenance. `role` mixes OpenAI request vocabulary with Gravity kinds\n// and cannot express WHO authored a message, so the backend added `origin` +\n// `audience` (`MessageOrigin` / `MessageAudience` in `lib/models/common.py`).\n// Both are null on rows written before the columns existed — clients fall back\n// to `role`.\nexport type MessageOrigin =\n | 'member'\n | 'agent'\n | 'operator'\n | 'tool'\n | 'workflow'\n | 'engine_action'\n | 'background_run'\n | 'platform';\n\n// WHO a message is for. `conversation` participates in the member-facing\n// transcript; `agent_only` is context the member never said and must never be\n// rendered to them as speech nor attributed to them upstream.\nexport type MessageAudience = 'conversation' | 'agent_only';\n\n// Origins that are machine-authored notes rather than conversational turns.\n// A message with one of these origins is agent context, not member speech —\n// renderers must give it a distinct, non-bubble treatment.\nexport const AGENT_NOTE_ORIGINS: ReadonlySet<MessageOrigin> = new Set<MessageOrigin>([\n 'workflow',\n 'background_run',\n 'platform',\n]);\n\n/** True when a message is machine-authored context rather than member speech. */\nexport function isAgentNoteOrigin(origin: string | null | undefined): origin is MessageOrigin {\n return origin != null && AGENT_NOTE_ORIGINS.has(origin as MessageOrigin);\n}\n\n// The message shape the renderer and composer actually use (client view model)\nexport interface ChatMessage {\n id: string;\n /** Canonical persisted Message UUID. `id` remains the provider correlation id. */\n uuid?: string | null;\n role: MessageRole;\n content: string | MessageContentPart[];\n originalContent?: string | MessageContentPart[];\n truncationReason?: TruncationReason;\n truncatedAtMs?: number;\n reasoning_content?: string;\n failed?: boolean;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n error_details?: ChatCompletionError;\n created_at?: string;\n error?: { code: string; message: string };\n suggestions?: string[];\n sendAsAssistant?: boolean;\n email_id?: number;\n inbox_id?: number;\n memberId?: number | null;\n tokenUsage?: MessageTokenUsageResponse;\n taskId?: number | null;\n /**\n * First-class audio assistant message. audioFileUuid points at a workspace\n * File whose bytes the chat renderer should play. Set together with\n * audioMetadata: an audio message has both fields, a text message has neither.\n */\n interactionSessionId?: string | null;\n interactionMode?: InteractionMode | null;\n interactionTurnId?: string | null;\n audioFileUuid?: string | null;\n audioMetadata?: AudioMessageMetadata | null;\n /** SMS delivery status (queued/sending/sent/delivered/undelivered/failed). Only set for SMS messages. */\n smsDeliveryStatus?: SMSDeliveryStatus | null;\n smsDeliveryErrorCode?: string | null;\n smsDeliveryUpdatedAt?: string | null;\n /** Friendly failure reason string. Only set when smsDeliveryStatus is failed or undelivered. */\n smsDeliveryFailureReason?: string | null;\n /**\n * Viewer's durable thumbs rating for this assistant message (1.0 up / 0.0 down).\n * Loaded from chat_feedback; null/undefined when the viewer has not rated it.\n */\n userRating?: number | null;\n /** Free-text details the viewer attached to their rating, if any. */\n userRatingComment?: string | null;\n /**\n * ADR-11 provenance: WHO authored this message. Null on rows written before\n * the column existed — fall back to `role`.\n */\n origin?: MessageOrigin | null;\n /**\n * ADR-11 provenance: WHO this message is for. `agent_only` messages are\n * context the member never said and must never render as member speech.\n */\n audience?: MessageAudience | null;\n /**\n * Recorded outcome of a `role: 'tool'` message: `success` / `error` for a\n * model tool call, `success` / `failed` for an engine action. Null on other\n * messages and on rows written before the column existed.\n */\n toolStatus?: string | null;\n /**\n * How many messages hang off this one as a detached background trajectory\n * (a forked tool trajectory that outgrew its turn). Non-zero is the cue to\n * offer a \"show work\" expander; the thread itself is fetched lazily via\n * `getChildThreadMessages`. Absent/0 for ordinary messages.\n */\n childMessageCount?: number;\n /**\n * The fork point this message hangs off, as the PARENT's message uuid (so it\n * joins against `id` client-side). Null for ordinary main-thread messages.\n */\n parentMessageId?: string | null;\n}\n\nexport interface ChatMessageObject {\n object: string;\n data: any;\n}\n\nexport interface ChatMessageChunk {\n id: string;\n object: string;\n choices?: Array<{\n index?: number;\n delta?: {\n role?: MessageRole;\n content?: string;\n reasoning_content?: string;\n tool_call_id?: string;\n name?: string;\n tool_calls?: Array<ToolCall>;\n suggestions?: string[];\n created_at?: string;\n sendAsAssistant?: boolean;\n memberId?: number | null;\n };\n }>;\n}\n\n/**\n * Playback metadata stored alongside an audio assistant message.\n *\n * Server-applied at runtime by rendered_speech.play_file_stream /\n * the artifact handler. Re-read by the chat renderer for display\n * (e.g. annotating the bubble with \"guaranteed delivery\" if the clip\n * is non-interruptible).\n */\nexport interface AudioMessageMetadata {\n /** When false, the clip plays end-to-end ignoring barge-in. */\n allowInterrupt?: boolean;\n /** When true, the call hangs up immediately after the clip ends. */\n hangUpOnAudioEnd?: boolean;\n /** Server-side gain percent in [0, 100]. 80 is unity. */\n volume?: number;\n}\n\n// HITL / interrupt shapes the composer and execution UI need\nexport interface HITLActionRequest {\n name: string;\n args: Record<string, any>;\n /**\n * Pre-formatted human-readable explanation emitted by the backend\n * (langchain `ActionRequest.description`): the tool name plus rendered\n * args. The only readable line a small-screen client can show as-is.\n */\n description?: string;\n}\n\nexport interface HITLReviewConfig {\n actionName: string;\n /**\n * Decisions the backend will accept for this action — the buttons a\n * client should draw. Matches langchain's `ReviewConfig.allowed_decisions`\n * (`approve` | `edit` | `reject` | `respond`).\n */\n allowedDecisions: string[];\n /** JSON schema for `edit` decisions, when the backend configures one. */\n argsSchema?: Record<string, unknown>;\n}\n\nexport interface HITLRequest {\n actionRequests: HITLActionRequest[];\n reviewConfigs: HITLReviewConfig[];\n /** LangGraph interrupt ID injected by the backend so it can be echoed back on resume. */\n interruptId?: string;\n}\n\nexport interface HITLDecision {\n type: 'approve' | 'approve_always' | 'reject' | 'edit' | 'respond';\n message?: string;\n editedAction?: { name: string; args: Record<string, unknown> };\n}\n\nexport interface HITLResponse {\n decisions: HITLDecision[];\n /** LangGraph interrupt ID echoed back from the human_input_request event. */\n interruptId?: string;\n}\n\nexport interface UIChoiceDecision {\n chosenValue: string;\n interruptId?: string;\n}\n\n// Access grant interrupts (for the grant UI flow)\nexport interface AccessGrantDecision {\n decision: 'approve' | 'approve_always' | 'reject';\n /** LangGraph interrupt ID echoed back from the human_input_request event. */\n interruptId?: string;\n}\n\nexport interface AppConnectionAccessInterrupt {\n type: 'app_connection_access';\n grantUuid: string;\n connectionId?: string;\n connectionName: string;\n connectionType: string;\n hasCredential: boolean;\n /** LangGraph interrupt ID injected by the backend so it can be echoed back on resume. */\n interruptId?: string;\n}\n\nexport interface DataAccessGrantInterrupt {\n /**\n * Matches the backend payload (`lib/ai/tools/manager/data_access.py`\n * emits `type: \"data_access\"`). Was mistyped `'data_access_grant'`,\n * which silently defeated discriminated-union narrowing.\n */\n type: 'data_access';\n grantUuid: string;\n dataTypeSlug: string;\n dataTypeName: string;\n /**\n * Human-readable scope sentence emitted by the backend\n * (`lib/ai/tools/manager/data_access.py`), e.g. record count and date\n * bounds. There is no `accessMode` on the wire — that name belongs to the\n * unrelated authorization bitmask types.\n */\n scopeDescription: string;\n limit?: number | null;\n dateFrom?: string | null;\n dateTo?: string | null;\n /** LangGraph interrupt ID injected by the backend so it can be echoed back on resume. */\n interruptId?: string;\n}\n\n/**\n * Agent-initiated inline account connection (GRA-6205): the assistant asks\n * the member to connect their own account mid-conversation. `connectUrl` is\n * a short-lived, member-bound platform link (never a bare provider URL);\n * completing OAuth resumes the run server-side, so the client only ever\n * posts a decision for the decline path.\n */\nexport interface InlineConnectInterrupt {\n type: 'inline_connect';\n appSlug: string;\n connectionUuid?: string;\n label: string;\n connectUrl: string;\n expiresInMinutes?: number;\n description?: string;\n /** LangGraph interrupt ID injected by the backend so it can be echoed back on resume. */\n interruptId?: string;\n}\n\nexport type AccessGrantInterrupt =\n AppConnectionAccessInterrupt | DataAccessGrantInterrupt | InlineConnectInterrupt;\n\n// Admin chat list / detail shapes (still used by admin screens)\nexport interface AdminChatsOptions {\n page?: number;\n pageSize?: number;\n search?: string;\n memberId?: number;\n channel?: string;\n chatType?: string;\n archived?: boolean;\n}\n\n// Chat filter UI types\nexport type ChatFilterObjectType =\n | 'title'\n | 'participant'\n | 'mode'\n | 'channel'\n | 'owner'\n | 'needsResponse'\n | 'paused'\n | 'label'\n | 'memberFilter'\n | 'messageCount'\n | 'workflow'\n | 'phoneNumber'\n | 'inbox'\n | 'site'\n | 'toolCall'\n | 'createdAt'\n | 'updatedAt';\n\nexport type ChatFilterFilterType =\n | 'any'\n | 'all'\n | 'none'\n | 'partial'\n | 'exact'\n | 'equals'\n | 'notEquals'\n | 'onlyMine'\n | 'active'\n | 'greaterThan'\n | 'lessThan'\n | 'greaterThanOrEqual'\n | 'lessThanOrEqual'\n | 'before'\n | 'after'\n | 'between';\n\nexport interface ChatFilterRuleFormData {\n objectType: ChatFilterObjectType;\n filterType: ChatFilterFilterType;\n objectIds?: number[];\n query?: string;\n}\n\nexport interface ChatFilterFormData {\n name: string;\n description?: string;\n pinned?: boolean;\n rules?: ChatFilterRuleFormData[];\n query?: QueryPredicate | null;\n}\n\nexport interface GetChatsOptions {\n sortBy?: ChatSortField;\n sortOrder?: SortOrder;\n page?: number;\n pageSize?: number;\n mine?: boolean;\n needsResponse?: boolean;\n /**\n * Sort chats awaiting a human response to the top of the page, ahead of the\n * `sortBy`/`sortOrder` ordering (which still orders within each group).\n * Distinct from `needsResponse`, which *filters* to that set — this only\n * reorders, so nothing drops out of the result.\n */\n needsResponseFirst?: boolean;\n paused?: boolean;\n archived?: boolean;\n channel?: Channel;\n chatType?: ChatType;\n memberId?: number;\n memberFilterId?: number;\n assistantMemberId?: number;\n search?: string;\n filters?: ChatFilterRuleFormData[];\n query?: QueryPredicate;\n isTest?: boolean;\n /**\n * Owner-anonymity scope — a tri-state.\n *\n * - `true`: anonymous-owner chats only (requires the `chats:admin` scope).\n * - `false`: known-owner chats only.\n * - omitted: no owner-anonymity filter. A `chats:admin` caller receives\n * both categories; callers without `chats:admin` never receive\n * anonymous-owner chats, because that exclusion is authorization rather\n * than a filter and cannot be widened from the client.\n *\n * Omission stopped implying an exclusion in 2026-07. Send `isAnonymous:\n * false` explicitly to keep the previous known-owner-only result set.\n */\n isAnonymous?: boolean;\n /** Stable workflow root id — only chats whose assignment pins any revision of this workflow. */\n workflowId?: number;\n /** Workflow revision id — only chats whose assignment pins exactly this revision. */\n workflowRevisionId?: number;\n /** ISO-8601 timestamp — only return chats created on or after this time. */\n createdAfter?: string;\n /** ISO-8601 timestamp — only return chats created on or before this time. */\n createdBefore?: string;\n}\n\n// ===== WORKFLOW FEEDBACK =====\n// Server shapes from OpenAPI; client-only query helpers + narrow unions below.\n\nexport type {\n ChatFeedbackResponse,\n WorkflowFeedbackListResponse,\n WorkflowFeedbackSummary,\n} from './generated/chat_feedback';\n\nexport type ChatFeedback = import('./generated/chat_feedback').ChatFeedbackResponse;\n\nexport type ChatFeedbackSource = 'rating' | 'explicit_user' | 'extracted' | 'supervisor';\n\n/**\n * Who left the feedback (distinct from capture ``source``).\n * Not split by admin vs staff scopes — those are role/permission details\n * (see ``authorRoleName``), not author categories.\n */\nexport type FeedbackAuthorKind =\n 'end_user' | 'staff' | 'supervisor' | 'system' | 'agent' | 'unknown';\n\n/** Thumbs-up when rating is at or above this value (API/UI/CLI agreement). */\nexport const POSITIVE_RATING_THRESHOLD = 0.5;\n\nexport function isPositiveRating(rating: number | null | undefined): boolean {\n return rating != null && rating >= POSITIVE_RATING_THRESHOLD;\n}\n\nexport interface GetWorkflowFeedbackOptions {\n page?: number;\n pageSize?: number;\n source?: ChatFeedbackSource;\n /** 'up' for rating >= 0.5, 'down' for rating < 0.5 */\n rating?: 'up' | 'down';\n authorKind?: FeedbackAuthorKind;\n includeTest?: boolean;\n}\n\n// Re-export the communication types that used to be co-located for convenience\nexport type { Channel, ChatCompletionError } from './communication-types';\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: organization\n */\n\nimport type { OIDCAdminConfigInput } from './config';\n\n/**\n * Twilio Address resource.\n */\nexport interface Address {\n /** @maxLength 100 */\n customerName?: string;\n /** @maxLength 100 */\n street?: string;\n /** @maxLength 50 */\n city?: string;\n /** @maxLength 50 */\n region?: string;\n /** @maxLength 20 */\n postalCode?: string;\n /** @maxLength 2 */\n isoCountry?: string;\n}\n\n/**\n * One carrier-provisioning ledger row for the admin ledger read verb.\n *\n * Backed by ``SubscriptionItem`` rows across ALL of the org's subscriptions:\n * direct-rail ledger rows, Stripe per-phone membership rows (released ones\n * included — a full month is billed at purchase with no credit on release,\n * so a released phone must stay invoiceable), live legacy per-number\n * placeholders, and A2P brand markers. Stripe *aggregate* rows are excluded\n * — they are a Stripe mechanism, not per-resource history — and a legacy\n * placeholder drops out on release (canceled, it is indistinguishable from\n * a canceled aggregate).\n *\n * Deliberately no amount field: ``unit_amount_cents`` arrives with\n * pass-through pricing (PR 4), and shipping without the column beats\n * shipping an always-empty one. Actor attribution lives in the security\n * audit log: for ACTIVE rows it is keyed by the resource id\n * (``PHONE_NUMBER_PURCHASED.providerPhoneId`` /\n * ``A2P_ORG_REGISTRATION_STARTED.brandId``); a RELEASED phone row has no\n * surviving resource id (the cancel clears the FK), so it correlates to\n * its ``PHONE_NUMBER_RELEASED`` event by organization + timestamp.\n */\nexport interface AdminCarrierLedgerEntryResponse {\n id: number;\n subscriptionId: number;\n resource: AdminCarrierLedgerEntryResponseResource;\n identifier?: string | null;\n resourceKey?: string | null;\n priceType: string;\n status: string;\n quantity: number;\n billingStrategy: AdminCarrierLedgerEntryResponseBillingStrategy;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type AdminCarrierLedgerEntryResponseBillingStrategy = typeof AdminCarrierLedgerEntryResponseBillingStrategy[keyof typeof AdminCarrierLedgerEntryResponseBillingStrategy];\n\n\nexport const AdminCarrierLedgerEntryResponseBillingStrategy = {\n stripe: 'stripe',\n direct: 'direct',\n} as const;\n\nexport type AdminCarrierLedgerEntryResponseResource = typeof AdminCarrierLedgerEntryResponseResource[keyof typeof AdminCarrierLedgerEntryResponseResource];\n\n\nexport const AdminCarrierLedgerEntryResponseResource = {\n phone_number: 'phone_number',\n a2p_brand: 'a2p_brand',\n} as const;\n\n/**\n * Extended organization response with admin details.\n *\n * `ssoOidc` is the redacted view of the persisted OIDC config — the\n * cleartext `client_secret` is never exposed; instead `client_secret_set`\n * indicates whether one is configured. Only populated for orgs whose\n * `sso_provider == \"oidc\"`.\n *\n * `enforceCreditLimit` exposes the per-org credit gate switch so\n * the admin UI can render and toggle it. False = soft (alert only),\n * True = hard stop (raises 402 at zero credits).\n */\nexport interface AdminOrganizationResponse {\n id: number;\n uuid: string;\n name: string;\n slug: string;\n logoUrl?: string | null;\n contactEmail?: string | null;\n contactPhone?: string | null;\n authMode?: string;\n createdAt: string;\n creatorId?: number | null;\n creatorName?: string | null;\n resellerWorkspaceId?: number | null;\n resellerWorkspaceUuid?: string | null;\n sso?: LibModelsGlbResponsesOrganizationResponsesSSOConfigResponse | null;\n viewType?: string;\n accountCount?: number;\n workspaceCount?: number;\n phoneNumberCount?: number;\n ssoOidc?: OIDCAdminConfigView | null;\n enforceCreditLimit?: boolean;\n maxPhoneNumbers?: number;\n maxA2pBrands?: number;\n declaredDataUse?: DeclaredDataUse;\n phiPolicyVersion?: string | null;\n phiPolicySource?: string | null;\n phiPolicyReason?: string | null;\n phiPolicyReviewedAt?: string | null;\n phiPolicyReviewedByAccountId?: number | null;\n phiPolicyReviewDueAt?: string | null;\n}\n\n/**\n * Authorized representative — Twilio End-User of type\n * authorized_representative_1 / _2.\n */\nexport interface AuthorizedRep {\n /** @maxLength 50 */\n firstName?: string;\n /** @maxLength 50 */\n lastName?: string;\n email?: string | null;\n /** @maxLength 20 */\n phoneNumber?: string;\n /** @maxLength 50 */\n businessTitle?: string;\n jobPosition?: JobPosition | null;\n}\n\n/**\n * Twilio's accepted business industries — SHOUTING_SNAKE_CASE.\n *\n * Source: ``api-create-secondary-customer-profile.md``.\n */\nexport type BusinessIndustry = typeof BusinessIndustry[keyof typeof BusinessIndustry];\n\n\nexport const BusinessIndustry = {\n AGRICULTURE: 'AGRICULTURE',\n AUTOMOTIVE: 'AUTOMOTIVE',\n BANKING: 'BANKING',\n CONSUMER: 'CONSUMER',\n EDUCATION: 'EDUCATION',\n ELECTRONICS: 'ELECTRONICS',\n ENERGY: 'ENERGY',\n ENGINEERING: 'ENGINEERING',\n FAST_MOVING_CONSUMER_GOODS: 'FAST_MOVING_CONSUMER_GOODS',\n FINANCIAL: 'FINANCIAL',\n FINTECH: 'FINTECH',\n FOOD_AND_BEVERAGE: 'FOOD_AND_BEVERAGE',\n GOVERNMENT: 'GOVERNMENT',\n HEALTHCARE: 'HEALTHCARE',\n HOSPITALITY: 'HOSPITALITY',\n INSURANCE: 'INSURANCE',\n JEWELRY: 'JEWELRY',\n LEGAL: 'LEGAL',\n MANUFACTURING: 'MANUFACTURING',\n MEDIA: 'MEDIA',\n NOT_FOR_PROFIT: 'NOT_FOR_PROFIT',\n OIL_AND_GAS: 'OIL_AND_GAS',\n ONLINE: 'ONLINE',\n RAW_MATERIALS: 'RAW_MATERIALS',\n REAL_ESTATE: 'REAL_ESTATE',\n RELIGION: 'RELIGION',\n RETAIL: 'RETAIL',\n TECHNOLOGY: 'TECHNOLOGY',\n TELECOMMUNICATIONS: 'TELECOMMUNICATIONS',\n TRANSPORTATION: 'TRANSPORTATION',\n TRAVEL: 'TRAVEL',\n} as const;\n\n/**\n * Business identity fields stored on the Twilio business End-User.\n *\n * Field shape mirrors Twilio's ``customer_profile_business_information``\n * EndUser type. ``dba`` is intentionally absent — Twilio's schema has no\n * DBA attribute, and unknown attributes are rejected with code 70002.\n *\n * Empty values are allowed on PUT so an operator can save progress; Twilio\n * sync and submit still require :func:`profile_payload_is_complete`.\n */\nexport interface BusinessInfo {\n /** @maxLength 100 */\n legalName?: string;\n industry?: BusinessIndustry | null;\n businessType?: BusinessType | null;\n /** @maxLength 64 */\n registrationNumber?: string;\n registrationIdentifier?: RegistrationIdentifier | null;\n regionsOfOperation?: Region[];\n websiteUrl?: string | null;\n}\n\nexport interface BusinessProfileCancelResponse {\n status: string;\n}\n\n/**\n * GET /business-profile body — built from a live Twilio fetch.\n *\n * ``status`` is the LIVE Twilio Customer Profile **lifecycle** status\n * (``draft`` / ``pending-review`` / ``in-review`` / ``twilio-approved``\n * / ``twilio-rejected``) — never the cached\n * ``customer_profile_status`` hint (plan §1c). ``failureReasons`` is\n * the scrubbed, persisted list — those values are post-scrub and safe\n * to expose.\n *\n * ``evaluationStatus`` is the most recent **compliance evaluation**\n * result (``compliant`` / ``noncompliant``) when the profile is still\n * pre-submission, otherwise ``None``. Twilio models lifecycle and\n * evaluation as two separate enums on two separate resources\n * (``customer_profile_enum_status`` vs\n * ``customer_profile_evaluation_enum_status``); the frontend needs\n * both to decide whether the Submit button is eligible without making\n * a second round-trip.\n */\nexport interface BusinessProfileResponse {\n status?: string | null;\n evaluationStatus?: BusinessProfileResponseEvaluationStatus;\n customerProfileSid?: string | null;\n registrationAvailable?: boolean;\n businessInfo?: BusinessInfo | null;\n authorizedReps?: AuthorizedRep[];\n address?: Address | null;\n failureReasons?: string[];\n profileRecoveryFailed?: boolean;\n draftPending?: boolean;\n}\n\nexport type BusinessProfileResponseEvaluationStatus = typeof BusinessProfileResponseEvaluationStatus[keyof typeof BusinessProfileResponseEvaluationStatus] | null;\n\n\nexport const BusinessProfileResponseEvaluationStatus = {\n compliant: 'compliant',\n noncompliant: 'noncompliant',\n} as const;\n\nexport interface BusinessProfileSubmitResponse {\n status: BusinessProfileSubmitResponseStatus;\n workflowId: string;\n}\n\nexport type BusinessProfileSubmitResponseStatus = typeof BusinessProfileSubmitResponseStatus[keyof typeof BusinessProfileSubmitResponseStatus];\n\n\nexport const BusinessProfileSubmitResponseStatus = {\n 'pending-review': 'pending-review',\n submitting: 'submitting',\n} as const;\n\n/**\n * Twilio's accepted business types — Title Case with spaces.\n *\n * Source: ``api-create-secondary-customer-profile.md``. Values are\n * inconsistently cased (Title Case here, SHOUTING_SNAKE for industry,\n * lowercase_snake for identity) — that's how Twilio defines them.\n */\nexport type BusinessType = typeof BusinessType[keyof typeof BusinessType];\n\n\nexport const BusinessType = {\n Sole_Proprietorship: 'Sole Proprietorship',\n Partnership: 'Partnership',\n Limited_Liability_Corporation: 'Limited Liability Corporation',\n 'Co-operative': 'Co-operative',\n 'Non-profit_Corporation': 'Non-profit Corporation',\n Corporation: 'Corporation',\n} as const;\n\n/**\n * Create a new organization.\n */\nexport interface CreateOrganizationRequest {\n name: string;\n slug?: string | null;\n contactEmail?: string | null;\n contactPhone?: string | null;\n logo?: Blob | null;\n logoMimeType?: string | null;\n}\n\n/**\n * Response for the current user's org membership (/me endpoint).\n *\n * Returns membership details with scopes - the effective permissions\n * the API honors for this user in this organization context.\n */\nexport interface CurrentOrgMemberResponse {\n id: number;\n accountId?: number | null;\n organizationId: number;\n accountUuid?: string | null;\n accountEmail?: string | null;\n accountName?: string | null;\n accountPhone?: string | null;\n name?: string | null;\n externalId?: string | null;\n role: string;\n scopes: string[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport type DeclaredDataUse = typeof DeclaredDataUse[keyof typeof DeclaredDataUse];\n\n\nexport const DeclaredDataUse = {\n unclassified: 'unclassified',\n non_phi_only: 'non_phi_only',\n phi_expected: 'phi_expected',\n} as const;\n\n/**\n * What happens to inboxes on this domain if email is disabled.\n *\n * Returned when DELETE is called without `confirm=true` so the UI can name\n * the consequence precisely: most inboxes move back to their platform\n * address (`revertedCount`), and any left with no Inbox behind them lose\n * routing outright (`droppedCount`).\n *\n * `inboxCount` / `inboxEmails` keep the original flat shape so existing\n * clients don't break; `reverts` carries the per-inbox detail. Addresses on\n * the custom domain are already part of this contract, so no new class of\n * data is exposed by adding the platform address alongside each one.\n */\nexport interface EmailDisableImpactResponse {\n inboxCount: number;\n inboxEmails: string[];\n revertedCount?: number;\n droppedCount?: number;\n reverts?: EmailInboxRevertResponse[];\n}\n\n/**\n * One DNS record the customer must publish for email to work.\n */\nexport interface EmailDnsRecord {\n type: EmailDnsRecordType;\n host: string;\n value: string;\n ttl?: number;\n priority?: number | null;\n purpose: string;\n status: string;\n}\n\nexport type EmailDnsRecordType = typeof EmailDnsRecordType[keyof typeof EmailDnsRecordType];\n\n\nexport const EmailDnsRecordType = {\n TXT: 'TXT',\n CNAME: 'CNAME',\n MX: 'MX',\n} as const;\n\n/**\n * GET response wrapper.\n *\n * `enabled=False` when no EmailDomainConfig exists for the OrgDomain\n * (the customer hasn't called POST .../email yet). `enabled=True` when a\n * config exists; `config` is populated.\n *\n * A 404 from the GET endpoint always means the parent OrgDomain doesn't\n * exist or isn't in this org — never \"email not enabled\". Lets the UI\n * distinguish the two cases cleanly without parsing error detail strings.\n */\nexport interface EmailDomainConfigGetResponse {\n enabled: boolean;\n config?: EmailDomainConfigResponse | null;\n}\n\n/**\n * Full picture of an EmailDomainConfig — DNS records + statuses.\n */\nexport interface EmailDomainConfigResponse {\n uuid: string;\n orgDomainUuid: string;\n domain: string;\n status: string;\n spfStatus: string;\n dkimStatus: string;\n dmarcStatus: string;\n mxStatus: string;\n returnPathStatus: string;\n lastCheckedAt?: string | null;\n createdAt: string;\n updatedAt: string;\n dnsRecords: EmailDnsRecord[];\n}\n\n/**\n * What disabling email does to one inbox.\n *\n * `platformEmailAddress` is the address the inbox moves to. It is `None`\n * when the routing row has no workspace Inbox behind it (a stale mapping,\n * or a workspace database we could not reach) — those lose routing instead\n * of being reverted, and the UI has to say so.\n */\nexport interface EmailInboxRevertResponse {\n emailAddress: string;\n platformEmailAddress?: string | null;\n}\n\n/**\n * Result of running a \"Check DNS\" pass.\n */\nexport interface EmailVerificationResponse {\n status: string;\n config: EmailDomainConfigResponse;\n dmarcWarning?: string | null;\n}\n\n/**\n * Twilio's accepted authorized-rep job positions.\n *\n * Source: ``api-create-secondary-customer-profile.md``.\n */\nexport type JobPosition = typeof JobPosition[keyof typeof JobPosition];\n\n\nexport const JobPosition = {\n Director: 'Director',\n GM: 'GM',\n VP: 'VP',\n CEO: 'CEO',\n CFO: 'CFO',\n General_Counsel: 'General Counsel',\n Other: 'Other',\n} as const;\n\n/**\n * SSO configuration in organization responses (provider-agnostic).\n */\nexport interface LibModelsGlbResponsesOrganizationResponsesSSOConfigResponse {\n provider?: string | null;\n domain?: string | null;\n enabledAt?: string | null;\n config?: SSOConfigData | null;\n}\n\n/**\n * Request model for logo upload presigned URL.\n */\nexport interface LogoUploadRequest {\n contentType: string;\n fileExtension: string;\n}\n\n/**\n * Response model for logo upload presigned URL.\n */\nexport interface LogoUploadResponse {\n uploadUrl: string;\n fields: LogoUploadResponseFields;\n fileUrl: string;\n}\n\nexport type LogoUploadResponseFields = {[key: string]: string};\n\n/**\n * Response for member view of an organization.\n *\n * Returns basic org info and the user's workspace memberships.\n * This is for non-admin members who can see their workspaces but not org admin details.\n */\nexport interface MemberOrgViewResponse {\n viewType?: string;\n id: number;\n uuid: string;\n name: string;\n slug?: string | null;\n logoUrl?: string | null;\n role: string;\n workspaces: MemberWorkspaceInfo[];\n}\n\n/**\n * Basic workspace info for member view.\n */\nexport interface MemberWorkspaceInfo {\n uuid: string;\n name: string;\n slug: string;\n}\n\n/**\n * OIDC config returned to an admin. Cleartext secret is always None.\n */\nexport interface OIDCAdminConfigView {\n providerType?: OIDCAdminConfigViewProviderType;\n issuer: string;\n clientId: string;\n expectedAudience?: string | null;\n expectedTenantId?: string | null;\n multiTenant?: boolean;\n issuerIsMultiTenantTemplate?: boolean;\n autoProvision?: boolean;\n roleMapping?: OIDCAdminConfigViewRoleMapping;\n rolesKey?: string | null;\n groupsKey?: string | null;\n postLogoutRedirectUris?: string[] | null;\n clientSecret?: string | null;\n clientSecretSet?: boolean;\n}\n\nexport type OIDCAdminConfigViewProviderType = typeof OIDCAdminConfigViewProviderType[keyof typeof OIDCAdminConfigViewProviderType];\n\n\nexport const OIDCAdminConfigViewProviderType = {\n azure_ad: 'azure_ad',\n okta: 'okta',\n auth0: 'auth0',\n generic: 'generic',\n} as const;\n\nexport type OIDCAdminConfigViewRoleMapping = {[key: string]: string} | null;\n\n/**\n * Billing customer and this organization's billable subscription.\n *\n * ``subscriptionId`` is the row ``org_subscription_predicate`` already\n * resolved. A customer can bill many organizations (the shared Internal\n * customer does), so the client's next step must be \"fetch this id\" — not\n * \"list the customer's subscriptions and take ``items[0]``\".\n */\nexport interface OrgBillingCustomerResponse {\n customerUuid?: string | null;\n customerName?: string | null;\n hasAccess?: boolean;\n subscriptionId?: number | null;\n audiences?: string[];\n}\n\n/**\n * Response model for a list of OrgDomain rows.\n */\nexport interface OrgDomainListResponse {\n items: OrgDomainResponse[];\n total: number;\n}\n\n/**\n * Response model for an OrgDomain row.\n */\nexport interface OrgDomainResponse {\n uuid: string;\n domain: string;\n organizationUuid: string;\n ownershipStatus: string;\n ownershipDnsRecord: OwnershipDnsRecord;\n ownershipVerifiedAt?: string | null;\n ownershipLastCheckedAt?: string | null;\n createdAt: string;\n updatedAt: string;\n emailStatus?: string | null;\n siteStatus?: string | null;\n parentDomainUuid?: string | null;\n childHosting?: boolean;\n}\n\n/**\n * Request to join an organization.\n */\nexport interface OrgJoinRequest {\n redirectUrl?: string | null;\n}\n\n/**\n * Response after joining an organization.\n */\nexport interface OrgJoinResponse {\n success: boolean;\n orgUuid: string;\n orgName: string;\n redirectUrl?: string | null;\n isNewMember?: boolean;\n}\n\n/**\n * Base organization response.\n */\nexport interface OrganizationResponse {\n id: number;\n uuid: string;\n name: string;\n slug: string;\n logoUrl?: string | null;\n contactEmail?: string | null;\n contactPhone?: string | null;\n authMode?: string;\n createdAt: string;\n creatorId?: number | null;\n creatorName?: string | null;\n resellerWorkspaceId?: number | null;\n resellerWorkspaceUuid?: string | null;\n sso?: LibModelsGlbResponsesOrganizationResponsesSSOConfigResponse | null;\n}\n\n/**\n * The DNS record the customer must add to prove ownership.\n */\nexport interface OwnershipDnsRecord {\n type?: string;\n host: string;\n value: string;\n ttl?: number;\n}\n\n/**\n * Result of running an ownership-proof DNS lookup.\n */\nexport interface OwnershipVerificationResponse {\n status: string;\n message: string;\n domain: OrgDomainResponse;\n}\n\n/**\n * Public organization configuration for login pages.\n */\nexport interface PublicOrganizationConfig {\n uuid: string;\n name: string;\n slug: string;\n logoUrl?: string | null;\n authMode?: string;\n sso: PublicSSOConfig;\n}\n\n/**\n * Public SSO configuration - only what's needed for the login page.\n */\nexport interface PublicSSOConfig {\n enabled?: boolean;\n provider?: string | null;\n providerType?: string | null;\n}\n\n/**\n * Twilio's region buckets — NOT ISO 3166. The plan said \"ISO\" but\n * Twilio actually uses these continental buckets, with ``USA_AND_CANADA``\n * as a single value. Source: ``api-create-secondary-customer-profile.md``.\n */\nexport type Region = typeof Region[keyof typeof Region];\n\n\nexport const Region = {\n AFRICA: 'AFRICA',\n ASIA: 'ASIA',\n EUROPE: 'EUROPE',\n LATIN_AMERICA: 'LATIN_AMERICA',\n USA_AND_CANADA: 'USA_AND_CANADA',\n AUSTRALIA: 'AUSTRALIA',\n} as const;\n\n/**\n * Twilio's accepted registration identifier types.\n *\n * Source: ``docs/external/twilio-api/prose/trust-hub/trusthub-rest-api/\n * api-create-secondary-customer-profile.md`` (the table of accepted\n * values, augmented with ``DUNS`` from the EndUser create example —\n * the table omits ``DUNS`` but Twilio accepts it).\n */\nexport type RegistrationIdentifier = typeof RegistrationIdentifier[keyof typeof RegistrationIdentifier];\n\n\nexport const RegistrationIdentifier = {\n EIN: 'EIN',\n CBN: 'CBN',\n CN: 'CN',\n ACN: 'ACN',\n CIN: 'CIN',\n VAT: 'VAT',\n VATRN: 'VATRN',\n RN: 'RN',\n DUNS: 'DUNS',\n Other: 'Other',\n} as const;\n\n/**\n * Typed SSO configuration data stored in sso_config JSONB column.\n *\n * This model defines the structure for provider-specific SSO settings\n * that don't need database indexing.\n *\n * SECURITY NOTE: SSO can NEVER grant superuser status. The maximum role\n * that can be auto-provisioned via SSO is org_owner. Superuser accounts\n * must be created directly in the database.\n *\n * SECURITY NOTE: This model uses extra=\"ignore\" to ensure any additional fields\n * stored in the JSONB (such as secrets or PII) are never exposed in API responses.\n * OIDC client credentials are stored in environment variables (SYSTEM_CONFIG),\n * NOT in the database. If per-org OIDC credentials are needed in the future,\n * they must be stored encrypted (like OauthCredential) or in AWS Secrets Manager.\n */\nexport interface SSOConfigData {\n providerType?: string | null;\n autoProvision?: boolean;\n roleMapping?: SSOConfigDataRoleMapping;\n}\n\nexport type SSOConfigDataRoleMapping = {[key: string]: string} | null;\n\n/**\n * Request model for SSO configuration.\n */\nexport interface SSOConfigRequest {\n provider: SSOConfigRequestProvider;\n domain: string;\n authMode?: SSOConfigRequestAuthMode;\n config?: SSOProviderConfig | null;\n}\n\nexport type SSOConfigRequestAuthMode = typeof SSOConfigRequestAuthMode[keyof typeof SSOConfigRequestAuthMode];\n\n\nexport const SSOConfigRequestAuthMode = {\n open: 'open',\n ssoForDomain: 'ssoForDomain',\n ssoOnly: 'ssoOnly',\n} as const;\n\nexport type SSOConfigRequestProvider = typeof SSOConfigRequestProvider[keyof typeof SSOConfigRequestProvider];\n\n\nexport const SSOConfigRequestProvider = {\n google: 'google',\n saml: 'saml',\n oidc: 'oidc',\n} as const;\n\n/**\n * Configuration for SSO provider.\n */\nexport interface SSOProviderConfig {\n autoProvision?: boolean | null;\n roleMapping?: SSOProviderConfigRoleMapping;\n oidc?: OIDCAdminConfigInput | null;\n}\n\nexport type SSOProviderConfigRoleMapping = {[key: string]: string} | null;\n\n/**\n * SiteMapping rows and child hosts that will be dropped on disable.\n */\nexport interface SiteDisableImpactResponse {\n siteCount: number;\n siteDomains: string[];\n childHosts?: string[];\n}\n\n/**\n * One DNS record the customer must publish for the site to work.\n *\n * Two records today: the routing CNAME (purpose \"target\") and the\n * CloudFront domain-control TXT `_cf-challenge.<domain>` (purpose\n * \"domain-control\", #24354). Future: A records for apex.\n */\nexport interface SiteDnsRecord {\n type: SiteDnsRecordType;\n host: string;\n value: string;\n ttl?: number;\n purpose: string;\n status: string;\n}\n\nexport type SiteDnsRecordType = typeof SiteDnsRecordType[keyof typeof SiteDnsRecordType];\n\n\nexport const SiteDnsRecordType = {\n CNAME: 'CNAME',\n A: 'A',\n TXT: 'TXT',\n} as const;\n\n/**\n * GET wrapper. `enabled=False` when no config exists.\n *\n * Matches the email capability's GET response shape so the UI doesn't\n * have to special-case 404 for \"not yet enabled\".\n */\nexport interface SiteDomainConfigGetResponse {\n enabled: boolean;\n config?: SiteDomainConfigResponse | null;\n requiredDnsRecords?: SiteDnsRecord[] | null;\n}\n\n/**\n * Full picture of a SiteDomainConfig — DNS records + statuses.\n */\nexport interface SiteDomainConfigResponse {\n uuid: string;\n orgDomainUuid: string;\n domain: string;\n status: string;\n targetStatus: SiteDomainConfigResponseTargetStatus;\n tlsStatus: string;\n lastCheckedAt?: string | null;\n createdAt: string;\n updatedAt: string;\n dnsRecords: SiteDnsRecord[];\n childHosting?: boolean;\n}\n\nexport type SiteDomainConfigResponseTargetStatus = typeof SiteDomainConfigResponseTargetStatus[keyof typeof SiteDomainConfigResponseTargetStatus];\n\n\nexport const SiteDomainConfigResponseTargetStatus = {\n pending: 'pending',\n verified: 'verified',\n failed: 'failed',\n} as const;\n\n/**\n * Result of running a \"Verify DNS\" pass.\n *\n * The live tenant domain-association state (#24354) rides in\n * `config.dnsRecords`: the `domain-control` record is verified iff\n * CloudFront reports the domain active — no separate scalar needed.\n */\nexport interface SiteVerificationResponse {\n status: string;\n config: SiteDomainConfigResponse;\n}\n\n/**\n * Request to update an org member.\n *\n * ``role`` and ``name`` are independent and at least one must be supplied.\n *\n * ``name`` is the **org-level** display name — ``OrgMember.name`` and the\n * name of the linked ``OrgAccount`` for this organization. It deliberately\n * does not touch ``Account.name``: that is the person's own global name, set\n * through the account routes, and one account can belong to several orgs that\n * each want their own label for it.\n */\nexport interface UpdateOrgMemberRequest {\n /** New role: member, admin, owner, or platform_support */\n role?: string | null;\n /** New org-level display name for this member. Omit to leave the name unchanged; blank is rejected. */\n name?: string | null;\n}\n\n/**\n * Update an organization.\n */\nexport interface UpdateOrganizationRequest {\n name?: string | null;\n slug?: string | null;\n logoUrl?: string | null;\n contactEmail?: string | null;\n contactPhone?: string | null;\n logo?: Blob | null;\n logoMimeType?: string | null;\n ssoProvider?: string | null;\n ssoDomain?: string | null;\n authMode?: UpdateOrganizationRequestAuthMode;\n ssoAutoProvision?: boolean | null;\n ssoOidc?: OIDCAdminConfigInput | null;\n twilioSubAccountSid?: string | null;\n enforceCreditLimit?: boolean | null;\n maxPhoneNumbers?: number | null;\n maxA2pBrands?: number | null;\n}\n\nexport type UpdateOrganizationRequestAuthMode = typeof UpdateOrganizationRequestAuthMode[keyof typeof UpdateOrganizationRequestAuthMode] | null;\n\n\nexport const UpdateOrganizationRequestAuthMode = {\n open: 'open',\n ssoForDomain: 'ssoForDomain',\n ssoOnly: 'ssoOnly',\n} as const;\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: site\n */\n\nimport type { AccessGrantResponse } from './access_grant';\nimport type { SharingGrantEntry } from './file';\nimport type { EnumOption } from './schema_field';\nimport type { SessionKind } from './session';\nimport type { ThemeFeatures } from './theme';\n\n/**\n * Create a new site.\n */\nexport interface CreateSiteRequest {\n name: string;\n slug?: string | null;\n theme?: CreateSiteRequestTheme;\n customDomain?: string | null;\n redirectUrl?: string | null;\n allowSignup?: boolean;\n signupMemberRoleId?: number | null;\n content?: string;\n isReseller?: boolean;\n isPublic?: boolean;\n authenticationMethods?: 'name_dob'[];\n defaultWorkflowId?: number | null;\n tagLine?: string | null;\n googleAnalyticsId?: string | null;\n googleAdwordsId?: string | null;\n primaryLocale?: string;\n availableLocales?: string[];\n}\n\nexport type CreateSiteRequestTheme = typeof CreateSiteRequestTheme[keyof typeof CreateSiteRequestTheme] | null;\n\n\nexport const CreateSiteRequestTheme = {\n default: 'default',\n 'gravityrail-home': 'gravityrail-home',\n 'gravityrail-home-2': 'gravityrail-home-2',\n 'gravityrail-start': 'gravityrail-start',\n 'leapcure-home': 'leapcure-home',\n 'leapcure-home-no-chat': 'leapcure-home-no-chat',\n 'leapcure-home-pre-launch': 'leapcure-home-pre-launch',\n 'admin-clinical-trial': 'admin-clinical-trial',\n 'customer-basic': 'customer-basic',\n 'rc360-demo': 'rc360-demo',\n 'patient-engagement-demo': 'patient-engagement-demo',\n 'operator-product': 'operator-product',\n 'gravity-health': 'gravity-health',\n 'gravity-developer': 'gravity-developer',\n 'gravityrail-launch': 'gravityrail-launch',\n 'gravity-rail-feb-2026': 'gravity-rail-feb-2026',\n 'gravity-rail-2026-v2': 'gravity-rail-2026-v2',\n 'operator-2026': 'operator-2026',\n 'cosan-enrollment': 'cosan-enrollment',\n 'cosan-enrollment-v2': 'cosan-enrollment-v2',\n 'gravity-health-enrollment': 'gravity-health-enrollment',\n 'source-site': 'source-site',\n} as const;\n\n/**\n * A resource's directional contract with an independently owned local Form.\n */\nexport interface DataTypeRequirement {\n /**\n * @minItems 1\n * @maxItems 100\n */\n fields: RequirementSchemaField[];\n access?: DataTypeRequirementAccess;\n recordScope?: DataTypeRequirementRecordScope;\n isCollection?: boolean | null;\n}\n\nexport type DataTypeRequirementAccess = typeof DataTypeRequirementAccess[keyof typeof DataTypeRequirementAccess];\n\n\nexport const DataTypeRequirementAccess = {\n read: 'read',\n write: 'write',\n read_write: 'read_write',\n} as const;\n\nexport type DataTypeRequirementRecordScope = typeof DataTypeRequirementRecordScope[keyof typeof DataTypeRequirementRecordScope] | null;\n\n\nexport const DataTypeRequirementRecordScope = {\n member: 'member',\n workspace: 'workspace',\n anonymous: 'anonymous',\n} as const;\n\n/**\n * Response model for a menu item.\n */\nexport interface MenuItemResponse {\n id: number;\n siteId: number;\n label: string;\n itemType: MenuItemResponseItemType;\n pageId?: number | null;\n pageSlug?: string | null;\n pageTitle?: string | null;\n url?: string | null;\n parentId?: number | null;\n position: number;\n icon?: string | null;\n cssClass?: string | null;\n target?: string | null;\n isActive?: boolean;\n translations?: MenuItemResponseTranslations;\n createdAt: string;\n updatedAt: string;\n children?: MenuItemResponse[];\n}\n\nexport type MenuItemResponseItemType = typeof MenuItemResponseItemType[keyof typeof MenuItemResponseItemType];\n\n\nexport const MenuItemResponseItemType = {\n page: 'page',\n url: 'url',\n products: 'products',\n none: 'none',\n} as const;\n\nexport type MenuItemResponseTranslations = {[key: string]: string} | null;\n\n/**\n * Response model for the complete menu tree of a site.\n */\nexport interface MenuTreeResponse {\n siteId: number;\n items?: MenuItemResponse[];\n}\n\nexport interface PageResponse {\n id: number;\n slug: string;\n title: string;\n status?: string;\n url?: string | null;\n contentBlocks: TipTapDocumentOutput | null;\n contentMarkdown: string | null;\n contentHtml: string | null;\n contentAMP: string | null;\n sourceMetadata: PageResponseSourceMetadata;\n sourceHtml: string | null;\n sourceMarkdown: string | null;\n sourceUrl: string | null;\n createdAt: string;\n updatedAt: string;\n crawledAt: string | null;\n siteId: number;\n isHomePage?: boolean;\n}\n\nexport type PageResponseSourceMetadata = { [key: string]: unknown } | null;\n\nexport interface RenderedPageResponse {\n id: number;\n slug: string;\n title: string;\n status?: string;\n metaDescription?: string | null;\n content: string;\n contentBlocks?: TipTapDocumentOutput | null;\n createdAt: string;\n updatedAt?: string | null;\n locale?: string;\n availableLocales?: string[] | null;\n primaryLocale?: string | null;\n}\n\n/**\n * The existing field vocabulary, rejecting unrecognized constraints.\n */\nexport interface RequirementSchemaField {\n /** Unique field identifier */\n slug: string;\n /** Display name for the field */\n name: string;\n /** Optional field description */\n description?: string | null;\n fieldType?: RequirementSchemaFieldFieldType;\n /** Whether field is required */\n required?: boolean;\n /** Deprecated: Display order is now determined by array position */\n order?: number | null;\n /** Options for enum fields as {label, value} objects. */\n options?: EnumOption[] | null;\n /** Referenced DataType ID for reference fields */\n referencedTypeId?: number | null;\n /** Whether to index this field */\n shouldIndex?: boolean;\n /** Whether only admins can see this field */\n adminOnly?: boolean;\n /** Default value for the field */\n defaultValue?: unknown;\n /** CEL expression that computes this field's value. CONSTRAINT: Can ONLY reference regular fields (TEXT, NUMBER, DATE, etc.). Cannot reference other FUNCTION fields. Syntax: record.data.<field_slug>. Example: 'record.data.score1 + record.data.score2' */\n celFunction?: string | null;\n /** CEL expression for cross-field validation. Context: 'value' (current field value), 'record.data.<field_slug>' (other fields). Returns: true if valid, or a string error message if invalid. CONSTRAINT: Can only reference non-FUNCTION fields. Example: 'value >= record.data.min_score' or 'value < record.data.min_score ? \"Must be >= \" + string(record.data.min_score) : true' */\n validateCel?: string | null;\n /** Disclosure severity for audit and access policy */\n sensitivity?: RequirementSchemaFieldSensitivity;\n /** Regulatory or content categories for audit and policy */\n categories?: RequirementSchemaFieldCategoriesItem[];\n}\n\nexport type RequirementSchemaFieldCategoriesItem = typeof RequirementSchemaFieldCategoriesItem[keyof typeof RequirementSchemaFieldCategoriesItem];\n\n\nexport const RequirementSchemaFieldCategoriesItem = {\n personal: 'personal',\n identifier: 'identifier',\n phi: 'phi',\n credential: 'credential',\n} as const;\n\nexport type RequirementSchemaFieldFieldType = typeof RequirementSchemaFieldFieldType[keyof typeof RequirementSchemaFieldFieldType];\n\n\nexport const RequirementSchemaFieldFieldType = {\n array: 'array',\n boolean: 'boolean',\n date: 'date',\n datetime: 'datetime',\n email: 'email',\n enum: 'enum',\n function: 'function',\n integer: 'integer',\n longtext: 'longtext',\n number: 'number',\n object: 'object',\n phone: 'phone',\n text: 'text',\n time_of_day: 'time_of_day',\n us_zip_code: 'us_zip_code',\n} as const;\n\n/**\n * Disclosure severity for audit and access policy\n */\nexport type RequirementSchemaFieldSensitivity = typeof RequirementSchemaFieldSensitivity[keyof typeof RequirementSchemaFieldSensitivity];\n\n\nexport const RequirementSchemaFieldSensitivity = {\n public: 'public',\n internal: 'internal',\n confidential: 'confidential',\n restricted: 'restricted',\n secret: 'secret',\n} as const;\n\nexport interface SiteCountsResponse {\n pages: number;\n}\n\nexport interface SiteMappingResponse {\n wid: string;\n siteUuid: string;\n theme: string | null;\n primaryLocale: string;\n sessionKind: SessionKind;\n}\n\nexport interface SiteResponse {\n id: number;\n name: string;\n uuid: string;\n slug: string;\n assetsFolderId?: number | null;\n sourceFolderId?: number | null;\n sourceReleaseId?: number | null;\n theme: SiteResponseTheme;\n themeSettings?: SiteResponseThemeSettings;\n resolvedThemeSettings?: SiteResponseResolvedThemeSettings;\n content: string;\n authorized: boolean;\n tagLine: string | null;\n metaDescription: string | null;\n customDomain: string | null;\n redirectUrl: string | null;\n allowSignup: boolean;\n signupMemberRoleId?: number | null;\n signupMemberRoleName?: string | null;\n isMapped: boolean;\n isPublic: boolean;\n authenticationMethods?: 'name_dob'[];\n createdAt: string;\n updatedAt: string;\n isReseller: boolean;\n workspaceName: string;\n workspaceUuid?: string | null;\n ownerId?: number | null;\n defaultWorkflowId?: number | null;\n homePageId?: number | null;\n anonymousFormId?: number | null;\n anonymousFormUuid?: string | null;\n operatorLineE164?: string | null;\n url: string | null;\n defaultUrl?: string | null;\n googleAnalyticsId?: string | null;\n googleAdwordsId?: string | null;\n permissions?: number;\n organizationLogoUrl?: string | null;\n primaryLocale?: string;\n availableLocales?: string[];\n pageCount?: number | null;\n}\n\nexport type SiteResponseResolvedThemeSettings = { [key: string]: unknown };\n\nexport type SiteResponseTheme = typeof SiteResponseTheme[keyof typeof SiteResponseTheme] | null;\n\n\nexport const SiteResponseTheme = {\n default: 'default',\n 'gravityrail-home': 'gravityrail-home',\n 'gravityrail-home-2': 'gravityrail-home-2',\n 'gravityrail-start': 'gravityrail-start',\n 'leapcure-home': 'leapcure-home',\n 'leapcure-home-no-chat': 'leapcure-home-no-chat',\n 'leapcure-home-pre-launch': 'leapcure-home-pre-launch',\n 'admin-clinical-trial': 'admin-clinical-trial',\n 'customer-basic': 'customer-basic',\n 'rc360-demo': 'rc360-demo',\n 'patient-engagement-demo': 'patient-engagement-demo',\n 'operator-product': 'operator-product',\n 'gravity-health': 'gravity-health',\n 'gravity-developer': 'gravity-developer',\n 'gravityrail-launch': 'gravityrail-launch',\n 'gravity-rail-feb-2026': 'gravity-rail-feb-2026',\n 'gravity-rail-2026-v2': 'gravity-rail-2026-v2',\n 'operator-2026': 'operator-2026',\n 'cosan-enrollment': 'cosan-enrollment',\n 'cosan-enrollment-v2': 'cosan-enrollment-v2',\n 'gravity-health-enrollment': 'gravity-health-enrollment',\n 'source-site': 'source-site',\n} as const;\n\nexport type SiteResponseThemeSettings = { [key: string]: unknown };\n\n/**\n * Complete sharing state for a site.\n */\nexport interface SiteSharingResponse {\n ownerId: number;\n ownerName: string | null;\n access: string;\n shareable: boolean;\n grants: AccessGrantResponse[];\n audience: string[];\n}\n\nexport interface SiteSignupResponse {\n status: SiteSignupResponseStatus;\n message: string;\n memberId?: number | null;\n roleName?: string | null;\n}\n\nexport type SiteSignupResponseStatus = typeof SiteSignupResponseStatus[keyof typeof SiteSignupResponseStatus];\n\n\nexport const SiteSignupResponseStatus = {\n success: 'success',\n already_member: 'already_member',\n} as const;\n\n/**\n * One configurable value a theme declares.\n */\nexport interface ThemeSettingField {\n /** Machine name; the key under Site.theme_settings */\n key: string;\n /** Display label shown in the Theme Settings form */\n label: string;\n /** Field/value type */\n type: ThemeSettingFieldType;\n /** Help text shown under the field */\n description?: string | null;\n /** Whether a value must be set */\n required?: boolean;\n /** Default value used when none is saved */\n default?: unknown | null;\n /** Choices for a 'select' field */\n options?: EnumOption[] | null;\n /** Optional section header to group fields under */\n group?: string | null;\n /** For reference fields (e.g. data_type): a payload matching the entity's create API (DataTypeFormData), used by the field's Create button to scaffold a new entity pre-populated with the theme's defaults. */\n createDefaults?: ThemeSettingFieldCreateDefaults;\n /** Schema contract the selected workspace-local Form must satisfy */\n dataTypeRequirement?: DataTypeRequirement | null;\n /** The value names the workspace itself (for example a practice name or logo). A template clone copies it so the theme can render, and import readiness reports it while it still equals the template's value. */\n perWorkspace?: boolean;\n /** Let editor clients identify reference pickers from the server schema. */\n readonly isReference: boolean;\n}\n\n/**\n * For reference fields (e.g. data_type): a payload matching the entity's create API (DataTypeFormData), used by the field's Create button to scaffold a new entity pre-populated with the theme's defaults.\n */\nexport type ThemeSettingFieldCreateDefaults = { [key: string]: unknown } | null;\n\n/**\n * Field/value type\n */\nexport type ThemeSettingFieldType = typeof ThemeSettingFieldType[keyof typeof ThemeSettingFieldType];\n\n\nexport const ThemeSettingFieldType = {\n text: 'text',\n textarea: 'textarea',\n number: 'number',\n boolean: 'boolean',\n select: 'select',\n color: 'color',\n url: 'url',\n image: 'image',\n data_type: 'data_type',\n workflow: 'workflow',\n page: 'page',\n member_role: 'member_role',\n phone_number: 'phone_number',\n} as const;\n\n/**\n * The active theme's configurable settings, their saved values, and the\n * theme's capabilities — everything the Theme Settings tab needs in one call.\n *\n * ``fields`` is the declared schema (source-site manifest or hard-coded\n * registry); ``values`` are editor values keyed by field key (saved UUID references\n * are adapted to entity IDs for the existing pickers); ``features`` are the theme's capabilities.\n */\nexport interface ThemeSettingsResponse {\n fields: ThemeSettingField[];\n values: ThemeSettingsResponseValues;\n features: ThemeFeatures;\n}\n\nexport type ThemeSettingsResponseValues = { [key: string]: unknown };\n\n/**\n * TipTap native document structure.\n *\n * Matches the TypeScript interface:\n * {\n * type: 'doc';\n * content?: Array<{\n * type: string;\n * attrs?: Record<string, any>;\n * content?: any[];\n * marks?: Array<{ type: string; attrs?: Record<string, any> }>;\n * text?: string;\n * }>;\n * }\n */\nexport interface TipTapDocumentOutput {\n type?: 'doc';\n content?: TipTapNodeOutput[] | null;\n translations?: TipTapDocumentOutputTranslations;\n [key: string]: unknown;\n }\n\nexport type TipTapDocumentOutputTranslations = {[key: string]: TipTapDocumentOutput} | null;\n\n/**\n * A mark in TipTap (like bold, italic, etc.)\n */\nexport interface TipTapMark {\n type: string;\n attrs?: TipTapMarkAttrs;\n [key: string]: unknown;\n }\n\nexport type TipTapMarkAttrs = { [key: string]: unknown } | null;\n\n/**\n * A node in the TipTap document structure\n */\nexport interface TipTapNodeOutput {\n type: string;\n attrs?: TipTapNodeOutputAttrs;\n content?: TipTapNodeOutput[] | null;\n marks?: TipTapMark[] | null;\n text?: string | null;\n [key: string]: unknown;\n }\n\nexport type TipTapNodeOutputAttrs = { [key: string]: unknown } | null;\n\nexport interface UnauthorizedSiteResponse {\n id: number;\n name: string;\n uuid: string;\n slug: string;\n assetsFolderId?: number | null;\n sourceFolderId?: number | null;\n sourceReleaseId?: number | null;\n theme: UnauthorizedSiteResponseTheme;\n themeSettings?: UnauthorizedSiteResponseThemeSettings;\n resolvedThemeSettings?: UnauthorizedSiteResponseResolvedThemeSettings;\n content: string;\n authorized: boolean;\n tagLine: string | null;\n metaDescription: string | null;\n customDomain?: string | null;\n redirectUrl: string | null;\n allowSignup?: boolean;\n signupMemberRoleId?: number | null;\n signupMemberRoleName?: string | null;\n isMapped?: boolean;\n isPublic: boolean;\n authenticationMethods?: 'name_dob'[];\n createdAt: string;\n updatedAt: string;\n isReseller: boolean;\n workspaceName?: string;\n workspaceUuid?: string | null;\n ownerId?: number | null;\n defaultWorkflowId?: number | null;\n homePageId?: number | null;\n anonymousFormId?: number | null;\n anonymousFormUuid?: string | null;\n operatorLineE164?: string | null;\n url?: string | null;\n defaultUrl?: string | null;\n googleAnalyticsId?: string | null;\n googleAdwordsId?: string | null;\n permissions?: number;\n organizationLogoUrl?: string | null;\n primaryLocale?: string;\n availableLocales?: string[];\n pageCount?: number | null;\n}\n\nexport type UnauthorizedSiteResponseResolvedThemeSettings = { [key: string]: unknown };\n\nexport type UnauthorizedSiteResponseTheme = typeof UnauthorizedSiteResponseTheme[keyof typeof UnauthorizedSiteResponseTheme] | null;\n\n\nexport const UnauthorizedSiteResponseTheme = {\n default: 'default',\n 'gravityrail-home': 'gravityrail-home',\n 'gravityrail-home-2': 'gravityrail-home-2',\n 'gravityrail-start': 'gravityrail-start',\n 'leapcure-home': 'leapcure-home',\n 'leapcure-home-no-chat': 'leapcure-home-no-chat',\n 'leapcure-home-pre-launch': 'leapcure-home-pre-launch',\n 'admin-clinical-trial': 'admin-clinical-trial',\n 'customer-basic': 'customer-basic',\n 'rc360-demo': 'rc360-demo',\n 'patient-engagement-demo': 'patient-engagement-demo',\n 'operator-product': 'operator-product',\n 'gravity-health': 'gravity-health',\n 'gravity-developer': 'gravity-developer',\n 'gravityrail-launch': 'gravityrail-launch',\n 'gravity-rail-feb-2026': 'gravity-rail-feb-2026',\n 'gravity-rail-2026-v2': 'gravity-rail-2026-v2',\n 'operator-2026': 'operator-2026',\n 'cosan-enrollment': 'cosan-enrollment',\n 'cosan-enrollment-v2': 'cosan-enrollment-v2',\n 'gravity-health-enrollment': 'gravity-health-enrollment',\n 'source-site': 'source-site',\n} as const;\n\nexport type UnauthorizedSiteResponseThemeSettings = { [key: string]: unknown };\n\n/**\n * Update a site.\n */\nexport interface UpdateSiteRequest {\n name?: string | null;\n slug?: string | null;\n theme?: UpdateSiteRequestTheme;\n customDomain?: string | null;\n redirectUrl?: string | null;\n allowSignup?: boolean | null;\n signupMemberRoleId?: number | null;\n content?: string | null;\n isReseller?: boolean | null;\n isPublic?: boolean | null;\n authenticationMethods?: 'name_dob'[] | null;\n tagLine?: string | null;\n defaultWorkflowId?: number | null;\n homePageId?: number | null;\n googleAnalyticsId?: string | null;\n googleAdwordsId?: string | null;\n primaryLocale?: string | null;\n availableLocales?: string[] | null;\n anonymousFormId?: number | null;\n}\n\nexport type UpdateSiteRequestTheme = typeof UpdateSiteRequestTheme[keyof typeof UpdateSiteRequestTheme] | null;\n\n\nexport const UpdateSiteRequestTheme = {\n default: 'default',\n 'gravityrail-home': 'gravityrail-home',\n 'gravityrail-home-2': 'gravityrail-home-2',\n 'gravityrail-start': 'gravityrail-start',\n 'leapcure-home': 'leapcure-home',\n 'leapcure-home-no-chat': 'leapcure-home-no-chat',\n 'leapcure-home-pre-launch': 'leapcure-home-pre-launch',\n 'admin-clinical-trial': 'admin-clinical-trial',\n 'customer-basic': 'customer-basic',\n 'rc360-demo': 'rc360-demo',\n 'patient-engagement-demo': 'patient-engagement-demo',\n 'operator-product': 'operator-product',\n 'gravity-health': 'gravity-health',\n 'gravity-developer': 'gravity-developer',\n 'gravityrail-launch': 'gravityrail-launch',\n 'gravity-rail-feb-2026': 'gravity-rail-feb-2026',\n 'gravity-rail-2026-v2': 'gravity-rail-2026-v2',\n 'operator-2026': 'operator-2026',\n 'cosan-enrollment': 'cosan-enrollment',\n 'cosan-enrollment-v2': 'cosan-enrollment-v2',\n 'gravity-health-enrollment': 'gravity-health-enrollment',\n 'source-site': 'source-site',\n} as const;\n\n/**\n * Complete desired sharing state for a Site.\n *\n * ``audience`` lists the UUIDs of the MemberRoles whose Members may sign in\n * through the Site. ``access=\"workspace\"`` puts every role in the audience.\n */\nexport interface UpdateSiteSharingRequest {\n access: UpdateSiteSharingRequestAccess;\n shareable?: boolean | null;\n grants: SharingGrantEntry[];\n audience?: string[];\n}\n\nexport type UpdateSiteSharingRequestAccess = typeof UpdateSiteSharingRequestAccess[keyof typeof UpdateSiteSharingRequestAccess];\n\n\nexport const UpdateSiteSharingRequestAccess = {\n private: 'private',\n workspace: 'workspace',\n public: 'public',\n} as const;\n\n/**\n * Save values for the active theme's declared settings.\n *\n * Values are validated/coerced against the resolved schema in the handler\n * (undeclared keys dropped, references checked); see lib/services/theme_settings.py.\n */\nexport interface UpdateThemeSettingsRequest {\n values?: UpdateThemeSettingsRequestValues;\n}\n\nexport type UpdateThemeSettingsRequestValues = { [key: string]: unknown };\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: task\n */\n\nimport type { AbilityData, AbilityResponse } from './ability';\nimport type { ConfigHealthIssue } from './config_health';\nimport type { DataRecordResponse } from './data';\nimport type { EventRuleData, EventRuleResponse } from './event_rule';\nimport type { FileResponse } from './file';\nimport type { PageResponse } from './site';\nimport type { TaskAssociationRequest } from './workspace';\n\n/**\n * A non-blocking diagnostic about an ability's configuration.\n *\n * Emitted by :meth:`AbilityBase.collect_config_issues` and aggregated\n * by the workflow-level config validation route. Config issues describe\n * drift in the ability's own references (e.g. a file that was deleted\n * after the ability was saved).\n */\nexport interface AbilityConfigIssue {\n severity: AbilityConfigIssueSeverity;\n code: AbilityConfigIssueCode;\n abilityType: string;\n taskId?: number | null;\n resourceType?: string | null;\n resourceId?: number | string | null;\n resourceName?: string | null;\n objectType?: string | null;\n eventType?: string | null;\n message: string;\n}\n\nexport type AbilityConfigIssueCode = typeof AbilityConfigIssueCode[keyof typeof AbilityConfigIssueCode];\n\n\nexport const AbilityConfigIssueCode = {\n missing_resource: 'missing_resource',\n invalid_state: 'invalid_state',\n feature_disabled: 'feature_disabled',\n missing_connection: 'missing_connection',\n external_drift: 'external_drift',\n missing_task_instructions: 'missing_task_instructions',\n no_qualification_scenarios: 'no_qualification_scenarios',\n} as const;\n\nexport type AbilityConfigIssueSeverity = typeof AbilityConfigIssueSeverity[keyof typeof AbilityConfigIssueSeverity];\n\n\nexport const AbilityConfigIssueSeverity = {\n warning: 'warning',\n error: 'error',\n} as const;\n\nexport interface AssignmentResponse {\n id: number;\n uuid: string;\n taskId?: number | null;\n taskName?: string | null;\n memberId: number;\n createdAt: string;\n updatedAt: string;\n status?: string;\n outcome?: string | null;\n outcomeReason?: string | null;\n concludedAt?: string | null;\n rootTask?: AssignmentTaskResponse | null;\n currentTask?: AssignmentTaskResponse | null;\n isTest: boolean;\n dataRecords?: DataRecordResponse[];\n files: FileResponse[];\n pages?: PageResponse[];\n workflowId: number;\n workflowName?: string | null;\n workflowUuid?: string | null;\n workflowRevisionId?: number | null;\n workflowRevisionUuid?: string | null;\n workflowRevisionNumber?: number | null;\n workflowRevisionName?: string | null;\n}\n\n/**\n * Response model for assignment task endpoints.\n */\nexport interface AssignmentTaskResponse {\n id: number;\n uuid: string;\n required: boolean;\n autoNext: boolean;\n taskId: number;\n workflowId: number;\n taskName: string;\n taskUuid: string;\n visitedAt: string | null;\n children?: AssignmentTaskResponse[];\n}\n\n/**\n * Response model for child task endpoints.\n *\n * ``id`` is the **TaskAssociation row id** — the edge's own identity, which\n * Workflow Health warnings address and the editor deep-links to. It is\n * ``None`` for an edge of an installed Workflow: the edge lives on the pinned\n * resource revision and this workspace has no association row for it, so\n * there is no id to report. Reporting the child Task's id instead would look\n * like an association id and silently never match.\n */\nexport interface ChildTaskResponse {\n id: number | null;\n taskId: number;\n taskName: string;\n taskUuid: string;\n choicePrompt: string | null;\n celCondition: string | null;\n order: number;\n autoNext: boolean;\n required: boolean;\n}\n\n/**\n * Request body for cloning a task.\n */\nexport interface CloneTaskRequest {\n name: string;\n slug?: string | null;\n}\n\n/**\n * Create a new task.\n */\nexport interface CreateTaskRequest {\n name: string;\n taskType?: string | null;\n configuration?: CreateTaskRequestConfiguration;\n description?: string | null;\n prompt?: string | null;\n isAdmin?: boolean;\n childTasks?: TaskAssociationRequest[] | null;\n celGuard?: string | null;\n workflowId?: number | null;\n workflowRevisionId?: number | null;\n posX?: number | null;\n posY?: number | null;\n abilities?: AbilityData[] | null;\n eventRules?: EventRuleData[] | null;\n}\n\nexport type CreateTaskRequestConfiguration = { [key: string]: unknown } | null;\n\n/**\n * Response from executing a tool in the context of an assignment.\n */\nexport interface ExecuteToolResponse {\n toolName: string;\n result: string;\n success?: boolean;\n chatId?: number | null;\n}\n\n/**\n * One authored opening line.\n *\n * ``channel`` is either :data:`DEFAULT_CHANNEL_KEY` or a canonical\n * ``Channel``; ``locale`` is a supported locale tag. Both are validated at\n * the request boundary (``validate_initial_message_entries``) rather than\n * here, so a malformed value is a 422 naming the field instead of a generic\n * model error — and so an import or direct DB write cannot smuggle a bad\n * vocabulary token past the API.\n */\nexport interface GreetingEntry {\n /** Canonical Channel, or 'default' for any channel. */\n channel?: string;\n /** Supported locale tag, e.g. 'en-US'. */\n locale: string;\n /** What the assistant opens with. */\n text: string;\n}\n\n/**\n * Child task info for the operator assignment view.\n */\nexport interface OperatorChildTaskDetail {\n assignmentTaskId: number;\n taskId: number;\n taskName: string;\n taskUuid: string;\n taskType: string;\n choicePrompt?: string | null;\n celCondition?: string | null;\n autoNext?: boolean;\n required?: boolean;\n order?: number;\n visitedAt?: string | null;\n}\n\n/**\n * Rich task detail for operator assignment view.\n *\n * Includes prompt, abilities, and child task details with CEL conditions\n * so the operator can see what the AI would see and navigate workflow steps.\n */\nexport interface OperatorTaskDetailResponse {\n assignmentId: number;\n assignmentTaskId: number;\n taskId: number;\n taskName: string;\n taskType: string;\n prompt?: string | null;\n renderedPrompt?: string | null;\n description?: string | null;\n configuration?: OperatorTaskDetailResponseConfiguration;\n celGuard?: string | null;\n abilities?: AbilityResponse[];\n inheritedAbilities?: AbilityResponse[];\n childTasks?: OperatorChildTaskDetail[];\n parentAssignmentTaskId?: number | null;\n parentTaskName?: string | null;\n}\n\nexport type OperatorTaskDetailResponseConfiguration = { [key: string]: unknown } | null;\n\n/**\n * Response model for task assignment statistics.\n */\nexport interface TaskAssignmentStatsResponse {\n current: number;\n total: number;\n parentTotal?: number | null;\n}\n\n/**\n * Response model for a chat on a specific task.\n */\nexport interface TaskChatResponse {\n chatId: number;\n chatUuid: string;\n title?: string | null;\n summary?: string | null;\n assignmentId: number;\n memberName: string;\n memberId: number;\n currentTaskName: string;\n workflowName: string;\n lastMessageAt?: string | null;\n messageCount?: number;\n}\n\n/**\n * Response model for paginated list of task chats.\n */\nexport interface TaskChatsListResponse {\n items: TaskChatResponse[];\n total: number;\n limit: number;\n offset: number;\n}\n\n/**\n * Response model for task endpoints.\n */\nexport interface TaskResponse {\n id: number;\n name: string;\n uuid: string;\n lineageUuid?: string | null;\n taskType: string;\n configuration?: TaskResponseConfiguration;\n workflowId?: number | null;\n workflowRevisionId?: number | null;\n description: string | null;\n prompt: string | null;\n ownerId?: number | null;\n createdAt: string;\n updatedAt: string;\n archived: boolean;\n isAdmin: boolean;\n enterRules: EventRuleResponse[];\n leaveRules: EventRuleResponse[];\n childTasks?: ChildTaskResponse[];\n permissions?: number;\n celGuard?: string | null;\n posX?: number | null;\n posY?: number | null;\n abilities?: AbilityResponse[];\n inheritedAbilities?: AbilityResponse[];\n eventRules?: EventRuleResponse[];\n}\n\nexport type TaskResponseConfiguration = { [key: string]: unknown } | null;\n\n/**\n * Update a task.\n */\nexport interface UpdateTaskRequest {\n name?: string | null;\n taskType?: string | null;\n configuration?: UpdateTaskRequestConfiguration;\n workflowId?: number | null;\n workflowRevisionId?: number | null;\n description?: string | null;\n prompt?: string | null;\n isAdmin?: boolean | null;\n childTasks?: TaskAssociationRequest[] | null;\n ownerId?: number | null;\n celGuard?: string | null;\n posX?: number | null;\n posY?: number | null;\n abilities?: AbilityData[] | null;\n eventRules?: EventRuleData[] | null;\n archived?: boolean | null;\n}\n\nexport type UpdateTaskRequestConfiguration = { [key: string]: unknown } | null;\n\n/**\n * Response model for workflow config-validation (drift) diagnostics.\n *\n * ``configHealthIssues`` is the canonical contract (plan §3.9) and the\n * stable final field name — it is deliberately NOT renamed back onto\n * ``issues`` at cleanup, so consumers see only one wire-type change.\n * Discriminated provenance (a real Ability slug versus a closed detector\n * code) and typed remediation focus replace the overloaded ``abilityType``.\n *\n * ``issues`` is the LEGACY field and this is Phase 3A, the additive step: a\n * browser still running a pre-cutover bundle reads ``issues``, so removing\n * it in the same deploy that ships the canonical bundle would silently empty\n * every one of those dialogs. Both lists are produced from ONE evaluation —\n * :func:`lib.services.config_health_legacy.to_legacy_ability_issues`\n * projects the same findings — so nothing is evaluated twice and the two can\n * never disagree. Phase 3C removes ``issues`` in a later PR and deploy.\n *\n * The endpoint still evaluates the editor's DRAFT revision — the canonical\n * item shape is lifecycle-neutral.\n */\nexport interface WorkflowConfigValidationResponse {\n issues?: AbilityConfigIssue[];\n configHealthIssues?: ConfigHealthIssue[];\n}\n\n/**\n * Response model for workflow contributor.\n */\nexport interface WorkflowContributorResponse {\n id: number;\n workflowRevisionId: number;\n memberId: number;\n title: string;\n channels: string[];\n hint?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Response model for workflow note.\n */\nexport interface WorkflowNoteResponse {\n id: number;\n uuid: string;\n /** STABLE Workflow root id */\n workflowId: number;\n /** WorkflowRevision id this note is scoped to */\n workflowRevisionId: number;\n posX: number;\n posY: number;\n width: number;\n height: number;\n contents: string;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * One executable workflow revision — pure revision facts only.\n *\n * Root facts (name/description/owner/archived/defaults) live on\n * :class:`WorkflowResponse`; this model carries revision identity plus\n * ``workflowId`` / ``workflowUuid`` / ``workflowName`` backrefs and, when\n * loaded, the graph collections (abilities, event rules, contributors,\n * task counts) and the caller's permission mask.\n */\nexport interface WorkflowRevisionResponse {\n id: number;\n uuid: string;\n workflowId: number;\n workflowUuid: string;\n workflowName?: string | null;\n revisionNumber?: number | null;\n revisionName?: string | null;\n publishNotes?: string | null;\n publishedAt?: string | null;\n publishedByAccountUuid?: string | null;\n prompt?: string | null;\n assistantName?: string | null;\n assistantIdentity?: string | null;\n initialMessageOutbound?: GreetingEntry[] | null;\n initialMessageInbound?: GreetingEntry[] | null;\n assistantConfigDigest: string;\n startTaskId?: number | null;\n chatModelId: string;\n chatModelConfig?: WorkflowRevisionResponseChatModelConfig;\n realtimeModelId?: string | null;\n realtimeModelConfig?: WorkflowRevisionResponseRealtimeModelConfig;\n routingMode?: string;\n dataTypeSlug?: string | null;\n posX?: number | null;\n posY?: number | null;\n createdAt: string;\n updatedAt: string;\n taskCount?: number;\n archivedTaskCount?: number;\n permissions?: number;\n abilities?: AbilityResponse[];\n eventRules?: EventRuleResponse[];\n contributors?: WorkflowContributorResponse[];\n}\n\nexport type WorkflowRevisionResponseChatModelConfig = { [key: string]: unknown } | null;\n\nexport type WorkflowRevisionResponseRealtimeModelConfig = { [key: string]: unknown } | null;\n\n/**\n * PHI-safe response shape for the route dry-run endpoint.\n *\n * Fields:\n * assignmentId / chatId — context the dry-run was executed under.\n * sourceTaskId / sourceAssignmentTaskId — current Task/AssignmentTask\n * resolved from the supplied chat context (after applying any\n * ``current_task_id`` / ``current_assignment_task_id`` overrides).\n * status — one of the\n * :class:`lib.services.cel_edge_evaluator.EdgeEvaluationStatus`\n * labels (e.g. ``\"no_edges\"``, ``\"no_match\"``,\n * ``\"would_transition\"``, ``\"matched_current_task\"``,\n * ``\"missing_assignment_task\"``, ``\"transition_blocked\"``,\n * ``\"error\"``).\n * edgeCount — number of automatic-routing-candidate edges the\n * evaluator considered.\n * candidateChildTaskIds — Task IDs of every candidate edge the\n * evaluator examined.\n * winningChildTaskId — Task ID of the matched child Task, populated\n * when ``status == \"would_transition\"`` or\n * ``\"matched_current_task\"`` or ``\"missing_assignment_task\"``\n * or ``\"transition_blocked\"``.\n * errorType — exception class name only when ``status == \"error\"``;\n * never the raw ``str(exc)`` message.\n * issues — optional list of related ``AbilityConfigIssue`` entries\n * (e.g. from the Workflow Health collectors) the caller may\n * surface alongside the trace. The route may leave this empty\n * in Phase 4; the field exists to keep the contract stable.\n *\n * PHI guard (enforced by tests): raw CEL, Form values, Member values,\n * Chat content, and ``str(exc)`` MUST NOT appear on this response.\n */\nexport interface WorkflowRouteDryRunResponse {\n assignmentId: number;\n chatId: number;\n sourceTaskId?: number | null;\n sourceAssignmentTaskId?: number | null;\n status: string;\n edgeCount: number;\n candidateChildTaskIds?: number[];\n winningChildTaskId?: number | null;\n errorType?: string | null;\n issues?: AbilityConfigIssue[];\n}\n\n/**\n * Response model for a workflow template.\n */\nexport interface WorkflowTemplateResponse {\n uuid: string;\n name: string;\n icon: string;\n shortDescription: string;\n longDescription: string;\n defaultWorkflowName: string;\n exampleConversation: string;\n requiredFeatures: string[];\n tags?: string[];\n available: boolean;\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: workflow\n */\n\nimport type { AbilityData } from './ability';\nimport type { EventRuleData } from './event_rule';\nimport type { InstallationSummaryResponse } from './installation_contract';\nimport type { GreetingEntry } from './task';\n\n/**\n * Request body for ``POST /workflows/{workflow_id}/revisions/{revision_id}/activate``.\n *\n * Pointer flip only. ``allowDraft=True`` is required when the target\n * revision is the workflow's draft (legacy / \"make my edits live\"\n * flow); the UI sets it after the user dismisses a warning banner.\n */\nexport interface ActivateWorkflowRevisionRequest {\n allowDraft?: boolean;\n}\n\n/**\n * Request model for cloning a workflow.\n */\nexport interface CloneWorkflowRequest {\n name: string;\n}\n\n/**\n * Request model for creating a workflow.\n */\nexport interface CreateWorkflowRequest {\n name: string;\n description?: string | null;\n prompt?: string | null;\n ownerId?: number | null;\n copyFromAgentId?: number | null;\n copyFromWorkflowRevisionId?: number | null;\n copySourceDigest?: string | null;\n assistantName?: string | null;\n assistantIdentity?: string | null;\n initialMessageOutbound?: GreetingEntry[] | null;\n initialMessageInbound?: GreetingEntry[] | null;\n chatModelId?: string | null;\n chatModelConfig?: CreateWorkflowRequestChatModelConfig;\n realtimeModelId?: string | null;\n realtimeModelConfig?: CreateWorkflowRequestRealtimeModelConfig;\n defaultPhoneNumberId?: number | null;\n defaultInboxId?: number | null;\n routingMode?: WorkflowRoutingMode;\n dataTypeSlug?: string | null;\n defaultTaskName?: string | null;\n defaultTaskDescription?: string | null;\n defaultTaskPrompt?: string | null;\n createMode?: CreateWorkflowRequestCreateMode;\n abilities?: AbilityData[] | null;\n eventRules?: EventRuleData[] | null;\n}\n\nexport type CreateWorkflowRequestChatModelConfig = { [key: string]: unknown } | null;\n\nexport type CreateWorkflowRequestCreateMode = typeof CreateWorkflowRequestCreateMode[keyof typeof CreateWorkflowRequestCreateMode];\n\n\nexport const CreateWorkflowRequestCreateMode = {\n task: 'task',\n taskless: 'taskless',\n} as const;\n\nexport type CreateWorkflowRequestRealtimeModelConfig = { [key: string]: unknown } | null;\n\n/**\n * Request body for ``POST /workflows/{workflow_id}/revisions/{revision_id}/edit``.\n *\n * Branches a published revision into the workflow's draft: the draft\n * becomes a fresh clone of the named published revision. When the\n * current draft already has unpublished changes, pass\n * ``discardDraftChanges=True`` to replace it; otherwise the request is\n * rejected so edits are not silently discarded.\n */\nexport interface EditRevisionAsDraftRequest {\n discardDraftChanges?: boolean;\n}\n\n/**\n * Request body for ``POST /workflows/{workflow_id}/publish``.\n *\n * Freezes the current draft as a published revision and clones it into\n * a fresh draft. ``revisionName`` is an optional short label;\n * ``publishNotes`` is an optional longer summary captured at publish\n * time. ``setActive=False`` is reserved for advanced flows that want\n * to publish without flipping live traffic; the UI does not expose\n * this toggle in v1.\n */\nexport interface PublishWorkflowRevisionRequest {\n revisionName?: string | null;\n publishNotes?: string | null;\n setActive?: boolean;\n}\n\n/**\n * Request body for ``PATCH /workflows/{workflow_id}/revisions/{revision_id}``.\n *\n * Curation-only metadata for a revision — the human-readable label and\n * the publish notes. Applies to BOTH the draft and published revisions\n * (labels/notes are curation, not graph state), so it never bumps\n * ``draft_modified_at``. Only fields explicitly present in the request\n * body are applied; an explicit ``null`` clears the field.\n */\nexport interface UpdateWorkflowRevisionMetadataRequest {\n revisionName?: string | null;\n publishNotes?: string | null;\n}\n\n/**\n * Request model for updating the active workflow revision and stable workflow fields.\n */\nexport interface UpdateWorkflowRevisionRequest {\n name?: string | null;\n description?: string | null;\n prompt?: string | null;\n ownerId?: number | null;\n startTaskId?: number | null;\n copyFromAgentId?: number | null;\n copyFromWorkflowRevisionId?: number | null;\n copySourceDigest?: string | null;\n assistantName?: string | null;\n assistantIdentity?: string | null;\n initialMessageOutbound?: GreetingEntry[] | null;\n initialMessageInbound?: GreetingEntry[] | null;\n chatModelId?: string | null;\n chatModelConfig?: UpdateWorkflowRevisionRequestChatModelConfig;\n realtimeModelId?: string | null;\n realtimeModelConfig?: UpdateWorkflowRevisionRequestRealtimeModelConfig;\n defaultPhoneNumberId?: number | null;\n defaultInboxId?: number | null;\n routingMode?: WorkflowRoutingMode | null;\n dataTypeSlug?: string | null;\n posX?: number | null;\n posY?: number | null;\n abilities?: AbilityData[] | null;\n eventRules?: EventRuleData[] | null;\n}\n\nexport type UpdateWorkflowRevisionRequestChatModelConfig = { [key: string]: unknown } | null;\n\nexport type UpdateWorkflowRevisionRequestRealtimeModelConfig = { [key: string]: unknown } | null;\n\n/**\n * Minimal discovery projection: one runnable workflow, identity only.\n *\n * Serves ``GET /workflows/discoverable`` (GRA-8442), the member-scoped\n * discovery path for companion devices bound to members whose role does not\n * grant ``workflows:read``. Deliberately carries **no** description and **no**\n * prompt: both are operator-authored free text the scope-gated list treats as\n * potentially PHI-bearing, and a discovery surface needs only enough to\n * render a carousel entry and start the assignment chat. The full definition\n * remains at ``GET /workflows/{workflow_id}`` (``WorkflowAction.USE``).\n */\nexport interface WorkflowDiscoveryItemResponse {\n id: number;\n uuid: string;\n name: string;\n activeRevisionId: number;\n activeRevisionUuid: string;\n}\n\n/**\n * List composition: root + active revision summary + list enrichments.\n *\n * Each list row is a stable workflow represented by its active revision.\n * ``taskCount`` / ``archivedTaskCount`` / ``permissions`` are the list\n * enrichments computed against the active graph so rows can be badged\n * without a per-row request.\n *\n * ``prompt`` is the active revision's workflow-level prompt for every row\n * (taskless and multi-step alike). Taskless grid cards render it in place\n * of a task-graph thumbnail; multi-step rows keep the same field for a\n * consistent list payload.\n */\nexport interface WorkflowListItemResponse {\n workflow: WorkflowResponse;\n activeRevision?: WorkflowRevisionSummaryResponse | null;\n taskCount?: number;\n archivedTaskCount?: number;\n permissions?: number;\n prompt?: string | null;\n installation?: InstallationSummaryResponse | null;\n}\n\n/**\n * The stable workflow root.\n *\n * Carries only root facts: identity, ownership, defaults, and the\n * revision pointer columns. The executable graph lives on\n * ``WorkflowRevisionResponse``; ``activeRevisionId`` / ``draftRevisionId``\n * let a client resolve either without a second request, and\n * ``draftModifiedAt`` is the single fact behind the editor's\n * \"unpublished changes\" state (derived client-side, never on the wire).\n */\nexport interface WorkflowResponse {\n id: number;\n uuid: string;\n name: string;\n description?: string | null;\n ownerId: number;\n archived?: boolean;\n archivedAt?: string | null;\n archivedById?: number | null;\n templateUuid?: string | null;\n defaultPhoneNumberId?: number | null;\n defaultInboxId?: number | null;\n activeRevisionId: number;\n draftRevisionId: number;\n draftModifiedAt?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Ability diff keyed by ``(ability_type, task lineage or None)``.\n * ``changed`` lists keys present on both sides whose config JSON differs\n * — a flag only; the config contents are never included.\n */\nexport interface WorkflowRevisionDiffAbilities {\n added: string[];\n removed: string[];\n changed: string[];\n}\n\n/**\n * Task-association diff. Edges are keyed by the ``(parent, child)``\n * task lineage pair and rendered ``\"Parent → Child\"`` using base-side\n * names (falling back to other-side), so renaming a task does not churn\n * every edge.\n */\nexport interface WorkflowRevisionDiffEdges {\n added: string[];\n removed: string[];\n}\n\n/**\n * Event-rule diff keyed by ``(name or event_type+object_type, task\n * lineage or None)``. ``changed`` lists keys present on both sides whose\n * trigger/action config differs — a flag only; the config contents are\n * never included.\n */\nexport interface WorkflowRevisionDiffEventRules {\n added: string[];\n removed: string[];\n changed: string[];\n}\n\n/**\n * One changed scalar between two revisions.\n *\n * ``base`` / ``other`` carry the verbatim values for readable scalars\n * (prompt, model ids, routing mode, data-type slug, resolved start-task\n * name). For JSON-blob fields (``chatModelConfig``, ``realtimeModelConfig``,\n * a Task's ``configuration``) the values are intentionally omitted (both\n * ``null``): the presence of the field name signals the change while\n * keeping the payload small and free of nested config blobs. Prompt and\n * other scalar text is workspace config readable by the same READ\n * authority, so it is returned verbatim (not PHI).\n */\nexport interface WorkflowRevisionDiffFieldChange {\n field: string;\n base?: unknown | null;\n other?: unknown | null;\n}\n\n/**\n * Structured diff between two revisions of the same workflow.\n *\n * ``base`` is the revision named in the path; ``other`` is the\n * comparison target (``against`` query param, defaulting to the\n * workflow's draft).\n */\nexport interface WorkflowRevisionDiffResponse {\n base: WorkflowRevisionDiffSide;\n other: WorkflowRevisionDiffSide;\n revisionFields: WorkflowRevisionDiffFieldChange[];\n tasks: WorkflowRevisionDiffTasks;\n edges: WorkflowRevisionDiffEdges;\n abilities: WorkflowRevisionDiffAbilities;\n eventRules: WorkflowRevisionDiffEventRules;\n}\n\n/**\n * Identity of one side of a revision diff.\n */\nexport interface WorkflowRevisionDiffSide {\n id: number;\n revisionNumber?: number | null;\n revisionName?: string | null;\n isDraft?: boolean;\n}\n\n/**\n * A logical task (matched by ``lineage_uuid``) present in both\n * revisions with at least one changed field. ``name`` is the current\n * (other-side) name; a rename appears as a ``name`` entry in ``fields``.\n */\nexport interface WorkflowRevisionDiffTaskChange {\n lineageUuid: string;\n name: string;\n fields: WorkflowRevisionDiffFieldChange[];\n}\n\n/**\n * Task-level diff. Tasks are matched by lineage, so ``added`` /\n * ``removed`` carry the names of tasks whose lineage is present on only\n * one side, and a rename is a changed ``name`` field, not add+remove.\n */\nexport interface WorkflowRevisionDiffTasks {\n added: string[];\n removed: string[];\n changed: WorkflowRevisionDiffTaskChange[];\n}\n\n/**\n * The revision history for one workflow.\n *\n * Carries the ``workflow`` root (its ``activeRevisionId`` /\n * ``draftRevisionId`` pointer columns let clients badge each history row)\n * alongside the revision summaries.\n */\nexport interface WorkflowRevisionListResponse {\n workflow: WorkflowResponse;\n revisions: WorkflowRevisionSummaryResponse[];\n}\n\n/**\n * Summary response for one workflow revision (draft or published).\n *\n * Used by the revision-history list and by Publish / Activate / Edit\n * responses. Carries revision facts plus the config scalars that define\n * what the revision runs as (``routingMode``, ``dataTypeSlug``,\n * ``chatModelId``, ``realtimeModelId``) — keep those present: an absent\n * field is indistinguishable from a null column on the wire, and\n * ``activeRevision`` is the only API view of the live revision. No\n * ``state`` / ``isActive`` / ``isDraft`` derivations (client-derived from\n * the composition's ``workflow`` pointers) and no root facts.\n */\nexport interface WorkflowRevisionSummaryResponse {\n id: number;\n uuid: string;\n workflowId: number;\n revisionNumber?: number | null;\n revisionName?: string | null;\n publishNotes?: string | null;\n createdFromWorkflowRevisionId?: number | null;\n publishedAt?: string | null;\n publishedByAccountUuid?: string | null;\n createdAt: string;\n updatedAt: string;\n routingMode?: string;\n dataTypeSlug?: string | null;\n chatModelId: string;\n realtimeModelId?: string | null;\n assistantName?: string | null;\n}\n\n/**\n * How the engine routes a member through a workflow's tasks.\n *\n * ``open_world`` (default) keeps legacy navigation: ``task:execute`` rules +\n * ``TaskAssociation`` edges + ``set_current_task`` + ``check_edges``.\n * ``strict`` enables server-enforced Enter/Command/Exit phases with no\n * ``set_current_task`` and no edge auto-routing.\n * See docs/decisions/ai/strict-workflow/implementation-plan.md.\n */\nexport type WorkflowRoutingMode = typeof WorkflowRoutingMode[keyof typeof WorkflowRoutingMode];\n\n\nexport const WorkflowRoutingMode = {\n open_world: 'open_world',\n strict: 'strict',\n} as const;\n","/**\n * Widget-domain configuration types.\n *\n * Server response/request shapes are generated from Pydantic via\n * emit_openapi.py → Orval into ./generated/workspace_widget_domain. This thin\n * layer re-exports them under stable public names and adds the client-only\n * widget-slug registry the UI iterates over.\n *\n * The candidate-domain list served by GET /w/{wid}/domains/for-widget reuses\n * `WorkspaceAvailableDomainsResponse` (see ./organization-types).\n */\n\nexport type {\n WidgetDomainListResponse,\n WidgetDomainResponse,\n WidgetDomainUpsertRequest,\n WidgetEmbedPolicyResponse,\n} from './generated/workspace_widget_domain';\n\n/**\n * Canonical embeddable-widget slugs. Mirrors the backend `WidgetSlug` enum\n * (`lib/models/glb/workspace_widget_domain_models.py`); kept as a client-side\n * const so UI can render one toggle per slug without a round-trip. Keep in sync\n * with the backend registry — it is the source of truth the config API and the\n * origin gate both validate against.\n */\nexport const WIDGET_SLUGS = ['chat', 'operator', 'operator-tools', 'chat-app'] as const;\n\nexport type WidgetSlug = (typeof WIDGET_SLUGS)[number];\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: promo_code_service\n */\n\n\n/**\n * What an operator sees in the admin list for a campaign's current state.\n *\n * Derived from ``validate_code_window`` rather than recomputed, so the badge can\n * never disagree with what a customer entering the code actually experiences.\n * An admin UI that says \"Active\" for a code the redemption path rejects is\n * worse than no badge at all — it sends the operator to debug the customer\n * instead of the campaign.\n */\nexport type PromoCodeStatus = typeof PromoCodeStatus[keyof typeof PromoCodeStatus];\n\n\nexport const PromoCodeStatus = {\n active: 'active',\n scheduled: 'scheduled',\n expired: 'expired',\n inactive: 'inactive',\n exhausted: 'exhausted',\n} as const;\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: import_skipped_rule\n */\n\n\n/**\n * One derived, PHI-safe binding gap in the current workspace config.\n */\nexport interface ImportReadinessIssue {\n code: ImportReadinessIssueCode;\n resourceType: ImportReadinessIssueResourceType;\n resourceId: number;\n resourceUuid: string;\n resourceName?: string | null;\n settingKey?: string | null;\n}\n\nexport type ImportReadinessIssueCode = typeof ImportReadinessIssueCode[keyof typeof ImportReadinessIssueCode];\n\n\nexport const ImportReadinessIssueCode = {\n phone_not_provisioned: 'phone_not_provisioned',\n phone_missing_default_workflow: 'phone_missing_default_workflow',\n inbox_missing_default_workflow: 'inbox_missing_default_workflow',\n workflow_missing_default_phone: 'workflow_missing_default_phone',\n workflow_missing_default_inbox: 'workflow_missing_default_inbox',\n routine_webhook_handoff_unverified: 'routine_webhook_handoff_unverified',\n app_connection_not_connected: 'app_connection_not_connected',\n site_form_migration_pending: 'site_form_migration_pending',\n site_form_binding_invalid: 'site_form_binding_invalid',\n site_theme_setting_inherited: 'site_theme_setting_inherited',\n} as const;\n\nexport type ImportReadinessIssueResourceType = typeof ImportReadinessIssueResourceType[keyof typeof ImportReadinessIssueResourceType];\n\n\nexport const ImportReadinessIssueResourceType = {\n phone: 'phone',\n inbox: 'inbox',\n workflow: 'workflow',\n routine: 'routine',\n app_connection: 'app_connection',\n site: 'site',\n} as const;\n\n/**\n * Current binding gaps that can leave an imported workspace inert.\n *\n * This is deliberately derived rather than stored: when an administrator\n * provisions or reconnects a resource, the next read becomes clean without\n * an import-specific status update. ``truncated`` means the bounded scan did\n * not inspect every resource and must not be interpreted as ready.\n */\nexport interface ImportReadinessResponse {\n issues: ImportReadinessIssue[];\n truncated?: boolean;\n}\n\nexport interface ImportRunResponse {\n uuid: string;\n importedAt: string;\n importedByMemberId: number | null;\n reconnectableSkippedCount: number;\n}\n\nexport interface ImportSkippedRuleResourceGroup {\n resourceType: ImportSkippedRuleResourceGroupResourceType;\n sourceResourceRef: string;\n outstandingCount: number;\n activeCount: number;\n rules: ImportSkippedRuleResponse[];\n}\n\nexport type ImportSkippedRuleResourceGroupResourceType = typeof ImportSkippedRuleResourceGroupResourceType[keyof typeof ImportSkippedRuleResourceGroupResourceType];\n\n\nexport const ImportSkippedRuleResourceGroupResourceType = {\n phone: 'phone',\n inbox: 'inbox',\n member: 'member',\n} as const;\n\n/**\n * One skipped rule on the wire.\n *\n * An empty ``neededResourceTypes`` means DIAGNOSTIC: the rule was rejected\n * outright, there is nothing to reconnect, and the panel renders it read-only.\n * ``reasonCode`` says which gate refused it and ``rejectedPaths`` says where —\n * fixed importer paths or the CEL-path sanitizer's engine-vocabulary output,\n * never raw CEL and never customer-authored text.\n */\nexport interface ImportSkippedRuleResponse {\n uuid: string;\n sourceRuleUuid: string;\n neededResourceTypes: ImportSkippedRuleResponseNeededResourceTypesItem[];\n sourceResourceRefs: ImportSkippedRuleSourceRefs;\n actionType: string;\n eventType: string;\n parentKind: ImportSkippedRuleResponseParentKind;\n parentUuid: string | null;\n isActive: boolean;\n status: ImportSkippedRuleResponseStatus;\n reasonCode?: ImportSkippedRuleResponseReasonCode;\n rejectedPaths?: string[];\n name?: string | null;\n}\n\nexport type ImportSkippedRuleResponseNeededResourceTypesItem = typeof ImportSkippedRuleResponseNeededResourceTypesItem[keyof typeof ImportSkippedRuleResponseNeededResourceTypesItem];\n\n\nexport const ImportSkippedRuleResponseNeededResourceTypesItem = {\n phone: 'phone',\n inbox: 'inbox',\n member: 'member',\n} as const;\n\nexport type ImportSkippedRuleResponseParentKind = typeof ImportSkippedRuleResponseParentKind[keyof typeof ImportSkippedRuleResponseParentKind];\n\n\nexport const ImportSkippedRuleResponseParentKind = {\n routine: 'routine',\n journey_step: 'journey_step',\n task: 'task',\n workflow: 'workflow',\n other: 'other',\n} as const;\n\nexport type ImportSkippedRuleResponseReasonCode = typeof ImportSkippedRuleResponseReasonCode[keyof typeof ImportSkippedRuleResponseReasonCode];\n\n\nexport const ImportSkippedRuleResponseReasonCode = {\n missing_binding: 'missing_binding',\n invalid_event_rule_cel: 'invalid_event_rule_cel',\n unresolved_journey_scope: 'unresolved_journey_scope',\n missing_source_workflow: 'missing_source_workflow',\n} as const;\n\nexport type ImportSkippedRuleResponseStatus = typeof ImportSkippedRuleResponseStatus[keyof typeof ImportSkippedRuleResponseStatus];\n\n\nexport const ImportSkippedRuleResponseStatus = {\n outstanding: 'outstanding',\n reconnected: 'reconnected',\n dismissed: 'dismissed',\n} as const;\n\n/**\n * Old resource identities, only keys that applied to this skip.\n */\nexport interface ImportSkippedRuleSourceRefs {\n phone?: string | null;\n inbox?: string | null;\n member?: string | null;\n}\n\n/**\n * The latest import run's skipped rules.\n *\n * ``diagnosticSkippedCount`` is DERIVED from the same bounded read that fills\n * ``rules`` — the number of rows with nothing to reconnect. There is no second\n * count column on ``ImportRun``: its ``reconnectableSkippedCount`` keeps its\n * literal meaning, and a diagnostic-only run legitimately reports zero there.\n */\nexport interface ImportSkippedRulesResponse {\n importRun?: ImportRunResponse | null;\n groups: ImportSkippedRuleResourceGroup[];\n rules: ImportSkippedRuleResponse[];\n truncated?: boolean;\n diagnosticSkippedCount?: number;\n}\n\n/**\n * Re-point outstanding skipped EventRules onto a re-provisioned resource.\n *\n * Identifies the group by one skipped-rule row UUID (the wire value the GET\n * returns) plus the resource type. Source refs are sanitized on GET, so the\n * POST must not key off ``sourceResourceRef``.\n */\nexport interface RebuildImportSkippedRulesRequest {\n /** UUID of one skipped-rule row in the group to rebuild */\n skippedRuleUuid: string;\n resourceType: RebuildImportSkippedRulesRequestResourceType;\n /** Destination phone or inbox UUID, or member id as digits */\n targetResourceRef: string;\n}\n\nexport type RebuildImportSkippedRulesRequestResourceType = typeof RebuildImportSkippedRulesRequestResourceType[keyof typeof RebuildImportSkippedRulesRequestResourceType];\n\n\nexport const RebuildImportSkippedRulesRequestResourceType = {\n phone: 'phone',\n inbox: 'inbox',\n member: 'member',\n} as const;\n\n/**\n * Result of bulk-rebuilding a skipped-rule resource group.\n *\n * IDs only — no names, templates, or action params.\n * A group larger than ``rebuildLimit`` is processed in pages: this call\n * rebuilds at most that many outstanding rows and sets ``hasMore`` when\n * more still need a follow-up POST with the same body.\n */\nexport interface RebuildImportSkippedRulesResponse {\n createdCount: number;\n alreadyReconnectedCount: number;\n createdEventRuleIds: number[];\n reconnectedSkippedRuleUuids: string[];\n skippedUnresolvedCount?: number;\n skippedUnresolvedSkippedRuleUuids?: string[];\n hasMore?: boolean;\n rebuildLimit?: number;\n}\n","/**\n * Centralized Feature Registry for Gravity Rail (Frontend)\n *\n * This module provides TypeScript types and utilities for the feature system.\n * Feature definitions are loaded from the backend API at runtime.\n *\n * Usage:\n * import { getFeature, FeatureVisibility, FeatureCategory } from '@gravity-rail/client/features';\n *\n * // Get a feature definition\n * const calendar = getFeature('calendar');\n * if (calendar?.dependsOn.length) {\n * console.log('Calendar depends on:', calendar.dependsOn);\n * }\n */\n\n/**\n * Categories for organizing features in UI.\n */\nexport enum FeatureCategory {\n COMMUNICATION = 'communication',\n PLATFORM = 'platform',\n INTEGRATION = 'integration',\n COMPLIANCE = 'compliance',\n DEVELOPER = 'developer',\n RESELLER = 'reseller',\n SPECIAL = 'special',\n}\n\n/**\n * Controls how disabled features appear in the UI.\n */\nexport enum FeatureVisibility {\n /** Not shown when disabled */\n HIDDEN = 'hidden',\n /** Shown with upgrade call-to-action */\n UPGRADE_PROMPT = 'upgrade',\n /** Shown with \"contact admin\" call-to-action */\n CONTACT_ADMIN = 'contact',\n}\n\n/**\n * Complete definition of a workspace feature.\n */\nexport interface FeatureDefinition {\n /** Machine identifier matching WorkspaceFeature enum value */\n slug: string;\n /** Human-readable display name */\n name: string;\n /** Feature description for UI/docs */\n description: string;\n /** Feature category for grouping */\n category: FeatureCategory;\n /** Searchable tags for filtering */\n tags: string[];\n /** List of feature slugs this feature requires */\n dependsOn: string[];\n /** How to display when feature is disabled */\n visibility: FeatureVisibility;\n /** Custom upgrade call-to-action text */\n upgradeCta?: string;\n /** Whether this is a beta/early access feature */\n beta: boolean;\n /** Whether this feature is recommended for new workspaces */\n recommended: boolean;\n /** Icon name from the icon library */\n icon?: string;\n /** Override-only feature — not in the features array, only controllable via override */\n overrideOnly?: boolean;\n /** Whether this feature should appear on public product cards */\n productDisplay?: boolean;\n /** Override label for product cards (defaults to name) */\n productLabel?: string;\n /** Sort order on product cards (lower = higher) */\n productOrder?: number;\n /** Whether this feature is deprecated and scheduled for removal */\n deprecated?: boolean;\n /** ISO date string after which this feature flag must have no code references */\n sunsetDate?: string | null;\n}\n\n/**\n * Response from the features API endpoint.\n */\nexport interface FeaturesResponse {\n features: FeatureDefinition[];\n}\n\n// Global feature registry (populated from API or build-time generation)\nlet _features: Record<string, FeatureDefinition> = {};\n\n/**\n * Initialize the feature registry with definitions from the API.\n *\n * @param features - Array of feature definitions from the API\n */\nexport function initializeFeatures(features: FeatureDefinition[]): void {\n _features = {};\n for (const feature of features) {\n _features[feature.slug] = feature;\n }\n}\n\n/**\n * Get a feature definition by slug.\n *\n * @param slug - The feature slug (e.g., \"calendar\", \"gmail\")\n * @returns The feature definition, or undefined if not found\n */\nexport function getFeature(slug: string): FeatureDefinition | undefined {\n return _features[slug];\n}\n\n/**\n * Get all registered features.\n *\n * @returns Record mapping slugs to feature definitions\n */\nexport function getAllFeatures(): Record<string, FeatureDefinition> {\n return { ..._features };\n}\n\n/**\n * Get all features in a specific category.\n *\n * @param category - The category to filter by\n * @returns Array of features in the category\n */\nexport function getFeaturesByCategory(category: FeatureCategory): FeatureDefinition[] {\n return Object.values(_features).filter((f) => f.category === category);\n}\n\n/**\n * Get all features with a specific visibility setting.\n *\n * @param visibility - The visibility type to filter by\n * @returns Array of features with the specified visibility\n */\nexport function getFeaturesByVisibility(visibility: FeatureVisibility): FeatureDefinition[] {\n return Object.values(_features).filter((f) => f.visibility === visibility);\n}\n\n/**\n * Check if a feature is available (enabled and dependencies met).\n *\n * @param slug - The feature slug to check\n * @param enabledFeatures - Array of currently enabled feature slugs\n * @returns True if the feature is enabled and all dependencies are met\n */\nexport function isFeatureAvailable(slug: string, enabledFeatures: string[]): boolean {\n if (!enabledFeatures.includes(slug)) {\n return false;\n }\n\n const feature = _features[slug];\n if (!feature) {\n return true; // Unknown feature, assume available\n }\n\n return feature.dependsOn.every((dep) => enabledFeatures.includes(dep));\n}\n\n/**\n * Check if all dependencies for a feature are satisfied.\n *\n * @param slug - The feature slug to check\n * @param enabledFeatures - Array of currently enabled feature slugs\n * @returns True if all dependencies are satisfied\n */\nexport function areDependenciesSatisfied(slug: string, enabledFeatures: string[]): boolean {\n const feature = _features[slug];\n if (!feature) {\n return true;\n }\n\n return feature.dependsOn.every((dep) => enabledFeatures.includes(dep));\n}\n\n/**\n * Get the list of missing dependencies for a feature.\n *\n * @param slug - The feature slug to check\n * @param enabledFeatures - Array of currently enabled feature slugs\n * @returns Array of missing dependency slugs\n */\nexport function getMissingDependencies(slug: string, enabledFeatures: string[]): string[] {\n const feature = _features[slug];\n if (!feature) {\n return [];\n }\n\n return feature.dependsOn.filter((dep) => !enabledFeatures.includes(dep));\n}\n\n/**\n * Validate that all feature dependencies are satisfied.\n *\n * @param enabledFeatures - Array of enabled feature slugs\n * @returns Array of error messages for unsatisfied dependencies\n */\nexport function validateFeatureDependencies(enabledFeatures: string[]): string[] {\n const errors: string[] = [];\n\n for (const slug of enabledFeatures) {\n const feature = _features[slug];\n if (feature) {\n for (const dep of feature.dependsOn) {\n if (!enabledFeatures.includes(dep)) {\n errors.push(`Feature '${slug}' requires '${dep}' to be enabled`);\n }\n }\n }\n }\n\n return errors;\n}\n\n/**\n * Get features that can be shown as upgrade options.\n *\n * @param enabledFeatures - Array of currently enabled feature slugs\n * @returns Array of features available for upgrade\n */\nexport function getAvailableFeaturesForUpgrade(enabledFeatures: string[]): FeatureDefinition[] {\n const available: FeatureDefinition[] = [];\n\n for (const feature of Object.values(_features)) {\n // Skip already enabled features\n if (enabledFeatures.includes(feature.slug)) {\n continue;\n }\n\n // Skip hidden features\n if (feature.visibility === FeatureVisibility.HIDDEN) {\n continue;\n }\n\n // Check if dependencies would be satisfied\n const depsSatisfied = feature.dependsOn.every((dep) => enabledFeatures.includes(dep));\n\n if (depsSatisfied || feature.visibility === FeatureVisibility.CONTACT_ADMIN) {\n available.push(feature);\n }\n }\n\n return available;\n}\n\n/**\n * Check if the feature registry has been initialized.\n *\n * @returns True if features have been loaded\n */\nexport function isRegistryInitialized(): boolean {\n return Object.keys(_features).length > 0;\n}\n\n/**\n * Clear the feature registry.\n *\n * This is primarily useful for testing.\n */\nexport function clearRegistry(): void {\n _features = {};\n}\n","/**\n * Chat type constants for frontend use.\n *\n * These constants mirror the backend ChatType enum in lib/constants.py\n * and should be kept in sync.\n */\n\n/**\n * Available chat types in the system.\n */\nexport const CHAT_TYPES = {\n ASSIGNMENT: 'assignment',\n MANAGER: 'manager',\n CONTRIBUTOR: 'contributor',\n DM: 'dm',\n} as const;\n\n/**\n * Type for valid chat type values.\n */\nexport type ChatType = (typeof CHAT_TYPES)[keyof typeof CHAT_TYPES];\n\n/**\n * Chat types that use builtin (virtual) assistants instead of DB assistants.\n */\nexport const BUILTIN_ASSISTANT_CHAT_TYPES = new Set<ChatType>([\n CHAT_TYPES.MANAGER,\n CHAT_TYPES.CONTRIBUTOR,\n]);\n\n/** Member-agent graph chat types (sidebar DM only). */\nexport const MEMBER_AGENT_CHAT_TYPES = new Set<ChatType>([CHAT_TYPES.DM]);\n\n/**\n * Chat types that don't require assistant participant records.\n */\nexport const NO_ASSISTANT_PARTICIPANT_CHAT_TYPES = new Set<ChatType>([\n ...BUILTIN_ASSISTANT_CHAT_TYPES,\n ...MEMBER_AGENT_CHAT_TYPES,\n]);\n\n/**\n * Check if a chat type uses a builtin assistant.\n */\nexport function usesBuiltinAssistant(chatType: string): boolean {\n return BUILTIN_ASSISTANT_CHAT_TYPES.has(chatType as ChatType);\n}\n\n/**\n * Check if a chat type requires an assistant participant record.\n */\nexport function requiresAssistantParticipant(chatType: string): boolean {\n return !NO_ASSISTANT_PARTICIPANT_CHAT_TYPES.has(chatType as ChatType);\n}\n\n/**\n * Type guard to check if a string is a valid ChatType.\n */\nexport function isChatType(value: string): value is ChatType {\n return Object.values(CHAT_TYPES).includes(value as ChatType);\n}\n","/**\n * Default AI model constants shared across the frontend.\n *\n * These are used as fallback defaults when creating new agents, assistants,\n * and other entities that require a model selection.\n */\n\n/**\n * Shared chat/inference fallback for Workflow and action settings. Mirrors\n * DEFAULT_CHAT_MODEL_ID in lib/constants.py.\n */\nexport const DEFAULT_CHAT_MODEL = 'openai:chat:gpt-6-luna';\n\n/** Chat model selected when creating an Agent. */\nexport const DEFAULT_AGENT_CHAT_MODEL = 'openai:chat:gpt-6-luna';\n\n/** Default native realtime model and voice for newly created agents. */\nexport const DEFAULT_AGENT_REALTIME_MODEL = 'xai:realtime:voice-agent-2';\nexport const DEFAULT_AGENT_REALTIME_MODEL_CONFIG = {\n ttsModel: 'native',\n voiceModel: 'xai:voice:cosmo',\n};\n\n/** Default inference model for custom voice stack. */\nexport const DEFAULT_VOICE_INFERENCE_MODEL = 'openai:chat:gpt-6-luna';\n\n/** Default voice model for custom realtime configurations. */\nexport const DEFAULT_CUSTOM_VOICE_MODEL = 'xai:voice:lux';\n","/**\n * Resource metadata for products\n *\n * Display labels, units and descriptions for each resource type. This is a\n * presentation lookup only — a resource's entry says how to name and count it,\n * never what a plan allows. Per-resource caps were removed: `Product.limits`\n * was rendered in two admin surfaces and the usage dashboard and enforced by\n * nothing, so the scope/feature filtering that existed to drive the cap editor\n * (`getApplicableResources`, `getApplicableResourceSlugs`,\n * `getScopeFromProductType`, `ResourceScope`) went with it. Credits are the one\n * metered allowance, and they are gated server-side.\n */\n\nimport { Resource } from './billing-types';\n\nexport interface ResourceMetadata {\n label: string;\n unit: string;\n unitPlural: string;\n description: string;\n}\n\nconst RESOURCE_METADATA: Record<Resource, ResourceMetadata> = {\n [Resource.CREDIT]: {\n label: 'Credits',\n unit: 'credit',\n unitPlural: 'credits',\n description: 'AI model usage billed as tokens with model-specific multipliers',\n },\n [Resource.STT]: {\n label: 'Speech-to-Text',\n unit: 'minute',\n unitPlural: 'minutes',\n description: 'Audio transcription in minutes',\n },\n [Resource.TTS]: {\n label: 'Text-to-Speech',\n unit: '1,000 characters',\n unitPlural: '1,000 characters',\n description: 'Text synthesized to audio, billed in lots of 1,000 characters',\n },\n [Resource.SMS]: {\n label: 'SMS Messages',\n unit: 'message',\n unitPlural: 'messages',\n description: 'Text messages sent via phone number',\n },\n [Resource.EMAIL]: {\n label: 'Emails',\n unit: 'message',\n unitPlural: 'messages',\n description: 'Email messages sent or received',\n },\n [Resource.PHONE_CALL]: {\n label: 'Phone Calls',\n unit: 'minute',\n unitPlural: 'minutes',\n description: 'Phone call duration in minutes',\n },\n [Resource.PHONE_NUMBER]: {\n label: 'Phone Numbers',\n unit: 'number',\n unitPlural: 'numbers',\n description: 'Active phone numbers for calling and SMS',\n },\n [Resource.INBOX]: {\n label: 'Email Inboxes',\n unit: 'inbox',\n unitPlural: 'inboxes',\n description: 'Email inboxes for receiving messages',\n },\n [Resource.SITE]: {\n label: 'Sites',\n unit: 'site',\n unitPlural: 'sites',\n description: 'Published websites',\n },\n [Resource.MEMBER]: {\n label: 'Members',\n unit: 'member',\n unitPlural: 'members',\n description: 'Members across the organization',\n },\n [Resource.WORKSPACE]: {\n label: 'Workspaces',\n unit: 'workspace',\n unitPlural: 'workspaces',\n description: 'Workspaces in the organization',\n },\n [Resource.ORG_ADMIN]: {\n label: 'Organization Admins',\n unit: 'admin',\n unitPlural: 'admins',\n description: 'Organization administrators',\n },\n [Resource.STORAGE_MB]: {\n label: 'Storage',\n unit: 'MB',\n unitPlural: 'MB',\n description: 'File storage in megabytes',\n },\n};\n\n/**\n * Get metadata for a specific resource\n */\nexport function getResourceMetadata(resource: Resource): ResourceMetadata | undefined {\n return RESOURCE_METADATA[resource];\n}\n\n/**\n * Get all available resource slugs\n */\nexport function getAllResourceSlugs(): Resource[] {\n return Object.keys(RESOURCE_METADATA) as Resource[];\n}\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: digest\n */\n\n\n/**\n * What a slot is *for* — the argument the sentence puts it in.\n *\n * The client keys one ICU message per event type on these, so the role is the\n * stable half of the contract: a binding may move from the subject columns to\n * a payload ref without any copy changing, because the reading did not.\n */\nexport type DigestSlotRole = typeof DigestSlotRole[keyof typeof DigestSlotRole];\n\n\nexport const DigestSlotRole = {\n people: 'people',\n subject: 'subject',\n actor: 'actor',\n workflow: 'workflow',\n journey: 'journey',\n phone_number: 'phone_number',\n data_type: 'data_type',\n operator_group: 'operator_group',\n channel: 'channel',\n origin: 'origin',\n source: 'source',\n reason: 'reason',\n direction: 'direction',\n area: 'area',\n conclusion: 'conclusion',\n} as const;\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: activity_feed\n */\n\nimport type { AssignmentConcludedDetail, AssignmentStartedDetail, CallCompletedDetail, CallMissedDetail, CallStartedDetail, CallSummaryDetail, ChatAwaitingHumanDetail, ChatCallEndedDetail, ChatHumanRepliedDetail, ChatStartedDetail, ChatSummaryDetail, ConfigUpdatedDetail, DataRecordCreatedDetail, DataRecordUpdatedDetail, DomainLinkedDetail, DomainVerifiedDetail, EscalationOpenedDetail, EscalationResolvedDetail, ImportCompletedDetail, ImportStartedDetail, JourneyActivatedDetail, JourneyCompletedDetail, JourneyEnrolledDetail, JourneyStepTransitionedDetail, JourneyUnenrolledDetail, MemberAttributesChangedDetail, MemberCreatedDetail, MemberLabelsChangedDetail, MemberRemovedDetail, MemberRoleChangedDetail, MemberSubscriptionCanceledDetail, MemberSubscriptionStartedDetail, OperatorGroupMemberAddedDetail, OperatorGroupMemberRemovedDetail, PhoneNumberArchivedDetail, PhoneNumberProvisionedDetail, PresenceWentOfflineDetail, PresenceWentOnlineDetail, PurchaseCompletedDetail, RoutineCompletedDetail, RoutineFailedDetail, RoutineStartedDetail, SubscriptionCanceledDetail, SubscriptionStartedDetail, SubscriptionUpdatedDetail, VoicemailListenedDetail, VoicemailReceivedDetail, VoicemailTranscribedDetail, WorkflowPublishedDetail } from './detail';\nimport type { DigestSlotRole } from './digest';\nimport type { ActivityCapability, ActivityEventType, ActivityVisibility } from './event_type';\nimport type { ActivityEventFamily, ActivityOutcome } from './family';\nimport type { ActorKind, EntityKind } from './ref';\n\n/**\n * Who or what caused the occurrence.\n *\n * ``uuid`` is null exactly when the kind names no principal (``system`` or\n * ``unattributed``). ``kind`` is null when a newer build recorded an actor\n * kind this one cannot name — the same tolerance ``eventType`` has, so a row\n * written across a rolling deploy is still served rather than failing the\n * page.\n */\nexport interface ActivityActorResponse {\n kind: ActorKind | null;\n uuid?: string | null;\n}\n\n/**\n * One count, and the query that reproduces exactly those rows.\n *\n * ``bucketStart`` is a **naive** local-calendar label, not an instant:\n * ``date(bucket_hour)`` recomposes the workspace's calendar day exactly,\n * including half-hour-offset zones, and re-anchoring it to UTC on the way out\n * would destroy the property the whole column exists for. ``bucketLabel`` is\n * that same value rendered at the line's grain, so a client never has to\n * reimplement the truncation.\n *\n * ``attentionDrill`` is a **different question**, issued only on a line whose\n * outcome is not ``ok``, and the difference is the point rather than a wart.\n * ``drill`` narrows to the events this line counted, and executing it returns\n * exactly ``count`` rows. ``attentionDrill`` opens the **one view filtered to\n * has-open-state** for the same scope and the kinds this line's types feed —\n * \"what is still open here\" — and that number is legitimately different: five\n * calls were missed in that hour, and three of them have since been returned.\n * The two answer \"what happened\" and \"what is still owed\", which is exactly\n * the pair of questions the surface's two lanes used to exist for; under the\n * one view they are one stream and a filter, and this field is the filter\n * activation the count carries. **It is not a second drill and must never be\n * presented as one**; a UI that showed ``count`` and then opened this is\n * obliged to say it is changing the question.\n *\n * ``drill`` is the contract. It is the request that produced this line,\n * narrowed to this line's bucket, group and the next finer grain — issued by\n * the server and POSTed back verbatim. At the ``event`` grain there is no\n * finer feed query, so ``drill`` is null and the line's own refs are the\n * destinations.\n *\n * Executing it on a quiesced substrate returns exactly ``count`` rows; under\n * object-level restriction it returns no more than ``count``; and after new\n * events land, a refetch of both halves agrees again. It carries no snapshot —\n * see :class:`ActivityResponseEnvelope`.\n */\nexport interface ActivityAggregateLine {\n bucketLabel: string;\n bucketStart: string;\n groupKey: ActivityGroupKey;\n /** @minimum 0 */\n count: number;\n drill?: ActivityFeedQueryRequest | null;\n attentionDrill?: ActivityOneViewRequest | null;\n}\n\n/**\n * A page of aggregate lines, each carrying its own drill query.\n */\nexport interface ActivityAggregateResponse {\n grain: ActivityGrain;\n groupBy: ActivityGroupBy;\n lines: ActivityAggregateLine[];\n nextCursor?: string | null;\n hasMore: boolean;\n pageSize: number;\n envelope: ActivityResponseEnvelope;\n cursorRejected?: FeedCursorRejection | null;\n}\n\n/**\n * What this caller may see, as the caller's own client should render it.\n *\n * Not an authorization decision — every read re-derives that server-side —\n * but the shape a client needs to avoid offering a control whose answer would\n * be empty. ``workspaceCount`` is a count rather than a list because the\n * account mount's estate can be large and the list is not what the control\n * needs.\n */\nexport interface ActivityCapabilitiesResponse {\n capabilities: ActivityCapability[];\n /** @minimum 0 */\n workspaceCount: number;\n /** @minimum 0 */\n orgReadCount: number;\n hasPrivateLane: boolean;\n}\n\n/**\n * What a badge needs, and nothing more.\n *\n * Deliberately not \"a query with ``pageSize=0``\": a badge asks a different\n * question — *how many*, in total, right now — and giving it its own endpoint\n * keeps it off the paging machinery and makes the audit record honest about\n * what was read.\n *\n * ``groupBy`` is optional and is not a second aggregation: when it is a\n * workspace grouping, the totals omit org-scope and account-scope rollup\n * rows, matching the aggregate query that grouping actually renders. A badge\n * that does not pass it still counts every authorized row.\n */\nexport interface ActivityCountsRequest {\n window?: ActivityWindow | null;\n eventTypes?: ActivityEventType[];\n scope?: ActivityQueryScope;\n groupBy?: ActivityGroupBy | null;\n includeOpenItems?: boolean;\n}\n\n/**\n * What a badge renders.\n *\n * ``openItems`` is the priority lane's size — the number the launcher badge\n * crosses the postMessage bridge with, and what replaces the needs-response\n * tally. ``byEventType`` is the **whole event-type vocabulary**, one entry per\n * type, each carrying its family and how many occurrences the window holds —\n * ``0`` for the types nothing happened in. A filter control therefore lists\n * every type with its glyph and its number, shows `0` on the quiet ones, and\n * keeps the same shape as time passes; a list built from the types the rollup\n * happens to hold changes under the reader and offers no glyph at all. The\n * entries are ordered by count, busiest first, then by event type, so the top\n * of the list is the answer. It is empty when the request carries no window,\n * because there is then nothing to count.\n *\n * ``totalEvents`` and ``renderableEvents`` are deliberately two numbers.\n * ``totalEvents`` counts the whole window, **including** events whose event\n * type this vocabulary does not know — a row drained by a newer emitter —\n * because a badge counts what happened, not what this build can name.\n * ``renderableEvents`` is the part of that total whose event type the\n * vocabulary knows: exactly the events a feed page of this window can put a\n * name and a drill on, on any page, including the ones the reader has not\n * scrolled to. A summary sentence above paged rows needs the second number —\n * the pages a client has not fetched can still hold lines it will drop, and\n * only the read that sees the whole window can subtract them.\n *\n * When the request carries a workspace ``groupBy``, both numbers omit\n * org-scope and account-scope rows, matching the aggregate page that\n * grouping renders. A client still has to compare ``envelope.vocabularyVersion``\n * with its own before claiming ``renderableEvents``: the field counts types\n * *this server* can name, which is not always the set the browser can draw.\n */\nexport interface ActivityCountsResponse {\n /** @minimum 0 */\n openItems: number;\n /** @minimum 0 */\n totalEvents: number;\n /** @minimum 0 */\n renderableEvents: number;\n byEventType?: ActivityTypeCount[];\n envelope: ActivityResponseEnvelope;\n}\n\n/**\n * A principal a slot grouped on. ``uuid`` is null for system.\n *\n * The scope chain travels for the same reason it travels on a ref: an actor\n * is hydrated through a workspace or org API, and a pane grouped by event type\n * at account or org altitude has no workspace of its own to fall back to — so\n * without it \"Andy replied in 30 chats\" degrades to a generic phrase on\n * exactly the surfaces the digest exists for.\n *\n * **It is populated only where the digest's group agrees on it**, and is null\n * otherwise: one principal acting in two workspaces has no single route, and\n * naming one of them would send a client to the wrong API for the rest.\n */\nexport interface ActivityDigestActor {\n kind: ActorKind;\n uuid?: string | null;\n workspaceUuid?: string | null;\n orgUuid?: string | null;\n}\n\n/**\n * One named thing in a slot, and how many of the events it accounts for.\n *\n * ``value`` is the key the client renders — a typed ref it hydrates through\n * the batch-resolve endpoint, an actor principal, or a closed token it has\n * copy for. It is a reading, not a destination: the line's own drill opens\n * every event the sentence describes, and there is no finer query behind an\n * individual name.\n */\nexport interface ActivityDigestExample {\n value: ActivityDigestKey;\n /** @minimum 0 */\n count: number;\n}\n\n/**\n * One grouping key a slot read: an actor, a ref, a token, or nothing.\n *\n * Exactly one of ``actor``, ``ref`` and ``token`` is populated, decided by the\n * value kind of the binding the slot reads. **Which binding that was does not\n * travel**: the slot's ``role`` is what the reading keys on, and a second axis\n * on the wire that nothing renders is a field to delete.\n *\n * **All three null is a key, not an omission.** A payload that names no\n * origin, no Workflow, no data type is a real group — those events happened\n * and they are counted — and the reading says so.\n *\n * ``token`` is always a closed-vocabulary value: it is read out of ``detail``,\n * which a typed emitter wrote from a ``StrEnum`` declared in\n * :mod:`lib.activity.details`, so the client has copy for every value it can\n * receive.\n */\nexport interface ActivityDigestKey {\n actor?: ActivityDigestActor | null;\n ref?: ActivityRefResponse | null;\n token?: string | null;\n}\n\n/**\n * \"What were those, exactly?\" — asked for the lines already on screen.\n *\n * Each entry of ``lines`` is one aggregate line's **own server-issued drill**,\n * POSTed back verbatim. Only the parts that identify the slice are read —\n * ``window``, ``scope``, ``eventTypes``, ``subject`` — and ``grain``,\n * ``groupBy``, ``cursor`` and ``pageSize`` are ignored, because the digest is\n * a ``GROUP BY`` over that slice rather than a page of it. Handing\n * the drill back is what guarantees a digest describes the same rows the count\n * above it counted: there is no second expression of the slice to drift.\n *\n * The response is positional with this list, so a client maps groups back to\n * lines without inventing a key.\n *\n * **What a request costs is bounded twice.** Each line's aggregation takes at\n * most :data:`~lib.db.activities.feed.DIGEST_SCAN_BOUND` rows, and all the\n * lines together at most\n * :data:`~lib.db.activities.feed.DIGEST_REQUEST_BUDGET` — because the lines\n * are read one after another (one session, one query at a time), so a per-line\n * bound alone would be a per-request cost of ``len(lines)`` times itself.\n * Lines that name the *same* slice are computed once and answered from the\n * first, which is the ordinary case on a page whose regions repeat a bucket;\n * lines reached after the budget is spent come back ``complete=False``, the\n * same answer a line that filled its own bound gives.\n */\nexport interface ActivityDigestRequest {\n /** @minItems 1 */\n lines: ActivityFeedQueryRequest[];\n}\n\n/**\n * One digest per requested line, positional with ``request.lines``.\n */\nexport interface ActivityDigestResponse {\n lines: ActivityLineDigest[];\n envelope: ActivityResponseEnvelope;\n}\n\n/**\n * One part of the sentence: a few named examples and how many there are.\n *\n * ``role`` is what the slot is *for* — the argument the client's message puts\n * it in (``{people}``, ``{subjects}``, ``{workflows}``) — and it is what copy\n * keys on, so a binding can move from the subject columns to a payload ref\n * without any copy changing.\n *\n * ``distinctCount`` is every distinct key the slice holds, not just the named\n * ones, so the tail writes itself: *\"and ``distinctCount − len(examples)``\n * other people\"*. ``nullCount`` is the events with no value at all for this\n * slot — an anonymous inbound call has nobody to name — and it is reported\n * rather than hidden, because a slot that is mostly null is a sentence that\n * should fall back to a different reading.\n */\nexport interface ActivityDigestSlot {\n role: DigestSlotRole;\n examples: ActivityDigestExample[];\n /** @minimum 0 */\n distinctCount: number;\n /** @minimum 0 */\n nullCount: number;\n}\n\n/**\n * One recorded occurrence, typed when this build knows its vocabulary.\n *\n * ``family`` comes from the server's total event-vocabulary mapping. It lets\n * clients reuse family labels and icons without copying event-type taxonomy\n * into presentation code.\n *\n * ``detail`` is null when this build cannot type a known event's payload.\n * ``eventType`` and ``family`` are also null when a newer emitter has written\n * a vocabulary this build cannot safely name. The row is still returned,\n * because dropping it would silently break the aggregate-to-leaf equality\n * contract; no raw type or untyped mapping crosses the boundary.\n */\nexport interface ActivityEventLine {\n id: string;\n occurredAt: string;\n eventType: ActivityEventType | null;\n family: ActivityEventFamily | null;\n eventVersion: number;\n visibility: ActivityVisibility;\n workspaceUuid?: string | null;\n orgUuid?: string | null;\n accountUuid?: string | null;\n actor: ActivityActorResponse;\n subject: ActivityRefResponse;\n refs?: ActivityRefResponse[];\n detail?: MemberCreatedDetail | MemberRemovedDetail | MemberRoleChangedDetail | MemberLabelsChangedDetail | MemberAttributesChangedDetail | ImportStartedDetail | ImportCompletedDetail | AssignmentStartedDetail | AssignmentConcludedDetail | JourneyEnrolledDetail | JourneyUnenrolledDetail | JourneyCompletedDetail | JourneyStepTransitionedDetail | JourneyActivatedDetail | ChatStartedDetail | ChatAwaitingHumanDetail | ChatHumanRepliedDetail | ChatCallEndedDetail | ChatSummaryDetail | EscalationOpenedDetail | EscalationResolvedDetail | CallStartedDetail | CallCompletedDetail | CallMissedDetail | CallSummaryDetail | PresenceWentOnlineDetail | PresenceWentOfflineDetail | OperatorGroupMemberAddedDetail | OperatorGroupMemberRemovedDetail | VoicemailReceivedDetail | VoicemailTranscribedDetail | VoicemailListenedDetail | RoutineStartedDetail | RoutineCompletedDetail | RoutineFailedDetail | WorkflowPublishedDetail | SubscriptionStartedDetail | SubscriptionUpdatedDetail | SubscriptionCanceledDetail | MemberSubscriptionStartedDetail | MemberSubscriptionCanceledDetail | PurchaseCompletedDetail | PhoneNumberProvisionedDetail | PhoneNumberArchivedDetail | DomainLinkedDetail | DomainVerifiedDetail | ConfigUpdatedDetail | DataRecordCreatedDetail | DataRecordUpdatedDetail | null;\n openState?: ActivityOpenStateResponse | null;\n}\n\n/**\n * A page of leaf rows, keyset-paged against a pinned snapshot.\n */\nexport interface ActivityEventsResponse {\n grain?: ActivityGrain;\n items: ActivityEventLine[];\n nextCursor?: string | null;\n hasMore: boolean;\n pageSize: number;\n envelope: ActivityResponseEnvelope;\n cursorRejected?: FeedCursorRejection | null;\n totalMatched?: number | null;\n}\n\n/**\n * The one query shape, at every scope.\n *\n * Also the drill contract's carrier: an aggregate line's ``drill`` field is\n * one of these, issued by the server, and the client sends it back unchanged.\n */\nexport interface ActivityFeedQueryRequest {\n window: ActivityWindow;\n grain?: ActivityGrain;\n groupBy?: ActivityGroupBy;\n eventTypes?: ActivityEventType[];\n noEventTypes?: boolean;\n subject?: ActivitySubjectFilter | null;\n scope?: ActivityQueryScope;\n cursor?: string | null;\n /**\n * @minimum 1\n * @maximum 200\n */\n pageSize?: number;\n}\n\n/**\n * How coarsely to aggregate — or not to aggregate at all.\n *\n * ``MONTH``, ``WEEK``, ``DAY`` and ``HOUR`` are read from\n * ``activity_rollup_hourly``: hour is the materialized grain, and every\n * coarser one is a ``SUM`` over it at read time. There is deliberately no\n * second rollup table, so no two grains can disagree — which is also why\n * adding ``WEEK`` needed no migration and no new materialization. It is the\n * same arithmetic over the same buckets, with a different truncation.\n *\n * **Weeks start on Sunday**, because this codebase already decided that:\n * every calendar surface passes ``weekStartsOn: 0`` and\n * ``src/lib/date-utils.ts::startOfWeekInTimezone`` defaults to it. A second\n * week convention in the same product is worse than either convention, and\n * PostgreSQL's ``date_trunc('week', …)`` — which is ISO/Monday — is therefore\n * shifted rather than used directly (``lib/db/activities/feed.py``).\n *\n * ``EVENT`` is the leaf: it reads ``activity_events`` directly, by which\n * point the query is always scoped to a workspace (or the account lane), a\n * time range and usually a type — the shape of the log's leading index.\n *\n * Anything *finer* than an hour is deliberately absent from this enum rather\n * than unimplemented: hourly is the materialization ceiling, and sub-hourly\n * resolution is a ``GROUP BY`` over the log at query time when a consumer\n * exists for it.\n */\nexport type ActivityGrain = typeof ActivityGrain[keyof typeof ActivityGrain];\n\n\nexport const ActivityGrain = {\n month: 'month',\n week: 'week',\n day: 'day',\n hour: 'hour',\n event: 'event',\n} as const;\n\n/**\n * Dimension used to group activity aggregate rows.\n *\n * Choose ``workspace`` or ``event_type`` to group by that single value;\n * ``family`` groups events by their event family. ``workspace_family`` groups\n * by both workspace and family in the same row.\n */\nexport type ActivityGroupBy = typeof ActivityGroupBy[keyof typeof ActivityGroupBy];\n\n\nexport const ActivityGroupBy = {\n workspace: 'workspace',\n event_type: 'event_type',\n family: 'family',\n workspace_family: 'workspace_family',\n} as const;\n\n/**\n * What an aggregate line is a line of.\n *\n * Which fields are populated is chosen by the request's ``groupBy``: one for\n * the single-axis groupings, and both ``workspaceUuid`` and ``family`` for\n * ``workspace_family``. Optional fields rather than a union because the\n * client renders a line the same way whichever is set, and a discriminated\n * union here would buy nothing but a tag.\n *\n * ``family`` is a property of the event vocabulary\n * (:mod:`lib.activity.families`), computed server-side and sent as a closed\n * token. The client translates the token and never learns which types are in\n * it — the drill query that narrows to them is issued here, so there is no\n * membership table on the wire and therefore none to go stale in a client.\n */\nexport interface ActivityGroupKey {\n workspaceUuid?: string | null;\n eventType?: ActivityEventType | null;\n family?: ActivityEventFamily | null;\n outcome?: ActivityOutcome | null;\n}\n\n/**\n * One workspace-qualified subject at its latest admitted occurrence.\n */\nexport interface ActivityLatestSubjectLine {\n ref: ActivityRefResponse;\n lastEventAt: string;\n lastEventType: ActivityEventType;\n}\n\n/**\n * Latest admitted occurrence for each workspace-qualified subject.\n *\n * This is the inventory-shaped Activity read. Unlike the chronological feed,\n * it has no arbitrary time window: every subject with a recorded occurrence\n * is eligible, once, ordered by its latest matching event. ``eventTypes`` is\n * required because \"latest subject of any kind\" has no bounded product use\n * and would make an account-estate request scan unrelated event families.\n *\n * Without narrowing, account ownership admits the caller's private lane even\n * after a workspace grant is gone. Workspace or organization narrowing is an\n * inventory request, though: an account-private Chat remains visible there\n * only while its workspace is still present in the caller's grant set.\n * Ownership never turns a caller-supplied workspace UUID into authorization.\n */\nexport interface ActivityLatestSubjectsRequest {\n /** @minItems 1 */\n eventTypes: ActivityEventType[];\n scope?: ActivityQueryScope;\n cursor?: string | null;\n /**\n * @minimum 1\n * @maximum 200\n */\n pageSize?: number;\n}\n\n/**\n * A complete, keyset-paged Activity inventory without a time window.\n */\nexport interface ActivityLatestSubjectsResponse {\n items: ActivityLatestSubjectLine[];\n nextCursor?: string | null;\n hasMore: boolean;\n pageSize: number;\n envelope: ActivityResponseEnvelope;\n cursorRejected?: FeedCursorRejection | null;\n}\n\n/**\n * The specifics behind one aggregate line, by event type, count desc.\n *\n * ``complete`` is false when the read hit a bound, and the client renders the\n * count phrase for that line instead — the same posture\n * ``ActivityOpenItemsResponse.truncated`` takes: a bounded read says so rather\n * than reporting a partial answer as a total.\n */\nexport interface ActivityLineDigest {\n types: ActivityTypeDigest[];\n complete: boolean;\n}\n\n/**\n * One row of the one view: an occurrence, and the state it carries.\n *\n * ``event`` is the same typed line the leaf grain serves — the occurrence is\n * a log row, so the merged read adds no second grain and no new\n * materialization; it joins the open-items projection on the event occurrence\n * that opened the current episode. ``openState`` remains as a compatibility\n * mirror of ``event.openState``.\n */\nexport interface ActivityOccurrenceLine {\n event: ActivityEventLine;\n openState?: ActivityOpenStateResponse | null;\n}\n\n/**\n * The one view's request: one stream of occurrences, some carrying open state.\n *\n * ``docs/projects/active/activity-spine.md`` § \"Rendering\", as amended by\n * GRA-8354: the two lanes were two questions about the same occurrences, split\n * because they are two tables. The one view reads both tables in one response\n * — the event log for what happened, the open-items projection for what is\n * still owed — and open state becomes a *property of an occurrence* rather\n * than a partition of the surface.\n *\n * **The window is on the event axis, and stays there.** For events it means\n * \"what happened in this period\"; for open items it means nothing — an item\n * opened three weeks ago still needs attention today. So the window filters\n * the occurrences, and open items whose own activity lies before it are never\n * silently hidden: the response counts them in ``olderOpenCount`` for the\n * persistent line the surface renders (\"3 older items still need attention\").\n *\n * **No cursor, deliberately** — the same contract as the priority lane.\n * Priority is recomputed on every read, so a keyset over that ordering is\n * unsound, and the sort control must not silently change what paging means.\n * The response carries ``totalOpen`` and the way to see more is to narrow\n * (window, types, kinds, the responsibility filters), not to walk.\n */\nexport interface ActivityOneViewRequest {\n window: ActivityWindow;\n eventTypes?: ActivityEventType[];\n kinds?: string[];\n scope?: ActivityQueryScope;\n order?: ActivityOpenItemOrder;\n hasOpenState?: boolean;\n assignedToMe?: boolean;\n pointPerson?: boolean;\n /**\n * @minimum 1\n * @maximum 200\n */\n pageSize?: number;\n}\n\n/**\n * The one view: one stream of occurrences, some carrying open state.\n *\n * **Bounded, not paged** — the priority lane's contract, inherited for the\n * same reason: under ``priority`` the order is recomputed on every read, so a\n * keyset over it is unsound, and a cursor whose meaning changed with the sort\n * control is the exact class of control this surface keeps getting wrong.\n *\n * ``totalOpen`` is the live count of open items matching the request's\n * responsibility and kind filters — the number the retired attention tab used\n * to carry. ``olderOpenCount`` counts those whose last activity lies before\n * the window: the persistent line's \"3 older items still need attention\",\n * which is what keeps an item opened three weeks ago from hiding because the\n * reader is looking at the last two days. Both are bounded by the same\n * candidate scan as the lane, and the stream itself by the state page and\n * plain-half scan bounds, so ``truncated`` means ``totalOpen`` (and with it\n * ``olderOpenCount``) — or the stream — is a floor rather than a total.\n */\nexport interface ActivityOneViewResponse {\n items: ActivityOccurrenceLine[];\n /** @minimum 0 */\n totalOpen: number;\n /** @minimum 0 */\n olderOpenCount: number;\n totalMatched?: number | null;\n truncated?: boolean;\n pageSize: number;\n envelope: ActivityResponseEnvelope;\n}\n\n/**\n * One thing that is open, with the reasons it is open.\n *\n * ``reasons`` is plural and cleared per-reason as facts move: a chat that is\n * both awaiting a human and carrying an open escalation stops being one of\n * those without stopping being the other. A single boolean erased exactly\n * that, which is why ``Chat.needs_response`` is superseded rather than\n * copied.\n *\n * ``priorityRank`` is this response's ordinal under\n * ``envelope.priorityPolicyVersion`` — computed at read time, never stored.\n * Two responses generated under different policy versions are not comparable,\n * and the version on the envelope is how a client knows.\n */\nexport interface ActivityOpenItemLine {\n ref: ActivityRefResponse;\n kind: string;\n reasons: string[];\n workspaceUuid: string;\n orgUuid?: string | null;\n responsible?: ActivityRefResponse[];\n openedAt: string;\n lastEventAt: string;\n projectionPolicyVersion: number;\n priorityRank?: number | null;\n}\n\n/**\n * How the priority lane is sorted.\n *\n * ``PRIORITY`` is a read-time policy — kind weight, age, direct assignment,\n * point-person match — never a stored score, so tuning it is a deploy. See\n * :mod:`lib.activity.priority`.\n */\nexport type ActivityOpenItemOrder = typeof ActivityOpenItemOrder[keyof typeof ActivityOpenItemOrder];\n\n\nexport const ActivityOpenItemOrder = {\n priority: 'priority',\n recency: 'recency',\n} as const;\n\n/**\n * The priority lane's request.\n *\n * No grain: an open item is open *now*. What varies is the ordering policy,\n * who the item is for, and the optional age boundary chosen by the reader.\n */\nexport interface ActivityOpenItemsRequest {\n order?: ActivityOpenItemOrder;\n kinds?: string[];\n scope?: ActivityQueryScope;\n assignedToMe?: boolean;\n pointPerson?: boolean;\n openedAfter?: string | null;\n /**\n * @minimum 1\n * @maximum 200\n */\n pageSize?: number;\n}\n\n/**\n * The priority lane. Deliberately **not** paged, and it says so.\n *\n * An earlier shape carried ``hasMore`` and ``nextCursor``, and always set the\n * cursor to null — advertising pages it could not deliver. The reason it could\n * not is real: priority is recomputed on every read (kind weight, age,\n * responsibility, all against the moment of the read), so a keyset over that\n * ordering is unsound — the row a cursor pointed at can be in a different\n * position by the next request, and offsets over a live queue skip and repeat.\n *\n * So the promise is removed rather than faked. A work queue's honest answer is\n * *how many are open* and *how many you are seeing* — \"showing 50 of 143\" —\n * which is what a queue UI actually renders, and which asks the client to\n * narrow rather than to walk.\n *\n * ``truncated`` says the candidate scan hit its bound, so ``totalOpen`` is a\n * floor rather than a total. That is a different fact from \"there are more\n * than a page\", and conflating the two is how a badge starts under-reporting\n * silently.\n */\nexport interface ActivityOpenItemsResponse {\n items: ActivityOpenItemLine[];\n /** @minimum 0 */\n totalOpen: number;\n truncated?: boolean;\n pageSize: number;\n envelope: ActivityResponseEnvelope;\n}\n\n/**\n * The open item an occurrence carries, as of this read.\n *\n * Open state is a **property of an occurrence**, not a partition of the\n * surface (GRA-8354): a chat that awaited a human and got its reply shows both\n * events, the first carrying this state if the item is still open and neither\n * carrying it once cleared. ``priorityRank`` is the rank under the response's\n * own order — populated under ``priority``, ``None`` under ``recency`` — and\n * reads ``envelope.priorityPolicyVersion`` the same way the lane's rank does.\n */\nexport interface ActivityOpenStateResponse {\n kind: string;\n reasons?: string[];\n openedAt: string;\n lastEventAt: string;\n responsible?: ActivityRefResponse[];\n priorityRank?: number | null;\n}\n\n/**\n * Explicit scope narrowing. Always intersected, never unioned.\n *\n * Empty (the default) means \"everything this mount's grant set admits\". A\n * populated list means \"and only these\", which is how a server-issued drill\n * query names the workspace its line counted and how the widget's\n * ``selected`` mode names a chosen set.\n *\n * A UUID the caller may not see is not an error: it drops out of the\n * intersection, and the response looks exactly as it would if the scope did\n * not exist. That is the same anti-enumeration posture the 404s take.\n */\nexport interface ActivityQueryScope {\n workspaceUuids?: string[];\n orgUuids?: string[];\n}\n\n/**\n * A typed entity reference, with the scope chain it was observed under.\n *\n * The client resolves each ref through that chain — the right workspace or\n * org API — under its own session. A ref the viewer cannot resolve renders as\n * its kind with a permission-appropriate placeholder; nothing about a name\n * ever transits the spine.\n */\nexport interface ActivityRefResponse {\n kind: EntityKind;\n uuid: string;\n workspaceUuid?: string | null;\n orgUuid?: string | null;\n accountUuid?: string | null;\n}\n\n/**\n * Facts every feed response carries about how it was produced.\n *\n * ``generatedAt`` is when this response was read — nothing more. It is not a\n * snapshot and does not pin anything: every read in this API is live, and\n * consistency across requests comes from the invalidation loop rather than a\n * timestamp (``docs/projects/active/activity-spine.md`` § \"Serving API\"). Two\n * pages of one traversal may legitimately report different instants.\n *\n * The two versions are what make a number reproducible. ``vocabularyVersion``\n * moves when the event-type vocabulary does; ``priorityPolicyVersion`` moves\n * when the open-items ordering policy does. Priority is a read-time policy\n * over facts, never a stored score, so \"why was this first\" is answerable\n * from the facts plus the version — which is the whole reason the version is\n * on the wire.\n */\nexport interface ActivityResponseEnvelope {\n generatedAt: string;\n vocabularyVersion: number;\n priorityPolicyVersion: number;\n}\n\n/**\n * Narrow to one entity's own feed.\n *\n * ``(subject_kind, subject_uuid, occurred_at desc)`` is an index on the log,\n * so \"everything that happened to this member\" is a range scan rather than a\n * filter over the workspace's whole history.\n *\n * Aggregates cannot honor a subject filter — the rollup counts by\n * ``(hour, scope, type)`` and has no subject column, by design — so a subject\n * filter forces the ``event`` grain rather than silently returning\n * unfiltered counts. The validator on the request is where that is enforced.\n */\nexport interface ActivitySubjectFilter {\n kind: EntityKind;\n uuid: string;\n}\n\n/**\n * One event type's standing in a window: its family, and how often.\n *\n * ``family`` travels for the same reason it travels on a group key: a client\n * draws a type's glyph from its family and holds no type-to-family map of its\n * own. The mapping is :mod:`lib.activity.families`, and a second copy in the\n * browser would be the half that goes stale — a new type would quietly lose\n * its glyph with no test able to notice.\n */\nexport interface ActivityTypeCount {\n eventType: ActivityEventType;\n family: ActivityEventFamily;\n /** @minimum 0 */\n count: number;\n}\n\n/**\n * One event type's reading inside one line's slice.\n *\n * Not groups with counts. A page of those said *\"2 other workflows published\n * 2 times / Operator Support published by … / Operator Sales published by …\"*\n * — three lines to say one thing, each restating a count the others carried.\n * A type digest is instead the *parts of one sentence*: the slots the type\n * declares, in the order its reading says them, each with the few names worth\n * putting inline and a count of how many more there are.\n *\n * ``family`` travels for the same reason it travels on a group key: the\n * taxonomy is a property of the vocabulary and never crosses the wire as a\n * client-side mapping.\n *\n * ``drill`` is the whole type in this bucket, and the only destination a\n * digest carries: the line is the sentence *and* the way in, so a reader who\n * wants the events behind any part of it clicks the row.\n */\nexport interface ActivityTypeDigest {\n eventType: ActivityEventType;\n family: ActivityEventFamily;\n /** @minimum 0 */\n total: number;\n slots: ActivityDigestSlot[];\n drill?: ActivityFeedQueryRequest | null;\n}\n\n/**\n * A half-open time window, ``[occurredFrom, occurredBefore)``.\n *\n * Half-open so adjacent windows tile without double-counting — the property\n * that makes a month's total equal the sum of its days.\n *\n * **Both bounds are timezone-aware, and ``basis`` says what that means.**\n *\n * At an **aggregate** grain the bounds are compared to\n * ``activity_rollup_hourly.bucket_hour``, which is workspace-**local naive**\n * time. Under either basis the comparison is against the wall clock as\n * written: an ``ABSOLUTE`` bound's own offset chooses the label — a client\n * asking for \"this clinic's March\" sends the clinic's local midnight and gets\n * the clinic's March — and a ``WORKSPACE_LOCAL`` bound *is* the label. Across\n * workspaces in different zones an ``ABSOLUTE`` aggregate window therefore\n * mixes local clocks at the edges: the design's accepted approximation for\n * fleet overlays.\n *\n * At the **event** grain the bounds are compared to\n * ``activity_events.occurred_at``, which is UTC truth, and the two bases stop\n * agreeing. ``ABSOLUTE`` compares the instant directly. ``WORKSPACE_LOCAL``\n * cannot — a local label is a different instant in every zone — so the server\n * converts the span per workspace (``lib.activity.buckets``) and the leaf\n * query carries one arm per distinct clock. That is what keeps a drill exact\n * across a group key naming many workspaces, where no single UTC window\n * exists at all.\n */\nexport interface ActivityWindow {\n occurredFrom: string;\n occurredBefore: string;\n basis?: ActivityWindowBasis;\n}\n\n/**\n * Whose clock the window's two bounds are written in.\n *\n * The bounds are wall-clock designations either way; what differs is *whose*\n * wall clock, and therefore what they mean when a query has to reach the other\n * side of the rollup/log seam.\n *\n * ``ABSOLUTE`` — the offset the caller wrote. One instant pair for every\n * workspace the query touches. This is what a client asks for, and it is the\n * default, so nothing about an ordinary request changes.\n *\n * ``WORKSPACE_LOCAL`` — each workspace's own clock, which is the clock\n * ``activity_rollup_hourly.bucket_hour`` is a label in. **Only the server\n * issues this**, on the drill query it attaches to an aggregate line: that\n * line was computed from local-calendar buckets, so the window that reproduces\n * it is a span of local labels rather than a span of instants. The offset\n * written on the bounds is not part of the meaning and is emitted as ``Z``.\n *\n * Before this existed, a drill emitted its local bucket boundary with a ``Z``\n * on it and the leaf grain read it as an instant — so every drill in a\n * non-UTC workspace queried the wrong hours and returned nothing. One field\n * with two silent meanings is what made that possible; the meaning is now\n * written down.\n */\nexport type ActivityWindowBasis = typeof ActivityWindowBasis[keyof typeof ActivityWindowBasis];\n\n\nexport const ActivityWindowBasis = {\n absolute: 'absolute',\n workspace_local: 'workspace_local',\n} as const;\n\n/**\n * Why a cursor was refused. Closed, so it is safe in a metric label.\n */\nexport type FeedCursorRejection = typeof FeedCursorRejection[keyof typeof FeedCursorRejection];\n\n\nexport const FeedCursorRejection = {\n malformed: 'malformed',\n signature: 'signature',\n version: 'version',\n expired: 'expired',\n scope_mismatch: 'scope_mismatch',\n query_mismatch: 'query_mismatch',\n} as const;\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: family\n */\n\n\n/**\n * The six kinds of thing that happen. Closed, and deliberately small.\n *\n * The cut is a judgement call and the values are what a *reader* would call\n * them, not what our modules are called:\n *\n * - ``PEOPLE`` — who is in the workspace and what is recorded about them:\n * the member lifecycle, role and label changes, field edits, and the\n * imports that do all of those in bulk.\n * - ``CONVERSATIONS`` — every exchange with a person, in any channel: chats,\n * escalations, calls, voicemail, and a Member's run through a Workflow\n * (``assignment.*`` is our internal name for one — see the glossary). One\n * family rather than five because \"someone was talking to a patient\" is one\n * question; the channel is a detail of the answer, and it is one rung\n * further down. A workflow run belongs here even though a machine drives\n * it: what it produces is an exchange with a person, and a reader looking\n * for \"who did we talk to\" expects to find it.\n * - ``JOURNEYS`` — a member's progress through a journey.\n * - ``AUTOMATION`` — the machine working on its own, with nobody on the other\n * end: routine runs and a workflow being published.\n * - ``OPERATORS`` — who is available and who is in which group. Separated\n * from ``PEOPLE`` because presence is high-frequency and about *staff*,\n * and folding it into member activity would drown the member changes that\n * are the reason anyone opened the feed.\n * - ``ADMINISTRATION`` — the account around the work: phone numbers, domains,\n * settings, subscriptions and purchases.\n *\n * Commerce is folded into ``ADMINISTRATION`` rather than split out. It is a\n * genuinely separable family and a reasonable person would split it; it is\n * here because on a clinical workspace's feed a subscription change and a\n * business-hours change are the same kind of interruption — *somebody changed\n * the setup* — and a seventh clause competing for one line of a row costs\n * more than the distinction buys. Splitting it later is one entry in the\n * table below plus one translation, which is why it is safe to start merged.\n */\nexport type ActivityEventFamily = typeof ActivityEventFamily[keyof typeof ActivityEventFamily];\n\n\nexport const ActivityEventFamily = {\n people: 'people',\n conversations: 'conversations',\n journeys: 'journeys',\n automation: 'automation',\n operators: 'operators',\n administration: 'administration',\n} as const;\n\n/**\n * Whether anybody has to *do* something about an occurrence.\n *\n * The second axis of the row, and the one that carries the colour. It is\n * orthogonal to the family — a family says what kind of thing happened, an\n * outcome says whether it went fine — so a summary row can show a family's\n * counts split three ways without inventing a glyph per event type.\n *\n * - ``OK`` — it happened and it is done. Nothing is owed.\n * - ``ATTENTION`` — a person is expected to follow up. These are exactly the\n * facts the priority lane is built out of, which is why an ``ATTENTION``\n * count links *into that lane*, filtered, rather than into the feed: the\n * feed would show you the event, and what you want is the item.\n * - ``FAILED`` — the system tried and did not succeed.\n *\n * ## The honest limit of this axis\n *\n * An outcome is a property of the **event type**, not of the occurrence, and\n * it has to be: the rollup materializes ``(hour, scope, event_type)`` and\n * carries no detail, so a count can only be split by something the type\n * already decides. That is a real ceiling. ``import.completed`` carries a\n * ``failed_count`` and ``assignment.concluded`` carries a\n * ``SYSTEM_ERROR`` conclusion, and neither can colour its own row here,\n * because the aggregate that counted them never saw the payload.\n *\n * Splitting those would mean either a second rollup keyed on an outcome\n * column — a second materialized grain, which § \"Aggregation\" rules out — or\n * promoting the distinction into the vocabulary as its own type\n * (``import.failed``), which is a review-gated change with an emitter behind\n * it and the right way to do it when a specific failure earns a row. So this\n * axis is exactly as rich as the type vocabulary is, and no richer. It is not\n * a severity model; it is a reading of one.\n */\nexport type ActivityOutcome = typeof ActivityOutcome[keyof typeof ActivityOutcome];\n\n\nexport const ActivityOutcome = {\n ok: 'ok',\n attention: 'attention',\n failed: 'failed',\n} as const;\n","/**\n * Generated by Orval, grouped by scripts/types-codegen/group_generated.ts\n * (group map from emit_openapi.py). Do not edit manually.\n * Group: entity_ref\n */\n\nimport type { ChatType } from './constant';\nimport type { CallDirection } from './detail';\nimport type { EntityKind } from './ref';\n\n/**\n * An agent, which is a ``Member`` subclass and shares its archival flag.\n */\nexport interface AgentRefSummary {\n kind?: 'agent';\n archived: boolean;\n}\n\n/**\n * A phone call. It has no name at all, so the facts *are* the label.\n *\n * ``durationSeconds`` is read-time arithmetic over the started/finished pair,\n * matching the design's ruling that a long-running kind's duration is derived\n * from its started/terminal events rather than stored.\n *\n * ``direction`` reuses :class:`lib.activity.details.CallDirection` — the enum\n * the spine's own ``call.*`` detail payloads carry — rather than minting a\n * second two-member enum with the same values. A client that renders a call\n * line from a feed event and one from a hydrated ref must not have to map\n * between two spellings of \"inbound\", and a second enum is a mapping waiting\n * to drift. It is derived here from ``PhoneCall.inbound``, a boolean, so no\n * stored text reaches it either way.\n */\nexport interface CallRefSummary {\n kind?: 'call';\n direction: CallDirection;\n completed: boolean;\n durationSeconds?: number | null;\n}\n\n/**\n * Structural conversation state used by Activity-backed virtual views.\n *\n * ``Chat.chat_type`` is a ``String(50)`` whose values happen to be\n * :class:`~lib.constants.ChatType` members. A value this build does not know\n * is ``None`` rather than passed through — the column is text, and text is the\n * one thing a summary may not carry. The remaining fields are booleans from\n * the Chat row (or, for ``isAnonymous``, its authorized owner relationship),\n * never message content or a generated conversation summary.\n */\nexport interface ChatRefSummary {\n kind?: 'chat';\n archived: boolean;\n isTest: boolean;\n isAnonymous: boolean;\n isMine: boolean;\n needsResponse: boolean;\n paused: boolean;\n chatType?: ChatType | null;\n participantMemberUuids?: string[];\n}\n\n/**\n * One ref to resolve: a kind and a UUID, and nothing else.\n *\n * Deliberately *not*\n * :class:`~lib.activity.refs.EntityRef`. That model carries the scope chain a\n * ref was observed under, and accepting it here would invite a caller to send\n * a ``workspaceUuid`` that disagrees with the mount's path parameter — two\n * sources of truth for the one fact that decides which authorizer runs. The\n * mount is the scope; the ref names what to look up inside it.\n */\nexport interface EntityRefLookup {\n kind: EntityKind;\n uuid: string;\n}\n\n/**\n * An intervention request. ``resolved`` is structural, not the column.\n *\n * ``InterventionRequest.resolution`` is a ``String(32)``; ``resolved_at`` is a\n * timestamp. The boolean derived from the timestamp says the thing a feed line\n * needs and cannot carry text.\n */\nexport interface EscalationRefSummary {\n kind?: 'escalation';\n resolved: boolean;\n}\n\n/**\n * A person or an agent seat, as a feed line renders one.\n */\nexport interface MemberRefSummary {\n kind?: 'member';\n archived: boolean;\n isAgent: boolean;\n}\n\n/**\n * What happened when this build tried to resolve one ref.\n */\nexport type RefResolutionStatus = typeof RefResolutionStatus[keyof typeof RefResolutionStatus];\n\n\nexport const RefResolutionStatus = {\n resolved: 'resolved',\n unresolved: 'unresolved',\n unsupported: 'unsupported',\n} as const;\n\n/**\n * A page's worth of refs, to be resolved in one authorized round trip.\n */\nexport interface ResolveEntityRefsRequest {\n /** @minItems 1 */\n refs: EntityRefLookup[];\n}\n\n/**\n * Every requested ref, answered, in the order the request named them.\n *\n * **One entry per distinct requested ref, always.** A ref that could not be\n * resolved is an entry with a marker status, never an omission and never a\n * 404: the batch is a hydration convenience, and letting one invisible ref\n * fail the request would make a page's rendering depend on whether it happened\n * to name something the caller cannot see.\n *\n * ``resolvedCount`` is redundant with the entries and present anyway — it is\n * what the audit summary records as ``recordCount``, and having the number on\n * the wire lets a client assert the endpoint's own claim rather than recount.\n */\nexport interface ResolveEntityRefsResponse {\n refs: ResolvedEntityRef[];\n /** @minimum 0 */\n resolvedCount: number;\n generatedAt: string;\n}\n\n/**\n * A page's worth of refs across several workspaces, in one round trip.\n *\n * The body of both grouped mounts — ``/o/{org_uuid}/activity/entity-refs`` and\n * ``/activity/entity-refs``. Which authority reads each group is the server's\n * decision, taken from the caller's own grants; a client never says.\n */\nexport interface ResolveGroupedEntityRefsRequest {\n /** @minItems 1 */\n workspaces: WorkspaceEntityRefLookups[];\n}\n\n/**\n * Every requested ref across several workspaces, answered.\n *\n * The same per-entry shape as\n * :class:`ResolveEntityRefsResponse` — one entry per distinct requested ref,\n * a marker status rather than an omission, never a 404 — grouped by the\n * workspace each ref was asked about in.\n *\n * ``resolvedCount`` is over the whole response, which is what the audit\n * summary records as ``recordCount``: how many names left the building.\n */\nexport interface ResolveGroupedEntityRefsResponse {\n workspaces: WorkspaceResolvedEntityRefs[];\n /** @minimum 0 */\n resolvedCount: number;\n generatedAt: string;\n}\n\n/**\n * One ref, and what this caller is allowed to know about it.\n *\n * ``kind`` and ``uuid`` echo the request so a client can key its cache by the\n * pair it asked about without relying on list order — the same\n * ``(kind, uuid)`` key React Query and the CLI resolver both use.\n *\n * Everything else is null unless ``status`` is ``RESOLVED``. That is not\n * defensive coding: a marker entry carrying a partially-populated label would\n * be exactly the oracle the ``UNRESOLVED`` status exists to close.\n */\nexport interface ResolvedEntityRef {\n kind: EntityKind;\n uuid: string;\n status: RefResolutionStatus;\n label?: string | null;\n targetHref?: string | null;\n summary?: MemberRefSummary | AgentRefSummary | ChatRefSummary | CallRefSummary | VoicemailRefSummary | EscalationRefSummary | WorkflowRevisionRefSummary | null;\n}\n\n/**\n * A voicemail. Its ``caller_name`` is PHI and deliberately never read here.\n *\n * The label for a voicemail comes from the phone number it landed on, which\n * is a company fact (root ``CLAUDE.md`` rule 3), never from the caller.\n */\nexport interface VoicemailRefSummary {\n kind?: 'voicemail';\n durationSeconds?: number | null;\n}\n\n/**\n * A published revision. Its own name fields are operator free text.\n *\n * ``revision_name`` and ``assistant_name`` are both nullable operator text, so\n * the label is the parent Workflow's name and the *number* is what\n * distinguishes this revision from its siblings — which is exactly what\n * ``workflow.published`` lines want to show.\n */\nexport interface WorkflowRevisionRefSummary {\n kind?: 'workflow_revision';\n revisionNumber?: number | null;\n}\n\n/**\n * One workspace's worth of refs, on a mount that spans workspaces.\n *\n * The grouping carries the scope the workspace mount takes from its path. A\n * ``workspaceUuid`` the mount cannot reach is not rejected: the route resolves\n * nothing for it and every ref in the group comes back ``UNRESOLVED``, which\n * is the same anti-enumeration answer a denied ref gets.\n */\nexport interface WorkspaceEntityRefLookups {\n workspaceUuid: string;\n /** @minItems 1 */\n refs: EntityRefLookup[];\n}\n\n/**\n * One workspace's answered refs, on a mount that spans workspaces.\n *\n * The grouping mirrors the request's, so a client keys an entry by\n * ``(workspaceUuid, kind, uuid)`` — the same identity its per-entity cache\n * already uses, because the same UUID under two workspaces is two entities.\n * A workspace the caller may not read here still gets a group: every ref in it\n * is ``UNRESOLVED``, indistinguishable from denied, gone or ambiguous.\n */\nexport interface WorkspaceResolvedEntityRefs {\n workspaceUuid: string;\n refs: ResolvedEntityRef[];\n}\n","/**\n * Centralized OAuth and API scope management for TypeScript/JavaScript clients.\n *\n * This module provides all available scopes for Applications and API keys,\n * serving as a single source of truth for permission management across frontend\n * and TypeScript-based services (like MCP servers).\n *\n * IMPORTANT: Keep in sync with lib/context/scopes.py\n */\n\n/**\n * Categories of scopes for organization\n * Must match namespaces used in Python Scope enum\n */\nexport enum ScopeCategory {\n WORKSPACE = 'workspace',\n MEMBERS = 'members',\n MEMBER_ROLES = 'member_roles',\n CHATS = 'chats',\n DM = 'dm',\n WORKFLOWS = 'workflows',\n ASSIGNMENTS = 'assignments',\n AUTOMATIONS = 'automations',\n DATATYPES = 'datatypes',\n RECORDS = 'records',\n FILES = 'files',\n DEVICES = 'devices',\n JOURNEYS = 'journeys',\n EXPERIMENTS = 'experiments',\n SITES = 'sites',\n AGENTS = 'agents',\n CALENDARS = 'calendars',\n INBOXES = 'inboxes',\n PHONES = 'phones',\n WEBHOOKS = 'webhooks',\n APPS = 'apps',\n LABELS = 'labels',\n ANALYTICS = 'analytics',\n ANONYMOUS_SUBMISSIONS = 'anonymous_submissions',\n OPERATOR = 'operator',\n EXPORT = 'export',\n ORG = 'org',\n}\n\n/**\n * Individual scope definition\n */\nexport interface ScopeDefinition {\n /** The scope identifier (e.g., \"workspace:read\") */\n name: string;\n /** The category this scope belongs to */\n category: ScopeCategory;\n /** Human-readable description of what this scope allows */\n description: string;\n /** List of other scopes this scope automatically includes */\n implies?: readonly string[];\n /** Whether this scope should be highlighted as dangerous */\n dangerous?: boolean;\n}\n\n/**\n * All available OAuth scopes\n * Must match Python Scope enum in lib/context/scopes.py\n */\nexport const SCOPES = {\n // =========================================================================\n // WORKSPACE\n // =========================================================================\n 'workspace:read': {\n name: 'workspace:read',\n category: ScopeCategory.WORKSPACE,\n description: 'View workspace settings',\n },\n 'workspace:write': {\n name: 'workspace:write',\n category: ScopeCategory.WORKSPACE,\n description: 'Modify workspace settings',\n implies: ['workspace:read'],\n },\n 'workspace:admin': {\n name: 'workspace:admin',\n category: ScopeCategory.WORKSPACE,\n description: 'Full workspace control',\n implies: ['workspace:write'],\n dangerous: true,\n },\n\n // =========================================================================\n // MEMBERS\n // =========================================================================\n 'members:read': {\n name: 'members:read',\n category: ScopeCategory.MEMBERS,\n description: 'View all members',\n },\n 'members:write': {\n name: 'members:write',\n category: ScopeCategory.MEMBERS,\n description: 'Create and update members',\n implies: ['members:read'],\n },\n 'members:admin': {\n name: 'members:admin',\n category: ScopeCategory.MEMBERS,\n description: 'Delete members, manage permissions',\n implies: ['members:write'],\n dangerous: true,\n },\n\n // =========================================================================\n // MEMBER ROLES\n // =========================================================================\n 'member_roles:read': {\n name: 'member_roles:read',\n category: ScopeCategory.MEMBER_ROLES,\n description: 'View role definitions',\n },\n 'member_roles:write': {\n name: 'member_roles:write',\n category: ScopeCategory.MEMBER_ROLES,\n description: 'Create and edit roles',\n implies: ['member_roles:read'],\n },\n 'member_roles:admin': {\n name: 'member_roles:admin',\n category: ScopeCategory.MEMBER_ROLES,\n description: 'Delete roles',\n implies: ['member_roles:write'],\n dangerous: true,\n },\n\n // =========================================================================\n // CHATS\n // =========================================================================\n 'chats:read': {\n name: 'chats:read',\n category: ScopeCategory.CHATS,\n description: 'View all conversations',\n },\n 'chats:write': {\n name: 'chats:write',\n category: ScopeCategory.CHATS,\n // Cross-member: acting in a conversation that is not yours. Sending in\n // your own needs no scope (see the chats:read note on \"all\").\n description: \"Modify other members' conversations\",\n implies: ['chats:read'],\n },\n 'chats:admin': {\n name: 'chats:admin',\n category: ScopeCategory.CHATS,\n description: 'Delete conversations',\n implies: ['chats:write'],\n },\n\n // =========================================================================\n // DIRECT MESSAGES\n // =========================================================================\n 'dm:read': {\n name: 'dm:read',\n category: ScopeCategory.DM,\n description: 'View direct messages',\n },\n 'dm:write': {\n name: 'dm:write',\n category: ScopeCategory.DM,\n description: 'Send direct messages',\n implies: ['dm:read'],\n },\n 'dm:admin': {\n name: 'dm:admin',\n category: ScopeCategory.DM,\n description: 'Delete direct messages',\n implies: ['dm:write'],\n },\n\n // =========================================================================\n // WORKFLOWS\n // =========================================================================\n 'workflows:read': {\n name: 'workflows:read',\n category: ScopeCategory.WORKFLOWS,\n // Object access is separate: listing and opening a specific workflow\n // additionally require ownership, workflows:admin, a workflow role\n // association, or an access grant (WorkflowAction.USE).\n description: 'Access the Workflows area and view workflows shared with you',\n },\n 'workflows:write': {\n name: 'workflows:write',\n category: ScopeCategory.WORKFLOWS,\n description: 'Create and edit workflows',\n implies: ['workflows:read'],\n },\n 'workflows:admin': {\n name: 'workflows:admin',\n category: ScopeCategory.WORKFLOWS,\n description: 'Delete workflows',\n implies: ['workflows:write'],\n },\n\n // =========================================================================\n // ASSIGNMENTS\n // =========================================================================\n 'assignments:read': {\n name: 'assignments:read',\n category: ScopeCategory.ASSIGNMENTS,\n description: 'View all assignments',\n },\n 'assignments:write': {\n name: 'assignments:write',\n category: ScopeCategory.ASSIGNMENTS,\n description: 'Create and modify assignments',\n implies: ['assignments:read'],\n },\n 'assignments:admin': {\n name: 'assignments:admin',\n category: ScopeCategory.ASSIGNMENTS,\n description: 'Delete assignments',\n implies: ['assignments:write'],\n },\n\n // =========================================================================\n // AUTOMATIONS\n // =========================================================================\n 'automations:read': {\n name: 'automations:read',\n category: ScopeCategory.AUTOMATIONS,\n description: 'View scheduled tasks and rules',\n },\n 'automations:write': {\n name: 'automations:write',\n category: ScopeCategory.AUTOMATIONS,\n description: 'Create and edit automations',\n implies: ['automations:read'],\n },\n 'automations:admin': {\n name: 'automations:admin',\n category: ScopeCategory.AUTOMATIONS,\n description: 'Delete automations',\n implies: ['automations:write'],\n },\n\n // =========================================================================\n // DATATYPES (Schema definitions)\n // =========================================================================\n 'datatypes:read': {\n name: 'datatypes:read',\n category: ScopeCategory.DATATYPES,\n description: 'View data type schemas',\n },\n 'datatypes:write': {\n name: 'datatypes:write',\n category: ScopeCategory.DATATYPES,\n description: 'Create and edit data types',\n implies: ['datatypes:read'],\n },\n 'datatypes:admin': {\n name: 'datatypes:admin',\n category: ScopeCategory.DATATYPES,\n description: 'Delete data types',\n implies: ['datatypes:write'],\n },\n\n // =========================================================================\n // RECORDS (Data instances)\n // =========================================================================\n 'records:read': {\n name: 'records:read',\n category: ScopeCategory.RECORDS,\n description: 'View all data records',\n },\n 'records:write': {\n name: 'records:write',\n category: ScopeCategory.RECORDS,\n description: 'Create and modify records',\n implies: ['records:read'],\n },\n 'records:admin': {\n name: 'records:admin',\n category: ScopeCategory.RECORDS,\n description: 'Delete records',\n implies: ['records:write'],\n },\n\n // =========================================================================\n // FILES\n // =========================================================================\n 'files:read': {\n name: 'files:read',\n category: ScopeCategory.FILES,\n description: 'View all files',\n },\n 'files:write': {\n name: 'files:write',\n category: ScopeCategory.FILES,\n description: 'Upload and modify files',\n implies: ['files:read'],\n },\n 'files:admin': {\n name: 'files:admin',\n category: ScopeCategory.FILES,\n description: 'Delete files',\n implies: ['files:write'],\n },\n\n // =========================================================================\n // DEVICES\n // =========================================================================\n 'devices:read': {\n name: 'devices:read',\n category: ScopeCategory.DEVICES,\n description: 'View companion devices',\n },\n 'devices:write': {\n name: 'devices:write',\n category: ScopeCategory.DEVICES,\n description: 'Enrol and manage own companion devices',\n implies: ['devices:read'],\n },\n 'devices:admin': {\n name: 'devices:admin',\n category: ScopeCategory.DEVICES,\n description: 'List and revoke any companion device',\n implies: ['devices:write'],\n },\n\n // =========================================================================\n // JOURNEYS\n // =========================================================================\n 'journeys:read': {\n name: 'journeys:read',\n category: ScopeCategory.JOURNEYS,\n description: 'View journey definitions',\n },\n 'journeys:write': {\n name: 'journeys:write',\n category: ScopeCategory.JOURNEYS,\n description: 'Create and edit journeys',\n implies: ['journeys:read'],\n },\n 'journeys:admin': {\n name: 'journeys:admin',\n category: ScopeCategory.JOURNEYS,\n description: 'Delete journeys',\n implies: ['journeys:write'],\n },\n\n // =========================================================================\n // EXPERIMENTS\n // =========================================================================\n 'experiments:read': {\n name: 'experiments:read',\n category: ScopeCategory.EXPERIMENTS,\n description: 'View experiments and assignments',\n },\n 'experiments:write': {\n name: 'experiments:write',\n category: ScopeCategory.EXPERIMENTS,\n description: 'Create and edit experiments',\n implies: ['experiments:read'],\n },\n 'experiments:admin': {\n name: 'experiments:admin',\n category: ScopeCategory.EXPERIMENTS,\n description: 'Delete draft experiments and archive experiments',\n implies: ['experiments:write'],\n },\n\n // =========================================================================\n // SITES\n // =========================================================================\n 'sites:read': {\n name: 'sites:read',\n category: ScopeCategory.SITES,\n description: 'View site configurations',\n },\n 'sites:write': {\n name: 'sites:write',\n category: ScopeCategory.SITES,\n description: 'Create and edit sites',\n implies: ['sites:read'],\n },\n 'sites:admin': {\n name: 'sites:admin',\n category: ScopeCategory.SITES,\n description: 'Delete sites',\n implies: ['sites:write'],\n },\n\n // =========================================================================\n // AGENTS\n // =========================================================================\n 'agents:read': {\n name: 'agents:read',\n category: ScopeCategory.AGENTS,\n description: 'View agent members',\n },\n 'agents:write': {\n name: 'agents:write',\n category: ScopeCategory.AGENTS,\n description: 'Create and configure agents',\n implies: ['agents:read'],\n },\n 'agents:admin': {\n name: 'agents:admin',\n category: ScopeCategory.AGENTS,\n description: 'Delete agents',\n implies: ['agents:write'],\n },\n\n // =========================================================================\n // CALENDARS\n // =========================================================================\n 'calendars:read': {\n name: 'calendars:read',\n category: ScopeCategory.CALENDARS,\n description: 'View calendars',\n },\n 'calendars:write': {\n name: 'calendars:write',\n category: ScopeCategory.CALENDARS,\n description: 'Create and edit calendar events',\n implies: ['calendars:read'],\n },\n 'calendars:admin': {\n name: 'calendars:admin',\n category: ScopeCategory.CALENDARS,\n description: 'Delete calendars',\n implies: ['calendars:write'],\n },\n\n // =========================================================================\n // INBOXES\n // =========================================================================\n 'inboxes:read': {\n name: 'inboxes:read',\n category: ScopeCategory.INBOXES,\n description: 'View inbox configurations',\n },\n 'inboxes:write': {\n name: 'inboxes:write',\n category: ScopeCategory.INBOXES,\n description: 'Configure inboxes',\n implies: ['inboxes:read'],\n },\n 'inboxes:admin': {\n name: 'inboxes:admin',\n category: ScopeCategory.INBOXES,\n description: 'Delete inboxes',\n implies: ['inboxes:write'],\n },\n\n // =========================================================================\n // PHONES\n // =========================================================================\n 'phones:read': {\n name: 'phones:read',\n category: ScopeCategory.PHONES,\n description: 'View phone numbers',\n },\n 'phones:write': {\n name: 'phones:write',\n category: ScopeCategory.PHONES,\n description: 'Configure phone numbers',\n implies: ['phones:read'],\n },\n 'phones:admin': {\n name: 'phones:admin',\n category: ScopeCategory.PHONES,\n description: 'Delete phone numbers',\n implies: ['phones:write'],\n },\n\n // =========================================================================\n // WEBHOOKS\n // =========================================================================\n 'webhooks:read': {\n name: 'webhooks:read',\n category: ScopeCategory.WEBHOOKS,\n description: 'View webhook logs',\n },\n 'webhooks:write': {\n name: 'webhooks:write',\n category: ScopeCategory.WEBHOOKS,\n description: 'Configure webhooks',\n implies: ['webhooks:read'],\n },\n 'webhooks:admin': {\n name: 'webhooks:admin',\n category: ScopeCategory.WEBHOOKS,\n description: 'Delete webhooks',\n implies: ['webhooks:write'],\n },\n 'webhooks:raw': {\n name: 'webhooks:raw',\n category: ScopeCategory.WEBHOOKS,\n description: 'Access raw webhook payloads',\n },\n\n // =========================================================================\n // APPS (OAuth grants, integrations)\n // =========================================================================\n 'apps:read': {\n name: 'apps:read',\n category: ScopeCategory.APPS,\n description: 'View app integrations',\n },\n 'apps:write': {\n name: 'apps:write',\n category: ScopeCategory.APPS,\n description: 'Configure app integrations',\n implies: ['apps:read'],\n },\n 'apps:admin': {\n name: 'apps:admin',\n category: ScopeCategory.APPS,\n description: 'Delete app integrations',\n implies: ['apps:write'],\n },\n\n // =========================================================================\n // LABELS\n // =========================================================================\n 'labels:read': {\n name: 'labels:read',\n category: ScopeCategory.LABELS,\n description: 'View labels',\n },\n 'labels:write': {\n name: 'labels:write',\n category: ScopeCategory.LABELS,\n description:\n 'Deprecated — label mutations now require the parent resource write scope (members:write, chats:write, files:write)',\n implies: ['labels:read'],\n },\n\n // =========================================================================\n // ANALYTICS\n // =========================================================================\n 'analytics:read': {\n name: 'analytics:read',\n category: ScopeCategory.ANALYTICS,\n description: 'View analytics and reports',\n },\n\n // =========================================================================\n // ANONYMOUS FORM SUBMISSIONS (read-only: submissions are immutable)\n // =========================================================================\n 'anonymous_submissions:read': {\n name: 'anonymous_submissions:read',\n category: ScopeCategory.ANONYMOUS_SUBMISSIONS,\n description: 'View what anonymous visitors submitted on anonymous Forms',\n },\n\n // =========================================================================\n // EXPORT\n // =========================================================================\n 'export:read': {\n name: 'export:read',\n category: ScopeCategory.EXPORT,\n description: 'Export workspace data',\n },\n 'export:write': {\n name: 'export:write',\n category: ScopeCategory.EXPORT,\n description: 'Export workspace data',\n implies: ['export:read'],\n },\n 'export:admin': {\n name: 'export:admin',\n category: ScopeCategory.EXPORT,\n description: 'Export all data including sensitive information',\n implies: ['export:write'],\n dangerous: true,\n },\n\n // =========================================================================\n // ORGANIZATION\n // =========================================================================\n 'org:info': {\n name: 'org:info',\n category: ScopeCategory.ORG,\n description: 'View basic org info and own workspaces',\n },\n 'org:read': {\n name: 'org:read',\n category: ScopeCategory.ORG,\n description: 'View org info',\n implies: ['org:info'],\n },\n 'org:write': {\n name: 'org:write',\n category: ScopeCategory.ORG,\n description: 'Update org settings',\n implies: ['org:read'],\n },\n 'org:admin': {\n name: 'org:admin',\n category: ScopeCategory.ORG,\n description: 'Full org management',\n implies: ['org:write'],\n dangerous: true,\n },\n 'operator:read': {\n name: 'operator:read',\n category: ScopeCategory.OPERATOR,\n description: 'View operator dashboard and listen in',\n },\n 'operator:write': {\n name: 'operator:write',\n category: ScopeCategory.OPERATOR,\n description: 'Go Live and handle interactions as an operator',\n implies: ['operator:read'],\n },\n 'org:manage_admins': {\n name: 'org:manage_admins',\n category: ScopeCategory.ORG,\n description: 'Assign admin and owner roles (owner only)',\n implies: ['org:admin'],\n dangerous: true,\n },\n 'org:delete': {\n name: 'org:delete',\n category: ScopeCategory.ORG,\n description: 'Delete organization (owner only)',\n implies: ['org:admin'],\n dangerous: true,\n },\n} as const;\n\n/**\n * Type-safe scope name. Use this instead of raw strings for scope checks.\n */\nexport type ScopeName = keyof typeof SCOPES;\n\n/**\n * Manager for scope operations and validations\n */\nexport class ScopeManager {\n /**\n * Get a scope by name\n */\n static getScope(name: ScopeName): ScopeDefinition {\n return SCOPES[name] as ScopeDefinition;\n }\n\n /**\n * Get all available scopes\n */\n static getAllScopes(): Record<ScopeName, ScopeDefinition> {\n return { ...SCOPES } as Record<ScopeName, ScopeDefinition>;\n }\n\n /**\n * Get all scopes in a specific category\n */\n static getScopesByCategory(category: ScopeCategory): ScopeDefinition[] {\n return (Object.values(SCOPES) as ScopeDefinition[]).filter(\n (scope) => scope.category === category\n );\n }\n\n /**\n * Expand a list of scope names to include all implied scopes\n */\n static expandScopes(scopeNames: string[]): Set<string> {\n const expanded = new Set<string>();\n const toProcess = [...scopeNames];\n\n while (toProcess.length > 0) {\n const scopeName = toProcess.pop()!;\n if (expanded.has(scopeName)) {\n continue;\n }\n\n expanded.add(scopeName);\n const scope = SCOPES[scopeName as ScopeName] as ScopeDefinition | undefined;\n if (scope?.implies) {\n toProcess.push(...scope.implies);\n }\n }\n\n return expanded;\n }\n\n /**\n * Validate that all scope names are valid\n * @returns List of invalid scope names, or empty array if all valid\n * @throws Error if any scope names are invalid\n */\n static validateScopes(scopeNames: string[]): string[] {\n const invalid = scopeNames.filter((s) => !(s in SCOPES));\n if (invalid.length > 0) {\n throw new Error(`Invalid scopes: ${invalid.join(', ')}`);\n }\n return [];\n }\n\n /**\n * Get all dangerous scopes from a list of scope names\n */\n static getDangerousScopes(scopeNames: string[]): ScopeDefinition[] {\n const expanded = ScopeManager.expandScopes(scopeNames);\n return Array.from(expanded)\n .map((s) => SCOPES[s as ScopeName] as ScopeDefinition | undefined)\n .filter((scope): scope is ScopeDefinition => scope?.dangerous === true);\n }\n\n /**\n * Format scope descriptions grouped by category\n */\n static formatScopeDescription(scopeNames: string[]): Record<\n ScopeCategory,\n Array<{\n name: string;\n description: string;\n dangerous?: boolean;\n implied: boolean;\n }>\n > {\n const expanded = ScopeManager.expandScopes(scopeNames);\n const result: Partial<\n Record<\n ScopeCategory,\n Array<{\n name: string;\n description: string;\n dangerous?: boolean;\n implied: boolean;\n }>\n >\n > = {};\n\n Array.from(expanded)\n .sort()\n .forEach((scopeName) => {\n const scope = SCOPES[scopeName as ScopeName] as ScopeDefinition | undefined;\n if (!scope) return;\n\n if (!result[scope.category]) {\n result[scope.category] = [];\n }\n\n result[scope.category]!.push({\n name: scope.name,\n description: scope.description,\n dangerous: scope.dangerous,\n implied: !scopeNames.includes(scopeName), // Was this scope implied?\n });\n });\n\n return result as Record<\n ScopeCategory,\n Array<{\n name: string;\n description: string;\n dangerous?: boolean;\n implied: boolean;\n }>\n >;\n }\n\n /**\n * Parse a space-separated scope string into an array\n */\n static parseScopeString(scopeString: string): string[] {\n return scopeString.split(/\\s+/).filter((s) => s.length > 0);\n }\n\n /**\n * Convert scope array to space-separated string\n */\n static formatScopeString(scopes: string[]): string {\n return scopes.join(' ');\n }\n}\n\n/**\n * Common scope combinations for convenience\n */\nexport const SCOPE_PRESETS = {\n /** Data access - members and records management */\n DATA: ['members:read', 'members:write', 'records:read', 'records:write'] as ScopeName[],\n\n /** Chat access - members and chat management */\n CHATS: ['members:read', 'chats:read', 'chats:write'] as ScopeName[],\n\n /** Full access - all available scopes */\n ALL: Object.keys(SCOPES) as ScopeName[],\n};\n","/**\n * Derived revision state — the single place derived booleans about a workflow\n * revision live. The API never puts these on the wire (they can contradict\n * their inputs; the facts they derive from can't). Every consumer — web app,\n * CLI, MCP — computes them here from the workflow root's pointer columns plus\n * the revision's own facts.\n *\n * See docs/features/conversations/workflows/versioning/api-shape.md.\n */\n\n/** The two facts a revision derivation needs from the stable workflow root. */\nexport interface RevisionStateWorkflow {\n activeRevisionId: number;\n draftRevisionId: number;\n /** Fact behind \"has unpublished changes\"; null after a fresh clone/publish. */\n draftModifiedAt?: string | null;\n}\n\n/** The two facts a derivation needs from the revision itself, when one is in hand. */\nexport interface RevisionStateRevision {\n id: number;\n /** Present on published revisions, null/absent on the draft. */\n publishedAt?: string | null;\n}\n\nexport interface RevisionState {\n /** This revision is the workflow's active (live-traffic) revision. */\n isActive: boolean;\n /** This revision is the workflow's mutable draft. */\n isDraft: boolean;\n /** active === draft: live traffic reads the editor's mutable draft. */\n draftIsLive: boolean;\n /** The draft has been edited since the last publish (or since creation). */\n hasUnpublishedChanges: boolean;\n /** 'published' once the revision has a publish timestamp, else 'draft'. */\n state: 'draft' | 'published';\n}\n\n/**\n * Derive a revision's state from the workflow root pointers and (optionally)\n * the revision in hand. Pure — no I/O, no allocation beyond the result.\n *\n * When `revision` is omitted, per-revision facts default to false / 'draft'\n * (there is no revision to compare), while the workflow-level derivations\n * (`draftIsLive`, `hasUnpublishedChanges`) are still computed.\n */\nexport function getRevisionState(\n workflow: RevisionStateWorkflow,\n revision?: RevisionStateRevision\n): RevisionState {\n const draftIsLive = workflow.activeRevisionId === workflow.draftRevisionId;\n const hasUnpublishedChanges = workflow.draftModifiedAt != null;\n return {\n isActive: revision != null && revision.id === workflow.activeRevisionId,\n isDraft: revision != null && revision.id === workflow.draftRevisionId,\n draftIsLive,\n hasUnpublishedChanges,\n state: revision?.publishedAt != null ? 'published' : 'draft',\n };\n}\n"],"mappings":"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AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;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A,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAC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","names":["suffix","AccessLevel","Scope","MemberType","McpServerState","ToolkitState","EventRuleObjectType","EventRuleEventType","EventRuleActionType","WorkspaceFeature","MemberFeature","OrgFeature","Resource","ProductType","WorkspaceProvisionStatus","InvitationStatus","FhirVendor","FhirConnectionState","FhirClientType","CrmActivityKind","CriterionType","DriverMode","AccessGrantResourceType","CapabilityClass","AccessGrantStatus","AccessGrantTrigger","ConsentMethod","FeatureCategory","FeatureVisibility","ScopeCategory"]}
|