@finalai/agents 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HOSTING.md +3 -3
- package/dist/modules/agent-client/build.d.mts +11 -1
- package/dist/modules/agent-client/build.mjs +1 -1
- package/dist/modules/agent-client/build.mjs.map +2 -2
- package/dist/modules/agent-client/client.d.mts +9 -4
- package/dist/modules/agent-client/client.mjs +5 -1
- package/dist/modules/agent-client/client.mjs.map +2 -2
- package/dist/modules/agent-client/conversations.d.mts +27 -3
- package/dist/modules/agent-client/conversations.mjs +5 -2
- package/dist/modules/agent-client/conversations.mjs.map +2 -2
- package/dist/modules/cli/cli.mjs +2 -2
- package/dist/modules/cli/cli.mjs.map +2 -2
- package/package.json +5 -5
package/HOSTING.md
CHANGED
|
@@ -7,13 +7,13 @@ resolve against dev and production configuration without source edits.
|
|
|
7
7
|
## Selecting a deployment
|
|
8
8
|
|
|
9
9
|
```sh
|
|
10
|
-
export FINAL_API_HOST=https
|
|
11
|
-
export FINAL_API_KEY=<dev-
|
|
10
|
+
export FINAL_API_HOST=https://<dev-agents-api-host>/api
|
|
11
|
+
export FINAL_API_KEY=<dev-api-key>
|
|
12
12
|
pnpm exec final-agents build ./agent
|
|
13
13
|
pnpm exec final-agents publish ./agent --agent my-agent
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
Choose production by changing the host and
|
|
16
|
+
Choose production by changing the host and API key. `--host` overrides
|
|
17
17
|
`FINAL_API_HOST`; without either, the existing production default remains. Build
|
|
18
18
|
compiles locally and optionally checks installed-harness compatibility. Publish
|
|
19
19
|
compiles again and sends source/release requests to the selected deployment.
|
|
@@ -10,13 +10,23 @@ export interface DefinitionsApiIface {
|
|
|
10
10
|
ref: string;
|
|
11
11
|
}) => Promise<RevisionIface>;
|
|
12
12
|
previewCredentialPolicy: (args: DefinitionRefIface & PreviewCredentialPolicyRequestIface) => Promise<CredentialPolicyPreviewIface>;
|
|
13
|
+
/**
|
|
14
|
+
* With `projectId`, its definitions and those inherited from its ancestors. Without it,
|
|
15
|
+
* everything the caller can access (an API key: its parent project and every project it is
|
|
16
|
+
* granted; a person: every project they can read).
|
|
17
|
+
*/
|
|
13
18
|
list: (options?: SignalOptionsIface & {
|
|
14
19
|
cursor?: string;
|
|
15
20
|
limit?: number;
|
|
21
|
+
projectId?: string;
|
|
16
22
|
}) => Promise<{
|
|
17
23
|
definitions: DefinitionIface[];
|
|
18
24
|
nextCursor: string | null;
|
|
19
25
|
}>;
|
|
26
|
+
/**
|
|
27
|
+
* Creates the definition in `projectId` (editors of that project); omitted, the API key's parent
|
|
28
|
+
* project (a signed-in person's: My Work).
|
|
29
|
+
*/
|
|
20
30
|
create: (args: CreateDefinitionRequestIface & SignalOptionsIface) => Promise<DefinitionIface>;
|
|
21
31
|
get: (args: DefinitionRefIface) => Promise<DefinitionIface>;
|
|
22
32
|
/** Compiles the directory at `ref` server-side without publishing. */
|
|
@@ -69,7 +79,7 @@ export interface DefinitionsApiIface {
|
|
|
69
79
|
archive: (args: DefinitionRefIface) => Promise<DefinitionIface>;
|
|
70
80
|
/**
|
|
71
81
|
* A short-lived, read-only git remote for a Final-hosted repository, for
|
|
72
|
-
* `git clone` (
|
|
82
|
+
* `git clone` (editors of the definition's project).
|
|
73
83
|
*/
|
|
74
84
|
cloneUrl: (args: DefinitionRefIface) => Promise<DefinitionCloneUrlIface>;
|
|
75
85
|
}
|
|
@@ -51,7 +51,7 @@ const createDefinitionsApi = ({ http }) => ({
|
|
|
51
51
|
list: (options) => http.request({
|
|
52
52
|
method: HttpMethod.Get,
|
|
53
53
|
path: "/v1/definitions",
|
|
54
|
-
query: { cursor: options?.cursor, limit: options?.limit },
|
|
54
|
+
query: { cursor: options?.cursor, limit: options?.limit, projectId: options?.projectId },
|
|
55
55
|
response: definitionListSchema,
|
|
56
56
|
signal: options?.signal
|
|
57
57
|
}),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/agent-client/build.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n attachChannelBindingRequestSchema,\n attachChannelBindingResponseSchema,\n commitDefinitionRequestSchema,\n commitResultSchema,\n compatibilityReportSchema,\n compileDefinitionRequestSchema,\n compileResultSchema,\n computerSetupGuideDetailSchema,\n computerSetupGuideListSchema,\n createDefinitionRequestSchema,\n credentialPolicyPreviewSchema,\n definitionChannelsResponseSchema,\n definitionCloneUrlSchema,\n definitionFilesSchema,\n definitionListSchema,\n definitionSchema,\n previewCredentialPolicyRequestSchema,\n providerListSchema,\n publishComputerSetupGuideRequestSchema,\n publishComputerSetupGuideResultSchema,\n publishDefinitionRequestSchema,\n publishResultSchema,\n revisionDiffSchema,\n revisionListSchema,\n revisionSchema,\n scheduleListSchema,\n scheduleRunResultSchema,\n scheduleSchema,\n updateScheduleRequestSchema,\n type AttachChannelBindingResponseIface,\n type CommitDefinitionRequestIface,\n type CommitResultIface,\n type CompatibilityReportIface,\n type CompileResultIface,\n type ComputerSetupGuideDetailIface,\n type ComputerSetupGuideIface,\n type ComputerSetupGuideVersionIface,\n type CreateDefinitionRequestIface,\n type CredentialPolicyPreviewIface,\n type DefinitionChannelIface,\n type DefinitionCloneUrlIface,\n type DefinitionFilesIface,\n type DefinitionIface,\n type PreviewCredentialPolicyRequestIface,\n type ProviderEntryIface,\n type PublishComputerSetupGuideRequestIface,\n type PublishResultIface,\n type RevisionDiffIface,\n type RevisionIface,\n type ScheduleIface,\n type ScheduleRunResultIface,\n type UpdateScheduleRequestIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport { encodePath, type ClientContextIface, type SignalOptionsIface } from \"./context.mjs\";\nimport { clientError, ClientErrorCode } from \"./errors.mjs\";\nimport { HttpMethod } from \"./http.mjs\";\n\n// Definitions, providers, setup guides, schedules, credentials and budgets:\n// what Build, settings and CI use.\n\nexport interface DefinitionRefIface extends SignalOptionsIface {\n /** Definition id or slug. */\n definition: string;\n}\n\nexport interface DefinitionsApiIface {\n /** Compiles a draft into an immutable test snapshot without publishing or activating schedules/channels. */\n testRevision: (args: DefinitionRefIface & { ref: string }) => Promise<RevisionIface>;\n previewCredentialPolicy: (\n args: DefinitionRefIface & PreviewCredentialPolicyRequestIface,\n ) => Promise<CredentialPolicyPreviewIface>;\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<{ definitions: DefinitionIface[]; nextCursor: string | null }>;\n create: (args: CreateDefinitionRequestIface & SignalOptionsIface) => Promise<DefinitionIface>;\n get: (args: DefinitionRefIface) => Promise<DefinitionIface>;\n /** Compiles the directory at `ref` server-side without publishing. */\n compile: (\n args: DefinitionRefIface & { ref: string; harness?: string },\n ) => Promise<CompileResultIface>;\n commit: (args: DefinitionRefIface & CommitDefinitionRequestIface) => Promise<CommitResultIface>;\n /** Compiles `ref`, stores a revision and makes it current. */\n publish: (\n args: DefinitionRefIface & { ref: string; note?: string },\n ) => Promise<PublishResultIface>;\n /** The agent directory's files at `ref` (default branch when omitted). */\n files: (args: DefinitionRefIface & { ref?: string }) => Promise<DefinitionFilesIface>;\n revisions: (\n args: DefinitionRefIface & { cursor?: string },\n ) => Promise<{ revisions: RevisionIface[]; nextCursor: string | null }>;\n /**\n * What changed in the compiled manifest between two revisions (revision ids\n * or numbers); `to` defaults to the current revision.\n */\n revisionDiff: (\n args: DefinitionRefIface & { from: string | number; to?: string | number },\n ) => Promise<RevisionDiffIface>;\n compatibility: (\n args: DefinitionRefIface & { harness: string; ref?: string },\n ) => Promise<CompatibilityReportIface>;\n /** The agent's live channel bindings, with the conversation each is attached to. */\n channels: (args: DefinitionRefIface) => Promise<DefinitionChannelIface[]>;\n /**\n * Attaches a channel binding to a conversation the agent and the caller take\n * part in (its events and bound-conversation schedules post there); null detaches.\n */\n attachChannel: (\n args: DefinitionRefIface & { bindingId: string; conversationId: string | null },\n ) => Promise<AttachChannelBindingResponseIface>;\n /**\n * Archives the definition: it leaves listings, its schedules and channel\n * bindings stop, and new sessions are refused. Its repository is kept.\n */\n archive: (args: DefinitionRefIface) => Promise<DefinitionIface>;\n /**\n * A short-lived, read-only git remote for a Final-hosted repository, for\n * `git clone` (owners of personal agents, organization admins otherwise).\n */\n cloneUrl: (args: DefinitionRefIface) => Promise<DefinitionCloneUrlIface>;\n}\n\nexport interface ProvidersApiIface {\n list: (options?: SignalOptionsIface) => Promise<ProviderEntryIface[]>;\n}\n\nexport interface ComputerSetupGuidesApiIface {\n list: (options?: SignalOptionsIface) => Promise<ComputerSetupGuideIface[]>;\n /** Guide by slug or id, with its versions. */\n get: (ref: string, options?: SignalOptionsIface) => Promise<ComputerSetupGuideDetailIface>;\n /** Publishes a new version (creating the guide on first publish). */\n publish: (\n args: PublishComputerSetupGuideRequestIface & SignalOptionsIface,\n ) => Promise<{ guide: ComputerSetupGuideIface; version: ComputerSetupGuideVersionIface }>;\n}\n\nexport type ScheduleRef = { scheduleId: string } | { agent: string; key: string };\n\nexport interface SchedulesApiIface {\n list: (options?: SignalOptionsIface & { agent?: string }) => Promise<ScheduleIface[]>;\n runNow: (args: ScheduleRef & SignalOptionsIface) => Promise<ScheduleRunResultIface>;\n update: (\n args: { scheduleId: string } & UpdateScheduleRequestIface & SignalOptionsIface,\n ) => Promise<ScheduleIface>;\n}\n\nconst definitionPath = (definition: string, suffix = ''): string =>\n `/v1/definitions/${encodePath(definition)}${suffix}`;\n\nexport const createDefinitionsApi = ({ http }: ClientContextIface): DefinitionsApiIface => ({\n testRevision: ({ definition, signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: definitionPath(definition, '/test-revision'),\n body: { schema: compileDefinitionRequestSchema, value },\n response: revisionSchema,\n signal,\n }),\n previewCredentialPolicy: ({ definition, signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: definitionPath(definition, '/credential-policy/preview'),\n body: { schema: previewCredentialPolicyRequestSchema, value },\n response: credentialPolicyPreviewSchema,\n signal,\n }),\n list: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/definitions',\n query: { cursor: options?.cursor, limit: options?.limit },\n response: definitionListSchema,\n signal: options?.signal,\n }),\n create: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: '/v1/definitions',\n body: { schema: createDefinitionRequestSchema, value },\n response: definitionSchema,\n signal,\n }),\n get: ({ definition, signal }) =>\n http.request({\n method: HttpMethod.Get,\n path: definitionPath(definition),\n response: definitionSchema,\n signal,\n }),\n compile: ({ definition, signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: definitionPath(definition, '/compile'),\n body: { schema: compileDefinitionRequestSchema, value },\n response: compileResultSchema,\n signal,\n }),\n commit: ({ definition, signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: definitionPath(definition, '/commit'),\n body: { schema: commitDefinitionRequestSchema, value },\n response: commitResultSchema,\n signal,\n }),\n publish: ({ definition, signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: definitionPath(definition, '/publish'),\n body: { schema: publishDefinitionRequestSchema, value },\n response: publishResultSchema,\n signal,\n }),\n files: ({ definition, ref, signal }) =>\n http.request({\n method: HttpMethod.Get,\n path: definitionPath(definition, '/files'),\n query: { ref },\n response: definitionFilesSchema,\n signal,\n }),\n revisions: ({ definition, cursor, signal }) =>\n http.request({\n method: HttpMethod.Get,\n path: definitionPath(definition, '/revisions'),\n query: { cursor },\n response: revisionListSchema,\n signal,\n }),\n revisionDiff: ({ definition, from, to, signal }) =>\n http.request({\n method: HttpMethod.Get,\n path: definitionPath(definition, '/revisions/diff'),\n query: { from, to },\n response: revisionDiffSchema,\n signal,\n }),\n compatibility: ({ definition, harness, ref, signal }) =>\n http.request({\n method: HttpMethod.Get,\n path: definitionPath(definition, '/compatibility'),\n query: { harness, ref },\n response: compatibilityReportSchema,\n signal,\n }),\n channels: async ({ definition, signal }) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: definitionPath(definition, '/channels'),\n response: definitionChannelsResponseSchema,\n signal,\n })\n ).channels,\n attachChannel: ({ definition, bindingId, conversationId, signal }) =>\n http.request({\n method: HttpMethod.Put,\n path: definitionPath(definition, `/channels/${encodePath(bindingId)}/conversation`),\n body: { schema: attachChannelBindingRequestSchema, value: { conversationId } },\n response: attachChannelBindingResponseSchema,\n signal,\n }),\n archive: ({ definition, signal }) =>\n http.request({\n method: HttpMethod.Post,\n path: definitionPath(definition, '/archive'),\n response: definitionSchema,\n signal,\n }),\n cloneUrl: ({ definition, signal }) =>\n http.request({\n method: HttpMethod.Post,\n path: definitionPath(definition, '/clone-url'),\n response: definitionCloneUrlSchema,\n signal,\n }),\n});\n\nexport const createProvidersApi = ({ http }: ClientContextIface): ProvidersApiIface => ({\n list: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: '/v1/providers',\n response: providerListSchema,\n signal: options?.signal,\n })\n ).providers,\n});\n\nexport const createComputerSetupGuidesApi = ({\n http,\n}: ClientContextIface): ComputerSetupGuidesApiIface => ({\n list: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: '/v1/computer-setup-guides',\n response: computerSetupGuideListSchema,\n signal: options?.signal,\n })\n ).guides,\n get: (ref, options) =>\n http.request({\n method: HttpMethod.Get,\n path: `/v1/computer-setup-guides/${encodePath(ref)}`,\n response: computerSetupGuideDetailSchema,\n signal: options?.signal,\n }),\n publish: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: '/v1/computer-setup-guides',\n body: { schema: publishComputerSetupGuideRequestSchema, value },\n response: publishComputerSetupGuideResultSchema,\n signal,\n }),\n});\n\nexport const createSchedulesApi = ({ http }: ClientContextIface): SchedulesApiIface => {\n const list: SchedulesApiIface['list'] = async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: '/v1/schedules',\n query: { agent: options?.agent },\n response: scheduleListSchema,\n signal: options?.signal,\n })\n ).schedules;\n\n const scheduleIdOf = async (args: ScheduleRef & SignalOptionsIface): Promise<string> => {\n if ('scheduleId' in args) return args.scheduleId;\n const found = (await list({ agent: args.agent, signal: args.signal })).find(\n (schedule) => schedule.key === args.key,\n );\n if (found == null) {\n throw clientError({\n message: `No schedule ${args.key} on agent ${args.agent}`,\n status: 0,\n code: ClientErrorCode.NotFound,\n });\n }\n return found.id;\n };\n\n return {\n list,\n runNow: async (args) =>\n http.request({\n method: HttpMethod.Post,\n path: `/v1/schedules/${encodePath(await scheduleIdOf(args))}/run-now`,\n response: scheduleRunResultSchema,\n signal: args.signal,\n }),\n update: ({ scheduleId, signal, ...value }) =>\n http.request({\n method: HttpMethod.Patch,\n path: `/v1/schedules/${encodePath(scheduleId)}`,\n body: { schema: updateScheduleRequestSchema, value },\n response: scheduleSchema,\n signal,\n }),\n };\n};\n"],
|
|
5
|
-
"mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAwBK;AACP,SAAS,kBAAoE;AAC7E,SAAS,aAAa,uBAAuB;AAC7C,SAAS,kBAAkB;
|
|
4
|
+
"sourcesContent": ["import {\n attachChannelBindingRequestSchema,\n attachChannelBindingResponseSchema,\n commitDefinitionRequestSchema,\n commitResultSchema,\n compatibilityReportSchema,\n compileDefinitionRequestSchema,\n compileResultSchema,\n computerSetupGuideDetailSchema,\n computerSetupGuideListSchema,\n createDefinitionRequestSchema,\n credentialPolicyPreviewSchema,\n definitionChannelsResponseSchema,\n definitionCloneUrlSchema,\n definitionFilesSchema,\n definitionListSchema,\n definitionSchema,\n previewCredentialPolicyRequestSchema,\n providerListSchema,\n publishComputerSetupGuideRequestSchema,\n publishComputerSetupGuideResultSchema,\n publishDefinitionRequestSchema,\n publishResultSchema,\n revisionDiffSchema,\n revisionListSchema,\n revisionSchema,\n scheduleListSchema,\n scheduleRunResultSchema,\n scheduleSchema,\n updateScheduleRequestSchema,\n type AttachChannelBindingResponseIface,\n type CommitDefinitionRequestIface,\n type CommitResultIface,\n type CompatibilityReportIface,\n type CompileResultIface,\n type ComputerSetupGuideDetailIface,\n type ComputerSetupGuideIface,\n type ComputerSetupGuideVersionIface,\n type CreateDefinitionRequestIface,\n type CredentialPolicyPreviewIface,\n type DefinitionChannelIface,\n type DefinitionCloneUrlIface,\n type DefinitionFilesIface,\n type DefinitionIface,\n type PreviewCredentialPolicyRequestIface,\n type ProviderEntryIface,\n type PublishComputerSetupGuideRequestIface,\n type PublishResultIface,\n type RevisionDiffIface,\n type RevisionIface,\n type ScheduleIface,\n type ScheduleRunResultIface,\n type UpdateScheduleRequestIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport { encodePath, type ClientContextIface, type SignalOptionsIface } from \"./context.mjs\";\nimport { clientError, ClientErrorCode } from \"./errors.mjs\";\nimport { HttpMethod } from \"./http.mjs\";\n\n// Definitions, providers, setup guides, schedules, credentials and budgets:\n// what Build, settings and CI use.\n\nexport interface DefinitionRefIface extends SignalOptionsIface {\n /** Definition id or slug. */\n definition: string;\n}\n\nexport interface DefinitionsApiIface {\n /** Compiles a draft into an immutable test snapshot without publishing or activating schedules/channels. */\n testRevision: (args: DefinitionRefIface & { ref: string }) => Promise<RevisionIface>;\n previewCredentialPolicy: (\n args: DefinitionRefIface & PreviewCredentialPolicyRequestIface,\n ) => Promise<CredentialPolicyPreviewIface>;\n /**\n * With `projectId`, its definitions and those inherited from its ancestors. Without it,\n * everything the caller can access (an API key: its parent project and every project it is\n * granted; a person: every project they can read).\n */\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number; projectId?: string },\n ) => Promise<{ definitions: DefinitionIface[]; nextCursor: string | null }>;\n /**\n * Creates the definition in `projectId` (editors of that project); omitted, the API key's parent\n * project (a signed-in person's: My Work).\n */\n create: (args: CreateDefinitionRequestIface & SignalOptionsIface) => Promise<DefinitionIface>;\n get: (args: DefinitionRefIface) => Promise<DefinitionIface>;\n /** Compiles the directory at `ref` server-side without publishing. */\n compile: (\n args: DefinitionRefIface & { ref: string; harness?: string },\n ) => Promise<CompileResultIface>;\n commit: (args: DefinitionRefIface & CommitDefinitionRequestIface) => Promise<CommitResultIface>;\n /** Compiles `ref`, stores a revision and makes it current. */\n publish: (\n args: DefinitionRefIface & { ref: string; note?: string },\n ) => Promise<PublishResultIface>;\n /** The agent directory's files at `ref` (default branch when omitted). */\n files: (args: DefinitionRefIface & { ref?: string }) => Promise<DefinitionFilesIface>;\n revisions: (\n args: DefinitionRefIface & { cursor?: string },\n ) => Promise<{ revisions: RevisionIface[]; nextCursor: string | null }>;\n /**\n * What changed in the compiled manifest between two revisions (revision ids\n * or numbers); `to` defaults to the current revision.\n */\n revisionDiff: (\n args: DefinitionRefIface & { from: string | number; to?: string | number },\n ) => Promise<RevisionDiffIface>;\n compatibility: (\n args: DefinitionRefIface & { harness: string; ref?: string },\n ) => Promise<CompatibilityReportIface>;\n /** The agent's live channel bindings, with the conversation each is attached to. */\n channels: (args: DefinitionRefIface) => Promise<DefinitionChannelIface[]>;\n /**\n * Attaches a channel binding to a conversation the agent and the caller take\n * part in (its events and bound-conversation schedules post there); null detaches.\n */\n attachChannel: (\n args: DefinitionRefIface & { bindingId: string; conversationId: string | null },\n ) => Promise<AttachChannelBindingResponseIface>;\n /**\n * Archives the definition: it leaves listings, its schedules and channel\n * bindings stop, and new sessions are refused. Its repository is kept.\n */\n archive: (args: DefinitionRefIface) => Promise<DefinitionIface>;\n /**\n * A short-lived, read-only git remote for a Final-hosted repository, for\n * `git clone` (editors of the definition's project).\n */\n cloneUrl: (args: DefinitionRefIface) => Promise<DefinitionCloneUrlIface>;\n}\n\nexport interface ProvidersApiIface {\n list: (options?: SignalOptionsIface) => Promise<ProviderEntryIface[]>;\n}\n\nexport interface ComputerSetupGuidesApiIface {\n list: (options?: SignalOptionsIface) => Promise<ComputerSetupGuideIface[]>;\n /** Guide by slug or id, with its versions. */\n get: (ref: string, options?: SignalOptionsIface) => Promise<ComputerSetupGuideDetailIface>;\n /** Publishes a new version (creating the guide on first publish). */\n publish: (\n args: PublishComputerSetupGuideRequestIface & SignalOptionsIface,\n ) => Promise<{ guide: ComputerSetupGuideIface; version: ComputerSetupGuideVersionIface }>;\n}\n\nexport type ScheduleRef = { scheduleId: string } | { agent: string; key: string };\n\nexport interface SchedulesApiIface {\n list: (options?: SignalOptionsIface & { agent?: string }) => Promise<ScheduleIface[]>;\n runNow: (args: ScheduleRef & SignalOptionsIface) => Promise<ScheduleRunResultIface>;\n update: (\n args: { scheduleId: string } & UpdateScheduleRequestIface & SignalOptionsIface,\n ) => Promise<ScheduleIface>;\n}\n\nconst definitionPath = (definition: string, suffix = ''): string =>\n `/v1/definitions/${encodePath(definition)}${suffix}`;\n\nexport const createDefinitionsApi = ({ http }: ClientContextIface): DefinitionsApiIface => ({\n testRevision: ({ definition, signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: definitionPath(definition, '/test-revision'),\n body: { schema: compileDefinitionRequestSchema, value },\n response: revisionSchema,\n signal,\n }),\n previewCredentialPolicy: ({ definition, signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: definitionPath(definition, '/credential-policy/preview'),\n body: { schema: previewCredentialPolicyRequestSchema, value },\n response: credentialPolicyPreviewSchema,\n signal,\n }),\n list: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/definitions',\n query: { cursor: options?.cursor, limit: options?.limit, projectId: options?.projectId },\n response: definitionListSchema,\n signal: options?.signal,\n }),\n create: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: '/v1/definitions',\n body: { schema: createDefinitionRequestSchema, value },\n response: definitionSchema,\n signal,\n }),\n get: ({ definition, signal }) =>\n http.request({\n method: HttpMethod.Get,\n path: definitionPath(definition),\n response: definitionSchema,\n signal,\n }),\n compile: ({ definition, signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: definitionPath(definition, '/compile'),\n body: { schema: compileDefinitionRequestSchema, value },\n response: compileResultSchema,\n signal,\n }),\n commit: ({ definition, signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: definitionPath(definition, '/commit'),\n body: { schema: commitDefinitionRequestSchema, value },\n response: commitResultSchema,\n signal,\n }),\n publish: ({ definition, signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: definitionPath(definition, '/publish'),\n body: { schema: publishDefinitionRequestSchema, value },\n response: publishResultSchema,\n signal,\n }),\n files: ({ definition, ref, signal }) =>\n http.request({\n method: HttpMethod.Get,\n path: definitionPath(definition, '/files'),\n query: { ref },\n response: definitionFilesSchema,\n signal,\n }),\n revisions: ({ definition, cursor, signal }) =>\n http.request({\n method: HttpMethod.Get,\n path: definitionPath(definition, '/revisions'),\n query: { cursor },\n response: revisionListSchema,\n signal,\n }),\n revisionDiff: ({ definition, from, to, signal }) =>\n http.request({\n method: HttpMethod.Get,\n path: definitionPath(definition, '/revisions/diff'),\n query: { from, to },\n response: revisionDiffSchema,\n signal,\n }),\n compatibility: ({ definition, harness, ref, signal }) =>\n http.request({\n method: HttpMethod.Get,\n path: definitionPath(definition, '/compatibility'),\n query: { harness, ref },\n response: compatibilityReportSchema,\n signal,\n }),\n channels: async ({ definition, signal }) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: definitionPath(definition, '/channels'),\n response: definitionChannelsResponseSchema,\n signal,\n })\n ).channels,\n attachChannel: ({ definition, bindingId, conversationId, signal }) =>\n http.request({\n method: HttpMethod.Put,\n path: definitionPath(definition, `/channels/${encodePath(bindingId)}/conversation`),\n body: { schema: attachChannelBindingRequestSchema, value: { conversationId } },\n response: attachChannelBindingResponseSchema,\n signal,\n }),\n archive: ({ definition, signal }) =>\n http.request({\n method: HttpMethod.Post,\n path: definitionPath(definition, '/archive'),\n response: definitionSchema,\n signal,\n }),\n cloneUrl: ({ definition, signal }) =>\n http.request({\n method: HttpMethod.Post,\n path: definitionPath(definition, '/clone-url'),\n response: definitionCloneUrlSchema,\n signal,\n }),\n});\n\nexport const createProvidersApi = ({ http }: ClientContextIface): ProvidersApiIface => ({\n list: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: '/v1/providers',\n response: providerListSchema,\n signal: options?.signal,\n })\n ).providers,\n});\n\nexport const createComputerSetupGuidesApi = ({\n http,\n}: ClientContextIface): ComputerSetupGuidesApiIface => ({\n list: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: '/v1/computer-setup-guides',\n response: computerSetupGuideListSchema,\n signal: options?.signal,\n })\n ).guides,\n get: (ref, options) =>\n http.request({\n method: HttpMethod.Get,\n path: `/v1/computer-setup-guides/${encodePath(ref)}`,\n response: computerSetupGuideDetailSchema,\n signal: options?.signal,\n }),\n publish: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: '/v1/computer-setup-guides',\n body: { schema: publishComputerSetupGuideRequestSchema, value },\n response: publishComputerSetupGuideResultSchema,\n signal,\n }),\n});\n\nexport const createSchedulesApi = ({ http }: ClientContextIface): SchedulesApiIface => {\n const list: SchedulesApiIface['list'] = async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: '/v1/schedules',\n query: { agent: options?.agent },\n response: scheduleListSchema,\n signal: options?.signal,\n })\n ).schedules;\n\n const scheduleIdOf = async (args: ScheduleRef & SignalOptionsIface): Promise<string> => {\n if ('scheduleId' in args) return args.scheduleId;\n const found = (await list({ agent: args.agent, signal: args.signal })).find(\n (schedule) => schedule.key === args.key,\n );\n if (found == null) {\n throw clientError({\n message: `No schedule ${args.key} on agent ${args.agent}`,\n status: 0,\n code: ClientErrorCode.NotFound,\n });\n }\n return found.id;\n };\n\n return {\n list,\n runNow: async (args) =>\n http.request({\n method: HttpMethod.Post,\n path: `/v1/schedules/${encodePath(await scheduleIdOf(args))}/run-now`,\n response: scheduleRunResultSchema,\n signal: args.signal,\n }),\n update: ({ scheduleId, signal, ...value }) =>\n http.request({\n method: HttpMethod.Patch,\n path: `/v1/schedules/${encodePath(scheduleId)}`,\n body: { schema: updateScheduleRequestSchema, value },\n response: scheduleSchema,\n signal,\n }),\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -9,9 +9,8 @@ import { type GatewayConnect, type RealtimeTransportIface } from "./realtime.mjs
|
|
|
9
9
|
import { type SessionsApiIface } from "./sessions.mjs";
|
|
10
10
|
export interface CreateClientOptionsIface {
|
|
11
11
|
/**
|
|
12
|
-
* The
|
|
13
|
-
*
|
|
14
|
-
* under (console-server's `https://<console>/api/agent-platform` proxy).
|
|
12
|
+
* The agents API origin (`https://agent-session.final.ai`; its API is under
|
|
13
|
+
* `/api` and ACP at `/acp/ws`), or a base URL the API routes are mounted under.
|
|
15
14
|
*/
|
|
16
15
|
host: string;
|
|
17
16
|
auth: AgentClientAuth;
|
|
@@ -42,9 +41,15 @@ export interface AgentHandleIface {
|
|
|
42
41
|
info: (options?: SignalOptionsIface) => Promise<AgentInfoIface>;
|
|
43
42
|
}
|
|
44
43
|
export interface AgentsApiIface {
|
|
44
|
+
/**
|
|
45
|
+
* The agents the caller can use; with `projectId`, those usable there (its own and those
|
|
46
|
+
* inherited from its ancestors). Without it, everything the caller can access (an API key: its
|
|
47
|
+
* parent project and every project it is granted; a person: every project they can read).
|
|
48
|
+
*/
|
|
45
49
|
list: (options?: SignalOptionsIface & {
|
|
46
50
|
cursor?: string;
|
|
47
51
|
limit?: number;
|
|
52
|
+
projectId?: string;
|
|
48
53
|
}) => Promise<AgentListIface>;
|
|
49
54
|
/** I/O-free handle by slug or id. */
|
|
50
55
|
get: (slugOrId: string) => AgentHandleIface;
|
|
@@ -79,7 +84,7 @@ export interface AgentClientIface {
|
|
|
79
84
|
schedules: SchedulesApiIface;
|
|
80
85
|
/**
|
|
81
86
|
* ACP-native access (`/acp/ws`): an ACP v2 ClientApp connection on which the
|
|
82
|
-
*
|
|
87
|
+
* agents API is the agent. The ACP SDK loads on the first `connect`.
|
|
83
88
|
*/
|
|
84
89
|
acp: AcpApiIface;
|
|
85
90
|
/**
|
|
@@ -111,7 +111,11 @@ const createClient = (options) => {
|
|
|
111
111
|
list: (listOptions) => http.request({
|
|
112
112
|
method: HttpMethod.Get,
|
|
113
113
|
path: "/v1/agents",
|
|
114
|
-
query: {
|
|
114
|
+
query: {
|
|
115
|
+
cursor: listOptions?.cursor,
|
|
116
|
+
limit: listOptions?.limit,
|
|
117
|
+
projectId: listOptions?.projectId
|
|
118
|
+
},
|
|
115
119
|
response: agentListSchema,
|
|
116
120
|
signal: listOptions?.signal
|
|
117
121
|
}),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/agent-client/client.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n agentInfoSchema,\n agentListSchema,\n agentRealtimeTopics,\n healthResponseSchema,\n personListSchema,\n realtimeSessionResponseSchema,\n type AgentInfoIface,\n type AgentListIface,\n type HealthResponseIface,\n type PersonIface,\n type PersonListIface,\n type RealtimeSessionResponseIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport { createAcpApi, type AcpApiIface } from \"./acp.mjs\";\nimport {\n createComputerSetupGuidesApi,\n createDefinitionsApi,\n createProvidersApi,\n createSchedulesApi,\n type ComputerSetupGuidesApiIface,\n type DefinitionsApiIface,\n type ProvidersApiIface,\n type SchedulesApiIface,\n} from \"./build.mjs\";\nimport { encodePath, type ClientContextIface, type SignalOptionsIface } from \"./context.mjs\";\nimport { createConversationsApi, type ConversationsApiIface } from \"./conversations.mjs\";\nimport { clientError, ClientErrorCode } from \"./errors.mjs\";\nimport { defaultStreamTiming, type StreamTimingIface } from \"./frame-stream.mjs\";\nimport {\n createHttp,\n HttpMethod,\n type AgentClientAuth,\n type FetchIface,\n type HeadersOption,\n} from \"./http.mjs\";\nimport {\n createGatewayRealtimeTransport,\n type GatewayConnect,\n type GatewayRealtimeTransportIface,\n type RealtimeTransportIface,\n} from \"./realtime.mjs\";\nimport { createSessionsApi, type SessionsApiIface } from \"./sessions.mjs\";\n\nexport interface CreateClientOptionsIface {\n /**\n * The session service's origin (`https://agent-session.final.ai`; its API is\n * under `/api` and ACP at `/acp/ws`), or a base URL the API routes are mounted\n * under (console-server's `https://<console>/api/agent-platform` proxy).\n */\n host: string;\n auth: AgentClientAuth;\n /** Extra headers per request; console clients send their client identity header here. */\n headers?: HeadersOption;\n /** API requests (the host's routes); carries auth and caller headers. */\n fetch?: FetchIface;\n /**\n * Presigned storage requests (attachment uploads). Gets only the headers the\n * presign requires, never auth, client identity or cookies, so a storage\n * bucket's CORS and third-party hosts see nothing of the caller. Defaults to\n * `globalThis.fetch`; keep it free of header-injecting wrappers.\n */\n storageFetch?: FetchIface;\n /** console-web and console-mobile pass their realtime clients; defaults to a gateway connection. */\n realtime?: RealtimeTransportIface;\n /** Seam for the default transport's gateway connection. */\n gatewayConnect?: GatewayConnect;\n /** Seam for stream retry timing (tests). */\n timing?: Partial<StreamTimingIface>;\n /** Seam for idempotency keys and client message ids; defaults to `crypto.randomUUID`. */\n newKey?: () => string;\n /** Seam for the client clock (conversation recovery windows). */\n now?: () => number;\n}\n\nexport interface AgentHandleIface {\n slug: string;\n info: (options?: SignalOptionsIface) => Promise<AgentInfoIface>;\n}\n\nexport interface AgentsApiIface {\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<AgentListIface>;\n /** I/O-free handle by slug or id. */\n get: (slugOrId: string) => AgentHandleIface;\n}\n\nexport interface PeopleApiIface {\n /** One page of the caller's organization members, by name; pass `nextCursor` as `cursor` for the next. */\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<PersonListIface>;\n /** Every member of the caller's organization (all pages). */\n all: (options?: SignalOptionsIface) => Promise<PersonIface[]>;\n}\n\nexport interface RealtimeApiIface {\n /**\n * Mints a gateway session (`POST /v1/realtime/session`) for the signed-in user:\n * the gateway URL, a short-lived token, and the user id realtime topics are keyed by.\n * Pass it as `createSession` to `createGatewayRealtimeTransport` when supplying a transport.\n */\n createSession: (options?: SignalOptionsIface) => Promise<RealtimeSessionResponseIface>;\n}\n\nexport interface AgentClientIface {\n health: (options?: SignalOptionsIface) => Promise<HealthResponseIface>;\n agents: AgentsApiIface;\n people: PeopleApiIface;\n realtime: RealtimeApiIface;\n sessions: SessionsApiIface;\n conversations: ConversationsApiIface;\n definitions: DefinitionsApiIface;\n providers: ProvidersApiIface;\n computerSetupGuides: ComputerSetupGuidesApiIface;\n schedules: SchedulesApiIface;\n /**\n * ACP-native access (`/acp/ws`): an ACP v2 ClientApp connection on which the\n * session service is the agent. The ACP SDK loads on the first `connect`.\n */\n acp: AcpApiIface;\n /**\n * Ends every stream (they reject with a `client_closed` ClientError) and, when\n * the client created its own realtime transport, closes the gateway connection\n * and cancels its retries. A transport passed in `realtime` belongs to the\n * caller and is left open. Idempotent.\n */\n close: () => void;\n [Symbol.asyncDispose]: () => Promise<void>;\n}\n\nexport const createClient = (options: CreateClientOptionsIface): AgentClientIface => {\n const http = createHttp({\n host: options.host,\n auth: options.auth,\n headers: options.headers,\n fetch: options.fetch,\n });\n let realtime = options.realtime ?? null;\n let ownTransport: GatewayRealtimeTransportIface | null = null;\n const closing = new AbortController();\n const createRealtimeSession: RealtimeApiIface['createSession'] = (sessionOptions) =>\n http.request({\n method: HttpMethod.Post,\n path: '/v1/realtime/session',\n response: realtimeSessionResponseSchema,\n signal: sessionOptions?.signal,\n });\n let realtimeOwner: Promise<RealtimeSessionResponseIface> | null = null;\n const realtimeOwnerSession = () => {\n if (realtimeOwner != null) return realtimeOwner;\n const pending = createRealtimeSession({ signal: closing.signal });\n realtimeOwner = pending;\n void pending.catch(() => {\n if (realtimeOwner === pending) realtimeOwner = null;\n });\n return pending;\n };\n let realtimeUser: Promise<string> | null = null;\n // Shared by every stream, so it is cancelled only with the client, never by one caller.\n const realtimeUserId: ClientContextIface['realtimeUserId'] = () => {\n if (realtimeUser != null) return realtimeUser;\n const pending = realtimeOwnerSession().then((session) => {\n if (session.userId == null)\n throw new Error('This client authenticates as an API-key owner, not a user');\n return session.userId;\n });\n realtimeUser = pending;\n // A failed (or aborted) read is not cached.\n pending.catch(() => {\n if (realtimeUser === pending) realtimeUser = null;\n });\n return pending;\n };\n const context: ClientContextIface = {\n http,\n closeSignal: closing.signal,\n realtimeUserId,\n // Conversations is the only collection.\n realtimeCollectionTopic: async () => {\n const owner = await realtimeOwnerSession();\n // Organization and team keys are no conversation members: they reach agents through channels.\n if (owner.userId == null)\n throw new Error('Collection streams belong to users; API-key owners use session streams');\n return agentRealtimeTopics.userConversations(owner.userId);\n },\n storageFetch: options.storageFetch ?? ((input, init) => globalThis.fetch(input, init)),\n realtime: () => {\n if (realtime != null) return realtime;\n ownTransport = createGatewayRealtimeTransport({\n createSession: () => createRealtimeSession(),\n connect: options.gatewayConnect,\n });\n if (closing.signal.aborted) ownTransport.close();\n realtime = ownTransport;\n return realtime;\n },\n timing: { ...defaultStreamTiming, ...options.timing },\n newKey: options.newKey ?? (() => globalThis.crypto.randomUUID()),\n now: options.now ?? Date.now,\n };\n\n const close = (): void => {\n if (closing.signal.aborted) return;\n closing.abort(\n clientError({ message: 'Agent client closed', status: 0, code: ClientErrorCode.Closed }),\n );\n ownTransport?.close();\n };\n\n return {\n close,\n [Symbol.asyncDispose]: async () => close(),\n health: (healthOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/health',\n response: healthResponseSchema,\n signal: healthOptions?.signal,\n }),\n agents: {\n list: (listOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/agents',\n query: { cursor: listOptions?.cursor, limit: listOptions?.limit },\n response: agentListSchema,\n signal: listOptions?.signal,\n }),\n get: (slugOrId) => ({\n slug: slugOrId,\n info: (infoOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: `/v1/agents/${encodePath(slugOrId)}`,\n response: agentInfoSchema,\n signal: infoOptions?.signal,\n }),\n }),\n },\n people: (() => {\n const list: PeopleApiIface['list'] = (listOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/people',\n query: { cursor: listOptions?.cursor, limit: listOptions?.limit },\n response: personListSchema,\n signal: listOptions?.signal,\n });\n return {\n list,\n all: async (allOptions) => {\n const all: PersonIface[] = [];\n let cursor: string | undefined;\n for (;;) {\n const next = await list({ cursor, signal: allOptions?.signal });\n all.push(...next.people);\n if (next.nextCursor == null) return all;\n cursor = next.nextCursor;\n }\n },\n };\n })(),\n realtime: { createSession: createRealtimeSession },\n sessions: createSessionsApi(context),\n conversations: createConversationsApi(context),\n definitions: createDefinitionsApi(context),\n providers: createProvidersApi(context),\n computerSetupGuides: createComputerSetupGuidesApi(context),\n schedules: createSchedulesApi(context),\n acp: createAcpApi({ http }),\n };\n};\n"],
|
|
5
|
-
"mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAOK;AACP,SAAS,oBAAsC;AAC/C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;AACP,SAAS,kBAAoE;AAC7E,SAAS,8BAA0D;AACnE,SAAS,aAAa,uBAAuB;AAC7C,SAAS,2BAAmD;AAC5D;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AACP;AAAA,EACE;AAAA,OAIK;AACP,SAAS,yBAAgD;
|
|
4
|
+
"sourcesContent": ["import {\n agentInfoSchema,\n agentListSchema,\n agentRealtimeTopics,\n healthResponseSchema,\n personListSchema,\n realtimeSessionResponseSchema,\n type AgentInfoIface,\n type AgentListIface,\n type HealthResponseIface,\n type PersonIface,\n type PersonListIface,\n type RealtimeSessionResponseIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport { createAcpApi, type AcpApiIface } from \"./acp.mjs\";\nimport {\n createComputerSetupGuidesApi,\n createDefinitionsApi,\n createProvidersApi,\n createSchedulesApi,\n type ComputerSetupGuidesApiIface,\n type DefinitionsApiIface,\n type ProvidersApiIface,\n type SchedulesApiIface,\n} from \"./build.mjs\";\nimport { encodePath, type ClientContextIface, type SignalOptionsIface } from \"./context.mjs\";\nimport { createConversationsApi, type ConversationsApiIface } from \"./conversations.mjs\";\nimport { clientError, ClientErrorCode } from \"./errors.mjs\";\nimport { defaultStreamTiming, type StreamTimingIface } from \"./frame-stream.mjs\";\nimport {\n createHttp,\n HttpMethod,\n type AgentClientAuth,\n type FetchIface,\n type HeadersOption,\n} from \"./http.mjs\";\nimport {\n createGatewayRealtimeTransport,\n type GatewayConnect,\n type GatewayRealtimeTransportIface,\n type RealtimeTransportIface,\n} from \"./realtime.mjs\";\nimport { createSessionsApi, type SessionsApiIface } from \"./sessions.mjs\";\n\nexport interface CreateClientOptionsIface {\n /**\n * The agents API origin (`https://agent-session.final.ai`; its API is under\n * `/api` and ACP at `/acp/ws`), or a base URL the API routes are mounted under.\n */\n host: string;\n auth: AgentClientAuth;\n /** Extra headers per request; console clients send their client identity header here. */\n headers?: HeadersOption;\n /** API requests (the host's routes); carries auth and caller headers. */\n fetch?: FetchIface;\n /**\n * Presigned storage requests (attachment uploads). Gets only the headers the\n * presign requires, never auth, client identity or cookies, so a storage\n * bucket's CORS and third-party hosts see nothing of the caller. Defaults to\n * `globalThis.fetch`; keep it free of header-injecting wrappers.\n */\n storageFetch?: FetchIface;\n /** console-web and console-mobile pass their realtime clients; defaults to a gateway connection. */\n realtime?: RealtimeTransportIface;\n /** Seam for the default transport's gateway connection. */\n gatewayConnect?: GatewayConnect;\n /** Seam for stream retry timing (tests). */\n timing?: Partial<StreamTimingIface>;\n /** Seam for idempotency keys and client message ids; defaults to `crypto.randomUUID`. */\n newKey?: () => string;\n /** Seam for the client clock (conversation recovery windows). */\n now?: () => number;\n}\n\nexport interface AgentHandleIface {\n slug: string;\n info: (options?: SignalOptionsIface) => Promise<AgentInfoIface>;\n}\n\nexport interface AgentsApiIface {\n /**\n * The agents the caller can use; with `projectId`, those usable there (its own and those\n * inherited from its ancestors). Without it, everything the caller can access (an API key: its\n * parent project and every project it is granted; a person: every project they can read).\n */\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number; projectId?: string },\n ) => Promise<AgentListIface>;\n /** I/O-free handle by slug or id. */\n get: (slugOrId: string) => AgentHandleIface;\n}\n\nexport interface PeopleApiIface {\n /** One page of the caller's organization members, by name; pass `nextCursor` as `cursor` for the next. */\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<PersonListIface>;\n /** Every member of the caller's organization (all pages). */\n all: (options?: SignalOptionsIface) => Promise<PersonIface[]>;\n}\n\nexport interface RealtimeApiIface {\n /**\n * Mints a gateway session (`POST /v1/realtime/session`) for the signed-in user:\n * the gateway URL, a short-lived token, and the user id realtime topics are keyed by.\n * Pass it as `createSession` to `createGatewayRealtimeTransport` when supplying a transport.\n */\n createSession: (options?: SignalOptionsIface) => Promise<RealtimeSessionResponseIface>;\n}\n\nexport interface AgentClientIface {\n health: (options?: SignalOptionsIface) => Promise<HealthResponseIface>;\n agents: AgentsApiIface;\n people: PeopleApiIface;\n realtime: RealtimeApiIface;\n sessions: SessionsApiIface;\n conversations: ConversationsApiIface;\n definitions: DefinitionsApiIface;\n providers: ProvidersApiIface;\n computerSetupGuides: ComputerSetupGuidesApiIface;\n schedules: SchedulesApiIface;\n /**\n * ACP-native access (`/acp/ws`): an ACP v2 ClientApp connection on which the\n * agents API is the agent. The ACP SDK loads on the first `connect`.\n */\n acp: AcpApiIface;\n /**\n * Ends every stream (they reject with a `client_closed` ClientError) and, when\n * the client created its own realtime transport, closes the gateway connection\n * and cancels its retries. A transport passed in `realtime` belongs to the\n * caller and is left open. Idempotent.\n */\n close: () => void;\n [Symbol.asyncDispose]: () => Promise<void>;\n}\n\nexport const createClient = (options: CreateClientOptionsIface): AgentClientIface => {\n const http = createHttp({\n host: options.host,\n auth: options.auth,\n headers: options.headers,\n fetch: options.fetch,\n });\n let realtime = options.realtime ?? null;\n let ownTransport: GatewayRealtimeTransportIface | null = null;\n const closing = new AbortController();\n const createRealtimeSession: RealtimeApiIface['createSession'] = (sessionOptions) =>\n http.request({\n method: HttpMethod.Post,\n path: '/v1/realtime/session',\n response: realtimeSessionResponseSchema,\n signal: sessionOptions?.signal,\n });\n let realtimeOwner: Promise<RealtimeSessionResponseIface> | null = null;\n const realtimeOwnerSession = () => {\n if (realtimeOwner != null) return realtimeOwner;\n const pending = createRealtimeSession({ signal: closing.signal });\n realtimeOwner = pending;\n void pending.catch(() => {\n if (realtimeOwner === pending) realtimeOwner = null;\n });\n return pending;\n };\n let realtimeUser: Promise<string> | null = null;\n // Shared by every stream, so it is cancelled only with the client, never by one caller.\n const realtimeUserId: ClientContextIface['realtimeUserId'] = () => {\n if (realtimeUser != null) return realtimeUser;\n const pending = realtimeOwnerSession().then((session) => {\n if (session.userId == null)\n throw new Error('This client authenticates as an API-key owner, not a user');\n return session.userId;\n });\n realtimeUser = pending;\n // A failed (or aborted) read is not cached.\n pending.catch(() => {\n if (realtimeUser === pending) realtimeUser = null;\n });\n return pending;\n };\n const context: ClientContextIface = {\n http,\n closeSignal: closing.signal,\n realtimeUserId,\n // Conversations is the only collection.\n realtimeCollectionTopic: async () => {\n const owner = await realtimeOwnerSession();\n // API keys act in their project, not as members: they reach agents through channels.\n if (owner.userId == null)\n throw new Error('Collection streams belong to users; API-key owners use session streams');\n return agentRealtimeTopics.userConversations(owner.userId);\n },\n storageFetch: options.storageFetch ?? ((input, init) => globalThis.fetch(input, init)),\n realtime: () => {\n if (realtime != null) return realtime;\n ownTransport = createGatewayRealtimeTransport({\n createSession: () => createRealtimeSession(),\n connect: options.gatewayConnect,\n });\n if (closing.signal.aborted) ownTransport.close();\n realtime = ownTransport;\n return realtime;\n },\n timing: { ...defaultStreamTiming, ...options.timing },\n newKey: options.newKey ?? (() => globalThis.crypto.randomUUID()),\n now: options.now ?? Date.now,\n };\n\n const close = (): void => {\n if (closing.signal.aborted) return;\n closing.abort(\n clientError({ message: 'Agent client closed', status: 0, code: ClientErrorCode.Closed }),\n );\n ownTransport?.close();\n };\n\n return {\n close,\n [Symbol.asyncDispose]: async () => close(),\n health: (healthOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/health',\n response: healthResponseSchema,\n signal: healthOptions?.signal,\n }),\n agents: {\n list: (listOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/agents',\n query: {\n cursor: listOptions?.cursor,\n limit: listOptions?.limit,\n projectId: listOptions?.projectId,\n },\n response: agentListSchema,\n signal: listOptions?.signal,\n }),\n get: (slugOrId) => ({\n slug: slugOrId,\n info: (infoOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: `/v1/agents/${encodePath(slugOrId)}`,\n response: agentInfoSchema,\n signal: infoOptions?.signal,\n }),\n }),\n },\n people: (() => {\n const list: PeopleApiIface['list'] = (listOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/people',\n query: { cursor: listOptions?.cursor, limit: listOptions?.limit },\n response: personListSchema,\n signal: listOptions?.signal,\n });\n return {\n list,\n all: async (allOptions) => {\n const all: PersonIface[] = [];\n let cursor: string | undefined;\n for (;;) {\n const next = await list({ cursor, signal: allOptions?.signal });\n all.push(...next.people);\n if (next.nextCursor == null) return all;\n cursor = next.nextCursor;\n }\n },\n };\n })(),\n realtime: { createSession: createRealtimeSession },\n sessions: createSessionsApi(context),\n conversations: createConversationsApi(context),\n definitions: createDefinitionsApi(context),\n providers: createProvidersApi(context),\n computerSetupGuides: createComputerSetupGuidesApi(context),\n schedules: createSchedulesApi(context),\n acp: createAcpApi({ http }),\n };\n};\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAOK;AACP,SAAS,oBAAsC;AAC/C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;AACP,SAAS,kBAAoE;AAC7E,SAAS,8BAA0D;AACnE,SAAS,aAAa,uBAAuB;AAC7C,SAAS,2BAAmD;AAC5D;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AACP;AAAA,EACE;AAAA,OAIK;AACP,SAAS,yBAAgD;AA8FlD,MAAM,eAAe,CAAC,YAAwD;AACnF,QAAM,OAAO,WAAW;AAAA,IACtB,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,EACjB,CAAC;AACD,MAAI,WAAW,QAAQ,YAAY;AACnC,MAAI,eAAqD;AACzD,QAAM,UAAU,IAAI,gBAAgB;AACpC,QAAM,wBAA2D,CAAC,mBAChE,KAAK,QAAQ;AAAA,IACX,QAAQ,WAAW;AAAA,IACnB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ,gBAAgB;AAAA,EAC1B,CAAC;AACH,MAAI,gBAA8D;AAClE,QAAM,uBAAuB,MAAM;AACjC,QAAI,iBAAiB,KAAM,QAAO;AAClC,UAAM,UAAU,sBAAsB,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAChE,oBAAgB;AAChB,SAAK,QAAQ,MAAM,MAAM;AACvB,UAAI,kBAAkB,QAAS,iBAAgB;AAAA,IACjD,CAAC;AACD,WAAO;AAAA,EACT;AACA,MAAI,eAAuC;AAE3C,QAAM,iBAAuD,MAAM;AACjE,QAAI,gBAAgB,KAAM,QAAO;AACjC,UAAM,UAAU,qBAAqB,EAAE,KAAK,CAAC,YAAY;AACvD,UAAI,QAAQ,UAAU;AACpB,cAAM,IAAI,MAAM,2DAA2D;AAC7E,aAAO,QAAQ;AAAA,IACjB,CAAC;AACD,mBAAe;AAEf,YAAQ,MAAM,MAAM;AAClB,UAAI,iBAAiB,QAAS,gBAAe;AAAA,IAC/C,CAAC;AACD,WAAO;AAAA,EACT;AACA,QAAM,UAA8B;AAAA,IAClC;AAAA,IACA,aAAa,QAAQ;AAAA,IACrB;AAAA;AAAA,IAEA,yBAAyB,YAAY;AACnC,YAAM,QAAQ,MAAM,qBAAqB;AAEzC,UAAI,MAAM,UAAU;AAClB,cAAM,IAAI,MAAM,wEAAwE;AAC1F,aAAO,oBAAoB,kBAAkB,MAAM,MAAM;AAAA,IAC3D;AAAA,IACA,cAAc,QAAQ,iBAAiB,CAAC,OAAO,SAAS,WAAW,MAAM,OAAO,IAAI;AAAA,IACpF,UAAU,MAAM;AACd,UAAI,YAAY,KAAM,QAAO;AAC7B,qBAAe,+BAA+B;AAAA,QAC5C,eAAe,MAAM,sBAAsB;AAAA,QAC3C,SAAS,QAAQ;AAAA,MACnB,CAAC;AACD,UAAI,QAAQ,OAAO,QAAS,cAAa,MAAM;AAC/C,iBAAW;AACX,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,EAAE,GAAG,qBAAqB,GAAG,QAAQ,OAAO;AAAA,IACpD,QAAQ,QAAQ,WAAW,MAAM,WAAW,OAAO,WAAW;AAAA,IAC9D,KAAK,QAAQ,OAAO,KAAK;AAAA,EAC3B;AAEA,QAAM,QAAQ,MAAY;AACxB,QAAI,QAAQ,OAAO,QAAS;AAC5B,YAAQ;AAAA,MACN,YAAY,EAAE,SAAS,uBAAuB,QAAQ,GAAG,MAAM,gBAAgB,OAAO,CAAC;AAAA,IACzF;AACA,kBAAc,MAAM;AAAA,EACtB;AAEA,SAAO;AAAA,IACL;AAAA,IACA,CAAC,OAAO,YAAY,GAAG,YAAY,MAAM;AAAA,IACzC,QAAQ,CAAC,kBACP,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ,eAAe;AAAA,IACzB,CAAC;AAAA,IACH,QAAQ;AAAA,MACN,MAAM,CAAC,gBACL,KAAK,QAAQ;AAAA,QACX,QAAQ,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,OAAO;AAAA,UACL,QAAQ,aAAa;AAAA,UACrB,OAAO,aAAa;AAAA,UACpB,WAAW,aAAa;AAAA,QAC1B;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,aAAa;AAAA,MACvB,CAAC;AAAA,MACH,KAAK,CAAC,cAAc;AAAA,QAClB,MAAM;AAAA,QACN,MAAM,CAAC,gBACL,KAAK,QAAQ;AAAA,UACX,QAAQ,WAAW;AAAA,UACnB,MAAM,cAAc,WAAW,QAAQ,CAAC;AAAA,UACxC,UAAU;AAAA,UACV,QAAQ,aAAa;AAAA,QACvB,CAAC;AAAA,MACL;AAAA,IACF;AAAA,IACA,QAAS,uBAAM;AACb,YAAM,OAA+B,CAAC,gBACpC,KAAK,QAAQ;AAAA,QACX,QAAQ,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,OAAO,EAAE,QAAQ,aAAa,QAAQ,OAAO,aAAa,MAAM;AAAA,QAChE,UAAU;AAAA,QACV,QAAQ,aAAa;AAAA,MACvB,CAAC;AACH,aAAO;AAAA,QACL;AAAA,QACA,KAAK,OAAO,eAAe;AACzB,gBAAM,MAAqB,CAAC;AAC5B,cAAI;AACJ,qBAAS;AACP,kBAAM,OAAO,MAAM,KAAK,EAAE,QAAQ,QAAQ,YAAY,OAAO,CAAC;AAC9D,gBAAI,KAAK,GAAG,KAAK,MAAM;AACvB,gBAAI,KAAK,cAAc,KAAM,QAAO;AACpC,qBAAS,KAAK;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG;AAAA,IACH,UAAU,EAAE,eAAe,sBAAsB;AAAA,IACjD,UAAU,kBAAkB,OAAO;AAAA,IACnC,eAAe,uBAAuB,OAAO;AAAA,IAC7C,aAAa,qBAAqB,OAAO;AAAA,IACzC,WAAW,mBAAmB,OAAO;AAAA,IACrC,qBAAqB,6BAA6B,OAAO;AAAA,IACzD,WAAW,mBAAmB,OAAO;AAAA,IACrC,KAAK,aAAa,EAAE,KAAK,CAAC;AAAA,EAC5B;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -313,23 +313,41 @@ export interface OpenedConversationIface extends ConversationHandleIface {
|
|
|
313
313
|
conversation: ConversationIface;
|
|
314
314
|
}
|
|
315
315
|
export interface CreateConversationArgsIface extends SignalOptionsIface {
|
|
316
|
+
/**
|
|
317
|
+
* The project (`prj_...`) a group chat is created in (editors only); omitted,
|
|
318
|
+
* the API key's parent project (a signed-in person's: My Work).
|
|
319
|
+
* A direct chat is the caller's own and lives in their personal project.
|
|
320
|
+
*/
|
|
321
|
+
projectId?: string;
|
|
316
322
|
kind: EnumInput<ConversationKind>;
|
|
317
323
|
title?: string;
|
|
318
324
|
participants: ParticipantCreateInput[];
|
|
319
325
|
turnPolicy?: EnumInput<AgentTurnPolicy>;
|
|
320
326
|
}
|
|
321
327
|
export interface ConversationsApiIface {
|
|
328
|
+
/**
|
|
329
|
+
* The conversations the caller can read.
|
|
330
|
+
* Without `projectId`: everything the caller can access (an API key: its parent project and
|
|
331
|
+
* every project it is granted; a person: every project they can read). `projectId` narrows to
|
|
332
|
+
* that project and the projects below it.
|
|
333
|
+
*/
|
|
322
334
|
list: (options?: SignalOptionsIface & {
|
|
323
335
|
cursor?: string;
|
|
324
336
|
limit?: number;
|
|
325
337
|
includeArchived?: boolean;
|
|
338
|
+
projectId?: string;
|
|
326
339
|
}) => Promise<ConversationListIface>;
|
|
327
340
|
/** Finds or creates the caller's direct conversation with an agent. */
|
|
328
341
|
direct: (args: {
|
|
329
342
|
agent: string;
|
|
330
343
|
} & SignalOptionsIface) => Promise<OpenedConversationIface>;
|
|
331
|
-
/**
|
|
332
|
-
|
|
344
|
+
/**
|
|
345
|
+
* Finds or creates the caller's own Project Agent thread in `projectId`, which
|
|
346
|
+
* omitted, is the API key's parent project (a signed-in person's: My Work).
|
|
347
|
+
*/
|
|
348
|
+
home: (options?: SignalOptionsIface & {
|
|
349
|
+
projectId?: string;
|
|
350
|
+
}) => Promise<OpenedConversationIface>;
|
|
333
351
|
create: (args: CreateConversationArgsIface) => Promise<OpenedConversationIface>;
|
|
334
352
|
/** I/O-free handle. */
|
|
335
353
|
get: (conversationId: string) => ConversationHandleIface;
|
|
@@ -347,10 +365,16 @@ export interface ConversationsApiIface {
|
|
|
347
365
|
* subscription, resync and while realtime is down).
|
|
348
366
|
*/
|
|
349
367
|
listEvents: (options?: CollectionEventsOptionsIface) => AsyncIterableIterator<CollectionEvent>;
|
|
350
|
-
/**
|
|
368
|
+
/**
|
|
369
|
+
* What awaits the caller's answer across conversations.
|
|
370
|
+
* Without `projectId`: everything the caller can access (an API key: its parent project and
|
|
371
|
+
* every project it is granted; a person: every project they can read). `projectId` narrows to
|
|
372
|
+
* that project and the projects below it.
|
|
373
|
+
*/
|
|
351
374
|
decisions: (options?: SignalOptionsIface & {
|
|
352
375
|
cursor?: string;
|
|
353
376
|
limit?: number;
|
|
377
|
+
projectId?: string;
|
|
354
378
|
}) => Promise<DecisionsPageIface>;
|
|
355
379
|
}
|
|
356
380
|
/**
|
|
@@ -1072,7 +1072,8 @@ const createConversationsApi = (context) => {
|
|
|
1072
1072
|
query: {
|
|
1073
1073
|
cursor: options?.cursor,
|
|
1074
1074
|
limit: options?.limit,
|
|
1075
|
-
includeArchived: options?.includeArchived
|
|
1075
|
+
includeArchived: options?.includeArchived,
|
|
1076
|
+
projectId: options?.projectId
|
|
1076
1077
|
},
|
|
1077
1078
|
response: conversationListSchema,
|
|
1078
1079
|
signal: options?.signal
|
|
@@ -1090,6 +1091,7 @@ const createConversationsApi = (context) => {
|
|
|
1090
1091
|
await context.http.request({
|
|
1091
1092
|
method: HttpMethod.Get,
|
|
1092
1093
|
path: "/v1/conversations/home",
|
|
1094
|
+
query: { projectId: options?.projectId },
|
|
1093
1095
|
response: conversationSchema,
|
|
1094
1096
|
signal: options?.signal
|
|
1095
1097
|
})
|
|
@@ -1101,6 +1103,7 @@ const createConversationsApi = (context) => {
|
|
|
1101
1103
|
body: {
|
|
1102
1104
|
schema: createConversationRequestSchema,
|
|
1103
1105
|
value: {
|
|
1106
|
+
projectId: args.projectId,
|
|
1104
1107
|
kind: args.kind,
|
|
1105
1108
|
title: args.title,
|
|
1106
1109
|
participants: args.participants,
|
|
@@ -1133,7 +1136,7 @@ const createConversationsApi = (context) => {
|
|
|
1133
1136
|
decisions: (options) => context.http.request({
|
|
1134
1137
|
method: HttpMethod.Get,
|
|
1135
1138
|
path: "/v1/decisions",
|
|
1136
|
-
query: { cursor: options?.cursor, limit: options?.limit },
|
|
1139
|
+
query: { cursor: options?.cursor, limit: options?.limit, projectId: options?.projectId },
|
|
1137
1140
|
response: decisionsPageSchema,
|
|
1138
1141
|
signal: options?.signal
|
|
1139
1142
|
})
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/agent-client/conversations.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n ProcessInspectionOperation,\n processInspectionRequestSchema,\n processInspectionResultSchema,\n type ProcessInspectionRequestIface,\n type ProcessInspectionResultIface,\n} from '@finalai/agent-protocol';\nimport {\n agentRealtimeFrameSchema,\n AgentRealtimeFrameType,\n AgentRealtimeKind,\n agentRealtimeTopics,\n AgentSessionState,\n attachmentDownloadSchema,\n attachmentUploadSchema,\n cancelConversationRequestSchema,\n conversationLinkListSchema,\n conversationLinkSchema,\n conversationListSchema,\n conversationMessageSchema,\n conversationMessagesPageSchema,\n conversationSandboxListSchema,\n conversationSandboxSchema,\n conversationScheduleListSchema,\n conversationScheduleSchema,\n conversationSchema,\n createAttachmentUploadRequestSchema,\n createConversationLinkRequestSchema,\n createConversationRequestSchema,\n createConversationScheduleRequestSchema,\n createDirectConversationRequestSchema,\n DecisionEventState,\n decisionRecordListSchema,\n decisionsPageSchema,\n markReadRequestSchema,\n messageDeliveriesSchema,\n MessageStreamingState,\n MessageThreadFilter,\n okResponseSchema,\n parseAgentRealtimeEvent,\n participantInputSchema,\n ParticipantKind,\n participantListSchema,\n participantSchema,\n postConversationEventRequestSchema,\n postConversationEventResponseSchema,\n type PostConversationEventResponseIface,\n pushDeliveryOpenResponseSchema,\n reactionRequestSchema,\n reactionsResponseSchema,\n readStateSchema,\n removeParticipantRequestSchema,\n respondDecisionResponseSchema,\n respondDecisionSchema,\n sandboxDirectorySchema,\n sandboxEditorAuthorizationSchema,\n sandboxEditorSessionSchema,\n sandboxFileSchema,\n sandboxPathSchema,\n sandboxPreviewOptionsSchema,\n sandboxPreviewSchema,\n sandboxSearchSchema,\n searchMessagesPageSchema,\n sendMessageRequestSchema,\n sendMessageResponseSchema,\n sessionSchema,\n typingRequestSchema,\n updateConversationRequestSchema,\n updateConversationScheduleRequestSchema,\n updateParticipantRequestSchema,\n type AgentRealtimeEvent,\n type AgentRealtimeEventOf,\n type AgentSessionIface,\n type AgentTurnPolicy,\n type AttachmentDownloadIface,\n type AttachmentUploadIface,\n type ContentInput,\n type ConversationIface,\n type ConversationKind,\n type ConversationLinkIface,\n type ConversationListIface,\n type ConversationMessageIface,\n type ConversationMessagesPageIface,\n type ConversationSandboxIface,\n type ConversationScheduleIface,\n type CreateConversationScheduleRequestIface,\n type DecisionRecordIface,\n type DecisionsPageIface,\n type MessageDeliveryIface,\n type ParticipantIface,\n type ParticipantInput,\n type PostConversationEventRequestIface,\n type ReactionIface,\n type ReadStateIface,\n type RespondDecisionResponseIface,\n type SandboxDirectoryIface,\n type SandboxEditorSessionIface,\n type SandboxFileIface,\n type SandboxPathIface,\n type SandboxPreviewType,\n type SandboxSearchIface,\n type SearchMessagesPageIface,\n type UpdateConversationRequestIface,\n type UpdateConversationScheduleRequestIface,\n type UpdateParticipantRequestIface,\n type WireFallback,\n} from '@finalai/agent-protocol/agent-platform';\nimport { createAsyncQueue, failOnAbort } from \"./async-queue.mjs\";\nimport {\n streamCollectionEvents,\n type CollectionEvent,\n type CollectionEventsOptionsIface,\n} from \"./collection-events.mjs\";\nimport {\n ClientCollection,\n encodePath,\n type ClientContextIface,\n type EnumInput,\n type SignalOptionsIface,\n} from \"./context.mjs\";\nimport {\n clientError,\n ClientErrorCode,\n isRetryableClientError,\n isTerminalRealtimeError,\n realtimeSubscriptionError,\n} from \"./errors.mjs\";\nimport { errorFromResponse, HttpMethod, type HttpRequestArgsIface } from \"./http.mjs\";\nimport type { RealtimeTransportFrameIface } from \"./realtime.mjs\";\nimport { outcomeOf, type RespondArgs } from \"./sessions.mjs\";\n\nexport interface SandboxFileContentArgsIface {\n snapshotId?: string;\n bindingId: string;\n path: string;\n download?: boolean;\n /** One HTTP byte range, for example `bytes=1024-2047`. */\n range?: string;\n}\n\nexport interface SandboxFileContentRequestIface {\n url: string;\n /** Supply these to native download/media clients; never put bearer tokens in URLs. */\n headers: Record<string, string>;\n credentials: RequestCredentials;\n}\n\nexport interface ConversationEventMetaIface {\n topic: string;\n cursor: string | null;\n createdAt: string | null;\n /** True for messages the SDK fetched over HTTP to fill a realtime gap. */\n replayed: boolean;\n}\n\n/** A realtime event of the conversation topic, flattened (`event.message`, `event.decision`). */\nexport type ConversationEvent = AgentRealtimeEvent & ConversationEventMetaIface;\n\nexport interface ConversationEventsOptionsIface extends SignalOptionsIface {\n /** Keep streaming; false ends once the subscription is current. Defaults to true. */\n follow?: boolean;\n /** Also replay messages (thread replies included) after this conversation seq when the subscription opens. */\n afterSeq?: number;\n /** Gateway cursor to resume the topic after. */\n afterCursor?: string;\n /**\n * Messages the caller already has (an earlier stream or page). On the first\n * subscription the stream recovers everything created or updated since the\n * newest of them, thread replies included, and skips the versions given, so\n * a client resuming a conversation it rendered before is left with no gap.\n */\n resumeFrom?: readonly ConversationMessageIface[];\n /**\n * Called on every resubscribe (after the first) and resync, as the stream\n * starts recovering messages. State that messages cannot reconstruct, such\n * as whether an agent's turn ended without a reply, is the caller's to re-read.\n */\n onResubscribed?: () => void;\n /**\n * Also recover what only realtime carries (default true). On every\n * (re)subscribe, resync and fallback poll the stream re-reads the open\n * permission and elicitation decisions of the conversation's agent sessions\n * and emits replayed `decision.changed` events: `created` for an open\n * decision it has not emitted, `resolved` for one it emitted open that no\n * longer is. And\n * for every turn it saw start whose session is no longer running, it emits a\n * replayed `conversation.turn.ended` (stop reason null). Turns that started\n * and ended while it was away arrive only as messages.\n */\n recoverTransient?: boolean;\n // While the realtime transport reports errors, a following stream polls the\n // same recovery every `timing.pollIntervalMs` until it is subscribed again.\n // Without `resumeFrom` or `afterSeq`, the stream reads the newest message when it is\n // called and, once subscribed, recovers every change after it (thread replies included),\n // so nothing posted while the subscription registers is lost.\n}\n\nexport interface SendMessageOptionsIface extends SignalOptionsIface {\n clientMessageId?: string;\n replyTo?: string;\n threadRootId?: string;\n /** Ids of earlier messages in the conversation to quote, in order. */\n quotes?: string[];\n /** Mentioned participant ids. */\n mentions?: string[];\n attachmentIds?: string[];\n /** When the person submitted, for the prompt-to-inference trace; defaults to now. */\n clientSubmittedAtMs?: number;\n}\n\nexport type ParticipantCreateInput =\n | { user: string }\n | {\n agent: string;\n routingMode?: EnumInput<\n NonNullable<Extract<ParticipantInput, { agent: string }>['routingMode']>\n >;\n };\n\nexport interface SentMessageIface {\n message: ConversationMessageIface;\n messageId: string;\n seq: number;\n /** One entry per agent participant the message was routed to. */\n deliveries: MessageDeliveryIface[];\n}\n\nexport interface ListMessagesOptionsIface extends SignalOptionsIface {\n before?: number;\n after?: number;\n limit?: number;\n /** Thread root message id, or `MessageThreadFilter.All` for the timeline plus every thread. */\n thread?: string;\n /** ISO instant: messages created or updated after it (the first page of a change scan). */\n updatedAfter?: string;\n /** A previous page's `nextUpdatedCursor`: continue the change scan after it. */\n updatedCursor?: string;\n}\n\nexport interface UploadAttachmentArgsIface extends SignalOptionsIface {\n name: string;\n contentType: string;\n data: Blob | ArrayBuffer;\n}\n\nexport interface ConversationHandleIface {\n /** Durable accepted prompt receipts for a message, including queued deliveries once admitted. */\n deliveries: (\n args: { messageId: string },\n options?: SignalOptionsIface,\n ) => Promise<MessageDeliveryIface[]>;\n\n id: string;\n info: (options?: SignalOptionsIface) => Promise<ConversationIface>;\n send: (content: ContentInput, options?: SendMessageOptionsIface) => Promise<SentMessageIface>;\n events: (options?: ConversationEventsOptionsIface) => AsyncIterableIterator<ConversationEvent>;\n messages: (options?: ListMessagesOptionsIface) => Promise<ConversationMessagesPageIface>;\n /** One message by id (`GET /v1/conversations/:id/messages/:messageId`), e.g. a thread root. */\n message: (\n args: { messageId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationMessageIface>;\n react: (\n args: { messageId: string; emoji: string },\n options?: SignalOptionsIface,\n ) => Promise<ReactionIface[]>;\n unreact: (\n args: { messageId: string; emoji: string },\n options?: SignalOptionsIface,\n ) => Promise<ReactionIface[]>;\n recordPushOpen: (\n args: { deliveryId: string },\n options?: SignalOptionsIface,\n ) => Promise<{ recorded: boolean }>;\n markRead: (args: { throughSeq: number }, options?: SignalOptionsIface) => Promise<ReadStateIface>;\n /**\n * Marks a thread read through one of its replies' seq and follows it\n * (`POST \u2026/threads/:rootId/read`); the conversation's own unread count\n * moves with `markRead`.\n */\n markThreadRead: (\n args: { rootId: string; throughSeq: number },\n options?: SignalOptionsIface,\n ) => Promise<void>;\n /**\n * Tells the other members the caller is typing (`POST \u2026/typing`), realtime\n * only. A `true` lapses on its own after a few seconds, so composers repeat\n * it while typing continues and send `false` when the draft is sent or cleared.\n */\n typing: (args: { typing: boolean }, options?: SignalOptionsIface) => Promise<void>;\n /**\n * Hands something that happened outside the conversation (`POST \u2026/events`)\n * to its Default agent as input from you, not as a message: the agent's\n * reply carries the source as its caption. The same `eventId` from the same\n * source is accepted once; the receipt says whether the agent was prompted.\n */\n postEvent: (\n event: PostConversationEventRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<PostConversationEventResponseIface>;\n respond: (\n args: RespondArgs,\n options?: SignalOptionsIface,\n ) => Promise<RespondDecisionResponseIface>;\n /** Stops the agents' running turns in this conversation. */\n cancel: (\n options?: SignalOptionsIface & { reason?: string; throughMessageSeq?: number },\n ) => Promise<void>;\n participants: (options?: SignalOptionsIface) => Promise<ParticipantIface[]>;\n /**\n * Each agent participant's session state, read now: whether a turn is\n * running in it. What a client re-reads when it may have missed a\n * `conversation.turn.ended` (`events()` reconciles the turns it saw itself).\n */\n turns: (options?: SignalOptionsIface) => Promise<ConversationAgentTurnIface[]>;\n addParticipant: (\n participant: ParticipantCreateInput,\n options?: SignalOptionsIface,\n ) => Promise<ParticipantIface>;\n /**\n * Changes an agent's routing mode (owners and admins) or a person's role\n * (owners, groups only; the last owner cannot step down). One field per call.\n */\n updateParticipant: (\n args: { participantId: string } & Omit<\n UpdateParticipantRequestIface,\n 'routingMode' | 'role'\n > & {\n routingMode?: EnumInput<NonNullable<UpdateParticipantRequestIface['routingMode']>>;\n role?: EnumInput<NonNullable<UpdateParticipantRequestIface['role']>>;\n },\n options?: SignalOptionsIface,\n ) => Promise<ParticipantIface>;\n removeParticipant: (\n args: { participantId: string },\n options?: SignalOptionsIface,\n ) => Promise<void>;\n update: (\n patch: UpdateConversationRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationIface>;\n delete: (args: { messageId: string }, options?: SignalOptionsIface) => Promise<void>;\n uploadAttachment: (args: UploadAttachmentArgsIface) => Promise<AttachmentUploadIface>;\n /**\n * A fresh presigned download URL for one attachment\n * (`GET /v1/conversations/:id/attachments/:attachmentId`). URLs on messages\n * expire; resolve through this before opening one that may be stale.\n */\n attachmentUrl: (\n args: { attachmentId: string },\n options?: SignalOptionsIface,\n ) => Promise<AttachmentDownloadIface>;\n /**\n * The conversation's sandboxes (the computer tile): status, capabilities and\n * whether a preview is available (`GET /v1/conversations/:id/sandboxes`).\n * Never starts a parked sandbox.\n */\n sandboxes: (options?: SignalOptionsIface) => Promise<ConversationSandboxIface[]>;\n /** One directory of a running sandbox, confined to its workspace (`\u2026/sandboxes/:bindingId/files`). */\n sandboxFiles: (\n args: { bindingId: string; path?: string; snapshotId?: string },\n options?: SignalOptionsIface,\n ) => Promise<SandboxDirectoryIface>;\n /** Resolves a file or directory without waking its sandbox. */\n sandboxPath: (\n args: { bindingId: string; path?: string; snapshotId?: string },\n options?: SignalOptionsIface,\n ) => Promise<SandboxPathIface>;\n /** Bounded recursive path search; truncated signals incomplete traversal. */\n searchSandboxFiles: (\n args: { bindingId: string; path?: string; query: string; limit?: number },\n options?: SignalOptionsIface,\n ) => Promise<SandboxSearchIface>;\n /** A byte range of a file in a running sandbox, at most 1 MiB (`\u2026/sandboxes/:bindingId/file`). */\n sandboxFile: (\n args: {\n bindingId: string;\n path: string;\n offset?: number;\n length?: number;\n snapshotId?: string;\n },\n options?: SignalOptionsIface,\n ) => Promise<SandboxFileIface>;\n inspectSandboxProcesses(\n args: { bindingId: string; request: ProcessInspectionRequestIface },\n options?: SignalOptionsIface,\n ): Promise<ProcessInspectionResultIface>;\n /** Opens a provider editor for an existing workspace, with write authorization. */\n openSandboxEditor(\n args: { bindingId: string },\n options?: SignalOptionsIface,\n ): Promise<SandboxEditorSessionIface>;\n refreshSandboxEditor(\n args: { bindingId: string; editorId: string; authorizationId: string },\n options?: SignalOptionsIface,\n ): Promise<SandboxEditorSessionIface>;\n closeSandboxEditor(\n args: { bindingId: string; editorId: string; authorizationId: string },\n options?: SignalOptionsIface & { keepalive?: boolean },\n ): Promise<void>;\n /** Raw streaming bytes (`\u2026/file/content`). The caller consumes or cancels the response body. */\n sandboxFileContent: (\n args: SandboxFileContentArgsIface,\n options?: SignalOptionsIface,\n ) => Promise<Response>;\n /**\n * An authenticated request for a browser/native media or download client.\n * Cookie clients can use the URL directly; bearer clients must supply headers.\n * Every request rechecks membership and confinement; never wakes the sandbox.\n */\n sandboxFileContentRequest: (\n args: SandboxFileContentArgsIface,\n ) => Promise<SandboxFileContentRequestIface>;\n /** A short-lived screen preview of a running sandbox; 404 when it serves none (`\u2026/preview`). */\n sandboxPreview: (\n args: { bindingId: string; viewOnly?: boolean },\n options?: SignalOptionsIface,\n ) => Promise<SandboxPreviewType>;\n /** Starts a parked sandbox (conversation owners and admins; `POST \u2026/wake`). */\n wakeSandbox: (\n args: { bindingId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationSandboxIface>;\n /** The conversation's runtime schedules: reminders and recurring checks (`GET \u2026/schedules`). */\n schedules: (options?: SignalOptionsIface) => Promise<ConversationScheduleIface[]>;\n /**\n * Creates a schedule owned by one agent participant (`POST \u2026/schedules`).\n * Agents create their own; people need to be conversation owners or admins.\n */\n createSchedule: (\n args: CreateConversationScheduleRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationScheduleIface>;\n /** Changes a schedule (its agent, or conversation owners and admins; `PATCH \u2026/schedules/:id`). */\n updateSchedule: (\n args: { scheduleId: string } & UpdateConversationScheduleRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationScheduleIface>;\n /** Deletes a schedule (`DELETE \u2026/schedules/:id`). */\n deleteSchedule: (args: { scheduleId: string }, options?: SignalOptionsIface) => Promise<void>;\n /**\n * The conversations this one handed work to, with what their agents are\n * doing (`GET \u2026/links`). Their replies and waits arrive here as messages.\n */\n links: (options?: SignalOptionsIface) => Promise<ConversationLinkIface[]>;\n /** Conversations receiving this conversation\u2019s delegated results. */\n parentLinks: (options?: SignalOptionsIface) => Promise<ConversationLinkIface[]>;\n /**\n * Links another conversation the caller belongs to (`POST \u2026/links`); linking\n * it again returns the same link. Links never form a cycle.\n */\n link: (\n args: { conversationId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationLinkIface>;\n /** Removes a link (`DELETE \u2026/links/:linkId`); both conversations remain. */\n unlink: (args: { linkId: string }, options?: SignalOptionsIface) => Promise<void>;\n}\n\nexport interface ConversationAgentTurnIface {\n participantId: string;\n sessionId: string;\n state: AgentSessionState | WireFallback;\n /** A turn is running or waiting on a decision. */\n running: boolean;\n}\n\n/** Session states in which a turn is open. */\nexport const TURN_OPEN_SESSION_STATES: ReadonlySet<AgentSessionState | WireFallback> = new Set([\n AgentSessionState.Running,\n AgentSessionState.RequiresAction,\n]);\n\nexport interface OpenedConversationIface extends ConversationHandleIface {\n conversation: ConversationIface;\n}\n\nexport interface CreateConversationArgsIface extends SignalOptionsIface {\n kind: EnumInput<ConversationKind>;\n title?: string;\n participants: ParticipantCreateInput[];\n turnPolicy?: EnumInput<AgentTurnPolicy>;\n}\n\nexport interface ConversationsApiIface {\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number; includeArchived?: boolean },\n ) => Promise<ConversationListIface>;\n /** Finds or creates the caller's direct conversation with an agent. */\n direct: (args: { agent: string } & SignalOptionsIface) => Promise<OpenedConversationIface>;\n /** Finds or creates the caller's Home conversation. */\n home: (options?: SignalOptionsIface) => Promise<OpenedConversationIface>;\n create: (args: CreateConversationArgsIface) => Promise<OpenedConversationIface>;\n /** I/O-free handle. */\n get: (conversationId: string) => ConversationHandleIface;\n /** Full-text search over the caller's conversations (or one), newest first. */\n search: (\n args: {\n q: string;\n conversationId?: string;\n cursor?: string;\n limit?: number;\n } & SignalOptionsIface,\n ) => Promise<SearchMessagesPageIface>;\n /**\n * The caller's conversation list topic (`user.collection:<userId>:conversations`):\n * `conversation.list.changed` and `conversation.updated` events, and a\n * `collection.resync` whenever `list()` must be re-read (on every\n * subscription, resync and while realtime is down).\n */\n listEvents: (options?: CollectionEventsOptionsIface) => AsyncIterableIterator<CollectionEvent>;\n /** Everything awaiting the caller's answer across conversations. */\n decisions: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<DecisionsPageIface>;\n}\n\nconst conversationPath = (conversationId: string, suffix = ''): string =>\n `/v1/conversations/${encodePath(conversationId)}${suffix}`;\n\nconst messagePath = (conversationId: string, messageId: string, suffix = ''): string =>\n conversationPath(conversationId, `/messages/${encodePath(messageId)}${suffix}`);\n\ninterface ConversationStreamArgsIface {\n context: ClientContextIface;\n conversationId: string;\n options: ConversationEventsOptionsIface | undefined;\n listMessages: (options: ListMessagesOptionsIface) => Promise<ConversationMessagesPageIface>;\n listParticipants: (options: SignalOptionsIface) => Promise<ParticipantIface[]>;\n getSession: (sessionId: string, options: SignalOptionsIface) => Promise<AgentSessionIface>;\n sessionDecisions: (\n sessionId: string,\n options: SignalOptionsIface,\n ) => Promise<DecisionRecordIface[]>;\n}\n\n// Bounds on the ids a stream remembers to dedupe transient events.\nconst MAX_REMEMBERED = 4096;\n\n// `GET /v1/sessions/:id/decisions` returns at most this many open decisions; a\n// list that long may be truncated, so absence from it proves nothing.\nconst SESSION_DECISIONS_LIMIT = 200;\n\nconst remember = <Key, Value>(map: Map<Key, Value>, key: Key, value: Value): void => {\n map.delete(key);\n map.set(key, value);\n if (map.size > MAX_REMEMBERED) {\n const oldest = map.keys().next();\n if (oldest.done !== true) map.delete(oldest.value);\n }\n};\n\ntype TurnStartedEventIface = AgentRealtimeEventOf<AgentRealtimeKind.TurnStarted>;\n\nconst isTransientEvent = (event: AgentRealtimeEvent): boolean =>\n event.kind === AgentRealtimeKind.DecisionChanged ||\n event.kind === AgentRealtimeKind.TurnStarted ||\n event.kind === AgentRealtimeKind.TurnEnded;\n\nconst REPLAY_PAGE = 100;\n/**\n * Every recovery rescans this far behind the newest change seen: `updated_at`\n * is a transaction's start time, so a slow write (a lock wait) can commit\n * after newer changes were delivered.\n */\nexport const RECOVERY_SKEW_MS = 30_000;\n\nconst stampOf = (message: ConversationMessageIface): number =>\n Math.max(\n ...[message.updatedAt, message.deletedAt, message.createdAt].map((value) =>\n value == null ? 0 : Date.parse(value) || 0,\n ),\n );\n\n/** The newest copy of a message the stream has emitted (or the caller already had). */\nexport interface MessageVersionIface {\n /** The server's per-message change counter: a total order when both copies carry it. */\n revision: number | null;\n /** `updatedAt` in ms; distinct changes can share a millisecond. */\n updatedAt: number | null;\n /** Newest of updatedAt/deletedAt/createdAt, for messages without `updatedAt`. */\n stamp: number;\n deleted: boolean;\n final: boolean;\n fingerprint: string;\n}\n\nconst isoMs = (value: string | null): number | null => {\n if (value == null) return null;\n const ms = Date.parse(value);\n return Number.isNaN(ms) ? null : ms;\n};\n\nexport const messageVersionOf = (message: ConversationMessageIface): MessageVersionIface => ({\n revision: message.revision,\n updatedAt: isoMs(message.updatedAt),\n stamp: stampOf(message),\n deleted: message.deletedAt != null,\n final: message.streaming?.state === MessageStreamingState.Final,\n fingerprint: JSON.stringify([\n message.deletedAt,\n message.streaming?.state ?? null,\n message.body,\n message.reactions,\n ]),\n});\n\n/**\n * Whether `incoming` is newer than the copy already emitted; older or equal\n * copies are dropped. A deletion is never undone. `revision` orders copies\n * when both carry it. Otherwise `updatedAt` does, where a finalized reply\n * beats a streaming copy from the same millisecond; without either, a later\n * change time wins, a finalized reply is never undone by a copy at the same\n * time, and equal times fall back to content.\n */\nexport const isNewerMessageVersion = (\n incoming: MessageVersionIface,\n current: MessageVersionIface | undefined,\n): boolean => {\n if (current == null) return true;\n if (current.deleted && !incoming.deleted) return false;\n if (incoming.revision != null && current.revision != null) {\n return incoming.revision > current.revision;\n }\n if (incoming.updatedAt != null && current.updatedAt != null) {\n if (incoming.updatedAt !== current.updatedAt) return incoming.updatedAt > current.updatedAt;\n return incoming.final && !current.final;\n }\n if (incoming.stamp !== current.stamp) return incoming.stamp > current.stamp;\n if (current.final && !incoming.final) return false;\n return incoming.fingerprint !== current.fingerprint;\n};\n\ninterface PendingLiveIface {\n event: AgentRealtimeEvent;\n meta: ConversationEventMetaIface;\n // A transient event whose state was recorded when it arrived (or was recovered);\n // released as is.\n noted: boolean;\n}\n\n/**\n * Live conversation events. On every resubscribe or resync the stream\n * recovers what changed while it was away: messages created *or updated*\n * (including thread replies), scanned in the server's (updated_at, id) order.\n * The first scan starts at the newest change seen minus a skew; every scan\n * ends on the server's change cursor, and the next scan resumes from it, so\n * messages that share an update time are never skipped between pages.\n * Live events that arrive during recovery are held and released after it,\n * and message events are deduped by id and version, so a reconnect neither\n * loses nor repeats a message.\n */\nconst streamConversationEvents = (\n args: ConversationStreamArgsIface,\n): AsyncIterableIterator<ConversationEvent> => {\n const topic = agentRealtimeTopics.conversation(args.conversationId);\n const follow = args.options?.follow ?? true;\n const controller = new AbortController();\n const signal = AbortSignal.any([\n controller.signal,\n args.context.closeSignal,\n ...(args.options?.signal == null ? [] : [args.options.signal]),\n ]);\n const versions = new Map<string, MessageVersionIface>();\n let newestStamp: number | null = null;\n const subscribedAt = Date.now();\n let recoveryFloor: number | null = null;\n let subscribedOnce = false;\n let recovering = 0;\n let recovery: Promise<void> = Promise.resolve();\n const held: PendingLiveIface[] = [];\n const recoverTransientState = args.options?.recoverTransient ?? true;\n // Transient events emitted so far, so live and recovered copies are emitted once.\n // `noted` orders each entry against recovery snapshots (see recoverTransient).\n let transientClock = 0;\n const decisionsSeen = new Map<\n string,\n { state: DecisionEventState; decision: DecisionRecordIface; noted: number }\n >();\n const runningTurns = new Map<string, { turn: TurnStartedEventIface; noted: number }>();\n const endedTurns = new Map<string, true>();\n // The realtime transport reported a retryable error and has not resubscribed since.\n let degraded = false;\n let pollTimer: ReturnType<typeof setTimeout> | null = null;\n const clearPoll = (): void => {\n if (pollTimer != null) clearTimeout(pollTimer);\n pollTimer = null;\n };\n let unsubscribe: (() => void) | null = null;\n let detachAbort: () => void = () => {};\n let detachClose: () => void = () => {};\n const queue = createAsyncQueue<ConversationEvent>(() => {\n controller.abort();\n held.length = 0;\n clearPoll();\n unsubscribe?.();\n detachAbort();\n detachClose();\n });\n const resumeFrom = args.options?.resumeFrom ?? [];\n // Taken when `events()` is called, before subscribing; see recoverFromAnchor.\n const anchor =\n resumeFrom.length === 0 && args.options?.afterSeq == null\n ? args.listMessages({ limit: 1, thread: MessageThreadFilter.All, signal })\n : null;\n // A failed anchor read surfaces through the recovery that awaits it.\n anchor?.catch(() => {});\n for (const message of resumeFrom) {\n versions.set(message.id, messageVersionOf(message));\n newestStamp = Math.max(newestStamp ?? 0, stampOf(message));\n }\n\n /** Emits a message event only when it is newer than every copy of that message emitted so far. */\n const emitMessage = (\n message: ConversationMessageIface,\n meta: ConversationEventMetaIface,\n live: AgentRealtimeEvent | null,\n ): void => {\n const version = messageVersionOf(message);\n const previous = versions.get(message.id);\n if (!isNewerMessageVersion(version, previous)) return;\n versions.set(message.id, version);\n newestStamp = Math.max(newestStamp ?? 0, stampOf(message));\n if (live != null) {\n queue.push({ ...live, ...meta });\n return;\n }\n queue.push(\n previous == null\n ? { kind: AgentRealtimeKind.MessageCreated, message, ...meta }\n : { kind: AgentRealtimeKind.MessageUpdated, message, ...meta },\n );\n };\n\n /** Records a decision event; false when an equal or newer state was already emitted. */\n const noteDecision = (\n decision: DecisionRecordIface,\n state: DecisionEventState | WireFallback,\n ): boolean => {\n const seen = decisionsSeen.get(decision.id);\n if (state === DecisionEventState.Resolved) {\n if (seen?.state === DecisionEventState.Resolved) return false;\n transientClock += 1;\n remember(decisionsSeen, decision.id, { state, decision, noted: transientClock });\n return true;\n }\n if (state === DecisionEventState.Created) {\n if (seen != null) return false;\n transientClock += 1;\n remember(decisionsSeen, decision.id, { state, decision, noted: transientClock });\n return true;\n }\n return true;\n };\n\n /** Records a decision or turn event's state; false when it repeats one already emitted. */\n const noteTransient = (event: AgentRealtimeEvent): boolean => {\n if (event.kind === AgentRealtimeKind.DecisionChanged)\n return noteDecision(event.decision, event.state);\n if (event.kind === AgentRealtimeKind.TurnStarted) {\n if (!endedTurns.has(event.turnId)) {\n transientClock += 1;\n remember(runningTurns, event.turnId, { turn: event, noted: transientClock });\n }\n return true;\n }\n if (event.kind === AgentRealtimeKind.TurnEnded) {\n if (endedTurns.has(event.turnId)) return false;\n remember(endedTurns, event.turnId, true);\n runningTurns.delete(event.turnId);\n }\n return true;\n };\n\n const emitLive = (event: AgentRealtimeEvent, meta: ConversationEventMetaIface): void => {\n if (\n event.kind === AgentRealtimeKind.MessageCreated ||\n event.kind === AgentRealtimeKind.MessageUpdated\n ) {\n emitMessage(event.message, meta, event);\n return;\n }\n if (event.kind === AgentRealtimeKind.MessageDeleted) {\n // A deletion outranks every copy up to its time, so a held or replayed older copy cannot restore it.\n const current = versions.get(event.messageId);\n if (current?.deleted === true) return;\n const deletedAt = isoMs(event.deletedAt) ?? current?.stamp ?? 0;\n versions.set(event.messageId, {\n revision: current?.revision ?? null,\n updatedAt: Math.max(current?.updatedAt ?? 0, deletedAt),\n stamp: Math.max(current?.stamp ?? 0, deletedAt),\n deleted: true,\n final: current?.final ?? false,\n fingerprint: current?.fingerprint ?? '',\n });\n }\n if (!noteTransient(event)) return;\n queue.push({ ...event, ...meta });\n };\n\n const replayed = (message: ConversationMessageIface): ConversationEventMetaIface => ({\n topic,\n cursor: null,\n createdAt: message.updatedAt ?? message.createdAt,\n replayed: true,\n });\n\n const emitPage = (messages: ConversationMessageIface[]): void => {\n for (const message of [...messages].sort((left, right) => left.seq - right.seq)) {\n emitMessage(message, replayed(message), null);\n }\n };\n\n /**\n * One change scan, paged by the server's cursor. Every scan starts over from\n * the oldest writer active before the preceding scan (or the newest change\n * minus the skew for older servers), never from the last scan\u2019s cursor:\n * `updated_at` is the writing transaction's start time, so a change can\n * commit after a later one was already seen. Revision ordering drops the\n * repeats the overlap brings back.\n */\n const recoverChanges = async (): Promise<void> => {\n const since = Math.max(\n 0,\n Math.min(newestStamp ?? subscribedAt, recoveryFloor ?? Infinity) - RECOVERY_SKEW_MS,\n );\n let position: { updatedCursor: string } | { updatedAfter: string } = {\n updatedAfter: new Date(since).toISOString(),\n };\n let nextFloor: number | null = null;\n for (;;) {\n const page = await args.listMessages({\n ...position,\n thread: MessageThreadFilter.All,\n limit: REPLAY_PAGE,\n signal,\n });\n if (nextFloor == null && page.recoverySince != null) {\n const stamp = Date.parse(page.recoverySince);\n if (Number.isFinite(stamp)) nextFloor = stamp;\n }\n emitPage(page.messages);\n const next = page.nextUpdatedCursor;\n if (next == null || !page.hasMoreAfter || page.messages.length === 0) {\n recoveryFloor = nextFloor ?? recoveryFloor;\n return;\n }\n position = { updatedCursor: next };\n }\n };\n\n /**\n * With nothing to resume from, the stream anchors on the newest message at\n * the moment `events()` was called and, once subscribed, recovers every\n * change after it. So a message posted between a caller's first page and the\n * gateway registering the subscription still arrives (marked `replayed`).\n */\n const recoverFromAnchor = async (anchor: Promise<ConversationMessagesPageIface>) => {\n const page = await anchor;\n if (page.recoverySince != null) {\n const stamp = Date.parse(page.recoverySince);\n if (Number.isFinite(stamp)) recoveryFloor = stamp;\n }\n const newest = page.messages.reduce<ConversationMessageIface | null>(\n (best, message) => (best == null || message.seq > best.seq ? message : best),\n null,\n );\n if (newest != null && !versions.has(newest.id)) {\n versions.set(newest.id, messageVersionOf(newest));\n newestStamp = Math.max(newestStamp ?? 0, stampOf(newest));\n }\n await recoverChanges();\n };\n\n const recoverAfterSeq = async (afterSeq: number): Promise<void> => {\n let cursor = afterSeq;\n for (;;) {\n const page = await args.listMessages({\n after: cursor,\n thread: MessageThreadFilter.All,\n limit: REPLAY_PAGE,\n signal,\n });\n emitPage(page.messages);\n const next = Math.max(cursor, ...page.messages.map((message) => message.seq));\n if (!page.hasMoreAfter || next === cursor) return;\n cursor = next;\n }\n };\n\n const recoveredMeta = (): ConversationEventMetaIface => ({\n topic,\n cursor: null,\n createdAt: null,\n replayed: true,\n });\n\n /** A read that recovery may skip: retryable failures retry the recovery, others drop the read. */\n const optional = async <Value>(read: () => Promise<Value>): Promise<Value | null> => {\n try {\n return await read();\n } catch (cause) {\n if (isRetryableClientError(cause)) throw cause;\n return null;\n }\n };\n\n // Recovery runs while live events are held: a recovered transient event joins\n // them, so it is released after every live event that arrived before it.\n const emitRecovered = (event: AgentRealtimeEvent): void => {\n held.push({ event, meta: recoveredMeta(), noted: true });\n };\n\n /**\n * Re-reads what only realtime carries (see `recoverTransient`): the open\n * decisions and turn state of every agent participant's session.\n * Live transient events held during recovery record their state on arrival,\n * so the snapshot settles what was recorded before it was requested, and\n * never a turn or request that arrived live after it.\n */\n const recoverTransient = async (): Promise<void> => {\n if (!recoverTransientState) return;\n const asOf = transientClock;\n const participants = await optional(() => args.listParticipants({ signal }));\n const current =\n participants == null\n ? null\n : new Set(\n participants.flatMap((participant) =>\n participant.kind === ParticipantKind.Agent &&\n participant.sessionId != null &&\n participant.leftAt == null\n ? [participant.sessionId]\n : [],\n ),\n );\n // Sessions the stream holds open state for, including ones whose agent has since left.\n const remembered = new Set([\n ...[...decisionsSeen.values()].flatMap((seen) =>\n seen.state === DecisionEventState.Created && seen.decision.sessionId != null\n ? [seen.decision.sessionId]\n : [],\n ),\n ...[...runningTurns.values()].map((entry) => entry.turn.sessionId),\n ]);\n const checked = await Promise.all(\n [...new Set([...(current ?? []), ...remembered])].map(async (sessionId) => {\n const [session, open] = await Promise.all([\n optional(() => args.getSession(sessionId, { signal })),\n optional(() => args.sessionDecisions(sessionId, { signal })),\n ]);\n // An agent that left: its session is closed, and may no longer be readable.\n const departed = current != null && !current.has(sessionId);\n return {\n sessionId,\n running:\n session == null\n ? departed\n ? false\n : null\n : TURN_OPEN_SESSION_STATES.has(session.state),\n open: open ?? (departed ? [] : null),\n };\n }),\n );\n for (const { sessionId, running, open } of checked) {\n if (open != null) {\n const complete = open.length < SESSION_DECISIONS_LIMIT;\n const openIds = new Set(open.map((decision) => decision.id));\n for (const decision of open) {\n if (noteDecision(decision, DecisionEventState.Created))\n emitRecovered({\n kind: AgentRealtimeKind.DecisionChanged,\n decision,\n state: DecisionEventState.Created,\n });\n }\n for (const seen of [...decisionsSeen.values()]) {\n if (\n !complete ||\n seen.state !== DecisionEventState.Created ||\n seen.noted > asOf ||\n seen.decision.sessionId !== sessionId ||\n openIds.has(seen.decision.id)\n )\n continue;\n noteDecision(seen.decision, DecisionEventState.Resolved);\n emitRecovered({\n kind: AgentRealtimeKind.DecisionChanged,\n decision: seen.decision,\n state: DecisionEventState.Resolved,\n });\n }\n }\n if (running !== false) continue;\n for (const { turn, noted } of [...runningTurns.values()]) {\n if (turn.sessionId !== sessionId || noted > asOf) continue;\n runningTurns.delete(turn.turnId);\n remember(endedTurns, turn.turnId, true);\n emitRecovered({\n kind: AgentRealtimeKind.TurnEnded,\n conversationId: turn.conversationId,\n participantId: turn.participantId,\n sessionId: turn.sessionId,\n turnId: turn.turnId,\n stopReason: null,\n });\n }\n }\n };\n\n /** Runs a recovery while holding live events; the cursor is captured now, not when it runs. */\n const scheduleRecovery = (run: () => Promise<void>): void => {\n recovering += 1;\n recovery = recovery\n .then(async () => {\n let delay = 250;\n while (!queue.closed()) {\n try {\n await run();\n return;\n } catch (cause) {\n if (!follow || !isRetryableClientError(cause)) throw cause;\n await new Promise<void>((resolve) => {\n const done = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', done);\n resolve();\n };\n const timer = setTimeout(done, delay);\n if (signal.aborted) done();\n else signal.addEventListener('abort', done, { once: true });\n });\n delay = Math.min(delay * 2, 30_000);\n }\n }\n })\n .then(() => {\n recovering -= 1;\n if (recovering > 0) return;\n for (const entry of held.splice(0)) {\n if (entry.noted) queue.push({ ...entry.event, ...entry.meta });\n else emitLive(entry.event, entry.meta);\n }\n })\n .catch((cause) => queue.fail(cause));\n };\n\n // Reads the newest change when it runs, after any recovery queued before it.\n let newestRecoveryPending = false;\n let newestRecoveryRequested = false;\n const recoverFromNewest = (): void => {\n newestRecoveryRequested = true;\n if (newestRecoveryPending) return;\n newestRecoveryPending = true;\n scheduleRecovery(async () => {\n do {\n newestRecoveryRequested = false;\n await recoverChanges();\n await recoverTransient();\n } while (newestRecoveryRequested && !queue.closed());\n newestRecoveryPending = false;\n });\n };\n\n let initialRecoveryStarted = false;\n /** What the first subscription (or, while realtime is down, the first poll) recovers. */\n const startInitialRecovery = (): void => {\n if (initialRecoveryStarted) return;\n initialRecoveryStarted = true;\n const afterSeq = args.options?.afterSeq;\n if (afterSeq != null) scheduleRecovery(() => recoverAfterSeq(afterSeq));\n if (resumeFrom.length > 0) recoverFromNewest();\n if (anchor != null)\n scheduleRecovery(async () => {\n try {\n await recoverFromAnchor(anchor);\n } catch (cause) {\n if (!isRetryableClientError(cause)) throw cause;\n // A later anchor could hide messages written during the outage.\n await recoverChanges();\n }\n });\n // recoverFromNewest recovers transient state itself.\n if (resumeFrom.length === 0) scheduleRecovery(recoverTransient);\n };\n\n // HTTP polling while the realtime transport reports errors.\n const poll = (): void => {\n pollTimer = null;\n if (!degraded || queue.closed()) return;\n if (initialRecoveryStarted) recoverFromNewest();\n else startInitialRecovery();\n void recovery.then(() => {\n if (!degraded || queue.closed() || pollTimer != null) return;\n pollTimer = setTimeout(poll, args.context.timing.conversationPollIntervalMs);\n });\n };\n\n const onFrame = (raw: RealtimeTransportFrameIface): void => {\n const frame = agentRealtimeFrameSchema.safeParse(raw);\n if (!frame.success || queue.closed()) return;\n switch (frame.data.type) {\n case AgentRealtimeFrameType.Event: {\n const envelope = frame.data;\n const entry = {\n event: parseAgentRealtimeEvent(envelope),\n meta: {\n topic: envelope.topic,\n cursor: envelope.cursor,\n createdAt: envelope.createdAt,\n replayed: false,\n },\n };\n if (recovering > 0) {\n // Ending explicitly preserves transient events; a caller can reopen and recover messages.\n if (held.length >= 1024) {\n queue.fail(\n clientError({\n code: ClientErrorCode.Network,\n status: 0,\n message: 'Conversation recovery buffer is full; reconnect from the last message.',\n }),\n );\n return;\n }\n // Transient events record their state now, so recovery reconciles them.\n if (isTransientEvent(entry.event)) {\n if (noteTransient(entry.event)) held.push({ ...entry, noted: true });\n } else held.push({ ...entry, noted: false });\n } else emitLive(entry.event, entry.meta);\n return;\n }\n case AgentRealtimeFrameType.Subscribed: {\n degraded = false;\n clearPoll();\n if (!subscribedOnce) {\n subscribedOnce = true;\n // Polls during an outage before the first subscription already ran the initial recovery.\n if (initialRecoveryStarted) recoverFromNewest();\n else startInitialRecovery();\n } else {\n recoverFromNewest();\n args.options?.onResubscribed?.();\n }\n if (!follow) void recovery.then(() => queue.end());\n return;\n }\n case AgentRealtimeFrameType.ResyncRequired:\n recoverFromNewest();\n args.options?.onResubscribed?.();\n return;\n case AgentRealtimeFrameType.Error:\n if (isTerminalRealtimeError(frame.data)) {\n queue.fail(\n realtimeSubscriptionError({\n topic: frame.data.topic ?? topic,\n code: frame.data.code ?? 'unknown',\n message: frame.data.message ?? 'Realtime subscription was refused',\n }),\n );\n return;\n }\n // Retryable: the transport resubscribes (and its `subscribed` runs recovery);\n // meanwhile the stream recovers over HTTP. A non-following stream ends once\n // that recovery is current.\n if (!follow) {\n if (subscribedOnce) return;\n subscribedOnce = true;\n startInitialRecovery();\n void recovery.then(() => queue.end());\n return;\n }\n if (!degraded) {\n degraded = true;\n poll();\n }\n return;\n default:\n return;\n }\n };\n\n detachAbort = failOnAbort(queue, signal);\n detachClose = failOnAbort(queue, args.context.closeSignal);\n if (!queue.closed()) {\n const subscribeOptions =\n args.options?.afterCursor == null ? undefined : { afterCursor: args.options.afterCursor };\n const stop = args.context.realtime().subscribe(topic, onFrame, subscribeOptions);\n if (queue.closed()) stop();\n else unsubscribe = stop;\n }\n return queue.iterator;\n};\n\nexport const createConversationHandle = (\n context: ClientContextIface,\n conversationId: string,\n): ConversationHandleIface => {\n const { http } = context;\n\n const sandboxFileContentRequest = async (\n args: SandboxFileContentArgsIface,\n ): Promise<SandboxFileContentRequestIface> => {\n if (args.path.length === 0 || args.path.length > 4096 || args.path.includes('\\0')) {\n throw clientError({\n message: 'Invalid sandbox file path',\n status: 0,\n code: ClientErrorCode.InvalidRequest,\n });\n }\n const target = http.url(\n conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/file/content`),\n );\n target.searchParams.set('path', args.path);\n if (args.snapshotId != null) target.searchParams.set('snapshotId', args.snapshotId);\n if (args.download != null) target.searchParams.set('download', String(args.download));\n const headers = await http.headers();\n if (args.range != null) headers.range = args.range;\n return {\n url: target.toString(),\n headers,\n credentials: http.usesCookies ? 'include' : 'omit',\n };\n };\n\n const listMessages = (options: ListMessagesOptionsIface = {}) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/messages'),\n query: {\n before: options.before,\n after: options.after,\n limit: options.limit,\n thread: options.thread,\n updatedAfter: options.updatedAfter,\n updatedCursor: options.updatedCursor,\n },\n response: conversationMessagesPageSchema,\n signal: options.signal,\n });\n\n const listParticipants = async (options: SignalOptionsIface) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/participants'),\n response: participantListSchema,\n signal: options.signal,\n })\n ).participants;\n\n const getSession = (sessionId: string, options: SignalOptionsIface) =>\n http.request({\n method: HttpMethod.Get,\n path: `/v1/sessions/${encodePath(sessionId)}`,\n response: sessionSchema,\n signal: options.signal,\n });\n\n const sessionDecisions = async (sessionId: string, options: SignalOptionsIface) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: `/v1/sessions/${encodePath(sessionId)}/decisions`,\n response: decisionRecordListSchema,\n signal: options.signal,\n })\n ).decisions;\n\n const reaction = async (args: {\n method: HttpMethod;\n messageId: string;\n emoji: string;\n signal?: AbortSignal;\n }): Promise<ReactionIface[]> =>\n (\n await http.request({\n method: args.method,\n path: messagePath(conversationId, args.messageId, '/reactions'),\n body: { schema: reactionRequestSchema, value: { emoji: args.emoji } },\n response: reactionsResponseSchema,\n signal: args.signal,\n })\n ).reactions;\n\n return {\n id: conversationId,\n info: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId),\n response: conversationSchema,\n signal: options?.signal,\n }),\n send: async (content, options) => {\n const sent = await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/messages'),\n body: {\n schema: sendMessageRequestSchema,\n value: {\n content,\n clientMessageId: options?.clientMessageId ?? context.newKey(),\n replyTo: options?.replyTo,\n threadRootId: options?.threadRootId,\n quotes: options?.quotes,\n mentions: options?.mentions,\n attachmentIds: options?.attachmentIds,\n clientSubmittedAtMs: options?.clientSubmittedAtMs ?? context.now(),\n },\n },\n response: sendMessageResponseSchema,\n signal: options?.signal,\n });\n return {\n message: sent.message,\n messageId: sent.message.id,\n seq: sent.message.seq,\n deliveries: sent.deliveries,\n };\n },\n events: (options) =>\n streamConversationEvents({\n context,\n conversationId,\n options,\n listMessages,\n listParticipants,\n getSession,\n sessionDecisions,\n }),\n messages: (options) => listMessages(options),\n deliveries: async (args, options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: `${messagePath(conversationId, args.messageId)}/deliveries`,\n response: messageDeliveriesSchema,\n signal: options?.signal,\n })\n ).deliveries,\n message: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: messagePath(conversationId, args.messageId),\n response: conversationMessageSchema,\n signal: options?.signal,\n }),\n react: (args, options) =>\n reaction({ method: HttpMethod.Post, ...args, signal: options?.signal }),\n unreact: (args, options) =>\n reaction({ method: HttpMethod.Delete, ...args, signal: options?.signal }),\n markThreadRead: async ({ rootId, throughSeq }, options) => {\n await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, `/threads/${encodePath(rootId)}/read`),\n body: { schema: markReadRequestSchema, value: { throughSeq } },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n postEvent: (event, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/events'),\n body: { schema: postConversationEventRequestSchema, value: event },\n response: postConversationEventResponseSchema,\n signal: options?.signal,\n }),\n typing: async (args, options) => {\n await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/typing'),\n body: { schema: typingRequestSchema, value: args },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n recordPushOpen: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(\n conversationId,\n `/push-deliveries/${encodeURIComponent(args.deliveryId)}/open`,\n ),\n response: pushDeliveryOpenResponseSchema,\n signal: options?.signal,\n }),\n markRead: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/read'),\n body: { schema: markReadRequestSchema, value: args },\n response: readStateSchema,\n signal: options?.signal,\n }),\n respond: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/respond'),\n body: {\n schema: respondDecisionSchema,\n value: { decisionId: args.decisionId, outcome: outcomeOf(args) },\n },\n response: respondDecisionResponseSchema,\n signal: options?.signal,\n context: { decisionId: args.decisionId },\n }),\n cancel: async (options) => {\n await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/cancel'),\n body: {\n schema: cancelConversationRequestSchema,\n value: { reason: options?.reason, throughMessageSeq: options?.throughMessageSeq },\n },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n participants: (options) => listParticipants({ signal: options?.signal }),\n turns: async (options) => {\n const participants = await listParticipants({ signal: options?.signal });\n return Promise.all(\n participants.flatMap((participant) => {\n const sessionId = participant.sessionId;\n if (participant.kind !== ParticipantKind.Agent || sessionId == null) return [];\n return [\n getSession(sessionId, { signal: options?.signal }).then(\n (session): ConversationAgentTurnIface => ({\n participantId: participant.id,\n sessionId,\n state: session.state,\n running: TURN_OPEN_SESSION_STATES.has(session.state),\n }),\n ),\n ];\n }),\n );\n },\n addParticipant: (participant, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/participants'),\n body: { schema: participantInputSchema, value: participant },\n response: participantSchema,\n signal: options?.signal,\n }),\n updateParticipant: ({ participantId, ...patch }, options) =>\n http.request({\n method: HttpMethod.Patch,\n path: conversationPath(conversationId, `/participants/${encodePath(participantId)}`),\n body: { schema: updateParticipantRequestSchema, value: patch },\n response: participantSchema,\n signal: options?.signal,\n }),\n removeParticipant: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(conversationId, '/participants'),\n body: { schema: removeParticipantRequestSchema, value: args },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n update: (patch, options) =>\n http.request({\n method: HttpMethod.Patch,\n path: conversationPath(conversationId),\n body: { schema: updateConversationRequestSchema, value: patch },\n response: conversationSchema,\n signal: options?.signal,\n }),\n delete: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: messagePath(conversationId, args.messageId),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n links: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/links'),\n response: conversationLinkListSchema,\n signal: options?.signal,\n })\n ).links,\n parentLinks: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/parent-links'),\n response: conversationLinkListSchema,\n signal: options?.signal,\n })\n ).links,\n link: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/links'),\n body: { schema: createConversationLinkRequestSchema, value: args },\n response: conversationLinkSchema,\n signal: options?.signal,\n }),\n unlink: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(conversationId, `/links/${encodePath(args.linkId)}`),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n attachmentUrl: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/attachments/${encodePath(args.attachmentId)}`),\n response: attachmentDownloadSchema,\n signal: options?.signal,\n }),\n sandboxes: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/sandboxes'),\n response: conversationSandboxListSchema,\n signal: options?.signal,\n })\n ).sandboxes,\n sandboxFiles: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/files`),\n query: { path: args.path, snapshotId: args.snapshotId },\n response: sandboxDirectorySchema,\n signal: options?.signal,\n }),\n sandboxPath: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/path`),\n query: { path: args.path, snapshotId: args.snapshotId },\n response: sandboxPathSchema,\n signal: options?.signal,\n }),\n searchSandboxFiles: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/files/search`,\n ),\n query: { path: args.path, query: args.query, limit: args.limit },\n response: sandboxSearchSchema,\n signal: options?.signal,\n }),\n sandboxFile: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/file`),\n query: {\n path: args.path,\n offset: args.offset,\n length: args.length,\n snapshotId: args.snapshotId,\n },\n response: sandboxFileSchema,\n signal: options?.signal,\n }),\n sandboxFileContentRequest,\n openSandboxEditor: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/editor`),\n response: sandboxEditorSessionSchema,\n signal: options?.signal,\n }),\n refreshSandboxEditor: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/editor/${encodePath(args.editorId)}/refresh`,\n ),\n body: {\n schema: sandboxEditorAuthorizationSchema,\n value: { authorizationId: args.authorizationId },\n },\n response: sandboxEditorSessionSchema,\n signal: options?.signal,\n }),\n closeSandboxEditor: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/editor/${encodePath(args.editorId)}`,\n ),\n body: {\n schema: sandboxEditorAuthorizationSchema,\n value: { authorizationId: args.authorizationId },\n },\n response: okResponseSchema,\n signal: options?.signal,\n keepalive: options?.keepalive,\n });\n },\n sandboxFileContent: async (args, options) => {\n const request = await sandboxFileContentRequest(args);\n let response: Response;\n try {\n response = await http.fetch(request.url, {\n method: HttpMethod.Get,\n headers: request.headers,\n credentials: request.credentials,\n signal: options?.signal,\n });\n } catch (cause) {\n if (options?.signal?.aborted === true) throw cause;\n throw clientError({\n message: 'Sandbox file request failed',\n status: 0,\n code: ClientErrorCode.Network,\n cause,\n });\n }\n if (!response.ok) {\n let text: string;\n try {\n text = await response.text();\n } catch (cause) {\n if (options?.signal?.aborted === true) throw cause;\n throw clientError({\n message: 'Sandbox file response failed',\n status: 0,\n code: ClientErrorCode.Network,\n cause,\n });\n }\n throw errorFromResponse({ status: response.status, text, context: undefined });\n }\n return response;\n },\n inspectSandboxProcesses: (args, options) => {\n const request = processInspectionRequestSchema.parse(args.request);\n const { operation } = request;\n const suffix =\n operation === ProcessInspectionOperation.Available\n ? '/available'\n : 'processId' in request\n ? '/' + encodePath(request.processId)\n : '';\n const query: NonNullable<HttpRequestArgsIface<ProcessInspectionResultIface>['query']> = {};\n if ('bootId' in request) query.bootId = request.bootId;\n if ('cursor' in request) query.cursor = request.cursor;\n if ('limit' in request) query.limit = request.limit;\n return http.request({\n method: operation === ProcessInspectionOperation.Stop ? HttpMethod.Delete : HttpMethod.Get,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/processes${suffix}`,\n ),\n query,\n response: processInspectionResultSchema,\n signal: options?.signal,\n });\n },\n sandboxPreview: (args, options) => {\n const request: HttpRequestArgsIface<SandboxPreviewType> = {\n method: args.viewOnly === false ? HttpMethod.Post : HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/preview`),\n response: sandboxPreviewSchema,\n signal: options?.signal,\n };\n if (args.viewOnly === false)\n request.body = { schema: sandboxPreviewOptionsSchema, value: { viewOnly: false } };\n return http.request(request);\n },\n wakeSandbox: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/wake`),\n response: conversationSandboxSchema,\n signal: options?.signal,\n }),\n schedules: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/schedules'),\n response: conversationScheduleListSchema,\n signal: options?.signal,\n })\n ).schedules,\n createSchedule: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/schedules'),\n body: { schema: createConversationScheduleRequestSchema, value: args },\n response: conversationScheduleSchema,\n signal: options?.signal,\n }),\n updateSchedule: ({ scheduleId, ...patch }, options) =>\n http.request({\n method: HttpMethod.Patch,\n path: conversationPath(conversationId, `/schedules/${encodePath(scheduleId)}`),\n body: { schema: updateConversationScheduleRequestSchema, value: patch },\n response: conversationScheduleSchema,\n signal: options?.signal,\n }),\n deleteSchedule: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(conversationId, `/schedules/${encodePath(args.scheduleId)}`),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n uploadAttachment: async (args) => {\n const sizeBytes = 'byteLength' in args.data ? args.data.byteLength : args.data.size;\n const upload = await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/attachments'),\n body: {\n schema: createAttachmentUploadRequestSchema,\n value: { name: args.name, contentType: args.contentType, sizeBytes },\n },\n response: attachmentUploadSchema,\n signal: args.signal,\n });\n // Presigned upload: storage authenticates the URL, so it gets only the headers the\n // presign requires, through storageFetch, never the API fetch or its credentials.\n const response = await context.storageFetch(upload.uploadUrl, {\n method: upload.method,\n headers: { 'content-type': args.contentType, ...upload.headers },\n body: args.data,\n signal: args.signal,\n credentials: 'omit',\n });\n if (!response.ok) {\n throw clientError({\n message: `Attachment upload failed with status ${response.status}`,\n status: response.status,\n code: ClientErrorCode.UploadFailed,\n body: await response.text(),\n });\n }\n return upload;\n },\n };\n};\n\nexport const createConversationsApi = (context: ClientContextIface): ConversationsApiIface => {\n const opened = (conversation: ConversationIface): OpenedConversationIface => ({\n ...createConversationHandle(context, conversation.id),\n conversation,\n });\n return {\n list: (options) =>\n context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations',\n query: {\n cursor: options?.cursor,\n limit: options?.limit,\n includeArchived: options?.includeArchived,\n },\n response: conversationListSchema,\n signal: options?.signal,\n }),\n direct: async (args) =>\n opened(\n await context.http.request({\n method: HttpMethod.Post,\n path: '/v1/conversations/direct',\n body: { schema: createDirectConversationRequestSchema, value: { agent: args.agent } },\n response: conversationSchema,\n signal: args.signal,\n }),\n ),\n home: async (options) =>\n opened(\n await context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations/home',\n response: conversationSchema,\n signal: options?.signal,\n }),\n ),\n create: async (args) =>\n opened(\n await context.http.request({\n method: HttpMethod.Post,\n path: '/v1/conversations',\n body: {\n schema: createConversationRequestSchema,\n value: {\n kind: args.kind,\n title: args.title,\n participants: args.participants,\n turnPolicy: args.turnPolicy,\n },\n },\n response: conversationSchema,\n signal: args.signal,\n }),\n ),\n get: (conversationId) => createConversationHandle(context, conversationId),\n search: (args) =>\n context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations/search',\n query: {\n q: args.q,\n conversationId: args.conversationId,\n cursor: args.cursor,\n limit: args.limit,\n },\n response: searchMessagesPageSchema,\n signal: args.signal,\n }),\n listEvents: (options) =>\n streamCollectionEvents({\n context,\n topicFor: agentRealtimeTopics.userConversations,\n collection: ClientCollection.Conversations,\n options,\n }),\n decisions: (options) =>\n context.http.request({\n method: HttpMethod.Get,\n path: '/v1/decisions',\n query: { cursor: options?.cursor, limit: options?.limit },\n response: decisionsPageSchema,\n signal: options?.signal,\n }),\n };\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import {\n ProcessInspectionOperation,\n processInspectionRequestSchema,\n processInspectionResultSchema,\n type ProcessInspectionRequestIface,\n type ProcessInspectionResultIface,\n} from '@finalai/agent-protocol';\nimport {\n agentRealtimeFrameSchema,\n AgentRealtimeFrameType,\n AgentRealtimeKind,\n agentRealtimeTopics,\n AgentSessionState,\n attachmentDownloadSchema,\n attachmentUploadSchema,\n cancelConversationRequestSchema,\n conversationLinkListSchema,\n conversationLinkSchema,\n conversationListSchema,\n conversationMessageSchema,\n conversationMessagesPageSchema,\n conversationSandboxListSchema,\n conversationSandboxSchema,\n conversationScheduleListSchema,\n conversationScheduleSchema,\n conversationSchema,\n createAttachmentUploadRequestSchema,\n createConversationLinkRequestSchema,\n createConversationRequestSchema,\n createConversationScheduleRequestSchema,\n createDirectConversationRequestSchema,\n DecisionEventState,\n decisionRecordListSchema,\n decisionsPageSchema,\n markReadRequestSchema,\n messageDeliveriesSchema,\n MessageStreamingState,\n MessageThreadFilter,\n okResponseSchema,\n parseAgentRealtimeEvent,\n participantInputSchema,\n ParticipantKind,\n participantListSchema,\n participantSchema,\n postConversationEventRequestSchema,\n postConversationEventResponseSchema,\n type PostConversationEventResponseIface,\n pushDeliveryOpenResponseSchema,\n reactionRequestSchema,\n reactionsResponseSchema,\n readStateSchema,\n removeParticipantRequestSchema,\n respondDecisionResponseSchema,\n respondDecisionSchema,\n sandboxDirectorySchema,\n sandboxEditorAuthorizationSchema,\n sandboxEditorSessionSchema,\n sandboxFileSchema,\n sandboxPathSchema,\n sandboxPreviewOptionsSchema,\n sandboxPreviewSchema,\n sandboxSearchSchema,\n searchMessagesPageSchema,\n sendMessageRequestSchema,\n sendMessageResponseSchema,\n sessionSchema,\n typingRequestSchema,\n updateConversationRequestSchema,\n updateConversationScheduleRequestSchema,\n updateParticipantRequestSchema,\n type AgentRealtimeEvent,\n type AgentRealtimeEventOf,\n type AgentSessionIface,\n type AgentTurnPolicy,\n type AttachmentDownloadIface,\n type AttachmentUploadIface,\n type ContentInput,\n type ConversationIface,\n type ConversationKind,\n type ConversationLinkIface,\n type ConversationListIface,\n type ConversationMessageIface,\n type ConversationMessagesPageIface,\n type ConversationSandboxIface,\n type ConversationScheduleIface,\n type CreateConversationScheduleRequestIface,\n type DecisionRecordIface,\n type DecisionsPageIface,\n type MessageDeliveryIface,\n type ParticipantIface,\n type ParticipantInput,\n type PostConversationEventRequestIface,\n type ReactionIface,\n type ReadStateIface,\n type RespondDecisionResponseIface,\n type SandboxDirectoryIface,\n type SandboxEditorSessionIface,\n type SandboxFileIface,\n type SandboxPathIface,\n type SandboxPreviewType,\n type SandboxSearchIface,\n type SearchMessagesPageIface,\n type UpdateConversationRequestIface,\n type UpdateConversationScheduleRequestIface,\n type UpdateParticipantRequestIface,\n type WireFallback,\n} from '@finalai/agent-protocol/agent-platform';\nimport { createAsyncQueue, failOnAbort } from \"./async-queue.mjs\";\nimport {\n streamCollectionEvents,\n type CollectionEvent,\n type CollectionEventsOptionsIface,\n} from \"./collection-events.mjs\";\nimport {\n ClientCollection,\n encodePath,\n type ClientContextIface,\n type EnumInput,\n type SignalOptionsIface,\n} from \"./context.mjs\";\nimport {\n clientError,\n ClientErrorCode,\n isRetryableClientError,\n isTerminalRealtimeError,\n realtimeSubscriptionError,\n} from \"./errors.mjs\";\nimport { errorFromResponse, HttpMethod, type HttpRequestArgsIface } from \"./http.mjs\";\nimport type { RealtimeTransportFrameIface } from \"./realtime.mjs\";\nimport { outcomeOf, type RespondArgs } from \"./sessions.mjs\";\n\nexport interface SandboxFileContentArgsIface {\n snapshotId?: string;\n bindingId: string;\n path: string;\n download?: boolean;\n /** One HTTP byte range, for example `bytes=1024-2047`. */\n range?: string;\n}\n\nexport interface SandboxFileContentRequestIface {\n url: string;\n /** Supply these to native download/media clients; never put bearer tokens in URLs. */\n headers: Record<string, string>;\n credentials: RequestCredentials;\n}\n\nexport interface ConversationEventMetaIface {\n topic: string;\n cursor: string | null;\n createdAt: string | null;\n /** True for messages the SDK fetched over HTTP to fill a realtime gap. */\n replayed: boolean;\n}\n\n/** A realtime event of the conversation topic, flattened (`event.message`, `event.decision`). */\nexport type ConversationEvent = AgentRealtimeEvent & ConversationEventMetaIface;\n\nexport interface ConversationEventsOptionsIface extends SignalOptionsIface {\n /** Keep streaming; false ends once the subscription is current. Defaults to true. */\n follow?: boolean;\n /** Also replay messages (thread replies included) after this conversation seq when the subscription opens. */\n afterSeq?: number;\n /** Gateway cursor to resume the topic after. */\n afterCursor?: string;\n /**\n * Messages the caller already has (an earlier stream or page). On the first\n * subscription the stream recovers everything created or updated since the\n * newest of them, thread replies included, and skips the versions given, so\n * a client resuming a conversation it rendered before is left with no gap.\n */\n resumeFrom?: readonly ConversationMessageIface[];\n /**\n * Called on every resubscribe (after the first) and resync, as the stream\n * starts recovering messages. State that messages cannot reconstruct, such\n * as whether an agent's turn ended without a reply, is the caller's to re-read.\n */\n onResubscribed?: () => void;\n /**\n * Also recover what only realtime carries (default true). On every\n * (re)subscribe, resync and fallback poll the stream re-reads the open\n * permission and elicitation decisions of the conversation's agent sessions\n * and emits replayed `decision.changed` events: `created` for an open\n * decision it has not emitted, `resolved` for one it emitted open that no\n * longer is. And\n * for every turn it saw start whose session is no longer running, it emits a\n * replayed `conversation.turn.ended` (stop reason null). Turns that started\n * and ended while it was away arrive only as messages.\n */\n recoverTransient?: boolean;\n // While the realtime transport reports errors, a following stream polls the\n // same recovery every `timing.pollIntervalMs` until it is subscribed again.\n // Without `resumeFrom` or `afterSeq`, the stream reads the newest message when it is\n // called and, once subscribed, recovers every change after it (thread replies included),\n // so nothing posted while the subscription registers is lost.\n}\n\nexport interface SendMessageOptionsIface extends SignalOptionsIface {\n clientMessageId?: string;\n replyTo?: string;\n threadRootId?: string;\n /** Ids of earlier messages in the conversation to quote, in order. */\n quotes?: string[];\n /** Mentioned participant ids. */\n mentions?: string[];\n attachmentIds?: string[];\n /** When the person submitted, for the prompt-to-inference trace; defaults to now. */\n clientSubmittedAtMs?: number;\n}\n\nexport type ParticipantCreateInput =\n | { user: string }\n | {\n agent: string;\n routingMode?: EnumInput<\n NonNullable<Extract<ParticipantInput, { agent: string }>['routingMode']>\n >;\n };\n\nexport interface SentMessageIface {\n message: ConversationMessageIface;\n messageId: string;\n seq: number;\n /** One entry per agent participant the message was routed to. */\n deliveries: MessageDeliveryIface[];\n}\n\nexport interface ListMessagesOptionsIface extends SignalOptionsIface {\n before?: number;\n after?: number;\n limit?: number;\n /** Thread root message id, or `MessageThreadFilter.All` for the timeline plus every thread. */\n thread?: string;\n /** ISO instant: messages created or updated after it (the first page of a change scan). */\n updatedAfter?: string;\n /** A previous page's `nextUpdatedCursor`: continue the change scan after it. */\n updatedCursor?: string;\n}\n\nexport interface UploadAttachmentArgsIface extends SignalOptionsIface {\n name: string;\n contentType: string;\n data: Blob | ArrayBuffer;\n}\n\nexport interface ConversationHandleIface {\n /** Durable accepted prompt receipts for a message, including queued deliveries once admitted. */\n deliveries: (\n args: { messageId: string },\n options?: SignalOptionsIface,\n ) => Promise<MessageDeliveryIface[]>;\n\n id: string;\n info: (options?: SignalOptionsIface) => Promise<ConversationIface>;\n send: (content: ContentInput, options?: SendMessageOptionsIface) => Promise<SentMessageIface>;\n events: (options?: ConversationEventsOptionsIface) => AsyncIterableIterator<ConversationEvent>;\n messages: (options?: ListMessagesOptionsIface) => Promise<ConversationMessagesPageIface>;\n /** One message by id (`GET /v1/conversations/:id/messages/:messageId`), e.g. a thread root. */\n message: (\n args: { messageId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationMessageIface>;\n react: (\n args: { messageId: string; emoji: string },\n options?: SignalOptionsIface,\n ) => Promise<ReactionIface[]>;\n unreact: (\n args: { messageId: string; emoji: string },\n options?: SignalOptionsIface,\n ) => Promise<ReactionIface[]>;\n recordPushOpen: (\n args: { deliveryId: string },\n options?: SignalOptionsIface,\n ) => Promise<{ recorded: boolean }>;\n markRead: (args: { throughSeq: number }, options?: SignalOptionsIface) => Promise<ReadStateIface>;\n /**\n * Marks a thread read through one of its replies' seq and follows it\n * (`POST \u2026/threads/:rootId/read`); the conversation's own unread count\n * moves with `markRead`.\n */\n markThreadRead: (\n args: { rootId: string; throughSeq: number },\n options?: SignalOptionsIface,\n ) => Promise<void>;\n /**\n * Tells the other members the caller is typing (`POST \u2026/typing`), realtime\n * only. A `true` lapses on its own after a few seconds, so composers repeat\n * it while typing continues and send `false` when the draft is sent or cleared.\n */\n typing: (args: { typing: boolean }, options?: SignalOptionsIface) => Promise<void>;\n /**\n * Hands something that happened outside the conversation (`POST \u2026/events`)\n * to its Default agent as input from you, not as a message: the agent's\n * reply carries the source as its caption. The same `eventId` from the same\n * source is accepted once; the receipt says whether the agent was prompted.\n */\n postEvent: (\n event: PostConversationEventRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<PostConversationEventResponseIface>;\n respond: (\n args: RespondArgs,\n options?: SignalOptionsIface,\n ) => Promise<RespondDecisionResponseIface>;\n /** Stops the agents' running turns in this conversation. */\n cancel: (\n options?: SignalOptionsIface & { reason?: string; throughMessageSeq?: number },\n ) => Promise<void>;\n participants: (options?: SignalOptionsIface) => Promise<ParticipantIface[]>;\n /**\n * Each agent participant's session state, read now: whether a turn is\n * running in it. What a client re-reads when it may have missed a\n * `conversation.turn.ended` (`events()` reconciles the turns it saw itself).\n */\n turns: (options?: SignalOptionsIface) => Promise<ConversationAgentTurnIface[]>;\n addParticipant: (\n participant: ParticipantCreateInput,\n options?: SignalOptionsIface,\n ) => Promise<ParticipantIface>;\n /**\n * Changes an agent's routing mode (owners and admins) or a person's role\n * (owners, groups only; the last owner cannot step down). One field per call.\n */\n updateParticipant: (\n args: { participantId: string } & Omit<\n UpdateParticipantRequestIface,\n 'routingMode' | 'role'\n > & {\n routingMode?: EnumInput<NonNullable<UpdateParticipantRequestIface['routingMode']>>;\n role?: EnumInput<NonNullable<UpdateParticipantRequestIface['role']>>;\n },\n options?: SignalOptionsIface,\n ) => Promise<ParticipantIface>;\n removeParticipant: (\n args: { participantId: string },\n options?: SignalOptionsIface,\n ) => Promise<void>;\n update: (\n patch: UpdateConversationRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationIface>;\n delete: (args: { messageId: string }, options?: SignalOptionsIface) => Promise<void>;\n uploadAttachment: (args: UploadAttachmentArgsIface) => Promise<AttachmentUploadIface>;\n /**\n * A fresh presigned download URL for one attachment\n * (`GET /v1/conversations/:id/attachments/:attachmentId`). URLs on messages\n * expire; resolve through this before opening one that may be stale.\n */\n attachmentUrl: (\n args: { attachmentId: string },\n options?: SignalOptionsIface,\n ) => Promise<AttachmentDownloadIface>;\n /**\n * The conversation's sandboxes (the computer tile): status, capabilities and\n * whether a preview is available (`GET /v1/conversations/:id/sandboxes`).\n * Never starts a parked sandbox.\n */\n sandboxes: (options?: SignalOptionsIface) => Promise<ConversationSandboxIface[]>;\n /** One directory of a running sandbox, confined to its workspace (`\u2026/sandboxes/:bindingId/files`). */\n sandboxFiles: (\n args: { bindingId: string; path?: string; snapshotId?: string },\n options?: SignalOptionsIface,\n ) => Promise<SandboxDirectoryIface>;\n /** Resolves a file or directory without waking its sandbox. */\n sandboxPath: (\n args: { bindingId: string; path?: string; snapshotId?: string },\n options?: SignalOptionsIface,\n ) => Promise<SandboxPathIface>;\n /** Bounded recursive path search; truncated signals incomplete traversal. */\n searchSandboxFiles: (\n args: { bindingId: string; path?: string; query: string; limit?: number },\n options?: SignalOptionsIface,\n ) => Promise<SandboxSearchIface>;\n /** A byte range of a file in a running sandbox, at most 1 MiB (`\u2026/sandboxes/:bindingId/file`). */\n sandboxFile: (\n args: {\n bindingId: string;\n path: string;\n offset?: number;\n length?: number;\n snapshotId?: string;\n },\n options?: SignalOptionsIface,\n ) => Promise<SandboxFileIface>;\n inspectSandboxProcesses(\n args: { bindingId: string; request: ProcessInspectionRequestIface },\n options?: SignalOptionsIface,\n ): Promise<ProcessInspectionResultIface>;\n /** Opens a provider editor for an existing workspace, with write authorization. */\n openSandboxEditor(\n args: { bindingId: string },\n options?: SignalOptionsIface,\n ): Promise<SandboxEditorSessionIface>;\n refreshSandboxEditor(\n args: { bindingId: string; editorId: string; authorizationId: string },\n options?: SignalOptionsIface,\n ): Promise<SandboxEditorSessionIface>;\n closeSandboxEditor(\n args: { bindingId: string; editorId: string; authorizationId: string },\n options?: SignalOptionsIface & { keepalive?: boolean },\n ): Promise<void>;\n /** Raw streaming bytes (`\u2026/file/content`). The caller consumes or cancels the response body. */\n sandboxFileContent: (\n args: SandboxFileContentArgsIface,\n options?: SignalOptionsIface,\n ) => Promise<Response>;\n /**\n * An authenticated request for a browser/native media or download client.\n * Cookie clients can use the URL directly; bearer clients must supply headers.\n * Every request rechecks membership and confinement; never wakes the sandbox.\n */\n sandboxFileContentRequest: (\n args: SandboxFileContentArgsIface,\n ) => Promise<SandboxFileContentRequestIface>;\n /** A short-lived screen preview of a running sandbox; 404 when it serves none (`\u2026/preview`). */\n sandboxPreview: (\n args: { bindingId: string; viewOnly?: boolean },\n options?: SignalOptionsIface,\n ) => Promise<SandboxPreviewType>;\n /** Starts a parked sandbox (conversation owners and admins; `POST \u2026/wake`). */\n wakeSandbox: (\n args: { bindingId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationSandboxIface>;\n /** The conversation's runtime schedules: reminders and recurring checks (`GET \u2026/schedules`). */\n schedules: (options?: SignalOptionsIface) => Promise<ConversationScheduleIface[]>;\n /**\n * Creates a schedule owned by one agent participant (`POST \u2026/schedules`).\n * Agents create their own; people need to be conversation owners or admins.\n */\n createSchedule: (\n args: CreateConversationScheduleRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationScheduleIface>;\n /** Changes a schedule (its agent, or conversation owners and admins; `PATCH \u2026/schedules/:id`). */\n updateSchedule: (\n args: { scheduleId: string } & UpdateConversationScheduleRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationScheduleIface>;\n /** Deletes a schedule (`DELETE \u2026/schedules/:id`). */\n deleteSchedule: (args: { scheduleId: string }, options?: SignalOptionsIface) => Promise<void>;\n /**\n * The conversations this one handed work to, with what their agents are\n * doing (`GET \u2026/links`). Their replies and waits arrive here as messages.\n */\n links: (options?: SignalOptionsIface) => Promise<ConversationLinkIface[]>;\n /** Conversations receiving this conversation\u2019s delegated results. */\n parentLinks: (options?: SignalOptionsIface) => Promise<ConversationLinkIface[]>;\n /**\n * Links another conversation the caller belongs to (`POST \u2026/links`); linking\n * it again returns the same link. Links never form a cycle.\n */\n link: (\n args: { conversationId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationLinkIface>;\n /** Removes a link (`DELETE \u2026/links/:linkId`); both conversations remain. */\n unlink: (args: { linkId: string }, options?: SignalOptionsIface) => Promise<void>;\n}\n\nexport interface ConversationAgentTurnIface {\n participantId: string;\n sessionId: string;\n state: AgentSessionState | WireFallback;\n /** A turn is running or waiting on a decision. */\n running: boolean;\n}\n\n/** Session states in which a turn is open. */\nexport const TURN_OPEN_SESSION_STATES: ReadonlySet<AgentSessionState | WireFallback> = new Set([\n AgentSessionState.Running,\n AgentSessionState.RequiresAction,\n]);\n\nexport interface OpenedConversationIface extends ConversationHandleIface {\n conversation: ConversationIface;\n}\n\nexport interface CreateConversationArgsIface extends SignalOptionsIface {\n /**\n * The project (`prj_...`) a group chat is created in (editors only); omitted,\n * the API key's parent project (a signed-in person's: My Work).\n * A direct chat is the caller's own and lives in their personal project.\n */\n projectId?: string;\n kind: EnumInput<ConversationKind>;\n title?: string;\n participants: ParticipantCreateInput[];\n turnPolicy?: EnumInput<AgentTurnPolicy>;\n}\n\nexport interface ConversationsApiIface {\n /**\n * The conversations the caller can read.\n * Without `projectId`: everything the caller can access (an API key: its parent project and\n * every project it is granted; a person: every project they can read). `projectId` narrows to\n * that project and the projects below it.\n */\n list: (\n options?: SignalOptionsIface & {\n cursor?: string;\n limit?: number;\n includeArchived?: boolean;\n projectId?: string;\n },\n ) => Promise<ConversationListIface>;\n /** Finds or creates the caller's direct conversation with an agent. */\n direct: (args: { agent: string } & SignalOptionsIface) => Promise<OpenedConversationIface>;\n /**\n * Finds or creates the caller's own Project Agent thread in `projectId`, which\n * omitted, is the API key's parent project (a signed-in person's: My Work).\n */\n home: (options?: SignalOptionsIface & { projectId?: string }) => Promise<OpenedConversationIface>;\n create: (args: CreateConversationArgsIface) => Promise<OpenedConversationIface>;\n /** I/O-free handle. */\n get: (conversationId: string) => ConversationHandleIface;\n /** Full-text search over the caller's conversations (or one), newest first. */\n search: (\n args: {\n q: string;\n conversationId?: string;\n cursor?: string;\n limit?: number;\n } & SignalOptionsIface,\n ) => Promise<SearchMessagesPageIface>;\n /**\n * The caller's conversation list topic (`user.collection:<userId>:conversations`):\n * `conversation.list.changed` and `conversation.updated` events, and a\n * `collection.resync` whenever `list()` must be re-read (on every\n * subscription, resync and while realtime is down).\n */\n listEvents: (options?: CollectionEventsOptionsIface) => AsyncIterableIterator<CollectionEvent>;\n /**\n * What awaits the caller's answer across conversations.\n * Without `projectId`: everything the caller can access (an API key: its parent project and\n * every project it is granted; a person: every project they can read). `projectId` narrows to\n * that project and the projects below it.\n */\n decisions: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number; projectId?: string },\n ) => Promise<DecisionsPageIface>;\n}\n\nconst conversationPath = (conversationId: string, suffix = ''): string =>\n `/v1/conversations/${encodePath(conversationId)}${suffix}`;\n\nconst messagePath = (conversationId: string, messageId: string, suffix = ''): string =>\n conversationPath(conversationId, `/messages/${encodePath(messageId)}${suffix}`);\n\ninterface ConversationStreamArgsIface {\n context: ClientContextIface;\n conversationId: string;\n options: ConversationEventsOptionsIface | undefined;\n listMessages: (options: ListMessagesOptionsIface) => Promise<ConversationMessagesPageIface>;\n listParticipants: (options: SignalOptionsIface) => Promise<ParticipantIface[]>;\n getSession: (sessionId: string, options: SignalOptionsIface) => Promise<AgentSessionIface>;\n sessionDecisions: (\n sessionId: string,\n options: SignalOptionsIface,\n ) => Promise<DecisionRecordIface[]>;\n}\n\n// Bounds on the ids a stream remembers to dedupe transient events.\nconst MAX_REMEMBERED = 4096;\n\n// `GET /v1/sessions/:id/decisions` returns at most this many open decisions; a\n// list that long may be truncated, so absence from it proves nothing.\nconst SESSION_DECISIONS_LIMIT = 200;\n\nconst remember = <Key, Value>(map: Map<Key, Value>, key: Key, value: Value): void => {\n map.delete(key);\n map.set(key, value);\n if (map.size > MAX_REMEMBERED) {\n const oldest = map.keys().next();\n if (oldest.done !== true) map.delete(oldest.value);\n }\n};\n\ntype TurnStartedEventIface = AgentRealtimeEventOf<AgentRealtimeKind.TurnStarted>;\n\nconst isTransientEvent = (event: AgentRealtimeEvent): boolean =>\n event.kind === AgentRealtimeKind.DecisionChanged ||\n event.kind === AgentRealtimeKind.TurnStarted ||\n event.kind === AgentRealtimeKind.TurnEnded;\n\nconst REPLAY_PAGE = 100;\n/**\n * Every recovery rescans this far behind the newest change seen: `updated_at`\n * is a transaction's start time, so a slow write (a lock wait) can commit\n * after newer changes were delivered.\n */\nexport const RECOVERY_SKEW_MS = 30_000;\n\nconst stampOf = (message: ConversationMessageIface): number =>\n Math.max(\n ...[message.updatedAt, message.deletedAt, message.createdAt].map((value) =>\n value == null ? 0 : Date.parse(value) || 0,\n ),\n );\n\n/** The newest copy of a message the stream has emitted (or the caller already had). */\nexport interface MessageVersionIface {\n /** The server's per-message change counter: a total order when both copies carry it. */\n revision: number | null;\n /** `updatedAt` in ms; distinct changes can share a millisecond. */\n updatedAt: number | null;\n /** Newest of updatedAt/deletedAt/createdAt, for messages without `updatedAt`. */\n stamp: number;\n deleted: boolean;\n final: boolean;\n fingerprint: string;\n}\n\nconst isoMs = (value: string | null): number | null => {\n if (value == null) return null;\n const ms = Date.parse(value);\n return Number.isNaN(ms) ? null : ms;\n};\n\nexport const messageVersionOf = (message: ConversationMessageIface): MessageVersionIface => ({\n revision: message.revision,\n updatedAt: isoMs(message.updatedAt),\n stamp: stampOf(message),\n deleted: message.deletedAt != null,\n final: message.streaming?.state === MessageStreamingState.Final,\n fingerprint: JSON.stringify([\n message.deletedAt,\n message.streaming?.state ?? null,\n message.body,\n message.reactions,\n ]),\n});\n\n/**\n * Whether `incoming` is newer than the copy already emitted; older or equal\n * copies are dropped. A deletion is never undone. `revision` orders copies\n * when both carry it. Otherwise `updatedAt` does, where a finalized reply\n * beats a streaming copy from the same millisecond; without either, a later\n * change time wins, a finalized reply is never undone by a copy at the same\n * time, and equal times fall back to content.\n */\nexport const isNewerMessageVersion = (\n incoming: MessageVersionIface,\n current: MessageVersionIface | undefined,\n): boolean => {\n if (current == null) return true;\n if (current.deleted && !incoming.deleted) return false;\n if (incoming.revision != null && current.revision != null) {\n return incoming.revision > current.revision;\n }\n if (incoming.updatedAt != null && current.updatedAt != null) {\n if (incoming.updatedAt !== current.updatedAt) return incoming.updatedAt > current.updatedAt;\n return incoming.final && !current.final;\n }\n if (incoming.stamp !== current.stamp) return incoming.stamp > current.stamp;\n if (current.final && !incoming.final) return false;\n return incoming.fingerprint !== current.fingerprint;\n};\n\ninterface PendingLiveIface {\n event: AgentRealtimeEvent;\n meta: ConversationEventMetaIface;\n // A transient event whose state was recorded when it arrived (or was recovered);\n // released as is.\n noted: boolean;\n}\n\n/**\n * Live conversation events. On every resubscribe or resync the stream\n * recovers what changed while it was away: messages created *or updated*\n * (including thread replies), scanned in the server's (updated_at, id) order.\n * The first scan starts at the newest change seen minus a skew; every scan\n * ends on the server's change cursor, and the next scan resumes from it, so\n * messages that share an update time are never skipped between pages.\n * Live events that arrive during recovery are held and released after it,\n * and message events are deduped by id and version, so a reconnect neither\n * loses nor repeats a message.\n */\nconst streamConversationEvents = (\n args: ConversationStreamArgsIface,\n): AsyncIterableIterator<ConversationEvent> => {\n const topic = agentRealtimeTopics.conversation(args.conversationId);\n const follow = args.options?.follow ?? true;\n const controller = new AbortController();\n const signal = AbortSignal.any([\n controller.signal,\n args.context.closeSignal,\n ...(args.options?.signal == null ? [] : [args.options.signal]),\n ]);\n const versions = new Map<string, MessageVersionIface>();\n let newestStamp: number | null = null;\n const subscribedAt = Date.now();\n let recoveryFloor: number | null = null;\n let subscribedOnce = false;\n let recovering = 0;\n let recovery: Promise<void> = Promise.resolve();\n const held: PendingLiveIface[] = [];\n const recoverTransientState = args.options?.recoverTransient ?? true;\n // Transient events emitted so far, so live and recovered copies are emitted once.\n // `noted` orders each entry against recovery snapshots (see recoverTransient).\n let transientClock = 0;\n const decisionsSeen = new Map<\n string,\n { state: DecisionEventState; decision: DecisionRecordIface; noted: number }\n >();\n const runningTurns = new Map<string, { turn: TurnStartedEventIface; noted: number }>();\n const endedTurns = new Map<string, true>();\n // The realtime transport reported a retryable error and has not resubscribed since.\n let degraded = false;\n let pollTimer: ReturnType<typeof setTimeout> | null = null;\n const clearPoll = (): void => {\n if (pollTimer != null) clearTimeout(pollTimer);\n pollTimer = null;\n };\n let unsubscribe: (() => void) | null = null;\n let detachAbort: () => void = () => {};\n let detachClose: () => void = () => {};\n const queue = createAsyncQueue<ConversationEvent>(() => {\n controller.abort();\n held.length = 0;\n clearPoll();\n unsubscribe?.();\n detachAbort();\n detachClose();\n });\n const resumeFrom = args.options?.resumeFrom ?? [];\n // Taken when `events()` is called, before subscribing; see recoverFromAnchor.\n const anchor =\n resumeFrom.length === 0 && args.options?.afterSeq == null\n ? args.listMessages({ limit: 1, thread: MessageThreadFilter.All, signal })\n : null;\n // A failed anchor read surfaces through the recovery that awaits it.\n anchor?.catch(() => {});\n for (const message of resumeFrom) {\n versions.set(message.id, messageVersionOf(message));\n newestStamp = Math.max(newestStamp ?? 0, stampOf(message));\n }\n\n /** Emits a message event only when it is newer than every copy of that message emitted so far. */\n const emitMessage = (\n message: ConversationMessageIface,\n meta: ConversationEventMetaIface,\n live: AgentRealtimeEvent | null,\n ): void => {\n const version = messageVersionOf(message);\n const previous = versions.get(message.id);\n if (!isNewerMessageVersion(version, previous)) return;\n versions.set(message.id, version);\n newestStamp = Math.max(newestStamp ?? 0, stampOf(message));\n if (live != null) {\n queue.push({ ...live, ...meta });\n return;\n }\n queue.push(\n previous == null\n ? { kind: AgentRealtimeKind.MessageCreated, message, ...meta }\n : { kind: AgentRealtimeKind.MessageUpdated, message, ...meta },\n );\n };\n\n /** Records a decision event; false when an equal or newer state was already emitted. */\n const noteDecision = (\n decision: DecisionRecordIface,\n state: DecisionEventState | WireFallback,\n ): boolean => {\n const seen = decisionsSeen.get(decision.id);\n if (state === DecisionEventState.Resolved) {\n if (seen?.state === DecisionEventState.Resolved) return false;\n transientClock += 1;\n remember(decisionsSeen, decision.id, { state, decision, noted: transientClock });\n return true;\n }\n if (state === DecisionEventState.Created) {\n if (seen != null) return false;\n transientClock += 1;\n remember(decisionsSeen, decision.id, { state, decision, noted: transientClock });\n return true;\n }\n return true;\n };\n\n /** Records a decision or turn event's state; false when it repeats one already emitted. */\n const noteTransient = (event: AgentRealtimeEvent): boolean => {\n if (event.kind === AgentRealtimeKind.DecisionChanged)\n return noteDecision(event.decision, event.state);\n if (event.kind === AgentRealtimeKind.TurnStarted) {\n if (!endedTurns.has(event.turnId)) {\n transientClock += 1;\n remember(runningTurns, event.turnId, { turn: event, noted: transientClock });\n }\n return true;\n }\n if (event.kind === AgentRealtimeKind.TurnEnded) {\n if (endedTurns.has(event.turnId)) return false;\n remember(endedTurns, event.turnId, true);\n runningTurns.delete(event.turnId);\n }\n return true;\n };\n\n const emitLive = (event: AgentRealtimeEvent, meta: ConversationEventMetaIface): void => {\n if (\n event.kind === AgentRealtimeKind.MessageCreated ||\n event.kind === AgentRealtimeKind.MessageUpdated\n ) {\n emitMessage(event.message, meta, event);\n return;\n }\n if (event.kind === AgentRealtimeKind.MessageDeleted) {\n // A deletion outranks every copy up to its time, so a held or replayed older copy cannot restore it.\n const current = versions.get(event.messageId);\n if (current?.deleted === true) return;\n const deletedAt = isoMs(event.deletedAt) ?? current?.stamp ?? 0;\n versions.set(event.messageId, {\n revision: current?.revision ?? null,\n updatedAt: Math.max(current?.updatedAt ?? 0, deletedAt),\n stamp: Math.max(current?.stamp ?? 0, deletedAt),\n deleted: true,\n final: current?.final ?? false,\n fingerprint: current?.fingerprint ?? '',\n });\n }\n if (!noteTransient(event)) return;\n queue.push({ ...event, ...meta });\n };\n\n const replayed = (message: ConversationMessageIface): ConversationEventMetaIface => ({\n topic,\n cursor: null,\n createdAt: message.updatedAt ?? message.createdAt,\n replayed: true,\n });\n\n const emitPage = (messages: ConversationMessageIface[]): void => {\n for (const message of [...messages].sort((left, right) => left.seq - right.seq)) {\n emitMessage(message, replayed(message), null);\n }\n };\n\n /**\n * One change scan, paged by the server's cursor. Every scan starts over from\n * the oldest writer active before the preceding scan (or the newest change\n * minus the skew for older servers), never from the last scan\u2019s cursor:\n * `updated_at` is the writing transaction's start time, so a change can\n * commit after a later one was already seen. Revision ordering drops the\n * repeats the overlap brings back.\n */\n const recoverChanges = async (): Promise<void> => {\n const since = Math.max(\n 0,\n Math.min(newestStamp ?? subscribedAt, recoveryFloor ?? Infinity) - RECOVERY_SKEW_MS,\n );\n let position: { updatedCursor: string } | { updatedAfter: string } = {\n updatedAfter: new Date(since).toISOString(),\n };\n let nextFloor: number | null = null;\n for (;;) {\n const page = await args.listMessages({\n ...position,\n thread: MessageThreadFilter.All,\n limit: REPLAY_PAGE,\n signal,\n });\n if (nextFloor == null && page.recoverySince != null) {\n const stamp = Date.parse(page.recoverySince);\n if (Number.isFinite(stamp)) nextFloor = stamp;\n }\n emitPage(page.messages);\n const next = page.nextUpdatedCursor;\n if (next == null || !page.hasMoreAfter || page.messages.length === 0) {\n recoveryFloor = nextFloor ?? recoveryFloor;\n return;\n }\n position = { updatedCursor: next };\n }\n };\n\n /**\n * With nothing to resume from, the stream anchors on the newest message at\n * the moment `events()` was called and, once subscribed, recovers every\n * change after it. So a message posted between a caller's first page and the\n * gateway registering the subscription still arrives (marked `replayed`).\n */\n const recoverFromAnchor = async (anchor: Promise<ConversationMessagesPageIface>) => {\n const page = await anchor;\n if (page.recoverySince != null) {\n const stamp = Date.parse(page.recoverySince);\n if (Number.isFinite(stamp)) recoveryFloor = stamp;\n }\n const newest = page.messages.reduce<ConversationMessageIface | null>(\n (best, message) => (best == null || message.seq > best.seq ? message : best),\n null,\n );\n if (newest != null && !versions.has(newest.id)) {\n versions.set(newest.id, messageVersionOf(newest));\n newestStamp = Math.max(newestStamp ?? 0, stampOf(newest));\n }\n await recoverChanges();\n };\n\n const recoverAfterSeq = async (afterSeq: number): Promise<void> => {\n let cursor = afterSeq;\n for (;;) {\n const page = await args.listMessages({\n after: cursor,\n thread: MessageThreadFilter.All,\n limit: REPLAY_PAGE,\n signal,\n });\n emitPage(page.messages);\n const next = Math.max(cursor, ...page.messages.map((message) => message.seq));\n if (!page.hasMoreAfter || next === cursor) return;\n cursor = next;\n }\n };\n\n const recoveredMeta = (): ConversationEventMetaIface => ({\n topic,\n cursor: null,\n createdAt: null,\n replayed: true,\n });\n\n /** A read that recovery may skip: retryable failures retry the recovery, others drop the read. */\n const optional = async <Value>(read: () => Promise<Value>): Promise<Value | null> => {\n try {\n return await read();\n } catch (cause) {\n if (isRetryableClientError(cause)) throw cause;\n return null;\n }\n };\n\n // Recovery runs while live events are held: a recovered transient event joins\n // them, so it is released after every live event that arrived before it.\n const emitRecovered = (event: AgentRealtimeEvent): void => {\n held.push({ event, meta: recoveredMeta(), noted: true });\n };\n\n /**\n * Re-reads what only realtime carries (see `recoverTransient`): the open\n * decisions and turn state of every agent participant's session.\n * Live transient events held during recovery record their state on arrival,\n * so the snapshot settles what was recorded before it was requested, and\n * never a turn or request that arrived live after it.\n */\n const recoverTransient = async (): Promise<void> => {\n if (!recoverTransientState) return;\n const asOf = transientClock;\n const participants = await optional(() => args.listParticipants({ signal }));\n const current =\n participants == null\n ? null\n : new Set(\n participants.flatMap((participant) =>\n participant.kind === ParticipantKind.Agent &&\n participant.sessionId != null &&\n participant.leftAt == null\n ? [participant.sessionId]\n : [],\n ),\n );\n // Sessions the stream holds open state for, including ones whose agent has since left.\n const remembered = new Set([\n ...[...decisionsSeen.values()].flatMap((seen) =>\n seen.state === DecisionEventState.Created && seen.decision.sessionId != null\n ? [seen.decision.sessionId]\n : [],\n ),\n ...[...runningTurns.values()].map((entry) => entry.turn.sessionId),\n ]);\n const checked = await Promise.all(\n [...new Set([...(current ?? []), ...remembered])].map(async (sessionId) => {\n const [session, open] = await Promise.all([\n optional(() => args.getSession(sessionId, { signal })),\n optional(() => args.sessionDecisions(sessionId, { signal })),\n ]);\n // An agent that left: its session is closed, and may no longer be readable.\n const departed = current != null && !current.has(sessionId);\n return {\n sessionId,\n running:\n session == null\n ? departed\n ? false\n : null\n : TURN_OPEN_SESSION_STATES.has(session.state),\n open: open ?? (departed ? [] : null),\n };\n }),\n );\n for (const { sessionId, running, open } of checked) {\n if (open != null) {\n const complete = open.length < SESSION_DECISIONS_LIMIT;\n const openIds = new Set(open.map((decision) => decision.id));\n for (const decision of open) {\n if (noteDecision(decision, DecisionEventState.Created))\n emitRecovered({\n kind: AgentRealtimeKind.DecisionChanged,\n decision,\n state: DecisionEventState.Created,\n });\n }\n for (const seen of [...decisionsSeen.values()]) {\n if (\n !complete ||\n seen.state !== DecisionEventState.Created ||\n seen.noted > asOf ||\n seen.decision.sessionId !== sessionId ||\n openIds.has(seen.decision.id)\n )\n continue;\n noteDecision(seen.decision, DecisionEventState.Resolved);\n emitRecovered({\n kind: AgentRealtimeKind.DecisionChanged,\n decision: seen.decision,\n state: DecisionEventState.Resolved,\n });\n }\n }\n if (running !== false) continue;\n for (const { turn, noted } of [...runningTurns.values()]) {\n if (turn.sessionId !== sessionId || noted > asOf) continue;\n runningTurns.delete(turn.turnId);\n remember(endedTurns, turn.turnId, true);\n emitRecovered({\n kind: AgentRealtimeKind.TurnEnded,\n conversationId: turn.conversationId,\n participantId: turn.participantId,\n sessionId: turn.sessionId,\n turnId: turn.turnId,\n stopReason: null,\n });\n }\n }\n };\n\n /** Runs a recovery while holding live events; the cursor is captured now, not when it runs. */\n const scheduleRecovery = (run: () => Promise<void>): void => {\n recovering += 1;\n recovery = recovery\n .then(async () => {\n let delay = 250;\n while (!queue.closed()) {\n try {\n await run();\n return;\n } catch (cause) {\n if (!follow || !isRetryableClientError(cause)) throw cause;\n await new Promise<void>((resolve) => {\n const done = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', done);\n resolve();\n };\n const timer = setTimeout(done, delay);\n if (signal.aborted) done();\n else signal.addEventListener('abort', done, { once: true });\n });\n delay = Math.min(delay * 2, 30_000);\n }\n }\n })\n .then(() => {\n recovering -= 1;\n if (recovering > 0) return;\n for (const entry of held.splice(0)) {\n if (entry.noted) queue.push({ ...entry.event, ...entry.meta });\n else emitLive(entry.event, entry.meta);\n }\n })\n .catch((cause) => queue.fail(cause));\n };\n\n // Reads the newest change when it runs, after any recovery queued before it.\n let newestRecoveryPending = false;\n let newestRecoveryRequested = false;\n const recoverFromNewest = (): void => {\n newestRecoveryRequested = true;\n if (newestRecoveryPending) return;\n newestRecoveryPending = true;\n scheduleRecovery(async () => {\n do {\n newestRecoveryRequested = false;\n await recoverChanges();\n await recoverTransient();\n } while (newestRecoveryRequested && !queue.closed());\n newestRecoveryPending = false;\n });\n };\n\n let initialRecoveryStarted = false;\n /** What the first subscription (or, while realtime is down, the first poll) recovers. */\n const startInitialRecovery = (): void => {\n if (initialRecoveryStarted) return;\n initialRecoveryStarted = true;\n const afterSeq = args.options?.afterSeq;\n if (afterSeq != null) scheduleRecovery(() => recoverAfterSeq(afterSeq));\n if (resumeFrom.length > 0) recoverFromNewest();\n if (anchor != null)\n scheduleRecovery(async () => {\n try {\n await recoverFromAnchor(anchor);\n } catch (cause) {\n if (!isRetryableClientError(cause)) throw cause;\n // A later anchor could hide messages written during the outage.\n await recoverChanges();\n }\n });\n // recoverFromNewest recovers transient state itself.\n if (resumeFrom.length === 0) scheduleRecovery(recoverTransient);\n };\n\n // HTTP polling while the realtime transport reports errors.\n const poll = (): void => {\n pollTimer = null;\n if (!degraded || queue.closed()) return;\n if (initialRecoveryStarted) recoverFromNewest();\n else startInitialRecovery();\n void recovery.then(() => {\n if (!degraded || queue.closed() || pollTimer != null) return;\n pollTimer = setTimeout(poll, args.context.timing.conversationPollIntervalMs);\n });\n };\n\n const onFrame = (raw: RealtimeTransportFrameIface): void => {\n const frame = agentRealtimeFrameSchema.safeParse(raw);\n if (!frame.success || queue.closed()) return;\n switch (frame.data.type) {\n case AgentRealtimeFrameType.Event: {\n const envelope = frame.data;\n const entry = {\n event: parseAgentRealtimeEvent(envelope),\n meta: {\n topic: envelope.topic,\n cursor: envelope.cursor,\n createdAt: envelope.createdAt,\n replayed: false,\n },\n };\n if (recovering > 0) {\n // Ending explicitly preserves transient events; a caller can reopen and recover messages.\n if (held.length >= 1024) {\n queue.fail(\n clientError({\n code: ClientErrorCode.Network,\n status: 0,\n message: 'Conversation recovery buffer is full; reconnect from the last message.',\n }),\n );\n return;\n }\n // Transient events record their state now, so recovery reconciles them.\n if (isTransientEvent(entry.event)) {\n if (noteTransient(entry.event)) held.push({ ...entry, noted: true });\n } else held.push({ ...entry, noted: false });\n } else emitLive(entry.event, entry.meta);\n return;\n }\n case AgentRealtimeFrameType.Subscribed: {\n degraded = false;\n clearPoll();\n if (!subscribedOnce) {\n subscribedOnce = true;\n // Polls during an outage before the first subscription already ran the initial recovery.\n if (initialRecoveryStarted) recoverFromNewest();\n else startInitialRecovery();\n } else {\n recoverFromNewest();\n args.options?.onResubscribed?.();\n }\n if (!follow) void recovery.then(() => queue.end());\n return;\n }\n case AgentRealtimeFrameType.ResyncRequired:\n recoverFromNewest();\n args.options?.onResubscribed?.();\n return;\n case AgentRealtimeFrameType.Error:\n if (isTerminalRealtimeError(frame.data)) {\n queue.fail(\n realtimeSubscriptionError({\n topic: frame.data.topic ?? topic,\n code: frame.data.code ?? 'unknown',\n message: frame.data.message ?? 'Realtime subscription was refused',\n }),\n );\n return;\n }\n // Retryable: the transport resubscribes (and its `subscribed` runs recovery);\n // meanwhile the stream recovers over HTTP. A non-following stream ends once\n // that recovery is current.\n if (!follow) {\n if (subscribedOnce) return;\n subscribedOnce = true;\n startInitialRecovery();\n void recovery.then(() => queue.end());\n return;\n }\n if (!degraded) {\n degraded = true;\n poll();\n }\n return;\n default:\n return;\n }\n };\n\n detachAbort = failOnAbort(queue, signal);\n detachClose = failOnAbort(queue, args.context.closeSignal);\n if (!queue.closed()) {\n const subscribeOptions =\n args.options?.afterCursor == null ? undefined : { afterCursor: args.options.afterCursor };\n const stop = args.context.realtime().subscribe(topic, onFrame, subscribeOptions);\n if (queue.closed()) stop();\n else unsubscribe = stop;\n }\n return queue.iterator;\n};\n\nexport const createConversationHandle = (\n context: ClientContextIface,\n conversationId: string,\n): ConversationHandleIface => {\n const { http } = context;\n\n const sandboxFileContentRequest = async (\n args: SandboxFileContentArgsIface,\n ): Promise<SandboxFileContentRequestIface> => {\n if (args.path.length === 0 || args.path.length > 4096 || args.path.includes('\\0')) {\n throw clientError({\n message: 'Invalid sandbox file path',\n status: 0,\n code: ClientErrorCode.InvalidRequest,\n });\n }\n const target = http.url(\n conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/file/content`),\n );\n target.searchParams.set('path', args.path);\n if (args.snapshotId != null) target.searchParams.set('snapshotId', args.snapshotId);\n if (args.download != null) target.searchParams.set('download', String(args.download));\n const headers = await http.headers();\n if (args.range != null) headers.range = args.range;\n return {\n url: target.toString(),\n headers,\n credentials: http.usesCookies ? 'include' : 'omit',\n };\n };\n\n const listMessages = (options: ListMessagesOptionsIface = {}) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/messages'),\n query: {\n before: options.before,\n after: options.after,\n limit: options.limit,\n thread: options.thread,\n updatedAfter: options.updatedAfter,\n updatedCursor: options.updatedCursor,\n },\n response: conversationMessagesPageSchema,\n signal: options.signal,\n });\n\n const listParticipants = async (options: SignalOptionsIface) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/participants'),\n response: participantListSchema,\n signal: options.signal,\n })\n ).participants;\n\n const getSession = (sessionId: string, options: SignalOptionsIface) =>\n http.request({\n method: HttpMethod.Get,\n path: `/v1/sessions/${encodePath(sessionId)}`,\n response: sessionSchema,\n signal: options.signal,\n });\n\n const sessionDecisions = async (sessionId: string, options: SignalOptionsIface) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: `/v1/sessions/${encodePath(sessionId)}/decisions`,\n response: decisionRecordListSchema,\n signal: options.signal,\n })\n ).decisions;\n\n const reaction = async (args: {\n method: HttpMethod;\n messageId: string;\n emoji: string;\n signal?: AbortSignal;\n }): Promise<ReactionIface[]> =>\n (\n await http.request({\n method: args.method,\n path: messagePath(conversationId, args.messageId, '/reactions'),\n body: { schema: reactionRequestSchema, value: { emoji: args.emoji } },\n response: reactionsResponseSchema,\n signal: args.signal,\n })\n ).reactions;\n\n return {\n id: conversationId,\n info: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId),\n response: conversationSchema,\n signal: options?.signal,\n }),\n send: async (content, options) => {\n const sent = await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/messages'),\n body: {\n schema: sendMessageRequestSchema,\n value: {\n content,\n clientMessageId: options?.clientMessageId ?? context.newKey(),\n replyTo: options?.replyTo,\n threadRootId: options?.threadRootId,\n quotes: options?.quotes,\n mentions: options?.mentions,\n attachmentIds: options?.attachmentIds,\n clientSubmittedAtMs: options?.clientSubmittedAtMs ?? context.now(),\n },\n },\n response: sendMessageResponseSchema,\n signal: options?.signal,\n });\n return {\n message: sent.message,\n messageId: sent.message.id,\n seq: sent.message.seq,\n deliveries: sent.deliveries,\n };\n },\n events: (options) =>\n streamConversationEvents({\n context,\n conversationId,\n options,\n listMessages,\n listParticipants,\n getSession,\n sessionDecisions,\n }),\n messages: (options) => listMessages(options),\n deliveries: async (args, options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: `${messagePath(conversationId, args.messageId)}/deliveries`,\n response: messageDeliveriesSchema,\n signal: options?.signal,\n })\n ).deliveries,\n message: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: messagePath(conversationId, args.messageId),\n response: conversationMessageSchema,\n signal: options?.signal,\n }),\n react: (args, options) =>\n reaction({ method: HttpMethod.Post, ...args, signal: options?.signal }),\n unreact: (args, options) =>\n reaction({ method: HttpMethod.Delete, ...args, signal: options?.signal }),\n markThreadRead: async ({ rootId, throughSeq }, options) => {\n await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, `/threads/${encodePath(rootId)}/read`),\n body: { schema: markReadRequestSchema, value: { throughSeq } },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n postEvent: (event, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/events'),\n body: { schema: postConversationEventRequestSchema, value: event },\n response: postConversationEventResponseSchema,\n signal: options?.signal,\n }),\n typing: async (args, options) => {\n await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/typing'),\n body: { schema: typingRequestSchema, value: args },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n recordPushOpen: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(\n conversationId,\n `/push-deliveries/${encodeURIComponent(args.deliveryId)}/open`,\n ),\n response: pushDeliveryOpenResponseSchema,\n signal: options?.signal,\n }),\n markRead: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/read'),\n body: { schema: markReadRequestSchema, value: args },\n response: readStateSchema,\n signal: options?.signal,\n }),\n respond: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/respond'),\n body: {\n schema: respondDecisionSchema,\n value: { decisionId: args.decisionId, outcome: outcomeOf(args) },\n },\n response: respondDecisionResponseSchema,\n signal: options?.signal,\n context: { decisionId: args.decisionId },\n }),\n cancel: async (options) => {\n await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/cancel'),\n body: {\n schema: cancelConversationRequestSchema,\n value: { reason: options?.reason, throughMessageSeq: options?.throughMessageSeq },\n },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n participants: (options) => listParticipants({ signal: options?.signal }),\n turns: async (options) => {\n const participants = await listParticipants({ signal: options?.signal });\n return Promise.all(\n participants.flatMap((participant) => {\n const sessionId = participant.sessionId;\n if (participant.kind !== ParticipantKind.Agent || sessionId == null) return [];\n return [\n getSession(sessionId, { signal: options?.signal }).then(\n (session): ConversationAgentTurnIface => ({\n participantId: participant.id,\n sessionId,\n state: session.state,\n running: TURN_OPEN_SESSION_STATES.has(session.state),\n }),\n ),\n ];\n }),\n );\n },\n addParticipant: (participant, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/participants'),\n body: { schema: participantInputSchema, value: participant },\n response: participantSchema,\n signal: options?.signal,\n }),\n updateParticipant: ({ participantId, ...patch }, options) =>\n http.request({\n method: HttpMethod.Patch,\n path: conversationPath(conversationId, `/participants/${encodePath(participantId)}`),\n body: { schema: updateParticipantRequestSchema, value: patch },\n response: participantSchema,\n signal: options?.signal,\n }),\n removeParticipant: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(conversationId, '/participants'),\n body: { schema: removeParticipantRequestSchema, value: args },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n update: (patch, options) =>\n http.request({\n method: HttpMethod.Patch,\n path: conversationPath(conversationId),\n body: { schema: updateConversationRequestSchema, value: patch },\n response: conversationSchema,\n signal: options?.signal,\n }),\n delete: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: messagePath(conversationId, args.messageId),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n links: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/links'),\n response: conversationLinkListSchema,\n signal: options?.signal,\n })\n ).links,\n parentLinks: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/parent-links'),\n response: conversationLinkListSchema,\n signal: options?.signal,\n })\n ).links,\n link: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/links'),\n body: { schema: createConversationLinkRequestSchema, value: args },\n response: conversationLinkSchema,\n signal: options?.signal,\n }),\n unlink: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(conversationId, `/links/${encodePath(args.linkId)}`),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n attachmentUrl: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/attachments/${encodePath(args.attachmentId)}`),\n response: attachmentDownloadSchema,\n signal: options?.signal,\n }),\n sandboxes: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/sandboxes'),\n response: conversationSandboxListSchema,\n signal: options?.signal,\n })\n ).sandboxes,\n sandboxFiles: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/files`),\n query: { path: args.path, snapshotId: args.snapshotId },\n response: sandboxDirectorySchema,\n signal: options?.signal,\n }),\n sandboxPath: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/path`),\n query: { path: args.path, snapshotId: args.snapshotId },\n response: sandboxPathSchema,\n signal: options?.signal,\n }),\n searchSandboxFiles: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/files/search`,\n ),\n query: { path: args.path, query: args.query, limit: args.limit },\n response: sandboxSearchSchema,\n signal: options?.signal,\n }),\n sandboxFile: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/file`),\n query: {\n path: args.path,\n offset: args.offset,\n length: args.length,\n snapshotId: args.snapshotId,\n },\n response: sandboxFileSchema,\n signal: options?.signal,\n }),\n sandboxFileContentRequest,\n openSandboxEditor: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/editor`),\n response: sandboxEditorSessionSchema,\n signal: options?.signal,\n }),\n refreshSandboxEditor: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/editor/${encodePath(args.editorId)}/refresh`,\n ),\n body: {\n schema: sandboxEditorAuthorizationSchema,\n value: { authorizationId: args.authorizationId },\n },\n response: sandboxEditorSessionSchema,\n signal: options?.signal,\n }),\n closeSandboxEditor: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/editor/${encodePath(args.editorId)}`,\n ),\n body: {\n schema: sandboxEditorAuthorizationSchema,\n value: { authorizationId: args.authorizationId },\n },\n response: okResponseSchema,\n signal: options?.signal,\n keepalive: options?.keepalive,\n });\n },\n sandboxFileContent: async (args, options) => {\n const request = await sandboxFileContentRequest(args);\n let response: Response;\n try {\n response = await http.fetch(request.url, {\n method: HttpMethod.Get,\n headers: request.headers,\n credentials: request.credentials,\n signal: options?.signal,\n });\n } catch (cause) {\n if (options?.signal?.aborted === true) throw cause;\n throw clientError({\n message: 'Sandbox file request failed',\n status: 0,\n code: ClientErrorCode.Network,\n cause,\n });\n }\n if (!response.ok) {\n let text: string;\n try {\n text = await response.text();\n } catch (cause) {\n if (options?.signal?.aborted === true) throw cause;\n throw clientError({\n message: 'Sandbox file response failed',\n status: 0,\n code: ClientErrorCode.Network,\n cause,\n });\n }\n throw errorFromResponse({ status: response.status, text, context: undefined });\n }\n return response;\n },\n inspectSandboxProcesses: (args, options) => {\n const request = processInspectionRequestSchema.parse(args.request);\n const { operation } = request;\n const suffix =\n operation === ProcessInspectionOperation.Available\n ? '/available'\n : 'processId' in request\n ? '/' + encodePath(request.processId)\n : '';\n const query: NonNullable<HttpRequestArgsIface<ProcessInspectionResultIface>['query']> = {};\n if ('bootId' in request) query.bootId = request.bootId;\n if ('cursor' in request) query.cursor = request.cursor;\n if ('limit' in request) query.limit = request.limit;\n return http.request({\n method: operation === ProcessInspectionOperation.Stop ? HttpMethod.Delete : HttpMethod.Get,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/processes${suffix}`,\n ),\n query,\n response: processInspectionResultSchema,\n signal: options?.signal,\n });\n },\n sandboxPreview: (args, options) => {\n const request: HttpRequestArgsIface<SandboxPreviewType> = {\n method: args.viewOnly === false ? HttpMethod.Post : HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/preview`),\n response: sandboxPreviewSchema,\n signal: options?.signal,\n };\n if (args.viewOnly === false)\n request.body = { schema: sandboxPreviewOptionsSchema, value: { viewOnly: false } };\n return http.request(request);\n },\n wakeSandbox: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/wake`),\n response: conversationSandboxSchema,\n signal: options?.signal,\n }),\n schedules: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/schedules'),\n response: conversationScheduleListSchema,\n signal: options?.signal,\n })\n ).schedules,\n createSchedule: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/schedules'),\n body: { schema: createConversationScheduleRequestSchema, value: args },\n response: conversationScheduleSchema,\n signal: options?.signal,\n }),\n updateSchedule: ({ scheduleId, ...patch }, options) =>\n http.request({\n method: HttpMethod.Patch,\n path: conversationPath(conversationId, `/schedules/${encodePath(scheduleId)}`),\n body: { schema: updateConversationScheduleRequestSchema, value: patch },\n response: conversationScheduleSchema,\n signal: options?.signal,\n }),\n deleteSchedule: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(conversationId, `/schedules/${encodePath(args.scheduleId)}`),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n uploadAttachment: async (args) => {\n const sizeBytes = 'byteLength' in args.data ? args.data.byteLength : args.data.size;\n const upload = await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/attachments'),\n body: {\n schema: createAttachmentUploadRequestSchema,\n value: { name: args.name, contentType: args.contentType, sizeBytes },\n },\n response: attachmentUploadSchema,\n signal: args.signal,\n });\n // Presigned upload: storage authenticates the URL, so it gets only the headers the\n // presign requires, through storageFetch, never the API fetch or its credentials.\n const response = await context.storageFetch(upload.uploadUrl, {\n method: upload.method,\n headers: { 'content-type': args.contentType, ...upload.headers },\n body: args.data,\n signal: args.signal,\n credentials: 'omit',\n });\n if (!response.ok) {\n throw clientError({\n message: `Attachment upload failed with status ${response.status}`,\n status: response.status,\n code: ClientErrorCode.UploadFailed,\n body: await response.text(),\n });\n }\n return upload;\n },\n };\n};\n\nexport const createConversationsApi = (context: ClientContextIface): ConversationsApiIface => {\n const opened = (conversation: ConversationIface): OpenedConversationIface => ({\n ...createConversationHandle(context, conversation.id),\n conversation,\n });\n return {\n list: (options) =>\n context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations',\n query: {\n cursor: options?.cursor,\n limit: options?.limit,\n includeArchived: options?.includeArchived,\n projectId: options?.projectId,\n },\n response: conversationListSchema,\n signal: options?.signal,\n }),\n direct: async (args) =>\n opened(\n await context.http.request({\n method: HttpMethod.Post,\n path: '/v1/conversations/direct',\n body: { schema: createDirectConversationRequestSchema, value: { agent: args.agent } },\n response: conversationSchema,\n signal: args.signal,\n }),\n ),\n home: async (options) =>\n opened(\n await context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations/home',\n query: { projectId: options?.projectId },\n response: conversationSchema,\n signal: options?.signal,\n }),\n ),\n create: async (args) =>\n opened(\n await context.http.request({\n method: HttpMethod.Post,\n path: '/v1/conversations',\n body: {\n schema: createConversationRequestSchema,\n value: {\n projectId: args.projectId,\n kind: args.kind,\n title: args.title,\n participants: args.participants,\n turnPolicy: args.turnPolicy,\n },\n },\n response: conversationSchema,\n signal: args.signal,\n }),\n ),\n get: (conversationId) => createConversationHandle(context, conversationId),\n search: (args) =>\n context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations/search',\n query: {\n q: args.q,\n conversationId: args.conversationId,\n cursor: args.cursor,\n limit: args.limit,\n },\n response: searchMessagesPageSchema,\n signal: args.signal,\n }),\n listEvents: (options) =>\n streamCollectionEvents({\n context,\n topicFor: agentRealtimeTopics.userConversations,\n collection: ClientCollection.Conversations,\n options,\n }),\n decisions: (options) =>\n context.http.request({\n method: HttpMethod.Get,\n path: '/v1/decisions',\n query: { cursor: options?.cursor, limit: options?.limit, projectId: options?.projectId },\n response: decisionsPageSchema,\n signal: options?.signal,\n }),\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["anchor"]
|
|
7
7
|
}
|
package/dist/modules/cli/cli.mjs
CHANGED
|
@@ -30,7 +30,7 @@ const USAGE = [
|
|
|
30
30
|
" --timeout <ms> conformance: per-case timeout",
|
|
31
31
|
" --json conformance: print the report as JSON",
|
|
32
32
|
"",
|
|
33
|
-
"FINAL_API_KEY authenticates
|
|
33
|
+
"FINAL_API_KEY authenticates. build checks compatibility only with it.",
|
|
34
34
|
"FINAL_API_HOST selects the deployment for build and publish; it does not rewrite authored URLs.",
|
|
35
35
|
`dev reads route secrets from AGENT_LOCAL_SECRETS_JSON ({"name": "value"}), limited to the manifest's secrets.`
|
|
36
36
|
].join("\n");
|
|
@@ -114,7 +114,7 @@ const runAgentsCommand = async (deps) => {
|
|
|
114
114
|
return 2;
|
|
115
115
|
}
|
|
116
116
|
if (apiKey == null) {
|
|
117
|
-
output.stderr("error: set FINAL_API_KEY to
|
|
117
|
+
output.stderr("error: set FINAL_API_KEY to a Final API key");
|
|
118
118
|
return 2;
|
|
119
119
|
}
|
|
120
120
|
return runPublish({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/cli.ts"],
|
|
4
|
-
"sourcesContent": ["import { resolve } from 'node:path';\nimport { parseArgs } from 'node:util';\nimport * as z from 'zod';\nimport { createClient, type AgentClientIface } from \"../agent-client/client.mjs\";\nimport type { FetchIface } from \"../agent-client/http.mjs\";\nimport { runBuild } from \"./build.mjs\";\nimport { runConformance, type ImportModule } from \"./conformance.mjs\";\nimport { DEFAULT_DEV_PORT, runDev } from \"./dev.mjs\";\nimport { gitListFiles, type ListFiles } from \"./files.mjs\";\nimport type { OutputIface } from \"./output.mjs\";\nimport { runPublish } from \"./publish.mjs\";\n\n// Agent CLI commands:\n// `build` and `publish`, plus `dev` and `conformance`. Shipped as the `final-agents` bin until a general\n// `final` CLI exists; `runAgentsCommand` is what `final agents` would mount.\n\n//
|
|
5
|
-
"mappings": "AAAA,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAC1B,YAAY,OAAO;AACnB,SAAS,oBAA2C;AAEpD,SAAS,gBAAgB;AACzB,SAAS,sBAAyC;AAClD,SAAS,kBAAkB,cAAc;AACzC,SAAS,oBAAoC;AAE7C,SAAS,kBAAkB;
|
|
4
|
+
"sourcesContent": ["import { resolve } from 'node:path';\nimport { parseArgs } from 'node:util';\nimport * as z from 'zod';\nimport { createClient, type AgentClientIface } from \"../agent-client/client.mjs\";\nimport type { FetchIface } from \"../agent-client/http.mjs\";\nimport { runBuild } from \"./build.mjs\";\nimport { runConformance, type ImportModule } from \"./conformance.mjs\";\nimport { DEFAULT_DEV_PORT, runDev } from \"./dev.mjs\";\nimport { gitListFiles, type ListFiles } from \"./files.mjs\";\nimport type { OutputIface } from \"./output.mjs\";\nimport { runPublish } from \"./publish.mjs\";\n\n// Agent CLI commands:\n// `build` and `publish`, plus `dev` and `conformance`. Shipped as the `final-agents` bin until a general\n// `final` CLI exists; `runAgentsCommand` is what `final agents` would mount.\n\n// The agents API, authenticated with FINAL_API_KEY.\nexport const DEFAULT_AGENTS_HOST = 'https://agent-session.final.ai/api';\n\nconst DEFAULT_COMMIT_MESSAGE = 'Publish with final agents publish';\n\nconst USAGE = [\n 'usage: final-agents <command> [options]',\n '',\n 'commands:',\n ' build [dir] compile the agent directory and report on its harness',\n ' dev [dir] serve its channel routes at http://localhost:<port>/<channel><path>',\n ' publish [dir] --agent <slug> commit the checkout to the agent and publish it',\n ' conformance <module> run the harness conformance kit against a harness the module exports',\n '',\n 'options:',\n ' --host <url> agent platform API (overrides FINAL_API_HOST; default ' +\n DEFAULT_AGENTS_HOST +\n ')',\n ' --agent <slug> publish: the agent definition (slug or id)',\n ' --ref <ref> publish: the ref to publish (GitHub-backed agents)',\n ' --message <text> publish: commit message',\n ' --note <text> publish: revision note',\n ` --port <port> dev: port to listen on (default ${DEFAULT_DEV_PORT})`,\n ' --export <name> conformance: the export to test (default \"default\"): a HarnessIface or { harness, dial }',\n ' --profile <name> conformance: final (default) or plain-acp-v2',\n ' --timeout <ms> conformance: per-case timeout',\n ' --json conformance: print the report as JSON',\n '',\n 'FINAL_API_KEY authenticates. build checks compatibility only with it.',\n 'FINAL_API_HOST selects the deployment for build and publish; it does not rewrite authored URLs.',\n 'dev reads route secrets from AGENT_LOCAL_SECRETS_JSON ({\"name\": \"value\"}), limited to the manifest\\'s secrets.',\n].join('\\n');\n\nconst envSchema = z.object({\n FINAL_API_KEY: z.string().min(1).optional(),\n FINAL_API_HOST: z.string().url().optional(),\n});\n\nexport interface AgentsCliDepsIface {\n argv: string[];\n env: Record<string, string | undefined>;\n cwd: string;\n output: OutputIface;\n // Seams: API requests and the checkout's file listing.\n fetch?: FetchIface;\n listFiles?: ListFiles;\n // Ends long-running commands (dev); main.ts aborts it on SIGINT and SIGTERM.\n signal?: AbortSignal;\n // Seam: loads the conformance module (dynamic import by file URL).\n importModule?: ImportModule;\n}\n\nconst optionsConfig = {\n host: { type: 'string' },\n agent: { type: 'string' },\n ref: { type: 'string' },\n message: { type: 'string' },\n note: { type: 'string' },\n port: { type: 'string' },\n export: { type: 'string' },\n profile: { type: 'string' },\n timeout: { type: 'string' },\n json: { type: 'boolean' },\n help: { type: 'boolean', short: 'h' },\n} as const;\n\nconst parseCommandLine = (argv: string[]) =>\n parseArgs({ args: argv, options: optionsConfig, allowPositionals: true });\n\ntype ParsedResult =\n | { ok: true; parsed: ReturnType<typeof parseCommandLine> }\n | { ok: false; message: string };\n\nconst parse = (argv: string[]): ParsedResult => {\n try {\n return { ok: true, parsed: parseCommandLine(argv) };\n } catch (cause) {\n return { ok: false, message: cause instanceof Error ? cause.message : String(cause) };\n }\n};\n\nexport const runAgentsCommand = async (deps: AgentsCliDepsIface): Promise<number> => {\n const { output } = deps;\n const parsedArgs = parse(deps.argv);\n if (!parsedArgs.ok) {\n output.stderr(`error: ${parsedArgs.message}`);\n output.stderr(USAGE);\n return 2;\n }\n const { values, positionals } = parsedArgs.parsed;\n const [command, dirArg, ...extra] = positionals;\n if (values.help === true || command == null || command === 'help') {\n (command == null && values.help !== true ? output.stderr : output.stdout)(USAGE);\n return command == null && values.help !== true ? 2 : 0;\n }\n if (extra.length > 0) {\n output.stderr(`error: unexpected arguments: ${extra.join(' ')}`);\n return 2;\n }\n const env = envSchema.safeParse(deps.env);\n if (!env.success) {\n output.stderr(\n 'error: FINAL_API_KEY must be nonempty and FINAL_API_HOST must be an absolute URL',\n );\n return 2;\n }\n const apiKey = env.success ? (env.data.FINAL_API_KEY ?? null) : null;\n const dir = resolve(deps.cwd, dirArg ?? '.');\n const client = (key: string): AgentClientIface =>\n createClient({\n host: values.host ?? env.data.FINAL_API_HOST ?? DEFAULT_AGENTS_HOST,\n auth: { apiKey: key },\n fetch: deps.fetch,\n });\n\n if (command === 'build') {\n return runBuild({ dir, client: apiKey == null ? null : client(apiKey), output });\n }\n if (command === 'dev') {\n const port = values.port == null ? DEFAULT_DEV_PORT : Number(values.port);\n if (!Number.isInteger(port) || port < 0 || port > 65_535) {\n output.stderr(`error: --port must be a port number`);\n return 2;\n }\n return runDev({\n dir,\n port,\n env: deps.env,\n output,\n signal: deps.signal ?? new AbortController().signal,\n });\n }\n if (command === 'publish') {\n if (values.agent == null) {\n output.stderr('error: publish needs --agent <slug>');\n return 2;\n }\n if (apiKey == null) {\n output.stderr('error: set FINAL_API_KEY to a Final API key');\n return 2;\n }\n return runPublish({\n dir,\n agent: values.agent,\n ref: values.ref ?? null,\n message: values.message ?? DEFAULT_COMMIT_MESSAGE,\n note: values.note ?? null,\n client: client(apiKey),\n listFiles: deps.listFiles ?? gitListFiles,\n output,\n });\n }\n if (command === 'conformance') {\n if (dirArg == null) {\n output.stderr('error: conformance needs <module>');\n return 2;\n }\n const timeoutMs = values.timeout == null ? null : Number(values.timeout);\n if (timeoutMs != null && (!Number.isInteger(timeoutMs) || timeoutMs <= 0)) {\n output.stderr('error: --timeout must be a positive number of milliseconds');\n return 2;\n }\n return runConformance({\n module: dirArg,\n exportName: values.export ?? 'default',\n profile: values.profile ?? 'final',\n timeoutMs,\n json: values.json === true,\n cwd: deps.cwd,\n output,\n importModule: deps.importModule,\n signal: deps.signal,\n });\n }\n output.stderr(`error: unknown command ${command}`);\n output.stderr(USAGE);\n return 2;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@finalai/agents",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Agent authoring, client APIs, and CLI.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -105,10 +105,10 @@
|
|
|
105
105
|
},
|
|
106
106
|
"dependencies": {
|
|
107
107
|
"@agentclientprotocol/sdk": "1.8.0",
|
|
108
|
-
"@finalai/agent-definition": "0.5.
|
|
109
|
-
"@finalai/agent-protocol": "0.
|
|
110
|
-
"@finalai/agent-provider": "0.5.
|
|
111
|
-
"@finalai/final-agent-provider": "0.
|
|
108
|
+
"@finalai/agent-definition": "0.5.1",
|
|
109
|
+
"@finalai/agent-protocol": "0.6.0",
|
|
110
|
+
"@finalai/agent-provider": "0.5.1",
|
|
111
|
+
"@finalai/final-agent-provider": "0.6.1",
|
|
112
112
|
"@finalai/websockets": "0.1.6",
|
|
113
113
|
"ws": "^8.21.3",
|
|
114
114
|
"zod": "4.6.5"
|