@amigo-ai/platform-sdk 0.51.0 → 0.53.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/core/errors.ts", "../src/core/openapi-client.ts", "../src/core/auth.ts", "../src/core/rate-limit.ts", "../src/core/request-options.ts", "../src/core/retry.ts", "../src/core/utils.ts", "../src/resources/base.ts", "../src/resources/me.ts", "../src/resources/workspaces.ts", "../src/resources/api-keys.ts", "../src/resources/agents.ts", "../src/resources/skills.ts", "../src/resources/actions.ts", "../src/resources/operators.ts", "../src/resources/prompt-logs.ts", "../src/resources/triggers.ts", "../src/resources/services.ts", "../src/resources/context-graphs.ts", "../src/resources/data-sources.ts", "../src/resources/world.ts", "../src/resources/calls.ts", "../src/resources/conversations.ts", "../src/resources/channels/ses-setup.ts", "../src/resources/channels/index.ts", "../src/resources/phone-numbers.ts", "../src/resources/integrations.ts", "../src/resources/analytics.ts", "../src/resources/simulations.ts", "../src/resources/metrics.ts", "../src/resources/settings.ts", "../src/resources/billing.ts", "../src/resources/memory.ts", "../src/resources/personas.ts", "../src/resources/review-queue.ts", "../src/resources/recordings.ts", "../src/resources/audit.ts", "../src/resources/webhook-destinations.ts", "../src/resources/safety.ts", "../src/resources/compliance.ts", "../src/resources/events.ts", "../src/resources/functions.ts", "../src/core/reconnecting-websocket.ts", "../src/resources/observers.ts", "../src/resources/fhir.ts", "../src/resources/insights.ts", "../src/resources/monitor-concepts.ts", "../src/resources/unification-rules.ts", "../src/resources/crm.ts", "../src/resources/command-center.ts", "../src/resources/sensorium.ts", "../src/resources/data-query.ts", "../src/resources/briefs.ts", "../src/resources/desktop-sessions.ts", "../src/resources/intake.ts", "../src/resources/network.ts", "../src/resources/pipeline.ts", "../src/resources/tasks.ts", "../src/resources/tools.ts", "../src/resources/surfaces.ts", "../src/resources/sessions.ts", "../src/resources/workspace-database.ts", "../src/core/branded-types.ts", "../src/core/webhooks.ts", "../src/core/device-code.ts"],
4
- "sourcesContent": ["/**\n * @amigo-ai/platform-sdk\n *\n * Official TypeScript SDK for the Amigo Platform API.\n *\n * @example\n * ```typescript\n * import { AmigoClient } from '@amigo-ai/platform-sdk'\n *\n * const client = new AmigoClient({\n * apiKey: 'your-api-key',\n * workspaceId: 'your-workspace-id',\n * })\n *\n * const agents = await client.agents.list()\n * console.log(agents.items)\n * ```\n */\n\nimport type { FetchResponse, HeadersOptions } from 'openapi-fetch'\nimport type { MediaType, PathsWithMethod } from 'openapi-typescript-helpers'\nimport { ConfigurationError } from './core/errors.js'\nimport {\n applyPlatformRequestOptions,\n createPlatformClient,\n type ClientHooks,\n type PlatformFetch,\n} from './core/openapi-client.js'\nimport {\n mergeRequestOptions,\n type AmigoRequestOptions,\n type InitParam,\n type OperationFor,\n type ScopedRequestOptions,\n} from './core/request-options.js'\nimport type { RetryOptions } from './core/retry.js'\nimport { MeResource } from './resources/me.js'\nimport { WorkspacesResource } from './resources/workspaces.js'\nimport { ApiKeysResource } from './resources/api-keys.js'\nimport { AgentsResource } from './resources/agents.js'\nimport { SkillsResource } from './resources/skills.js'\nimport { ActionsResource } from './resources/actions.js'\nimport { OperatorsResource } from './resources/operators.js'\nimport { PromptLogsResource } from './resources/prompt-logs.js'\nimport { TriggersResource } from './resources/triggers.js'\nimport { ServicesResource } from './resources/services.js'\nimport { ContextGraphsResource } from './resources/context-graphs.js'\nimport { DataSourcesResource } from './resources/data-sources.js'\nimport { WorldResource } from './resources/world.js'\nimport { CallsResource } from './resources/calls.js'\nimport { ConversationsResource } from './resources/conversations.js'\nimport { ChannelsResource } from './resources/channels/index.js'\nimport { PhoneNumbersResource } from './resources/phone-numbers.js'\nimport { IntegrationsResource } from './resources/integrations.js'\nimport { AnalyticsResource } from './resources/analytics.js'\nimport { SimulationsResource } from './resources/simulations.js'\nimport { MetricsResource } from './resources/metrics.js'\nimport { SettingsResource } from './resources/settings.js'\nimport { BillingResource } from './resources/billing.js'\nimport { MemoryResource } from './resources/memory.js'\nimport { PersonasResource } from './resources/personas.js'\nimport { ReviewQueueResource } from './resources/review-queue.js'\nimport { RecordingsResource } from './resources/recordings.js'\nimport { AuditResource } from './resources/audit.js'\nimport { WebhookDestinationsResource } from './resources/webhook-destinations.js'\nimport { SafetyResource } from './resources/safety.js'\nimport { ComplianceResource } from './resources/compliance.js'\nimport { EventsResource } from './resources/events.js'\nimport { FunctionsResource } from './resources/functions.js'\nimport { ObserversResource } from './resources/observers.js'\nimport { FhirResource } from './resources/fhir.js'\nimport { InsightsResource } from './resources/insights.js'\nimport { MonitorConceptsResource } from './resources/monitor-concepts.js'\nimport { UnificationRulesResource } from './resources/unification-rules.js'\nimport { CrmResource } from './resources/crm.js'\nimport { CommandCenterResource } from './resources/command-center.js'\nimport { SensoriumResource } from './resources/sensorium.js'\nimport { DataQueryResource } from './resources/data-query.js'\nimport { BriefsResource } from './resources/briefs.js'\nimport { DesktopSessionsResource } from './resources/desktop-sessions.js'\nimport { IntakeResource } from './resources/intake.js'\nimport { NetworkResource } from './resources/network.js'\nimport { PipelineResource } from './resources/pipeline.js'\nimport { TasksResource } from './resources/tasks.js'\nimport { ToolsResource } from './resources/tools.js'\nimport { SurfacesResource } from './resources/surfaces.js'\nimport { SessionsResource } from './resources/sessions.js'\nimport { WorkspaceDatabaseResource } from './resources/workspace-database.js'\nimport { resolveScopedPlatformClient, scopePlatformClient } from './resources/base.js'\nimport type { components, paths } from './generated/api.js'\nimport type { MetricValue as MetricValueAlias } from './resources/metrics.js'\nimport { withResponse, type AmigoResponse } from './core/utils.js'\n\nexport const DEFAULT_BASE_URL = 'https://api.platform.amigo.ai'\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] }\n// The generated client exposes TRACE, but the SDK only publishes helpers for\n// platform methods that exist in the committed OpenAPI snapshot.\ntype PlatformMethod = 'get' | 'put' | 'post' | 'delete' | 'options' | 'head' | 'patch'\ntype EmptyOptions = Record<never, never>\ntype PathForMethod<Method extends PlatformMethod> = Extract<PathsWithMethod<paths, Method>, string>\ntype SuccessData<Operation extends Record<string | number, unknown>> = Extract<\n FetchResponse<Operation, EmptyOptions, MediaType>,\n { error?: never }\n>['data']\ntype IsNever<Value> = [Value] extends [never] ? true : false\ntype DefinedSuccessData<Operation extends Record<string | number, unknown>> = Exclude<\n SuccessData<Operation>,\n undefined\n>\n// Success data preserves nullable response bodies. Endpoints with no success\n// body resolve to undefined so low-level helpers can represent 204/205 results.\ntype OperationResponse<\n Path extends keyof paths & string,\n Method extends PlatformMethod,\n> = Method extends keyof paths[Path]\n ? paths[Path][Method] extends infer Operation extends Record<string | number, unknown>\n ? IsNever<SuccessData<Operation>> extends true\n ? never\n : // Preserve nullable success bodies; only no-content operations collapse to undefined.\n [DefinedSuccessData<Operation>] extends [never]\n ? undefined\n : DefinedSuccessData<Operation>\n : never\n : never\n\nexport interface AmigoClientConfig {\n /** API key created via POST /v1/{workspace_id}/api-keys */\n apiKey: string\n\n /** Workspace ID \u2014 all resource operations are scoped to this workspace */\n workspaceId: string\n\n /**\n * Override the base URL. Defaults to https://api.platform.amigo.ai\n *\n * For BFF proxy patterns (e.g., Next.js), point this at your proxy:\n * ```ts\n * new AmigoClient({ baseUrl: '/api/platform', ... })\n * ```\n */\n baseUrl?: string\n\n /** Retry configuration for failed requests */\n retry?: RetryOptions\n\n /** Convenience alias for retry count (same semantics as \"number of retries\") */\n maxRetries?: number\n\n /** Default request timeout in milliseconds */\n timeout?: number\n\n /** Additional headers sent with every request */\n headers?: HeadersOptions\n\n /** Request lifecycle hooks for logging, tracing, or metrics */\n hooks?: ClientHooks\n\n /**\n * Custom fetch implementation.\n *\n * Use for BFF proxy routing, server-side cookie forwarding,\n * or test mocking. When provided, all HTTP requests flow\n * through this function instead of globalThis.fetch.\n */\n fetch?: typeof globalThis.fetch\n\n /**\n * Base URL for the agent engine (voice-agent) WebSocket endpoints.\n *\n * Required when `baseUrl` points to a BFF proxy or a different host\n * than the agent engine \u2014 WebSockets cannot traverse HTTP proxies.\n * Used by `conversations.textStreamUrl()` to build the `ws://` URL.\n *\n * Accepts `http://` or `https://` (auto-mapped to `ws://` / `wss://`)\n * or direct `ws://` / `wss://` URLs.\n *\n * Defaults to deriving from `baseUrl` (works when REST API and agent\n * engine share the same origin).\n *\n * ```ts\n * new AmigoClient({\n * baseUrl: '/api/platform', // BFF proxy for REST\n * agentBaseUrl: 'wss://api.platform.amigo.ai', // direct for WS\n * ...\n * })\n * ```\n */\n agentBaseUrl?: string\n}\n\nexport class AmigoClient {\n readonly workspaceId!: string\n readonly baseUrl!: string\n readonly agentBaseUrl!: string | undefined\n readonly workspaces!: WorkspacesResource\n readonly me!: MeResource\n readonly apiKeys!: ApiKeysResource\n readonly agents!: AgentsResource\n /** @deprecated Use `actions` instead */\n readonly skills!: SkillsResource\n readonly actions!: ActionsResource\n readonly operators!: OperatorsResource\n readonly promptLogs!: PromptLogsResource\n readonly triggers!: TriggersResource\n readonly services!: ServicesResource\n readonly contextGraphs!: ContextGraphsResource\n readonly dataSources!: DataSourcesResource\n readonly world!: WorldResource\n readonly calls!: CallsResource\n readonly conversations!: ConversationsResource\n readonly channels!: ChannelsResource\n readonly phoneNumbers!: PhoneNumbersResource\n readonly integrations!: IntegrationsResource\n readonly analytics!: AnalyticsResource\n readonly simulations!: SimulationsResource\n readonly metrics!: MetricsResource\n readonly settings!: SettingsResource\n readonly billing!: BillingResource\n readonly memory!: MemoryResource\n readonly personas!: PersonasResource\n readonly reviewQueue!: ReviewQueueResource\n readonly recordings!: RecordingsResource\n readonly audit!: AuditResource\n readonly webhookDestinations!: WebhookDestinationsResource\n readonly safety!: SafetyResource\n readonly compliance!: ComplianceResource\n readonly events!: EventsResource\n readonly functions!: FunctionsResource\n /**\n * Voice-call observer real-time stream. Subscribe with\n * ``client.observers.subscribe({ callSid, token, onEvent })``. See\n * {@link ObserversResource}.\n */\n readonly observers!: ObserversResource\n /** FHIR / EHR data interop \u2014 sync status, imports, resources, patient views */\n readonly fhir!: FhirResource\n /** Natural-language insights \u2014 schema, suggestions, SQL, chat sessions */\n readonly insights!: InsightsResource\n /** Workspace monitor concepts (semantic patterns watched across calls) */\n readonly monitorConcepts!: MonitorConceptsResource\n /** Entity unification rules (declarative deduplication of world-model entities) */\n readonly unificationRules!: UnificationRulesResource\n /** CRM \u2014 contacts, companies, deals, pipeline (sync from connected CRM integration) */\n readonly crm!: CrmResource\n /** Command Center \u2014 rolled-up workspace homepage snapshot */\n readonly commandCenter!: CommandCenterResource\n /** Sensorium \u2014 operator-facing live agent loop observability */\n readonly sensorium!: SensoriumResource\n /** Generic data query against whitelisted workspace datasets */\n readonly dataQuery!: DataQueryResource\n /** AI-generated entity briefs (workspace-level + per-entity) */\n readonly briefs!: BriefsResource\n /** Remote-controlled desktop sessions for driving GUI-only third-party apps */\n readonly desktopSessions!: DesktopSessionsResource\n /** Patient intake \u2014 signed upload links + uploads */\n readonly intake!: IntakeResource\n /** Workspace network metadata (egress IP allowlist) */\n readonly network!: NetworkResource\n /** Data ingestion pipeline observability (sources, throughput, review backlog) */\n readonly pipeline!: PipelineResource\n /** Long-running async tasks (poll by id or list by call) */\n readonly tasks!: TasksResource\n /** Manual tool execution + per-service tool resolution */\n readonly tools!: ToolsResource\n /** Surfaces \u2014 short-lived form/intake experiences (lifecycle: create\u2192deliver\u2192review\u2192approve) */\n readonly surfaces!: SurfacesResource\n /** Live agent sessions \u2014 list active calls + inject mid-call directives */\n readonly sessions!: SessionsResource\n /** Workspace database \u2014 Lakebase fork lifecycle, SQL query execution, query tool CRUD */\n readonly workspaceDatabase!: WorkspaceDatabaseResource\n /** @internal \u2014 exposed for path-level type inference in GET/POST/PUT/etc. */\n readonly api!: PlatformFetch\n\n constructor(config: AmigoClientConfig) {\n if (!config.apiKey || typeof config.apiKey !== 'string') {\n throw new ConfigurationError('apiKey is required and must be a non-empty string')\n }\n if (!config.workspaceId || typeof config.workspaceId !== 'string') {\n throw new ConfigurationError('workspaceId is required and must be a non-empty string')\n }\n\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '')\n\n const client = createPlatformClient({\n apiKey: config.apiKey,\n baseUrl,\n retry: config.retry,\n maxRetries: config.maxRetries,\n timeout: config.timeout,\n headers: config.headers,\n hooks: config.hooks,\n fetch: config.fetch,\n })\n\n AmigoClient.hydrate(this, client, config.workspaceId, baseUrl, config.agentBaseUrl)\n }\n\n withOptions(options: ScopedRequestOptions): AmigoClient {\n return AmigoClient.fromPlatformClient(\n scopePlatformClient(this.api, options),\n this.workspaceId,\n this.baseUrl,\n this.agentBaseUrl,\n )\n }\n\n async GET<Path extends PathForMethod<'get'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'get'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'get'>>> {\n return withResponse(await this.resolveApiRequest(path, 'GET', init)) as AmigoResponse<\n OperationResponse<Path, 'get'>\n >\n }\n\n async POST<Path extends PathForMethod<'post'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'post'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'post'>>> {\n return withResponse(await this.resolveApiRequest(path, 'POST', init)) as AmigoResponse<\n OperationResponse<Path, 'post'>\n >\n }\n\n async PUT<Path extends PathForMethod<'put'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'put'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'put'>>> {\n return withResponse(await this.resolveApiRequest(path, 'PUT', init)) as AmigoResponse<\n OperationResponse<Path, 'put'>\n >\n }\n\n async PATCH<Path extends PathForMethod<'patch'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'patch'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'patch'>>> {\n return withResponse(await this.resolveApiRequest(path, 'PATCH', init)) as AmigoResponse<\n OperationResponse<Path, 'patch'>\n >\n }\n\n async DELETE<Path extends PathForMethod<'delete'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'delete'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'delete'>>> {\n return withResponse(await this.resolveApiRequest(path, 'DELETE', init)) as AmigoResponse<\n OperationResponse<Path, 'delete'>\n >\n }\n\n async HEAD<Path extends PathForMethod<'head'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'head'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'head'>>> {\n return withResponse(await this.resolveApiRequest(path, 'HEAD', init), {\n allowEmptyBody: true,\n }) as AmigoResponse<OperationResponse<Path, 'head'>>\n }\n\n async OPTIONS<Path extends PathForMethod<'options'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'options'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'options'>>> {\n return withResponse(await this.resolveApiRequest(path, 'OPTIONS', init), {\n allowEmptyBody: true,\n }) as AmigoResponse<OperationResponse<Path, 'options'>>\n }\n\n /**\n * Bind a path literal + method to a fully-typed callable.\n *\n * Captures the path as a literal type at definition time, so the returned\n * callable keeps full request/response inference even when stored,\n * exported, or composed across modules. Solves the \"explicit `as const` on\n * path params\" footgun: consumers who store a path in a `string` variable\n * lose path inference and the SDK collapses to `unknown`.\n *\n * ```ts\n * const getCall = client.defineRoute('GET', '/v1/{workspace_id}/calls/{call_id}')\n * const call = await getCall({ params: { path: { call_id } } })\n * // call.data: CallDetailResponse | undefined (fully typed)\n * ```\n *\n * Workspace IDs are still auto-injected by the underlying dispatchers \u2014 the\n * helper is purely a type-level convenience. Runtime behavior is identical\n * to calling the matching method directly, so retries, hooks, error\n * conversion, and timeout handling all apply.\n */\n defineRoute<Path extends PathForMethod<'get'>>(\n method: 'GET',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'get'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'get'>>>\n defineRoute<Path extends PathForMethod<'post'>>(\n method: 'POST',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'post'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'post'>>>\n defineRoute<Path extends PathForMethod<'put'>>(\n method: 'PUT',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'put'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'put'>>>\n defineRoute<Path extends PathForMethod<'patch'>>(\n method: 'PATCH',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'patch'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'patch'>>>\n defineRoute<Path extends PathForMethod<'delete'>>(\n method: 'DELETE',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'delete'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'delete'>>>\n defineRoute<Path extends PathForMethod<'head'>>(\n method: 'HEAD',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'head'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'head'>>>\n defineRoute<Path extends PathForMethod<'options'>>(\n method: 'OPTIONS',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'options'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'options'>>>\n defineRoute(\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS',\n path: string,\n ): (init?: AmigoRequestOptions<unknown>) => Promise<AmigoResponse<unknown>> {\n type AnyDispatcher = (p: string, i?: unknown) => Promise<AmigoResponse<unknown>>\n const dispatcher = this[method] as unknown as AnyDispatcher\n return (init?: AmigoRequestOptions<unknown>) => dispatcher.call(this, path, init)\n }\n\n private static fromPlatformClient(\n client: PlatformFetch,\n workspaceId: string,\n baseUrl: string,\n agentBaseUrl?: string,\n ): AmigoClient {\n const instance = Object.create(AmigoClient.prototype) as AmigoClient\n AmigoClient.hydrate(instance, client, workspaceId, baseUrl, agentBaseUrl)\n return instance\n }\n\n private static hydrate(\n target: AmigoClient,\n client: PlatformFetch,\n workspaceId: string,\n baseUrl: string,\n agentBaseUrl?: string,\n ): void {\n const mutable = target as Mutable<AmigoClient>\n\n mutable.workspaceId = workspaceId\n mutable.baseUrl = baseUrl\n mutable.agentBaseUrl = agentBaseUrl\n ;(target as unknown as { api: PlatformFetch }).api = client\n\n mutable.workspaces = new WorkspacesResource(client, workspaceId)\n // ``MeResource`` operates on /v1/me/... \u2014 account-scoped, not\n // workspace-scoped. Pass a sentinel literal instead of forwarding\n // the bound ``workspaceId`` so any accidental future use of\n // ``this.workspaceId`` inside ``MeResource`` (or its base) is\n // visibly wrong rather than silently picking up the caller's\n // workspace context. Pinned by the exact-URL test in\n // ``tests/resources/me.test.ts``.\n mutable.me = new MeResource(client, '_account')\n mutable.apiKeys = new ApiKeysResource(client, workspaceId)\n mutable.agents = new AgentsResource(client, workspaceId)\n mutable.skills = new SkillsResource(client, workspaceId)\n mutable.actions = new ActionsResource(client, workspaceId)\n mutable.operators = new OperatorsResource(client, workspaceId)\n mutable.promptLogs = new PromptLogsResource(client, workspaceId)\n mutable.triggers = new TriggersResource(client, workspaceId)\n mutable.services = new ServicesResource(client, workspaceId)\n mutable.contextGraphs = new ContextGraphsResource(client, workspaceId)\n mutable.dataSources = new DataSourcesResource(client, workspaceId)\n mutable.world = new WorldResource(client, workspaceId)\n mutable.calls = new CallsResource(client, workspaceId)\n mutable.conversations = new ConversationsResource(client, workspaceId, agentBaseUrl)\n mutable.channels = new ChannelsResource(client, workspaceId)\n mutable.phoneNumbers = new PhoneNumbersResource(client, workspaceId)\n mutable.integrations = new IntegrationsResource(client, workspaceId)\n mutable.analytics = new AnalyticsResource(client, workspaceId)\n mutable.simulations = new SimulationsResource(client, workspaceId)\n mutable.metrics = new MetricsResource(client, workspaceId)\n mutable.settings = new SettingsResource(client, workspaceId)\n mutable.billing = new BillingResource(client, workspaceId)\n mutable.memory = new MemoryResource(client, workspaceId)\n mutable.personas = new PersonasResource(client, workspaceId)\n mutable.reviewQueue = new ReviewQueueResource(client, workspaceId)\n mutable.recordings = new RecordingsResource(client, workspaceId)\n mutable.audit = new AuditResource(client, workspaceId)\n mutable.webhookDestinations = new WebhookDestinationsResource(client, workspaceId)\n mutable.safety = new SafetyResource(client, workspaceId)\n mutable.compliance = new ComplianceResource(client, workspaceId)\n mutable.events = new EventsResource(client, workspaceId)\n mutable.functions = new FunctionsResource(client, workspaceId)\n mutable.observers = new ObserversResource(client, workspaceId, agentBaseUrl)\n mutable.fhir = new FhirResource(client, workspaceId)\n mutable.insights = new InsightsResource(client, workspaceId)\n mutable.monitorConcepts = new MonitorConceptsResource(client, workspaceId)\n mutable.unificationRules = new UnificationRulesResource(client, workspaceId)\n mutable.crm = new CrmResource(client, workspaceId)\n mutable.commandCenter = new CommandCenterResource(client, workspaceId)\n mutable.sensorium = new SensoriumResource(client, workspaceId)\n mutable.dataQuery = new DataQueryResource(client, workspaceId)\n mutable.briefs = new BriefsResource(client, workspaceId)\n mutable.desktopSessions = new DesktopSessionsResource(client, workspaceId)\n mutable.intake = new IntakeResource(client, workspaceId)\n mutable.network = new NetworkResource(client, workspaceId)\n mutable.pipeline = new PipelineResource(client, workspaceId)\n mutable.tasks = new TasksResource(client, workspaceId)\n mutable.tools = new ToolsResource(client, workspaceId)\n mutable.surfaces = new SurfacesResource(client, workspaceId)\n mutable.sessions = new SessionsResource(client, workspaceId)\n mutable.workspaceDatabase = new WorkspaceDatabaseResource(client, workspaceId)\n }\n\n private async resolveApiRequest<\n Path extends keyof paths & string,\n Method extends 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS',\n >(\n path: Path,\n method: Method,\n init: AmigoRequestOptions<OperationFor<Path, Lowercase<Method>>> | undefined,\n ): Promise<{ data?: unknown; error?: unknown; response: Response }> {\n const { baseClient, options } = resolveScopedPlatformClient(this.api)\n const mergedInit = mergeRequestOptions(options, withWorkspaceId(path, init, this.workspaceId))\n const requestInit = applyPlatformRequestOptions(\n baseClient,\n mergedInit as AmigoRequestOptions<OperationFor<Path, Lowercase<Method>>> | undefined,\n )\n\n switch (method) {\n case 'GET':\n return await baseClient.GET(path as never, requestInit as never)\n case 'POST':\n return await baseClient.POST(path as never, requestInit as never)\n case 'PUT':\n return await baseClient.PUT(path as never, requestInit as never)\n case 'PATCH':\n return await baseClient.PATCH(path as never, requestInit as never)\n case 'DELETE':\n return await baseClient.DELETE(path as never, requestInit as never)\n case 'HEAD':\n return await baseClient.HEAD(path as never, requestInit as never)\n case 'OPTIONS':\n return await baseClient.OPTIONS(path as never, requestInit as never)\n }\n }\n}\n\n// --- Public exports ---\n\nexport type { AmigoClientConfig as AmigoConfig }\n\nexport {\n AmigoError,\n BadRequestError,\n AuthenticationError,\n PermissionError,\n NotFoundError,\n ConflictError,\n ValidationError,\n RateLimitError,\n ServerError,\n ServiceUnavailableError,\n NetworkError,\n RequestTimeoutError,\n ParseError,\n ConfigurationError,\n isAmigoError,\n isNotFoundError,\n isRateLimitError,\n isAuthenticationError,\n isRequestTimeoutError,\n isPermissionError,\n isConflictError,\n isValidationError,\n isServerError,\n isNetworkError,\n isHttpException,\n isHttpValidationError,\n isUnparseableErrorBody,\n} from './core/errors.js'\n\nexport type {\n ErrorContext,\n PlatformErrorBody,\n HttpExceptionBody,\n HttpValidationErrorBody,\n UnparseableErrorBody,\n AmigoErrorWithBody,\n} from './core/errors.js'\n\nexport type {\n WorkspaceId,\n ApiKeyId,\n AgentId,\n PersonaId,\n SkillId,\n ActionId,\n ServiceId,\n ContextGraphId,\n CallId,\n PhoneNumberId,\n IntegrationId,\n EntityId,\n EventId,\n SimulationRunId,\n SimulationSessionId,\n FunctionId,\n DataSourceId,\n} from './core/branded-types.js'\n\nexport {\n workspaceId,\n apiKeyId,\n agentId,\n personaId,\n skillId,\n actionId,\n serviceId,\n contextGraphId,\n callId,\n phoneNumberId,\n integrationId,\n entityId,\n eventId,\n simulationRunId,\n simulationSessionId,\n functionId,\n dataSourceId,\n} from './core/branded-types.js'\n\nexport { paginate } from './core/utils.js'\nexport { buildLastResponse, extractRequestId } from './core/utils.js'\nexport type {\n PaginatedList,\n ListParams,\n LastResponseInfo,\n ResponseMetadata,\n WithResponseMetadata,\n AmigoResponse,\n} from './core/utils.js'\nexport type { AmigoRequestOptions, ScopedRequestOptions } from './core/request-options.js'\nexport type { RetryOptions } from './core/retry.js'\n\nexport { parseRateLimitHeaders } from './core/rate-limit.js'\nexport type { RateLimitInfo } from './core/rate-limit.js'\n\nexport {\n verifyWebhookSignature,\n parseWebhookEvent,\n WebhookVerificationError,\n} from './core/webhooks.js'\nexport type {\n WebhookEvent,\n WebhookVerificationOptions,\n ParseWebhookEventOptions,\n} from './core/webhooks.js'\nexport type {\n ClientHooks,\n RequestHookContext,\n ResponseHookContext,\n ErrorHookContext,\n} from './core/openapi-client.js'\n\nexport type {\n MetricCatalogEntry,\n MetricCatalogResponse,\n MetricListResponse,\n MetricValue,\n NumericalMetricValue,\n CategoricalMetricValue,\n BooleanMetricValue,\n MetricValuesParams,\n MetricTrendParams,\n} from './resources/metrics.js'\n/** @deprecated Use `MetricValue` instead. */\nexport type MetricValueResponse = MetricValueAlias\n\nexport type CallSummary = components['schemas']['CallSummary']\nexport type CallDetail = components['schemas']['CallDetailResponse']\nexport type CallTurn = components['schemas']['Turn']\nexport type CallToolCall = components['schemas']['ToolCall']\nexport type PlaybackTimeline = components['schemas']['PlaybackTimeline']\nexport type TimelineActor = components['schemas']['TimelineActor']\nexport type TimelineLaneDefinition = components['schemas']['TimelineLaneDefinition']\nexport type TimelineSegment = components['schemas']['TimelineSegment']\nexport type TimelineTimebase = components['schemas']['TimelineTimebase']\nexport type TurnTimeline = components['schemas']['TurnTimeline']\nexport type TimelineSegmentType = TimelineSegment['type']\nexport type TimelineLane = TimelineSegment['lane']\nexport type TimelineTrack = NonNullable<TimelineSegment['track']>\nexport type TimelineActorKind = TimelineActor['kind']\nexport type TimelineActorRole = TimelineActor['role']\n\nexport type {\n SubscribeToWorkspaceOptions,\n SubscriptionHandle,\n WorkspaceSSEEvent,\n WorkspaceSSEEventType,\n WorkspaceEventStreamErrorCode,\n} from './resources/events.js'\nexport { WorkspaceEventStreamError, isWorkspaceEventStreamError } from './resources/events.js'\n\nexport { sessionConnectAuthProtocols, textStreamAuthProtocols } from './resources/conversations.js'\nexport type {\n ConversationDetail,\n ConversationListResponse,\n ConversationSummary,\n ConversationTurn,\n CreateConversationRequest,\n ListConversationsParams,\n SessionConnectUrlParams,\n TextStreamAuthProtocols,\n TextStreamUrlParams,\n TurnDoneEvent,\n TurnErrorEvent,\n TurnMessageEvent,\n TurnRequest,\n TurnResponse,\n TurnStreamEvent,\n TurnThinkingEvent,\n TurnTokenEvent,\n TurnToolCallCompletedEvent,\n TurnToolCallStartedEvent,\n} from './resources/conversations.js'\n\n// Channels \u2014 workspace-scoped channel-manager proxy (SES setup, future Twilio, etc.)\nexport { ChannelsResource, SesSetupResource } from './resources/channels/index.js'\nexport type {\n CreateSesSetupRequest,\n DnsRecord,\n SesSetupDetail,\n SesSetupListItem,\n SesSetupListResponse,\n} from './resources/channels/index.js'\n\n// Voice-call observer real-time stream\nexport { ObserversResource, observerAuthProtocols } from './resources/observers.js'\nexport type {\n ObserverAuthProtocols,\n ObserverSSEEvent,\n ObserverSSEEventType,\n ObserverSubscribeOptions,\n} from './resources/observers.js'\n\n// Reconnecting WebSocket primitive (compose for custom realtime surfaces)\nexport {\n createReconnectingWebSocket,\n ReconnectingWebSocketError,\n} from './core/reconnecting-websocket.js'\nexport type {\n ReconnectingWebSocketErrorReason,\n ReconnectingWebSocketHandle,\n ReconnectingWebSocketOptions,\n ReconnectingWebSocketState,\n WebSocketFactory,\n} from './core/reconnecting-websocket.js'\n\n// Device code auth (desktop / CLI login)\nexport {\n loginWithDeviceCode,\n TokenManager,\n FileTokenStorage,\n MemoryTokenStorage,\n DeviceCodeExpiredError,\n DeviceCodeDeniedError,\n RefreshTokenExpiredError,\n LoginCancelledError,\n formatDeviceCodeInstructions,\n formatDeviceCodeLink,\n formatWorkspaceList,\n openBrowser,\n} from './core/device-code.js'\nexport type {\n DeviceCodeIssuance,\n IdentityTokenResponse,\n WorkspaceChoice,\n MultiWorkspaceResponse,\n DeviceCodeLoginOptions,\n DeviceCodeStatus,\n AuthResult,\n StoredCredentials,\n TokenStorage,\n TokenManagerConfig,\n} from './core/device-code.js'\n\n// Generated OpenAPI types \u2014 consumers can import specific schemas\nexport type { paths, components, operations } from './generated/api.js'\n\nfunction withWorkspaceId<Path extends keyof paths & string, Init>(\n path: Path,\n init: Init | undefined,\n workspaceId: string,\n): Init | { params: { path: { workspace_id: string } } } {\n if (!path.includes('{workspace_id}')) {\n return (init ?? {}) as Init\n }\n\n const current = (init ?? {}) as {\n params?: {\n path?: Record<string, unknown>\n }\n }\n\n return {\n ...current,\n params: {\n ...(current.params ?? {}),\n path: {\n ...(current.params?.path ?? {}),\n workspace_id: workspaceId,\n },\n },\n }\n}\n", "/**\n * Error hierarchy for the Amigo Platform SDK.\n * All errors extend AmigoError which can be caught with a single catch.\n */\n\nimport type { components } from '../generated/api.js'\n\nexport interface ErrorContext {\n statusCode?: number\n errorCode?: string\n requestId?: string\n detail?: string\n context?: Record<string, unknown>\n /** Parsed error body (typed when recognized) */\n errorBody?: PlatformErrorBody\n /** Raw body string for diagnostic logging \u2014 populated even on parse failure */\n rawBody?: string\n}\n\n// --- Typed error body shapes ---\n\n/**\n * FastAPI 422 validation-error body.\n * Surfaces from openapi-typescript so consumers can read field-level errors.\n */\nexport type HttpValidationErrorBody = components['schemas']['HTTPValidationError']\n\n/**\n * Default FastAPI HTTPException shape (`raise HTTPException(status_code, detail=...)`).\n *\n * Most platform-api routes that don't define an explicit error model return\n * this shape. `detail` may be a free-form string or a JSON-serializable object.\n */\nexport interface HttpExceptionBody {\n detail: string | Record<string, unknown> | unknown[]\n /** Populated by request-id middleware on bounded routes */\n request_id?: string\n /** Populated by typed error responses (e.g. Surface lifecycle errors) */\n error_code?: string\n}\n\n/**\n * Fallback shape used when the response body fails to parse or is empty.\n * `rawBody` is the verbatim text (truncated to 8 KB to avoid log bloat).\n */\nexport interface UnparseableErrorBody {\n detail: string\n raw_body: string\n}\n\n/**\n * Discriminated union of all error body shapes the platform API emits.\n *\n * Consumers should use the type guards (`isHttpException`,\n * `isHttpValidationError`, `isUnparseableErrorBody`) rather than checking\n * fields directly \u2014 both `HttpExceptionBody` and `HttpValidationErrorBody`\n * have a `detail` field but it is shaped differently.\n */\nexport type PlatformErrorBody = HttpExceptionBody | HttpValidationErrorBody | UnparseableErrorBody\n\nconst RAW_BODY_LIMIT = 8 * 1024 // 8 KB\n\nconst SENSITIVE_FIELDS = new Set([\n 'id_token',\n 'access_token',\n 'refresh_token',\n 'authorization',\n 'api_key',\n 'apikey',\n 'token',\n 'secret',\n 'password',\n 'x-api-key',\n 'cookie',\n 'set-cookie',\n])\n\nfunction sanitizeErrorContext(obj: unknown): unknown {\n if (typeof obj !== 'object' || !obj) return obj\n if (Array.isArray(obj)) return obj.map(sanitizeErrorContext)\n\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (SENSITIVE_FIELDS.has(key.toLowerCase())) {\n result[key] = '[REDACTED]'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = sanitizeErrorContext(value)\n } else {\n result[key] = value\n }\n }\n return result\n}\n\n/** Base class for all Amigo Platform SDK errors */\nexport class AmigoError<TBody extends PlatformErrorBody = PlatformErrorBody> extends Error {\n readonly statusCode?: number\n readonly errorCode?: string\n readonly requestId?: string\n readonly detail?: string\n readonly context?: Record<string, unknown>\n /**\n * Typed body of the error response, when one was returned and successfully\n * parsed. Use the `isHttpException` / `isHttpValidationError` /\n * `isUnparseableErrorBody` type guards to narrow the discriminated union.\n *\n * Named `errorBody` (not `body`) to avoid colliding with the legacy\n * `ParseError.body: string` field.\n */\n readonly errorBody?: TBody\n /**\n * Raw response body (truncated to 8 KB). Populated even when parsing fails,\n * so callers always have something to log when debugging server errors.\n */\n readonly rawBody?: string\n\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message)\n this.name = this.constructor.name\n this.statusCode = ctx.statusCode\n this.errorCode = ctx.errorCode\n this.requestId = ctx.requestId\n this.detail = ctx.detail\n this.context = ctx.context\n ? (sanitizeErrorContext(ctx.context) as Record<string, unknown>)\n : undefined\n this.errorBody = ctx.errorBody as TBody | undefined\n this.rawBody = ctx.rawBody\n Object.setPrototypeOf(this, new.target.prototype)\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n statusCode: this.statusCode,\n errorCode: this.errorCode,\n requestId: this.requestId,\n detail: this.detail,\n context: this.context,\n stack: this.stack,\n }\n }\n}\n\n/** 400 Bad Request */\nexport class BadRequestError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 400 })\n }\n}\n\n/** 401 Unauthorized \u2014 invalid or missing API key */\nexport class AuthenticationError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 401 })\n }\n}\n\n/** 403 Forbidden \u2014 insufficient permissions */\nexport class PermissionError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 403 })\n }\n}\n\n/** 404 Not Found */\nexport class NotFoundError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 404 })\n }\n}\n\n/** 409 Conflict \u2014 duplicate slug or resource version conflict */\nexport class ConflictError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 409 })\n }\n}\n\n/** 422 Unprocessable Entity \u2014 validation failure */\nexport class ValidationError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 422 })\n }\n}\n\n/** 429 Too Many Requests */\nexport class RateLimitError extends AmigoError {\n readonly retryAfter?: number\n\n constructor(message: string, ctx: ErrorContext & { retryAfter?: number } = {}) {\n super(message, { ...ctx, statusCode: 429 })\n this.retryAfter = ctx.retryAfter\n }\n}\n\n/** 5xx Server Error */\nexport class ServerError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: ctx.statusCode ?? 500 })\n }\n}\n\n/** 503 Service Unavailable */\nexport class ServiceUnavailableError extends ServerError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 503 })\n }\n}\n\n/** Network or fetch failure (no HTTP status available) */\nexport class NetworkError extends AmigoError {\n constructor(message: string, cause?: unknown) {\n super(message)\n if (cause !== undefined) {\n Object.defineProperty(this, 'cause', { value: cause, writable: false, enumerable: true })\n }\n }\n}\n\n/** Request timed out before receiving a response */\nexport class RequestTimeoutError extends NetworkError {\n readonly timeoutMs?: number\n\n constructor(message: string, timeoutMs?: number, cause?: unknown) {\n super(message, cause)\n this.timeoutMs = timeoutMs\n }\n}\n\n/** Failed to parse response body */\nexport class ParseError extends AmigoError {\n readonly body?: string\n\n constructor(message: string, body?: string) {\n super(message)\n this.body = body\n }\n}\n\n/** SDK misconfiguration */\nexport class ConfigurationError extends AmigoError {\n constructor(message: string) {\n super(message)\n }\n}\n\n// --- Factory ---\n\n/**\n * Internal: legacy flat-shape probe of the parsed JSON body. Used to surface\n * `error_code` / `request_id` / `message` fields that older platform-api\n * routes return alongside the canonical `detail` field.\n */\ninterface LegacyFlatBody {\n message?: unknown\n detail?: unknown\n error_code?: unknown\n request_id?: unknown\n}\n\n/**\n * Best-effort body reader. Always returns *something* \u2014 never throws.\n *\n * - On successful JSON parse: returns the typed body (HttpException or\n * HTTPValidationError shape) plus the raw text for logging.\n * - On parse failure or empty body: returns an UnparseableErrorBody with\n * `detail` set to `response.statusText` and the raw text preserved.\n * - On network read failure (connection drop mid-read): returns an\n * UnparseableErrorBody with empty `raw_body`.\n */\nasync function readErrorBody(response: Response): Promise<{\n body: PlatformErrorBody\n rawBody: string\n}> {\n let rawBody = ''\n try {\n rawBody = await response.text()\n } catch {\n // Connection dropped mid-read or body already consumed \u2014 fall through.\n return {\n body: { detail: response.statusText || `HTTP ${response.status}`, raw_body: '' },\n rawBody: '',\n }\n }\n\n const truncatedRaw = rawBody.length > RAW_BODY_LIMIT ? rawBody.slice(0, RAW_BODY_LIMIT) : rawBody\n\n if (rawBody.length === 0) {\n return {\n body: { detail: response.statusText || `HTTP ${response.status}`, raw_body: '' },\n rawBody: '',\n }\n }\n\n try {\n const parsed = JSON.parse(rawBody) as unknown\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n // Recognized shapes: HTTPValidationError (detail is array) or HttpException.\n return { body: parsed as PlatformErrorBody, rawBody: truncatedRaw }\n }\n // JSON parsed but isn't an object (e.g. null, string literal) \u2014 surface as\n // unparseable so consumers don't have to guard against weird shapes.\n return {\n body: {\n detail: response.statusText || `HTTP ${response.status}`,\n raw_body: truncatedRaw,\n },\n rawBody: truncatedRaw,\n }\n } catch {\n return {\n body: {\n detail: response.statusText || `HTTP ${response.status}`,\n raw_body: truncatedRaw,\n },\n rawBody: truncatedRaw,\n }\n }\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nexport async function createApiError(response: Response): Promise<AmigoError> {\n const { body, rawBody } = await readErrorBody(response)\n const flat = body as LegacyFlatBody\n\n const detailString =\n typeof flat.detail === 'string'\n ? flat.detail\n : flat.detail !== undefined\n ? safeStringify(flat.detail)\n : undefined\n\n const errorCode = typeof flat.error_code === 'string' ? flat.error_code : undefined\n const requestIdFromBody = typeof flat.request_id === 'string' ? flat.request_id : undefined\n const messageFromBody = typeof flat.message === 'string' ? flat.message : undefined\n\n const ctx: ErrorContext = {\n statusCode: response.status,\n errorCode,\n requestId: requestIdFromBody ?? response.headers.get('x-request-id') ?? undefined,\n detail: detailString,\n context: { url: response.url, response: body },\n errorBody: body,\n rawBody,\n }\n const message =\n messageFromBody ?? detailString ?? response.statusText ?? `HTTP ${response.status}`\n\n switch (response.status) {\n case 400:\n return new BadRequestError(message, ctx)\n case 401:\n return new AuthenticationError(message, ctx)\n case 403:\n return new PermissionError(message, ctx)\n case 404:\n return new NotFoundError(message, ctx)\n case 409:\n return new ConflictError(message, ctx)\n case 422:\n return new ValidationError(message, ctx)\n case 429: {\n const retryAfter = parseRetryAfter(response)\n return new RateLimitError(message, { ...ctx, retryAfter })\n }\n case 503:\n return new ServiceUnavailableError(message, ctx)\n default:\n return new ServerError(message, ctx)\n }\n}\n\nfunction parseRetryAfter(response: Response): number | undefined {\n const header = response.headers.get('Retry-After')\n if (!header) return undefined\n const seconds = Number(header)\n if (!isNaN(seconds)) return seconds\n const date = new Date(header)\n if (!isNaN(date.getTime())) {\n return Math.max(0, Math.ceil((date.getTime() - Date.now()) / 1000))\n }\n return undefined\n}\n\n// --- Type guards ---\n\nexport function isAmigoError(err: unknown): err is AmigoError {\n return err instanceof AmigoError\n}\n\nexport function isNotFoundError(err: unknown): err is NotFoundError {\n return err instanceof NotFoundError\n}\n\nexport function isRateLimitError(err: unknown): err is RateLimitError {\n return err instanceof RateLimitError\n}\n\nexport function isAuthenticationError(err: unknown): err is AuthenticationError {\n return err instanceof AuthenticationError\n}\n\nexport function isRequestTimeoutError(err: unknown): err is RequestTimeoutError {\n return err instanceof RequestTimeoutError\n}\n\nexport function isPermissionError(err: unknown): err is PermissionError {\n return err instanceof PermissionError\n}\n\nexport function isConflictError(err: unknown): err is ConflictError {\n return err instanceof ConflictError\n}\n\nexport function isValidationError(err: unknown): err is ValidationError {\n return err instanceof ValidationError\n}\n\nexport function isServerError(err: unknown): err is ServerError {\n return err instanceof ServerError\n}\n\nexport function isNetworkError(err: unknown): err is NetworkError {\n return err instanceof NetworkError\n}\n\n// --- Body type guards ---\n\n/**\n * Narrowed AmigoError where `errorBody` is guaranteed non-undefined.\n * Used as the return-type for body type guards so consumers don't need to\n * re-assert `errorBody !== undefined` after the guard.\n */\nexport type AmigoErrorWithBody<TBody extends PlatformErrorBody> = AmigoError<TBody> & {\n readonly errorBody: TBody\n}\n\n/**\n * True when `err.errorBody` is the FastAPI 422 validation-error shape (an\n * object with `detail: ValidationError[]`). Lets consumers iterate\n * field-level errors without `as any`:\n *\n * ```ts\n * if (isHttpValidationError(err)) {\n * for (const issue of err.errorBody.detail ?? []) {\n * console.log(issue.loc, issue.msg)\n * }\n * }\n * ```\n */\nexport function isHttpValidationError(\n err: unknown,\n): err is AmigoErrorWithBody<HttpValidationErrorBody> {\n if (!(err instanceof AmigoError)) return false\n const body = err.errorBody as { detail?: unknown } | undefined\n return Array.isArray(body?.detail)\n}\n\n/**\n * True when `err.errorBody` is the default FastAPI HTTPException shape\n * (`{ detail: string | object | array }`, possibly with `error_code` /\n * `request_id`). This is the most common error body across platform-api.\n */\nexport function isHttpException(err: unknown): err is AmigoErrorWithBody<HttpExceptionBody> {\n if (!(err instanceof AmigoError)) return false\n const body = err.errorBody\n if (!body) return false\n if (Array.isArray((body as { detail?: unknown }).detail)) {\n // HTTPValidationError, not a plain HTTPException\n return false\n }\n // Has detail (string/object) and no `raw_body` discriminator from the unparseable fallback\n return 'detail' in body && !('raw_body' in body)\n}\n\n/**\n * True when the response body could not be parsed as JSON (or was empty).\n * `err.errorBody.raw_body` is the verbatim text (truncated to 8 KB).\n */\nexport function isUnparseableErrorBody(\n err: unknown,\n): err is AmigoErrorWithBody<UnparseableErrorBody> {\n if (!(err instanceof AmigoError)) return false\n const body = err.errorBody as { raw_body?: unknown } | undefined\n return typeof body?.raw_body === 'string'\n}\n", "/**\n * Creates a configured openapi-fetch client with auth, error handling,\n * and retry middleware.\n *\n * Supports custom `fetch` for BFF proxy patterns (e.g., developer-console\n * routing through Next.js API routes).\n */\n\nimport createClientImport, { type HeadersOptions, type Middleware } from 'openapi-fetch'\nimport type { paths } from '../generated/api.js'\nimport { createAuthMiddleware } from './auth.js'\nimport { createApiError, ConfigurationError, NetworkError, RequestTimeoutError } from './errors.js'\nimport { parseRateLimitHeaders } from './rate-limit.js'\nimport {\n stripRequestControls,\n type AmigoRequestOptions,\n type RequestControlOptions,\n} from './request-options.js'\nimport { shouldRetry, computeDelay, resolveRetryOptions, type RetryOptions } from './retry.js'\nimport { extractRequestId } from './utils.js'\n\n// Handle ESM/CJS interop for openapi-fetch (esbuild __toESM wrapper)\nconst createClient: typeof createClientImport =\n typeof createClientImport === 'function'\n ? createClientImport\n : (createClientImport as unknown as { default: typeof createClientImport }).default\n\nexport type PlatformFetch = ReturnType<typeof createClient<paths>>\n\nexport interface RequestHookContext {\n id: string\n request: Request\n schemaPath: string\n}\n\nexport interface ResponseHookContext extends RequestHookContext {\n response: Response\n requestId: string | null\n rateLimit: ReturnType<typeof parseRateLimitHeaders>\n}\n\nexport interface ErrorHookContext extends RequestHookContext {\n error: unknown\n}\n\nexport interface ClientHooks {\n onRequest?: (context: RequestHookContext) => void | Promise<void>\n onResponse?: (context: ResponseHookContext) => void | Promise<void>\n onError?: (context: ErrorHookContext) => void | Promise<void>\n}\n\nexport interface ClientConfig {\n apiKey: string\n baseUrl: string\n retry?: RetryOptions\n maxRetries?: number\n timeout?: number\n headers?: HeadersOptions\n hooks?: ClientHooks\n /** Custom fetch implementation \u2014 use for BFF proxy routing or test mocking. */\n fetch?: typeof globalThis.fetch\n}\n\ntype RequestTransport = (input: Request) => Promise<Response>\n\ninterface PlatformClientContext {\n transport: RequestTransport\n defaults: RequestControlOptions\n baseUrl: string\n}\n\nconst platformClientContext = new WeakMap<PlatformFetch, PlatformClientContext>()\n\nexport function createPlatformClient(config: ClientConfig): PlatformFetch {\n const transport = toRequestTransport(config.fetch ?? globalThis.fetch)\n const defaults = {\n retry: config.retry,\n maxRetries: config.maxRetries,\n timeout: config.timeout,\n } satisfies RequestControlOptions\n\n const client = createClient<paths>({\n baseUrl: config.baseUrl,\n fetch: createRetryingFetch(transport, defaults),\n headers: config.headers,\n })\n\n platformClientContext.set(client, { transport, defaults, baseUrl: config.baseUrl })\n\n // Error middleware \u2014 convert HTTP errors to typed AmigoError subclasses\n const errorMiddleware: Middleware = {\n async onResponse({ response }) {\n if (!response.ok) {\n throw await createApiError(response)\n }\n return response\n },\n }\n\n // Auth middleware \u2014 attach Bearer token\n const authMiddleware = createAuthMiddleware({ apiKey: config.apiKey })\n const hookMiddleware: Middleware | undefined = config.hooks\n ? {\n async onRequest({ request, schemaPath, id }) {\n await config.hooks?.onRequest?.({ request, schemaPath, id })\n return request\n },\n async onResponse({ request, response, schemaPath, id }) {\n await config.hooks?.onResponse?.({\n id,\n request,\n response,\n schemaPath,\n requestId: extractRequestId(response),\n rateLimit: parseRateLimitHeaders(response.headers),\n })\n return response\n },\n async onError({ request, error, schemaPath, id }) {\n await config.hooks?.onError?.({ id, request, error, schemaPath })\n },\n }\n : undefined\n\n // Order: auth first (adds header), then error (converts failures)\n client.use(authMiddleware)\n client.use(errorMiddleware)\n if (hookMiddleware) {\n client.use(hookMiddleware)\n }\n\n return client\n}\n\nexport function applyPlatformRequestOptions<Operation>(\n client: PlatformFetch,\n init: AmigoRequestOptions<Operation> | undefined,\n): AmigoRequestOptions<Operation> | undefined {\n if (!init) {\n return undefined\n }\n\n const context = platformClientContext.get(client)\n const stripped = stripRequestControls(init)\n\n if (!context) {\n return stripped as AmigoRequestOptions<Operation> | undefined\n }\n\n const overrideFetch = stripped?.fetch\n const hasControlOverride =\n overrideFetch !== undefined ||\n init.timeout !== undefined ||\n init.maxRetries !== undefined ||\n init.retry !== undefined\n\n if (!hasControlOverride) {\n return stripped as AmigoRequestOptions<Operation> | undefined\n }\n\n const transport = toRequestTransport(\n (overrideFetch ?? context.transport) as typeof globalThis.fetch,\n )\n const fetch = createRetryingFetch(transport, {\n timeout: init.timeout ?? context.defaults.timeout,\n maxRetries: init.maxRetries ?? context.defaults.maxRetries,\n retry: init.retry ?? context.defaults.retry,\n })\n\n return {\n ...stripped,\n fetch,\n } as AmigoRequestOptions<Operation>\n}\n\n/** @internal */\nexport function getPlatformClientBaseUrl(client: PlatformFetch): string {\n const context = platformClientContext.get(client)\n if (!context) {\n throw new ConfigurationError('Platform client baseUrl is unavailable')\n }\n return context.baseUrl\n}\n\nfunction createRetryingFetch(\n transport: RequestTransport,\n defaults: RequestControlOptions,\n): typeof globalThis.fetch {\n return async (input, init) => {\n const baseRequest = input instanceof Request ? input : new Request(input, init)\n const method = baseRequest.method.toUpperCase()\n const retryOpts = resolveRetryOptions(defaults.retry, defaults.maxRetries)\n const timeoutMs = defaults.timeout\n const isIdempotent = method === 'GET' || method === 'HEAD' || method === 'OPTIONS'\n\n for (let attempt = 0; attempt < retryOpts.maxAttempts; attempt++) {\n let response: Response | undefined\n let error: unknown\n let timedOut = false\n\n try {\n const prepared = prepareRequestForAttempt(baseRequest, timeoutMs)\n\n try {\n response = await transport(prepared.request)\n } finally {\n timedOut = prepared.timedOut\n prepared.cleanup()\n }\n } catch (err) {\n error = err\n }\n\n if (!error && response && response.ok) return response\n\n const ctx = { method, attempt, response: response!, options: retryOpts }\n const attemptsRemain = attempt + 1 < retryOpts.maxAttempts\n\n if (error) {\n if (timedOut) {\n throw new RequestTimeoutError(`Request timed out after ${timeoutMs}ms`, timeoutMs, error)\n }\n if (isIdempotent && attemptsRemain) {\n await sleep(computeDelay(attempt, new Response(), retryOpts))\n continue\n }\n throw new NetworkError(\n `Network error: ${error instanceof Error ? error.message : String(error)}`,\n error,\n )\n }\n\n if (response && attemptsRemain && shouldRetry(ctx)) {\n const delay = computeDelay(attempt, response, retryOpts)\n if (baseRequest.signal.aborted) return response\n await sleep(delay)\n continue\n }\n\n return response!\n }\n\n throw new NetworkError('Retry loop exhausted')\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction toRequestTransport(fetcher: typeof globalThis.fetch | RequestTransport): RequestTransport {\n return async (input) => fetcher(input)\n}\n\nfunction prepareRequestForAttempt(\n request: Request,\n timeoutMs?: number,\n): {\n request: Request\n readonly timedOut: boolean\n cleanup: () => void\n} {\n const attemptRequest = request.clone()\n const timeout = createTimeoutSignal(attemptRequest.signal, timeoutMs)\n\n if (!timeout.signal) {\n return {\n request: attemptRequest,\n timedOut: false,\n cleanup: timeout.cleanup,\n }\n }\n\n return {\n request: new Request(attemptRequest, { signal: timeout.signal }),\n get timedOut() {\n return timeout.didTimeout\n },\n cleanup: timeout.cleanup,\n }\n}\n\nfunction createTimeoutSignal(\n upstream: AbortSignal | null,\n timeoutMs?: number,\n): {\n signal?: AbortSignal\n didTimeout: boolean\n cleanup: () => void\n} {\n if (!timeoutMs || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n return {\n signal: upstream ?? undefined,\n didTimeout: false,\n cleanup: () => {},\n }\n }\n\n const controller = new AbortController()\n let didTimeout = false\n const cleanups: Array<() => void> = []\n\n const onAbort = () => controller.abort(upstream?.reason)\n if (upstream) {\n if (upstream.aborted) {\n controller.abort(upstream.reason)\n } else {\n upstream.addEventListener('abort', onAbort, { once: true })\n cleanups.push(() => upstream.removeEventListener('abort', onAbort))\n }\n }\n\n const timer = setTimeout(() => {\n didTimeout = true\n controller.abort()\n }, timeoutMs)\n cleanups.push(() => clearTimeout(timer))\n\n return {\n signal: controller.signal,\n get didTimeout() {\n return didTimeout\n },\n cleanup: () => {\n for (const cleanup of cleanups) {\n cleanup()\n }\n },\n }\n}\n", "/**\n * Auth middleware for the Amigo Platform SDK.\n *\n * The platform-api accepts Bearer tokens in two forms:\n * 1. RS256 JWT issued by the Identity service\n * 2. Legacy API keys (created via POST /v1/{workspace_id}/api-keys)\n *\n * This SDK accepts an API key string and attaches it directly as\n * `Authorization: Bearer {apiKey}`. No token exchange is required.\n */\n\nimport type { Middleware } from 'openapi-fetch'\nimport { AuthenticationError } from './errors.js'\n\nexport interface AuthConfig {\n apiKey: string\n}\n\n/**\n * Creates openapi-fetch middleware that attaches the Bearer token\n * to every outgoing request and converts 401 responses to AuthenticationError.\n */\nexport function createAuthMiddleware(config: AuthConfig): Middleware {\n return {\n async onRequest({ request }) {\n request.headers.set('Authorization', `Bearer ${config.apiKey}`)\n return request\n },\n\n async onResponse({ response }) {\n if (response.status === 401) {\n throw new AuthenticationError('Invalid or expired API key. Check your credentials.', {\n statusCode: 401,\n })\n }\n return response\n },\n }\n}\n", "export interface RateLimitInfo {\n limit: number | null\n remaining: number | null\n reset: Date | null\n retryAfter: number | null\n}\n\nexport function parseRateLimitHeaders(headers: Headers): RateLimitInfo {\n const limit = headers.get('x-ratelimit-limit')\n const remaining = headers.get('x-ratelimit-remaining')\n const reset = headers.get('x-ratelimit-reset')\n const retryAfter = headers.get('retry-after')\n\n return {\n limit: limit ? parseInt(limit, 10) : null,\n remaining: remaining ? parseInt(remaining, 10) : null,\n reset: reset ? new Date(parseInt(reset, 10) * 1000) : null,\n retryAfter: retryAfter ? parseInt(retryAfter, 10) : null,\n }\n}\n", "import type { FetchOptions, HeadersOptions } from 'openapi-fetch'\nimport type { paths } from '../generated/api.js'\nimport type { RetryOptions } from './retry.js'\n\nexport type OperationFor<\n Path extends keyof paths & string,\n Method extends keyof paths[Path] & string,\n> = paths[Path][Method]\n\ntype OptionalizeWorkspacePath<PathParams> = PathParams extends { workspace_id: infer WorkspaceId }\n ? Omit<PathParams, 'workspace_id'> & { workspace_id?: WorkspaceId }\n : PathParams\n\ntype EmptyShape = Record<never, never>\n\ntype RewriteParams<Options> = Options extends { params: infer Params }\n ? RewriteParamShape<Params> extends infer RewrittenParams\n ? RewrittenParams extends object\n ? RequiredKeysOf<RewrittenParams> extends never\n ? Omit<Options, 'params'> & { params?: RewrittenParams }\n : Omit<Options, 'params'> & { params: RewrittenParams }\n : Omit<Options, 'params'> & { params: RewrittenParams }\n : Options\n : Options extends { params?: infer Params }\n ? Omit<Options, 'params'> & { params?: RewriteParamShape<Params> }\n : Options\n\ntype RewriteParamShape<Params> = Params extends object\n ? Omit<Params, 'path'> & RewritePathParam<Params>\n : Params\n\ntype RewritePathParam<Params> = Params extends { path: infer PathParams }\n ? OptionalizeWorkspacePath<PathParams> extends infer RewrittenPath\n ? RewrittenPath extends object\n ? RequiredKeysOf<RewrittenPath> extends never\n ? { path?: RewrittenPath }\n : { path: RewrittenPath }\n : { path: RewrittenPath }\n : EmptyShape\n : EmptyShape\n\ntype RequiredKeysOf<T extends object> = Exclude<\n {\n [K in keyof T]-?: EmptyShape extends Pick<T, K> ? never : K\n }[keyof T],\n undefined\n>\n\nexport type InitParam<Init extends object> =\n RequiredKeysOf<Init> extends never ? [init?: Init] : [init: Init]\n\nexport type AmigoRequestOptions<Operation = unknown> = Omit<\n RewriteParams<FetchOptions<Operation>>,\n 'timeout' | 'maxRetries' | 'retry'\n> & {\n timeout?: number\n maxRetries?: number\n retry?: RetryOptions\n}\n\nexport type ScopedRequestOptions = Omit<RequestInit, 'body' | 'headers' | 'method'> & {\n headers?: HeadersOptions\n timeout?: number\n maxRetries?: number\n retry?: RetryOptions\n}\n\nexport interface RequestControlOptions {\n timeout?: number\n maxRetries?: number\n retry?: RetryOptions\n}\n\ntype MergeableRequestOptions = object & {\n headers?: HeadersOptions\n signal?: AbortSignal | null\n timeout?: number\n maxRetries?: number\n retry?: RetryOptions\n}\n\nexport function stripRequestControls<Options extends RequestControlOptions>(\n options: Options | undefined,\n): Omit<Options, keyof RequestControlOptions> | undefined {\n if (!options) {\n return undefined\n }\n\n const rest = { ...options } as Partial<Options & RequestControlOptions>\n delete rest.timeout\n delete rest.maxRetries\n delete rest.retry\n return rest as Omit<Options, keyof RequestControlOptions>\n}\n\nexport function mergeRequestOptions<Options extends object>(\n base: ScopedRequestOptions | undefined,\n override: Options | undefined,\n): (Options & MergeableRequestOptions) | undefined {\n if (!base) {\n return override as (Options & MergeableRequestOptions) | undefined\n }\n\n if (!override) {\n return base as Options & MergeableRequestOptions\n }\n\n const mergeableOverride = override as Options & Partial<MergeableRequestOptions>\n\n return {\n ...base,\n ...override,\n headers: mergeHeaders(base.headers, mergeableOverride.headers),\n signal: mergeableOverride.signal ?? base.signal,\n timeout: mergeableOverride.timeout ?? base.timeout,\n maxRetries: mergeableOverride.maxRetries ?? base.maxRetries,\n retry: mergeableOverride.retry ?? base.retry,\n } as Options & MergeableRequestOptions\n}\n\nexport function mergeScopedRequestOptions(\n base: ScopedRequestOptions | undefined,\n override: ScopedRequestOptions,\n): ScopedRequestOptions {\n return mergeRequestOptions(base, override) ?? override\n}\n\nexport function mergeHeaders(\n base: HeadersOptions | undefined,\n override: HeadersOptions | undefined,\n): Headers | undefined {\n if (!base && !override) {\n return undefined\n }\n\n const headers = new Headers()\n let hasEntries = false\n\n applyHeaders(headers, base, () => {\n hasEntries = true\n })\n applyHeaders(headers, override, () => {\n hasEntries = true\n })\n\n return hasEntries ? headers : undefined\n}\n\nfunction applyHeaders(\n target: Headers,\n source: HeadersOptions | undefined,\n onSet: () => void,\n): void {\n if (!source) {\n return\n }\n\n if (source instanceof Headers) {\n source.forEach((value, key) => {\n target.set(key, value)\n onSet()\n })\n return\n }\n\n if (Array.isArray(source)) {\n for (const [key, value] of source) {\n if (!key) {\n continue\n }\n\n if (value === null || value === undefined) {\n target.delete(key)\n continue\n }\n\n target.set(key, String(value))\n onSet()\n }\n return\n }\n\n for (const [key, value] of Object.entries(source)) {\n if (value === null || value === undefined) {\n target.delete(key)\n continue\n }\n\n target.set(\n key,\n Array.isArray(value) ? value.map((item) => String(item)).join(', ') : String(value),\n )\n onSet()\n }\n}\n", "/**\n * Exponential backoff with full jitter and Retry-After header support.\n */\n\nexport interface RetryOptions {\n /** Maximum number of attempts (including the first). Default: 3 */\n maxAttempts?: number\n /** Base delay in milliseconds. Default: 250 */\n baseDelayMs?: number\n /** Maximum delay cap in milliseconds. Default: 30_000 */\n maxDelayMs?: number\n}\n\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504])\n// POST is only retried on 429 with a Retry-After header (idempotency concern)\nconst POST_RETRYABLE_STATUS_CODES = new Set([429])\nlet jitterCounter = 0\ntype CryptoLike = {\n getRandomValues<T extends Uint32Array>(array: T): T\n}\n\nexport interface RetryContext {\n method: string\n attempt: number\n response: Response\n options: Required<RetryOptions>\n}\n\nexport function shouldRetry(ctx: RetryContext): boolean {\n const { method, attempt, response, options } = ctx\n if (attempt >= options.maxAttempts) return false\n\n const status = response.status\n if (method === 'GET' || method === 'HEAD') {\n return RETRYABLE_STATUS_CODES.has(status)\n }\n if (method === 'POST' && POST_RETRYABLE_STATUS_CODES.has(status)) {\n return response.headers.has('Retry-After')\n }\n return false\n}\n\nexport function computeDelay(\n attempt: number,\n response: Response,\n options: Required<RetryOptions>,\n): number {\n const retryAfterHeader = response.headers.get('Retry-After')\n if (retryAfterHeader) {\n const seconds = parseRetryAfterHeader(retryAfterHeader)\n if (seconds !== undefined) return seconds * 1000\n }\n\n // Exponential backoff with full jitter: random value in [0, min(maxDelay, base * 2^attempt)]\n const exponential = Math.min(options.maxDelayMs, options.baseDelayMs * Math.pow(2, attempt))\n return jitterFraction() * exponential\n}\n\nfunction parseRetryAfterHeader(header: string): number | undefined {\n const seconds = Number(header)\n if (!isNaN(seconds)) return seconds\n const date = new Date(header)\n if (!isNaN(date.getTime())) {\n return Math.max(0, Math.ceil((date.getTime() - Date.now()) / 1000))\n }\n return undefined\n}\n\nexport function resolveRetryOptions(\n opts?: RetryOptions,\n maxRetries?: number,\n): Required<RetryOptions> {\n const maxAttempts =\n typeof maxRetries === 'number' && Number.isFinite(maxRetries)\n ? Math.max(1, Math.floor(maxRetries) + 1)\n : (opts?.maxAttempts ?? 3)\n\n return {\n maxAttempts,\n baseDelayMs: opts?.baseDelayMs ?? 250,\n maxDelayMs: opts?.maxDelayMs ?? 30_000,\n }\n}\n\nfunction jitterFraction(): number {\n const cryptoApi = getCryptoApi()\n if (cryptoApi) {\n const value = new Uint32Array(1)\n cryptoApi.getRandomValues(value)\n return (value[0] ?? 0) / 0x1_0000_0000\n }\n\n // Retry jitter is not a security primitive, but we still want a stable\n // spread for runtimes that do not expose Web Crypto.\n jitterCounter = (jitterCounter + 1) >>> 0\n const mixed = mixUint32((Date.now() ^ Math.imul(jitterCounter, 0x9e37_79b9)) >>> 0)\n return mixed / 0x1_0000_0000\n}\n\nfunction getCryptoApi(): CryptoLike | undefined {\n const cryptoApi = globalThis.crypto as CryptoLike | undefined\n if (cryptoApi && typeof cryptoApi.getRandomValues === 'function') {\n return cryptoApi\n }\n\n return undefined\n}\n\nfunction mixUint32(value: number): number {\n let mixed = (value ^ (value >>> 16)) >>> 0\n mixed = Math.imul(mixed, 0x7feb_352d) >>> 0\n mixed = (mixed ^ (mixed >>> 15)) >>> 0\n mixed = Math.imul(mixed, 0x846c_a68b) >>> 0\n return (mixed ^ (mixed >>> 16)) >>> 0\n}\n", "/**\n * Shared utilities: response extraction and pagination helpers.\n */\n\nimport { ParseError } from './errors.js'\nimport { parseRateLimitHeaders, type RateLimitInfo } from './rate-limit.js'\n\nexport interface LastResponseInfo {\n requestId: string | null\n statusCode: number\n headers: Headers\n rateLimit: RateLimitInfo\n}\n\nexport interface ResponseMetadata {\n _request_id: string | null\n lastResponse: LastResponseInfo\n}\n\nexport interface AmigoResponse<T> {\n data: WithResponseMetadata<T>\n response: Response\n requestId: string | null\n rateLimit: RateLimitInfo\n}\n\nexport type WithResponseMetadata<T> = T extends object ? T & ResponseMetadata : T\n\nexport function extractRequestId(response: Response): string | null {\n return response.headers.get('x-request-id')\n}\n\nexport function buildLastResponse(response: Response): LastResponseInfo {\n return {\n requestId: extractRequestId(response),\n statusCode: response.status,\n headers: response.headers,\n rateLimit: parseRateLimitHeaders(response.headers),\n }\n}\n\ninterface OpenApiResult<T> {\n data?: T\n error?: unknown\n response?: Response\n}\n\ninterface ExtractDataOptions {\n allowEmptyBody?: boolean\n}\n\n/**\n * Extracts the data payload from an openapi-fetch response.\n * Empty-body success responses return undefined; other empty responses throw.\n */\nexport function extractData<T>(\n result: OpenApiResult<T>,\n options: ExtractDataOptions = {},\n): WithResponseMetadata<T> {\n if (result.data !== undefined) {\n return attachResponseMetadata(result.data, result.response) as WithResponseMetadata<T>\n }\n\n if (isEmptyBodySuccess(result.response) || options.allowEmptyBody) {\n return undefined as WithResponseMetadata<T>\n }\n\n // Degenerate openapi-fetch results with both data and error keep the SDK's\n // original data-first behavior; without data, errors stay fatal.\n if (result.error !== undefined) {\n throw new ParseError('Unexpected error response from API', JSON.stringify(result.error))\n }\n\n throw new ParseError(\n 'Unexpected empty response from API',\n result.response ? `status=${result.response.status}` : undefined,\n )\n}\n\nexport function withResponse<T>(\n result: OpenApiResult<T> & { response: Response },\n options: ExtractDataOptions = {},\n): AmigoResponse<T> {\n const data = extractData(result, options)\n const lastResponse = buildLastResponse(result.response)\n\n return {\n data,\n response: result.response,\n requestId: lastResponse.requestId,\n rateLimit: lastResponse.rateLimit,\n }\n}\n\n/**\n * Standard paginated list response shape.\n */\nexport interface PaginatedList<T> {\n items: T[]\n has_more: boolean\n continuation_token: number | null\n}\n\n/**\n * Standard query params for paginated list endpoints.\n */\nexport interface ListParams {\n /** Max items per page. Default varies by endpoint. */\n limit?: number\n /** Opaque token from previous response for next page. */\n continuation_token?: number\n}\n\n/**\n * Async iterator that auto-paginates through all pages.\n * Yields one item at a time.\n *\n * @example\n * for await (const agent of paginate((token) => client.agents.list({ continuation_token: token }))) {\n * console.log(agent)\n * }\n */\nexport async function* paginate<T>(\n fetcher: (continuationToken?: number) => Promise<PaginatedList<T>>,\n): AsyncGenerator<T> {\n let token: number | undefined = undefined\n while (true) {\n const page = await fetcher(token)\n for (const item of page.items) {\n yield item\n }\n if (!page.has_more || page.continuation_token === null) break\n token = page.continuation_token\n }\n}\n\nfunction attachResponseMetadata<T>(data: T, response?: Response): WithResponseMetadata<T> {\n if (!response || typeof data !== 'object' || data === null) {\n return data as WithResponseMetadata<T>\n }\n\n const target = data as T & Partial<ResponseMetadata>\n const lastResponse = buildLastResponse(response)\n\n defineHiddenMetadata(target, '_request_id', lastResponse.requestId)\n defineHiddenMetadata(target, 'lastResponse', lastResponse)\n\n return target as WithResponseMetadata<T>\n}\n\nfunction isEmptyBodySuccess(response?: Response): boolean {\n return response?.status === 204 || response?.status === 205\n}\n\nfunction defineHiddenMetadata<T extends object, K extends keyof ResponseMetadata>(\n target: T,\n key: K,\n value: ResponseMetadata[K],\n): void {\n try {\n Object.defineProperty(target, key, {\n value,\n enumerable: false,\n configurable: true,\n writable: false,\n })\n } catch {\n // Ignore non-extensible return values.\n }\n}\n", "/**\n * Base class for workspace-scoped resources.\n *\n * Uses the openapi-fetch client (with auth + error + retry middleware)\n * injected from AmigoClient. Resources call typed HTTP methods that\n * flow through the middleware chain automatically.\n */\n\nimport type { Middleware } from 'openapi-fetch'\nimport {\n applyPlatformRequestOptions,\n getPlatformClientBaseUrl,\n type PlatformFetch,\n} from '../core/openapi-client.js'\nimport {\n mergeRequestOptions,\n mergeScopedRequestOptions,\n type ScopedRequestOptions,\n} from '../core/request-options.js'\nimport { extractData } from '../core/utils.js'\n\nconst scopedClientState = new WeakMap<\n PlatformFetch,\n { baseClient: PlatformFetch; options: ScopedRequestOptions }\n>()\n\nexport abstract class WorkspaceScopedResource {\n constructor(\n protected readonly client: PlatformFetch,\n protected readonly workspaceId: string,\n ) {}\n\n protected get platformBaseUrl(): string {\n const { baseClient } = resolveScopedPlatformClient(this.client)\n return getPlatformClientBaseUrl(baseClient)\n }\n\n withOptions(options: ScopedRequestOptions): this {\n const ResourceCtor = this.constructor as new (\n client: PlatformFetch,\n workspaceId: string,\n ) => this\n return new ResourceCtor(scopePlatformClient(this.client, options), this.workspaceId)\n }\n\n protected async *iteratePaginatedList<\n TPage extends {\n items?: readonly unknown[]\n has_more?: boolean\n continuation_token?: number | null\n },\n TParams,\n >(\n fetchPage: (params: TParams) => Promise<TPage>,\n params: TParams,\n ): AsyncGenerator<TPage extends { items?: readonly (infer TItem)[] } ? TItem : never> {\n type Item = TPage extends { items?: readonly (infer TItem)[] } ? TItem : never\n let nextParams = params\n\n while (true) {\n const page = await fetchPage(nextParams)\n\n for (const item of page.items ?? []) {\n yield item as Item\n }\n\n if (\n !page.has_more ||\n page.continuation_token === null ||\n page.continuation_token === undefined\n ) {\n break\n }\n\n nextParams = {\n ...(nextParams as object | undefined),\n continuation_token: page.continuation_token,\n } as TParams\n }\n }\n\n protected async *iterateOffsetPaginatedList<\n TPage extends { has_more?: boolean; next_offset?: number | null },\n TItem,\n TParams,\n >(\n fetchPage: (params: TParams) => Promise<TPage>,\n selectItems: (page: TPage) => readonly TItem[],\n params: TParams,\n ): AsyncGenerator<TItem> {\n let nextParams = params\n\n while (true) {\n const page = await fetchPage(nextParams)\n\n for (const item of selectItems(page)) {\n yield item\n }\n\n if (!page.has_more || page.next_offset === null || page.next_offset === undefined) {\n break\n }\n\n nextParams = { ...(nextParams as object | undefined), offset: page.next_offset } as TParams\n }\n }\n}\n\nexport function scopePlatformClient(\n client: PlatformFetch,\n options: ScopedRequestOptions,\n): PlatformFetch {\n const { baseClient, options: existingOptions } = resolveScopedPlatformClient(client)\n const mergedOptions = mergeScopedRequestOptions(existingOptions, options)\n\n const scopedClient = {\n request: (method: string, path: string, init?: object) =>\n baseClient.request(\n method as never,\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n GET: (path: string, init?: object) =>\n baseClient.GET(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n PUT: (path: string, init?: object) =>\n baseClient.PUT(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n POST: (path: string, init?: object) =>\n baseClient.POST(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n DELETE: (path: string, init?: object) =>\n baseClient.DELETE(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n OPTIONS: (path: string, init?: object) =>\n baseClient.OPTIONS(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n HEAD: (path: string, init?: object) =>\n baseClient.HEAD(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n PATCH: (path: string, init?: object) =>\n baseClient.PATCH(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n TRACE: (path: string, init?: object) =>\n baseClient.TRACE(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n use: (...middleware: Middleware[]) => baseClient.use(...middleware),\n eject: (...middleware: Middleware[]) => baseClient.eject(...middleware),\n } as PlatformFetch\n\n scopedClientState.set(scopedClient, { baseClient, options: mergedOptions })\n return scopedClient\n}\n\nexport function resolveScopedPlatformClient(client: PlatformFetch): {\n baseClient: PlatformFetch\n options: ScopedRequestOptions | undefined\n} {\n const existing = scopedClientState.get(client)\n return {\n baseClient: existing?.baseClient ?? client,\n options: existing?.options,\n }\n}\n\nexport { extractData }\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Account-scoped operations for the authenticated identity.\n *\n * \"Me\" is the SDK-side mirror of platform-api's ``/v1/me/...``\n * namespace \u2014 operations that act on the caller's own account\n * (workspaces they own, profile info, \u2026) rather than on a specific\n * workspace they're inside of.\n *\n * Workspace creation lives here, NOT on ``client.workspaces``. The\n * legacy ``client.workspaces.createSelfService`` (which posted to\n * ``/v1/workspaces/self-service``) was removed in SDK 0.28.0 because\n * the route shape confused URL-parsing consumers \u2014 the developer-console\n * BFF proxy treated the literal ``self-service`` as a workspace_id\n * and sent identity a JWT-refresh request scoped to that string,\n * which 4xx'd before the call ever reached platform-api.\n *\n * Even though the underlying call is account-scoped, this resource\n * extends ``WorkspaceScopedResource`` to inherit ``withOptions`` /\n * iteration helpers / scoped-client wiring. The bound\n * ``workspaceId`` is unused for the routes here \u2014 typically a\n * placeholder like ``\"_account\"`` from the AmigoClient construction.\n *\n * **No workspace context is injected into the HTTP request.** The\n * shared ``PlatformFetch`` middleware does not auto-prefix paths or\n * inject ``X-Workspace-Id``-style headers based on the resource's\n * ``workspaceId`` slot \u2014 the URL each method writes is the URL that\n * leaves the client. Pinned by ``tests/resources/me.test.ts``'s\n * exact-URL assertion.\n */\nexport class MeResource extends WorkspaceScopedResource {\n /**\n * Create a workspace owned by the authenticated identity.\n *\n * The caller is bootstrapped as the workspace's owner. Use this\n * method anywhere that previously called\n * ``client.workspaces.createSelfService(body)`` \u2014 the request body\n * shape and response are unchanged; only the URL moved.\n */\n async createWorkspace(body: components['schemas']['CreateWorkspaceRequest']) {\n return extractData(\n await this.client.POST('/v1/me/workspaces', {\n body,\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { WorkspaceId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\n/**\n * Manage Amigo Platform workspaces.\n * Workspaces are the top-level tenancy boundary for all resources.\n *\n * Note: ``list`` operates at account level (``/v1/workspaces``).\n * Creation lives at ``/v1/me/workspaces`` \u2014 see ``MeResource``\n * (``client.me.createWorkspace``). The legacy\n * ``POST /v1/workspaces/self-service`` was removed in platform-api\n * PR #2472; ``/v1/workspaces/<x>`` paths now exclusively operate on\n * a specific workspace, so URL-parsing consumers can never confuse\n * an account-level operation with a workspace-scoped one.\n * Get/update/archive/provision operate on a specific workspace.\n */\nexport class WorkspacesResource extends WorkspaceScopedResource {\n /** List workspaces accessible to the current API key */\n async list(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/workspaces', {\n params: { query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single workspace by ID */\n async get(id?: WorkspaceId | string) {\n return extractData(\n await this.client.GET('/v1/workspaces/{workspace_id}', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n }),\n )\n }\n\n /** Update workspace metadata */\n async update(body: components['schemas']['UpdateWorkspaceRequest'], id?: WorkspaceId | string) {\n return extractData(\n await this.client.PATCH('/v1/workspaces/{workspace_id}', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Archive (soft-delete) a workspace */\n async archive(body: components['schemas']['ArchiveWorkspaceRequest'], id?: WorkspaceId | string) {\n return extractData(\n await this.client.POST('/v1/workspaces/{workspace_id}/archive', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Provision a workspace (seed integrations, mark as provisioned) */\n async provision(id?: WorkspaceId | string) {\n return extractData(\n await this.client.POST('/v1/workspaces/{workspace_id}/provision', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n }),\n )\n }\n\n /** Pre-check environment conversion warnings */\n async checkEnvironment(target?: 'production' | 'staging', id?: WorkspaceId | string) {\n return extractData(\n await this.client.GET('/v1/workspaces/{workspace_id}/environment-check', {\n params: {\n path: { workspace_id: id ?? this.workspaceId },\n query: target ? { target } : undefined,\n },\n }),\n )\n }\n\n /** Convert workspace between staging and production */\n async convertEnvironment(\n body: components['schemas']['ConvertEnvironmentRequest'],\n id?: WorkspaceId | string,\n ) {\n return extractData(\n await this.client.POST('/v1/workspaces/{workspace_id}/convert-environment', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n body,\n }),\n )\n }\n\n /**\n * Workspace-allowlisted phone numbers that can place test calls into voice\n * agents. The list is read-mostly; writes overwrite the entire allowlist.\n *\n * Always operates on the bound workspace. Use `client.withOptions(...)` or\n * construct a second `AmigoClient` if you need to act on a different\n * workspace.\n */\n readonly testCallerNumbers = {\n /** Get the workspace's test caller allowlist */\n get: async () =>\n extractData(\n await this.client.GET('/v1/workspaces/{workspace_id}/test-caller-numbers', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n\n /**\n * Replace the workspace's test caller allowlist.\n *\n * **Replace-all semantics:** the request body fully replaces the existing\n * allowlist; numbers omitted from `body` are removed. Read first, mutate,\n * then write to add/remove individual entries safely.\n */\n update: async (body: components['schemas']['TestCallerNumbersRequest']) =>\n extractData(\n await this.client.PUT('/v1/workspaces/{workspace_id}/test-caller-numbers', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { ApiKeyId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\n/**\n * Manage API keys for a workspace.\n *\n * API keys are used to authenticate SDK/API requests. Each key has a role\n * and a set of permissions. Keys expire after 1-90 days.\n */\nexport class ApiKeysResource extends WorkspaceScopedResource {\n /**\n * Get info about the currently authenticated API key.\n * Does not require a workspace ID in the path.\n */\n async me() {\n return extractData(await this.client.GET('/v1/auth/me', {}))\n }\n\n /** Create a new API key */\n async create(body: components['schemas']['CreateApiKeyRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/api-keys', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List API keys in the workspace */\n async list(params?: ListParams & { mine_only?: boolean }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/api-keys', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams & { mine_only?: boolean }) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Revoke an API key */\n async revoke(keyId: ApiKeyId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/api-keys/{key_id}', {\n params: { path: { workspace_id: this.workspaceId, key_id: keyId } },\n })\n }\n\n /** Rotate an API key \u2014 invalidates the old key and issues a new one */\n async rotate(keyId: ApiKeyId | string, body: components['schemas']['RotateApiKeyRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/api-keys/{key_id}/rotate', {\n params: { path: { workspace_id: this.workspaceId, key_id: keyId } },\n body,\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { AgentId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListAgentsParams extends ListParams {\n search?: string\n}\n\nexport class AgentsResource extends WorkspaceScopedResource {\n async create(body: components['schemas']['CreateAgentRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/agents', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async list(params?: ListAgentsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/agents', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListAgentsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(agentId: AgentId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/agents/{agent_id}', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId } },\n }),\n )\n }\n\n async update(agentId: AgentId | string, body: components['schemas']['UpdateAgentRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/agents/{agent_id}', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId } },\n body,\n }),\n )\n }\n\n async delete(agentId: AgentId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/agents/{agent_id}', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId } },\n })\n }\n\n async listVersions(agentId: AgentId | string, params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/agents/{agent_id}/versions', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId }, query: params },\n }),\n )\n }\n\n listVersionsAutoPaging(agentId: AgentId | string, params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.listVersions(agentId, pageParams), params)\n }\n\n async getVersion(agentId: AgentId | string, version: number | 'latest') {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/agents/{agent_id}/versions/{version}', {\n params: {\n path: { workspace_id: this.workspaceId, agent_id: agentId, version: String(version) },\n },\n }),\n )\n }\n\n async createVersion(\n agentId: AgentId | string,\n body: components['schemas']['CreateAgentVersionRequest'],\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/agents/{agent_id}/versions', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId } },\n body,\n }),\n )\n }\n}\n", "import type { components, paths } from '../generated/api.js'\nimport type { SkillId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\ntype SkillsListQuery = NonNullable<\n NonNullable<paths['/v1/{workspace_id}/skills']['get']['parameters']['query']>\n>\n\nexport interface ListSkillsParams extends ListParams {\n search?: string\n enabled?: boolean\n execution_tier?: SkillsListQuery['execution_tier']\n}\n\n/**\n * Manage skills \u2014 reusable AI capabilities that agents can call.\n * Skills define a structured input/output schema and an execution tier.\n */\nexport class SkillsResource extends WorkspaceScopedResource {\n /** Create a new skill */\n async create(body: components['schemas']['CreateSkillRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/skills', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List skills in the workspace */\n async list(params?: ListSkillsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListSkillsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single skill */\n async get(skillId: SkillId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: skillId } },\n }),\n )\n }\n\n /** Update a skill */\n async update(skillId: SkillId | string, body: components['schemas']['UpdateSkillRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: skillId } },\n body,\n }),\n )\n }\n\n /** Delete a skill */\n async delete(skillId: SkillId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: skillId } },\n })\n }\n\n /**\n * Test a skill with a sample input.\n * Executes the skill in a sandbox and returns the result.\n */\n async test(skillId: SkillId | string, body: components['schemas']['TestSkillRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/skills/{skill_id}/test', {\n params: { path: { workspace_id: this.workspaceId, skill_id: skillId } },\n body,\n }),\n )\n }\n}\n", "import type { components, paths } from '../generated/api.js'\nimport type { ActionId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\ntype ActionsListQuery = NonNullable<\n NonNullable<paths['/v1/{workspace_id}/skills']['get']['parameters']['query']>\n>\n\nexport interface ListActionsParams extends ListParams {\n search?: string\n enabled?: boolean\n execution_tier?: ActionsListQuery['execution_tier']\n}\n\n/**\n * Manage actions \u2014 reusable AI capabilities that agents can call.\n * Actions define a structured input/output schema and an execution tier.\n *\n * Note: The underlying API paths use `/skills/` for backward compatibility.\n */\nexport class ActionsResource extends WorkspaceScopedResource {\n /** Create a new action */\n async create(body: components['schemas']['CreateSkillRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/skills', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List actions in the workspace */\n async list(params?: ListActionsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListActionsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single action */\n async get(actionId: ActionId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n }),\n )\n }\n\n /** Update an action */\n async update(actionId: ActionId | string, body: components['schemas']['UpdateSkillRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n body,\n }),\n )\n }\n\n /** Delete an action */\n async delete(actionId: ActionId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n })\n }\n\n /** Get all context graphs and services that reference this action */\n async getReferences(actionId: ActionId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills/{skill_id}/references', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n }),\n )\n }\n\n /**\n * Test an action with a sample input.\n * Executes the action in a sandbox and returns the result.\n */\n async test(actionId: ActionId | string, body: components['schemas']['TestSkillRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/skills/{skill_id}/test', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n body,\n }),\n )\n }\n}\n", "import type { components, operations } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type EscalationStatsParams = NonNullable<\n operations['escalation-stats']['parameters']['query']\n>\n\nexport class OperatorsResource extends WorkspaceScopedResource {\n async list(params?: { status?: string; limit?: number; offset?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: { status?: string; limit?: number; offset?: number }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.list(pageParams),\n (page) => page.items,\n params,\n )\n }\n\n async create(body: components['schemas']['CreateOperatorRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async get(operatorId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/{operator_id}', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n }),\n )\n }\n\n /** Update an operator (name, role, status, etc.) */\n async update(operatorId: string, body: components['schemas']['UpdateOperatorRequest']) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/operators/{operator_id}', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async getDashboard() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/dashboard', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getQueue() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/queue', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getEscalations(params?: { status?: string; limit?: number; offset?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/escalations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getEscalationsAutoPaging(params?: { status?: string; limit?: number; offset?: number }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getEscalations(pageParams),\n (page) => page.items,\n params,\n )\n }\n\n async getActiveEscalations() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/escalations/active', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getEscalationStats(params?: EscalationStatsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/escalations/stats', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getPerformance(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/performance', {\n params: { path: { workspace_id: this.workspaceId }, query: params as never },\n }),\n )\n }\n\n async getAccessToken(operatorId: string, body: components['schemas']['AccessTokenRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/access-token', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async joinCall(operatorId: string, body: components['schemas']['JoinCallRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/join-call', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async leaveCall(operatorId: string, body: components['schemas']['LeaveCallRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/leave-call', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async switchMode(operatorId: string, body: components['schemas']['SwitchModeRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/switch-mode', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async sendGuidance(operatorId: string, body: components['schemas']['SendGuidanceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/send-guidance', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async createBriefing(operatorId: string, body: { call_sid: string }) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/briefing', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async wrapUp(operatorId: string, body: components['schemas']['WrapUpRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/wrap-up', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async getCallTranscript(callSid: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/calls/{call_sid}/transcript', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid } },\n }),\n )\n }\n\n async getAuditLog(params?: { limit?: number; offset?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/audit-log', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getAuditLogAutoPaging(params?: { limit?: number; offset?: number }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getAuditLog(pageParams),\n (page) => page.items,\n params,\n )\n }\n}\n", "import type { components, operations } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Query parameters for {@link PromptLogsResource.list}.\n *\n * Sourced from the OpenAPI ``list-prompt-logs`` operation so the SDK always\n * tracks the canonical contract (no hand-maintained shape that can drift\n * from the platform-api).\n */\nexport type ListPromptLogsParams = NonNullable<\n operations['list-prompt-logs']['parameters']['query']\n>\n\nexport type PromptLogEntry = components['schemas']['PromptLogEntry']\nexport type PromptLogListResponse = components['schemas']['PromptLogListResponse']\n\n/**\n * Prompt-log read surface \u2014 full LLM input/output (system prompt,\n * conversation history, tool catalog, model, response) per turn for\n * auditing, debugging, and post-hoc trace analysis.\n *\n * Reads the Delta ``world_events`` ledger via Databricks SQL (typical\n * latency 1-5s, 15s ceiling). **Admin or owner role required** \u2014\n * responses can include PHI from prompt history.\n *\n * The canonical filter is ``conversation_id`` (UUID from\n * ``world.entities``) which works across voice / text / sim\n * modalities. ``call_sid`` remains for legacy callers and external\n * systems holding the SID directly. The two are mutually exclusive.\n *\n * @example\n * ```ts\n * // Cross-modality: filter by conversation entity UUID.\n * const page = await client.promptLogs.list({\n * conversation_id: '<entity-uuid>',\n * limit: 50,\n * })\n *\n * // Direct call SID (Twilio CA-SID for voice).\n * const callPage = await client.promptLogs.list({\n * call_sid: 'CA01a2b3...',\n * prompt_type: 'engage_user',\n * })\n *\n * // Auto-paged sweep over a workspace's last 7 days\n * for await (const entry of client.promptLogs.listAutoPaging({\n * prompt_type: 'navigation',\n * })) {\n * console.log(entry.event_id, entry.state_name, entry.llm_model)\n * }\n * ```\n */\nexport class PromptLogsResource extends WorkspaceScopedResource {\n /**\n * One page of prompt-log entries, newest-first.\n *\n * When ``params.conversation_id`` is supplied, the response surfaces\n * ``resolved_call_sid`` (the call_sid the lookup mapped to) and\n * ``resolved_conversation_kind`` (``\"call\"`` for voice/sim,\n * ``\"conversation\"`` for text/sms/whatsapp/email) so you can drill\n * into per-call surfaces afterward without re-querying\n * ``world.entities``.\n *\n * When no selectivity-bearing filter is supplied (no conversation_id /\n * call_sid / time range), the query is auto-capped to the last 7 days.\n * The applied window is reported in ``applied_time_window_days``.\n */\n async list(params?: ListPromptLogsParams): Promise<PromptLogListResponse> {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/prompt-logs', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /**\n * Auto-paginating async iterator over prompt-log entries. Walks\n * ``next_offset`` until ``has_more`` is false, yielding individual\n * entries. Use this when consuming logs at scale (e.g. nightly\n * backfills) rather than rendering one page in a UI.\n *\n * Bounded by the same per-call hard caps as ``list`` (200 items per\n * page, 10,000 cumulative offset).\n */\n async *listAutoPaging(\n params?: Omit<ListPromptLogsParams, 'offset'>,\n ): AsyncIterableIterator<PromptLogEntry> {\n let offset = 0\n while (true) {\n const page = await this.list({ ...params, offset })\n for (const entry of page.items) {\n yield entry\n }\n if (!page.has_more || page.next_offset == null) {\n return\n }\n // Advance to the offset the server told us to use; guard against a\n // non-advancing token to avoid an infinite loop on a buggy backend.\n if (page.next_offset === offset) {\n return\n }\n offset = page.next_offset\n }\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport class TriggersResource extends WorkspaceScopedResource {\n async list(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/triggers', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async create(body: components['schemas']['CreateTriggerRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/triggers', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async get(triggerId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/triggers/{trigger_id}', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n }),\n )\n }\n\n async update(triggerId: string, body: components['schemas']['UpdateTriggerRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/triggers/{trigger_id}', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n body,\n }),\n )\n }\n\n async delete(triggerId: string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/triggers/{trigger_id}', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n })\n }\n\n async fire(triggerId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/triggers/{trigger_id}/fire', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n }),\n )\n }\n\n async pause(triggerId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/triggers/{trigger_id}/pause', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n }),\n )\n }\n\n async resume(triggerId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/triggers/{trigger_id}/resume', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n }),\n )\n }\n\n async listRuns(triggerId: string, params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/triggers/{trigger_id}/runs', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId }, query: params },\n }),\n )\n }\n\n listRunsAutoPaging(triggerId: string, params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.listRuns(triggerId, pageParams), params)\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { ServiceId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListServicesParams extends ListParams {\n search?: string\n type?: string\n}\n\n/**\n * Manage services \u2014 external service configurations that agents can call.\n * Services represent integrations like scheduling systems, EHRs, or CRMs\n * that skills can interact with via their tool definitions.\n */\nexport class ServicesResource extends WorkspaceScopedResource {\n async create(body: components['schemas']['CreateServiceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/services', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async list(params?: ListServicesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/services', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListServicesParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(serviceId: ServiceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/services/{service_id}', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n }),\n )\n }\n\n async update(serviceId: ServiceId | string, body: components['schemas']['UpdateServiceRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/services/{service_id}', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n body,\n }),\n )\n }\n\n async delete(serviceId: ServiceId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/services/{service_id}', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n })\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { ContextGraphId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListContextGraphsParams extends ListParams {\n search?: string\n}\n\n/**\n * Manage context graphs \u2014 structured conversation flow definitions (HSM).\n * Context graphs define the states, transitions, and conditions that\n * govern how an agent moves through a conversation.\n */\nexport class ContextGraphsResource extends WorkspaceScopedResource {\n async create(body: components['schemas']['CreateContextGraphRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/context-graphs', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async list(params?: ListContextGraphsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/context-graphs', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListContextGraphsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(contextGraphId: ContextGraphId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/context-graphs/{context_graph_id}', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n },\n }),\n )\n }\n\n async update(\n contextGraphId: ContextGraphId | string,\n body: components['schemas']['UpdateContextGraphRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/context-graphs/{context_graph_id}', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n },\n body,\n }),\n )\n }\n\n async delete(contextGraphId: ContextGraphId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/context-graphs/{context_graph_id}', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n },\n })\n }\n\n /** Create a version snapshot of the current context graph */\n async createVersion(\n contextGraphId: ContextGraphId | string,\n body: components['schemas']['CreateContextGraphVersionRequest'],\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/context-graphs/{context_graph_id}/versions', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n },\n body,\n }),\n )\n }\n\n /** List all versions of a context graph */\n async listVersions(contextGraphId: ContextGraphId | string, params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/context-graphs/{context_graph_id}/versions', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n query: params,\n },\n }),\n )\n }\n\n listVersionsAutoPaging(contextGraphId: ContextGraphId | string, params?: ListParams) {\n return this.iteratePaginatedList(\n (pageParams) => this.listVersions(contextGraphId, pageParams),\n params,\n )\n }\n\n /** Get a specific version by number, or pass \"latest\" for the most recent */\n async getVersion(contextGraphId: ContextGraphId | string, version: number | 'latest') {\n return extractData(\n await this.client.GET(\n '/v1/{workspace_id}/context-graphs/{context_graph_id}/versions/{version}',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n context_graph_id: contextGraphId,\n version,\n },\n },\n },\n ),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { DataSourceId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListDataSourcesParams extends ListParams {\n type?: string\n status?: string\n}\n\n/**\n * Manage data sources \u2014 connections to external databases, warehouses,\n * or data feeds that the platform can query and sync from.\n */\nexport class DataSourcesResource extends WorkspaceScopedResource {\n async create(body: components['schemas']['CreateDataSourceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/data-sources', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async list(params?: ListDataSourcesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/data-sources', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListDataSourcesParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(dataSourceId: DataSourceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/data-sources/{data_source_id}', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n }),\n )\n }\n\n async update(\n dataSourceId: DataSourceId | string,\n body: components['schemas']['UpdateDataSourceRequest'],\n ) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/data-sources/{data_source_id}', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n body,\n }),\n )\n }\n\n async delete(dataSourceId: DataSourceId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/data-sources/{data_source_id}', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n })\n }\n\n /** Get event counts, sync status, and health for a data source */\n async getStatus(dataSourceId: DataSourceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/data-sources/{data_source_id}/status', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n }),\n )\n }\n\n /** Get daily event timeline + recent sync failures for a data source */\n async getSyncHistory(dataSourceId: DataSourceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/data-sources/{data_source_id}/sync-history', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n }),\n )\n }\n\n /**\n * Trigger a one-off manual sync of a data source.\n *\n * Bypasses the business-hours gate and per-resource cadence counter on\n * connector-runner. Resolves with `{ status: \"started\", ... }` once the\n * request is queued \u2014 the poll itself runs asynchronously. Platform-api\n * returns 409 if the source is already mid-sync (see\n * `TriggerSyncConflictResponse` for the body shape), 503 if\n * connector-runner is unreachable.\n */\n async triggerSync(dataSourceId: DataSourceId | string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/data-sources/{data_source_id}/sync', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n }),\n )\n }\n}\n", "import type { EntityId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * World Model \u2014 entities, events, relationships, and the entity timeline.\n *\n * The world model is the core knowledge graph of the platform. Entities\n * represent real-world objects (patients, contacts, calls). Events record\n * observations about entities over time.\n */\nexport class WorldResource extends WorkspaceScopedResource {\n // ---- Entities ----\n\n /** List entities with optional filtering */\n async listEntities(params?: {\n entity_type?: string[] | null\n q?: string | null\n limit?: number\n offset?: number\n order?: string | null\n has_projection?: boolean | null\n source?: string | null\n source_system?: string | null\n fhir_resource_type?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listEntitiesAutoPaging(params?: {\n entity_type?: string[] | null\n q?: string | null\n limit?: number\n offset?: number\n order?: string | null\n has_projection?: boolean | null\n source?: string | null\n source_system?: string | null\n fhir_resource_type?: string | null\n }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.listEntities(pageParams),\n (page) => page.entities,\n params,\n )\n }\n\n /** Get a single entity */\n async getEntity(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get all relationships for an entity */\n async getRelationships(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/relationships', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get the knowledge graph centered on an entity (entity + neighbors + edges) */\n async getGraph(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/graph', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get provenance \u2014 which source systems contributed data for an entity */\n async getProvenance(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/provenance', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get lineage \u2014 merge history and canonical identity for an entity */\n async getLineage(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/lineage', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get merged entities for a canonical entity */\n async getMerged(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/merged', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n // ---- Connectors ----\n\n /** Get connected data sources overview with entity counts and sync status */\n async getConnectors() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/connectors', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** List entities from a specific connector / data source */\n async getConnectorEntities(\n dataSourceId: string,\n params?: {\n entity_type?: string | null\n q?: string | null\n limit?: number\n offset?: number\n },\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/connectors/{data_source_id}/entities', {\n params: {\n path: { workspace_id: this.workspaceId, data_source_id: dataSourceId },\n query: params,\n },\n }),\n )\n }\n\n /** Search FHIR resources from a specific data source */\n async getConnectorResources(\n dataSourceId: string,\n params: {\n resource_type: string\n _count?: number\n _offset?: number\n },\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/connectors/{data_source_id}/resources', {\n params: {\n path: { workspace_id: this.workspaceId, data_source_id: dataSourceId },\n query: params,\n },\n }),\n )\n }\n\n // ---- Entity Types ----\n\n /** List registered entity types with counts and schemas */\n async listEntityTypes() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entity-types', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n // ---- Duplicate Detection ----\n\n /** List potential duplicate entity pairs for review or merging */\n async listDuplicates(params?: { entity_type?: string | null; confidence_max?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/duplicates', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n // ---- Semantic Search ----\n\n /** Semantic (vector) search over entities */\n async search(params: {\n q: string\n entity_type?: string | null\n source?: string | null\n confidence_min?: number | null\n limit?: number\n offset?: number\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/search', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n // ---- Timeline ----\n\n /** Get the event timeline for an entity (reverse-chronological) */\n async getTimeline(\n entityId: EntityId | string,\n params?: {\n domain?: string | null\n limit?: number\n offset?: number\n },\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/timeline', {\n params: {\n path: { workspace_id: this.workspaceId, entity_id: entityId },\n query: params,\n },\n }),\n )\n }\n\n getTimelineAutoPaging(\n entityId: EntityId | string,\n params?: {\n domain?: string | null\n limit?: number\n offset?: number\n },\n ) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getTimeline(entityId, pageParams),\n (page) => page.events,\n params,\n )\n }\n\n // ---- Sync ----\n\n /** Get sync status grouped by sink (Lakebase, Delta, etc.) */\n async getSyncStatusBySink() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/sync/by-sink', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** List sync events with status filtering */\n async listSyncEvents(params: {\n status: 'pending' | 'failed'\n data_source_id?: string | null\n source_system?: string | null\n fhir_resource_type?: string | null\n fhir_resource_id?: string | null\n limit?: number\n offset?: number\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/sync/events', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listSyncEventsAutoPaging(params: {\n status: 'pending' | 'failed'\n data_source_id?: string | null\n source_system?: string | null\n fhir_resource_type?: string | null\n fhir_resource_id?: string | null\n limit?: number\n offset?: number\n }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.listSyncEvents(pageParams),\n (page) => page.events,\n params,\n )\n }\n\n /** Get current sync queue depth */\n async getSyncQueueDepth() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/sync/queue', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Retry a single failed sync event */\n async retrySyncEvent(eventId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/world/sync/retry/{event_id}', {\n params: { path: { workspace_id: this.workspaceId, event_id: eventId } },\n }),\n )\n }\n\n /** Retry all failed sync events */\n async retryAllSyncEvents() {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/world/sync/retry-all', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n // ---- Statistics ----\n\n /** Get aggregate entity and event statistics */\n async getStats() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entity-stats', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get entity counts broken down by source system */\n async getSourceBreakdown() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/source-breakdown', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListCallsParams extends ListParams {\n status?: string\n agent_id?: string\n start_date?: string\n end_date?: string\n phone_number?: string\n direction?: string\n min_duration?: number\n max_duration?: number\n search?: string\n include_simulated?: boolean\n service_id?: string\n}\n\n/**\n * Access call records and intelligence.\n * Calls are read-only in the SDK \u2014 they are created by the voice pipeline.\n */\nexport class CallsResource extends WorkspaceScopedResource {\n /** List calls with optional filtering */\n async list(params?: ListCallsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListCallsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get full call detail including turns, escalation, safety, and recording info */\n async get(callId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}', {\n params: { path: { workspace_id: this.workspaceId, call_id: callId } },\n }),\n )\n }\n\n /** Get the canonical playback timeline for a call */\n async getTimeline(callId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}/timeline', {\n params: { path: { workspace_id: this.workspaceId, call_id: callId } },\n }),\n )\n }\n\n /** Get AI intelligence for a call */\n async getIntelligence(callId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}/intelligence', {\n params: { path: { workspace_id: this.workspaceId, call_id: callId } },\n }),\n )\n }\n\n /** Get active intelligence across all in-progress calls */\n async getActiveIntelligence() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/active/intelligence', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get performance benchmarks for a time period */\n async getBenchmarks(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/benchmarks', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Get phone number call volume breakdown */\n async getPhoneVolume(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/phone-volume', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Get deep call trace analysis */\n async getTraceAnalysis(callId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}/trace-analysis', {\n params: { path: { workspace_id: this.workspaceId, call_id: callId } },\n }),\n )\n }\n\n /** List trace analyses across calls (workspace-scoped feed) */\n async listTraces(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/traces', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Get latest Universal Metric Store values scoped to a single call */\n async getMetrics(callId: string, params?: { limit?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}/metrics', {\n params: {\n path: { workspace_id: this.workspaceId, call_id: callId },\n query: params,\n },\n }),\n )\n }\n\n /** Place an outbound call from the workspace's voice pipeline */\n async createOutbound(body: components['schemas']['CreateOutboundCallRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/calls/outbound', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n}\n", "import { ConfigurationError } from '../core/errors.js'\nimport { type PlatformFetch } from '../core/openapi-client.js'\nimport type { components, operations } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type ConversationDetail = components['schemas']['ConversationDetail']\nexport type ConversationListResponse = components['schemas']['ConversationListResponse']\nexport type ConversationSummary =\n components['schemas']['src__routes__conversations__ConversationSummary']\nexport type ConversationTurn = components['schemas']['ConversationTurn']\nexport type CreateConversationRequest = components['schemas']['CreateConversationRequest']\nexport type TurnRequest = components['schemas']['TurnRequest']\nexport type TurnResponse = components['schemas']['TurnResponse']\nexport type TurnStreamEvent = components['schemas']['TurnStreamEvent']\nexport type TurnTokenEvent = components['schemas']['TurnTokenEvent']\nexport type TurnToolCallStartedEvent = components['schemas']['TurnToolCallStartedEvent']\nexport type TurnToolCallCompletedEvent = components['schemas']['TurnToolCallCompletedEvent']\nexport type TurnThinkingEvent = components['schemas']['TurnThinkingEvent']\nexport type TurnMessageEvent = components['schemas']['TurnMessageEvent']\nexport type TurnDoneEvent = components['schemas']['TurnDoneEvent']\nexport type TurnErrorEvent = components['schemas']['TurnErrorEvent']\n\n/**\n * Hand-authored because the text-stream WebSocket endpoint is intentionally\n * outside the generated OpenAPI REST snapshot.\n * TODO: replace with generated types when `/agent/text-stream` is added to\n * openapi.json.\n *\n * @beta The text-stream WebSocket contract may evolve independently of the REST API.\n */\nexport interface TextStreamUrlParams {\n serviceId: string\n conversationId?: string\n entityId?: string\n /**\n * Enable `tool_call_started` and `tool_call_completed` frames on the\n * text-stream WebSocket so the client can render tool invocations in\n * real time.\n */\n toolEvents?: boolean\n /**\n * Bearer token query-param fallback for clients whose API key cannot be sent\n * as a WebSocket subprotocol token. Prefer textStreamAuthProtocols() when\n * the token is subprotocol-safe so secrets do not appear in URLs. The SDK\n * intentionally accepts only the server-supported text-stream token alphabet\n * (letters, digits, `.`, `_`, `+`, `=`, `/`, `:`, `-`) even though\n * URLSearchParams can percent-encode additional characters.\n */\n token?: string\n /**\n * Full text-stream URL override for preview/custom ingress.\n * Defaults to `${baseUrl origin}/agent/text-stream` with\n * `http` mapped to `ws` and `https` mapped to `wss`.\n */\n textStreamUrl?: string\n}\n\n/** @beta The text-stream WebSocket contract may evolve independently of the REST API. */\nexport type TextStreamAuthProtocols = readonly ['auth', string]\n\n/**\n * Hand-authored because the workspace-scoped session-connect WebSocket is\n * intentionally outside the generated OpenAPI REST snapshot.\n *\n * Path: ``WS /v1/{workspace_id}/sessions/connect``. Authentication is delivered\n * via the ``Sec-WebSocket-Protocol: auth, <token>`` subprotocol header \u2014 the\n * server rejects query-param tokens to keep credentials out of URLs and proxy\n * logs. ``serviceId`` and ``entityId`` are required path/query inputs.\n *\n * @beta The session-connect WebSocket contract may evolve independently of the REST API.\n */\nexport interface SessionConnectUrlParams {\n serviceId: string\n entityId: string\n conversationId?: string\n /**\n * Emit ``tool_call_started`` and ``tool_call_completed`` frames so the client\n * can render tool invocations in real time. Server defaults to ``true`` when\n * the param is omitted; the SDK only sets it explicitly when the caller asks\n * to disable tool events.\n */\n toolEvents?: boolean\n /**\n * Full session-connect URL override for preview/custom ingress. Defaults to\n * ``${baseUrl origin}/v1/{workspace_id}/sessions/connect`` with ``http`` mapped\n * to ``ws`` and ``https`` mapped to ``wss``. The override must be an\n * absolute ws/wss URL with no query string or fragment \u2014 SDK-managed query\n * params are appended by the helper.\n */\n sessionConnectUrl?: string\n}\n\nconst MAX_AUTH_TOKEN_CHARS = 4096\nconst TEXT_STREAM_AUTH_TOKEN_RE = /^[-A-Za-z0-9._+=/:]+$/\nconst WEB_SOCKET_PROTOCOL_TOKEN_RE = /^[!#$%&'*+\\-.^_`|~A-Za-z0-9]+$/\n\nexport type ListConversationsParams = NonNullable<\n operations['list_conversations_v1__workspace_id__conversations_get']['parameters']['query']\n>\n\n/** Access text conversation APIs and text-stream URL helpers. */\nexport class ConversationsResource extends WorkspaceScopedResource {\n private readonly agentBaseUrl: string | undefined\n\n constructor(client: PlatformFetch, workspaceId: string, agentBaseUrl?: string) {\n super(client, workspaceId)\n this.agentBaseUrl = agentBaseUrl\n }\n\n async list(params?: ListConversationsParams): Promise<ConversationListResponse> {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/conversations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async create(request: CreateConversationRequest): Promise<ConversationDetail> {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/conversations', {\n params: { path: { workspace_id: this.workspaceId } },\n body: request,\n }),\n )\n }\n\n async get(conversationId: string): Promise<ConversationDetail> {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/conversations/{conversation_id}', {\n params: {\n path: { workspace_id: this.workspaceId, conversation_id: conversationId },\n },\n }),\n )\n }\n\n async close(conversationId: string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/conversations/{conversation_id}', {\n params: {\n path: { workspace_id: this.workspaceId, conversation_id: conversationId },\n },\n })\n }\n\n /**\n * Send a user message and receive the agent's synchronous JSON response.\n *\n * Pass `options.includeToolCalls: true` to request tool-call metadata\n * alongside the response turns. Server-side default is `false` \u2014 without\n * this opt-in the `tool_calls` array on the `TurnResponse` will be empty\n * even when the agent invoked tools during the turn.\n */\n async createTurn(\n conversationId: string,\n request: TurnRequest,\n options?: { includeToolCalls?: boolean },\n ): Promise<TurnResponse> {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/conversations/{conversation_id}/turns', {\n params: {\n path: { workspace_id: this.workspaceId, conversation_id: conversationId },\n ...(options?.includeToolCalls !== undefined && {\n query: { include_tool_calls: options.includeToolCalls },\n }),\n },\n body: request,\n headers: { Accept: 'application/json' },\n }),\n ) as TurnResponse\n }\n\n /**\n * Send a message and receive the agent's response as an SSE byte stream.\n *\n * Targets the explicit always-SSE endpoint\n * `POST /v1/{ws}/conversations/{id}/turns/stream`, so the response is\n * always `text/event-stream` regardless of `Accept` negotiation. Returns\n * a `ReadableStream` of raw bytes; use `EventSourceParserStream` (from\n * `eventsource-parser/stream`) to parse into typed `TurnStreamEvent`,\n * or use the higher-level {@link streamTurn} which hides the parser.\n *\n * @example\n * ```ts\n * const stream = await client.conversations.createTurnStream(convId, { message: \"Hello\" });\n * const events = stream\n * .pipeThrough(new TextDecoderStream())\n * .pipeThrough(new EventSourceParserStream());\n * for await (const event of events) {\n * const parsed = JSON.parse(event.data) as TurnStreamEvent;\n * if (parsed.event === \"token\") console.log(parsed.text);\n * }\n * ```\n */\n async createTurnStream(\n conversationId: string,\n request: TurnRequest,\n options?: { signal?: AbortSignal; includeToolCalls?: boolean },\n ): Promise<ReadableStream<Uint8Array>> {\n const result = await this.client.POST(\n '/v1/{workspace_id}/conversations/{conversation_id}/turns/stream',\n {\n params: {\n path: { workspace_id: this.workspaceId, conversation_id: conversationId },\n ...(options?.includeToolCalls !== undefined && {\n query: { include_tool_calls: options.includeToolCalls },\n }),\n },\n body: request,\n parseAs: 'stream',\n signal: options?.signal,\n },\n )\n if (result.error !== undefined) {\n throw new Error(`API error: ${JSON.stringify(result.error)}`)\n }\n return result.data as ReadableStream<Uint8Array>\n }\n\n /**\n * Send a message and receive the agent's response as a typed\n * `TurnStreamEvent` async iterable.\n *\n * The bytes-and-parser dance from `createTurnStream` is now hidden inside\n * the SDK \u2014 consumers iterate strongly typed events directly. Each yielded\n * value is a member of the `TurnStreamEvent` discriminated union (`token`,\n * `thinking`, `tool_call_started`, `tool_call_completed`, `message`,\n * `done`, `error`), validated as a record with a known `event`\n * discriminator. Unknown / malformed frames are dropped silently \u2014 this\n * matches the wire-format-drift behavior of the lower-level\n * `createTurnStream` while keeping the strict `TurnStreamEvent` static\n * contract intact for consumers.\n *\n * @example\n * ```ts\n * for await (const event of client.conversations.streamTurn(convId, { message: \"Hello\" })) {\n * if (event.event === \"token\") process.stdout.write(event.text);\n * else if (event.event === \"done\") break;\n * }\n * ```\n */\n async *streamTurn(\n conversationId: string,\n request: TurnRequest,\n options?: { signal?: AbortSignal; includeToolCalls?: boolean },\n ): AsyncGenerator<TurnStreamEvent> {\n const byteStream = await this.createTurnStream(conversationId, request, options)\n for await (const frame of parseSSEFrames(byteStream)) {\n const event = parseTurnStreamFrame(frame.event, frame.data)\n if (event) yield event\n }\n }\n\n /** Build the real-time text WebSocket URL for browser or custom clients. */\n textStreamUrl(params: TextStreamUrlParams): string {\n const url = buildTextStreamUrl({\n baseUrl: this.agentBaseUrl ?? this.platformBaseUrl,\n workspaceId: this.workspaceId,\n ...params,\n })\n return url.toString()\n }\n\n /**\n * Build the URL for the workspace-scoped session-connect WebSocket\n * (``WS /v1/{workspace_id}/sessions/connect``).\n *\n * Pair the returned URL with {@link sessionConnectAuthProtocols} so the\n * bearer token is delivered via the ``Sec-WebSocket-Protocol`` header \u2014 the\n * endpoint rejects query-param tokens to keep credentials out of URLs.\n *\n * @example\n * ```ts\n * const url = client.conversations.sessionConnectUrl({\n * serviceId: SERVICE_ID,\n * entityId: ENTITY_ID,\n * conversationId: existingConversationId, // optional resume\n * });\n * const ws = new WebSocket(url, sessionConnectAuthProtocols(apiKey));\n * ```\n */\n sessionConnectUrl(params: SessionConnectUrlParams): string {\n const url = buildSessionConnectUrl({\n baseUrl: this.platformBaseUrl,\n workspaceId: this.workspaceId,\n ...params,\n })\n return url.toString()\n }\n}\n\n/**\n * Build browser WebSocket subprotocols for text-stream authentication.\n *\n * @remarks The returned tuple contains the raw API key. Do not log, persist,\n * serialize, or otherwise expose this value.\n *\n * @security The second subprotocol entry is the bearer secret.\n */\nexport function textStreamAuthProtocols(apiKey: string): TextStreamAuthProtocols {\n const token = validateTextStreamAuthToken(apiKey, 'apiKey')\n if (!WEB_SOCKET_PROTOCOL_TOKEN_RE.test(token)) {\n const invalidChars = describeInvalidSubprotocolChars(token)\n throw new ConfigurationError(\n `apiKey contains characters browsers reject in WebSocket subprotocols (${invalidChars}); use the token option on client.conversations.textStreamUrl() instead for keys containing these characters, only in trusted contexts where URLs are not logged in browser history, server access logs, HTTP proxy logs, or referrer headers`,\n )\n }\n return ['auth', token] as const\n}\n\n/**\n * Build browser WebSocket subprotocols for the workspace-scoped session-connect\n * endpoint (``WS /v1/{workspace_id}/sessions/connect``).\n *\n * The wire format is identical to {@link textStreamAuthProtocols} \u2014 both\n * endpoints expect ``Sec-WebSocket-Protocol: auth, <token>`` \u2014 but the\n * session-connect endpoint has no query-param token fallback, so the API key\n * MUST round-trip through this subprotocol pair. Keys containing characters\n * browsers reject in subprotocols (e.g. ``:``, ``/``, ``=``) cannot be used\n * with the session-connect endpoint and must instead use the legacy\n * ``textStreamUrl`` path.\n *\n * @remarks The returned tuple contains the raw API key. Do not log, persist,\n * serialize, or otherwise expose this value.\n *\n * @security The second subprotocol entry is the bearer secret.\n */\nexport function sessionConnectAuthProtocols(apiKey: string): TextStreamAuthProtocols {\n return textStreamAuthProtocols(apiKey)\n}\n\nfunction buildTextStreamUrl({\n baseUrl,\n workspaceId,\n serviceId,\n conversationId,\n entityId,\n toolEvents,\n token,\n textStreamUrl: textStreamUrlOverride,\n}: TextStreamUrlParams & { baseUrl: string; workspaceId: string }): URL {\n const url = textStreamUrlOverride\n ? parseTextStreamUrlOverride(textStreamUrlOverride)\n : deriveTextStreamUrl(baseUrl)\n url.searchParams.set('workspace_id', workspaceId)\n url.searchParams.set('service_id', serviceId)\n if (conversationId) url.searchParams.set('conversation_id', conversationId)\n if (entityId) url.searchParams.set('entity_id', entityId)\n if (toolEvents) url.searchParams.set('tool_events', 'true')\n if (token !== undefined)\n url.searchParams.set('token', validateTextStreamAuthToken(token, 'token'))\n return url\n}\n\nfunction validateTextStreamAuthToken(token: string, label: string): string {\n if (!token.trim()) {\n throw new ConfigurationError(`${label} is required for text-stream authentication`)\n }\n if (token.length > MAX_AUTH_TOKEN_CHARS || !TEXT_STREAM_AUTH_TOKEN_RE.test(token)) {\n throw new ConfigurationError(\n `${label} contains characters rejected by text-stream authentication`,\n )\n }\n return token\n}\n\nfunction parseTextStreamUrlOverride(textStreamUrl: string): URL {\n try {\n const url = new URL(textStreamUrl)\n if (url.protocol !== 'ws:' && url.protocol !== 'wss:') {\n throw new ConfigurationError('textStreamUrl overrides must use ws: or wss: URLs')\n }\n // Fragment rejection is defensive; WHATWG URL parsing normalizes most\n // WebSocket fragments away, but callers should never rely on fragments here.\n if (url.search || url.hash) {\n throw new ConfigurationError(\n 'textStreamUrl overrides must not include query parameters or fragments; pass SDK-managed fields through textStreamUrl() options',\n )\n }\n return url\n } catch (cause) {\n if (cause instanceof ConfigurationError) throw cause\n throw new ConfigurationError(\n `textStreamUrl must be an absolute URL for text-stream overrides: ${String(cause)}`,\n )\n }\n}\n\nfunction deriveTextStreamUrl(baseUrl: string): URL {\n if (!/^[a-z][a-z\\d+.-]*:\\/\\//i.test(baseUrl)) {\n throw new ConfigurationError(\n 'textStreamUrl cannot be derived from a relative baseUrl; pass agentBaseUrl or textStreamUrl explicitly',\n )\n }\n\n const url = new URL(baseUrl)\n if (url.protocol === 'ws:' || url.protocol === 'wss:') {\n // Already a WebSocket URL (e.g. from agentBaseUrl) \u2014 use directly\n } else if (url.protocol === 'http:' || url.protocol === 'https:') {\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n } else {\n throw new ConfigurationError(\n 'textStreamUrl can only be derived from an http, https, ws, or wss baseUrl; pass textStreamUrl explicitly',\n )\n }\n if (url.pathname !== '/' && url.pathname !== '') {\n throw new ConfigurationError(\n 'textStreamUrl can only be derived from an origin-only baseUrl; pass agentBaseUrl as an origin or textStreamUrl explicitly when using path-prefixed gateways',\n )\n }\n // Text streaming is served by agent-engine ingress, regardless of any REST\n // API path segments on the configured base URL.\n url.pathname = '/agent/text-stream'\n url.search = ''\n url.hash = ''\n return url\n}\n\nfunction buildSessionConnectUrl({\n baseUrl,\n workspaceId,\n serviceId,\n entityId,\n conversationId,\n toolEvents,\n sessionConnectUrl: sessionConnectUrlOverride,\n}: SessionConnectUrlParams & { baseUrl: string; workspaceId: string }): URL {\n const url = sessionConnectUrlOverride\n ? parseSessionConnectUrlOverride(sessionConnectUrlOverride)\n : deriveSessionConnectUrl(baseUrl, workspaceId)\n url.searchParams.set('service_id', serviceId)\n url.searchParams.set('entity_id', entityId)\n if (conversationId) url.searchParams.set('conversation_id', conversationId)\n // Server defaults tool_events to true. Only emit the param when the caller\n // explicitly disables it, so default URLs stay minimal and existing tests\n // can assert exact URLs without incidental query keys.\n if (toolEvents === false) url.searchParams.set('tool_events', 'false')\n return url\n}\n\nfunction parseSessionConnectUrlOverride(sessionConnectUrl: string): URL {\n try {\n const url = new URL(sessionConnectUrl)\n if (url.protocol !== 'ws:' && url.protocol !== 'wss:') {\n throw new ConfigurationError('sessionConnectUrl overrides must use ws: or wss: URLs')\n }\n if (url.search || url.hash) {\n throw new ConfigurationError(\n 'sessionConnectUrl overrides must not include query parameters or fragments; pass SDK-managed fields through sessionConnectUrl() options',\n )\n }\n return url\n } catch (cause) {\n if (cause instanceof ConfigurationError) throw cause\n throw new ConfigurationError(\n `sessionConnectUrl must be an absolute URL for session-connect overrides: ${String(cause)}`,\n )\n }\n}\n\nfunction deriveSessionConnectUrl(baseUrl: string, workspaceId: string): URL {\n if (!/^[a-z][a-z\\d+.-]*:\\/\\//i.test(baseUrl)) {\n throw new ConfigurationError(\n 'sessionConnectUrl cannot be derived from a relative baseUrl; pass sessionConnectUrl explicitly',\n )\n }\n\n const url = new URL(baseUrl)\n if (url.protocol === 'ws:' || url.protocol === 'wss:') {\n // Already a WebSocket URL \u2014 use directly.\n } else if (url.protocol === 'http:' || url.protocol === 'https:') {\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n } else {\n throw new ConfigurationError(\n 'sessionConnectUrl can only be derived from an http, https, ws, or wss baseUrl; pass sessionConnectUrl explicitly',\n )\n }\n if (url.pathname !== '/' && url.pathname !== '') {\n throw new ConfigurationError(\n 'sessionConnectUrl can only be derived from an origin-only baseUrl; pass sessionConnectUrl explicitly when using path-prefixed gateways',\n )\n }\n url.pathname = `/v1/${workspaceId}/sessions/connect`\n url.search = ''\n url.hash = ''\n return url\n}\n\nfunction describeInvalidSubprotocolChars(token: string): string {\n const chars = new Set<string>()\n for (const char of token) {\n // Single-character regex checks are intentional: the regex is anchored for\n // full-token validation, and here we need only the offending characters.\n if (!WEB_SOCKET_PROTOCOL_TOKEN_RE.test(char)) chars.add(char)\n }\n return [...chars].map((char) => JSON.stringify(char)).join(', ')\n}\n\n// ---------------------------------------------------------------------------\n// Inline SSE parser\n//\n// Implemented inline rather than depending on `eventsource-parser` so the SDK\n// stays at two runtime deps (`openapi-fetch`, `openapi-typescript-helpers`).\n// SSE is simple enough that a ~30-line state machine reads cleaner than a\n// transitive bundle increase. Spec: https://html.spec.whatwg.org/multipage/server-sent-events.html\n// (handled fields: `event`, `data`; comments and `id`/`retry` are ignored).\n// ---------------------------------------------------------------------------\n\ninterface SSEFrame {\n event: string\n data: string\n}\n\nasync function* parseSSEFrames(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<SSEFrame> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n function* drain(text: string): Generator<SSEFrame> {\n buffer += text\n // Frames are terminated by a blank line (\\n\\n or \\r\\n\\r\\n).\n while (true) {\n const idx = findFrameTerminator(buffer)\n if (idx === null) break\n const block = buffer.slice(0, idx.terminatorStart)\n buffer = buffer.slice(idx.terminatorEnd)\n const frame = parseSSEBlock(block)\n if (frame) yield frame\n }\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n yield* drain(decoder.decode(value, { stream: true }))\n }\n // Flush any partial decode + handle a final frame missing the trailing\n // blank line (defensive \u2014 well-behaved servers always terminate).\n yield* drain(decoder.decode())\n if (buffer.trim().length > 0) {\n const frame = parseSSEBlock(buffer)\n if (frame) yield frame\n buffer = ''\n }\n } finally {\n reader.releaseLock()\n }\n}\n\nfunction findFrameTerminator(\n s: string,\n): { terminatorStart: number; terminatorEnd: number } | null {\n // Prefer LF-LF; fall back to CRLF-CRLF if the server is using CRLF\n // line endings end-to-end.\n const lf = s.indexOf('\\n\\n')\n const crlf = s.indexOf('\\r\\n\\r\\n')\n if (lf < 0 && crlf < 0) return null\n if (lf < 0) return { terminatorStart: crlf, terminatorEnd: crlf + 4 }\n if (crlf < 0) return { terminatorStart: lf, terminatorEnd: lf + 2 }\n return lf < crlf\n ? { terminatorStart: lf, terminatorEnd: lf + 2 }\n : { terminatorStart: crlf, terminatorEnd: crlf + 4 }\n}\n\nfunction parseSSEBlock(block: string): SSEFrame | null {\n let event = ''\n const dataLines: string[] = []\n for (const line of block.split(/\\r?\\n/)) {\n if (line === '' || line.startsWith(':')) continue\n const colon = line.indexOf(':')\n const field = colon < 0 ? line : line.slice(0, colon)\n let value = colon < 0 ? '' : line.slice(colon + 1)\n if (value.startsWith(' ')) value = value.slice(1)\n if (field === 'event') event = value\n else if (field === 'data') dataLines.push(value)\n // `id`, `retry`, and unknown fields are ignored \u2014 we only need the\n // discriminator + payload for the typed event surface.\n }\n if (!event || dataLines.length === 0) return null\n return { event, data: dataLines.join('\\n') }\n}\n\n// ---------------------------------------------------------------------------\n// TurnStreamEvent frame validator\n//\n// Drift-tolerant: an unknown `event` discriminator or a non-object payload\n// is dropped silently (matches the behavior of the lower-level\n// `createTurnStream` plus consumer-side parsing). The strict\n// `TurnStreamEvent` static contract is preserved for downstream callers\n// because we only yield values whose `event` discriminator is one of the\n// known union members.\n// ---------------------------------------------------------------------------\n\nconst KNOWN_TURN_STREAM_EVENTS: ReadonlySet<TurnStreamEvent['event']> = new Set([\n 'token',\n 'thinking',\n 'tool_call_started',\n 'tool_call_completed',\n 'message',\n 'done',\n 'error',\n])\n\nfunction parseTurnStreamFrame(eventName: string, dataJson: string): TurnStreamEvent | null {\n if (!(KNOWN_TURN_STREAM_EVENTS as ReadonlySet<string>).has(eventName)) return null\n let payload: unknown\n try {\n payload = JSON.parse(dataJson)\n } catch {\n return null\n }\n if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) return null\n // Server omits the discriminator from the JSON body (it lives in the SSE\n // `event:` line). Reattach it so the union member is well-formed.\n return { ...(payload as Record<string, unknown>), event: eventName } as TurnStreamEvent\n}\n\n", "/**\n * SES setup resource \u2014 workspace-scoped CRUD over the channel-manager-backed\n * SES setup proxy at ``/v1/{workspace_id}/channels/ses-setup``.\n *\n * Use SES setups to register a verified sending domain (e.g.\n * ``mail.acme.com``) that can then back one or more email use cases. The\n * caller publishes the returned DNS records (DKIM CNAMEs, MX, DMARC TXT)\n * at their DNS provider; subsequent ``get`` or ``verify`` calls re-run the\n * live DNS lookup and update each record's ``verified`` flag.\n */\n\nimport type { components } from '../../generated/api.js'\nimport type { ListParams } from '../../core/utils.js'\nimport { WorkspaceScopedResource, extractData } from '../base.js'\n\n// Re-export the generated schema types verbatim \u2014 never hand-roll a parallel\n// shape that drifts from openapi.json. Naming preserved at the package root\n// so the public API surface matches the SDK convention (drop the `Response`\n// suffix; consumers think in terms of resource shapes, not REST artifacts).\nexport type CreateSesSetupRequest = components['schemas']['CreateSesSetupRequest']\nexport type SesSetupDetail = components['schemas']['SesSetupDetailResponse']\nexport type SesSetupListItem = components['schemas']['SesSetupListItemResponse']\nexport type DnsRecord = components['schemas']['DnsRecordResponse']\n// Named alias for the paginated list response so consumers can annotate\n// variables with the public type rather than reaching into the generated\n// schema by string. The underlying schema name is openapi-typescript's\n// double-underscore encoding of FastAPI's parameterized generic; aliasing\n// it here gives us a stable rename point if the generator output shifts.\nexport type SesSetupListResponse =\n components['schemas']['PaginatedResponse_SesSetupListItemResponse_']\n\n// Compile-time guard: pin the required fields the SDK depends on so a\n// generator rename of the double-underscore-encoded schema (or a\n// degradation that collapses the type to ``any``) fails at build time\n// rather than silently letting drift land on consumers.\n//\n// Design notes for the next person to extend this:\n//\n// 1. ``IsAny<T>`` rejection comes first \u2014 a one-way ``extends`` lets\n// ``any`` slip through (``any`` extends everything). If the\n// generator ever degrades this schema to ``any`` we want a hard\n// compile error rather than a silent loss of typing.\n//\n// 2. The structural check is **one-way** (``[T] extends [Shape]``)\n// on purpose \u2014 additive optional fields the generator might\n// introduce (``total``, ``next_cursor``, etc.) are tolerated\n// because they don't break the SDK contract. A bidirectional\n// \"exact\" check would force a guard update on every additive\n// schema change and is the wrong semantic for forward-compatible\n// public types.\n//\n// 3. The failure branch is a string-literal type, not ``never`` \u2014\n// so when the guard does fire, the TypeScript error reads\n// \"Type 'true' is not assignable to type\n// 'SesSetupListResponse no longer matches \u2026'\" instead of the\n// opaque \"Type 'boolean' is not assignable to type 'never'\".\n// Future guards in other resources should follow the same\n// template.\ntype IsAny<T> = 0 extends 1 & T ? true : false\ntype GUARD_FAILURE_MESSAGE =\n 'SesSetupListResponse no longer matches the expected paginated shape ({ items, has_more, continuation_token? }) \u2014 has openapi-typescript renamed the generic encoding, or did the API drop a load-bearing field? Update the alias on line ~30 and this guard together.'\ntype AssertSchemaShape<T, Shape> = IsAny<T> extends true\n ? GUARD_FAILURE_MESSAGE\n : [T] extends [Shape]\n ? true\n : GUARD_FAILURE_MESSAGE\nconst _SES_SETUP_LIST_RESPONSE_GUARD: AssertSchemaShape<\n SesSetupListResponse,\n {\n items: SesSetupListItem[]\n has_more: boolean\n continuation_token?: number | null\n }\n> = true\nvoid _SES_SETUP_LIST_RESPONSE_GUARD\n\nexport class SesSetupResource extends WorkspaceScopedResource {\n /**\n * Create an SES tenant + verified domain identity for this workspace.\n *\n * Returns the DNS records the customer must publish at their DNS provider.\n * The setup is unusable for sending until every record's ``verified`` flag\n * flips to ``true`` (call ``verify`` after publishing DNS to refresh).\n */\n async create(body: CreateSesSetupRequest): Promise<SesSetupDetail> {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/channels/ses-setup', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /**\n * List SES setups owned by this workspace.\n *\n * Each item carries the cached ``dns_verified`` aggregate; call ``get``\n * for per-record DNS detail.\n */\n async list(params?: ListParams): Promise<SesSetupListResponse> {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/channels/ses-setup', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Auto-paginating async iterable over every SES setup in the workspace. */\n listAutoPaging(params?: ListParams): AsyncGenerator<SesSetupListItem> {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /**\n * Get an SES setup with a live DNS verification refresh.\n *\n * Channel-manager re-runs ``GetEmailIdentity`` + DMARC/MX resolvers on\n * every call, so each ``get`` is a live check rather than a cache read.\n */\n async get(setupId: string): Promise<SesSetupDetail> {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/channels/ses-setup/{setup_id}', {\n params: { path: { workspace_id: this.workspaceId, setup_id: setupId } },\n }),\n )\n }\n\n /**\n * Explicit DNS refresh \u2014 equivalent to ``get`` but exposed as a POST so UI\n * \"Verify now\" actions read as actions rather than reads.\n */\n async verify(setupId: string): Promise<SesSetupDetail> {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/channels/ses-setup/{setup_id}/verify', {\n params: { path: { workspace_id: this.workspaceId, setup_id: setupId } },\n }),\n )\n }\n\n /**\n * Tear down the upstream SES tenant + identity and soft-delete the\n * workspace binding. Throws ``ConflictError`` (HTTP 409) if any use case\n * still references the setup \u2014 delete those use cases first.\n *\n * Routed through ``extractData`` so 4xx/5xx responses surface as typed\n * SDK errors (matching every other resource's ``delete``); the\n * ``ConflictError`` mapping fires here instead of relying on the\n * underlying client's accidental throw.\n */\n async delete(setupId: string): Promise<void> {\n return extractData(\n await this.client.DELETE('/v1/{workspace_id}/channels/ses-setup/{setup_id}', {\n params: { path: { workspace_id: this.workspaceId, setup_id: setupId } },\n }),\n )\n }\n}\n", "/**\n * Channels namespace \u2014 workspace-scoped CRUD over the channel-manager-backed\n * proxy mounted at ``/v1/{workspace_id}/channels/...`` on platform-api.\n *\n * Each subresource (``sesSetup``, future ``twilioSetup``, ``email``, etc.)\n * lands in its own module; this barrel composes them onto a single\n * ``ChannelsResource`` so callers can write\n * ``client.channels.sesSetup.create(...)``.\n *\n * Extends ``WorkspaceScopedResource`` so ``client.channels.withOptions(...)``\n * matches the universal pattern documented in api.md. The inherited\n * ``withOptions`` reconstructs ``ChannelsResource`` with a scoped\n * ``PlatformFetch`` client; the constructor below forwards that scoped\n * client into a fresh ``SesSetupResource``, so the scoped headers /\n * timeout / retry flow through to subresource calls automatically.\n */\n\nimport type { PlatformFetch } from '../../core/openapi-client.js'\nimport { WorkspaceScopedResource } from '../base.js'\nimport { SesSetupResource } from './ses-setup.js'\n\nexport { SesSetupResource } from './ses-setup.js'\nexport type {\n CreateSesSetupRequest,\n DnsRecord,\n SesSetupDetail,\n SesSetupListItem,\n SesSetupListResponse,\n} from './ses-setup.js'\n\nexport class ChannelsResource extends WorkspaceScopedResource {\n readonly sesSetup: SesSetupResource\n\n constructor(client: PlatformFetch, workspaceId: string) {\n super(client, workspaceId)\n this.sesSetup = new SesSetupResource(client, workspaceId)\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { PhoneNumberId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\n/**\n * Manage phone numbers \u2014 provision, configure, and release Twilio numbers\n * that are attached to agents for inbound/outbound calling.\n */\nexport class PhoneNumbersResource extends WorkspaceScopedResource {\n /** Create a new phone number */\n async provision(body: components['schemas']['CreatePhoneNumberRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/phone-numbers', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List phone numbers in the workspace */\n async list(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/phone-numbers', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a phone number */\n async get(phoneNumberId: PhoneNumberId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/phone-numbers/{phone_number_id}', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n }),\n )\n }\n\n /** Update a phone number (assign to agent, rename) */\n async update(\n phoneNumberId: PhoneNumberId | string,\n body: components['schemas']['UpdatePhoneNumberRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/phone-numbers/{phone_number_id}', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n body,\n }),\n )\n }\n\n /** Release a phone number back to the carrier */\n async release(phoneNumberId: PhoneNumberId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/phone-numbers/{phone_number_id}', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n })\n }\n\n /** Set call forwarding for a phone number */\n async setForwarding(\n phoneNumberId: PhoneNumberId | string,\n body: components['schemas']['ForwardingConfigRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/phone-numbers/{phone_number_id}/forwarding', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n body,\n }),\n )\n }\n\n /** Clear call forwarding for a phone number */\n async clearForwarding(phoneNumberId: PhoneNumberId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/phone-numbers/{phone_number_id}/forwarding', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n })\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { IntegrationId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListIntegrationsParams extends ListParams {\n protocol?: string\n enabled?: boolean\n search?: string\n}\n\n/**\n * Manage integrations \u2014 connections to external systems (EHRs, CRMs, etc.).\n * Integrations power connector data acquisition and skill tool calls.\n */\nexport class IntegrationsResource extends WorkspaceScopedResource {\n /** Create a new integration */\n async create(body: components['schemas']['CreateIntegrationRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/integrations', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List integrations */\n async list(params?: ListIntegrationsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/integrations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListIntegrationsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single integration */\n async get(integrationId: IntegrationId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/integrations/{integration_id}', {\n params: { path: { workspace_id: this.workspaceId, integration_id: integrationId } },\n }),\n )\n }\n\n /** Update integration configuration */\n async update(\n integrationId: IntegrationId | string,\n body: components['schemas']['UpdateIntegrationRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/integrations/{integration_id}', {\n params: { path: { workspace_id: this.workspaceId, integration_id: integrationId } },\n body,\n }),\n )\n }\n\n /** Delete an integration */\n async delete(integrationId: IntegrationId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/integrations/{integration_id}', {\n params: { path: { workspace_id: this.workspaceId, integration_id: integrationId } },\n })\n }\n\n /**\n * Test a specific endpoint on an integration with given params.\n * Used in the developer console to validate integration config.\n */\n async testEndpoint(\n integrationId: IntegrationId | string,\n endpointName: string,\n body: components['schemas']['TestEndpointRequest'],\n ) {\n return extractData(\n await this.client.POST(\n '/v1/{workspace_id}/integrations/{integration_id}/endpoints/{endpoint_name}/test',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n integration_id: integrationId,\n endpoint_name: endpointName,\n },\n },\n body,\n },\n ),\n )\n }\n\n\n /**\n * Probe an integration's connection + auth without invoking any specific\n * endpoint. Exercises auth resolution end-to-end (SSM lookups, OAuth2 token\n * mints, JWT signing) and sends a HEAD request to ``base_url`` (REST/FHIR)\n * or ``mcp_url`` (MCP). Safe on production integrations \u2014 HEAD carries no\n * side effects.\n *\n * The most recent probe outcome is persisted on the integration so\n * subsequent ``get`` / ``list`` responses surface ``last_tested_at`` +\n * ``last_test_status`` without re-probing.\n *\n * @returns ``status`` is one of ``healthy`` / ``auth_failed`` /\n * ``unreachable`` / ``timeout`` / ``ssl_error`` / ``misconfigured``,\n * each mapping to a distinct, actionable user message.\n */\n async testConnection(integrationId: IntegrationId | string) {\n return extractData(\n await this.client.POST(\n '/v1/{workspace_id}/integrations/{integration_id}/test-connection',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n integration_id: integrationId,\n },\n },\n },\n ),\n )\n }\n\n /** Check health of all integrations in the workspace */\n async getHealthCheck() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/integrations/health-check', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Analytics \u2014 aggregate metrics about calls, agents, quality, and usage.\n */\nexport class AnalyticsResource extends WorkspaceScopedResource {\n /** High-level dashboard summary \u2014 pass `days` (default: 7) for the lookback window */\n async getDashboard(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/dashboard', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Call volume and duration metrics */\n async getCalls(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/calls', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Per-agent performance breakdown */\n async getAgents(params?: { period?: string }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/agents', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Call quality \u2014 sentiment, transcription confidence, flagged calls */\n async getCallQuality(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/call-quality', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Emotion trend data over time */\n async getEmotionTrends(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/emotion-trends', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Voice pipeline latency metrics (TTFB, response time) */\n async getLatency(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/latency', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Tool call performance \u2014 success rates and latency per tool */\n async getToolPerformance(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/tool-performance', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Data quality metrics for the workspace world model */\n async getDataQuality(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/data-quality', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Usage summary \u2014 API requests, call minutes, storage */\n async getUsage(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n direction?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/usage', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Event type breakdown \u2014 counts and trends per event type */\n async getEventBreakdown(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/events', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Safety and escalation trends \u2014 risk distribution and time-series data */\n async getSafetyTrends(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/safety-trends', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Operator escalation performance and quality comparison */\n async getOperatorPerformance(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/operator-performance', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Advanced call statistics (abandonment, transfers, silence, hour-of-day) */\n async getAdvancedCallStats(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/calls/advanced', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Compare two time periods side by side */\n async compareCallPeriods(params: {\n current_from: string\n current_to: string\n previous_from: string\n previous_to: string\n service_id?: string\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/calls/comparison', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /**\n * Surfaces analytics \u2014 completion rates, channel effectiveness, field\n * abandonment, and per-entity breakdowns. Used by the developer console's\n * surfaces analytics tab.\n */\n readonly surfaces = {\n getCompletionRates: async (params?: { days?: number }) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/surfaces/completion-rates', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n getChannelEffectiveness: async (params?: { days?: number }) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/surfaces/channel-effectiveness', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n getFieldAbandonment: async (params?: { days?: number }) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/surfaces/field-abandonment', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n /** Per-entity surfaces analytics (which surfaces a specific entity has seen) */\n getForEntity: async (entityId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/surfaces/entity/{entity_id}', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n ),\n }\n}\n", "import type { components, paths } from '../generated/api.js'\nimport type { ServiceId, SimulationRunId, SimulationSessionId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n// Module-private alias over the platform-keyed schema name\n// `src__routes__simulations__CreateSessionRequest`. Same rationale as\n// `desktop-sessions.ts`: keep it unexported so the Python-module prefix\n// doesn't reach the published `.d.ts`.\ntype CreateSimulationSessionRequest =\n components['schemas']['src__routes__simulations__CreateSessionRequest']\n\nexport type ListSimulationRunsParams = NonNullable<\n paths['/v1/{workspace_id}/simulations/runs']['get']['parameters']['query']\n>\n\n/**\n * Simulations \u2014 interactive agent testing via the Playground.\n *\n * Create a session to get the agent's greeting, then step through the\n * conversation turn by turn. Get LLM-generated caller suggestions to\n * guide exploratory testing.\n */\nexport class SimulationsResource extends WorkspaceScopedResource {\n /** Start a simulation session \u2014 returns the agent's greeting and initial snapshot */\n async createSession(\n body: CreateSimulationSessionRequest,\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/sessions', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Get the current snapshot of a session */\n async getSession(sessionId: SimulationSessionId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/sessions/{session_id}', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n\n /** Delete a simulation session */\n async deleteSession(sessionId: SimulationSessionId | string) {\n return extractData(\n await this.client.DELETE('/v1/{workspace_id}/simulations/sessions/{session_id}', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n\n /**\n * Send a caller utterance and advance the session by one turn.\n * Returns the agent's response observation and updated snapshot.\n */\n async step(body: components['schemas']['StepRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/sessions/step', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /**\n * Get LLM-generated caller message suggestions for the current session state.\n * Helps exploratory testing by suggesting realistic next caller turns.\n */\n async recommend(body: components['schemas']['RecommendRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/sessions/recommend', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Get AI-generated call intelligence for a completed session */\n async getIntelligence(sessionId: SimulationSessionId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/sessions/{session_id}/intelligence', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n\n /**\n * Multi-session simulation runs \u2014 orchestrate a batch of scenarios against\n * a service to compute coverage and surface regressions. Use this when you\n * want to compare branch behavior or measure drift between versions.\n *\n * @beta New in this release; surface may evolve.\n */\n readonly runs = {\n /** List simulation runs in the workspace */\n list: async (params?: ListSimulationRunsParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/runs', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n /** Create a new simulation run */\n create: async (body: components['schemas']['CreateRunRequest']) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/runs', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n\n /** Get a simulation run with its scenarios + status */\n get: async (runId: SimulationRunId | string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/runs/{run_id}', {\n params: { path: { workspace_id: this.workspaceId, run_id: runId } },\n }),\n ),\n\n /** Mark a run as complete (used by the harness once all sessions finish) */\n complete: async (runId: SimulationRunId | string) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/runs/{run_id}/complete', {\n params: { path: { workspace_id: this.workspaceId, run_id: runId } },\n }),\n ),\n\n /** Spin up a session under a run (single scenario inside the run's batch) */\n createSession: async (\n runId: SimulationRunId | string,\n body: CreateSimulationSessionRequest,\n ) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/runs/{run_id}/sessions', {\n params: { path: { workspace_id: this.workspaceId, run_id: runId } },\n body,\n }),\n ),\n }\n\n /**\n * Bridge \u2014 convert recorded production calls into simulation scenarios so\n * they can be replayed against a candidate version. ``plan`` returns a\n * preview of which calls would be selected; ``run`` executes the plan.\n */\n readonly bridge = {\n /** Plan a bridge run \u2014 returns the candidate scenarios without executing */\n plan: async (body: components['schemas']['BridgePlanRequest']) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/bridge/plan', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n\n /** Execute a bridge run and return the resulting run handle */\n run: async (body: components['schemas']['BridgeRequest']) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/bridge', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n /**\n * Per-service simulation views \u2014 graph of explored conversation paths,\n * recorded sessions, and per-turn telemetry. Used by the developer console's\n * coverage tab to visualize what scenarios have been exercised.\n */\n readonly services = {\n /** Get the conversation graph (nodes/edges) for a service */\n getGraph: async (serviceId: ServiceId | string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/services/{service_id}/graph', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n }),\n ),\n\n /** Reset / delete the service's accumulated graph */\n deleteGraph: async (serviceId: ServiceId | string) =>\n extractData(\n await this.client.DELETE('/v1/{workspace_id}/simulations/services/{service_id}/graph', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n }),\n ),\n\n /** Get the set of explored conversation paths through the graph */\n getGraphPaths: async (serviceId: ServiceId | string) =>\n extractData(\n await this.client.GET(\n '/v1/{workspace_id}/simulations/services/{service_id}/graph/paths',\n {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n },\n ),\n ),\n\n /** List recorded sessions for the service */\n listSessions: async (serviceId: ServiceId | string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/services/{service_id}/sessions', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n }),\n ),\n\n /** List per-turn observations for the service */\n listTurns: async (serviceId: ServiceId | string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/services/{service_id}/turns', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n }),\n ),\n }\n}\n", "import type { components, operations } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type MetricCatalogEntry = components['schemas']['MetricCatalogEntry']\nexport type MetricCatalogResponse = components['schemas']['MetricCatalogResponse']\nexport type MetricListResponse = components['schemas']['MetricListResponse']\nexport type NumericalMetricValue = components['schemas']['NumericalMetricValueResponse']\nexport type CategoricalMetricValue = components['schemas']['CategoricalMetricValueResponse']\nexport type BooleanMetricValue = components['schemas']['BooleanMetricValueResponse']\nexport type MetricValue = NumericalMetricValue | CategoricalMetricValue | BooleanMetricValue\n/** @deprecated Use `MetricValue` instead. */\nexport type MetricValueResponse = MetricValue\nexport type MetricValuesParams = NonNullable<operations['get-metric-values']['parameters']['query']>\nexport type MetricTrendParams = NonNullable<operations['get-metric-trend']['parameters']['query']>\n\n/**\n * Metrics \u2014 computed metric catalog and typed metric values.\n */\nexport class MetricsResource extends WorkspaceScopedResource {\n /** List the latest value for each metric in the workspace */\n async listLatest() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/metrics', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** List available built-in and custom metric definitions */\n async getCatalog() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/metrics/catalog', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get stored values for one metric key, optionally bounded by time range */\n async getValues(metricKey: string, params?: MetricValuesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/metrics/{metric_key}', {\n params: {\n path: { workspace_id: this.workspaceId, metric_key: metricKey },\n query: params,\n },\n }),\n )\n }\n\n /** Get a recent time-series trend for one metric key */\n async getTrend(metricKey: string, params?: MetricTrendParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/metrics/{metric_key}/trend', {\n params: {\n path: { workspace_id: this.workspaceId, metric_key: metricKey },\n query: params,\n },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Workspace-level settings \u2014 configure voice behavior, branding, security\n * policies, data retention, outreach rules, and more.\n *\n * Each sub-resource has `get()` and `update()`.\n */\nexport class SettingsResource extends WorkspaceScopedResource {\n readonly voice = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/voice', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['VoiceSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/voice', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly branding = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/branding', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['BrandingSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/branding', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly outreach = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/outreach', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['OutreachSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/outreach', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly memory = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/memory', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['MemorySettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/memory', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly security = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/security', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['SecuritySettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/security', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly retention = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/retention', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['RetentionPolicyRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/retention', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly behaviors = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/behaviors', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['BehaviorSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/behaviors', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly gapScanner = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/gap-scanner', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['GapScannerSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/gap-scanner', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n /**\n * Preview which calls would be flagged by the current gap-scanner config.\n *\n * The spec types the body as `GapScannerPreviewRequest | null`, but the\n * `null` branch only matters when the caller wants to *explicitly* clear\n * the body. Modeling as `body?: GapScannerPreviewRequest` keeps the SDK\n * surface consistent with every other POST wrapper; consumers who need\n * to send the literal `null` can do so via `client.POST(...)` directly.\n */\n preview: async (body?: components['schemas']['GapScannerPreviewRequest']) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/settings/gap-scanner/preview', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n /** Trigger an on-demand scan with the current gap-scanner config */\n scan: async () =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/settings/gap-scanner/scan', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n }\n\n readonly metrics = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/metrics', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['MetricSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/metrics', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly environments = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/environments', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['EnvironmentSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/environments', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly workflows = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/workflows', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['WorkflowSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/workflows', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListInvoicesParams extends ListParams {\n status?: 'draft' | 'sent' | 'paid' | 'void'\n date_from?: string\n date_to?: string\n}\n\nexport interface UsageTrendsParams {\n days?: number\n date_from?: string\n date_to?: string\n meter_key?: string\n}\n\n/**\n * Billing \u2014 dashboard, usage summaries, invoices, and usage trends.\n */\nexport class BillingResource extends WorkspaceScopedResource {\n /** Get composite billing dashboard \u2014 KPIs, period comparison, top meters, invoice summary */\n async getDashboard() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/dashboard', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get usage summary for the workspace */\n async getUsage() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/usage', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get usage time-series per meter for trend charts */\n async getUsageTrends(params?: UsageTrendsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/usage/trends', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** List invoices for the workspace */\n async listInvoices(params?: ListInvoicesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/invoices', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listInvoicesAutoPaging(params?: ListInvoicesParams) {\n return this.iteratePaginatedList((pageParams) => this.listInvoices(pageParams), params)\n }\n\n /** Get invoice detail */\n async getInvoice(invoiceId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/invoices/{invoice_id}', {\n params: { path: { workspace_id: this.workspaceId, invoice_id: invoiceId } },\n }),\n )\n }\n\n /** Get presigned S3 URL for invoice PDF download */\n async getInvoicePdf(invoiceId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/invoices/{invoice_id}/pdf', {\n params: { path: { workspace_id: this.workspaceId, invoice_id: invoiceId } },\n }),\n )\n }\n}\n", "import type { EntityId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Agent Memory \u2014 structured long-term memory for entities.\n *\n * Memory is organised into dimensions (e.g. \"preferences\", \"health_history\").\n * Each dimension accumulates facts extracted from calls and events over time.\n * This powers the \"Agent Memory\" view in the console.\n */\nexport class MemoryResource extends WorkspaceScopedResource {\n /**\n * Get all memory dimension scores for an entity.\n * Scores reflect how complete and confident each dimension's facts are.\n */\n async getEntityDimensions(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/memory/{entity_id}/dimensions', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /**\n * Get individual memory facts for an entity, optionally filtered by dimension.\n */\n async getEntityFacts(\n entityId: EntityId | string,\n params?: { dimension?: string; limit?: number },\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/memory/{entity_id}/facts', {\n params: {\n path: { workspace_id: this.workspaceId, entity_id: entityId },\n query: params,\n },\n }),\n )\n }\n\n /**\n * Get workspace-level memory analytics \u2014 coverage rates, dimension health,\n * and fact ingestion trends.\n */\n async getAnalytics() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/memory/analytics', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { PersonaId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListPersonasParams extends ListParams {\n search?: string | null\n sort_by?: string | null\n}\n\nexport class PersonasResource extends WorkspaceScopedResource {\n async list(params?: ListPersonasParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/personas', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListPersonasParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async create(body: components['schemas']['CreatePersonaRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/personas', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async get(personaId: PersonaId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/personas/{persona_id}', {\n params: { path: { workspace_id: this.workspaceId, persona_id: personaId } },\n }),\n )\n }\n\n async update(personaId: PersonaId | string, body: components['schemas']['UpdatePersonaRequest']) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/personas/{persona_id}', {\n params: { path: { workspace_id: this.workspaceId, persona_id: personaId } },\n body,\n }),\n )\n }\n\n async delete(personaId: PersonaId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/personas/{persona_id}', {\n params: { path: { workspace_id: this.workspaceId, persona_id: personaId } },\n })\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListReviewItemsParams extends ListParams {\n status?: string | null\n entity_type?: string | null\n priority?: number | null\n reason?: string | null\n assigned_to?: string | null\n created_after?: string | null\n created_before?: string | null\n sort_by?: string | null\n sort_order?: string\n}\n\nexport interface ReviewHistoryParams extends ListParams {\n action?: string | null\n reviewed_by?: string | null\n completed_after?: string | null\n completed_before?: string | null\n}\n\nexport class ReviewQueueResource extends WorkspaceScopedResource {\n async list(params?: ListReviewItemsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListReviewItemsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(itemId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/{item_id}', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n\n async getStats() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/stats', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getDashboard() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/dashboard', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getMyQueue(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/my-queue', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getMyQueueAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.getMyQueue(pageParams), params)\n }\n\n async approve(itemId: string, body: components['schemas']['ApproveRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/approve', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n body,\n }),\n )\n }\n\n async reject(itemId: string, body: components['schemas']['RejectRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/reject', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n body,\n }),\n )\n }\n\n async claim(itemId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/claim', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n\n async unclaim(itemId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/unclaim', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n\n async correct(itemId: string, body: components['schemas']['CorrectRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/correct', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n body,\n }),\n )\n }\n\n async batchApprove(body: components['schemas']['BatchApproveRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/batch-approve', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async batchReject(body: components['schemas']['BatchRejectRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/batch-reject', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async getHistory(params?: ReviewHistoryParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/history', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getHistoryAutoPaging(params?: ReviewHistoryParams) {\n return this.iteratePaginatedList((pageParams) => this.getHistory(pageParams), params)\n }\n\n async getTrends(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/trends', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getPerformance(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/performance', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getCorrectionSchema(itemId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/{item_id}/correction-schema', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n\n async getDiff(itemId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/{item_id}/diff', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\nexport class RecordingsResource extends WorkspaceScopedResource {\n async getUrls(callSid: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/recordings/{call_sid}/urls', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid } },\n }),\n )\n }\n\n async getMetadata(callSid: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/recordings/{call_sid}/metadata', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid } },\n }),\n )\n }\n\n async download(callSid: string, filename: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/recordings/{call_sid}/download/{filename}', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid, filename } },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport interface ListAuditParams {\n service?: string | null\n action?: string | null\n actor_entity_id?: string | null\n resource_type?: string | null\n resource_id?: string | null\n phi_only?: boolean\n date_from?: string | null\n date_to?: string | null\n limit?: number\n offset?: number\n}\n\nexport interface PhiAccessParams {\n entity_id?: string | null\n date_from?: string | null\n date_to?: string | null\n limit?: number\n offset?: number\n}\n\nexport interface EntityAccessLogParams {\n date_from?: string | null\n date_to?: string | null\n limit?: number\n offset?: number\n}\n\nexport class AuditResource extends WorkspaceScopedResource {\n async list(params?: ListAuditParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListAuditParams) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.list(pageParams),\n (page) => page.events,\n params,\n )\n }\n\n async getSummary(params?: { date_from?: string | null; date_to?: string | null }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit/summary', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getPhiAccess(params?: PhiAccessParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit/phi-access', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getPhiAccessAutoPaging(params?: PhiAccessParams) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getPhiAccess(pageParams),\n (page) => page.events,\n params,\n )\n }\n\n async createExport(body: components['schemas']['AuditExportRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/audit/export', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async listExports() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit/exports', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getEntityAccessLog(entityId: string, params?: EntityAccessLogParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit/entity/{entity_id}/access-log', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId }, query: params },\n }),\n )\n }\n\n getEntityAccessLogAutoPaging(entityId: string, params?: EntityAccessLogParams) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getEntityAccessLog(entityId, pageParams),\n (page) => page.events,\n params,\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport class WebhookDestinationsResource extends WorkspaceScopedResource {\n async list(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/webhook-destinations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async create(body: components['schemas']['CreateWebhookDestinationRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/webhook-destinations', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async get(destinationId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/webhook-destinations/{destination_id}', {\n params: { path: { workspace_id: this.workspaceId, destination_id: destinationId } },\n }),\n )\n }\n\n async update(\n destinationId: string,\n body: components['schemas']['UpdateWebhookDestinationRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/webhook-destinations/{destination_id}', {\n params: { path: { workspace_id: this.workspaceId, destination_id: destinationId } },\n body,\n }),\n )\n }\n\n async delete(destinationId: string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/webhook-destinations/{destination_id}', {\n params: { path: { workspace_id: this.workspaceId, destination_id: destinationId } },\n })\n }\n\n async listDeliveries(destinationId: string, params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/webhook-destinations/{destination_id}/deliveries', {\n params: {\n path: { workspace_id: this.workspaceId, destination_id: destinationId },\n query: params,\n },\n }),\n )\n }\n\n listDeliveriesAutoPaging(destinationId: string, params?: ListParams) {\n return this.iteratePaginatedList(\n (pageParams) => this.listDeliveries(destinationId, pageParams),\n params,\n )\n }\n\n async rotateSecret(destinationId: string) {\n return extractData(\n await this.client.POST(\n '/v1/{workspace_id}/webhook-destinations/{destination_id}/rotate-secret',\n {\n params: { path: { workspace_id: this.workspaceId, destination_id: destinationId } },\n },\n ),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport class SafetyResource extends WorkspaceScopedResource {\n async getConfig() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/safety/config', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async updateConfig(body: components['schemas']['UpdateSafetyConfigRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/safety/config', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async listTemplates() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/safety/templates', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getTemplate(templateId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/safety/templates/{template_id}', {\n params: { path: { workspace_id: this.workspaceId, template_id: templateId } },\n }),\n )\n }\n\n async applyTemplate(templateId: string, body: components['schemas']['ApplyTemplateRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/safety/templates/{template_id}/apply', {\n params: { path: { workspace_id: this.workspaceId, template_id: templateId } },\n body,\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\nexport class ComplianceResource extends WorkspaceScopedResource {\n async getDashboard() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/compliance/dashboard', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getHipaa(params?: { report_period_days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/compliance/hipaa', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getAccessReview() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/compliance/access-review', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "/**\n * Real-time workspace event streaming via Server-Sent Events.\n *\n * Subscribes to ``GET /v1/{workspace_id}/events/stream`` and yields typed\n * {@link WorkspaceSSEEvent} values. The platform-api endpoint:\n *\n * - Streams ``text/event-stream`` over HTTP/1.1\n * - Sends ``retry: 3000`` directive as the first frame\n * - Tags every event with ``id: <millisecond-timestamp>`` for replay\n * - Buffers the last 5 minutes of events in Valkey for gapless reconnect\n * - Pops the discriminator (``event_type``) out of the JSON ``data:``\n * payload and into the SSE ``event:`` line \u2014 this helper reattaches\n * it before yielding the typed union member\n *\n * Implementation choice: this helper uses the SDK's own fetch transport\n * (with auth + retry middleware applied) rather than the WHATWG\n * ``EventSource`` API or the ``eventsource`` polyfill. The reasons are:\n *\n * 1. ``EventSource`` cannot send ``Authorization`` headers \u2014 the polyfill\n * can, but adds a runtime dep and bypasses the SDK's BFF-proxy /\n * custom-fetch / mock-fetch composition.\n * 2. Reusing the existing ``createTurnStream`` pattern keeps a single\n * SSE parser in the SDK and shares the auth middleware that already\n * attaches the bearer token on every request.\n * 3. The SDK ships with two runtime deps (``openapi-fetch`` +\n * ``openapi-typescript-helpers``); adding ``eventsource`` would inflate\n * bundle size for a feature that fetch streaming handles cleanly.\n *\n * The trade-off is that we reimplement the reconnect loop. The platform-api\n * advertises ``retry: 3000`` and we honor that as the initial backoff,\n * doubling with full jitter on each successive failure up to ``maxDelayMs``.\n *\n * @see ConversationsResource.streamTurn for the analogous turn-stream helper.\n */\n\nimport type { components } from '../generated/api.js'\nimport { type PlatformFetch } from '../core/openapi-client.js'\nimport { WorkspaceScopedResource } from './base.js'\n\n/**\n * Discriminated union of every workspace SSE event variant exposed by\n * platform-api. Members carry their own ``event_type`` literal \u2014 narrow\n * with ``switch (event.event_type)`` to access typed payload fields.\n */\nexport type WorkspaceSSEEvent = components['schemas']['WorkspaceSSEEvent']\n\n/** Discriminator literal for {@link WorkspaceSSEEvent} members. */\nexport type WorkspaceSSEEventType = WorkspaceSSEEvent['event_type']\n\n/**\n * Reason taxonomy for {@link WorkspaceEventStreamError}. The platform-api\n * stream encodes a stable ``code`` in every error / control frame so\n * consumers can branch deterministically without parsing free-form text.\n *\n * * ``too_many_streams`` \u2014 workspace exceeded its concurrent-stream cap\n * (``error`` frame with ``code=too_many_streams``). Do NOT auto-retry \u2014\n * close another tab first.\n * * ``stream_unavailable`` \u2014 Valkey or downstream pubsub is unreachable.\n * Retryable, but not until the platform recovers.\n * * ``stream_error`` \u2014 generic server-side stream failure.\n * * ``auth`` \u2014 401/403 returned at connect time. Terminal.\n * * ``transport_exhausted`` \u2014 reconnect budget exhausted.\n * * ``aborted`` \u2014 caller aborted via signal / ``unsubscribe()``.\n * * ``unknown`` \u2014 fallback when the server returns an error frame the SDK\n * does not recognize.\n */\nexport type WorkspaceEventStreamErrorCode =\n | 'too_many_streams'\n | 'stream_unavailable'\n | 'stream_error'\n | 'auth'\n | 'transport_exhausted'\n | 'aborted'\n | 'unknown'\n\n/**\n * Structured error surfaced through {@link SubscribeToWorkspaceOptions.onError}.\n *\n * Subclasses ``Error`` so existing consumers using ``err.message`` continue\n * to work, while adding ``code`` + ``retryable`` + raw ``frame`` for\n * deterministic branching. Inspect with ``isWorkspaceEventStreamError``.\n */\nexport class WorkspaceEventStreamError extends Error {\n readonly code: WorkspaceEventStreamErrorCode\n readonly retryable: boolean\n /** Raw decoded ``error`` frame body (or ``undefined`` for transport errors). */\n readonly frame: Record<string, unknown> | undefined\n\n constructor(\n message: string,\n code: WorkspaceEventStreamErrorCode,\n retryable: boolean,\n frame?: Record<string, unknown>,\n ) {\n super(message)\n this.name = 'WorkspaceEventStreamError'\n this.code = code\n this.retryable = retryable\n this.frame = frame\n }\n}\n\nexport function isWorkspaceEventStreamError(\n value: unknown,\n): value is WorkspaceEventStreamError {\n return value instanceof WorkspaceEventStreamError\n}\n\n/**\n * Options for {@link EventsResource.subscribeToWorkspace}.\n */\nexport interface SubscribeToWorkspaceOptions {\n /**\n * Resume from a previously seen event id. Forwarded as the\n * ``Last-Event-ID`` request header on the first connect; the server\n * replays buffered events with id > ``lastEventId`` before switching to\n * live pub/sub. The SDK automatically tracks the most recent id during\n * the stream and re-sends it on every reconnect.\n *\n * Event ids are millisecond Unix timestamps; pass them as raw numeric\n * strings.\n */\n lastEventId?: string\n\n /**\n * Cancellation signal. Aborting the signal closes the underlying fetch\n * stream and stops the reconnect loop.\n */\n signal?: AbortSignal\n\n /** Invoked once per parsed, typed event. */\n onEvent: (event: WorkspaceSSEEvent) => void\n\n /**\n * Invoked on a terminal error (e.g., 401 / 403, abort, or reconnect\n * budget exhausted). Will not be called more than once per\n * ``subscribeToWorkspace`` invocation.\n */\n onError?: (error: Error) => void\n\n /**\n * Invoked just before each reconnect attempt with the 1-based attempt\n * number. The first connection (attempt 0) does not fire this.\n */\n onReconnect?: (attempt: number) => void\n\n /**\n * Initial reconnect delay in milliseconds. Defaults to 3000 to match\n * the platform-api ``retry:`` directive. The actual delay grows\n * exponentially (with jitter) up to ``maxDelayMs`` per failure.\n */\n initialDelayMs?: number\n\n /** Cap on the reconnect backoff delay in milliseconds. Defaults to 30s. */\n maxDelayMs?: number\n\n /**\n * Maximum number of reconnect attempts before giving up and calling\n * ``onError``. Defaults to 10. Set to ``Infinity`` to retry forever\n * (the consumer is then responsible for aborting via ``signal``).\n */\n maxReconnects?: number\n}\n\n/**\n * Handle returned by {@link EventsResource.subscribeToWorkspace}.\n *\n * Resolves when the stream terminates \u2014 either because the consumer\n * aborted via ``signal``, an unrecoverable error fired ``onError``, or\n * the reconnect budget was exhausted. The promise never rejects; consume\n * errors via ``onError``.\n */\nexport interface SubscriptionHandle {\n /**\n * Returns a promise that resolves once the subscription has fully\n * stopped (post-abort cleanup complete, no further callbacks pending).\n */\n done: Promise<void>\n\n /**\n * Stop the subscription. Equivalent to aborting the caller-supplied\n * ``AbortSignal``. Idempotent.\n */\n unsubscribe(): void\n}\n\nconst DEFAULT_INITIAL_DELAY_MS = 3000\nconst DEFAULT_MAX_DELAY_MS = 30000\nconst DEFAULT_MAX_RECONNECTS = 10\n// Hard ceiling on a single SSE field value to defend against a misbehaving\n// upstream that streams without ever emitting a frame terminator. 1 MiB is\n// far above any legitimate platform event payload (most are <2 KiB).\nconst MAX_FRAME_BYTES = 1_048_576\n\n/**\n * Real-time event stream resource.\n *\n * @example\n * ```ts\n * const handle = client.events.subscribeToWorkspace({\n * onEvent: (event) => {\n * switch (event.event_type) {\n * case 'call.started':\n * console.log('Call started:', event.call_sid)\n * break\n * case 'pipeline.error':\n * console.error('Pipeline error:', event)\n * break\n * }\n * },\n * onError: (err) => console.error('Stream error:', err),\n * onReconnect: (attempt) => console.warn(`Reconnect #${attempt}`),\n * })\n *\n * // Later, to stop:\n * handle.unsubscribe()\n * await handle.done\n * ```\n */\nexport class EventsResource extends WorkspaceScopedResource {\n constructor(client: PlatformFetch, workspaceId: string) {\n super(client, workspaceId)\n }\n\n /**\n * Subscribe to the workspace event stream.\n *\n * Establishes an SSE connection to ``/v1/{workspace_id}/events/stream``\n * and invokes ``onEvent`` once per typed {@link WorkspaceSSEEvent}.\n * Unrecoverable failures (auth errors, exhausted reconnect budget,\n * caller abort) surface through ``onError``.\n *\n * Reconnection is automatic: on a network drop or 5xx, the helper\n * backs off (initial delay derived from the ``retry:`` directive,\n * default 3s, doubling with full jitter up to ``maxDelayMs``) and\n * resumes with the most recently seen ``Last-Event-ID``. The platform\n * buffers 5 minutes of events for gapless replay.\n *\n * @returns a {@link SubscriptionHandle} for cleanup. Aborting the\n * caller's ``signal`` is equivalent to calling ``unsubscribe()``.\n */\n subscribeToWorkspace(options: SubscribeToWorkspaceOptions): SubscriptionHandle {\n const localController = new AbortController()\n const cleanups: Array<() => void> = []\n\n if (options.signal) {\n if (options.signal.aborted) {\n localController.abort(options.signal.reason)\n } else {\n const onAbort = (): void => localController.abort(options.signal?.reason)\n options.signal.addEventListener('abort', onAbort, { once: true })\n cleanups.push(() => options.signal?.removeEventListener('abort', onAbort))\n }\n }\n\n const done = runSubscription(\n this.client,\n this.workspaceId,\n options,\n localController.signal,\n ).finally(() => {\n for (const cleanup of cleanups) cleanup()\n })\n\n return {\n done,\n unsubscribe: () => localController.abort(),\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\ntype StreamOutcome =\n | { kind: 'aborted' }\n | { kind: 'auth-error'; error: Error }\n | { kind: 'transport-error'; reason: string }\n | {\n kind: 'terminal-server-error'\n code: WorkspaceEventStreamErrorCode\n message: string\n retryable: boolean\n frame: Record<string, unknown>\n }\n\n/**\n * Server-sent ``error`` event frames that the SDK should treat as terminal\n * (do NOT auto-retry). Mirror the ``code`` taxonomy emitted by\n * ``platform-api/src/routes/event_stream.py``.\n */\nconst TERMINAL_SERVER_ERROR_CODES: Record<string, WorkspaceEventStreamErrorCode> = {\n too_many_streams: 'too_many_streams',\n}\n\n/**\n * Server-sent ``error`` event frames that are recoverable \u2014 surface them as\n * transport errors so the reconnect loop kicks in. ``stream_unavailable``\n * fires when Valkey is down; ``stream_error`` is the generic catch-all from\n * the server-side ``except Exception`` branch.\n */\nconst RECOVERABLE_SERVER_ERROR_CODES: Record<string, WorkspaceEventStreamErrorCode> = {\n stream_unavailable: 'stream_unavailable',\n stream_error: 'stream_error',\n}\n\nasync function runSubscription(\n client: PlatformFetch,\n workspaceId: string,\n options: SubscribeToWorkspaceOptions,\n signal: AbortSignal,\n): Promise<void> {\n let lastEventId = options.lastEventId\n let attempt = 0\n let delayMs = options.initialDelayMs ?? DEFAULT_INITIAL_DELAY_MS\n const maxDelayMs = options.maxDelayMs ?? DEFAULT_MAX_DELAY_MS\n const maxReconnects = options.maxReconnects ?? DEFAULT_MAX_RECONNECTS\n let errorReported = false\n\n const reportError = (error: Error): void => {\n if (errorReported) return\n errorReported = true\n try {\n options.onError?.(error)\n } catch {\n // Consumer-supplied callback raised \u2014 swallow to keep teardown clean.\n }\n }\n\n while (!signal.aborted) {\n if (attempt > 0) {\n try {\n options.onReconnect?.(attempt)\n } catch {\n // Consumer-supplied callback raised \u2014 swallow to keep teardown clean.\n }\n }\n\n let outcome: StreamOutcome\n try {\n outcome = await runOneConnection({\n client,\n workspaceId,\n lastEventId,\n signal,\n onEvent: options.onEvent,\n onIdAdvance: (id) => {\n lastEventId = id\n },\n onRetryDirective: (ms) => {\n // Server-sent retry directive resets the backoff floor.\n delayMs = clampDelay(ms, options.initialDelayMs, maxDelayMs)\n },\n })\n } catch (err) {\n // runOneConnection surfaces only terminal auth errors via throw;\n // everything else is a StreamOutcome. Preserve the original Error\n // (typically ``AuthenticationError`` with ``statusCode``) so consumers\n // that branch on ``err.statusCode`` keep working.\n reportError(err instanceof Error ? err : new Error(String(err)))\n return\n }\n\n if (signal.aborted || outcome.kind === 'aborted') {\n return\n }\n\n if (outcome.kind === 'auth-error') {\n // 401 / 403 \u2014 never auto-retry. The token is invalid and the\n // stream cannot succeed without operator intervention. Surface the\n // original ``AuthenticationError`` so consumers checking\n // ``err.statusCode`` keep working.\n reportError(outcome.error)\n return\n }\n\n if (outcome.kind === 'terminal-server-error') {\n // Server emitted a structured ``error`` frame with a code that the\n // SDK recognizes as terminal (e.g., ``too_many_streams``). Surface\n // it as a typed ``WorkspaceEventStreamError`` so consumers can branch\n // on ``error.code`` without parsing free-form text.\n reportError(\n new WorkspaceEventStreamError(\n outcome.message,\n outcome.code,\n outcome.retryable,\n outcome.frame,\n ),\n )\n return\n }\n\n if (attempt >= maxReconnects) {\n reportError(\n new WorkspaceEventStreamError(\n `SSE subscription exhausted reconnect budget (${maxReconnects}): ${outcome.reason}`,\n 'transport_exhausted',\n true,\n ),\n )\n return\n }\n\n attempt += 1\n const sleepMs = jitter(delayMs)\n delayMs = Math.min(delayMs * 2, maxDelayMs)\n const slept = await abortableSleep(sleepMs, signal)\n if (!slept) return\n }\n}\n\ninterface RunOneConnectionArgs {\n client: PlatformFetch\n workspaceId: string\n lastEventId: string | undefined\n signal: AbortSignal\n onEvent: (event: WorkspaceSSEEvent) => void\n onIdAdvance: (id: string) => void\n onRetryDirective: (ms: number) => void\n}\n\nasync function runOneConnection(args: RunOneConnectionArgs): Promise<StreamOutcome> {\n const headers: Record<string, string> = { Accept: 'text/event-stream' }\n if (args.lastEventId !== undefined) {\n headers['Last-Event-ID'] = args.lastEventId\n }\n\n let result: { data?: unknown; error?: unknown; response?: Response }\n try {\n result = await args.client.GET('/v1/{workspace_id}/events/stream', {\n params: { path: { workspace_id: args.workspaceId } },\n headers,\n parseAs: 'stream',\n signal: args.signal,\n })\n } catch (err) {\n if (args.signal.aborted) return { kind: 'aborted' }\n const error = err instanceof Error ? err : new Error(String(err))\n // 4xx (including 401 / 403) are surfaced as thrown AmigoErrors by the\n // SDK error middleware. Distinguish those from transport failures.\n const status = readStatus(error)\n if (status === 401 || status === 403) {\n return { kind: 'auth-error', error }\n }\n return { kind: 'transport-error', reason: error.message }\n }\n\n if (result.error !== undefined) {\n // openapi-fetch surfaces non-OK responses as `error`. The SDK error\n // middleware should have thrown \u2014 fall through defensively.\n return { kind: 'transport-error', reason: `API error: ${safeStringify(result.error)}` }\n }\n\n const body = result.data\n if (!(body instanceof ReadableStream)) {\n return { kind: 'transport-error', reason: 'Expected ReadableStream body for SSE' }\n }\n\n try {\n for await (const frame of parseSSEFrames(body, args.signal)) {\n if (args.signal.aborted) return { kind: 'aborted' }\n if (frame.retry !== undefined) {\n args.onRetryDirective(frame.retry)\n }\n if (frame.id !== undefined) {\n args.onIdAdvance(frame.id)\n }\n if (frame.event === 'error' && frame.data !== undefined) {\n // Structured error frame \u2014 branch on ``code`` from the server. We\n // distinguish three buckets: terminal (don't retry), recoverable\n // (let the reconnect loop run), and unknown (default to recoverable\n // so a future server code does not strand consumers without auto-\n // retry).\n const errOutcome = interpretServerErrorFrame(frame.data)\n if (errOutcome.terminal) {\n return {\n kind: 'terminal-server-error',\n code: errOutcome.code,\n message: errOutcome.message,\n retryable: errOutcome.retryable,\n frame: errOutcome.frame,\n }\n }\n return { kind: 'transport-error', reason: errOutcome.message }\n }\n if (frame.event && frame.data !== undefined) {\n const event = parseWorkspaceFrame(frame.event, frame.data)\n if (event) {\n try {\n args.onEvent(event)\n } catch {\n // Consumer threw during onEvent; do not let it kill the\n // subscription. The stream is still healthy.\n }\n }\n }\n }\n } catch (err) {\n if (args.signal.aborted) return { kind: 'aborted' }\n const reason = err instanceof Error ? err.message : String(err)\n return { kind: 'transport-error', reason }\n }\n\n if (args.signal.aborted) return { kind: 'aborted' }\n // Reader closed cleanly \u2014 server EOF. Treat as recoverable; reconnect\n // with whatever Last-Event-ID we have.\n return { kind: 'transport-error', reason: 'Stream closed by server' }\n}\n\ninterface SSEFrame {\n event: string\n data: string | undefined\n id: string | undefined\n retry: number | undefined\n}\n\n/**\n * Parses an SSE byte stream into structured frames.\n *\n * Forks the parser in {@link ConversationsResource.streamTurn} to also\n * surface ``id:`` and ``retry:`` lines that the workspace event stream\n * relies on for gapless reconnect.\n */\nasync function* parseSSEFrames(\n stream: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n): AsyncGenerator<SSEFrame> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n // When the caller aborts, cancel the reader so any in-flight\n // ``reader.read()`` resolves immediately with ``{done: true}`` (or rejects\n // with ``AbortError``, which we trap in the consumer). Without this, an\n // idle SSE stream keeps the read pending indefinitely after abort.\n let cancelled = false\n const onAbort = (): void => {\n if (cancelled) return\n cancelled = true\n void reader.cancel().catch(() => {\n // Already cancelled or locked elsewhere; safe to ignore.\n })\n }\n let removeAbortHandler: (() => void) | undefined\n if (signal.aborted) {\n onAbort()\n } else {\n signal.addEventListener('abort', onAbort, { once: true })\n removeAbortHandler = () => signal.removeEventListener('abort', onAbort)\n }\n\n function* drain(text: string): Generator<SSEFrame> {\n buffer += text\n if (buffer.length > MAX_FRAME_BYTES) {\n throw new Error(`SSE frame buffer exceeded ${MAX_FRAME_BYTES} bytes without terminator`)\n }\n while (true) {\n const idx = findFrameTerminator(buffer)\n if (idx === null) break\n const block = buffer.slice(0, idx.terminatorStart)\n buffer = buffer.slice(idx.terminatorEnd)\n const frame = parseSSEBlock(block)\n if (frame) yield frame\n }\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n yield* drain(decoder.decode(value, { stream: true }))\n }\n yield* drain(decoder.decode())\n if (buffer.trim().length > 0) {\n const frame = parseSSEBlock(buffer)\n if (frame) yield frame\n buffer = ''\n }\n } finally {\n removeAbortHandler?.()\n try {\n reader.releaseLock()\n } catch {\n // releaseLock can throw if the reader is already detached; ignore.\n }\n }\n}\n\nfunction findFrameTerminator(s: string): { terminatorStart: number; terminatorEnd: number } | null {\n const lf = s.indexOf('\\n\\n')\n const crlf = s.indexOf('\\r\\n\\r\\n')\n if (lf < 0 && crlf < 0) return null\n if (lf < 0) return { terminatorStart: crlf, terminatorEnd: crlf + 4 }\n if (crlf < 0) return { terminatorStart: lf, terminatorEnd: lf + 2 }\n return lf < crlf\n ? { terminatorStart: lf, terminatorEnd: lf + 2 }\n : { terminatorStart: crlf, terminatorEnd: crlf + 4 }\n}\n\nfunction parseSSEBlock(block: string): SSEFrame | null {\n let event = ''\n let id: string | undefined\n let retry: number | undefined\n const dataLines: string[] = []\n for (const line of block.split(/\\r?\\n/)) {\n if (line === '' || line.startsWith(':')) continue\n const colon = line.indexOf(':')\n const field = colon < 0 ? line : line.slice(0, colon)\n let value = colon < 0 ? '' : line.slice(colon + 1)\n if (value.startsWith(' ')) value = value.slice(1)\n if (field === 'event') {\n event = value\n } else if (field === 'data') {\n dataLines.push(value)\n } else if (field === 'id') {\n id = value\n } else if (field === 'retry') {\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed) && parsed >= 0) retry = parsed\n }\n // Unknown fields are ignored per the SSE spec.\n }\n // Surface metadata-only frames (id-only or retry-only) so the reconnect\n // loop can observe ``Last-Event-ID`` advances and server-sent retry hints\n // even on heartbeats / replay-position markers.\n if (!event && dataLines.length === 0 && id === undefined && retry === undefined) {\n return null\n }\n return {\n event,\n data: dataLines.length > 0 ? dataLines.join('\\n') : undefined,\n id,\n retry,\n }\n}\n\n/**\n * Validate and reattach the discriminator to a frame's JSON payload.\n *\n * The platform-api SSE serializer pops ``event_type`` out of the JSON body\n * (it lives in the SSE ``event:`` line). Reattach it so the resulting\n * value is a well-formed {@link WorkspaceSSEEvent} union member.\n *\n * Drift-tolerant: an unparseable payload, non-object payload, or unknown\n * ``event:`` discriminator is silently dropped (returns ``null``), matching\n * the behavior of the analogous turn-stream parser.\n */\nfunction parseWorkspaceFrame(eventName: string, dataJson: string): WorkspaceSSEEvent | null {\n let payload: unknown\n try {\n payload = JSON.parse(dataJson)\n } catch {\n return null\n }\n if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) return null\n // The discriminator is whatever the server's `event:` line says. We trust\n // the platform-api union: anything outside the generated literal type is\n // dropped at the static-type boundary by the consumer's `switch`.\n return {\n ...(payload as Record<string, unknown>),\n event_type: eventName,\n } as WorkspaceSSEEvent\n}\n\n/**\n * Decode a server-sent ``error`` frame body into either a terminal or\n * recoverable outcome.\n *\n * The platform-api event stream emits these shapes:\n *\n * { code: \"too_many_streams\", message: \"...\", max_streams: 50 }\n * { code: \"stream_unavailable\", message: \"Event streaming unavailable\" }\n * { code: \"stream_error\", message: \"Stream error, please reconnect\" }\n *\n * Unknown codes default to recoverable so a server-side addition does not\n * strand SDK consumers without auto-retry.\n */\nfunction interpretServerErrorFrame(dataJson: string): {\n terminal: boolean\n code: WorkspaceEventStreamErrorCode\n message: string\n retryable: boolean\n frame: Record<string, unknown>\n} {\n let payload: unknown\n try {\n payload = JSON.parse(dataJson)\n } catch {\n return {\n terminal: false,\n code: 'stream_error',\n message: 'Server sent malformed error frame',\n retryable: true,\n frame: {},\n }\n }\n if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) {\n return {\n terminal: false,\n code: 'stream_error',\n message: 'Server sent non-object error frame',\n retryable: true,\n frame: {},\n }\n }\n const obj = payload as Record<string, unknown>\n const rawCode = typeof obj['code'] === 'string' ? (obj['code'] as string) : ''\n const message =\n typeof obj['message'] === 'string' ? (obj['message'] as string) : 'Stream error'\n\n if (rawCode in TERMINAL_SERVER_ERROR_CODES) {\n return {\n terminal: true,\n code: TERMINAL_SERVER_ERROR_CODES[rawCode]!,\n message,\n retryable: false,\n frame: obj,\n }\n }\n if (rawCode in RECOVERABLE_SERVER_ERROR_CODES) {\n return {\n terminal: false,\n code: RECOVERABLE_SERVER_ERROR_CODES[rawCode]!,\n message,\n retryable: true,\n frame: obj,\n }\n }\n return {\n terminal: false,\n code: 'unknown',\n message: rawCode ? `${message} (code=${rawCode})` : message,\n retryable: true,\n frame: obj,\n }\n}\n\nfunction readStatus(error: unknown): number | undefined {\n if (typeof error !== 'object' || error === null) return undefined\n const status = (error as { statusCode?: unknown }).statusCode\n return typeof status === 'number' ? status : undefined\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction jitter(ms: number): number {\n // Full jitter: pick a random delay in [0, ms]. Avoids reconnect stampedes\n // when many clients reconnect simultaneously after a deploy.\n return Math.floor(Math.random() * Math.max(1, ms))\n}\n\nfunction clampDelay(ms: number, floor: number | undefined, ceiling: number): number {\n const lo = floor ?? DEFAULT_INITIAL_DELAY_MS\n if (!Number.isFinite(ms) || ms <= 0) return lo\n return Math.min(Math.max(ms, lo), ceiling)\n}\n\nasync function abortableSleep(ms: number, signal: AbortSignal): Promise<boolean> {\n if (signal.aborted) return false\n return new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve(true)\n }, ms)\n const onAbort = (): void => {\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n resolve(false)\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport class FunctionsResource extends WorkspaceScopedResource {\n async list() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/functions', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async create(body: components['schemas']['FunctionCreateRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async delete(functionName: string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/functions/{function_name}', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n })\n }\n\n async test(functionName: string, body: components['schemas']['FunctionTestRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/{function_name}/test', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n body,\n }),\n )\n }\n\n async getCatalog() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/functions/catalog', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async query(body: components['schemas']['QueryRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/query', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async sync() {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/sync', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n // \u2500\u2500 V109 SQL-first surface \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // The methods below operate against ``platform.functions`` (the\n // versioned, alias-pinned, typed-parameter table introduced in\n // platform migration V109). The legacy methods above continue to\n // wrap the JSONB-backed ``workspace.settings[\"functions\"]`` shape;\n // both surfaces co-exist so callers can migrate at their own pace.\n\n /**\n * Validate + register a new platform function version. Atomic:\n * validation + INSERT + ``latest`` alias rebind happen in one\n * transaction. Concurrent deploys race-fail on the UNIQUE\n * constraint and return 409.\n */\n async deploy(body: components['schemas']['RegisteredFunction']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/deploy', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /**\n * List the ``latest`` version of every V109-registered platform\n * function in the workspace. Returns one row per function (the\n * alias-pinned latest version).\n *\n * Distinct from :meth:`list` which reads the legacy\n * ``workspace.settings[\"functions\"]`` JSONB store; both surfaces\n * co-exist while callers migrate. Prefer this for V109 functions.\n */\n async listRegistered() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/functions/registered', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /**\n * List all immutable versions of a registered function, newest first.\n */\n async listVersions(functionName: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/functions/{function_name}/versions', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n }),\n )\n }\n\n /**\n * Resolve ``(function_name, alias)`` to a specific version row.\n * Default alias: ``latest``.\n */\n async getVersion(\n functionName: string,\n alias: 'latest' | 'staging' | 'production' = 'latest',\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/functions/{function_name}/version', {\n params: {\n path: { workspace_id: this.workspaceId, function_name: functionName },\n query: { alias },\n },\n }),\n )\n }\n\n /**\n * Execute a registered function. Bound parameters validated against\n * the version's stored schema; ``ws_id`` auto-injected from request\n * context. Returns the executor's shaped response (rows for\n * ``returns=table``, scalar for ``returns=scalar``).\n */\n async invoke(\n functionName: string,\n body: components['schemas']['InvokeRequest'],\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/{function_name}/invoke', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n body,\n }),\n )\n }\n\n /**\n * Test invoke \u2014 same as ``invoke`` plus persists ``last_test_*``\n * telemetry on the version row so the DC tool list can show\n * health without re-running.\n *\n * Returns :type:`TestInvokeResponse` (superset of `InvokeResponse`)\n * so callers can read ``status`` / ``error`` / ``test_duration_ms``\n * directly off the response. The platform-api route catches\n * ``ServiceUnavailableError`` and converts it into ``status='fail'``\n * with the executor's error string in ``error`` \u2014 so even on a\n * blown-up SQL execution the response is a 200 with the failure\n * detail surfaced to the caller.\n */\n async testV2(\n functionName: string,\n body: components['schemas']['InvokeRequest'],\n ): Promise<components['schemas']['TestInvokeResponse']> {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/{function_name}/v2/test', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n body,\n }),\n )\n }\n\n /**\n * Rebind an alias (``latest`` / ``staging`` / ``production``) to a\n * specific version. Verifies the version exists before rebinding.\n */\n async promote(\n functionName: string,\n body: components['schemas']['PromoteRequest'],\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/{function_name}/promote', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n body,\n }),\n )\n }\n\n /**\n * Rebind ``latest`` and ``production`` to a prior version. The\n * \"oops the new deploy was bad\" path. ``staging`` stays untouched.\n */\n async rollback(\n functionName: string,\n body: components['schemas']['RollbackRequest'],\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/{function_name}/rollback', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n body,\n }),\n )\n }\n}\n", "/**\n * Reconnecting WebSocket primitive shared by the SDK's WS-based realtime\n * helpers (text-stream, session-connect, observer).\n *\n * The platform exposes three workspace-scoped WebSocket surfaces with similar\n * lifecycle requirements:\n *\n * * Resume on transient drops with exponential backoff + full jitter\n * * Treat 4001 (client error) and 4403 (auth) close codes as terminal\n * * Treat 4029 (rate limit / cap) as terminal-but-retryable on a slow timer\n * * Watchdog the connection: if no message arrives within an idle window,\n * the upstream is dead even if the TCP socket has not closed; force a\n * reconnect\n * * Surface every typed message through ``onMessage`` and every state\n * transition through ``onStateChange``\n *\n * Before this primitive existed, every consumer (developer-console\n * useStreamSession, useCallObserver, agent-engineering scripts) re-implemented\n * the loop with subtle bugs (different idle thresholds, missing retry budget,\n * no terminal-code handling). This module is the single canonical\n * implementation; resource helpers compose it with their own message parsers\n * and protocol details.\n *\n * @see ReconnectingWebSocket\n * @see EventsResource for the analogous SSE-based helper\n */\n\n/** Lifecycle states reported via {@link ReconnectingWebSocketOptions.onStateChange}. */\nexport type ReconnectingWebSocketState =\n | 'connecting'\n | 'open'\n | 'closing'\n | 'closed'\n | 'reconnecting'\n | 'terminal'\n\n/** Reasons surfaced to {@link ReconnectingWebSocketOptions.onError} on a terminal close. */\nexport type ReconnectingWebSocketErrorReason =\n | 'auth'\n | 'rate_limited'\n | 'client_error'\n | 'server_error'\n | 'reconnect_budget_exhausted'\n | 'aborted'\n | 'idle_watchdog'\n | 'open_failed'\n | 'unknown'\n\n/** Structured terminal error surfaced to consumers. */\nexport class ReconnectingWebSocketError extends Error {\n readonly reason: ReconnectingWebSocketErrorReason\n readonly closeCode: number | undefined\n readonly closeReason: string | undefined\n readonly attempts: number\n\n constructor(\n message: string,\n reason: ReconnectingWebSocketErrorReason,\n closeCode: number | undefined,\n closeReason: string | undefined,\n attempts: number,\n ) {\n super(message)\n this.name = 'ReconnectingWebSocketError'\n this.reason = reason\n this.closeCode = closeCode\n this.closeReason = closeReason\n this.attempts = attempts\n }\n}\n\n/**\n * Constructor for the underlying WebSocket. Defaults to the global\n * ``WebSocket`` (browsers, Bun, Deno, Node 22+ via global) if available.\n *\n * Pass an explicit factory in environments without a global (older Node) or\n * for tests that swap in a mock.\n */\nexport type WebSocketFactory = (url: string, protocols?: string | string[]) => WebSocket\n\n/** Options for {@link ReconnectingWebSocket}. */\nexport interface ReconnectingWebSocketOptions {\n /** Target ws:// or wss:// URL. */\n url: string\n\n /**\n * Optional WebSocket subprotocols. The platform's auth scheme passes the\n * bearer token here (``['auth', token]``) so it never appears in the URL.\n */\n protocols?: string | string[]\n\n /**\n * Initial backoff delay (ms). Doubles with full jitter on each successive\n * failure up to ``maxDelayMs``. Default ``1_000``.\n */\n initialDelayMs?: number\n\n /** Cap on the reconnect backoff delay (ms). Default ``30_000``. */\n maxDelayMs?: number\n\n /**\n * Maximum number of reconnect attempts before giving up. Default ``10``.\n * Set to ``Infinity`` to retry forever (rely on AbortSignal for shutdown).\n */\n maxReconnects?: number\n\n /**\n * Idle watchdog (ms). If no message arrives within this window the\n * connection is considered dead and is force-closed; the reconnect loop\n * then handles the rebuild. Default ``45_000`` (matches the longest\n * platform endpoint heartbeat). Set to ``0`` to disable.\n */\n idleTimeoutMs?: number\n\n /**\n * Cancellation signal. Aborting the signal closes the underlying socket\n * and stops the reconnect loop. The ``done`` promise resolves once the\n * teardown completes.\n */\n signal?: AbortSignal\n\n /**\n * Optional WebSocket factory. Defaults to ``globalThis.WebSocket`` if\n * available; throws at first connect attempt otherwise.\n */\n webSocketFactory?: WebSocketFactory\n\n /**\n * Invoked when the underlying socket transitions states. Mostly useful\n * for surfacing reconnects to the UI (e.g., \"Reconnecting\u2026\" banner).\n */\n onStateChange?: (state: ReconnectingWebSocketState) => void\n\n /**\n * Invoked once per inbound frame. ``MessageEvent.data`` is delivered raw\n * \u2014 consumers parse JSON / binary themselves.\n */\n onMessage: (event: MessageEvent) => void\n\n /**\n * Invoked just before each reconnect attempt with the 1-based attempt\n * number, the planned delay (ms), and the close code that triggered the\n * reconnect.\n */\n onReconnect?: (info: { attempt: number; delayMs: number; closeCode: number | undefined }) => void\n\n /**\n * Invoked exactly once per ``ReconnectingWebSocket`` instance on a\n * terminal failure (consumer-aborted, reconnect budget exhausted, or a\n * close code in the terminal set: 4001 / 4003 / 4403 / 4100 / 1008).\n */\n onError?: (error: ReconnectingWebSocketError) => void\n}\n\n/** Handle returned by {@link createReconnectingWebSocket}. */\nexport interface ReconnectingWebSocketHandle {\n /**\n * Resolves when the loop has fully stopped (post-abort cleanup complete).\n * Never rejects; consume errors via ``onError``.\n */\n done: Promise<void>\n\n /**\n * Send a frame on the currently open socket. Throws if no socket is\n * currently open. Use ``onStateChange`` to gate sends, or buffer in\n * caller code.\n */\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void\n\n /**\n * Close the connection and stop reconnecting. Equivalent to aborting the\n * caller-supplied signal. Idempotent.\n */\n close(code?: number, reason?: string): void\n\n /** Latest known lifecycle state. */\n readonly state: ReconnectingWebSocketState\n}\n\n/**\n * Close codes that should NEVER be retried. The server is telling us the\n * connection cannot succeed regardless of how many times we try.\n *\n * 1008 (policy violation), 4001 (client error / bad params), 4003\n * (forbidden), 4100 (auth / not authenticated, used by some platform\n * endpoints), 4403 (forbidden \u2014 used by platform-api session-connect for\n * auth and origin rejection).\n */\nconst TERMINAL_CLOSE_CODES = new Set([1008, 4001, 4003, 4100, 4403])\n\n/**\n * Close codes that are terminal-but-rate-limited. The reconnect loop honors\n * a longer floor (``RATE_LIMITED_FLOOR_MS``) before retrying so the client\n * does not amplify the problem it just hit.\n *\n * 4029 (custom platform code for \"too many connections / burst exceeded\").\n * 1013 (try again later, RFC 6455 standard hint).\n */\nconst RATE_LIMITED_CLOSE_CODES = new Set([1013, 4029])\n\nconst RATE_LIMITED_FLOOR_MS = 5_000\n\nconst DEFAULT_INITIAL_DELAY_MS = 1_000\nconst DEFAULT_MAX_DELAY_MS = 30_000\nconst DEFAULT_MAX_RECONNECTS = 10\nconst DEFAULT_IDLE_TIMEOUT_MS = 45_000\n\n/**\n * Build a managed reconnecting WebSocket.\n *\n * The returned handle is the only public surface; the underlying\n * ``WebSocket`` is held privately so consumers cannot bypass the lifecycle\n * machinery (which would defeat the watchdog and reconnect loop).\n *\n * @example\n * ```ts\n * const handle = createReconnectingWebSocket({\n * url: client.conversations.sessionConnectUrl({ serviceId, entityId }),\n * protocols: sessionConnectAuthProtocols(apiKey),\n * onMessage: (e) => console.log('frame', e.data),\n * onStateChange: (s) => console.log('state', s),\n * onError: (err) => console.error('terminal:', err.reason, err.closeCode),\n * });\n *\n * handle.send(JSON.stringify({ type: 'user_text', text: 'hi' }));\n * await handle.done; // resolves after handle.close() or terminal error\n * ```\n */\nexport function createReconnectingWebSocket(\n options: ReconnectingWebSocketOptions,\n): ReconnectingWebSocketHandle {\n const factory = resolveWebSocketFactory(options.webSocketFactory)\n const initialDelayMs = options.initialDelayMs ?? DEFAULT_INITIAL_DELAY_MS\n const maxDelayMs = options.maxDelayMs ?? DEFAULT_MAX_DELAY_MS\n const maxReconnects = options.maxReconnects ?? DEFAULT_MAX_RECONNECTS\n const idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS\n\n const localController = new AbortController()\n if (options.signal) {\n if (options.signal.aborted) {\n localController.abort(options.signal.reason)\n } else {\n const onAbort = (): void => localController.abort(options.signal?.reason)\n options.signal.addEventListener('abort', onAbort, { once: true })\n }\n }\n\n let currentSocket: WebSocket | null = null\n let state: ReconnectingWebSocketState = 'connecting'\n let errorReported = false\n\n function setState(next: ReconnectingWebSocketState): void {\n if (state === next) return\n state = next\n try {\n options.onStateChange?.(next)\n } catch {\n // Consumer-thrown error in onStateChange must not kill the loop.\n }\n }\n\n function reportError(err: ReconnectingWebSocketError): void {\n if (errorReported) return\n errorReported = true\n setState('terminal')\n try {\n options.onError?.(err)\n } catch {\n // Consumer-thrown error must not leak.\n }\n }\n\n const handle: ReconnectingWebSocketHandle = {\n get state() {\n return state\n },\n get done() {\n return done\n },\n send(data) {\n if (!currentSocket || currentSocket.readyState !== 1 /* OPEN */) {\n throw new Error(`Cannot send on socket in state ${state}`)\n }\n currentSocket.send(data)\n },\n close(code, reason) {\n localController.abort(new Error(reason ?? 'closed'))\n try {\n currentSocket?.close(code, reason)\n } catch {\n // Already closed; ignore.\n }\n },\n }\n\n const done = runLoop({\n factory,\n options,\n initialDelayMs,\n maxDelayMs,\n maxReconnects,\n idleTimeoutMs,\n signal: localController.signal,\n setState,\n reportError,\n setSocket: (s) => {\n currentSocket = s\n },\n })\n\n return handle\n}\n\ninterface RunLoopArgs {\n factory: WebSocketFactory\n options: ReconnectingWebSocketOptions\n initialDelayMs: number\n maxDelayMs: number\n maxReconnects: number\n idleTimeoutMs: number\n signal: AbortSignal\n setState: (s: ReconnectingWebSocketState) => void\n reportError: (e: ReconnectingWebSocketError) => void\n setSocket: (s: WebSocket | null) => void\n}\n\ninterface ConnectionOutcome {\n closeCode: number | undefined\n closeReason: string | undefined\n /** Set when the watchdog forced a close. */\n watchdogTriggered: boolean\n /** Set when the consumer explicitly aborted. */\n aborted: boolean\n}\n\nasync function runLoop(args: RunLoopArgs): Promise<void> {\n const { options, signal, setState, reportError, setSocket } = args\n let attempt = 0\n let delayMs = args.initialDelayMs\n\n while (!signal.aborted) {\n if (attempt > 0) {\n setState('reconnecting')\n const sleepMs = jitter(delayMs)\n try {\n options.onReconnect?.({ attempt, delayMs: sleepMs, closeCode: undefined })\n } catch {\n // ignore\n }\n const slept = await abortableSleep(sleepMs, signal)\n if (!slept) break\n delayMs = Math.min(delayMs * 2, args.maxDelayMs)\n }\n\n setState(attempt === 0 ? 'connecting' : 'connecting')\n\n let outcome: ConnectionOutcome\n try {\n outcome = await runOneConnection(args)\n } catch (err) {\n // Synchronous open failure (e.g., factory threw, invalid URL).\n reportError(\n new ReconnectingWebSocketError(\n err instanceof Error ? err.message : 'Failed to open WebSocket',\n 'open_failed',\n undefined,\n undefined,\n attempt,\n ),\n )\n return\n } finally {\n setSocket(null)\n }\n\n // Terminal close codes are reported BEFORE the abort check because the\n // close arrived from the wire \u2014 the consumer's subsequent ``close()``\n // call (which flips signal.aborted true) must not suppress the diagnostic.\n if (outcome.closeCode !== undefined && TERMINAL_CLOSE_CODES.has(outcome.closeCode)) {\n reportError(\n new ReconnectingWebSocketError(\n `Server closed with terminal code ${outcome.closeCode}: ${outcome.closeReason ?? ''}`,\n outcome.closeCode === 4403 ? 'auth' : 'client_error',\n outcome.closeCode,\n outcome.closeReason,\n attempt,\n ),\n )\n return\n }\n\n if (outcome.aborted || signal.aborted) {\n setState('closed')\n return\n }\n\n if (attempt >= args.maxReconnects) {\n reportError(\n new ReconnectingWebSocketError(\n `Reconnect budget exhausted (${args.maxReconnects} attempts)`,\n 'reconnect_budget_exhausted',\n outcome.closeCode,\n outcome.closeReason,\n attempt,\n ),\n )\n return\n }\n\n if (outcome.closeCode !== undefined && RATE_LIMITED_CLOSE_CODES.has(outcome.closeCode)) {\n // Pin the floor up so we do not hammer the server we just got\n // throttled by. Honor whichever is larger between the current\n // exponential delay and the rate-limited floor.\n delayMs = Math.max(delayMs, RATE_LIMITED_FLOOR_MS)\n }\n\n attempt += 1\n }\n\n setState('closed')\n}\n\nasync function runOneConnection(args: RunLoopArgs): Promise<ConnectionOutcome> {\n const { options, factory, signal, setState, setSocket, idleTimeoutMs } = args\n\n let socket: WebSocket\n try {\n socket = factory(options.url, options.protocols)\n } catch (err) {\n throw err instanceof Error ? err : new Error(String(err))\n }\n setSocket(socket)\n\n return new Promise<ConnectionOutcome>((resolve) => {\n let watchdogTimer: ReturnType<typeof setTimeout> | null = null\n let resolved = false\n\n function clearWatchdog(): void {\n if (watchdogTimer !== null) {\n clearTimeout(watchdogTimer)\n watchdogTimer = null\n }\n }\n\n function armWatchdog(): void {\n if (idleTimeoutMs <= 0) return\n clearWatchdog()\n watchdogTimer = setTimeout(() => {\n if (resolved) return\n try {\n socket.close(4001, 'idle timeout')\n } catch {\n // already closed\n }\n finalize({\n closeCode: 4001,\n closeReason: 'idle timeout',\n watchdogTriggered: true,\n aborted: false,\n })\n }, idleTimeoutMs)\n }\n\n function finalize(outcome: ConnectionOutcome): void {\n if (resolved) return\n resolved = true\n clearWatchdog()\n signal.removeEventListener('abort', onAbort)\n try {\n socket.removeEventListener('open', onOpen)\n socket.removeEventListener('message', onMessage)\n socket.removeEventListener('close', onClose as unknown as Parameters<WebSocket['removeEventListener']>[1])\n socket.removeEventListener('error', onSocketError)\n } catch {\n // best effort\n }\n resolve(outcome)\n }\n\n function onOpen(): void {\n setState('open')\n armWatchdog()\n }\n\n function onMessage(ev: MessageEvent): void {\n armWatchdog()\n try {\n options.onMessage(ev)\n } catch {\n // Consumer-thrown error in onMessage must not kill the loop;\n // the connection is still healthy.\n }\n }\n\n // CloseEvent is not in lib: ESNext + @types/node \u2014 accept a structural\n // shape with just the fields we read so this works in browser, Bun,\n // Deno, Node ws library, and the WHATWG ws polyfill alike.\n function onClose(ev: { code?: number; reason?: string }): void {\n setState('closed')\n finalize({\n closeCode: ev.code,\n closeReason: ev.reason,\n watchdogTriggered: false,\n aborted: false,\n })\n }\n\n function onSocketError(): void {\n // The browser/Node WebSocket fires 'error' before 'close' on transport\n // failures. We don't terminate here \u2014 the close handler will run with\n // a meaningful close code and we want one resolution path.\n }\n\n function onAbort(): void {\n try {\n socket.close(1000, 'client aborted')\n } catch {\n // already closed\n }\n finalize({\n closeCode: undefined,\n closeReason: undefined,\n watchdogTriggered: false,\n aborted: true,\n })\n }\n\n if (signal.aborted) {\n onAbort()\n return\n }\n\n socket.addEventListener('open', onOpen)\n socket.addEventListener('message', onMessage)\n // ``addEventListener`` accepts a ``CloseEvent``-shaped handler; we cast\n // through ``unknown`` because lib: ESNext + @types/node doesn't expose\n // a global ``CloseEvent`` / ``EventListener`` in every supported runtime.\n socket.addEventListener(\n 'close',\n onClose as unknown as Parameters<WebSocket['addEventListener']>[1],\n )\n socket.addEventListener('error', onSocketError)\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n\nfunction resolveWebSocketFactory(\n factory: WebSocketFactory | undefined,\n): WebSocketFactory {\n if (factory) return factory\n const globalWs = (globalThis as { WebSocket?: typeof WebSocket }).WebSocket\n if (!globalWs) {\n return () => {\n throw new Error(\n 'No global WebSocket available; pass webSocketFactory to createReconnectingWebSocket',\n )\n }\n }\n return (url, protocols) => new globalWs(url, protocols)\n}\n\nfunction jitter(ms: number): number {\n return Math.floor(Math.random() * Math.max(1, ms))\n}\n\nasync function abortableSleep(ms: number, signal: AbortSignal): Promise<boolean> {\n if (signal.aborted) return false\n return new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve(true)\n }, ms)\n const onAbort = (): void => {\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n resolve(false)\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n", "/**\n * Voice-call observer real-time stream.\n *\n * The voice agent (\"agent-engine\") exposes a per-call WebSocket that emits\n * the live timeline of a call: transcripts (user + agent), emotion / empathy\n * frames, latency markers, tool invocations, navigation timing, and lifecycle\n * events (start / end / participant join / leave).\n *\n * This resource is the canonical SDK consumer for that stream. Before it\n * existed, every developer-console-style app re-implemented the loop by hand\n * \u2014 different idle thresholds, missing close-code handling for the long list\n * of voice-specific 4xxx codes (4001 unauthorized, 4003 forbidden, 4029 rate\n * limit, 4100 token expired), and inconsistent reconnect backoff.\n *\n * The implementation composes {@link createReconnectingWebSocket} with a\n * lightweight ``ObserverSSEEvent`` parser. Frames that don't deserialize or\n * lack a recognized ``type`` discriminator are dropped \u2014 the stream remains\n * forward-compatible with new event types added on the server before the SDK\n * spec snapshot picks them up.\n *\n * @see ConversationsResource.subscribeTextStream for the analogous text-stream\n * helper.\n */\n\nimport { ConfigurationError } from '../core/errors.js'\nimport {\n createReconnectingWebSocket,\n type ReconnectingWebSocketError,\n type ReconnectingWebSocketHandle,\n type ReconnectingWebSocketState,\n type WebSocketFactory,\n} from '../core/reconnecting-websocket.js'\nimport { type PlatformFetch } from '../core/openapi-client.js'\nimport type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource } from './base.js'\n\n/**\n * Discriminated union of every observer stream event variant. Members carry\n * their own ``type`` literal \u2014 narrow with ``switch (event.type)``.\n */\nexport type ObserverSSEEvent = components['schemas']['ObserverSSEEvent']\n\n/** Discriminator literal for {@link ObserverSSEEvent} members. */\nexport type ObserverSSEEventType = ObserverSSEEvent['type']\n\n/** Auth subprotocol pair for the observer WebSocket. */\nexport type ObserverAuthProtocols = readonly ['auth', string]\n\n/** Token grammar accepted in WebSocket subprotocols (RFC 6455). */\nconst WEB_SOCKET_PROTOCOL_TOKEN_RE = /^[!#$%&'*+\\-.^_`|~A-Za-z0-9]+$/\nconst MAX_AUTH_TOKEN_CHARS = 4096\n\n/** Options for {@link ObserversResource.subscribe}. */\nexport interface ObserverSubscribeOptions {\n /**\n * The Twilio Call SID (``CA\u2026``) identifying the call to observe. The\n * server returns 4004 if the call is unknown \u2014 most often a race in test\n * suites where the call hasn't been registered yet.\n */\n callSid: string\n\n /**\n * Bearer token for ``Sec-WebSocket-Protocol: auth, <token>``. If the\n * token contains characters that aren't valid in a WebSocket subprotocol\n * the helper throws ``ConfigurationError`` synchronously \u2014 the wire\n * protocol cannot carry it and a runtime failure mid-call would be much\n * harder to diagnose.\n */\n token: string\n\n /**\n * Full observer URL override. Defaults to\n * ``${agentBaseUrl}/v1/{workspace_id}/observers/{call_sid}/ws`` with\n * ``http`` mapped to ``ws`` and ``https`` mapped to ``wss``. The override\n * must be an absolute ws/wss URL with no query string or fragment \u2014 SDK-\n * managed query params are appended by the helper.\n */\n observerUrl?: string\n\n /** Cancellation signal \u2014 aborting closes the connection. */\n signal?: AbortSignal\n\n /** Fired once per typed event delivered by the server. */\n onEvent: (event: ObserverSSEEvent) => void\n\n /** Fired on each lifecycle transition. */\n onStateChange?: (state: ReconnectingWebSocketState) => void\n\n /**\n * Fired just before each reconnect attempt with the planned delay and\n * the close code that triggered the reconnect (or ``undefined`` for the\n * first attempt after a watchdog-driven close).\n */\n onReconnect?: (info: { attempt: number; delayMs: number; closeCode: number | undefined }) => void\n\n /**\n * Fired exactly once on terminal failure (auth rejected, reconnect\n * budget exhausted, abort, or one of the terminal close codes 4001 /\n * 4003 / 4100 / 4403). Will not fire on ordinary disconnect-and-reconnect.\n */\n onError?: (error: ReconnectingWebSocketError) => void\n\n /** Idle watchdog (ms). Defaults to 60s for voice-call streams. */\n idleTimeoutMs?: number\n\n /** Initial reconnect backoff (ms). Defaults to 1000. */\n initialDelayMs?: number\n\n /** Cap on reconnect backoff (ms). Defaults to 30_000. */\n maxDelayMs?: number\n\n /** Reconnect budget. Defaults to 10. */\n maxReconnects?: number\n\n /** Custom WebSocket factory \u2014 primarily for tests. */\n webSocketFactory?: WebSocketFactory\n}\n\n/**\n * Build browser WebSocket subprotocols for the observer stream.\n *\n * Identical wire format to the text-stream subprotocol pair \u2014\n * ``Sec-WebSocket-Protocol: auth, <token>`` \u2014 but exposed as its own\n * function so consumers do not have to reason about cross-resource sharing\n * and so the SDK can evolve the auth scheme independently per stream.\n *\n * @security The returned tuple contains the raw bearer token. Do not log,\n * persist, serialize, or otherwise expose this value.\n */\nexport function observerAuthProtocols(token: string): ObserverAuthProtocols {\n if (!token) {\n throw new ConfigurationError('observerAuthProtocols requires a non-empty token')\n }\n if (token.length > MAX_AUTH_TOKEN_CHARS) {\n throw new ConfigurationError(\n `observer token exceeds the ${MAX_AUTH_TOKEN_CHARS}-character WebSocket subprotocol limit`,\n )\n }\n if (!WEB_SOCKET_PROTOCOL_TOKEN_RE.test(token)) {\n throw new ConfigurationError(\n 'observer token contains characters browsers reject in WebSocket subprotocols',\n )\n }\n return ['auth', token] as const\n}\n\n/**\n * Voice-call observer resource.\n *\n * @example\n * ```ts\n * const handle = client.observers.subscribe({\n * callSid: 'CAxxx',\n * token: bearerToken,\n * onEvent: (event) => {\n * switch (event.type) {\n * case 'agent_transcript_delta':\n * renderAgentDelta(event.text)\n * break\n * case 'user_transcript':\n * renderUserTurn(event.text)\n * break\n * case 'session_end':\n * showSummary(event)\n * break\n * }\n * },\n * onError: (err) => console.error('observer terminal:', err.reason),\n * })\n *\n * // Later, to stop:\n * handle.close()\n * await handle.done\n * ```\n */\nexport class ObserversResource extends WorkspaceScopedResource {\n private readonly agentBaseUrl: string | undefined\n\n constructor(client: PlatformFetch, workspaceId: string, agentBaseUrl?: string) {\n super(client, workspaceId)\n this.agentBaseUrl = agentBaseUrl\n }\n\n /**\n * Subscribe to the live observer stream for a call.\n *\n * Returns a {@link ReconnectingWebSocketHandle} that resolves\n * ``handle.done`` when the stream terminates (consumer-aborted, terminal\n * close code, or reconnect budget exhausted). Errors are surfaced through\n * ``onError``; the promise never rejects.\n */\n subscribe(options: ObserverSubscribeOptions): ReconnectingWebSocketHandle {\n const url = buildObserverUrl({\n baseUrl: this.agentBaseUrl ?? this.platformBaseUrl,\n workspaceId: this.workspaceId,\n callSid: options.callSid,\n observerUrl: options.observerUrl,\n })\n\n const protocols = observerAuthProtocols(options.token)\n\n return createReconnectingWebSocket({\n url,\n protocols: [...protocols],\n onMessage: (ev) => {\n const parsed = parseObserverFrame(ev.data)\n if (parsed) {\n try {\n options.onEvent(parsed)\n } catch {\n // Consumer threw in onEvent \u2014 do not let it kill the loop.\n }\n }\n },\n onStateChange: options.onStateChange,\n onReconnect: options.onReconnect,\n onError: options.onError,\n signal: options.signal,\n idleTimeoutMs: options.idleTimeoutMs ?? 60_000,\n initialDelayMs: options.initialDelayMs ?? 1_000,\n maxDelayMs: options.maxDelayMs ?? 30_000,\n maxReconnects: options.maxReconnects ?? 10,\n webSocketFactory: options.webSocketFactory,\n })\n }\n}\n\n// ---------------------------------------------------------------------------\n// URL builder\n// ---------------------------------------------------------------------------\n\ninterface BuildObserverUrlArgs {\n baseUrl: string\n workspaceId: string\n callSid: string\n observerUrl?: string | undefined\n}\n\nconst CALL_SID_RE = /^CA[a-zA-Z0-9]{32}$/\n\nfunction buildObserverUrl(args: BuildObserverUrlArgs): string {\n if (!args.workspaceId) {\n throw new ConfigurationError('workspaceId is required to build the observer URL')\n }\n if (!args.callSid) {\n throw new ConfigurationError('callSid is required to subscribe to the observer stream')\n }\n if (args.observerUrl) {\n // Override path \u2014 the consumer has already constructed the full URL\n // (e.g. via a custom voice-agent gateway helper). Skip the Twilio CA\n // SID grammar check; the override owns the URL shape.\n return parseOverride(args.observerUrl).toString()\n }\n // Default path \u2014 derive ``/v1/{ws}/observers/{callSid}/ws`` and validate\n // the CA SID grammar so a typo fails at the function boundary instead of\n // mid-reconnect-loop with an opaque 4001.\n if (!CALL_SID_RE.test(args.callSid)) {\n throw new ConfigurationError(\n `callSid does not match Twilio CA SID format (CA + 32 hex chars): ${args.callSid}`,\n )\n }\n return deriveFromBase(args.baseUrl, args.workspaceId, args.callSid).toString()\n}\n\nfunction parseOverride(observerUrl: string): URL {\n let url: URL\n try {\n url = new URL(observerUrl)\n } catch (cause) {\n throw new ConfigurationError(\n `observerUrl must be an absolute URL: ${String(cause)}`,\n )\n }\n if (url.protocol !== 'ws:' && url.protocol !== 'wss:') {\n throw new ConfigurationError('observerUrl overrides must use ws: or wss: URLs')\n }\n if (url.search || url.hash) {\n throw new ConfigurationError(\n 'observerUrl overrides must not include query parameters or fragments',\n )\n }\n return url\n}\n\nfunction deriveFromBase(baseUrl: string, workspaceId: string, callSid: string): URL {\n let parsed: URL\n try {\n parsed = new URL(baseUrl)\n } catch (cause) {\n throw new ConfigurationError(\n `observerUrl cannot be derived from baseUrl: ${String(cause)}`,\n )\n }\n // Map http(s) to ws(s) \u2014 the agent-engine ALB serves both on the same host.\n let scheme: string\n if (parsed.protocol === 'https:' || parsed.protocol === 'wss:') scheme = 'wss:'\n else if (parsed.protocol === 'http:' || parsed.protocol === 'ws:') scheme = 'ws:'\n else {\n throw new ConfigurationError(\n `observerUrl can only be derived from an http, https, ws, or wss baseUrl: ${baseUrl}`,\n )\n }\n // The pathname must be '/' \u2014 observer paths are owned by this helper,\n // not the consumer's baseUrl gateway.\n if (parsed.pathname !== '/' && parsed.pathname !== '') {\n throw new ConfigurationError(\n 'observerUrl can only be derived from an origin-only baseUrl; pass observerUrl explicitly when using path-prefixed gateways',\n )\n }\n const out = new URL(`${scheme}//${parsed.host}/v1/${encodeURIComponent(workspaceId)}/observers/${encodeURIComponent(callSid)}/ws`)\n return out\n}\n\n// ---------------------------------------------------------------------------\n// Frame parser\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a raw WebSocket frame into a typed {@link ObserverSSEEvent}.\n *\n * Drift-tolerant: returns ``null`` on JSON decode errors, non-object\n * payloads, missing ``type`` discriminator, or unknown discriminator\n * values. The static type of ``ObserverSSEEvent`` is the contract \u2014 the\n * server may add new event types ahead of an SDK release and the consumer's\n * exhaustive ``switch`` will simply not match them, leaving the unknown\n * frame on the floor.\n */\nfunction parseObserverFrame(data: unknown): ObserverSSEEvent | null {\n let text: string\n if (typeof data === 'string') {\n text = data\n } else if (data instanceof ArrayBuffer) {\n text = new TextDecoder().decode(data)\n } else if (ArrayBuffer.isView(data)) {\n // ``data`` is some TypedArray; @types/node TextDecoder.decode wants\n // ``BufferSource``. Pass through as ``Uint8Array`` over the underlying\n // buffer so every TypedArray variant decodes consistently.\n const view = data as ArrayBufferView\n text = new TextDecoder().decode(\n new Uint8Array(view.buffer, view.byteOffset, view.byteLength),\n )\n } else {\n return null\n }\n\n let payload: unknown\n try {\n payload = JSON.parse(text)\n } catch {\n return null\n }\n if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) return null\n const obj = payload as Record<string, unknown>\n if (typeof obj['type'] !== 'string') return null\n return obj as ObserverSSEEvent\n}\n", "import type { components, paths } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\ntype Q<P extends keyof paths> = NonNullable<\n paths[P] extends { get: { parameters: { query?: infer Query } } } ? Query : never\n>\n\nexport type PatientSearchParams = Q<'/v1/{workspace_id}/fhir/patients'>\n/** Spec-defined query params for `/fhir/resources/{resource_type}` (FHIR-style search). */\nexport type FhirSearchParams = Q<'/v1/{workspace_id}/fhir/resources/{resource_type}'>\nexport type SyncFailuresParams = Q<'/v1/{workspace_id}/fhir/sync-failures'>\n\n// Each typed view has its own query shape in the spec \u2014 most share `q`,\n// `data_source_id`, `limit`, `offset` but `slots` adds scheduling filters.\n// Derive each separately so consumers get the right autocomplete and a\n// spec change to any single view is a typed signal.\nexport type FhirPatientsViewParams = Q<'/v1/{workspace_id}/fhir/views/patients'>\nexport type FhirAppointmentsViewParams = Q<'/v1/{workspace_id}/fhir/views/appointments'>\nexport type FhirPractitionersViewParams = Q<'/v1/{workspace_id}/fhir/views/practitioners'>\nexport type FhirOrganizationsViewParams = Q<'/v1/{workspace_id}/fhir/views/organizations'>\nexport type FhirLocationsViewParams = Q<'/v1/{workspace_id}/fhir/views/locations'>\nexport type FhirSlotsViewParams = Q<'/v1/{workspace_id}/fhir/views/slots'>\n\n/**\n * FHIR \u2014 healthcare data interop surface for connected EHR integrations.\n *\n * @beta New in this release; surface may evolve as the EHR adapters stabilize.\n *\n * Provides:\n * - Sync status + failure visibility (`status`, `syncFailures`)\n * - Bulk imports (`import`)\n * - FHIR-shaped CRUD on resources (`resources.*`)\n * - Patient-centric views (`patients`, `patientSummary`, `patientTimeline`)\n * - Pre-aggregated typed views per resource type (`views.*`)\n *\n * All operations are workspace-scoped; the FHIR server identity is determined\n * by the workspace's connected EHR integration.\n */\nexport class FhirResource extends WorkspaceScopedResource {\n /** Get current FHIR sync status (server identity, last sync, counts) */\n async getStatus() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/status', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** List recent FHIR sync failures (for triage) */\n async getSyncFailures(params?: SyncFailuresParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/sync-failures', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Trigger a FHIR import (full or partial, depending on request) */\n async import(body: components['schemas']['FhirImportRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/fhir/import', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Search patients by demographics or identifiers */\n async searchPatients(params?: PatientSearchParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/patients', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Get a patient summary (canonical demographics + active conditions/meds) */\n async getPatientSummary(patientId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/patients/{patient_id}/summary', {\n params: { path: { workspace_id: this.workspaceId, patient_id: patientId } },\n }),\n )\n }\n\n /** Get a patient's longitudinal clinical timeline */\n async getPatientTimeline(patientId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/patients/{patient_id}/timeline', {\n params: { path: { workspace_id: this.workspaceId, patient_id: patientId } },\n }),\n )\n }\n\n readonly resources = {\n /** Search FHIR resources of a given type (passes search params through to FHIR) */\n search: async (resourceType: string, params?: FhirSearchParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/resources/{resource_type}', {\n params: {\n path: { workspace_id: this.workspaceId, resource_type: resourceType },\n query: params,\n },\n }),\n ),\n\n /** Create a FHIR resource of the given type */\n create: async (resourceType: string, body: components['schemas']['FhirWriteRequest']) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/fhir/resources/{resource_type}', {\n params: { path: { workspace_id: this.workspaceId, resource_type: resourceType } },\n body,\n }),\n ),\n\n /** Get a single FHIR resource by type + id */\n get: async (resourceType: string, resourceId: string) =>\n extractData(\n await this.client.GET(\n '/v1/{workspace_id}/fhir/resources/{resource_type}/{resource_id}',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n resource_type: resourceType,\n resource_id: resourceId,\n },\n },\n },\n ),\n ),\n\n /** Update a FHIR resource by type + id */\n update: async (\n resourceType: string,\n resourceId: string,\n body: components['schemas']['FhirWriteRequest'],\n ) =>\n extractData(\n await this.client.PUT(\n '/v1/{workspace_id}/fhir/resources/{resource_type}/{resource_id}',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n resource_type: resourceType,\n resource_id: resourceId,\n },\n },\n body,\n },\n ),\n ),\n\n /** Get the version history for a FHIR resource */\n getHistory: async (resourceType: string, resourceId: string) =>\n extractData(\n await this.client.GET(\n '/v1/{workspace_id}/fhir/resources/{resource_type}/{resource_id}/history',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n resource_type: resourceType,\n resource_id: resourceId,\n },\n },\n },\n ),\n ),\n }\n\n readonly views = {\n /** List patients (typed view with computed display fields) */\n patients: async (params?: FhirPatientsViewParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/views/patients', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n /** List appointments */\n appointments: async (params?: FhirAppointmentsViewParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/views/appointments', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n /** List practitioners */\n practitioners: async (params?: FhirPractitionersViewParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/views/practitioners', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n /** List organizations */\n organizations: async (params?: FhirOrganizationsViewParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/views/organizations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n /** List locations */\n locations: async (params?: FhirLocationsViewParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/views/locations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n /**\n * List schedule slots \u2014 supports richer filtering than the other views\n * (status, date window, provider, specialty, service_type, facility_id).\n */\n slots: async (params?: FhirSlotsViewParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/views/slots', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Insights \u2014 natural-language analytics on workspace data.\n *\n * Surfaces the schema browser, suggestion catalog, ad-hoc SQL execution,\n * and chat sessions that reason over call/world data. Used by the\n * developer console's Insights tab.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class InsightsResource extends WorkspaceScopedResource {\n /** Get the periodic insights digest for the workspace */\n async getDigest() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/insights/digest', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Fetch the queryable schema (tables, columns, joins) the assistant uses */\n async getSchema() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/insights/schema', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get curated query suggestions for the workspace */\n async getSuggestions() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/insights/suggestions', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Run an ad-hoc SQL query against the insights warehouse */\n async runSql(body: components['schemas']['SqlQueryRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/insights/sql', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n readonly sessions = {\n /** Start a new insights chat session */\n create: async () =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/insights/sessions', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n\n /** Get a session and its full history */\n get: async (sessionId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/insights/sessions/{session_id}', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n ),\n\n /** Send a chat message and get the assistant's response (with any generated SQL/results) */\n chat: async (sessionId: string, body: components['schemas']['ChatRequest']) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/insights/sessions/{session_id}/chat', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n body,\n }),\n ),\n }\n}\n", "import type { components, paths } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type ListMonitorConceptsParams = NonNullable<\n paths['/v1/{workspace_id}/monitor-concepts']['get']['parameters']['query']\n>\n\n/**\n * Manage workspace monitor concepts \u2014 semantic patterns the platform watches\n * across calls to surface emerging behavior. Each concept holds a name,\n * description, and detection rules; the platform indexes them and lights\n * them up against live and historical traffic.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class MonitorConceptsResource extends WorkspaceScopedResource {\n /** Create a new monitor concept */\n async create(body: components['schemas']['CreateMonitorConceptRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/monitor-concepts', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List monitor concepts in the workspace */\n async list(params?: ListMonitorConceptsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/monitor-concepts', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListMonitorConceptsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single monitor concept */\n async get(conceptId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/monitor-concepts/{concept_id}', {\n params: { path: { workspace_id: this.workspaceId, concept_id: conceptId } },\n }),\n )\n }\n\n /** Update a monitor concept */\n async update(conceptId: string, body: components['schemas']['UpdateMonitorConceptRequest']) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/monitor-concepts/{concept_id}', {\n params: { path: { workspace_id: this.workspaceId, concept_id: conceptId } },\n body,\n }),\n )\n }\n\n /** Delete a monitor concept */\n async delete(conceptId: string) {\n return extractData(\n await this.client.DELETE('/v1/{workspace_id}/monitor-concepts/{concept_id}', {\n params: { path: { workspace_id: this.workspaceId, concept_id: conceptId } },\n }),\n )\n }\n}\n", "import type { components, paths } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type ListUnificationRulesParams = NonNullable<\n paths['/v1/{workspace_id}/unification-rules']['get']['parameters']['query']\n>\n\n/**\n * Manage entity unification rules \u2014 declarative joins that fold duplicate\n * world-model entities into a single canonical record. Rules are evaluated\n * on ingest; the surviving entity inherits properties from its merge sources.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class UnificationRulesResource extends WorkspaceScopedResource {\n /** Create a new unification rule */\n async create(body: components['schemas']['CreateUnificationRuleRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/unification-rules', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List unification rules in the workspace */\n async list(params?: ListUnificationRulesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/unification-rules', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListUnificationRulesParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single unification rule */\n async get(ruleId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/unification-rules/{rule_id}', {\n params: { path: { workspace_id: this.workspaceId, rule_id: ruleId } },\n }),\n )\n }\n\n /** Update a unification rule */\n async update(ruleId: string, body: components['schemas']['UpdateUnificationRuleRequest']) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/unification-rules/{rule_id}', {\n params: { path: { workspace_id: this.workspaceId, rule_id: ruleId } },\n body,\n }),\n )\n }\n\n /** Delete a unification rule */\n async delete(ruleId: string) {\n return extractData(\n await this.client.DELETE('/v1/{workspace_id}/unification-rules/{rule_id}', {\n params: { path: { workspace_id: this.workspaceId, rule_id: ruleId } },\n }),\n )\n }\n}\n", "import type { paths } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type CrmContactSearchParams = NonNullable<\n paths['/v1/{workspace_id}/crm/contacts']['get']['parameters']['query']\n>\nexport type CrmCompanySearchParams = NonNullable<\n paths['/v1/{workspace_id}/crm/companies']['get']['parameters']['query']\n>\nexport type CrmDealSearchParams = NonNullable<\n paths['/v1/{workspace_id}/crm/deals']['get']['parameters']['query']\n>\n\n/**\n * CRM \u2014 read-mostly view of contacts, companies, deals, and pipeline state\n * sourced from the connected CRM integration (HubSpot/Salesforce/etc.).\n *\n * The platform refreshes this view in the background; the SDK exposes search\n * + detail endpoints plus a per-contact activity timeline. Writes happen\n * upstream in the CRM itself, not here.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class CrmResource extends WorkspaceScopedResource {\n /** Health/status of the workspace's CRM integration sync */\n async getStatus() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/crm/status', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n readonly contacts = {\n list: async (params?: CrmContactSearchParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/crm/contacts', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n get: async (contactId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/crm/contacts/{contact_id}', {\n params: { path: { workspace_id: this.workspaceId, contact_id: contactId } },\n }),\n ),\n\n /** Per-contact activity timeline (calls, emails, deal events) */\n getTimeline: async (contactId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/crm/contacts/{contact_id}/timeline', {\n params: { path: { workspace_id: this.workspaceId, contact_id: contactId } },\n }),\n ),\n }\n\n readonly companies = {\n list: async (params?: CrmCompanySearchParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/crm/companies', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n get: async (companyId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/crm/companies/{company_id}', {\n params: { path: { workspace_id: this.workspaceId, company_id: companyId } },\n }),\n ),\n }\n\n readonly deals = {\n list: async (params?: CrmDealSearchParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/crm/deals', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n get: async (dealId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/crm/deals/{deal_id}', {\n params: { path: { workspace_id: this.workspaceId, deal_id: dealId } },\n }),\n ),\n\n /** Aggregated pipeline view: deals grouped by stage with rolled-up totals */\n getPipeline: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/crm/deals/pipeline', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Command Center \u2014 single rolled-up snapshot used to drive the developer\n * console's homepage tiles (active calls, queue depth, alerting status,\n * recent escalations, etc.). One endpoint, refreshed on demand.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class CommandCenterResource extends WorkspaceScopedResource {\n /** Get the current command-center snapshot */\n async get() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/command-center', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Sensorium \u2014 operator-facing observability for the live agent loop.\n *\n * Surfaces connector health (per-integration up/down + latency) and\n * end-to-end loop latency (turn ingest \u2192 response) for diagnosing\n * production regressions in real time.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class SensoriumResource extends WorkspaceScopedResource {\n /** Per-connector health snapshot (status + latency) */\n async getConnectorHealth() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/sensorium/connector-health', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** End-to-end agent loop latency breakdown (per-stage timings) */\n async getLoopLatency() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/sensorium/loop-latency', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import type { paths } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type DataQueryParams = NonNullable<\n paths['/v1/{workspace_id}/query/{schema}/{table}']['get']['parameters']['query']\n>\n\n/**\n * Generic typed data query \u2014 read rows from any whitelisted schema/table the\n * workspace exposes. Backed by the platform's catalog of analytics-grade\n * datasets; the schema and table are validated server-side.\n *\n * Used by the developer console's data-explorer surface.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class DataQueryResource extends WorkspaceScopedResource {\n /** Run a tabular query against a workspace dataset */\n async run(schema: string, table: string, params?: DataQueryParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/query/{schema}/{table}', {\n params: {\n path: { workspace_id: this.workspaceId, schema, table },\n query: params,\n },\n }),\n )\n }\n}\n", "import type { EntityId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Briefs \u2014 short, AI-generated context summaries about an entity. The GET\n * variant returns a cached brief; POST regenerates it on demand.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class BriefsResource extends WorkspaceScopedResource {\n /** Get the workspace-level brief */\n async get() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/brief', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Regenerate the workspace-level brief */\n async regenerate() {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/brief', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get the brief for a specific entity */\n async getForEntity(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/entities/{entity_id}/brief', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Regenerate the brief for a specific entity */\n async regenerateForEntity(entityId: EntityId | string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/entities/{entity_id}/brief', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n// Internal alias over the platform-keyed schema name\n// `src__routes__desktop_sessions__CreateSessionRequest`. The Python-module\n// prefix is unstable \u2014 once the platform team adds a `title=` annotation\n// the key disappears and the build fails. Kept module-private (no `export`)\n// so it never appears in the published `.d.ts` and downstream consumers\n// can't take a transitive dependency on the upstream key. Method\n// signatures consume it inline, so the class still exposes the right\n// structural body type to callers.\ntype CreateDesktopSessionRequest =\n components['schemas']['src__routes__desktop_sessions__CreateSessionRequest']\n\n/**\n * Desktop sessions \u2014 remote-controlled desktop instances the agent can use\n * to drive third-party apps (EHRs, CRMs) that lack APIs. Created on demand\n * and torn down when the agent finishes the workflow.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class DesktopSessionsResource extends WorkspaceScopedResource {\n /** Spin up a new desktop session */\n async create(body: CreateDesktopSessionRequest) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/desktop-sessions', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Disconnect / tear down a desktop session */\n async disconnect(sessionId: string) {\n return extractData(\n await this.client.DELETE('/v1/{workspace_id}/desktop-sessions/{session_id}', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n\n /** Drive a click / type / scroll action against the session */\n async sendAction(sessionId: string, body: components['schemas']['ActionRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/desktop-sessions/{session_id}/action', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n body,\n }),\n )\n }\n\n /** Get the latest screenshot for a session */\n async getScreenshot(sessionId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/desktop-sessions/{session_id}/screenshot', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n\n /** Get the session's current connection + activity status */\n async getStatus(sessionId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/desktop-sessions/{session_id}/status', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n}\n", "import type { components, paths } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type ListIntakeLinksParams = NonNullable<\n paths['/v1/{workspace_id}/intake/links']['get']['parameters']['query']\n>\n\n/**\n * Intake \u2014 short-lived signed links the workspace shares with patients to\n * collect documents (insurance cards, ID, referrals). Each link can receive\n * multiple uploads; uploads are downloadable for audit/review.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class IntakeResource extends WorkspaceScopedResource {\n readonly links = {\n list: async (params?: ListIntakeLinksParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/intake/links', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n create: async (body: components['schemas']['CreateLinkRequest']) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/intake/links', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n\n delete: async (linkId: string) =>\n extractData(\n await this.client.DELETE('/v1/{workspace_id}/intake/links/{link_id}', {\n params: { path: { workspace_id: this.workspaceId, link_id: linkId } },\n }),\n ),\n\n /** List uploads received against a link */\n listUploads: async (linkId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/intake/links/{link_id}/uploads', {\n params: { path: { workspace_id: this.workspaceId, link_id: linkId } },\n }),\n ),\n\n /** Get a download URL/payload for a single upload */\n downloadUpload: async (linkId: string, uploadId: string) =>\n extractData(\n await this.client.GET(\n '/v1/{workspace_id}/intake/links/{link_id}/uploads/{upload_id}/download',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n link_id: linkId,\n upload_id: uploadId,\n },\n },\n },\n ),\n ),\n }\n\n}\n\n// Direct-upload endpoint `/v1/{workspace_id}/intake/files` requires a signed\n// header set (x-amigo-intake-{sha256,timestamp,signature,customer-slug,filename})\n// and isn't a good fit for the typed resource layer. Consumers can call it via\n// `client.POST('/v1/{workspace_id}/intake/files', { params: { header: {...} } })`\n// once they have the signed header bundle from the platform.\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Network \u2014 outbound networking metadata for the workspace. Currently exposes\n * the platform's egress IP allowlist that customers add to firewall rules\n * before whitelisting integration callbacks.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class NetworkResource extends WorkspaceScopedResource {\n /** Get the platform's egress IPs the workspace's outbound traffic uses */\n async getEgressIps() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/network/egress-ips', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import type { paths } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport type ListPipelineSourcesParams = NonNullable<\n paths['/v1/{workspace_id}/pipeline/sources']['get']['parameters']['query']\n>\n\n/**\n * Pipeline \u2014 observability into the workspace's data ingestion pipeline:\n * source health, throughput, entity resolution metrics, review backlog,\n * outbound deliveries, and per-source overviews / event histories.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class PipelineResource extends WorkspaceScopedResource {\n /** Overall pipeline status (sources up/down, last successful run, etc.) */\n async getStatus() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/status', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Throughput buckets over the recent window */\n async getThroughput() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/throughput', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Review backlog metrics (pending merges, pending escalations) */\n async getReview() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/review', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Entity resolution metrics (merge rate, candidate rate, false-positive rate) */\n async getEntityResolution() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/entity-resolution', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n readonly outbound = {\n /** List recent outbound deliveries */\n list: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/outbound', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n\n /** Get the delivery log for a specific outbound data source */\n getLog: async (dataSourceId: string, params?: ListParams) =>\n extractData(\n await this.client.GET(\n '/v1/{workspace_id}/pipeline/outbound/{data_source_id}/log',\n {\n params: {\n path: { workspace_id: this.workspaceId, data_source_id: dataSourceId },\n query: params,\n },\n },\n ),\n ),\n }\n\n readonly sources = {\n /** List all configured pipeline sources */\n list: async (params?: ListPipelineSourcesParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/sources', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n /** Get a per-source overview (last sync, error counts, deltas) */\n getOverview: async (sourceId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/sources/{source_id}/overview', {\n params: { path: { workspace_id: this.workspaceId, source_id: sourceId } },\n }),\n ),\n\n /** Stream the source's recent events */\n listEvents: async (sourceId: string, params?: ListParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/sources/{source_id}/events', {\n params: {\n path: { workspace_id: this.workspaceId, source_id: sourceId },\n query: params,\n },\n }),\n ),\n\n /** Per-source historical timeline */\n getHistory: async (sourceId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/sources/{source_id}/history', {\n params: { path: { workspace_id: this.workspaceId, source_id: sourceId } },\n }),\n ),\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Tasks \u2014 long-running async jobs the platform spawns (intake processing,\n * tool executions, voice imports). The SDK exposes get-by-id and a\n * by-call lookup for retrieving every task tied to a specific call.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class TasksResource extends WorkspaceScopedResource {\n /** Get the current state of a single task */\n async get(taskId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/tasks/{task_id}', {\n params: { path: { workspace_id: this.workspaceId, task_id: taskId } },\n }),\n )\n }\n\n /** List every task associated with a call (by Twilio call sid) */\n async listByCall(callSid: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/tasks/by-call/{call_sid}', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid } },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { ServiceId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Tools \u2014 manual execution of integration-backed tool calls (used by the\n * tool-testing surface in the developer console) and per-service resolution\n * of which concrete tool implementations bind to a service's tool slots.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class ToolsResource extends WorkspaceScopedResource {\n /** Manually execute a tool call against the workspace's integrations */\n async execute(body: components['schemas']['ToolExecuteRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/tools/execute', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Resolve the bound tool implementations for a service */\n async resolveForService(serviceId: ServiceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/services/{service_id}/tools/resolve', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n }),\n )\n }\n}\n", "import type { components, paths } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type ListSurfacesParams = NonNullable<\n paths['/v1/{workspace_id}/surfaces']['get']['parameters']['query']\n>\n/** `/surfaces/review` is a narrower paged feed without the workspace-list filters. */\nexport type ListSurfacesForReviewParams = NonNullable<\n paths['/v1/{workspace_id}/surfaces/review']['get']['parameters']['query']\n>\n\n/**\n * Surfaces \u2014 short-lived form/intake experiences the platform delivers via\n * SMS / email / web. The full lifecycle is exposed: create, deliver, monitor\n * progress, gate for review, approve / reject / reshape, and archive.\n *\n * @beta New in this release; surface may evolve as the operator review flow\n * stabilizes.\n */\nexport class SurfacesResource extends WorkspaceScopedResource {\n /** List surfaces in the workspace */\n async list(params?: ListSurfacesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/surfaces', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListSurfacesParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Surfaces awaiting review (pending approval / rejection) */\n async listForReview(params?: ListSurfacesForReviewParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/surfaces/review', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Create a surface (form definition + delivery config) */\n async create(body: components['schemas']['CreateSurfaceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/surfaces', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Get a single surface */\n async get(surfaceId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/surfaces/{surface_id}', {\n params: { path: { workspace_id: this.workspaceId, surface_id: surfaceId } },\n }),\n )\n }\n\n /** Update surface metadata or fields */\n async update(surfaceId: string, body: components['schemas']['UpdateSurfaceRequest']) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/surfaces/{surface_id}', {\n params: { path: { workspace_id: this.workspaceId, surface_id: surfaceId } },\n body,\n }),\n )\n }\n\n /** Archive (soft-delete) a surface */\n async archive(surfaceId: string) {\n return extractData(\n await this.client.DELETE('/v1/{workspace_id}/surfaces/{surface_id}', {\n params: { path: { workspace_id: this.workspaceId, surface_id: surfaceId } },\n }),\n )\n }\n\n /** Deliver the surface to the recipient (SMS/email/etc.) */\n async deliver(surfaceId: string, body: components['schemas']['DeliverSurfaceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/surfaces/{surface_id}/deliver', {\n params: { path: { workspace_id: this.workspaceId, surface_id: surfaceId } },\n body,\n }),\n )\n }\n\n /** Get fill / completion progress for a surface */\n async getProgress(surfaceId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/surfaces/{surface_id}/progress', {\n params: { path: { workspace_id: this.workspaceId, surface_id: surfaceId } },\n }),\n )\n }\n\n /** Approve a pending-review surface */\n async approve(surfaceId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/surfaces/{surface_id}/approve', {\n params: { path: { workspace_id: this.workspaceId, surface_id: surfaceId } },\n }),\n )\n }\n\n /** Reject a pending-review surface */\n async reject(surfaceId: string, body: components['schemas']['RejectSurfaceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/surfaces/{surface_id}/reject', {\n params: { path: { workspace_id: this.workspaceId, surface_id: surfaceId } },\n body,\n }),\n )\n }\n\n /** Reshape \u2014 clone the surface with refined fields (review redirect) */\n async reshape(surfaceId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/surfaces/{surface_id}/reshape', {\n params: { path: { workspace_id: this.workspaceId, surface_id: surfaceId } },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Sessions \u2014 operator visibility into **live agent calls**. List the\n * currently active sessions across the workspace, and inject a one-shot\n * directive (text or audio) into a specific call's session mid-flight.\n *\n * Distinct from `client.simulations.sessions` (Playground / batch testing)\n * and `client.simulations.runs.createSession` (sub-session of a multi-run\n * batch). Those are read-write fixtures; this resource controls real,\n * in-progress operator-attended calls.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class SessionsResource extends WorkspaceScopedResource {\n /** List currently active sessions across the workspace */\n async listActive() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/sessions/active', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Inject a one-shot directive (text/audio) into a live call session */\n async inject(callSid: string, body: components['schemas']['InjectRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/sessions/{call_sid}/inject', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid } },\n body,\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\ntype OpenApiResult<T> = {\n data?: T\n error?: unknown\n response?: Response\n}\n\ntype ForkStatus = {\n endpoint?: string\n status?: string\n ttl_days?: number\n [key: string]: unknown\n}\n\ntype QueryResult = {\n columns?: string[]\n rows?: unknown[]\n row_count?: number\n [key: string]: unknown\n}\n\ntype QueryTool = {\n id?: string\n workspace_id?: string\n name?: string\n description?: string | null\n query?: string\n parameters?: Record<string, unknown>\n enabled?: boolean\n target?: string\n created_at?: string\n updated_at?: string\n [key: string]: unknown\n}\n\ntype QueryToolList = {\n items: QueryTool[]\n has_more?: boolean\n continuation_token?: number | null\n}\n\ntype JsonObject = Record<string, unknown>\n\nexport class WorkspaceDatabaseResource extends WorkspaceScopedResource {\n private get<T>(path: string, init?: object): Promise<OpenApiResult<T>> {\n return this.client.GET(path as never, init as never) as Promise<OpenApiResult<T>>\n }\n\n private post<T>(path: string, init?: object): Promise<OpenApiResult<T>> {\n return this.client.POST(path as never, init as never) as Promise<OpenApiResult<T>>\n }\n\n private patch<T>(path: string, init?: object): Promise<OpenApiResult<T>> {\n return this.client.PATCH(path as never, init as never) as Promise<OpenApiResult<T>>\n }\n\n private delete(path: string, init?: object): Promise<OpenApiResult<void>> {\n return this.client.DELETE(path as never, init as never) as Promise<OpenApiResult<void>>\n }\n\n // -- Fork lifecycle -------------------------------------------------------\n\n async getFork() {\n return extractData(\n await this.get<ForkStatus>('/v1/{workspace_id}/fork', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async createFork(body: JsonObject) {\n return extractData(\n await this.post<ForkStatus>('/v1/{workspace_id}/fork', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async deleteFork(): Promise<void> {\n await this.delete('/v1/{workspace_id}/fork', {\n params: { path: { workspace_id: this.workspaceId } },\n })\n }\n\n // -- Query execution ------------------------------------------------------\n\n async executeQuery(body: JsonObject) {\n return extractData(\n await this.post<QueryResult>('/v1/{workspace_id}/lakebase/query', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n // -- Query tool CRUD ------------------------------------------------------\n\n async listQueryTools(params?: ListParams) {\n return extractData(\n await this.get<QueryToolList>('/v1/{workspace_id}/query-tools', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listQueryToolsAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.listQueryTools(pageParams), params)\n }\n\n async createQueryTool(body: JsonObject) {\n return extractData(\n await this.post<QueryTool>('/v1/{workspace_id}/query-tools', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async updateQueryTool(toolId: string, body: JsonObject) {\n return extractData(\n await this.patch<QueryTool>('/v1/{workspace_id}/query-tools/{tool_id}', {\n params: { path: { workspace_id: this.workspaceId, tool_id: toolId } },\n body,\n }),\n )\n }\n\n async deleteQueryTool(toolId: string): Promise<void> {\n await this.delete('/v1/{workspace_id}/query-tools/{tool_id}', {\n params: { path: { workspace_id: this.workspaceId, tool_id: toolId } },\n })\n }\n\n async testQueryTool(toolId: string, body: JsonObject) {\n return extractData(\n await this.post<QueryResult>('/v1/{workspace_id}/query-tools/{tool_id}/test', {\n params: { path: { workspace_id: this.workspaceId, tool_id: toolId } },\n body,\n }),\n )\n }\n}\n", "/**\n * Branded types provide compile-time type safety for string IDs.\n * At runtime they are plain strings, but the type system prevents mixing them.\n */\ndeclare const brand: unique symbol\n\ntype Brand<T, B> = T & { readonly [brand]: B }\n\n// --- ID types ---\nexport type WorkspaceId = Brand<string, 'WorkspaceId'>\nexport type ApiKeyId = Brand<string, 'ApiKeyId'>\nexport type AgentId = Brand<string, 'AgentId'>\nexport type PersonaId = Brand<string, 'PersonaId'>\nexport type SkillId = Brand<string, 'SkillId'>\n/** @deprecated Use ActionId instead */\nexport type ActionId = Brand<string, 'ActionId'>\nexport type ServiceId = Brand<string, 'ServiceId'>\nexport type ContextGraphId = Brand<string, 'ContextGraphId'>\nexport type CallId = Brand<string, 'CallId'>\nexport type PhoneNumberId = Brand<string, 'PhoneNumberId'>\nexport type IntegrationId = Brand<string, 'IntegrationId'>\nexport type EntityId = Brand<string, 'EntityId'>\nexport type EventId = Brand<string, 'EventId'>\nexport type SurfaceId = Brand<string, 'SurfaceId'>\nexport type OperatorId = Brand<string, 'OperatorId'>\nexport type TriggerId = Brand<string, 'TriggerId'>\nexport type SimulationRunId = Brand<string, 'SimulationRunId'>\nexport type SimulationSessionId = Brand<string, 'SimulationSessionId'>\nexport type ScribeSessionId = Brand<string, 'ScribeSessionId'>\nexport type FunctionId = Brand<string, 'FunctionId'>\nexport type DataSourceId = Brand<string, 'DataSourceId'>\n\n// --- Constructors ---\nexport const workspaceId = (id: string): WorkspaceId => id as WorkspaceId\nexport const apiKeyId = (id: string): ApiKeyId => id as ApiKeyId\nexport const agentId = (id: string): AgentId => id as AgentId\nexport const personaId = (id: string): PersonaId => id as PersonaId\nexport const skillId = (id: string): SkillId => id as SkillId\nexport const actionId = (id: string): ActionId => id as ActionId\nexport const serviceId = (id: string): ServiceId => id as ServiceId\nexport const contextGraphId = (id: string): ContextGraphId => id as ContextGraphId\nexport const callId = (id: string): CallId => id as CallId\nexport const phoneNumberId = (id: string): PhoneNumberId => id as PhoneNumberId\nexport const integrationId = (id: string): IntegrationId => id as IntegrationId\nexport const entityId = (id: string): EntityId => id as EntityId\nexport const eventId = (id: string): EventId => id as EventId\nexport const surfaceId = (id: string): SurfaceId => id as SurfaceId\nexport const operatorId = (id: string): OperatorId => id as OperatorId\nexport const triggerId = (id: string): TriggerId => id as TriggerId\nexport const simulationRunId = (id: string): SimulationRunId => id as SimulationRunId\nexport const simulationSessionId = (id: string): SimulationSessionId => id as SimulationSessionId\nexport const scribeSessionId = (id: string): ScribeSessionId => id as ScribeSessionId\nexport const functionId = (id: string): FunctionId => id as FunctionId\nexport const dataSourceId = (id: string): DataSourceId => id as DataSourceId\n", "const textEncoder = new TextEncoder()\nconst MAX_TIMESTAMP_SKEW_MS = 5 * 60 * 1000\ntype WebCryptoLike = { subtle: NonNullable<typeof globalThis.crypto>['subtle'] }\n\nlet webCryptoPromise: Promise<WebCryptoLike> | undefined\n\nexport interface WebhookEvent<T = unknown> {\n id: string\n type: string\n timestamp: string\n data: T\n}\n\nexport interface WebhookVerificationOptions {\n payload: string | Uint8Array | ArrayBuffer\n signature: string\n secret: string\n timestamp?: string\n maxAgeMs?: number\n}\n\nexport interface ParseWebhookEventOptions<T = unknown> extends WebhookVerificationOptions {\n payload: string | Uint8Array | ArrayBuffer\n expectedType?: string\n reviver?: Parameters<typeof JSON.parse>[1]\n validate?: (event: WebhookEvent<T>) => void\n}\n\nexport class WebhookVerificationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'WebhookVerificationError'\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\nexport async function verifyWebhookSignature(\n payload: string | Uint8Array | ArrayBuffer,\n signature: string,\n secret: string,\n): Promise<boolean>\nexport async function verifyWebhookSignature(options: WebhookVerificationOptions): Promise<boolean>\nexport async function verifyWebhookSignature(\n payloadOrOptions: string | Uint8Array | ArrayBuffer | WebhookVerificationOptions,\n signature?: string,\n secret?: string,\n): Promise<boolean> {\n const options = normalizeVerificationOptions(payloadOrOptions, signature, secret)\n const payloadBytes = toUint8Array(options.payload)\n const expectedSignature = await signWebhookPayload(\n payloadBytes,\n options.secret,\n options.timestamp,\n )\n const actualSignature = normalizeSignature(options.signature)\n\n if (!actualSignature || !constantTimeEqual(expectedSignature, actualSignature)) {\n return false\n }\n\n if (options.timestamp) {\n const timestampMs = parseTimestamp(options.timestamp)\n if (timestampMs === undefined) return false\n\n const maxAgeMs = options.maxAgeMs ?? MAX_TIMESTAMP_SKEW_MS\n const now = Date.now()\n if (timestampMs > now + maxAgeMs || now - timestampMs > maxAgeMs) {\n return false\n }\n }\n\n return true\n}\n\nexport async function parseWebhookEvent<T = unknown>(\n payload: string,\n signature: string,\n secret: string,\n): Promise<WebhookEvent<T>>\nexport async function parseWebhookEvent<T = unknown>(\n options: ParseWebhookEventOptions<T>,\n): Promise<WebhookEvent<T>>\nexport async function parseWebhookEvent<T = unknown>(\n payloadOrOptions: string | ParseWebhookEventOptions<T>,\n signature?: string,\n secret?: string,\n): Promise<WebhookEvent<T>> {\n const options = normalizeParseOptions(payloadOrOptions, signature, secret)\n const valid = await verifyWebhookSignature(options)\n\n if (!valid) {\n throw new WebhookVerificationError('Invalid or expired webhook signature')\n }\n\n const payloadText = decodePayload(options.payload)\n\n let event: WebhookEvent<T>\n try {\n event = JSON.parse(payloadText, options.reviver) as WebhookEvent<T>\n } catch {\n throw new WebhookVerificationError('Invalid JSON webhook payload')\n }\n\n if (options.expectedType && event.type !== options.expectedType) {\n throw new WebhookVerificationError(\n `Unexpected webhook event type: expected ${options.expectedType}, received ${event.type}`,\n )\n }\n\n options.validate?.(event)\n return event\n}\n\nfunction normalizeVerificationOptions(\n payloadOrOptions: string | Uint8Array | ArrayBuffer | WebhookVerificationOptions,\n signature?: string,\n secret?: string,\n): WebhookVerificationOptions {\n if (\n typeof payloadOrOptions === 'object' &&\n payloadOrOptions !== null &&\n 'payload' in payloadOrOptions\n ) {\n return payloadOrOptions\n }\n\n if (!signature || !secret) {\n throw new TypeError('signature and secret are required')\n }\n\n return {\n payload: payloadOrOptions,\n signature,\n secret,\n }\n}\n\nfunction normalizeParseOptions<T>(\n payloadOrOptions: string | ParseWebhookEventOptions<T>,\n signature?: string,\n secret?: string,\n): ParseWebhookEventOptions<T> {\n if (\n typeof payloadOrOptions === 'object' &&\n payloadOrOptions !== null &&\n 'payload' in payloadOrOptions\n ) {\n return payloadOrOptions\n }\n\n if (!signature || !secret) {\n throw new TypeError('signature and secret are required')\n }\n\n return {\n payload: payloadOrOptions,\n signature,\n secret,\n }\n}\n\nfunction decodePayload(payload: string | Uint8Array | ArrayBuffer): string {\n if (typeof payload === 'string') return payload\n return new TextDecoder().decode(toUint8Array(payload))\n}\n\nfunction toUint8Array(payload: string | Uint8Array | ArrayBuffer): Uint8Array {\n if (typeof payload === 'string') return textEncoder.encode(payload)\n if (payload instanceof Uint8Array) return payload\n return new Uint8Array(payload)\n}\n\nasync function signWebhookPayload(\n payload: Uint8Array,\n secret: string,\n timestamp?: string,\n): Promise<Uint8Array> {\n const crypto = await resolveWebCrypto()\n const key = await crypto.subtle.importKey(\n 'raw',\n textEncoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n )\n\n const message = timestamp\n ? concatUint8Arrays(textEncoder.encode(`v1:${timestamp}:`), payload)\n : payload\n\n const mac = await crypto.subtle.sign('HMAC', key, toCryptoBuffer(message))\n return new Uint8Array(mac)\n}\n\nasync function resolveWebCrypto(): Promise<WebCryptoLike> {\n if (globalThis.crypto?.subtle) {\n return globalThis.crypto\n }\n\n webCryptoPromise ??= import('node:crypto').then(({ webcrypto }) => webcrypto as WebCryptoLike)\n return await webCryptoPromise\n}\n\nfunction normalizeSignature(signature: string): Uint8Array | undefined {\n const normalized = signature.startsWith('sha256=') ? signature.slice(7) : signature\n if (!/^[a-fA-F0-9]+$/.test(normalized) || normalized.length % 2 !== 0) {\n return undefined\n }\n\n const bytes = new Uint8Array(normalized.length / 2)\n for (let index = 0; index < normalized.length; index += 2) {\n bytes[index / 2] = Number.parseInt(normalized.slice(index, index + 2), 16)\n }\n return bytes\n}\n\nfunction constantTimeEqual(expected: Uint8Array, actual: Uint8Array): boolean {\n const maxLength = Math.max(expected.length, actual.length)\n let diff = expected.length ^ actual.length\n\n for (let index = 0; index < maxLength; index += 1) {\n diff |= (expected[index] ?? 0) ^ (actual[index] ?? 0)\n }\n\n return diff === 0\n}\n\nfunction parseTimestamp(timestamp: string): number | undefined {\n const numeric = Number(timestamp)\n if (Number.isFinite(numeric)) {\n return numeric < 1_000_000_000_000 ? numeric * 1000 : numeric\n }\n\n const parsed = Date.parse(timestamp)\n return Number.isNaN(parsed) ? undefined : parsed\n}\n\nfunction concatUint8Arrays(left: Uint8Array, right: Uint8Array): Uint8Array {\n const combined = new Uint8Array(left.length + right.length)\n combined.set(left, 0)\n combined.set(right, left.length)\n return combined\n}\n\nfunction toCryptoBuffer(bytes: Uint8Array): ArrayBuffer {\n const copy = Uint8Array.from(bytes)\n return copy.buffer\n}\n", "/**\n * RFC 8628 Device Authorization Grant for desktop and CLI apps.\n *\n * Authenticates users via the identity service's device code flow:\n * the app displays a code, the user approves in their browser,\n * and the app receives a workspace-scoped JWT.\n */\n\nimport { AmigoError, AuthenticationError, NetworkError, RateLimitError } from './errors.js'\n\n// --- Types ---\n\nexport interface DeviceCodeIssuance {\n device_code: string\n user_code: string\n verification_uri: string\n verification_uri_complete: string\n expires_in: number\n interval: number\n}\n\nexport interface IdentityTokenResponse {\n access_token: string\n token_type: 'Bearer' | 'DPoP'\n expires_in: number\n scope: string\n session_id?: string\n refresh_token?: string\n}\n\nexport interface WorkspaceChoice {\n workspace_id: string\n role?: string\n name?: string\n}\n\nexport interface MultiWorkspaceResponse {\n error: 'workspace_selection_required'\n workspaces: WorkspaceChoice[]\n access_token?: string\n token_type?: string\n expires_in?: number\n scope?: string\n refresh_token?: string\n}\n\nexport type DeviceCodeStatus =\n | 'authorization_pending'\n | 'polling'\n | 'approved'\n | 'expired'\n | 'denied'\n | 'slow_down'\n\nexport interface DeviceCodeLoginOptions {\n /** Identity service base URL. Default: https://api.platform.amigo.ai */\n identityBaseUrl?: string\n /** Pre-select workspace (skips workspace selection prompt) */\n workspaceId?: string\n /** Client description for audit logs */\n clientDescription?: string\n /** OAuth scope to request */\n scope?: string\n /** Called when device code is issued \u2014 display instructions to user */\n onCode: (issuance: DeviceCodeIssuance) => void | Promise<void>\n /** Called with polling status updates */\n onStatus?: (status: DeviceCodeStatus) => void\n /** Called when user must select a workspace \u2014 return the chosen workspace_id */\n onWorkspaceRequired: (workspaces: WorkspaceChoice[]) => Promise<string>\n /** AbortSignal to cancel the login flow */\n signal?: AbortSignal\n /** Custom fetch implementation */\n fetch?: typeof globalThis.fetch\n}\n\nexport interface AuthResult {\n accessToken: string\n refreshToken: string\n workspaceId: string\n expiresAt: number\n scope?: string\n}\n\nexport interface StoredCredentials {\n access_token: string\n refresh_token: string\n workspace_id: string\n expires_at: number\n scope?: string\n identity_base_url?: string\n}\n\nexport interface TokenStorage {\n load(): Promise<StoredCredentials | null>\n save(credentials: StoredCredentials): Promise<void>\n clear(): Promise<void>\n}\n\n// --- Errors ---\n\nexport class DeviceCodeExpiredError extends AmigoError {\n constructor(message = 'Device code expired. Please restart the login flow.') {\n super(message, { errorCode: 'device_code_expired' })\n }\n}\n\nexport class DeviceCodeDeniedError extends AmigoError {\n constructor(message = 'Authorization request was denied.') {\n super(message, { errorCode: 'device_code_denied' })\n }\n}\n\nexport class RefreshTokenExpiredError extends AuthenticationError {\n constructor(message = 'Refresh token expired. Please log in again.') {\n super(message, { errorCode: 'refresh_token_expired' })\n }\n}\n\nexport class LoginCancelledError extends AmigoError {\n constructor() {\n super('Login cancelled', { errorCode: 'login_cancelled' })\n }\n}\n\n// --- Identity Client ---\n\nconst DEFAULT_IDENTITY_URL = 'https://api.platform.amigo.ai'\n\nasync function identityPost(\n baseUrl: string,\n path: string,\n body: URLSearchParams,\n fetchFn: typeof globalThis.fetch,\n): Promise<Response> {\n try {\n // redirect: 'manual' is required because the identity service uses HTTP 300\n // (non-standard) for multi-workspace selection. Without it, fetch follows\n // the redirect automatically and the caller never sees the 300.\n return await fetchFn(`${baseUrl}${path}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n redirect: 'manual',\n })\n } catch (err) {\n throw new NetworkError('Network error contacting identity service', err)\n }\n}\n\nasync function requestDeviceCode(\n baseUrl: string,\n params: { clientDescription?: string; scope?: string },\n fetchFn: typeof globalThis.fetch,\n): Promise<DeviceCodeIssuance> {\n const body = new URLSearchParams()\n if (params.clientDescription) body.set('client_description', params.clientDescription)\n if (params.scope) body.set('scope', params.scope)\n\n const res = await identityPost(baseUrl, '/device/code', body, fetchFn)\n\n if (res.status === 429) {\n const retryAfter = parseInt(res.headers.get('Retry-After') ?? '', 10)\n throw new RateLimitError('Rate limited', {\n retryAfter: isNaN(retryAfter) ? undefined : retryAfter,\n })\n }\n if (!res.ok) {\n const err = (await res.json().catch(() => ({}))) as Record<string, string>\n throw new AmigoError(err.error_description ?? `Identity error (${res.status})`, {\n statusCode: res.status,\n errorCode: err.error,\n })\n }\n return (await res.json()) as DeviceCodeIssuance\n}\n\ntype PollResult =\n | { type: 'token'; data: IdentityTokenResponse }\n | { type: 'multi_workspace'; data: MultiWorkspaceResponse }\n | { type: 'pending' }\n | { type: 'slow_down' }\n\nasync function pollDeviceCode(\n baseUrl: string,\n deviceCode: string,\n scope: string | undefined,\n workspaceId: string | undefined,\n fetchFn: typeof globalThis.fetch,\n): Promise<PollResult> {\n const body = new URLSearchParams({ grant_type: 'device_code', device_code: deviceCode })\n if (scope) body.set('scope', scope)\n if (workspaceId) body.set('workspace_id', workspaceId)\n\n const res = await identityPost(baseUrl, '/token', body, fetchFn)\n\n if (res.status === 300)\n return { type: 'multi_workspace', data: (await res.json()) as MultiWorkspaceResponse }\n if (res.status === 200)\n return { type: 'token', data: (await res.json()) as IdentityTokenResponse }\n\n if (res.status === 400) {\n const err = (await res.json().catch(() => ({ error: 'unknown' }))) as Record<string, string>\n if (err.error === 'authorization_pending') return { type: 'pending' }\n if (err.error === 'slow_down') return { type: 'slow_down' }\n throw new AmigoError(err.error_description ?? err.error ?? `Identity error (400)`, {\n statusCode: 400,\n errorCode: err.error,\n })\n }\n\n throw new AmigoError(`Identity error (${res.status})`, { statusCode: res.status })\n}\n\nasync function doRefreshToken(\n baseUrl: string,\n params: { refreshToken: string; workspaceId?: string; scope?: string },\n fetchFn: typeof globalThis.fetch,\n): Promise<IdentityTokenResponse> {\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: params.refreshToken,\n })\n if (params.workspaceId) body.set('workspace_id', params.workspaceId)\n if (params.scope) body.set('scope', params.scope)\n\n const res = await identityPost(baseUrl, '/token', body, fetchFn)\n\n if (!res.ok) {\n const err = (await res.json().catch(() => ({}))) as Record<string, string>\n throw new AmigoError(err.error_description ?? `Identity error (${res.status})`, {\n statusCode: res.status,\n errorCode: err.error,\n })\n }\n return (await res.json()) as IdentityTokenResponse\n}\n\n// --- JWT decode (no verification \u2014 server validates) ---\n\nexport function decodeJwtPayload(jwt: string): Record<string, unknown> | null {\n try {\n const parts = jwt.split('.')\n if (parts.length !== 3 || !parts[1]) return null\n const payload = Buffer.from(parts[1], 'base64url').toString()\n return JSON.parse(payload) as Record<string, unknown>\n } catch {\n return null\n }\n}\n\n// --- Device Code Login ---\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new LoginCancelledError())\n return\n }\n const timer = setTimeout(resolve, ms)\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer)\n reject(new LoginCancelledError())\n },\n { once: true },\n )\n })\n}\n\nfunction toAuthResult(token: IdentityTokenResponse, workspaceIdOverride?: string): AuthResult {\n const claims = decodeJwtPayload(token.access_token)\n const workspaceId = workspaceIdOverride ?? (claims?.workspace_id as string) ?? ''\n if (!workspaceId) {\n throw new AmigoError('Token does not contain a workspace_id claim', {\n errorCode: 'missing_workspace',\n })\n }\n return {\n accessToken: token.access_token,\n refreshToken: token.refresh_token ?? '',\n workspaceId,\n expiresAt:\n (claims?.exp as number) ??\n (token.expires_in\n ? Math.floor(Date.now() / 1000) + token.expires_in\n : Math.floor(Date.now() / 1000) + 900),\n scope: token.scope,\n }\n}\n\nasync function fetchWorkspaces(\n baseUrl: string,\n accessToken: string,\n fetchFn: typeof globalThis.fetch,\n): Promise<WorkspaceChoice[]> {\n // Try /self/profile first (identity service direct route)\n for (const path of ['/self/profile', '/self']) {\n const res = await fetchFn(`${baseUrl}${path}`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n })\n if (res.ok) {\n const data = (await res.json()) as {\n workspaces?: Array<{ workspace_id: string; role?: string; name?: string }>\n }\n return (data.workspaces ?? []).map((ws) => ({\n workspace_id: ws.workspace_id,\n role: ws.role,\n name: ws.name,\n }))\n }\n if (res.status !== 404) {\n throw new AmigoError(`Failed to fetch workspaces (${res.status})`, { statusCode: res.status })\n }\n }\n return []\n}\n\nasync function resolveWorkspaceFromBootstrap(\n baseUrl: string,\n token: IdentityTokenResponse,\n options: DeviceCodeLoginOptions,\n fetchFn: typeof globalThis.fetch,\n): Promise<AuthResult> {\n if (!token.refresh_token) {\n throw new AmigoError('Bootstrap token missing refresh_token', { errorCode: 'server_error' })\n }\n\n const workspaces = await fetchWorkspaces(baseUrl, token.access_token, fetchFn)\n\n if (workspaces.length === 0) {\n throw new AmigoError(\n 'No workspace memberships found. Create a workspace or request an invitation.',\n { errorCode: 'no_workspaces' },\n )\n }\n\n if (workspaces.length === 1 && workspaces[0]) {\n const scoped = await doRefreshToken(\n baseUrl,\n {\n refreshToken: token.refresh_token,\n workspaceId: workspaces[0].workspace_id,\n scope: options.scope,\n },\n fetchFn,\n )\n return toAuthResult(scoped, workspaces[0].workspace_id)\n }\n\n const workspaceId = await options.onWorkspaceRequired(workspaces)\n const scoped = await doRefreshToken(\n baseUrl,\n { refreshToken: token.refresh_token, workspaceId, scope: options.scope },\n fetchFn,\n )\n return toAuthResult(scoped, workspaceId)\n}\n\nasync function resolveWorkspaceFromMulti(\n baseUrl: string,\n multi: MultiWorkspaceResponse,\n options: DeviceCodeLoginOptions,\n fetchFn: typeof globalThis.fetch,\n): Promise<AuthResult> {\n if (!multi.refresh_token) {\n throw new AmigoError('Multi-workspace response missing refresh_token', {\n errorCode: 'server_error',\n })\n }\n\n const workspaceId = await options.onWorkspaceRequired(multi.workspaces)\n const scoped = await doRefreshToken(\n baseUrl,\n { refreshToken: multi.refresh_token, workspaceId, scope: options.scope },\n fetchFn,\n )\n return toAuthResult(scoped, workspaceId)\n}\n\nexport async function loginWithDeviceCode(options: DeviceCodeLoginOptions): Promise<AuthResult> {\n const baseUrl = (options.identityBaseUrl ?? DEFAULT_IDENTITY_URL).replace(/\\/+$/, '')\n const fetchFn = options.fetch ?? globalThis.fetch\n\n const issuance = await requestDeviceCode(\n baseUrl,\n { clientDescription: options.clientDescription, scope: options.scope },\n fetchFn,\n )\n\n await options.onCode(issuance)\n\n // Poll loop\n let interval = issuance.interval * 1000\n const deadline = Date.now() + issuance.expires_in * 1000\n\n while (Date.now() < deadline) {\n if (options.signal?.aborted) throw new LoginCancelledError()\n\n await sleep(interval, options.signal)\n\n if (options.signal?.aborted) throw new LoginCancelledError()\n\n options.onStatus?.('polling')\n\n try {\n const result = await pollDeviceCode(\n baseUrl,\n issuance.device_code,\n options.scope,\n options.workspaceId,\n fetchFn,\n )\n\n if (result.type === 'pending') {\n options.onStatus?.('authorization_pending')\n continue\n }\n\n // RFC 8628 \u00A73.5: increase interval by 5 seconds on slow_down\n if (result.type === 'slow_down') {\n interval += 5000\n options.onStatus?.('slow_down')\n continue\n }\n\n options.onStatus?.('approved')\n\n if (result.type === 'token') {\n const claims = decodeJwtPayload(result.data.access_token)\n const isBootstrap = claims?.workspace_bootstrap || !claims?.workspace_id\n if (isBootstrap && result.data.refresh_token) {\n // Bootstrap token \u2014 need workspace selection via refresh_token exchange\n if (options.workspaceId) {\n const scoped = await doRefreshToken(\n baseUrl,\n {\n refreshToken: result.data.refresh_token,\n workspaceId: options.workspaceId,\n scope: options.scope,\n },\n fetchFn,\n )\n return toAuthResult(scoped, options.workspaceId)\n }\n return await resolveWorkspaceFromBootstrap(baseUrl, result.data, options, fetchFn)\n }\n return toAuthResult(result.data)\n }\n\n // multi_workspace (HTTP 300) \u2014 workspace list included in response\n return await resolveWorkspaceFromMulti(baseUrl, result.data, options, fetchFn)\n } catch (err) {\n if (err instanceof AmigoError && err.errorCode === 'expired_token') {\n options.onStatus?.('expired')\n throw new DeviceCodeExpiredError()\n }\n if (err instanceof AmigoError && err.errorCode === 'access_denied') {\n options.onStatus?.('denied')\n throw new DeviceCodeDeniedError()\n }\n throw err\n }\n }\n\n options.onStatus?.('expired')\n throw new DeviceCodeExpiredError()\n}\n\n// --- Token Manager ---\n\nconst REFRESH_BUFFER_SECONDS = 60\n\nexport interface TokenManagerConfig {\n storage?: TokenStorage\n identityBaseUrl?: string\n fetch?: typeof globalThis.fetch\n}\n\nexport class TokenManager {\n private readonly _storage: TokenStorage\n private readonly _baseUrl: string\n private readonly _fetch: typeof globalThis.fetch\n private _cached: StoredCredentials | null = null\n private _refreshPromise: Promise<StoredCredentials> | null = null\n\n constructor(config: TokenManagerConfig = {}) {\n this._storage = config.storage ?? new FileTokenStorage()\n this._baseUrl = (config.identityBaseUrl ?? DEFAULT_IDENTITY_URL).replace(/\\/+$/, '')\n this._fetch = config.fetch ?? globalThis.fetch\n }\n\n async store(result: AuthResult): Promise<void> {\n const creds: StoredCredentials = {\n access_token: result.accessToken,\n refresh_token: result.refreshToken,\n workspace_id: result.workspaceId,\n expires_at: result.expiresAt,\n scope: result.scope,\n }\n this._cached = creds\n await this._storage.save(creds)\n }\n\n async getAccessToken(): Promise<{ token: string; workspaceId: string } | null> {\n const creds = await this._loadCached()\n if (!creds) return null\n if (creds.expires_at - Math.floor(Date.now() / 1000) >= REFRESH_BUFFER_SECONDS) {\n return { token: creds.access_token, workspaceId: creds.workspace_id }\n }\n const refreshed = await this._refresh(creds)\n return { token: refreshed.access_token, workspaceId: refreshed.workspace_id }\n }\n\n async hasCredentials(): Promise<boolean> {\n return (await this._loadCached()) !== null\n }\n\n async clear(): Promise<void> {\n this._cached = null\n this._refreshPromise = null\n await this._storage.clear()\n }\n\n private async _loadCached(): Promise<StoredCredentials | null> {\n if (this._cached) return this._cached\n const loaded = await this._storage.load()\n if (loaded) this._cached = loaded\n return loaded\n }\n\n private async _refresh(current: StoredCredentials): Promise<StoredCredentials> {\n if (this._refreshPromise) return this._refreshPromise\n this._refreshPromise = this._doRefresh(current).finally(() => {\n this._refreshPromise = null\n })\n return this._refreshPromise\n }\n\n private async _doRefresh(current: StoredCredentials): Promise<StoredCredentials> {\n if (!current.refresh_token) throw new RefreshTokenExpiredError('No refresh token available')\n\n try {\n const response = await doRefreshToken(\n this._baseUrl,\n {\n refreshToken: current.refresh_token,\n workspaceId: current.workspace_id,\n scope: current.scope,\n },\n this._fetch,\n )\n const claims = decodeJwtPayload(response.access_token)\n const refreshed: StoredCredentials = {\n access_token: response.access_token,\n refresh_token: response.refresh_token ?? current.refresh_token,\n workspace_id: current.workspace_id,\n expires_at: (claims?.exp as number) ?? Math.floor(Date.now() / 1000) + response.expires_in,\n scope: response.scope ?? current.scope,\n }\n this._cached = refreshed\n await this._storage.save(refreshed)\n return refreshed\n } catch (err) {\n if (\n err instanceof AmigoError &&\n (err.statusCode === 401 || err.errorCode === 'invalid_grant')\n ) {\n await this.clear()\n throw new RefreshTokenExpiredError()\n }\n throw err\n }\n }\n}\n\n// --- Token Storage ---\n\nexport class FileTokenStorage implements TokenStorage {\n private readonly _explicitPath: string | undefined\n private _resolvedPath: string | undefined\n\n constructor(filePath?: string) {\n this._explicitPath = filePath\n }\n\n private async _filePath(): Promise<string> {\n if (this._explicitPath) return this._explicitPath\n if (this._resolvedPath) return this._resolvedPath\n const os = await import('node:os')\n const path = await import('node:path')\n this._resolvedPath = path.join(os.homedir(), '.amigo', 'credentials.json')\n return this._resolvedPath\n }\n\n async load(): Promise<StoredCredentials | null> {\n const fs = await import('node:fs/promises')\n const filePath = await this._filePath()\n try {\n const raw = await fs.readFile(filePath, 'utf-8')\n const data = JSON.parse(raw)\n if (\n typeof data.access_token === 'string' &&\n typeof data.refresh_token === 'string' &&\n typeof data.workspace_id === 'string' &&\n typeof data.expires_at === 'number'\n ) {\n return data as StoredCredentials\n }\n return null\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') return null\n throw err\n }\n }\n\n async save(credentials: StoredCredentials): Promise<void> {\n const fs = await import('node:fs/promises')\n const path = await import('node:path')\n const filePath = await this._filePath()\n await fs.mkdir(path.dirname(filePath), { recursive: true, mode: 0o700 })\n await fs.writeFile(filePath, JSON.stringify(credentials, null, 2) + '\\n', { mode: 0o600 })\n await fs.chmod(filePath, 0o600)\n }\n\n async clear(): Promise<void> {\n const fs = await import('node:fs/promises')\n const filePath = await this._filePath()\n try {\n await fs.unlink(filePath)\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') return\n throw err\n }\n }\n}\n\nexport class MemoryTokenStorage implements TokenStorage {\n private _credentials: StoredCredentials | null = null\n async load(): Promise<StoredCredentials | null> {\n return this._credentials\n }\n async save(credentials: StoredCredentials): Promise<void> {\n this._credentials = { ...credentials }\n }\n async clear(): Promise<void> {\n this._credentials = null\n }\n}\n\n// --- CLI Helpers ---\n\nexport function formatDeviceCodeInstructions(issuance: DeviceCodeIssuance): string {\n return [\n '',\n ' To sign in, open your browser and visit:',\n '',\n ` ${issuance.verification_uri}`,\n '',\n ' Then enter this code:',\n '',\n ` ${issuance.user_code}`,\n '',\n ` This code expires in ${Math.floor(issuance.expires_in / 60)} minutes.`,\n '',\n ].join('\\n')\n}\n\nexport function formatDeviceCodeLink(issuance: DeviceCodeIssuance): string {\n return `\\x1b]8;;${issuance.verification_uri_complete}\\x07Open browser to approve\\x1b]8;;\\x07`\n}\n\nexport async function openBrowser(url: string): Promise<boolean> {\n const { spawn } = await import('node:child_process')\n\n const openers: Record<string, { cmd: string; args: string[] }> = {\n darwin: { cmd: 'open', args: [url] },\n win32: { cmd: 'cmd', args: ['/c', 'start', '', url] },\n linux: { cmd: 'xdg-open', args: [url] },\n }\n\n const opener = openers[process.platform]\n if (!opener) return false\n\n return new Promise((resolve) => {\n // shell: false prevents command injection from malformed URLs\n const child = spawn(opener.cmd, opener.args, { stdio: 'ignore', shell: false, detached: true })\n child.on('error', () => resolve(false))\n child.on('close', (code) => resolve(code === 0))\n child.unref()\n })\n}\n\nexport function formatWorkspaceList(workspaces: WorkspaceChoice[]): string {\n const lines = ['', ' Available workspaces:', '']\n workspaces.forEach((ws, i) => {\n const name = ws.name ?? ws.workspace_id\n const role = ws.role ? ` (${ws.role})` : ''\n lines.push(` ${i + 1}. ${name}${role}`)\n if (ws.name) lines.push(` ${ws.workspace_id}`)\n })\n lines.push('')\n return lines.join('\\n')\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * @amigo-ai/platform-sdk\n *\n * Official TypeScript SDK for the Amigo Platform API.\n *\n * @example\n * ```typescript\n * import { AmigoClient } from '@amigo-ai/platform-sdk'\n *\n * const client = new AmigoClient({\n * apiKey: 'your-api-key',\n * workspaceId: 'your-workspace-id',\n * })\n *\n * const agents = await client.agents.list()\n * console.log(agents.items)\n * ```\n */\n\nimport type { FetchResponse, HeadersOptions } from 'openapi-fetch'\nimport type { MediaType, PathsWithMethod } from 'openapi-typescript-helpers'\nimport { ConfigurationError } from './core/errors.js'\nimport {\n applyPlatformRequestOptions,\n createPlatformClient,\n type ClientHooks,\n type PlatformFetch,\n} from './core/openapi-client.js'\nimport {\n mergeRequestOptions,\n type AmigoRequestOptions,\n type InitParam,\n type OperationFor,\n type ScopedRequestOptions,\n} from './core/request-options.js'\nimport type { RetryOptions } from './core/retry.js'\nimport { MeResource } from './resources/me.js'\nimport { WorkspacesResource } from './resources/workspaces.js'\nimport { ApiKeysResource } from './resources/api-keys.js'\nimport { AgentsResource } from './resources/agents.js'\nimport { SkillsResource } from './resources/skills.js'\nimport { ActionsResource } from './resources/actions.js'\nimport { OperatorsResource } from './resources/operators.js'\nimport { PromptLogsResource } from './resources/prompt-logs.js'\nimport { TriggersResource } from './resources/triggers.js'\nimport { ServicesResource } from './resources/services.js'\nimport { ContextGraphsResource } from './resources/context-graphs.js'\nimport { DataSourcesResource } from './resources/data-sources.js'\nimport { WorldResource } from './resources/world.js'\nimport { CallsResource } from './resources/calls.js'\nimport { ConversationsResource } from './resources/conversations.js'\nimport { ChannelsResource } from './resources/channels/index.js'\nimport { PhoneNumbersResource } from './resources/phone-numbers.js'\nimport { IntegrationsResource } from './resources/integrations.js'\nimport { AnalyticsResource } from './resources/analytics.js'\nimport { SimulationsResource } from './resources/simulations.js'\nimport { MetricsResource } from './resources/metrics.js'\nimport { SettingsResource } from './resources/settings.js'\nimport { BillingResource } from './resources/billing.js'\nimport { MemoryResource } from './resources/memory.js'\nimport { PersonasResource } from './resources/personas.js'\nimport { ReviewQueueResource } from './resources/review-queue.js'\nimport { RecordingsResource } from './resources/recordings.js'\nimport { AuditResource } from './resources/audit.js'\nimport { WebhookDestinationsResource } from './resources/webhook-destinations.js'\nimport { SafetyResource } from './resources/safety.js'\nimport { ComplianceResource } from './resources/compliance.js'\nimport { EventsResource } from './resources/events.js'\nimport { FunctionsResource } from './resources/functions.js'\nimport { ObserversResource } from './resources/observers.js'\nimport { FhirResource } from './resources/fhir.js'\nimport { InsightsResource } from './resources/insights.js'\nimport { MonitorConceptsResource } from './resources/monitor-concepts.js'\nimport { UnificationRulesResource } from './resources/unification-rules.js'\nimport { CrmResource } from './resources/crm.js'\nimport { CommandCenterResource } from './resources/command-center.js'\nimport { SensoriumResource } from './resources/sensorium.js'\nimport { DataQueryResource } from './resources/data-query.js'\nimport { BriefsResource } from './resources/briefs.js'\nimport { DesktopSessionsResource } from './resources/desktop-sessions.js'\nimport { IntakeResource } from './resources/intake.js'\nimport { NetworkResource } from './resources/network.js'\nimport { PipelineResource } from './resources/pipeline.js'\nimport { TasksResource } from './resources/tasks.js'\nimport { ToolsResource } from './resources/tools.js'\nimport { SurfacesResource } from './resources/surfaces.js'\nimport { SessionsResource } from './resources/sessions.js'\nimport { WorkspaceDatabaseResource } from './resources/workspace-database.js'\nimport { resolveScopedPlatformClient, scopePlatformClient } from './resources/base.js'\nimport type { components, paths } from './generated/api.js'\nimport type { MetricValue as MetricValueAlias } from './resources/metrics.js'\nimport { withResponse, type AmigoResponse } from './core/utils.js'\n\nexport const DEFAULT_BASE_URL = 'https://api.platform.amigo.ai'\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] }\n// The generated client exposes TRACE, but the SDK only publishes helpers for\n// platform methods that exist in the committed OpenAPI snapshot.\ntype PlatformMethod = 'get' | 'put' | 'post' | 'delete' | 'options' | 'head' | 'patch'\ntype EmptyOptions = Record<never, never>\ntype PathForMethod<Method extends PlatformMethod> = Extract<PathsWithMethod<paths, Method>, string>\ntype SuccessData<Operation extends Record<string | number, unknown>> = Extract<\n FetchResponse<Operation, EmptyOptions, MediaType>,\n { error?: never }\n>['data']\ntype IsNever<Value> = [Value] extends [never] ? true : false\ntype DefinedSuccessData<Operation extends Record<string | number, unknown>> = Exclude<\n SuccessData<Operation>,\n undefined\n>\n// Success data preserves nullable response bodies. Endpoints with no success\n// body resolve to undefined so low-level helpers can represent 204/205 results.\ntype OperationResponse<\n Path extends keyof paths & string,\n Method extends PlatformMethod,\n> = Method extends keyof paths[Path]\n ? paths[Path][Method] extends infer Operation extends Record<string | number, unknown>\n ? IsNever<SuccessData<Operation>> extends true\n ? never\n : // Preserve nullable success bodies; only no-content operations collapse to undefined.\n [DefinedSuccessData<Operation>] extends [never]\n ? undefined\n : DefinedSuccessData<Operation>\n : never\n : never\n\nexport interface AmigoClientConfig {\n /** API key created via POST /v1/{workspace_id}/api-keys */\n apiKey: string\n\n /** Workspace ID \u2014 all resource operations are scoped to this workspace */\n workspaceId: string\n\n /**\n * Override the base URL. Defaults to https://api.platform.amigo.ai\n *\n * For BFF proxy patterns (e.g., Next.js), point this at your proxy:\n * ```ts\n * new AmigoClient({ baseUrl: '/api/platform', ... })\n * ```\n */\n baseUrl?: string\n\n /** Retry configuration for failed requests */\n retry?: RetryOptions\n\n /** Convenience alias for retry count (same semantics as \"number of retries\") */\n maxRetries?: number\n\n /** Default request timeout in milliseconds */\n timeout?: number\n\n /** Additional headers sent with every request */\n headers?: HeadersOptions\n\n /** Request lifecycle hooks for logging, tracing, or metrics */\n hooks?: ClientHooks\n\n /**\n * Custom fetch implementation.\n *\n * Use for BFF proxy routing, server-side cookie forwarding,\n * or test mocking. When provided, all HTTP requests flow\n * through this function instead of globalThis.fetch.\n */\n fetch?: typeof globalThis.fetch\n\n /**\n * Base URL for the agent engine (voice-agent) WebSocket endpoints.\n *\n * Required when `baseUrl` points to a BFF proxy or a different host\n * than the agent engine \u2014 WebSockets cannot traverse HTTP proxies.\n * Used by `conversations.textStreamUrl()` to build the `ws://` URL.\n *\n * Accepts `http://` or `https://` (auto-mapped to `ws://` / `wss://`)\n * or direct `ws://` / `wss://` URLs.\n *\n * Defaults to deriving from `baseUrl` (works when REST API and agent\n * engine share the same origin).\n *\n * ```ts\n * new AmigoClient({\n * baseUrl: '/api/platform', // BFF proxy for REST\n * agentBaseUrl: 'wss://api.platform.amigo.ai', // direct for WS\n * ...\n * })\n * ```\n */\n agentBaseUrl?: string\n}\n\nexport class AmigoClient {\n readonly workspaceId!: string\n readonly baseUrl!: string\n readonly agentBaseUrl!: string | undefined\n readonly workspaces!: WorkspacesResource\n readonly me!: MeResource\n readonly apiKeys!: ApiKeysResource\n readonly agents!: AgentsResource\n /** @deprecated Use `actions` instead */\n readonly skills!: SkillsResource\n readonly actions!: ActionsResource\n readonly operators!: OperatorsResource\n readonly promptLogs!: PromptLogsResource\n readonly triggers!: TriggersResource\n readonly services!: ServicesResource\n readonly contextGraphs!: ContextGraphsResource\n readonly dataSources!: DataSourcesResource\n readonly world!: WorldResource\n readonly calls!: CallsResource\n readonly conversations!: ConversationsResource\n readonly channels!: ChannelsResource\n readonly phoneNumbers!: PhoneNumbersResource\n readonly integrations!: IntegrationsResource\n readonly analytics!: AnalyticsResource\n readonly simulations!: SimulationsResource\n readonly metrics!: MetricsResource\n readonly settings!: SettingsResource\n readonly billing!: BillingResource\n readonly memory!: MemoryResource\n readonly personas!: PersonasResource\n readonly reviewQueue!: ReviewQueueResource\n readonly recordings!: RecordingsResource\n readonly audit!: AuditResource\n readonly webhookDestinations!: WebhookDestinationsResource\n readonly safety!: SafetyResource\n readonly compliance!: ComplianceResource\n readonly events!: EventsResource\n readonly functions!: FunctionsResource\n /**\n * Voice-call observer real-time stream. Subscribe with\n * ``client.observers.subscribe({ callSid, token, onEvent })``. See\n * {@link ObserversResource}.\n */\n readonly observers!: ObserversResource\n /** FHIR / EHR data interop \u2014 sync status, imports, resources, patient views */\n readonly fhir!: FhirResource\n /** Natural-language insights \u2014 schema, suggestions, SQL, chat sessions */\n readonly insights!: InsightsResource\n /** Workspace monitor concepts (semantic patterns watched across calls) */\n readonly monitorConcepts!: MonitorConceptsResource\n /** Entity unification rules (declarative deduplication of world-model entities) */\n readonly unificationRules!: UnificationRulesResource\n /** CRM \u2014 contacts, companies, deals, pipeline (sync from connected CRM integration) */\n readonly crm!: CrmResource\n /** Command Center \u2014 rolled-up workspace homepage snapshot */\n readonly commandCenter!: CommandCenterResource\n /** Sensorium \u2014 operator-facing live agent loop observability */\n readonly sensorium!: SensoriumResource\n /** Generic data query against whitelisted workspace datasets */\n readonly dataQuery!: DataQueryResource\n /** AI-generated entity briefs (workspace-level + per-entity) */\n readonly briefs!: BriefsResource\n /** Remote-controlled desktop sessions for driving GUI-only third-party apps */\n readonly desktopSessions!: DesktopSessionsResource\n /** Patient intake \u2014 signed upload links + uploads */\n readonly intake!: IntakeResource\n /** Workspace network metadata (egress IP allowlist) */\n readonly network!: NetworkResource\n /** Data ingestion pipeline observability (sources, throughput, review backlog) */\n readonly pipeline!: PipelineResource\n /** Long-running async tasks (poll by id or list by call) */\n readonly tasks!: TasksResource\n /** Manual tool execution + per-service tool resolution */\n readonly tools!: ToolsResource\n /** Surfaces \u2014 short-lived form/intake experiences (lifecycle: create\u2192deliver\u2192review\u2192approve) */\n readonly surfaces!: SurfacesResource\n /** Live agent sessions \u2014 list active calls + inject mid-call directives */\n readonly sessions!: SessionsResource\n /** Workspace database \u2014 Lakebase fork lifecycle, SQL query execution, query tool CRUD */\n readonly workspaceDatabase!: WorkspaceDatabaseResource\n /** @internal \u2014 exposed for path-level type inference in GET/POST/PUT/etc. */\n readonly api!: PlatformFetch\n\n constructor(config: AmigoClientConfig) {\n if (!config.apiKey || typeof config.apiKey !== 'string') {\n throw new ConfigurationError('apiKey is required and must be a non-empty string')\n }\n if (!config.workspaceId || typeof config.workspaceId !== 'string') {\n throw new ConfigurationError('workspaceId is required and must be a non-empty string')\n }\n\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '')\n\n const client = createPlatformClient({\n apiKey: config.apiKey,\n baseUrl,\n retry: config.retry,\n maxRetries: config.maxRetries,\n timeout: config.timeout,\n headers: config.headers,\n hooks: config.hooks,\n fetch: config.fetch,\n })\n\n AmigoClient.hydrate(this, client, config.workspaceId, baseUrl, config.agentBaseUrl)\n }\n\n withOptions(options: ScopedRequestOptions): AmigoClient {\n return AmigoClient.fromPlatformClient(\n scopePlatformClient(this.api, options),\n this.workspaceId,\n this.baseUrl,\n this.agentBaseUrl,\n )\n }\n\n async GET<Path extends PathForMethod<'get'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'get'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'get'>>> {\n return withResponse(await this.resolveApiRequest(path, 'GET', init)) as AmigoResponse<\n OperationResponse<Path, 'get'>\n >\n }\n\n async POST<Path extends PathForMethod<'post'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'post'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'post'>>> {\n return withResponse(await this.resolveApiRequest(path, 'POST', init)) as AmigoResponse<\n OperationResponse<Path, 'post'>\n >\n }\n\n async PUT<Path extends PathForMethod<'put'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'put'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'put'>>> {\n return withResponse(await this.resolveApiRequest(path, 'PUT', init)) as AmigoResponse<\n OperationResponse<Path, 'put'>\n >\n }\n\n async PATCH<Path extends PathForMethod<'patch'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'patch'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'patch'>>> {\n return withResponse(await this.resolveApiRequest(path, 'PATCH', init)) as AmigoResponse<\n OperationResponse<Path, 'patch'>\n >\n }\n\n async DELETE<Path extends PathForMethod<'delete'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'delete'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'delete'>>> {\n return withResponse(await this.resolveApiRequest(path, 'DELETE', init)) as AmigoResponse<\n OperationResponse<Path, 'delete'>\n >\n }\n\n async HEAD<Path extends PathForMethod<'head'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'head'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'head'>>> {\n return withResponse(await this.resolveApiRequest(path, 'HEAD', init), {\n allowEmptyBody: true,\n }) as AmigoResponse<OperationResponse<Path, 'head'>>\n }\n\n async OPTIONS<Path extends PathForMethod<'options'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'options'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'options'>>> {\n return withResponse(await this.resolveApiRequest(path, 'OPTIONS', init), {\n allowEmptyBody: true,\n }) as AmigoResponse<OperationResponse<Path, 'options'>>\n }\n\n /**\n * Bind a path literal + method to a fully-typed callable.\n *\n * Captures the path as a literal type at definition time, so the returned\n * callable keeps full request/response inference even when stored,\n * exported, or composed across modules. Solves the \"explicit `as const` on\n * path params\" footgun: consumers who store a path in a `string` variable\n * lose path inference and the SDK collapses to `unknown`.\n *\n * ```ts\n * const getCall = client.defineRoute('GET', '/v1/{workspace_id}/calls/{call_id}')\n * const call = await getCall({ params: { path: { call_id } } })\n * // call.data: CallDetailResponse | undefined (fully typed)\n * ```\n *\n * Workspace IDs are still auto-injected by the underlying dispatchers \u2014 the\n * helper is purely a type-level convenience. Runtime behavior is identical\n * to calling the matching method directly, so retries, hooks, error\n * conversion, and timeout handling all apply.\n */\n defineRoute<Path extends PathForMethod<'get'>>(\n method: 'GET',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'get'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'get'>>>\n defineRoute<Path extends PathForMethod<'post'>>(\n method: 'POST',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'post'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'post'>>>\n defineRoute<Path extends PathForMethod<'put'>>(\n method: 'PUT',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'put'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'put'>>>\n defineRoute<Path extends PathForMethod<'patch'>>(\n method: 'PATCH',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'patch'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'patch'>>>\n defineRoute<Path extends PathForMethod<'delete'>>(\n method: 'DELETE',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'delete'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'delete'>>>\n defineRoute<Path extends PathForMethod<'head'>>(\n method: 'HEAD',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'head'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'head'>>>\n defineRoute<Path extends PathForMethod<'options'>>(\n method: 'OPTIONS',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'options'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'options'>>>\n defineRoute(\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS',\n path: string,\n ): (init?: AmigoRequestOptions<unknown>) => Promise<AmigoResponse<unknown>> {\n type AnyDispatcher = (p: string, i?: unknown) => Promise<AmigoResponse<unknown>>\n const dispatcher = this[method] as unknown as AnyDispatcher\n return (init?: AmigoRequestOptions<unknown>) => dispatcher.call(this, path, init)\n }\n\n private static fromPlatformClient(\n client: PlatformFetch,\n workspaceId: string,\n baseUrl: string,\n agentBaseUrl?: string,\n ): AmigoClient {\n const instance = Object.create(AmigoClient.prototype) as AmigoClient\n AmigoClient.hydrate(instance, client, workspaceId, baseUrl, agentBaseUrl)\n return instance\n }\n\n private static hydrate(\n target: AmigoClient,\n client: PlatformFetch,\n workspaceId: string,\n baseUrl: string,\n agentBaseUrl?: string,\n ): void {\n const mutable = target as Mutable<AmigoClient>\n\n mutable.workspaceId = workspaceId\n mutable.baseUrl = baseUrl\n mutable.agentBaseUrl = agentBaseUrl\n ;(target as unknown as { api: PlatformFetch }).api = client\n\n mutable.workspaces = new WorkspacesResource(client, workspaceId)\n // ``MeResource`` operates on /v1/me/... \u2014 account-scoped, not\n // workspace-scoped. Pass a sentinel literal instead of forwarding\n // the bound ``workspaceId`` so any accidental future use of\n // ``this.workspaceId`` inside ``MeResource`` (or its base) is\n // visibly wrong rather than silently picking up the caller's\n // workspace context. Pinned by the exact-URL test in\n // ``tests/resources/me.test.ts``.\n mutable.me = new MeResource(client, '_account')\n mutable.apiKeys = new ApiKeysResource(client, workspaceId)\n mutable.agents = new AgentsResource(client, workspaceId)\n mutable.skills = new SkillsResource(client, workspaceId)\n mutable.actions = new ActionsResource(client, workspaceId)\n mutable.operators = new OperatorsResource(client, workspaceId)\n mutable.promptLogs = new PromptLogsResource(client, workspaceId)\n mutable.triggers = new TriggersResource(client, workspaceId)\n mutable.services = new ServicesResource(client, workspaceId)\n mutable.contextGraphs = new ContextGraphsResource(client, workspaceId)\n mutable.dataSources = new DataSourcesResource(client, workspaceId)\n mutable.world = new WorldResource(client, workspaceId)\n mutable.calls = new CallsResource(client, workspaceId)\n mutable.conversations = new ConversationsResource(client, workspaceId, agentBaseUrl)\n mutable.channels = new ChannelsResource(client, workspaceId)\n mutable.phoneNumbers = new PhoneNumbersResource(client, workspaceId)\n mutable.integrations = new IntegrationsResource(client, workspaceId)\n mutable.analytics = new AnalyticsResource(client, workspaceId)\n mutable.simulations = new SimulationsResource(client, workspaceId)\n mutable.metrics = new MetricsResource(client, workspaceId)\n mutable.settings = new SettingsResource(client, workspaceId)\n mutable.billing = new BillingResource(client, workspaceId)\n mutable.memory = new MemoryResource(client, workspaceId)\n mutable.personas = new PersonasResource(client, workspaceId)\n mutable.reviewQueue = new ReviewQueueResource(client, workspaceId)\n mutable.recordings = new RecordingsResource(client, workspaceId)\n mutable.audit = new AuditResource(client, workspaceId)\n mutable.webhookDestinations = new WebhookDestinationsResource(client, workspaceId)\n mutable.safety = new SafetyResource(client, workspaceId)\n mutable.compliance = new ComplianceResource(client, workspaceId)\n mutable.events = new EventsResource(client, workspaceId)\n mutable.functions = new FunctionsResource(client, workspaceId)\n mutable.observers = new ObserversResource(client, workspaceId, agentBaseUrl)\n mutable.fhir = new FhirResource(client, workspaceId)\n mutable.insights = new InsightsResource(client, workspaceId)\n mutable.monitorConcepts = new MonitorConceptsResource(client, workspaceId)\n mutable.unificationRules = new UnificationRulesResource(client, workspaceId)\n mutable.crm = new CrmResource(client, workspaceId)\n mutable.commandCenter = new CommandCenterResource(client, workspaceId)\n mutable.sensorium = new SensoriumResource(client, workspaceId)\n mutable.dataQuery = new DataQueryResource(client, workspaceId)\n mutable.briefs = new BriefsResource(client, workspaceId)\n mutable.desktopSessions = new DesktopSessionsResource(client, workspaceId)\n mutable.intake = new IntakeResource(client, workspaceId)\n mutable.network = new NetworkResource(client, workspaceId)\n mutable.pipeline = new PipelineResource(client, workspaceId)\n mutable.tasks = new TasksResource(client, workspaceId)\n mutable.tools = new ToolsResource(client, workspaceId)\n mutable.surfaces = new SurfacesResource(client, workspaceId)\n mutable.sessions = new SessionsResource(client, workspaceId)\n mutable.workspaceDatabase = new WorkspaceDatabaseResource(client, workspaceId)\n }\n\n private async resolveApiRequest<\n Path extends keyof paths & string,\n Method extends 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS',\n >(\n path: Path,\n method: Method,\n init: AmigoRequestOptions<OperationFor<Path, Lowercase<Method>>> | undefined,\n ): Promise<{ data?: unknown; error?: unknown; response: Response }> {\n const { baseClient, options } = resolveScopedPlatformClient(this.api)\n const mergedInit = mergeRequestOptions(options, withWorkspaceId(path, init, this.workspaceId))\n const requestInit = applyPlatformRequestOptions(\n baseClient,\n mergedInit as AmigoRequestOptions<OperationFor<Path, Lowercase<Method>>> | undefined,\n )\n\n switch (method) {\n case 'GET':\n return await baseClient.GET(path as never, requestInit as never)\n case 'POST':\n return await baseClient.POST(path as never, requestInit as never)\n case 'PUT':\n return await baseClient.PUT(path as never, requestInit as never)\n case 'PATCH':\n return await baseClient.PATCH(path as never, requestInit as never)\n case 'DELETE':\n return await baseClient.DELETE(path as never, requestInit as never)\n case 'HEAD':\n return await baseClient.HEAD(path as never, requestInit as never)\n case 'OPTIONS':\n return await baseClient.OPTIONS(path as never, requestInit as never)\n }\n }\n}\n\n// --- Public exports ---\n\nexport type { AmigoClientConfig as AmigoConfig }\n\nexport {\n AmigoError,\n BadRequestError,\n AuthenticationError,\n PermissionError,\n NotFoundError,\n ConflictError,\n ValidationError,\n RateLimitError,\n ServerError,\n ServiceUnavailableError,\n NetworkError,\n RequestTimeoutError,\n ParseError,\n ConfigurationError,\n isAmigoError,\n isNotFoundError,\n isRateLimitError,\n isAuthenticationError,\n isRequestTimeoutError,\n isPermissionError,\n isConflictError,\n isValidationError,\n isServerError,\n isNetworkError,\n isHttpException,\n isHttpValidationError,\n isUnparseableErrorBody,\n} from './core/errors.js'\n\nexport type {\n ErrorContext,\n PlatformErrorBody,\n HttpExceptionBody,\n HttpValidationErrorBody,\n UnparseableErrorBody,\n AmigoErrorWithBody,\n} from './core/errors.js'\n\nexport type {\n WorkspaceId,\n ApiKeyId,\n AgentId,\n PersonaId,\n SkillId,\n ActionId,\n ServiceId,\n ContextGraphId,\n CallId,\n PhoneNumberId,\n IntegrationId,\n EntityId,\n EventId,\n SimulationRunId,\n SimulationSessionId,\n FunctionId,\n DataSourceId,\n} from './core/branded-types.js'\n\nexport {\n workspaceId,\n apiKeyId,\n agentId,\n personaId,\n skillId,\n actionId,\n serviceId,\n contextGraphId,\n callId,\n phoneNumberId,\n integrationId,\n entityId,\n eventId,\n simulationRunId,\n simulationSessionId,\n functionId,\n dataSourceId,\n} from './core/branded-types.js'\n\nexport { paginate } from './core/utils.js'\nexport { buildLastResponse, extractRequestId } from './core/utils.js'\nexport type {\n PaginatedList,\n ListParams,\n LastResponseInfo,\n ResponseMetadata,\n WithResponseMetadata,\n AmigoResponse,\n} from './core/utils.js'\nexport type { AmigoRequestOptions, ScopedRequestOptions } from './core/request-options.js'\nexport type { RetryOptions } from './core/retry.js'\n\nexport { parseRateLimitHeaders } from './core/rate-limit.js'\nexport type { RateLimitInfo } from './core/rate-limit.js'\n\nexport {\n verifyWebhookSignature,\n parseWebhookEvent,\n WebhookVerificationError,\n} from './core/webhooks.js'\nexport type {\n WebhookEvent,\n WebhookVerificationOptions,\n ParseWebhookEventOptions,\n} from './core/webhooks.js'\nexport type {\n ClientHooks,\n RequestHookContext,\n ResponseHookContext,\n ErrorHookContext,\n} from './core/openapi-client.js'\n\nexport type {\n MetricCatalogEntry,\n MetricCatalogResponse,\n MetricListResponse,\n MetricValue,\n NumericalMetricValue,\n CategoricalMetricValue,\n BooleanMetricValue,\n MetricValuesParams,\n MetricTrendParams,\n} from './resources/metrics.js'\n/** @deprecated Use `MetricValue` instead. */\nexport type MetricValueResponse = MetricValueAlias\n\nexport type CallSummary = components['schemas']['CallSummary']\nexport type CallDetail = components['schemas']['CallDetailResponse']\nexport type CallTurn = components['schemas']['Turn']\nexport type CallToolCall = components['schemas']['ToolCall']\nexport type PlaybackTimeline = components['schemas']['PlaybackTimeline']\nexport type TimelineActor = components['schemas']['TimelineActor']\nexport type TimelineLaneDefinition = components['schemas']['TimelineLaneDefinition']\nexport type TimelineSegment = components['schemas']['TimelineSegment']\nexport type TimelineTimebase = components['schemas']['TimelineTimebase']\nexport type TurnTimeline = components['schemas']['TurnTimeline']\nexport type TimelineSegmentType = TimelineSegment['type']\nexport type TimelineLane = TimelineSegment['lane']\nexport type TimelineTrack = NonNullable<TimelineSegment['track']>\nexport type TimelineActorKind = TimelineActor['kind']\nexport type TimelineActorRole = TimelineActor['role']\n\nexport type {\n SubscribeToWorkspaceOptions,\n SubscriptionHandle,\n WorkspaceSSEEvent,\n WorkspaceSSEEventType,\n WorkspaceEventStreamErrorCode,\n} from './resources/events.js'\nexport { WorkspaceEventStreamError, isWorkspaceEventStreamError } from './resources/events.js'\n\nexport { sessionConnectAuthProtocols, textStreamAuthProtocols } from './resources/conversations.js'\nexport type {\n ConversationDetail,\n ConversationListResponse,\n ConversationSummary,\n ConversationTurn,\n CreateConversationRequest,\n ListConversationsParams,\n SessionConnectUrlParams,\n TextStreamAuthProtocols,\n TextStreamUrlParams,\n TurnDoneEvent,\n TurnErrorEvent,\n TurnMessageEvent,\n TurnRequest,\n TurnResponse,\n TurnStreamEvent,\n TurnThinkingEvent,\n TurnTokenEvent,\n TurnToolCallCompletedEvent,\n TurnToolCallStartedEvent,\n} from './resources/conversations.js'\n\n// Channels \u2014 workspace-scoped channel-manager proxy (SES setup, future Twilio, etc.)\nexport { ChannelsResource, SesSetupResource } from './resources/channels/index.js'\nexport type {\n CreateSesSetupRequest,\n DnsRecord,\n SesSetupDetail,\n SesSetupListItem,\n SesSetupListResponse,\n} from './resources/channels/index.js'\n\n// Voice-call observer real-time stream\nexport { ObserversResource, observerAuthProtocols } from './resources/observers.js'\nexport type {\n ObserverAuthProtocols,\n ObserverSSEEvent,\n ObserverSSEEventType,\n ObserverSubscribeOptions,\n} from './resources/observers.js'\n\n// Reconnecting WebSocket primitive (compose for custom realtime surfaces)\nexport {\n createReconnectingWebSocket,\n ReconnectingWebSocketError,\n} from './core/reconnecting-websocket.js'\nexport type {\n ReconnectingWebSocketErrorReason,\n ReconnectingWebSocketHandle,\n ReconnectingWebSocketOptions,\n ReconnectingWebSocketState,\n WebSocketFactory,\n} from './core/reconnecting-websocket.js'\n\n// Device code auth (desktop / CLI login)\nexport {\n loginWithDeviceCode,\n TokenManager,\n FileTokenStorage,\n MemoryTokenStorage,\n DeviceCodeExpiredError,\n DeviceCodeDeniedError,\n RefreshTokenExpiredError,\n LoginCancelledError,\n formatDeviceCodeInstructions,\n formatDeviceCodeLink,\n formatWorkspaceList,\n openBrowser,\n} from './core/device-code.js'\nexport type {\n DeviceCodeIssuance,\n IdentityTokenResponse,\n WorkspaceChoice,\n MultiWorkspaceResponse,\n DeviceCodeLoginOptions,\n DeviceCodeStatus,\n AuthResult,\n StoredCredentials,\n TokenStorage,\n TokenManagerConfig,\n} from './core/device-code.js'\n\n// Generated OpenAPI types \u2014 consumers can import specific schemas\nexport type { paths, components, operations } from './generated/api.js'\n\nfunction withWorkspaceId<Path extends keyof paths & string, Init>(\n path: Path,\n init: Init | undefined,\n workspaceId: string,\n): Init | { params: { path: { workspace_id: string } } } {\n if (!path.includes('{workspace_id}')) {\n return (init ?? {}) as Init\n }\n\n const current = (init ?? {}) as {\n params?: {\n path?: Record<string, unknown>\n }\n }\n\n return {\n ...current,\n params: {\n ...(current.params ?? {}),\n path: {\n ...(current.params?.path ?? {}),\n workspace_id: workspaceId,\n },\n },\n }\n}\n", "/**\n * Error hierarchy for the Amigo Platform SDK.\n * All errors extend AmigoError which can be caught with a single catch.\n */\n\nimport type { components } from '../generated/api.js'\n\nexport interface ErrorContext {\n statusCode?: number\n errorCode?: string\n requestId?: string\n detail?: string\n context?: Record<string, unknown>\n /** Parsed error body (typed when recognized) */\n errorBody?: PlatformErrorBody\n /** Raw body string for diagnostic logging \u2014 populated even on parse failure */\n rawBody?: string\n}\n\n// --- Typed error body shapes ---\n\n/**\n * FastAPI 422 validation-error body.\n * Surfaces from openapi-typescript so consumers can read field-level errors.\n */\nexport type HttpValidationErrorBody = components['schemas']['HTTPValidationError']\n\n/**\n * Default FastAPI HTTPException shape (`raise HTTPException(status_code, detail=...)`).\n *\n * Most platform-api routes that don't define an explicit error model return\n * this shape. `detail` may be a free-form string or a JSON-serializable object.\n */\nexport interface HttpExceptionBody {\n detail: string | Record<string, unknown> | unknown[]\n /** Populated by request-id middleware on bounded routes */\n request_id?: string\n /** Populated by typed error responses (e.g. Surface lifecycle errors) */\n error_code?: string\n}\n\n/**\n * Fallback shape used when the response body fails to parse or is empty.\n * `rawBody` is the verbatim text (truncated to 8 KB to avoid log bloat).\n */\nexport interface UnparseableErrorBody {\n detail: string\n raw_body: string\n}\n\n/**\n * Discriminated union of all error body shapes the platform API emits.\n *\n * Consumers should use the type guards (`isHttpException`,\n * `isHttpValidationError`, `isUnparseableErrorBody`) rather than checking\n * fields directly \u2014 both `HttpExceptionBody` and `HttpValidationErrorBody`\n * have a `detail` field but it is shaped differently.\n */\nexport type PlatformErrorBody = HttpExceptionBody | HttpValidationErrorBody | UnparseableErrorBody\n\nconst RAW_BODY_LIMIT = 8 * 1024 // 8 KB\n\nconst SENSITIVE_FIELDS = new Set([\n 'id_token',\n 'access_token',\n 'refresh_token',\n 'authorization',\n 'api_key',\n 'apikey',\n 'token',\n 'secret',\n 'password',\n 'x-api-key',\n 'cookie',\n 'set-cookie',\n])\n\nfunction sanitizeErrorContext(obj: unknown): unknown {\n if (typeof obj !== 'object' || !obj) return obj\n if (Array.isArray(obj)) return obj.map(sanitizeErrorContext)\n\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (SENSITIVE_FIELDS.has(key.toLowerCase())) {\n result[key] = '[REDACTED]'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = sanitizeErrorContext(value)\n } else {\n result[key] = value\n }\n }\n return result\n}\n\n/** Base class for all Amigo Platform SDK errors */\nexport class AmigoError<TBody extends PlatformErrorBody = PlatformErrorBody> extends Error {\n readonly statusCode?: number\n readonly errorCode?: string\n readonly requestId?: string\n readonly detail?: string\n readonly context?: Record<string, unknown>\n /**\n * Typed body of the error response, when one was returned and successfully\n * parsed. Use the `isHttpException` / `isHttpValidationError` /\n * `isUnparseableErrorBody` type guards to narrow the discriminated union.\n *\n * Named `errorBody` (not `body`) to avoid colliding with the legacy\n * `ParseError.body: string` field.\n */\n readonly errorBody?: TBody\n /**\n * Raw response body (truncated to 8 KB). Populated even when parsing fails,\n * so callers always have something to log when debugging server errors.\n */\n readonly rawBody?: string\n\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message)\n this.name = this.constructor.name\n this.statusCode = ctx.statusCode\n this.errorCode = ctx.errorCode\n this.requestId = ctx.requestId\n this.detail = ctx.detail\n this.context = ctx.context\n ? (sanitizeErrorContext(ctx.context) as Record<string, unknown>)\n : undefined\n this.errorBody = ctx.errorBody as TBody | undefined\n this.rawBody = ctx.rawBody\n Object.setPrototypeOf(this, new.target.prototype)\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n statusCode: this.statusCode,\n errorCode: this.errorCode,\n requestId: this.requestId,\n detail: this.detail,\n context: this.context,\n stack: this.stack,\n }\n }\n}\n\n/** 400 Bad Request */\nexport class BadRequestError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 400 })\n }\n}\n\n/** 401 Unauthorized \u2014 invalid or missing API key */\nexport class AuthenticationError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 401 })\n }\n}\n\n/** 403 Forbidden \u2014 insufficient permissions */\nexport class PermissionError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 403 })\n }\n}\n\n/** 404 Not Found */\nexport class NotFoundError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 404 })\n }\n}\n\n/** 409 Conflict \u2014 duplicate slug or resource version conflict */\nexport class ConflictError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 409 })\n }\n}\n\n/** 422 Unprocessable Entity \u2014 validation failure */\nexport class ValidationError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 422 })\n }\n}\n\n/** 429 Too Many Requests */\nexport class RateLimitError extends AmigoError {\n readonly retryAfter?: number\n\n constructor(message: string, ctx: ErrorContext & { retryAfter?: number } = {}) {\n super(message, { ...ctx, statusCode: 429 })\n this.retryAfter = ctx.retryAfter\n }\n}\n\n/** 5xx Server Error */\nexport class ServerError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: ctx.statusCode ?? 500 })\n }\n}\n\n/** 503 Service Unavailable */\nexport class ServiceUnavailableError extends ServerError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 503 })\n }\n}\n\n/** Network or fetch failure (no HTTP status available) */\nexport class NetworkError extends AmigoError {\n constructor(message: string, cause?: unknown) {\n super(message)\n if (cause !== undefined) {\n Object.defineProperty(this, 'cause', { value: cause, writable: false, enumerable: true })\n }\n }\n}\n\n/** Request timed out before receiving a response */\nexport class RequestTimeoutError extends NetworkError {\n readonly timeoutMs?: number\n\n constructor(message: string, timeoutMs?: number, cause?: unknown) {\n super(message, cause)\n this.timeoutMs = timeoutMs\n }\n}\n\n/** Failed to parse response body */\nexport class ParseError extends AmigoError {\n readonly body?: string\n\n constructor(message: string, body?: string) {\n super(message)\n this.body = body\n }\n}\n\n/** SDK misconfiguration */\nexport class ConfigurationError extends AmigoError {\n constructor(message: string) {\n super(message)\n }\n}\n\n// --- Factory ---\n\n/**\n * Internal: legacy flat-shape probe of the parsed JSON body. Used to surface\n * `error_code` / `request_id` / `message` fields that older platform-api\n * routes return alongside the canonical `detail` field.\n */\ninterface LegacyFlatBody {\n message?: unknown\n detail?: unknown\n error_code?: unknown\n request_id?: unknown\n}\n\n/**\n * Best-effort body reader. Always returns *something* \u2014 never throws.\n *\n * - On successful JSON parse: returns the typed body (HttpException or\n * HTTPValidationError shape) plus the raw text for logging.\n * - On parse failure or empty body: returns an UnparseableErrorBody with\n * `detail` set to `response.statusText` and the raw text preserved.\n * - On network read failure (connection drop mid-read): returns an\n * UnparseableErrorBody with empty `raw_body`.\n */\nasync function readErrorBody(response: Response): Promise<{\n body: PlatformErrorBody\n rawBody: string\n}> {\n let rawBody = ''\n try {\n rawBody = await response.text()\n } catch {\n // Connection dropped mid-read or body already consumed \u2014 fall through.\n return {\n body: { detail: response.statusText || `HTTP ${response.status}`, raw_body: '' },\n rawBody: '',\n }\n }\n\n const truncatedRaw = rawBody.length > RAW_BODY_LIMIT ? rawBody.slice(0, RAW_BODY_LIMIT) : rawBody\n\n if (rawBody.length === 0) {\n return {\n body: { detail: response.statusText || `HTTP ${response.status}`, raw_body: '' },\n rawBody: '',\n }\n }\n\n try {\n const parsed = JSON.parse(rawBody) as unknown\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n // Recognized shapes: HTTPValidationError (detail is array) or HttpException.\n return { body: parsed as PlatformErrorBody, rawBody: truncatedRaw }\n }\n // JSON parsed but isn't an object (e.g. null, string literal) \u2014 surface as\n // unparseable so consumers don't have to guard against weird shapes.\n return {\n body: {\n detail: response.statusText || `HTTP ${response.status}`,\n raw_body: truncatedRaw,\n },\n rawBody: truncatedRaw,\n }\n } catch {\n return {\n body: {\n detail: response.statusText || `HTTP ${response.status}`,\n raw_body: truncatedRaw,\n },\n rawBody: truncatedRaw,\n }\n }\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nexport async function createApiError(response: Response): Promise<AmigoError> {\n const { body, rawBody } = await readErrorBody(response)\n const flat = body as LegacyFlatBody\n\n const detailString =\n typeof flat.detail === 'string'\n ? flat.detail\n : flat.detail !== undefined\n ? safeStringify(flat.detail)\n : undefined\n\n const errorCode = typeof flat.error_code === 'string' ? flat.error_code : undefined\n const requestIdFromBody = typeof flat.request_id === 'string' ? flat.request_id : undefined\n const messageFromBody = typeof flat.message === 'string' ? flat.message : undefined\n\n const ctx: ErrorContext = {\n statusCode: response.status,\n errorCode,\n requestId: requestIdFromBody ?? response.headers.get('x-request-id') ?? undefined,\n detail: detailString,\n context: { url: response.url, response: body },\n errorBody: body,\n rawBody,\n }\n const message =\n messageFromBody ?? detailString ?? response.statusText ?? `HTTP ${response.status}`\n\n switch (response.status) {\n case 400:\n return new BadRequestError(message, ctx)\n case 401:\n return new AuthenticationError(message, ctx)\n case 403:\n return new PermissionError(message, ctx)\n case 404:\n return new NotFoundError(message, ctx)\n case 409:\n return new ConflictError(message, ctx)\n case 422:\n return new ValidationError(message, ctx)\n case 429: {\n const retryAfter = parseRetryAfter(response)\n return new RateLimitError(message, { ...ctx, retryAfter })\n }\n case 503:\n return new ServiceUnavailableError(message, ctx)\n default:\n return new ServerError(message, ctx)\n }\n}\n\nfunction parseRetryAfter(response: Response): number | undefined {\n const header = response.headers.get('Retry-After')\n if (!header) return undefined\n const seconds = Number(header)\n if (!isNaN(seconds)) return seconds\n const date = new Date(header)\n if (!isNaN(date.getTime())) {\n return Math.max(0, Math.ceil((date.getTime() - Date.now()) / 1000))\n }\n return undefined\n}\n\n// --- Type guards ---\n\nexport function isAmigoError(err: unknown): err is AmigoError {\n return err instanceof AmigoError\n}\n\nexport function isNotFoundError(err: unknown): err is NotFoundError {\n return err instanceof NotFoundError\n}\n\nexport function isRateLimitError(err: unknown): err is RateLimitError {\n return err instanceof RateLimitError\n}\n\nexport function isAuthenticationError(err: unknown): err is AuthenticationError {\n return err instanceof AuthenticationError\n}\n\nexport function isRequestTimeoutError(err: unknown): err is RequestTimeoutError {\n return err instanceof RequestTimeoutError\n}\n\nexport function isPermissionError(err: unknown): err is PermissionError {\n return err instanceof PermissionError\n}\n\nexport function isConflictError(err: unknown): err is ConflictError {\n return err instanceof ConflictError\n}\n\nexport function isValidationError(err: unknown): err is ValidationError {\n return err instanceof ValidationError\n}\n\nexport function isServerError(err: unknown): err is ServerError {\n return err instanceof ServerError\n}\n\nexport function isNetworkError(err: unknown): err is NetworkError {\n return err instanceof NetworkError\n}\n\n// --- Body type guards ---\n\n/**\n * Narrowed AmigoError where `errorBody` is guaranteed non-undefined.\n * Used as the return-type for body type guards so consumers don't need to\n * re-assert `errorBody !== undefined` after the guard.\n */\nexport type AmigoErrorWithBody<TBody extends PlatformErrorBody> = AmigoError<TBody> & {\n readonly errorBody: TBody\n}\n\n/**\n * True when `err.errorBody` is the FastAPI 422 validation-error shape (an\n * object with `detail: ValidationError[]`). Lets consumers iterate\n * field-level errors without `as any`:\n *\n * ```ts\n * if (isHttpValidationError(err)) {\n * for (const issue of err.errorBody.detail ?? []) {\n * console.log(issue.loc, issue.msg)\n * }\n * }\n * ```\n */\nexport function isHttpValidationError(\n err: unknown,\n): err is AmigoErrorWithBody<HttpValidationErrorBody> {\n if (!(err instanceof AmigoError)) return false\n const body = err.errorBody as { detail?: unknown } | undefined\n return Array.isArray(body?.detail)\n}\n\n/**\n * True when `err.errorBody` is the default FastAPI HTTPException shape\n * (`{ detail: string | object | array }`, possibly with `error_code` /\n * `request_id`). This is the most common error body across platform-api.\n */\nexport function isHttpException(err: unknown): err is AmigoErrorWithBody<HttpExceptionBody> {\n if (!(err instanceof AmigoError)) return false\n const body = err.errorBody\n if (!body) return false\n if (Array.isArray((body as { detail?: unknown }).detail)) {\n // HTTPValidationError, not a plain HTTPException\n return false\n }\n // Has detail (string/object) and no `raw_body` discriminator from the unparseable fallback\n return 'detail' in body && !('raw_body' in body)\n}\n\n/**\n * True when the response body could not be parsed as JSON (or was empty).\n * `err.errorBody.raw_body` is the verbatim text (truncated to 8 KB).\n */\nexport function isUnparseableErrorBody(\n err: unknown,\n): err is AmigoErrorWithBody<UnparseableErrorBody> {\n if (!(err instanceof AmigoError)) return false\n const body = err.errorBody as { raw_body?: unknown } | undefined\n return typeof body?.raw_body === 'string'\n}\n", "/**\n * Creates a configured openapi-fetch client with auth, error handling,\n * and retry middleware.\n *\n * Supports custom `fetch` for BFF proxy patterns (e.g., developer-console\n * routing through Next.js API routes).\n */\n\nimport createClientImport, { type HeadersOptions, type Middleware } from 'openapi-fetch'\nimport type { paths } from '../generated/api.js'\nimport { createAuthMiddleware } from './auth.js'\nimport { createApiError, ConfigurationError, NetworkError, RequestTimeoutError } from './errors.js'\nimport { parseRateLimitHeaders } from './rate-limit.js'\nimport {\n stripRequestControls,\n type AmigoRequestOptions,\n type RequestControlOptions,\n} from './request-options.js'\nimport { shouldRetry, computeDelay, resolveRetryOptions, type RetryOptions } from './retry.js'\nimport { extractRequestId } from './utils.js'\n\n// Handle ESM/CJS interop for openapi-fetch (esbuild __toESM wrapper)\nconst createClient: typeof createClientImport =\n typeof createClientImport === 'function'\n ? createClientImport\n : (createClientImport as unknown as { default: typeof createClientImport }).default\n\nexport type PlatformFetch = ReturnType<typeof createClient<paths>>\n\nexport interface RequestHookContext {\n id: string\n request: Request\n schemaPath: string\n}\n\nexport interface ResponseHookContext extends RequestHookContext {\n response: Response\n requestId: string | null\n rateLimit: ReturnType<typeof parseRateLimitHeaders>\n}\n\nexport interface ErrorHookContext extends RequestHookContext {\n error: unknown\n}\n\nexport interface ClientHooks {\n onRequest?: (context: RequestHookContext) => void | Promise<void>\n onResponse?: (context: ResponseHookContext) => void | Promise<void>\n onError?: (context: ErrorHookContext) => void | Promise<void>\n}\n\nexport interface ClientConfig {\n apiKey: string\n baseUrl: string\n retry?: RetryOptions\n maxRetries?: number\n timeout?: number\n headers?: HeadersOptions\n hooks?: ClientHooks\n /** Custom fetch implementation \u2014 use for BFF proxy routing or test mocking. */\n fetch?: typeof globalThis.fetch\n}\n\ntype RequestTransport = (input: Request) => Promise<Response>\n\ninterface PlatformClientContext {\n transport: RequestTransport\n defaults: RequestControlOptions\n baseUrl: string\n}\n\nconst platformClientContext = new WeakMap<PlatformFetch, PlatformClientContext>()\n\nexport function createPlatformClient(config: ClientConfig): PlatformFetch {\n const transport = toRequestTransport(config.fetch ?? globalThis.fetch)\n const defaults = {\n retry: config.retry,\n maxRetries: config.maxRetries,\n timeout: config.timeout,\n } satisfies RequestControlOptions\n\n const client = createClient<paths>({\n baseUrl: config.baseUrl,\n fetch: createRetryingFetch(transport, defaults),\n headers: config.headers,\n })\n\n platformClientContext.set(client, { transport, defaults, baseUrl: config.baseUrl })\n\n // Error middleware \u2014 convert HTTP errors to typed AmigoError subclasses\n const errorMiddleware: Middleware = {\n async onResponse({ response }) {\n if (!response.ok) {\n throw await createApiError(response)\n }\n return response\n },\n }\n\n // Auth middleware \u2014 attach Bearer token\n const authMiddleware = createAuthMiddleware({ apiKey: config.apiKey })\n const hookMiddleware: Middleware | undefined = config.hooks\n ? {\n async onRequest({ request, schemaPath, id }) {\n await config.hooks?.onRequest?.({ request, schemaPath, id })\n return request\n },\n async onResponse({ request, response, schemaPath, id }) {\n await config.hooks?.onResponse?.({\n id,\n request,\n response,\n schemaPath,\n requestId: extractRequestId(response),\n rateLimit: parseRateLimitHeaders(response.headers),\n })\n return response\n },\n async onError({ request, error, schemaPath, id }) {\n await config.hooks?.onError?.({ id, request, error, schemaPath })\n },\n }\n : undefined\n\n // Order: auth first (adds header), then error (converts failures)\n client.use(authMiddleware)\n client.use(errorMiddleware)\n if (hookMiddleware) {\n client.use(hookMiddleware)\n }\n\n return client\n}\n\nexport function applyPlatformRequestOptions<Operation>(\n client: PlatformFetch,\n init: AmigoRequestOptions<Operation> | undefined,\n): AmigoRequestOptions<Operation> | undefined {\n if (!init) {\n return undefined\n }\n\n const context = platformClientContext.get(client)\n const stripped = stripRequestControls(init)\n\n if (!context) {\n return stripped as AmigoRequestOptions<Operation> | undefined\n }\n\n const overrideFetch = stripped?.fetch\n const hasControlOverride =\n overrideFetch !== undefined ||\n init.timeout !== undefined ||\n init.maxRetries !== undefined ||\n init.retry !== undefined\n\n if (!hasControlOverride) {\n return stripped as AmigoRequestOptions<Operation> | undefined\n }\n\n const transport = toRequestTransport(\n (overrideFetch ?? context.transport) as typeof globalThis.fetch,\n )\n const fetch = createRetryingFetch(transport, {\n timeout: init.timeout ?? context.defaults.timeout,\n maxRetries: init.maxRetries ?? context.defaults.maxRetries,\n retry: init.retry ?? context.defaults.retry,\n })\n\n return {\n ...stripped,\n fetch,\n } as AmigoRequestOptions<Operation>\n}\n\n/** @internal */\nexport function getPlatformClientBaseUrl(client: PlatformFetch): string {\n const context = platformClientContext.get(client)\n if (!context) {\n throw new ConfigurationError('Platform client baseUrl is unavailable')\n }\n return context.baseUrl\n}\n\nfunction createRetryingFetch(\n transport: RequestTransport,\n defaults: RequestControlOptions,\n): typeof globalThis.fetch {\n return async (input, init) => {\n const baseRequest = input instanceof Request ? input : new Request(input, init)\n const method = baseRequest.method.toUpperCase()\n const retryOpts = resolveRetryOptions(defaults.retry, defaults.maxRetries)\n const timeoutMs = defaults.timeout\n const isIdempotent = method === 'GET' || method === 'HEAD' || method === 'OPTIONS'\n\n for (let attempt = 0; attempt < retryOpts.maxAttempts; attempt++) {\n let response: Response | undefined\n let error: unknown\n let timedOut = false\n\n try {\n const prepared = prepareRequestForAttempt(baseRequest, timeoutMs)\n\n try {\n response = await transport(prepared.request)\n } finally {\n timedOut = prepared.timedOut\n prepared.cleanup()\n }\n } catch (err) {\n error = err\n }\n\n if (!error && response && response.ok) return response\n\n const ctx = { method, attempt, response: response!, options: retryOpts }\n const attemptsRemain = attempt + 1 < retryOpts.maxAttempts\n\n if (error) {\n if (timedOut) {\n throw new RequestTimeoutError(`Request timed out after ${timeoutMs}ms`, timeoutMs, error)\n }\n if (isIdempotent && attemptsRemain) {\n await sleep(computeDelay(attempt, new Response(), retryOpts))\n continue\n }\n throw new NetworkError(\n `Network error: ${error instanceof Error ? error.message : String(error)}`,\n error,\n )\n }\n\n if (response && attemptsRemain && shouldRetry(ctx)) {\n const delay = computeDelay(attempt, response, retryOpts)\n if (baseRequest.signal.aborted) return response\n await sleep(delay)\n continue\n }\n\n return response!\n }\n\n throw new NetworkError('Retry loop exhausted')\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction toRequestTransport(fetcher: typeof globalThis.fetch | RequestTransport): RequestTransport {\n return async (input) => fetcher(input)\n}\n\nfunction prepareRequestForAttempt(\n request: Request,\n timeoutMs?: number,\n): {\n request: Request\n readonly timedOut: boolean\n cleanup: () => void\n} {\n const attemptRequest = request.clone()\n const timeout = createTimeoutSignal(attemptRequest.signal, timeoutMs)\n\n if (!timeout.signal) {\n return {\n request: attemptRequest,\n timedOut: false,\n cleanup: timeout.cleanup,\n }\n }\n\n return {\n request: new Request(attemptRequest, { signal: timeout.signal }),\n get timedOut() {\n return timeout.didTimeout\n },\n cleanup: timeout.cleanup,\n }\n}\n\nfunction createTimeoutSignal(\n upstream: AbortSignal | null,\n timeoutMs?: number,\n): {\n signal?: AbortSignal\n didTimeout: boolean\n cleanup: () => void\n} {\n if (!timeoutMs || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n return {\n signal: upstream ?? undefined,\n didTimeout: false,\n cleanup: () => {},\n }\n }\n\n const controller = new AbortController()\n let didTimeout = false\n const cleanups: Array<() => void> = []\n\n const onAbort = () => controller.abort(upstream?.reason)\n if (upstream) {\n if (upstream.aborted) {\n controller.abort(upstream.reason)\n } else {\n upstream.addEventListener('abort', onAbort, { once: true })\n cleanups.push(() => upstream.removeEventListener('abort', onAbort))\n }\n }\n\n const timer = setTimeout(() => {\n didTimeout = true\n controller.abort()\n }, timeoutMs)\n cleanups.push(() => clearTimeout(timer))\n\n return {\n signal: controller.signal,\n get didTimeout() {\n return didTimeout\n },\n cleanup: () => {\n for (const cleanup of cleanups) {\n cleanup()\n }\n },\n }\n}\n", "/**\n * Auth middleware for the Amigo Platform SDK.\n *\n * The platform-api accepts Bearer tokens in two forms:\n * 1. RS256 JWT issued by the Identity service\n * 2. Legacy API keys (created via POST /v1/{workspace_id}/api-keys)\n *\n * This SDK accepts an API key string and attaches it directly as\n * `Authorization: Bearer {apiKey}`. No token exchange is required.\n */\n\nimport type { Middleware } from 'openapi-fetch'\nimport { AuthenticationError } from './errors.js'\n\nexport interface AuthConfig {\n apiKey: string\n}\n\n/**\n * Creates openapi-fetch middleware that attaches the Bearer token\n * to every outgoing request and converts 401 responses to AuthenticationError.\n */\nexport function createAuthMiddleware(config: AuthConfig): Middleware {\n return {\n async onRequest({ request }) {\n request.headers.set('Authorization', `Bearer ${config.apiKey}`)\n return request\n },\n\n async onResponse({ response }) {\n if (response.status === 401) {\n throw new AuthenticationError('Invalid or expired API key. Check your credentials.', {\n statusCode: 401,\n })\n }\n return response\n },\n }\n}\n", "export interface RateLimitInfo {\n limit: number | null\n remaining: number | null\n reset: Date | null\n retryAfter: number | null\n}\n\nexport function parseRateLimitHeaders(headers: Headers): RateLimitInfo {\n const limit = headers.get('x-ratelimit-limit')\n const remaining = headers.get('x-ratelimit-remaining')\n const reset = headers.get('x-ratelimit-reset')\n const retryAfter = headers.get('retry-after')\n\n return {\n limit: limit ? parseInt(limit, 10) : null,\n remaining: remaining ? parseInt(remaining, 10) : null,\n reset: reset ? new Date(parseInt(reset, 10) * 1000) : null,\n retryAfter: retryAfter ? parseInt(retryAfter, 10) : null,\n }\n}\n", "import type { FetchOptions, HeadersOptions } from 'openapi-fetch'\nimport type { paths } from '../generated/api.js'\nimport type { RetryOptions } from './retry.js'\n\nexport type OperationFor<\n Path extends keyof paths & string,\n Method extends keyof paths[Path] & string,\n> = paths[Path][Method]\n\ntype OptionalizeWorkspacePath<PathParams> = PathParams extends { workspace_id: infer WorkspaceId }\n ? Omit<PathParams, 'workspace_id'> & { workspace_id?: WorkspaceId }\n : PathParams\n\ntype EmptyShape = Record<never, never>\n\ntype RewriteParams<Options> = Options extends { params: infer Params }\n ? RewriteParamShape<Params> extends infer RewrittenParams\n ? RewrittenParams extends object\n ? RequiredKeysOf<RewrittenParams> extends never\n ? Omit<Options, 'params'> & { params?: RewrittenParams }\n : Omit<Options, 'params'> & { params: RewrittenParams }\n : Omit<Options, 'params'> & { params: RewrittenParams }\n : Options\n : Options extends { params?: infer Params }\n ? Omit<Options, 'params'> & { params?: RewriteParamShape<Params> }\n : Options\n\ntype RewriteParamShape<Params> = Params extends object\n ? Omit<Params, 'path'> & RewritePathParam<Params>\n : Params\n\ntype RewritePathParam<Params> = Params extends { path: infer PathParams }\n ? OptionalizeWorkspacePath<PathParams> extends infer RewrittenPath\n ? RewrittenPath extends object\n ? RequiredKeysOf<RewrittenPath> extends never\n ? { path?: RewrittenPath }\n : { path: RewrittenPath }\n : { path: RewrittenPath }\n : EmptyShape\n : EmptyShape\n\ntype RequiredKeysOf<T extends object> = Exclude<\n {\n [K in keyof T]-?: EmptyShape extends Pick<T, K> ? never : K\n }[keyof T],\n undefined\n>\n\nexport type InitParam<Init extends object> =\n RequiredKeysOf<Init> extends never ? [init?: Init] : [init: Init]\n\nexport type AmigoRequestOptions<Operation = unknown> = Omit<\n RewriteParams<FetchOptions<Operation>>,\n 'timeout' | 'maxRetries' | 'retry'\n> & {\n timeout?: number\n maxRetries?: number\n retry?: RetryOptions\n}\n\nexport type ScopedRequestOptions = Omit<RequestInit, 'body' | 'headers' | 'method'> & {\n headers?: HeadersOptions\n timeout?: number\n maxRetries?: number\n retry?: RetryOptions\n}\n\nexport interface RequestControlOptions {\n timeout?: number\n maxRetries?: number\n retry?: RetryOptions\n}\n\ntype MergeableRequestOptions = object & {\n headers?: HeadersOptions\n signal?: AbortSignal | null\n timeout?: number\n maxRetries?: number\n retry?: RetryOptions\n}\n\nexport function stripRequestControls<Options extends RequestControlOptions>(\n options: Options | undefined,\n): Omit<Options, keyof RequestControlOptions> | undefined {\n if (!options) {\n return undefined\n }\n\n const rest = { ...options } as Partial<Options & RequestControlOptions>\n delete rest.timeout\n delete rest.maxRetries\n delete rest.retry\n return rest as Omit<Options, keyof RequestControlOptions>\n}\n\nexport function mergeRequestOptions<Options extends object>(\n base: ScopedRequestOptions | undefined,\n override: Options | undefined,\n): (Options & MergeableRequestOptions) | undefined {\n if (!base) {\n return override as (Options & MergeableRequestOptions) | undefined\n }\n\n if (!override) {\n return base as Options & MergeableRequestOptions\n }\n\n const mergeableOverride = override as Options & Partial<MergeableRequestOptions>\n\n return {\n ...base,\n ...override,\n headers: mergeHeaders(base.headers, mergeableOverride.headers),\n signal: mergeableOverride.signal ?? base.signal,\n timeout: mergeableOverride.timeout ?? base.timeout,\n maxRetries: mergeableOverride.maxRetries ?? base.maxRetries,\n retry: mergeableOverride.retry ?? base.retry,\n } as Options & MergeableRequestOptions\n}\n\nexport function mergeScopedRequestOptions(\n base: ScopedRequestOptions | undefined,\n override: ScopedRequestOptions,\n): ScopedRequestOptions {\n return mergeRequestOptions(base, override) ?? override\n}\n\nexport function mergeHeaders(\n base: HeadersOptions | undefined,\n override: HeadersOptions | undefined,\n): Headers | undefined {\n if (!base && !override) {\n return undefined\n }\n\n const headers = new Headers()\n let hasEntries = false\n\n applyHeaders(headers, base, () => {\n hasEntries = true\n })\n applyHeaders(headers, override, () => {\n hasEntries = true\n })\n\n return hasEntries ? headers : undefined\n}\n\nfunction applyHeaders(\n target: Headers,\n source: HeadersOptions | undefined,\n onSet: () => void,\n): void {\n if (!source) {\n return\n }\n\n if (source instanceof Headers) {\n source.forEach((value, key) => {\n target.set(key, value)\n onSet()\n })\n return\n }\n\n if (Array.isArray(source)) {\n for (const [key, value] of source) {\n if (!key) {\n continue\n }\n\n if (value === null || value === undefined) {\n target.delete(key)\n continue\n }\n\n target.set(key, String(value))\n onSet()\n }\n return\n }\n\n for (const [key, value] of Object.entries(source)) {\n if (value === null || value === undefined) {\n target.delete(key)\n continue\n }\n\n target.set(\n key,\n Array.isArray(value) ? value.map((item) => String(item)).join(', ') : String(value),\n )\n onSet()\n }\n}\n", "/**\n * Exponential backoff with full jitter and Retry-After header support.\n */\n\nexport interface RetryOptions {\n /** Maximum number of attempts (including the first). Default: 3 */\n maxAttempts?: number\n /** Base delay in milliseconds. Default: 250 */\n baseDelayMs?: number\n /** Maximum delay cap in milliseconds. Default: 30_000 */\n maxDelayMs?: number\n}\n\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504])\n// POST is only retried on 429 with a Retry-After header (idempotency concern)\nconst POST_RETRYABLE_STATUS_CODES = new Set([429])\nlet jitterCounter = 0\ntype CryptoLike = {\n getRandomValues<T extends Uint32Array>(array: T): T\n}\n\nexport interface RetryContext {\n method: string\n attempt: number\n response: Response\n options: Required<RetryOptions>\n}\n\nexport function shouldRetry(ctx: RetryContext): boolean {\n const { method, attempt, response, options } = ctx\n if (attempt >= options.maxAttempts) return false\n\n const status = response.status\n if (method === 'GET' || method === 'HEAD') {\n return RETRYABLE_STATUS_CODES.has(status)\n }\n if (method === 'POST' && POST_RETRYABLE_STATUS_CODES.has(status)) {\n return response.headers.has('Retry-After')\n }\n return false\n}\n\nexport function computeDelay(\n attempt: number,\n response: Response,\n options: Required<RetryOptions>,\n): number {\n const retryAfterHeader = response.headers.get('Retry-After')\n if (retryAfterHeader) {\n const seconds = parseRetryAfterHeader(retryAfterHeader)\n if (seconds !== undefined) return seconds * 1000\n }\n\n // Exponential backoff with full jitter: random value in [0, min(maxDelay, base * 2^attempt)]\n const exponential = Math.min(options.maxDelayMs, options.baseDelayMs * Math.pow(2, attempt))\n return jitterFraction() * exponential\n}\n\nfunction parseRetryAfterHeader(header: string): number | undefined {\n const seconds = Number(header)\n if (!isNaN(seconds)) return seconds\n const date = new Date(header)\n if (!isNaN(date.getTime())) {\n return Math.max(0, Math.ceil((date.getTime() - Date.now()) / 1000))\n }\n return undefined\n}\n\nexport function resolveRetryOptions(\n opts?: RetryOptions,\n maxRetries?: number,\n): Required<RetryOptions> {\n const maxAttempts =\n typeof maxRetries === 'number' && Number.isFinite(maxRetries)\n ? Math.max(1, Math.floor(maxRetries) + 1)\n : (opts?.maxAttempts ?? 3)\n\n return {\n maxAttempts,\n baseDelayMs: opts?.baseDelayMs ?? 250,\n maxDelayMs: opts?.maxDelayMs ?? 30_000,\n }\n}\n\nfunction jitterFraction(): number {\n const cryptoApi = getCryptoApi()\n if (cryptoApi) {\n const value = new Uint32Array(1)\n cryptoApi.getRandomValues(value)\n return (value[0] ?? 0) / 0x1_0000_0000\n }\n\n // Retry jitter is not a security primitive, but we still want a stable\n // spread for runtimes that do not expose Web Crypto.\n jitterCounter = (jitterCounter + 1) >>> 0\n const mixed = mixUint32((Date.now() ^ Math.imul(jitterCounter, 0x9e37_79b9)) >>> 0)\n return mixed / 0x1_0000_0000\n}\n\nfunction getCryptoApi(): CryptoLike | undefined {\n const cryptoApi = globalThis.crypto as CryptoLike | undefined\n if (cryptoApi && typeof cryptoApi.getRandomValues === 'function') {\n return cryptoApi\n }\n\n return undefined\n}\n\nfunction mixUint32(value: number): number {\n let mixed = (value ^ (value >>> 16)) >>> 0\n mixed = Math.imul(mixed, 0x7feb_352d) >>> 0\n mixed = (mixed ^ (mixed >>> 15)) >>> 0\n mixed = Math.imul(mixed, 0x846c_a68b) >>> 0\n return (mixed ^ (mixed >>> 16)) >>> 0\n}\n", "/**\n * Shared utilities: response extraction and pagination helpers.\n */\n\nimport { ParseError } from './errors.js'\nimport { parseRateLimitHeaders, type RateLimitInfo } from './rate-limit.js'\n\nexport interface LastResponseInfo {\n requestId: string | null\n statusCode: number\n headers: Headers\n rateLimit: RateLimitInfo\n}\n\nexport interface ResponseMetadata {\n _request_id: string | null\n lastResponse: LastResponseInfo\n}\n\nexport interface AmigoResponse<T> {\n data: WithResponseMetadata<T>\n response: Response\n requestId: string | null\n rateLimit: RateLimitInfo\n}\n\nexport type WithResponseMetadata<T> = T extends object ? T & ResponseMetadata : T\n\nexport function extractRequestId(response: Response): string | null {\n return response.headers.get('x-request-id')\n}\n\nexport function buildLastResponse(response: Response): LastResponseInfo {\n return {\n requestId: extractRequestId(response),\n statusCode: response.status,\n headers: response.headers,\n rateLimit: parseRateLimitHeaders(response.headers),\n }\n}\n\ninterface OpenApiResult<T> {\n data?: T\n error?: unknown\n response?: Response\n}\n\ninterface ExtractDataOptions {\n allowEmptyBody?: boolean\n}\n\n/**\n * Extracts the data payload from an openapi-fetch response.\n * Empty-body success responses return undefined; other empty responses throw.\n */\nexport function extractData<T>(\n result: OpenApiResult<T>,\n options: ExtractDataOptions = {},\n): WithResponseMetadata<T> {\n if (result.data !== undefined) {\n return attachResponseMetadata(result.data, result.response) as WithResponseMetadata<T>\n }\n\n if (isEmptyBodySuccess(result.response) || options.allowEmptyBody) {\n return undefined as WithResponseMetadata<T>\n }\n\n // Degenerate openapi-fetch results with both data and error keep the SDK's\n // original data-first behavior; without data, errors stay fatal.\n if (result.error !== undefined) {\n throw new ParseError('Unexpected error response from API', JSON.stringify(result.error))\n }\n\n throw new ParseError(\n 'Unexpected empty response from API',\n result.response ? `status=${result.response.status}` : undefined,\n )\n}\n\nexport function withResponse<T>(\n result: OpenApiResult<T> & { response: Response },\n options: ExtractDataOptions = {},\n): AmigoResponse<T> {\n const data = extractData(result, options)\n const lastResponse = buildLastResponse(result.response)\n\n return {\n data,\n response: result.response,\n requestId: lastResponse.requestId,\n rateLimit: lastResponse.rateLimit,\n }\n}\n\n/**\n * Standard paginated list response shape.\n */\nexport interface PaginatedList<T> {\n items: T[]\n has_more: boolean\n continuation_token: number | null\n}\n\n/**\n * Standard query params for paginated list endpoints.\n */\nexport interface ListParams {\n /** Max items per page. Default varies by endpoint. */\n limit?: number\n /** Opaque token from previous response for next page. */\n continuation_token?: number\n}\n\n/**\n * Async iterator that auto-paginates through all pages.\n * Yields one item at a time.\n *\n * @example\n * for await (const agent of paginate((token) => client.agents.list({ continuation_token: token }))) {\n * console.log(agent)\n * }\n */\nexport async function* paginate<T>(\n fetcher: (continuationToken?: number) => Promise<PaginatedList<T>>,\n): AsyncGenerator<T> {\n let token: number | undefined = undefined\n while (true) {\n const page = await fetcher(token)\n for (const item of page.items) {\n yield item\n }\n if (!page.has_more || page.continuation_token === null) break\n token = page.continuation_token\n }\n}\n\nfunction attachResponseMetadata<T>(data: T, response?: Response): WithResponseMetadata<T> {\n if (!response || typeof data !== 'object' || data === null) {\n return data as WithResponseMetadata<T>\n }\n\n const target = data as T & Partial<ResponseMetadata>\n const lastResponse = buildLastResponse(response)\n\n defineHiddenMetadata(target, '_request_id', lastResponse.requestId)\n defineHiddenMetadata(target, 'lastResponse', lastResponse)\n\n return target as WithResponseMetadata<T>\n}\n\nfunction isEmptyBodySuccess(response?: Response): boolean {\n return response?.status === 204 || response?.status === 205\n}\n\nfunction defineHiddenMetadata<T extends object, K extends keyof ResponseMetadata>(\n target: T,\n key: K,\n value: ResponseMetadata[K],\n): void {\n try {\n Object.defineProperty(target, key, {\n value,\n enumerable: false,\n configurable: true,\n writable: false,\n })\n } catch {\n // Ignore non-extensible return values.\n }\n}\n", "/**\n * Base class for workspace-scoped resources.\n *\n * Uses the openapi-fetch client (with auth + error + retry middleware)\n * injected from AmigoClient. Resources call typed HTTP methods that\n * flow through the middleware chain automatically.\n */\n\nimport type { Middleware } from 'openapi-fetch'\nimport {\n applyPlatformRequestOptions,\n getPlatformClientBaseUrl,\n type PlatformFetch,\n} from '../core/openapi-client.js'\nimport {\n mergeRequestOptions,\n mergeScopedRequestOptions,\n type ScopedRequestOptions,\n} from '../core/request-options.js'\nimport { extractData } from '../core/utils.js'\n\nconst scopedClientState = new WeakMap<\n PlatformFetch,\n { baseClient: PlatformFetch; options: ScopedRequestOptions }\n>()\n\nexport abstract class WorkspaceScopedResource {\n constructor(\n protected readonly client: PlatformFetch,\n protected readonly workspaceId: string,\n ) {}\n\n protected get platformBaseUrl(): string {\n const { baseClient } = resolveScopedPlatformClient(this.client)\n return getPlatformClientBaseUrl(baseClient)\n }\n\n withOptions(options: ScopedRequestOptions): this {\n const ResourceCtor = this.constructor as new (\n client: PlatformFetch,\n workspaceId: string,\n ) => this\n return new ResourceCtor(scopePlatformClient(this.client, options), this.workspaceId)\n }\n\n protected async *iteratePaginatedList<\n TPage extends {\n items?: readonly unknown[]\n has_more?: boolean\n continuation_token?: number | null\n },\n TParams,\n >(\n fetchPage: (params: TParams) => Promise<TPage>,\n params: TParams,\n ): AsyncGenerator<TPage extends { items?: readonly (infer TItem)[] } ? TItem : never> {\n type Item = TPage extends { items?: readonly (infer TItem)[] } ? TItem : never\n let nextParams = params\n\n while (true) {\n const page = await fetchPage(nextParams)\n\n for (const item of page.items ?? []) {\n yield item as Item\n }\n\n if (\n !page.has_more ||\n page.continuation_token === null ||\n page.continuation_token === undefined\n ) {\n break\n }\n\n nextParams = {\n ...(nextParams as object | undefined),\n continuation_token: page.continuation_token,\n } as TParams\n }\n }\n\n protected async *iterateOffsetPaginatedList<\n TPage extends { has_more?: boolean; next_offset?: number | null },\n TItem,\n TParams,\n >(\n fetchPage: (params: TParams) => Promise<TPage>,\n selectItems: (page: TPage) => readonly TItem[],\n params: TParams,\n ): AsyncGenerator<TItem> {\n let nextParams = params\n\n while (true) {\n const page = await fetchPage(nextParams)\n\n for (const item of selectItems(page)) {\n yield item\n }\n\n if (!page.has_more || page.next_offset === null || page.next_offset === undefined) {\n break\n }\n\n nextParams = { ...(nextParams as object | undefined), offset: page.next_offset } as TParams\n }\n }\n}\n\nexport function scopePlatformClient(\n client: PlatformFetch,\n options: ScopedRequestOptions,\n): PlatformFetch {\n const { baseClient, options: existingOptions } = resolveScopedPlatformClient(client)\n const mergedOptions = mergeScopedRequestOptions(existingOptions, options)\n\n const scopedClient = {\n request: (method: string, path: string, init?: object) =>\n baseClient.request(\n method as never,\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n GET: (path: string, init?: object) =>\n baseClient.GET(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n PUT: (path: string, init?: object) =>\n baseClient.PUT(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n POST: (path: string, init?: object) =>\n baseClient.POST(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n DELETE: (path: string, init?: object) =>\n baseClient.DELETE(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n OPTIONS: (path: string, init?: object) =>\n baseClient.OPTIONS(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n HEAD: (path: string, init?: object) =>\n baseClient.HEAD(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n PATCH: (path: string, init?: object) =>\n baseClient.PATCH(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n TRACE: (path: string, init?: object) =>\n baseClient.TRACE(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n use: (...middleware: Middleware[]) => baseClient.use(...middleware),\n eject: (...middleware: Middleware[]) => baseClient.eject(...middleware),\n } as PlatformFetch\n\n scopedClientState.set(scopedClient, { baseClient, options: mergedOptions })\n return scopedClient\n}\n\nexport function resolveScopedPlatformClient(client: PlatformFetch): {\n baseClient: PlatformFetch\n options: ScopedRequestOptions | undefined\n} {\n const existing = scopedClientState.get(client)\n return {\n baseClient: existing?.baseClient ?? client,\n options: existing?.options,\n }\n}\n\nexport { extractData }\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Account-scoped operations for the authenticated identity.\n *\n * \"Me\" is the SDK-side mirror of platform-api's ``/v1/me/...``\n * namespace \u2014 operations that act on the caller's own account\n * (workspaces they own, profile info, \u2026) rather than on a specific\n * workspace they're inside of.\n *\n * Workspace creation lives here, NOT on ``client.workspaces``. The\n * legacy ``client.workspaces.createSelfService`` (which posted to\n * ``/v1/workspaces/self-service``) was removed in SDK 0.28.0 because\n * the route shape confused URL-parsing consumers \u2014 the developer-console\n * BFF proxy treated the literal ``self-service`` as a workspace_id\n * and sent identity a JWT-refresh request scoped to that string,\n * which 4xx'd before the call ever reached platform-api.\n *\n * Even though the underlying call is account-scoped, this resource\n * extends ``WorkspaceScopedResource`` to inherit ``withOptions`` /\n * iteration helpers / scoped-client wiring. The bound\n * ``workspaceId`` is unused for the routes here \u2014 typically a\n * placeholder like ``\"_account\"`` from the AmigoClient construction.\n *\n * **No workspace context is injected into the HTTP request.** The\n * shared ``PlatformFetch`` middleware does not auto-prefix paths or\n * inject ``X-Workspace-Id``-style headers based on the resource's\n * ``workspaceId`` slot \u2014 the URL each method writes is the URL that\n * leaves the client. Pinned by ``tests/resources/me.test.ts``'s\n * exact-URL assertion.\n */\nexport class MeResource extends WorkspaceScopedResource {\n /**\n * Create a workspace owned by the authenticated identity.\n *\n * The caller is bootstrapped as the workspace's owner. Use this\n * method anywhere that previously called\n * ``client.workspaces.createSelfService(body)`` \u2014 the request body\n * shape and response are unchanged; only the URL moved.\n */\n async createWorkspace(body: components['schemas']['CreateWorkspaceRequest']) {\n return extractData(\n await this.client.POST('/v1/me/workspaces', {\n body,\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { WorkspaceId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\n/**\n * Manage Amigo Platform workspaces.\n * Workspaces are the top-level tenancy boundary for all resources.\n *\n * Note: ``list`` operates at account level (``/v1/workspaces``).\n * Creation lives at ``/v1/me/workspaces`` \u2014 see ``MeResource``\n * (``client.me.createWorkspace``). The legacy\n * ``POST /v1/workspaces/self-service`` was removed in platform-api\n * PR #2472; ``/v1/workspaces/<x>`` paths now exclusively operate on\n * a specific workspace, so URL-parsing consumers can never confuse\n * an account-level operation with a workspace-scoped one.\n * Get/update/archive/provision operate on a specific workspace.\n */\nexport class WorkspacesResource extends WorkspaceScopedResource {\n /** List workspaces accessible to the current API key */\n async list(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/workspaces', {\n params: { query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single workspace by ID */\n async get(id?: WorkspaceId | string) {\n return extractData(\n await this.client.GET('/v1/workspaces/{workspace_id}', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n }),\n )\n }\n\n /** Update workspace metadata */\n async update(body: components['schemas']['UpdateWorkspaceRequest'], id?: WorkspaceId | string) {\n return extractData(\n await this.client.PATCH('/v1/workspaces/{workspace_id}', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Archive (soft-delete) a workspace */\n async archive(body: components['schemas']['ArchiveWorkspaceRequest'], id?: WorkspaceId | string) {\n return extractData(\n await this.client.POST('/v1/workspaces/{workspace_id}/archive', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Provision a workspace (seed integrations, mark as provisioned) */\n async provision(id?: WorkspaceId | string) {\n return extractData(\n await this.client.POST('/v1/workspaces/{workspace_id}/provision', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n }),\n )\n }\n\n /** Pre-check environment conversion warnings */\n async checkEnvironment(target?: 'production' | 'staging', id?: WorkspaceId | string) {\n return extractData(\n await this.client.GET('/v1/workspaces/{workspace_id}/environment-check', {\n params: {\n path: { workspace_id: id ?? this.workspaceId },\n query: target ? { target } : undefined,\n },\n }),\n )\n }\n\n /** Convert workspace between staging and production */\n async convertEnvironment(\n body: components['schemas']['ConvertEnvironmentRequest'],\n id?: WorkspaceId | string,\n ) {\n return extractData(\n await this.client.POST('/v1/workspaces/{workspace_id}/convert-environment', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n body,\n }),\n )\n }\n\n /**\n * Workspace-allowlisted phone numbers that can place test calls into voice\n * agents. The list is read-mostly; writes overwrite the entire allowlist.\n *\n * Always operates on the bound workspace. Use `client.withOptions(...)` or\n * construct a second `AmigoClient` if you need to act on a different\n * workspace.\n */\n readonly testCallerNumbers = {\n /** Get the workspace's test caller allowlist */\n get: async () =>\n extractData(\n await this.client.GET('/v1/workspaces/{workspace_id}/test-caller-numbers', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n\n /**\n * Replace the workspace's test caller allowlist.\n *\n * **Replace-all semantics:** the request body fully replaces the existing\n * allowlist; numbers omitted from `body` are removed. Read first, mutate,\n * then write to add/remove individual entries safely.\n */\n update: async (body: components['schemas']['TestCallerNumbersRequest']) =>\n extractData(\n await this.client.PUT('/v1/workspaces/{workspace_id}/test-caller-numbers', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { ApiKeyId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\n/**\n * Manage API keys for a workspace.\n *\n * API keys are used to authenticate SDK/API requests. Each key has a role\n * and a set of permissions. Keys expire after 1-90 days.\n */\nexport class ApiKeysResource extends WorkspaceScopedResource {\n /**\n * Get info about the currently authenticated API key.\n * Does not require a workspace ID in the path.\n */\n async me() {\n return extractData(await this.client.GET('/v1/auth/me', {}))\n }\n\n /** Create a new API key */\n async create(body: components['schemas']['CreateApiKeyRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/api-keys', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List API keys in the workspace */\n async list(params?: ListParams & { mine_only?: boolean }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/api-keys', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams & { mine_only?: boolean }) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Revoke an API key */\n async revoke(keyId: ApiKeyId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/api-keys/{key_id}', {\n params: { path: { workspace_id: this.workspaceId, key_id: keyId } },\n })\n }\n\n /** Rotate an API key \u2014 invalidates the old key and issues a new one */\n async rotate(keyId: ApiKeyId | string, body: components['schemas']['RotateApiKeyRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/api-keys/{key_id}/rotate', {\n params: { path: { workspace_id: this.workspaceId, key_id: keyId } },\n body,\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { AgentId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListAgentsParams extends ListParams {\n search?: string\n}\n\nexport class AgentsResource extends WorkspaceScopedResource {\n async create(body: components['schemas']['CreateAgentRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/agents', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async list(params?: ListAgentsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/agents', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListAgentsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(agentId: AgentId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/agents/{agent_id}', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId } },\n }),\n )\n }\n\n async update(agentId: AgentId | string, body: components['schemas']['UpdateAgentRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/agents/{agent_id}', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId } },\n body,\n }),\n )\n }\n\n async delete(agentId: AgentId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/agents/{agent_id}', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId } },\n })\n }\n\n async listVersions(agentId: AgentId | string, params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/agents/{agent_id}/versions', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId }, query: params },\n }),\n )\n }\n\n listVersionsAutoPaging(agentId: AgentId | string, params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.listVersions(agentId, pageParams), params)\n }\n\n async getVersion(agentId: AgentId | string, version: number | 'latest') {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/agents/{agent_id}/versions/{version}', {\n params: {\n path: { workspace_id: this.workspaceId, agent_id: agentId, version: String(version) },\n },\n }),\n )\n }\n\n async createVersion(\n agentId: AgentId | string,\n body: components['schemas']['CreateAgentVersionRequest'],\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/agents/{agent_id}/versions', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId } },\n body,\n }),\n )\n }\n}\n", "import type { components, paths } from '../generated/api.js'\nimport type { SkillId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\ntype SkillsListQuery = NonNullable<\n NonNullable<paths['/v1/{workspace_id}/skills']['get']['parameters']['query']>\n>\n\nexport interface ListSkillsParams extends ListParams {\n search?: string\n enabled?: boolean\n execution_tier?: SkillsListQuery['execution_tier']\n}\n\n/**\n * Manage skills \u2014 reusable AI capabilities that agents can call.\n * Skills define a structured input/output schema and an execution tier.\n */\nexport class SkillsResource extends WorkspaceScopedResource {\n /** Create a new skill */\n async create(body: components['schemas']['CreateSkillRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/skills', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List skills in the workspace */\n async list(params?: ListSkillsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListSkillsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single skill */\n async get(skillId: SkillId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: skillId } },\n }),\n )\n }\n\n /** Update a skill */\n async update(skillId: SkillId | string, body: components['schemas']['UpdateSkillRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: skillId } },\n body,\n }),\n )\n }\n\n /** Delete a skill */\n async delete(skillId: SkillId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: skillId } },\n })\n }\n\n /**\n * Test a skill with a sample input.\n * Executes the skill in a sandbox and returns the result.\n */\n async test(skillId: SkillId | string, body: components['schemas']['TestSkillRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/skills/{skill_id}/test', {\n params: { path: { workspace_id: this.workspaceId, skill_id: skillId } },\n body,\n }),\n )\n }\n}\n", "import type { components, paths } from '../generated/api.js'\nimport type { ActionId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\ntype ActionsListQuery = NonNullable<\n NonNullable<paths['/v1/{workspace_id}/skills']['get']['parameters']['query']>\n>\n\nexport interface ListActionsParams extends ListParams {\n search?: string\n enabled?: boolean\n execution_tier?: ActionsListQuery['execution_tier']\n}\n\n/**\n * Manage actions \u2014 reusable AI capabilities that agents can call.\n * Actions define a structured input/output schema and an execution tier.\n *\n * Note: The underlying API paths use `/skills/` for backward compatibility.\n */\nexport class ActionsResource extends WorkspaceScopedResource {\n /** Create a new action */\n async create(body: components['schemas']['CreateSkillRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/skills', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List actions in the workspace */\n async list(params?: ListActionsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListActionsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single action */\n async get(actionId: ActionId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n }),\n )\n }\n\n /** Update an action */\n async update(actionId: ActionId | string, body: components['schemas']['UpdateSkillRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n body,\n }),\n )\n }\n\n /** Delete an action */\n async delete(actionId: ActionId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n })\n }\n\n /** Get all context graphs and services that reference this action */\n async getReferences(actionId: ActionId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills/{skill_id}/references', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n }),\n )\n }\n\n /**\n * Test an action with a sample input.\n * Executes the action in a sandbox and returns the result.\n */\n async test(actionId: ActionId | string, body: components['schemas']['TestSkillRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/skills/{skill_id}/test', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n body,\n }),\n )\n }\n}\n", "import type { components, operations } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type EscalationStatsParams = NonNullable<\n operations['escalation-stats']['parameters']['query']\n>\n\nexport class OperatorsResource extends WorkspaceScopedResource {\n async list(params?: { status?: string; limit?: number; offset?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: { status?: string; limit?: number; offset?: number }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.list(pageParams),\n (page) => page.items,\n params,\n )\n }\n\n async create(body: components['schemas']['CreateOperatorRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async get(operatorId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/{operator_id}', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n }),\n )\n }\n\n /** Update an operator (name, role, status, etc.) */\n async update(operatorId: string, body: components['schemas']['UpdateOperatorRequest']) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/operators/{operator_id}', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async getDashboard() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/dashboard', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getQueue() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/queue', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getEscalations(params?: { status?: string; limit?: number; offset?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/escalations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getEscalationsAutoPaging(params?: { status?: string; limit?: number; offset?: number }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getEscalations(pageParams),\n (page) => page.items,\n params,\n )\n }\n\n async getActiveEscalations() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/escalations/active', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getEscalationStats(params?: EscalationStatsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/escalations/stats', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getPerformance(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/performance', {\n params: { path: { workspace_id: this.workspaceId }, query: params as never },\n }),\n )\n }\n\n async getAccessToken(operatorId: string, body: components['schemas']['AccessTokenRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/access-token', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async joinCall(operatorId: string, body: components['schemas']['JoinCallRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/join-call', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async leaveCall(operatorId: string, body: components['schemas']['LeaveCallRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/leave-call', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async switchMode(operatorId: string, body: components['schemas']['SwitchModeRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/switch-mode', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async sendGuidance(operatorId: string, body: components['schemas']['SendGuidanceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/send-guidance', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async createBriefing(operatorId: string, body: { call_sid: string }) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/briefing', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async wrapUp(operatorId: string, body: components['schemas']['WrapUpRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/wrap-up', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async getCallTranscript(callSid: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/calls/{call_sid}/transcript', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid } },\n }),\n )\n }\n\n async getAuditLog(params?: { limit?: number; offset?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/audit-log', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getAuditLogAutoPaging(params?: { limit?: number; offset?: number }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getAuditLog(pageParams),\n (page) => page.items,\n params,\n )\n }\n}\n", "import type { components, operations } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Query parameters for {@link PromptLogsResource.list}.\n *\n * Sourced from the OpenAPI ``list-prompt-logs`` operation so the SDK always\n * tracks the canonical contract (no hand-maintained shape that can drift\n * from the platform-api).\n */\nexport type ListPromptLogsParams = NonNullable<\n operations['list-prompt-logs']['parameters']['query']\n>\n\nexport type PromptLogEntry = components['schemas']['PromptLogEntry']\nexport type PromptLogListResponse = components['schemas']['PromptLogListResponse']\n\n/**\n * Prompt-log read surface \u2014 full LLM input/output (system prompt,\n * conversation history, tool catalog, model, response) per turn for\n * auditing, debugging, and post-hoc trace analysis.\n *\n * Reads the Delta ``world_events`` ledger via Databricks SQL (typical\n * latency 1-5s, 15s ceiling). **Admin or owner role required** \u2014\n * responses can include PHI from prompt history.\n *\n * The canonical filter is ``conversation_id`` (UUID from\n * ``world.entities``) which works across voice / text / sim\n * modalities. ``call_sid`` remains for legacy callers and external\n * systems holding the SID directly. The two are mutually exclusive.\n *\n * @example\n * ```ts\n * // Cross-modality: filter by conversation entity UUID.\n * const page = await client.promptLogs.list({\n * conversation_id: '<entity-uuid>',\n * limit: 50,\n * })\n *\n * // Direct call SID (Twilio CA-SID for voice).\n * const callPage = await client.promptLogs.list({\n * call_sid: 'CA01a2b3...',\n * prompt_type: 'engage_user',\n * })\n *\n * // Auto-paged sweep over a workspace's last 7 days\n * for await (const entry of client.promptLogs.listAutoPaging({\n * prompt_type: 'navigation',\n * })) {\n * console.log(entry.event_id, entry.state_name, entry.llm_model)\n * }\n * ```\n */\nexport class PromptLogsResource extends WorkspaceScopedResource {\n /**\n * One page of prompt-log entries, newest-first.\n *\n * When ``params.conversation_id`` is supplied, the response surfaces\n * ``resolved_call_sid`` (the call_sid the lookup mapped to) and\n * ``resolved_conversation_kind`` (``\"call\"`` for voice/sim,\n * ``\"conversation\"`` for text/sms/whatsapp/email) so you can drill\n * into per-call surfaces afterward without re-querying\n * ``world.entities``.\n *\n * When no selectivity-bearing filter is supplied (no conversation_id /\n * call_sid / time range), the query is auto-capped to the last 7 days.\n * The applied window is reported in ``applied_time_window_days``.\n */\n async list(params?: ListPromptLogsParams): Promise<PromptLogListResponse> {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/prompt-logs', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /**\n * Auto-paginating async iterator over prompt-log entries. Walks\n * ``next_offset`` until ``has_more`` is false, yielding individual\n * entries. Use this when consuming logs at scale (e.g. nightly\n * backfills) rather than rendering one page in a UI.\n *\n * Bounded by the same per-call hard caps as ``list`` (200 items per\n * page, 10,000 cumulative offset).\n */\n async *listAutoPaging(\n params?: Omit<ListPromptLogsParams, 'offset'>,\n ): AsyncIterableIterator<PromptLogEntry> {\n let offset = 0\n while (true) {\n const page = await this.list({ ...params, offset })\n for (const entry of page.items) {\n yield entry\n }\n if (!page.has_more || page.next_offset == null) {\n return\n }\n // Advance to the offset the server told us to use; guard against a\n // non-advancing token to avoid an infinite loop on a buggy backend.\n if (page.next_offset === offset) {\n return\n }\n offset = page.next_offset\n }\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport class TriggersResource extends WorkspaceScopedResource {\n async list(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/triggers', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async create(body: components['schemas']['CreateTriggerRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/triggers', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async get(triggerId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/triggers/{trigger_id}', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n }),\n )\n }\n\n async update(triggerId: string, body: components['schemas']['UpdateTriggerRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/triggers/{trigger_id}', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n body,\n }),\n )\n }\n\n async delete(triggerId: string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/triggers/{trigger_id}', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n })\n }\n\n async fire(triggerId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/triggers/{trigger_id}/fire', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n }),\n )\n }\n\n async pause(triggerId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/triggers/{trigger_id}/pause', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n }),\n )\n }\n\n async resume(triggerId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/triggers/{trigger_id}/resume', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n }),\n )\n }\n\n async listRuns(triggerId: string, params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/triggers/{trigger_id}/runs', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId }, query: params },\n }),\n )\n }\n\n listRunsAutoPaging(triggerId: string, params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.listRuns(triggerId, pageParams), params)\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { ServiceId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListServicesParams extends ListParams {\n search?: string\n type?: string\n}\n\n/**\n * Manage services \u2014 external service configurations that agents can call.\n * Services represent integrations like scheduling systems, EHRs, or CRMs\n * that skills can interact with via their tool definitions.\n */\nexport class ServicesResource extends WorkspaceScopedResource {\n async create(body: components['schemas']['CreateServiceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/services', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async list(params?: ListServicesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/services', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListServicesParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(serviceId: ServiceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/services/{service_id}', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n }),\n )\n }\n\n async update(serviceId: ServiceId | string, body: components['schemas']['UpdateServiceRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/services/{service_id}', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n body,\n }),\n )\n }\n\n async delete(serviceId: ServiceId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/services/{service_id}', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n })\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { ContextGraphId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListContextGraphsParams extends ListParams {\n search?: string\n}\n\n/**\n * Manage context graphs \u2014 structured conversation flow definitions (HSM).\n * Context graphs define the states, transitions, and conditions that\n * govern how an agent moves through a conversation.\n */\nexport class ContextGraphsResource extends WorkspaceScopedResource {\n async create(body: components['schemas']['CreateContextGraphRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/context-graphs', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async list(params?: ListContextGraphsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/context-graphs', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListContextGraphsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(contextGraphId: ContextGraphId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/context-graphs/{context_graph_id}', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n },\n }),\n )\n }\n\n async update(\n contextGraphId: ContextGraphId | string,\n body: components['schemas']['UpdateContextGraphRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/context-graphs/{context_graph_id}', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n },\n body,\n }),\n )\n }\n\n async delete(contextGraphId: ContextGraphId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/context-graphs/{context_graph_id}', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n },\n })\n }\n\n /** Create a version snapshot of the current context graph */\n async createVersion(\n contextGraphId: ContextGraphId | string,\n body: components['schemas']['CreateContextGraphVersionRequest'],\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/context-graphs/{context_graph_id}/versions', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n },\n body,\n }),\n )\n }\n\n /** List all versions of a context graph */\n async listVersions(contextGraphId: ContextGraphId | string, params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/context-graphs/{context_graph_id}/versions', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n query: params,\n },\n }),\n )\n }\n\n listVersionsAutoPaging(contextGraphId: ContextGraphId | string, params?: ListParams) {\n return this.iteratePaginatedList(\n (pageParams) => this.listVersions(contextGraphId, pageParams),\n params,\n )\n }\n\n /** Get a specific version by number, or pass \"latest\" for the most recent */\n async getVersion(contextGraphId: ContextGraphId | string, version: number | 'latest') {\n return extractData(\n await this.client.GET(\n '/v1/{workspace_id}/context-graphs/{context_graph_id}/versions/{version}',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n context_graph_id: contextGraphId,\n version,\n },\n },\n },\n ),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { DataSourceId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListDataSourcesParams extends ListParams {\n type?: string\n status?: string\n}\n\n/**\n * Manage data sources \u2014 connections to external databases, warehouses,\n * or data feeds that the platform can query and sync from.\n */\nexport class DataSourcesResource extends WorkspaceScopedResource {\n async create(body: components['schemas']['CreateDataSourceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/data-sources', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async list(params?: ListDataSourcesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/data-sources', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListDataSourcesParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(dataSourceId: DataSourceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/data-sources/{data_source_id}', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n }),\n )\n }\n\n async update(\n dataSourceId: DataSourceId | string,\n body: components['schemas']['UpdateDataSourceRequest'],\n ) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/data-sources/{data_source_id}', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n body,\n }),\n )\n }\n\n async delete(dataSourceId: DataSourceId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/data-sources/{data_source_id}', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n })\n }\n\n /** Get event counts, sync status, and health for a data source */\n async getStatus(dataSourceId: DataSourceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/data-sources/{data_source_id}/status', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n }),\n )\n }\n\n /** Get daily event timeline + recent sync failures for a data source */\n async getSyncHistory(dataSourceId: DataSourceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/data-sources/{data_source_id}/sync-history', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n }),\n )\n }\n\n /**\n * Trigger a one-off manual sync of a data source.\n *\n * Bypasses the business-hours gate and per-resource cadence counter on\n * connector-runner. Resolves with `{ status: \"started\", ... }` once the\n * request is queued \u2014 the poll itself runs asynchronously. Platform-api\n * returns 409 if the source is already mid-sync (see\n * `TriggerSyncConflictResponse` for the body shape), 503 if\n * connector-runner is unreachable.\n */\n async triggerSync(dataSourceId: DataSourceId | string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/data-sources/{data_source_id}/sync', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n }),\n )\n }\n}\n", "import type { EntityId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * World Model \u2014 entities, events, relationships, and the entity timeline.\n *\n * The world model is the core knowledge graph of the platform. Entities\n * represent real-world objects (patients, contacts, calls). Events record\n * observations about entities over time.\n */\nexport class WorldResource extends WorkspaceScopedResource {\n // ---- Entities ----\n\n /** List entities with optional filtering */\n async listEntities(params?: {\n entity_type?: string[] | null\n q?: string | null\n limit?: number\n offset?: number\n order?: string | null\n has_projection?: boolean | null\n source?: string | null\n source_system?: string | null\n fhir_resource_type?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listEntitiesAutoPaging(params?: {\n entity_type?: string[] | null\n q?: string | null\n limit?: number\n offset?: number\n order?: string | null\n has_projection?: boolean | null\n source?: string | null\n source_system?: string | null\n fhir_resource_type?: string | null\n }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.listEntities(pageParams),\n (page) => page.entities,\n params,\n )\n }\n\n /** Get a single entity */\n async getEntity(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get all relationships for an entity */\n async getRelationships(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/relationships', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get the knowledge graph centered on an entity (entity + neighbors + edges) */\n async getGraph(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/graph', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get provenance \u2014 which source systems contributed data for an entity */\n async getProvenance(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/provenance', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get lineage \u2014 merge history and canonical identity for an entity */\n async getLineage(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/lineage', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get merged entities for a canonical entity */\n async getMerged(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/merged', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n // ---- Connectors ----\n\n /** Get connected data sources overview with entity counts and sync status */\n async getConnectors() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/connectors', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** List entities from a specific connector / data source */\n async getConnectorEntities(\n dataSourceId: string,\n params?: {\n entity_type?: string | null\n q?: string | null\n limit?: number\n offset?: number\n },\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/connectors/{data_source_id}/entities', {\n params: {\n path: { workspace_id: this.workspaceId, data_source_id: dataSourceId },\n query: params,\n },\n }),\n )\n }\n\n /** Search FHIR resources from a specific data source */\n async getConnectorResources(\n dataSourceId: string,\n params: {\n resource_type: string\n _count?: number\n _offset?: number\n },\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/connectors/{data_source_id}/resources', {\n params: {\n path: { workspace_id: this.workspaceId, data_source_id: dataSourceId },\n query: params,\n },\n }),\n )\n }\n\n // ---- Entity Types ----\n\n /** List registered entity types with counts and schemas */\n async listEntityTypes() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entity-types', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n // ---- Duplicate Detection ----\n\n /** List potential duplicate entity pairs for review or merging */\n async listDuplicates(params?: { entity_type?: string | null; confidence_max?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/duplicates', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n // ---- Semantic Search ----\n\n /** Semantic (vector) search over entities */\n async search(params: {\n q: string\n entity_type?: string | null\n source?: string | null\n confidence_min?: number | null\n limit?: number\n offset?: number\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/search', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n // ---- Timeline ----\n\n /** Get the event timeline for an entity (reverse-chronological) */\n async getTimeline(\n entityId: EntityId | string,\n params?: {\n domain?: string | null\n limit?: number\n offset?: number\n },\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/timeline', {\n params: {\n path: { workspace_id: this.workspaceId, entity_id: entityId },\n query: params,\n },\n }),\n )\n }\n\n getTimelineAutoPaging(\n entityId: EntityId | string,\n params?: {\n domain?: string | null\n limit?: number\n offset?: number\n },\n ) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getTimeline(entityId, pageParams),\n (page) => page.events,\n params,\n )\n }\n\n // ---- Sync ----\n\n /** Get sync status grouped by sink (Lakebase, Delta, etc.) */\n async getSyncStatusBySink() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/sync/by-sink', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** List sync events with status filtering */\n async listSyncEvents(params: {\n status: 'pending' | 'failed'\n data_source_id?: string | null\n source_system?: string | null\n fhir_resource_type?: string | null\n fhir_resource_id?: string | null\n limit?: number\n offset?: number\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/sync/events', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listSyncEventsAutoPaging(params: {\n status: 'pending' | 'failed'\n data_source_id?: string | null\n source_system?: string | null\n fhir_resource_type?: string | null\n fhir_resource_id?: string | null\n limit?: number\n offset?: number\n }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.listSyncEvents(pageParams),\n (page) => page.events,\n params,\n )\n }\n\n /** Get current sync queue depth */\n async getSyncQueueDepth() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/sync/queue', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Retry a single failed sync event */\n async retrySyncEvent(eventId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/world/sync/retry/{event_id}', {\n params: { path: { workspace_id: this.workspaceId, event_id: eventId } },\n }),\n )\n }\n\n /** Retry all failed sync events */\n async retryAllSyncEvents() {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/world/sync/retry-all', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n // ---- Statistics ----\n\n /** Get aggregate entity and event statistics */\n async getStats() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entity-stats', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get entity counts broken down by source system */\n async getSourceBreakdown() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/source-breakdown', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListCallsParams extends ListParams {\n status?: string\n agent_id?: string\n start_date?: string\n end_date?: string\n phone_number?: string\n direction?: string\n min_duration?: number\n max_duration?: number\n search?: string\n include_simulated?: boolean\n service_id?: string\n}\n\n/**\n * Access call records and intelligence.\n * Calls are read-only in the SDK \u2014 they are created by the voice pipeline.\n */\nexport class CallsResource extends WorkspaceScopedResource {\n /** List calls with optional filtering */\n async list(params?: ListCallsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListCallsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get full call detail including turns, escalation, safety, and recording info */\n async get(callId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}', {\n params: { path: { workspace_id: this.workspaceId, call_id: callId } },\n }),\n )\n }\n\n /** Get the canonical playback timeline for a call */\n async getTimeline(callId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}/timeline', {\n params: { path: { workspace_id: this.workspaceId, call_id: callId } },\n }),\n )\n }\n\n /** Get AI intelligence for a call */\n async getIntelligence(callId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}/intelligence', {\n params: { path: { workspace_id: this.workspaceId, call_id: callId } },\n }),\n )\n }\n\n /** Get active intelligence across all in-progress calls */\n async getActiveIntelligence() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/active/intelligence', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get performance benchmarks for a time period */\n async getBenchmarks(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/benchmarks', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Get phone number call volume breakdown */\n async getPhoneVolume(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/phone-volume', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Get deep call trace analysis */\n async getTraceAnalysis(callId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}/trace-analysis', {\n params: { path: { workspace_id: this.workspaceId, call_id: callId } },\n }),\n )\n }\n\n /** List trace analyses across calls (workspace-scoped feed) */\n async listTraces(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/traces', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Get latest Universal Metric Store values scoped to a single call */\n async getMetrics(callId: string, params?: { limit?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}/metrics', {\n params: {\n path: { workspace_id: this.workspaceId, call_id: callId },\n query: params,\n },\n }),\n )\n }\n\n /** Place an outbound call from the workspace's voice pipeline */\n async createOutbound(body: components['schemas']['CreateOutboundCallRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/calls/outbound', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n}\n", "import { ConfigurationError } from '../core/errors.js'\nimport { type PlatformFetch } from '../core/openapi-client.js'\nimport type { components, operations } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type ConversationDetail = components['schemas']['ConversationDetail']\nexport type ConversationListResponse = components['schemas']['ConversationListResponse']\nexport type ConversationSummary =\n components['schemas']['src__routes__conversations__ConversationSummary']\nexport type ConversationTurn = components['schemas']['ConversationTurn']\nexport type CreateConversationRequest = components['schemas']['CreateConversationRequest']\nexport type TurnRequest = components['schemas']['TurnRequest']\nexport type TurnResponse = components['schemas']['TurnResponse']\nexport type TurnStreamEvent = components['schemas']['TurnStreamEvent']\nexport type TurnTokenEvent = components['schemas']['TurnTokenEvent']\nexport type TurnToolCallStartedEvent = components['schemas']['TurnToolCallStartedEvent']\nexport type TurnToolCallCompletedEvent = components['schemas']['TurnToolCallCompletedEvent']\nexport type TurnThinkingEvent = components['schemas']['TurnThinkingEvent']\nexport type TurnMessageEvent = components['schemas']['TurnMessageEvent']\nexport type TurnDoneEvent = components['schemas']['TurnDoneEvent']\nexport type TurnErrorEvent = components['schemas']['TurnErrorEvent']\n\n/**\n * Hand-authored because the text-stream WebSocket endpoint is intentionally\n * outside the generated OpenAPI REST snapshot.\n * TODO: replace with generated types when `/agent/text-stream` is added to\n * openapi.json.\n *\n * @beta The text-stream WebSocket contract may evolve independently of the REST API.\n */\nexport interface TextStreamUrlParams {\n serviceId: string\n conversationId?: string\n entityId?: string\n /**\n * Enable `tool_call_started` and `tool_call_completed` frames on the\n * text-stream WebSocket so the client can render tool invocations in\n * real time.\n */\n toolEvents?: boolean\n /**\n * Bearer token query-param fallback for clients whose API key cannot be sent\n * as a WebSocket subprotocol token. Prefer textStreamAuthProtocols() when\n * the token is subprotocol-safe so secrets do not appear in URLs. The SDK\n * intentionally accepts only the server-supported text-stream token alphabet\n * (letters, digits, `.`, `_`, `+`, `=`, `/`, `:`, `-`) even though\n * URLSearchParams can percent-encode additional characters.\n */\n token?: string\n /**\n * Full text-stream URL override for preview/custom ingress.\n * Defaults to `${baseUrl origin}/agent/text-stream` with\n * `http` mapped to `ws` and `https` mapped to `wss`.\n */\n textStreamUrl?: string\n}\n\n/** @beta The text-stream WebSocket contract may evolve independently of the REST API. */\nexport type TextStreamAuthProtocols = readonly ['auth', string]\n\n/**\n * Hand-authored because the workspace-scoped session-connect WebSocket is\n * intentionally outside the generated OpenAPI REST snapshot.\n *\n * Path: ``WS /v1/{workspace_id}/sessions/connect``. Authentication is delivered\n * via the ``Sec-WebSocket-Protocol: auth, <token>`` subprotocol header \u2014 the\n * server rejects query-param tokens to keep credentials out of URLs and proxy\n * logs. ``serviceId`` and ``entityId`` are required path/query inputs.\n *\n * @beta The session-connect WebSocket contract may evolve independently of the REST API.\n */\nexport interface SessionConnectUrlParams {\n serviceId: string\n entityId: string\n conversationId?: string\n /**\n * Emit ``tool_call_started`` and ``tool_call_completed`` frames so the client\n * can render tool invocations in real time. Server defaults to ``true`` when\n * the param is omitted; the SDK only sets it explicitly when the caller asks\n * to disable tool events.\n */\n toolEvents?: boolean\n /**\n * Full session-connect URL override for preview/custom ingress. Defaults to\n * ``${baseUrl origin}/v1/{workspace_id}/sessions/connect`` with ``http`` mapped\n * to ``ws`` and ``https`` mapped to ``wss``. The override must be an\n * absolute ws/wss URL with no query string or fragment \u2014 SDK-managed query\n * params are appended by the helper.\n */\n sessionConnectUrl?: string\n}\n\nconst MAX_AUTH_TOKEN_CHARS = 4096\nconst TEXT_STREAM_AUTH_TOKEN_RE = /^[-A-Za-z0-9._+=/:]+$/\nconst WEB_SOCKET_PROTOCOL_TOKEN_RE = /^[!#$%&'*+\\-.^_`|~A-Za-z0-9]+$/\n\nexport type ListConversationsParams = NonNullable<\n operations['list_conversations_v1__workspace_id__conversations_get']['parameters']['query']\n>\n\n/** Access text conversation APIs and text-stream URL helpers. */\nexport class ConversationsResource extends WorkspaceScopedResource {\n private readonly agentBaseUrl: string | undefined\n\n constructor(client: PlatformFetch, workspaceId: string, agentBaseUrl?: string) {\n super(client, workspaceId)\n this.agentBaseUrl = agentBaseUrl\n }\n\n async list(params?: ListConversationsParams): Promise<ConversationListResponse> {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/conversations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async create(request: CreateConversationRequest): Promise<ConversationDetail> {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/conversations', {\n params: { path: { workspace_id: this.workspaceId } },\n body: request,\n }),\n )\n }\n\n async get(conversationId: string): Promise<ConversationDetail> {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/conversations/{conversation_id}', {\n params: {\n path: { workspace_id: this.workspaceId, conversation_id: conversationId },\n },\n }),\n )\n }\n\n async close(conversationId: string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/conversations/{conversation_id}', {\n params: {\n path: { workspace_id: this.workspaceId, conversation_id: conversationId },\n },\n })\n }\n\n /**\n * Send a user message and receive the agent's synchronous JSON response.\n *\n * Pass `options.includeToolCalls: true` to request tool-call metadata\n * alongside the response turns. Server-side default is `false` \u2014 without\n * this opt-in the `tool_calls` array on the `TurnResponse` will be empty\n * even when the agent invoked tools during the turn.\n */\n async createTurn(\n conversationId: string,\n request: TurnRequest,\n options?: { includeToolCalls?: boolean },\n ): Promise<TurnResponse> {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/conversations/{conversation_id}/turns', {\n params: {\n path: { workspace_id: this.workspaceId, conversation_id: conversationId },\n ...(options?.includeToolCalls !== undefined && {\n query: { include_tool_calls: options.includeToolCalls },\n }),\n },\n body: request,\n headers: { Accept: 'application/json' },\n }),\n ) as TurnResponse\n }\n\n /**\n * Send a message and receive the agent's response as an SSE byte stream.\n *\n * Targets the explicit always-SSE endpoint\n * `POST /v1/{ws}/conversations/{id}/turns/stream`, so the response is\n * always `text/event-stream` regardless of `Accept` negotiation. Returns\n * a `ReadableStream` of raw bytes; use `EventSourceParserStream` (from\n * `eventsource-parser/stream`) to parse into typed `TurnStreamEvent`,\n * or use the higher-level {@link streamTurn} which hides the parser.\n *\n * @example\n * ```ts\n * const stream = await client.conversations.createTurnStream(convId, { message: \"Hello\" });\n * const events = stream\n * .pipeThrough(new TextDecoderStream())\n * .pipeThrough(new EventSourceParserStream());\n * for await (const event of events) {\n * const parsed = JSON.parse(event.data) as TurnStreamEvent;\n * if (parsed.event === \"token\") console.log(parsed.text);\n * }\n * ```\n */\n async createTurnStream(\n conversationId: string,\n request: TurnRequest,\n options?: { signal?: AbortSignal; includeToolCalls?: boolean },\n ): Promise<ReadableStream<Uint8Array>> {\n const result = await this.client.POST(\n '/v1/{workspace_id}/conversations/{conversation_id}/turns/stream',\n {\n params: {\n path: { workspace_id: this.workspaceId, conversation_id: conversationId },\n ...(options?.includeToolCalls !== undefined && {\n query: { include_tool_calls: options.includeToolCalls },\n }),\n },\n body: request,\n parseAs: 'stream',\n signal: options?.signal,\n },\n )\n if (result.error !== undefined) {\n throw new Error(`API error: ${JSON.stringify(result.error)}`)\n }\n return result.data as ReadableStream<Uint8Array>\n }\n\n /**\n * Send a message and receive the agent's response as a typed\n * `TurnStreamEvent` async iterable.\n *\n * The bytes-and-parser dance from `createTurnStream` is now hidden inside\n * the SDK \u2014 consumers iterate strongly typed events directly. Each yielded\n * value is a member of the `TurnStreamEvent` discriminated union (`token`,\n * `thinking`, `tool_call_started`, `tool_call_completed`, `message`,\n * `done`, `error`), validated as a record with a known `event`\n * discriminator. Unknown / malformed frames are dropped silently \u2014 this\n * matches the wire-format-drift behavior of the lower-level\n * `createTurnStream` while keeping the strict `TurnStreamEvent` static\n * contract intact for consumers.\n *\n * @example\n * ```ts\n * for await (const event of client.conversations.streamTurn(convId, { message: \"Hello\" })) {\n * if (event.event === \"token\") process.stdout.write(event.text);\n * else if (event.event === \"done\") break;\n * }\n * ```\n */\n async *streamTurn(\n conversationId: string,\n request: TurnRequest,\n options?: { signal?: AbortSignal; includeToolCalls?: boolean },\n ): AsyncGenerator<TurnStreamEvent> {\n const byteStream = await this.createTurnStream(conversationId, request, options)\n for await (const frame of parseSSEFrames(byteStream)) {\n const event = parseTurnStreamFrame(frame.event, frame.data)\n if (event) yield event\n }\n }\n\n /** Build the real-time text WebSocket URL for browser or custom clients. */\n textStreamUrl(params: TextStreamUrlParams): string {\n const url = buildTextStreamUrl({\n baseUrl: this.agentBaseUrl ?? this.platformBaseUrl,\n workspaceId: this.workspaceId,\n ...params,\n })\n return url.toString()\n }\n\n /**\n * Build the URL for the workspace-scoped session-connect WebSocket\n * (``WS /v1/{workspace_id}/sessions/connect``).\n *\n * Pair the returned URL with {@link sessionConnectAuthProtocols} so the\n * bearer token is delivered via the ``Sec-WebSocket-Protocol`` header \u2014 the\n * endpoint rejects query-param tokens to keep credentials out of URLs.\n *\n * @example\n * ```ts\n * const url = client.conversations.sessionConnectUrl({\n * serviceId: SERVICE_ID,\n * entityId: ENTITY_ID,\n * conversationId: existingConversationId, // optional resume\n * });\n * const ws = new WebSocket(url, sessionConnectAuthProtocols(apiKey));\n * ```\n */\n sessionConnectUrl(params: SessionConnectUrlParams): string {\n const url = buildSessionConnectUrl({\n baseUrl: this.platformBaseUrl,\n workspaceId: this.workspaceId,\n ...params,\n })\n return url.toString()\n }\n}\n\n/**\n * Build browser WebSocket subprotocols for text-stream authentication.\n *\n * @remarks The returned tuple contains the raw API key. Do not log, persist,\n * serialize, or otherwise expose this value.\n *\n * @security The second subprotocol entry is the bearer secret.\n */\nexport function textStreamAuthProtocols(apiKey: string): TextStreamAuthProtocols {\n const token = validateTextStreamAuthToken(apiKey, 'apiKey')\n if (!WEB_SOCKET_PROTOCOL_TOKEN_RE.test(token)) {\n const invalidChars = describeInvalidSubprotocolChars(token)\n throw new ConfigurationError(\n `apiKey contains characters browsers reject in WebSocket subprotocols (${invalidChars}); use the token option on client.conversations.textStreamUrl() instead for keys containing these characters, only in trusted contexts where URLs are not logged in browser history, server access logs, HTTP proxy logs, or referrer headers`,\n )\n }\n return ['auth', token] as const\n}\n\n/**\n * Build browser WebSocket subprotocols for the workspace-scoped session-connect\n * endpoint (``WS /v1/{workspace_id}/sessions/connect``).\n *\n * The wire format is identical to {@link textStreamAuthProtocols} \u2014 both\n * endpoints expect ``Sec-WebSocket-Protocol: auth, <token>`` \u2014 but the\n * session-connect endpoint has no query-param token fallback, so the API key\n * MUST round-trip through this subprotocol pair. Keys containing characters\n * browsers reject in subprotocols (e.g. ``:``, ``/``, ``=``) cannot be used\n * with the session-connect endpoint and must instead use the legacy\n * ``textStreamUrl`` path.\n *\n * @remarks The returned tuple contains the raw API key. Do not log, persist,\n * serialize, or otherwise expose this value.\n *\n * @security The second subprotocol entry is the bearer secret.\n */\nexport function sessionConnectAuthProtocols(apiKey: string): TextStreamAuthProtocols {\n return textStreamAuthProtocols(apiKey)\n}\n\nfunction buildTextStreamUrl({\n baseUrl,\n workspaceId,\n serviceId,\n conversationId,\n entityId,\n toolEvents,\n token,\n textStreamUrl: textStreamUrlOverride,\n}: TextStreamUrlParams & { baseUrl: string; workspaceId: string }): URL {\n const url = textStreamUrlOverride\n ? parseTextStreamUrlOverride(textStreamUrlOverride)\n : deriveTextStreamUrl(baseUrl)\n url.searchParams.set('workspace_id', workspaceId)\n url.searchParams.set('service_id', serviceId)\n if (conversationId) url.searchParams.set('conversation_id', conversationId)\n if (entityId) url.searchParams.set('entity_id', entityId)\n if (toolEvents) url.searchParams.set('tool_events', 'true')\n if (token !== undefined)\n url.searchParams.set('token', validateTextStreamAuthToken(token, 'token'))\n return url\n}\n\nfunction validateTextStreamAuthToken(token: string, label: string): string {\n if (!token.trim()) {\n throw new ConfigurationError(`${label} is required for text-stream authentication`)\n }\n if (token.length > MAX_AUTH_TOKEN_CHARS || !TEXT_STREAM_AUTH_TOKEN_RE.test(token)) {\n throw new ConfigurationError(\n `${label} contains characters rejected by text-stream authentication`,\n )\n }\n return token\n}\n\nfunction parseTextStreamUrlOverride(textStreamUrl: string): URL {\n try {\n const url = new URL(textStreamUrl)\n if (url.protocol !== 'ws:' && url.protocol !== 'wss:') {\n throw new ConfigurationError('textStreamUrl overrides must use ws: or wss: URLs')\n }\n // Fragment rejection is defensive; WHATWG URL parsing normalizes most\n // WebSocket fragments away, but callers should never rely on fragments here.\n if (url.search || url.hash) {\n throw new ConfigurationError(\n 'textStreamUrl overrides must not include query parameters or fragments; pass SDK-managed fields through textStreamUrl() options',\n )\n }\n return url\n } catch (cause) {\n if (cause instanceof ConfigurationError) throw cause\n throw new ConfigurationError(\n `textStreamUrl must be an absolute URL for text-stream overrides: ${String(cause)}`,\n )\n }\n}\n\nfunction deriveTextStreamUrl(baseUrl: string): URL {\n if (!/^[a-z][a-z\\d+.-]*:\\/\\//i.test(baseUrl)) {\n throw new ConfigurationError(\n 'textStreamUrl cannot be derived from a relative baseUrl; pass agentBaseUrl or textStreamUrl explicitly',\n )\n }\n\n const url = new URL(baseUrl)\n if (url.protocol === 'ws:' || url.protocol === 'wss:') {\n // Already a WebSocket URL (e.g. from agentBaseUrl) \u2014 use directly\n } else if (url.protocol === 'http:' || url.protocol === 'https:') {\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n } else {\n throw new ConfigurationError(\n 'textStreamUrl can only be derived from an http, https, ws, or wss baseUrl; pass textStreamUrl explicitly',\n )\n }\n if (url.pathname !== '/' && url.pathname !== '') {\n throw new ConfigurationError(\n 'textStreamUrl can only be derived from an origin-only baseUrl; pass agentBaseUrl as an origin or textStreamUrl explicitly when using path-prefixed gateways',\n )\n }\n // Text streaming is served by agent-engine ingress, regardless of any REST\n // API path segments on the configured base URL.\n url.pathname = '/agent/text-stream'\n url.search = ''\n url.hash = ''\n return url\n}\n\nfunction buildSessionConnectUrl({\n baseUrl,\n workspaceId,\n serviceId,\n entityId,\n conversationId,\n toolEvents,\n sessionConnectUrl: sessionConnectUrlOverride,\n}: SessionConnectUrlParams & { baseUrl: string; workspaceId: string }): URL {\n const url = sessionConnectUrlOverride\n ? parseSessionConnectUrlOverride(sessionConnectUrlOverride)\n : deriveSessionConnectUrl(baseUrl, workspaceId)\n url.searchParams.set('service_id', serviceId)\n url.searchParams.set('entity_id', entityId)\n if (conversationId) url.searchParams.set('conversation_id', conversationId)\n // Server defaults tool_events to true. Only emit the param when the caller\n // explicitly disables it, so default URLs stay minimal and existing tests\n // can assert exact URLs without incidental query keys.\n if (toolEvents === false) url.searchParams.set('tool_events', 'false')\n return url\n}\n\nfunction parseSessionConnectUrlOverride(sessionConnectUrl: string): URL {\n try {\n const url = new URL(sessionConnectUrl)\n if (url.protocol !== 'ws:' && url.protocol !== 'wss:') {\n throw new ConfigurationError('sessionConnectUrl overrides must use ws: or wss: URLs')\n }\n if (url.search || url.hash) {\n throw new ConfigurationError(\n 'sessionConnectUrl overrides must not include query parameters or fragments; pass SDK-managed fields through sessionConnectUrl() options',\n )\n }\n return url\n } catch (cause) {\n if (cause instanceof ConfigurationError) throw cause\n throw new ConfigurationError(\n `sessionConnectUrl must be an absolute URL for session-connect overrides: ${String(cause)}`,\n )\n }\n}\n\nfunction deriveSessionConnectUrl(baseUrl: string, workspaceId: string): URL {\n if (!/^[a-z][a-z\\d+.-]*:\\/\\//i.test(baseUrl)) {\n throw new ConfigurationError(\n 'sessionConnectUrl cannot be derived from a relative baseUrl; pass sessionConnectUrl explicitly',\n )\n }\n\n const url = new URL(baseUrl)\n if (url.protocol === 'ws:' || url.protocol === 'wss:') {\n // Already a WebSocket URL \u2014 use directly.\n } else if (url.protocol === 'http:' || url.protocol === 'https:') {\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n } else {\n throw new ConfigurationError(\n 'sessionConnectUrl can only be derived from an http, https, ws, or wss baseUrl; pass sessionConnectUrl explicitly',\n )\n }\n if (url.pathname !== '/' && url.pathname !== '') {\n throw new ConfigurationError(\n 'sessionConnectUrl can only be derived from an origin-only baseUrl; pass sessionConnectUrl explicitly when using path-prefixed gateways',\n )\n }\n url.pathname = `/v1/${workspaceId}/sessions/connect`\n url.search = ''\n url.hash = ''\n return url\n}\n\nfunction describeInvalidSubprotocolChars(token: string): string {\n const chars = new Set<string>()\n for (const char of token) {\n // Single-character regex checks are intentional: the regex is anchored for\n // full-token validation, and here we need only the offending characters.\n if (!WEB_SOCKET_PROTOCOL_TOKEN_RE.test(char)) chars.add(char)\n }\n return [...chars].map((char) => JSON.stringify(char)).join(', ')\n}\n\n// ---------------------------------------------------------------------------\n// Inline SSE parser\n//\n// Implemented inline rather than depending on `eventsource-parser` so the SDK\n// stays at two runtime deps (`openapi-fetch`, `openapi-typescript-helpers`).\n// SSE is simple enough that a ~30-line state machine reads cleaner than a\n// transitive bundle increase. Spec: https://html.spec.whatwg.org/multipage/server-sent-events.html\n// (handled fields: `event`, `data`; comments and `id`/`retry` are ignored).\n// ---------------------------------------------------------------------------\n\ninterface SSEFrame {\n event: string\n data: string\n}\n\nasync function* parseSSEFrames(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<SSEFrame> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n function* drain(text: string): Generator<SSEFrame> {\n buffer += text\n // Frames are terminated by a blank line (\\n\\n or \\r\\n\\r\\n).\n while (true) {\n const idx = findFrameTerminator(buffer)\n if (idx === null) break\n const block = buffer.slice(0, idx.terminatorStart)\n buffer = buffer.slice(idx.terminatorEnd)\n const frame = parseSSEBlock(block)\n if (frame) yield frame\n }\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n yield* drain(decoder.decode(value, { stream: true }))\n }\n // Flush any partial decode + handle a final frame missing the trailing\n // blank line (defensive \u2014 well-behaved servers always terminate).\n yield* drain(decoder.decode())\n if (buffer.trim().length > 0) {\n const frame = parseSSEBlock(buffer)\n if (frame) yield frame\n buffer = ''\n }\n } finally {\n reader.releaseLock()\n }\n}\n\nfunction findFrameTerminator(\n s: string,\n): { terminatorStart: number; terminatorEnd: number } | null {\n // Prefer LF-LF; fall back to CRLF-CRLF if the server is using CRLF\n // line endings end-to-end.\n const lf = s.indexOf('\\n\\n')\n const crlf = s.indexOf('\\r\\n\\r\\n')\n if (lf < 0 && crlf < 0) return null\n if (lf < 0) return { terminatorStart: crlf, terminatorEnd: crlf + 4 }\n if (crlf < 0) return { terminatorStart: lf, terminatorEnd: lf + 2 }\n return lf < crlf\n ? { terminatorStart: lf, terminatorEnd: lf + 2 }\n : { terminatorStart: crlf, terminatorEnd: crlf + 4 }\n}\n\nfunction parseSSEBlock(block: string): SSEFrame | null {\n let event = ''\n const dataLines: string[] = []\n for (const line of block.split(/\\r?\\n/)) {\n if (line === '' || line.startsWith(':')) continue\n const colon = line.indexOf(':')\n const field = colon < 0 ? line : line.slice(0, colon)\n let value = colon < 0 ? '' : line.slice(colon + 1)\n if (value.startsWith(' ')) value = value.slice(1)\n if (field === 'event') event = value\n else if (field === 'data') dataLines.push(value)\n // `id`, `retry`, and unknown fields are ignored \u2014 we only need the\n // discriminator + payload for the typed event surface.\n }\n if (!event || dataLines.length === 0) return null\n return { event, data: dataLines.join('\\n') }\n}\n\n// ---------------------------------------------------------------------------\n// TurnStreamEvent frame validator\n//\n// Drift-tolerant: an unknown `event` discriminator or a non-object payload\n// is dropped silently (matches the behavior of the lower-level\n// `createTurnStream` plus consumer-side parsing). The strict\n// `TurnStreamEvent` static contract is preserved for downstream callers\n// because we only yield values whose `event` discriminator is one of the\n// known union members.\n// ---------------------------------------------------------------------------\n\nconst KNOWN_TURN_STREAM_EVENTS: ReadonlySet<TurnStreamEvent['event']> = new Set([\n 'token',\n 'thinking',\n 'tool_call_started',\n 'tool_call_completed',\n 'message',\n 'done',\n 'error',\n])\n\nfunction parseTurnStreamFrame(eventName: string, dataJson: string): TurnStreamEvent | null {\n if (!(KNOWN_TURN_STREAM_EVENTS as ReadonlySet<string>).has(eventName)) return null\n let payload: unknown\n try {\n payload = JSON.parse(dataJson)\n } catch {\n return null\n }\n if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) return null\n // Server omits the discriminator from the JSON body (it lives in the SSE\n // `event:` line). Reattach it so the union member is well-formed.\n return { ...(payload as Record<string, unknown>), event: eventName } as TurnStreamEvent\n}\n\n", "/**\n * SES setup resource \u2014 workspace-scoped CRUD over the channel-manager-backed\n * SES setup proxy at ``/v1/{workspace_id}/channels/ses-setup``.\n *\n * Use SES setups to register a verified sending domain (e.g.\n * ``mail.acme.com``) that can then back one or more email use cases. The\n * caller publishes the returned DNS records (DKIM CNAMEs, MX, DMARC TXT)\n * at their DNS provider; subsequent ``get`` or ``verify`` calls re-run the\n * live DNS lookup and update each record's ``verified`` flag.\n */\n\nimport type { components } from '../../generated/api.js'\nimport type { ListParams } from '../../core/utils.js'\nimport { WorkspaceScopedResource, extractData } from '../base.js'\n\n// Re-export the generated schema types verbatim \u2014 never hand-roll a parallel\n// shape that drifts from openapi.json. Naming preserved at the package root\n// so the public API surface matches the SDK convention (drop the `Response`\n// suffix; consumers think in terms of resource shapes, not REST artifacts).\nexport type CreateSesSetupRequest = components['schemas']['CreateSesSetupRequest']\nexport type SesSetupDetail = components['schemas']['SesSetupDetailResponse']\nexport type SesSetupListItem = components['schemas']['SesSetupListItemResponse']\nexport type DnsRecord = components['schemas']['DnsRecordResponse']\n// Named alias for the paginated list response so consumers can annotate\n// variables with the public type rather than reaching into the generated\n// schema by string. The underlying schema name is openapi-typescript's\n// double-underscore encoding of FastAPI's parameterized generic; aliasing\n// it here gives us a stable rename point if the generator output shifts.\nexport type SesSetupListResponse =\n components['schemas']['PaginatedResponse_SesSetupListItemResponse_']\n\n// Compile-time guard: pin the required fields the SDK depends on so a\n// generator rename of the double-underscore-encoded schema (or a\n// degradation that collapses the type to ``any``) fails at build time\n// rather than silently letting drift land on consumers.\n//\n// Design notes for the next person to extend this:\n//\n// 1. ``IsAny<T>`` rejection comes first \u2014 a one-way ``extends`` lets\n// ``any`` slip through (``any`` extends everything). If the\n// generator ever degrades this schema to ``any`` we want a hard\n// compile error rather than a silent loss of typing.\n//\n// 2. The structural check is **one-way** (``[T] extends [Shape]``)\n// on purpose \u2014 additive optional fields the generator might\n// introduce (``total``, ``next_cursor``, etc.) are tolerated\n// because they don't break the SDK contract. A bidirectional\n// \"exact\" check would force a guard update on every additive\n// schema change and is the wrong semantic for forward-compatible\n// public types.\n//\n// 3. The failure branch is a string-literal type, not ``never`` \u2014\n// so when the guard does fire, the TypeScript error reads\n// \"Type 'true' is not assignable to type\n// 'SesSetupListResponse no longer matches \u2026'\" instead of the\n// opaque \"Type 'boolean' is not assignable to type 'never'\".\n// Future guards in other resources should follow the same\n// template.\ntype IsAny<T> = 0 extends 1 & T ? true : false\ntype GUARD_FAILURE_MESSAGE =\n 'SesSetupListResponse no longer matches the expected paginated shape ({ items, has_more, continuation_token? }) \u2014 has openapi-typescript renamed the generic encoding, or did the API drop a load-bearing field? Update the alias on line ~30 and this guard together.'\ntype AssertSchemaShape<T, Shape> = IsAny<T> extends true\n ? GUARD_FAILURE_MESSAGE\n : [T] extends [Shape]\n ? true\n : GUARD_FAILURE_MESSAGE\nconst _SES_SETUP_LIST_RESPONSE_GUARD: AssertSchemaShape<\n SesSetupListResponse,\n {\n items: SesSetupListItem[]\n has_more: boolean\n continuation_token?: number | null\n }\n> = true\nvoid _SES_SETUP_LIST_RESPONSE_GUARD\n\nexport class SesSetupResource extends WorkspaceScopedResource {\n /**\n * Create an SES tenant + verified domain identity for this workspace.\n *\n * Returns the DNS records the customer must publish at their DNS provider.\n * The setup is unusable for sending until every record's ``verified`` flag\n * flips to ``true`` (call ``verify`` after publishing DNS to refresh).\n */\n async create(body: CreateSesSetupRequest): Promise<SesSetupDetail> {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/channels/ses-setup', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /**\n * List SES setups owned by this workspace.\n *\n * Each item carries the cached ``dns_verified`` aggregate; call ``get``\n * for per-record DNS detail.\n */\n async list(params?: ListParams): Promise<SesSetupListResponse> {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/channels/ses-setup', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Auto-paginating async iterable over every SES setup in the workspace. */\n listAutoPaging(params?: ListParams): AsyncGenerator<SesSetupListItem> {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /**\n * Get an SES setup with a live DNS verification refresh.\n *\n * Channel-manager re-runs ``GetEmailIdentity`` + DMARC/MX resolvers on\n * every call, so each ``get`` is a live check rather than a cache read.\n */\n async get(setupId: string): Promise<SesSetupDetail> {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/channels/ses-setup/{setup_id}', {\n params: { path: { workspace_id: this.workspaceId, setup_id: setupId } },\n }),\n )\n }\n\n /**\n * Explicit DNS refresh \u2014 equivalent to ``get`` but exposed as a POST so UI\n * \"Verify now\" actions read as actions rather than reads.\n */\n async verify(setupId: string): Promise<SesSetupDetail> {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/channels/ses-setup/{setup_id}/verify', {\n params: { path: { workspace_id: this.workspaceId, setup_id: setupId } },\n }),\n )\n }\n\n /**\n * Tear down the upstream SES tenant + identity and soft-delete the\n * workspace binding. Throws ``ConflictError`` (HTTP 409) if any use case\n * still references the setup \u2014 delete those use cases first.\n *\n * Routed through ``extractData`` so 4xx/5xx responses surface as typed\n * SDK errors (matching every other resource's ``delete``); the\n * ``ConflictError`` mapping fires here instead of relying on the\n * underlying client's accidental throw.\n */\n async delete(setupId: string): Promise<void> {\n return extractData(\n await this.client.DELETE('/v1/{workspace_id}/channels/ses-setup/{setup_id}', {\n params: { path: { workspace_id: this.workspaceId, setup_id: setupId } },\n }),\n )\n }\n}\n", "/**\n * Channels namespace \u2014 workspace-scoped CRUD over the channel-manager-backed\n * proxy mounted at ``/v1/{workspace_id}/channels/...`` on platform-api.\n *\n * Each subresource (``sesSetup``, future ``twilioSetup``, ``email``, etc.)\n * lands in its own module; this barrel composes them onto a single\n * ``ChannelsResource`` so callers can write\n * ``client.channels.sesSetup.create(...)``.\n *\n * Extends ``WorkspaceScopedResource`` so ``client.channels.withOptions(...)``\n * matches the universal pattern documented in api.md. The inherited\n * ``withOptions`` reconstructs ``ChannelsResource`` with a scoped\n * ``PlatformFetch`` client; the constructor below forwards that scoped\n * client into a fresh ``SesSetupResource``, so the scoped headers /\n * timeout / retry flow through to subresource calls automatically.\n */\n\nimport type { PlatformFetch } from '../../core/openapi-client.js'\nimport { WorkspaceScopedResource } from '../base.js'\nimport { SesSetupResource } from './ses-setup.js'\n\nexport { SesSetupResource } from './ses-setup.js'\nexport type {\n CreateSesSetupRequest,\n DnsRecord,\n SesSetupDetail,\n SesSetupListItem,\n SesSetupListResponse,\n} from './ses-setup.js'\n\nexport class ChannelsResource extends WorkspaceScopedResource {\n readonly sesSetup: SesSetupResource\n\n constructor(client: PlatformFetch, workspaceId: string) {\n super(client, workspaceId)\n this.sesSetup = new SesSetupResource(client, workspaceId)\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { PhoneNumberId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\n/**\n * Manage phone numbers \u2014 provision, configure, and release Twilio numbers\n * that are attached to agents for inbound/outbound calling.\n */\nexport class PhoneNumbersResource extends WorkspaceScopedResource {\n /** Create a new phone number */\n async provision(body: components['schemas']['CreatePhoneNumberRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/phone-numbers', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List phone numbers in the workspace */\n async list(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/phone-numbers', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a phone number */\n async get(phoneNumberId: PhoneNumberId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/phone-numbers/{phone_number_id}', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n }),\n )\n }\n\n /** Update a phone number (assign to agent, rename) */\n async update(\n phoneNumberId: PhoneNumberId | string,\n body: components['schemas']['UpdatePhoneNumberRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/phone-numbers/{phone_number_id}', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n body,\n }),\n )\n }\n\n /** Release a phone number back to the carrier */\n async release(phoneNumberId: PhoneNumberId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/phone-numbers/{phone_number_id}', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n })\n }\n\n /** Set call forwarding for a phone number */\n async setForwarding(\n phoneNumberId: PhoneNumberId | string,\n body: components['schemas']['ForwardingConfigRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/phone-numbers/{phone_number_id}/forwarding', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n body,\n }),\n )\n }\n\n /** Clear call forwarding for a phone number */\n async clearForwarding(phoneNumberId: PhoneNumberId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/phone-numbers/{phone_number_id}/forwarding', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n })\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { IntegrationId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListIntegrationsParams extends ListParams {\n protocol?: string\n enabled?: boolean\n search?: string\n}\n\n/**\n * Manage integrations \u2014 connections to external systems (EHRs, CRMs, etc.).\n * Integrations power connector data acquisition and skill tool calls.\n */\nexport class IntegrationsResource extends WorkspaceScopedResource {\n /** Create a new integration */\n async create(body: components['schemas']['CreateIntegrationRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/integrations', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List integrations */\n async list(params?: ListIntegrationsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/integrations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListIntegrationsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single integration */\n async get(integrationId: IntegrationId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/integrations/{integration_id}', {\n params: { path: { workspace_id: this.workspaceId, integration_id: integrationId } },\n }),\n )\n }\n\n /** Update integration configuration */\n async update(\n integrationId: IntegrationId | string,\n body: components['schemas']['UpdateIntegrationRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/integrations/{integration_id}', {\n params: { path: { workspace_id: this.workspaceId, integration_id: integrationId } },\n body,\n }),\n )\n }\n\n /** Delete an integration */\n async delete(integrationId: IntegrationId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/integrations/{integration_id}', {\n params: { path: { workspace_id: this.workspaceId, integration_id: integrationId } },\n })\n }\n\n /**\n * Test a specific endpoint on an integration with given params.\n * Used in the developer console to validate integration config.\n */\n async testEndpoint(\n integrationId: IntegrationId | string,\n endpointName: string,\n body: components['schemas']['TestEndpointRequest'],\n ) {\n return extractData(\n await this.client.POST(\n '/v1/{workspace_id}/integrations/{integration_id}/endpoints/{endpoint_name}/test',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n integration_id: integrationId,\n endpoint_name: endpointName,\n },\n },\n body,\n },\n ),\n )\n }\n\n\n /**\n * Probe an integration's connection + auth without invoking any specific\n * endpoint. Exercises auth resolution end-to-end (SSM lookups, OAuth2 token\n * mints, JWT signing) and sends a HEAD request to ``base_url`` (REST/FHIR)\n * or ``mcp_url`` (MCP). Safe on production integrations \u2014 HEAD carries no\n * side effects.\n *\n * The most recent probe outcome is persisted on the integration so\n * subsequent ``get`` / ``list`` responses surface ``last_tested_at`` +\n * ``last_test_status`` without re-probing.\n *\n * @returns ``status`` is one of ``healthy`` / ``auth_failed`` /\n * ``unreachable`` / ``timeout`` / ``ssl_error`` / ``misconfigured``,\n * each mapping to a distinct, actionable user message.\n */\n async testConnection(integrationId: IntegrationId | string) {\n return extractData(\n await this.client.POST(\n '/v1/{workspace_id}/integrations/{integration_id}/test-connection',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n integration_id: integrationId,\n },\n },\n },\n ),\n )\n }\n\n /** Check health of all integrations in the workspace */\n async getHealthCheck() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/integrations/health-check', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Analytics \u2014 aggregate metrics about calls, agents, quality, and usage.\n */\nexport class AnalyticsResource extends WorkspaceScopedResource {\n /** High-level dashboard summary \u2014 pass `days` (default: 7) for the lookback window */\n async getDashboard(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/dashboard', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Call volume and duration metrics */\n async getCalls(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/calls', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Per-agent performance breakdown */\n async getAgents(params?: { period?: string }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/agents', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Call quality \u2014 sentiment, transcription confidence, flagged calls */\n async getCallQuality(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/call-quality', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Emotion trend data over time */\n async getEmotionTrends(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/emotion-trends', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Voice pipeline latency metrics (TTFB, response time) */\n async getLatency(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/latency', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Tool call performance \u2014 success rates and latency per tool */\n async getToolPerformance(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/tool-performance', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Data quality metrics for the workspace world model */\n async getDataQuality(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/data-quality', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Usage summary \u2014 API requests, call minutes, storage */\n async getUsage(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n direction?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/usage', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Event type breakdown \u2014 counts and trends per event type */\n async getEventBreakdown(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/events', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Safety and escalation trends \u2014 risk distribution and time-series data */\n async getSafetyTrends(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/safety-trends', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Operator escalation performance and quality comparison */\n async getOperatorPerformance(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/operator-performance', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Advanced call statistics (abandonment, transfers, silence, hour-of-day) */\n async getAdvancedCallStats(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/calls/advanced', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Compare two time periods side by side */\n async compareCallPeriods(params: {\n current_from: string\n current_to: string\n previous_from: string\n previous_to: string\n service_id?: string\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/calls/comparison', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /**\n * Surfaces analytics \u2014 completion rates, channel effectiveness, field\n * abandonment, and per-entity breakdowns. Used by the developer console's\n * surfaces analytics tab.\n */\n readonly surfaces = {\n getCompletionRates: async (params?: { days?: number }) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/surfaces/completion-rates', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n getChannelEffectiveness: async (params?: { days?: number }) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/surfaces/channel-effectiveness', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n getFieldAbandonment: async (params?: { days?: number }) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/surfaces/field-abandonment', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n /** Per-entity surfaces analytics (which surfaces a specific entity has seen) */\n getForEntity: async (entityId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/surfaces/entity/{entity_id}', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n ),\n }\n}\n", "import type { components, paths } from '../generated/api.js'\nimport type { ServiceId, SimulationRunId, SimulationSessionId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n// Module-private alias over the platform-keyed schema name\n// `src__routes__simulations__CreateSessionRequest`. Same rationale as\n// `desktop-sessions.ts`: keep it unexported so the Python-module prefix\n// doesn't reach the published `.d.ts`.\ntype CreateSimulationSessionRequest =\n components['schemas']['src__routes__simulations__CreateSessionRequest']\n\nexport type ListSimulationRunsParams = NonNullable<\n paths['/v1/{workspace_id}/simulations/runs']['get']['parameters']['query']\n>\n\n/**\n * Simulations \u2014 interactive agent testing via the Playground.\n *\n * Create a session to get the agent's greeting, then step through the\n * conversation turn by turn. Get LLM-generated caller suggestions to\n * guide exploratory testing.\n */\nexport class SimulationsResource extends WorkspaceScopedResource {\n /** Start a simulation session \u2014 returns the agent's greeting and initial snapshot */\n async createSession(\n body: CreateSimulationSessionRequest,\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/sessions', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Get the current snapshot of a session */\n async getSession(sessionId: SimulationSessionId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/sessions/{session_id}', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n\n /** Delete a simulation session */\n async deleteSession(sessionId: SimulationSessionId | string) {\n return extractData(\n await this.client.DELETE('/v1/{workspace_id}/simulations/sessions/{session_id}', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n\n /**\n * Send a caller utterance and advance the session by one turn.\n * Returns the agent's response observation and updated snapshot.\n */\n async step(body: components['schemas']['StepRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/sessions/step', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /**\n * Get LLM-generated caller message suggestions for the current session state.\n * Helps exploratory testing by suggesting realistic next caller turns.\n */\n async recommend(body: components['schemas']['RecommendRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/sessions/recommend', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Get AI-generated call intelligence for a completed session */\n async getIntelligence(sessionId: SimulationSessionId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/sessions/{session_id}/intelligence', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n\n /**\n * Multi-session simulation runs \u2014 orchestrate a batch of scenarios against\n * a service to compute coverage and surface regressions. Use this when you\n * want to compare branch behavior or measure drift between versions.\n *\n * @beta New in this release; surface may evolve.\n */\n readonly runs = {\n /** List simulation runs in the workspace */\n list: async (params?: ListSimulationRunsParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/runs', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n /** Create a new simulation run */\n create: async (body: components['schemas']['CreateRunRequest']) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/runs', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n\n /** Get a simulation run with its scenarios + status */\n get: async (runId: SimulationRunId | string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/runs/{run_id}', {\n params: { path: { workspace_id: this.workspaceId, run_id: runId } },\n }),\n ),\n\n /** Mark a run as complete (used by the harness once all sessions finish) */\n complete: async (runId: SimulationRunId | string) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/runs/{run_id}/complete', {\n params: { path: { workspace_id: this.workspaceId, run_id: runId } },\n }),\n ),\n\n /** Spin up a session under a run (single scenario inside the run's batch) */\n createSession: async (\n runId: SimulationRunId | string,\n body: CreateSimulationSessionRequest,\n ) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/runs/{run_id}/sessions', {\n params: { path: { workspace_id: this.workspaceId, run_id: runId } },\n body,\n }),\n ),\n }\n\n /**\n * Bridge \u2014 convert recorded production calls into simulation scenarios so\n * they can be replayed against a candidate version. ``plan`` returns a\n * preview of which calls would be selected; ``run`` executes the plan.\n */\n readonly bridge = {\n /** Plan a bridge run \u2014 returns the candidate scenarios without executing */\n plan: async (body: components['schemas']['BridgePlanRequest']) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/bridge/plan', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n\n /** Execute a bridge run and return the resulting run handle */\n run: async (body: components['schemas']['BridgeRequest']) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/bridge', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n /**\n * Per-service simulation views \u2014 graph of explored conversation paths,\n * recorded sessions, and per-turn telemetry. Used by the developer console's\n * coverage tab to visualize what scenarios have been exercised.\n */\n readonly services = {\n /** Get the conversation graph (nodes/edges) for a service */\n getGraph: async (serviceId: ServiceId | string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/services/{service_id}/graph', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n }),\n ),\n\n /** Reset / delete the service's accumulated graph */\n deleteGraph: async (serviceId: ServiceId | string) =>\n extractData(\n await this.client.DELETE('/v1/{workspace_id}/simulations/services/{service_id}/graph', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n }),\n ),\n\n /** Get the set of explored conversation paths through the graph */\n getGraphPaths: async (serviceId: ServiceId | string) =>\n extractData(\n await this.client.GET(\n '/v1/{workspace_id}/simulations/services/{service_id}/graph/paths',\n {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n },\n ),\n ),\n\n /** List recorded sessions for the service */\n listSessions: async (serviceId: ServiceId | string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/services/{service_id}/sessions', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n }),\n ),\n\n /** List per-turn observations for the service */\n listTurns: async (serviceId: ServiceId | string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/services/{service_id}/turns', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n }),\n ),\n }\n}\n", "import type { components, operations } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type MetricCatalogEntry = components['schemas']['MetricCatalogEntry']\nexport type MetricCatalogResponse = components['schemas']['MetricCatalogResponse']\nexport type MetricListResponse = components['schemas']['MetricListResponse']\nexport type NumericalMetricValue = components['schemas']['NumericalMetricValueResponse']\nexport type CategoricalMetricValue = components['schemas']['CategoricalMetricValueResponse']\nexport type BooleanMetricValue = components['schemas']['BooleanMetricValueResponse']\nexport type MetricValue = NumericalMetricValue | CategoricalMetricValue | BooleanMetricValue\n/** @deprecated Use `MetricValue` instead. */\nexport type MetricValueResponse = MetricValue\nexport type MetricValuesParams = NonNullable<operations['get-metric-values']['parameters']['query']>\nexport type MetricTrendParams = NonNullable<operations['get-metric-trend']['parameters']['query']>\n\n/**\n * Metrics \u2014 computed metric catalog and typed metric values.\n */\nexport class MetricsResource extends WorkspaceScopedResource {\n /** List the latest value for each metric in the workspace */\n async listLatest() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/metrics', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** List available built-in and custom metric definitions */\n async getCatalog() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/metrics/catalog', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get stored values for one metric key, optionally bounded by time range */\n async getValues(metricKey: string, params?: MetricValuesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/metrics/{metric_key}', {\n params: {\n path: { workspace_id: this.workspaceId, metric_key: metricKey },\n query: params,\n },\n }),\n )\n }\n\n /** Get a recent time-series trend for one metric key */\n async getTrend(metricKey: string, params?: MetricTrendParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/metrics/{metric_key}/trend', {\n params: {\n path: { workspace_id: this.workspaceId, metric_key: metricKey },\n query: params,\n },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Workspace-level settings \u2014 configure voice behavior, branding, data\n * retention, outreach rules, and more.\n *\n * Each sub-resource has `get()` and `update()`.\n */\nexport class SettingsResource extends WorkspaceScopedResource {\n readonly voice = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/voice', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['VoiceSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/voice', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly branding = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/branding', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['BrandingSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/branding', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly outreach = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/outreach', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['OutreachSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/outreach', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly memory = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/memory', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['MemorySettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/memory', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly retention = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/retention', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['RetentionPolicyRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/retention', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly behaviors = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/behaviors', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['BehaviorSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/behaviors', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly gapScanner = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/gap-scanner', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['GapScannerSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/gap-scanner', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n /**\n * Preview which calls would be flagged by the current gap-scanner config.\n *\n * The spec types the body as `GapScannerPreviewRequest | null`, but the\n * `null` branch only matters when the caller wants to *explicitly* clear\n * the body. Modeling as `body?: GapScannerPreviewRequest` keeps the SDK\n * surface consistent with every other POST wrapper; consumers who need\n * to send the literal `null` can do so via `client.POST(...)` directly.\n */\n preview: async (body?: components['schemas']['GapScannerPreviewRequest']) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/settings/gap-scanner/preview', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n /** Trigger an on-demand scan with the current gap-scanner config */\n scan: async () =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/settings/gap-scanner/scan', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n }\n\n readonly metrics = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/metrics', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['MetricSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/metrics', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly environments = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/environments', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['EnvironmentSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/environments', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly workflows = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/workflows', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['WorkflowSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/workflows', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListInvoicesParams extends ListParams {\n status?: 'draft' | 'sent' | 'paid' | 'void'\n date_from?: string\n date_to?: string\n}\n\nexport interface UsageTrendsParams {\n days?: number\n date_from?: string\n date_to?: string\n meter_key?: string\n}\n\n/**\n * Billing \u2014 dashboard, usage summaries, invoices, and usage trends.\n */\nexport class BillingResource extends WorkspaceScopedResource {\n /** Get composite billing dashboard \u2014 KPIs, period comparison, top meters, invoice summary */\n async getDashboard() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/dashboard', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get usage summary for the workspace */\n async getUsage() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/usage', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get usage time-series per meter for trend charts */\n async getUsageTrends(params?: UsageTrendsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/usage/trends', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** List invoices for the workspace */\n async listInvoices(params?: ListInvoicesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/invoices', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listInvoicesAutoPaging(params?: ListInvoicesParams) {\n return this.iteratePaginatedList((pageParams) => this.listInvoices(pageParams), params)\n }\n\n /** Get invoice detail */\n async getInvoice(invoiceId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/invoices/{invoice_id}', {\n params: { path: { workspace_id: this.workspaceId, invoice_id: invoiceId } },\n }),\n )\n }\n\n /** Get presigned S3 URL for invoice PDF download */\n async getInvoicePdf(invoiceId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/invoices/{invoice_id}/pdf', {\n params: { path: { workspace_id: this.workspaceId, invoice_id: invoiceId } },\n }),\n )\n }\n}\n", "import type { EntityId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Agent Memory \u2014 structured long-term memory for entities.\n *\n * Memory is organised into dimensions (e.g. \"preferences\", \"health_history\").\n * Each dimension accumulates facts extracted from calls and events over time.\n * This powers the \"Agent Memory\" view in the console.\n */\nexport class MemoryResource extends WorkspaceScopedResource {\n /**\n * Get all memory dimension scores for an entity.\n * Scores reflect how complete and confident each dimension's facts are.\n */\n async getEntityDimensions(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/memory/{entity_id}/dimensions', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /**\n * Get individual memory facts for an entity, optionally filtered by dimension.\n */\n async getEntityFacts(\n entityId: EntityId | string,\n params?: { dimension?: string; limit?: number },\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/memory/{entity_id}/facts', {\n params: {\n path: { workspace_id: this.workspaceId, entity_id: entityId },\n query: params,\n },\n }),\n )\n }\n\n /**\n * Get workspace-level memory analytics \u2014 coverage rates, dimension health,\n * and fact ingestion trends.\n */\n async getAnalytics() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/memory/analytics', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { PersonaId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListPersonasParams extends ListParams {\n search?: string | null\n sort_by?: string | null\n}\n\nexport class PersonasResource extends WorkspaceScopedResource {\n async list(params?: ListPersonasParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/personas', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListPersonasParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async create(body: components['schemas']['CreatePersonaRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/personas', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async get(personaId: PersonaId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/personas/{persona_id}', {\n params: { path: { workspace_id: this.workspaceId, persona_id: personaId } },\n }),\n )\n }\n\n async update(personaId: PersonaId | string, body: components['schemas']['UpdatePersonaRequest']) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/personas/{persona_id}', {\n params: { path: { workspace_id: this.workspaceId, persona_id: personaId } },\n body,\n }),\n )\n }\n\n async delete(personaId: PersonaId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/personas/{persona_id}', {\n params: { path: { workspace_id: this.workspaceId, persona_id: personaId } },\n })\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListReviewItemsParams extends ListParams {\n status?: string | null\n entity_type?: string | null\n priority?: number | null\n reason?: string | null\n assigned_to?: string | null\n created_after?: string | null\n created_before?: string | null\n sort_by?: string | null\n sort_order?: string\n}\n\nexport interface ReviewHistoryParams extends ListParams {\n action?: string | null\n reviewed_by?: string | null\n completed_after?: string | null\n completed_before?: string | null\n}\n\nexport class ReviewQueueResource extends WorkspaceScopedResource {\n async list(params?: ListReviewItemsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListReviewItemsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(itemId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/{item_id}', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n\n async getStats() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/stats', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getDashboard() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/dashboard', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getMyQueue(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/my-queue', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getMyQueueAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.getMyQueue(pageParams), params)\n }\n\n async approve(itemId: string, body: components['schemas']['ApproveRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/approve', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n body,\n }),\n )\n }\n\n async reject(itemId: string, body: components['schemas']['RejectRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/reject', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n body,\n }),\n )\n }\n\n async claim(itemId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/claim', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n\n async unclaim(itemId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/unclaim', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n\n async correct(itemId: string, body: components['schemas']['CorrectRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/correct', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n body,\n }),\n )\n }\n\n async batchApprove(body: components['schemas']['BatchApproveRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/batch-approve', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async batchReject(body: components['schemas']['BatchRejectRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/batch-reject', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async getHistory(params?: ReviewHistoryParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/history', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getHistoryAutoPaging(params?: ReviewHistoryParams) {\n return this.iteratePaginatedList((pageParams) => this.getHistory(pageParams), params)\n }\n\n async getTrends(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/trends', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getPerformance(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/performance', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getCorrectionSchema(itemId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/{item_id}/correction-schema', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n\n async getDiff(itemId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/{item_id}/diff', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\nexport class RecordingsResource extends WorkspaceScopedResource {\n async getUrls(callSid: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/recordings/{call_sid}/urls', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid } },\n }),\n )\n }\n\n async getMetadata(callSid: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/recordings/{call_sid}/metadata', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid } },\n }),\n )\n }\n\n async download(callSid: string, filename: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/recordings/{call_sid}/download/{filename}', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid, filename } },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport interface ListAuditParams {\n service?: string | null\n action?: string | null\n actor_entity_id?: string | null\n resource_type?: string | null\n resource_id?: string | null\n phi_only?: boolean\n date_from?: string | null\n date_to?: string | null\n limit?: number\n offset?: number\n}\n\nexport interface PhiAccessParams {\n entity_id?: string | null\n date_from?: string | null\n date_to?: string | null\n limit?: number\n offset?: number\n}\n\nexport interface EntityAccessLogParams {\n date_from?: string | null\n date_to?: string | null\n limit?: number\n offset?: number\n}\n\nexport class AuditResource extends WorkspaceScopedResource {\n async list(params?: ListAuditParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListAuditParams) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.list(pageParams),\n (page) => page.events,\n params,\n )\n }\n\n async getSummary(params?: { date_from?: string | null; date_to?: string | null }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit/summary', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getPhiAccess(params?: PhiAccessParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit/phi-access', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getPhiAccessAutoPaging(params?: PhiAccessParams) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getPhiAccess(pageParams),\n (page) => page.events,\n params,\n )\n }\n\n async createExport(body: components['schemas']['AuditExportRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/audit/export', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async listExports() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit/exports', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getEntityAccessLog(entityId: string, params?: EntityAccessLogParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit/entity/{entity_id}/access-log', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId }, query: params },\n }),\n )\n }\n\n getEntityAccessLogAutoPaging(entityId: string, params?: EntityAccessLogParams) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getEntityAccessLog(entityId, pageParams),\n (page) => page.events,\n params,\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport class WebhookDestinationsResource extends WorkspaceScopedResource {\n async list(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/webhook-destinations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async create(body: components['schemas']['CreateWebhookDestinationRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/webhook-destinations', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async get(destinationId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/webhook-destinations/{destination_id}', {\n params: { path: { workspace_id: this.workspaceId, destination_id: destinationId } },\n }),\n )\n }\n\n async update(\n destinationId: string,\n body: components['schemas']['UpdateWebhookDestinationRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/webhook-destinations/{destination_id}', {\n params: { path: { workspace_id: this.workspaceId, destination_id: destinationId } },\n body,\n }),\n )\n }\n\n async delete(destinationId: string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/webhook-destinations/{destination_id}', {\n params: { path: { workspace_id: this.workspaceId, destination_id: destinationId } },\n })\n }\n\n async listDeliveries(destinationId: string, params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/webhook-destinations/{destination_id}/deliveries', {\n params: {\n path: { workspace_id: this.workspaceId, destination_id: destinationId },\n query: params,\n },\n }),\n )\n }\n\n listDeliveriesAutoPaging(destinationId: string, params?: ListParams) {\n return this.iteratePaginatedList(\n (pageParams) => this.listDeliveries(destinationId, pageParams),\n params,\n )\n }\n\n async rotateSecret(destinationId: string) {\n return extractData(\n await this.client.POST(\n '/v1/{workspace_id}/webhook-destinations/{destination_id}/rotate-secret',\n {\n params: { path: { workspace_id: this.workspaceId, destination_id: destinationId } },\n },\n ),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport class SafetyResource extends WorkspaceScopedResource {\n async getConfig() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/safety/config', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async updateConfig(body: components['schemas']['UpdateSafetyConfigRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/safety/config', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async listTemplates() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/safety/templates', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getTemplate(templateId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/safety/templates/{template_id}', {\n params: { path: { workspace_id: this.workspaceId, template_id: templateId } },\n }),\n )\n }\n\n async applyTemplate(templateId: string, body: components['schemas']['ApplyTemplateRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/safety/templates/{template_id}/apply', {\n params: { path: { workspace_id: this.workspaceId, template_id: templateId } },\n body,\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\nexport class ComplianceResource extends WorkspaceScopedResource {\n async getDashboard() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/compliance/dashboard', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getHipaa(params?: { report_period_days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/compliance/hipaa', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getAccessReview() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/compliance/access-review', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "/**\n * Real-time workspace event streaming via Server-Sent Events.\n *\n * Subscribes to ``GET /v1/{workspace_id}/events/stream`` and yields typed\n * {@link WorkspaceSSEEvent} values. The platform-api endpoint:\n *\n * - Streams ``text/event-stream`` over HTTP/1.1\n * - Sends ``retry: 3000`` directive as the first frame\n * - Tags every event with ``id: <millisecond-timestamp>`` for replay\n * - Buffers the last 5 minutes of events in Valkey for gapless reconnect\n * - Pops the discriminator (``event_type``) out of the JSON ``data:``\n * payload and into the SSE ``event:`` line \u2014 this helper reattaches\n * it before yielding the typed union member\n *\n * Implementation choice: this helper uses the SDK's own fetch transport\n * (with auth + retry middleware applied) rather than the WHATWG\n * ``EventSource`` API or the ``eventsource`` polyfill. The reasons are:\n *\n * 1. ``EventSource`` cannot send ``Authorization`` headers \u2014 the polyfill\n * can, but adds a runtime dep and bypasses the SDK's BFF-proxy /\n * custom-fetch / mock-fetch composition.\n * 2. Reusing the existing ``createTurnStream`` pattern keeps a single\n * SSE parser in the SDK and shares the auth middleware that already\n * attaches the bearer token on every request.\n * 3. The SDK ships with two runtime deps (``openapi-fetch`` +\n * ``openapi-typescript-helpers``); adding ``eventsource`` would inflate\n * bundle size for a feature that fetch streaming handles cleanly.\n *\n * The trade-off is that we reimplement the reconnect loop. The platform-api\n * advertises ``retry: 3000`` and we honor that as the initial backoff,\n * doubling with full jitter on each successive failure up to ``maxDelayMs``.\n *\n * @see ConversationsResource.streamTurn for the analogous turn-stream helper.\n */\n\nimport type { components } from '../generated/api.js'\nimport { type PlatformFetch } from '../core/openapi-client.js'\nimport { WorkspaceScopedResource } from './base.js'\n\n/**\n * Discriminated union of every workspace SSE event variant exposed by\n * platform-api. Members carry their own ``event_type`` literal \u2014 narrow\n * with ``switch (event.event_type)`` to access typed payload fields.\n */\nexport type WorkspaceSSEEvent = components['schemas']['WorkspaceSSEEvent']\n\n/** Discriminator literal for {@link WorkspaceSSEEvent} members. */\nexport type WorkspaceSSEEventType = WorkspaceSSEEvent['event_type']\n\n/**\n * Reason taxonomy for {@link WorkspaceEventStreamError}. The platform-api\n * stream encodes a stable ``code`` in every error / control frame so\n * consumers can branch deterministically without parsing free-form text.\n *\n * * ``too_many_streams`` \u2014 workspace exceeded its concurrent-stream cap\n * (``error`` frame with ``code=too_many_streams``). Do NOT auto-retry \u2014\n * close another tab first.\n * * ``stream_unavailable`` \u2014 Valkey or downstream pubsub is unreachable.\n * Retryable, but not until the platform recovers.\n * * ``stream_error`` \u2014 generic server-side stream failure.\n * * ``auth`` \u2014 401/403 returned at connect time. Terminal.\n * * ``transport_exhausted`` \u2014 reconnect budget exhausted.\n * * ``aborted`` \u2014 caller aborted via signal / ``unsubscribe()``.\n * * ``unknown`` \u2014 fallback when the server returns an error frame the SDK\n * does not recognize.\n */\nexport type WorkspaceEventStreamErrorCode =\n | 'too_many_streams'\n | 'stream_unavailable'\n | 'stream_error'\n | 'auth'\n | 'transport_exhausted'\n | 'aborted'\n | 'unknown'\n\n/**\n * Structured error surfaced through {@link SubscribeToWorkspaceOptions.onError}.\n *\n * Subclasses ``Error`` so existing consumers using ``err.message`` continue\n * to work, while adding ``code`` + ``retryable`` + raw ``frame`` for\n * deterministic branching. Inspect with ``isWorkspaceEventStreamError``.\n */\nexport class WorkspaceEventStreamError extends Error {\n readonly code: WorkspaceEventStreamErrorCode\n readonly retryable: boolean\n /** Raw decoded ``error`` frame body (or ``undefined`` for transport errors). */\n readonly frame: Record<string, unknown> | undefined\n\n constructor(\n message: string,\n code: WorkspaceEventStreamErrorCode,\n retryable: boolean,\n frame?: Record<string, unknown>,\n ) {\n super(message)\n this.name = 'WorkspaceEventStreamError'\n this.code = code\n this.retryable = retryable\n this.frame = frame\n }\n}\n\nexport function isWorkspaceEventStreamError(\n value: unknown,\n): value is WorkspaceEventStreamError {\n return value instanceof WorkspaceEventStreamError\n}\n\n/**\n * Options for {@link EventsResource.subscribeToWorkspace}.\n */\nexport interface SubscribeToWorkspaceOptions {\n /**\n * Resume from a previously seen event id. Forwarded as the\n * ``Last-Event-ID`` request header on the first connect; the server\n * replays buffered events with id > ``lastEventId`` before switching to\n * live pub/sub. The SDK automatically tracks the most recent id during\n * the stream and re-sends it on every reconnect.\n *\n * Event ids are millisecond Unix timestamps; pass them as raw numeric\n * strings.\n */\n lastEventId?: string\n\n /**\n * Cancellation signal. Aborting the signal closes the underlying fetch\n * stream and stops the reconnect loop.\n */\n signal?: AbortSignal\n\n /** Invoked once per parsed, typed event. */\n onEvent: (event: WorkspaceSSEEvent) => void\n\n /**\n * Invoked on a terminal error (e.g., 401 / 403, abort, or reconnect\n * budget exhausted). Will not be called more than once per\n * ``subscribeToWorkspace`` invocation.\n */\n onError?: (error: Error) => void\n\n /**\n * Invoked just before each reconnect attempt with the 1-based attempt\n * number. The first connection (attempt 0) does not fire this.\n */\n onReconnect?: (attempt: number) => void\n\n /**\n * Initial reconnect delay in milliseconds. Defaults to 3000 to match\n * the platform-api ``retry:`` directive. The actual delay grows\n * exponentially (with jitter) up to ``maxDelayMs`` per failure.\n */\n initialDelayMs?: number\n\n /** Cap on the reconnect backoff delay in milliseconds. Defaults to 30s. */\n maxDelayMs?: number\n\n /**\n * Maximum number of reconnect attempts before giving up and calling\n * ``onError``. Defaults to 10. Set to ``Infinity`` to retry forever\n * (the consumer is then responsible for aborting via ``signal``).\n */\n maxReconnects?: number\n}\n\n/**\n * Handle returned by {@link EventsResource.subscribeToWorkspace}.\n *\n * Resolves when the stream terminates \u2014 either because the consumer\n * aborted via ``signal``, an unrecoverable error fired ``onError``, or\n * the reconnect budget was exhausted. The promise never rejects; consume\n * errors via ``onError``.\n */\nexport interface SubscriptionHandle {\n /**\n * Returns a promise that resolves once the subscription has fully\n * stopped (post-abort cleanup complete, no further callbacks pending).\n */\n done: Promise<void>\n\n /**\n * Stop the subscription. Equivalent to aborting the caller-supplied\n * ``AbortSignal``. Idempotent.\n */\n unsubscribe(): void\n}\n\nconst DEFAULT_INITIAL_DELAY_MS = 3000\nconst DEFAULT_MAX_DELAY_MS = 30000\nconst DEFAULT_MAX_RECONNECTS = 10\n// Hard ceiling on a single SSE field value to defend against a misbehaving\n// upstream that streams without ever emitting a frame terminator. 1 MiB is\n// far above any legitimate platform event payload (most are <2 KiB).\nconst MAX_FRAME_BYTES = 1_048_576\n\n/**\n * Real-time event stream resource.\n *\n * @example\n * ```ts\n * const handle = client.events.subscribeToWorkspace({\n * onEvent: (event) => {\n * switch (event.event_type) {\n * case 'call.started':\n * console.log('Call started:', event.call_sid)\n * break\n * case 'pipeline.error':\n * console.error('Pipeline error:', event)\n * break\n * }\n * },\n * onError: (err) => console.error('Stream error:', err),\n * onReconnect: (attempt) => console.warn(`Reconnect #${attempt}`),\n * })\n *\n * // Later, to stop:\n * handle.unsubscribe()\n * await handle.done\n * ```\n */\nexport class EventsResource extends WorkspaceScopedResource {\n constructor(client: PlatformFetch, workspaceId: string) {\n super(client, workspaceId)\n }\n\n /**\n * Subscribe to the workspace event stream.\n *\n * Establishes an SSE connection to ``/v1/{workspace_id}/events/stream``\n * and invokes ``onEvent`` once per typed {@link WorkspaceSSEEvent}.\n * Unrecoverable failures (auth errors, exhausted reconnect budget,\n * caller abort) surface through ``onError``.\n *\n * Reconnection is automatic: on a network drop or 5xx, the helper\n * backs off (initial delay derived from the ``retry:`` directive,\n * default 3s, doubling with full jitter up to ``maxDelayMs``) and\n * resumes with the most recently seen ``Last-Event-ID``. The platform\n * buffers 5 minutes of events for gapless replay.\n *\n * @returns a {@link SubscriptionHandle} for cleanup. Aborting the\n * caller's ``signal`` is equivalent to calling ``unsubscribe()``.\n */\n subscribeToWorkspace(options: SubscribeToWorkspaceOptions): SubscriptionHandle {\n const localController = new AbortController()\n const cleanups: Array<() => void> = []\n\n if (options.signal) {\n if (options.signal.aborted) {\n localController.abort(options.signal.reason)\n } else {\n const onAbort = (): void => localController.abort(options.signal?.reason)\n options.signal.addEventListener('abort', onAbort, { once: true })\n cleanups.push(() => options.signal?.removeEventListener('abort', onAbort))\n }\n }\n\n const done = runSubscription(\n this.client,\n this.workspaceId,\n options,\n localController.signal,\n ).finally(() => {\n for (const cleanup of cleanups) cleanup()\n })\n\n return {\n done,\n unsubscribe: () => localController.abort(),\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\ntype StreamOutcome =\n | { kind: 'aborted' }\n | { kind: 'auth-error'; error: Error }\n | { kind: 'transport-error'; reason: string }\n | {\n kind: 'terminal-server-error'\n code: WorkspaceEventStreamErrorCode\n message: string\n retryable: boolean\n frame: Record<string, unknown>\n }\n\n/**\n * Server-sent ``error`` event frames that the SDK should treat as terminal\n * (do NOT auto-retry). Mirror the ``code`` taxonomy emitted by\n * ``platform-api/src/routes/event_stream.py``.\n */\nconst TERMINAL_SERVER_ERROR_CODES: Record<string, WorkspaceEventStreamErrorCode> = {\n too_many_streams: 'too_many_streams',\n}\n\n/**\n * Server-sent ``error`` event frames that are recoverable \u2014 surface them as\n * transport errors so the reconnect loop kicks in. ``stream_unavailable``\n * fires when Valkey is down; ``stream_error`` is the generic catch-all from\n * the server-side ``except Exception`` branch.\n */\nconst RECOVERABLE_SERVER_ERROR_CODES: Record<string, WorkspaceEventStreamErrorCode> = {\n stream_unavailable: 'stream_unavailable',\n stream_error: 'stream_error',\n}\n\nasync function runSubscription(\n client: PlatformFetch,\n workspaceId: string,\n options: SubscribeToWorkspaceOptions,\n signal: AbortSignal,\n): Promise<void> {\n let lastEventId = options.lastEventId\n let attempt = 0\n let delayMs = options.initialDelayMs ?? DEFAULT_INITIAL_DELAY_MS\n const maxDelayMs = options.maxDelayMs ?? DEFAULT_MAX_DELAY_MS\n const maxReconnects = options.maxReconnects ?? DEFAULT_MAX_RECONNECTS\n let errorReported = false\n\n const reportError = (error: Error): void => {\n if (errorReported) return\n errorReported = true\n try {\n options.onError?.(error)\n } catch {\n // Consumer-supplied callback raised \u2014 swallow to keep teardown clean.\n }\n }\n\n while (!signal.aborted) {\n if (attempt > 0) {\n try {\n options.onReconnect?.(attempt)\n } catch {\n // Consumer-supplied callback raised \u2014 swallow to keep teardown clean.\n }\n }\n\n let outcome: StreamOutcome\n try {\n outcome = await runOneConnection({\n client,\n workspaceId,\n lastEventId,\n signal,\n onEvent: options.onEvent,\n onIdAdvance: (id) => {\n lastEventId = id\n },\n onRetryDirective: (ms) => {\n // Server-sent retry directive resets the backoff floor.\n delayMs = clampDelay(ms, options.initialDelayMs, maxDelayMs)\n },\n })\n } catch (err) {\n // runOneConnection surfaces only terminal auth errors via throw;\n // everything else is a StreamOutcome. Preserve the original Error\n // (typically ``AuthenticationError`` with ``statusCode``) so consumers\n // that branch on ``err.statusCode`` keep working.\n reportError(err instanceof Error ? err : new Error(String(err)))\n return\n }\n\n if (signal.aborted || outcome.kind === 'aborted') {\n return\n }\n\n if (outcome.kind === 'auth-error') {\n // 401 / 403 \u2014 never auto-retry. The token is invalid and the\n // stream cannot succeed without operator intervention. Surface the\n // original ``AuthenticationError`` so consumers checking\n // ``err.statusCode`` keep working.\n reportError(outcome.error)\n return\n }\n\n if (outcome.kind === 'terminal-server-error') {\n // Server emitted a structured ``error`` frame with a code that the\n // SDK recognizes as terminal (e.g., ``too_many_streams``). Surface\n // it as a typed ``WorkspaceEventStreamError`` so consumers can branch\n // on ``error.code`` without parsing free-form text.\n reportError(\n new WorkspaceEventStreamError(\n outcome.message,\n outcome.code,\n outcome.retryable,\n outcome.frame,\n ),\n )\n return\n }\n\n if (attempt >= maxReconnects) {\n reportError(\n new WorkspaceEventStreamError(\n `SSE subscription exhausted reconnect budget (${maxReconnects}): ${outcome.reason}`,\n 'transport_exhausted',\n true,\n ),\n )\n return\n }\n\n attempt += 1\n const sleepMs = jitter(delayMs)\n delayMs = Math.min(delayMs * 2, maxDelayMs)\n const slept = await abortableSleep(sleepMs, signal)\n if (!slept) return\n }\n}\n\ninterface RunOneConnectionArgs {\n client: PlatformFetch\n workspaceId: string\n lastEventId: string | undefined\n signal: AbortSignal\n onEvent: (event: WorkspaceSSEEvent) => void\n onIdAdvance: (id: string) => void\n onRetryDirective: (ms: number) => void\n}\n\nasync function runOneConnection(args: RunOneConnectionArgs): Promise<StreamOutcome> {\n const headers: Record<string, string> = { Accept: 'text/event-stream' }\n if (args.lastEventId !== undefined) {\n headers['Last-Event-ID'] = args.lastEventId\n }\n\n let result: { data?: unknown; error?: unknown; response?: Response }\n try {\n result = await args.client.GET('/v1/{workspace_id}/events/stream', {\n params: { path: { workspace_id: args.workspaceId } },\n headers,\n parseAs: 'stream',\n signal: args.signal,\n })\n } catch (err) {\n if (args.signal.aborted) return { kind: 'aborted' }\n const error = err instanceof Error ? err : new Error(String(err))\n // 4xx (including 401 / 403) are surfaced as thrown AmigoErrors by the\n // SDK error middleware. Distinguish those from transport failures.\n const status = readStatus(error)\n if (status === 401 || status === 403) {\n return { kind: 'auth-error', error }\n }\n return { kind: 'transport-error', reason: error.message }\n }\n\n if (result.error !== undefined) {\n // openapi-fetch surfaces non-OK responses as `error`. The SDK error\n // middleware should have thrown \u2014 fall through defensively.\n return { kind: 'transport-error', reason: `API error: ${safeStringify(result.error)}` }\n }\n\n const body = result.data\n if (!(body instanceof ReadableStream)) {\n return { kind: 'transport-error', reason: 'Expected ReadableStream body for SSE' }\n }\n\n try {\n for await (const frame of parseSSEFrames(body, args.signal)) {\n if (args.signal.aborted) return { kind: 'aborted' }\n if (frame.retry !== undefined) {\n args.onRetryDirective(frame.retry)\n }\n if (frame.id !== undefined) {\n args.onIdAdvance(frame.id)\n }\n if (frame.event === 'error' && frame.data !== undefined) {\n // Structured error frame \u2014 branch on ``code`` from the server. We\n // distinguish three buckets: terminal (don't retry), recoverable\n // (let the reconnect loop run), and unknown (default to recoverable\n // so a future server code does not strand consumers without auto-\n // retry).\n const errOutcome = interpretServerErrorFrame(frame.data)\n if (errOutcome.terminal) {\n return {\n kind: 'terminal-server-error',\n code: errOutcome.code,\n message: errOutcome.message,\n retryable: errOutcome.retryable,\n frame: errOutcome.frame,\n }\n }\n return { kind: 'transport-error', reason: errOutcome.message }\n }\n if (frame.event && frame.data !== undefined) {\n const event = parseWorkspaceFrame(frame.event, frame.data)\n if (event) {\n try {\n args.onEvent(event)\n } catch {\n // Consumer threw during onEvent; do not let it kill the\n // subscription. The stream is still healthy.\n }\n }\n }\n }\n } catch (err) {\n if (args.signal.aborted) return { kind: 'aborted' }\n const reason = err instanceof Error ? err.message : String(err)\n return { kind: 'transport-error', reason }\n }\n\n if (args.signal.aborted) return { kind: 'aborted' }\n // Reader closed cleanly \u2014 server EOF. Treat as recoverable; reconnect\n // with whatever Last-Event-ID we have.\n return { kind: 'transport-error', reason: 'Stream closed by server' }\n}\n\ninterface SSEFrame {\n event: string\n data: string | undefined\n id: string | undefined\n retry: number | undefined\n}\n\n/**\n * Parses an SSE byte stream into structured frames.\n *\n * Forks the parser in {@link ConversationsResource.streamTurn} to also\n * surface ``id:`` and ``retry:`` lines that the workspace event stream\n * relies on for gapless reconnect.\n */\nasync function* parseSSEFrames(\n stream: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n): AsyncGenerator<SSEFrame> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n // When the caller aborts, cancel the reader so any in-flight\n // ``reader.read()`` resolves immediately with ``{done: true}`` (or rejects\n // with ``AbortError``, which we trap in the consumer). Without this, an\n // idle SSE stream keeps the read pending indefinitely after abort.\n let cancelled = false\n const onAbort = (): void => {\n if (cancelled) return\n cancelled = true\n void reader.cancel().catch(() => {\n // Already cancelled or locked elsewhere; safe to ignore.\n })\n }\n let removeAbortHandler: (() => void) | undefined\n if (signal.aborted) {\n onAbort()\n } else {\n signal.addEventListener('abort', onAbort, { once: true })\n removeAbortHandler = () => signal.removeEventListener('abort', onAbort)\n }\n\n function* drain(text: string): Generator<SSEFrame> {\n buffer += text\n if (buffer.length > MAX_FRAME_BYTES) {\n throw new Error(`SSE frame buffer exceeded ${MAX_FRAME_BYTES} bytes without terminator`)\n }\n while (true) {\n const idx = findFrameTerminator(buffer)\n if (idx === null) break\n const block = buffer.slice(0, idx.terminatorStart)\n buffer = buffer.slice(idx.terminatorEnd)\n const frame = parseSSEBlock(block)\n if (frame) yield frame\n }\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n yield* drain(decoder.decode(value, { stream: true }))\n }\n yield* drain(decoder.decode())\n if (buffer.trim().length > 0) {\n const frame = parseSSEBlock(buffer)\n if (frame) yield frame\n buffer = ''\n }\n } finally {\n removeAbortHandler?.()\n try {\n reader.releaseLock()\n } catch {\n // releaseLock can throw if the reader is already detached; ignore.\n }\n }\n}\n\nfunction findFrameTerminator(s: string): { terminatorStart: number; terminatorEnd: number } | null {\n const lf = s.indexOf('\\n\\n')\n const crlf = s.indexOf('\\r\\n\\r\\n')\n if (lf < 0 && crlf < 0) return null\n if (lf < 0) return { terminatorStart: crlf, terminatorEnd: crlf + 4 }\n if (crlf < 0) return { terminatorStart: lf, terminatorEnd: lf + 2 }\n return lf < crlf\n ? { terminatorStart: lf, terminatorEnd: lf + 2 }\n : { terminatorStart: crlf, terminatorEnd: crlf + 4 }\n}\n\nfunction parseSSEBlock(block: string): SSEFrame | null {\n let event = ''\n let id: string | undefined\n let retry: number | undefined\n const dataLines: string[] = []\n for (const line of block.split(/\\r?\\n/)) {\n if (line === '' || line.startsWith(':')) continue\n const colon = line.indexOf(':')\n const field = colon < 0 ? line : line.slice(0, colon)\n let value = colon < 0 ? '' : line.slice(colon + 1)\n if (value.startsWith(' ')) value = value.slice(1)\n if (field === 'event') {\n event = value\n } else if (field === 'data') {\n dataLines.push(value)\n } else if (field === 'id') {\n id = value\n } else if (field === 'retry') {\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed) && parsed >= 0) retry = parsed\n }\n // Unknown fields are ignored per the SSE spec.\n }\n // Surface metadata-only frames (id-only or retry-only) so the reconnect\n // loop can observe ``Last-Event-ID`` advances and server-sent retry hints\n // even on heartbeats / replay-position markers.\n if (!event && dataLines.length === 0 && id === undefined && retry === undefined) {\n return null\n }\n return {\n event,\n data: dataLines.length > 0 ? dataLines.join('\\n') : undefined,\n id,\n retry,\n }\n}\n\n/**\n * Validate and reattach the discriminator to a frame's JSON payload.\n *\n * The platform-api SSE serializer pops ``event_type`` out of the JSON body\n * (it lives in the SSE ``event:`` line). Reattach it so the resulting\n * value is a well-formed {@link WorkspaceSSEEvent} union member.\n *\n * Drift-tolerant: an unparseable payload, non-object payload, or unknown\n * ``event:`` discriminator is silently dropped (returns ``null``), matching\n * the behavior of the analogous turn-stream parser.\n */\nfunction parseWorkspaceFrame(eventName: string, dataJson: string): WorkspaceSSEEvent | null {\n let payload: unknown\n try {\n payload = JSON.parse(dataJson)\n } catch {\n return null\n }\n if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) return null\n // The discriminator is whatever the server's `event:` line says. We trust\n // the platform-api union: anything outside the generated literal type is\n // dropped at the static-type boundary by the consumer's `switch`.\n return {\n ...(payload as Record<string, unknown>),\n event_type: eventName,\n } as WorkspaceSSEEvent\n}\n\n/**\n * Decode a server-sent ``error`` frame body into either a terminal or\n * recoverable outcome.\n *\n * The platform-api event stream emits these shapes:\n *\n * { code: \"too_many_streams\", message: \"...\", max_streams: 50 }\n * { code: \"stream_unavailable\", message: \"Event streaming unavailable\" }\n * { code: \"stream_error\", message: \"Stream error, please reconnect\" }\n *\n * Unknown codes default to recoverable so a server-side addition does not\n * strand SDK consumers without auto-retry.\n */\nfunction interpretServerErrorFrame(dataJson: string): {\n terminal: boolean\n code: WorkspaceEventStreamErrorCode\n message: string\n retryable: boolean\n frame: Record<string, unknown>\n} {\n let payload: unknown\n try {\n payload = JSON.parse(dataJson)\n } catch {\n return {\n terminal: false,\n code: 'stream_error',\n message: 'Server sent malformed error frame',\n retryable: true,\n frame: {},\n }\n }\n if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) {\n return {\n terminal: false,\n code: 'stream_error',\n message: 'Server sent non-object error frame',\n retryable: true,\n frame: {},\n }\n }\n const obj = payload as Record<string, unknown>\n const rawCode = typeof obj['code'] === 'string' ? (obj['code'] as string) : ''\n const message =\n typeof obj['message'] === 'string' ? (obj['message'] as string) : 'Stream error'\n\n if (rawCode in TERMINAL_SERVER_ERROR_CODES) {\n return {\n terminal: true,\n code: TERMINAL_SERVER_ERROR_CODES[rawCode]!,\n message,\n retryable: false,\n frame: obj,\n }\n }\n if (rawCode in RECOVERABLE_SERVER_ERROR_CODES) {\n return {\n terminal: false,\n code: RECOVERABLE_SERVER_ERROR_CODES[rawCode]!,\n message,\n retryable: true,\n frame: obj,\n }\n }\n return {\n terminal: false,\n code: 'unknown',\n message: rawCode ? `${message} (code=${rawCode})` : message,\n retryable: true,\n frame: obj,\n }\n}\n\nfunction readStatus(error: unknown): number | undefined {\n if (typeof error !== 'object' || error === null) return undefined\n const status = (error as { statusCode?: unknown }).statusCode\n return typeof status === 'number' ? status : undefined\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction jitter(ms: number): number {\n // Full jitter: pick a random delay in [0, ms]. Avoids reconnect stampedes\n // when many clients reconnect simultaneously after a deploy.\n return Math.floor(Math.random() * Math.max(1, ms))\n}\n\nfunction clampDelay(ms: number, floor: number | undefined, ceiling: number): number {\n const lo = floor ?? DEFAULT_INITIAL_DELAY_MS\n if (!Number.isFinite(ms) || ms <= 0) return lo\n return Math.min(Math.max(ms, lo), ceiling)\n}\n\nasync function abortableSleep(ms: number, signal: AbortSignal): Promise<boolean> {\n if (signal.aborted) return false\n return new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve(true)\n }, ms)\n const onAbort = (): void => {\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n resolve(false)\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport class FunctionsResource extends WorkspaceScopedResource {\n async list() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/functions', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async create(body: components['schemas']['FunctionCreateRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async delete(functionName: string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/functions/{function_name}', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n })\n }\n\n async test(functionName: string, body: components['schemas']['FunctionTestRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/{function_name}/test', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n body,\n }),\n )\n }\n\n async getCatalog() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/functions/catalog', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async query(body: components['schemas']['QueryRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/query', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async sync() {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/sync', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n // \u2500\u2500 V109 SQL-first surface \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // The methods below operate against ``platform.functions`` (the\n // versioned, alias-pinned, typed-parameter table introduced in\n // platform migration V109). The legacy methods above continue to\n // wrap the JSONB-backed ``workspace.settings[\"functions\"]`` shape;\n // both surfaces co-exist so callers can migrate at their own pace.\n\n /**\n * Validate + register a new platform function version. Atomic:\n * validation + INSERT + ``latest`` alias rebind happen in one\n * transaction. Concurrent deploys race-fail on the UNIQUE\n * constraint and return 409.\n */\n async deploy(body: components['schemas']['RegisteredFunction']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/deploy', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /**\n * List the ``latest`` version of every V109-registered platform\n * function in the workspace. Returns one row per function (the\n * alias-pinned latest version).\n *\n * Distinct from :meth:`list` which reads the legacy\n * ``workspace.settings[\"functions\"]`` JSONB store; both surfaces\n * co-exist while callers migrate. Prefer this for V109 functions.\n */\n async listRegistered() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/functions/registered', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /**\n * List all immutable versions of a registered function, newest first.\n */\n async listVersions(functionName: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/functions/{function_name}/versions', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n }),\n )\n }\n\n /**\n * Resolve ``(function_name, alias)`` to a specific version row.\n * Default alias: ``latest``.\n */\n async getVersion(\n functionName: string,\n alias: 'latest' | 'staging' | 'production' = 'latest',\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/functions/{function_name}/version', {\n params: {\n path: { workspace_id: this.workspaceId, function_name: functionName },\n query: { alias },\n },\n }),\n )\n }\n\n /**\n * Execute a registered function. Bound parameters validated against\n * the version's stored schema; ``ws_id`` auto-injected from request\n * context. Returns the executor's shaped response (rows for\n * ``returns=table``, scalar for ``returns=scalar``).\n */\n async invoke(\n functionName: string,\n body: components['schemas']['InvokeRequest'],\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/{function_name}/invoke', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n body,\n }),\n )\n }\n\n /**\n * Test invoke \u2014 same as ``invoke`` plus persists ``last_test_*``\n * telemetry on the version row so the DC tool list can show\n * health without re-running.\n *\n * Returns :type:`TestInvokeResponse` (superset of `InvokeResponse`)\n * so callers can read ``status`` / ``error`` / ``test_duration_ms``\n * directly off the response. The platform-api route catches\n * ``ServiceUnavailableError`` and converts it into ``status='fail'``\n * with the executor's error string in ``error`` \u2014 so even on a\n * blown-up SQL execution the response is a 200 with the failure\n * detail surfaced to the caller.\n */\n async testV2(\n functionName: string,\n body: components['schemas']['InvokeRequest'],\n ): Promise<components['schemas']['TestInvokeResponse']> {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/{function_name}/v2/test', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n body,\n }),\n )\n }\n\n /**\n * Rebind an alias (``latest`` / ``staging`` / ``production``) to a\n * specific version. Verifies the version exists before rebinding.\n */\n async promote(\n functionName: string,\n body: components['schemas']['PromoteRequest'],\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/{function_name}/promote', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n body,\n }),\n )\n }\n\n /**\n * Rebind ``latest`` and ``production`` to a prior version. The\n * \"oops the new deploy was bad\" path. ``staging`` stays untouched.\n */\n async rollback(\n functionName: string,\n body: components['schemas']['RollbackRequest'],\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/{function_name}/rollback', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n body,\n }),\n )\n }\n}\n", "/**\n * Reconnecting WebSocket primitive shared by the SDK's WS-based realtime\n * helpers (text-stream, session-connect, observer).\n *\n * The platform exposes three workspace-scoped WebSocket surfaces with similar\n * lifecycle requirements:\n *\n * * Resume on transient drops with exponential backoff + full jitter\n * * Treat 4001 (client error) and 4403 (auth) close codes as terminal\n * * Treat 4029 (rate limit / cap) as terminal-but-retryable on a slow timer\n * * Watchdog the connection: if no message arrives within an idle window,\n * the upstream is dead even if the TCP socket has not closed; force a\n * reconnect\n * * Surface every typed message through ``onMessage`` and every state\n * transition through ``onStateChange``\n *\n * Before this primitive existed, every consumer (developer-console\n * useStreamSession, useCallObserver, agent-engineering scripts) re-implemented\n * the loop with subtle bugs (different idle thresholds, missing retry budget,\n * no terminal-code handling). This module is the single canonical\n * implementation; resource helpers compose it with their own message parsers\n * and protocol details.\n *\n * @see ReconnectingWebSocket\n * @see EventsResource for the analogous SSE-based helper\n */\n\n/** Lifecycle states reported via {@link ReconnectingWebSocketOptions.onStateChange}. */\nexport type ReconnectingWebSocketState =\n | 'connecting'\n | 'open'\n | 'closing'\n | 'closed'\n | 'reconnecting'\n | 'terminal'\n\n/** Reasons surfaced to {@link ReconnectingWebSocketOptions.onError} on a terminal close. */\nexport type ReconnectingWebSocketErrorReason =\n | 'auth'\n | 'rate_limited'\n | 'client_error'\n | 'server_error'\n | 'reconnect_budget_exhausted'\n | 'aborted'\n | 'idle_watchdog'\n | 'open_failed'\n | 'unknown'\n\n/** Structured terminal error surfaced to consumers. */\nexport class ReconnectingWebSocketError extends Error {\n readonly reason: ReconnectingWebSocketErrorReason\n readonly closeCode: number | undefined\n readonly closeReason: string | undefined\n readonly attempts: number\n\n constructor(\n message: string,\n reason: ReconnectingWebSocketErrorReason,\n closeCode: number | undefined,\n closeReason: string | undefined,\n attempts: number,\n ) {\n super(message)\n this.name = 'ReconnectingWebSocketError'\n this.reason = reason\n this.closeCode = closeCode\n this.closeReason = closeReason\n this.attempts = attempts\n }\n}\n\n/**\n * Constructor for the underlying WebSocket. Defaults to the global\n * ``WebSocket`` (browsers, Bun, Deno, Node 22+ via global) if available.\n *\n * Pass an explicit factory in environments without a global (older Node) or\n * for tests that swap in a mock.\n */\nexport type WebSocketFactory = (url: string, protocols?: string | string[]) => WebSocket\n\n/** Options for {@link ReconnectingWebSocket}. */\nexport interface ReconnectingWebSocketOptions {\n /** Target ws:// or wss:// URL. */\n url: string\n\n /**\n * Optional WebSocket subprotocols. The platform's auth scheme passes the\n * bearer token here (``['auth', token]``) so it never appears in the URL.\n */\n protocols?: string | string[]\n\n /**\n * Initial backoff delay (ms). Doubles with full jitter on each successive\n * failure up to ``maxDelayMs``. Default ``1_000``.\n */\n initialDelayMs?: number\n\n /** Cap on the reconnect backoff delay (ms). Default ``30_000``. */\n maxDelayMs?: number\n\n /**\n * Maximum number of reconnect attempts before giving up. Default ``10``.\n * Set to ``Infinity`` to retry forever (rely on AbortSignal for shutdown).\n */\n maxReconnects?: number\n\n /**\n * Idle watchdog (ms). If no message arrives within this window the\n * connection is considered dead and is force-closed; the reconnect loop\n * then handles the rebuild. Default ``45_000`` (matches the longest\n * platform endpoint heartbeat). Set to ``0`` to disable.\n */\n idleTimeoutMs?: number\n\n /**\n * Cancellation signal. Aborting the signal closes the underlying socket\n * and stops the reconnect loop. The ``done`` promise resolves once the\n * teardown completes.\n */\n signal?: AbortSignal\n\n /**\n * Optional WebSocket factory. Defaults to ``globalThis.WebSocket`` if\n * available; throws at first connect attempt otherwise.\n */\n webSocketFactory?: WebSocketFactory\n\n /**\n * Invoked when the underlying socket transitions states. Mostly useful\n * for surfacing reconnects to the UI (e.g., \"Reconnecting\u2026\" banner).\n */\n onStateChange?: (state: ReconnectingWebSocketState) => void\n\n /**\n * Invoked once per inbound frame. ``MessageEvent.data`` is delivered raw\n * \u2014 consumers parse JSON / binary themselves.\n */\n onMessage: (event: MessageEvent) => void\n\n /**\n * Invoked just before each reconnect attempt with the 1-based attempt\n * number, the planned delay (ms), and the close code that triggered the\n * reconnect.\n */\n onReconnect?: (info: { attempt: number; delayMs: number; closeCode: number | undefined }) => void\n\n /**\n * Invoked exactly once per ``ReconnectingWebSocket`` instance on a\n * terminal failure (consumer-aborted, reconnect budget exhausted, or a\n * close code in the terminal set: 4001 / 4003 / 4403 / 4100 / 1008).\n */\n onError?: (error: ReconnectingWebSocketError) => void\n}\n\n/** Handle returned by {@link createReconnectingWebSocket}. */\nexport interface ReconnectingWebSocketHandle {\n /**\n * Resolves when the loop has fully stopped (post-abort cleanup complete).\n * Never rejects; consume errors via ``onError``.\n */\n done: Promise<void>\n\n /**\n * Send a frame on the currently open socket. Throws if no socket is\n * currently open. Use ``onStateChange`` to gate sends, or buffer in\n * caller code.\n */\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void\n\n /**\n * Close the connection and stop reconnecting. Equivalent to aborting the\n * caller-supplied signal. Idempotent.\n */\n close(code?: number, reason?: string): void\n\n /** Latest known lifecycle state. */\n readonly state: ReconnectingWebSocketState\n}\n\n/**\n * Close codes that should NEVER be retried. The server is telling us the\n * connection cannot succeed regardless of how many times we try.\n *\n * 1008 (policy violation), 4001 (client error / bad params), 4003\n * (forbidden), 4100 (auth / not authenticated, used by some platform\n * endpoints), 4403 (forbidden \u2014 used by platform-api session-connect for\n * auth and origin rejection).\n */\nconst TERMINAL_CLOSE_CODES = new Set([1008, 4001, 4003, 4100, 4403])\n\n/**\n * Close codes that are terminal-but-rate-limited. The reconnect loop honors\n * a longer floor (``RATE_LIMITED_FLOOR_MS``) before retrying so the client\n * does not amplify the problem it just hit.\n *\n * 4029 (custom platform code for \"too many connections / burst exceeded\").\n * 1013 (try again later, RFC 6455 standard hint).\n */\nconst RATE_LIMITED_CLOSE_CODES = new Set([1013, 4029])\n\nconst RATE_LIMITED_FLOOR_MS = 5_000\n\nconst DEFAULT_INITIAL_DELAY_MS = 1_000\nconst DEFAULT_MAX_DELAY_MS = 30_000\nconst DEFAULT_MAX_RECONNECTS = 10\nconst DEFAULT_IDLE_TIMEOUT_MS = 45_000\n\n/**\n * Build a managed reconnecting WebSocket.\n *\n * The returned handle is the only public surface; the underlying\n * ``WebSocket`` is held privately so consumers cannot bypass the lifecycle\n * machinery (which would defeat the watchdog and reconnect loop).\n *\n * @example\n * ```ts\n * const handle = createReconnectingWebSocket({\n * url: client.conversations.sessionConnectUrl({ serviceId, entityId }),\n * protocols: sessionConnectAuthProtocols(apiKey),\n * onMessage: (e) => console.log('frame', e.data),\n * onStateChange: (s) => console.log('state', s),\n * onError: (err) => console.error('terminal:', err.reason, err.closeCode),\n * });\n *\n * handle.send(JSON.stringify({ type: 'user_text', text: 'hi' }));\n * await handle.done; // resolves after handle.close() or terminal error\n * ```\n */\nexport function createReconnectingWebSocket(\n options: ReconnectingWebSocketOptions,\n): ReconnectingWebSocketHandle {\n const factory = resolveWebSocketFactory(options.webSocketFactory)\n const initialDelayMs = options.initialDelayMs ?? DEFAULT_INITIAL_DELAY_MS\n const maxDelayMs = options.maxDelayMs ?? DEFAULT_MAX_DELAY_MS\n const maxReconnects = options.maxReconnects ?? DEFAULT_MAX_RECONNECTS\n const idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS\n\n const localController = new AbortController()\n if (options.signal) {\n if (options.signal.aborted) {\n localController.abort(options.signal.reason)\n } else {\n const onAbort = (): void => localController.abort(options.signal?.reason)\n options.signal.addEventListener('abort', onAbort, { once: true })\n }\n }\n\n let currentSocket: WebSocket | null = null\n let state: ReconnectingWebSocketState = 'connecting'\n let errorReported = false\n\n function setState(next: ReconnectingWebSocketState): void {\n if (state === next) return\n state = next\n try {\n options.onStateChange?.(next)\n } catch {\n // Consumer-thrown error in onStateChange must not kill the loop.\n }\n }\n\n function reportError(err: ReconnectingWebSocketError): void {\n if (errorReported) return\n errorReported = true\n setState('terminal')\n try {\n options.onError?.(err)\n } catch {\n // Consumer-thrown error must not leak.\n }\n }\n\n const handle: ReconnectingWebSocketHandle = {\n get state() {\n return state\n },\n get done() {\n return done\n },\n send(data) {\n if (!currentSocket || currentSocket.readyState !== 1 /* OPEN */) {\n throw new Error(`Cannot send on socket in state ${state}`)\n }\n currentSocket.send(data)\n },\n close(code, reason) {\n localController.abort(new Error(reason ?? 'closed'))\n try {\n currentSocket?.close(code, reason)\n } catch {\n // Already closed; ignore.\n }\n },\n }\n\n const done = runLoop({\n factory,\n options,\n initialDelayMs,\n maxDelayMs,\n maxReconnects,\n idleTimeoutMs,\n signal: localController.signal,\n setState,\n reportError,\n setSocket: (s) => {\n currentSocket = s\n },\n })\n\n return handle\n}\n\ninterface RunLoopArgs {\n factory: WebSocketFactory\n options: ReconnectingWebSocketOptions\n initialDelayMs: number\n maxDelayMs: number\n maxReconnects: number\n idleTimeoutMs: number\n signal: AbortSignal\n setState: (s: ReconnectingWebSocketState) => void\n reportError: (e: ReconnectingWebSocketError) => void\n setSocket: (s: WebSocket | null) => void\n}\n\ninterface ConnectionOutcome {\n closeCode: number | undefined\n closeReason: string | undefined\n /** Set when the watchdog forced a close. */\n watchdogTriggered: boolean\n /** Set when the consumer explicitly aborted. */\n aborted: boolean\n}\n\nasync function runLoop(args: RunLoopArgs): Promise<void> {\n const { options, signal, setState, reportError, setSocket } = args\n let attempt = 0\n let delayMs = args.initialDelayMs\n\n while (!signal.aborted) {\n if (attempt > 0) {\n setState('reconnecting')\n const sleepMs = jitter(delayMs)\n try {\n options.onReconnect?.({ attempt, delayMs: sleepMs, closeCode: undefined })\n } catch {\n // ignore\n }\n const slept = await abortableSleep(sleepMs, signal)\n if (!slept) break\n delayMs = Math.min(delayMs * 2, args.maxDelayMs)\n }\n\n setState(attempt === 0 ? 'connecting' : 'connecting')\n\n let outcome: ConnectionOutcome\n try {\n outcome = await runOneConnection(args)\n } catch (err) {\n // Synchronous open failure (e.g., factory threw, invalid URL).\n reportError(\n new ReconnectingWebSocketError(\n err instanceof Error ? err.message : 'Failed to open WebSocket',\n 'open_failed',\n undefined,\n undefined,\n attempt,\n ),\n )\n return\n } finally {\n setSocket(null)\n }\n\n // Terminal close codes are reported BEFORE the abort check because the\n // close arrived from the wire \u2014 the consumer's subsequent ``close()``\n // call (which flips signal.aborted true) must not suppress the diagnostic.\n if (outcome.closeCode !== undefined && TERMINAL_CLOSE_CODES.has(outcome.closeCode)) {\n reportError(\n new ReconnectingWebSocketError(\n `Server closed with terminal code ${outcome.closeCode}: ${outcome.closeReason ?? ''}`,\n outcome.closeCode === 4403 ? 'auth' : 'client_error',\n outcome.closeCode,\n outcome.closeReason,\n attempt,\n ),\n )\n return\n }\n\n if (outcome.aborted || signal.aborted) {\n setState('closed')\n return\n }\n\n if (attempt >= args.maxReconnects) {\n reportError(\n new ReconnectingWebSocketError(\n `Reconnect budget exhausted (${args.maxReconnects} attempts)`,\n 'reconnect_budget_exhausted',\n outcome.closeCode,\n outcome.closeReason,\n attempt,\n ),\n )\n return\n }\n\n if (outcome.closeCode !== undefined && RATE_LIMITED_CLOSE_CODES.has(outcome.closeCode)) {\n // Pin the floor up so we do not hammer the server we just got\n // throttled by. Honor whichever is larger between the current\n // exponential delay and the rate-limited floor.\n delayMs = Math.max(delayMs, RATE_LIMITED_FLOOR_MS)\n }\n\n attempt += 1\n }\n\n setState('closed')\n}\n\nasync function runOneConnection(args: RunLoopArgs): Promise<ConnectionOutcome> {\n const { options, factory, signal, setState, setSocket, idleTimeoutMs } = args\n\n let socket: WebSocket\n try {\n socket = factory(options.url, options.protocols)\n } catch (err) {\n throw err instanceof Error ? err : new Error(String(err))\n }\n setSocket(socket)\n\n return new Promise<ConnectionOutcome>((resolve) => {\n let watchdogTimer: ReturnType<typeof setTimeout> | null = null\n let resolved = false\n\n function clearWatchdog(): void {\n if (watchdogTimer !== null) {\n clearTimeout(watchdogTimer)\n watchdogTimer = null\n }\n }\n\n function armWatchdog(): void {\n if (idleTimeoutMs <= 0) return\n clearWatchdog()\n watchdogTimer = setTimeout(() => {\n if (resolved) return\n try {\n socket.close(4001, 'idle timeout')\n } catch {\n // already closed\n }\n finalize({\n closeCode: 4001,\n closeReason: 'idle timeout',\n watchdogTriggered: true,\n aborted: false,\n })\n }, idleTimeoutMs)\n }\n\n function finalize(outcome: ConnectionOutcome): void {\n if (resolved) return\n resolved = true\n clearWatchdog()\n signal.removeEventListener('abort', onAbort)\n try {\n socket.removeEventListener('open', onOpen)\n socket.removeEventListener('message', onMessage)\n socket.removeEventListener('close', onClose as unknown as Parameters<WebSocket['removeEventListener']>[1])\n socket.removeEventListener('error', onSocketError)\n } catch {\n // best effort\n }\n resolve(outcome)\n }\n\n function onOpen(): void {\n setState('open')\n armWatchdog()\n }\n\n function onMessage(ev: MessageEvent): void {\n armWatchdog()\n try {\n options.onMessage(ev)\n } catch {\n // Consumer-thrown error in onMessage must not kill the loop;\n // the connection is still healthy.\n }\n }\n\n // CloseEvent is not in lib: ESNext + @types/node \u2014 accept a structural\n // shape with just the fields we read so this works in browser, Bun,\n // Deno, Node ws library, and the WHATWG ws polyfill alike.\n function onClose(ev: { code?: number; reason?: string }): void {\n setState('closed')\n finalize({\n closeCode: ev.code,\n closeReason: ev.reason,\n watchdogTriggered: false,\n aborted: false,\n })\n }\n\n function onSocketError(): void {\n // The browser/Node WebSocket fires 'error' before 'close' on transport\n // failures. We don't terminate here \u2014 the close handler will run with\n // a meaningful close code and we want one resolution path.\n }\n\n function onAbort(): void {\n try {\n socket.close(1000, 'client aborted')\n } catch {\n // already closed\n }\n finalize({\n closeCode: undefined,\n closeReason: undefined,\n watchdogTriggered: false,\n aborted: true,\n })\n }\n\n if (signal.aborted) {\n onAbort()\n return\n }\n\n socket.addEventListener('open', onOpen)\n socket.addEventListener('message', onMessage)\n // ``addEventListener`` accepts a ``CloseEvent``-shaped handler; we cast\n // through ``unknown`` because lib: ESNext + @types/node doesn't expose\n // a global ``CloseEvent`` / ``EventListener`` in every supported runtime.\n socket.addEventListener(\n 'close',\n onClose as unknown as Parameters<WebSocket['addEventListener']>[1],\n )\n socket.addEventListener('error', onSocketError)\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n\nfunction resolveWebSocketFactory(\n factory: WebSocketFactory | undefined,\n): WebSocketFactory {\n if (factory) return factory\n const globalWs = (globalThis as { WebSocket?: typeof WebSocket }).WebSocket\n if (!globalWs) {\n return () => {\n throw new Error(\n 'No global WebSocket available; pass webSocketFactory to createReconnectingWebSocket',\n )\n }\n }\n return (url, protocols) => new globalWs(url, protocols)\n}\n\nfunction jitter(ms: number): number {\n return Math.floor(Math.random() * Math.max(1, ms))\n}\n\nasync function abortableSleep(ms: number, signal: AbortSignal): Promise<boolean> {\n if (signal.aborted) return false\n return new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve(true)\n }, ms)\n const onAbort = (): void => {\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n resolve(false)\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n", "/**\n * Voice-call observer real-time stream.\n *\n * The voice agent (\"agent-engine\") exposes a per-call WebSocket that emits\n * the live timeline of a call: transcripts (user + agent), emotion / empathy\n * frames, latency markers, tool invocations, navigation timing, and lifecycle\n * events (start / end / participant join / leave).\n *\n * This resource is the canonical SDK consumer for that stream. Before it\n * existed, every developer-console-style app re-implemented the loop by hand\n * \u2014 different idle thresholds, missing close-code handling for the long list\n * of voice-specific 4xxx codes (4001 unauthorized, 4003 forbidden, 4029 rate\n * limit, 4100 token expired), and inconsistent reconnect backoff.\n *\n * The implementation composes {@link createReconnectingWebSocket} with a\n * lightweight ``ObserverSSEEvent`` parser. Frames that don't deserialize or\n * lack a recognized ``type`` discriminator are dropped \u2014 the stream remains\n * forward-compatible with new event types added on the server before the SDK\n * spec snapshot picks them up.\n *\n * @see ConversationsResource.subscribeTextStream for the analogous text-stream\n * helper.\n */\n\nimport { ConfigurationError } from '../core/errors.js'\nimport {\n createReconnectingWebSocket,\n type ReconnectingWebSocketError,\n type ReconnectingWebSocketHandle,\n type ReconnectingWebSocketState,\n type WebSocketFactory,\n} from '../core/reconnecting-websocket.js'\nimport { type PlatformFetch } from '../core/openapi-client.js'\nimport type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource } from './base.js'\n\n/**\n * Discriminated union of every observer stream event variant. Members carry\n * their own ``type`` literal \u2014 narrow with ``switch (event.type)``.\n */\nexport type ObserverSSEEvent = components['schemas']['ObserverSSEEvent']\n\n/** Discriminator literal for {@link ObserverSSEEvent} members. */\nexport type ObserverSSEEventType = ObserverSSEEvent['type']\n\n/** Auth subprotocol pair for the observer WebSocket. */\nexport type ObserverAuthProtocols = readonly ['auth', string]\n\n/** Token grammar accepted in WebSocket subprotocols (RFC 6455). */\nconst WEB_SOCKET_PROTOCOL_TOKEN_RE = /^[!#$%&'*+\\-.^_`|~A-Za-z0-9]+$/\nconst MAX_AUTH_TOKEN_CHARS = 4096\n\n/** Options for {@link ObserversResource.subscribe}. */\nexport interface ObserverSubscribeOptions {\n /**\n * The Twilio Call SID (``CA\u2026``) identifying the call to observe. The\n * server returns 4004 if the call is unknown \u2014 most often a race in test\n * suites where the call hasn't been registered yet.\n */\n callSid: string\n\n /**\n * Bearer token for ``Sec-WebSocket-Protocol: auth, <token>``. If the\n * token contains characters that aren't valid in a WebSocket subprotocol\n * the helper throws ``ConfigurationError`` synchronously \u2014 the wire\n * protocol cannot carry it and a runtime failure mid-call would be much\n * harder to diagnose.\n */\n token: string\n\n /**\n * Full observer URL override. Defaults to\n * ``${agentBaseUrl}/v1/{workspace_id}/observers/{call_sid}/ws`` with\n * ``http`` mapped to ``ws`` and ``https`` mapped to ``wss``. The override\n * must be an absolute ws/wss URL with no query string or fragment \u2014 SDK-\n * managed query params are appended by the helper.\n */\n observerUrl?: string\n\n /** Cancellation signal \u2014 aborting closes the connection. */\n signal?: AbortSignal\n\n /** Fired once per typed event delivered by the server. */\n onEvent: (event: ObserverSSEEvent) => void\n\n /** Fired on each lifecycle transition. */\n onStateChange?: (state: ReconnectingWebSocketState) => void\n\n /**\n * Fired just before each reconnect attempt with the planned delay and\n * the close code that triggered the reconnect (or ``undefined`` for the\n * first attempt after a watchdog-driven close).\n */\n onReconnect?: (info: { attempt: number; delayMs: number; closeCode: number | undefined }) => void\n\n /**\n * Fired exactly once on terminal failure (auth rejected, reconnect\n * budget exhausted, abort, or one of the terminal close codes 4001 /\n * 4003 / 4100 / 4403). Will not fire on ordinary disconnect-and-reconnect.\n */\n onError?: (error: ReconnectingWebSocketError) => void\n\n /** Idle watchdog (ms). Defaults to 60s for voice-call streams. */\n idleTimeoutMs?: number\n\n /** Initial reconnect backoff (ms). Defaults to 1000. */\n initialDelayMs?: number\n\n /** Cap on reconnect backoff (ms). Defaults to 30_000. */\n maxDelayMs?: number\n\n /** Reconnect budget. Defaults to 10. */\n maxReconnects?: number\n\n /** Custom WebSocket factory \u2014 primarily for tests. */\n webSocketFactory?: WebSocketFactory\n}\n\n/**\n * Build browser WebSocket subprotocols for the observer stream.\n *\n * Identical wire format to the text-stream subprotocol pair \u2014\n * ``Sec-WebSocket-Protocol: auth, <token>`` \u2014 but exposed as its own\n * function so consumers do not have to reason about cross-resource sharing\n * and so the SDK can evolve the auth scheme independently per stream.\n *\n * @security The returned tuple contains the raw bearer token. Do not log,\n * persist, serialize, or otherwise expose this value.\n */\nexport function observerAuthProtocols(token: string): ObserverAuthProtocols {\n if (!token) {\n throw new ConfigurationError('observerAuthProtocols requires a non-empty token')\n }\n if (token.length > MAX_AUTH_TOKEN_CHARS) {\n throw new ConfigurationError(\n `observer token exceeds the ${MAX_AUTH_TOKEN_CHARS}-character WebSocket subprotocol limit`,\n )\n }\n if (!WEB_SOCKET_PROTOCOL_TOKEN_RE.test(token)) {\n throw new ConfigurationError(\n 'observer token contains characters browsers reject in WebSocket subprotocols',\n )\n }\n return ['auth', token] as const\n}\n\n/**\n * Voice-call observer resource.\n *\n * @example\n * ```ts\n * const handle = client.observers.subscribe({\n * callSid: 'CAxxx',\n * token: bearerToken,\n * onEvent: (event) => {\n * switch (event.type) {\n * case 'agent_transcript_delta':\n * renderAgentDelta(event.text)\n * break\n * case 'user_transcript':\n * renderUserTurn(event.text)\n * break\n * case 'session_end':\n * showSummary(event)\n * break\n * }\n * },\n * onError: (err) => console.error('observer terminal:', err.reason),\n * })\n *\n * // Later, to stop:\n * handle.close()\n * await handle.done\n * ```\n */\nexport class ObserversResource extends WorkspaceScopedResource {\n private readonly agentBaseUrl: string | undefined\n\n constructor(client: PlatformFetch, workspaceId: string, agentBaseUrl?: string) {\n super(client, workspaceId)\n this.agentBaseUrl = agentBaseUrl\n }\n\n /**\n * Subscribe to the live observer stream for a call.\n *\n * Returns a {@link ReconnectingWebSocketHandle} that resolves\n * ``handle.done`` when the stream terminates (consumer-aborted, terminal\n * close code, or reconnect budget exhausted). Errors are surfaced through\n * ``onError``; the promise never rejects.\n */\n subscribe(options: ObserverSubscribeOptions): ReconnectingWebSocketHandle {\n const url = buildObserverUrl({\n baseUrl: this.agentBaseUrl ?? this.platformBaseUrl,\n workspaceId: this.workspaceId,\n callSid: options.callSid,\n observerUrl: options.observerUrl,\n })\n\n const protocols = observerAuthProtocols(options.token)\n\n return createReconnectingWebSocket({\n url,\n protocols: [...protocols],\n onMessage: (ev) => {\n const parsed = parseObserverFrame(ev.data)\n if (parsed) {\n try {\n options.onEvent(parsed)\n } catch {\n // Consumer threw in onEvent \u2014 do not let it kill the loop.\n }\n }\n },\n onStateChange: options.onStateChange,\n onReconnect: options.onReconnect,\n onError: options.onError,\n signal: options.signal,\n idleTimeoutMs: options.idleTimeoutMs ?? 60_000,\n initialDelayMs: options.initialDelayMs ?? 1_000,\n maxDelayMs: options.maxDelayMs ?? 30_000,\n maxReconnects: options.maxReconnects ?? 10,\n webSocketFactory: options.webSocketFactory,\n })\n }\n}\n\n// ---------------------------------------------------------------------------\n// URL builder\n// ---------------------------------------------------------------------------\n\ninterface BuildObserverUrlArgs {\n baseUrl: string\n workspaceId: string\n callSid: string\n observerUrl?: string | undefined\n}\n\nconst CALL_SID_RE = /^CA[a-zA-Z0-9]{32}$/\n\nfunction buildObserverUrl(args: BuildObserverUrlArgs): string {\n if (!args.workspaceId) {\n throw new ConfigurationError('workspaceId is required to build the observer URL')\n }\n if (!args.callSid) {\n throw new ConfigurationError('callSid is required to subscribe to the observer stream')\n }\n if (args.observerUrl) {\n // Override path \u2014 the consumer has already constructed the full URL\n // (e.g. via a custom voice-agent gateway helper). Skip the Twilio CA\n // SID grammar check; the override owns the URL shape.\n return parseOverride(args.observerUrl).toString()\n }\n // Default path \u2014 derive ``/v1/{ws}/observers/{callSid}/ws`` and validate\n // the CA SID grammar so a typo fails at the function boundary instead of\n // mid-reconnect-loop with an opaque 4001.\n if (!CALL_SID_RE.test(args.callSid)) {\n throw new ConfigurationError(\n `callSid does not match Twilio CA SID format (CA + 32 hex chars): ${args.callSid}`,\n )\n }\n return deriveFromBase(args.baseUrl, args.workspaceId, args.callSid).toString()\n}\n\nfunction parseOverride(observerUrl: string): URL {\n let url: URL\n try {\n url = new URL(observerUrl)\n } catch (cause) {\n throw new ConfigurationError(\n `observerUrl must be an absolute URL: ${String(cause)}`,\n )\n }\n if (url.protocol !== 'ws:' && url.protocol !== 'wss:') {\n throw new ConfigurationError('observerUrl overrides must use ws: or wss: URLs')\n }\n if (url.search || url.hash) {\n throw new ConfigurationError(\n 'observerUrl overrides must not include query parameters or fragments',\n )\n }\n return url\n}\n\nfunction deriveFromBase(baseUrl: string, workspaceId: string, callSid: string): URL {\n let parsed: URL\n try {\n parsed = new URL(baseUrl)\n } catch (cause) {\n throw new ConfigurationError(\n `observerUrl cannot be derived from baseUrl: ${String(cause)}`,\n )\n }\n // Map http(s) to ws(s) \u2014 the agent-engine ALB serves both on the same host.\n let scheme: string\n if (parsed.protocol === 'https:' || parsed.protocol === 'wss:') scheme = 'wss:'\n else if (parsed.protocol === 'http:' || parsed.protocol === 'ws:') scheme = 'ws:'\n else {\n throw new ConfigurationError(\n `observerUrl can only be derived from an http, https, ws, or wss baseUrl: ${baseUrl}`,\n )\n }\n // The pathname must be '/' \u2014 observer paths are owned by this helper,\n // not the consumer's baseUrl gateway.\n if (parsed.pathname !== '/' && parsed.pathname !== '') {\n throw new ConfigurationError(\n 'observerUrl can only be derived from an origin-only baseUrl; pass observerUrl explicitly when using path-prefixed gateways',\n )\n }\n const out = new URL(`${scheme}//${parsed.host}/v1/${encodeURIComponent(workspaceId)}/observers/${encodeURIComponent(callSid)}/ws`)\n return out\n}\n\n// ---------------------------------------------------------------------------\n// Frame parser\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a raw WebSocket frame into a typed {@link ObserverSSEEvent}.\n *\n * Drift-tolerant: returns ``null`` on JSON decode errors, non-object\n * payloads, missing ``type`` discriminator, or unknown discriminator\n * values. The static type of ``ObserverSSEEvent`` is the contract \u2014 the\n * server may add new event types ahead of an SDK release and the consumer's\n * exhaustive ``switch`` will simply not match them, leaving the unknown\n * frame on the floor.\n */\nfunction parseObserverFrame(data: unknown): ObserverSSEEvent | null {\n let text: string\n if (typeof data === 'string') {\n text = data\n } else if (data instanceof ArrayBuffer) {\n text = new TextDecoder().decode(data)\n } else if (ArrayBuffer.isView(data)) {\n // ``data`` is some TypedArray; @types/node TextDecoder.decode wants\n // ``BufferSource``. Pass through as ``Uint8Array`` over the underlying\n // buffer so every TypedArray variant decodes consistently.\n const view = data as ArrayBufferView\n text = new TextDecoder().decode(\n new Uint8Array(view.buffer, view.byteOffset, view.byteLength),\n )\n } else {\n return null\n }\n\n let payload: unknown\n try {\n payload = JSON.parse(text)\n } catch {\n return null\n }\n if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) return null\n const obj = payload as Record<string, unknown>\n if (typeof obj['type'] !== 'string') return null\n return obj as ObserverSSEEvent\n}\n", "import type { components, paths } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\ntype Q<P extends keyof paths> = NonNullable<\n paths[P] extends { get: { parameters: { query?: infer Query } } } ? Query : never\n>\n\nexport type PatientSearchParams = Q<'/v1/{workspace_id}/fhir/patients'>\n/** Spec-defined query params for `/fhir/resources/{resource_type}` (FHIR-style search). */\nexport type FhirSearchParams = Q<'/v1/{workspace_id}/fhir/resources/{resource_type}'>\nexport type SyncFailuresParams = Q<'/v1/{workspace_id}/fhir/sync-failures'>\n\n// Each typed view has its own query shape in the spec \u2014 most share `q`,\n// `data_source_id`, `limit`, `offset` but `slots` adds scheduling filters.\n// Derive each separately so consumers get the right autocomplete and a\n// spec change to any single view is a typed signal.\nexport type FhirPatientsViewParams = Q<'/v1/{workspace_id}/fhir/views/patients'>\nexport type FhirAppointmentsViewParams = Q<'/v1/{workspace_id}/fhir/views/appointments'>\nexport type FhirPractitionersViewParams = Q<'/v1/{workspace_id}/fhir/views/practitioners'>\nexport type FhirOrganizationsViewParams = Q<'/v1/{workspace_id}/fhir/views/organizations'>\nexport type FhirLocationsViewParams = Q<'/v1/{workspace_id}/fhir/views/locations'>\nexport type FhirSlotsViewParams = Q<'/v1/{workspace_id}/fhir/views/slots'>\n\n/**\n * FHIR \u2014 healthcare data interop surface for connected EHR integrations.\n *\n * @beta New in this release; surface may evolve as the EHR adapters stabilize.\n *\n * Provides:\n * - Sync status + failure visibility (`status`, `syncFailures`)\n * - Bulk imports (`import`)\n * - FHIR-shaped CRUD on resources (`resources.*`)\n * - Patient-centric views (`patients`, `patientSummary`, `patientTimeline`)\n * - Pre-aggregated typed views per resource type (`views.*`)\n *\n * All operations are workspace-scoped; the FHIR server identity is determined\n * by the workspace's connected EHR integration.\n */\nexport class FhirResource extends WorkspaceScopedResource {\n /** Get current FHIR sync status (server identity, last sync, counts) */\n async getStatus() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/status', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** List recent FHIR sync failures (for triage) */\n async getSyncFailures(params?: SyncFailuresParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/sync-failures', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Trigger a FHIR import (full or partial, depending on request) */\n async import(body: components['schemas']['FhirImportRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/fhir/import', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Search patients by demographics or identifiers */\n async searchPatients(params?: PatientSearchParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/patients', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Get a patient summary (canonical demographics + active conditions/meds) */\n async getPatientSummary(patientId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/patients/{patient_id}/summary', {\n params: { path: { workspace_id: this.workspaceId, patient_id: patientId } },\n }),\n )\n }\n\n /** Get a patient's longitudinal clinical timeline */\n async getPatientTimeline(patientId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/patients/{patient_id}/timeline', {\n params: { path: { workspace_id: this.workspaceId, patient_id: patientId } },\n }),\n )\n }\n\n readonly resources = {\n /** Search FHIR resources of a given type (passes search params through to FHIR) */\n search: async (resourceType: string, params?: FhirSearchParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/resources/{resource_type}', {\n params: {\n path: { workspace_id: this.workspaceId, resource_type: resourceType },\n query: params,\n },\n }),\n ),\n\n /** Create a FHIR resource of the given type */\n create: async (resourceType: string, body: components['schemas']['FhirWriteRequest']) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/fhir/resources/{resource_type}', {\n params: { path: { workspace_id: this.workspaceId, resource_type: resourceType } },\n body,\n }),\n ),\n\n /** Get a single FHIR resource by type + id */\n get: async (resourceType: string, resourceId: string) =>\n extractData(\n await this.client.GET(\n '/v1/{workspace_id}/fhir/resources/{resource_type}/{resource_id}',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n resource_type: resourceType,\n resource_id: resourceId,\n },\n },\n },\n ),\n ),\n\n /** Update a FHIR resource by type + id */\n update: async (\n resourceType: string,\n resourceId: string,\n body: components['schemas']['FhirWriteRequest'],\n ) =>\n extractData(\n await this.client.PUT(\n '/v1/{workspace_id}/fhir/resources/{resource_type}/{resource_id}',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n resource_type: resourceType,\n resource_id: resourceId,\n },\n },\n body,\n },\n ),\n ),\n\n /** Get the version history for a FHIR resource */\n getHistory: async (resourceType: string, resourceId: string) =>\n extractData(\n await this.client.GET(\n '/v1/{workspace_id}/fhir/resources/{resource_type}/{resource_id}/history',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n resource_type: resourceType,\n resource_id: resourceId,\n },\n },\n },\n ),\n ),\n }\n\n readonly views = {\n /** List patients (typed view with computed display fields) */\n patients: async (params?: FhirPatientsViewParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/views/patients', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n /** List appointments */\n appointments: async (params?: FhirAppointmentsViewParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/views/appointments', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n /** List practitioners */\n practitioners: async (params?: FhirPractitionersViewParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/views/practitioners', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n /** List organizations */\n organizations: async (params?: FhirOrganizationsViewParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/views/organizations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n /** List locations */\n locations: async (params?: FhirLocationsViewParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/views/locations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n /**\n * List schedule slots \u2014 supports richer filtering than the other views\n * (status, date window, provider, specialty, service_type, facility_id).\n */\n slots: async (params?: FhirSlotsViewParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/fhir/views/slots', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Insights \u2014 natural-language analytics on workspace data.\n *\n * Surfaces the schema browser, suggestion catalog, ad-hoc SQL execution,\n * and chat sessions that reason over call/world data. Used by the\n * developer console's Insights tab.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class InsightsResource extends WorkspaceScopedResource {\n /** Get the periodic insights digest for the workspace */\n async getDigest() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/insights/digest', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Fetch the queryable schema (tables, columns, joins) the assistant uses */\n async getSchema() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/insights/schema', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get curated query suggestions for the workspace */\n async getSuggestions() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/insights/suggestions', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Run an ad-hoc SQL query against the insights warehouse */\n async runSql(body: components['schemas']['SqlQueryRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/insights/sql', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n readonly sessions = {\n /** Start a new insights chat session */\n create: async () =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/insights/sessions', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n\n /** Get a session and its full history */\n get: async (sessionId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/insights/sessions/{session_id}', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n ),\n\n /** Send a chat message and get the assistant's response (with any generated SQL/results) */\n chat: async (sessionId: string, body: components['schemas']['ChatRequest']) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/insights/sessions/{session_id}/chat', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n body,\n }),\n ),\n }\n}\n", "import type { components, paths } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type ListMonitorConceptsParams = NonNullable<\n paths['/v1/{workspace_id}/monitor-concepts']['get']['parameters']['query']\n>\n\n/**\n * Manage workspace monitor concepts \u2014 semantic patterns the platform watches\n * across calls to surface emerging behavior. Each concept holds a name,\n * description, and detection rules; the platform indexes them and lights\n * them up against live and historical traffic.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class MonitorConceptsResource extends WorkspaceScopedResource {\n /** Create a new monitor concept */\n async create(body: components['schemas']['CreateMonitorConceptRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/monitor-concepts', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List monitor concepts in the workspace */\n async list(params?: ListMonitorConceptsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/monitor-concepts', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListMonitorConceptsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single monitor concept */\n async get(conceptId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/monitor-concepts/{concept_id}', {\n params: { path: { workspace_id: this.workspaceId, concept_id: conceptId } },\n }),\n )\n }\n\n /** Update a monitor concept */\n async update(conceptId: string, body: components['schemas']['UpdateMonitorConceptRequest']) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/monitor-concepts/{concept_id}', {\n params: { path: { workspace_id: this.workspaceId, concept_id: conceptId } },\n body,\n }),\n )\n }\n\n /** Delete a monitor concept */\n async delete(conceptId: string) {\n return extractData(\n await this.client.DELETE('/v1/{workspace_id}/monitor-concepts/{concept_id}', {\n params: { path: { workspace_id: this.workspaceId, concept_id: conceptId } },\n }),\n )\n }\n}\n", "import type { components, paths } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type ListUnificationRulesParams = NonNullable<\n paths['/v1/{workspace_id}/unification-rules']['get']['parameters']['query']\n>\n\n/**\n * Manage entity unification rules \u2014 declarative joins that fold duplicate\n * world-model entities into a single canonical record. Rules are evaluated\n * on ingest; the surviving entity inherits properties from its merge sources.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class UnificationRulesResource extends WorkspaceScopedResource {\n /** Create a new unification rule */\n async create(body: components['schemas']['CreateUnificationRuleRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/unification-rules', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List unification rules in the workspace */\n async list(params?: ListUnificationRulesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/unification-rules', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListUnificationRulesParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single unification rule */\n async get(ruleId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/unification-rules/{rule_id}', {\n params: { path: { workspace_id: this.workspaceId, rule_id: ruleId } },\n }),\n )\n }\n\n /** Update a unification rule */\n async update(ruleId: string, body: components['schemas']['UpdateUnificationRuleRequest']) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/unification-rules/{rule_id}', {\n params: { path: { workspace_id: this.workspaceId, rule_id: ruleId } },\n body,\n }),\n )\n }\n\n /** Delete a unification rule */\n async delete(ruleId: string) {\n return extractData(\n await this.client.DELETE('/v1/{workspace_id}/unification-rules/{rule_id}', {\n params: { path: { workspace_id: this.workspaceId, rule_id: ruleId } },\n }),\n )\n }\n}\n", "import type { paths } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type CrmContactSearchParams = NonNullable<\n paths['/v1/{workspace_id}/crm/contacts']['get']['parameters']['query']\n>\nexport type CrmCompanySearchParams = NonNullable<\n paths['/v1/{workspace_id}/crm/companies']['get']['parameters']['query']\n>\nexport type CrmDealSearchParams = NonNullable<\n paths['/v1/{workspace_id}/crm/deals']['get']['parameters']['query']\n>\n\n/**\n * CRM \u2014 read-mostly view of contacts, companies, deals, and pipeline state\n * sourced from the connected CRM integration (HubSpot/Salesforce/etc.).\n *\n * The platform refreshes this view in the background; the SDK exposes search\n * + detail endpoints plus a per-contact activity timeline. Writes happen\n * upstream in the CRM itself, not here.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class CrmResource extends WorkspaceScopedResource {\n /** Health/status of the workspace's CRM integration sync */\n async getStatus() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/crm/status', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n readonly contacts = {\n list: async (params?: CrmContactSearchParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/crm/contacts', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n get: async (contactId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/crm/contacts/{contact_id}', {\n params: { path: { workspace_id: this.workspaceId, contact_id: contactId } },\n }),\n ),\n\n /** Per-contact activity timeline (calls, emails, deal events) */\n getTimeline: async (contactId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/crm/contacts/{contact_id}/timeline', {\n params: { path: { workspace_id: this.workspaceId, contact_id: contactId } },\n }),\n ),\n }\n\n readonly companies = {\n list: async (params?: CrmCompanySearchParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/crm/companies', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n get: async (companyId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/crm/companies/{company_id}', {\n params: { path: { workspace_id: this.workspaceId, company_id: companyId } },\n }),\n ),\n }\n\n readonly deals = {\n list: async (params?: CrmDealSearchParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/crm/deals', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n get: async (dealId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/crm/deals/{deal_id}', {\n params: { path: { workspace_id: this.workspaceId, deal_id: dealId } },\n }),\n ),\n\n /** Aggregated pipeline view: deals grouped by stage with rolled-up totals */\n getPipeline: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/crm/deals/pipeline', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Command Center \u2014 single rolled-up snapshot used to drive the developer\n * console's homepage tiles (active calls, queue depth, alerting status,\n * recent escalations, etc.). One endpoint, refreshed on demand.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class CommandCenterResource extends WorkspaceScopedResource {\n /** Get the current command-center snapshot */\n async get() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/command-center', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Sensorium \u2014 operator-facing observability for the live agent loop.\n *\n * Surfaces connector health (per-integration up/down + latency) and\n * end-to-end loop latency (turn ingest \u2192 response) for diagnosing\n * production regressions in real time.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class SensoriumResource extends WorkspaceScopedResource {\n /** Per-connector health snapshot (status + latency) */\n async getConnectorHealth() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/sensorium/connector-health', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** End-to-end agent loop latency breakdown (per-stage timings) */\n async getLoopLatency() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/sensorium/loop-latency', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import type { paths } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type DataQueryParams = NonNullable<\n paths['/v1/{workspace_id}/query/{schema}/{table}']['get']['parameters']['query']\n>\n\n/**\n * Generic typed data query \u2014 read rows from any whitelisted schema/table the\n * workspace exposes. Backed by the platform's catalog of analytics-grade\n * datasets; the schema and table are validated server-side.\n *\n * Used by the developer console's data-explorer surface.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class DataQueryResource extends WorkspaceScopedResource {\n /** Run a tabular query against a workspace dataset */\n async run(schema: string, table: string, params?: DataQueryParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/query/{schema}/{table}', {\n params: {\n path: { workspace_id: this.workspaceId, schema, table },\n query: params,\n },\n }),\n )\n }\n}\n", "import type { EntityId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Briefs \u2014 short, AI-generated context summaries about an entity. The GET\n * variant returns a cached brief; POST regenerates it on demand.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class BriefsResource extends WorkspaceScopedResource {\n /** Get the workspace-level brief */\n async get() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/brief', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Regenerate the workspace-level brief */\n async regenerate() {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/brief', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get the brief for a specific entity */\n async getForEntity(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/entities/{entity_id}/brief', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Regenerate the brief for a specific entity */\n async regenerateForEntity(entityId: EntityId | string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/entities/{entity_id}/brief', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n// Internal alias over the platform-keyed schema name\n// `src__routes__desktop_sessions__CreateSessionRequest`. The Python-module\n// prefix is unstable \u2014 once the platform team adds a `title=` annotation\n// the key disappears and the build fails. Kept module-private (no `export`)\n// so it never appears in the published `.d.ts` and downstream consumers\n// can't take a transitive dependency on the upstream key. Method\n// signatures consume it inline, so the class still exposes the right\n// structural body type to callers.\ntype CreateDesktopSessionRequest =\n components['schemas']['src__routes__desktop_sessions__CreateSessionRequest']\n\n/**\n * Desktop sessions \u2014 remote-controlled desktop instances the agent can use\n * to drive third-party apps (EHRs, CRMs) that lack APIs. Created on demand\n * and torn down when the agent finishes the workflow.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class DesktopSessionsResource extends WorkspaceScopedResource {\n /** Spin up a new desktop session */\n async create(body: CreateDesktopSessionRequest) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/desktop-sessions', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Disconnect / tear down a desktop session */\n async disconnect(sessionId: string) {\n return extractData(\n await this.client.DELETE('/v1/{workspace_id}/desktop-sessions/{session_id}', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n\n /** Drive a click / type / scroll action against the session */\n async sendAction(sessionId: string, body: components['schemas']['ActionRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/desktop-sessions/{session_id}/action', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n body,\n }),\n )\n }\n\n /** Get the latest screenshot for a session */\n async getScreenshot(sessionId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/desktop-sessions/{session_id}/screenshot', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n\n /** Get the session's current connection + activity status */\n async getStatus(sessionId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/desktop-sessions/{session_id}/status', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n}\n", "import type { components, paths } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type ListIntakeLinksParams = NonNullable<\n paths['/v1/{workspace_id}/intake/links']['get']['parameters']['query']\n>\n\n/**\n * Intake \u2014 short-lived signed links the workspace shares with patients to\n * collect documents (insurance cards, ID, referrals). Each link can receive\n * multiple uploads; uploads are downloadable for audit/review.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class IntakeResource extends WorkspaceScopedResource {\n readonly links = {\n list: async (params?: ListIntakeLinksParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/intake/links', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n create: async (body: components['schemas']['CreateLinkRequest']) =>\n extractData(\n await this.client.POST('/v1/{workspace_id}/intake/links', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n\n delete: async (linkId: string) =>\n extractData(\n await this.client.DELETE('/v1/{workspace_id}/intake/links/{link_id}', {\n params: { path: { workspace_id: this.workspaceId, link_id: linkId } },\n }),\n ),\n\n /** List uploads received against a link */\n listUploads: async (linkId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/intake/links/{link_id}/uploads', {\n params: { path: { workspace_id: this.workspaceId, link_id: linkId } },\n }),\n ),\n\n /** Get a download URL/payload for a single upload */\n downloadUpload: async (linkId: string, uploadId: string) =>\n extractData(\n await this.client.GET(\n '/v1/{workspace_id}/intake/links/{link_id}/uploads/{upload_id}/download',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n link_id: linkId,\n upload_id: uploadId,\n },\n },\n },\n ),\n ),\n }\n\n}\n\n// Direct-upload endpoint `/v1/{workspace_id}/intake/files` requires a signed\n// header set (x-amigo-intake-{sha256,timestamp,signature,customer-slug,filename})\n// and isn't a good fit for the typed resource layer. Consumers can call it via\n// `client.POST('/v1/{workspace_id}/intake/files', { params: { header: {...} } })`\n// once they have the signed header bundle from the platform.\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Network \u2014 outbound networking metadata for the workspace. Currently exposes\n * the platform's egress IP allowlist that customers add to firewall rules\n * before whitelisting integration callbacks.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class NetworkResource extends WorkspaceScopedResource {\n /** Get the platform's egress IPs the workspace's outbound traffic uses */\n async getEgressIps() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/network/egress-ips', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import type { paths } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport type ListPipelineSourcesParams = NonNullable<\n paths['/v1/{workspace_id}/pipeline/sources']['get']['parameters']['query']\n>\n\n/**\n * Pipeline \u2014 observability into the workspace's data ingestion pipeline:\n * source health, throughput, entity resolution metrics, review backlog,\n * outbound deliveries, and per-source overviews / event histories.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class PipelineResource extends WorkspaceScopedResource {\n /** Overall pipeline status (sources up/down, last successful run, etc.) */\n async getStatus() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/status', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Throughput buckets over the recent window */\n async getThroughput() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/throughput', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Review backlog metrics (pending merges, pending escalations) */\n async getReview() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/review', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Entity resolution metrics (merge rate, candidate rate, false-positive rate) */\n async getEntityResolution() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/entity-resolution', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n readonly outbound = {\n /** List recent outbound deliveries */\n list: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/outbound', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n\n /** Get the delivery log for a specific outbound data source */\n getLog: async (dataSourceId: string, params?: ListParams) =>\n extractData(\n await this.client.GET(\n '/v1/{workspace_id}/pipeline/outbound/{data_source_id}/log',\n {\n params: {\n path: { workspace_id: this.workspaceId, data_source_id: dataSourceId },\n query: params,\n },\n },\n ),\n ),\n }\n\n readonly sources = {\n /** List all configured pipeline sources */\n list: async (params?: ListPipelineSourcesParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/sources', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n ),\n\n /** Get a per-source overview (last sync, error counts, deltas) */\n getOverview: async (sourceId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/sources/{source_id}/overview', {\n params: { path: { workspace_id: this.workspaceId, source_id: sourceId } },\n }),\n ),\n\n /** Stream the source's recent events */\n listEvents: async (sourceId: string, params?: ListParams) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/sources/{source_id}/events', {\n params: {\n path: { workspace_id: this.workspaceId, source_id: sourceId },\n query: params,\n },\n }),\n ),\n\n /** Per-source historical timeline */\n getHistory: async (sourceId: string) =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/pipeline/sources/{source_id}/history', {\n params: { path: { workspace_id: this.workspaceId, source_id: sourceId } },\n }),\n ),\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Tasks \u2014 long-running async jobs the platform spawns (intake processing,\n * tool executions, voice imports). The SDK exposes get-by-id and a\n * by-call lookup for retrieving every task tied to a specific call.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class TasksResource extends WorkspaceScopedResource {\n /** Get the current state of a single task */\n async get(taskId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/tasks/{task_id}', {\n params: { path: { workspace_id: this.workspaceId, task_id: taskId } },\n }),\n )\n }\n\n /** List every task associated with a call (by Twilio call sid) */\n async listByCall(callSid: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/tasks/by-call/{call_sid}', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid } },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { ServiceId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Tools \u2014 manual execution of integration-backed tool calls (used by the\n * tool-testing surface in the developer console) and per-service resolution\n * of which concrete tool implementations bind to a service's tool slots.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class ToolsResource extends WorkspaceScopedResource {\n /** Manually execute a tool call against the workspace's integrations */\n async execute(body: components['schemas']['ToolExecuteRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/tools/execute', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Resolve the bound tool implementations for a service */\n async resolveForService(serviceId: ServiceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/services/{service_id}/tools/resolve', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n }),\n )\n }\n}\n", "import type { components, paths } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type ListSurfacesParams = NonNullable<\n paths['/v1/{workspace_id}/surfaces']['get']['parameters']['query']\n>\n/** `/surfaces/review` is a narrower paged feed without the workspace-list filters. */\nexport type ListSurfacesForReviewParams = NonNullable<\n paths['/v1/{workspace_id}/surfaces/review']['get']['parameters']['query']\n>\n\n/**\n * Surfaces \u2014 short-lived form/intake experiences the platform delivers via\n * SMS / email / web. The full lifecycle is exposed: create, deliver, monitor\n * progress, gate for review, approve / reject / reshape, and archive.\n *\n * @beta New in this release; surface may evolve as the operator review flow\n * stabilizes.\n */\nexport class SurfacesResource extends WorkspaceScopedResource {\n /** List surfaces in the workspace */\n async list(params?: ListSurfacesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/surfaces', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListSurfacesParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Surfaces awaiting review (pending approval / rejection) */\n async listForReview(params?: ListSurfacesForReviewParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/surfaces/review', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Create a surface (form definition + delivery config) */\n async create(body: components['schemas']['CreateSurfaceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/surfaces', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Get a single surface */\n async get(surfaceId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/surfaces/{surface_id}', {\n params: { path: { workspace_id: this.workspaceId, surface_id: surfaceId } },\n }),\n )\n }\n\n /** Update surface metadata or fields */\n async update(surfaceId: string, body: components['schemas']['UpdateSurfaceRequest']) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/surfaces/{surface_id}', {\n params: { path: { workspace_id: this.workspaceId, surface_id: surfaceId } },\n body,\n }),\n )\n }\n\n /** Archive (soft-delete) a surface */\n async archive(surfaceId: string) {\n return extractData(\n await this.client.DELETE('/v1/{workspace_id}/surfaces/{surface_id}', {\n params: { path: { workspace_id: this.workspaceId, surface_id: surfaceId } },\n }),\n )\n }\n\n /** Deliver the surface to the recipient (SMS/email/etc.) */\n async deliver(surfaceId: string, body: components['schemas']['DeliverSurfaceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/surfaces/{surface_id}/deliver', {\n params: { path: { workspace_id: this.workspaceId, surface_id: surfaceId } },\n body,\n }),\n )\n }\n\n /** Get fill / completion progress for a surface */\n async getProgress(surfaceId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/surfaces/{surface_id}/progress', {\n params: { path: { workspace_id: this.workspaceId, surface_id: surfaceId } },\n }),\n )\n }\n\n /** Approve a pending-review surface */\n async approve(surfaceId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/surfaces/{surface_id}/approve', {\n params: { path: { workspace_id: this.workspaceId, surface_id: surfaceId } },\n }),\n )\n }\n\n /** Reject a pending-review surface */\n async reject(surfaceId: string, body: components['schemas']['RejectSurfaceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/surfaces/{surface_id}/reject', {\n params: { path: { workspace_id: this.workspaceId, surface_id: surfaceId } },\n body,\n }),\n )\n }\n\n /** Reshape \u2014 clone the surface with refined fields (review redirect) */\n async reshape(surfaceId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/surfaces/{surface_id}/reshape', {\n params: { path: { workspace_id: this.workspaceId, surface_id: surfaceId } },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Sessions \u2014 operator visibility into **live agent calls**. List the\n * currently active sessions across the workspace, and inject a one-shot\n * directive (text or audio) into a specific call's session mid-flight.\n *\n * Distinct from `client.simulations.sessions` (Playground / batch testing)\n * and `client.simulations.runs.createSession` (sub-session of a multi-run\n * batch). Those are read-write fixtures; this resource controls real,\n * in-progress operator-attended calls.\n *\n * @beta New in this release; surface may evolve.\n */\nexport class SessionsResource extends WorkspaceScopedResource {\n /** List currently active sessions across the workspace */\n async listActive() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/sessions/active', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Inject a one-shot directive (text/audio) into a live call session */\n async inject(callSid: string, body: components['schemas']['InjectRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/sessions/{call_sid}/inject', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid } },\n body,\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\ntype OpenApiResult<T> = {\n data?: T\n error?: unknown\n response?: Response\n}\n\ntype ForkStatus = {\n endpoint?: string\n status?: string\n ttl_days?: number\n [key: string]: unknown\n}\n\ntype QueryResult = {\n columns?: string[]\n rows?: unknown[]\n row_count?: number\n [key: string]: unknown\n}\n\ntype QueryTool = {\n id?: string\n workspace_id?: string\n name?: string\n description?: string | null\n query?: string\n parameters?: Record<string, unknown>\n enabled?: boolean\n target?: string\n created_at?: string\n updated_at?: string\n [key: string]: unknown\n}\n\ntype QueryToolList = {\n items: QueryTool[]\n has_more?: boolean\n continuation_token?: number | null\n}\n\ntype JsonObject = Record<string, unknown>\n\nexport class WorkspaceDatabaseResource extends WorkspaceScopedResource {\n private get<T>(path: string, init?: object): Promise<OpenApiResult<T>> {\n return this.client.GET(path as never, init as never) as Promise<OpenApiResult<T>>\n }\n\n private post<T>(path: string, init?: object): Promise<OpenApiResult<T>> {\n return this.client.POST(path as never, init as never) as Promise<OpenApiResult<T>>\n }\n\n private patch<T>(path: string, init?: object): Promise<OpenApiResult<T>> {\n return this.client.PATCH(path as never, init as never) as Promise<OpenApiResult<T>>\n }\n\n private delete(path: string, init?: object): Promise<OpenApiResult<void>> {\n return this.client.DELETE(path as never, init as never) as Promise<OpenApiResult<void>>\n }\n\n // -- Fork lifecycle -------------------------------------------------------\n\n async getFork() {\n return extractData(\n await this.get<ForkStatus>('/v1/{workspace_id}/fork', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async createFork(body: JsonObject) {\n return extractData(\n await this.post<ForkStatus>('/v1/{workspace_id}/fork', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async deleteFork(): Promise<void> {\n await this.delete('/v1/{workspace_id}/fork', {\n params: { path: { workspace_id: this.workspaceId } },\n })\n }\n\n // -- Query execution ------------------------------------------------------\n\n async executeQuery(body: JsonObject) {\n return extractData(\n await this.post<QueryResult>('/v1/{workspace_id}/lakebase/query', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n // -- Query tool CRUD ------------------------------------------------------\n\n async listQueryTools(params?: ListParams) {\n return extractData(\n await this.get<QueryToolList>('/v1/{workspace_id}/query-tools', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listQueryToolsAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.listQueryTools(pageParams), params)\n }\n\n async createQueryTool(body: JsonObject) {\n return extractData(\n await this.post<QueryTool>('/v1/{workspace_id}/query-tools', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async updateQueryTool(toolId: string, body: JsonObject) {\n return extractData(\n await this.patch<QueryTool>('/v1/{workspace_id}/query-tools/{tool_id}', {\n params: { path: { workspace_id: this.workspaceId, tool_id: toolId } },\n body,\n }),\n )\n }\n\n async deleteQueryTool(toolId: string): Promise<void> {\n await this.delete('/v1/{workspace_id}/query-tools/{tool_id}', {\n params: { path: { workspace_id: this.workspaceId, tool_id: toolId } },\n })\n }\n\n async testQueryTool(toolId: string, body: JsonObject) {\n return extractData(\n await this.post<QueryResult>('/v1/{workspace_id}/query-tools/{tool_id}/test', {\n params: { path: { workspace_id: this.workspaceId, tool_id: toolId } },\n body,\n }),\n )\n }\n}\n", "/**\n * Branded types provide compile-time type safety for string IDs.\n * At runtime they are plain strings, but the type system prevents mixing them.\n */\ndeclare const brand: unique symbol\n\ntype Brand<T, B> = T & { readonly [brand]: B }\n\n// --- ID types ---\nexport type WorkspaceId = Brand<string, 'WorkspaceId'>\nexport type ApiKeyId = Brand<string, 'ApiKeyId'>\nexport type AgentId = Brand<string, 'AgentId'>\nexport type PersonaId = Brand<string, 'PersonaId'>\nexport type SkillId = Brand<string, 'SkillId'>\n/** @deprecated Use ActionId instead */\nexport type ActionId = Brand<string, 'ActionId'>\nexport type ServiceId = Brand<string, 'ServiceId'>\nexport type ContextGraphId = Brand<string, 'ContextGraphId'>\nexport type CallId = Brand<string, 'CallId'>\nexport type PhoneNumberId = Brand<string, 'PhoneNumberId'>\nexport type IntegrationId = Brand<string, 'IntegrationId'>\nexport type EntityId = Brand<string, 'EntityId'>\nexport type EventId = Brand<string, 'EventId'>\nexport type SurfaceId = Brand<string, 'SurfaceId'>\nexport type OperatorId = Brand<string, 'OperatorId'>\nexport type TriggerId = Brand<string, 'TriggerId'>\nexport type SimulationRunId = Brand<string, 'SimulationRunId'>\nexport type SimulationSessionId = Brand<string, 'SimulationSessionId'>\nexport type ScribeSessionId = Brand<string, 'ScribeSessionId'>\nexport type FunctionId = Brand<string, 'FunctionId'>\nexport type DataSourceId = Brand<string, 'DataSourceId'>\n\n// --- Constructors ---\nexport const workspaceId = (id: string): WorkspaceId => id as WorkspaceId\nexport const apiKeyId = (id: string): ApiKeyId => id as ApiKeyId\nexport const agentId = (id: string): AgentId => id as AgentId\nexport const personaId = (id: string): PersonaId => id as PersonaId\nexport const skillId = (id: string): SkillId => id as SkillId\nexport const actionId = (id: string): ActionId => id as ActionId\nexport const serviceId = (id: string): ServiceId => id as ServiceId\nexport const contextGraphId = (id: string): ContextGraphId => id as ContextGraphId\nexport const callId = (id: string): CallId => id as CallId\nexport const phoneNumberId = (id: string): PhoneNumberId => id as PhoneNumberId\nexport const integrationId = (id: string): IntegrationId => id as IntegrationId\nexport const entityId = (id: string): EntityId => id as EntityId\nexport const eventId = (id: string): EventId => id as EventId\nexport const surfaceId = (id: string): SurfaceId => id as SurfaceId\nexport const operatorId = (id: string): OperatorId => id as OperatorId\nexport const triggerId = (id: string): TriggerId => id as TriggerId\nexport const simulationRunId = (id: string): SimulationRunId => id as SimulationRunId\nexport const simulationSessionId = (id: string): SimulationSessionId => id as SimulationSessionId\nexport const scribeSessionId = (id: string): ScribeSessionId => id as ScribeSessionId\nexport const functionId = (id: string): FunctionId => id as FunctionId\nexport const dataSourceId = (id: string): DataSourceId => id as DataSourceId\n", "const textEncoder = new TextEncoder()\nconst MAX_TIMESTAMP_SKEW_MS = 5 * 60 * 1000\ntype WebCryptoLike = { subtle: NonNullable<typeof globalThis.crypto>['subtle'] }\n\nlet webCryptoPromise: Promise<WebCryptoLike> | undefined\n\nexport interface WebhookEvent<T = unknown> {\n id: string\n type: string\n timestamp: string\n data: T\n}\n\nexport interface WebhookVerificationOptions {\n payload: string | Uint8Array | ArrayBuffer\n signature: string\n secret: string\n timestamp?: string\n maxAgeMs?: number\n}\n\nexport interface ParseWebhookEventOptions<T = unknown> extends WebhookVerificationOptions {\n payload: string | Uint8Array | ArrayBuffer\n expectedType?: string\n reviver?: Parameters<typeof JSON.parse>[1]\n validate?: (event: WebhookEvent<T>) => void\n}\n\nexport class WebhookVerificationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'WebhookVerificationError'\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\nexport async function verifyWebhookSignature(\n payload: string | Uint8Array | ArrayBuffer,\n signature: string,\n secret: string,\n): Promise<boolean>\nexport async function verifyWebhookSignature(options: WebhookVerificationOptions): Promise<boolean>\nexport async function verifyWebhookSignature(\n payloadOrOptions: string | Uint8Array | ArrayBuffer | WebhookVerificationOptions,\n signature?: string,\n secret?: string,\n): Promise<boolean> {\n const options = normalizeVerificationOptions(payloadOrOptions, signature, secret)\n const payloadBytes = toUint8Array(options.payload)\n const expectedSignature = await signWebhookPayload(\n payloadBytes,\n options.secret,\n options.timestamp,\n )\n const actualSignature = normalizeSignature(options.signature)\n\n if (!actualSignature || !constantTimeEqual(expectedSignature, actualSignature)) {\n return false\n }\n\n if (options.timestamp) {\n const timestampMs = parseTimestamp(options.timestamp)\n if (timestampMs === undefined) return false\n\n const maxAgeMs = options.maxAgeMs ?? MAX_TIMESTAMP_SKEW_MS\n const now = Date.now()\n if (timestampMs > now + maxAgeMs || now - timestampMs > maxAgeMs) {\n return false\n }\n }\n\n return true\n}\n\nexport async function parseWebhookEvent<T = unknown>(\n payload: string,\n signature: string,\n secret: string,\n): Promise<WebhookEvent<T>>\nexport async function parseWebhookEvent<T = unknown>(\n options: ParseWebhookEventOptions<T>,\n): Promise<WebhookEvent<T>>\nexport async function parseWebhookEvent<T = unknown>(\n payloadOrOptions: string | ParseWebhookEventOptions<T>,\n signature?: string,\n secret?: string,\n): Promise<WebhookEvent<T>> {\n const options = normalizeParseOptions(payloadOrOptions, signature, secret)\n const valid = await verifyWebhookSignature(options)\n\n if (!valid) {\n throw new WebhookVerificationError('Invalid or expired webhook signature')\n }\n\n const payloadText = decodePayload(options.payload)\n\n let event: WebhookEvent<T>\n try {\n event = JSON.parse(payloadText, options.reviver) as WebhookEvent<T>\n } catch {\n throw new WebhookVerificationError('Invalid JSON webhook payload')\n }\n\n if (options.expectedType && event.type !== options.expectedType) {\n throw new WebhookVerificationError(\n `Unexpected webhook event type: expected ${options.expectedType}, received ${event.type}`,\n )\n }\n\n options.validate?.(event)\n return event\n}\n\nfunction normalizeVerificationOptions(\n payloadOrOptions: string | Uint8Array | ArrayBuffer | WebhookVerificationOptions,\n signature?: string,\n secret?: string,\n): WebhookVerificationOptions {\n if (\n typeof payloadOrOptions === 'object' &&\n payloadOrOptions !== null &&\n 'payload' in payloadOrOptions\n ) {\n return payloadOrOptions\n }\n\n if (!signature || !secret) {\n throw new TypeError('signature and secret are required')\n }\n\n return {\n payload: payloadOrOptions,\n signature,\n secret,\n }\n}\n\nfunction normalizeParseOptions<T>(\n payloadOrOptions: string | ParseWebhookEventOptions<T>,\n signature?: string,\n secret?: string,\n): ParseWebhookEventOptions<T> {\n if (\n typeof payloadOrOptions === 'object' &&\n payloadOrOptions !== null &&\n 'payload' in payloadOrOptions\n ) {\n return payloadOrOptions\n }\n\n if (!signature || !secret) {\n throw new TypeError('signature and secret are required')\n }\n\n return {\n payload: payloadOrOptions,\n signature,\n secret,\n }\n}\n\nfunction decodePayload(payload: string | Uint8Array | ArrayBuffer): string {\n if (typeof payload === 'string') return payload\n return new TextDecoder().decode(toUint8Array(payload))\n}\n\nfunction toUint8Array(payload: string | Uint8Array | ArrayBuffer): Uint8Array {\n if (typeof payload === 'string') return textEncoder.encode(payload)\n if (payload instanceof Uint8Array) return payload\n return new Uint8Array(payload)\n}\n\nasync function signWebhookPayload(\n payload: Uint8Array,\n secret: string,\n timestamp?: string,\n): Promise<Uint8Array> {\n const crypto = await resolveWebCrypto()\n const key = await crypto.subtle.importKey(\n 'raw',\n textEncoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n )\n\n const message = timestamp\n ? concatUint8Arrays(textEncoder.encode(`v1:${timestamp}:`), payload)\n : payload\n\n const mac = await crypto.subtle.sign('HMAC', key, toCryptoBuffer(message))\n return new Uint8Array(mac)\n}\n\nasync function resolveWebCrypto(): Promise<WebCryptoLike> {\n if (globalThis.crypto?.subtle) {\n return globalThis.crypto\n }\n\n webCryptoPromise ??= import('node:crypto').then(({ webcrypto }) => webcrypto as WebCryptoLike)\n return await webCryptoPromise\n}\n\nfunction normalizeSignature(signature: string): Uint8Array | undefined {\n const normalized = signature.startsWith('sha256=') ? signature.slice(7) : signature\n if (!/^[a-fA-F0-9]+$/.test(normalized) || normalized.length % 2 !== 0) {\n return undefined\n }\n\n const bytes = new Uint8Array(normalized.length / 2)\n for (let index = 0; index < normalized.length; index += 2) {\n bytes[index / 2] = Number.parseInt(normalized.slice(index, index + 2), 16)\n }\n return bytes\n}\n\nfunction constantTimeEqual(expected: Uint8Array, actual: Uint8Array): boolean {\n const maxLength = Math.max(expected.length, actual.length)\n let diff = expected.length ^ actual.length\n\n for (let index = 0; index < maxLength; index += 1) {\n diff |= (expected[index] ?? 0) ^ (actual[index] ?? 0)\n }\n\n return diff === 0\n}\n\nfunction parseTimestamp(timestamp: string): number | undefined {\n const numeric = Number(timestamp)\n if (Number.isFinite(numeric)) {\n return numeric < 1_000_000_000_000 ? numeric * 1000 : numeric\n }\n\n const parsed = Date.parse(timestamp)\n return Number.isNaN(parsed) ? undefined : parsed\n}\n\nfunction concatUint8Arrays(left: Uint8Array, right: Uint8Array): Uint8Array {\n const combined = new Uint8Array(left.length + right.length)\n combined.set(left, 0)\n combined.set(right, left.length)\n return combined\n}\n\nfunction toCryptoBuffer(bytes: Uint8Array): ArrayBuffer {\n const copy = Uint8Array.from(bytes)\n return copy.buffer\n}\n", "/**\n * RFC 8628 Device Authorization Grant for desktop and CLI apps.\n *\n * Authenticates users via the identity service's device code flow:\n * the app displays a code, the user approves in their browser,\n * and the app receives a workspace-scoped JWT.\n */\n\nimport { AmigoError, AuthenticationError, NetworkError, RateLimitError } from './errors.js'\n\n// --- Types ---\n\nexport interface DeviceCodeIssuance {\n device_code: string\n user_code: string\n verification_uri: string\n verification_uri_complete: string\n expires_in: number\n interval: number\n}\n\nexport interface IdentityTokenResponse {\n access_token: string\n token_type: 'Bearer' | 'DPoP'\n expires_in: number\n scope: string\n session_id?: string\n refresh_token?: string\n}\n\nexport interface WorkspaceChoice {\n workspace_id: string\n role?: string\n name?: string\n}\n\nexport interface MultiWorkspaceResponse {\n error: 'workspace_selection_required'\n workspaces: WorkspaceChoice[]\n access_token?: string\n token_type?: string\n expires_in?: number\n scope?: string\n refresh_token?: string\n}\n\nexport type DeviceCodeStatus =\n | 'authorization_pending'\n | 'polling'\n | 'approved'\n | 'expired'\n | 'denied'\n | 'slow_down'\n\nexport interface DeviceCodeLoginOptions {\n /** Identity service base URL. Default: https://api.platform.amigo.ai */\n identityBaseUrl?: string\n /** Pre-select workspace (skips workspace selection prompt) */\n workspaceId?: string\n /** Client description for audit logs */\n clientDescription?: string\n /** OAuth scope to request */\n scope?: string\n /** Called when device code is issued \u2014 display instructions to user */\n onCode: (issuance: DeviceCodeIssuance) => void | Promise<void>\n /** Called with polling status updates */\n onStatus?: (status: DeviceCodeStatus) => void\n /** Called when user must select a workspace \u2014 return the chosen workspace_id */\n onWorkspaceRequired: (workspaces: WorkspaceChoice[]) => Promise<string>\n /** AbortSignal to cancel the login flow */\n signal?: AbortSignal\n /** Custom fetch implementation */\n fetch?: typeof globalThis.fetch\n}\n\nexport interface AuthResult {\n accessToken: string\n refreshToken: string\n workspaceId: string\n expiresAt: number\n scope?: string\n}\n\nexport interface StoredCredentials {\n access_token: string\n refresh_token: string\n workspace_id: string\n expires_at: number\n scope?: string\n identity_base_url?: string\n}\n\nexport interface TokenStorage {\n load(): Promise<StoredCredentials | null>\n save(credentials: StoredCredentials): Promise<void>\n clear(): Promise<void>\n}\n\n// --- Errors ---\n\nexport class DeviceCodeExpiredError extends AmigoError {\n constructor(message = 'Device code expired. Please restart the login flow.') {\n super(message, { errorCode: 'device_code_expired' })\n }\n}\n\nexport class DeviceCodeDeniedError extends AmigoError {\n constructor(message = 'Authorization request was denied.') {\n super(message, { errorCode: 'device_code_denied' })\n }\n}\n\nexport class RefreshTokenExpiredError extends AuthenticationError {\n constructor(message = 'Refresh token expired. Please log in again.') {\n super(message, { errorCode: 'refresh_token_expired' })\n }\n}\n\nexport class LoginCancelledError extends AmigoError {\n constructor() {\n super('Login cancelled', { errorCode: 'login_cancelled' })\n }\n}\n\n// --- Identity Client ---\n\nconst DEFAULT_IDENTITY_URL = 'https://api.platform.amigo.ai'\n\nasync function identityPost(\n baseUrl: string,\n path: string,\n body: URLSearchParams,\n fetchFn: typeof globalThis.fetch,\n): Promise<Response> {\n try {\n // redirect: 'manual' is required because the identity service uses HTTP 300\n // (non-standard) for multi-workspace selection. Without it, fetch follows\n // the redirect automatically and the caller never sees the 300.\n return await fetchFn(`${baseUrl}${path}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n redirect: 'manual',\n })\n } catch (err) {\n throw new NetworkError('Network error contacting identity service', err)\n }\n}\n\nasync function requestDeviceCode(\n baseUrl: string,\n params: { clientDescription?: string; scope?: string },\n fetchFn: typeof globalThis.fetch,\n): Promise<DeviceCodeIssuance> {\n const body = new URLSearchParams()\n if (params.clientDescription) body.set('client_description', params.clientDescription)\n if (params.scope) body.set('scope', params.scope)\n\n const res = await identityPost(baseUrl, '/device/code', body, fetchFn)\n\n if (res.status === 429) {\n const retryAfter = parseInt(res.headers.get('Retry-After') ?? '', 10)\n throw new RateLimitError('Rate limited', {\n retryAfter: isNaN(retryAfter) ? undefined : retryAfter,\n })\n }\n if (!res.ok) {\n const err = (await res.json().catch(() => ({}))) as Record<string, string>\n throw new AmigoError(err.error_description ?? `Identity error (${res.status})`, {\n statusCode: res.status,\n errorCode: err.error,\n })\n }\n return (await res.json()) as DeviceCodeIssuance\n}\n\ntype PollResult =\n | { type: 'token'; data: IdentityTokenResponse }\n | { type: 'multi_workspace'; data: MultiWorkspaceResponse }\n | { type: 'pending' }\n | { type: 'slow_down' }\n\nasync function pollDeviceCode(\n baseUrl: string,\n deviceCode: string,\n scope: string | undefined,\n workspaceId: string | undefined,\n fetchFn: typeof globalThis.fetch,\n): Promise<PollResult> {\n const body = new URLSearchParams({ grant_type: 'device_code', device_code: deviceCode })\n if (scope) body.set('scope', scope)\n if (workspaceId) body.set('workspace_id', workspaceId)\n\n const res = await identityPost(baseUrl, '/token', body, fetchFn)\n\n if (res.status === 300)\n return { type: 'multi_workspace', data: (await res.json()) as MultiWorkspaceResponse }\n if (res.status === 200)\n return { type: 'token', data: (await res.json()) as IdentityTokenResponse }\n\n if (res.status === 400) {\n const err = (await res.json().catch(() => ({ error: 'unknown' }))) as Record<string, string>\n if (err.error === 'authorization_pending') return { type: 'pending' }\n if (err.error === 'slow_down') return { type: 'slow_down' }\n throw new AmigoError(err.error_description ?? err.error ?? `Identity error (400)`, {\n statusCode: 400,\n errorCode: err.error,\n })\n }\n\n throw new AmigoError(`Identity error (${res.status})`, { statusCode: res.status })\n}\n\nasync function doRefreshToken(\n baseUrl: string,\n params: { refreshToken: string; workspaceId?: string; scope?: string },\n fetchFn: typeof globalThis.fetch,\n): Promise<IdentityTokenResponse> {\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: params.refreshToken,\n })\n if (params.workspaceId) body.set('workspace_id', params.workspaceId)\n if (params.scope) body.set('scope', params.scope)\n\n const res = await identityPost(baseUrl, '/token', body, fetchFn)\n\n if (!res.ok) {\n const err = (await res.json().catch(() => ({}))) as Record<string, string>\n throw new AmigoError(err.error_description ?? `Identity error (${res.status})`, {\n statusCode: res.status,\n errorCode: err.error,\n })\n }\n return (await res.json()) as IdentityTokenResponse\n}\n\n// --- JWT decode (no verification \u2014 server validates) ---\n\nexport function decodeJwtPayload(jwt: string): Record<string, unknown> | null {\n try {\n const parts = jwt.split('.')\n if (parts.length !== 3 || !parts[1]) return null\n const payload = Buffer.from(parts[1], 'base64url').toString()\n return JSON.parse(payload) as Record<string, unknown>\n } catch {\n return null\n }\n}\n\n// --- Device Code Login ---\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new LoginCancelledError())\n return\n }\n const timer = setTimeout(resolve, ms)\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer)\n reject(new LoginCancelledError())\n },\n { once: true },\n )\n })\n}\n\nfunction toAuthResult(token: IdentityTokenResponse, workspaceIdOverride?: string): AuthResult {\n const claims = decodeJwtPayload(token.access_token)\n const workspaceId = workspaceIdOverride ?? (claims?.workspace_id as string) ?? ''\n if (!workspaceId) {\n throw new AmigoError('Token does not contain a workspace_id claim', {\n errorCode: 'missing_workspace',\n })\n }\n return {\n accessToken: token.access_token,\n refreshToken: token.refresh_token ?? '',\n workspaceId,\n expiresAt:\n (claims?.exp as number) ??\n (token.expires_in\n ? Math.floor(Date.now() / 1000) + token.expires_in\n : Math.floor(Date.now() / 1000) + 900),\n scope: token.scope,\n }\n}\n\nasync function fetchWorkspaces(\n baseUrl: string,\n accessToken: string,\n fetchFn: typeof globalThis.fetch,\n): Promise<WorkspaceChoice[]> {\n // Try /self/profile first (identity service direct route)\n for (const path of ['/self/profile', '/self']) {\n const res = await fetchFn(`${baseUrl}${path}`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n })\n if (res.ok) {\n const data = (await res.json()) as {\n workspaces?: Array<{ workspace_id: string; role?: string; name?: string }>\n }\n return (data.workspaces ?? []).map((ws) => ({\n workspace_id: ws.workspace_id,\n role: ws.role,\n name: ws.name,\n }))\n }\n if (res.status !== 404) {\n throw new AmigoError(`Failed to fetch workspaces (${res.status})`, { statusCode: res.status })\n }\n }\n return []\n}\n\nasync function resolveWorkspaceFromBootstrap(\n baseUrl: string,\n token: IdentityTokenResponse,\n options: DeviceCodeLoginOptions,\n fetchFn: typeof globalThis.fetch,\n): Promise<AuthResult> {\n if (!token.refresh_token) {\n throw new AmigoError('Bootstrap token missing refresh_token', { errorCode: 'server_error' })\n }\n\n const workspaces = await fetchWorkspaces(baseUrl, token.access_token, fetchFn)\n\n if (workspaces.length === 0) {\n throw new AmigoError(\n 'No workspace memberships found. Create a workspace or request an invitation.',\n { errorCode: 'no_workspaces' },\n )\n }\n\n if (workspaces.length === 1 && workspaces[0]) {\n const scoped = await doRefreshToken(\n baseUrl,\n {\n refreshToken: token.refresh_token,\n workspaceId: workspaces[0].workspace_id,\n scope: options.scope,\n },\n fetchFn,\n )\n return toAuthResult(scoped, workspaces[0].workspace_id)\n }\n\n const workspaceId = await options.onWorkspaceRequired(workspaces)\n const scoped = await doRefreshToken(\n baseUrl,\n { refreshToken: token.refresh_token, workspaceId, scope: options.scope },\n fetchFn,\n )\n return toAuthResult(scoped, workspaceId)\n}\n\nasync function resolveWorkspaceFromMulti(\n baseUrl: string,\n multi: MultiWorkspaceResponse,\n options: DeviceCodeLoginOptions,\n fetchFn: typeof globalThis.fetch,\n): Promise<AuthResult> {\n if (!multi.refresh_token) {\n throw new AmigoError('Multi-workspace response missing refresh_token', {\n errorCode: 'server_error',\n })\n }\n\n const workspaceId = await options.onWorkspaceRequired(multi.workspaces)\n const scoped = await doRefreshToken(\n baseUrl,\n { refreshToken: multi.refresh_token, workspaceId, scope: options.scope },\n fetchFn,\n )\n return toAuthResult(scoped, workspaceId)\n}\n\nexport async function loginWithDeviceCode(options: DeviceCodeLoginOptions): Promise<AuthResult> {\n const baseUrl = (options.identityBaseUrl ?? DEFAULT_IDENTITY_URL).replace(/\\/+$/, '')\n const fetchFn = options.fetch ?? globalThis.fetch\n\n const issuance = await requestDeviceCode(\n baseUrl,\n { clientDescription: options.clientDescription, scope: options.scope },\n fetchFn,\n )\n\n await options.onCode(issuance)\n\n // Poll loop\n let interval = issuance.interval * 1000\n const deadline = Date.now() + issuance.expires_in * 1000\n\n while (Date.now() < deadline) {\n if (options.signal?.aborted) throw new LoginCancelledError()\n\n await sleep(interval, options.signal)\n\n if (options.signal?.aborted) throw new LoginCancelledError()\n\n options.onStatus?.('polling')\n\n try {\n const result = await pollDeviceCode(\n baseUrl,\n issuance.device_code,\n options.scope,\n options.workspaceId,\n fetchFn,\n )\n\n if (result.type === 'pending') {\n options.onStatus?.('authorization_pending')\n continue\n }\n\n // RFC 8628 \u00A73.5: increase interval by 5 seconds on slow_down\n if (result.type === 'slow_down') {\n interval += 5000\n options.onStatus?.('slow_down')\n continue\n }\n\n options.onStatus?.('approved')\n\n if (result.type === 'token') {\n const claims = decodeJwtPayload(result.data.access_token)\n const isBootstrap = claims?.workspace_bootstrap || !claims?.workspace_id\n if (isBootstrap && result.data.refresh_token) {\n // Bootstrap token \u2014 need workspace selection via refresh_token exchange\n if (options.workspaceId) {\n const scoped = await doRefreshToken(\n baseUrl,\n {\n refreshToken: result.data.refresh_token,\n workspaceId: options.workspaceId,\n scope: options.scope,\n },\n fetchFn,\n )\n return toAuthResult(scoped, options.workspaceId)\n }\n return await resolveWorkspaceFromBootstrap(baseUrl, result.data, options, fetchFn)\n }\n return toAuthResult(result.data)\n }\n\n // multi_workspace (HTTP 300) \u2014 workspace list included in response\n return await resolveWorkspaceFromMulti(baseUrl, result.data, options, fetchFn)\n } catch (err) {\n if (err instanceof AmigoError && err.errorCode === 'expired_token') {\n options.onStatus?.('expired')\n throw new DeviceCodeExpiredError()\n }\n if (err instanceof AmigoError && err.errorCode === 'access_denied') {\n options.onStatus?.('denied')\n throw new DeviceCodeDeniedError()\n }\n throw err\n }\n }\n\n options.onStatus?.('expired')\n throw new DeviceCodeExpiredError()\n}\n\n// --- Token Manager ---\n\nconst REFRESH_BUFFER_SECONDS = 60\n\nexport interface TokenManagerConfig {\n storage?: TokenStorage\n identityBaseUrl?: string\n fetch?: typeof globalThis.fetch\n}\n\nexport class TokenManager {\n private readonly _storage: TokenStorage\n private readonly _baseUrl: string\n private readonly _fetch: typeof globalThis.fetch\n private _cached: StoredCredentials | null = null\n private _refreshPromise: Promise<StoredCredentials> | null = null\n\n constructor(config: TokenManagerConfig = {}) {\n this._storage = config.storage ?? new FileTokenStorage()\n this._baseUrl = (config.identityBaseUrl ?? DEFAULT_IDENTITY_URL).replace(/\\/+$/, '')\n this._fetch = config.fetch ?? globalThis.fetch\n }\n\n async store(result: AuthResult): Promise<void> {\n const creds: StoredCredentials = {\n access_token: result.accessToken,\n refresh_token: result.refreshToken,\n workspace_id: result.workspaceId,\n expires_at: result.expiresAt,\n scope: result.scope,\n }\n this._cached = creds\n await this._storage.save(creds)\n }\n\n async getAccessToken(): Promise<{ token: string; workspaceId: string } | null> {\n const creds = await this._loadCached()\n if (!creds) return null\n if (creds.expires_at - Math.floor(Date.now() / 1000) >= REFRESH_BUFFER_SECONDS) {\n return { token: creds.access_token, workspaceId: creds.workspace_id }\n }\n const refreshed = await this._refresh(creds)\n return { token: refreshed.access_token, workspaceId: refreshed.workspace_id }\n }\n\n async hasCredentials(): Promise<boolean> {\n return (await this._loadCached()) !== null\n }\n\n async clear(): Promise<void> {\n this._cached = null\n this._refreshPromise = null\n await this._storage.clear()\n }\n\n private async _loadCached(): Promise<StoredCredentials | null> {\n if (this._cached) return this._cached\n const loaded = await this._storage.load()\n if (loaded) this._cached = loaded\n return loaded\n }\n\n private async _refresh(current: StoredCredentials): Promise<StoredCredentials> {\n if (this._refreshPromise) return this._refreshPromise\n this._refreshPromise = this._doRefresh(current).finally(() => {\n this._refreshPromise = null\n })\n return this._refreshPromise\n }\n\n private async _doRefresh(current: StoredCredentials): Promise<StoredCredentials> {\n if (!current.refresh_token) throw new RefreshTokenExpiredError('No refresh token available')\n\n try {\n const response = await doRefreshToken(\n this._baseUrl,\n {\n refreshToken: current.refresh_token,\n workspaceId: current.workspace_id,\n scope: current.scope,\n },\n this._fetch,\n )\n const claims = decodeJwtPayload(response.access_token)\n const refreshed: StoredCredentials = {\n access_token: response.access_token,\n refresh_token: response.refresh_token ?? current.refresh_token,\n workspace_id: current.workspace_id,\n expires_at: (claims?.exp as number) ?? Math.floor(Date.now() / 1000) + response.expires_in,\n scope: response.scope ?? current.scope,\n }\n this._cached = refreshed\n await this._storage.save(refreshed)\n return refreshed\n } catch (err) {\n if (\n err instanceof AmigoError &&\n (err.statusCode === 401 || err.errorCode === 'invalid_grant')\n ) {\n await this.clear()\n throw new RefreshTokenExpiredError()\n }\n throw err\n }\n }\n}\n\n// --- Token Storage ---\n\nexport class FileTokenStorage implements TokenStorage {\n private readonly _explicitPath: string | undefined\n private _resolvedPath: string | undefined\n\n constructor(filePath?: string) {\n this._explicitPath = filePath\n }\n\n private async _filePath(): Promise<string> {\n if (this._explicitPath) return this._explicitPath\n if (this._resolvedPath) return this._resolvedPath\n const os = await import('node:os')\n const path = await import('node:path')\n this._resolvedPath = path.join(os.homedir(), '.amigo', 'credentials.json')\n return this._resolvedPath\n }\n\n async load(): Promise<StoredCredentials | null> {\n const fs = await import('node:fs/promises')\n const filePath = await this._filePath()\n try {\n const raw = await fs.readFile(filePath, 'utf-8')\n const data = JSON.parse(raw)\n if (\n typeof data.access_token === 'string' &&\n typeof data.refresh_token === 'string' &&\n typeof data.workspace_id === 'string' &&\n typeof data.expires_at === 'number'\n ) {\n return data as StoredCredentials\n }\n return null\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') return null\n throw err\n }\n }\n\n async save(credentials: StoredCredentials): Promise<void> {\n const fs = await import('node:fs/promises')\n const path = await import('node:path')\n const filePath = await this._filePath()\n await fs.mkdir(path.dirname(filePath), { recursive: true, mode: 0o700 })\n await fs.writeFile(filePath, JSON.stringify(credentials, null, 2) + '\\n', { mode: 0o600 })\n await fs.chmod(filePath, 0o600)\n }\n\n async clear(): Promise<void> {\n const fs = await import('node:fs/promises')\n const filePath = await this._filePath()\n try {\n await fs.unlink(filePath)\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') return\n throw err\n }\n }\n}\n\nexport class MemoryTokenStorage implements TokenStorage {\n private _credentials: StoredCredentials | null = null\n async load(): Promise<StoredCredentials | null> {\n return this._credentials\n }\n async save(credentials: StoredCredentials): Promise<void> {\n this._credentials = { ...credentials }\n }\n async clear(): Promise<void> {\n this._credentials = null\n }\n}\n\n// --- CLI Helpers ---\n\nexport function formatDeviceCodeInstructions(issuance: DeviceCodeIssuance): string {\n return [\n '',\n ' To sign in, open your browser and visit:',\n '',\n ` ${issuance.verification_uri}`,\n '',\n ' Then enter this code:',\n '',\n ` ${issuance.user_code}`,\n '',\n ` This code expires in ${Math.floor(issuance.expires_in / 60)} minutes.`,\n '',\n ].join('\\n')\n}\n\nexport function formatDeviceCodeLink(issuance: DeviceCodeIssuance): string {\n return `\\x1b]8;;${issuance.verification_uri_complete}\\x07Open browser to approve\\x1b]8;;\\x07`\n}\n\nexport async function openBrowser(url: string): Promise<boolean> {\n const { spawn } = await import('node:child_process')\n\n const openers: Record<string, { cmd: string; args: string[] }> = {\n darwin: { cmd: 'open', args: [url] },\n win32: { cmd: 'cmd', args: ['/c', 'start', '', url] },\n linux: { cmd: 'xdg-open', args: [url] },\n }\n\n const opener = openers[process.platform]\n if (!opener) return false\n\n return new Promise((resolve) => {\n // shell: false prevents command injection from malformed URLs\n const child = spawn(opener.cmd, opener.args, { stdio: 'ignore', shell: false, detached: true })\n child.on('error', () => resolve(false))\n child.on('close', (code) => resolve(code === 0))\n child.unref()\n })\n}\n\nexport function formatWorkspaceList(workspaces: WorkspaceChoice[]): string {\n const lines = ['', ' Available workspaces:', '']\n workspaces.forEach((ws, i) => {\n const name = ws.name ?? ws.workspace_id\n const role = ws.role ? ` (${ws.role})` : ''\n lines.push(` ${i + 1}. ${name}${role}`)\n if (ws.name) lines.push(` ${ws.workspace_id}`)\n })\n lines.push('')\n return lines.join('\\n')\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["createClientImport", "workspaceId", "agentId", "skillId", "actionId", "serviceId", "contextGraphId", "dataSourceId", "entityId", "dataSourceId", "eventId", "callId", "workspaceId", "serviceId", "entityId", "workspaceId", "phoneNumberId", "integrationId", "entityId", "serviceId", "entityId", "personaId", "entityId", "workspaceId", "safeStringify", "parseSSEFrames", "findFrameTerminator", "parseSSEBlock", "DEFAULT_INITIAL_DELAY_MS", "DEFAULT_MAX_DELAY_MS", "DEFAULT_MAX_RECONNECTS", "jitter", "abortableSleep", "runOneConnection", "WEB_SOCKET_PROTOCOL_TOKEN_RE", "MAX_AUTH_TOKEN_CHARS", "workspaceId", "entityId", "dataSourceId", "serviceId", "workspaceId", "sleep", "scoped", "workspaceId"]
7
7
  }