@finalai/agents 0.4.4 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/HOSTING.md +3 -3
  2. package/dist/modules/agent-client/build.d.mts +11 -1
  3. package/dist/modules/agent-client/build.mjs +1 -1
  4. package/dist/modules/agent-client/build.mjs.map +2 -2
  5. package/dist/modules/agent-client/client.d.mts +10 -22
  6. package/dist/modules/agent-client/client.mjs +10 -40
  7. package/dist/modules/agent-client/client.mjs.map +2 -2
  8. package/dist/modules/agent-client/collection-events.d.mts +1 -1
  9. package/dist/modules/agent-client/collection-events.mjs.map +1 -1
  10. package/dist/modules/agent-client/context.d.mts +1 -2
  11. package/dist/modules/agent-client/context.mjs +0 -1
  12. package/dist/modules/agent-client/context.mjs.map +2 -2
  13. package/dist/modules/agent-client/conversations.d.mts +35 -10
  14. package/dist/modules/agent-client/conversations.mjs +46 -42
  15. package/dist/modules/agent-client/conversations.mjs.map +2 -2
  16. package/dist/modules/agent-client/errors.d.mts +14 -14
  17. package/dist/modules/agent-client/errors.mjs +15 -15
  18. package/dist/modules/agent-client/errors.mjs.map +3 -3
  19. package/dist/modules/agent-client/frame-stream.d.mts +8 -8
  20. package/dist/modules/agent-client/frame-stream.mjs +36 -36
  21. package/dist/modules/agent-client/frame-stream.mjs.map +2 -2
  22. package/dist/modules/agent-client/http.d.mts +2 -2
  23. package/dist/modules/agent-client/http.mjs +10 -10
  24. package/dist/modules/agent-client/http.mjs.map +2 -2
  25. package/dist/modules/agent-client/index.d.mts +2 -2
  26. package/dist/modules/agent-client/index.mjs +6 -6
  27. package/dist/modules/agent-client/index.mjs.map +2 -2
  28. package/dist/modules/agent-client/sessions.d.mts +9 -8
  29. package/dist/modules/agent-client/sessions.mjs +13 -13
  30. package/dist/modules/agent-client/sessions.mjs.map +2 -2
  31. package/dist/modules/cli/cli.mjs +2 -2
  32. package/dist/modules/cli/cli.mjs.map +2 -2
  33. package/examples/release-scout/README.md +1 -1
  34. package/examples/release-scout/client.ts +2 -2
  35. package/package.json +5 -5
@@ -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 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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",
4
+ "sourcesContent": ["import {\n ProcessInspectionOperation,\n processInspectionRequestSchema,\n processInspectionResultSchema,\n type ProcessInspectionRequestIface,\n type ProcessInspectionResultIface,\n} from '@finalai/agent-protocol';\nimport {\n agentRealtimeFrameSchema,\n AgentRealtimeFrameType,\n AgentRealtimeKind,\n agentRealtimeTopics,\n AgentSessionState,\n attachmentDownloadSchema,\n attachmentUploadSchema,\n cancelConversationRequestSchema,\n conversationLinkListSchema,\n conversationLinkSchema,\n conversationListSchema,\n conversationMessageSchema,\n conversationMessagesPageSchema,\n conversationSandboxListSchema,\n conversationSandboxSchema,\n conversationScheduleListSchema,\n conversationScheduleSchema,\n conversationSchema,\n createAttachmentUploadRequestSchema,\n createConversationLinkRequestSchema,\n createConversationRequestSchema,\n createConversationScheduleRequestSchema,\n createDirectConversationRequestSchema,\n DecisionEventState,\n decisionRecordListSchema,\n decisionsPageSchema,\n markReadRequestSchema,\n messageDeliveriesSchema,\n MessageStreamingState,\n MessageThreadFilter,\n okResponseSchema,\n parseAgentRealtimeEvent,\n participantInputSchema,\n ParticipantKind,\n participantListSchema,\n participantSchema,\n postConversationEventRequestSchema,\n postConversationEventResponseSchema,\n type PostConversationEventResponseIface,\n pushDeliveryOpenResponseSchema,\n reactionRequestSchema,\n reactionsResponseSchema,\n readStateSchema,\n removeParticipantRequestSchema,\n respondDecisionResponseSchema,\n respondDecisionSchema,\n sandboxDirectorySchema,\n sandboxEditorAuthorizationSchema,\n sandboxEditorSessionSchema,\n sandboxFileSchema,\n sandboxPathSchema,\n sandboxPreviewOptionsSchema,\n sandboxPreviewSchema,\n sandboxSearchSchema,\n searchMessagesPageSchema,\n sendMessageRequestSchema,\n sendMessageResponseSchema,\n sessionSchema,\n typingRequestSchema,\n updateConversationRequestSchema,\n updateConversationScheduleRequestSchema,\n updateParticipantRequestSchema,\n type AgentRealtimeEvent,\n type AgentRealtimeEventOf,\n type AgentSessionIface,\n type AgentTurnPolicy,\n type AttachmentDownloadIface,\n type AttachmentUploadIface,\n type ContentInput,\n type ConversationIface,\n type ConversationKind,\n type ConversationLinkIface,\n type ConversationListIface,\n type ConversationMessageIface,\n type ConversationMessagesPageIface,\n type ConversationSandboxIface,\n type ConversationScheduleIface,\n type CreateConversationScheduleRequestIface,\n type DecisionRecordIface,\n type DecisionsPageIface,\n type MessageDeliveryIface,\n type ParticipantIface,\n type ParticipantInput,\n type PostConversationEventRequestIface,\n type ReactionIface,\n type ReadStateIface,\n type RespondDecisionResponseIface,\n type SandboxDirectoryIface,\n type SandboxEditorSessionIface,\n type SandboxFileIface,\n type SandboxPathIface,\n type SandboxPreviewType,\n type SandboxSearchIface,\n type SearchMessagesPageIface,\n type UpdateConversationRequestIface,\n type UpdateConversationScheduleRequestIface,\n type UpdateParticipantRequestIface,\n type WireFallback,\n} from '@finalai/agent-protocol/agent-platform';\nimport { createAsyncQueue, failOnAbort } from \"./async-queue.mjs\";\nimport {\n streamCollectionEvents,\n type CollectionEvent,\n type CollectionEventsOptionsIface,\n} from \"./collection-events.mjs\";\nimport {\n ClientCollection,\n encodePath,\n type ClientContextIface,\n type EnumInput,\n type SignalOptionsIface,\n} from \"./context.mjs\";\nimport {\n clientError,\n ClientErrorCode,\n isRetryableClientError,\n isTerminalRealtimeError,\n realtimeSubscriptionError,\n} from \"./errors.mjs\";\nimport { errorFromResponse, HttpMethod, type HttpRequestArgsIface } from \"./http.mjs\";\nimport type { RealtimeTransportFrameIface } from \"./realtime.mjs\";\nimport { outcomeOf, type RespondArgs } from \"./sessions.mjs\";\n\nexport interface SandboxFileContentArgsIface {\n snapshotId?: string;\n bindingId: string;\n path: string;\n download?: boolean;\n /** One HTTP byte range, for example `bytes=1024-2047`. */\n range?: string;\n}\n\nexport interface SandboxFileContentRequestIface {\n url: string;\n /** Supply these to native download/media clients; never put bearer tokens in URLs. */\n headers: Record<string, string>;\n credentials: RequestCredentials;\n}\n\nexport interface ConversationEventMetaIface {\n topic: string;\n cursor: string | null;\n createdAt: string | null;\n /** True for messages the SDK fetched over HTTP to fill a realtime gap. */\n replayed: boolean;\n}\n\n/** A realtime event of the conversation topic, flattened (`event.message`, `event.decision`). */\nexport type ConversationEvent = AgentRealtimeEvent & ConversationEventMetaIface;\n\nexport interface ConversationEventsOptionsIface extends SignalOptionsIface {\n /** Keep streaming; false ends once the subscription is current. Defaults to true. */\n follow?: boolean;\n /** Also replay messages (thread replies included) after this conversation seq when the subscription opens. */\n afterSeq?: number;\n /** Gateway cursor to resume the topic after. */\n afterCursor?: string;\n /**\n * Messages the caller already has (an earlier stream or page). On the first\n * subscription the stream recovers everything created or updated since the\n * newest of them, thread replies included, and skips the versions given, so\n * a client resuming a conversation it rendered before is left with no gap.\n */\n resumeFrom?: readonly ConversationMessageIface[];\n /**\n * Called on every resubscribe (after the first) and resync, as the stream\n * starts recovering messages. State that messages cannot reconstruct, such\n * as whether an agent's turn ended without a reply, is the caller's to re-read.\n */\n onResubscribed?: () => void;\n /**\n * Also recover what only realtime carries (default true). On every\n * (re)subscribe, resync and fallback poll the stream re-reads the open\n * permission and elicitation decisions of the conversation's agent sessions\n * and emits replayed `decision.changed` events: `created` for an open\n * decision it has not emitted, `resolved` for one it emitted open that no\n * longer is. And\n * for every turn it saw start whose session is no longer running, it emits a\n * replayed `conversation.turn.ended` (stop reason null). Turns that started\n * and ended while it was away arrive only as messages.\n */\n recoverTransient?: boolean;\n // While the realtime transport reports errors, a following stream polls the\n // same recovery every `timing.pollIntervalMs` until it is subscribed again.\n // Without `resumeFrom` or `afterSeq`, the stream reads the newest message when it is\n // called and, once subscribed, recovers every change after it (thread replies included),\n // so nothing posted while the subscription registers is lost.\n}\n\nexport interface SendMessageOptionsIface extends SignalOptionsIface {\n clientMessageId?: string;\n replyTo?: string;\n threadRootId?: string;\n /** Ids of earlier messages in the conversation to quote, in order. */\n quotes?: string[];\n /** Mentioned participant ids. */\n mentions?: string[];\n attachmentIds?: string[];\n /** When the person submitted, for the prompt-to-inference trace; defaults to now. */\n clientSubmittedAtMs?: number;\n}\n\nexport type ParticipantCreateInput =\n | { user: string }\n | {\n agent: string;\n routingMode?: EnumInput<\n NonNullable<Extract<ParticipantInput, { agent: string }>['routingMode']>\n >;\n };\n\nexport interface SentMessageIface {\n message: ConversationMessageIface;\n messageId: string;\n seq: number;\n /** One entry per agent participant the message was routed to. */\n deliveries: MessageDeliveryIface[];\n}\n\nexport interface ListMessagesOptionsIface extends SignalOptionsIface {\n before?: number;\n after?: number;\n limit?: number;\n /** Thread root message id, or `MessageThreadFilter.All` for the timeline plus every thread. */\n thread?: string;\n /** ISO instant: messages created or updated after it (the first page of a change scan). */\n updatedAfter?: string;\n /** A previous page's `nextUpdatedCursor`: continue the change scan after it. */\n updatedCursor?: string;\n}\n\nexport interface UploadAttachmentArgsIface extends SignalOptionsIface {\n name: string;\n contentType: string;\n data: Blob | ArrayBuffer;\n}\n\nexport interface ConversationHandleIface {\n /** Durable accepted prompt receipts for a message, including queued deliveries once admitted. */\n deliveries: (\n args: { messageId: string },\n options?: SignalOptionsIface,\n ) => Promise<MessageDeliveryIface[]>;\n\n id: string;\n info: (options?: SignalOptionsIface) => Promise<ConversationIface>;\n send: (content: ContentInput, options?: SendMessageOptionsIface) => Promise<SentMessageIface>;\n events: (options?: ConversationEventsOptionsIface) => AsyncIterableIterator<ConversationEvent>;\n messages: (options?: ListMessagesOptionsIface) => Promise<ConversationMessagesPageIface>;\n /** One message by id (`GET /v1/conversations/:id/messages/:messageId`), e.g. a thread root. */\n message: (\n args: { messageId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationMessageIface>;\n react: (\n args: { messageId: string; emoji: string },\n options?: SignalOptionsIface,\n ) => Promise<ReactionIface[]>;\n unreact: (\n args: { messageId: string; emoji: string },\n options?: SignalOptionsIface,\n ) => Promise<ReactionIface[]>;\n recordPushOpen: (\n args: { deliveryId: string },\n options?: SignalOptionsIface,\n ) => Promise<{ recorded: boolean }>;\n markRead: (args: { throughSeq: number }, options?: SignalOptionsIface) => Promise<ReadStateIface>;\n /**\n * Marks a thread read through one of its replies' seq and follows it\n * (`POST \u2026/threads/:rootId/read`); the conversation's own unread count\n * moves with `markRead`.\n */\n markThreadRead: (\n args: { rootId: string; throughSeq: number },\n options?: SignalOptionsIface,\n ) => Promise<void>;\n /**\n * Tells the other members the caller is typing (`POST \u2026/typing`), realtime\n * only. A `true` lapses on its own after a few seconds, so composers repeat\n * it while typing continues and send `false` when the draft is sent or cleared.\n */\n typing: (args: { typing: boolean }, options?: SignalOptionsIface) => Promise<void>;\n /**\n * Hands something that happened outside the conversation (`POST \u2026/events`)\n * to its Default agent as input from you, not as a message: the agent's\n * reply carries the source as its caption. The same `eventId` from the same\n * source is accepted once; the receipt says whether the agent was prompted.\n */\n postEvent: (\n event: PostConversationEventRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<PostConversationEventResponseIface>;\n respond: (\n args: RespondArgs,\n options?: SignalOptionsIface,\n ) => Promise<RespondDecisionResponseIface>;\n /** Stops the agents' running turns in this conversation. */\n cancel: (\n options?: SignalOptionsIface & { reason?: string; throughMessageSeq?: number },\n ) => Promise<void>;\n participants: (options?: SignalOptionsIface) => Promise<ParticipantIface[]>;\n /**\n * Each agent participant's session state, read now: whether a turn is\n * running in it. What a client re-reads when it may have missed a\n * `conversation.turn.ended` (`events()` reconciles the turns it saw itself).\n */\n turns: (options?: SignalOptionsIface) => Promise<ConversationAgentTurnIface[]>;\n addParticipant: (\n participant: ParticipantCreateInput,\n options?: SignalOptionsIface,\n ) => Promise<ParticipantIface>;\n /**\n * Changes an agent's routing mode (owners and admins) or a person's role\n * (owners, groups only; the last owner cannot step down). One field per call.\n */\n updateParticipant: (\n args: { participantId: string } & Omit<\n UpdateParticipantRequestIface,\n 'routingMode' | 'role'\n > & {\n routingMode?: EnumInput<NonNullable<UpdateParticipantRequestIface['routingMode']>>;\n role?: EnumInput<NonNullable<UpdateParticipantRequestIface['role']>>;\n },\n options?: SignalOptionsIface,\n ) => Promise<ParticipantIface>;\n removeParticipant: (\n args: { participantId: string },\n options?: SignalOptionsIface,\n ) => Promise<void>;\n update: (\n patch: UpdateConversationRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationIface>;\n delete: (args: { messageId: string }, options?: SignalOptionsIface) => Promise<void>;\n uploadAttachment: (args: UploadAttachmentArgsIface) => Promise<AttachmentUploadIface>;\n /**\n * A fresh presigned download URL for one attachment\n * (`GET /v1/conversations/:id/attachments/:attachmentId`). URLs on messages\n * expire; resolve through this before opening one that may be stale.\n */\n attachmentUrl: (\n args: { attachmentId: string },\n options?: SignalOptionsIface,\n ) => Promise<AttachmentDownloadIface>;\n /**\n * The conversation's sandboxes (the computer tile): status, capabilities and\n * whether a preview is available (`GET /v1/conversations/:id/sandboxes`).\n * Never starts a parked sandbox.\n */\n sandboxes: (options?: SignalOptionsIface) => Promise<ConversationSandboxIface[]>;\n /** One directory of a running sandbox, confined to its workspace (`\u2026/sandboxes/:bindingId/files`). */\n sandboxFiles: (\n args: { bindingId: string; path?: string; snapshotId?: string },\n options?: SignalOptionsIface,\n ) => Promise<SandboxDirectoryIface>;\n /** Resolves a file or directory without waking its sandbox. */\n sandboxPath: (\n args: { bindingId: string; path?: string; snapshotId?: string },\n options?: SignalOptionsIface,\n ) => Promise<SandboxPathIface>;\n /** Bounded recursive path search; truncated signals incomplete traversal. */\n searchSandboxFiles: (\n args: { bindingId: string; path?: string; query: string; limit?: number },\n options?: SignalOptionsIface,\n ) => Promise<SandboxSearchIface>;\n /** A byte range of a file in a running sandbox, at most 1 MiB (`\u2026/sandboxes/:bindingId/file`). */\n sandboxFile: (\n args: {\n bindingId: string;\n path: string;\n offset?: number;\n length?: number;\n snapshotId?: string;\n },\n options?: SignalOptionsIface,\n ) => Promise<SandboxFileIface>;\n inspectSandboxProcesses(\n args: { bindingId: string; request: ProcessInspectionRequestIface },\n options?: SignalOptionsIface,\n ): Promise<ProcessInspectionResultIface>;\n /** Opens a provider editor for an existing workspace, with write authorization. */\n openSandboxEditor(\n args: { bindingId: string },\n options?: SignalOptionsIface,\n ): Promise<SandboxEditorSessionIface>;\n refreshSandboxEditor(\n args: { bindingId: string; editorId: string; authorizationId: string },\n options?: SignalOptionsIface,\n ): Promise<SandboxEditorSessionIface>;\n closeSandboxEditor(\n args: { bindingId: string; editorId: string; authorizationId: string },\n options?: SignalOptionsIface & { keepalive?: boolean },\n ): Promise<void>;\n /** Raw streaming bytes (`\u2026/file/content`). The caller consumes or cancels the response body. */\n sandboxFileContent: (\n args: SandboxFileContentArgsIface,\n options?: SignalOptionsIface,\n ) => Promise<Response>;\n /**\n * An authenticated request for a browser/native media or download client.\n * Cookie clients can use the URL directly; bearer clients must supply headers.\n * Every request rechecks membership and confinement; never wakes the sandbox.\n */\n sandboxFileContentRequest: (\n args: SandboxFileContentArgsIface,\n ) => Promise<SandboxFileContentRequestIface>;\n /** A short-lived screen preview of a running sandbox; 404 when it serves none (`\u2026/preview`). */\n sandboxPreview: (\n args: { bindingId: string; viewOnly?: boolean },\n options?: SignalOptionsIface,\n ) => Promise<SandboxPreviewType>;\n /** Starts a parked sandbox (conversation owners and admins; `POST \u2026/wake`). */\n wakeSandbox: (\n args: { bindingId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationSandboxIface>;\n /** The conversation's runtime schedules: reminders and recurring checks (`GET \u2026/schedules`). */\n schedules: (options?: SignalOptionsIface) => Promise<ConversationScheduleIface[]>;\n /**\n * Creates a schedule owned by one agent participant (`POST \u2026/schedules`).\n * Agents create their own; people need to be conversation owners or admins.\n */\n createSchedule: (\n args: CreateConversationScheduleRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationScheduleIface>;\n /** Changes a schedule (its agent, or conversation owners and admins; `PATCH \u2026/schedules/:id`). */\n updateSchedule: (\n args: { scheduleId: string } & UpdateConversationScheduleRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationScheduleIface>;\n /** Deletes a schedule (`DELETE \u2026/schedules/:id`). */\n deleteSchedule: (args: { scheduleId: string }, options?: SignalOptionsIface) => Promise<void>;\n /**\n * The conversations this one handed work to, with what their agents are\n * doing (`GET \u2026/links`). Their replies and waits arrive here as messages.\n */\n links: (options?: SignalOptionsIface) => Promise<ConversationLinkIface[]>;\n /** Conversations receiving this conversation\u2019s delegated results. */\n parentLinks: (options?: SignalOptionsIface) => Promise<ConversationLinkIface[]>;\n /**\n * Links another conversation the caller belongs to (`POST \u2026/links`); linking\n * it again returns the same link. Links never form a cycle.\n */\n link: (\n args: { conversationId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationLinkIface>;\n /** Removes a link (`DELETE \u2026/links/:linkId`); both conversations remain. */\n unlink: (args: { linkId: string }, options?: SignalOptionsIface) => Promise<void>;\n}\n\nexport interface ConversationAgentTurnIface {\n participantId: string;\n sessionId: string;\n state: AgentSessionState | WireFallback;\n /** A turn is running or waiting on a decision. */\n running: boolean;\n}\n\n/** Session states in which a turn is open. */\nexport const TURN_OPEN_SESSION_STATES: ReadonlySet<AgentSessionState | WireFallback> = new Set([\n AgentSessionState.Running,\n AgentSessionState.RequiresAction,\n]);\n\nexport interface OpenedConversationIface extends ConversationHandleIface {\n conversation: ConversationIface;\n}\n\nexport interface CreateConversationArgsIface extends SignalOptionsIface {\n /**\n * The project (`prj_...`) a group chat is created in (editors only); omitted,\n * the API key's parent project (a signed-in person's: My Work).\n * A direct chat is the caller's own and lives in their personal project.\n */\n projectId?: string;\n kind: EnumInput<ConversationKind>;\n title?: string;\n participants: ParticipantCreateInput[];\n turnPolicy?: EnumInput<AgentTurnPolicy>;\n}\n\nexport interface ConversationsApiIface {\n /**\n * The conversations the caller can read.\n * Without `projectId`: everything the caller can access (an API key: its parent project and\n * every project it is granted; a person: every project they can read). `projectId` narrows to\n * that project and the projects below it.\n */\n list: (\n options?: SignalOptionsIface & {\n cursor?: string;\n limit?: number;\n includeArchived?: boolean;\n projectId?: string;\n },\n ) => Promise<ConversationListIface>;\n /** Finds or creates the caller's direct conversation with an agent. */\n direct: (args: { agent: string } & SignalOptionsIface) => Promise<OpenedConversationIface>;\n /**\n * Finds or creates the caller's own Project Agent thread in `projectId`, which\n * omitted, is the API key's parent project (a signed-in person's: My Work).\n */\n home: (options?: SignalOptionsIface & { projectId?: string }) => Promise<OpenedConversationIface>;\n create: (args: CreateConversationArgsIface) => Promise<OpenedConversationIface>;\n /** I/O-free handle. */\n get: (conversationId: string) => ConversationHandleIface;\n /** Full-text search over the caller's conversations (or one), newest first. */\n search: (\n args: {\n q: string;\n conversationId?: string;\n cursor?: string;\n limit?: number;\n } & SignalOptionsIface,\n ) => Promise<SearchMessagesPageIface>;\n /**\n * The caller's conversation list topic (`user.collection:<userId>:conversations`):\n * `conversation.list.changed` and `conversation.updated` events, and a\n * `collection.resync` whenever `list()` must be re-read (on every\n * subscription, resync and while realtime is down).\n */\n listEvents: (options?: CollectionEventsOptionsIface) => AsyncIterableIterator<CollectionEvent>;\n /**\n * What awaits the caller's answer across conversations.\n * Without `projectId`: everything the caller can access (an API key: its parent project and\n * every project it is granted; a person: every project they can read). `projectId` narrows to\n * that project and the projects below it.\n */\n decisions: (\n options?: SignalOptionsIface & { cursor?: string; limit?: number; projectId?: string },\n ) => Promise<DecisionsPageIface>;\n}\n\nconst conversationPath = (conversationId: string, suffix = ''): string =>\n `/v1/conversations/${encodePath(conversationId)}${suffix}`;\n\nconst messagePath = (conversationId: string, messageId: string, suffix = ''): string =>\n conversationPath(conversationId, `/messages/${encodePath(messageId)}${suffix}`);\n\ninterface ConversationStreamArgsIface {\n context: ClientContextIface;\n conversationId: string;\n options: ConversationEventsOptionsIface | undefined;\n listMessages: (options: ListMessagesOptionsIface) => Promise<ConversationMessagesPageIface>;\n listParticipants: (options: SignalOptionsIface) => Promise<ParticipantIface[]>;\n getSession: (sessionId: string, options: SignalOptionsIface) => Promise<AgentSessionIface>;\n sessionDecisions: (\n sessionId: string,\n options: SignalOptionsIface,\n ) => Promise<DecisionRecordIface[]>;\n}\n\n// Bounds on the ids a stream remembers to dedupe transient events.\nconst MAX_REMEMBERED = 4096;\n\n// `GET /v1/sessions/:id/decisions` returns at most this many open decisions; a\n// list that long may be truncated, so absence from it proves nothing.\nconst SESSION_DECISIONS_LIMIT = 200;\n\nconst remember = <Key, Value>(map: Map<Key, Value>, key: Key, value: Value): void => {\n map.delete(key);\n map.set(key, value);\n if (map.size > MAX_REMEMBERED) {\n const oldest = map.keys().next();\n if (oldest.done !== true) map.delete(oldest.value);\n }\n};\n\ntype TurnStartedEventIface = AgentRealtimeEventOf<AgentRealtimeKind.TurnStarted>;\n\nconst isTransientEvent = (event: AgentRealtimeEvent): boolean =>\n event.kind === AgentRealtimeKind.DecisionChanged ||\n event.kind === AgentRealtimeKind.TurnStarted ||\n event.kind === AgentRealtimeKind.TurnEnded;\n\nconst REPLAY_PAGE = 100;\n/**\n * Every recovery rescans this far behind the newest change seen: `updated_at`\n * is a transaction's start time, so a slow write (a lock wait) can commit\n * after newer changes were delivered.\n */\nexport const RECOVERY_SKEW_MS = 30_000;\n\nconst stampOf = (message: ConversationMessageIface): number =>\n Math.max(\n ...[message.updatedAt, message.deletedAt, message.createdAt].map((value) =>\n value == null ? 0 : Date.parse(value) || 0,\n ),\n );\n\n/** The newest copy of a message the stream has emitted (or the caller already had). */\nexport interface MessageVersionIface {\n /** The server's per-message change counter: a total order when both copies carry it. */\n revision: number | null;\n /** `updatedAt` in ms; distinct changes can share a millisecond. */\n updatedAt: number | null;\n /** Newest of updatedAt/deletedAt/createdAt, for messages without `updatedAt`. */\n stamp: number;\n deleted: boolean;\n final: boolean;\n fingerprint: string;\n}\n\nconst isoMs = (value: string | null): number | null => {\n if (value == null) return null;\n const ms = Date.parse(value);\n return Number.isNaN(ms) ? null : ms;\n};\n\nexport const messageVersionOf = (message: ConversationMessageIface): MessageVersionIface => ({\n revision: message.revision,\n updatedAt: isoMs(message.updatedAt),\n stamp: stampOf(message),\n deleted: message.deletedAt != null,\n final: message.streaming?.state === MessageStreamingState.Final,\n fingerprint: JSON.stringify([\n message.deletedAt,\n message.streaming?.state ?? null,\n message.body,\n message.reactions,\n ]),\n});\n\n/**\n * Whether `incoming` is newer than the copy already emitted; older or equal\n * copies are dropped. A deletion is never undone. `revision` orders copies\n * when both carry it. Otherwise `updatedAt` does, where a finalized reply\n * beats a streaming copy from the same millisecond; without either, a later\n * change time wins, a finalized reply is never undone by a copy at the same\n * time, and equal times fall back to content.\n */\nexport const isNewerMessageVersion = (\n incoming: MessageVersionIface,\n current: MessageVersionIface | undefined,\n): boolean => {\n if (current == null) return true;\n if (current.deleted && !incoming.deleted) return false;\n if (incoming.revision != null && current.revision != null) {\n return incoming.revision > current.revision;\n }\n if (incoming.updatedAt != null && current.updatedAt != null) {\n if (incoming.updatedAt !== current.updatedAt) return incoming.updatedAt > current.updatedAt;\n return incoming.final && !current.final;\n }\n if (incoming.stamp !== current.stamp) return incoming.stamp > current.stamp;\n if (current.final && !incoming.final) return false;\n return incoming.fingerprint !== current.fingerprint;\n};\n\ninterface PendingLiveIface {\n event: AgentRealtimeEvent;\n meta: ConversationEventMetaIface;\n // A transient event whose state was recorded when it arrived (or was recovered);\n // released as is.\n noted: boolean;\n}\n\n/**\n * Live conversation events. On every resubscribe or resync the stream\n * recovers what changed while it was away: messages created *or updated*\n * (including thread replies), scanned in the server's (updated_at, id) order.\n * The first scan starts at the newest change seen minus a skew; every scan\n * ends on the server's change cursor, and the next scan resumes from it, so\n * messages that share an update time are never skipped between pages.\n * Live events that arrive during recovery are held and released after it,\n * and message events are deduped by id and version, so a reconnect neither\n * loses nor repeats a message.\n */\nconst streamConversationEvents = (\n args: ConversationStreamArgsIface,\n): AsyncIterableIterator<ConversationEvent> => {\n const topic = agentRealtimeTopics.conversation(args.conversationId);\n const follow = args.options?.follow ?? true;\n const controller = new AbortController();\n const signal = AbortSignal.any([\n controller.signal,\n args.context.closeSignal,\n ...(args.options?.signal == null ? [] : [args.options.signal]),\n ]);\n const versions = new Map<string, MessageVersionIface>();\n let newestStamp: number | null = null;\n const subscribedAt = Date.now();\n let recoveryFloor: number | null = null;\n let subscribedOnce = false;\n let recovering = 0;\n let recovery: Promise<void> = Promise.resolve();\n const held: PendingLiveIface[] = [];\n const recoverTransientState = args.options?.recoverTransient ?? true;\n // Transient events emitted so far, so live and recovered copies are emitted once.\n // `noted` orders each entry against recovery snapshots (see recoverTransient).\n let transientClock = 0;\n const decisionsSeen = new Map<\n string,\n { state: DecisionEventState; decision: DecisionRecordIface; noted: number }\n >();\n const runningTurns = new Map<string, { turn: TurnStartedEventIface; noted: number }>();\n const endedTurns = new Map<string, true>();\n // The realtime transport reported a retryable error and has not resubscribed since.\n let degraded = false;\n let pollTimer: ReturnType<typeof setTimeout> | null = null;\n const clearPoll = (): void => {\n if (pollTimer != null) clearTimeout(pollTimer);\n pollTimer = null;\n };\n let unsubscribe: (() => void) | null = null;\n let detachAbort: () => void = () => {};\n let detachClose: () => void = () => {};\n const queue = createAsyncQueue<ConversationEvent>(() => {\n controller.abort();\n held.length = 0;\n clearPoll();\n unsubscribe?.();\n detachAbort();\n detachClose();\n });\n const resumeFrom = args.options?.resumeFrom ?? [];\n // Taken when `events()` is called, before subscribing; see recoverFromAnchor.\n const anchor =\n resumeFrom.length === 0 && args.options?.afterSeq == null\n ? args.listMessages({ limit: 1, thread: MessageThreadFilter.All, signal })\n : null;\n // A failed anchor read surfaces through the recovery that awaits it.\n anchor?.catch(() => {});\n for (const message of resumeFrom) {\n versions.set(message.id, messageVersionOf(message));\n newestStamp = Math.max(newestStamp ?? 0, stampOf(message));\n }\n\n /** Emits a message event only when it is newer than every copy of that message emitted so far. */\n const emitMessage = (\n message: ConversationMessageIface,\n meta: ConversationEventMetaIface,\n live: AgentRealtimeEvent | null,\n ): void => {\n const version = messageVersionOf(message);\n const previous = versions.get(message.id);\n if (!isNewerMessageVersion(version, previous)) return;\n versions.set(message.id, version);\n newestStamp = Math.max(newestStamp ?? 0, stampOf(message));\n if (live != null) {\n queue.push({ ...live, ...meta });\n return;\n }\n queue.push(\n previous == null\n ? { kind: AgentRealtimeKind.MessageCreated, message, ...meta }\n : { kind: AgentRealtimeKind.MessageUpdated, message, ...meta },\n );\n };\n\n /** Records a decision event; false when an equal or newer state was already emitted. */\n const noteDecision = (\n decision: DecisionRecordIface,\n state: DecisionEventState | WireFallback,\n ): boolean => {\n const seen = decisionsSeen.get(decision.id);\n if (state === DecisionEventState.Resolved) {\n if (seen?.state === DecisionEventState.Resolved) return false;\n transientClock += 1;\n remember(decisionsSeen, decision.id, { state, decision, noted: transientClock });\n return true;\n }\n if (state === DecisionEventState.Created) {\n if (seen != null) return false;\n transientClock += 1;\n remember(decisionsSeen, decision.id, { state, decision, noted: transientClock });\n return true;\n }\n return true;\n };\n\n /** Records a decision or turn event's state; false when it repeats one already emitted. */\n const noteTransient = (event: AgentRealtimeEvent): boolean => {\n if (event.kind === AgentRealtimeKind.DecisionChanged)\n return noteDecision(event.decision, event.state);\n if (event.kind === AgentRealtimeKind.TurnStarted) {\n if (!endedTurns.has(event.turnId)) {\n transientClock += 1;\n remember(runningTurns, event.turnId, { turn: event, noted: transientClock });\n }\n return true;\n }\n if (event.kind === AgentRealtimeKind.TurnEnded) {\n if (endedTurns.has(event.turnId)) return false;\n remember(endedTurns, event.turnId, true);\n runningTurns.delete(event.turnId);\n }\n return true;\n };\n\n const emitLive = (event: AgentRealtimeEvent, meta: ConversationEventMetaIface): void => {\n if (\n event.kind === AgentRealtimeKind.MessageCreated ||\n event.kind === AgentRealtimeKind.MessageUpdated\n ) {\n emitMessage(event.message, meta, event);\n return;\n }\n if (event.kind === AgentRealtimeKind.MessageDeleted) {\n // A deletion outranks every copy up to its time, so a held or replayed older copy cannot restore it.\n const current = versions.get(event.messageId);\n if (current?.deleted === true) return;\n const deletedAt = isoMs(event.deletedAt) ?? current?.stamp ?? 0;\n versions.set(event.messageId, {\n revision: current?.revision ?? null,\n updatedAt: Math.max(current?.updatedAt ?? 0, deletedAt),\n stamp: Math.max(current?.stamp ?? 0, deletedAt),\n deleted: true,\n final: current?.final ?? false,\n fingerprint: current?.fingerprint ?? '',\n });\n }\n if (!noteTransient(event)) return;\n queue.push({ ...event, ...meta });\n };\n\n const replayed = (message: ConversationMessageIface): ConversationEventMetaIface => ({\n topic,\n cursor: null,\n createdAt: message.updatedAt ?? message.createdAt,\n replayed: true,\n });\n\n const emitPage = (messages: ConversationMessageIface[]): void => {\n for (const message of [...messages].sort((left, right) => left.seq - right.seq)) {\n emitMessage(message, replayed(message), null);\n }\n };\n\n /**\n * One change scan, paged by the server's cursor. Every scan starts over from\n * the oldest writer active before the preceding scan (or the newest change\n * minus the skew for older servers), never from the last scan\u2019s cursor:\n * `updated_at` is the writing transaction's start time, so a change can\n * commit after a later one was already seen. Revision ordering drops the\n * repeats the overlap brings back.\n */\n const recoverChanges = async (): Promise<void> => {\n const since = Math.max(\n 0,\n Math.min(newestStamp ?? subscribedAt, recoveryFloor ?? Infinity) - RECOVERY_SKEW_MS,\n );\n let position: { updatedCursor: string } | { updatedAfter: string } = {\n updatedAfter: new Date(since).toISOString(),\n };\n let nextFloor: number | null = null;\n for (;;) {\n const page = await args.listMessages({\n ...position,\n thread: MessageThreadFilter.All,\n limit: REPLAY_PAGE,\n signal,\n });\n if (nextFloor == null && page.recoverySince != null) {\n const stamp = Date.parse(page.recoverySince);\n if (Number.isFinite(stamp)) nextFloor = stamp;\n }\n emitPage(page.messages);\n const next = page.nextUpdatedCursor;\n if (next == null || !page.hasMoreAfter || page.messages.length === 0) {\n recoveryFloor = nextFloor ?? recoveryFloor;\n return;\n }\n position = { updatedCursor: next };\n }\n };\n\n /**\n * With nothing to resume from, the stream anchors on the newest message at\n * the moment `events()` was called and, once subscribed, recovers every\n * change after it. So a message posted between a caller's first page and the\n * gateway registering the subscription still arrives (marked `replayed`).\n */\n const recoverFromAnchor = async (anchor: Promise<ConversationMessagesPageIface>) => {\n const page = await anchor;\n if (page.recoverySince != null) {\n const stamp = Date.parse(page.recoverySince);\n if (Number.isFinite(stamp)) recoveryFloor = stamp;\n }\n const newest = page.messages.reduce<ConversationMessageIface | null>(\n (best, message) => (best == null || message.seq > best.seq ? message : best),\n null,\n );\n if (newest != null && !versions.has(newest.id)) {\n versions.set(newest.id, messageVersionOf(newest));\n newestStamp = Math.max(newestStamp ?? 0, stampOf(newest));\n }\n await recoverChanges();\n };\n\n const recoverAfterSeq = async (afterSeq: number): Promise<void> => {\n let cursor = afterSeq;\n for (;;) {\n const page = await args.listMessages({\n after: cursor,\n thread: MessageThreadFilter.All,\n limit: REPLAY_PAGE,\n signal,\n });\n emitPage(page.messages);\n const next = Math.max(cursor, ...page.messages.map((message) => message.seq));\n if (!page.hasMoreAfter || next === cursor) return;\n cursor = next;\n }\n };\n\n const recoveredMeta = (): ConversationEventMetaIface => ({\n topic,\n cursor: null,\n createdAt: null,\n replayed: true,\n });\n\n /** A read that recovery may skip: retryable failures retry the recovery, others drop the read. */\n const optional = async <Value>(read: () => Promise<Value>): Promise<Value | null> => {\n try {\n return await read();\n } catch (cause) {\n if (isRetryableClientError(cause)) throw cause;\n return null;\n }\n };\n\n // Recovery runs while live events are held: a recovered transient event joins\n // them, so it is released after every live event that arrived before it.\n const emitRecovered = (event: AgentRealtimeEvent): void => {\n held.push({ event, meta: recoveredMeta(), noted: true });\n };\n\n /**\n * Re-reads what only realtime carries (see `recoverTransient`): the open\n * decisions and turn state of every agent participant's session.\n * Live transient events held during recovery record their state on arrival,\n * so the snapshot settles what was recorded before it was requested, and\n * never a turn or request that arrived live after it.\n */\n const recoverTransient = async (): Promise<void> => {\n if (!recoverTransientState) return;\n const asOf = transientClock;\n const participants = await optional(() => args.listParticipants({ signal }));\n const current =\n participants == null\n ? null\n : new Set(\n participants.flatMap((participant) =>\n participant.kind === ParticipantKind.Agent &&\n participant.sessionId != null &&\n participant.leftAt == null\n ? [participant.sessionId]\n : [],\n ),\n );\n // Sessions the stream holds open state for, including ones whose agent has since left.\n const remembered = new Set([\n ...[...decisionsSeen.values()].flatMap((seen) =>\n seen.state === DecisionEventState.Created && seen.decision.sessionId != null\n ? [seen.decision.sessionId]\n : [],\n ),\n ...[...runningTurns.values()].map((entry) => entry.turn.sessionId),\n ]);\n const checked = await Promise.all(\n [...new Set([...(current ?? []), ...remembered])].map(async (sessionId) => {\n const [session, open] = await Promise.all([\n optional(() => args.getSession(sessionId, { signal })),\n optional(() => args.sessionDecisions(sessionId, { signal })),\n ]);\n // An agent that left: its session is closed, and may no longer be readable.\n const departed = current != null && !current.has(sessionId);\n return {\n sessionId,\n running:\n session == null\n ? departed\n ? false\n : null\n : TURN_OPEN_SESSION_STATES.has(session.state),\n open: open ?? (departed ? [] : null),\n };\n }),\n );\n for (const { sessionId, running, open } of checked) {\n if (open != null) {\n const complete = open.length < SESSION_DECISIONS_LIMIT;\n const openIds = new Set(open.map((decision) => decision.id));\n for (const decision of open) {\n if (noteDecision(decision, DecisionEventState.Created))\n emitRecovered({\n kind: AgentRealtimeKind.DecisionChanged,\n decision,\n state: DecisionEventState.Created,\n });\n }\n for (const seen of [...decisionsSeen.values()]) {\n if (\n !complete ||\n seen.state !== DecisionEventState.Created ||\n seen.noted > asOf ||\n seen.decision.sessionId !== sessionId ||\n openIds.has(seen.decision.id)\n )\n continue;\n noteDecision(seen.decision, DecisionEventState.Resolved);\n emitRecovered({\n kind: AgentRealtimeKind.DecisionChanged,\n decision: seen.decision,\n state: DecisionEventState.Resolved,\n });\n }\n }\n if (running !== false) continue;\n for (const { turn, noted } of [...runningTurns.values()]) {\n if (turn.sessionId !== sessionId || noted > asOf) continue;\n runningTurns.delete(turn.turnId);\n remember(endedTurns, turn.turnId, true);\n emitRecovered({\n kind: AgentRealtimeKind.TurnEnded,\n conversationId: turn.conversationId,\n participantId: turn.participantId,\n sessionId: turn.sessionId,\n turnId: turn.turnId,\n stopReason: null,\n });\n }\n }\n };\n\n /** Runs a recovery while holding live events; the cursor is captured now, not when it runs. */\n const scheduleRecovery = (run: () => Promise<void>): void => {\n recovering += 1;\n recovery = recovery\n .then(async () => {\n let delay = 250;\n while (!queue.closed()) {\n try {\n await run();\n return;\n } catch (cause) {\n if (!follow || !isRetryableClientError(cause)) throw cause;\n await new Promise<void>((resolve) => {\n const done = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', done);\n resolve();\n };\n const timer = setTimeout(done, delay);\n if (signal.aborted) done();\n else signal.addEventListener('abort', done, { once: true });\n });\n delay = Math.min(delay * 2, 30_000);\n }\n }\n })\n .then(() => {\n recovering -= 1;\n if (recovering > 0) return;\n for (const entry of held.splice(0)) {\n if (entry.noted) queue.push({ ...entry.event, ...entry.meta });\n else emitLive(entry.event, entry.meta);\n }\n })\n .catch((cause) => queue.fail(cause));\n };\n\n // Reads the newest change when it runs, after any recovery queued before it.\n let newestRecoveryPending = false;\n let newestRecoveryRequested = false;\n const recoverFromNewest = (): void => {\n newestRecoveryRequested = true;\n if (newestRecoveryPending) return;\n newestRecoveryPending = true;\n scheduleRecovery(async () => {\n do {\n newestRecoveryRequested = false;\n await recoverChanges();\n await recoverTransient();\n } while (newestRecoveryRequested && !queue.closed());\n newestRecoveryPending = false;\n });\n };\n\n let initialRecoveryStarted = false;\n /** What the first subscription (or, while realtime is down, the first poll) recovers. */\n const startInitialRecovery = (): void => {\n if (initialRecoveryStarted) return;\n initialRecoveryStarted = true;\n const afterSeq = args.options?.afterSeq;\n if (afterSeq != null) scheduleRecovery(() => recoverAfterSeq(afterSeq));\n if (resumeFrom.length > 0) recoverFromNewest();\n if (anchor != null)\n scheduleRecovery(async () => {\n try {\n await recoverFromAnchor(anchor);\n } catch (cause) {\n if (!isRetryableClientError(cause)) throw cause;\n // A later anchor could hide messages written during the outage.\n await recoverChanges();\n }\n });\n // recoverFromNewest recovers transient state itself.\n if (resumeFrom.length === 0) scheduleRecovery(recoverTransient);\n };\n\n // HTTP polling while the realtime transport reports errors.\n const poll = (): void => {\n pollTimer = null;\n if (!degraded || queue.closed()) return;\n if (initialRecoveryStarted) recoverFromNewest();\n else startInitialRecovery();\n void recovery.then(() => {\n if (!degraded || queue.closed() || pollTimer != null) return;\n pollTimer = setTimeout(poll, args.context.timing.conversationPollIntervalMs);\n });\n };\n\n const onFrame = (raw: RealtimeTransportFrameIface): void => {\n const frame = agentRealtimeFrameSchema.safeParse(raw);\n if (!frame.success || queue.closed()) return;\n switch (frame.data.type) {\n case AgentRealtimeFrameType.Event: {\n const envelope = frame.data;\n const entry = {\n event: parseAgentRealtimeEvent(envelope),\n meta: {\n topic: envelope.topic,\n cursor: envelope.cursor,\n createdAt: envelope.createdAt,\n replayed: false,\n },\n };\n if (recovering > 0) {\n // Ending explicitly preserves transient events; a caller can reopen and recover messages.\n if (held.length >= 1024) {\n queue.fail(\n clientError({\n code: ClientErrorCode.Network,\n status: 0,\n message: 'Conversation recovery buffer is full; reconnect from the last message.',\n }),\n );\n return;\n }\n // Transient events record their state now, so recovery reconciles them.\n if (isTransientEvent(entry.event)) {\n if (noteTransient(entry.event)) held.push({ ...entry, noted: true });\n } else held.push({ ...entry, noted: false });\n } else emitLive(entry.event, entry.meta);\n return;\n }\n case AgentRealtimeFrameType.Subscribed: {\n degraded = false;\n clearPoll();\n if (!subscribedOnce) {\n subscribedOnce = true;\n // Polls during an outage before the first subscription already ran the initial recovery.\n if (initialRecoveryStarted) recoverFromNewest();\n else startInitialRecovery();\n } else {\n recoverFromNewest();\n args.options?.onResubscribed?.();\n }\n if (!follow) void recovery.then(() => queue.end());\n return;\n }\n case AgentRealtimeFrameType.ResyncRequired:\n recoverFromNewest();\n args.options?.onResubscribed?.();\n return;\n case AgentRealtimeFrameType.Error:\n if (isTerminalRealtimeError(frame.data)) {\n queue.fail(\n realtimeSubscriptionError({\n topic: frame.data.topic ?? topic,\n code: frame.data.code ?? 'unknown',\n message: frame.data.message ?? 'Realtime subscription was refused',\n }),\n );\n return;\n }\n // Retryable: the transport resubscribes (and its `subscribed` runs recovery);\n // meanwhile the stream recovers over HTTP. A non-following stream ends once\n // that recovery is current.\n if (!follow) {\n if (subscribedOnce) return;\n subscribedOnce = true;\n startInitialRecovery();\n void recovery.then(() => queue.end());\n return;\n }\n if (!degraded) {\n degraded = true;\n poll();\n }\n return;\n default:\n return;\n }\n };\n\n detachAbort = failOnAbort(queue, signal);\n detachClose = failOnAbort(queue, args.context.closeSignal);\n if (!queue.closed()) {\n const subscribeOptions =\n args.options?.afterCursor == null ? undefined : { afterCursor: args.options.afterCursor };\n const stop = args.context.realtime().subscribe(topic, onFrame, subscribeOptions);\n if (queue.closed()) stop();\n else unsubscribe = stop;\n }\n return queue.iterator;\n};\n\nexport const createConversationHandle = (\n context: ClientContextIface,\n conversationId: string,\n): ConversationHandleIface => {\n const { http } = context;\n\n const sandboxFileContentRequest = async (\n args: SandboxFileContentArgsIface,\n ): Promise<SandboxFileContentRequestIface> => {\n if (args.path.length === 0 || args.path.length > 4096 || args.path.includes('\\0')) {\n throw clientError({\n message: 'Invalid sandbox file path',\n status: 0,\n code: ClientErrorCode.InvalidRequest,\n });\n }\n const target = http.url(\n conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/file/content`),\n );\n target.searchParams.set('path', args.path);\n if (args.snapshotId != null) target.searchParams.set('snapshotId', args.snapshotId);\n if (args.download != null) target.searchParams.set('download', String(args.download));\n const headers = await http.headers();\n if (args.range != null) headers.range = args.range;\n return {\n url: target.toString(),\n headers,\n credentials: http.usesCookies ? 'include' : 'omit',\n };\n };\n\n const listMessages = (options: ListMessagesOptionsIface = {}) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/messages'),\n query: {\n before: options.before,\n after: options.after,\n limit: options.limit,\n thread: options.thread,\n updatedAfter: options.updatedAfter,\n updatedCursor: options.updatedCursor,\n },\n response: conversationMessagesPageSchema,\n signal: options.signal,\n });\n\n const listParticipants = async (options: SignalOptionsIface) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/participants'),\n response: participantListSchema,\n signal: options.signal,\n })\n ).participants;\n\n const getSession = (sessionId: string, options: SignalOptionsIface) =>\n http.request({\n method: HttpMethod.Get,\n path: `/v1/sessions/${encodePath(sessionId)}`,\n response: sessionSchema,\n signal: options.signal,\n });\n\n const sessionDecisions = async (sessionId: string, options: SignalOptionsIface) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: `/v1/sessions/${encodePath(sessionId)}/decisions`,\n response: decisionRecordListSchema,\n signal: options.signal,\n })\n ).decisions;\n\n const reaction = async (args: {\n method: HttpMethod;\n messageId: string;\n emoji: string;\n signal?: AbortSignal;\n }): Promise<ReactionIface[]> =>\n (\n await http.request({\n method: args.method,\n path: messagePath(conversationId, args.messageId, '/reactions'),\n body: { schema: reactionRequestSchema, value: { emoji: args.emoji } },\n response: reactionsResponseSchema,\n signal: args.signal,\n })\n ).reactions;\n\n return {\n id: conversationId,\n info: (options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId),\n response: conversationSchema,\n signal: options?.signal,\n }),\n send: async (content, options) => {\n const sent = await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/messages'),\n body: {\n schema: sendMessageRequestSchema,\n value: {\n content,\n clientMessageId: options?.clientMessageId ?? context.newKey(),\n replyTo: options?.replyTo,\n threadRootId: options?.threadRootId,\n quotes: options?.quotes,\n mentions: options?.mentions,\n attachmentIds: options?.attachmentIds,\n clientSubmittedAtMs: options?.clientSubmittedAtMs ?? context.now(),\n },\n },\n response: sendMessageResponseSchema,\n signal: options?.signal,\n });\n return {\n message: sent.message,\n messageId: sent.message.id,\n seq: sent.message.seq,\n deliveries: sent.deliveries,\n };\n },\n events: (options) =>\n streamConversationEvents({\n context,\n conversationId,\n options,\n listMessages,\n listParticipants,\n getSession,\n sessionDecisions,\n }),\n messages: (options) => listMessages(options),\n deliveries: async (args, options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: `${messagePath(conversationId, args.messageId)}/deliveries`,\n response: messageDeliveriesSchema,\n signal: options?.signal,\n })\n ).deliveries,\n message: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: messagePath(conversationId, args.messageId),\n response: conversationMessageSchema,\n signal: options?.signal,\n }),\n react: (args, options) =>\n reaction({ method: HttpMethod.Post, ...args, signal: options?.signal }),\n unreact: (args, options) =>\n reaction({ method: HttpMethod.Delete, ...args, signal: options?.signal }),\n markThreadRead: async ({ rootId, throughSeq }, options) => {\n await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, `/threads/${encodePath(rootId)}/read`),\n body: { schema: markReadRequestSchema, value: { throughSeq } },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n postEvent: (event, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/events'),\n body: { schema: postConversationEventRequestSchema, value: event },\n response: postConversationEventResponseSchema,\n signal: options?.signal,\n }),\n typing: async (args, options) => {\n await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/typing'),\n body: { schema: typingRequestSchema, value: args },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n recordPushOpen: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(\n conversationId,\n `/push-deliveries/${encodeURIComponent(args.deliveryId)}/open`,\n ),\n response: pushDeliveryOpenResponseSchema,\n signal: options?.signal,\n }),\n markRead: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/read'),\n body: { schema: markReadRequestSchema, value: args },\n response: readStateSchema,\n signal: options?.signal,\n }),\n respond: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/respond'),\n body: {\n schema: respondDecisionSchema,\n value: { decisionId: args.decisionId, outcome: outcomeOf(args) },\n },\n response: respondDecisionResponseSchema,\n signal: options?.signal,\n context: { decisionId: args.decisionId },\n }),\n cancel: async (options) => {\n await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/cancel'),\n body: {\n schema: cancelConversationRequestSchema,\n value: { reason: options?.reason, throughMessageSeq: options?.throughMessageSeq },\n },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n participants: (options) => listParticipants({ signal: options?.signal }),\n turns: async (options) => {\n const participants = await listParticipants({ signal: options?.signal });\n return Promise.all(\n participants.flatMap((participant) => {\n const sessionId = participant.sessionId;\n if (participant.kind !== ParticipantKind.Agent || sessionId == null) return [];\n return [\n getSession(sessionId, { signal: options?.signal }).then(\n (session): ConversationAgentTurnIface => ({\n participantId: participant.id,\n sessionId,\n state: session.state,\n running: TURN_OPEN_SESSION_STATES.has(session.state),\n }),\n ),\n ];\n }),\n );\n },\n addParticipant: (participant, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/participants'),\n body: { schema: participantInputSchema, value: participant },\n response: participantSchema,\n signal: options?.signal,\n }),\n updateParticipant: ({ participantId, ...patch }, options) =>\n http.request({\n method: HttpMethod.Patch,\n path: conversationPath(conversationId, `/participants/${encodePath(participantId)}`),\n body: { schema: updateParticipantRequestSchema, value: patch },\n response: participantSchema,\n signal: options?.signal,\n }),\n removeParticipant: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(conversationId, '/participants'),\n body: { schema: removeParticipantRequestSchema, value: args },\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n update: (patch, options) =>\n http.request({\n method: HttpMethod.Patch,\n path: conversationPath(conversationId),\n body: { schema: updateConversationRequestSchema, value: patch },\n response: conversationSchema,\n signal: options?.signal,\n }),\n delete: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: messagePath(conversationId, args.messageId),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n links: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/links'),\n response: conversationLinkListSchema,\n signal: options?.signal,\n })\n ).links,\n parentLinks: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/parent-links'),\n response: conversationLinkListSchema,\n signal: options?.signal,\n })\n ).links,\n link: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/links'),\n body: { schema: createConversationLinkRequestSchema, value: args },\n response: conversationLinkSchema,\n signal: options?.signal,\n }),\n unlink: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(conversationId, `/links/${encodePath(args.linkId)}`),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n attachmentUrl: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/attachments/${encodePath(args.attachmentId)}`),\n response: attachmentDownloadSchema,\n signal: options?.signal,\n }),\n sandboxes: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/sandboxes'),\n response: conversationSandboxListSchema,\n signal: options?.signal,\n })\n ).sandboxes,\n sandboxFiles: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/files`),\n query: { path: args.path, snapshotId: args.snapshotId },\n response: sandboxDirectorySchema,\n signal: options?.signal,\n }),\n sandboxPath: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/path`),\n query: { path: args.path, snapshotId: args.snapshotId },\n response: sandboxPathSchema,\n signal: options?.signal,\n }),\n searchSandboxFiles: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/files/search`,\n ),\n query: { path: args.path, query: args.query, limit: args.limit },\n response: sandboxSearchSchema,\n signal: options?.signal,\n }),\n sandboxFile: (args, options) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/file`),\n query: {\n path: args.path,\n offset: args.offset,\n length: args.length,\n snapshotId: args.snapshotId,\n },\n response: sandboxFileSchema,\n signal: options?.signal,\n }),\n sandboxFileContentRequest,\n openSandboxEditor: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/editor`),\n response: sandboxEditorSessionSchema,\n signal: options?.signal,\n }),\n refreshSandboxEditor: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/editor/${encodePath(args.editorId)}/refresh`,\n ),\n body: {\n schema: sandboxEditorAuthorizationSchema,\n value: { authorizationId: args.authorizationId },\n },\n response: sandboxEditorSessionSchema,\n signal: options?.signal,\n }),\n closeSandboxEditor: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/editor/${encodePath(args.editorId)}`,\n ),\n body: {\n schema: sandboxEditorAuthorizationSchema,\n value: { authorizationId: args.authorizationId },\n },\n response: okResponseSchema,\n signal: options?.signal,\n keepalive: options?.keepalive,\n });\n },\n sandboxFileContent: async (args, options) => {\n const request = await sandboxFileContentRequest(args);\n let response: Response;\n try {\n response = await http.fetch(request.url, {\n method: HttpMethod.Get,\n headers: request.headers,\n credentials: request.credentials,\n signal: options?.signal,\n });\n } catch (cause) {\n if (options?.signal?.aborted === true) throw cause;\n throw clientError({\n message: 'Sandbox file request failed',\n status: 0,\n code: ClientErrorCode.Network,\n cause,\n });\n }\n if (!response.ok) {\n let text: string;\n try {\n text = await response.text();\n } catch (cause) {\n if (options?.signal?.aborted === true) throw cause;\n throw clientError({\n message: 'Sandbox file response failed',\n status: 0,\n code: ClientErrorCode.Network,\n cause,\n });\n }\n throw errorFromResponse({ status: response.status, text, context: undefined });\n }\n return response;\n },\n inspectSandboxProcesses: (args, options) => {\n const request = processInspectionRequestSchema.parse(args.request);\n const { operation } = request;\n const suffix =\n operation === ProcessInspectionOperation.Available\n ? '/available'\n : 'processId' in request\n ? '/' + encodePath(request.processId)\n : '';\n const query: NonNullable<HttpRequestArgsIface<ProcessInspectionResultIface>['query']> = {};\n if ('bootId' in request) query.bootId = request.bootId;\n if ('cursor' in request) query.cursor = request.cursor;\n if ('limit' in request) query.limit = request.limit;\n return http.request({\n method: operation === ProcessInspectionOperation.Stop ? HttpMethod.Delete : HttpMethod.Get,\n path: conversationPath(\n conversationId,\n `/sandboxes/${encodePath(args.bindingId)}/processes${suffix}`,\n ),\n query,\n response: processInspectionResultSchema,\n signal: options?.signal,\n });\n },\n sandboxPreview: (args, options) => {\n const request: HttpRequestArgsIface<SandboxPreviewType> = {\n method: args.viewOnly === false ? HttpMethod.Post : HttpMethod.Get,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/preview`),\n response: sandboxPreviewSchema,\n signal: options?.signal,\n };\n if (args.viewOnly === false)\n request.body = { schema: sandboxPreviewOptionsSchema, value: { viewOnly: false } };\n return http.request(request);\n },\n wakeSandbox: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, `/sandboxes/${encodePath(args.bindingId)}/wake`),\n response: conversationSandboxSchema,\n signal: options?.signal,\n }),\n schedules: async (options) =>\n (\n await http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId, '/schedules'),\n response: conversationScheduleListSchema,\n signal: options?.signal,\n })\n ).schedules,\n createSchedule: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/schedules'),\n body: { schema: createConversationScheduleRequestSchema, value: args },\n response: conversationScheduleSchema,\n signal: options?.signal,\n }),\n updateSchedule: ({ scheduleId, ...patch }, options) =>\n http.request({\n method: HttpMethod.Patch,\n path: conversationPath(conversationId, `/schedules/${encodePath(scheduleId)}`),\n body: { schema: updateConversationScheduleRequestSchema, value: patch },\n response: conversationScheduleSchema,\n signal: options?.signal,\n }),\n deleteSchedule: async (args, options) => {\n await http.request({\n method: HttpMethod.Delete,\n path: conversationPath(conversationId, `/schedules/${encodePath(args.scheduleId)}`),\n response: okResponseSchema,\n signal: options?.signal,\n });\n },\n uploadAttachment: async (args) => {\n const sizeBytes = 'byteLength' in args.data ? args.data.byteLength : args.data.size;\n const upload = await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/attachments'),\n body: {\n schema: createAttachmentUploadRequestSchema,\n value: { name: args.name, contentType: args.contentType, sizeBytes },\n },\n response: attachmentUploadSchema,\n signal: args.signal,\n });\n // Presigned upload: storage authenticates the URL, so it gets only the headers the\n // presign requires, through storageFetch, never the API fetch or its credentials.\n const response = await context.storageFetch(upload.uploadUrl, {\n method: upload.method,\n headers: { 'content-type': args.contentType, ...upload.headers },\n body: args.data,\n signal: args.signal,\n credentials: 'omit',\n });\n if (!response.ok) {\n throw clientError({\n message: `Attachment upload failed with status ${response.status}`,\n status: response.status,\n code: ClientErrorCode.UploadFailed,\n body: await response.text(),\n });\n }\n return upload;\n },\n };\n};\n\nexport const createConversationsApi = (context: ClientContextIface): ConversationsApiIface => {\n const opened = (conversation: ConversationIface): OpenedConversationIface => ({\n ...createConversationHandle(context, conversation.id),\n conversation,\n });\n return {\n list: (options) =>\n context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations',\n query: {\n cursor: options?.cursor,\n limit: options?.limit,\n includeArchived: options?.includeArchived,\n projectId: options?.projectId,\n },\n response: conversationListSchema,\n signal: options?.signal,\n }),\n direct: async (args) =>\n opened(\n await context.http.request({\n method: HttpMethod.Post,\n path: '/v1/conversations/direct',\n body: { schema: createDirectConversationRequestSchema, value: { agent: args.agent } },\n response: conversationSchema,\n signal: args.signal,\n }),\n ),\n home: async (options) =>\n opened(\n await context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations/home',\n query: { projectId: options?.projectId },\n response: conversationSchema,\n signal: options?.signal,\n }),\n ),\n create: async (args) =>\n opened(\n await context.http.request({\n method: HttpMethod.Post,\n path: '/v1/conversations',\n body: {\n schema: createConversationRequestSchema,\n value: {\n projectId: args.projectId,\n kind: args.kind,\n title: args.title,\n participants: args.participants,\n turnPolicy: args.turnPolicy,\n },\n },\n response: conversationSchema,\n signal: args.signal,\n }),\n ),\n get: (conversationId) => createConversationHandle(context, conversationId),\n search: (args) =>\n context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations/search',\n query: {\n q: args.q,\n conversationId: args.conversationId,\n cursor: args.cursor,\n limit: args.limit,\n },\n response: searchMessagesPageSchema,\n signal: args.signal,\n }),\n listEvents: (options) =>\n streamCollectionEvents({\n context,\n topicFor: agentRealtimeTopics.userConversations,\n collection: ClientCollection.Conversations,\n options,\n }),\n decisions: (options) =>\n context.http.request({\n method: HttpMethod.Get,\n path: '/v1/decisions',\n query: { cursor: options?.cursor, limit: options?.limit, projectId: options?.projectId },\n response: decisionsPageSchema,\n signal: options?.signal,\n }),\n };\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["anchor"]
7
7
  }
@@ -1,11 +1,11 @@
1
1
  import type { JsonValue } from '@finalai/agent-protocol';
2
2
  export declare enum AgentClientErrorName {
3
3
  Client = "ClientError",
4
- PendingRequest = "PendingRequestError",
4
+ Decision = "DecisionError",
5
5
  TurnRejected = "TurnRejectedError",
6
6
  RealtimeSubscription = "RealtimeSubscriptionError"
7
7
  }
8
- export declare enum PendingRequestErrorReason {
8
+ export declare enum DecisionErrorReason {
9
9
  NotFound = "not_found",
10
10
  NotInAudience = "not_in_audience",
11
11
  AlreadyResolved = "already_resolved",
@@ -32,11 +32,11 @@ interface ErrorFieldsIface {
32
32
  export interface ClientErrorIface extends Error, ErrorFieldsIface {
33
33
  name: AgentClientErrorName.Client;
34
34
  }
35
- /** Answering a pending request outside your audience, already resolved, expired, or unknown. */
36
- export interface PendingRequestErrorIface extends Error, ErrorFieldsIface {
37
- name: AgentClientErrorName.PendingRequest;
38
- pendingId: string | null;
39
- reason: PendingRequestErrorReason;
35
+ /** Answering a decision outside your audience, already resolved, expired, or unknown. */
36
+ export interface DecisionErrorIface extends Error, ErrorFieldsIface {
37
+ name: AgentClientErrorName.Decision;
38
+ decisionId: string | null;
39
+ reason: DecisionErrorReason;
40
40
  }
41
41
  /** The session is not accepting prompts; `state` is its ACP/session state. */
42
42
  export interface TurnRejectedErrorIface extends Error, ErrorFieldsIface {
@@ -49,7 +49,7 @@ export interface RealtimeSubscriptionErrorIface extends Error, ErrorFieldsIface
49
49
  name: AgentClientErrorName.RealtimeSubscription;
50
50
  topic: string;
51
51
  }
52
- export type AgentClientError = ClientErrorIface | PendingRequestErrorIface | TurnRejectedErrorIface | RealtimeSubscriptionErrorIface;
52
+ export type AgentClientError = ClientErrorIface | DecisionErrorIface | TurnRejectedErrorIface | RealtimeSubscriptionErrorIface;
53
53
  export interface ClientErrorArgsIface {
54
54
  message: string;
55
55
  status: number;
@@ -58,10 +58,10 @@ export interface ClientErrorArgsIface {
58
58
  cause?: unknown;
59
59
  }
60
60
  export declare const clientError: (args: ClientErrorArgsIface) => ClientErrorIface;
61
- export declare const pendingRequestError: (args: ClientErrorArgsIface & {
62
- pendingId: string | null;
63
- reason: PendingRequestErrorReason;
64
- }) => PendingRequestErrorIface;
61
+ export declare const decisionError: (args: ClientErrorArgsIface & {
62
+ decisionId: string | null;
63
+ reason: DecisionErrorReason;
64
+ }) => DecisionErrorIface;
65
65
  export declare const turnRejectedError: (args: ClientErrorArgsIface & {
66
66
  sessionId: string | null;
67
67
  state: string | null;
@@ -76,9 +76,9 @@ export declare const isTerminalRealtimeError: (frame: {
76
76
  code: string | null;
77
77
  retryable: boolean | null;
78
78
  }) => boolean;
79
- /** True for every SDK error (ClientError, PendingRequestError, TurnRejectedError). */
79
+ /** True for every SDK error (ClientError, DecisionError, TurnRejectedError). */
80
80
  export declare const isClientError: (cause: unknown) => cause is AgentClientError;
81
- export declare const isPendingRequestError: (cause: unknown) => cause is PendingRequestErrorIface;
81
+ export declare const isDecisionError: (cause: unknown) => cause is DecisionErrorIface;
82
82
  export declare const isTurnRejectedError: (cause: unknown) => cause is TurnRejectedErrorIface;
83
83
  export declare const isRealtimeSubscriptionError: (cause: unknown) => cause is RealtimeSubscriptionErrorIface;
84
84
  export declare const isRetryableClientError: (cause: unknown) => boolean;