@finalai/agents 0.2.2 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -78,9 +78,8 @@ const createClient = (options) => {
78
78
  realtimeUserId,
79
79
  realtimeCollectionTopic: async (collection) => {
80
80
  const owner = await realtimeOwnerSession();
81
- if (owner.apiKeyPrincipalId != null)
82
- return collection === ClientCollection.Pending ? agentRealtimeTopics.apiKeyPending(owner.apiKeyPrincipalId) : agentRealtimeTopics.apiKeyConversations(owner.apiKeyPrincipalId);
83
- if (owner.userId == null) throw new Error("Realtime session has no collection owner");
81
+ if (owner.userId == null)
82
+ throw new Error("Collection streams belong to users; API-key owners use session streams");
84
83
  return collection === ClientCollection.Pending ? agentRealtimeTopics.userPending(owner.userId) : agentRealtimeTopics.userConversations(owner.userId);
85
84
  },
86
85
  storageFetch: options.storageFetch ?? ((input, init) => globalThis.fetch(input, init)),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/agent-client/client.ts"],
4
- "sourcesContent": ["import {\n agentInfoSchema,\n agentListSchema,\n agentRealtimeTopics,\n healthResponseSchema,\n pendingRequestListSchema,\n personListSchema,\n realtimeSessionResponseSchema,\n type AgentInfoIface,\n type AgentListIface,\n type HealthResponseIface,\n type PendingRequestIface,\n type PendingRequestListIface,\n type PersonIface,\n type PersonListIface,\n type RealtimeSessionResponseIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport { createAcpApi, type AcpApiIface } from \"./acp.mjs\";\nimport {\n createComputerSetupGuidesApi,\n createDefinitionsApi,\n createProvidersApi,\n createSchedulesApi,\n type ComputerSetupGuidesApiIface,\n type DefinitionsApiIface,\n type ProvidersApiIface,\n type SchedulesApiIface,\n} from \"./build.mjs\";\nimport {\n streamCollectionEvents,\n type CollectionEvent,\n type CollectionEventsOptionsIface,\n} from \"./collection-events.mjs\";\nimport {\n ClientCollection,\n encodePath,\n type ClientContextIface,\n type SignalOptionsIface,\n} from \"./context.mjs\";\nimport { createConversationsApi, type ConversationsApiIface } from \"./conversations.mjs\";\nimport { clientError, ClientErrorCode } from \"./errors.mjs\";\nimport { defaultStreamTiming, type StreamTimingIface } from \"./frame-stream.mjs\";\nimport {\n createHttp,\n HttpMethod,\n type AgentClientAuth,\n type FetchIface,\n type HeadersOption,\n} from \"./http.mjs\";\nimport {\n createGatewayRealtimeTransport,\n type GatewayConnect,\n type GatewayRealtimeTransportIface,\n type RealtimeTransportIface,\n} from \"./realtime.mjs\";\nimport { createSessionsApi, type SessionsApiIface } from \"./sessions.mjs\";\n\nexport interface CreateClientOptionsIface {\n /**\n * The session service's origin (`https://agent-session.final.ai`; its API is\n * under `/api` and ACP at `/acp/ws`), or a base URL the API routes are mounted\n * under (console-server's `https://<console>/api/agent-platform` proxy).\n */\n host: string;\n auth: AgentClientAuth;\n /** Extra headers per request; console clients send their client identity header here. */\n headers?: HeadersOption;\n /** API requests (the host's routes); carries auth and caller headers. */\n fetch?: FetchIface;\n /**\n * Presigned storage requests (attachment uploads). Gets only the headers the\n * presign requires, never auth, client identity or cookies, so a storage\n * bucket's CORS and third-party hosts see nothing of the caller. Defaults to\n * `globalThis.fetch`; keep it free of header-injecting wrappers.\n */\n storageFetch?: FetchIface;\n /** console-web and console-mobile pass their realtime clients; defaults to a gateway connection. */\n realtime?: RealtimeTransportIface;\n /** Seam for the default transport's gateway connection. */\n gatewayConnect?: GatewayConnect;\n /** Seam for stream retry timing (tests). */\n timing?: Partial<StreamTimingIface>;\n /** Seam for idempotency keys and client message ids; defaults to `crypto.randomUUID`. */\n newKey?: () => string;\n /** Seam for the client clock (conversation recovery windows). */\n now?: () => number;\n}\n\nexport interface AgentHandleIface {\n slug: string;\n info: (options?: SignalOptionsIface) => Promise<AgentInfoIface>;\n}\n\nexport interface AgentsApiIface {\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<AgentListIface>;\n /** I/O-free handle by slug or id. */\n get: (slugOrId: string) => AgentHandleIface;\n}\n\nexport interface PendingApiIface {\n /**\n * The caller's pending topic (`user.collection:<userId>:pending`): `acp.pending`\n * events for requests addressed to them, and a `collection.resync` whenever\n * `mine()` must be re-read (on every subscription, resync and while realtime is down).\n */\n events: (options?: CollectionEventsOptionsIface) => AsyncIterableIterator<CollectionEvent>;\n /** Every open permission and elicitation request whose audience includes the caller, newest first (all pages). */\n mine: (options?: SignalOptionsIface) => Promise<PendingRequestIface[]>;\n /** One page, newest first; pass `nextCursor` as `cursor` for the next. */\n page: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<PendingRequestListIface>;\n}\n\nexport interface PeopleApiIface {\n /** One page of the caller's organization members, by name; pass `nextCursor` as `cursor` for the next. */\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<PersonListIface>;\n /** Every member of the caller's organization (all pages). */\n all: (options?: SignalOptionsIface) => Promise<PersonIface[]>;\n}\n\nexport interface RealtimeApiIface {\n /**\n * Mints a gateway session (`POST /v1/realtime/session`) for the signed-in user:\n * the gateway URL, a short-lived token, and the user id realtime topics are keyed by.\n * Pass it as `createSession` to `createGatewayRealtimeTransport` when supplying a transport.\n */\n createSession: (options?: SignalOptionsIface) => Promise<RealtimeSessionResponseIface>;\n}\n\nexport interface AgentClientIface {\n health: (options?: SignalOptionsIface) => Promise<HealthResponseIface>;\n agents: AgentsApiIface;\n people: PeopleApiIface;\n realtime: RealtimeApiIface;\n sessions: SessionsApiIface;\n conversations: ConversationsApiIface;\n definitions: DefinitionsApiIface;\n providers: ProvidersApiIface;\n computerSetupGuides: ComputerSetupGuidesApiIface;\n schedules: SchedulesApiIface;\n pending: PendingApiIface;\n /**\n * ACP-native access (`/acp/ws`): an ACP v2 ClientApp connection on which the\n * session service is the agent. The ACP SDK loads on the first `connect`.\n */\n acp: AcpApiIface;\n /**\n * Ends every stream (they reject with a `client_closed` ClientError) and, when\n * the client created its own realtime transport, closes the gateway connection\n * and cancels its retries. A transport passed in `realtime` belongs to the\n * caller and is left open. Idempotent.\n */\n close: () => void;\n [Symbol.asyncDispose]: () => Promise<void>;\n}\n\nexport const createClient = (options: CreateClientOptionsIface): AgentClientIface => {\n const http = createHttp({\n host: options.host,\n auth: options.auth,\n headers: options.headers,\n fetch: options.fetch,\n });\n let realtime = options.realtime ?? null;\n let ownTransport: GatewayRealtimeTransportIface | null = null;\n const closing = new AbortController();\n const createRealtimeSession: RealtimeApiIface['createSession'] = (sessionOptions) =>\n http.request({\n method: HttpMethod.Post,\n path: '/v1/realtime/session',\n response: realtimeSessionResponseSchema,\n signal: sessionOptions?.signal,\n });\n let realtimeOwner: Promise<RealtimeSessionResponseIface> | null = null;\n const realtimeOwnerSession = () => {\n if (realtimeOwner != null) return realtimeOwner;\n const pending = createRealtimeSession({ signal: closing.signal });\n realtimeOwner = pending;\n void pending.catch(() => {\n if (realtimeOwner === pending) realtimeOwner = null;\n });\n return pending;\n };\n let realtimeUser: Promise<string> | null = null;\n // Shared by every stream, so it is cancelled only with the client, never by one caller.\n const realtimeUserId: ClientContextIface['realtimeUserId'] = () => {\n if (realtimeUser != null) return realtimeUser;\n const pending = realtimeOwnerSession().then((session) => {\n if (session.userId == null)\n throw new Error('This client authenticates as an API-key owner, not a user');\n return session.userId;\n });\n realtimeUser = pending;\n // A failed (or aborted) read is not cached.\n pending.catch(() => {\n if (realtimeUser === pending) realtimeUser = null;\n });\n return pending;\n };\n const context: ClientContextIface = {\n http,\n closeSignal: closing.signal,\n realtimeUserId,\n realtimeCollectionTopic: async (collection) => {\n const owner = await realtimeOwnerSession();\n if (owner.apiKeyPrincipalId != null)\n return collection === ClientCollection.Pending\n ? agentRealtimeTopics.apiKeyPending(owner.apiKeyPrincipalId)\n : agentRealtimeTopics.apiKeyConversations(owner.apiKeyPrincipalId);\n if (owner.userId == null) throw new Error('Realtime session has no collection owner');\n return collection === ClientCollection.Pending\n ? agentRealtimeTopics.userPending(owner.userId)\n : agentRealtimeTopics.userConversations(owner.userId);\n },\n storageFetch: options.storageFetch ?? ((input, init) => globalThis.fetch(input, init)),\n realtime: () => {\n if (realtime != null) return realtime;\n ownTransport = createGatewayRealtimeTransport({\n createSession: () => createRealtimeSession(),\n connect: options.gatewayConnect,\n });\n if (closing.signal.aborted) ownTransport.close();\n realtime = ownTransport;\n return realtime;\n },\n timing: { ...defaultStreamTiming, ...options.timing },\n newKey: options.newKey ?? (() => globalThis.crypto.randomUUID()),\n now: options.now ?? Date.now,\n };\n\n const close = (): void => {\n if (closing.signal.aborted) return;\n closing.abort(\n clientError({ message: 'Agent client closed', status: 0, code: ClientErrorCode.Closed }),\n );\n ownTransport?.close();\n };\n\n return {\n close,\n [Symbol.asyncDispose]: async () => close(),\n health: (healthOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/health',\n response: healthResponseSchema,\n signal: healthOptions?.signal,\n }),\n agents: {\n list: (listOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/agents',\n query: { cursor: listOptions?.cursor, limit: listOptions?.limit },\n response: agentListSchema,\n signal: listOptions?.signal,\n }),\n get: (slugOrId) => ({\n slug: slugOrId,\n info: (infoOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: `/v1/agents/${encodePath(slugOrId)}`,\n response: agentInfoSchema,\n signal: infoOptions?.signal,\n }),\n }),\n },\n people: (() => {\n const list: PeopleApiIface['list'] = (listOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/people',\n query: { cursor: listOptions?.cursor, limit: listOptions?.limit },\n response: personListSchema,\n signal: listOptions?.signal,\n });\n return {\n list,\n all: async (allOptions) => {\n const all: PersonIface[] = [];\n let cursor: string | undefined;\n for (;;) {\n const next = await list({ cursor, signal: allOptions?.signal });\n all.push(...next.people);\n if (next.nextCursor == null) return all;\n cursor = next.nextCursor;\n }\n },\n };\n })(),\n realtime: { createSession: createRealtimeSession },\n sessions: createSessionsApi(context),\n conversations: createConversationsApi(context),\n definitions: createDefinitionsApi(context),\n providers: createProvidersApi(context),\n computerSetupGuides: createComputerSetupGuidesApi(context),\n schedules: createSchedulesApi(context),\n acp: createAcpApi({ http }),\n pending: (() => {\n const page: PendingApiIface['page'] = (pageOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/pending',\n query: { cursor: pageOptions?.cursor, limit: pageOptions?.limit },\n response: pendingRequestListSchema,\n signal: pageOptions?.signal,\n });\n return {\n page,\n events: (eventsOptions) =>\n streamCollectionEvents({\n context,\n topicFor: agentRealtimeTopics.userPending,\n collection: ClientCollection.Pending,\n options: eventsOptions,\n }),\n mine: async (mineOptions) => {\n const all: PendingRequestIface[] = [];\n let cursor: string | undefined;\n for (;;) {\n const next = await page({ cursor, signal: mineOptions?.signal });\n all.push(...next.pending);\n if (next.nextCursor == null) return all;\n cursor = next.nextCursor;\n }\n },\n };\n })(),\n };\n};\n"],
5
- "mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OASK;AACP,SAAS,oBAAsC;AAC/C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;AACP;AAAA,EACE;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AACP,SAAS,8BAA0D;AACnE,SAAS,aAAa,uBAAuB;AAC7C,SAAS,2BAAmD;AAC5D;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AACP;AAAA,EACE;AAAA,OAIK;AACP,SAAS,yBAAgD;AA0GlD,MAAM,eAAe,CAAC,YAAwD;AACnF,QAAM,OAAO,WAAW;AAAA,IACtB,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,EACjB,CAAC;AACD,MAAI,WAAW,QAAQ,YAAY;AACnC,MAAI,eAAqD;AACzD,QAAM,UAAU,IAAI,gBAAgB;AACpC,QAAM,wBAA2D,CAAC,mBAChE,KAAK,QAAQ;AAAA,IACX,QAAQ,WAAW;AAAA,IACnB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ,gBAAgB;AAAA,EAC1B,CAAC;AACH,MAAI,gBAA8D;AAClE,QAAM,uBAAuB,MAAM;AACjC,QAAI,iBAAiB,KAAM,QAAO;AAClC,UAAM,UAAU,sBAAsB,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAChE,oBAAgB;AAChB,SAAK,QAAQ,MAAM,MAAM;AACvB,UAAI,kBAAkB,QAAS,iBAAgB;AAAA,IACjD,CAAC;AACD,WAAO;AAAA,EACT;AACA,MAAI,eAAuC;AAE3C,QAAM,iBAAuD,MAAM;AACjE,QAAI,gBAAgB,KAAM,QAAO;AACjC,UAAM,UAAU,qBAAqB,EAAE,KAAK,CAAC,YAAY;AACvD,UAAI,QAAQ,UAAU;AACpB,cAAM,IAAI,MAAM,2DAA2D;AAC7E,aAAO,QAAQ;AAAA,IACjB,CAAC;AACD,mBAAe;AAEf,YAAQ,MAAM,MAAM;AAClB,UAAI,iBAAiB,QAAS,gBAAe;AAAA,IAC/C,CAAC;AACD,WAAO;AAAA,EACT;AACA,QAAM,UAA8B;AAAA,IAClC;AAAA,IACA,aAAa,QAAQ;AAAA,IACrB;AAAA,IACA,yBAAyB,OAAO,eAAe;AAC7C,YAAM,QAAQ,MAAM,qBAAqB;AACzC,UAAI,MAAM,qBAAqB;AAC7B,eAAO,eAAe,iBAAiB,UACnC,oBAAoB,cAAc,MAAM,iBAAiB,IACzD,oBAAoB,oBAAoB,MAAM,iBAAiB;AACrE,UAAI,MAAM,UAAU,KAAM,OAAM,IAAI,MAAM,0CAA0C;AACpF,aAAO,eAAe,iBAAiB,UACnC,oBAAoB,YAAY,MAAM,MAAM,IAC5C,oBAAoB,kBAAkB,MAAM,MAAM;AAAA,IACxD;AAAA,IACA,cAAc,QAAQ,iBAAiB,CAAC,OAAO,SAAS,WAAW,MAAM,OAAO,IAAI;AAAA,IACpF,UAAU,MAAM;AACd,UAAI,YAAY,KAAM,QAAO;AAC7B,qBAAe,+BAA+B;AAAA,QAC5C,eAAe,MAAM,sBAAsB;AAAA,QAC3C,SAAS,QAAQ;AAAA,MACnB,CAAC;AACD,UAAI,QAAQ,OAAO,QAAS,cAAa,MAAM;AAC/C,iBAAW;AACX,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,EAAE,GAAG,qBAAqB,GAAG,QAAQ,OAAO;AAAA,IACpD,QAAQ,QAAQ,WAAW,MAAM,WAAW,OAAO,WAAW;AAAA,IAC9D,KAAK,QAAQ,OAAO,KAAK;AAAA,EAC3B;AAEA,QAAM,QAAQ,MAAY;AACxB,QAAI,QAAQ,OAAO,QAAS;AAC5B,YAAQ;AAAA,MACN,YAAY,EAAE,SAAS,uBAAuB,QAAQ,GAAG,MAAM,gBAAgB,OAAO,CAAC;AAAA,IACzF;AACA,kBAAc,MAAM;AAAA,EACtB;AAEA,SAAO;AAAA,IACL;AAAA,IACA,CAAC,OAAO,YAAY,GAAG,YAAY,MAAM;AAAA,IACzC,QAAQ,CAAC,kBACP,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ,eAAe;AAAA,IACzB,CAAC;AAAA,IACH,QAAQ;AAAA,MACN,MAAM,CAAC,gBACL,KAAK,QAAQ;AAAA,QACX,QAAQ,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,OAAO,EAAE,QAAQ,aAAa,QAAQ,OAAO,aAAa,MAAM;AAAA,QAChE,UAAU;AAAA,QACV,QAAQ,aAAa;AAAA,MACvB,CAAC;AAAA,MACH,KAAK,CAAC,cAAc;AAAA,QAClB,MAAM;AAAA,QACN,MAAM,CAAC,gBACL,KAAK,QAAQ;AAAA,UACX,QAAQ,WAAW;AAAA,UACnB,MAAM,cAAc,WAAW,QAAQ,CAAC;AAAA,UACxC,UAAU;AAAA,UACV,QAAQ,aAAa;AAAA,QACvB,CAAC;AAAA,MACL;AAAA,IACF;AAAA,IACA,QAAS,uBAAM;AACb,YAAM,OAA+B,CAAC,gBACpC,KAAK,QAAQ;AAAA,QACX,QAAQ,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,OAAO,EAAE,QAAQ,aAAa,QAAQ,OAAO,aAAa,MAAM;AAAA,QAChE,UAAU;AAAA,QACV,QAAQ,aAAa;AAAA,MACvB,CAAC;AACH,aAAO;AAAA,QACL;AAAA,QACA,KAAK,OAAO,eAAe;AACzB,gBAAM,MAAqB,CAAC;AAC5B,cAAI;AACJ,qBAAS;AACP,kBAAM,OAAO,MAAM,KAAK,EAAE,QAAQ,QAAQ,YAAY,OAAO,CAAC;AAC9D,gBAAI,KAAK,GAAG,KAAK,MAAM;AACvB,gBAAI,KAAK,cAAc,KAAM,QAAO;AACpC,qBAAS,KAAK;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG;AAAA,IACH,UAAU,EAAE,eAAe,sBAAsB;AAAA,IACjD,UAAU,kBAAkB,OAAO;AAAA,IACnC,eAAe,uBAAuB,OAAO;AAAA,IAC7C,aAAa,qBAAqB,OAAO;AAAA,IACzC,WAAW,mBAAmB,OAAO;AAAA,IACrC,qBAAqB,6BAA6B,OAAO;AAAA,IACzD,WAAW,mBAAmB,OAAO;AAAA,IACrC,KAAK,aAAa,EAAE,KAAK,CAAC;AAAA,IAC1B,SAAU,uBAAM;AACd,YAAM,OAAgC,CAAC,gBACrC,KAAK,QAAQ;AAAA,QACX,QAAQ,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,OAAO,EAAE,QAAQ,aAAa,QAAQ,OAAO,aAAa,MAAM;AAAA,QAChE,UAAU;AAAA,QACV,QAAQ,aAAa;AAAA,MACvB,CAAC;AACH,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,CAAC,kBACP,uBAAuB;AAAA,UACrB;AAAA,UACA,UAAU,oBAAoB;AAAA,UAC9B,YAAY,iBAAiB;AAAA,UAC7B,SAAS;AAAA,QACX,CAAC;AAAA,QACH,MAAM,OAAO,gBAAgB;AAC3B,gBAAM,MAA6B,CAAC;AACpC,cAAI;AACJ,qBAAS;AACP,kBAAM,OAAO,MAAM,KAAK,EAAE,QAAQ,QAAQ,aAAa,OAAO,CAAC;AAC/D,gBAAI,KAAK,GAAG,KAAK,OAAO;AACxB,gBAAI,KAAK,cAAc,KAAM,QAAO;AACpC,qBAAS,KAAK;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG;AAAA,EACL;AACF;",
4
+ "sourcesContent": ["import {\n agentInfoSchema,\n agentListSchema,\n agentRealtimeTopics,\n healthResponseSchema,\n pendingRequestListSchema,\n personListSchema,\n realtimeSessionResponseSchema,\n type AgentInfoIface,\n type AgentListIface,\n type HealthResponseIface,\n type PendingRequestIface,\n type PendingRequestListIface,\n type PersonIface,\n type PersonListIface,\n type RealtimeSessionResponseIface,\n} from '@finalai/agent-protocol/agent-platform';\nimport { createAcpApi, type AcpApiIface } from \"./acp.mjs\";\nimport {\n createComputerSetupGuidesApi,\n createDefinitionsApi,\n createProvidersApi,\n createSchedulesApi,\n type ComputerSetupGuidesApiIface,\n type DefinitionsApiIface,\n type ProvidersApiIface,\n type SchedulesApiIface,\n} from \"./build.mjs\";\nimport {\n streamCollectionEvents,\n type CollectionEvent,\n type CollectionEventsOptionsIface,\n} from \"./collection-events.mjs\";\nimport {\n ClientCollection,\n encodePath,\n type ClientContextIface,\n type SignalOptionsIface,\n} from \"./context.mjs\";\nimport { createConversationsApi, type ConversationsApiIface } from \"./conversations.mjs\";\nimport { clientError, ClientErrorCode } from \"./errors.mjs\";\nimport { defaultStreamTiming, type StreamTimingIface } from \"./frame-stream.mjs\";\nimport {\n createHttp,\n HttpMethod,\n type AgentClientAuth,\n type FetchIface,\n type HeadersOption,\n} from \"./http.mjs\";\nimport {\n createGatewayRealtimeTransport,\n type GatewayConnect,\n type GatewayRealtimeTransportIface,\n type RealtimeTransportIface,\n} from \"./realtime.mjs\";\nimport { createSessionsApi, type SessionsApiIface } from \"./sessions.mjs\";\n\nexport interface CreateClientOptionsIface {\n /**\n * The session service's origin (`https://agent-session.final.ai`; its API is\n * under `/api` and ACP at `/acp/ws`), or a base URL the API routes are mounted\n * under (console-server's `https://<console>/api/agent-platform` proxy).\n */\n host: string;\n auth: AgentClientAuth;\n /** Extra headers per request; console clients send their client identity header here. */\n headers?: HeadersOption;\n /** API requests (the host's routes); carries auth and caller headers. */\n fetch?: FetchIface;\n /**\n * Presigned storage requests (attachment uploads). Gets only the headers the\n * presign requires, never auth, client identity or cookies, so a storage\n * bucket's CORS and third-party hosts see nothing of the caller. Defaults to\n * `globalThis.fetch`; keep it free of header-injecting wrappers.\n */\n storageFetch?: FetchIface;\n /** console-web and console-mobile pass their realtime clients; defaults to a gateway connection. */\n realtime?: RealtimeTransportIface;\n /** Seam for the default transport's gateway connection. */\n gatewayConnect?: GatewayConnect;\n /** Seam for stream retry timing (tests). */\n timing?: Partial<StreamTimingIface>;\n /** Seam for idempotency keys and client message ids; defaults to `crypto.randomUUID`. */\n newKey?: () => string;\n /** Seam for the client clock (conversation recovery windows). */\n now?: () => number;\n}\n\nexport interface AgentHandleIface {\n slug: string;\n info: (options?: SignalOptionsIface) => Promise<AgentInfoIface>;\n}\n\nexport interface AgentsApiIface {\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<AgentListIface>;\n /** I/O-free handle by slug or id. */\n get: (slugOrId: string) => AgentHandleIface;\n}\n\nexport interface PendingApiIface {\n /**\n * The caller's pending topic (`user.collection:<userId>:pending`): `acp.pending`\n * events for requests addressed to them, and a `collection.resync` whenever\n * `mine()` must be re-read (on every subscription, resync and while realtime is down).\n */\n events: (options?: CollectionEventsOptionsIface) => AsyncIterableIterator<CollectionEvent>;\n /** Every open permission and elicitation request whose audience includes the caller, newest first (all pages). */\n mine: (options?: SignalOptionsIface) => Promise<PendingRequestIface[]>;\n /** One page, newest first; pass `nextCursor` as `cursor` for the next. */\n page: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<PendingRequestListIface>;\n}\n\nexport interface PeopleApiIface {\n /** One page of the caller's organization members, by name; pass `nextCursor` as `cursor` for the next. */\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<PersonListIface>;\n /** Every member of the caller's organization (all pages). */\n all: (options?: SignalOptionsIface) => Promise<PersonIface[]>;\n}\n\nexport interface RealtimeApiIface {\n /**\n * Mints a gateway session (`POST /v1/realtime/session`) for the signed-in user:\n * the gateway URL, a short-lived token, and the user id realtime topics are keyed by.\n * Pass it as `createSession` to `createGatewayRealtimeTransport` when supplying a transport.\n */\n createSession: (options?: SignalOptionsIface) => Promise<RealtimeSessionResponseIface>;\n}\n\nexport interface AgentClientIface {\n health: (options?: SignalOptionsIface) => Promise<HealthResponseIface>;\n agents: AgentsApiIface;\n people: PeopleApiIface;\n realtime: RealtimeApiIface;\n sessions: SessionsApiIface;\n conversations: ConversationsApiIface;\n definitions: DefinitionsApiIface;\n providers: ProvidersApiIface;\n computerSetupGuides: ComputerSetupGuidesApiIface;\n schedules: SchedulesApiIface;\n pending: PendingApiIface;\n /**\n * ACP-native access (`/acp/ws`): an ACP v2 ClientApp connection on which the\n * session service is the agent. The ACP SDK loads on the first `connect`.\n */\n acp: AcpApiIface;\n /**\n * Ends every stream (they reject with a `client_closed` ClientError) and, when\n * the client created its own realtime transport, closes the gateway connection\n * and cancels its retries. A transport passed in `realtime` belongs to the\n * caller and is left open. Idempotent.\n */\n close: () => void;\n [Symbol.asyncDispose]: () => Promise<void>;\n}\n\nexport const createClient = (options: CreateClientOptionsIface): AgentClientIface => {\n const http = createHttp({\n host: options.host,\n auth: options.auth,\n headers: options.headers,\n fetch: options.fetch,\n });\n let realtime = options.realtime ?? null;\n let ownTransport: GatewayRealtimeTransportIface | null = null;\n const closing = new AbortController();\n const createRealtimeSession: RealtimeApiIface['createSession'] = (sessionOptions) =>\n http.request({\n method: HttpMethod.Post,\n path: '/v1/realtime/session',\n response: realtimeSessionResponseSchema,\n signal: sessionOptions?.signal,\n });\n let realtimeOwner: Promise<RealtimeSessionResponseIface> | null = null;\n const realtimeOwnerSession = () => {\n if (realtimeOwner != null) return realtimeOwner;\n const pending = createRealtimeSession({ signal: closing.signal });\n realtimeOwner = pending;\n void pending.catch(() => {\n if (realtimeOwner === pending) realtimeOwner = null;\n });\n return pending;\n };\n let realtimeUser: Promise<string> | null = null;\n // Shared by every stream, so it is cancelled only with the client, never by one caller.\n const realtimeUserId: ClientContextIface['realtimeUserId'] = () => {\n if (realtimeUser != null) return realtimeUser;\n const pending = realtimeOwnerSession().then((session) => {\n if (session.userId == null)\n throw new Error('This client authenticates as an API-key owner, not a user');\n return session.userId;\n });\n realtimeUser = pending;\n // A failed (or aborted) read is not cached.\n pending.catch(() => {\n if (realtimeUser === pending) realtimeUser = null;\n });\n return pending;\n };\n const context: ClientContextIface = {\n http,\n closeSignal: closing.signal,\n realtimeUserId,\n realtimeCollectionTopic: async (collection) => {\n const owner = await realtimeOwnerSession();\n // Organization and team keys are no conversation members: they reach agents through channels.\n if (owner.userId == null)\n throw new Error('Collection streams belong to users; API-key owners use session streams');\n return collection === ClientCollection.Pending\n ? agentRealtimeTopics.userPending(owner.userId)\n : agentRealtimeTopics.userConversations(owner.userId);\n },\n storageFetch: options.storageFetch ?? ((input, init) => globalThis.fetch(input, init)),\n realtime: () => {\n if (realtime != null) return realtime;\n ownTransport = createGatewayRealtimeTransport({\n createSession: () => createRealtimeSession(),\n connect: options.gatewayConnect,\n });\n if (closing.signal.aborted) ownTransport.close();\n realtime = ownTransport;\n return realtime;\n },\n timing: { ...defaultStreamTiming, ...options.timing },\n newKey: options.newKey ?? (() => globalThis.crypto.randomUUID()),\n now: options.now ?? Date.now,\n };\n\n const close = (): void => {\n if (closing.signal.aborted) return;\n closing.abort(\n clientError({ message: 'Agent client closed', status: 0, code: ClientErrorCode.Closed }),\n );\n ownTransport?.close();\n };\n\n return {\n close,\n [Symbol.asyncDispose]: async () => close(),\n health: (healthOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/health',\n response: healthResponseSchema,\n signal: healthOptions?.signal,\n }),\n agents: {\n list: (listOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/agents',\n query: { cursor: listOptions?.cursor, limit: listOptions?.limit },\n response: agentListSchema,\n signal: listOptions?.signal,\n }),\n get: (slugOrId) => ({\n slug: slugOrId,\n info: (infoOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: `/v1/agents/${encodePath(slugOrId)}`,\n response: agentInfoSchema,\n signal: infoOptions?.signal,\n }),\n }),\n },\n people: (() => {\n const list: PeopleApiIface['list'] = (listOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/people',\n query: { cursor: listOptions?.cursor, limit: listOptions?.limit },\n response: personListSchema,\n signal: listOptions?.signal,\n });\n return {\n list,\n all: async (allOptions) => {\n const all: PersonIface[] = [];\n let cursor: string | undefined;\n for (;;) {\n const next = await list({ cursor, signal: allOptions?.signal });\n all.push(...next.people);\n if (next.nextCursor == null) return all;\n cursor = next.nextCursor;\n }\n },\n };\n })(),\n realtime: { createSession: createRealtimeSession },\n sessions: createSessionsApi(context),\n conversations: createConversationsApi(context),\n definitions: createDefinitionsApi(context),\n providers: createProvidersApi(context),\n computerSetupGuides: createComputerSetupGuidesApi(context),\n schedules: createSchedulesApi(context),\n acp: createAcpApi({ http }),\n pending: (() => {\n const page: PendingApiIface['page'] = (pageOptions) =>\n http.request({\n method: HttpMethod.Get,\n path: '/v1/pending',\n query: { cursor: pageOptions?.cursor, limit: pageOptions?.limit },\n response: pendingRequestListSchema,\n signal: pageOptions?.signal,\n });\n return {\n page,\n events: (eventsOptions) =>\n streamCollectionEvents({\n context,\n topicFor: agentRealtimeTopics.userPending,\n collection: ClientCollection.Pending,\n options: eventsOptions,\n }),\n mine: async (mineOptions) => {\n const all: PendingRequestIface[] = [];\n let cursor: string | undefined;\n for (;;) {\n const next = await page({ cursor, signal: mineOptions?.signal });\n all.push(...next.pending);\n if (next.nextCursor == null) return all;\n cursor = next.nextCursor;\n }\n },\n };\n })(),\n };\n};\n"],
5
+ "mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OASK;AACP,SAAS,oBAAsC;AAC/C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;AACP;AAAA,EACE;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AACP,SAAS,8BAA0D;AACnE,SAAS,aAAa,uBAAuB;AAC7C,SAAS,2BAAmD;AAC5D;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AACP;AAAA,EACE;AAAA,OAIK;AACP,SAAS,yBAAgD;AA0GlD,MAAM,eAAe,CAAC,YAAwD;AACnF,QAAM,OAAO,WAAW;AAAA,IACtB,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,EACjB,CAAC;AACD,MAAI,WAAW,QAAQ,YAAY;AACnC,MAAI,eAAqD;AACzD,QAAM,UAAU,IAAI,gBAAgB;AACpC,QAAM,wBAA2D,CAAC,mBAChE,KAAK,QAAQ;AAAA,IACX,QAAQ,WAAW;AAAA,IACnB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ,gBAAgB;AAAA,EAC1B,CAAC;AACH,MAAI,gBAA8D;AAClE,QAAM,uBAAuB,MAAM;AACjC,QAAI,iBAAiB,KAAM,QAAO;AAClC,UAAM,UAAU,sBAAsB,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAChE,oBAAgB;AAChB,SAAK,QAAQ,MAAM,MAAM;AACvB,UAAI,kBAAkB,QAAS,iBAAgB;AAAA,IACjD,CAAC;AACD,WAAO;AAAA,EACT;AACA,MAAI,eAAuC;AAE3C,QAAM,iBAAuD,MAAM;AACjE,QAAI,gBAAgB,KAAM,QAAO;AACjC,UAAM,UAAU,qBAAqB,EAAE,KAAK,CAAC,YAAY;AACvD,UAAI,QAAQ,UAAU;AACpB,cAAM,IAAI,MAAM,2DAA2D;AAC7E,aAAO,QAAQ;AAAA,IACjB,CAAC;AACD,mBAAe;AAEf,YAAQ,MAAM,MAAM;AAClB,UAAI,iBAAiB,QAAS,gBAAe;AAAA,IAC/C,CAAC;AACD,WAAO;AAAA,EACT;AACA,QAAM,UAA8B;AAAA,IAClC;AAAA,IACA,aAAa,QAAQ;AAAA,IACrB;AAAA,IACA,yBAAyB,OAAO,eAAe;AAC7C,YAAM,QAAQ,MAAM,qBAAqB;AAEzC,UAAI,MAAM,UAAU;AAClB,cAAM,IAAI,MAAM,wEAAwE;AAC1F,aAAO,eAAe,iBAAiB,UACnC,oBAAoB,YAAY,MAAM,MAAM,IAC5C,oBAAoB,kBAAkB,MAAM,MAAM;AAAA,IACxD;AAAA,IACA,cAAc,QAAQ,iBAAiB,CAAC,OAAO,SAAS,WAAW,MAAM,OAAO,IAAI;AAAA,IACpF,UAAU,MAAM;AACd,UAAI,YAAY,KAAM,QAAO;AAC7B,qBAAe,+BAA+B;AAAA,QAC5C,eAAe,MAAM,sBAAsB;AAAA,QAC3C,SAAS,QAAQ;AAAA,MACnB,CAAC;AACD,UAAI,QAAQ,OAAO,QAAS,cAAa,MAAM;AAC/C,iBAAW;AACX,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,EAAE,GAAG,qBAAqB,GAAG,QAAQ,OAAO;AAAA,IACpD,QAAQ,QAAQ,WAAW,MAAM,WAAW,OAAO,WAAW;AAAA,IAC9D,KAAK,QAAQ,OAAO,KAAK;AAAA,EAC3B;AAEA,QAAM,QAAQ,MAAY;AACxB,QAAI,QAAQ,OAAO,QAAS;AAC5B,YAAQ;AAAA,MACN,YAAY,EAAE,SAAS,uBAAuB,QAAQ,GAAG,MAAM,gBAAgB,OAAO,CAAC;AAAA,IACzF;AACA,kBAAc,MAAM;AAAA,EACtB;AAEA,SAAO;AAAA,IACL;AAAA,IACA,CAAC,OAAO,YAAY,GAAG,YAAY,MAAM;AAAA,IACzC,QAAQ,CAAC,kBACP,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ,eAAe;AAAA,IACzB,CAAC;AAAA,IACH,QAAQ;AAAA,MACN,MAAM,CAAC,gBACL,KAAK,QAAQ;AAAA,QACX,QAAQ,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,OAAO,EAAE,QAAQ,aAAa,QAAQ,OAAO,aAAa,MAAM;AAAA,QAChE,UAAU;AAAA,QACV,QAAQ,aAAa;AAAA,MACvB,CAAC;AAAA,MACH,KAAK,CAAC,cAAc;AAAA,QAClB,MAAM;AAAA,QACN,MAAM,CAAC,gBACL,KAAK,QAAQ;AAAA,UACX,QAAQ,WAAW;AAAA,UACnB,MAAM,cAAc,WAAW,QAAQ,CAAC;AAAA,UACxC,UAAU;AAAA,UACV,QAAQ,aAAa;AAAA,QACvB,CAAC;AAAA,MACL;AAAA,IACF;AAAA,IACA,QAAS,uBAAM;AACb,YAAM,OAA+B,CAAC,gBACpC,KAAK,QAAQ;AAAA,QACX,QAAQ,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,OAAO,EAAE,QAAQ,aAAa,QAAQ,OAAO,aAAa,MAAM;AAAA,QAChE,UAAU;AAAA,QACV,QAAQ,aAAa;AAAA,MACvB,CAAC;AACH,aAAO;AAAA,QACL;AAAA,QACA,KAAK,OAAO,eAAe;AACzB,gBAAM,MAAqB,CAAC;AAC5B,cAAI;AACJ,qBAAS;AACP,kBAAM,OAAO,MAAM,KAAK,EAAE,QAAQ,QAAQ,YAAY,OAAO,CAAC;AAC9D,gBAAI,KAAK,GAAG,KAAK,MAAM;AACvB,gBAAI,KAAK,cAAc,KAAM,QAAO;AACpC,qBAAS,KAAK;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG;AAAA,IACH,UAAU,EAAE,eAAe,sBAAsB;AAAA,IACjD,UAAU,kBAAkB,OAAO;AAAA,IACnC,eAAe,uBAAuB,OAAO;AAAA,IAC7C,aAAa,qBAAqB,OAAO;AAAA,IACzC,WAAW,mBAAmB,OAAO;AAAA,IACrC,qBAAqB,6BAA6B,OAAO;AAAA,IACzD,WAAW,mBAAmB,OAAO;AAAA,IACrC,KAAK,aAAa,EAAE,KAAK,CAAC;AAAA,IAC1B,SAAU,uBAAM;AACd,YAAM,OAAgC,CAAC,gBACrC,KAAK,QAAQ;AAAA,QACX,QAAQ,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,OAAO,EAAE,QAAQ,aAAa,QAAQ,OAAO,aAAa,MAAM;AAAA,QAChE,UAAU;AAAA,QACV,QAAQ,aAAa;AAAA,MACvB,CAAC;AACH,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,CAAC,kBACP,uBAAuB;AAAA,UACrB;AAAA,UACA,UAAU,oBAAoB;AAAA,UAC9B,YAAY,iBAAiB;AAAA,UAC7B,SAAS;AAAA,QACX,CAAC;AAAA,QACH,MAAM,OAAO,gBAAgB;AAC3B,gBAAM,MAA6B,CAAC;AACpC,cAAI;AACJ,qBAAS;AACP,kBAAM,OAAO,MAAM,KAAK,EAAE,QAAQ,QAAQ,aAAa,OAAO,CAAC;AAC/D,gBAAI,KAAK,GAAG,KAAK,OAAO;AACxB,gBAAI,KAAK,cAAc,KAAM,QAAO;AACpC,qBAAS,KAAK;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG;AAAA,EACL;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,5 @@
1
1
  import { type ProcessInspectionRequestIface, type ProcessInspectionResultIface } from '@finalai/agent-protocol';
2
- import { AgentSessionState, type AgentRealtimeEvent, type AgentTurnPolicy, type AttachmentDownloadIface, type AttachmentUploadIface, type ContentInput, type ConversationIface, type ConversationKind, type ConversationLinkIface, type ConversationListIface, type ConversationMessageIface, type ConversationMessagesPageIface, type ConversationSandboxIface, type ConversationScheduleIface, type CreateConversationScheduleRequestIface, type DecisionsPageIface, type MessageDeliveryIface, type ParticipantIface, type ParticipantInput, type PostConversationEventRequestIface, type ReactionIface, type ReadStateIface, type RespondPendingResponseIface, type SandboxDirectoryIface, type SandboxEditorSessionIface, type SandboxFileIface, type SandboxPathIface, type SandboxPreviewType, type SandboxSearchIface, type SearchMessagesPageIface, type UpdateConversationRequestIface, type UpdateConversationScheduleRequestIface, type UpdateParticipantRequestIface, type WireFallback } from '@finalai/agent-protocol/agent-platform';
2
+ import { AgentSessionState, type PostConversationEventResponseIface, type AgentRealtimeEvent, type AgentTurnPolicy, type AttachmentDownloadIface, type AttachmentUploadIface, type ContentInput, type ConversationIface, type ConversationKind, type ConversationLinkIface, type ConversationListIface, type ConversationMessageIface, type ConversationMessagesPageIface, type ConversationSandboxIface, type ConversationScheduleIface, type CreateConversationScheduleRequestIface, type DecisionsPageIface, type MessageDeliveryIface, type ParticipantIface, type ParticipantInput, type PostConversationEventRequestIface, type ReactionIface, type ReadStateIface, type RespondPendingResponseIface, type SandboxDirectoryIface, type SandboxEditorSessionIface, type SandboxFileIface, type SandboxPathIface, type SandboxPreviewType, type SandboxSearchIface, type SearchMessagesPageIface, type UpdateConversationRequestIface, type UpdateConversationScheduleRequestIface, type UpdateParticipantRequestIface, type WireFallback } from '@finalai/agent-protocol/agent-platform';
3
3
  import { type CollectionEvent, type CollectionEventsOptionsIface } from "./collection-events.mjs";
4
4
  import { type ClientContextIface, type EnumInput, type SignalOptionsIface } from "./context.mjs";
5
5
  import { type RespondArgs } from "./sessions.mjs";
@@ -77,8 +77,6 @@ export type ParticipantCreateInput = {
77
77
  routingMode?: EnumInput<NonNullable<Extract<ParticipantInput, {
78
78
  agent: string;
79
79
  }>['routingMode']>>;
80
- } | {
81
- apiKeyPrincipal: string;
82
80
  };
83
81
  export interface SentMessageIface {
84
82
  message: ConversationMessageIface;
@@ -151,11 +149,12 @@ export interface ConversationHandleIface {
151
149
  typing: boolean;
152
150
  }, options?: SignalOptionsIface) => Promise<void>;
153
151
  /**
154
- * Posts something that happened outside the conversation (`POST …/events`):
155
- * a message from the source's system participant (a Goal, a tool, a
156
- * webhook), routed like one. The same `eventId` from the same source posts once.
152
+ * Hands something that happened outside the conversation (`POST …/events`)
153
+ * to its Default agent as input from you, not as a message: the agent's
154
+ * reply carries the source as its caption. The same `eventId` from the same
155
+ * source is accepted once; the receipt says whether the agent was prompted.
157
156
  */
158
- postEvent: (event: PostConversationEventRequestIface, options?: SignalOptionsIface) => Promise<SentMessageIface>;
157
+ postEvent: (event: PostConversationEventRequestIface, options?: SignalOptionsIface) => Promise<PostConversationEventResponseIface>;
159
158
  respond: (args: RespondArgs, options?: SignalOptionsIface) => Promise<RespondPendingResponseIface>;
160
159
  /** Stops the agents' running turns in this conversation. */
161
160
  cancel: (options?: SignalOptionsIface & {
@@ -41,6 +41,7 @@ import {
41
41
  PendingEventState,
42
42
  pendingRequestListSchema,
43
43
  postConversationEventRequestSchema,
44
+ postConversationEventResponseSchema,
44
45
  pushDeliveryOpenResponseSchema,
45
46
  reactionRequestSchema,
46
47
  reactionsResponseSchema,
@@ -703,21 +704,13 @@ const createConversationHandle = (context, conversationId) => {
703
704
  signal: options?.signal
704
705
  });
705
706
  },
706
- postEvent: async (event, options) => {
707
- const sent = await http.request({
708
- method: HttpMethod.Post,
709
- path: conversationPath(conversationId, "/events"),
710
- body: { schema: postConversationEventRequestSchema, value: event },
711
- response: sendMessageResponseSchema,
712
- signal: options?.signal
713
- });
714
- return {
715
- message: sent.message,
716
- messageId: sent.message.id,
717
- seq: sent.message.seq,
718
- deliveries: sent.deliveries
719
- };
720
- },
707
+ postEvent: (event, options) => http.request({
708
+ method: HttpMethod.Post,
709
+ path: conversationPath(conversationId, "/events"),
710
+ body: { schema: postConversationEventRequestSchema, value: event },
711
+ response: postConversationEventResponseSchema,
712
+ signal: options?.signal
713
+ }),
721
714
  typing: async (args, options) => {
722
715
  await http.request({
723
716
  method: HttpMethod.Post,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/agent-client/conversations.ts"],
4
- "sourcesContent": ["import {\n ProcessInspectionOperation,\n processInspectionRequestSchema,\n processInspectionResultSchema,\n type ProcessInspectionRequestIface,\n type ProcessInspectionResultIface,\n} from '@finalai/agent-protocol';\nimport {\n agentRealtimeFrameSchema,\n AgentRealtimeFrameType,\n AgentRealtimeKind,\n agentRealtimeTopics,\n AgentSessionState,\n attachmentDownloadSchema,\n attachmentUploadSchema,\n cancelConversationRequestSchema,\n conversationLinkListSchema,\n conversationLinkSchema,\n conversationListSchema,\n conversationMessageSchema,\n conversationMessagesPageSchema,\n conversationSandboxListSchema,\n conversationSandboxSchema,\n conversationScheduleListSchema,\n conversationScheduleSchema,\n conversationSchema,\n createAttachmentUploadRequestSchema,\n createConversationLinkRequestSchema,\n createConversationRequestSchema,\n createConversationScheduleRequestSchema,\n createDirectConversationRequestSchema,\n decisionsPageSchema,\n markReadRequestSchema,\n messageDeliveriesSchema,\n MessageStreamingState,\n MessageThreadFilter,\n okResponseSchema,\n parseAgentRealtimeEvent,\n participantInputSchema,\n ParticipantKind,\n participantListSchema,\n participantSchema,\n PendingEventState,\n pendingRequestListSchema,\n postConversationEventRequestSchema,\n pushDeliveryOpenResponseSchema,\n reactionRequestSchema,\n reactionsResponseSchema,\n readStateSchema,\n removeParticipantRequestSchema,\n respondPendingRequestSchema,\n respondPendingResponseSchema,\n sandboxDirectorySchema,\n sandboxEditorAuthorizationSchema,\n sandboxEditorSessionSchema,\n sandboxFileSchema,\n sandboxPathSchema,\n sandboxPreviewOptionsSchema,\n sandboxPreviewSchema,\n sandboxSearchSchema,\n searchMessagesPageSchema,\n sendMessageRequestSchema,\n sendMessageResponseSchema,\n sessionSchema,\n typingRequestSchema,\n updateConversationRequestSchema,\n updateConversationScheduleRequestSchema,\n updateParticipantRequestSchema,\n type AgentRealtimeEvent,\n type AgentRealtimeEventOf,\n type AgentSessionIface,\n type AgentTurnPolicy,\n type AttachmentDownloadIface,\n type AttachmentUploadIface,\n type ContentInput,\n type ConversationIface,\n type ConversationKind,\n type ConversationLinkIface,\n type ConversationListIface,\n type ConversationMessageIface,\n type ConversationMessagesPageIface,\n type ConversationSandboxIface,\n type ConversationScheduleIface,\n type CreateConversationScheduleRequestIface,\n type DecisionsPageIface,\n type MessageDeliveryIface,\n type ParticipantIface,\n type ParticipantInput,\n type PendingRequestIface,\n type PostConversationEventRequestIface,\n type ReactionIface,\n type ReadStateIface,\n type RespondPendingResponseIface,\n type SandboxDirectoryIface,\n type SandboxEditorSessionIface,\n type SandboxFileIface,\n type SandboxPathIface,\n type SandboxPreviewType,\n type SandboxSearchIface,\n type SearchMessagesPageIface,\n type UpdateConversationRequestIface,\n type UpdateConversationScheduleRequestIface,\n type UpdateParticipantRequestIface,\n type WireFallback,\n} from '@finalai/agent-protocol/agent-platform';\nimport { createAsyncQueue, failOnAbort } from \"./async-queue.mjs\";\nimport {\n streamCollectionEvents,\n type CollectionEvent,\n type CollectionEventsOptionsIface,\n} from \"./collection-events.mjs\";\nimport {\n ClientCollection,\n encodePath,\n type ClientContextIface,\n type EnumInput,\n type SignalOptionsIface,\n} from \"./context.mjs\";\nimport {\n clientError,\n ClientErrorCode,\n isRetryableClientError,\n isTerminalRealtimeError,\n realtimeSubscriptionError,\n} from \"./errors.mjs\";\nimport { errorFromResponse, HttpMethod, type HttpRequestArgsIface } from \"./http.mjs\";\nimport type { RealtimeTransportFrameIface } from \"./realtime.mjs\";\nimport { outcomeOf, type RespondArgs } from \"./sessions.mjs\";\n\nexport interface SandboxFileContentArgsIface {\n snapshotId?: string;\n bindingId: string;\n path: string;\n download?: boolean;\n /** One HTTP byte range, for example `bytes=1024-2047`. */\n range?: string;\n}\n\nexport interface SandboxFileContentRequestIface {\n url: string;\n /** Supply these to native download/media clients; never put bearer tokens in URLs. */\n headers: Record<string, string>;\n credentials: RequestCredentials;\n}\n\nexport interface ConversationEventMetaIface {\n topic: string;\n cursor: string | null;\n createdAt: string | null;\n /** True for messages the SDK fetched over HTTP to fill a realtime gap. */\n replayed: boolean;\n}\n\n/** A realtime event of the conversation topic, flattened (`event.message`, `event.pending`). */\nexport type ConversationEvent = AgentRealtimeEvent & ConversationEventMetaIface;\n\nexport interface ConversationEventsOptionsIface extends SignalOptionsIface {\n /** Keep streaming; false ends once the subscription is current. Defaults to true. */\n follow?: boolean;\n /** Also replay messages (thread replies included) after this conversation seq when the subscription opens. */\n afterSeq?: number;\n /** Gateway cursor to resume the topic after. */\n afterCursor?: string;\n /**\n * Messages the caller already has (an earlier stream or page). On the first\n * subscription the stream recovers everything created or updated since the\n * newest of them, thread replies included, and skips the versions given, so\n * a client resuming a conversation it rendered before is left with no gap.\n */\n resumeFrom?: readonly ConversationMessageIface[];\n /**\n * Called on every resubscribe (after the first) and resync, as the stream\n * starts recovering messages. State that messages cannot reconstruct, such\n * as whether an agent's turn ended without a reply, is the caller's to re-read.\n */\n onResubscribed?: () => void;\n /**\n * Also recover what only realtime carries (default true). On every\n * (re)subscribe, resync and fallback poll the stream re-reads the open\n * permission and elicitation requests of the conversation's agent sessions\n * and emits replayed `acp.pending` events: `created` for an open request it\n * has not emitted, `resolved` for one it emitted open that no longer is. And\n * for every turn it saw start whose session is no longer running, it emits a\n * replayed `conversation.turn.ended` (stop reason null). Turns that started\n * and ended while it was away arrive only as messages.\n */\n recoverTransient?: boolean;\n // While the realtime transport reports errors, a following stream polls the\n // same recovery every `timing.pollIntervalMs` until it is subscribed again.\n // Without `resumeFrom` or `afterSeq`, the stream reads the newest message when it is\n // called and, once subscribed, recovers every change after it (thread replies included),\n // so nothing posted while the subscription registers is lost.\n}\n\nexport interface SendMessageOptionsIface extends SignalOptionsIface {\n clientMessageId?: string;\n replyTo?: string;\n threadRootId?: string;\n /** Ids of earlier messages in the conversation to quote, in order. */\n quotes?: string[];\n /** Mentioned participant ids. */\n mentions?: string[];\n attachmentIds?: string[];\n /** When the person submitted, for the prompt-to-inference trace; defaults to now. */\n clientSubmittedAtMs?: number;\n}\n\nexport type ParticipantCreateInput =\n | { user: string }\n | {\n agent: string;\n routingMode?: EnumInput<\n NonNullable<Extract<ParticipantInput, { agent: string }>['routingMode']>\n >;\n }\n | { apiKeyPrincipal: string };\n\nexport interface SentMessageIface {\n message: ConversationMessageIface;\n messageId: string;\n seq: number;\n /** One entry per agent participant the message was routed to. */\n deliveries: MessageDeliveryIface[];\n}\n\nexport interface ListMessagesOptionsIface extends SignalOptionsIface {\n before?: number;\n after?: number;\n limit?: number;\n /** Thread root message id, or `MessageThreadFilter.All` for the timeline plus every thread. */\n thread?: string;\n /** ISO instant: messages created or updated after it (the first page of a change scan). */\n updatedAfter?: string;\n /** A previous page's `nextUpdatedCursor`: continue the change scan after it. */\n updatedCursor?: string;\n}\n\nexport interface UploadAttachmentArgsIface extends SignalOptionsIface {\n name: string;\n contentType: string;\n data: Blob | ArrayBuffer;\n}\n\nexport interface ConversationHandleIface {\n /** Durable accepted prompt receipts for a message, including queued deliveries once admitted. */\n deliveries: (\n args: { messageId: string },\n options?: SignalOptionsIface,\n ) => Promise<MessageDeliveryIface[]>;\n\n id: string;\n info: (options?: SignalOptionsIface) => Promise<ConversationIface>;\n send: (content: ContentInput, options?: SendMessageOptionsIface) => Promise<SentMessageIface>;\n events: (options?: ConversationEventsOptionsIface) => AsyncIterableIterator<ConversationEvent>;\n messages: (options?: ListMessagesOptionsIface) => Promise<ConversationMessagesPageIface>;\n /** One message by id (`GET /v1/conversations/:id/messages/:messageId`), e.g. a thread root. */\n message: (\n args: { messageId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationMessageIface>;\n react: (\n args: { messageId: string; emoji: string },\n options?: SignalOptionsIface,\n ) => Promise<ReactionIface[]>;\n unreact: (\n args: { messageId: string; emoji: string },\n options?: SignalOptionsIface,\n ) => Promise<ReactionIface[]>;\n recordPushOpen: (\n args: { deliveryId: string },\n options?: SignalOptionsIface,\n ) => Promise<{ recorded: boolean }>;\n markRead: (args: { throughSeq: number }, options?: SignalOptionsIface) => Promise<ReadStateIface>;\n /**\n * Marks a thread read through one of its replies' seq and follows it\n * (`POST \u2026/threads/:rootId/read`); the conversation's own unread count\n * moves with `markRead`.\n */\n markThreadRead: (\n args: { rootId: string; throughSeq: number },\n options?: SignalOptionsIface,\n ) => Promise<void>;\n /**\n * Tells the other members the caller is typing (`POST \u2026/typing`), realtime\n * only. A `true` lapses on its own after a few seconds, so composers repeat\n * it while typing continues and send `false` when the draft is sent or cleared.\n */\n typing: (args: { typing: boolean }, options?: SignalOptionsIface) => Promise<void>;\n /**\n * Posts something that happened outside the conversation (`POST \u2026/events`):\n * a message from the source's system participant (a Goal, a tool, a\n * webhook), routed like one. The same `eventId` from the same source posts once.\n */\n postEvent: (\n event: PostConversationEventRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<SentMessageIface>;\n respond: (\n args: RespondArgs,\n options?: SignalOptionsIface,\n ) => Promise<RespondPendingResponseIface>;\n /** Stops the agents' running turns in this conversation. */\n cancel: (\n options?: SignalOptionsIface & { reason?: string; throughMessageSeq?: number },\n ) => Promise<void>;\n participants: (options?: SignalOptionsIface) => Promise<ParticipantIface[]>;\n /**\n * Each agent participant's session state, read now: whether a turn is\n * running in it. What a client re-reads when it may have missed a\n * `conversation.turn.ended` (`events()` reconciles the turns it saw itself).\n */\n turns: (options?: SignalOptionsIface) => Promise<ConversationAgentTurnIface[]>;\n addParticipant: (\n participant: ParticipantCreateInput,\n options?: SignalOptionsIface,\n ) => Promise<ParticipantIface>;\n /**\n * Changes an agent's routing mode (owners and admins) or a person's role\n * (owners, groups only; the last owner cannot step down). One field per call.\n */\n updateParticipant: (\n args: { participantId: string } & Omit<\n UpdateParticipantRequestIface,\n 'routingMode' | 'role'\n > & {\n routingMode?: EnumInput<NonNullable<UpdateParticipantRequestIface['routingMode']>>;\n role?: EnumInput<NonNullable<UpdateParticipantRequestIface['role']>>;\n },\n options?: SignalOptionsIface,\n ) => Promise<ParticipantIface>;\n removeParticipant: (\n args: { participantId: string },\n options?: SignalOptionsIface,\n ) => Promise<void>;\n update: (\n patch: UpdateConversationRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationIface>;\n delete: (args: { messageId: string }, options?: SignalOptionsIface) => Promise<void>;\n uploadAttachment: (args: UploadAttachmentArgsIface) => Promise<AttachmentUploadIface>;\n /**\n * A fresh presigned download URL for one attachment\n * (`GET /v1/conversations/:id/attachments/:attachmentId`). URLs on messages\n * expire; resolve through this before opening one that may be stale.\n */\n attachmentUrl: (\n args: { attachmentId: string },\n options?: SignalOptionsIface,\n ) => Promise<AttachmentDownloadIface>;\n /**\n * The conversation's sandboxes (the computer tile): status, capabilities and\n * whether a preview is available (`GET /v1/conversations/:id/sandboxes`).\n * Never starts a parked sandbox.\n */\n sandboxes: (options?: SignalOptionsIface) => Promise<ConversationSandboxIface[]>;\n /** One directory of a running sandbox, confined to its workspace (`\u2026/sandboxes/:bindingId/files`). */\n sandboxFiles: (\n args: { bindingId: string; path?: string; snapshotId?: string },\n options?: SignalOptionsIface,\n ) => Promise<SandboxDirectoryIface>;\n /** Resolves a file or directory without waking its sandbox. */\n sandboxPath: (\n args: { bindingId: string; path?: string; snapshotId?: string },\n options?: SignalOptionsIface,\n ) => Promise<SandboxPathIface>;\n /** Bounded recursive path search; truncated signals incomplete traversal. */\n searchSandboxFiles: (\n args: { bindingId: string; path?: string; query: string; limit?: number },\n options?: SignalOptionsIface,\n ) => Promise<SandboxSearchIface>;\n /** A byte range of a file in a running sandbox, at most 1 MiB (`\u2026/sandboxes/:bindingId/file`). */\n sandboxFile: (\n args: {\n bindingId: string;\n path: string;\n offset?: number;\n length?: number;\n snapshotId?: string;\n },\n options?: SignalOptionsIface,\n ) => Promise<SandboxFileIface>;\n inspectSandboxProcesses(\n args: { bindingId: string; request: ProcessInspectionRequestIface },\n options?: SignalOptionsIface,\n ): Promise<ProcessInspectionResultIface>;\n /** Opens a provider editor for an existing workspace, with write authorization. */\n openSandboxEditor(\n args: { bindingId: string },\n options?: SignalOptionsIface,\n ): Promise<SandboxEditorSessionIface>;\n refreshSandboxEditor(\n args: { bindingId: string; editorId: string; authorizationId: string },\n options?: SignalOptionsIface,\n ): Promise<SandboxEditorSessionIface>;\n closeSandboxEditor(\n args: { bindingId: string; editorId: string; authorizationId: string },\n options?: SignalOptionsIface & { keepalive?: boolean },\n ): Promise<void>;\n /** Raw streaming bytes (`\u2026/file/content`). The caller consumes or cancels the response body. */\n sandboxFileContent: (\n args: SandboxFileContentArgsIface,\n options?: SignalOptionsIface,\n ) => Promise<Response>;\n /**\n * An authenticated request for a browser/native media or download client.\n * Cookie clients can use the URL directly; bearer clients must supply headers.\n * Every request rechecks membership and confinement; never wakes the sandbox.\n */\n sandboxFileContentRequest: (\n args: SandboxFileContentArgsIface,\n ) => Promise<SandboxFileContentRequestIface>;\n /** A short-lived screen preview of a running sandbox; 404 when it serves none (`\u2026/preview`). */\n sandboxPreview: (\n args: { bindingId: string; viewOnly?: boolean },\n options?: SignalOptionsIface,\n ) => Promise<SandboxPreviewType>;\n /** Starts a parked sandbox (conversation owners and admins; `POST \u2026/wake`). */\n wakeSandbox: (\n args: { bindingId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationSandboxIface>;\n /** The conversation's runtime schedules: reminders and recurring checks (`GET \u2026/schedules`). */\n schedules: (options?: SignalOptionsIface) => Promise<ConversationScheduleIface[]>;\n /**\n * Creates a schedule owned by one agent participant (`POST \u2026/schedules`).\n * Agents create their own; people need to be conversation owners or admins.\n */\n createSchedule: (\n args: CreateConversationScheduleRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationScheduleIface>;\n /** Changes a schedule (its agent, or conversation owners and admins; `PATCH \u2026/schedules/:id`). */\n updateSchedule: (\n args: { scheduleId: string } & UpdateConversationScheduleRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationScheduleIface>;\n /** Deletes a schedule (`DELETE \u2026/schedules/:id`). */\n deleteSchedule: (args: { scheduleId: string }, options?: SignalOptionsIface) => Promise<void>;\n /**\n * The conversations this one handed work to, with what their agents are\n * doing (`GET \u2026/links`). Their replies and waits arrive here as messages.\n */\n links: (options?: SignalOptionsIface) => Promise<ConversationLinkIface[]>;\n /** Conversations receiving this conversation\u2019s delegated results. */\n parentLinks: (options?: SignalOptionsIface) => Promise<ConversationLinkIface[]>;\n /**\n * Links another conversation the caller belongs to (`POST \u2026/links`); linking\n * it again returns the same link. Links never form a cycle.\n */\n link: (\n args: { conversationId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationLinkIface>;\n /** Removes a link (`DELETE \u2026/links/:linkId`); both conversations remain. */\n unlink: (args: { linkId: string }, options?: SignalOptionsIface) => Promise<void>;\n}\n\nexport interface ConversationAgentTurnIface {\n participantId: string;\n sessionId: string;\n state: AgentSessionState | WireFallback;\n /** A turn is running or waiting on a pending request. */\n running: boolean;\n}\n\n/** Session states in which a turn is open. */\nexport const TURN_OPEN_SESSION_STATES: ReadonlySet<AgentSessionState | WireFallback> = new Set([\n AgentSessionState.Running,\n AgentSessionState.RequiresAction,\n]);\n\nexport interface OpenedConversationIface extends ConversationHandleIface {\n conversation: ConversationIface;\n}\n\nexport interface CreateConversationArgsIface extends SignalOptionsIface {\n kind: EnumInput<ConversationKind>;\n title?: string;\n participants: ParticipantCreateInput[];\n turnPolicy?: EnumInput<AgentTurnPolicy>;\n}\n\nexport interface ConversationsApiIface {\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number; includeArchived?: boolean },\n ) => Promise<ConversationListIface>;\n /** Finds or creates the caller's direct conversation with an agent. */\n direct: (args: { agent: string } & SignalOptionsIface) => Promise<OpenedConversationIface>;\n /** Finds or creates the caller's Home conversation. */\n home: (options?: SignalOptionsIface) => Promise<OpenedConversationIface>;\n create: (args: CreateConversationArgsIface) => Promise<OpenedConversationIface>;\n /** I/O-free handle. */\n get: (conversationId: string) => ConversationHandleIface;\n /** Full-text search over the caller's conversations (or one), newest first. */\n search: (\n args: {\n q: string;\n conversationId?: string;\n cursor?: string;\n limit?: number;\n } & SignalOptionsIface,\n ) => Promise<SearchMessagesPageIface>;\n /**\n * The caller's conversation list topic (`user.collection:<userId>:conversations`):\n * `conversation.list.changed` and `conversation.updated` events, and a\n * `collection.resync` whenever `list()` must be re-read (on every\n * subscription, resync and while realtime is down).\n */\n listEvents: (options?: CollectionEventsOptionsIface) => AsyncIterableIterator<CollectionEvent>;\n /** Everything awaiting the caller's answer across conversations. */\n decisions: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<DecisionsPageIface>;\n}\n\nconst conversationPath = (conversationId: string, suffix = ''): string =>\n `/v1/conversations/${encodePath(conversationId)}${suffix}`;\n\nconst messagePath = (conversationId: string, messageId: string, suffix = ''): string =>\n conversationPath(conversationId, `/messages/${encodePath(messageId)}${suffix}`);\n\ninterface ConversationStreamArgsIface {\n context: ClientContextIface;\n conversationId: string;\n options: ConversationEventsOptionsIface | undefined;\n listMessages: (options: ListMessagesOptionsIface) => Promise<ConversationMessagesPageIface>;\n listParticipants: (options: SignalOptionsIface) => Promise<ParticipantIface[]>;\n getSession: (sessionId: string, options: SignalOptionsIface) => Promise<AgentSessionIface>;\n sessionPending: (\n sessionId: string,\n options: SignalOptionsIface,\n ) => Promise<PendingRequestIface[]>;\n}\n\n// Bounds on the ids a stream remembers to dedupe transient events.\nconst MAX_REMEMBERED = 4096;\n\n// `GET /v1/sessions/:id/pending` returns at most this many open requests; a\n// list that long may be truncated, so absence from it proves nothing.\nconst SESSION_PENDING_LIMIT = 200;\n\nconst remember = <Key, Value>(map: Map<Key, Value>, key: Key, value: Value): void => {\n map.delete(key);\n map.set(key, value);\n if (map.size > MAX_REMEMBERED) {\n const oldest = map.keys().next();\n if (oldest.done !== true) map.delete(oldest.value);\n }\n};\n\ntype TurnStartedEventIface = AgentRealtimeEventOf<AgentRealtimeKind.TurnStarted>;\n\nconst isTransientEvent = (event: AgentRealtimeEvent): boolean =>\n event.kind === AgentRealtimeKind.AcpPending ||\n event.kind === AgentRealtimeKind.TurnStarted ||\n event.kind === AgentRealtimeKind.TurnEnded;\n\nconst REPLAY_PAGE = 100;\n/**\n * Every recovery rescans this far behind the newest change seen: `updated_at`\n * is a transaction's start time, so a slow write (a lock wait) can commit\n * after newer changes were delivered.\n */\nexport const RECOVERY_SKEW_MS = 30_000;\n\nconst stampOf = (message: ConversationMessageIface): number =>\n Math.max(\n ...[message.updatedAt, message.deletedAt, message.createdAt].map((value) =>\n value == null ? 0 : Date.parse(value) || 0,\n ),\n );\n\n/** The newest copy of a message the stream has emitted (or the caller already had). */\nexport interface MessageVersionIface {\n /** The server's per-message change counter: a total order when both copies carry it. */\n revision: number | null;\n /** `updatedAt` in ms; distinct changes can share a millisecond. */\n updatedAt: number | null;\n /** Newest of updatedAt/deletedAt/createdAt, for messages without `updatedAt`. */\n stamp: number;\n deleted: boolean;\n final: boolean;\n fingerprint: string;\n}\n\nconst isoMs = (value: string | null): number | null => {\n if (value == null) return null;\n const ms = Date.parse(value);\n return Number.isNaN(ms) ? null : ms;\n};\n\nexport const messageVersionOf = (message: ConversationMessageIface): MessageVersionIface => ({\n revision: message.revision,\n updatedAt: isoMs(message.updatedAt),\n stamp: stampOf(message),\n deleted: message.deletedAt != null,\n final: message.streaming?.state === MessageStreamingState.Final,\n fingerprint: JSON.stringify([\n message.deletedAt,\n message.streaming?.state ?? null,\n message.body,\n message.reactions,\n ]),\n});\n\n/**\n * Whether `incoming` is newer than the copy already emitted; older or equal\n * copies are dropped. A deletion is never undone. `revision` orders copies\n * when both carry it. Otherwise `updatedAt` does, where a finalized reply\n * beats a streaming copy from the same millisecond; without either, a later\n * change time wins, a finalized reply is never undone by a copy at the same\n * time, and equal times fall back to content.\n */\nexport const isNewerMessageVersion = (\n incoming: MessageVersionIface,\n current: MessageVersionIface | undefined,\n): boolean => {\n if (current == null) return true;\n if (current.deleted && !incoming.deleted) return false;\n if (incoming.revision != null && current.revision != null) {\n return incoming.revision > current.revision;\n }\n if (incoming.updatedAt != null && current.updatedAt != null) {\n if (incoming.updatedAt !== current.updatedAt) return incoming.updatedAt > current.updatedAt;\n return incoming.final && !current.final;\n }\n if (incoming.stamp !== current.stamp) return incoming.stamp > current.stamp;\n if (current.final && !incoming.final) return false;\n return incoming.fingerprint !== current.fingerprint;\n};\n\ninterface PendingLiveIface {\n event: AgentRealtimeEvent;\n meta: ConversationEventMetaIface;\n // A transient event whose state was recorded when it arrived (or was recovered);\n // released as is.\n noted: boolean;\n}\n\n/**\n * Live conversation events. On every resubscribe or resync the stream\n * recovers what changed while it was away: messages created *or updated*\n * (including thread replies), scanned in the server's (updated_at, id) order.\n * The first scan starts at the newest change seen minus a skew; every scan\n * ends on the server's change cursor, and the next scan resumes from it, so\n * messages that share an update time are never skipped between pages.\n * Live events that arrive during recovery are held and released after it,\n * and message events are deduped by id and version, so a reconnect neither\n * loses nor repeats a message.\n */\nconst streamConversationEvents = (\n args: ConversationStreamArgsIface,\n): AsyncIterableIterator<ConversationEvent> => {\n const topic = agentRealtimeTopics.conversation(args.conversationId);\n const follow = args.options?.follow ?? true;\n const controller = new AbortController();\n const signal = AbortSignal.any([\n controller.signal,\n args.context.closeSignal,\n ...(args.options?.signal == null ? [] : [args.options.signal]),\n ]);\n const versions = new Map<string, MessageVersionIface>();\n let newestStamp: number | null = null;\n const subscribedAt = Date.now();\n let recoveryFloor: number | null = null;\n let subscribedOnce = false;\n let recovering = 0;\n let recovery: Promise<void> = Promise.resolve();\n const held: PendingLiveIface[] = [];\n const recoverTransientState = args.options?.recoverTransient ?? true;\n // Transient events emitted so far, so live and recovered copies are emitted once.\n // `noted` orders each entry against recovery snapshots (see recoverTransient).\n let transientClock = 0;\n const pendingSeen = new Map<\n string,\n { state: PendingEventState; pending: PendingRequestIface; noted: number }\n >();\n const runningTurns = new Map<string, { turn: TurnStartedEventIface; noted: number }>();\n const endedTurns = new Map<string, true>();\n // The realtime transport reported a retryable error and has not resubscribed since.\n let degraded = false;\n let pollTimer: ReturnType<typeof setTimeout> | null = null;\n const clearPoll = (): void => {\n if (pollTimer != null) clearTimeout(pollTimer);\n pollTimer = null;\n };\n let unsubscribe: (() => void) | null = null;\n let detachAbort: () => void = () => {};\n let detachClose: () => void = () => {};\n const queue = createAsyncQueue<ConversationEvent>(() => {\n controller.abort();\n held.length = 0;\n clearPoll();\n unsubscribe?.();\n detachAbort();\n detachClose();\n });\n const resumeFrom = args.options?.resumeFrom ?? [];\n // Taken when `events()` is called, before subscribing; see recoverFromAnchor.\n const anchor =\n resumeFrom.length === 0 && args.options?.afterSeq == null\n ? args.listMessages({ limit: 1, thread: MessageThreadFilter.All, signal })\n : null;\n // A failed anchor read surfaces through the recovery that awaits it.\n anchor?.catch(() => {});\n for (const message of resumeFrom) {\n versions.set(message.id, messageVersionOf(message));\n newestStamp = Math.max(newestStamp ?? 0, stampOf(message));\n }\n\n /** Emits a message event only when it is newer than every copy of that message emitted so far. */\n const emitMessage = (\n message: ConversationMessageIface,\n meta: ConversationEventMetaIface,\n live: AgentRealtimeEvent | null,\n ): void => {\n const version = messageVersionOf(message);\n const previous = versions.get(message.id);\n if (!isNewerMessageVersion(version, previous)) return;\n versions.set(message.id, version);\n newestStamp = Math.max(newestStamp ?? 0, stampOf(message));\n if (live != null) {\n queue.push({ ...live, ...meta });\n return;\n }\n queue.push(\n previous == null\n ? { kind: AgentRealtimeKind.MessageCreated, message, ...meta }\n : { kind: AgentRealtimeKind.MessageUpdated, message, ...meta },\n );\n };\n\n /** Records a pending event; false when an equal or newer state was already emitted. */\n const notePending = (\n pending: PendingRequestIface,\n state: PendingEventState | WireFallback,\n ): boolean => {\n const seen = pendingSeen.get(pending.id);\n if (state === PendingEventState.Resolved) {\n if (seen?.state === PendingEventState.Resolved) return false;\n transientClock += 1;\n remember(pendingSeen, pending.id, { state, pending, noted: transientClock });\n return true;\n }\n if (state === PendingEventState.Created) {\n if (seen != null) return false;\n transientClock += 1;\n remember(pendingSeen, pending.id, { state, pending, noted: transientClock });\n return true;\n }\n return true;\n };\n\n /** Records a pending or turn event's state; false when it repeats one already emitted. */\n const noteTransient = (event: AgentRealtimeEvent): boolean => {\n if (event.kind === AgentRealtimeKind.AcpPending) return notePending(event.pending, event.state);\n if (event.kind === AgentRealtimeKind.TurnStarted) {\n if (!endedTurns.has(event.turnId)) {\n transientClock += 1;\n remember(runningTurns, event.turnId, { turn: event, noted: transientClock });\n }\n return true;\n }\n if (event.kind === AgentRealtimeKind.TurnEnded) {\n if (endedTurns.has(event.turnId)) return false;\n remember(endedTurns, event.turnId, true);\n runningTurns.delete(event.turnId);\n }\n return true;\n };\n\n const emitLive = (event: AgentRealtimeEvent, meta: ConversationEventMetaIface): void => {\n if (\n event.kind === AgentRealtimeKind.MessageCreated ||\n event.kind === AgentRealtimeKind.MessageUpdated\n ) {\n emitMessage(event.message, meta, event);\n return;\n }\n if (event.kind === AgentRealtimeKind.MessageDeleted) {\n // A deletion outranks every copy up to its time, so a held or replayed older copy cannot restore it.\n const current = versions.get(event.messageId);\n if (current?.deleted === true) return;\n const deletedAt = isoMs(event.deletedAt) ?? current?.stamp ?? 0;\n versions.set(event.messageId, {\n revision: current?.revision ?? null,\n updatedAt: Math.max(current?.updatedAt ?? 0, deletedAt),\n stamp: Math.max(current?.stamp ?? 0, deletedAt),\n deleted: true,\n final: current?.final ?? false,\n fingerprint: current?.fingerprint ?? '',\n });\n }\n if (!noteTransient(event)) return;\n queue.push({ ...event, ...meta });\n };\n\n const replayed = (message: ConversationMessageIface): ConversationEventMetaIface => ({\n topic,\n cursor: null,\n createdAt: message.updatedAt ?? message.createdAt,\n replayed: true,\n });\n\n const emitPage = (messages: ConversationMessageIface[]): void => {\n for (const message of [...messages].sort((left, right) => left.seq - right.seq)) {\n emitMessage(message, replayed(message), null);\n }\n };\n\n /**\n * One change scan, paged by the server's cursor. Every scan starts over from\n * the oldest writer active before the preceding scan (or the newest change\n * minus the skew for older servers), never from the last scan\u2019s cursor:\n * `updated_at` is the writing transaction's start time, so a change can\n * commit after a later one was already seen. Revision ordering drops the\n * repeats the overlap brings back.\n */\n const recoverChanges = async (): Promise<void> => {\n const since = Math.max(\n 0,\n Math.min(newestStamp ?? subscribedAt, recoveryFloor ?? Infinity) - RECOVERY_SKEW_MS,\n );\n let position: { updatedCursor: string } | { updatedAfter: string } = {\n updatedAfter: new Date(since).toISOString(),\n };\n let nextFloor: number | null = null;\n for (;;) {\n const page = await args.listMessages({\n ...position,\n thread: MessageThreadFilter.All,\n limit: REPLAY_PAGE,\n signal,\n });\n if (nextFloor == null && page.recoverySince != null) {\n const stamp = Date.parse(page.recoverySince);\n if (Number.isFinite(stamp)) nextFloor = stamp;\n }\n emitPage(page.messages);\n const next = page.nextUpdatedCursor;\n if (next == null || !page.hasMoreAfter || page.messages.length === 0) {\n recoveryFloor = nextFloor ?? recoveryFloor;\n return;\n }\n position = { updatedCursor: next };\n }\n };\n\n /**\n * With nothing to resume from, the stream anchors on the newest message at\n * the moment `events()` was called and, once subscribed, recovers every\n * change after it. So a message posted between a caller's first page and the\n * gateway registering the subscription still arrives (marked `replayed`).\n */\n const recoverFromAnchor = async (anchor: Promise<ConversationMessagesPageIface>) => {\n const page = await anchor;\n if (page.recoverySince != null) {\n const stamp = Date.parse(page.recoverySince);\n if (Number.isFinite(stamp)) recoveryFloor = stamp;\n }\n const newest = page.messages.reduce<ConversationMessageIface | null>(\n (best, message) => (best == null || message.seq > best.seq ? message : best),\n null,\n );\n if (newest != null && !versions.has(newest.id)) {\n versions.set(newest.id, messageVersionOf(newest));\n newestStamp = Math.max(newestStamp ?? 0, stampOf(newest));\n }\n await recoverChanges();\n };\n\n const recoverAfterSeq = async (afterSeq: number): Promise<void> => {\n let cursor = afterSeq;\n for (;;) {\n const page = await args.listMessages({\n after: cursor,\n thread: MessageThreadFilter.All,\n limit: REPLAY_PAGE,\n signal,\n });\n emitPage(page.messages);\n const next = Math.max(cursor, ...page.messages.map((message) => message.seq));\n if (!page.hasMoreAfter || next === cursor) return;\n cursor = next;\n }\n };\n\n const recoveredMeta = (): ConversationEventMetaIface => ({\n topic,\n cursor: null,\n createdAt: null,\n replayed: true,\n });\n\n /** A read that recovery may skip: retryable failures retry the recovery, others drop the read. */\n const optional = async <Value>(read: () => Promise<Value>): Promise<Value | null> => {\n try {\n return await read();\n } catch (cause) {\n if (isRetryableClientError(cause)) throw cause;\n return null;\n }\n };\n\n // Recovery runs while live events are held: a recovered transient event joins\n // them, so it is released after every live event that arrived before it.\n const emitRecovered = (event: AgentRealtimeEvent): void => {\n held.push({ event, meta: recoveredMeta(), noted: true });\n };\n\n /**\n * Re-reads what only realtime carries (see `recoverTransient`): the open\n * pending requests and turn state of every agent participant's session.\n * Live transient events held during recovery record their state on arrival,\n * so the snapshot settles what was recorded before it was requested, and\n * never a turn or request that arrived live after it.\n */\n const recoverTransient = async (): Promise<void> => {\n if (!recoverTransientState) return;\n const asOf = transientClock;\n const participants = await optional(() => args.listParticipants({ signal }));\n const current =\n participants == null\n ? null\n : new Set(\n participants.flatMap((participant) =>\n participant.kind === ParticipantKind.Agent &&\n participant.sessionId != null &&\n participant.leftAt == null\n ? [participant.sessionId]\n : [],\n ),\n );\n // Sessions the stream holds open state for, including ones whose agent has since left.\n const remembered = new Set([\n ...[...pendingSeen.values()].flatMap((seen) =>\n seen.state === PendingEventState.Created ? [seen.pending.sessionId] : [],\n ),\n ...[...runningTurns.values()].map((entry) => entry.turn.sessionId),\n ]);\n const checked = await Promise.all(\n [...new Set([...(current ?? []), ...remembered])].map(async (sessionId) => {\n const [session, open] = await Promise.all([\n optional(() => args.getSession(sessionId, { signal })),\n optional(() => args.sessionPending(sessionId, { signal })),\n ]);\n // An agent that left: its session is closed, and may no longer be readable.\n const departed = current != null && !current.has(sessionId);\n return {\n sessionId,\n running:\n session == null\n ? departed\n ? false\n : null\n : TURN_OPEN_SESSION_STATES.has(session.state),\n open: open ?? (departed ? [] : null),\n };\n }),\n );\n for (const { sessionId, running, open } of checked) {\n if (open != null) {\n const complete = open.length < SESSION_PENDING_LIMIT;\n const openIds = new Set(open.map((pending) => pending.id));\n for (const pending of open) {\n if (notePending(pending, PendingEventState.Created))\n emitRecovered({\n kind: AgentRealtimeKind.AcpPending,\n pending,\n state: PendingEventState.Created,\n });\n }\n for (const seen of [...pendingSeen.values()]) {\n if (\n !complete ||\n seen.state !== PendingEventState.Created ||\n seen.noted > asOf ||\n seen.pending.sessionId !== sessionId ||\n openIds.has(seen.pending.id)\n )\n continue;\n notePending(seen.pending, PendingEventState.Resolved);\n emitRecovered({\n kind: AgentRealtimeKind.AcpPending,\n pending: seen.pending,\n state: PendingEventState.Resolved,\n });\n }\n }\n if (running !== false) continue;\n for (const { turn, noted } of [...runningTurns.values()]) {\n if (turn.sessionId !== sessionId || noted > asOf) continue;\n runningTurns.delete(turn.turnId);\n remember(endedTurns, turn.turnId, true);\n emitRecovered({\n kind: AgentRealtimeKind.TurnEnded,\n conversationId: turn.conversationId,\n participantId: turn.participantId,\n sessionId: turn.sessionId,\n turnId: turn.turnId,\n stopReason: null,\n });\n }\n }\n };\n\n /** Runs a recovery while holding live events; the cursor is captured now, not when it runs. */\n const scheduleRecovery = (run: () => Promise<void>): void => {\n recovering += 1;\n recovery = recovery\n .then(async () => {\n let delay = 250;\n while (!queue.closed()) {\n try {\n await run();\n return;\n } catch (cause) {\n if (!follow || !isRetryableClientError(cause)) throw cause;\n await new Promise<void>((resolve) => {\n const done = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', done);\n resolve();\n };\n const timer = setTimeout(done, delay);\n if (signal.aborted) done();\n else signal.addEventListener('abort', done, { once: true });\n });\n delay = Math.min(delay * 2, 30_000);\n }\n }\n })\n .then(() => {\n recovering -= 1;\n if (recovering > 0) return;\n for (const entry of held.splice(0)) {\n if (entry.noted) queue.push({ ...entry.event, ...entry.meta });\n else emitLive(entry.event, entry.meta);\n }\n })\n .catch((cause) => queue.fail(cause));\n };\n\n // Reads the newest change when it runs, after any recovery queued before it.\n let newestRecoveryPending = false;\n let newestRecoveryRequested = false;\n const recoverFromNewest = (): void => {\n newestRecoveryRequested = true;\n if (newestRecoveryPending) return;\n newestRecoveryPending = true;\n scheduleRecovery(async () => {\n do {\n newestRecoveryRequested = false;\n await recoverChanges();\n await recoverTransient();\n } while (newestRecoveryRequested && !queue.closed());\n newestRecoveryPending = false;\n });\n };\n\n let initialRecoveryStarted = false;\n /** What the first subscription (or, while realtime is down, the first poll) recovers. */\n const startInitialRecovery = (): void => {\n if (initialRecoveryStarted) return;\n initialRecoveryStarted = true;\n const afterSeq = args.options?.afterSeq;\n if (afterSeq != null) scheduleRecovery(() => recoverAfterSeq(afterSeq));\n if (resumeFrom.length > 0) recoverFromNewest();\n if (anchor != null)\n scheduleRecovery(async () => {\n try {\n await recoverFromAnchor(anchor);\n } catch (cause) {\n if (!isRetryableClientError(cause)) throw cause;\n // A later anchor could hide messages written during the outage.\n await recoverChanges();\n }\n });\n // recoverFromNewest recovers transient state itself.\n if (resumeFrom.length === 0) scheduleRecovery(recoverTransient);\n };\n\n // HTTP polling while the realtime transport reports errors.\n const poll = (): void => {\n pollTimer = null;\n if (!degraded || queue.closed()) return;\n if (initialRecoveryStarted) recoverFromNewest();\n else startInitialRecovery();\n void recovery.then(() => {\n if (!degraded || queue.closed() || pollTimer != null) return;\n pollTimer = setTimeout(poll, args.context.timing.conversationPollIntervalMs);\n });\n };\n\n const onFrame = (raw: RealtimeTransportFrameIface): void => {\n const frame = agentRealtimeFrameSchema.safeParse(raw);\n if (!frame.success || queue.closed()) return;\n switch (frame.data.type) {\n case AgentRealtimeFrameType.Event: {\n const envelope = frame.data;\n const entry = {\n event: parseAgentRealtimeEvent(envelope),\n meta: {\n topic: envelope.topic,\n cursor: envelope.cursor,\n createdAt: envelope.createdAt,\n replayed: false,\n },\n };\n if (recovering > 0) {\n // Ending explicitly preserves transient events; a caller can reopen and recover messages.\n if (held.length >= 1024) {\n queue.fail(\n clientError({\n code: ClientErrorCode.Network,\n status: 0,\n message: 'Conversation recovery buffer is full; reconnect from the last message.',\n }),\n );\n return;\n }\n // Transient events record their state now, so recovery reconciles them.\n if (isTransientEvent(entry.event)) {\n if (noteTransient(entry.event)) held.push({ ...entry, noted: true });\n } else held.push({ ...entry, noted: false });\n } else emitLive(entry.event, entry.meta);\n return;\n }\n case AgentRealtimeFrameType.Subscribed: {\n degraded = false;\n clearPoll();\n if (!subscribedOnce) {\n subscribedOnce = true;\n // Polls during an outage before the first subscription already ran the initial recovery.\n if (initialRecoveryStarted) recoverFromNewest();\n else startInitialRecovery();\n } else {\n recoverFromNewest();\n args.options?.onResubscribed?.();\n }\n if (!follow) void recovery.then(() => queue.end());\n return;\n }\n case AgentRealtimeFrameType.ResyncRequired:\n recoverFromNewest();\n args.options?.onResubscribed?.();\n return;\n case AgentRealtimeFrameType.Error:\n if (isTerminalRealtimeError(frame.data)) {\n queue.fail(\n realtimeSubscriptionError({\n topic: frame.data.topic ?? topic,\n code: frame.data.code ?? 'unknown',\n message: frame.data.message ?? 'Realtime subscription was refused',\n }),\n );\n return;\n }\n // Retryable: the transport resubscribes (and its `subscribed` runs recovery);\n // meanwhile the stream recovers over HTTP. A non-following stream ends once\n // that recovery is current.\n if (!follow) {\n if (subscribedOnce) return;\n subscribedOnce = true;\n startInitialRecovery();\n void recovery.then(() => queue.end());\n return;\n }\n if (!degraded) {\n degraded = true;\n poll();\n }\n return;\n default:\n return;\n }\n };\n\n detachAbort = failOnAbort(queue, signal);\n detachClose = failOnAbort(queue, args.context.closeSignal);\n if (!queue.closed()) {\n const subscribeOptions =\n args.options?.afterCursor == null ? undefined : { afterCursor: args.options.afterCursor };\n const stop = args.context.realtime().subscribe(topic, onFrame, subscribeOptions);\n if (queue.closed()) stop();\n else unsubscribe = stop;\n }\n return queue.iterator;\n};\n\nexport const createConversationHandle = (\n context: ClientContextIface,\n conversationId: string,\n): ConversationHandleIface => {\n const { http } = context;\n\n const sandboxFileContentRequest = async (\n args: SandboxFileContentArgsIface,\n ): Promise<SandboxFileContentRequestIface> => {\n if (args.path.length === 0 || args.path.length > 4096 || args.path.includes('\\0')) {\n throw clientError({\n message: 'Invalid sandbox file path',\n status: 0,\n code: ClientErrorCode.InvalidRequest,\n });\n }\n const target = http.url(\n conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/file/content`),\n );\n target.searchParams.set('path', args.path);\n if (args.snapshotId != null) target.searchParams.set('snapshotId', args.snapshotId);\n if (args.download != null) target.searchParams.set('download', String(args.download));\n const headers = await http.headers();\n if (args.range != null) headers.range = args.range;\n return {\n url: target.toString(),\n headers,\n credentials: http.usesCookies ? 'include' : 'omit',\n };\n };\n\n const listMessages = (options: ListMessagesOptionsIface = {}) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/messages'),\n query: {\n before: options.before,\n after: options.after,\n limit: options.limit,\n thread: options.thread,\n updatedAfter: options.updatedAfter,\n updatedCursor: options.updatedCursor,\n },\n response: conversationMessagesPageSchema,\n signal: options.signal,\n });\n\n const listParticipants = async (options: SignalOptionsIface) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/participants'),\n response: participantListSchema,\n signal: options.signal,\n })\n ).participants;\n\n const getSession = (sessionId: string, options: SignalOptionsIface) =>\n http.request({\n method: HttpMethod.Get,\n path: `/v1/sessions/${encodePath(sessionId)}`,\n response: sessionSchema,\n signal: options.signal,\n });\n\n const sessionPending = async (sessionId: string, options: SignalOptionsIface) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: `/v1/sessions/${encodePath(sessionId)}/pending`,\n response: pendingRequestListSchema,\n signal: options.signal,\n })\n ).pending;\n\n const reaction = async (args: {\n method: HttpMethod;\n messageId: string;\n emoji: string;\n signal?: AbortSignal;\n }): Promise<ReactionIface[]> =>\n (\n await http.request({\n method: args.method,\n path: messagePath(conversationId, args.messageId, '/reactions'),\n body: { schema: reactionRequestSchema, value: { emoji: args.emoji } },\n response: reactionsResponseSchema,\n signal: args.signal,\n })\n ).reactions;\n\n return {\n id: conversationId,\n info: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId),\n response: conversationSchema,\n signal: options?.signal,\n }),\n send: async (content, options) => {\n const sent = await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/messages'),\n body: {\n schema: sendMessageRequestSchema,\n value: {\n content,\n clientMessageId: options?.clientMessageId ?? context.newKey(),\n replyTo: options?.replyTo,\n threadRootId: options?.threadRootId,\n quotes: options?.quotes,\n mentions: options?.mentions,\n attachmentIds: options?.attachmentIds,\n clientSubmittedAtMs: options?.clientSubmittedAtMs ?? context.now(),\n },\n },\n response: sendMessageResponseSchema,\n signal: options?.signal,\n });\n return {\n message: sent.message,\n messageId: sent.message.id,\n seq: sent.message.seq,\n deliveries: sent.deliveries,\n };\n },\n events: (options) =>\n streamConversationEvents({\n context,\n conversationId,\n options,\n listMessages,\n listParticipants,\n getSession,\n sessionPending,\n }),\n messages: (options) => listMessages(options),\n deliveries: async (args, options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: `${messagePath(conversationId, args.messageId)}/deliveries`,\n response: messageDeliveriesSchema,\n signal: options?.signal,\n })\n ).deliveries,\n message: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: messagePath(conversationId, args.messageId),\n response: conversationMessageSchema,\n signal: options?.signal,\n }),\n react: (args, options) =>\n reaction({ method: HttpMethod.Post, ...args, signal: options?.signal }),\n unreact: (args, options) =>\n reaction({ method: HttpMethod.Delete, ...args, signal: options?.signal }),\n markThreadRead: async ({ rootId, throughSeq }, options) => {\n await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, `/threads/${encodePath(rootId)}/read`),\n body: { schema: markReadRequestSchema, value: { throughSeq } },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n postEvent: async (event, options) => {\n const sent = await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/events'),\n body: { schema: postConversationEventRequestSchema, value: event },\n response: sendMessageResponseSchema,\n signal: options?.signal,\n });\n return {\n message: sent.message,\n messageId: sent.message.id,\n seq: sent.message.seq,\n deliveries: sent.deliveries,\n };\n },\n typing: async (args, options) => {\n await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/typing'),\n body: { schema: typingRequestSchema, value: args },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n recordPushOpen: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(\n conversationId,\n `/push-deliveries/${encodeURIComponent(args.deliveryId)}/open`,\n ),\n response: pushDeliveryOpenResponseSchema,\n signal: options?.signal,\n }),\n markRead: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/read'),\n body: { schema: markReadRequestSchema, value: args },\n response: readStateSchema,\n signal: options?.signal,\n }),\n respond: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/respond'),\n body: {\n schema: respondPendingRequestSchema,\n value: { pendingId: args.pendingId, outcome: outcomeOf(args) },\n },\n response: respondPendingResponseSchema,\n signal: options?.signal,\n context: { pendingId: args.pendingId },\n }),\n cancel: async (options) => {\n await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/cancel'),\n body: {\n schema: cancelConversationRequestSchema,\n value: { reason: options?.reason, throughMessageSeq: options?.throughMessageSeq },\n },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n participants: (options) => listParticipants({ signal: options?.signal }),\n turns: async (options) => {\n const participants = await listParticipants({ signal: options?.signal });\n return Promise.all(\n participants.flatMap((participant) => {\n const sessionId = participant.sessionId;\n if (participant.kind !== ParticipantKind.Agent || sessionId == null) return [];\n return [\n getSession(sessionId, { signal: options?.signal }).then(\n (session): ConversationAgentTurnIface => ({\n participantId: participant.id,\n sessionId,\n state: session.state,\n running: TURN_OPEN_SESSION_STATES.has(session.state),\n }),\n ),\n ];\n }),\n );\n },\n addParticipant: (participant, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/participants'),\n body: { schema: participantInputSchema, value: participant },\n response: participantSchema,\n signal: options?.signal,\n }),\n updateParticipant: ({ participantId, ...patch }, options) =>\n http.request({\n method: HttpMethod.Patch,\n path: conversationPath(conversationId, `/participants/${encodePath(participantId)}`),\n body: { schema: updateParticipantRequestSchema, value: patch },\n response: participantSchema,\n signal: options?.signal,\n }),\n removeParticipant: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(conversationId, '/participants'),\n body: { schema: removeParticipantRequestSchema, value: args },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n update: (patch, options) =>\n http.request({\n method: HttpMethod.Patch,\n path: conversationPath(conversationId),\n body: { schema: updateConversationRequestSchema, value: patch },\n response: conversationSchema,\n signal: options?.signal,\n }),\n delete: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: messagePath(conversationId, args.messageId),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n links: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/links'),\n response: conversationLinkListSchema,\n signal: options?.signal,\n })\n ).links,\n parentLinks: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/parent-links'),\n response: conversationLinkListSchema,\n signal: options?.signal,\n })\n ).links,\n link: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/links'),\n body: { schema: createConversationLinkRequestSchema, value: args },\n response: conversationLinkSchema,\n signal: options?.signal,\n }),\n unlink: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(conversationId, `/links/${encodePath(args.linkId)}`),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n attachmentUrl: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/attachments/${encodePath(args.attachmentId)}`),\n response: attachmentDownloadSchema,\n signal: options?.signal,\n }),\n sandboxes: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/sandboxes'),\n response: conversationSandboxListSchema,\n signal: options?.signal,\n })\n ).sandboxes,\n sandboxFiles: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/files`),\n query: { path: args.path, snapshotId: args.snapshotId },\n response: sandboxDirectorySchema,\n signal: options?.signal,\n }),\n sandboxPath: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/path`),\n query: { path: args.path, snapshotId: args.snapshotId },\n response: sandboxPathSchema,\n signal: options?.signal,\n }),\n searchSandboxFiles: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/files/search`,\n ),\n query: { path: args.path, query: args.query, limit: args.limit },\n response: sandboxSearchSchema,\n signal: options?.signal,\n }),\n sandboxFile: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/file`),\n query: {\n path: args.path,\n offset: args.offset,\n length: args.length,\n snapshotId: args.snapshotId,\n },\n response: sandboxFileSchema,\n signal: options?.signal,\n }),\n sandboxFileContentRequest,\n openSandboxEditor: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/editor`),\n response: sandboxEditorSessionSchema,\n signal: options?.signal,\n }),\n refreshSandboxEditor: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/editor/${encodePath(args.editorId)}/refresh`,\n ),\n body: {\n schema: sandboxEditorAuthorizationSchema,\n value: { authorizationId: args.authorizationId },\n },\n response: sandboxEditorSessionSchema,\n signal: options?.signal,\n }),\n closeSandboxEditor: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/editor/${encodePath(args.editorId)}`,\n ),\n body: {\n schema: sandboxEditorAuthorizationSchema,\n value: { authorizationId: args.authorizationId },\n },\n response: okResponseSchema,\n signal: options?.signal,\n keepalive: options?.keepalive,\n });\n },\n sandboxFileContent: async (args, options) => {\n const request = await sandboxFileContentRequest(args);\n let response: Response;\n try {\n response = await http.fetch(request.url, {\n method: HttpMethod.Get,\n headers: request.headers,\n credentials: request.credentials,\n signal: options?.signal,\n });\n } catch (cause) {\n if (options?.signal?.aborted === true) throw cause;\n throw clientError({\n message: 'Sandbox file request failed',\n status: 0,\n code: ClientErrorCode.Network,\n cause,\n });\n }\n if (!response.ok) {\n let text: string;\n try {\n text = await response.text();\n } catch (cause) {\n if (options?.signal?.aborted === true) throw cause;\n throw clientError({\n message: 'Sandbox file response failed',\n status: 0,\n code: ClientErrorCode.Network,\n cause,\n });\n }\n throw errorFromResponse({ status: response.status, text, context: undefined });\n }\n return response;\n },\n inspectSandboxProcesses: (args, options) => {\n const request = processInspectionRequestSchema.parse(args.request);\n const { operation } = request;\n const suffix =\n operation === ProcessInspectionOperation.Available\n ? '/available'\n : 'processId' in request\n ? '/' + encodePath(request.processId)\n : '';\n const query: NonNullable<HttpRequestArgsIface<ProcessInspectionResultIface>['query']> = {};\n if ('bootId' in request) query.bootId = request.bootId;\n if ('cursor' in request) query.cursor = request.cursor;\n if ('limit' in request) query.limit = request.limit;\n return http.request({\n method: operation === ProcessInspectionOperation.Stop ? HttpMethod.Delete : HttpMethod.Get,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/processes${suffix}`,\n ),\n query,\n response: processInspectionResultSchema,\n signal: options?.signal,\n });\n },\n sandboxPreview: (args, options) => {\n const request: HttpRequestArgsIface<SandboxPreviewType> = {\n method: args.viewOnly === false ? HttpMethod.Post : HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/preview`),\n response: sandboxPreviewSchema,\n signal: options?.signal,\n };\n if (args.viewOnly === false)\n request.body = { schema: sandboxPreviewOptionsSchema, value: { viewOnly: false } };\n return http.request(request);\n },\n wakeSandbox: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/wake`),\n response: conversationSandboxSchema,\n signal: options?.signal,\n }),\n schedules: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/schedules'),\n response: conversationScheduleListSchema,\n signal: options?.signal,\n })\n ).schedules,\n createSchedule: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/schedules'),\n body: { schema: createConversationScheduleRequestSchema, value: args },\n response: conversationScheduleSchema,\n signal: options?.signal,\n }),\n updateSchedule: ({ scheduleId, ...patch }, options) =>\n http.request({\n method: HttpMethod.Patch,\n path: conversationPath(conversationId, `/schedules/${encodePath(scheduleId)}`),\n body: { schema: updateConversationScheduleRequestSchema, value: patch },\n response: conversationScheduleSchema,\n signal: options?.signal,\n }),\n deleteSchedule: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(conversationId, `/schedules/${encodePath(args.scheduleId)}`),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n uploadAttachment: async (args) => {\n const sizeBytes = 'byteLength' in args.data ? args.data.byteLength : args.data.size;\n const upload = await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/attachments'),\n body: {\n schema: createAttachmentUploadRequestSchema,\n value: { name: args.name, contentType: args.contentType, sizeBytes },\n },\n response: attachmentUploadSchema,\n signal: args.signal,\n });\n // Presigned upload: storage authenticates the URL, so it gets only the headers the\n // presign requires, through storageFetch, never the API fetch or its credentials.\n const response = await context.storageFetch(upload.uploadUrl, {\n method: upload.method,\n headers: { 'content-type': args.contentType, ...upload.headers },\n body: args.data,\n signal: args.signal,\n credentials: 'omit',\n });\n if (!response.ok) {\n throw clientError({\n message: `Attachment upload failed with status ${response.status}`,\n status: response.status,\n code: ClientErrorCode.UploadFailed,\n body: await response.text(),\n });\n }\n return upload;\n },\n };\n};\n\nexport const createConversationsApi = (context: ClientContextIface): ConversationsApiIface => {\n const opened = (conversation: ConversationIface): OpenedConversationIface => ({\n ...createConversationHandle(context, conversation.id),\n conversation,\n });\n return {\n list: (options) =>\n context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations',\n query: {\n cursor: options?.cursor,\n limit: options?.limit,\n includeArchived: options?.includeArchived,\n },\n response: conversationListSchema,\n signal: options?.signal,\n }),\n direct: async (args) =>\n opened(\n await context.http.request({\n method: HttpMethod.Post,\n path: '/v1/conversations/direct',\n body: { schema: createDirectConversationRequestSchema, value: { agent: args.agent } },\n response: conversationSchema,\n signal: args.signal,\n }),\n ),\n home: async (options) =>\n opened(\n await context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations/home',\n response: conversationSchema,\n signal: options?.signal,\n }),\n ),\n create: async (args) =>\n opened(\n await context.http.request({\n method: HttpMethod.Post,\n path: '/v1/conversations',\n body: {\n schema: createConversationRequestSchema,\n value: {\n kind: args.kind,\n title: args.title,\n participants: args.participants,\n turnPolicy: args.turnPolicy,\n },\n },\n response: conversationSchema,\n signal: args.signal,\n }),\n ),\n get: (conversationId) => createConversationHandle(context, conversationId),\n search: (args) =>\n context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations/search',\n query: {\n q: args.q,\n conversationId: args.conversationId,\n cursor: args.cursor,\n limit: args.limit,\n },\n response: searchMessagesPageSchema,\n signal: args.signal,\n }),\n listEvents: (options) =>\n streamCollectionEvents({\n context,\n topicFor: agentRealtimeTopics.userConversations,\n collection: ClientCollection.Conversations,\n options,\n }),\n decisions: (options) =>\n context.http.request({\n method: HttpMethod.Get,\n path: '/v1/decisions',\n query: { cursor: options?.cursor, limit: options?.limit },\n response: decisionsPageSchema,\n signal: options?.signal,\n }),\n };\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n ProcessInspectionOperation,\n processInspectionRequestSchema,\n processInspectionResultSchema,\n type ProcessInspectionRequestIface,\n type ProcessInspectionResultIface,\n} from '@finalai/agent-protocol';\nimport {\n agentRealtimeFrameSchema,\n AgentRealtimeFrameType,\n AgentRealtimeKind,\n agentRealtimeTopics,\n AgentSessionState,\n attachmentDownloadSchema,\n attachmentUploadSchema,\n cancelConversationRequestSchema,\n conversationLinkListSchema,\n conversationLinkSchema,\n conversationListSchema,\n conversationMessageSchema,\n conversationMessagesPageSchema,\n conversationSandboxListSchema,\n conversationSandboxSchema,\n conversationScheduleListSchema,\n conversationScheduleSchema,\n conversationSchema,\n createAttachmentUploadRequestSchema,\n createConversationLinkRequestSchema,\n createConversationRequestSchema,\n createConversationScheduleRequestSchema,\n createDirectConversationRequestSchema,\n decisionsPageSchema,\n markReadRequestSchema,\n messageDeliveriesSchema,\n MessageStreamingState,\n MessageThreadFilter,\n okResponseSchema,\n parseAgentRealtimeEvent,\n participantInputSchema,\n ParticipantKind,\n participantListSchema,\n participantSchema,\n PendingEventState,\n pendingRequestListSchema,\n postConversationEventRequestSchema,\n postConversationEventResponseSchema,\n type PostConversationEventResponseIface,\n pushDeliveryOpenResponseSchema,\n reactionRequestSchema,\n reactionsResponseSchema,\n readStateSchema,\n removeParticipantRequestSchema,\n respondPendingRequestSchema,\n respondPendingResponseSchema,\n sandboxDirectorySchema,\n sandboxEditorAuthorizationSchema,\n sandboxEditorSessionSchema,\n sandboxFileSchema,\n sandboxPathSchema,\n sandboxPreviewOptionsSchema,\n sandboxPreviewSchema,\n sandboxSearchSchema,\n searchMessagesPageSchema,\n sendMessageRequestSchema,\n sendMessageResponseSchema,\n sessionSchema,\n typingRequestSchema,\n updateConversationRequestSchema,\n updateConversationScheduleRequestSchema,\n updateParticipantRequestSchema,\n type AgentRealtimeEvent,\n type AgentRealtimeEventOf,\n type AgentSessionIface,\n type AgentTurnPolicy,\n type AttachmentDownloadIface,\n type AttachmentUploadIface,\n type ContentInput,\n type ConversationIface,\n type ConversationKind,\n type ConversationLinkIface,\n type ConversationListIface,\n type ConversationMessageIface,\n type ConversationMessagesPageIface,\n type ConversationSandboxIface,\n type ConversationScheduleIface,\n type CreateConversationScheduleRequestIface,\n type DecisionsPageIface,\n type MessageDeliveryIface,\n type ParticipantIface,\n type ParticipantInput,\n type PendingRequestIface,\n type PostConversationEventRequestIface,\n type ReactionIface,\n type ReadStateIface,\n type RespondPendingResponseIface,\n type SandboxDirectoryIface,\n type SandboxEditorSessionIface,\n type SandboxFileIface,\n type SandboxPathIface,\n type SandboxPreviewType,\n type SandboxSearchIface,\n type SearchMessagesPageIface,\n type UpdateConversationRequestIface,\n type UpdateConversationScheduleRequestIface,\n type UpdateParticipantRequestIface,\n type WireFallback,\n} from '@finalai/agent-protocol/agent-platform';\nimport { createAsyncQueue, failOnAbort } from \"./async-queue.mjs\";\nimport {\n streamCollectionEvents,\n type CollectionEvent,\n type CollectionEventsOptionsIface,\n} from \"./collection-events.mjs\";\nimport {\n ClientCollection,\n encodePath,\n type ClientContextIface,\n type EnumInput,\n type SignalOptionsIface,\n} from \"./context.mjs\";\nimport {\n clientError,\n ClientErrorCode,\n isRetryableClientError,\n isTerminalRealtimeError,\n realtimeSubscriptionError,\n} from \"./errors.mjs\";\nimport { errorFromResponse, HttpMethod, type HttpRequestArgsIface } from \"./http.mjs\";\nimport type { RealtimeTransportFrameIface } from \"./realtime.mjs\";\nimport { outcomeOf, type RespondArgs } from \"./sessions.mjs\";\n\nexport interface SandboxFileContentArgsIface {\n snapshotId?: string;\n bindingId: string;\n path: string;\n download?: boolean;\n /** One HTTP byte range, for example `bytes=1024-2047`. */\n range?: string;\n}\n\nexport interface SandboxFileContentRequestIface {\n url: string;\n /** Supply these to native download/media clients; never put bearer tokens in URLs. */\n headers: Record<string, string>;\n credentials: RequestCredentials;\n}\n\nexport interface ConversationEventMetaIface {\n topic: string;\n cursor: string | null;\n createdAt: string | null;\n /** True for messages the SDK fetched over HTTP to fill a realtime gap. */\n replayed: boolean;\n}\n\n/** A realtime event of the conversation topic, flattened (`event.message`, `event.pending`). */\nexport type ConversationEvent = AgentRealtimeEvent & ConversationEventMetaIface;\n\nexport interface ConversationEventsOptionsIface extends SignalOptionsIface {\n /** Keep streaming; false ends once the subscription is current. Defaults to true. */\n follow?: boolean;\n /** Also replay messages (thread replies included) after this conversation seq when the subscription opens. */\n afterSeq?: number;\n /** Gateway cursor to resume the topic after. */\n afterCursor?: string;\n /**\n * Messages the caller already has (an earlier stream or page). On the first\n * subscription the stream recovers everything created or updated since the\n * newest of them, thread replies included, and skips the versions given, so\n * a client resuming a conversation it rendered before is left with no gap.\n */\n resumeFrom?: readonly ConversationMessageIface[];\n /**\n * Called on every resubscribe (after the first) and resync, as the stream\n * starts recovering messages. State that messages cannot reconstruct, such\n * as whether an agent's turn ended without a reply, is the caller's to re-read.\n */\n onResubscribed?: () => void;\n /**\n * Also recover what only realtime carries (default true). On every\n * (re)subscribe, resync and fallback poll the stream re-reads the open\n * permission and elicitation requests of the conversation's agent sessions\n * and emits replayed `acp.pending` events: `created` for an open request it\n * has not emitted, `resolved` for one it emitted open that no longer is. And\n * for every turn it saw start whose session is no longer running, it emits a\n * replayed `conversation.turn.ended` (stop reason null). Turns that started\n * and ended while it was away arrive only as messages.\n */\n recoverTransient?: boolean;\n // While the realtime transport reports errors, a following stream polls the\n // same recovery every `timing.pollIntervalMs` until it is subscribed again.\n // Without `resumeFrom` or `afterSeq`, the stream reads the newest message when it is\n // called and, once subscribed, recovers every change after it (thread replies included),\n // so nothing posted while the subscription registers is lost.\n}\n\nexport interface SendMessageOptionsIface extends SignalOptionsIface {\n clientMessageId?: string;\n replyTo?: string;\n threadRootId?: string;\n /** Ids of earlier messages in the conversation to quote, in order. */\n quotes?: string[];\n /** Mentioned participant ids. */\n mentions?: string[];\n attachmentIds?: string[];\n /** When the person submitted, for the prompt-to-inference trace; defaults to now. */\n clientSubmittedAtMs?: number;\n}\n\nexport type ParticipantCreateInput =\n | { user: string }\n | {\n agent: string;\n routingMode?: EnumInput<\n NonNullable<Extract<ParticipantInput, { agent: string }>['routingMode']>\n >;\n };\n\nexport interface SentMessageIface {\n message: ConversationMessageIface;\n messageId: string;\n seq: number;\n /** One entry per agent participant the message was routed to. */\n deliveries: MessageDeliveryIface[];\n}\n\nexport interface ListMessagesOptionsIface extends SignalOptionsIface {\n before?: number;\n after?: number;\n limit?: number;\n /** Thread root message id, or `MessageThreadFilter.All` for the timeline plus every thread. */\n thread?: string;\n /** ISO instant: messages created or updated after it (the first page of a change scan). */\n updatedAfter?: string;\n /** A previous page's `nextUpdatedCursor`: continue the change scan after it. */\n updatedCursor?: string;\n}\n\nexport interface UploadAttachmentArgsIface extends SignalOptionsIface {\n name: string;\n contentType: string;\n data: Blob | ArrayBuffer;\n}\n\nexport interface ConversationHandleIface {\n /** Durable accepted prompt receipts for a message, including queued deliveries once admitted. */\n deliveries: (\n args: { messageId: string },\n options?: SignalOptionsIface,\n ) => Promise<MessageDeliveryIface[]>;\n\n id: string;\n info: (options?: SignalOptionsIface) => Promise<ConversationIface>;\n send: (content: ContentInput, options?: SendMessageOptionsIface) => Promise<SentMessageIface>;\n events: (options?: ConversationEventsOptionsIface) => AsyncIterableIterator<ConversationEvent>;\n messages: (options?: ListMessagesOptionsIface) => Promise<ConversationMessagesPageIface>;\n /** One message by id (`GET /v1/conversations/:id/messages/:messageId`), e.g. a thread root. */\n message: (\n args: { messageId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationMessageIface>;\n react: (\n args: { messageId: string; emoji: string },\n options?: SignalOptionsIface,\n ) => Promise<ReactionIface[]>;\n unreact: (\n args: { messageId: string; emoji: string },\n options?: SignalOptionsIface,\n ) => Promise<ReactionIface[]>;\n recordPushOpen: (\n args: { deliveryId: string },\n options?: SignalOptionsIface,\n ) => Promise<{ recorded: boolean }>;\n markRead: (args: { throughSeq: number }, options?: SignalOptionsIface) => Promise<ReadStateIface>;\n /**\n * Marks a thread read through one of its replies' seq and follows it\n * (`POST \u2026/threads/:rootId/read`); the conversation's own unread count\n * moves with `markRead`.\n */\n markThreadRead: (\n args: { rootId: string; throughSeq: number },\n options?: SignalOptionsIface,\n ) => Promise<void>;\n /**\n * Tells the other members the caller is typing (`POST \u2026/typing`), realtime\n * only. A `true` lapses on its own after a few seconds, so composers repeat\n * it while typing continues and send `false` when the draft is sent or cleared.\n */\n typing: (args: { typing: boolean }, options?: SignalOptionsIface) => Promise<void>;\n /**\n * Hands something that happened outside the conversation (`POST \u2026/events`)\n * to its Default agent as input from you, not as a message: the agent's\n * reply carries the source as its caption. The same `eventId` from the same\n * source is accepted once; the receipt says whether the agent was prompted.\n */\n postEvent: (\n event: PostConversationEventRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<PostConversationEventResponseIface>;\n respond: (\n args: RespondArgs,\n options?: SignalOptionsIface,\n ) => Promise<RespondPendingResponseIface>;\n /** Stops the agents' running turns in this conversation. */\n cancel: (\n options?: SignalOptionsIface & { reason?: string; throughMessageSeq?: number },\n ) => Promise<void>;\n participants: (options?: SignalOptionsIface) => Promise<ParticipantIface[]>;\n /**\n * Each agent participant's session state, read now: whether a turn is\n * running in it. What a client re-reads when it may have missed a\n * `conversation.turn.ended` (`events()` reconciles the turns it saw itself).\n */\n turns: (options?: SignalOptionsIface) => Promise<ConversationAgentTurnIface[]>;\n addParticipant: (\n participant: ParticipantCreateInput,\n options?: SignalOptionsIface,\n ) => Promise<ParticipantIface>;\n /**\n * Changes an agent's routing mode (owners and admins) or a person's role\n * (owners, groups only; the last owner cannot step down). One field per call.\n */\n updateParticipant: (\n args: { participantId: string } & Omit<\n UpdateParticipantRequestIface,\n 'routingMode' | 'role'\n > & {\n routingMode?: EnumInput<NonNullable<UpdateParticipantRequestIface['routingMode']>>;\n role?: EnumInput<NonNullable<UpdateParticipantRequestIface['role']>>;\n },\n options?: SignalOptionsIface,\n ) => Promise<ParticipantIface>;\n removeParticipant: (\n args: { participantId: string },\n options?: SignalOptionsIface,\n ) => Promise<void>;\n update: (\n patch: UpdateConversationRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationIface>;\n delete: (args: { messageId: string }, options?: SignalOptionsIface) => Promise<void>;\n uploadAttachment: (args: UploadAttachmentArgsIface) => Promise<AttachmentUploadIface>;\n /**\n * A fresh presigned download URL for one attachment\n * (`GET /v1/conversations/:id/attachments/:attachmentId`). URLs on messages\n * expire; resolve through this before opening one that may be stale.\n */\n attachmentUrl: (\n args: { attachmentId: string },\n options?: SignalOptionsIface,\n ) => Promise<AttachmentDownloadIface>;\n /**\n * The conversation's sandboxes (the computer tile): status, capabilities and\n * whether a preview is available (`GET /v1/conversations/:id/sandboxes`).\n * Never starts a parked sandbox.\n */\n sandboxes: (options?: SignalOptionsIface) => Promise<ConversationSandboxIface[]>;\n /** One directory of a running sandbox, confined to its workspace (`\u2026/sandboxes/:bindingId/files`). */\n sandboxFiles: (\n args: { bindingId: string; path?: string; snapshotId?: string },\n options?: SignalOptionsIface,\n ) => Promise<SandboxDirectoryIface>;\n /** Resolves a file or directory without waking its sandbox. */\n sandboxPath: (\n args: { bindingId: string; path?: string; snapshotId?: string },\n options?: SignalOptionsIface,\n ) => Promise<SandboxPathIface>;\n /** Bounded recursive path search; truncated signals incomplete traversal. */\n searchSandboxFiles: (\n args: { bindingId: string; path?: string; query: string; limit?: number },\n options?: SignalOptionsIface,\n ) => Promise<SandboxSearchIface>;\n /** A byte range of a file in a running sandbox, at most 1 MiB (`\u2026/sandboxes/:bindingId/file`). */\n sandboxFile: (\n args: {\n bindingId: string;\n path: string;\n offset?: number;\n length?: number;\n snapshotId?: string;\n },\n options?: SignalOptionsIface,\n ) => Promise<SandboxFileIface>;\n inspectSandboxProcesses(\n args: { bindingId: string; request: ProcessInspectionRequestIface },\n options?: SignalOptionsIface,\n ): Promise<ProcessInspectionResultIface>;\n /** Opens a provider editor for an existing workspace, with write authorization. */\n openSandboxEditor(\n args: { bindingId: string },\n options?: SignalOptionsIface,\n ): Promise<SandboxEditorSessionIface>;\n refreshSandboxEditor(\n args: { bindingId: string; editorId: string; authorizationId: string },\n options?: SignalOptionsIface,\n ): Promise<SandboxEditorSessionIface>;\n closeSandboxEditor(\n args: { bindingId: string; editorId: string; authorizationId: string },\n options?: SignalOptionsIface & { keepalive?: boolean },\n ): Promise<void>;\n /** Raw streaming bytes (`\u2026/file/content`). The caller consumes or cancels the response body. */\n sandboxFileContent: (\n args: SandboxFileContentArgsIface,\n options?: SignalOptionsIface,\n ) => Promise<Response>;\n /**\n * An authenticated request for a browser/native media or download client.\n * Cookie clients can use the URL directly; bearer clients must supply headers.\n * Every request rechecks membership and confinement; never wakes the sandbox.\n */\n sandboxFileContentRequest: (\n args: SandboxFileContentArgsIface,\n ) => Promise<SandboxFileContentRequestIface>;\n /** A short-lived screen preview of a running sandbox; 404 when it serves none (`\u2026/preview`). */\n sandboxPreview: (\n args: { bindingId: string; viewOnly?: boolean },\n options?: SignalOptionsIface,\n ) => Promise<SandboxPreviewType>;\n /** Starts a parked sandbox (conversation owners and admins; `POST \u2026/wake`). */\n wakeSandbox: (\n args: { bindingId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationSandboxIface>;\n /** The conversation's runtime schedules: reminders and recurring checks (`GET \u2026/schedules`). */\n schedules: (options?: SignalOptionsIface) => Promise<ConversationScheduleIface[]>;\n /**\n * Creates a schedule owned by one agent participant (`POST \u2026/schedules`).\n * Agents create their own; people need to be conversation owners or admins.\n */\n createSchedule: (\n args: CreateConversationScheduleRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationScheduleIface>;\n /** Changes a schedule (its agent, or conversation owners and admins; `PATCH \u2026/schedules/:id`). */\n updateSchedule: (\n args: { scheduleId: string } & UpdateConversationScheduleRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationScheduleIface>;\n /** Deletes a schedule (`DELETE \u2026/schedules/:id`). */\n deleteSchedule: (args: { scheduleId: string }, options?: SignalOptionsIface) => Promise<void>;\n /**\n * The conversations this one handed work to, with what their agents are\n * doing (`GET \u2026/links`). Their replies and waits arrive here as messages.\n */\n links: (options?: SignalOptionsIface) => Promise<ConversationLinkIface[]>;\n /** Conversations receiving this conversation\u2019s delegated results. */\n parentLinks: (options?: SignalOptionsIface) => Promise<ConversationLinkIface[]>;\n /**\n * Links another conversation the caller belongs to (`POST \u2026/links`); linking\n * it again returns the same link. Links never form a cycle.\n */\n link: (\n args: { conversationId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationLinkIface>;\n /** Removes a link (`DELETE \u2026/links/:linkId`); both conversations remain. */\n unlink: (args: { linkId: string }, options?: SignalOptionsIface) => Promise<void>;\n}\n\nexport interface ConversationAgentTurnIface {\n participantId: string;\n sessionId: string;\n state: AgentSessionState | WireFallback;\n /** A turn is running or waiting on a pending request. */\n running: boolean;\n}\n\n/** Session states in which a turn is open. */\nexport const TURN_OPEN_SESSION_STATES: ReadonlySet<AgentSessionState | WireFallback> = new Set([\n AgentSessionState.Running,\n AgentSessionState.RequiresAction,\n]);\n\nexport interface OpenedConversationIface extends ConversationHandleIface {\n conversation: ConversationIface;\n}\n\nexport interface CreateConversationArgsIface extends SignalOptionsIface {\n kind: EnumInput<ConversationKind>;\n title?: string;\n participants: ParticipantCreateInput[];\n turnPolicy?: EnumInput<AgentTurnPolicy>;\n}\n\nexport interface ConversationsApiIface {\n list: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number; includeArchived?: boolean },\n ) => Promise<ConversationListIface>;\n /** Finds or creates the caller's direct conversation with an agent. */\n direct: (args: { agent: string } & SignalOptionsIface) => Promise<OpenedConversationIface>;\n /** Finds or creates the caller's Home conversation. */\n home: (options?: SignalOptionsIface) => Promise<OpenedConversationIface>;\n create: (args: CreateConversationArgsIface) => Promise<OpenedConversationIface>;\n /** I/O-free handle. */\n get: (conversationId: string) => ConversationHandleIface;\n /** Full-text search over the caller's conversations (or one), newest first. */\n search: (\n args: {\n q: string;\n conversationId?: string;\n cursor?: string;\n limit?: number;\n } & SignalOptionsIface,\n ) => Promise<SearchMessagesPageIface>;\n /**\n * The caller's conversation list topic (`user.collection:<userId>:conversations`):\n * `conversation.list.changed` and `conversation.updated` events, and a\n * `collection.resync` whenever `list()` must be re-read (on every\n * subscription, resync and while realtime is down).\n */\n listEvents: (options?: CollectionEventsOptionsIface) => AsyncIterableIterator<CollectionEvent>;\n /** Everything awaiting the caller's answer across conversations. */\n decisions: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number },\n ) => Promise<DecisionsPageIface>;\n}\n\nconst conversationPath = (conversationId: string, suffix = ''): string =>\n `/v1/conversations/${encodePath(conversationId)}${suffix}`;\n\nconst messagePath = (conversationId: string, messageId: string, suffix = ''): string =>\n conversationPath(conversationId, `/messages/${encodePath(messageId)}${suffix}`);\n\ninterface ConversationStreamArgsIface {\n context: ClientContextIface;\n conversationId: string;\n options: ConversationEventsOptionsIface | undefined;\n listMessages: (options: ListMessagesOptionsIface) => Promise<ConversationMessagesPageIface>;\n listParticipants: (options: SignalOptionsIface) => Promise<ParticipantIface[]>;\n getSession: (sessionId: string, options: SignalOptionsIface) => Promise<AgentSessionIface>;\n sessionPending: (\n sessionId: string,\n options: SignalOptionsIface,\n ) => Promise<PendingRequestIface[]>;\n}\n\n// Bounds on the ids a stream remembers to dedupe transient events.\nconst MAX_REMEMBERED = 4096;\n\n// `GET /v1/sessions/:id/pending` returns at most this many open requests; a\n// list that long may be truncated, so absence from it proves nothing.\nconst SESSION_PENDING_LIMIT = 200;\n\nconst remember = <Key, Value>(map: Map<Key, Value>, key: Key, value: Value): void => {\n map.delete(key);\n map.set(key, value);\n if (map.size > MAX_REMEMBERED) {\n const oldest = map.keys().next();\n if (oldest.done !== true) map.delete(oldest.value);\n }\n};\n\ntype TurnStartedEventIface = AgentRealtimeEventOf<AgentRealtimeKind.TurnStarted>;\n\nconst isTransientEvent = (event: AgentRealtimeEvent): boolean =>\n event.kind === AgentRealtimeKind.AcpPending ||\n event.kind === AgentRealtimeKind.TurnStarted ||\n event.kind === AgentRealtimeKind.TurnEnded;\n\nconst REPLAY_PAGE = 100;\n/**\n * Every recovery rescans this far behind the newest change seen: `updated_at`\n * is a transaction's start time, so a slow write (a lock wait) can commit\n * after newer changes were delivered.\n */\nexport const RECOVERY_SKEW_MS = 30_000;\n\nconst stampOf = (message: ConversationMessageIface): number =>\n Math.max(\n ...[message.updatedAt, message.deletedAt, message.createdAt].map((value) =>\n value == null ? 0 : Date.parse(value) || 0,\n ),\n );\n\n/** The newest copy of a message the stream has emitted (or the caller already had). */\nexport interface MessageVersionIface {\n /** The server's per-message change counter: a total order when both copies carry it. */\n revision: number | null;\n /** `updatedAt` in ms; distinct changes can share a millisecond. */\n updatedAt: number | null;\n /** Newest of updatedAt/deletedAt/createdAt, for messages without `updatedAt`. */\n stamp: number;\n deleted: boolean;\n final: boolean;\n fingerprint: string;\n}\n\nconst isoMs = (value: string | null): number | null => {\n if (value == null) return null;\n const ms = Date.parse(value);\n return Number.isNaN(ms) ? null : ms;\n};\n\nexport const messageVersionOf = (message: ConversationMessageIface): MessageVersionIface => ({\n revision: message.revision,\n updatedAt: isoMs(message.updatedAt),\n stamp: stampOf(message),\n deleted: message.deletedAt != null,\n final: message.streaming?.state === MessageStreamingState.Final,\n fingerprint: JSON.stringify([\n message.deletedAt,\n message.streaming?.state ?? null,\n message.body,\n message.reactions,\n ]),\n});\n\n/**\n * Whether `incoming` is newer than the copy already emitted; older or equal\n * copies are dropped. A deletion is never undone. `revision` orders copies\n * when both carry it. Otherwise `updatedAt` does, where a finalized reply\n * beats a streaming copy from the same millisecond; without either, a later\n * change time wins, a finalized reply is never undone by a copy at the same\n * time, and equal times fall back to content.\n */\nexport const isNewerMessageVersion = (\n incoming: MessageVersionIface,\n current: MessageVersionIface | undefined,\n): boolean => {\n if (current == null) return true;\n if (current.deleted && !incoming.deleted) return false;\n if (incoming.revision != null && current.revision != null) {\n return incoming.revision > current.revision;\n }\n if (incoming.updatedAt != null && current.updatedAt != null) {\n if (incoming.updatedAt !== current.updatedAt) return incoming.updatedAt > current.updatedAt;\n return incoming.final && !current.final;\n }\n if (incoming.stamp !== current.stamp) return incoming.stamp > current.stamp;\n if (current.final && !incoming.final) return false;\n return incoming.fingerprint !== current.fingerprint;\n};\n\ninterface PendingLiveIface {\n event: AgentRealtimeEvent;\n meta: ConversationEventMetaIface;\n // A transient event whose state was recorded when it arrived (or was recovered);\n // released as is.\n noted: boolean;\n}\n\n/**\n * Live conversation events. On every resubscribe or resync the stream\n * recovers what changed while it was away: messages created *or updated*\n * (including thread replies), scanned in the server's (updated_at, id) order.\n * The first scan starts at the newest change seen minus a skew; every scan\n * ends on the server's change cursor, and the next scan resumes from it, so\n * messages that share an update time are never skipped between pages.\n * Live events that arrive during recovery are held and released after it,\n * and message events are deduped by id and version, so a reconnect neither\n * loses nor repeats a message.\n */\nconst streamConversationEvents = (\n args: ConversationStreamArgsIface,\n): AsyncIterableIterator<ConversationEvent> => {\n const topic = agentRealtimeTopics.conversation(args.conversationId);\n const follow = args.options?.follow ?? true;\n const controller = new AbortController();\n const signal = AbortSignal.any([\n controller.signal,\n args.context.closeSignal,\n ...(args.options?.signal == null ? [] : [args.options.signal]),\n ]);\n const versions = new Map<string, MessageVersionIface>();\n let newestStamp: number | null = null;\n const subscribedAt = Date.now();\n let recoveryFloor: number | null = null;\n let subscribedOnce = false;\n let recovering = 0;\n let recovery: Promise<void> = Promise.resolve();\n const held: PendingLiveIface[] = [];\n const recoverTransientState = args.options?.recoverTransient ?? true;\n // Transient events emitted so far, so live and recovered copies are emitted once.\n // `noted` orders each entry against recovery snapshots (see recoverTransient).\n let transientClock = 0;\n const pendingSeen = new Map<\n string,\n { state: PendingEventState; pending: PendingRequestIface; noted: number }\n >();\n const runningTurns = new Map<string, { turn: TurnStartedEventIface; noted: number }>();\n const endedTurns = new Map<string, true>();\n // The realtime transport reported a retryable error and has not resubscribed since.\n let degraded = false;\n let pollTimer: ReturnType<typeof setTimeout> | null = null;\n const clearPoll = (): void => {\n if (pollTimer != null) clearTimeout(pollTimer);\n pollTimer = null;\n };\n let unsubscribe: (() => void) | null = null;\n let detachAbort: () => void = () => {};\n let detachClose: () => void = () => {};\n const queue = createAsyncQueue<ConversationEvent>(() => {\n controller.abort();\n held.length = 0;\n clearPoll();\n unsubscribe?.();\n detachAbort();\n detachClose();\n });\n const resumeFrom = args.options?.resumeFrom ?? [];\n // Taken when `events()` is called, before subscribing; see recoverFromAnchor.\n const anchor =\n resumeFrom.length === 0 && args.options?.afterSeq == null\n ? args.listMessages({ limit: 1, thread: MessageThreadFilter.All, signal })\n : null;\n // A failed anchor read surfaces through the recovery that awaits it.\n anchor?.catch(() => {});\n for (const message of resumeFrom) {\n versions.set(message.id, messageVersionOf(message));\n newestStamp = Math.max(newestStamp ?? 0, stampOf(message));\n }\n\n /** Emits a message event only when it is newer than every copy of that message emitted so far. */\n const emitMessage = (\n message: ConversationMessageIface,\n meta: ConversationEventMetaIface,\n live: AgentRealtimeEvent | null,\n ): void => {\n const version = messageVersionOf(message);\n const previous = versions.get(message.id);\n if (!isNewerMessageVersion(version, previous)) return;\n versions.set(message.id, version);\n newestStamp = Math.max(newestStamp ?? 0, stampOf(message));\n if (live != null) {\n queue.push({ ...live, ...meta });\n return;\n }\n queue.push(\n previous == null\n ? { kind: AgentRealtimeKind.MessageCreated, message, ...meta }\n : { kind: AgentRealtimeKind.MessageUpdated, message, ...meta },\n );\n };\n\n /** Records a pending event; false when an equal or newer state was already emitted. */\n const notePending = (\n pending: PendingRequestIface,\n state: PendingEventState | WireFallback,\n ): boolean => {\n const seen = pendingSeen.get(pending.id);\n if (state === PendingEventState.Resolved) {\n if (seen?.state === PendingEventState.Resolved) return false;\n transientClock += 1;\n remember(pendingSeen, pending.id, { state, pending, noted: transientClock });\n return true;\n }\n if (state === PendingEventState.Created) {\n if (seen != null) return false;\n transientClock += 1;\n remember(pendingSeen, pending.id, { state, pending, noted: transientClock });\n return true;\n }\n return true;\n };\n\n /** Records a pending or turn event's state; false when it repeats one already emitted. */\n const noteTransient = (event: AgentRealtimeEvent): boolean => {\n if (event.kind === AgentRealtimeKind.AcpPending) return notePending(event.pending, event.state);\n if (event.kind === AgentRealtimeKind.TurnStarted) {\n if (!endedTurns.has(event.turnId)) {\n transientClock += 1;\n remember(runningTurns, event.turnId, { turn: event, noted: transientClock });\n }\n return true;\n }\n if (event.kind === AgentRealtimeKind.TurnEnded) {\n if (endedTurns.has(event.turnId)) return false;\n remember(endedTurns, event.turnId, true);\n runningTurns.delete(event.turnId);\n }\n return true;\n };\n\n const emitLive = (event: AgentRealtimeEvent, meta: ConversationEventMetaIface): void => {\n if (\n event.kind === AgentRealtimeKind.MessageCreated ||\n event.kind === AgentRealtimeKind.MessageUpdated\n ) {\n emitMessage(event.message, meta, event);\n return;\n }\n if (event.kind === AgentRealtimeKind.MessageDeleted) {\n // A deletion outranks every copy up to its time, so a held or replayed older copy cannot restore it.\n const current = versions.get(event.messageId);\n if (current?.deleted === true) return;\n const deletedAt = isoMs(event.deletedAt) ?? current?.stamp ?? 0;\n versions.set(event.messageId, {\n revision: current?.revision ?? null,\n updatedAt: Math.max(current?.updatedAt ?? 0, deletedAt),\n stamp: Math.max(current?.stamp ?? 0, deletedAt),\n deleted: true,\n final: current?.final ?? false,\n fingerprint: current?.fingerprint ?? '',\n });\n }\n if (!noteTransient(event)) return;\n queue.push({ ...event, ...meta });\n };\n\n const replayed = (message: ConversationMessageIface): ConversationEventMetaIface => ({\n topic,\n cursor: null,\n createdAt: message.updatedAt ?? message.createdAt,\n replayed: true,\n });\n\n const emitPage = (messages: ConversationMessageIface[]): void => {\n for (const message of [...messages].sort((left, right) => left.seq - right.seq)) {\n emitMessage(message, replayed(message), null);\n }\n };\n\n /**\n * One change scan, paged by the server's cursor. Every scan starts over from\n * the oldest writer active before the preceding scan (or the newest change\n * minus the skew for older servers), never from the last scan\u2019s cursor:\n * `updated_at` is the writing transaction's start time, so a change can\n * commit after a later one was already seen. Revision ordering drops the\n * repeats the overlap brings back.\n */\n const recoverChanges = async (): Promise<void> => {\n const since = Math.max(\n 0,\n Math.min(newestStamp ?? subscribedAt, recoveryFloor ?? Infinity) - RECOVERY_SKEW_MS,\n );\n let position: { updatedCursor: string } | { updatedAfter: string } = {\n updatedAfter: new Date(since).toISOString(),\n };\n let nextFloor: number | null = null;\n for (;;) {\n const page = await args.listMessages({\n ...position,\n thread: MessageThreadFilter.All,\n limit: REPLAY_PAGE,\n signal,\n });\n if (nextFloor == null && page.recoverySince != null) {\n const stamp = Date.parse(page.recoverySince);\n if (Number.isFinite(stamp)) nextFloor = stamp;\n }\n emitPage(page.messages);\n const next = page.nextUpdatedCursor;\n if (next == null || !page.hasMoreAfter || page.messages.length === 0) {\n recoveryFloor = nextFloor ?? recoveryFloor;\n return;\n }\n position = { updatedCursor: next };\n }\n };\n\n /**\n * With nothing to resume from, the stream anchors on the newest message at\n * the moment `events()` was called and, once subscribed, recovers every\n * change after it. So a message posted between a caller's first page and the\n * gateway registering the subscription still arrives (marked `replayed`).\n */\n const recoverFromAnchor = async (anchor: Promise<ConversationMessagesPageIface>) => {\n const page = await anchor;\n if (page.recoverySince != null) {\n const stamp = Date.parse(page.recoverySince);\n if (Number.isFinite(stamp)) recoveryFloor = stamp;\n }\n const newest = page.messages.reduce<ConversationMessageIface | null>(\n (best, message) => (best == null || message.seq > best.seq ? message : best),\n null,\n );\n if (newest != null && !versions.has(newest.id)) {\n versions.set(newest.id, messageVersionOf(newest));\n newestStamp = Math.max(newestStamp ?? 0, stampOf(newest));\n }\n await recoverChanges();\n };\n\n const recoverAfterSeq = async (afterSeq: number): Promise<void> => {\n let cursor = afterSeq;\n for (;;) {\n const page = await args.listMessages({\n after: cursor,\n thread: MessageThreadFilter.All,\n limit: REPLAY_PAGE,\n signal,\n });\n emitPage(page.messages);\n const next = Math.max(cursor, ...page.messages.map((message) => message.seq));\n if (!page.hasMoreAfter || next === cursor) return;\n cursor = next;\n }\n };\n\n const recoveredMeta = (): ConversationEventMetaIface => ({\n topic,\n cursor: null,\n createdAt: null,\n replayed: true,\n });\n\n /** A read that recovery may skip: retryable failures retry the recovery, others drop the read. */\n const optional = async <Value>(read: () => Promise<Value>): Promise<Value | null> => {\n try {\n return await read();\n } catch (cause) {\n if (isRetryableClientError(cause)) throw cause;\n return null;\n }\n };\n\n // Recovery runs while live events are held: a recovered transient event joins\n // them, so it is released after every live event that arrived before it.\n const emitRecovered = (event: AgentRealtimeEvent): void => {\n held.push({ event, meta: recoveredMeta(), noted: true });\n };\n\n /**\n * Re-reads what only realtime carries (see `recoverTransient`): the open\n * pending requests and turn state of every agent participant's session.\n * Live transient events held during recovery record their state on arrival,\n * so the snapshot settles what was recorded before it was requested, and\n * never a turn or request that arrived live after it.\n */\n const recoverTransient = async (): Promise<void> => {\n if (!recoverTransientState) return;\n const asOf = transientClock;\n const participants = await optional(() => args.listParticipants({ signal }));\n const current =\n participants == null\n ? null\n : new Set(\n participants.flatMap((participant) =>\n participant.kind === ParticipantKind.Agent &&\n participant.sessionId != null &&\n participant.leftAt == null\n ? [participant.sessionId]\n : [],\n ),\n );\n // Sessions the stream holds open state for, including ones whose agent has since left.\n const remembered = new Set([\n ...[...pendingSeen.values()].flatMap((seen) =>\n seen.state === PendingEventState.Created ? [seen.pending.sessionId] : [],\n ),\n ...[...runningTurns.values()].map((entry) => entry.turn.sessionId),\n ]);\n const checked = await Promise.all(\n [...new Set([...(current ?? []), ...remembered])].map(async (sessionId) => {\n const [session, open] = await Promise.all([\n optional(() => args.getSession(sessionId, { signal })),\n optional(() => args.sessionPending(sessionId, { signal })),\n ]);\n // An agent that left: its session is closed, and may no longer be readable.\n const departed = current != null && !current.has(sessionId);\n return {\n sessionId,\n running:\n session == null\n ? departed\n ? false\n : null\n : TURN_OPEN_SESSION_STATES.has(session.state),\n open: open ?? (departed ? [] : null),\n };\n }),\n );\n for (const { sessionId, running, open } of checked) {\n if (open != null) {\n const complete = open.length < SESSION_PENDING_LIMIT;\n const openIds = new Set(open.map((pending) => pending.id));\n for (const pending of open) {\n if (notePending(pending, PendingEventState.Created))\n emitRecovered({\n kind: AgentRealtimeKind.AcpPending,\n pending,\n state: PendingEventState.Created,\n });\n }\n for (const seen of [...pendingSeen.values()]) {\n if (\n !complete ||\n seen.state !== PendingEventState.Created ||\n seen.noted > asOf ||\n seen.pending.sessionId !== sessionId ||\n openIds.has(seen.pending.id)\n )\n continue;\n notePending(seen.pending, PendingEventState.Resolved);\n emitRecovered({\n kind: AgentRealtimeKind.AcpPending,\n pending: seen.pending,\n state: PendingEventState.Resolved,\n });\n }\n }\n if (running !== false) continue;\n for (const { turn, noted } of [...runningTurns.values()]) {\n if (turn.sessionId !== sessionId || noted > asOf) continue;\n runningTurns.delete(turn.turnId);\n remember(endedTurns, turn.turnId, true);\n emitRecovered({\n kind: AgentRealtimeKind.TurnEnded,\n conversationId: turn.conversationId,\n participantId: turn.participantId,\n sessionId: turn.sessionId,\n turnId: turn.turnId,\n stopReason: null,\n });\n }\n }\n };\n\n /** Runs a recovery while holding live events; the cursor is captured now, not when it runs. */\n const scheduleRecovery = (run: () => Promise<void>): void => {\n recovering += 1;\n recovery = recovery\n .then(async () => {\n let delay = 250;\n while (!queue.closed()) {\n try {\n await run();\n return;\n } catch (cause) {\n if (!follow || !isRetryableClientError(cause)) throw cause;\n await new Promise<void>((resolve) => {\n const done = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', done);\n resolve();\n };\n const timer = setTimeout(done, delay);\n if (signal.aborted) done();\n else signal.addEventListener('abort', done, { once: true });\n });\n delay = Math.min(delay * 2, 30_000);\n }\n }\n })\n .then(() => {\n recovering -= 1;\n if (recovering > 0) return;\n for (const entry of held.splice(0)) {\n if (entry.noted) queue.push({ ...entry.event, ...entry.meta });\n else emitLive(entry.event, entry.meta);\n }\n })\n .catch((cause) => queue.fail(cause));\n };\n\n // Reads the newest change when it runs, after any recovery queued before it.\n let newestRecoveryPending = false;\n let newestRecoveryRequested = false;\n const recoverFromNewest = (): void => {\n newestRecoveryRequested = true;\n if (newestRecoveryPending) return;\n newestRecoveryPending = true;\n scheduleRecovery(async () => {\n do {\n newestRecoveryRequested = false;\n await recoverChanges();\n await recoverTransient();\n } while (newestRecoveryRequested && !queue.closed());\n newestRecoveryPending = false;\n });\n };\n\n let initialRecoveryStarted = false;\n /** What the first subscription (or, while realtime is down, the first poll) recovers. */\n const startInitialRecovery = (): void => {\n if (initialRecoveryStarted) return;\n initialRecoveryStarted = true;\n const afterSeq = args.options?.afterSeq;\n if (afterSeq != null) scheduleRecovery(() => recoverAfterSeq(afterSeq));\n if (resumeFrom.length > 0) recoverFromNewest();\n if (anchor != null)\n scheduleRecovery(async () => {\n try {\n await recoverFromAnchor(anchor);\n } catch (cause) {\n if (!isRetryableClientError(cause)) throw cause;\n // A later anchor could hide messages written during the outage.\n await recoverChanges();\n }\n });\n // recoverFromNewest recovers transient state itself.\n if (resumeFrom.length === 0) scheduleRecovery(recoverTransient);\n };\n\n // HTTP polling while the realtime transport reports errors.\n const poll = (): void => {\n pollTimer = null;\n if (!degraded || queue.closed()) return;\n if (initialRecoveryStarted) recoverFromNewest();\n else startInitialRecovery();\n void recovery.then(() => {\n if (!degraded || queue.closed() || pollTimer != null) return;\n pollTimer = setTimeout(poll, args.context.timing.conversationPollIntervalMs);\n });\n };\n\n const onFrame = (raw: RealtimeTransportFrameIface): void => {\n const frame = agentRealtimeFrameSchema.safeParse(raw);\n if (!frame.success || queue.closed()) return;\n switch (frame.data.type) {\n case AgentRealtimeFrameType.Event: {\n const envelope = frame.data;\n const entry = {\n event: parseAgentRealtimeEvent(envelope),\n meta: {\n topic: envelope.topic,\n cursor: envelope.cursor,\n createdAt: envelope.createdAt,\n replayed: false,\n },\n };\n if (recovering > 0) {\n // Ending explicitly preserves transient events; a caller can reopen and recover messages.\n if (held.length >= 1024) {\n queue.fail(\n clientError({\n code: ClientErrorCode.Network,\n status: 0,\n message: 'Conversation recovery buffer is full; reconnect from the last message.',\n }),\n );\n return;\n }\n // Transient events record their state now, so recovery reconciles them.\n if (isTransientEvent(entry.event)) {\n if (noteTransient(entry.event)) held.push({ ...entry, noted: true });\n } else held.push({ ...entry, noted: false });\n } else emitLive(entry.event, entry.meta);\n return;\n }\n case AgentRealtimeFrameType.Subscribed: {\n degraded = false;\n clearPoll();\n if (!subscribedOnce) {\n subscribedOnce = true;\n // Polls during an outage before the first subscription already ran the initial recovery.\n if (initialRecoveryStarted) recoverFromNewest();\n else startInitialRecovery();\n } else {\n recoverFromNewest();\n args.options?.onResubscribed?.();\n }\n if (!follow) void recovery.then(() => queue.end());\n return;\n }\n case AgentRealtimeFrameType.ResyncRequired:\n recoverFromNewest();\n args.options?.onResubscribed?.();\n return;\n case AgentRealtimeFrameType.Error:\n if (isTerminalRealtimeError(frame.data)) {\n queue.fail(\n realtimeSubscriptionError({\n topic: frame.data.topic ?? topic,\n code: frame.data.code ?? 'unknown',\n message: frame.data.message ?? 'Realtime subscription was refused',\n }),\n );\n return;\n }\n // Retryable: the transport resubscribes (and its `subscribed` runs recovery);\n // meanwhile the stream recovers over HTTP. A non-following stream ends once\n // that recovery is current.\n if (!follow) {\n if (subscribedOnce) return;\n subscribedOnce = true;\n startInitialRecovery();\n void recovery.then(() => queue.end());\n return;\n }\n if (!degraded) {\n degraded = true;\n poll();\n }\n return;\n default:\n return;\n }\n };\n\n detachAbort = failOnAbort(queue, signal);\n detachClose = failOnAbort(queue, args.context.closeSignal);\n if (!queue.closed()) {\n const subscribeOptions =\n args.options?.afterCursor == null ? undefined : { afterCursor: args.options.afterCursor };\n const stop = args.context.realtime().subscribe(topic, onFrame, subscribeOptions);\n if (queue.closed()) stop();\n else unsubscribe = stop;\n }\n return queue.iterator;\n};\n\nexport const createConversationHandle = (\n context: ClientContextIface,\n conversationId: string,\n): ConversationHandleIface => {\n const { http } = context;\n\n const sandboxFileContentRequest = async (\n args: SandboxFileContentArgsIface,\n ): Promise<SandboxFileContentRequestIface> => {\n if (args.path.length === 0 || args.path.length > 4096 || args.path.includes('\\0')) {\n throw clientError({\n message: 'Invalid sandbox file path',\n status: 0,\n code: ClientErrorCode.InvalidRequest,\n });\n }\n const target = http.url(\n conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/file/content`),\n );\n target.searchParams.set('path', args.path);\n if (args.snapshotId != null) target.searchParams.set('snapshotId', args.snapshotId);\n if (args.download != null) target.searchParams.set('download', String(args.download));\n const headers = await http.headers();\n if (args.range != null) headers.range = args.range;\n return {\n url: target.toString(),\n headers,\n credentials: http.usesCookies ? 'include' : 'omit',\n };\n };\n\n const listMessages = (options: ListMessagesOptionsIface = {}) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/messages'),\n query: {\n before: options.before,\n after: options.after,\n limit: options.limit,\n thread: options.thread,\n updatedAfter: options.updatedAfter,\n updatedCursor: options.updatedCursor,\n },\n response: conversationMessagesPageSchema,\n signal: options.signal,\n });\n\n const listParticipants = async (options: SignalOptionsIface) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/participants'),\n response: participantListSchema,\n signal: options.signal,\n })\n ).participants;\n\n const getSession = (sessionId: string, options: SignalOptionsIface) =>\n http.request({\n method: HttpMethod.Get,\n path: `/v1/sessions/${encodePath(sessionId)}`,\n response: sessionSchema,\n signal: options.signal,\n });\n\n const sessionPending = async (sessionId: string, options: SignalOptionsIface) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: `/v1/sessions/${encodePath(sessionId)}/pending`,\n response: pendingRequestListSchema,\n signal: options.signal,\n })\n ).pending;\n\n const reaction = async (args: {\n method: HttpMethod;\n messageId: string;\n emoji: string;\n signal?: AbortSignal;\n }): Promise<ReactionIface[]> =>\n (\n await http.request({\n method: args.method,\n path: messagePath(conversationId, args.messageId, '/reactions'),\n body: { schema: reactionRequestSchema, value: { emoji: args.emoji } },\n response: reactionsResponseSchema,\n signal: args.signal,\n })\n ).reactions;\n\n return {\n id: conversationId,\n info: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId),\n response: conversationSchema,\n signal: options?.signal,\n }),\n send: async (content, options) => {\n const sent = await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/messages'),\n body: {\n schema: sendMessageRequestSchema,\n value: {\n content,\n clientMessageId: options?.clientMessageId ?? context.newKey(),\n replyTo: options?.replyTo,\n threadRootId: options?.threadRootId,\n quotes: options?.quotes,\n mentions: options?.mentions,\n attachmentIds: options?.attachmentIds,\n clientSubmittedAtMs: options?.clientSubmittedAtMs ?? context.now(),\n },\n },\n response: sendMessageResponseSchema,\n signal: options?.signal,\n });\n return {\n message: sent.message,\n messageId: sent.message.id,\n seq: sent.message.seq,\n deliveries: sent.deliveries,\n };\n },\n events: (options) =>\n streamConversationEvents({\n context,\n conversationId,\n options,\n listMessages,\n listParticipants,\n getSession,\n sessionPending,\n }),\n messages: (options) => listMessages(options),\n deliveries: async (args, options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: `${messagePath(conversationId, args.messageId)}/deliveries`,\n response: messageDeliveriesSchema,\n signal: options?.signal,\n })\n ).deliveries,\n message: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: messagePath(conversationId, args.messageId),\n response: conversationMessageSchema,\n signal: options?.signal,\n }),\n react: (args, options) =>\n reaction({ method: HttpMethod.Post, ...args, signal: options?.signal }),\n unreact: (args, options) =>\n reaction({ method: HttpMethod.Delete, ...args, signal: options?.signal }),\n markThreadRead: async ({ rootId, throughSeq }, options) => {\n await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, `/threads/${encodePath(rootId)}/read`),\n body: { schema: markReadRequestSchema, value: { throughSeq } },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n postEvent: (event, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/events'),\n body: { schema: postConversationEventRequestSchema, value: event },\n response: postConversationEventResponseSchema,\n signal: options?.signal,\n }),\n typing: async (args, options) => {\n await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/typing'),\n body: { schema: typingRequestSchema, value: args },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n recordPushOpen: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(\n conversationId,\n `/push-deliveries/${encodeURIComponent(args.deliveryId)}/open`,\n ),\n response: pushDeliveryOpenResponseSchema,\n signal: options?.signal,\n }),\n markRead: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/read'),\n body: { schema: markReadRequestSchema, value: args },\n response: readStateSchema,\n signal: options?.signal,\n }),\n respond: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/respond'),\n body: {\n schema: respondPendingRequestSchema,\n value: { pendingId: args.pendingId, outcome: outcomeOf(args) },\n },\n response: respondPendingResponseSchema,\n signal: options?.signal,\n context: { pendingId: args.pendingId },\n }),\n cancel: async (options) => {\n await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/cancel'),\n body: {\n schema: cancelConversationRequestSchema,\n value: { reason: options?.reason, throughMessageSeq: options?.throughMessageSeq },\n },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n participants: (options) => listParticipants({ signal: options?.signal }),\n turns: async (options) => {\n const participants = await listParticipants({ signal: options?.signal });\n return Promise.all(\n participants.flatMap((participant) => {\n const sessionId = participant.sessionId;\n if (participant.kind !== ParticipantKind.Agent || sessionId == null) return [];\n return [\n getSession(sessionId, { signal: options?.signal }).then(\n (session): ConversationAgentTurnIface => ({\n participantId: participant.id,\n sessionId,\n state: session.state,\n running: TURN_OPEN_SESSION_STATES.has(session.state),\n }),\n ),\n ];\n }),\n );\n },\n addParticipant: (participant, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/participants'),\n body: { schema: participantInputSchema, value: participant },\n response: participantSchema,\n signal: options?.signal,\n }),\n updateParticipant: ({ participantId, ...patch }, options) =>\n http.request({\n method: HttpMethod.Patch,\n path: conversationPath(conversationId, `/participants/${encodePath(participantId)}`),\n body: { schema: updateParticipantRequestSchema, value: patch },\n response: participantSchema,\n signal: options?.signal,\n }),\n removeParticipant: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(conversationId, '/participants'),\n body: { schema: removeParticipantRequestSchema, value: args },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n update: (patch, options) =>\n http.request({\n method: HttpMethod.Patch,\n path: conversationPath(conversationId),\n body: { schema: updateConversationRequestSchema, value: patch },\n response: conversationSchema,\n signal: options?.signal,\n }),\n delete: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: messagePath(conversationId, args.messageId),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n links: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/links'),\n response: conversationLinkListSchema,\n signal: options?.signal,\n })\n ).links,\n parentLinks: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/parent-links'),\n response: conversationLinkListSchema,\n signal: options?.signal,\n })\n ).links,\n link: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/links'),\n body: { schema: createConversationLinkRequestSchema, value: args },\n response: conversationLinkSchema,\n signal: options?.signal,\n }),\n unlink: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(conversationId, `/links/${encodePath(args.linkId)}`),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n attachmentUrl: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/attachments/${encodePath(args.attachmentId)}`),\n response: attachmentDownloadSchema,\n signal: options?.signal,\n }),\n sandboxes: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/sandboxes'),\n response: conversationSandboxListSchema,\n signal: options?.signal,\n })\n ).sandboxes,\n sandboxFiles: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/files`),\n query: { path: args.path, snapshotId: args.snapshotId },\n response: sandboxDirectorySchema,\n signal: options?.signal,\n }),\n sandboxPath: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/path`),\n query: { path: args.path, snapshotId: args.snapshotId },\n response: sandboxPathSchema,\n signal: options?.signal,\n }),\n searchSandboxFiles: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/files/search`,\n ),\n query: { path: args.path, query: args.query, limit: args.limit },\n response: sandboxSearchSchema,\n signal: options?.signal,\n }),\n sandboxFile: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/file`),\n query: {\n path: args.path,\n offset: args.offset,\n length: args.length,\n snapshotId: args.snapshotId,\n },\n response: sandboxFileSchema,\n signal: options?.signal,\n }),\n sandboxFileContentRequest,\n openSandboxEditor: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/editor`),\n response: sandboxEditorSessionSchema,\n signal: options?.signal,\n }),\n refreshSandboxEditor: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/editor/${encodePath(args.editorId)}/refresh`,\n ),\n body: {\n schema: sandboxEditorAuthorizationSchema,\n value: { authorizationId: args.authorizationId },\n },\n response: sandboxEditorSessionSchema,\n signal: options?.signal,\n }),\n closeSandboxEditor: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/editor/${encodePath(args.editorId)}`,\n ),\n body: {\n schema: sandboxEditorAuthorizationSchema,\n value: { authorizationId: args.authorizationId },\n },\n response: okResponseSchema,\n signal: options?.signal,\n keepalive: options?.keepalive,\n });\n },\n sandboxFileContent: async (args, options) => {\n const request = await sandboxFileContentRequest(args);\n let response: Response;\n try {\n response = await http.fetch(request.url, {\n method: HttpMethod.Get,\n headers: request.headers,\n credentials: request.credentials,\n signal: options?.signal,\n });\n } catch (cause) {\n if (options?.signal?.aborted === true) throw cause;\n throw clientError({\n message: 'Sandbox file request failed',\n status: 0,\n code: ClientErrorCode.Network,\n cause,\n });\n }\n if (!response.ok) {\n let text: string;\n try {\n text = await response.text();\n } catch (cause) {\n if (options?.signal?.aborted === true) throw cause;\n throw clientError({\n message: 'Sandbox file response failed',\n status: 0,\n code: ClientErrorCode.Network,\n cause,\n });\n }\n throw errorFromResponse({ status: response.status, text, context: undefined });\n }\n return response;\n },\n inspectSandboxProcesses: (args, options) => {\n const request = processInspectionRequestSchema.parse(args.request);\n const { operation } = request;\n const suffix =\n operation === ProcessInspectionOperation.Available\n ? '/available'\n : 'processId' in request\n ? '/' + encodePath(request.processId)\n : '';\n const query: NonNullable<HttpRequestArgsIface<ProcessInspectionResultIface>['query']> = {};\n if ('bootId' in request) query.bootId = request.bootId;\n if ('cursor' in request) query.cursor = request.cursor;\n if ('limit' in request) query.limit = request.limit;\n return http.request({\n method: operation === ProcessInspectionOperation.Stop ? HttpMethod.Delete : HttpMethod.Get,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/processes${suffix}`,\n ),\n query,\n response: processInspectionResultSchema,\n signal: options?.signal,\n });\n },\n sandboxPreview: (args, options) => {\n const request: HttpRequestArgsIface<SandboxPreviewType> = {\n method: args.viewOnly === false ? HttpMethod.Post : HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/preview`),\n response: sandboxPreviewSchema,\n signal: options?.signal,\n };\n if (args.viewOnly === false)\n request.body = { schema: sandboxPreviewOptionsSchema, value: { viewOnly: false } };\n return http.request(request);\n },\n wakeSandbox: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/wake`),\n response: conversationSandboxSchema,\n signal: options?.signal,\n }),\n schedules: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/schedules'),\n response: conversationScheduleListSchema,\n signal: options?.signal,\n })\n ).schedules,\n createSchedule: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/schedules'),\n body: { schema: createConversationScheduleRequestSchema, value: args },\n response: conversationScheduleSchema,\n signal: options?.signal,\n }),\n updateSchedule: ({ scheduleId, ...patch }, options) =>\n http.request({\n method: HttpMethod.Patch,\n path: conversationPath(conversationId, `/schedules/${encodePath(scheduleId)}`),\n body: { schema: updateConversationScheduleRequestSchema, value: patch },\n response: conversationScheduleSchema,\n signal: options?.signal,\n }),\n deleteSchedule: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(conversationId, `/schedules/${encodePath(args.scheduleId)}`),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n uploadAttachment: async (args) => {\n const sizeBytes = 'byteLength' in args.data ? args.data.byteLength : args.data.size;\n const upload = await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/attachments'),\n body: {\n schema: createAttachmentUploadRequestSchema,\n value: { name: args.name, contentType: args.contentType, sizeBytes },\n },\n response: attachmentUploadSchema,\n signal: args.signal,\n });\n // Presigned upload: storage authenticates the URL, so it gets only the headers the\n // presign requires, through storageFetch, never the API fetch or its credentials.\n const response = await context.storageFetch(upload.uploadUrl, {\n method: upload.method,\n headers: { 'content-type': args.contentType, ...upload.headers },\n body: args.data,\n signal: args.signal,\n credentials: 'omit',\n });\n if (!response.ok) {\n throw clientError({\n message: `Attachment upload failed with status ${response.status}`,\n status: response.status,\n code: ClientErrorCode.UploadFailed,\n body: await response.text(),\n });\n }\n return upload;\n },\n };\n};\n\nexport const createConversationsApi = (context: ClientContextIface): ConversationsApiIface => {\n const opened = (conversation: ConversationIface): OpenedConversationIface => ({\n ...createConversationHandle(context, conversation.id),\n conversation,\n });\n return {\n list: (options) =>\n context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations',\n query: {\n cursor: options?.cursor,\n limit: options?.limit,\n includeArchived: options?.includeArchived,\n },\n response: conversationListSchema,\n signal: options?.signal,\n }),\n direct: async (args) =>\n opened(\n await context.http.request({\n method: HttpMethod.Post,\n path: '/v1/conversations/direct',\n body: { schema: createDirectConversationRequestSchema, value: { agent: args.agent } },\n response: conversationSchema,\n signal: args.signal,\n }),\n ),\n home: async (options) =>\n opened(\n await context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations/home',\n response: conversationSchema,\n signal: options?.signal,\n }),\n ),\n create: async (args) =>\n opened(\n await context.http.request({\n method: HttpMethod.Post,\n path: '/v1/conversations',\n body: {\n schema: createConversationRequestSchema,\n value: {\n kind: args.kind,\n title: args.title,\n participants: args.participants,\n turnPolicy: args.turnPolicy,\n },\n },\n response: conversationSchema,\n signal: args.signal,\n }),\n ),\n get: (conversationId) => createConversationHandle(context, conversationId),\n search: (args) =>\n context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations/search',\n query: {\n q: args.q,\n conversationId: args.conversationId,\n cursor: args.cursor,\n limit: args.limit,\n },\n response: searchMessagesPageSchema,\n signal: args.signal,\n }),\n listEvents: (options) =>\n streamCollectionEvents({\n context,\n topicFor: agentRealtimeTopics.userConversations,\n collection: ClientCollection.Conversations,\n options,\n }),\n decisions: (options) =>\n context.http.request({\n method: HttpMethod.Get,\n path: '/v1/decisions',\n query: { cursor: options?.cursor, limit: options?.limit },\n response: decisionsPageSchema,\n signal: options?.signal,\n }),\n };\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["anchor"]
7
7
  }
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  createClient,
3
3
  sessionUpdateOf,
4
- SystemParticipantKind,
5
4
  textOf,
6
5
  type AgentClientIface,
7
6
  } from '@finalai/agents/client';
@@ -115,7 +114,7 @@ export const postBuildResult = async (args: {
115
114
  }) =>
116
115
  args.client.conversations.get(args.conversationId).postEvent(
117
116
  {
118
- source: { kind: SystemParticipantKind.Tool, id: 'release-build' },
117
+ source: { id: 'release-build', name: 'Release build' },
119
118
  eventId: `${args.runId}:completed`,
120
119
  text: args.text,
121
120
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@finalai/agents",
3
- "version": "0.2.2",
3
+ "version": "0.3.2",
4
4
  "private": false,
5
5
  "description": "Agent authoring, client APIs, and CLI.",
6
6
  "license": "Apache-2.0",
@@ -105,10 +105,10 @@
105
105
  },
106
106
  "dependencies": {
107
107
  "@agentclientprotocol/sdk": "1.8.0",
108
- "@finalai/agent-definition": "0.1.6",
109
- "@finalai/agent-protocol": "0.1.4",
110
- "@finalai/agent-provider": "0.1.7",
111
- "@finalai/final-agent-provider": "0.2.2",
108
+ "@finalai/agent-definition": "0.1.9",
109
+ "@finalai/agent-protocol": "0.2.1",
110
+ "@finalai/agent-provider": "0.2.2",
111
+ "@finalai/final-agent-provider": "0.3.2",
112
112
  "@finalai/websockets": "0.1.4",
113
113
  "ws": "^8.21.3",
114
114
  "zod": "4.6.5"