@finalai/agents 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -1
- package/dist/modules/agent-client/api.d.mts +35 -0
- package/dist/modules/agent-client/api.mjs +110 -0
- package/dist/modules/agent-client/api.mjs.map +7 -0
- package/dist/modules/agent-client/channels.mjs +9 -1
- package/dist/modules/agent-client/channels.mjs.map +2 -2
- package/dist/modules/agent-client/client.d.mts +29 -7
- package/dist/modules/agent-client/client.mjs +15 -12
- package/dist/modules/agent-client/client.mjs.map +2 -2
- package/dist/modules/agent-client/conversations.d.mts +17 -25
- package/dist/modules/agent-client/conversations.mjs +10 -62
- package/dist/modules/agent-client/conversations.mjs.map +2 -2
- package/dist/modules/agent-client/defaults.d.mts +0 -4
- package/dist/modules/agent-client/defaults.mjs +1 -52
- package/dist/modules/agent-client/defaults.mjs.map +2 -2
- package/dist/modules/agent-client/index.d.mts +2 -33
- package/dist/modules/agent-client/index.mjs +3 -109
- package/dist/modules/agent-client/index.mjs.map +2 -2
- package/dist/modules/agent-client/integrations.d.mts +5 -1
- package/dist/modules/agent-client/integrations.mjs +9 -1
- package/dist/modules/agent-client/integrations.mjs.map +2 -2
- package/dist/modules/agent-client/node.d.mts +2 -0
- package/dist/modules/agent-client/node.mjs +62 -0
- package/dist/modules/agent-client/node.mjs.map +7 -0
- package/dist/modules/agent-client/organization.d.mts +83 -0
- package/dist/modules/agent-client/organization.mjs +209 -0
- package/dist/modules/agent-client/organization.mjs.map +7 -0
- package/dist/modules/agent-client/participant-configuration.d.mts +21 -0
- package/dist/modules/agent-client/participant-configuration.mjs +38 -0
- package/dist/modules/agent-client/participant-configuration.mjs.map +7 -0
- package/dist/modules/agent-client/portable.d.mts +3 -0
- package/dist/modules/agent-client/portable.mjs +28 -0
- package/dist/modules/agent-client/portable.mjs.map +7 -0
- package/dist/modules/agent-client/project.d.mts +3 -0
- package/dist/modules/agent-client/project.mjs +3 -1
- package/dist/modules/agent-client/project.mjs.map +2 -2
- package/dist/modules/agent-client/provide.d.mts +0 -1
- package/dist/modules/agent-client/provide.mjs +0 -1
- package/dist/modules/agent-client/provide.mjs.map +2 -2
- package/dist/modules/agent-client/sandboxes.d.mts +8 -1
- package/dist/modules/agent-client/sandboxes.mjs +9 -0
- package/dist/modules/agent-client/sandboxes.mjs.map +2 -2
- package/dist/modules/agent-client/sessions.d.mts +8 -1
- package/dist/modules/agent-client/sessions.mjs +24 -5
- package/dist/modules/agent-client/sessions.mjs.map +2 -2
- package/dist/modules/cli/cli.mjs +2 -1
- package/dist/modules/cli/cli.mjs.map +2 -2
- package/package.json +7 -6
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/agent-client/sandboxes.ts"],
|
|
4
|
-
"sourcesContent": ["import { jsonObjectSchema } from '@finalai/agent-protocol';\nimport type { SandboxEnvironmentValueIface } from '@finalai/agent-provider/sandbox/types';\nimport {\n createSandboxRequestSchema,\n okResponseSchema,\n publishSandboxSetupRequestSchema,\n publishSandboxSetupResponseSchema,\n runSandboxCommandRequestSchema,\n runSandboxCommandResponseSchema,\n sandboxDescriptionSchema,\n sandboxListSchema,\n sandboxProviderListSchema,\n sandboxResourceSchema,\n sandboxSetupListSchema,\n sandboxSetupResourceSchema,\n setSandboxEgressExitRequestSchema,\n type PublishSandboxSetupResponseIface,\n type RunSandboxCommandRequestIface,\n type RunSandboxCommandResponseIface,\n type SandboxDescriptionIface,\n type SandboxListIface,\n type SandboxProviderIface,\n type SandboxResourceIface,\n type SandboxSetupInputIface,\n type SandboxSetupRefInputIface,\n type SandboxSetupResourceIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport { encodePath, type ClientContextIface, type SignalOptionsIface } from \"./context.mjs\";\nimport { HttpMethod } from \"./http.mjs\";\n\nexport type { SandboxEnvironmentValueIface };\n\n// Sandboxes are project resources: a machine and its disk from a provider,\n// provided to an agent per capability by id. Creating one boots nothing.\n\n/** A published sandbox setup at a version, or `latest` (resolved once, at creation). */\nexport type SandboxSetupRefIface = SandboxSetupRefInputIface;\n\n/** Who a sandbox belongs to; it is deleted with its owner. */\nexport type SandboxOwnerIface = { conversation: string } | { session: string };\n\nexport interface CreateSandboxOptionsIface extends SignalOptionsIface {\n /** What should be on the machine: `defineSandboxSetup(...)`, or a published setup. */\n setup?: SandboxSetupInputIface | SandboxSetupRefIface;\n ownedBy?: SandboxOwnerIface;\n /** A retry with the same key returns the sandbox the first call created. */\n idempotencyKey?: string;\n}\n\nexport interface SandboxHandleIface {\n readonly id: string;\n /** The sandbox as it was when this handle was made. */\n readonly resource: SandboxResourceIface;\n get: (options?: SignalOptionsIface) => Promise<SandboxResourceIface>;\n /** Runs one command to completion, booting the sandbox if needed. */\n run: (\n args: RunSandboxCommandRequestIface & SignalOptionsIface,\n ) => Promise<RunSandboxCommandResponseIface>;\n /** What is known about the machine: checkouts, services, commands, notes. */\n description: (options?: SignalOptionsIface) => Promise<SandboxDescriptionIface>;\n /**\n * Sends the sandbox's outbound traffic through an integration's egress exit (`intg_...`),\n * or straight out with `null`.\n */\n setEgressExit: (\n args: { integration: string | null } & SignalOptionsIface,\n ) => Promise<SandboxResourceIface>;\n delete: (options?: SignalOptionsIface) => Promise<void>;\n}\n\nexport interface SandboxesApiIface {\n create: (\n environment: SandboxEnvironmentValueIface,\n options?: CreateSandboxOptionsIface,\n ) => Promise<SandboxHandleIface>;\n get: (sandboxId: string, options?: SignalOptionsIface) => Promise<SandboxHandleIface>;\n list: (\n options?: SignalOptionsIface & {\n conversation?: string;\n session?: string;\n cursor?: string;\n limit?: number;\n },\n ) => Promise<SandboxListIface>;\n /** The providers this project can create sandboxes on. */\n providers: (options?: SignalOptionsIface) => Promise<SandboxProviderIface[]>;\n}\n\nexport interface SandboxSetupsApiIface {\n /** Publishes the next version of `name`. */\n publish: (\n args: { name: string; setup: SandboxSetupInputIface } & SignalOptionsIface,\n ) => Promise<PublishSandboxSetupResponseIface>;\n get: (\n args: { id: string; version?: number } & SignalOptionsIface,\n ) => Promise<SandboxSetupResourceIface>;\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<SandboxSetupResourceIface[]>;\n}\n\nconst projectPath = (projectId: string, suffix: string): string =>\n `/v1/projects/${encodePath(projectId)}${suffix}`;\n\nexport const createSandboxesApi = (args: {\n context: ClientContextIface;\n projectId: string;\n}): SandboxesApiIface => {\n const { http } = args.context;\n const sandboxPath = (sandboxId: string, suffix = '') =>\n projectPath(args.projectId, `/sandboxes/${encodePath(sandboxId)}${suffix}`);\n const handle = (resource: SandboxResourceIface): SandboxHandleIface => ({\n id: resource.id,\n resource,\n get: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: sandboxPath(resource.id),\n response: sandboxResourceSchema,\n signal: options?.signal,\n }),\n run: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: sandboxPath(resource.id, '/run'),\n body: { schema: runSandboxCommandRequestSchema, value },\n response: runSandboxCommandResponseSchema,\n signal,\n }),\n description: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: sandboxPath(resource.id, '/description'),\n response: sandboxDescriptionSchema,\n signal: options?.signal,\n }),\n setEgressExit: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Put,\n path: sandboxPath(resource.id, '/egress-exit'),\n body: { schema: setSandboxEgressExitRequestSchema, value },\n response: sandboxResourceSchema,\n signal,\n }),\n delete: async (options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: sandboxPath(resource.id),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n });\n return {\n create: async (environment, options) =>\n handle(\n await http.request({\n method: HttpMethod.Post,\n path: projectPath(args.projectId, '/sandboxes'),\n body: {\n schema: createSandboxRequestSchema,\n value: {\n provider: environment.provider,\n environment: jsonObjectSchema.parse(environment.environment ?? {}),\n setup: options?.setup,\n ownedBy: options?.ownedBy,\n idempotencyKey: options?.idempotencyKey,\n },\n },\n response: sandboxResourceSchema,\n signal: options?.signal,\n }),\n ),\n get: async (sandboxId, options) =>\n handle(\n await http.request({\n method: HttpMethod.Get,\n path: sandboxPath(sandboxId),\n response: sandboxResourceSchema,\n signal: options?.signal,\n }),\n ),\n list: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: projectPath(args.projectId, '/sandboxes'),\n query: {\n conversation: options?.conversation,\n session: options?.session,\n cursor: options?.cursor,\n limit: options?.limit,\n },\n response: sandboxListSchema,\n signal: options?.signal,\n }),\n providers: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: projectPath(args.projectId, '/sandbox-providers'),\n response: sandboxProviderListSchema,\n signal: options?.signal,\n })\n ).providers,\n };\n};\n\nexport const createSandboxSetupsApi = (args: {\n context: ClientContextIface;\n projectId: string;\n}): SandboxSetupsApiIface => {\n const { http } = args.context;\n return {\n publish: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: projectPath(args.projectId, '/sandbox-setups'),\n body: { schema: publishSandboxSetupRequestSchema, value },\n response: publishSandboxSetupResponseSchema,\n signal,\n }),\n get: ({ id, version, signal }) =>\n http.request({\n method: HttpMethod.Get,\n path: projectPath(args.projectId, `/sandbox-setups/${encodePath(id)}`),\n query: { version },\n response: sandboxSetupResourceSchema,\n signal,\n }),\n list: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: projectPath(args.projectId, '/sandbox-setups'),\n query: { cursor: options?.cursor, limit: options?.limit },\n response: sandboxSetupListSchema,\n signal: options?.signal,\n })\n ).setups,\n };\n};\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,wBAAwB;AAEjC;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,
|
|
4
|
+
"sourcesContent": ["import { jsonObjectSchema } from '@finalai/agent-protocol';\nimport type { SandboxEnvironmentValueIface } from '@finalai/agent-provider/sandbox/types';\nimport {\n createSandboxRequestSchema,\n okResponseSchema,\n publishSandboxSetupRequestSchema,\n publishSandboxSetupResponseSchema,\n runSandboxCommandRequestSchema,\n runSandboxCommandResponseSchema,\n sandboxDescriptionSchema,\n sandboxListSchema,\n sandboxProviderListSchema,\n sandboxResourceSchema,\n sandboxSetupListSchema,\n sandboxSetupResourceSchema,\n sandboxExitConsentRequestSchema,\n sandboxExitConsentSchema,\n setSandboxEgressExitRequestSchema,\n type PublishSandboxSetupResponseIface,\n type RunSandboxCommandRequestIface,\n type RunSandboxCommandResponseIface,\n type SandboxDescriptionIface,\n type SandboxExitConsentIface,\n type SandboxListIface,\n type SandboxProviderIface,\n type SandboxResourceIface,\n type SandboxSetupInputIface,\n type SandboxSetupRefInputIface,\n type SandboxSetupResourceIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport { encodePath, type ClientContextIface, type SignalOptionsIface } from \"./context.mjs\";\nimport { HttpMethod } from \"./http.mjs\";\n\nexport type { SandboxEnvironmentValueIface };\n\n// Sandboxes are project resources: a machine and its disk from a provider,\n// provided to an agent per capability by id. Creating one boots nothing.\n\n/** A published sandbox setup at a version, or `latest` (resolved once, at creation). */\nexport type SandboxSetupRefIface = SandboxSetupRefInputIface;\n\n/** Who a sandbox belongs to; it is deleted with its owner. */\nexport type SandboxOwnerIface = { conversation: string } | { session: string };\n\nexport interface CreateSandboxOptionsIface extends SignalOptionsIface {\n /** What should be on the machine: `defineSandboxSetup(...)`, or a published setup. */\n setup?: SandboxSetupInputIface | SandboxSetupRefIface;\n ownedBy?: SandboxOwnerIface;\n /** A retry with the same key returns the sandbox the first call created. */\n idempotencyKey?: string;\n}\n\nexport interface SandboxHandleIface {\n readonly id: string;\n /** The sandbox as it was when this handle was made. */\n readonly resource: SandboxResourceIface;\n get: (options?: SignalOptionsIface) => Promise<SandboxResourceIface>;\n /** Runs one command to completion, booting the sandbox if needed. */\n run: (\n args: RunSandboxCommandRequestIface & SignalOptionsIface,\n ) => Promise<RunSandboxCommandResponseIface>;\n /** What is known about the machine: checkouts, services, commands, notes. */\n description: (options?: SignalOptionsIface) => Promise<SandboxDescriptionIface>;\n /**\n * Sends the sandbox's outbound traffic through an integration's egress exit (`intg_...`),\n * or straight out with `null`.\n */\n setEgressExit: (\n args: { integration: string | null } & SignalOptionsIface,\n ) => Promise<SandboxResourceIface>;\n /**\n * Proof for an integration's egress exit (`intg_...`) that you are the person the sandbox acts\n * for now, to present with your consent to that exit. Refused for anyone else.\n */\n exitConsent: (\n args: { integration: string } & SignalOptionsIface,\n ) => Promise<SandboxExitConsentIface>;\n delete: (options?: SignalOptionsIface) => Promise<void>;\n}\n\nexport interface SandboxesApiIface {\n create: (\n environment: SandboxEnvironmentValueIface,\n options?: CreateSandboxOptionsIface,\n ) => Promise<SandboxHandleIface>;\n get: (sandboxId: string, options?: SignalOptionsIface) => Promise<SandboxHandleIface>;\n list: (\n options?: SignalOptionsIface & {\n conversation?: string;\n session?: string;\n cursor?: string;\n limit?: number;\n },\n ) => Promise<SandboxListIface>;\n /** The providers this project can create sandboxes on. */\n providers: (options?: SignalOptionsIface) => Promise<SandboxProviderIface[]>;\n}\n\nexport interface SandboxSetupsApiIface {\n /** Publishes the next version of `name`. */\n publish: (\n args: { name: string; setup: SandboxSetupInputIface } & SignalOptionsIface,\n ) => Promise<PublishSandboxSetupResponseIface>;\n get: (\n args: { id: string; version?: number } & SignalOptionsIface,\n ) => Promise<SandboxSetupResourceIface>;\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<SandboxSetupResourceIface[]>;\n}\n\nconst projectPath = (projectId: string, suffix: string): string =>\n `/v1/projects/${encodePath(projectId)}${suffix}`;\n\nexport const createSandboxesApi = (args: {\n context: ClientContextIface;\n projectId: string;\n}): SandboxesApiIface => {\n const { http } = args.context;\n const sandboxPath = (sandboxId: string, suffix = '') =>\n projectPath(args.projectId, `/sandboxes/${encodePath(sandboxId)}${suffix}`);\n const handle = (resource: SandboxResourceIface): SandboxHandleIface => ({\n id: resource.id,\n resource,\n get: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: sandboxPath(resource.id),\n response: sandboxResourceSchema,\n signal: options?.signal,\n }),\n run: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: sandboxPath(resource.id, '/run'),\n body: { schema: runSandboxCommandRequestSchema, value },\n response: runSandboxCommandResponseSchema,\n signal,\n }),\n description: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: sandboxPath(resource.id, '/description'),\n response: sandboxDescriptionSchema,\n signal: options?.signal,\n }),\n setEgressExit: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Put,\n path: sandboxPath(resource.id, '/egress-exit'),\n body: { schema: setSandboxEgressExitRequestSchema, value },\n response: sandboxResourceSchema,\n signal,\n }),\n exitConsent: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: sandboxPath(resource.id, '/exit-consent'),\n body: { schema: sandboxExitConsentRequestSchema, value },\n response: sandboxExitConsentSchema,\n signal,\n }),\n delete: async (options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: sandboxPath(resource.id),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n });\n return {\n create: async (environment, options) =>\n handle(\n await http.request({\n method: HttpMethod.Post,\n path: projectPath(args.projectId, '/sandboxes'),\n body: {\n schema: createSandboxRequestSchema,\n value: {\n provider: environment.provider,\n environment: jsonObjectSchema.parse(environment.environment ?? {}),\n setup: options?.setup,\n ownedBy: options?.ownedBy,\n idempotencyKey: options?.idempotencyKey,\n },\n },\n response: sandboxResourceSchema,\n signal: options?.signal,\n }),\n ),\n get: async (sandboxId, options) =>\n handle(\n await http.request({\n method: HttpMethod.Get,\n path: sandboxPath(sandboxId),\n response: sandboxResourceSchema,\n signal: options?.signal,\n }),\n ),\n list: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: projectPath(args.projectId, '/sandboxes'),\n query: {\n conversation: options?.conversation,\n session: options?.session,\n cursor: options?.cursor,\n limit: options?.limit,\n },\n response: sandboxListSchema,\n signal: options?.signal,\n }),\n providers: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: projectPath(args.projectId, '/sandbox-providers'),\n response: sandboxProviderListSchema,\n signal: options?.signal,\n })\n ).providers,\n };\n};\n\nexport const createSandboxSetupsApi = (args: {\n context: ClientContextIface;\n projectId: string;\n}): SandboxSetupsApiIface => {\n const { http } = args.context;\n return {\n publish: ({ signal, ...value }) =>\n http.request({\n method: HttpMethod.Post,\n path: projectPath(args.projectId, '/sandbox-setups'),\n body: { schema: publishSandboxSetupRequestSchema, value },\n response: publishSandboxSetupResponseSchema,\n signal,\n }),\n get: ({ id, version, signal }) =>\n http.request({\n method: HttpMethod.Get,\n path: projectPath(args.projectId, `/sandbox-setups/${encodePath(id)}`),\n query: { version },\n response: sandboxSetupResourceSchema,\n signal,\n }),\n list: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: projectPath(args.projectId, '/sandbox-setups'),\n query: { cursor: options?.cursor, limit: options?.limit },\n response: sandboxSetupListSchema,\n signal: options?.signal,\n })\n ).setups,\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { JsonObjectIface, JsonValue } from '@finalai/agent-protocol';
|
|
2
|
-
import { type AcpFrameEventIface, type AcpPreviewEventIface, type ActorIface, type AgentSessionIface, type AgentTurnIface, type AgentTurnPolicy, type AttachmentDownloadIface, type ContentInput, type DecisionOutcomeInput, type DecisionRecordIface, type PromptAcceptedIface, type ProvideDocumentViewIface, type RequirementStatusIface, type RespondDecisionResponseIface, type SessionFramesPageIface, type SessionManifestIface, type SessionPlanIface } from '@finalai/agent-protocol/agent-platform';
|
|
2
|
+
import { type AcpFrameEventIface, type AcpLiveTextEventIface, type AcpPreviewEventIface, type ActorIface, type AgentSessionIface, type AgentTurnIface, type AgentTurnPolicy, type AttachmentDownloadIface, type ContentInput, type DecisionOutcomeInput, type DecisionRecordIface, type PromptAcceptedIface, type ProvideDocumentViewIface, type RequirementStatusIface, type RespondDecisionResponseIface, type SessionFramesPageIface, type SessionLiveTextIface, type SessionManifestIface, type SessionPlanIface } from '@finalai/agent-protocol/agent-platform';
|
|
3
3
|
import type { AgentInput } from "./agent-input.mjs";
|
|
4
4
|
import { type ClientContextIface, type EnumInput, type SignalOptionsIface } from "./context.mjs";
|
|
5
5
|
import { type SessionLiveEvent } from "./live-stream.mjs";
|
|
@@ -73,6 +73,13 @@ export interface SessionHandleIface {
|
|
|
73
73
|
* ahead of the durable frames and the conversation's projected messages.
|
|
74
74
|
*/
|
|
75
75
|
previews: (options?: SignalOptionsIface) => AsyncIterableIterator<AcpPreviewEventIface>;
|
|
76
|
+
/**
|
|
77
|
+
* The agent's text as it streams, in arrival order: the saved chunks (`acp.preview`) and the
|
|
78
|
+
* model's live text ahead of them (`acp.live_text`). Live only; start from `liveText()`.
|
|
79
|
+
*/
|
|
80
|
+
textEvents: (options?: SignalOptionsIface) => AsyncIterableIterator<AcpPreviewEventIface | AcpLiveTextEventIface>;
|
|
81
|
+
/** What each agent message of the session's open turns has streamed so far. */
|
|
82
|
+
liveText: (options?: SignalOptionsIface) => Promise<SessionLiveTextIface>;
|
|
76
83
|
/** One replay page (`GET /sessions/:id/frames`). */
|
|
77
84
|
frames: (options: SignalOptionsIface & {
|
|
78
85
|
fromSeq: number;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
acpFrameEventSchema,
|
|
3
|
+
acpLiveTextEventSchema,
|
|
3
4
|
acpPreviewEventSchema,
|
|
4
5
|
agentRealtimeFrameSchema,
|
|
5
6
|
AgentRealtimeFrameType,
|
|
@@ -19,6 +20,8 @@ import {
|
|
|
19
20
|
respondDecisionResponseSchema,
|
|
20
21
|
respondDecisionSchema,
|
|
21
22
|
sessionFramesPageSchema,
|
|
23
|
+
sessionLiveTextSchema,
|
|
24
|
+
SessionRealtimeKind,
|
|
22
25
|
sessionManifestSchema,
|
|
23
26
|
sessionPlanResponseSchema,
|
|
24
27
|
sessionRequirementsSchema,
|
|
@@ -141,7 +144,7 @@ async function* streamFramesOverHttp(args) {
|
|
|
141
144
|
}
|
|
142
145
|
}
|
|
143
146
|
}
|
|
144
|
-
const
|
|
147
|
+
const streamSessionEvents = (args) => {
|
|
145
148
|
const topic = agentRealtimeTopics.session(args.sessionId);
|
|
146
149
|
let unsubscribe = null;
|
|
147
150
|
let detachAbort = () => {
|
|
@@ -167,9 +170,8 @@ const streamPreviews = (args) => {
|
|
|
167
170
|
return;
|
|
168
171
|
}
|
|
169
172
|
if (frame.data.type !== AgentRealtimeFrameType.Event) return;
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if (preview.success) queue.push(preview.data);
|
|
173
|
+
const value = args.parse(frame.data.kind, frame.data.payload);
|
|
174
|
+
if (value != null) queue.push(value);
|
|
173
175
|
};
|
|
174
176
|
detachAbort = failOnAbort(queue, args.signal);
|
|
175
177
|
detachClose = failOnAbort(queue, args.context.closeSignal);
|
|
@@ -180,6 +182,16 @@ const streamPreviews = (args) => {
|
|
|
180
182
|
}
|
|
181
183
|
return queue.iterator;
|
|
182
184
|
};
|
|
185
|
+
const parsePreview = (kind, payload) => {
|
|
186
|
+
if (kind !== AgentRealtimeKind.AcpPreview) return null;
|
|
187
|
+
const preview = acpPreviewEventSchema.safeParse(payload);
|
|
188
|
+
return preview.success ? preview.data : null;
|
|
189
|
+
};
|
|
190
|
+
const parseTextEvent = (kind, payload) => {
|
|
191
|
+
if (kind !== SessionRealtimeKind.AcpLiveText) return parsePreview(kind, payload);
|
|
192
|
+
const live = acpLiveTextEventSchema.safeParse(payload);
|
|
193
|
+
return live.success ? live.data : null;
|
|
194
|
+
};
|
|
183
195
|
const frameSources = (args) => ({
|
|
184
196
|
replay: (page) => replay({ context: args.context, sessionId: args.sessionId, ...page }),
|
|
185
197
|
decisions: (signal) => openDecisions({ ...args, signal }),
|
|
@@ -293,7 +305,14 @@ const createSessionHandle = (context, sessionId) => {
|
|
|
293
305
|
closeSignal: context.closeSignal
|
|
294
306
|
}),
|
|
295
307
|
liveEvents: (options) => streamSessionLiveEvents({ context, sessionId, signal: options?.signal }),
|
|
296
|
-
previews: (options) =>
|
|
308
|
+
previews: (options) => streamSessionEvents({ context, sessionId, signal: options?.signal, parse: parsePreview }),
|
|
309
|
+
textEvents: (options) => streamSessionEvents({ context, sessionId, signal: options?.signal, parse: parseTextEvent }),
|
|
310
|
+
liveText: (options) => http.request({
|
|
311
|
+
method: HttpMethod.Get,
|
|
312
|
+
path: sessionPath(sessionId, "/live-text"),
|
|
313
|
+
response: sessionLiveTextSchema,
|
|
314
|
+
signal: options?.signal
|
|
315
|
+
}),
|
|
297
316
|
frames: (options) => replay({ context, sessionId, ...options }),
|
|
298
317
|
decisions: (options) => openDecisions({ context, sessionId, signal: options?.signal }),
|
|
299
318
|
turn: (turnId, options) => getTurn({ context, sessionId, turnId, signal: options?.signal }),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/agent-client/sessions.ts"],
|
|
4
|
-
"sourcesContent": ["import type { JsonObjectIface, JsonValue } from '@finalai/agent-protocol';\nimport {\n acpFrameEventSchema,\n acpPreviewEventSchema,\n agentRealtimeFrameSchema,\n AgentRealtimeFrameType,\n AgentRealtimeKind,\n agentRealtimeTopics,\n attachmentDownloadSchema,\n cancelRequestSchema,\n createSessionRequestSchema,\n createSessionResponseSchema,\n FIRST_ACP_FRAME_SEQ,\n forkSessionRequestSchema,\n observeSessionRequestSchema,\n decisionRecordListSchema,\n okResponseSchema,\n promptAcceptedSchema,\n promptSessionRequestSchema,\n respondDecisionResponseSchema,\n respondDecisionSchema,\n sessionFramesPageSchema,\n sessionManifestSchema,\n sessionPlanResponseSchema,\n sessionRequirementsSchema,\n sessionSchema,\n setConfigOptionRequestSchema,\n turnSchema,\n type AcpFrameEventIface,\n type AcpPreviewEventIface,\n type ActorIface,\n type AgentSessionIface,\n type AgentTurnIface,\n type AgentTurnPolicy,\n type AttachmentDownloadIface,\n type ContentInput,\n type DecisionOutcomeInput,\n type DecisionRecordIface,\n type PromptAcceptedIface,\n type ProvideDocumentViewIface,\n type RequirementStatusIface,\n type RespondDecisionResponseIface,\n type SessionFramesPageIface,\n type SessionManifestIface,\n type SessionPlanIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport { createTextCollector, isUserMessageFor, turnEndOf } from \"./acp-frames.mjs\";\nimport type { AgentInput } from \"./agent-input.mjs\";\nimport { createAsyncQueue, failOnAbort } from \"./async-queue.mjs\";\nimport {\n encodePath,\n type ClientContextIface,\n type EnumInput,\n type SignalOptionsIface,\n} from \"./context.mjs\";\nimport { isTerminalRealtimeError, realtimeSubscriptionError } from \"./errors.mjs\";\nimport { streamServerSentEvents } from \"./event-stream.mjs\";\nimport { streamSessionFrames } from \"./frame-stream.mjs\";\nimport { HttpMethod, type HttpBodyIface } from \"./http.mjs\";\nimport { streamSessionLiveEvents, type SessionLiveEvent } from \"./live-stream.mjs\";\nimport { LocalHostOwnerKind } from \"./local-host-protocol.mjs\";\nimport type { ProvideIface } from \"./provide.mjs\";\nimport type { RealtimeTransportFrameIface } from \"./realtime.mjs\";\nimport { serveCodeFor, startAgent, type AgentStartDepsIface } from \"./start.mjs\";\n\n/** Answer a decision by option id (permission) or with a full ACP outcome. */\nexport type RespondArgs =\n | { decisionId: string; optionId: string }\n | { decisionId: string; outcome: DecisionOutcomeInput };\n\nexport interface StreamOptionsIface extends SignalOptionsIface {\n /** Inclusive; defaults to `FIRST_ACP_FRAME_SEQ` (the whole log). Earlier values are clamped. */\n fromSeq?: number;\n /** Keep streaming live frames after replay catches up; defaults to true. */\n follow?: boolean;\n}\n\nexport interface TurnResultIface<MessageId extends string | null = string> {\n messageId: MessageId;\n turnId: string;\n stopReason: string | null;\n /** Visible agent text of the turn. */\n text: string;\n /** Seq of the frame that ended the turn. */\n toSeq: number;\n}\n\n/** An accepted prompt. `stream()` yields this turn's frames; `result()` waits for its end. */\nexport interface TurnHandleIface<MessageId extends string | null = string> extends Omit<\n PromptAcceptedIface,\n 'messageId'\n> {\n messageId: MessageId;\n sessionId: string;\n get: (options?: SignalOptionsIface) => Promise<AgentTurnIface>;\n stream: (options?: SignalOptionsIface) => AsyncIterableIterator<AcpFrameEventIface>;\n result: (options?: SignalOptionsIface) => Promise<TurnResultIface<MessageId>>;\n /** The turn's visible agent text, once it ends. */\n text: (options?: SignalOptionsIface) => Promise<string>;\n}\n\nexport interface SendOptionsIface extends SignalOptionsIface {\n turnPolicy?: EnumInput<AgentTurnPolicy>;\n idempotencyKey?: string;\n meta?: JsonObjectIface;\n /** When the person submitted, for the prompt-to-inference trace; defaults to now. */\n clientSubmittedAtMs?: number;\n}\n\nexport interface ForkSessionOptionsIface extends SignalOptionsIface {\n /** Retain this key when retrying an interrupted fork. Defaults to a new key. */\n idempotencyKey?: string;\n title?: string;\n}\n\n/** An I/O-free handle on one session; every method is one HTTP call or one stream. */\nexport interface SessionHandleIface {\n id: string;\n /** Native fork of an idle source on its pinned agent hash; the standalone child has fresh scopes. */\n fork: (options?: ForkSessionOptionsIface) => Promise<CreatedSessionIface>;\n get: (options?: SignalOptionsIface) => Promise<AgentSessionIface>;\n /** Resolves a `final-attachment:` resource link from this session's frames. */\n attachment: (\n attachmentId: string,\n options?: SignalOptionsIface,\n ) => Promise<AttachmentDownloadIface>;\n send: (content: ContentInput, options?: SendOptionsIface) => Promise<TurnHandleIface>;\n /** Adds content to history without a model call (`_final/session/observe`). */\n observe: (\n content: ContentInput,\n options?: SignalOptionsIface & { idempotencyKey?: string; meta?: JsonObjectIface },\n ) => Promise<void>;\n stream: (options?: StreamOptionsIface) => AsyncIterableIterator<AcpFrameEventIface>;\n /** Full provisional frames and reset notices; never a durable replay cursor or receipt. */\n liveEvents: (options?: SignalOptionsIface) => AsyncIterableIterator<SessionLiveEvent>;\n /**\n * `acp.preview` events: the text of message and thought chunks as the session\n * publishes them, live only (never replayed), for surfaces that render text\n * ahead of the durable frames and the conversation's projected messages.\n */\n previews: (options?: SignalOptionsIface) => AsyncIterableIterator<AcpPreviewEventIface>;\n /** One replay page (`GET /sessions/:id/frames`). */\n frames: (\n options: SignalOptionsIface & { fromSeq: number; limit?: number },\n ) => Promise<SessionFramesPageIface>;\n /** The session's open decisions (`GET /sessions/:id/decisions`). */\n decisions: (options?: SignalOptionsIface) => Promise<DecisionRecordIface[]>;\n turn: (turnId: string, options?: SignalOptionsIface) => Promise<AgentTurnIface>;\n /** Reconstruct an accepted response from its durable turn id, without resending its prompt. */\n response: (\n turnId: string,\n options?: SignalOptionsIface,\n ) => Promise<TurnHandleIface<string | null>>;\n respond: (\n args: RespondArgs,\n options?: SignalOptionsIface,\n ) => Promise<RespondDecisionResponseIface>;\n cancel: (options?: SignalOptionsIface & { reason?: string }) => Promise<void>;\n /**\n * ACP `session/set_config_option` (model, reasoning, mode, ...): `configId` and a value\n * from the options the harness advertises (`get().configOptions`, `configSelectsOf`).\n * Changing them takes the session's owner, or a conversation owner or admin.\n */\n setConfigOption: (\n args: { configId: string; value: JsonValue },\n options?: SignalOptionsIface,\n ) => Promise<void>;\n close: (options?: SignalOptionsIface) => Promise<void>;\n /** The agent document the session pins and the provide document it was resolved with. */\n manifest: (options?: SignalOptionsIface) => Promise<SessionManifestIface>;\n /** Each of the agent's requirements and what provides it now. */\n requirements: (options?: SignalOptionsIface) => Promise<RequirementStatusIface[]>;\n /** What the session was provided; null before its first open. */\n provide: (options?: SignalOptionsIface) => Promise<ProvideDocumentViewIface | null>;\n /**\n * The latest plan the agent reported, with its history (`GET \u2026/plan`); null\n * until it reports one. Each update raises `revision` and emits a\n * `session.plan_updated` event.\n */\n plan: (options?: SignalOptionsIface) => Promise<SessionPlanIface | null>;\n}\n\nexport interface CreateSessionArgsIface extends SignalOptionsIface {\n /**\n * A session id you chose, so whatever you create for it first (a sandbox it\n * owns) can name it. Creating with an id that exists returns that session.\n */\n id?: string;\n /** The agent you defined, or one fetched with `project.agents.get`; never a string. */\n agent: AgentInput;\n /**\n * What the agent requires. Files and shell left out run in this process\n * unless the client was created with `localCompute: false`.\n */\n provide: ProvideIface;\n /** Your app's end user the first turn acts for. */\n actor?: Omit<ActorIface, 'displayName'> & { displayName?: string };\n message?: ContentInput;\n turnPolicy?: EnumInput<AgentTurnPolicy>;\n idempotencyKey?: string;\n title?: string;\n meta?: JsonObjectIface;\n /** When the person submitted `message`; defaults to now. */\n clientSubmittedAtMs?: number;\n}\n\nexport interface CreatedSessionIface {\n session: AgentSessionIface;\n handle: SessionHandleIface;\n /** The first turn when `message` was given. */\n response: TurnHandleIface | null;\n}\n\nexport interface SessionsApiIface {\n fork: (sessionId: string, options?: ForkSessionOptionsIface) => Promise<CreatedSessionIface>;\n get: (sessionId: string, options?: SignalOptionsIface) => Promise<AgentSessionIface>;\n attach: (sessionId: string) => SessionHandleIface;\n}\n\nexport const outcomeOf = (args: RespondArgs): DecisionOutcomeInput =>\n 'optionId' in args ? { outcome: 'selected', optionId: args.optionId } : args.outcome;\n\nconst sessionPath = (sessionId: string, suffix = ''): string =>\n `/v1/sessions/${encodePath(sessionId)}${suffix}`;\n\ninterface TurnHandleArgsIface<MessageId extends string | null> {\n context: ClientContextIface;\n sessionId: string;\n accepted: Omit<PromptAcceptedIface, 'messageId'> & { messageId: MessageId };\n}\n\nconst turnHandle = <MessageId extends string | null>(\n args: TurnHandleArgsIface<MessageId>,\n): TurnHandleIface<MessageId> => {\n const { context, sessionId, accepted } = args;\n const get = (options?: SignalOptionsIface) =>\n getTurn({ context, sessionId, turnId: accepted.turnId, signal: options?.signal });\n const stream = (options?: SignalOptionsIface): AsyncIterableIterator<AcpFrameEventIface> => {\n // Without the prompt's seq, scan from the start for ACP's user message with this id.\n // `until` runs as frames are queued and `next` as they are consumed, so each tracks its own start.\n let queuedStart = accepted.messageId == null && accepted.fromSeq != null;\n let started = queuedStart;\n const frames = streamSessionFrames({\n sessionId,\n fromSeq: accepted.fromSeq ?? FIRST_ACP_FRAME_SEQ,\n follow: true,\n ...frameSources({ context, sessionId }),\n transport: context.realtime(),\n timing: context.timing,\n signal: options?.signal,\n closeSignal: context.closeSignal,\n terminal: async (signal) => {\n const receipt = await get({ signal });\n return receipt.endedAt == null ? null : { throughSeq: receipt.toSeq ?? 0 };\n },\n until: (event) => {\n if (\n !queuedStart &&\n accepted.messageId != null &&\n isUserMessageFor(event, accepted.messageId)\n )\n queuedStart = true;\n return queuedStart && turnEndOf(event) != null;\n },\n });\n const iterator: AsyncIterableIterator<AcpFrameEventIface> = {\n next: async () => {\n for (;;) {\n const next = await frames.next();\n if (next.done === true || started) return next;\n if (accepted.messageId != null && isUserMessageFor(next.value, accepted.messageId)) {\n started = true;\n return next;\n }\n }\n },\n return: () => frames.return?.() ?? Promise.resolve({ done: true, value: undefined }),\n [Symbol.asyncIterator]: () => iterator,\n };\n return iterator;\n };\n\n const result = async (options?: SignalOptionsIface): Promise<TurnResultIface<MessageId>> => {\n const text = createTextCollector();\n let last: AcpFrameEventIface | null = null;\n for await (const event of stream(options)) {\n text.add(event);\n last = event;\n }\n const end = last == null ? null : turnEndOf(last);\n const receipt = await get(options);\n return {\n messageId: accepted.messageId,\n turnId: accepted.turnId,\n stopReason: receipt.stopReason ?? end?.stopReason ?? null,\n text: text.text(),\n toSeq: receipt.toSeq ?? last?.seq ?? accepted.fromSeq ?? 0,\n };\n };\n\n return {\n ...accepted,\n sessionId,\n get,\n stream,\n result,\n text: async (options) => (await result(options)).text,\n };\n};\n\nconst getTurn = (args: {\n context: ClientContextIface;\n sessionId: string;\n turnId: string;\n signal?: AbortSignal;\n}): Promise<AgentTurnIface> =>\n args.context.http.request({\n method: HttpMethod.Get,\n path: sessionPath(args.sessionId, `/turns/${encodePath(args.turnId)}`),\n response: turnSchema,\n signal: args.signal,\n });\n\ninterface ReplayArgsIface extends SignalOptionsIface {\n context: ClientContextIface;\n sessionId: string;\n fromSeq: number;\n limit?: number;\n}\n\nconst replay = (args: ReplayArgsIface): Promise<SessionFramesPageIface> =>\n args.context.http.request({\n method: HttpMethod.Get,\n path: sessionPath(args.sessionId, '/frames'),\n query: { fromSeq: args.fromSeq, limit: args.limit },\n response: sessionFramesPageSchema,\n signal: args.signal,\n });\n\nconst openDecisions = async (args: {\n context: ClientContextIface;\n sessionId: string;\n signal?: AbortSignal;\n}): Promise<DecisionRecordIface[]> =>\n (\n await args.context.http.request({\n method: HttpMethod.Get,\n path: sessionPath(args.sessionId, '/decisions'),\n response: decisionRecordListSchema,\n signal: args.signal,\n })\n ).decisions;\n\n/** The session's frames over Streamable HTTP (`GET /sessions/:id/frames/stream`), from `fromSeq`. */\nasync function* streamFramesOverHttp(args: {\n context: ClientContextIface;\n sessionId: string;\n fromSeq: number;\n signal: AbortSignal;\n}): AsyncGenerator<AcpFrameEventIface> {\n for await (const message of streamServerSentEvents({\n http: args.context.http,\n path: sessionPath(args.sessionId, '/frames/stream'),\n query: { fromSeq: args.fromSeq },\n signal: AbortSignal.any([args.signal, args.context.closeSignal]),\n })) {\n if (message.event !== AgentRealtimeKind.AcpFrame) continue;\n try {\n const event = acpFrameEventSchema.safeParse(JSON.parse(message.data));\n if (event.success) yield event.data;\n } catch {\n // A malformed event is skipped; replay fills any gap it leaves.\n }\n }\n}\n\n/** Live `acp.preview` events of the session topic. */\nconst streamPreviews = (args: {\n context: ClientContextIface;\n sessionId: string;\n signal?: AbortSignal;\n}): AsyncIterableIterator<AcpPreviewEventIface> => {\n const topic = agentRealtimeTopics.session(args.sessionId);\n let unsubscribe: (() => void) | null = null;\n let detachAbort: () => void = () => {};\n let detachClose: () => void = () => {};\n const queue = createAsyncQueue<AcpPreviewEventIface>(() => {\n unsubscribe?.();\n detachAbort();\n detachClose();\n });\n const onFrame = (raw: RealtimeTransportFrameIface): void => {\n const frame = agentRealtimeFrameSchema.safeParse(raw);\n if (!frame.success) return;\n if (frame.data.type === AgentRealtimeFrameType.Error && 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 if (frame.data.type !== AgentRealtimeFrameType.Event) return;\n if (frame.data.kind !== AgentRealtimeKind.AcpPreview) return;\n const preview = acpPreviewEventSchema.safeParse(frame.data.payload);\n if (preview.success) queue.push(preview.data);\n };\n detachAbort = failOnAbort(queue, args.signal);\n detachClose = failOnAbort(queue, args.context.closeSignal);\n if (!queue.closed()) {\n const stop = args.context.realtime().subscribe(topic, onFrame);\n if (queue.closed()) stop();\n else unsubscribe = stop;\n }\n return queue.iterator;\n};\n\n/** Replay, open decisions and the Streamable HTTP fallback of one session's frame stream. */\nconst frameSources = (args: { context: ClientContextIface; sessionId: string }) => ({\n replay: (page: { fromSeq: number; limit: number; signal?: AbortSignal }) =>\n replay({ context: args.context, sessionId: args.sessionId, ...page }),\n decisions: (signal?: AbortSignal) => openDecisions({ ...args, signal }),\n httpStream: (stream: { fromSeq: number; signal: AbortSignal }) =>\n streamFramesOverHttp({ ...args, ...stream }),\n});\n\nexport const createSessionHandle = (\n context: ClientContextIface,\n sessionId: string,\n): SessionHandleIface => {\n const { http } = context;\n const post = async (args: {\n suffix: string;\n body?: HttpBodyIface;\n signal?: AbortSignal;\n }): Promise<void> => {\n await http.request({\n method: HttpMethod.Post,\n path: sessionPath(sessionId, args.suffix),\n body: args.body,\n response: okResponseSchema,\n signal: args.signal,\n context: { sessionId },\n });\n };\n\n return {\n id: sessionId,\n fork: async (options) => {\n const created = await http.request({\n method: HttpMethod.Post,\n path: sessionPath(sessionId, '/fork'),\n body: {\n schema: forkSessionRequestSchema,\n value: {\n idempotencyKey: options?.idempotencyKey ?? context.newKey(),\n title: options?.title,\n },\n },\n response: createSessionResponseSchema,\n signal: options?.signal,\n context: { sessionId },\n });\n return {\n session: created.session,\n handle: createSessionHandle(context, created.session.id),\n response: null,\n };\n },\n attachment: (attachmentId, options) =>\n http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId, `/attachments/${encodePath(attachmentId)}`),\n response: attachmentDownloadSchema,\n signal: options?.signal,\n }),\n get: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId),\n response: sessionSchema,\n signal: options?.signal,\n }),\n manifest: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId, '/manifest'),\n response: sessionManifestSchema,\n signal: options?.signal,\n }),\n requirements: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId, '/requirements'),\n response: sessionRequirementsSchema,\n signal: options?.signal,\n })\n ).requirements,\n provide: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId, '/manifest'),\n response: sessionManifestSchema,\n signal: options?.signal,\n })\n ).provide,\n send: async (content, options) => {\n const accepted = await http.request({\n method: HttpMethod.Post,\n path: sessionPath(sessionId, '/prompt'),\n body: {\n schema: promptSessionRequestSchema,\n value: {\n content,\n turnPolicy: options?.turnPolicy,\n idempotencyKey: options?.idempotencyKey ?? context.newKey(),\n meta: options?.meta,\n clientSubmittedAtMs: options?.clientSubmittedAtMs ?? context.now(),\n },\n },\n response: promptAcceptedSchema,\n signal: options?.signal,\n context: { sessionId },\n });\n return turnHandle({ context, sessionId, accepted });\n },\n observe: (content, options) =>\n post({\n suffix: '/observe',\n body: {\n schema: observeSessionRequestSchema,\n value: {\n content,\n idempotencyKey: options?.idempotencyKey ?? context.newKey(),\n meta: options?.meta,\n },\n },\n signal: options?.signal,\n }),\n stream: (options) =>\n streamSessionFrames({\n sessionId,\n fromSeq: options?.fromSeq ?? FIRST_ACP_FRAME_SEQ,\n follow: options?.follow ?? true,\n ...frameSources({ context, sessionId }),\n transport: context.realtime(),\n timing: context.timing,\n signal: options?.signal,\n closeSignal: context.closeSignal,\n }),\n liveEvents: (options) =>\n streamSessionLiveEvents({ context, sessionId, signal: options?.signal }),\n previews: (options) => streamPreviews({ context, sessionId, signal: options?.signal }),\n frames: (options) => replay({ context, sessionId, ...options }),\n decisions: (options) => openDecisions({ context, sessionId, signal: options?.signal }),\n turn: (turnId, options) => getTurn({ context, sessionId, turnId, signal: options?.signal }),\n response: async (turnId, options) => {\n const receipt = await getTurn({ context, sessionId, turnId, signal: options?.signal });\n return turnHandle({\n context,\n sessionId,\n accepted: {\n turnId: receipt.id,\n messageId: receipt.promptMessageId,\n fromSeq: receipt.fromSeq,\n },\n });\n },\n respond: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: sessionPath(sessionId, '/respond'),\n body: {\n schema: respondDecisionSchema,\n value: { decisionId: args.decisionId, outcome: outcomeOf(args) },\n },\n response: respondDecisionResponseSchema,\n signal: options?.signal,\n context: { sessionId, decisionId: args.decisionId },\n }),\n cancel: (options) =>\n post({\n suffix: '/cancel',\n body: { schema: cancelRequestSchema, value: { reason: options?.reason } },\n signal: options?.signal,\n }),\n setConfigOption: (args, options) =>\n post({\n suffix: '/config-option',\n body: { schema: setConfigOptionRequestSchema, value: args },\n signal: options?.signal,\n }),\n close: (options) => post({ suffix: '/close', signal: options?.signal }),\n plan: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId, '/plan'),\n response: sessionPlanResponseSchema,\n signal: options?.signal,\n })\n ).plan,\n };\n};\n\nexport const createSessionsApi = (context: ClientContextIface): SessionsApiIface => ({\n fork: (sessionId, options) => createSessionHandle(context, sessionId).fork(options),\n get: (sessionId, options) => createSessionHandle(context, sessionId).get(options),\n attach: (sessionId) => createSessionHandle(context, sessionId),\n});\n\nexport interface ProjectSessionsApiIface extends SessionsApiIface {\n /**\n * Starts a session. Fails with `requirements_unmet`, creating nothing, unless\n * every requirement the agent does not mark optional is provided.\n */\n create: (args: CreateSessionArgsIface) => Promise<CreatedSessionIface>;\n}\n\nexport const createProjectSessionsApi = (args: {\n context: ClientContextIface;\n projectId: string;\n start: AgentStartDepsIface;\n}): ProjectSessionsApiIface => {\n const { context } = args;\n return {\n ...createSessionsApi(context),\n create: async (create) => {\n const started = await startAgent(args.start, {\n projectId: args.projectId,\n agent: create.agent,\n provide: create.provide,\n owner: { kind: LocalHostOwnerKind.Session, id: create.id },\n signal: create.signal,\n });\n try {\n const created = await context.http.request({\n method: HttpMethod.Post,\n path: '/v1/sessions',\n body: {\n schema: createSessionRequestSchema,\n value: {\n id: started.ownerId ?? create.id,\n projectId: args.projectId,\n agent: started.ref,\n provide: started.provide,\n actor: create.actor,\n message: create.message,\n turnPolicy: create.turnPolicy,\n idempotencyKey:\n create.idempotencyKey ?? (create.message == null ? undefined : context.newKey()),\n title: create.title,\n meta: create.meta,\n clientSubmittedAtMs:\n create.message == null ? undefined : (create.clientSubmittedAtMs ?? context.now()),\n },\n },\n response: createSessionResponseSchema,\n signal: create.signal,\n });\n const reserved = started.ownerId ?? create.id;\n if (reserved != null && created.session.id !== reserved) {\n // The idempotency key replayed an earlier creation: the session is that one, not\n // the id this call reserved, and what was started for that id serves nothing. Its\n // in-process code is served for it from here; its compute stays what that\n // creation named, which nothing can change now.\n started.abandon();\n if (started.host != null)\n await serveCodeFor(args.start, {\n projectId: args.projectId,\n agent: create.agent,\n owner: { kind: LocalHostOwnerKind.Session, id: created.session.id },\n signal: create.signal,\n });\n } else started.established();\n const handle = createSessionHandle(context, created.session.id);\n return {\n session: created.session,\n handle,\n response:\n created.turn == null\n ? null\n : turnHandle({ context, sessionId: created.session.id, accepted: created.turn }),\n };\n } catch (cause) {\n started.abandon();\n throw cause;\n }\n },\n };\n};\n"],
|
|
5
|
-
"mappings": "AACA;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,OAkBK;AACP,SAAS,qBAAqB,kBAAkB,iBAAiB;AAEjE,SAAS,kBAAkB,mBAAmB;AAC9C;AAAA,EACE;AAAA,OAIK;AACP,SAAS,yBAAyB,iCAAiC;AACnE,SAAS,8BAA8B;AACvC,SAAS,2BAA2B;AACpC,SAAS,kBAAsC;AAC/C,SAAS,+BAAsD;AAC/D,SAAS,0BAA0B;AAGnC,SAAS,cAAc,kBAA4C;AA4J5D,MAAM,YAAY,CAAC,SACxB,cAAc,OAAO,EAAE,SAAS,YAAY,UAAU,KAAK,SAAS,IAAI,KAAK;AAE/E,MAAM,cAAc,CAAC,WAAmB,SAAS,OAC/C,gBAAgB,WAAW,SAAS,CAAC,GAAG,MAAM;AAQhD,MAAM,aAAa,CACjB,SAC+B;AAC/B,QAAM,EAAE,SAAS,WAAW,SAAS,IAAI;AACzC,QAAM,MAAM,CAAC,YACX,QAAQ,EAAE,SAAS,WAAW,QAAQ,SAAS,QAAQ,QAAQ,SAAS,OAAO,CAAC;AAClF,QAAM,SAAS,CAAC,YAA4E;AAG1F,QAAI,cAAc,SAAS,aAAa,QAAQ,SAAS,WAAW;AACpE,QAAI,UAAU;AACd,UAAM,SAAS,oBAAoB;AAAA,MACjC;AAAA,MACA,SAAS,SAAS,WAAW;AAAA,MAC7B,QAAQ;AAAA,MACR,GAAG,aAAa,EAAE,SAAS,UAAU,CAAC;AAAA,MACtC,WAAW,QAAQ,SAAS;AAAA,MAC5B,QAAQ,QAAQ;AAAA,MAChB,QAAQ,SAAS;AAAA,MACjB,aAAa,QAAQ;AAAA,MACrB,UAAU,OAAO,WAAW;AAC1B,cAAM,UAAU,MAAM,IAAI,EAAE,OAAO,CAAC;AACpC,eAAO,QAAQ,WAAW,OAAO,OAAO,EAAE,YAAY,QAAQ,SAAS,EAAE;AAAA,MAC3E;AAAA,MACA,OAAO,CAAC,UAAU;AAChB,YACE,CAAC,eACD,SAAS,aAAa,QACtB,iBAAiB,OAAO,SAAS,SAAS;AAE1C,wBAAc;AAChB,eAAO,eAAe,UAAU,KAAK,KAAK;AAAA,MAC5C;AAAA,IACF,CAAC;AACD,UAAM,WAAsD;AAAA,MAC1D,MAAM,YAAY;AAChB,mBAAS;AACP,gBAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,cAAI,KAAK,SAAS,QAAQ,QAAS,QAAO;AAC1C,cAAI,SAAS,aAAa,QAAQ,iBAAiB,KAAK,OAAO,SAAS,SAAS,GAAG;AAClF,sBAAU;AACV,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,QAAQ,MAAM,OAAO,SAAS,KAAK,QAAQ,QAAQ,EAAE,MAAM,MAAM,OAAO,OAAU,CAAC;AAAA,MACnF,CAAC,OAAO,aAAa,GAAG,MAAM;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,YAAsE;AAC1F,UAAM,OAAO,oBAAoB;AACjC,QAAI,OAAkC;AACtC,qBAAiB,SAAS,OAAO,OAAO,GAAG;AACzC,WAAK,IAAI,KAAK;AACd,aAAO;AAAA,IACT;AACA,UAAM,MAAM,QAAQ,OAAO,OAAO,UAAU,IAAI;AAChD,UAAM,UAAU,MAAM,IAAI,OAAO;AACjC,WAAO;AAAA,MACL,WAAW,SAAS;AAAA,MACpB,QAAQ,SAAS;AAAA,MACjB,YAAY,QAAQ,cAAc,KAAK,cAAc;AAAA,MACrD,MAAM,KAAK,KAAK;AAAA,MAChB,OAAO,QAAQ,SAAS,MAAM,OAAO,SAAS,WAAW;AAAA,IAC3D;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,OAAO,aAAa,MAAM,OAAO,OAAO,GAAG;AAAA,EACnD;AACF;AAEA,MAAM,UAAU,CAAC,SAMf,KAAK,QAAQ,KAAK,QAAQ;AAAA,EACxB,QAAQ,WAAW;AAAA,EACnB,MAAM,YAAY,KAAK,WAAW,UAAU,WAAW,KAAK,MAAM,CAAC,EAAE;AAAA,EACrE,UAAU;AAAA,EACV,QAAQ,KAAK;AACf,CAAC;AASH,MAAM,SAAS,CAAC,SACd,KAAK,QAAQ,KAAK,QAAQ;AAAA,EACxB,QAAQ,WAAW;AAAA,EACnB,MAAM,YAAY,KAAK,WAAW,SAAS;AAAA,EAC3C,OAAO,EAAE,SAAS,KAAK,SAAS,OAAO,KAAK,MAAM;AAAA,EAClD,UAAU;AAAA,EACV,QAAQ,KAAK;AACf,CAAC;AAEH,MAAM,gBAAgB,OAAO,UAMzB,MAAM,KAAK,QAAQ,KAAK,QAAQ;AAAA,EAC9B,QAAQ,WAAW;AAAA,EACnB,MAAM,YAAY,KAAK,WAAW,YAAY;AAAA,EAC9C,UAAU;AAAA,EACV,QAAQ,KAAK;AACf,CAAC,GACD;AAGJ,gBAAgB,qBAAqB,MAKE;AACrC,mBAAiB,WAAW,uBAAuB;AAAA,IACjD,MAAM,KAAK,QAAQ;AAAA,IACnB,MAAM,YAAY,KAAK,WAAW,gBAAgB;AAAA,IAClD,OAAO,EAAE,SAAS,KAAK,QAAQ;AAAA,IAC/B,QAAQ,YAAY,IAAI,CAAC,KAAK,QAAQ,KAAK,QAAQ,WAAW,CAAC;AAAA,EACjE,CAAC,GAAG;AACF,QAAI,QAAQ,UAAU,kBAAkB,SAAU;AAClD,QAAI;AACF,YAAM,QAAQ,oBAAoB,UAAU,KAAK,MAAM,QAAQ,IAAI,CAAC;AACpE,UAAI,MAAM,QAAS,OAAM,MAAM;AAAA,IACjC,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAGA,MAAM,iBAAiB,CAAC,SAI2B;AACjD,QAAM,QAAQ,oBAAoB,QAAQ,KAAK,SAAS;AACxD,MAAI,cAAmC;AACvC,MAAI,cAA0B,MAAM;AAAA,EAAC;AACrC,MAAI,cAA0B,MAAM;AAAA,EAAC;AACrC,QAAM,QAAQ,iBAAuC,MAAM;AACzD,kBAAc;AACd,gBAAY;AACZ,gBAAY;AAAA,EACd,CAAC;AACD,QAAM,UAAU,CAAC,QAA2C;AAC1D,UAAM,QAAQ,yBAAyB,UAAU,GAAG;AACpD,QAAI,CAAC,MAAM,QAAS;AACpB,QAAI,MAAM,KAAK,SAAS,uBAAuB,SAAS,wBAAwB,MAAM,IAAI,GAAG;AAC3F,YAAM;AAAA,QACJ,0BAA0B;AAAA,UACxB,OAAO,MAAM,KAAK,SAAS;AAAA,UAC3B,MAAM,MAAM,KAAK,QAAQ;AAAA,UACzB,SAAS,MAAM,KAAK,WAAW;AAAA,QACjC,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,QAAI,MAAM,KAAK,SAAS,uBAAuB,MAAO;AACtD,QAAI,MAAM,KAAK,SAAS,kBAAkB,WAAY;AACtD,UAAM,UAAU,sBAAsB,UAAU,MAAM,KAAK,OAAO;AAClE,QAAI,QAAQ,QAAS,OAAM,KAAK,QAAQ,IAAI;AAAA,EAC9C;AACA,gBAAc,YAAY,OAAO,KAAK,MAAM;AAC5C,gBAAc,YAAY,OAAO,KAAK,QAAQ,WAAW;AACzD,MAAI,CAAC,MAAM,OAAO,GAAG;AACnB,UAAM,OAAO,KAAK,QAAQ,SAAS,EAAE,UAAU,OAAO,OAAO;AAC7D,QAAI,MAAM,OAAO,EAAG,MAAK;AAAA,QACpB,eAAc;AAAA,EACrB;AACA,SAAO,MAAM;AACf;AAGA,MAAM,eAAe,CAAC,UAA8D;AAAA,EAClF,QAAQ,CAAC,SACP,OAAO,EAAE,SAAS,KAAK,SAAS,WAAW,KAAK,WAAW,GAAG,KAAK,CAAC;AAAA,EACtE,WAAW,CAAC,WAAyB,cAAc,EAAE,GAAG,MAAM,OAAO,CAAC;AAAA,EACtE,YAAY,CAAC,WACX,qBAAqB,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC;AAC/C;AAEO,MAAM,sBAAsB,CACjC,SACA,cACuB;AACvB,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,OAAO,OAAO,SAIC;AACnB,UAAM,KAAK,QAAQ;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,WAAW,KAAK,MAAM;AAAA,MACxC,MAAM,KAAK;AAAA,MACX,UAAU;AAAA,MACV,QAAQ,KAAK;AAAA,MACb,SAAS,EAAE,UAAU;AAAA,IACvB,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM,OAAO,YAAY;AACvB,YAAM,UAAU,MAAM,KAAK,QAAQ;AAAA,QACjC,QAAQ,WAAW;AAAA,QACnB,MAAM,YAAY,WAAW,OAAO;AAAA,QACpC,MAAM;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO;AAAA,YACL,gBAAgB,SAAS,kBAAkB,QAAQ,OAAO;AAAA,YAC1D,OAAO,SAAS;AAAA,UAClB;AAAA,QACF;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,QACjB,SAAS,EAAE,UAAU;AAAA,MACvB,CAAC;AACD,aAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,QAAQ,oBAAoB,SAAS,QAAQ,QAAQ,EAAE;AAAA,QACvD,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,YAAY,CAAC,cAAc,YACzB,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,WAAW,gBAAgB,WAAW,YAAY,CAAC,EAAE;AAAA,MACvE,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,KAAK,CAAC,YACJ,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,SAAS;AAAA,MAC3B,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,UAAU,CAAC,YACT,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,WAAW,WAAW;AAAA,MACxC,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,cAAc,OAAO,aAEjB,MAAM,KAAK,QAAQ;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,WAAW,eAAe;AAAA,MAC5C,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC,GACD;AAAA,IACJ,SAAS,OAAO,aAEZ,MAAM,KAAK,QAAQ;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,WAAW,WAAW;AAAA,MACxC,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC,GACD;AAAA,IACJ,MAAM,OAAO,SAAS,YAAY;AAChC,YAAM,WAAW,MAAM,KAAK,QAAQ;AAAA,QAClC,QAAQ,WAAW;AAAA,QACnB,MAAM,YAAY,WAAW,SAAS;AAAA,QACtC,MAAM;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO;AAAA,YACL;AAAA,YACA,YAAY,SAAS;AAAA,YACrB,gBAAgB,SAAS,kBAAkB,QAAQ,OAAO;AAAA,YAC1D,MAAM,SAAS;AAAA,YACf,qBAAqB,SAAS,uBAAuB,QAAQ,IAAI;AAAA,UACnE;AAAA,QACF;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,QACjB,SAAS,EAAE,UAAU;AAAA,MACvB,CAAC;AACD,aAAO,WAAW,EAAE,SAAS,WAAW,SAAS,CAAC;AAAA,IACpD;AAAA,IACA,SAAS,CAAC,SAAS,YACjB,KAAK;AAAA,MACH,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,QAAQ;AAAA,QACR,OAAO;AAAA,UACL;AAAA,UACA,gBAAgB,SAAS,kBAAkB,QAAQ,OAAO;AAAA,UAC1D,MAAM,SAAS;AAAA,QACjB;AAAA,MACF;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,QAAQ,CAAC,YACP,oBAAoB;AAAA,MAClB;AAAA,MACA,SAAS,SAAS,WAAW;AAAA,MAC7B,QAAQ,SAAS,UAAU;AAAA,MAC3B,GAAG,aAAa,EAAE,SAAS,UAAU,CAAC;AAAA,MACtC,WAAW,QAAQ,SAAS;AAAA,MAC5B,QAAQ,QAAQ;AAAA,MAChB,QAAQ,SAAS;AAAA,MACjB,aAAa,QAAQ;AAAA,IACvB,CAAC;AAAA,IACH,YAAY,CAAC,YACX,wBAAwB,EAAE,SAAS,WAAW,QAAQ,SAAS,OAAO,CAAC;AAAA,IACzE,UAAU,CAAC,YAAY,eAAe,EAAE,SAAS,WAAW,QAAQ,SAAS,OAAO,CAAC;AAAA,IACrF,QAAQ,CAAC,YAAY,OAAO,EAAE,SAAS,WAAW,GAAG,QAAQ,CAAC;AAAA,IAC9D,WAAW,CAAC,YAAY,cAAc,EAAE,SAAS,WAAW,QAAQ,SAAS,OAAO,CAAC;AAAA,IACrF,MAAM,CAAC,QAAQ,YAAY,QAAQ,EAAE,SAAS,WAAW,QAAQ,QAAQ,SAAS,OAAO,CAAC;AAAA,IAC1F,UAAU,OAAO,QAAQ,YAAY;AACnC,YAAM,UAAU,MAAM,QAAQ,EAAE,SAAS,WAAW,QAAQ,QAAQ,SAAS,OAAO,CAAC;AACrF,aAAO,WAAW;AAAA,QAChB;AAAA,QACA;AAAA,QACA,UAAU;AAAA,UACR,QAAQ,QAAQ;AAAA,UAChB,WAAW,QAAQ;AAAA,UACnB,SAAS,QAAQ;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,SAAS,CAAC,MAAM,YACd,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,WAAW,UAAU;AAAA,MACvC,MAAM;AAAA,QACJ,QAAQ;AAAA,QACR,OAAO,EAAE,YAAY,KAAK,YAAY,SAAS,UAAU,IAAI,EAAE;AAAA,MACjE;AAAA,MACA,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,MACjB,SAAS,EAAE,WAAW,YAAY,KAAK,WAAW;AAAA,IACpD,CAAC;AAAA,IACH,QAAQ,CAAC,YACP,KAAK;AAAA,MACH,QAAQ;AAAA,MACR,MAAM,EAAE,QAAQ,qBAAqB,OAAO,EAAE,QAAQ,SAAS,OAAO,EAAE;AAAA,MACxE,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,iBAAiB,CAAC,MAAM,YACtB,KAAK;AAAA,MACH,QAAQ;AAAA,MACR,MAAM,EAAE,QAAQ,8BAA8B,OAAO,KAAK;AAAA,MAC1D,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,OAAO,CAAC,YAAY,KAAK,EAAE,QAAQ,UAAU,QAAQ,SAAS,OAAO,CAAC;AAAA,IACtE,MAAM,OAAO,aAET,MAAM,KAAK,QAAQ;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,WAAW,OAAO;AAAA,MACpC,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC,GACD;AAAA,EACN;AACF;AAEO,MAAM,oBAAoB,CAAC,aAAmD;AAAA,EACnF,MAAM,CAAC,WAAW,YAAY,oBAAoB,SAAS,SAAS,EAAE,KAAK,OAAO;AAAA,EAClF,KAAK,CAAC,WAAW,YAAY,oBAAoB,SAAS,SAAS,EAAE,IAAI,OAAO;AAAA,EAChF,QAAQ,CAAC,cAAc,oBAAoB,SAAS,SAAS;AAC/D;AAUO,MAAM,2BAA2B,CAAC,SAIV;AAC7B,QAAM,EAAE,QAAQ,IAAI;AACpB,SAAO;AAAA,IACL,GAAG,kBAAkB,OAAO;AAAA,IAC5B,QAAQ,OAAO,WAAW;AACxB,YAAM,UAAU,MAAM,WAAW,KAAK,OAAO;AAAA,QAC3C,WAAW,KAAK;AAAA,QAChB,OAAO,OAAO;AAAA,QACd,SAAS,OAAO;AAAA,QAChB,OAAO,EAAE,MAAM,mBAAmB,SAAS,IAAI,OAAO,GAAG;AAAA,QACzD,QAAQ,OAAO;AAAA,MACjB,CAAC;AACD,UAAI;AACF,cAAM,UAAU,MAAM,QAAQ,KAAK,QAAQ;AAAA,UACzC,QAAQ,WAAW;AAAA,UACnB,MAAM;AAAA,UACN,MAAM;AAAA,YACJ,QAAQ;AAAA,YACR,OAAO;AAAA,cACL,IAAI,QAAQ,WAAW,OAAO;AAAA,cAC9B,WAAW,KAAK;AAAA,cAChB,OAAO,QAAQ;AAAA,cACf,SAAS,QAAQ;AAAA,cACjB,OAAO,OAAO;AAAA,cACd,SAAS,OAAO;AAAA,cAChB,YAAY,OAAO;AAAA,cACnB,gBACE,OAAO,mBAAmB,OAAO,WAAW,OAAO,SAAY,QAAQ,OAAO;AAAA,cAChF,OAAO,OAAO;AAAA,cACd,MAAM,OAAO;AAAA,cACb,qBACE,OAAO,WAAW,OAAO,SAAa,OAAO,uBAAuB,QAAQ,IAAI;AAAA,YACpF;AAAA,UACF;AAAA,UACA,UAAU;AAAA,UACV,QAAQ,OAAO;AAAA,QACjB,CAAC;AACD,cAAM,WAAW,QAAQ,WAAW,OAAO;AAC3C,YAAI,YAAY,QAAQ,QAAQ,QAAQ,OAAO,UAAU;AAKvD,kBAAQ,QAAQ;AAChB,cAAI,QAAQ,QAAQ;AAClB,kBAAM,aAAa,KAAK,OAAO;AAAA,cAC7B,WAAW,KAAK;AAAA,cAChB,OAAO,OAAO;AAAA,cACd,OAAO,EAAE,MAAM,mBAAmB,SAAS,IAAI,QAAQ,QAAQ,GAAG;AAAA,cAClE,QAAQ,OAAO;AAAA,YACjB,CAAC;AAAA,QACL,MAAO,SAAQ,YAAY;AAC3B,cAAM,SAAS,oBAAoB,SAAS,QAAQ,QAAQ,EAAE;AAC9D,eAAO;AAAA,UACL,SAAS,QAAQ;AAAA,UACjB;AAAA,UACA,UACE,QAAQ,QAAQ,OACZ,OACA,WAAW,EAAE,SAAS,WAAW,QAAQ,QAAQ,IAAI,UAAU,QAAQ,KAAK,CAAC;AAAA,QACrF;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,QAAQ;AAChB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;",
|
|
4
|
+
"sourcesContent": ["import type { JsonObjectIface, JsonValue } from '@finalai/agent-protocol';\nimport {\n acpFrameEventSchema,\n acpLiveTextEventSchema,\n acpPreviewEventSchema,\n agentRealtimeFrameSchema,\n AgentRealtimeFrameType,\n AgentRealtimeKind,\n agentRealtimeTopics,\n attachmentDownloadSchema,\n cancelRequestSchema,\n createSessionRequestSchema,\n createSessionResponseSchema,\n FIRST_ACP_FRAME_SEQ,\n forkSessionRequestSchema,\n observeSessionRequestSchema,\n decisionRecordListSchema,\n okResponseSchema,\n promptAcceptedSchema,\n promptSessionRequestSchema,\n respondDecisionResponseSchema,\n respondDecisionSchema,\n sessionFramesPageSchema,\n sessionLiveTextSchema,\n SessionRealtimeKind,\n sessionManifestSchema,\n sessionPlanResponseSchema,\n sessionRequirementsSchema,\n sessionSchema,\n setConfigOptionRequestSchema,\n turnSchema,\n type AcpFrameEventIface,\n type AcpLiveTextEventIface,\n type AcpPreviewEventIface,\n type ActorIface,\n type AgentSessionIface,\n type AgentTurnIface,\n type AgentTurnPolicy,\n type AttachmentDownloadIface,\n type ContentInput,\n type DecisionOutcomeInput,\n type DecisionRecordIface,\n type PromptAcceptedIface,\n type ProvideDocumentViewIface,\n type RequirementStatusIface,\n type RespondDecisionResponseIface,\n type SessionFramesPageIface,\n type SessionLiveTextIface,\n type SessionManifestIface,\n type SessionPlanIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport { createTextCollector, isUserMessageFor, turnEndOf } from \"./acp-frames.mjs\";\nimport type { AgentInput } from \"./agent-input.mjs\";\nimport { createAsyncQueue, failOnAbort } from \"./async-queue.mjs\";\nimport {\n encodePath,\n type ClientContextIface,\n type EnumInput,\n type SignalOptionsIface,\n} from \"./context.mjs\";\nimport { isTerminalRealtimeError, realtimeSubscriptionError } from \"./errors.mjs\";\nimport { streamServerSentEvents } from \"./event-stream.mjs\";\nimport { streamSessionFrames } from \"./frame-stream.mjs\";\nimport { HttpMethod, type HttpBodyIface } from \"./http.mjs\";\nimport { streamSessionLiveEvents, type SessionLiveEvent } from \"./live-stream.mjs\";\nimport { LocalHostOwnerKind } from \"./local-host-protocol.mjs\";\nimport type { ProvideIface } from \"./provide.mjs\";\nimport type { RealtimeTransportFrameIface } from \"./realtime.mjs\";\nimport { serveCodeFor, startAgent, type AgentStartDepsIface } from \"./start.mjs\";\n\n/** Answer a decision by option id (permission) or with a full ACP outcome. */\nexport type RespondArgs =\n | { decisionId: string; optionId: string }\n | { decisionId: string; outcome: DecisionOutcomeInput };\n\nexport interface StreamOptionsIface extends SignalOptionsIface {\n /** Inclusive; defaults to `FIRST_ACP_FRAME_SEQ` (the whole log). Earlier values are clamped. */\n fromSeq?: number;\n /** Keep streaming live frames after replay catches up; defaults to true. */\n follow?: boolean;\n}\n\nexport interface TurnResultIface<MessageId extends string | null = string> {\n messageId: MessageId;\n turnId: string;\n stopReason: string | null;\n /** Visible agent text of the turn. */\n text: string;\n /** Seq of the frame that ended the turn. */\n toSeq: number;\n}\n\n/** An accepted prompt. `stream()` yields this turn's frames; `result()` waits for its end. */\nexport interface TurnHandleIface<MessageId extends string | null = string> extends Omit<\n PromptAcceptedIface,\n 'messageId'\n> {\n messageId: MessageId;\n sessionId: string;\n get: (options?: SignalOptionsIface) => Promise<AgentTurnIface>;\n stream: (options?: SignalOptionsIface) => AsyncIterableIterator<AcpFrameEventIface>;\n result: (options?: SignalOptionsIface) => Promise<TurnResultIface<MessageId>>;\n /** The turn's visible agent text, once it ends. */\n text: (options?: SignalOptionsIface) => Promise<string>;\n}\n\nexport interface SendOptionsIface extends SignalOptionsIface {\n turnPolicy?: EnumInput<AgentTurnPolicy>;\n idempotencyKey?: string;\n meta?: JsonObjectIface;\n /** When the person submitted, for the prompt-to-inference trace; defaults to now. */\n clientSubmittedAtMs?: number;\n}\n\nexport interface ForkSessionOptionsIface extends SignalOptionsIface {\n /** Retain this key when retrying an interrupted fork. Defaults to a new key. */\n idempotencyKey?: string;\n title?: string;\n}\n\n/** An I/O-free handle on one session; every method is one HTTP call or one stream. */\nexport interface SessionHandleIface {\n id: string;\n /** Native fork of an idle source on its pinned agent hash; the standalone child has fresh scopes. */\n fork: (options?: ForkSessionOptionsIface) => Promise<CreatedSessionIface>;\n get: (options?: SignalOptionsIface) => Promise<AgentSessionIface>;\n /** Resolves a `final-attachment:` resource link from this session's frames. */\n attachment: (\n attachmentId: string,\n options?: SignalOptionsIface,\n ) => Promise<AttachmentDownloadIface>;\n send: (content: ContentInput, options?: SendOptionsIface) => Promise<TurnHandleIface>;\n /** Adds content to history without a model call (`_final/session/observe`). */\n observe: (\n content: ContentInput,\n options?: SignalOptionsIface & { idempotencyKey?: string; meta?: JsonObjectIface },\n ) => Promise<void>;\n stream: (options?: StreamOptionsIface) => AsyncIterableIterator<AcpFrameEventIface>;\n /** Full provisional frames and reset notices; never a durable replay cursor or receipt. */\n liveEvents: (options?: SignalOptionsIface) => AsyncIterableIterator<SessionLiveEvent>;\n /**\n * `acp.preview` events: the text of message and thought chunks as the session\n * publishes them, live only (never replayed), for surfaces that render text\n * ahead of the durable frames and the conversation's projected messages.\n */\n previews: (options?: SignalOptionsIface) => AsyncIterableIterator<AcpPreviewEventIface>;\n /**\n * The agent's text as it streams, in arrival order: the saved chunks (`acp.preview`) and the\n * model's live text ahead of them (`acp.live_text`). Live only; start from `liveText()`.\n */\n textEvents: (\n options?: SignalOptionsIface,\n ) => AsyncIterableIterator<AcpPreviewEventIface | AcpLiveTextEventIface>;\n /** What each agent message of the session's open turns has streamed so far. */\n liveText: (options?: SignalOptionsIface) => Promise<SessionLiveTextIface>;\n /** One replay page (`GET /sessions/:id/frames`). */\n frames: (\n options: SignalOptionsIface & { fromSeq: number; limit?: number },\n ) => Promise<SessionFramesPageIface>;\n /** The session's open decisions (`GET /sessions/:id/decisions`). */\n decisions: (options?: SignalOptionsIface) => Promise<DecisionRecordIface[]>;\n turn: (turnId: string, options?: SignalOptionsIface) => Promise<AgentTurnIface>;\n /** Reconstruct an accepted response from its durable turn id, without resending its prompt. */\n response: (\n turnId: string,\n options?: SignalOptionsIface,\n ) => Promise<TurnHandleIface<string | null>>;\n respond: (\n args: RespondArgs,\n options?: SignalOptionsIface,\n ) => Promise<RespondDecisionResponseIface>;\n cancel: (options?: SignalOptionsIface & { reason?: string }) => Promise<void>;\n /**\n * ACP `session/set_config_option` (model, reasoning, mode, ...): `configId` and a value\n * from the options the harness advertises (`get().configOptions`, `configSelectsOf`).\n * Changing them takes the session's owner, or a conversation owner or admin.\n */\n setConfigOption: (\n args: { configId: string; value: JsonValue },\n options?: SignalOptionsIface,\n ) => Promise<void>;\n close: (options?: SignalOptionsIface) => Promise<void>;\n /** The agent document the session pins and the provide document it was resolved with. */\n manifest: (options?: SignalOptionsIface) => Promise<SessionManifestIface>;\n /** Each of the agent's requirements and what provides it now. */\n requirements: (options?: SignalOptionsIface) => Promise<RequirementStatusIface[]>;\n /** What the session was provided; null before its first open. */\n provide: (options?: SignalOptionsIface) => Promise<ProvideDocumentViewIface | null>;\n /**\n * The latest plan the agent reported, with its history (`GET \u2026/plan`); null\n * until it reports one. Each update raises `revision` and emits a\n * `session.plan_updated` event.\n */\n plan: (options?: SignalOptionsIface) => Promise<SessionPlanIface | null>;\n}\n\nexport interface CreateSessionArgsIface extends SignalOptionsIface {\n /**\n * A session id you chose, so whatever you create for it first (a sandbox it\n * owns) can name it. Creating with an id that exists returns that session.\n */\n id?: string;\n /** The agent you defined, or one fetched with `project.agents.get`; never a string. */\n agent: AgentInput;\n /**\n * What the agent requires. Files and shell left out run in this process\n * unless the client was created with `localCompute: false`.\n */\n provide: ProvideIface;\n /** Your app's end user the first turn acts for. */\n actor?: Omit<ActorIface, 'displayName'> & { displayName?: string };\n message?: ContentInput;\n turnPolicy?: EnumInput<AgentTurnPolicy>;\n idempotencyKey?: string;\n title?: string;\n meta?: JsonObjectIface;\n /** When the person submitted `message`; defaults to now. */\n clientSubmittedAtMs?: number;\n}\n\nexport interface CreatedSessionIface {\n session: AgentSessionIface;\n handle: SessionHandleIface;\n /** The first turn when `message` was given. */\n response: TurnHandleIface | null;\n}\n\nexport interface SessionsApiIface {\n fork: (sessionId: string, options?: ForkSessionOptionsIface) => Promise<CreatedSessionIface>;\n get: (sessionId: string, options?: SignalOptionsIface) => Promise<AgentSessionIface>;\n attach: (sessionId: string) => SessionHandleIface;\n}\n\nexport const outcomeOf = (args: RespondArgs): DecisionOutcomeInput =>\n 'optionId' in args ? { outcome: 'selected', optionId: args.optionId } : args.outcome;\n\nconst sessionPath = (sessionId: string, suffix = ''): string =>\n `/v1/sessions/${encodePath(sessionId)}${suffix}`;\n\ninterface TurnHandleArgsIface<MessageId extends string | null> {\n context: ClientContextIface;\n sessionId: string;\n accepted: Omit<PromptAcceptedIface, 'messageId'> & { messageId: MessageId };\n}\n\nconst turnHandle = <MessageId extends string | null>(\n args: TurnHandleArgsIface<MessageId>,\n): TurnHandleIface<MessageId> => {\n const { context, sessionId, accepted } = args;\n const get = (options?: SignalOptionsIface) =>\n getTurn({ context, sessionId, turnId: accepted.turnId, signal: options?.signal });\n const stream = (options?: SignalOptionsIface): AsyncIterableIterator<AcpFrameEventIface> => {\n // Without the prompt's seq, scan from the start for ACP's user message with this id.\n // `until` runs as frames are queued and `next` as they are consumed, so each tracks its own start.\n let queuedStart = accepted.messageId == null && accepted.fromSeq != null;\n let started = queuedStart;\n const frames = streamSessionFrames({\n sessionId,\n fromSeq: accepted.fromSeq ?? FIRST_ACP_FRAME_SEQ,\n follow: true,\n ...frameSources({ context, sessionId }),\n transport: context.realtime(),\n timing: context.timing,\n signal: options?.signal,\n closeSignal: context.closeSignal,\n terminal: async (signal) => {\n const receipt = await get({ signal });\n return receipt.endedAt == null ? null : { throughSeq: receipt.toSeq ?? 0 };\n },\n until: (event) => {\n if (\n !queuedStart &&\n accepted.messageId != null &&\n isUserMessageFor(event, accepted.messageId)\n )\n queuedStart = true;\n return queuedStart && turnEndOf(event) != null;\n },\n });\n const iterator: AsyncIterableIterator<AcpFrameEventIface> = {\n next: async () => {\n for (;;) {\n const next = await frames.next();\n if (next.done === true || started) return next;\n if (accepted.messageId != null && isUserMessageFor(next.value, accepted.messageId)) {\n started = true;\n return next;\n }\n }\n },\n return: () => frames.return?.() ?? Promise.resolve({ done: true, value: undefined }),\n [Symbol.asyncIterator]: () => iterator,\n };\n return iterator;\n };\n\n const result = async (options?: SignalOptionsIface): Promise<TurnResultIface<MessageId>> => {\n const text = createTextCollector();\n let last: AcpFrameEventIface | null = null;\n for await (const event of stream(options)) {\n text.add(event);\n last = event;\n }\n const end = last == null ? null : turnEndOf(last);\n const receipt = await get(options);\n return {\n messageId: accepted.messageId,\n turnId: accepted.turnId,\n stopReason: receipt.stopReason ?? end?.stopReason ?? null,\n text: text.text(),\n toSeq: receipt.toSeq ?? last?.seq ?? accepted.fromSeq ?? 0,\n };\n };\n\n return {\n ...accepted,\n sessionId,\n get,\n stream,\n result,\n text: async (options) => (await result(options)).text,\n };\n};\n\nconst getTurn = (args: {\n context: ClientContextIface;\n sessionId: string;\n turnId: string;\n signal?: AbortSignal;\n}): Promise<AgentTurnIface> =>\n args.context.http.request({\n method: HttpMethod.Get,\n path: sessionPath(args.sessionId, `/turns/${encodePath(args.turnId)}`),\n response: turnSchema,\n signal: args.signal,\n });\n\ninterface ReplayArgsIface extends SignalOptionsIface {\n context: ClientContextIface;\n sessionId: string;\n fromSeq: number;\n limit?: number;\n}\n\nconst replay = (args: ReplayArgsIface): Promise<SessionFramesPageIface> =>\n args.context.http.request({\n method: HttpMethod.Get,\n path: sessionPath(args.sessionId, '/frames'),\n query: { fromSeq: args.fromSeq, limit: args.limit },\n response: sessionFramesPageSchema,\n signal: args.signal,\n });\n\nconst openDecisions = async (args: {\n context: ClientContextIface;\n sessionId: string;\n signal?: AbortSignal;\n}): Promise<DecisionRecordIface[]> =>\n (\n await args.context.http.request({\n method: HttpMethod.Get,\n path: sessionPath(args.sessionId, '/decisions'),\n response: decisionRecordListSchema,\n signal: args.signal,\n })\n ).decisions;\n\n/** The session's frames over Streamable HTTP (`GET /sessions/:id/frames/stream`), from `fromSeq`. */\nasync function* streamFramesOverHttp(args: {\n context: ClientContextIface;\n sessionId: string;\n fromSeq: number;\n signal: AbortSignal;\n}): AsyncGenerator<AcpFrameEventIface> {\n for await (const message of streamServerSentEvents({\n http: args.context.http,\n path: sessionPath(args.sessionId, '/frames/stream'),\n query: { fromSeq: args.fromSeq },\n signal: AbortSignal.any([args.signal, args.context.closeSignal]),\n })) {\n if (message.event !== AgentRealtimeKind.AcpFrame) continue;\n try {\n const event = acpFrameEventSchema.safeParse(JSON.parse(message.data));\n if (event.success) yield event.data;\n } catch {\n // A malformed event is skipped; replay fills any gap it leaves.\n }\n }\n}\n\n/** Live `acp.preview` events of the session topic. */\nconst streamSessionEvents = <Value>(args: {\n context: ClientContextIface;\n sessionId: string;\n signal?: AbortSignal;\n /** The event a frame's kind and payload carry, or null to skip the frame. */\n parse: (kind: string, payload: unknown) => Value | null;\n}): AsyncIterableIterator<Value> => {\n const topic = agentRealtimeTopics.session(args.sessionId);\n let unsubscribe: (() => void) | null = null;\n let detachAbort: () => void = () => {};\n let detachClose: () => void = () => {};\n const queue = createAsyncQueue<Value>(() => {\n unsubscribe?.();\n detachAbort();\n detachClose();\n });\n const onFrame = (raw: RealtimeTransportFrameIface): void => {\n const frame = agentRealtimeFrameSchema.safeParse(raw);\n if (!frame.success) return;\n if (frame.data.type === AgentRealtimeFrameType.Error && 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 if (frame.data.type !== AgentRealtimeFrameType.Event) return;\n const value = args.parse(frame.data.kind, frame.data.payload);\n if (value != null) queue.push(value);\n };\n detachAbort = failOnAbort(queue, args.signal);\n detachClose = failOnAbort(queue, args.context.closeSignal);\n if (!queue.closed()) {\n const stop = args.context.realtime().subscribe(topic, onFrame);\n if (queue.closed()) stop();\n else unsubscribe = stop;\n }\n return queue.iterator;\n};\n\nconst parsePreview = (kind: string, payload: unknown): AcpPreviewEventIface | null => {\n if (kind !== AgentRealtimeKind.AcpPreview) return null;\n const preview = acpPreviewEventSchema.safeParse(payload);\n return preview.success ? preview.data : null;\n};\n\nconst parseTextEvent = (\n kind: string,\n payload: unknown,\n): AcpPreviewEventIface | AcpLiveTextEventIface | null => {\n if (kind !== SessionRealtimeKind.AcpLiveText) return parsePreview(kind, payload);\n const live = acpLiveTextEventSchema.safeParse(payload);\n return live.success ? live.data : null;\n};\n\n/** Replay, open decisions and the Streamable HTTP fallback of one session's frame stream. */\nconst frameSources = (args: { context: ClientContextIface; sessionId: string }) => ({\n replay: (page: { fromSeq: number; limit: number; signal?: AbortSignal }) =>\n replay({ context: args.context, sessionId: args.sessionId, ...page }),\n decisions: (signal?: AbortSignal) => openDecisions({ ...args, signal }),\n httpStream: (stream: { fromSeq: number; signal: AbortSignal }) =>\n streamFramesOverHttp({ ...args, ...stream }),\n});\n\nexport const createSessionHandle = (\n context: ClientContextIface,\n sessionId: string,\n): SessionHandleIface => {\n const { http } = context;\n const post = async (args: {\n suffix: string;\n body?: HttpBodyIface;\n signal?: AbortSignal;\n }): Promise<void> => {\n await http.request({\n method: HttpMethod.Post,\n path: sessionPath(sessionId, args.suffix),\n body: args.body,\n response: okResponseSchema,\n signal: args.signal,\n context: { sessionId },\n });\n };\n\n return {\n id: sessionId,\n fork: async (options) => {\n const created = await http.request({\n method: HttpMethod.Post,\n path: sessionPath(sessionId, '/fork'),\n body: {\n schema: forkSessionRequestSchema,\n value: {\n idempotencyKey: options?.idempotencyKey ?? context.newKey(),\n title: options?.title,\n },\n },\n response: createSessionResponseSchema,\n signal: options?.signal,\n context: { sessionId },\n });\n return {\n session: created.session,\n handle: createSessionHandle(context, created.session.id),\n response: null,\n };\n },\n attachment: (attachmentId, options) =>\n http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId, `/attachments/${encodePath(attachmentId)}`),\n response: attachmentDownloadSchema,\n signal: options?.signal,\n }),\n get: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId),\n response: sessionSchema,\n signal: options?.signal,\n }),\n manifest: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId, '/manifest'),\n response: sessionManifestSchema,\n signal: options?.signal,\n }),\n requirements: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId, '/requirements'),\n response: sessionRequirementsSchema,\n signal: options?.signal,\n })\n ).requirements,\n provide: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId, '/manifest'),\n response: sessionManifestSchema,\n signal: options?.signal,\n })\n ).provide,\n send: async (content, options) => {\n const accepted = await http.request({\n method: HttpMethod.Post,\n path: sessionPath(sessionId, '/prompt'),\n body: {\n schema: promptSessionRequestSchema,\n value: {\n content,\n turnPolicy: options?.turnPolicy,\n idempotencyKey: options?.idempotencyKey ?? context.newKey(),\n meta: options?.meta,\n clientSubmittedAtMs: options?.clientSubmittedAtMs ?? context.now(),\n },\n },\n response: promptAcceptedSchema,\n signal: options?.signal,\n context: { sessionId },\n });\n return turnHandle({ context, sessionId, accepted });\n },\n observe: (content, options) =>\n post({\n suffix: '/observe',\n body: {\n schema: observeSessionRequestSchema,\n value: {\n content,\n idempotencyKey: options?.idempotencyKey ?? context.newKey(),\n meta: options?.meta,\n },\n },\n signal: options?.signal,\n }),\n stream: (options) =>\n streamSessionFrames({\n sessionId,\n fromSeq: options?.fromSeq ?? FIRST_ACP_FRAME_SEQ,\n follow: options?.follow ?? true,\n ...frameSources({ context, sessionId }),\n transport: context.realtime(),\n timing: context.timing,\n signal: options?.signal,\n closeSignal: context.closeSignal,\n }),\n liveEvents: (options) =>\n streamSessionLiveEvents({ context, sessionId, signal: options?.signal }),\n previews: (options) =>\n streamSessionEvents({ context, sessionId, signal: options?.signal, parse: parsePreview }),\n textEvents: (options) =>\n streamSessionEvents({ context, sessionId, signal: options?.signal, parse: parseTextEvent }),\n liveText: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId, '/live-text'),\n response: sessionLiveTextSchema,\n signal: options?.signal,\n }),\n frames: (options) => replay({ context, sessionId, ...options }),\n decisions: (options) => openDecisions({ context, sessionId, signal: options?.signal }),\n turn: (turnId, options) => getTurn({ context, sessionId, turnId, signal: options?.signal }),\n response: async (turnId, options) => {\n const receipt = await getTurn({ context, sessionId, turnId, signal: options?.signal });\n return turnHandle({\n context,\n sessionId,\n accepted: {\n turnId: receipt.id,\n messageId: receipt.promptMessageId,\n fromSeq: receipt.fromSeq,\n },\n });\n },\n respond: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: sessionPath(sessionId, '/respond'),\n body: {\n schema: respondDecisionSchema,\n value: { decisionId: args.decisionId, outcome: outcomeOf(args) },\n },\n response: respondDecisionResponseSchema,\n signal: options?.signal,\n context: { sessionId, decisionId: args.decisionId },\n }),\n cancel: (options) =>\n post({\n suffix: '/cancel',\n body: { schema: cancelRequestSchema, value: { reason: options?.reason } },\n signal: options?.signal,\n }),\n setConfigOption: (args, options) =>\n post({\n suffix: '/config-option',\n body: { schema: setConfigOptionRequestSchema, value: args },\n signal: options?.signal,\n }),\n close: (options) => post({ suffix: '/close', signal: options?.signal }),\n plan: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: sessionPath(sessionId, '/plan'),\n response: sessionPlanResponseSchema,\n signal: options?.signal,\n })\n ).plan,\n };\n};\n\nexport const createSessionsApi = (context: ClientContextIface): SessionsApiIface => ({\n fork: (sessionId, options) => createSessionHandle(context, sessionId).fork(options),\n get: (sessionId, options) => createSessionHandle(context, sessionId).get(options),\n attach: (sessionId) => createSessionHandle(context, sessionId),\n});\n\nexport interface ProjectSessionsApiIface extends SessionsApiIface {\n /**\n * Starts a session. Fails with `requirements_unmet`, creating nothing, unless\n * every requirement the agent does not mark optional is provided.\n */\n create: (args: CreateSessionArgsIface) => Promise<CreatedSessionIface>;\n}\n\nexport const createProjectSessionsApi = (args: {\n context: ClientContextIface;\n projectId: string;\n start: AgentStartDepsIface;\n}): ProjectSessionsApiIface => {\n const { context } = args;\n return {\n ...createSessionsApi(context),\n create: async (create) => {\n const started = await startAgent(args.start, {\n projectId: args.projectId,\n agent: create.agent,\n provide: create.provide,\n owner: { kind: LocalHostOwnerKind.Session, id: create.id },\n signal: create.signal,\n });\n try {\n const created = await context.http.request({\n method: HttpMethod.Post,\n path: '/v1/sessions',\n body: {\n schema: createSessionRequestSchema,\n value: {\n id: started.ownerId ?? create.id,\n projectId: args.projectId,\n agent: started.ref,\n provide: started.provide,\n actor: create.actor,\n message: create.message,\n turnPolicy: create.turnPolicy,\n idempotencyKey:\n create.idempotencyKey ?? (create.message == null ? undefined : context.newKey()),\n title: create.title,\n meta: create.meta,\n clientSubmittedAtMs:\n create.message == null ? undefined : (create.clientSubmittedAtMs ?? context.now()),\n },\n },\n response: createSessionResponseSchema,\n signal: create.signal,\n });\n const reserved = started.ownerId ?? create.id;\n if (reserved != null && created.session.id !== reserved) {\n // The idempotency key replayed an earlier creation: the session is that one, not\n // the id this call reserved, and what was started for that id serves nothing. Its\n // in-process code is served for it from here; its compute stays what that\n // creation named, which nothing can change now.\n started.abandon();\n if (started.host != null)\n await serveCodeFor(args.start, {\n projectId: args.projectId,\n agent: create.agent,\n owner: { kind: LocalHostOwnerKind.Session, id: created.session.id },\n signal: create.signal,\n });\n } else started.established();\n const handle = createSessionHandle(context, created.session.id);\n return {\n session: created.session,\n handle,\n response:\n created.turn == null\n ? null\n : turnHandle({ context, sessionId: created.session.id, accepted: created.turn }),\n };\n } catch (cause) {\n started.abandon();\n throw cause;\n }\n },\n };\n};\n"],
|
|
5
|
+
"mappings": "AACA;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,OAoBK;AACP,SAAS,qBAAqB,kBAAkB,iBAAiB;AAEjE,SAAS,kBAAkB,mBAAmB;AAC9C;AAAA,EACE;AAAA,OAIK;AACP,SAAS,yBAAyB,iCAAiC;AACnE,SAAS,8BAA8B;AACvC,SAAS,2BAA2B;AACpC,SAAS,kBAAsC;AAC/C,SAAS,+BAAsD;AAC/D,SAAS,0BAA0B;AAGnC,SAAS,cAAc,kBAA4C;AAqK5D,MAAM,YAAY,CAAC,SACxB,cAAc,OAAO,EAAE,SAAS,YAAY,UAAU,KAAK,SAAS,IAAI,KAAK;AAE/E,MAAM,cAAc,CAAC,WAAmB,SAAS,OAC/C,gBAAgB,WAAW,SAAS,CAAC,GAAG,MAAM;AAQhD,MAAM,aAAa,CACjB,SAC+B;AAC/B,QAAM,EAAE,SAAS,WAAW,SAAS,IAAI;AACzC,QAAM,MAAM,CAAC,YACX,QAAQ,EAAE,SAAS,WAAW,QAAQ,SAAS,QAAQ,QAAQ,SAAS,OAAO,CAAC;AAClF,QAAM,SAAS,CAAC,YAA4E;AAG1F,QAAI,cAAc,SAAS,aAAa,QAAQ,SAAS,WAAW;AACpE,QAAI,UAAU;AACd,UAAM,SAAS,oBAAoB;AAAA,MACjC;AAAA,MACA,SAAS,SAAS,WAAW;AAAA,MAC7B,QAAQ;AAAA,MACR,GAAG,aAAa,EAAE,SAAS,UAAU,CAAC;AAAA,MACtC,WAAW,QAAQ,SAAS;AAAA,MAC5B,QAAQ,QAAQ;AAAA,MAChB,QAAQ,SAAS;AAAA,MACjB,aAAa,QAAQ;AAAA,MACrB,UAAU,OAAO,WAAW;AAC1B,cAAM,UAAU,MAAM,IAAI,EAAE,OAAO,CAAC;AACpC,eAAO,QAAQ,WAAW,OAAO,OAAO,EAAE,YAAY,QAAQ,SAAS,EAAE;AAAA,MAC3E;AAAA,MACA,OAAO,CAAC,UAAU;AAChB,YACE,CAAC,eACD,SAAS,aAAa,QACtB,iBAAiB,OAAO,SAAS,SAAS;AAE1C,wBAAc;AAChB,eAAO,eAAe,UAAU,KAAK,KAAK;AAAA,MAC5C;AAAA,IACF,CAAC;AACD,UAAM,WAAsD;AAAA,MAC1D,MAAM,YAAY;AAChB,mBAAS;AACP,gBAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,cAAI,KAAK,SAAS,QAAQ,QAAS,QAAO;AAC1C,cAAI,SAAS,aAAa,QAAQ,iBAAiB,KAAK,OAAO,SAAS,SAAS,GAAG;AAClF,sBAAU;AACV,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,QAAQ,MAAM,OAAO,SAAS,KAAK,QAAQ,QAAQ,EAAE,MAAM,MAAM,OAAO,OAAU,CAAC;AAAA,MACnF,CAAC,OAAO,aAAa,GAAG,MAAM;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,YAAsE;AAC1F,UAAM,OAAO,oBAAoB;AACjC,QAAI,OAAkC;AACtC,qBAAiB,SAAS,OAAO,OAAO,GAAG;AACzC,WAAK,IAAI,KAAK;AACd,aAAO;AAAA,IACT;AACA,UAAM,MAAM,QAAQ,OAAO,OAAO,UAAU,IAAI;AAChD,UAAM,UAAU,MAAM,IAAI,OAAO;AACjC,WAAO;AAAA,MACL,WAAW,SAAS;AAAA,MACpB,QAAQ,SAAS;AAAA,MACjB,YAAY,QAAQ,cAAc,KAAK,cAAc;AAAA,MACrD,MAAM,KAAK,KAAK;AAAA,MAChB,OAAO,QAAQ,SAAS,MAAM,OAAO,SAAS,WAAW;AAAA,IAC3D;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,OAAO,aAAa,MAAM,OAAO,OAAO,GAAG;AAAA,EACnD;AACF;AAEA,MAAM,UAAU,CAAC,SAMf,KAAK,QAAQ,KAAK,QAAQ;AAAA,EACxB,QAAQ,WAAW;AAAA,EACnB,MAAM,YAAY,KAAK,WAAW,UAAU,WAAW,KAAK,MAAM,CAAC,EAAE;AAAA,EACrE,UAAU;AAAA,EACV,QAAQ,KAAK;AACf,CAAC;AASH,MAAM,SAAS,CAAC,SACd,KAAK,QAAQ,KAAK,QAAQ;AAAA,EACxB,QAAQ,WAAW;AAAA,EACnB,MAAM,YAAY,KAAK,WAAW,SAAS;AAAA,EAC3C,OAAO,EAAE,SAAS,KAAK,SAAS,OAAO,KAAK,MAAM;AAAA,EAClD,UAAU;AAAA,EACV,QAAQ,KAAK;AACf,CAAC;AAEH,MAAM,gBAAgB,OAAO,UAMzB,MAAM,KAAK,QAAQ,KAAK,QAAQ;AAAA,EAC9B,QAAQ,WAAW;AAAA,EACnB,MAAM,YAAY,KAAK,WAAW,YAAY;AAAA,EAC9C,UAAU;AAAA,EACV,QAAQ,KAAK;AACf,CAAC,GACD;AAGJ,gBAAgB,qBAAqB,MAKE;AACrC,mBAAiB,WAAW,uBAAuB;AAAA,IACjD,MAAM,KAAK,QAAQ;AAAA,IACnB,MAAM,YAAY,KAAK,WAAW,gBAAgB;AAAA,IAClD,OAAO,EAAE,SAAS,KAAK,QAAQ;AAAA,IAC/B,QAAQ,YAAY,IAAI,CAAC,KAAK,QAAQ,KAAK,QAAQ,WAAW,CAAC;AAAA,EACjE,CAAC,GAAG;AACF,QAAI,QAAQ,UAAU,kBAAkB,SAAU;AAClD,QAAI;AACF,YAAM,QAAQ,oBAAoB,UAAU,KAAK,MAAM,QAAQ,IAAI,CAAC;AACpE,UAAI,MAAM,QAAS,OAAM,MAAM;AAAA,IACjC,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAGA,MAAM,sBAAsB,CAAQ,SAMA;AAClC,QAAM,QAAQ,oBAAoB,QAAQ,KAAK,SAAS;AACxD,MAAI,cAAmC;AACvC,MAAI,cAA0B,MAAM;AAAA,EAAC;AACrC,MAAI,cAA0B,MAAM;AAAA,EAAC;AACrC,QAAM,QAAQ,iBAAwB,MAAM;AAC1C,kBAAc;AACd,gBAAY;AACZ,gBAAY;AAAA,EACd,CAAC;AACD,QAAM,UAAU,CAAC,QAA2C;AAC1D,UAAM,QAAQ,yBAAyB,UAAU,GAAG;AACpD,QAAI,CAAC,MAAM,QAAS;AACpB,QAAI,MAAM,KAAK,SAAS,uBAAuB,SAAS,wBAAwB,MAAM,IAAI,GAAG;AAC3F,YAAM;AAAA,QACJ,0BAA0B;AAAA,UACxB,OAAO,MAAM,KAAK,SAAS;AAAA,UAC3B,MAAM,MAAM,KAAK,QAAQ;AAAA,UACzB,SAAS,MAAM,KAAK,WAAW;AAAA,QACjC,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,QAAI,MAAM,KAAK,SAAS,uBAAuB,MAAO;AACtD,UAAM,QAAQ,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,OAAO;AAC5D,QAAI,SAAS,KAAM,OAAM,KAAK,KAAK;AAAA,EACrC;AACA,gBAAc,YAAY,OAAO,KAAK,MAAM;AAC5C,gBAAc,YAAY,OAAO,KAAK,QAAQ,WAAW;AACzD,MAAI,CAAC,MAAM,OAAO,GAAG;AACnB,UAAM,OAAO,KAAK,QAAQ,SAAS,EAAE,UAAU,OAAO,OAAO;AAC7D,QAAI,MAAM,OAAO,EAAG,MAAK;AAAA,QACpB,eAAc;AAAA,EACrB;AACA,SAAO,MAAM;AACf;AAEA,MAAM,eAAe,CAAC,MAAc,YAAkD;AACpF,MAAI,SAAS,kBAAkB,WAAY,QAAO;AAClD,QAAM,UAAU,sBAAsB,UAAU,OAAO;AACvD,SAAO,QAAQ,UAAU,QAAQ,OAAO;AAC1C;AAEA,MAAM,iBAAiB,CACrB,MACA,YACwD;AACxD,MAAI,SAAS,oBAAoB,YAAa,QAAO,aAAa,MAAM,OAAO;AAC/E,QAAM,OAAO,uBAAuB,UAAU,OAAO;AACrD,SAAO,KAAK,UAAU,KAAK,OAAO;AACpC;AAGA,MAAM,eAAe,CAAC,UAA8D;AAAA,EAClF,QAAQ,CAAC,SACP,OAAO,EAAE,SAAS,KAAK,SAAS,WAAW,KAAK,WAAW,GAAG,KAAK,CAAC;AAAA,EACtE,WAAW,CAAC,WAAyB,cAAc,EAAE,GAAG,MAAM,OAAO,CAAC;AAAA,EACtE,YAAY,CAAC,WACX,qBAAqB,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC;AAC/C;AAEO,MAAM,sBAAsB,CACjC,SACA,cACuB;AACvB,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,OAAO,OAAO,SAIC;AACnB,UAAM,KAAK,QAAQ;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,WAAW,KAAK,MAAM;AAAA,MACxC,MAAM,KAAK;AAAA,MACX,UAAU;AAAA,MACV,QAAQ,KAAK;AAAA,MACb,SAAS,EAAE,UAAU;AAAA,IACvB,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM,OAAO,YAAY;AACvB,YAAM,UAAU,MAAM,KAAK,QAAQ;AAAA,QACjC,QAAQ,WAAW;AAAA,QACnB,MAAM,YAAY,WAAW,OAAO;AAAA,QACpC,MAAM;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO;AAAA,YACL,gBAAgB,SAAS,kBAAkB,QAAQ,OAAO;AAAA,YAC1D,OAAO,SAAS;AAAA,UAClB;AAAA,QACF;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,QACjB,SAAS,EAAE,UAAU;AAAA,MACvB,CAAC;AACD,aAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,QAAQ,oBAAoB,SAAS,QAAQ,QAAQ,EAAE;AAAA,QACvD,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,YAAY,CAAC,cAAc,YACzB,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,WAAW,gBAAgB,WAAW,YAAY,CAAC,EAAE;AAAA,MACvE,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,KAAK,CAAC,YACJ,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,SAAS;AAAA,MAC3B,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,UAAU,CAAC,YACT,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,WAAW,WAAW;AAAA,MACxC,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,cAAc,OAAO,aAEjB,MAAM,KAAK,QAAQ;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,WAAW,eAAe;AAAA,MAC5C,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC,GACD;AAAA,IACJ,SAAS,OAAO,aAEZ,MAAM,KAAK,QAAQ;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,WAAW,WAAW;AAAA,MACxC,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC,GACD;AAAA,IACJ,MAAM,OAAO,SAAS,YAAY;AAChC,YAAM,WAAW,MAAM,KAAK,QAAQ;AAAA,QAClC,QAAQ,WAAW;AAAA,QACnB,MAAM,YAAY,WAAW,SAAS;AAAA,QACtC,MAAM;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO;AAAA,YACL;AAAA,YACA,YAAY,SAAS;AAAA,YACrB,gBAAgB,SAAS,kBAAkB,QAAQ,OAAO;AAAA,YAC1D,MAAM,SAAS;AAAA,YACf,qBAAqB,SAAS,uBAAuB,QAAQ,IAAI;AAAA,UACnE;AAAA,QACF;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,QACjB,SAAS,EAAE,UAAU;AAAA,MACvB,CAAC;AACD,aAAO,WAAW,EAAE,SAAS,WAAW,SAAS,CAAC;AAAA,IACpD;AAAA,IACA,SAAS,CAAC,SAAS,YACjB,KAAK;AAAA,MACH,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ,QAAQ;AAAA,QACR,OAAO;AAAA,UACL;AAAA,UACA,gBAAgB,SAAS,kBAAkB,QAAQ,OAAO;AAAA,UAC1D,MAAM,SAAS;AAAA,QACjB;AAAA,MACF;AAAA,MACA,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,QAAQ,CAAC,YACP,oBAAoB;AAAA,MAClB;AAAA,MACA,SAAS,SAAS,WAAW;AAAA,MAC7B,QAAQ,SAAS,UAAU;AAAA,MAC3B,GAAG,aAAa,EAAE,SAAS,UAAU,CAAC;AAAA,MACtC,WAAW,QAAQ,SAAS;AAAA,MAC5B,QAAQ,QAAQ;AAAA,MAChB,QAAQ,SAAS;AAAA,MACjB,aAAa,QAAQ;AAAA,IACvB,CAAC;AAAA,IACH,YAAY,CAAC,YACX,wBAAwB,EAAE,SAAS,WAAW,QAAQ,SAAS,OAAO,CAAC;AAAA,IACzE,UAAU,CAAC,YACT,oBAAoB,EAAE,SAAS,WAAW,QAAQ,SAAS,QAAQ,OAAO,aAAa,CAAC;AAAA,IAC1F,YAAY,CAAC,YACX,oBAAoB,EAAE,SAAS,WAAW,QAAQ,SAAS,QAAQ,OAAO,eAAe,CAAC;AAAA,IAC5F,UAAU,CAAC,YACT,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,WAAW,YAAY;AAAA,MACzC,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,QAAQ,CAAC,YAAY,OAAO,EAAE,SAAS,WAAW,GAAG,QAAQ,CAAC;AAAA,IAC9D,WAAW,CAAC,YAAY,cAAc,EAAE,SAAS,WAAW,QAAQ,SAAS,OAAO,CAAC;AAAA,IACrF,MAAM,CAAC,QAAQ,YAAY,QAAQ,EAAE,SAAS,WAAW,QAAQ,QAAQ,SAAS,OAAO,CAAC;AAAA,IAC1F,UAAU,OAAO,QAAQ,YAAY;AACnC,YAAM,UAAU,MAAM,QAAQ,EAAE,SAAS,WAAW,QAAQ,QAAQ,SAAS,OAAO,CAAC;AACrF,aAAO,WAAW;AAAA,QAChB;AAAA,QACA;AAAA,QACA,UAAU;AAAA,UACR,QAAQ,QAAQ;AAAA,UAChB,WAAW,QAAQ;AAAA,UACnB,SAAS,QAAQ;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,SAAS,CAAC,MAAM,YACd,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,WAAW,UAAU;AAAA,MACvC,MAAM;AAAA,QACJ,QAAQ;AAAA,QACR,OAAO,EAAE,YAAY,KAAK,YAAY,SAAS,UAAU,IAAI,EAAE;AAAA,MACjE;AAAA,MACA,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,MACjB,SAAS,EAAE,WAAW,YAAY,KAAK,WAAW;AAAA,IACpD,CAAC;AAAA,IACH,QAAQ,CAAC,YACP,KAAK;AAAA,MACH,QAAQ;AAAA,MACR,MAAM,EAAE,QAAQ,qBAAqB,OAAO,EAAE,QAAQ,SAAS,OAAO,EAAE;AAAA,MACxE,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,iBAAiB,CAAC,MAAM,YACtB,KAAK;AAAA,MACH,QAAQ;AAAA,MACR,MAAM,EAAE,QAAQ,8BAA8B,OAAO,KAAK;AAAA,MAC1D,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,OAAO,CAAC,YAAY,KAAK,EAAE,QAAQ,UAAU,QAAQ,SAAS,OAAO,CAAC;AAAA,IACtE,MAAM,OAAO,aAET,MAAM,KAAK,QAAQ;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,WAAW,OAAO;AAAA,MACpC,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC,GACD;AAAA,EACN;AACF;AAEO,MAAM,oBAAoB,CAAC,aAAmD;AAAA,EACnF,MAAM,CAAC,WAAW,YAAY,oBAAoB,SAAS,SAAS,EAAE,KAAK,OAAO;AAAA,EAClF,KAAK,CAAC,WAAW,YAAY,oBAAoB,SAAS,SAAS,EAAE,IAAI,OAAO;AAAA,EAChF,QAAQ,CAAC,cAAc,oBAAoB,SAAS,SAAS;AAC/D;AAUO,MAAM,2BAA2B,CAAC,SAIV;AAC7B,QAAM,EAAE,QAAQ,IAAI;AACpB,SAAO;AAAA,IACL,GAAG,kBAAkB,OAAO;AAAA,IAC5B,QAAQ,OAAO,WAAW;AACxB,YAAM,UAAU,MAAM,WAAW,KAAK,OAAO;AAAA,QAC3C,WAAW,KAAK;AAAA,QAChB,OAAO,OAAO;AAAA,QACd,SAAS,OAAO;AAAA,QAChB,OAAO,EAAE,MAAM,mBAAmB,SAAS,IAAI,OAAO,GAAG;AAAA,QACzD,QAAQ,OAAO;AAAA,MACjB,CAAC;AACD,UAAI;AACF,cAAM,UAAU,MAAM,QAAQ,KAAK,QAAQ;AAAA,UACzC,QAAQ,WAAW;AAAA,UACnB,MAAM;AAAA,UACN,MAAM;AAAA,YACJ,QAAQ;AAAA,YACR,OAAO;AAAA,cACL,IAAI,QAAQ,WAAW,OAAO;AAAA,cAC9B,WAAW,KAAK;AAAA,cAChB,OAAO,QAAQ;AAAA,cACf,SAAS,QAAQ;AAAA,cACjB,OAAO,OAAO;AAAA,cACd,SAAS,OAAO;AAAA,cAChB,YAAY,OAAO;AAAA,cACnB,gBACE,OAAO,mBAAmB,OAAO,WAAW,OAAO,SAAY,QAAQ,OAAO;AAAA,cAChF,OAAO,OAAO;AAAA,cACd,MAAM,OAAO;AAAA,cACb,qBACE,OAAO,WAAW,OAAO,SAAa,OAAO,uBAAuB,QAAQ,IAAI;AAAA,YACpF;AAAA,UACF;AAAA,UACA,UAAU;AAAA,UACV,QAAQ,OAAO;AAAA,QACjB,CAAC;AACD,cAAM,WAAW,QAAQ,WAAW,OAAO;AAC3C,YAAI,YAAY,QAAQ,QAAQ,QAAQ,OAAO,UAAU;AAKvD,kBAAQ,QAAQ;AAChB,cAAI,QAAQ,QAAQ;AAClB,kBAAM,aAAa,KAAK,OAAO;AAAA,cAC7B,WAAW,KAAK;AAAA,cAChB,OAAO,OAAO;AAAA,cACd,OAAO,EAAE,MAAM,mBAAmB,SAAS,IAAI,QAAQ,QAAQ,GAAG;AAAA,cAClE,QAAQ,OAAO;AAAA,YACjB,CAAC;AAAA,QACL,MAAO,SAAQ,YAAY;AAC3B,cAAM,SAAS,oBAAoB,SAAS,QAAQ,QAAQ,EAAE;AAC9D,eAAO;AAAA,UACL,SAAS,QAAQ;AAAA,UACjB;AAAA,UACA,UACE,QAAQ,QAAQ,OACZ,OACA,WAAW,EAAE,SAAS,WAAW,QAAQ,QAAQ,IAAI,UAAU,QAAQ,KAAK,CAAC;AAAA,QACrF;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,QAAQ;AAChB,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/modules/cli/cli.mjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { parseArgs } from "node:util";
|
|
2
2
|
import { documentOf } from "@finalai/agent-definition";
|
|
3
3
|
import * as z from "zod";
|
|
4
|
-
import {
|
|
4
|
+
import { DEFAULT_AGENTS_HOST } from "../agent-client/client.mjs";
|
|
5
|
+
import { createClient } from "../agent-client/node.mjs";
|
|
5
6
|
import { DefinitionKind, loadDefinitionModule } from "./agent-module.mjs";
|
|
6
7
|
import { runConformance } from "./conformance.mjs";
|
|
7
8
|
import { errorLines } from "./output.mjs";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/cli.ts"],
|
|
4
|
-
"sourcesContent": ["import { parseArgs } from 'node:util';\nimport { documentOf, type AgentIface } from '@finalai/agent-definition';\nimport type { AgentDocumentIface } from '@finalai/agent-provider/document';\nimport * as z from 'zod';\nimport {
|
|
5
|
-
"mappings": "AAAA,SAAS,iBAAiB;AAC1B,SAAS,kBAAmC;AAE5C,YAAY,OAAO;AACnB,SAAS,
|
|
4
|
+
"sourcesContent": ["import { parseArgs } from 'node:util';\nimport { documentOf, type AgentIface } from '@finalai/agent-definition';\nimport type { AgentDocumentIface } from '@finalai/agent-provider/document';\nimport * as z from 'zod';\nimport { DEFAULT_AGENTS_HOST, type AgentClientIface } from \"../agent-client/client.mjs\";\nimport { createClient } from \"../agent-client/node.mjs\";\nimport type { FetchIface } from \"../agent-client/http.mjs\";\nimport { DefinitionKind, loadDefinitionModule, type ImportModule } from \"./agent-module.mjs\";\nimport { runConformance } from \"./conformance.mjs\";\nimport { errorLines, type OutputIface } from \"./output.mjs\";\n\n// `final-agents`: `print` writes the document of an agent, a harness or an\n// ACP adapter, `publish` gives it a name in a project, `conformance` checks a\n// harness implementation. Nothing is built or deployed: each is data.\n\nconst USAGE = [\n 'usage: final-agents <command> [options]',\n '',\n 'commands:',\n ' print <module> write the document of the agent, harness or ACP adapter',\n ' the module exports, as JSON',\n ' publish <module> --name <name> store it and point <name> at it in a project',\n ' conformance <module> run the harness conformance kit against a harness the module exports',\n '',\n 'options:',\n ' --export <name> the export to use (print and publish: an agent, a harness or an ACP adapter,',\n ' found by itself when omitted;',\n ' conformance: a HarnessIface or { harness, dial }, default \"default\")',\n ' --name <name> publish: the name to point at it',\n ' --project <id> publish: the project (overrides FINAL_PROJECT_ID)',\n ' --host <url> agents API (overrides FINAL_API_HOST; default ' +\n DEFAULT_AGENTS_HOST +\n ')',\n ' --profile <name> conformance: final (default), final-required (ACP adapters) or plain-acp-v2',\n ' --timeout <ms> conformance: per-case timeout',\n ' --json conformance: print the report as JSON',\n '',\n 'publish authenticates with FINAL_API_KEY. print calls nothing.',\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 FINAL_PROJECT_ID: z.string().min(1).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, module loading and document making.\n fetch?: FetchIface;\n importModule?: ImportModule;\n documentOf?: (agent: AgentIface) => AgentDocumentIface;\n // Ends long-running commands; main.ts aborts it on SIGINT and SIGTERM.\n signal?: AbortSignal;\n}\n\nconst optionsConfig = {\n export: { type: 'string' },\n name: { type: 'string' },\n project: { type: 'string' },\n host: { 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, moduleArg, ...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 if (command !== 'print' && command !== 'publish' && command !== 'conformance') {\n output.stderr(`error: unknown command ${command}`);\n output.stderr(USAGE);\n return 2;\n }\n if (moduleArg == null) {\n output.stderr(`error: ${command} needs <module>`);\n return 2;\n }\n\n if (command === 'conformance') {\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: moduleArg,\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\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 loaded = await loadDefinitionModule({\n module: moduleArg,\n exportName: values.export ?? null,\n cwd: deps.cwd,\n importModule: deps.importModule,\n documentOf: deps.documentOf ?? documentOf,\n });\n if (!loaded.ok) {\n output.stderr(`error: ${loaded.message}`);\n return 1;\n }\n\n if (command === 'print') {\n output.stdout(JSON.stringify(loaded.document, null, 2));\n return 0;\n }\n\n if (values.name == null) {\n output.stderr('error: publish needs --name <name>');\n return 2;\n }\n const projectId = values.project ?? env.data.FINAL_PROJECT_ID;\n if (projectId == null) {\n output.stderr('error: publish needs --project <id> or FINAL_PROJECT_ID');\n return 2;\n }\n const apiKey = env.data.FINAL_API_KEY;\n if (apiKey == null) {\n output.stderr('error: set FINAL_API_KEY to a Final API key');\n return 2;\n }\n const agentDocument = loaded.kind === DefinitionKind.Agent ? loaded.document : null;\n const client: AgentClientIface = createClient({\n host: values.host ?? env.data.FINAL_API_HOST ?? DEFAULT_AGENTS_HOST,\n auth: { apiKey },\n fetch: deps.fetch,\n localCompute: false,\n // The document is already made; publishing sends exactly it.\n agentCodec: {\n documentOf: () => {\n if (agentDocument == null) throw new Error('Only an agent has an agent document');\n return agentDocument;\n },\n inProcessCodeOf: () => ({ tools: {}, hooks: {}, approvals: {} }),\n },\n });\n try {\n const project = client.project({ id: projectId });\n const name = values.name;\n const signal = deps.signal;\n const published =\n loaded.kind === DefinitionKind.Agent\n ? await project.agents.publish({ agent: loaded.agent, name, signal })\n : loaded.kind === DefinitionKind.Harness\n ? await project.harnesses.publish({ harness: loaded.document, name, signal })\n : await project.acpAdapters.publish({ adapter: loaded.document, name, signal });\n output.stdout(`published ${published.name}: ${published.hash}`);\n if ('id' in published && published.id != null) output.stdout(`id: ${published.id}`);\n return 0;\n } catch (cause) {\n for (const line of errorLines(cause)) output.stderr(line);\n return 1;\n } finally {\n client.close();\n }\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.15.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Agent authoring, client APIs, and CLI.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -28,7 +28,8 @@
|
|
|
28
28
|
},
|
|
29
29
|
"./client": {
|
|
30
30
|
"types": "./dist/modules/agent-client/index.d.mts",
|
|
31
|
-
"
|
|
31
|
+
"react-native": "./dist/modules/agent-client/portable.mjs",
|
|
32
|
+
"browser": "./dist/modules/agent-client/portable.mjs",
|
|
32
33
|
"default": "./dist/modules/agent-client/index.mjs"
|
|
33
34
|
},
|
|
34
35
|
"./client/acp": {
|
|
@@ -114,10 +115,10 @@
|
|
|
114
115
|
},
|
|
115
116
|
"dependencies": {
|
|
116
117
|
"@agentclientprotocol/sdk": "1.8.0",
|
|
117
|
-
"@finalai/agent-definition": "0.
|
|
118
|
-
"@finalai/agent-protocol": "0.
|
|
119
|
-
"@finalai/agent-provider": "0.
|
|
120
|
-
"@finalai/final-agent-provider": "0.
|
|
118
|
+
"@finalai/agent-definition": "0.12.0",
|
|
119
|
+
"@finalai/agent-protocol": "0.12.0",
|
|
120
|
+
"@finalai/agent-provider": "0.13.0",
|
|
121
|
+
"@finalai/final-agent-provider": "0.14.0",
|
|
121
122
|
"@finalai/websockets": "0.1.8",
|
|
122
123
|
"ws": "^8.21.3",
|
|
123
124
|
"zod": "4.6.6"
|