@finalai/agents 0.11.0 → 0.13.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 (188) hide show
  1. package/HOSTING.md +334 -245
  2. package/README.md +214 -29
  3. package/dist/modules/agent-client/agent-input.d.mts +24 -0
  4. package/dist/modules/agent-client/agent-input.mjs +46 -0
  5. package/dist/modules/agent-client/agent-input.mjs.map +7 -0
  6. package/dist/modules/agent-client/channels.d.mts +128 -16
  7. package/dist/modules/agent-client/channels.mjs +216 -33
  8. package/dist/modules/agent-client/channels.mjs.map +2 -2
  9. package/dist/modules/agent-client/client.d.mts +91 -21
  10. package/dist/modules/agent-client/client.mjs +79 -24
  11. package/dist/modules/agent-client/client.mjs.map +2 -2
  12. package/dist/modules/agent-client/config-options.mjs +1 -2
  13. package/dist/modules/agent-client/config-options.mjs.map +2 -2
  14. package/dist/modules/agent-client/conversation-resources.d.mts +102 -0
  15. package/dist/modules/agent-client/conversation-resources.mjs +178 -0
  16. package/dist/modules/agent-client/conversation-resources.mjs.map +7 -0
  17. package/dist/modules/agent-client/conversations.d.mts +120 -38
  18. package/dist/modules/agent-client/conversations.mjs +386 -71
  19. package/dist/modules/agent-client/conversations.mjs.map +2 -2
  20. package/dist/modules/agent-client/defaults.d.mts +8 -0
  21. package/dist/modules/agent-client/defaults.mjs +77 -0
  22. package/dist/modules/agent-client/defaults.mjs.map +7 -0
  23. package/dist/modules/agent-client/errors.d.mts +22 -2
  24. package/dist/modules/agent-client/errors.mjs +19 -0
  25. package/dist/modules/agent-client/errors.mjs.map +2 -2
  26. package/dist/modules/agent-client/events.d.mts +62 -0
  27. package/dist/modules/agent-client/events.mjs +107 -0
  28. package/dist/modules/agent-client/events.mjs.map +7 -0
  29. package/dist/modules/agent-client/harnesses.d.mts +66 -0
  30. package/dist/modules/agent-client/harnesses.mjs +156 -0
  31. package/dist/modules/agent-client/harnesses.mjs.map +7 -0
  32. package/dist/modules/agent-client/http.d.mts +2 -1
  33. package/dist/modules/agent-client/http.mjs +21 -2
  34. package/dist/modules/agent-client/http.mjs.map +2 -2
  35. package/dist/modules/agent-client/index.d.mts +21 -6
  36. package/dist/modules/agent-client/index.mjs +26 -0
  37. package/dist/modules/agent-client/index.mjs.map +2 -2
  38. package/dist/modules/agent-client/integrations.d.mts +40 -0
  39. package/dist/modules/agent-client/integrations.mjs +92 -0
  40. package/dist/modules/agent-client/integrations.mjs.map +7 -0
  41. package/dist/modules/agent-client/local-host-protocol.d.mts +156 -0
  42. package/dist/modules/agent-client/local-host-protocol.mjs +258 -0
  43. package/dist/modules/agent-client/local-host-protocol.mjs.map +7 -0
  44. package/dist/modules/agent-client/local-host.d.mts +56 -0
  45. package/dist/modules/agent-client/local-host.mjs +200 -0
  46. package/dist/modules/agent-client/local-host.mjs.map +7 -0
  47. package/dist/modules/agent-client/oauth-clients.d.mts +36 -0
  48. package/dist/modules/agent-client/oauth-clients.mjs +67 -0
  49. package/dist/modules/agent-client/oauth-clients.mjs.map +7 -0
  50. package/dist/modules/agent-client/project-agents.d.mts +54 -0
  51. package/dist/modules/agent-client/project-agents.mjs +111 -0
  52. package/dist/modules/agent-client/project-agents.mjs.map +7 -0
  53. package/dist/modules/agent-client/project.d.mts +48 -0
  54. package/dist/modules/agent-client/project.mjs +66 -0
  55. package/dist/modules/agent-client/project.mjs.map +7 -0
  56. package/dist/modules/agent-client/projects.d.mts +61 -0
  57. package/dist/modules/agent-client/projects.mjs +145 -0
  58. package/dist/modules/agent-client/projects.mjs.map +7 -0
  59. package/dist/modules/agent-client/provide.d.mts +41 -0
  60. package/dist/modules/agent-client/provide.mjs +90 -0
  61. package/dist/modules/agent-client/provide.mjs.map +7 -0
  62. package/dist/modules/agent-client/publishers.d.mts +57 -0
  63. package/dist/modules/agent-client/publishers.mjs +109 -0
  64. package/dist/modules/agent-client/publishers.mjs.map +7 -0
  65. package/dist/modules/agent-client/requirements.d.mts +60 -0
  66. package/dist/modules/agent-client/requirements.mjs +83 -0
  67. package/dist/modules/agent-client/requirements.mjs.map +7 -0
  68. package/dist/modules/agent-client/sandbox-providers.d.mts +34 -0
  69. package/dist/modules/agent-client/sandbox-providers.mjs +75 -0
  70. package/dist/modules/agent-client/sandbox-providers.mjs.map +7 -0
  71. package/dist/modules/agent-client/sandbox-uri.d.mts +1 -1
  72. package/dist/modules/agent-client/sandbox-uri.mjs +4 -4
  73. package/dist/modules/agent-client/sandbox-uri.mjs.map +1 -1
  74. package/dist/modules/agent-client/sandboxes.d.mts +72 -0
  75. package/dist/modules/agent-client/sandboxes.mjs +138 -0
  76. package/dist/modules/agent-client/sandboxes.mjs.map +7 -0
  77. package/dist/modules/agent-client/schedules.d.mts +9 -0
  78. package/dist/modules/agent-client/schedules.mjs +17 -0
  79. package/dist/modules/agent-client/schedules.mjs.map +7 -0
  80. package/dist/modules/agent-client/sessions.d.mts +46 -8
  81. package/dist/modules/agent-client/sessions.mjs +91 -29
  82. package/dist/modules/agent-client/sessions.mjs.map +2 -2
  83. package/dist/modules/agent-client/start.d.mts +101 -0
  84. package/dist/modules/agent-client/start.mjs +260 -0
  85. package/dist/modules/agent-client/start.mjs.map +7 -0
  86. package/dist/modules/agent-client/test-fakes.d.mts +1 -0
  87. package/dist/modules/agent-client/test-fakes.mjs +3 -1
  88. package/dist/modules/agent-client/test-fakes.mjs.map +2 -2
  89. package/dist/modules/cli/agent-module.d.mts +39 -0
  90. package/dist/modules/cli/agent-module.mjs +89 -0
  91. package/dist/modules/cli/agent-module.mjs.map +7 -0
  92. package/dist/modules/cli/cli.d.mts +6 -6
  93. package/dist/modules/cli/cli.mjs +94 -120
  94. package/dist/modules/cli/cli.mjs.map +2 -2
  95. package/dist/modules/cli/conformance.d.mts +2 -6
  96. package/dist/modules/cli/conformance.mjs +5 -8
  97. package/dist/modules/cli/conformance.mjs.map +2 -2
  98. package/dist/modules/cli/main.mjs.map +1 -1
  99. package/dist/modules/cli/output.d.mts +0 -9
  100. package/dist/modules/cli/output.mjs +7 -85
  101. package/dist/modules/cli/output.mjs.map +2 -2
  102. package/dist/modules/harnesses.mjs.map +2 -2
  103. package/dist/modules/index.d.mts +0 -2
  104. package/dist/modules/index.mjs +0 -4
  105. package/dist/modules/index.mjs.map +2 -2
  106. package/dist/modules/integrations.d.mts +24 -0
  107. package/dist/modules/integrations.mjs +30 -0
  108. package/dist/modules/integrations.mjs.map +7 -0
  109. package/dist/modules/public.d.mts +10 -10
  110. package/dist/modules/public.mjs +29 -78
  111. package/dist/modules/public.mjs.map +2 -2
  112. package/dist/modules/sandboxes.d.mts +2 -0
  113. package/dist/modules/sandboxes.mjs +4 -0
  114. package/dist/modules/sandboxes.mjs.map +2 -2
  115. package/dist/modules/verify.d.mts +1 -0
  116. package/dist/modules/verify.mjs +2 -0
  117. package/dist/modules/verify.mjs.map +7 -0
  118. package/dist/modules/webhooks.d.mts +37 -0
  119. package/dist/modules/webhooks.mjs +100 -0
  120. package/dist/modules/webhooks.mjs.map +7 -0
  121. package/examples/release-scout/README.md +18 -10
  122. package/examples/release-scout/agent.ts +41 -0
  123. package/examples/release-scout/by-name.ts +43 -0
  124. package/examples/release-scout/db.ts +6 -0
  125. package/examples/release-scout/instructions.md +5 -0
  126. package/examples/release-scout/run-on-a-computer.ts +49 -0
  127. package/examples/release-scout/run.ts +38 -0
  128. package/package.json +37 -28
  129. package/dist/modules/agent-client/build.d.mts +0 -110
  130. package/dist/modules/agent-client/build.mjs +0 -213
  131. package/dist/modules/agent-client/build.mjs.map +0 -7
  132. package/dist/modules/authoring/final-channel.d.mts +0 -1
  133. package/dist/modules/authoring/final-channel.mjs +0 -2
  134. package/dist/modules/authoring/final-channel.mjs.map +0 -7
  135. package/dist/modules/authoring/index.d.mts +0 -1
  136. package/dist/modules/authoring/index.mjs +0 -2
  137. package/dist/modules/authoring/index.mjs.map +0 -7
  138. package/dist/modules/authoring/instructions.d.mts +0 -1
  139. package/dist/modules/authoring/instructions.mjs +0 -2
  140. package/dist/modules/authoring/instructions.mjs.map +0 -7
  141. package/dist/modules/authoring/providers.d.mts +0 -2
  142. package/dist/modules/authoring/providers.mjs +0 -1
  143. package/dist/modules/authoring/providers.mjs.map +0 -7
  144. package/dist/modules/cli/build.d.mts +0 -22
  145. package/dist/modules/cli/build.mjs +0 -77
  146. package/dist/modules/cli/build.mjs.map +0 -7
  147. package/dist/modules/cli/channel-install.d.mts +0 -12
  148. package/dist/modules/cli/channel-install.mjs +0 -25
  149. package/dist/modules/cli/channel-install.mjs.map +0 -7
  150. package/dist/modules/cli/channel-socket.d.mts +0 -9
  151. package/dist/modules/cli/channel-socket.mjs +0 -114
  152. package/dist/modules/cli/channel-socket.mjs.map +0 -7
  153. package/dist/modules/cli/dev.d.mts +0 -26
  154. package/dist/modules/cli/dev.mjs +0 -311
  155. package/dist/modules/cli/dev.mjs.map +0 -7
  156. package/dist/modules/cli/files.d.mts +0 -18
  157. package/dist/modules/cli/files.mjs +0 -66
  158. package/dist/modules/cli/files.mjs.map +0 -7
  159. package/dist/modules/cli/harness-descriptions.d.mts +0 -20
  160. package/dist/modules/cli/harness-descriptions.mjs +0 -70
  161. package/dist/modules/cli/harness-descriptions.mjs.map +0 -7
  162. package/dist/modules/cli/publish.d.mts +0 -15
  163. package/dist/modules/cli/publish.mjs +0 -92
  164. package/dist/modules/cli/publish.mjs.map +0 -7
  165. package/dist/modules/compile.d.mts +0 -3
  166. package/dist/modules/compile.mjs +0 -58
  167. package/dist/modules/compile.mjs.map +0 -7
  168. package/dist/modules/index.browser.d.mts +0 -4
  169. package/dist/modules/index.browser.mjs +0 -8
  170. package/dist/modules/index.browser.mjs.map +0 -7
  171. package/examples/custom-harness/README.md +0 -16
  172. package/examples/custom-harness/agent.ts +0 -154
  173. package/examples/custom-sandbox/README.md +0 -12
  174. package/examples/custom-sandbox/agent.ts +0 -14
  175. package/examples/custom-sandbox/sandbox.ts +0 -24
  176. package/examples/release-scout/agent/agent.ts +0 -22
  177. package/examples/release-scout/agent/channels/github-signature.ts +0 -27
  178. package/examples/release-scout/agent/channels/github.ts +0 -32
  179. package/examples/release-scout/agent/connections/linear.ts +0 -9
  180. package/examples/release-scout/agent/hooks/audit.ts +0 -24
  181. package/examples/release-scout/agent/instructions/org-context.ts +0 -26
  182. package/examples/release-scout/agent/instructions.md +0 -2
  183. package/examples/release-scout/agent/sandbox.ts +0 -20
  184. package/examples/release-scout/agent/schedules/daily-digest.md +0 -7
  185. package/examples/release-scout/agent/skills/triage/SKILL.md +0 -8
  186. package/examples/release-scout/agent/skills/triage/checklist.md +0 -3
  187. package/examples/release-scout/agent/tools/lookup_release_notes.ts +0 -24
  188. package/examples/release-scout/client.ts +0 -122
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/agent-client/conversations.ts"],
4
- "sourcesContent": ["import {\n ProcessInspectionOperation,\n processInspectionRequestSchema,\n processInspectionResultSchema,\n type ProcessInspectionRequestIface,\n type ProcessInspectionResultIface,\n} from '@finalai/agent-protocol';\nimport {\n agentRealtimeFrameSchema,\n AgentRealtimeFrameType,\n AgentRealtimeKind,\n agentRealtimeTopics,\n AgentSessionState,\n attachmentDownloadSchema,\n attachmentUploadSchema,\n cancelConversationRequestSchema,\n conversationLinkListSchema,\n conversationLinkSchema,\n conversationListSchema,\n conversationMessageSchema,\n conversationMessagesPageSchema,\n conversationSandboxListSchema,\n conversationSandboxSchema,\n conversationScheduleListSchema,\n conversationScheduleSchema,\n conversationSchema,\n createAttachmentUploadRequestSchema,\n createConversationLinkRequestSchema,\n createConversationRequestSchema,\n createConversationScheduleRequestSchema,\n createDirectConversationRequestSchema,\n DecisionEventState,\n decisionRecordListSchema,\n decisionsPageSchema,\n markReadRequestSchema,\n messageDeliveriesSchema,\n MessageStreamingState,\n MessageThreadFilter,\n okResponseSchema,\n parseAgentRealtimeEvent,\n participantInputSchema,\n ParticipantKind,\n participantListSchema,\n participantSchema,\n postConversationEventRequestSchema,\n postConversationEventResponseSchema,\n type PostConversationEventResponseIface,\n pushDeliveryOpenResponseSchema,\n reactionRequestSchema,\n reactionsResponseSchema,\n readStateSchema,\n removeParticipantRequestSchema,\n respondDecisionResponseSchema,\n respondDecisionSchema,\n sandboxDirectorySchema,\n sandboxEditorAuthorizationSchema,\n sandboxEditorSessionSchema,\n sandboxFileSchema,\n sandboxPathSchema,\n sandboxPreviewOptionsSchema,\n sandboxPreviewSchema,\n sandboxSearchSchema,\n searchMessagesPageSchema,\n sendMessageRequestSchema,\n sendMessageResponseSchema,\n sessionSchema,\n typingRequestSchema,\n updateConversationRequestSchema,\n updateConversationScheduleRequestSchema,\n updateParticipantRequestSchema,\n type AgentRealtimeEvent,\n type AgentRealtimeEventOf,\n type AgentSessionIface,\n type AgentTurnPolicy,\n type AttachmentDownloadIface,\n type AttachmentUploadIface,\n type ContentInput,\n type ConversationIface,\n type ConversationKind,\n type ConversationLinkIface,\n type ConversationListIface,\n type ConversationMessageIface,\n type ConversationMessagesPageIface,\n type ConversationSandboxIface,\n type ConversationScheduleIface,\n type CreateConversationScheduleRequestIface,\n type DecisionRecordIface,\n type DecisionsPageIface,\n type MessageDeliveryIface,\n type ParticipantIface,\n type ParticipantInput,\n type PostConversationEventRequestIface,\n type ReactionIface,\n type ReadStateIface,\n type RespondDecisionResponseIface,\n type SandboxDirectoryIface,\n type SandboxEditorSessionIface,\n type SandboxFileIface,\n type SandboxPathIface,\n type SandboxPreviewType,\n type SandboxSearchIface,\n type SearchMessagesPageIface,\n type UpdateConversationRequestIface,\n type UpdateConversationScheduleRequestIface,\n type UpdateParticipantRequestIface,\n type WireFallback,\n} from '@finalai/agent-protocol/agent-platform';\nimport { createAsyncQueue, failOnAbort } from \"./async-queue.mjs\";\nimport {\n streamCollectionEvents,\n type CollectionEvent,\n type CollectionEventsOptionsIface,\n} from \"./collection-events.mjs\";\nimport {\n ClientCollection,\n encodePath,\n type ClientContextIface,\n type EnumInput,\n type SignalOptionsIface,\n} from \"./context.mjs\";\nimport {\n clientError,\n ClientErrorCode,\n isRetryableClientError,\n isTerminalRealtimeError,\n realtimeSubscriptionError,\n} from \"./errors.mjs\";\nimport { errorFromResponse, HttpMethod, type HttpRequestArgsIface } from \"./http.mjs\";\nimport type { RealtimeTransportFrameIface } from \"./realtime.mjs\";\nimport { outcomeOf, type RespondArgs } from \"./sessions.mjs\";\n\nexport interface SandboxFileContentArgsIface {\n snapshotId?: string;\n bindingId: string;\n path: string;\n download?: boolean;\n /** One HTTP byte range, for example `bytes=1024-2047`. */\n range?: string;\n}\n\nexport interface SandboxFileContentRequestIface {\n url: string;\n /** Supply these to native download/media clients; never put bearer tokens in URLs. */\n headers: Record<string, string>;\n credentials: RequestCredentials;\n}\n\nexport interface ConversationEventMetaIface {\n topic: string;\n cursor: string | null;\n createdAt: string | null;\n /** True for messages the SDK fetched over HTTP to fill a realtime gap. */\n replayed: boolean;\n}\n\n/** A realtime event of the conversation topic, flattened (`event.message`, `event.decision`). */\nexport type ConversationEvent = AgentRealtimeEvent & ConversationEventMetaIface;\n\nexport interface ConversationEventsOptionsIface extends SignalOptionsIface {\n /** Keep streaming; false ends once the subscription is current. Defaults to true. */\n follow?: boolean;\n /** Also replay messages (thread replies included) after this conversation seq when the subscription opens. */\n afterSeq?: number;\n /** Gateway cursor to resume the topic after. */\n afterCursor?: string;\n /**\n * Messages the caller already has (an earlier stream or page). On the first\n * subscription the stream recovers everything created or updated since the\n * newest of them, thread replies included, and skips the versions given, so\n * a client resuming a conversation it rendered before is left with no gap.\n */\n resumeFrom?: readonly ConversationMessageIface[];\n /**\n * Called on every resubscribe (after the first) and resync, as the stream\n * starts recovering messages. State that messages cannot reconstruct, such\n * as whether an agent's turn ended without a reply, is the caller's to re-read.\n */\n onResubscribed?: () => void;\n /**\n * Also recover what only realtime carries (default true). On every\n * (re)subscribe, resync and fallback poll the stream re-reads the open\n * permission and elicitation decisions of the conversation's agent sessions\n * and emits replayed `decision.changed` events: `created` for an open\n * decision it has not emitted, `resolved` for one it emitted open that no\n * longer is. And\n * for every turn it saw start whose session is no longer running, it emits a\n * replayed `conversation.turn.ended` (stop reason null). Turns that started\n * and ended while it was away arrive only as messages.\n */\n recoverTransient?: boolean;\n // While the realtime transport reports errors, a following stream polls the\n // same recovery every `timing.pollIntervalMs` until it is subscribed again.\n // Without `resumeFrom` or `afterSeq`, the stream reads the newest message when it is\n // called and, once subscribed, recovers every change after it (thread replies included),\n // so nothing posted while the subscription registers is lost.\n}\n\nexport interface SendMessageOptionsIface extends SignalOptionsIface {\n clientMessageId?: string;\n replyTo?: string;\n threadRootId?: string;\n /** Ids of earlier messages in the conversation to quote, in order. */\n quotes?: string[];\n /** Mentioned participant ids. */\n mentions?: string[];\n attachmentIds?: string[];\n /** When the person submitted, for the prompt-to-inference trace; defaults to now. */\n clientSubmittedAtMs?: number;\n}\n\nexport type ParticipantCreateInput =\n | { user: string }\n | {\n agent: string;\n routingMode?: EnumInput<\n NonNullable<Extract<ParticipantInput, { agent: string }>['routingMode']>\n >;\n };\n\nexport interface SentMessageIface {\n message: ConversationMessageIface;\n messageId: string;\n seq: number;\n /** One entry per agent participant the message was routed to. */\n deliveries: MessageDeliveryIface[];\n}\n\nexport interface ListMessagesOptionsIface extends SignalOptionsIface {\n before?: number;\n after?: number;\n limit?: number;\n /** Thread root message id, or `MessageThreadFilter.All` for the timeline plus every thread. */\n thread?: string;\n /** ISO instant: messages created or updated after it (the first page of a change scan). */\n updatedAfter?: string;\n /** A previous page's `nextUpdatedCursor`: continue the change scan after it. */\n updatedCursor?: string;\n}\n\nexport interface UploadAttachmentArgsIface extends SignalOptionsIface {\n name: string;\n contentType: string;\n data: Blob | ArrayBuffer;\n}\n\nexport interface ConversationHandleIface {\n /** Durable accepted prompt receipts for a message, including queued deliveries once admitted. */\n deliveries: (\n args: { messageId: string },\n options?: SignalOptionsIface,\n ) => Promise<MessageDeliveryIface[]>;\n\n id: string;\n info: (options?: SignalOptionsIface) => Promise<ConversationIface>;\n send: (content: ContentInput, options?: SendMessageOptionsIface) => Promise<SentMessageIface>;\n events: (options?: ConversationEventsOptionsIface) => AsyncIterableIterator<ConversationEvent>;\n messages: (options?: ListMessagesOptionsIface) => Promise<ConversationMessagesPageIface>;\n /** One message by id (`GET /v1/conversations/:id/messages/:messageId`), e.g. a thread root. */\n message: (\n args: { messageId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationMessageIface>;\n react: (\n args: { messageId: string; emoji: string },\n options?: SignalOptionsIface,\n ) => Promise<ReactionIface[]>;\n unreact: (\n args: { messageId: string; emoji: string },\n options?: SignalOptionsIface,\n ) => Promise<ReactionIface[]>;\n recordPushOpen: (\n args: { deliveryId: string },\n options?: SignalOptionsIface,\n ) => Promise<{ recorded: boolean }>;\n markRead: (args: { throughSeq: number }, options?: SignalOptionsIface) => Promise<ReadStateIface>;\n /**\n * Marks a thread read through one of its replies' seq and follows it\n * (`POST \u2026/threads/:rootId/read`); the conversation's own unread count\n * moves with `markRead`.\n */\n markThreadRead: (\n args: { rootId: string; throughSeq: number },\n options?: SignalOptionsIface,\n ) => Promise<void>;\n /**\n * Tells the other members the caller is typing (`POST \u2026/typing`), realtime\n * only. A `true` lapses on its own after a few seconds, so composers repeat\n * it while typing continues and send `false` when the draft is sent or cleared.\n */\n typing: (args: { typing: boolean }, options?: SignalOptionsIface) => Promise<void>;\n /**\n * Hands something that happened outside the conversation (`POST \u2026/events`)\n * to its Default agent as input from you, not as a message: the agent's\n * reply carries the source as its caption. The same `eventId` from the same\n * source is accepted once; the receipt says whether the agent was prompted.\n */\n postEvent: (\n event: PostConversationEventRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<PostConversationEventResponseIface>;\n respond: (\n args: RespondArgs,\n options?: SignalOptionsIface,\n ) => Promise<RespondDecisionResponseIface>;\n /** Stops the agents' running turns in this conversation. */\n cancel: (\n options?: SignalOptionsIface & { reason?: string; throughMessageSeq?: number },\n ) => Promise<void>;\n participants: (options?: SignalOptionsIface) => Promise<ParticipantIface[]>;\n /**\n * Each agent participant's session state, read now: whether a turn is\n * running in it. What a client re-reads when it may have missed a\n * `conversation.turn.ended` (`events()` reconciles the turns it saw itself).\n */\n turns: (options?: SignalOptionsIface) => Promise<ConversationAgentTurnIface[]>;\n addParticipant: (\n participant: ParticipantCreateInput,\n options?: SignalOptionsIface,\n ) => Promise<ParticipantIface>;\n /**\n * Changes an agent's routing mode (owners and admins) or a person's role\n * (owners, groups only; the last owner cannot step down). One field per call.\n */\n updateParticipant: (\n args: { participantId: string } & Omit<\n UpdateParticipantRequestIface,\n 'routingMode' | 'role'\n > & {\n routingMode?: EnumInput<NonNullable<UpdateParticipantRequestIface['routingMode']>>;\n role?: EnumInput<NonNullable<UpdateParticipantRequestIface['role']>>;\n },\n options?: SignalOptionsIface,\n ) => Promise<ParticipantIface>;\n removeParticipant: (\n args: { participantId: string },\n options?: SignalOptionsIface,\n ) => Promise<void>;\n update: (\n patch: UpdateConversationRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationIface>;\n delete: (args: { messageId: string }, options?: SignalOptionsIface) => Promise<void>;\n uploadAttachment: (args: UploadAttachmentArgsIface) => Promise<AttachmentUploadIface>;\n /**\n * A fresh presigned download URL for one attachment\n * (`GET /v1/conversations/:id/attachments/:attachmentId`). URLs on messages\n * expire; resolve through this before opening one that may be stale.\n */\n attachmentUrl: (\n args: { attachmentId: string },\n options?: SignalOptionsIface,\n ) => Promise<AttachmentDownloadIface>;\n /**\n * The conversation's sandboxes (the computer tile): status, capabilities and\n * whether a preview is available (`GET /v1/conversations/:id/sandboxes`).\n * Never starts a parked sandbox.\n */\n sandboxes: (options?: SignalOptionsIface) => Promise<ConversationSandboxIface[]>;\n /** One directory of a running sandbox, confined to its workspace (`\u2026/sandboxes/:bindingId/files`). */\n sandboxFiles: (\n args: { bindingId: string; path?: string; snapshotId?: string },\n options?: SignalOptionsIface,\n ) => Promise<SandboxDirectoryIface>;\n /** Resolves a file or directory without waking its sandbox. */\n sandboxPath: (\n args: { bindingId: string; path?: string; snapshotId?: string },\n options?: SignalOptionsIface,\n ) => Promise<SandboxPathIface>;\n /** Bounded recursive path search; truncated signals incomplete traversal. */\n searchSandboxFiles: (\n args: { bindingId: string; path?: string; query: string; limit?: number },\n options?: SignalOptionsIface,\n ) => Promise<SandboxSearchIface>;\n /** A byte range of a file in a running sandbox, at most 1 MiB (`\u2026/sandboxes/:bindingId/file`). */\n sandboxFile: (\n args: {\n bindingId: string;\n path: string;\n offset?: number;\n length?: number;\n snapshotId?: string;\n },\n options?: SignalOptionsIface,\n ) => Promise<SandboxFileIface>;\n inspectSandboxProcesses(\n args: { bindingId: string; request: ProcessInspectionRequestIface },\n options?: SignalOptionsIface,\n ): Promise<ProcessInspectionResultIface>;\n /** Opens a provider editor for an existing workspace, with write authorization. */\n openSandboxEditor(\n args: { bindingId: string },\n options?: SignalOptionsIface,\n ): Promise<SandboxEditorSessionIface>;\n refreshSandboxEditor(\n args: { bindingId: string; editorId: string; authorizationId: string },\n options?: SignalOptionsIface,\n ): Promise<SandboxEditorSessionIface>;\n closeSandboxEditor(\n args: { bindingId: string; editorId: string; authorizationId: string },\n options?: SignalOptionsIface & { keepalive?: boolean },\n ): Promise<void>;\n /** Raw streaming bytes (`\u2026/file/content`). The caller consumes or cancels the response body. */\n sandboxFileContent: (\n args: SandboxFileContentArgsIface,\n options?: SignalOptionsIface,\n ) => Promise<Response>;\n /**\n * An authenticated request for a browser/native media or download client.\n * Cookie clients can use the URL directly; bearer clients must supply headers.\n * Every request rechecks membership and confinement; never wakes the sandbox.\n */\n sandboxFileContentRequest: (\n args: SandboxFileContentArgsIface,\n ) => Promise<SandboxFileContentRequestIface>;\n /** A short-lived screen preview of a running sandbox; 404 when it serves none (`\u2026/preview`). */\n sandboxPreview: (\n args: { bindingId: string; viewOnly?: boolean },\n options?: SignalOptionsIface,\n ) => Promise<SandboxPreviewType>;\n /** Starts a parked sandbox (conversation owners and admins; `POST \u2026/wake`). */\n wakeSandbox: (\n args: { bindingId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationSandboxIface>;\n /** The conversation's runtime schedules: reminders and recurring checks (`GET \u2026/schedules`). */\n schedules: (options?: SignalOptionsIface) => Promise<ConversationScheduleIface[]>;\n /**\n * Creates a schedule owned by one agent participant (`POST \u2026/schedules`).\n * Agents create their own; people need to be conversation owners or admins.\n */\n createSchedule: (\n args: CreateConversationScheduleRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationScheduleIface>;\n /** Changes a schedule (its agent, or conversation owners and admins; `PATCH \u2026/schedules/:id`). */\n updateSchedule: (\n args: { scheduleId: string } & UpdateConversationScheduleRequestIface,\n options?: SignalOptionsIface,\n ) => Promise<ConversationScheduleIface>;\n /** Deletes a schedule (`DELETE \u2026/schedules/:id`). */\n deleteSchedule: (args: { scheduleId: string }, options?: SignalOptionsIface) => Promise<void>;\n /**\n * The conversations this one handed work to, with what their agents are\n * doing (`GET \u2026/links`). Their replies and waits arrive here as messages.\n */\n links: (options?: SignalOptionsIface) => Promise<ConversationLinkIface[]>;\n /** Conversations receiving this conversation\u2019s delegated results. */\n parentLinks: (options?: SignalOptionsIface) => Promise<ConversationLinkIface[]>;\n /**\n * Links another conversation the caller belongs to (`POST \u2026/links`); linking\n * it again returns the same link. Links never form a cycle.\n */\n link: (\n args: { conversationId: string },\n options?: SignalOptionsIface,\n ) => Promise<ConversationLinkIface>;\n /** Removes a link (`DELETE \u2026/links/:linkId`); both conversations remain. */\n unlink: (args: { linkId: string }, options?: SignalOptionsIface) => Promise<void>;\n}\n\nexport interface ConversationAgentTurnIface {\n participantId: string;\n sessionId: string;\n state: AgentSessionState | WireFallback;\n /** A turn is running or waiting on a decision. */\n running: boolean;\n}\n\n/** Session states in which a turn is open. */\nexport const TURN_OPEN_SESSION_STATES: ReadonlySet<AgentSessionState | WireFallback> = new Set([\n AgentSessionState.Running,\n AgentSessionState.RequiresAction,\n]);\n\nexport interface OpenedConversationIface extends ConversationHandleIface {\n conversation: ConversationIface;\n}\n\nexport interface CreateConversationArgsIface extends SignalOptionsIface {\n /**\n * The project (`prj_...`) a signed-in person creates a group chat in (editors only).\n * Omitted: their personal project. Project API keys cannot create person-owned chats.\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 * A signed-in person's conversations. Without `projectId`, lists their participant inbox.\n * With `projectId`, also includes readable Shared chats in that project and its descendants.\n * A project API key has no person inbox and receives an empty list.\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 signed-in person's personal project. Requires person authority.\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 * Decisions in the selected project and its descendants; omitted, the signed-in person's\n * personal project. A project API key has no person inbox and receives an empty list.\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": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAqCK;AACP,SAAS,kBAAkB,mBAAmB;AAC9C;AAAA,EACE;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAAmB,kBAA6C;AAEzE,SAAS,iBAAmC;AAoVrC,MAAM,2BAA0E,oBAAI,IAAI;AAAA,EAC7F,kBAAkB;AAAA,EAClB,kBAAkB;AACpB,CAAC;AAqED,MAAM,mBAAmB,CAAC,gBAAwB,SAAS,OACzD,qBAAqB,WAAW,cAAc,CAAC,GAAG,MAAM;AAE1D,MAAM,cAAc,CAAC,gBAAwB,WAAmB,SAAS,OACvE,iBAAiB,gBAAgB,aAAa,WAAW,SAAS,CAAC,GAAG,MAAM,EAAE;AAgBhF,MAAM,iBAAiB;AAIvB,MAAM,0BAA0B;AAEhC,MAAM,WAAW,CAAa,KAAsB,KAAU,UAAuB;AACnF,MAAI,OAAO,GAAG;AACd,MAAI,IAAI,KAAK,KAAK;AAClB,MAAI,IAAI,OAAO,gBAAgB;AAC7B,UAAM,SAAS,IAAI,KAAK,EAAE,KAAK;AAC/B,QAAI,OAAO,SAAS,KAAM,KAAI,OAAO,OAAO,KAAK;AAAA,EACnD;AACF;AAIA,MAAM,mBAAmB,CAAC,UACxB,MAAM,SAAS,kBAAkB,mBACjC,MAAM,SAAS,kBAAkB,eACjC,MAAM,SAAS,kBAAkB;AAEnC,MAAM,cAAc;AAMb,MAAM,mBAAmB;AAEhC,MAAM,UAAU,CAAC,YACf,KAAK;AAAA,EACH,GAAG,CAAC,QAAQ,WAAW,QAAQ,WAAW,QAAQ,SAAS,EAAE;AAAA,IAAI,CAAC,UAChE,SAAS,OAAO,IAAI,KAAK,MAAM,KAAK,KAAK;AAAA,EAC3C;AACF;AAeF,MAAM,QAAQ,CAAC,UAAwC;AACrD,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAM,KAAK,KAAK,MAAM,KAAK;AAC3B,SAAO,OAAO,MAAM,EAAE,IAAI,OAAO;AACnC;AAEO,MAAM,mBAAmB,CAAC,aAA4D;AAAA,EAC3F,UAAU,QAAQ;AAAA,EAClB,WAAW,MAAM,QAAQ,SAAS;AAAA,EAClC,OAAO,QAAQ,OAAO;AAAA,EACtB,SAAS,QAAQ,aAAa;AAAA,EAC9B,OAAO,QAAQ,WAAW,UAAU,sBAAsB;AAAA,EAC1D,aAAa,KAAK,UAAU;AAAA,IAC1B,QAAQ;AAAA,IACR,QAAQ,WAAW,SAAS;AAAA,IAC5B,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AACH;AAUO,MAAM,wBAAwB,CACnC,UACA,YACY;AACZ,MAAI,WAAW,KAAM,QAAO;AAC5B,MAAI,QAAQ,WAAW,CAAC,SAAS,QAAS,QAAO;AACjD,MAAI,SAAS,YAAY,QAAQ,QAAQ,YAAY,MAAM;AACzD,WAAO,SAAS,WAAW,QAAQ;AAAA,EACrC;AACA,MAAI,SAAS,aAAa,QAAQ,QAAQ,aAAa,MAAM;AAC3D,QAAI,SAAS,cAAc,QAAQ,UAAW,QAAO,SAAS,YAAY,QAAQ;AAClF,WAAO,SAAS,SAAS,CAAC,QAAQ;AAAA,EACpC;AACA,MAAI,SAAS,UAAU,QAAQ,MAAO,QAAO,SAAS,QAAQ,QAAQ;AACtE,MAAI,QAAQ,SAAS,CAAC,SAAS,MAAO,QAAO;AAC7C,SAAO,SAAS,gBAAgB,QAAQ;AAC1C;AAqBA,MAAM,2BAA2B,CAC/B,SAC6C;AAC7C,QAAM,QAAQ,oBAAoB,aAAa,KAAK,cAAc;AAClE,QAAM,SAAS,KAAK,SAAS,UAAU;AACvC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,SAAS,YAAY,IAAI;AAAA,IAC7B,WAAW;AAAA,IACX,KAAK,QAAQ;AAAA,IACb,GAAI,KAAK,SAAS,UAAU,OAAO,CAAC,IAAI,CAAC,KAAK,QAAQ,MAAM;AAAA,EAC9D,CAAC;AACD,QAAM,WAAW,oBAAI,IAAiC;AACtD,MAAI,cAA6B;AACjC,QAAM,eAAe,KAAK,IAAI;AAC9B,MAAI,gBAA+B;AACnC,MAAI,iBAAiB;AACrB,MAAI,aAAa;AACjB,MAAI,WAA0B,QAAQ,QAAQ;AAC9C,QAAM,OAA2B,CAAC;AAClC,QAAM,wBAAwB,KAAK,SAAS,oBAAoB;AAGhE,MAAI,iBAAiB;AACrB,QAAM,gBAAgB,oBAAI,IAGxB;AACF,QAAM,eAAe,oBAAI,IAA4D;AACrF,QAAM,aAAa,oBAAI,IAAkB;AAEzC,MAAI,WAAW;AACf,MAAI,YAAkD;AACtD,QAAM,YAAY,MAAY;AAC5B,QAAI,aAAa,KAAM,cAAa,SAAS;AAC7C,gBAAY;AAAA,EACd;AACA,MAAI,cAAmC;AACvC,MAAI,cAA0B,MAAM;AAAA,EAAC;AACrC,MAAI,cAA0B,MAAM;AAAA,EAAC;AACrC,QAAM,QAAQ,iBAAoC,MAAM;AACtD,eAAW,MAAM;AACjB,SAAK,SAAS;AACd,cAAU;AACV,kBAAc;AACd,gBAAY;AACZ,gBAAY;AAAA,EACd,CAAC;AACD,QAAM,aAAa,KAAK,SAAS,cAAc,CAAC;AAEhD,QAAM,SACJ,WAAW,WAAW,KAAK,KAAK,SAAS,YAAY,OACjD,KAAK,aAAa,EAAE,OAAO,GAAG,QAAQ,oBAAoB,KAAK,OAAO,CAAC,IACvE;AAEN,UAAQ,MAAM,MAAM;AAAA,EAAC,CAAC;AACtB,aAAW,WAAW,YAAY;AAChC,aAAS,IAAI,QAAQ,IAAI,iBAAiB,OAAO,CAAC;AAClD,kBAAc,KAAK,IAAI,eAAe,GAAG,QAAQ,OAAO,CAAC;AAAA,EAC3D;AAGA,QAAM,cAAc,CAClB,SACA,MACA,SACS;AACT,UAAM,UAAU,iBAAiB,OAAO;AACxC,UAAM,WAAW,SAAS,IAAI,QAAQ,EAAE;AACxC,QAAI,CAAC,sBAAsB,SAAS,QAAQ,EAAG;AAC/C,aAAS,IAAI,QAAQ,IAAI,OAAO;AAChC,kBAAc,KAAK,IAAI,eAAe,GAAG,QAAQ,OAAO,CAAC;AACzD,QAAI,QAAQ,MAAM;AAChB,YAAM,KAAK,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC;AAC/B;AAAA,IACF;AACA,UAAM;AAAA,MACJ,YAAY,OACR,EAAE,MAAM,kBAAkB,gBAAgB,SAAS,GAAG,KAAK,IAC3D,EAAE,MAAM,kBAAkB,gBAAgB,SAAS,GAAG,KAAK;AAAA,IACjE;AAAA,EACF;AAGA,QAAM,eAAe,CACnB,UACA,UACY;AACZ,UAAM,OAAO,cAAc,IAAI,SAAS,EAAE;AAC1C,QAAI,UAAU,mBAAmB,UAAU;AACzC,UAAI,MAAM,UAAU,mBAAmB,SAAU,QAAO;AACxD,wBAAkB;AAClB,eAAS,eAAe,SAAS,IAAI,EAAE,OAAO,UAAU,OAAO,eAAe,CAAC;AAC/E,aAAO;AAAA,IACT;AACA,QAAI,UAAU,mBAAmB,SAAS;AACxC,UAAI,QAAQ,KAAM,QAAO;AACzB,wBAAkB;AAClB,eAAS,eAAe,SAAS,IAAI,EAAE,OAAO,UAAU,OAAO,eAAe,CAAC;AAC/E,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAGA,QAAM,gBAAgB,CAAC,UAAuC;AAC5D,QAAI,MAAM,SAAS,kBAAkB;AACnC,aAAO,aAAa,MAAM,UAAU,MAAM,KAAK;AACjD,QAAI,MAAM,SAAS,kBAAkB,aAAa;AAChD,UAAI,CAAC,WAAW,IAAI,MAAM,MAAM,GAAG;AACjC,0BAAkB;AAClB,iBAAS,cAAc,MAAM,QAAQ,EAAE,MAAM,OAAO,OAAO,eAAe,CAAC;AAAA,MAC7E;AACA,aAAO;AAAA,IACT;AACA,QAAI,MAAM,SAAS,kBAAkB,WAAW;AAC9C,UAAI,WAAW,IAAI,MAAM,MAAM,EAAG,QAAO;AACzC,eAAS,YAAY,MAAM,QAAQ,IAAI;AACvC,mBAAa,OAAO,MAAM,MAAM;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,CAAC,OAA2B,SAA2C;AACtF,QACE,MAAM,SAAS,kBAAkB,kBACjC,MAAM,SAAS,kBAAkB,gBACjC;AACA,kBAAY,MAAM,SAAS,MAAM,KAAK;AACtC;AAAA,IACF;AACA,QAAI,MAAM,SAAS,kBAAkB,gBAAgB;AAEnD,YAAM,UAAU,SAAS,IAAI,MAAM,SAAS;AAC5C,UAAI,SAAS,YAAY,KAAM;AAC/B,YAAM,YAAY,MAAM,MAAM,SAAS,KAAK,SAAS,SAAS;AAC9D,eAAS,IAAI,MAAM,WAAW;AAAA,QAC5B,UAAU,SAAS,YAAY;AAAA,QAC/B,WAAW,KAAK,IAAI,SAAS,aAAa,GAAG,SAAS;AAAA,QACtD,OAAO,KAAK,IAAI,SAAS,SAAS,GAAG,SAAS;AAAA,QAC9C,SAAS;AAAA,QACT,OAAO,SAAS,SAAS;AAAA,QACzB,aAAa,SAAS,eAAe;AAAA,MACvC,CAAC;AAAA,IACH;AACA,QAAI,CAAC,cAAc,KAAK,EAAG;AAC3B,UAAM,KAAK,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC;AAAA,EAClC;AAEA,QAAM,WAAW,CAAC,aAAmE;AAAA,IACnF;AAAA,IACA,QAAQ;AAAA,IACR,WAAW,QAAQ,aAAa,QAAQ;AAAA,IACxC,UAAU;AAAA,EACZ;AAEA,QAAM,WAAW,CAAC,aAA+C;AAC/D,eAAW,WAAW,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,MAAM,MAAM,GAAG,GAAG;AAC/E,kBAAY,SAAS,SAAS,OAAO,GAAG,IAAI;AAAA,IAC9C;AAAA,EACF;AAUA,QAAM,iBAAiB,YAA2B;AAChD,UAAM,QAAQ,KAAK;AAAA,MACjB;AAAA,MACA,KAAK,IAAI,eAAe,cAAc,iBAAiB,QAAQ,IAAI;AAAA,IACrE;AACA,QAAI,WAAiE;AAAA,MACnE,cAAc,IAAI,KAAK,KAAK,EAAE,YAAY;AAAA,IAC5C;AACA,QAAI,YAA2B;AAC/B,eAAS;AACP,YAAM,OAAO,MAAM,KAAK,aAAa;AAAA,QACnC,GAAG;AAAA,QACH,QAAQ,oBAAoB;AAAA,QAC5B,OAAO;AAAA,QACP;AAAA,MACF,CAAC;AACD,UAAI,aAAa,QAAQ,KAAK,iBAAiB,MAAM;AACnD,cAAM,QAAQ,KAAK,MAAM,KAAK,aAAa;AAC3C,YAAI,OAAO,SAAS,KAAK,EAAG,aAAY;AAAA,MAC1C;AACA,eAAS,KAAK,QAAQ;AACtB,YAAM,OAAO,KAAK;AAClB,UAAI,QAAQ,QAAQ,CAAC,KAAK,gBAAgB,KAAK,SAAS,WAAW,GAAG;AACpE,wBAAgB,aAAa;AAC7B;AAAA,MACF;AACA,iBAAW,EAAE,eAAe,KAAK;AAAA,IACnC;AAAA,EACF;AAQA,QAAM,oBAAoB,OAAOA,YAAmD;AAClF,UAAM,OAAO,MAAMA;AACnB,QAAI,KAAK,iBAAiB,MAAM;AAC9B,YAAM,QAAQ,KAAK,MAAM,KAAK,aAAa;AAC3C,UAAI,OAAO,SAAS,KAAK,EAAG,iBAAgB;AAAA,IAC9C;AACA,UAAM,SAAS,KAAK,SAAS;AAAA,MAC3B,CAAC,MAAM,YAAa,QAAQ,QAAQ,QAAQ,MAAM,KAAK,MAAM,UAAU;AAAA,MACvE;AAAA,IACF;AACA,QAAI,UAAU,QAAQ,CAAC,SAAS,IAAI,OAAO,EAAE,GAAG;AAC9C,eAAS,IAAI,OAAO,IAAI,iBAAiB,MAAM,CAAC;AAChD,oBAAc,KAAK,IAAI,eAAe,GAAG,QAAQ,MAAM,CAAC;AAAA,IAC1D;AACA,UAAM,eAAe;AAAA,EACvB;AAEA,QAAM,kBAAkB,OAAO,aAAoC;AACjE,QAAI,SAAS;AACb,eAAS;AACP,YAAM,OAAO,MAAM,KAAK,aAAa;AAAA,QACnC,OAAO;AAAA,QACP,QAAQ,oBAAoB;AAAA,QAC5B,OAAO;AAAA,QACP;AAAA,MACF,CAAC;AACD,eAAS,KAAK,QAAQ;AACtB,YAAM,OAAO,KAAK,IAAI,QAAQ,GAAG,KAAK,SAAS,IAAI,CAAC,YAAY,QAAQ,GAAG,CAAC;AAC5E,UAAI,CAAC,KAAK,gBAAgB,SAAS,OAAQ;AAC3C,eAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,gBAAgB,OAAmC;AAAA,IACvD;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAGA,QAAM,WAAW,OAAc,SAAsD;AACnF,QAAI;AACF,aAAO,MAAM,KAAK;AAAA,IACpB,SAAS,OAAO;AACd,UAAI,uBAAuB,KAAK,EAAG,OAAM;AACzC,aAAO;AAAA,IACT;AAAA,EACF;AAIA,QAAM,gBAAgB,CAAC,UAAoC;AACzD,SAAK,KAAK,EAAE,OAAO,MAAM,cAAc,GAAG,OAAO,KAAK,CAAC;AAAA,EACzD;AASA,QAAM,mBAAmB,YAA2B;AAClD,QAAI,CAAC,sBAAuB;AAC5B,UAAM,OAAO;AACb,UAAM,eAAe,MAAM,SAAS,MAAM,KAAK,iBAAiB,EAAE,OAAO,CAAC,CAAC;AAC3E,UAAM,UACJ,gBAAgB,OACZ,OACA,IAAI;AAAA,MACF,aAAa;AAAA,QAAQ,CAAC,gBACpB,YAAY,SAAS,gBAAgB,SACrC,YAAY,aAAa,QACzB,YAAY,UAAU,OAClB,CAAC,YAAY,SAAS,IACtB,CAAC;AAAA,MACP;AAAA,IACF;AAEN,UAAM,aAAa,oBAAI,IAAI;AAAA,MACzB,GAAG,CAAC,GAAG,cAAc,OAAO,CAAC,EAAE;AAAA,QAAQ,CAAC,SACtC,KAAK,UAAU,mBAAmB,WAAW,KAAK,SAAS,aAAa,OACpE,CAAC,KAAK,SAAS,SAAS,IACxB,CAAC;AAAA,MACP;AAAA,MACA,GAAG,CAAC,GAAG,aAAa,OAAO,CAAC,EAAE,IAAI,CAAC,UAAU,MAAM,KAAK,SAAS;AAAA,IACnE,CAAC;AACD,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,WAAW,CAAC,GAAI,GAAG,UAAU,CAAC,CAAC,EAAE,IAAI,OAAO,cAAc;AACzE,cAAM,CAAC,SAAS,IAAI,IAAI,MAAM,QAAQ,IAAI;AAAA,UACxC,SAAS,MAAM,KAAK,WAAW,WAAW,EAAE,OAAO,CAAC,CAAC;AAAA,UACrD,SAAS,MAAM,KAAK,iBAAiB,WAAW,EAAE,OAAO,CAAC,CAAC;AAAA,QAC7D,CAAC;AAED,cAAM,WAAW,WAAW,QAAQ,CAAC,QAAQ,IAAI,SAAS;AAC1D,eAAO;AAAA,UACL;AAAA,UACA,SACE,WAAW,OACP,WACE,QACA,OACF,yBAAyB,IAAI,QAAQ,KAAK;AAAA,UAChD,MAAM,SAAS,WAAW,CAAC,IAAI;AAAA,QACjC;AAAA,MACF,CAAC;AAAA,IACH;AACA,eAAW,EAAE,WAAW,SAAS,KAAK,KAAK,SAAS;AAClD,UAAI,QAAQ,MAAM;AAChB,cAAM,WAAW,KAAK,SAAS;AAC/B,cAAM,UAAU,IAAI,IAAI,KAAK,IAAI,CAAC,aAAa,SAAS,EAAE,CAAC;AAC3D,mBAAW,YAAY,MAAM;AAC3B,cAAI,aAAa,UAAU,mBAAmB,OAAO;AACnD,0BAAc;AAAA,cACZ,MAAM,kBAAkB;AAAA,cACxB;AAAA,cACA,OAAO,mBAAmB;AAAA,YAC5B,CAAC;AAAA,QACL;AACA,mBAAW,QAAQ,CAAC,GAAG,cAAc,OAAO,CAAC,GAAG;AAC9C,cACE,CAAC,YACD,KAAK,UAAU,mBAAmB,WAClC,KAAK,QAAQ,QACb,KAAK,SAAS,cAAc,aAC5B,QAAQ,IAAI,KAAK,SAAS,EAAE;AAE5B;AACF,uBAAa,KAAK,UAAU,mBAAmB,QAAQ;AACvD,wBAAc;AAAA,YACZ,MAAM,kBAAkB;AAAA,YACxB,UAAU,KAAK;AAAA,YACf,OAAO,mBAAmB;AAAA,UAC5B,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,YAAY,MAAO;AACvB,iBAAW,EAAE,MAAM,MAAM,KAAK,CAAC,GAAG,aAAa,OAAO,CAAC,GAAG;AACxD,YAAI,KAAK,cAAc,aAAa,QAAQ,KAAM;AAClD,qBAAa,OAAO,KAAK,MAAM;AAC/B,iBAAS,YAAY,KAAK,QAAQ,IAAI;AACtC,sBAAc;AAAA,UACZ,MAAM,kBAAkB;AAAA,UACxB,gBAAgB,KAAK;AAAA,UACrB,eAAe,KAAK;AAAA,UACpB,WAAW,KAAK;AAAA,UAChB,QAAQ,KAAK;AAAA,UACb,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,QAAM,mBAAmB,CAAC,QAAmC;AAC3D,kBAAc;AACd,eAAW,SACR,KAAK,YAAY;AAChB,UAAI,QAAQ;AACZ,aAAO,CAAC,MAAM,OAAO,GAAG;AACtB,YAAI;AACF,gBAAM,IAAI;AACV;AAAA,QACF,SAAS,OAAO;AACd,cAAI,CAAC,UAAU,CAAC,uBAAuB,KAAK,EAAG,OAAM;AACrD,gBAAM,IAAI,QAAc,CAAC,YAAY;AACnC,kBAAM,OAAO,MAAM;AACjB,2BAAa,KAAK;AAClB,qBAAO,oBAAoB,SAAS,IAAI;AACxC,sBAAQ;AAAA,YACV;AACA,kBAAM,QAAQ,WAAW,MAAM,KAAK;AACpC,gBAAI,OAAO,QAAS,MAAK;AAAA,gBACpB,QAAO,iBAAiB,SAAS,MAAM,EAAE,MAAM,KAAK,CAAC;AAAA,UAC5D,CAAC;AACD,kBAAQ,KAAK,IAAI,QAAQ,GAAG,GAAM;AAAA,QACpC;AAAA,MACF;AAAA,IACF,CAAC,EACA,KAAK,MAAM;AACV,oBAAc;AACd,UAAI,aAAa,EAAG;AACpB,iBAAW,SAAS,KAAK,OAAO,CAAC,GAAG;AAClC,YAAI,MAAM,MAAO,OAAM,KAAK,EAAE,GAAG,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC;AAAA,YACxD,UAAS,MAAM,OAAO,MAAM,IAAI;AAAA,MACvC;AAAA,IACF,CAAC,EACA,MAAM,CAAC,UAAU,MAAM,KAAK,KAAK,CAAC;AAAA,EACvC;AAGA,MAAI,wBAAwB;AAC5B,MAAI,0BAA0B;AAC9B,QAAM,oBAAoB,MAAY;AACpC,8BAA0B;AAC1B,QAAI,sBAAuB;AAC3B,4BAAwB;AACxB,qBAAiB,YAAY;AAC3B,SAAG;AACD,kCAA0B;AAC1B,cAAM,eAAe;AACrB,cAAM,iBAAiB;AAAA,MACzB,SAAS,2BAA2B,CAAC,MAAM,OAAO;AAClD,8BAAwB;AAAA,IAC1B,CAAC;AAAA,EACH;AAEA,MAAI,yBAAyB;AAE7B,QAAM,uBAAuB,MAAY;AACvC,QAAI,uBAAwB;AAC5B,6BAAyB;AACzB,UAAM,WAAW,KAAK,SAAS;AAC/B,QAAI,YAAY,KAAM,kBAAiB,MAAM,gBAAgB,QAAQ,CAAC;AACtE,QAAI,WAAW,SAAS,EAAG,mBAAkB;AAC7C,QAAI,UAAU;AACZ,uBAAiB,YAAY;AAC3B,YAAI;AACF,gBAAM,kBAAkB,MAAM;AAAA,QAChC,SAAS,OAAO;AACd,cAAI,CAAC,uBAAuB,KAAK,EAAG,OAAM;AAE1C,gBAAM,eAAe;AAAA,QACvB;AAAA,MACF,CAAC;AAEH,QAAI,WAAW,WAAW,EAAG,kBAAiB,gBAAgB;AAAA,EAChE;AAGA,QAAM,OAAO,MAAY;AACvB,gBAAY;AACZ,QAAI,CAAC,YAAY,MAAM,OAAO,EAAG;AACjC,QAAI,uBAAwB,mBAAkB;AAAA,QACzC,sBAAqB;AAC1B,SAAK,SAAS,KAAK,MAAM;AACvB,UAAI,CAAC,YAAY,MAAM,OAAO,KAAK,aAAa,KAAM;AACtD,kBAAY,WAAW,MAAM,KAAK,QAAQ,OAAO,0BAA0B;AAAA,IAC7E,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,CAAC,QAA2C;AAC1D,UAAM,QAAQ,yBAAyB,UAAU,GAAG;AACpD,QAAI,CAAC,MAAM,WAAW,MAAM,OAAO,EAAG;AACtC,YAAQ,MAAM,KAAK,MAAM;AAAA,MACvB,KAAK,uBAAuB,OAAO;AACjC,cAAM,WAAW,MAAM;AACvB,cAAM,QAAQ;AAAA,UACZ,OAAO,wBAAwB,QAAQ;AAAA,UACvC,MAAM;AAAA,YACJ,OAAO,SAAS;AAAA,YAChB,QAAQ,SAAS;AAAA,YACjB,WAAW,SAAS;AAAA,YACpB,UAAU;AAAA,UACZ;AAAA,QACF;AACA,YAAI,aAAa,GAAG;AAElB,cAAI,KAAK,UAAU,MAAM;AACvB,kBAAM;AAAA,cACJ,YAAY;AAAA,gBACV,MAAM,gBAAgB;AAAA,gBACtB,QAAQ;AAAA,gBACR,SAAS;AAAA,cACX,CAAC;AAAA,YACH;AACA;AAAA,UACF;AAEA,cAAI,iBAAiB,MAAM,KAAK,GAAG;AACjC,gBAAI,cAAc,MAAM,KAAK,EAAG,MAAK,KAAK,EAAE,GAAG,OAAO,OAAO,KAAK,CAAC;AAAA,UACrE,MAAO,MAAK,KAAK,EAAE,GAAG,OAAO,OAAO,MAAM,CAAC;AAAA,QAC7C,MAAO,UAAS,MAAM,OAAO,MAAM,IAAI;AACvC;AAAA,MACF;AAAA,MACA,KAAK,uBAAuB,YAAY;AACtC,mBAAW;AACX,kBAAU;AACV,YAAI,CAAC,gBAAgB;AACnB,2BAAiB;AAEjB,cAAI,uBAAwB,mBAAkB;AAAA,cACzC,sBAAqB;AAAA,QAC5B,OAAO;AACL,4BAAkB;AAClB,eAAK,SAAS,iBAAiB;AAAA,QACjC;AACA,YAAI,CAAC,OAAQ,MAAK,SAAS,KAAK,MAAM,MAAM,IAAI,CAAC;AACjD;AAAA,MACF;AAAA,MACA,KAAK,uBAAuB;AAC1B,0BAAkB;AAClB,aAAK,SAAS,iBAAiB;AAC/B;AAAA,MACF,KAAK,uBAAuB;AAC1B,YAAI,wBAAwB,MAAM,IAAI,GAAG;AACvC,gBAAM;AAAA,YACJ,0BAA0B;AAAA,cACxB,OAAO,MAAM,KAAK,SAAS;AAAA,cAC3B,MAAM,MAAM,KAAK,QAAQ;AAAA,cACzB,SAAS,MAAM,KAAK,WAAW;AAAA,YACjC,CAAC;AAAA,UACH;AACA;AAAA,QACF;AAIA,YAAI,CAAC,QAAQ;AACX,cAAI,eAAgB;AACpB,2BAAiB;AACjB,+BAAqB;AACrB,eAAK,SAAS,KAAK,MAAM,MAAM,IAAI,CAAC;AACpC;AAAA,QACF;AACA,YAAI,CAAC,UAAU;AACb,qBAAW;AACX,eAAK;AAAA,QACP;AACA;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAEA,gBAAc,YAAY,OAAO,MAAM;AACvC,gBAAc,YAAY,OAAO,KAAK,QAAQ,WAAW;AACzD,MAAI,CAAC,MAAM,OAAO,GAAG;AACnB,UAAM,mBACJ,KAAK,SAAS,eAAe,OAAO,SAAY,EAAE,aAAa,KAAK,QAAQ,YAAY;AAC1F,UAAM,OAAO,KAAK,QAAQ,SAAS,EAAE,UAAU,OAAO,SAAS,gBAAgB;AAC/E,QAAI,MAAM,OAAO,EAAG,MAAK;AAAA,QACpB,eAAc;AAAA,EACrB;AACA,SAAO,MAAM;AACf;AAEO,MAAM,2BAA2B,CACtC,SACA,mBAC4B;AAC5B,QAAM,EAAE,KAAK,IAAI;AAEjB,QAAM,4BAA4B,OAChC,SAC4C;AAC5C,QAAI,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,IAAI,GAAG;AACjF,YAAM,YAAY;AAAA,QAChB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,MACxB,CAAC;AAAA,IACH;AACA,UAAM,SAAS,KAAK;AAAA,MAClB,iBAAiB,gBAAgB,cAAc,WAAW,KAAK,SAAS,CAAC,eAAe;AAAA,IAC1F;AACA,WAAO,aAAa,IAAI,QAAQ,KAAK,IAAI;AACzC,QAAI,KAAK,cAAc,KAAM,QAAO,aAAa,IAAI,cAAc,KAAK,UAAU;AAClF,QAAI,KAAK,YAAY,KAAM,QAAO,aAAa,IAAI,YAAY,OAAO,KAAK,QAAQ,CAAC;AACpF,UAAM,UAAU,MAAM,KAAK,QAAQ;AACnC,QAAI,KAAK,SAAS,KAAM,SAAQ,QAAQ,KAAK;AAC7C,WAAO;AAAA,MACL,KAAK,OAAO,SAAS;AAAA,MACrB;AAAA,MACA,aAAa,KAAK,cAAc,YAAY;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,UAAoC,CAAC,MACzD,KAAK,QAAQ;AAAA,IACX,QAAQ,WAAW;AAAA,IACnB,MAAM,iBAAiB,gBAAgB,WAAW;AAAA,IAClD,OAAO;AAAA,MACL,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,MACf,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,MAChB,cAAc,QAAQ;AAAA,MACtB,eAAe,QAAQ;AAAA,IACzB;AAAA,IACA,UAAU;AAAA,IACV,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAEH,QAAM,mBAAmB,OAAO,aAE5B,MAAM,KAAK,QAAQ;AAAA,IACjB,QAAQ,WAAW;AAAA,IACnB,MAAM,iBAAiB,gBAAgB,eAAe;AAAA,IACtD,UAAU;AAAA,IACV,QAAQ,QAAQ;AAAA,EAClB,CAAC,GACD;AAEJ,QAAM,aAAa,CAAC,WAAmB,YACrC,KAAK,QAAQ;AAAA,IACX,QAAQ,WAAW;AAAA,IACnB,MAAM,gBAAgB,WAAW,SAAS,CAAC;AAAA,IAC3C,UAAU;AAAA,IACV,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAEH,QAAM,mBAAmB,OAAO,WAAmB,aAE/C,MAAM,KAAK,QAAQ;AAAA,IACjB,QAAQ,WAAW;AAAA,IACnB,MAAM,gBAAgB,WAAW,SAAS,CAAC;AAAA,IAC3C,UAAU;AAAA,IACV,QAAQ,QAAQ;AAAA,EAClB,CAAC,GACD;AAEJ,QAAM,WAAW,OAAO,UAOpB,MAAM,KAAK,QAAQ;AAAA,IACjB,QAAQ,KAAK;AAAA,IACb,MAAM,YAAY,gBAAgB,KAAK,WAAW,YAAY;AAAA,IAC9D,MAAM,EAAE,QAAQ,uBAAuB,OAAO,EAAE,OAAO,KAAK,MAAM,EAAE;AAAA,IACpE,UAAU;AAAA,IACV,QAAQ,KAAK;AAAA,EACf,CAAC,GACD;AAEJ,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM,CAAC,YACL,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,cAAc;AAAA,MACrC,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,MAAM,OAAO,SAAS,YAAY;AAChC,YAAM,OAAO,MAAM,KAAK,QAAQ;AAAA,QAC9B,QAAQ,WAAW;AAAA,QACnB,MAAM,iBAAiB,gBAAgB,WAAW;AAAA,QAClD,MAAM;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO;AAAA,YACL;AAAA,YACA,iBAAiB,SAAS,mBAAmB,QAAQ,OAAO;AAAA,YAC5D,SAAS,SAAS;AAAA,YAClB,cAAc,SAAS;AAAA,YACvB,QAAQ,SAAS;AAAA,YACjB,UAAU,SAAS;AAAA,YACnB,eAAe,SAAS;AAAA,YACxB,qBAAqB,SAAS,uBAAuB,QAAQ,IAAI;AAAA,UACnE;AAAA,QACF;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,MACnB,CAAC;AACD,aAAO;AAAA,QACL,SAAS,KAAK;AAAA,QACd,WAAW,KAAK,QAAQ;AAAA,QACxB,KAAK,KAAK,QAAQ;AAAA,QAClB,YAAY,KAAK;AAAA,MACnB;AAAA,IACF;AAAA,IACA,QAAQ,CAAC,YACP,yBAAyB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACH,UAAU,CAAC,YAAY,aAAa,OAAO;AAAA,IAC3C,YAAY,OAAO,MAAM,aAErB,MAAM,KAAK,QAAQ;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB,MAAM,GAAG,YAAY,gBAAgB,KAAK,SAAS,CAAC;AAAA,MACpD,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC,GACD;AAAA,IACJ,SAAS,CAAC,MAAM,YACd,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,YAAY,gBAAgB,KAAK,SAAS;AAAA,MAChD,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,OAAO,CAAC,MAAM,YACZ,SAAS,EAAE,QAAQ,WAAW,MAAM,GAAG,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,IACxE,SAAS,CAAC,MAAM,YACd,SAAS,EAAE,QAAQ,WAAW,QAAQ,GAAG,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,IAC1E,gBAAgB,OAAO,EAAE,QAAQ,WAAW,GAAG,YAAY;AACzD,YAAM,KAAK,QAAQ;AAAA,QACjB,QAAQ,WAAW;AAAA,QACnB,MAAM,iBAAiB,gBAAgB,YAAY,WAAW,MAAM,CAAC,OAAO;AAAA,QAC5E,MAAM,EAAE,QAAQ,uBAAuB,OAAO,EAAE,WAAW,EAAE;AAAA,QAC7D,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,IACA,WAAW,CAAC,OAAO,YACjB,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,SAAS;AAAA,MAChD,MAAM,EAAE,QAAQ,oCAAoC,OAAO,MAAM;AAAA,MACjE,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,QAAQ,OAAO,MAAM,YAAY;AAC/B,YAAM,KAAK,QAAQ;AAAA,QACjB,QAAQ,WAAW;AAAA,QACnB,MAAM,iBAAiB,gBAAgB,SAAS;AAAA,QAChD,MAAM,EAAE,QAAQ,qBAAqB,OAAO,KAAK;AAAA,QACjD,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,IACA,gBAAgB,CAAC,MAAM,YACrB,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM;AAAA,QACJ;AAAA,QACA,oBAAoB,mBAAmB,KAAK,UAAU,CAAC;AAAA,MACzD;AAAA,MACA,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,UAAU,CAAC,MAAM,YACf,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,OAAO;AAAA,MAC9C,MAAM,EAAE,QAAQ,uBAAuB,OAAO,KAAK;AAAA,MACnD,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,SAAS,CAAC,MAAM,YACd,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,UAAU;AAAA,MACjD,MAAM;AAAA,QACJ,QAAQ;AAAA,QACR,OAAO,EAAE,YAAY,KAAK,YAAY,SAAS,UAAU,IAAI,EAAE;AAAA,MACjE;AAAA,MACA,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,MACjB,SAAS,EAAE,YAAY,KAAK,WAAW;AAAA,IACzC,CAAC;AAAA,IACH,QAAQ,OAAO,YAAY;AACzB,YAAM,KAAK,QAAQ;AAAA,QACjB,QAAQ,WAAW;AAAA,QACnB,MAAM,iBAAiB,gBAAgB,SAAS;AAAA,QAChD,MAAM;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO,EAAE,QAAQ,SAAS,QAAQ,mBAAmB,SAAS,kBAAkB;AAAA,QAClF;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,IACA,cAAc,CAAC,YAAY,iBAAiB,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,IACvE,OAAO,OAAO,YAAY;AACxB,YAAM,eAAe,MAAM,iBAAiB,EAAE,QAAQ,SAAS,OAAO,CAAC;AACvE,aAAO,QAAQ;AAAA,QACb,aAAa,QAAQ,CAAC,gBAAgB;AACpC,gBAAM,YAAY,YAAY;AAC9B,cAAI,YAAY,SAAS,gBAAgB,SAAS,aAAa,KAAM,QAAO,CAAC;AAC7E,iBAAO;AAAA,YACL,WAAW,WAAW,EAAE,QAAQ,SAAS,OAAO,CAAC,EAAE;AAAA,cACjD,CAAC,aAAyC;AAAA,gBACxC,eAAe,YAAY;AAAA,gBAC3B;AAAA,gBACA,OAAO,QAAQ;AAAA,gBACf,SAAS,yBAAyB,IAAI,QAAQ,KAAK;AAAA,cACrD;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,gBAAgB,CAAC,aAAa,YAC5B,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,eAAe;AAAA,MACtD,MAAM,EAAE,QAAQ,wBAAwB,OAAO,YAAY;AAAA,MAC3D,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,mBAAmB,CAAC,EAAE,eAAe,GAAG,MAAM,GAAG,YAC/C,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,iBAAiB,WAAW,aAAa,CAAC,EAAE;AAAA,MACnF,MAAM,EAAE,QAAQ,gCAAgC,OAAO,MAAM;AAAA,MAC7D,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,mBAAmB,OAAO,MAAM,YAAY;AAC1C,YAAM,KAAK,QAAQ;AAAA,QACjB,QAAQ,WAAW;AAAA,QACnB,MAAM,iBAAiB,gBAAgB,eAAe;AAAA,QACtD,MAAM,EAAE,QAAQ,gCAAgC,OAAO,KAAK;AAAA,QAC5D,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,IACA,QAAQ,CAAC,OAAO,YACd,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,cAAc;AAAA,MACrC,MAAM,EAAE,QAAQ,iCAAiC,OAAO,MAAM;AAAA,MAC9D,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,QAAQ,OAAO,MAAM,YAAY;AAC/B,YAAM,KAAK,QAAQ;AAAA,QACjB,QAAQ,WAAW;AAAA,QACnB,MAAM,YAAY,gBAAgB,KAAK,SAAS;AAAA,QAChD,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,IACA,OAAO,OAAO,aAEV,MAAM,KAAK,QAAQ;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,QAAQ;AAAA,MAC/C,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC,GACD;AAAA,IACJ,aAAa,OAAO,aAEhB,MAAM,KAAK,QAAQ;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,eAAe;AAAA,MACtD,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC,GACD;AAAA,IACJ,MAAM,CAAC,MAAM,YACX,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,QAAQ;AAAA,MAC/C,MAAM,EAAE,QAAQ,qCAAqC,OAAO,KAAK;AAAA,MACjE,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,QAAQ,OAAO,MAAM,YAAY;AAC/B,YAAM,KAAK,QAAQ;AAAA,QACjB,QAAQ,WAAW;AAAA,QACnB,MAAM,iBAAiB,gBAAgB,UAAU,WAAW,KAAK,MAAM,CAAC,EAAE;AAAA,QAC1E,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,IACA,eAAe,CAAC,MAAM,YACpB,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,gBAAgB,WAAW,KAAK,YAAY,CAAC,EAAE;AAAA,MACtF,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,WAAW,OAAO,aAEd,MAAM,KAAK,QAAQ;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,YAAY;AAAA,MACnD,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC,GACD;AAAA,IACJ,cAAc,CAAC,MAAM,YACnB,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,cAAc,WAAW,KAAK,SAAS,CAAC,QAAQ;AAAA,MACvF,OAAO,EAAE,MAAM,KAAK,MAAM,YAAY,KAAK,WAAW;AAAA,MACtD,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,aAAa,CAAC,MAAM,YAClB,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,cAAc,WAAW,KAAK,SAAS,CAAC,OAAO;AAAA,MACtF,OAAO,EAAE,MAAM,KAAK,MAAM,YAAY,KAAK,WAAW;AAAA,MACtD,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,oBAAoB,CAAC,MAAM,YACzB,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM;AAAA,QACJ;AAAA,QACA,cAAc,WAAW,KAAK,SAAS,CAAC;AAAA,MAC1C;AAAA,MACA,OAAO,EAAE,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,OAAO,KAAK,MAAM;AAAA,MAC/D,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,aAAa,CAAC,MAAM,YAClB,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,cAAc,WAAW,KAAK,SAAS,CAAC,OAAO;AAAA,MACtF,OAAO;AAAA,QACL,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,MACnB;AAAA,MACA,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH;AAAA,IACA,mBAAmB,CAAC,MAAM,YACxB,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,cAAc,WAAW,KAAK,SAAS,CAAC,SAAS;AAAA,MACxF,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,sBAAsB,CAAC,MAAM,YAC3B,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM;AAAA,QACJ;AAAA,QACA,cAAc,WAAW,KAAK,SAAS,CAAC,WAAW,WAAW,KAAK,QAAQ,CAAC;AAAA,MAC9E;AAAA,MACA,MAAM;AAAA,QACJ,QAAQ;AAAA,QACR,OAAO,EAAE,iBAAiB,KAAK,gBAAgB;AAAA,MACjD;AAAA,MACA,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,oBAAoB,OAAO,MAAM,YAAY;AAC3C,YAAM,KAAK,QAAQ;AAAA,QACjB,QAAQ,WAAW;AAAA,QACnB,MAAM;AAAA,UACJ;AAAA,UACA,cAAc,WAAW,KAAK,SAAS,CAAC,WAAW,WAAW,KAAK,QAAQ,CAAC;AAAA,QAC9E;AAAA,QACA,MAAM;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO,EAAE,iBAAiB,KAAK,gBAAgB;AAAA,QACjD;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,QACjB,WAAW,SAAS;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,IACA,oBAAoB,OAAO,MAAM,YAAY;AAC3C,YAAM,UAAU,MAAM,0BAA0B,IAAI;AACpD,UAAI;AACJ,UAAI;AACF,mBAAW,MAAM,KAAK,MAAM,QAAQ,KAAK;AAAA,UACvC,QAAQ,WAAW;AAAA,UACnB,SAAS,QAAQ;AAAA,UACjB,aAAa,QAAQ;AAAA,UACrB,QAAQ,SAAS;AAAA,QACnB,CAAC;AAAA,MACH,SAAS,OAAO;AACd,YAAI,SAAS,QAAQ,YAAY,KAAM,OAAM;AAC7C,cAAM,YAAY;AAAA,UAChB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,MAAM,gBAAgB;AAAA,UACtB;AAAA,QACF,CAAC;AAAA,MACH;AACA,UAAI,CAAC,SAAS,IAAI;AAChB,YAAI;AACJ,YAAI;AACF,iBAAO,MAAM,SAAS,KAAK;AAAA,QAC7B,SAAS,OAAO;AACd,cAAI,SAAS,QAAQ,YAAY,KAAM,OAAM;AAC7C,gBAAM,YAAY;AAAA,YAChB,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,MAAM,gBAAgB;AAAA,YACtB;AAAA,UACF,CAAC;AAAA,QACH;AACA,cAAM,kBAAkB,EAAE,QAAQ,SAAS,QAAQ,MAAM,SAAS,OAAU,CAAC;AAAA,MAC/E;AACA,aAAO;AAAA,IACT;AAAA,IACA,yBAAyB,CAAC,MAAM,YAAY;AAC1C,YAAM,UAAU,+BAA+B,MAAM,KAAK,OAAO;AACjE,YAAM,EAAE,UAAU,IAAI;AACtB,YAAM,SACJ,cAAc,2BAA2B,YACrC,eACA,eAAe,UACb,MAAM,WAAW,QAAQ,SAAS,IAClC;AACR,YAAM,QAAkF,CAAC;AACzF,UAAI,YAAY,QAAS,OAAM,SAAS,QAAQ;AAChD,UAAI,YAAY,QAAS,OAAM,SAAS,QAAQ;AAChD,UAAI,WAAW,QAAS,OAAM,QAAQ,QAAQ;AAC9C,aAAO,KAAK,QAAQ;AAAA,QAClB,QAAQ,cAAc,2BAA2B,OAAO,WAAW,SAAS,WAAW;AAAA,QACvF,MAAM;AAAA,UACJ;AAAA,UACA,cAAc,WAAW,KAAK,SAAS,CAAC,aAAa,MAAM;AAAA,QAC7D;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,IACA,gBAAgB,CAAC,MAAM,YAAY;AACjC,YAAM,UAAoD;AAAA,QACxD,QAAQ,KAAK,aAAa,QAAQ,WAAW,OAAO,WAAW;AAAA,QAC/D,MAAM,iBAAiB,gBAAgB,cAAc,WAAW,KAAK,SAAS,CAAC,UAAU;AAAA,QACzF,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,MACnB;AACA,UAAI,KAAK,aAAa;AACpB,gBAAQ,OAAO,EAAE,QAAQ,6BAA6B,OAAO,EAAE,UAAU,MAAM,EAAE;AACnF,aAAO,KAAK,QAAQ,OAAO;AAAA,IAC7B;AAAA,IACA,aAAa,CAAC,MAAM,YAClB,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,cAAc,WAAW,KAAK,SAAS,CAAC,OAAO;AAAA,MACtF,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,WAAW,OAAO,aAEd,MAAM,KAAK,QAAQ;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,YAAY;AAAA,MACnD,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC,GACD;AAAA,IACJ,gBAAgB,CAAC,MAAM,YACrB,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,YAAY;AAAA,MACnD,MAAM,EAAE,QAAQ,yCAAyC,OAAO,KAAK;AAAA,MACrE,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,gBAAgB,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,YACzC,KAAK,QAAQ;AAAA,MACX,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,gBAAgB,cAAc,WAAW,UAAU,CAAC,EAAE;AAAA,MAC7E,MAAM,EAAE,QAAQ,yCAAyC,OAAO,MAAM;AAAA,MACtE,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,gBAAgB,OAAO,MAAM,YAAY;AACvC,YAAM,KAAK,QAAQ;AAAA,QACjB,QAAQ,WAAW;AAAA,QACnB,MAAM,iBAAiB,gBAAgB,cAAc,WAAW,KAAK,UAAU,CAAC,EAAE;AAAA,QAClF,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,IACA,kBAAkB,OAAO,SAAS;AAChC,YAAM,YAAY,gBAAgB,KAAK,OAAO,KAAK,KAAK,aAAa,KAAK,KAAK;AAC/E,YAAM,SAAS,MAAM,KAAK,QAAQ;AAAA,QAChC,QAAQ,WAAW;AAAA,QACnB,MAAM,iBAAiB,gBAAgB,cAAc;AAAA,QACrD,MAAM;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO,EAAE,MAAM,KAAK,MAAM,aAAa,KAAK,aAAa,UAAU;AAAA,QACrE;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,KAAK;AAAA,MACf,CAAC;AAGD,YAAM,WAAW,MAAM,QAAQ,aAAa,OAAO,WAAW;AAAA,QAC5D,QAAQ,OAAO;AAAA,QACf,SAAS,EAAE,gBAAgB,KAAK,aAAa,GAAG,OAAO,QAAQ;AAAA,QAC/D,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK;AAAA,QACb,aAAa;AAAA,MACf,CAAC;AACD,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY;AAAA,UAChB,SAAS,wCAAwC,SAAS,MAAM;AAAA,UAChE,QAAQ,SAAS;AAAA,UACjB,MAAM,gBAAgB;AAAA,UACtB,MAAM,MAAM,SAAS,KAAK;AAAA,QAC5B,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,MAAM,yBAAyB,CAAC,YAAuD;AAC5F,QAAM,SAAS,CAAC,kBAA8D;AAAA,IAC5E,GAAG,yBAAyB,SAAS,aAAa,EAAE;AAAA,IACpD;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM,CAAC,YACL,QAAQ,KAAK,QAAQ;AAAA,MACnB,QAAQ,WAAW;AAAA,MACnB,MAAM;AAAA,MACN,OAAO;AAAA,QACL,QAAQ,SAAS;AAAA,QACjB,OAAO,SAAS;AAAA,QAChB,iBAAiB,SAAS;AAAA,QAC1B,WAAW,SAAS;AAAA,MACtB;AAAA,MACA,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,IACH,QAAQ,OAAO,SACb;AAAA,MACE,MAAM,QAAQ,KAAK,QAAQ;AAAA,QACzB,QAAQ,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,MAAM,EAAE,QAAQ,uCAAuC,OAAO,EAAE,OAAO,KAAK,MAAM,EAAE;AAAA,QACpF,UAAU;AAAA,QACV,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,IACH;AAAA,IACF,MAAM,OAAO,YACX;AAAA,MACE,MAAM,QAAQ,KAAK,QAAQ;AAAA,QACzB,QAAQ,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,OAAO,EAAE,WAAW,SAAS,UAAU;AAAA,QACvC,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,OAAO,SACb;AAAA,MACE,MAAM,QAAQ,KAAK,QAAQ;AAAA,QACzB,QAAQ,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO;AAAA,YACL,WAAW,KAAK;AAAA,YAChB,MAAM,KAAK;AAAA,YACX,OAAO,KAAK;AAAA,YACZ,cAAc,KAAK;AAAA,YACnB,YAAY,KAAK;AAAA,UACnB;AAAA,QACF;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,IACH;AAAA,IACF,KAAK,CAAC,mBAAmB,yBAAyB,SAAS,cAAc;AAAA,IACzE,QAAQ,CAAC,SACP,QAAQ,KAAK,QAAQ;AAAA,MACnB,QAAQ,WAAW;AAAA,MACnB,MAAM;AAAA,MACN,OAAO;AAAA,QACL,GAAG,KAAK;AAAA,QACR,gBAAgB,KAAK;AAAA,QACrB,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK;AAAA,MACd;AAAA,MACA,UAAU;AAAA,MACV,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,IACH,YAAY,CAAC,YACX,uBAAuB;AAAA,MACrB;AAAA,MACA,UAAU,oBAAoB;AAAA,MAC9B,YAAY,iBAAiB;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,IACH,WAAW,CAAC,YACV,QAAQ,KAAK,QAAQ;AAAA,MACnB,QAAQ,WAAW;AAAA,MACnB,MAAM;AAAA,MACN,OAAO,EAAE,QAAQ,SAAS,QAAQ,OAAO,SAAS,OAAO,WAAW,SAAS,UAAU;AAAA,MACvF,UAAU;AAAA,MACV,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACL;AACF;",
4
+ "sourcesContent": ["import {\n PROCESS_CAPABILITIES,\n ProcessInspectionOperation,\n type Capability,\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 conversationLabelFilter,\n conversationLookupSchema,\n conversationResponseSchema,\n conversationSchema,\n createAttachmentUploadRequestSchema,\n createConversationLinkRequestSchema,\n createConversationRequestSchema,\n createConversationScheduleRequestSchema,\n createDirectConversationRequestSchema,\n scheduleRunResultSchema,\n DecisionEventState,\n decisionRecordListSchema,\n homeConversationRequestSchema,\n decisionsPageSchema,\n markReadRequestSchema,\n messageDeliveriesSchema,\n MessageStreamingState,\n MessageThreadFilter,\n okResponseSchema,\n parseAgentRealtimeEvent,\n participantInputSchema,\n ParticipantKind,\n participantListSchema,\n participantProvideResponseSchema,\n participantSchema,\n postConversationEventRequestSchema,\n provideParticipantRequestSchema,\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 ActorInputIface,\n type AgentRefInputIface,\n type ParticipantInput,\n type ProvideDocumentIface,\n type ParticipantProvideResponseIface,\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 ScheduleRunResultIface,\n type UpdateParticipantRequestIface,\n type WireFallback,\n SandboxProviderKind,\n} from '@finalai/agent-protocol/agent-platform';\nimport type { AgentInput } from \"./agent-input.mjs\";\nimport { createAsyncQueue, failOnAbort } from \"./async-queue.mjs\";\nimport {\n createConversationResources,\n type ConversationResourcesIface,\n} from \"./conversation-resources.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 isClientError,\n isRetryableClientError,\n isTerminalRealtimeError,\n realtimeSubscriptionError,\n} from \"./errors.mjs\";\nimport { errorFromResponse, HttpMethod, type HttpRequestArgsIface } from \"./http.mjs\";\nimport { LocalHostOwnerKind } from \"./local-host-protocol.mjs\";\nimport {\n provideDocumentOf,\n provideDocumentOfView,\n providePatchOf,\n type ProvideIface,\n type ProvidePatchIface,\n} from \"./provide.mjs\";\nimport type { RealtimeTransportFrameIface } from \"./realtime.mjs\";\nimport { createSandboxesApi } from \"./sandboxes.mjs\";\nimport { outcomeOf, type RespondArgs } from \"./sessions.mjs\";\nimport {\n startAgent,\n withWorkersEnvironment,\n type WorkersEnvironmentIface,\n type AgentStartDepsIface,\n type StartedAgentIface,\n} from \"./start.mjs\";\n\nexport interface SandboxFileContentArgsIface {\n snapshotId?: string;\n sandboxId: 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 /** The caller's own end user posting it; API keys and app tokens only. */\n actor?: ActorInputIface;\n}\n\ntype RoutingModeInput = EnumInput<\n NonNullable<Extract<ParticipantInput, { routingMode?: unknown }>['routingMode']>\n>;\n\n/**\n * A person by id, the caller's own end user (API keys and app tokens only), or\n * an agent with what it is provided in this conversation.\n */\nexport type ParticipantCreateInput =\n | { user: string }\n | { actor: ActorInputIface }\n | {\n /** The agent you defined, or one fetched with `project.agents.get`; never a string. */\n agent: AgentInput;\n routingMode?: RoutingModeInput;\n provide: ProvideIface;\n };\n\nexport interface ParticipantsApiIface {\n (options?: SignalOptionsIface): Promise<ParticipantIface[]>;\n /** An agent participant's settings: its provide document and per-chat overrides. */\n settings: (\n participantId: string,\n options?: SignalOptionsIface,\n ) => Promise<ParticipantProvideResponseIface>;\n /**\n * Changes an agent participant's settings. Fails with `requirements_unmet` if\n * the result no longer meets the agent's requirements, or\n * `harness_unsuitable` for harness settings it cannot run on.\n */\n provide: (\n participantId: string,\n patch: ProvidePatchIface,\n options?: SignalOptionsIface,\n ) => Promise<ParticipantProvideResponseIface>;\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 extends ConversationResourcesIface {\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: ParticipantsApiIface;\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/:sandboxId/files`). */\n sandboxFiles: (\n args: { sandboxId: 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: { sandboxId: string; path?: string; snapshotId?: string },\n options?: SignalOptionsIface,\n ) => Promise<SandboxPathIface>;\n /** Bounded recursive path search; truncated signals incomplete traversal. */\n searchSandboxFiles: (\n args: { sandboxId: 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/:sandboxId/file`). */\n sandboxFile: (\n args: {\n sandboxId: string;\n path: string;\n offset?: number;\n length?: number;\n snapshotId?: string;\n },\n options?: SignalOptionsIface,\n ) => Promise<SandboxFileIface>;\n inspectSandboxProcesses(\n args: { sandboxId: 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: { sandboxId: string },\n options?: SignalOptionsIface,\n ): Promise<SandboxEditorSessionIface>;\n refreshSandboxEditor(\n args: { sandboxId: string; editorId: string; authorizationId: string },\n options?: SignalOptionsIface,\n ): Promise<SandboxEditorSessionIface>;\n closeSandboxEditor(\n args: { sandboxId: 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: { sandboxId: 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: { sandboxId: 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 /** Fires a schedule now (`POST \u2026/schedules/:id/run-now`, needs `agents:execute`). */\n runSchedule: (\n args: { scheduleId: string },\n options?: SignalOptionsIface,\n ) => Promise<ScheduleRunResultIface>;\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 * A conversation id you chose, so whatever you create for it first (a sandbox\n * it owns) can name it. Creating with an id that exists returns that conversation.\n */\n id?: string;\n kind: EnumInput<ConversationKind>;\n title?: string;\n participants: ParticipantCreateInput[];\n turnPolicy?: EnumInput<AgentTurnPolicy>;\n /** Shared by the conversation's agents; each participant's own `provide` wins per key. */\n provide?: ProvideIface;\n /**\n * Direct only. True (the default): the person's one direct conversation with\n * the agent in this project, found or created. False: another private 1:1\n * thread, created on every call (a retry with the same `id` returns it).\n */\n primary?: boolean;\n /** Written with the conversation in the caller's namespace; needs `labels:write`. */\n labels?: Record<string, string>;\n /** The caller's own end user creating it; API keys and app tokens only. */\n actor?: ActorInputIface;\n}\n\ntype WireParticipantIface =\n | { user: string }\n | { actor: ActorInputIface }\n | { agent: AgentRefInputIface; routingMode?: RoutingModeInput; provide: ProvideDocumentIface };\n\nexport interface ProjectConversationsApiIface extends ConversationsApiIface {\n /**\n * Creates a conversation in this project. Fails with `requirements_unmet`,\n * creating nothing, unless each agent's requirements are met.\n */\n create: (args: CreateConversationArgsIface) => Promise<OpenedConversationIface>;\n /**\n * The caller's own Home thread with the project's agent, found or created.\n * `provide` is stored only when the agent has no settings there yet.\n */\n home: (\n args: { id?: string; provide: ProvideIface } & SignalOptionsIface,\n ) => Promise<OpenedConversationIface>;\n /** The caller's Home thread, if there is one. Creates nothing. */\n findHome: (options?: SignalOptionsIface) => Promise<ConversationIface | null>;\n /**\n * The caller's direct conversation with an agent, found or created.\n * `provide` is stored only when the agent has no settings there yet.\n */\n direct: (\n args: {\n id?: string;\n agent: AgentInput;\n provide: ProvideIface;\n /** The caller's own end user whose direct conversation it is; API keys and app tokens only. */\n actor?: ActorInputIface;\n } & SignalOptionsIface,\n ) => Promise<OpenedConversationIface>;\n /**\n * The caller's primary direct conversation with an agent (by its id), if\n * there is one. Creates nothing. `actorExternalId` names the caller's own end\n * user (API keys and app tokens only).\n */\n findDirect: (\n args: { agent: string; actorExternalId?: string } & SignalOptionsIface,\n ) => Promise<ConversationIface | null>;\n}\n\nexport interface ConversationsApiIface {\n /**\n * A signed-in person's conversations. Without `projectId`, lists their participant inbox.\n * With `projectId`, also includes readable Shared chats in that project and its descendants.\n * A project API key has no person inbox and receives an empty list.\n */\n list: (\n options?: SignalOptionsIface & {\n cursor?: string;\n limit?: number;\n includeArchived?: boolean;\n projectId?: string;\n /** With `projectId`: false leaves out the projects below it. */\n includeSubprojects?: boolean;\n /** Only conversations carrying every one of these labels in the caller's namespace. */\n labels?: Record<string, string>;\n },\n ) => Promise<ConversationListIface>;\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 * Decisions in the selected project and its descendants; omitted, the signed-in person's\n * personal project. A project API key has no person inbox and receives an empty list.\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\n/** How a conversation handle starts the agents added to it. */\nexport interface ConversationStarterIface {\n deps: AgentStartDepsIface;\n /** Null for handles made outside a project, which cannot serve local compute. */\n projectId: string | null;\n}\n\nexport const createConversationHandle = (\n context: ClientContextIface,\n conversationId: string,\n starter: ConversationStarterIface,\n): ConversationHandleIface => {\n const { http } = context;\n const participantPath = (participantId: string, suffix = '') =>\n conversationPath(conversationId, `/participants/${encodePath(participantId)}${suffix}`);\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.sandboxId)}/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 const info = (signal: AbortSignal | undefined) =>\n http.request({\n method: HttpMethod.Get,\n path: conversationPath(conversationId),\n response: conversationSchema,\n signal,\n });\n\n const sharedProvide = async (signal: AbortSignal | undefined) => {\n const { provide } = await info(signal);\n return provide == null ? null : provideDocumentOfView(provide);\n };\n\n return {\n ...createConversationResources(context, conversationId),\n id: conversationId,\n info: (options) => info(options?.signal),\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 actor: options?.actor,\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: Object.assign(\n (options?: SignalOptionsIface) => listParticipants({ signal: options?.signal }),\n {\n settings: (participantId: string, options?: SignalOptionsIface) =>\n http.request({\n method: HttpMethod.Get,\n path: participantPath(participantId, '/provide'),\n response: participantProvideResponseSchema,\n signal: options?.signal,\n }),\n provide: async (\n participantId: string,\n patch: ProvidePatchIface,\n options?: SignalOptionsIface,\n ) => {\n // New harness settings that name no environment, for a worker\n // harness, run in the conversation's Workers sandbox.\n const harness =\n patch.harness == null || starter.projectId == null\n ? patch.harness\n : (\n await withWorkersEnvironment({\n context,\n projectId: starter.projectId,\n harness: patch.harness,\n owner: { kind: LocalHostOwnerKind.Conversation, id: conversationId },\n signal: options?.signal,\n })\n ).harness;\n return http.request({\n method: HttpMethod.Put,\n path: participantPath(participantId, '/provide'),\n body: {\n schema: provideParticipantRequestSchema,\n value: providePatchOf(harness == null ? patch : { ...patch, harness }),\n },\n response: participantProvideResponseSchema,\n signal: options?.signal,\n });\n },\n },\n ),\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: async (participant, options) => {\n if ('user' in participant || 'actor' in participant)\n return http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/participants'),\n body: {\n schema: participantInputSchema,\n value:\n 'user' in participant ? { user: participant.user } : { actor: participant.actor },\n },\n response: participantSchema,\n signal: options?.signal,\n });\n // The platform layers the conversation's own provide under the\n // participant's, so the requirements check and local compute see both.\n const own = participant.provide;\n const shared =\n own.harness != null && own.compute != null && own.integrations != null\n ? null\n : await sharedProvide(options?.signal);\n const started = await startAgent(starter.deps, {\n projectId: starter.projectId,\n agent: participant.agent,\n provide: own,\n shared,\n owner: { kind: LocalHostOwnerKind.Conversation, id: conversationId },\n signal: options?.signal,\n });\n try {\n const added = await http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, '/participants'),\n body: {\n schema: participantInputSchema,\n value: {\n agent: started.ref,\n routingMode: participant.routingMode,\n provide: started.provide,\n },\n },\n response: participantSchema,\n signal: options?.signal,\n });\n started.established();\n return added;\n } catch (cause) {\n started.abandon();\n throw cause;\n }\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.sandboxId)}/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.sandboxId)}/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.sandboxId)}/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.sandboxId)}/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.sandboxId)}/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.sandboxId)}/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.sandboxId)}/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.sandboxId)}/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.sandboxId)}/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.sandboxId)}/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 runSchedule: (args, options) =>\n http.request({\n method: HttpMethod.Post,\n path: conversationPath(conversationId, `/schedules/${encodePath(args.scheduleId)}/run-now`),\n response: scheduleRunResultSchema,\n signal: options?.signal,\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 = (\n context: ClientContextIface,\n starter: ConversationStarterIface,\n): ConversationsApiIface => {\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 ?? starter.projectId ?? undefined,\n includeSubprojects: options?.includeSubprojects,\n label:\n options?.labels == null\n ? undefined\n : Object.entries(options.labels).map(([key, value]) =>\n conversationLabelFilter(key, value),\n ),\n },\n response: conversationListSchema,\n signal: options?.signal,\n }),\n get: (conversationId) => createConversationHandle(context, conversationId, starter),\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\nexport const createProjectConversationsApi = (args: {\n context: ClientContextIface;\n projectId: string;\n start: AgentStartDepsIface;\n}): ProjectConversationsApiIface => {\n const { context, projectId } = args;\n const starter: ConversationStarterIface = { deps: args.start, projectId };\n const base = createConversationsApi(context, starter);\n const opened = (conversation: ConversationIface): OpenedConversationIface => ({\n ...createConversationHandle(context, conversation.id, starter),\n conversation,\n });\n const sandboxes = createSandboxesApi({ context, projectId });\n // A stored participant's files and shell, when they name a sandbox the\n // person chose; null when they are missing or name a local sandbox from an\n // earlier run (or one since deleted), which this process may replace.\n const chosenProcessCompute = async (\n compute: Record<string, string>,\n signal: AbortSignal | undefined,\n ): Promise<Partial<Record<Capability, string>> | null> => {\n const stored: Partial<Record<Capability, string>> = {};\n const ids = new Set<string>();\n for (const capability of PROCESS_CAPABILITIES) {\n const id = compute[capability];\n if (id == null) continue;\n stored[capability] = id;\n ids.add(id);\n }\n for (const id of ids) {\n const sandbox = await sandboxes.get(id, { signal }).catch((cause: unknown) => {\n if (isClientError(cause) && cause.status === 404) return null;\n throw cause;\n });\n if (sandbox != null && sandbox.resource.providerKind !== SandboxProviderKind.ClientHost)\n return stored;\n }\n return null;\n };\n // `provide` with its files and shell replaced; other capabilities stay.\n const withProcessCompute = (\n provide: ProvideIface,\n filesAndShell: Partial<Record<Capability, string>>,\n ): ProvideIface => ({\n ...provide,\n compute: {\n ...Object.fromEntries(\n Object.entries(provide.compute ?? {}).filter(\n ([key]) => !PROCESS_CAPABILITIES.some((capability) => capability === key),\n ),\n ),\n ...filesAndShell,\n },\n });\n // Runs `send` with the agents started; their local hosts end if it fails\n // and are established if it succeeds.\n const withStarted = async <T>(\n started: StartedAgentIface[],\n send: () => Promise<T>,\n ): Promise<T> => {\n try {\n const sent = await send();\n for (const agent of started) agent.established();\n return sent;\n } catch (cause) {\n for (const agent of started) agent.abandon();\n throw cause;\n }\n };\n return {\n ...base,\n create: async (create) => {\n const started: StartedAgentIface[] = [];\n const participants: WireParticipantIface[] = [];\n // A local host or a Workers sandbox reserves the conversation's id when\n // the caller chose none, and every later participant joins that id.\n let conversationId = create.id;\n let shared = create.provide == null ? null : provideDocumentOf(create.provide);\n // The conversation's own harness settings get their Workers sandbox once,\n // for every participant they reach.\n let sharedWorkers: WorkersEnvironmentIface['created'] = null;\n const undoShared = (): void => {\n void sharedWorkers?.discard().catch(() => undefined);\n };\n try {\n if (shared?.harness != null) {\n const placed = await withWorkersEnvironment({\n context,\n projectId,\n harness: shared.harness,\n owner: { kind: LocalHostOwnerKind.Conversation, id: conversationId },\n signal: create.signal,\n });\n shared = { ...shared, harness: placed.harness };\n conversationId = placed.ownerId;\n sharedWorkers = placed.created;\n }\n for (const participant of create.participants) {\n if ('user' in participant) {\n participants.push({ user: participant.user });\n continue;\n }\n if ('actor' in participant) {\n participants.push({ actor: participant.actor });\n continue;\n }\n const agent = await startAgent(args.start, {\n projectId,\n agent: participant.agent,\n provide: participant.provide,\n shared,\n owner: { kind: LocalHostOwnerKind.Conversation, id: conversationId },\n // An id an earlier participant's host or Workers sandbox reserved is not the caller's.\n ownerIdReserved: create.id == null,\n signal: create.signal,\n });\n started.push(agent);\n conversationId = agent.ownerId ?? conversationId;\n participants.push({\n agent: agent.ref,\n routingMode: participant.routingMode,\n provide: agent.provide,\n });\n }\n } catch (cause) {\n for (const agent of started) agent.abandon();\n undoShared();\n throw cause;\n }\n const sent = withStarted(started, () =>\n context.http.request({\n method: HttpMethod.Post,\n path: '/v1/conversations',\n body: {\n schema: createConversationRequestSchema,\n value: {\n id: conversationId,\n projectId,\n kind: create.kind,\n title: create.title,\n participants,\n turnPolicy: create.turnPolicy,\n provide: shared ?? undefined,\n primary: create.primary,\n labels: create.labels,\n actor: create.actor,\n },\n },\n response: conversationResponseSchema,\n signal: create.signal,\n }),\n );\n const { conversation } = await sent.catch((cause: unknown) => {\n undoShared();\n throw cause;\n });\n // An existing chat came back (a direct one): what was started for the id this call\n // used serves nothing.\n if (conversationId != null && conversation.id !== conversationId) {\n for (const agent of started) agent.abandon();\n undoShared();\n }\n return opened(conversation);\n },\n home: async ({ id, provide, signal }) => {\n const document = provideDocumentOf(provide);\n // Harness settings that name no environment get the Home thread's Workers\n // sandbox, as for any other conversation.\n const placed =\n document.harness == null\n ? null\n : await withWorkersEnvironment({\n context,\n projectId,\n harness: document.harness,\n owner: { kind: LocalHostOwnerKind.Conversation, id },\n signal,\n });\n const homeId = placed?.ownerId ?? id;\n const discard = () => void placed?.created?.discard().catch(() => undefined);\n try {\n const { conversation } = await context.http.request({\n method: HttpMethod.Post,\n path: '/v1/conversations/home',\n body: {\n schema: homeConversationRequestSchema,\n value: {\n projectId,\n id: homeId,\n provide: placed == null ? document : { ...document, harness: placed.harness },\n },\n },\n response: conversationResponseSchema,\n signal,\n });\n // An existing Home thread keeps its settings: the sandbox made for the\n // id this call chose serves nothing.\n if (conversation.id !== homeId) discard();\n return opened(conversation);\n } catch (cause) {\n discard();\n throw cause;\n }\n },\n findHome: async (options) =>\n (\n await context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations/home',\n query: { projectId },\n response: conversationLookupSchema,\n signal: options?.signal,\n })\n ).conversation,\n direct: async ({ id, agent, provide, actor, signal }) => {\n const started = await startAgent(args.start, {\n projectId,\n agent,\n provide,\n owner: { kind: LocalHostOwnerKind.Conversation, id },\n signal,\n });\n const { conversation } = await withStarted([started], () =>\n context.http.request({\n method: HttpMethod.Post,\n path: '/v1/conversations/direct',\n body: {\n schema: createDirectConversationRequestSchema,\n value: {\n id: started.ownerId ?? id,\n projectId,\n agent: started.ref,\n provide: started.provide,\n actor,\n },\n },\n response: conversationResponseSchema,\n signal,\n }),\n );\n const chat = opened(conversation);\n if (conversation.id === started.ownerId) return chat;\n // The chat already existed: the platform kept its settings, so a host or\n // Workers sandbox started for the id this call chose serves nothing.\n started.abandon();\n if (started.host == null) return chat;\n // Serve the existing chat instead.\n const participant = (await chat.participants({ signal })).find(\n (member) => member.kind === ParticipantKind.Agent && member.leftAt == null,\n );\n if (participant == null) throw new Error('the direct chat has no agent participant');\n const { settings } = await chat.participants.settings(participant.id, { signal });\n const chosen = await chosenProcessCompute(settings.compute, signal);\n const attached = await startAgent(args.start, {\n projectId,\n agent,\n provide: chosen == null ? provide : withProcessCompute(provide, chosen),\n owner: { kind: LocalHostOwnerKind.Conversation, id: conversation.id },\n signal,\n });\n // Point the agent at this process's sandbox for what this process serves.\n await withStarted([attached], async () => {\n const sandboxId = attached.host?.sandboxId;\n const local = Object.entries(attached.provide.compute ?? {}).filter(\n ([, value]) => sandboxId != null && value === sandboxId,\n );\n if (local.length === 0) return;\n await chat.participants.provide(\n participant.id,\n { compute: Object.fromEntries(local) },\n { signal },\n );\n });\n return chat;\n },\n findDirect: async ({ agent, actorExternalId, signal }) =>\n (\n await context.http.request({\n method: HttpMethod.Get,\n path: '/v1/conversations/direct',\n query: { projectId, agent, actorExternalId },\n response: conversationLookupSchema,\n signal,\n })\n ).conversation,\n };\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["anchor"]
7
7
  }
@@ -0,0 +1,8 @@
1
+ import type { AgentValueCodecIface } from "./agent-input.mjs";
2
+ import { type ChannelSourceOf } from "./channels.mjs";
3
+ import type { HttpIface } from "./http.mjs";
4
+ import type { LocalComputeIface, LocalHostSocketIface } from "./local-host.mjs";
5
+ export declare const defaultAgentCodec: AgentValueCodecIface;
6
+ export declare const defaultChannelSourceOf: ChannelSourceOf;
7
+ export declare const defaultLocalCompute: () => LocalComputeIface;
8
+ export declare const defaultLocalHostDial: (http: HttpIface) => (path: string, signal?: AbortSignal) => Promise<LocalHostSocketIface>;