agents 0.27.0 → 0.28.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 (193) hide show
  1. package/dist/abortable-C1SpfVoi.js +21 -0
  2. package/dist/abortable-C1SpfVoi.js.map +1 -0
  3. package/dist/{agent-routing-Bhdbvf7s.d.ts → agent-routing-QDcchcQP.d.ts} +10 -15
  4. package/dist/agent-routing.d.ts +1 -1
  5. package/dist/agent-tool-types.d.ts +1 -1
  6. package/dist/{agent-tools-bJZwBMfq.d.ts → agent-tools-DHL2XI7u.d.ts} +2 -2
  7. package/dist/agent-tools.d.ts +1 -1
  8. package/dist/ai-ahruGw7e.d.ts +239 -0
  9. package/dist/{ai-sdk-OoGkFy3s.js → ai-sdk-Bdsf6mSA.js} +2 -2
  10. package/dist/{ai-sdk-OoGkFy3s.js.map → ai-sdk-Bdsf6mSA.js.map} +1 -1
  11. package/dist/browser/ai.d.ts +8 -227
  12. package/dist/browser/ai.js +259 -1
  13. package/dist/browser/ai.js.map +1 -0
  14. package/dist/browser/index.d.ts +56 -46
  15. package/dist/browser/index.js +4 -361
  16. package/dist/browser/{ai-sdk.d.ts → tools/ai-sdk.d.ts} +7 -7
  17. package/dist/browser/{ai-sdk.js → tools/ai-sdk.js} +5 -4
  18. package/dist/browser/tools/ai-sdk.js.map +1 -0
  19. package/dist/browser/tools/pi.d.ts +111 -0
  20. package/dist/browser/tools/pi.js +119 -0
  21. package/dist/browser/tools/pi.js.map +1 -0
  22. package/dist/browser/{tanstack-ai.d.ts → tools/tanstack-ai.d.ts} +39 -37
  23. package/dist/browser/{tanstack-ai.js → tools/tanstack-ai.js} +73 -59
  24. package/dist/browser/tools/tanstack-ai.js.map +1 -0
  25. package/dist/browser-CEdNlsaD.js +481 -0
  26. package/dist/browser-CEdNlsaD.js.map +1 -0
  27. package/dist/{browser-tmkcAAI3.d.ts → browser-D30VlpcA.d.ts} +63 -37
  28. package/dist/{browser-tool-CBqs6hqa.js → browser-tool-4iomavs_.js} +145 -49
  29. package/dist/browser-tool-4iomavs_.js.map +1 -0
  30. package/dist/{browser-tool-Bn-nzJQI.d.ts → browser-tool-vtrPOV8e.d.ts} +24 -5
  31. package/dist/{capability-B4WbF81e.js → capability-DBAKc6UZ.js} +1 -3
  32. package/dist/capability-DBAKc6UZ.js.map +1 -0
  33. package/dist/{capability-runner-O5VbQzqg.d.ts → capability-runner-BiVUtjqC.d.ts} +1 -7
  34. package/dist/chat/index.d.ts +4 -4
  35. package/dist/chat/index.js +1 -1
  36. package/dist/chat-sdk/index.d.ts +1 -1
  37. package/dist/chat-sdk/index.js +1 -1
  38. package/dist/{client-DS3Dz9l0.d.ts → client-BGIQKJhX.d.ts} +2 -2
  39. package/dist/{client-1tEQ1Oqz.js → client-BnYbNT3z.js} +3 -4
  40. package/dist/client-BnYbNT3z.js.map +1 -0
  41. package/dist/client.d.ts +1 -1
  42. package/dist/{connector-58XDGvc3.js → connector-CtZylXdk.js} +3 -603
  43. package/dist/connector-CtZylXdk.js.map +1 -0
  44. package/dist/{connector-Cl-VqPmA.d.ts → connector-DEXzVoaY.d.ts} +9 -374
  45. package/dist/{conversations-DH0ut_8n.d.ts → conversations-FjHDRZyD.d.ts} +4 -4
  46. package/dist/{current-agent-C07C5o5Y.d.ts → current-agent-CKgT5d1O.d.ts} +3 -5
  47. package/dist/current-agent-DhoDkSnH.js.map +1 -1
  48. package/dist/{durable-object-lifecycle-DRqp475_.d.ts → durable-object-lifecycle-DOI_bzCH.d.ts} +2 -2
  49. package/dist/experimental/channels/index.d.ts +2 -2
  50. package/dist/experimental/channels/index.js +2 -2
  51. package/dist/experimental/channels/web/index.d.ts +2 -2
  52. package/dist/experimental/channels/web/index.js +1 -1
  53. package/dist/{gateway-BDC07gYO.d.ts → gateway-BFO6vRDn.d.ts} +2 -2
  54. package/dist/harness/ai-sdk/index.d.ts +2 -2
  55. package/dist/harness/ai-sdk/index.js +1 -1
  56. package/dist/harness/container/index.d.ts +2 -2
  57. package/dist/harness/container/index.js +3 -3
  58. package/dist/harness/opencode/index.d.ts +1 -1
  59. package/dist/harness/opencode/index.js +2 -2
  60. package/dist/harness/pi/index.d.ts +2 -2
  61. package/dist/harness/pi/index.js +3 -3
  62. package/dist/harness/store/index.d.ts +1 -1
  63. package/dist/harness/store/index.js +1 -1
  64. package/dist/harness/think/index.d.ts +2 -2
  65. package/dist/harness/think/index.js +363 -171
  66. package/dist/harness/think/index.js.map +1 -1
  67. package/dist/{index-D0A5tbWu.d.ts → index-BEL3ZV-s.d.ts} +2 -6
  68. package/dist/{index-Ib_4dwOo.d.ts → index-CBt8oRJt.d.ts} +3 -5
  69. package/dist/index.d.ts +4 -4
  70. package/dist/index.js +2 -2
  71. package/dist/input-schema-BQykTEp_.js +20 -0
  72. package/dist/input-schema-BQykTEp_.js.map +1 -0
  73. package/dist/{input-schema-DNrpTu49.js → input-schema-D2QAtHZH.js} +3 -3
  74. package/dist/input-schema-D2QAtHZH.js.map +1 -0
  75. package/dist/internal_context.d.ts +1 -1
  76. package/dist/lifecycle/index.d.ts +3 -3
  77. package/dist/lifecycle/index.js +2 -2
  78. package/dist/{lifecycle-CFu6OV03.js → lifecycle-DGorpAmA.js} +2 -4
  79. package/dist/lifecycle-DGorpAmA.js.map +1 -0
  80. package/dist/mcp/client/index.d.ts +1 -1
  81. package/dist/mcp/client/index.js +1 -1
  82. package/dist/mcp/index.d.ts +1 -1
  83. package/dist/mcp/index.js +2 -2
  84. package/dist/models/ai-sdk/index.js +1 -1
  85. package/dist/models/opencode/index.js +1 -1
  86. package/dist/models/pi-ai/index.js +1 -1
  87. package/dist/{options-pwTNq9z6.d.ts → options-CiIsJHXR.d.ts} +2 -6
  88. package/dist/queue/index.d.ts +1 -1
  89. package/dist/queue/index.js +1 -1
  90. package/dist/{queue-BB-zfIYF.js → queue-CcIjVYTE.js} +2 -2
  91. package/dist/{queue-BB-zfIYF.js.map → queue-CcIjVYTE.js.map} +1 -1
  92. package/dist/react.d.ts +2 -2
  93. package/dist/routing/index.d.ts +2 -2
  94. package/dist/routing/index.js +1 -1
  95. package/dist/{scheduler-CrFCnv_J.d.ts → scheduler-BCLESHSC.d.ts} +2 -12
  96. package/dist/{scheduler-DZ3xQfeK.js → scheduler-FIHv2-kJ.js} +2 -4
  97. package/dist/scheduler-FIHv2-kJ.js.map +1 -0
  98. package/dist/schedules/index.d.ts +1 -1
  99. package/dist/schedules/index.js +1 -1
  100. package/dist/serializable.d.ts +1 -1
  101. package/dist/session-store-Do4xkDcf.js +606 -0
  102. package/dist/session-store-Do4xkDcf.js.map +1 -0
  103. package/dist/session-store-DoPY12xM.d.ts +383 -0
  104. package/dist/sessions/index.d.ts +1 -1
  105. package/dist/sessions/index.js +1 -1
  106. package/dist/{sessions-B9pNuxdT.js → sessions-_vN5BEZX.js} +2 -2
  107. package/dist/{sessions-B9pNuxdT.js.map → sessions-_vN5BEZX.js.map} +1 -1
  108. package/dist/{src-DgCbZtIR.js → src-CQxJFv4l.js} +8 -8
  109. package/dist/src-CQxJFv4l.js.map +1 -0
  110. package/dist/state/index.d.ts +1 -1
  111. package/dist/state/index.js +1 -3
  112. package/dist/state/index.js.map +1 -1
  113. package/dist/{store-DLeqKuj3.d.ts → store-BKM4Xm9M.d.ts} +23 -1
  114. package/dist/{store-vgcPYo8K.js → store-CslVzfN7.js} +28 -2
  115. package/dist/store-CslVzfN7.js.map +1 -0
  116. package/dist/streams/index.d.ts +1 -1
  117. package/dist/streams/index.js +1 -1
  118. package/dist/{streams-CITClVer.js → streams-lsHMJhRW.js} +2 -2
  119. package/dist/{streams-CITClVer.js.map → streams-lsHMJhRW.js.map} +1 -1
  120. package/dist/{streams-fbG61qM8.d.ts → streams-vrCtbUIn.d.ts} +2 -2
  121. package/dist/sub-routing.d.ts +1 -1
  122. package/dist/tasks/index.d.ts +1 -1
  123. package/dist/tasks/index.js +1 -1
  124. package/dist/{tasks-CkTZNaV1.js → tasks-BN_5AWqI.js} +2 -2
  125. package/dist/{tasks-CkTZNaV1.js.map → tasks-BN_5AWqI.js.map} +1 -1
  126. package/dist/{tasks-PtlB4Uyn.d.ts → tasks-E89KdwkS.d.ts} +2 -2
  127. package/dist/{tool-BPJEbwaX.d.ts → tool-CTp72Jb_.d.ts} +4 -4
  128. package/dist/tool-CxKsvxjm.js +1126 -0
  129. package/dist/tool-CxKsvxjm.js.map +1 -0
  130. package/dist/tool-DoVberpN.d.ts +301 -0
  131. package/dist/{tool-3PA8xjB_.js → tool-cQRkwSZZ.js} +6 -17
  132. package/dist/tool-cQRkwSZZ.js.map +1 -0
  133. package/dist/tool-helpers-O5BDVEAY.js +58 -0
  134. package/dist/tool-helpers-O5BDVEAY.js.map +1 -0
  135. package/dist/voice/index.d.ts +2 -2
  136. package/dist/web/fetch/index.d.ts +89 -0
  137. package/dist/web/fetch/index.js +20 -0
  138. package/dist/web/fetch/index.js.map +1 -0
  139. package/dist/web/fetch/tools/ai-sdk.d.ts +80 -0
  140. package/dist/web/fetch/tools/ai-sdk.js +47 -0
  141. package/dist/web/fetch/tools/ai-sdk.js.map +1 -0
  142. package/dist/web/fetch/tools/pi.d.ts +84 -0
  143. package/dist/web/fetch/tools/pi.js +88 -0
  144. package/dist/web/fetch/tools/pi.js.map +1 -0
  145. package/dist/web/fetch/tools/tanstack-ai.d.ts +78 -0
  146. package/dist/web/fetch/tools/tanstack-ai.js +45 -0
  147. package/dist/web/fetch/tools/tanstack-ai.js.map +1 -0
  148. package/dist/{websearch → web/search}/index.d.ts +1 -1
  149. package/dist/{websearch → web/search}/index.js +1 -1
  150. package/dist/{websearch → web/search}/tools/ai-sdk.d.ts +2 -2
  151. package/dist/{websearch → web/search}/tools/ai-sdk.js +3 -3
  152. package/dist/web/search/tools/ai-sdk.js.map +1 -0
  153. package/dist/{websearch → web/search}/tools/pi.d.ts +3 -3
  154. package/dist/{websearch → web/search}/tools/pi.js +2 -2
  155. package/dist/web/search/tools/pi.js.map +1 -0
  156. package/dist/{websearch → web/search}/tools/tanstack-ai.d.ts +2 -2
  157. package/dist/{websearch → web/search}/tools/tanstack-ai.js +3 -3
  158. package/dist/web/search/tools/tanstack-ai.js.map +1 -0
  159. package/dist/websockets/index.d.ts +2 -2
  160. package/dist/websockets/index.js +1 -1
  161. package/dist/{websockets-CmENGb-Z.js → websockets-C3zy8YR0.js} +3 -5
  162. package/dist/websockets-C3zy8YR0.js.map +1 -0
  163. package/dist/workflow-types.d.ts +1 -1
  164. package/dist/workflows.d.ts +1 -1
  165. package/dist/workflows.js +1 -1
  166. package/docs/browse-the-web.md +26 -1
  167. package/docs/fetch-the-web.md +276 -0
  168. package/docs/harnesses/pi.md +25 -0
  169. package/docs/index.md +99 -76
  170. package/docs/lifecycle.md +2 -3
  171. package/docs/queue.md +2 -3
  172. package/docs/scheduling.md +2 -6
  173. package/docs/search-the-web.md +2 -0
  174. package/package.json +44 -19
  175. package/dist/ai-fm7xx1BK.js +0 -312
  176. package/dist/ai-fm7xx1BK.js.map +0 -1
  177. package/dist/browser/ai-sdk.js.map +0 -1
  178. package/dist/browser/index.js.map +0 -1
  179. package/dist/browser/tanstack-ai.js.map +0 -1
  180. package/dist/browser-tool-CBqs6hqa.js.map +0 -1
  181. package/dist/capability-B4WbF81e.js.map +0 -1
  182. package/dist/client-1tEQ1Oqz.js.map +0 -1
  183. package/dist/connector-58XDGvc3.js.map +0 -1
  184. package/dist/input-schema-DNrpTu49.js.map +0 -1
  185. package/dist/lifecycle-CFu6OV03.js.map +0 -1
  186. package/dist/scheduler-DZ3xQfeK.js.map +0 -1
  187. package/dist/src-DgCbZtIR.js.map +0 -1
  188. package/dist/store-vgcPYo8K.js.map +0 -1
  189. package/dist/tool-3PA8xjB_.js.map +0 -1
  190. package/dist/websearch/tools/ai-sdk.js.map +0 -1
  191. package/dist/websearch/tools/pi.js.map +0 -1
  192. package/dist/websearch/tools/tanstack-ai.js.map +0 -1
  193. package/dist/websockets-CmENGb-Z.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["compute","harnessInput"],"sources":["../../../src/harness/think/events.ts","../../../src/harness/think/records.ts","../../../src/harness/think/tools.ts","../../../src/harness/think/turn.ts","../../../src/harness/think/harness.ts","../../../src/harness/think/chat.ts"],"sourcesContent":["/**\n * Live events for one session, in the AI SDK's vocabulary, and the\n * projection of them onto the shared harness interface's watch.\n */\nimport type { UIMessage, UIMessageChunk } from \"ai\";\nimport type {\n OperationStatus,\n SessionEvent,\n SessionState,\n SessionWatch\n} from \"../../experimental/channels/harness\";\n\n/**\n * Something that happened in a session, as the AI SDK describes it.\n *\n * @experimental\n */\nexport type ThinkSessionEvent =\n | { readonly type: \"operation\"; readonly status: OperationStatus }\n | {\n readonly type: \"run-start\";\n readonly operationId: string;\n /** Whether the operation continues an assistant message already persisted. */\n readonly continuation: boolean;\n }\n | { readonly type: \"run-end\"; readonly operationId: string }\n /**\n * A streamed chunk of the operation's assistant message. Chunks of one\n * model call continue the message as persisted before that call.\n */\n | {\n readonly type: \"chunk\";\n readonly operationId: string;\n readonly chunk: UIMessageChunk;\n }\n /** A message was persisted; it replaces any message with its id. */\n | {\n readonly type: \"message\";\n readonly message: UIMessage;\n /** The operation that wrote it. */\n readonly operationId?: string;\n }\n /** The session was reset. Messages that follow belong to the new context. */\n | { readonly type: \"reset\" }\n /**\n * The transcript changed in a way no single message describes: messages\n * were deleted, or a compaction changed what the model sees. Re-read it.\n */\n | { readonly type: \"transcript\" };\n\n/** A listener for a session's events. @experimental */\nexport type ThinkSessionListener = (event: ThinkSessionEvent) => void;\n\n/** A listener for every session's events. @experimental */\nexport type ThinkHarnessListener = (\n session: string,\n event: ThinkSessionEvent\n) => void;\n\n/** Fan-out of session events to listeners, per session. */\nexport class SessionEvents {\n readonly #listeners = new Map<string, Set<ThinkSessionListener>>();\n readonly #observers = new Set<ThinkHarnessListener>();\n\n /** Listen to every session. Returns the unsubscribe. */\n observe(listener: ThinkHarnessListener): () => void {\n this.#observers.add(listener);\n return () => {\n this.#observers.delete(listener);\n };\n }\n\n /** Listen to one session. Returns the unsubscribe. */\n subscribe(session: string, listener: ThinkSessionListener): () => void {\n let listeners = this.#listeners.get(session);\n if (!listeners) {\n listeners = new Set();\n this.#listeners.set(session, listeners);\n }\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) this.#listeners.delete(session);\n };\n }\n\n /** Deliver an event to a session's listeners. A throwing listener is logged. */\n emit(session: string, event: ThinkSessionEvent): void {\n for (const observer of this.#observers) {\n try {\n observer(session, event);\n } catch (error) {\n console.error(\"A ThinkHarness observer failed\", error);\n }\n }\n for (const listener of this.#listeners.get(session) ?? []) {\n try {\n listener(event);\n } catch (error) {\n console.error(\"A ThinkHarness session listener failed\", error);\n }\n }\n }\n}\n\n/** One watch: events queue until `start`, then reach the listener in order. */\nexport class Watcher implements SessionWatch {\n readonly closed: Promise<void>;\n readonly state: SessionState;\n #close: () => void = () => {};\n #listener: ((events: readonly SessionEvent[]) => Promise<void>) | undefined;\n readonly #queue: SessionEvent[][] = [];\n readonly #onStop: () => void;\n #draining = false;\n #stopped = false;\n\n constructor(state: SessionState, onStop: () => void) {\n this.state = state;\n this.#onStop = onStop;\n this.closed = new Promise((resolve) => {\n this.#close = resolve;\n });\n }\n\n /** Start delivering queued and later events. */\n start(listener: (events: readonly SessionEvent[]) => Promise<void>): void {\n this.#listener = listener;\n void this.#drain();\n }\n\n /** Stop the watch. */\n async stop(): Promise<void> {\n if (this.#stopped) return;\n this.#stopped = true;\n this.#onStop();\n this.#close();\n }\n\n /** Queue events for the listener. */\n push(events: SessionEvent[]): void {\n if (this.#stopped || events.length === 0) return;\n this.#queue.push(events);\n void this.#drain();\n }\n\n async #drain(): Promise<void> {\n if (!this.#listener || this.#draining) return;\n this.#draining = true;\n try {\n for (;;) {\n const events = this.#queue.shift();\n if (!events || this.#stopped) return;\n try {\n await this.#listener(events);\n } catch (error) {\n console.error(\"A ThinkHarness session watcher failed\", error);\n }\n }\n } finally {\n this.#draining = false;\n }\n }\n}\n","/**\n * ThinkHarness's own durable records: which sessions exist, the queue of\n * operations in each, and the tool calls the harness has started. Messages\n * are not here; they live in the Sessions capability, and in-flight model\n * output lives in the Streams capability.\n *\n * Every write is synchronous, so a write can join the transaction a Streams\n * cutover or a Sessions write commits in.\n */\nimport type { UIMessage } from \"ai\";\nimport type { ClientToolSchema } from \"../../chat/client-tools\";\nimport type { ToolAnswer } from \"../../experimental/channels/harness\";\n\n/** What an operation asks the harness to do, as stored. */\nexport type OperationInput =\n /** Place these user messages, then answer them. */\n | { readonly kind: \"messages\"; readonly messages: readonly UIMessage[] }\n /** Record a tool result or approval, then continue the turn it unblocks. */\n | {\n readonly kind: \"answer\";\n readonly answer: ToolAnswer;\n /** Whether to continue the turn once nothing else is awaited. */\n readonly autoContinue: boolean;\n }\n /** Answer a user message again, on a new branch beside earlier answers. */\n | { readonly kind: \"regenerate\"; readonly messageId?: string }\n /** Continue the latest assistant message. */\n | { readonly kind: \"continue\" };\n\n/** Where an operation is in its life. */\nexport type OperationStatus = \"queued\" | \"running\" | \"done\" | \"unanswered\";\n\n/** One operation row, parsed. */\nexport type OperationRecord = {\n readonly session: string;\n readonly operationId: string;\n readonly seq: number;\n readonly input: OperationInput;\n readonly status: OperationStatus;\n readonly source: \"client\" | \"server\";\n /** The message a new assistant message is a child of. */\n readonly parentId: string | undefined;\n /** This operation's assistant message, once it has one. */\n readonly messageId: string | undefined;\n /** The stream of the model call in progress, if one is. */\n readonly streamId: string | undefined;\n /** Whether the model has to be called before the turn can end. */\n readonly pendingModel: boolean;\n /** Model calls made so far. */\n readonly steps: number;\n /** Interruptions since the turn last made progress. */\n readonly interruptions: number;\n /** Context-overflow retries spent. */\n readonly overflowRetries: number;\n readonly reason: string | undefined;\n readonly text: string | undefined;\n /** Set when the operation must be settled unanswered rather than run on. */\n readonly abandonReason: string | undefined;\n readonly createdAt: number;\n};\n\n/** A tool call the harness started, so an eviction mid-call is noticed. */\nexport type ToolCallRecord = {\n readonly session: string;\n readonly toolCallId: string;\n readonly operationId: string;\n readonly attempts: number;\n};\n\n/** A session the harness knows of. */\nexport type SessionRecord = {\n readonly id: string;\n readonly parent: string | undefined;\n readonly createdAt: number;\n};\n\ntype OperationRow = {\n session_id: string;\n operation_id: string;\n seq: number;\n input: string;\n status: string;\n source: string;\n parent_id: string | null;\n message_id: string | null;\n stream_id: string | null;\n pending_model: number;\n steps: number;\n interruptions: number;\n overflow_retries: number;\n reason: string | null;\n text: string | null;\n abandon_reason: string | null;\n created_at: number;\n};\n\ntype SessionRow = {\n id: string;\n parent: string | null;\n client_tools: string | null;\n created_at: number;\n};\n\ntype ToolCallRow = {\n session_id: string;\n tool_call_id: string;\n operation_id: string;\n attempts: number;\n};\n\n/** A change to an operation's progress fields. */\nexport type OperationUpdate = {\n readonly status?: OperationStatus;\n readonly parentId?: string | null;\n readonly messageId?: string | null;\n readonly streamId?: string | null;\n readonly pendingModel?: boolean;\n readonly steps?: number;\n readonly interruptions?: number;\n readonly overflowRetries?: number;\n readonly reason?: string | null;\n readonly text?: string | null;\n readonly abandonReason?: string | null;\n};\n\nconst STATUSES: ReadonlySet<string> = new Set([\n \"queued\",\n \"running\",\n \"done\",\n \"unanswered\"\n]);\n\nfunction parseStatus(value: string): OperationStatus {\n if (!STATUSES.has(value)) {\n throw new Error(`Unknown ThinkHarness operation status ${value}`);\n }\n // SAFETY: checked against the closed set above.\n return value as OperationStatus;\n}\n\nfunction parseOperation(row: OperationRow): OperationRecord {\n // SAFETY: the input column is only written by `insert`, from an\n // OperationInput serialized with JSON.stringify.\n const input = JSON.parse(row.input) as OperationInput;\n return {\n session: row.session_id,\n operationId: row.operation_id,\n seq: row.seq,\n input,\n status: parseStatus(row.status),\n source: row.source === \"client\" ? \"client\" : \"server\",\n parentId: row.parent_id ?? undefined,\n messageId: row.message_id ?? undefined,\n streamId: row.stream_id ?? undefined,\n pendingModel: row.pending_model === 1,\n steps: row.steps,\n interruptions: row.interruptions,\n overflowRetries: row.overflow_retries,\n reason: row.reason ?? undefined,\n text: row.text ?? undefined,\n abandonReason: row.abandon_reason ?? undefined,\n createdAt: row.created_at\n };\n}\n\n/**\n * The harness's own tables, over the object's SQLite: sessions, the\n * operation queue, and started tool calls. Named apart from the shared\n * `agents/harness/store`, which is a different, harness-agnostic store.\n */\nexport class OperationRecords {\n readonly #sql: SqlStorage;\n #ready = false;\n\n constructor(sql: SqlStorage) {\n this.#sql = sql;\n }\n\n /** Create the tables. Idempotent. */\n ensureTables(): void {\n if (this.#ready) return;\n this.#sql.exec(`CREATE TABLE IF NOT EXISTS cf_think_harness_sessions (\n id TEXT PRIMARY KEY,\n parent TEXT,\n client_tools TEXT,\n created_at INTEGER NOT NULL\n )`);\n this.#sql.exec(`CREATE TABLE IF NOT EXISTS cf_think_harness_operations (\n session_id TEXT NOT NULL,\n operation_id TEXT NOT NULL,\n seq INTEGER NOT NULL,\n input TEXT NOT NULL,\n status TEXT NOT NULL,\n source TEXT NOT NULL,\n parent_id TEXT,\n message_id TEXT,\n stream_id TEXT,\n pending_model INTEGER NOT NULL DEFAULT 0,\n steps INTEGER NOT NULL DEFAULT 0,\n interruptions INTEGER NOT NULL DEFAULT 0,\n overflow_retries INTEGER NOT NULL DEFAULT 0,\n reason TEXT,\n text TEXT,\n abandon_reason TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n PRIMARY KEY (session_id, operation_id)\n )`);\n // Columns added after the table first shipped. CREATE TABLE IF NOT\n // EXISTS leaves an existing table as it was, so add them here.\n const columns = new Set(\n this.#sql\n .exec<{ name: string }>(\n `PRAGMA table_info(cf_think_harness_operations)`\n )\n .toArray()\n .map((column) => column.name)\n );\n if (!columns.has(\"abandon_reason\")) {\n this.#sql.exec(\n `ALTER TABLE cf_think_harness_operations ADD COLUMN abandon_reason TEXT`\n );\n }\n this.#sql.exec(`CREATE INDEX IF NOT EXISTS cf_think_harness_operations_open\n ON cf_think_harness_operations (session_id, status, seq)`);\n this.#sql.exec(`CREATE TABLE IF NOT EXISTS cf_think_harness_tool_calls (\n session_id TEXT NOT NULL,\n tool_call_id TEXT NOT NULL,\n operation_id TEXT NOT NULL,\n attempts INTEGER NOT NULL,\n PRIMARY KEY (session_id, tool_call_id)\n )`);\n this.#ready = true;\n }\n\n // ── Sessions ─────────────────────────────────────────────────────────────\n\n /** Record a session, unless it exists. Returns whether it was new. */\n ensureSession(id: string, parent?: string): boolean {\n const written = this.#sql.exec(\n `INSERT OR IGNORE INTO cf_think_harness_sessions (id, parent, created_at)\n VALUES (?, ?, ?)`,\n id,\n parent ?? null,\n Date.now()\n ).rowsWritten;\n return written > 0;\n }\n\n /** Every session, oldest first. */\n sessions(): SessionRecord[] {\n return this.#sql\n .exec<SessionRow>(\n `SELECT id, parent, client_tools, created_at\n FROM cf_think_harness_sessions ORDER BY created_at, id`\n )\n .toArray()\n .map((row) => ({\n id: row.id,\n parent: row.parent ?? undefined,\n createdAt: row.created_at\n }));\n }\n\n /** The client tools a session's client last declared. */\n clientTools(session: string): ClientToolSchema[] {\n const row = this.#sql\n .exec<Pick<SessionRow, \"client_tools\">>(\n `SELECT client_tools FROM cf_think_harness_sessions WHERE id = ?`,\n session\n )\n .toArray()[0];\n if (!row?.client_tools) return [];\n // SAFETY: written only by setClientTools from ClientToolSchema[].\n return JSON.parse(row.client_tools) as ClientToolSchema[];\n }\n\n /** Replace the client tools a session's client declared. */\n setClientTools(session: string, tools: readonly ClientToolSchema[]): void {\n this.#sql.exec(\n `UPDATE cf_think_harness_sessions SET client_tools = ? WHERE id = ?`,\n JSON.stringify(tools),\n session\n );\n }\n\n // ── Operations ───────────────────────────────────────────────────────────\n\n /** Insert a queued operation. Returns false when the id already exists. */\n insert(\n session: string,\n operationId: string,\n input: OperationInput,\n source: \"client\" | \"server\"\n ): boolean {\n const now = Date.now();\n return (\n this.#sql.exec(\n `INSERT OR IGNORE INTO cf_think_harness_operations\n (session_id, operation_id, seq, input, status, source, created_at, updated_at)\n VALUES (?, ?,\n (SELECT COALESCE(MAX(seq), 0) + 1 FROM cf_think_harness_operations),\n ?, 'queued', ?, ?, ?)`,\n session,\n operationId,\n JSON.stringify(input),\n source,\n now,\n now\n ).rowsWritten > 0\n );\n }\n\n /** One operation. */\n get(session: string, operationId: string): OperationRecord | undefined {\n const row = this.#sql\n .exec<OperationRow>(\n `SELECT * FROM cf_think_harness_operations\n WHERE session_id = ? AND operation_id = ?`,\n session,\n operationId\n )\n .toArray()[0];\n return row ? parseOperation(row) : undefined;\n }\n\n /** Unsettled operations, oldest first; every session when none is given. */\n open(session?: string): OperationRecord[] {\n const rows =\n session === undefined\n ? this.#sql.exec<OperationRow>(\n `SELECT * FROM cf_think_harness_operations\n WHERE status IN ('queued', 'running') ORDER BY seq`\n )\n : this.#sql.exec<OperationRow>(\n `SELECT * FROM cf_think_harness_operations\n WHERE session_id = ? AND status IN ('queued', 'running')\n ORDER BY seq`,\n session\n );\n return rows.toArray().map(parseOperation);\n }\n\n /** Apply a change to an operation's fields. */\n update(session: string, operationId: string, change: OperationUpdate): void {\n const sets: string[] = [];\n const values: (string | number | null)[] = [];\n const set = (column: string, value: string | number | null) => {\n sets.push(`${column} = ?`);\n values.push(value);\n };\n if (change.status !== undefined) set(\"status\", change.status);\n if (change.parentId !== undefined) set(\"parent_id\", change.parentId);\n if (change.messageId !== undefined) set(\"message_id\", change.messageId);\n if (change.streamId !== undefined) set(\"stream_id\", change.streamId);\n if (change.pendingModel !== undefined) {\n set(\"pending_model\", change.pendingModel ? 1 : 0);\n }\n if (change.steps !== undefined) set(\"steps\", change.steps);\n if (change.interruptions !== undefined) {\n set(\"interruptions\", change.interruptions);\n }\n if (change.overflowRetries !== undefined) {\n set(\"overflow_retries\", change.overflowRetries);\n }\n if (change.reason !== undefined) set(\"reason\", change.reason);\n if (change.text !== undefined) set(\"text\", change.text);\n if (change.abandonReason !== undefined) {\n set(\"abandon_reason\", change.abandonReason);\n }\n set(\"updated_at\", Date.now());\n this.#sql.exec(\n `UPDATE cf_think_harness_operations SET ${sets.join(\", \")}\n WHERE session_id = ? AND operation_id = ?`,\n ...values,\n session,\n operationId\n );\n }\n\n /** Forget every settled operation in a session, for a reset. */\n deleteSettled(session: string): void {\n this.#sql.exec(\n `DELETE FROM cf_think_harness_operations\n WHERE session_id = ? AND status IN ('done', 'unanswered')`,\n session\n );\n this.#sql.exec(\n `DELETE FROM cf_think_harness_tool_calls WHERE session_id = ?`,\n session\n );\n }\n\n // ── Tool calls ───────────────────────────────────────────────────────────\n\n /** The record of a started tool call, if it was started. */\n toolCall(session: string, toolCallId: string): ToolCallRecord | undefined {\n const row = this.#sql\n .exec<ToolCallRow>(\n `SELECT * FROM cf_think_harness_tool_calls\n WHERE session_id = ? AND tool_call_id = ?`,\n session,\n toolCallId\n )\n .toArray()[0];\n return row\n ? {\n session: row.session_id,\n toolCallId: row.tool_call_id,\n operationId: row.operation_id,\n attempts: row.attempts\n }\n : undefined;\n }\n\n /** Record that a tool call is starting. Returns the attempt number. */\n startToolCall(\n session: string,\n toolCallId: string,\n operationId: string\n ): number {\n const attempts = (this.toolCall(session, toolCallId)?.attempts ?? 0) + 1;\n this.#sql.exec(\n `INSERT OR REPLACE INTO cf_think_harness_tool_calls\n (session_id, tool_call_id, operation_id, attempts)\n VALUES (?, ?, ?, ?)`,\n session,\n toolCallId,\n operationId,\n attempts\n );\n return attempts;\n }\n\n /** Forget a tool call once its result is in the transcript. */\n finishToolCall(session: string, toolCallId: string): void {\n this.#sql.exec(\n `DELETE FROM cf_think_harness_tool_calls\n WHERE session_id = ? AND tool_call_id = ?`,\n session,\n toolCallId\n );\n }\n}\n","/**\n * The harness runs server tools itself, one durable call at a time, so the\n * model is only ever offered tool definitions: no `execute`, no\n * `needsApproval`. That way the AI SDK ends each model call at its tool\n * calls, and the harness decides how to run, approve, or recover each one.\n */\nimport type { ModelMessage, Tool, ToolSet } from \"ai\";\n\n/** The model-facing copy of a tool set, restricted to `activeTools` if given. */\nexport function modelTools(\n tools: ToolSet,\n activeTools: readonly string[] | undefined\n): ToolSet {\n const active = activeTools ? new Set(activeTools) : undefined;\n const offered: ToolSet = {};\n for (const [name, tool] of Object.entries(tools)) {\n if (active && !active.has(name)) continue;\n if (tool.type === \"provider\") {\n offered[name] = tool;\n continue;\n }\n const {\n execute: _execute,\n needsApproval: _needsApproval,\n ...definition\n } = tool;\n // A tool's `recovery` field is the harness's, not the model's.\n if (\"recovery\" in definition) delete definition.recovery;\n // SAFETY: a tool without `execute` and `needsApproval` is still a tool\n // of the same kind; both fields are optional on every Tool variant.\n offered[name] = definition as ToolSet[string];\n }\n return offered;\n}\n\n/** Whether the harness runs this tool, as opposed to a client or provider. */\nexport function isServerTool(tools: ToolSet, name: string): boolean {\n const tool = Object.hasOwn(tools, name) ? tools[name] : undefined;\n return (\n tool !== undefined &&\n tool.type !== \"provider\" &&\n typeof tool.execute === \"function\"\n );\n}\n\n/** Whether a tool's own `needsApproval` asks for approval of this call. */\nexport async function toolNeedsApproval(\n tool: Tool,\n input: unknown,\n options: { readonly toolCallId: string; readonly messages: ModelMessage[] }\n): Promise<boolean> {\n const needsApproval = tool.needsApproval;\n if (typeof needsApproval === \"function\") {\n return Boolean(\n await needsApproval(input, { ...options, context: undefined })\n );\n }\n return needsApproval === true;\n}\n\n/** A tool call's outcome. */\nexport type ToolOutcome =\n | { readonly ok: true; readonly output: unknown }\n | { readonly ok: false; readonly errorText: string };\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value &&\n typeof value[Symbol.asyncIterator] === \"function\"\n );\n}\n\n/**\n * Run one tool's `execute`. A streaming tool's outputs before its last are\n * reported to `onPreliminary`; its last output is the result.\n */\nexport async function executeTool(\n tool: Tool,\n input: unknown,\n options: {\n readonly toolCallId: string;\n readonly messages: ModelMessage[];\n readonly abortSignal: AbortSignal;\n readonly onPreliminary: (output: unknown) => void;\n }\n): Promise<ToolOutcome> {\n const execute = tool.execute;\n if (typeof execute !== \"function\") {\n return { ok: false, errorText: \"The tool has no execute function\" };\n }\n try {\n const result: unknown = await execute(input, {\n toolCallId: options.toolCallId,\n messages: options.messages,\n abortSignal: options.abortSignal,\n context: undefined\n });\n if (!isAsyncIterable(result)) return { ok: true, output: result };\n let last: unknown;\n let seen = false;\n for await (const output of result) {\n if (seen) options.onPreliminary(last);\n last = output;\n seen = true;\n }\n return { ok: true, output: last };\n } catch (error) {\n return {\n ok: false,\n errorText: error instanceof Error ? error.message : String(error)\n };\n }\n}\n","/**\n * What a turn does next, read from durable state alone: the operation's\n * progress fields and its assistant message. The harness asks after every\n * step, and again after an eviction, so a turn picks up exactly where its\n * last durable write left it.\n */\nimport type { UIMessage } from \"ai\";\n\ntype UIPart = UIMessage[\"parts\"][number];\n\n/** A tool call part of a UI message. */\nexport type ToolCallPart = Extract<UIPart, { toolCallId: string }>;\n\n/** The next thing a turn does. */\nexport type TurnAction =\n /** A model call was cut short; rebuild it from its stream. */\n | { readonly _tag: \"recover-model\" }\n | { readonly _tag: \"call-model\" }\n /** Run these server tool calls, then call the model again. */\n | { readonly _tag: \"run-tools\"; readonly calls: readonly ToolCallPart[] }\n /** A client tool result or an approval is needed before going on. */\n | { readonly _tag: \"await-input\" }\n | { readonly _tag: \"end\" };\n\n/** The durable progress of a turn. */\nexport type TurnProgress = {\n readonly streamId: string | undefined;\n readonly pendingModel: boolean;\n readonly steps: number;\n};\n\n/** Whether a part is a tool call. */\nexport function isToolCallPart(part: UIPart): part is ToolCallPart {\n return (\n (part.type.startsWith(\"tool-\") || part.type === \"dynamic-tool\") &&\n \"toolCallId\" in part\n );\n}\n\n/** The tool name a tool call part carries. */\nexport function toolNameOf(part: ToolCallPart): string {\n return part.type === \"dynamic-tool\"\n ? part.toolName\n : part.type.slice(\"tool-\".length);\n}\n\n/** The parts of a message's last model step. */\nexport function lastStep(message: UIMessage): UIPart[] {\n let start = 0;\n message.parts.forEach((part, index) => {\n if (part.type === \"step-start\") start = index + 1;\n });\n return message.parts.slice(start);\n}\n\n/** Whether a tool call has its result, error or denial. */\nexport function isSettled(part: ToolCallPart): boolean {\n return (\n part.state === \"output-available\" ||\n part.state === \"output-error\" ||\n part.state === \"output-denied\"\n );\n}\n\n/**\n * Decide the turn's next action.\n *\n * @param progress - The operation's durable progress.\n * @param message - The turn's assistant message, once it has one.\n * @param isServerTool - Whether the harness runs a tool of this name.\n * @param maxSteps - Most model calls one operation makes.\n * @returns What to do next.\n */\nexport function nextAction(\n progress: TurnProgress,\n message: UIMessage | undefined,\n isServerTool: (name: string) => boolean,\n maxSteps: number\n): TurnAction {\n if (progress.streamId !== undefined) return { _tag: \"recover-model\" };\n if (message === undefined) {\n return progress.pendingModel ? { _tag: \"call-model\" } : { _tag: \"end\" };\n }\n const runnable: ToolCallPart[] = [];\n let awaiting = false;\n for (const part of lastStep(message)) {\n if (!isToolCallPart(part) || isSettled(part) || part.providerExecuted) {\n continue;\n }\n const server = isServerTool(toolNameOf(part));\n switch (part.state) {\n case \"input-available\":\n if (server) runnable.push(part);\n else awaiting = true;\n break;\n case \"approval-responded\":\n if (server && part.approval.approved) runnable.push(part);\n else awaiting = true;\n break;\n case \"approval-requested\":\n awaiting = true;\n break;\n case \"input-streaming\":\n // Only an interrupted model call leaves one, and recovery drops it.\n break;\n }\n }\n if (runnable.length > 0) return { _tag: \"run-tools\", calls: runnable };\n if (awaiting) return { _tag: \"await-input\" };\n if (progress.pendingModel && progress.steps < maxSteps) {\n return { _tag: \"call-model\" };\n }\n return { _tag: \"end\" };\n}\n\n/** The text of a message's text parts. */\nexport function textOf(message: UIMessage | undefined): string {\n if (!message) return \"\";\n return message.parts\n .map((part) => (part.type === \"text\" ? part.text : \"\"))\n .join(\"\");\n}\n\n/**\n * The partial message an interrupted model call leaves, made safe to keep:\n * tool calls whose input never finished streaming are dropped, since the\n * model never committed to them.\n */\nexport function settledPartial(message: UIMessage): UIMessage {\n return {\n ...message,\n parts: message.parts.filter(\n (part) => !(isToolCallPart(part) && part.state === \"input-streaming\")\n )\n };\n}\n\n/** Whether a message has anything besides step markers. */\nexport function hasContent(message: UIMessage): boolean {\n return message.parts.some((part) => part.type !== \"step-start\");\n}\n","import {\n convertToModelMessages,\n stepCountIs,\n streamText,\n toUIMessageStream,\n type ModelMessage,\n type ToolSet,\n type UIMessage,\n type UIMessageChunk\n} from \"ai\";\n// Imported from their modules, not \"../../lifecycle\", which loads\n// cloudflare:workers.\nimport {\n bindLifecycleCapability,\n LifecycleCapability\n} from \"../../lifecycle/capability\";\nimport { Sessions } from \"../../sessions/sessions\";\nimport { Streams } from \"../../streams/streams\";\nimport type { MemoryLimitContext } from \"../../lifecycle/capability-runner\";\nimport type {\n LifecycleJobContext,\n LifecycleJobOutcome\n} from \"../../lifecycle/job-queue\";\nimport { createToolsFromClientSchemas } from \"../../chat/client-tools\";\nimport type { StreamChunkData } from \"../../chat/message-builder\";\nimport {\n ChatStreamStalledError,\n iterateWithStallWatchdog\n} from \"../../chat/stall-watchdog\";\nimport { StreamAccumulator } from \"../../chat/stream-accumulator\";\nimport type {\n AgentHarness,\n HarnessInput,\n HarnessSession,\n HarnessSessions,\n SessionEvent,\n SessionState,\n SessionWatch,\n ToolAnswer\n} from \"../../experimental/channels/harness\";\nimport type { CompactResult } from \"../../sessions/compaction-helpers\";\nimport type { Session } from \"../../sessions/handle\";\nimport type { SearchResult, SessionMessage } from \"../../sessions/types\";\nimport type { StreamJson } from \"../../streams/types\";\nimport {\n answerToolCall,\n toResponseChunk,\n toTranscriptMessage,\n type ToolCallAnswer\n} from \"../ai-sdk/turns\";\nimport {\n SessionEvents,\n Watcher,\n type ThinkHarnessListener,\n type ThinkSessionEvent,\n type ThinkSessionListener\n} from \"./events\";\nimport {\n OperationRecords,\n type OperationInput,\n type OperationRecord\n} from \"./records\";\nimport {\n executeTool,\n isServerTool,\n modelTools,\n toolNeedsApproval,\n type ToolOutcome\n} from \"./tools\";\nimport {\n hasContent,\n isToolCallPart,\n lastStep,\n nextAction,\n settledPartial,\n textOf,\n toolNameOf,\n type ToolCallPart\n} from \"./turn\";\nimport type {\n PerSession,\n ThinkErrorClass,\n ThinkHarnessOptions,\n ThinkInFlight,\n ThinkInput,\n ThinkOperationStatus,\n ThinkStreamCallback,\n ThinkOperationResult,\n ThinkPendingOperation,\n ThinkPromptResponse,\n ThinkReceipt,\n ThinkSessionId,\n ThinkSessionInfo,\n ThinkSubmitOptions,\n ToolRecovery\n} from \"./types\";\n\n/**\n * Thrown by `submit()` when asked to steer a running turn, which\n * ThinkHarness does not support. Submit without `whenBusy` to queue the\n * input behind the running turn instead.\n *\n * @experimental\n */\nexport class SteerNotSupportedError extends Error {\n /** Stable tag for matching without `instanceof`. */\n readonly _tag = \"SteerNotSupportedError\" as const;\n\n /** @param session - The session the submission was for. */\n constructor(readonly session: ThinkSessionId) {\n super(\n 'ThinkHarness does not support whenBusy: \"steer\". Submit without it to queue the input behind the running turn.'\n );\n this.name = \"SteerNotSupportedError\";\n }\n}\n\n/** The root session's id: the Sessions capability's default session. */\nexport const ROOT_SESSION: ThinkSessionId = \"\";\n\nconst WAKE_FN = \"wake\";\nconst HEARTBEAT_MS = 30_000;\nconst DEFAULT_MAX_STEPS = 10;\nconst DEFAULT_MAX_ATTEMPTS = 10;\nconst DEFAULT_BACKOFF_MS = 1_000;\nconst MAX_BACKOFF_MS = 60_000;\nconst DEFAULT_STALL_TIMEOUT_MS = 120_000;\nconst MAX_OVERFLOW_RETRIES = 1;\n/** Ceiling for one stored segment, under the 2 MB SQLite row limit. */\nconst STREAM_MAX_CHUNK_BYTES = 1_900_000;\n/** Chunks packed into one stored stream segment. */\nconst SEGMENT_CHUNKS = 10;\n/** Raw bytes packed into one stored segment before it is written. */\nconst SEGMENT_MAX_BYTES = 256_000;\n/** Longest a streamed chunk waits in memory before it is written. */\nconst FLUSH_AFTER_MS = 100;\n/** Segments read at a time when rebuilding an interrupted model call. */\nconst READ_PAGE = 50;\n\nconst INTERRUPTED_TOOL_ERROR =\n \"The tool call was interrupted before it finished, because the agent restarted. It may or may not have taken effect.\";\n\ntype WakeTiming = {\n /** Heartbeat of a session's wake job while it runs. Default 30_000. */\n readonly heartbeatMs?: number;\n};\n\nlet setWakeTiming: (harness: ThinkHarness, timing: WakeTiming) => void;\n\n/**\n * @internal Shorten a harness's heartbeat, so a test suite does not sit on\n * the real one. Not exported from `agents/harness/think`.\n */\nexport function setWakeTimingForTests(\n harness: ThinkHarness,\n timing: WakeTiming\n): void {\n setWakeTiming(harness, timing);\n}\n\n/** The operation a session is running in this isolate. */\ntype LiveRun = {\n readonly operationId: string;\n readonly abort: AbortController;\n /** Chunks of the model call in progress. */\n partial: UIMessageChunk[];\n /** Whether that call continues a message already persisted. */\n continues: boolean;\n};\n\n/** What an operation's run asks of the drive when it stops early. */\ntype RunOutcome = { readonly retryAt?: number };\n\n/** A durable write: put messages and update operations, in one transaction. */\ntype Put = (\n message: UIMessage,\n options?: {\n readonly parentId?: string;\n readonly source?: \"client\" | \"server\";\n }\n) => void;\n\nfunction wakeJobId(session: ThinkSessionId): string {\n return `think-wake:${session}`;\n}\n\nfunction sessionOfJob(payload: unknown): ThinkSessionId | undefined {\n return typeof payload === \"object\" &&\n payload !== null &&\n \"session\" in payload &&\n typeof payload.session === \"string\"\n ? payload.session\n : undefined;\n}\n\nasync function resolve<T>(\n value: PerSession<T> | undefined,\n session: ThinkSessionId\n): Promise<T | undefined> {\n if (typeof value === \"function\") {\n // SAFETY: PerSession<T> is T or a function of the session context, and\n // no T the harness takes (a model, a system prompt, a tool set) is a\n // function, so a function here is the per-session form.\n const compute = value as (context: {\n session: ThinkSessionId;\n }) => T | Promise<T>;\n return compute({ session });\n }\n return value;\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isToolAnswer(input: ThinkInput): input is ToolAnswer {\n return (\n typeof input === \"object\" &&\n !Array.isArray(input) &&\n \"type\" in input &&\n (input.type === \"approval\" || input.type === \"tool-result\")\n );\n}\n\nfunction isUIMessage(input: ThinkInput): input is UIMessage {\n return (\n typeof input === \"object\" &&\n !Array.isArray(input) &&\n \"role\" in input &&\n \"parts\" in input\n );\n}\n\nfunction harnessInputMessage(input: HarnessInput, id: string): UIMessage {\n return {\n id: input.messageId ?? id,\n role: \"user\",\n parts: input.parts.map((part) =>\n part.type === \"text\"\n ? { type: \"text\", text: part.text }\n : {\n type: \"file\",\n mediaType: part.mediaType,\n url: part.url,\n ...(part.filename !== undefined && { filename: part.filename })\n }\n )\n };\n}\n\n/** The stored form of an input. */\nfunction operationInput(\n input: ThinkInput,\n operationId: string,\n autoContinue: boolean\n): OperationInput {\n if (typeof input === \"string\") {\n return {\n kind: \"messages\",\n messages: [\n {\n id: operationId,\n role: \"user\",\n parts: [{ type: \"text\", text: input }]\n }\n ]\n };\n }\n if (Array.isArray(input)) {\n // SAFETY: the only array a ThinkInput can be is readonly UIMessage[].\n return { kind: \"messages\", messages: input as readonly UIMessage[] };\n }\n if (isToolAnswer(input)) {\n return { kind: \"answer\", answer: input, autoContinue };\n }\n if (isUIMessage(input)) return { kind: \"messages\", messages: [input] };\n // SAFETY: the remaining ThinkInput is the shared HarnessInput.\n const harnessInput = input as HarnessInput;\n return {\n kind: \"messages\",\n messages: [harnessInputMessage(harnessInput, operationId)]\n };\n}\n\nfunction toolCallAnswer(answer: ToolAnswer): ToolCallAnswer {\n return answer.type === \"approval\"\n ? {\n type: \"approval-response\",\n approvalId: answer.approvalId,\n approved: answer.approved,\n ...(answer.reason !== undefined && { reason: answer.reason })\n }\n : {\n type: \"tool-result\",\n toolCallId: answer.toolCallId,\n result: answer.result\n };\n}\n\n/** Replace one tool call part of a message. */\nfunction withToolPart(\n message: UIMessage,\n toolCallId: string,\n update: (part: ToolCallPart) => ToolCallPart\n): UIMessage {\n return {\n ...message,\n parts: message.parts.map((part) =>\n isToolCallPart(part) && part.toolCallId === toolCallId\n ? update(part)\n : part\n )\n };\n}\n\nfunction withOutcome(part: ToolCallPart, outcome: ToolOutcome): ToolCallPart {\n // SAFETY: the new state is set with exactly the fields it requires.\n return (\n outcome.ok\n ? {\n ...part,\n state: \"output-available\",\n output: outcome.output,\n preliminary: undefined\n }\n : { ...part, state: \"output-error\", errorText: outcome.errorText }\n ) as ToolCallPart;\n}\n\nfunction asUIMessages(messages: readonly SessionMessage[]): UIMessage[] {\n // SAFETY: every message in a ThinkHarness session was written by the\n // harness from a UIMessage, and Sessions returns what was written.\n return messages as unknown as UIMessage[];\n}\n\nfunction asUIMessage(message: SessionMessage): UIMessage {\n // SAFETY: as for asUIMessages, one message at a time.\n return message as unknown as UIMessage;\n}\n\nfunction asSessionMessage(message: UIMessage): SessionMessage {\n // SAFETY: SessionMessage is the structural subset of UIMessage that\n // Sessions reads; a UIMessage is accepted as is.\n return message as unknown as SessionMessage;\n}\n\n/**\n * Think's agent loop hosted in a Durable Object, behind the same small\n * harness interface as `PiHarness`: `harness.prompt()`, `harness.sessions`,\n * `harness.session(id)`. It implements the shared `AgentHarness`\n * interface, so a Channels host can serve its sessions.\n *\n * Transcripts live in a Sessions capability and in-flight model output in\n * a Streams capability, both owned by the harness, and the harness's queue\n * of operations in its own table. The harness runs every server tool call itself, so after an\n * eviction it knows exactly which call was cut short and applies that\n * tool's recovery policy.\n *\n * Durability is the Lifecycle's job queue, used directly: one wake job per\n * session. A submission is written, then the session's wake is scheduled.\n * While a session has work, the wake job reschedules itself as a heartbeat,\n * so an eviction leaves it due and its alarm restarts the object. Each step\n * of a turn reads only durable state, so the restarted object continues\n * where the last write left off.\n *\n * @experimental The API may change between releases.\n */\nexport class ThinkHarness<TOOLS extends ToolSet = ToolSet>\n extends LifecycleCapability\n implements AgentHarness\n{\n /** Every session in this object. */\n readonly sessions: ThinkSessions;\n readonly #options: ThinkHarnessOptions<TOOLS>;\n readonly #events = new SessionEvents();\n readonly #drives = new Map<ThinkSessionId, Promise<void>>();\n readonly #live = new Map<ThinkSessionId, LiveRun>();\n readonly #waiters = new Map<string, Set<() => void>>();\n readonly #configured = new Set<ThinkSessionId>();\n /**\n * In-flight model output. Only the harness reads it, so the harness owns\n * it rather than asking the host to install a Streams capability. It\n * shares the `cf_agents_streams` tables with any Streams the host has.\n */\n readonly #streams = new Streams({ maxChunkBytes: STREAM_MAX_CHUNK_BYTES });\n /**\n * The transcripts. The harness writes every message, and its operations\n * point at them, so it owns the Sessions capability too; a second one\n * writing the same tables would leave this one's caches stale. A\n * session's branches, search and compaction are on `ThinkSession`.\n */\n readonly #sessions: Sessions;\n #bound = false;\n /**\n * Messages the harness is writing, per session, by id, so the change feed\n * skips their events (the harness emits its own) without also skipping a\n * direct write that lands meanwhile.\n */\n readonly #ownMessages = new Map<ThinkSessionId, Map<string, number>>();\n /** Clears of the harness's own in progress, per session. */\n readonly #ownClears = new Map<ThinkSessionId, number>();\n #heartbeatMs = HEARTBEAT_MS;\n #records: OperationRecords | undefined;\n\n static {\n setWakeTiming = (harness, timing) => harness.#setWakeTiming(timing);\n }\n\n /**\n * @param options - The model, tools and hooks.\n */\n constructor(options: ThinkHarnessOptions<TOOLS>) {\n super(\"think-harness\");\n this.#options = options;\n this.#sessions = new Sessions({\n ...(options.reservedMetadataKeys && {\n reservedMetadataKeys: options.reservedMetadataKeys\n })\n });\n this.sessions = new ThinkSessions(this);\n }\n\n #setWakeTiming(timing: WakeTiming): void {\n const heartbeat = timing.heartbeatMs;\n if (heartbeat !== undefined) {\n if (!Number.isFinite(heartbeat) || heartbeat <= 0) {\n throw new Error(\"ThinkHarness heartbeatMs must be a positive number\");\n }\n this.#heartbeatMs = heartbeat;\n }\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────────────\n\n /** Create the harness's tables and wake every session with open work. */\n override async onStart(): Promise<void> {\n this.#bindOwned();\n await this.#sessions.onStart();\n await this.#streams.onStart();\n const store = this.#tables();\n store.ensureSession(ROOT_SESSION);\n const sessions = new Set(store.open().map((op) => op.session));\n for (const session of sessions) {\n // A wake already set for later is a recovery backoff or the alarm\n // memory-limit breaker's delay; replacing it with one due now would\n // skip that wait.\n const wake = this.lifecycle.jobs.get(wakeJobId(session));\n if (wake && wake.time > Date.now()) continue;\n await this.#wake(session);\n }\n }\n\n /**\n * The alarm memory-limit breaker sealed: the work it stopped would only\n * run out of memory again. Mark the running operations to be settled\n * `unanswered` with reason `\"out_of_memory\"` rather than run again.\n * Queued operations behind them still run. Runs after the isolate's\n * work unwound, so it keeps to small synchronous writes.\n */\n onMemoryLimit(context: MemoryLimitContext): void {\n if (!context.sealed) return;\n // Only mark them: rebuilding a partial answer here could run out of\n // memory again. The next drive settles each marked operation through\n // the usual path, which keeps the partial and tells clients.\n const store = this.#tables();\n for (const op of store.open()) {\n if (op.status !== \"running\") continue;\n store.update(op.session, op.operationId, {\n abandonReason: \"out_of_memory\"\n });\n }\n }\n\n /** Run a session's wake job. */\n async onJob(\n context: LifecycleJobContext\n ): Promise<LifecycleJobOutcome | void> {\n if (context.job.fn !== WAKE_FN) return;\n const session = sessionOfJob(context.job.payload);\n if (session !== undefined) return this.#wakeStep(session);\n }\n\n // ── The harness interface ────────────────────────────────────────────────\n\n /**\n * A handle on one session. No I/O until you call it.\n *\n * @param id - The session. Default: the root session.\n */\n session(id: ThinkSessionId = ROOT_SESSION): ThinkSession {\n return new ThinkSession(this, id);\n }\n\n /** Submit to the root session and wait for the answer. */\n prompt(\n input: ThinkInput,\n options: ThinkSubmitOptions = {}\n ): Promise<ThinkPromptResponse> {\n return this.session().prompt(input, options);\n }\n\n /** Durably submit to the root session. Resolves before the model runs. */\n submit(\n input: ThinkInput,\n options: ThinkSubmitOptions = {}\n ): Promise<ThinkReceipt> {\n return this.session().submit(input, options);\n }\n\n /** Operations not settled yet, oldest first, in one session or all. */\n async pending(session?: ThinkSessionId): Promise<ThinkPendingOperation[]> {\n await this.lifecycle.ready();\n return this.#tables()\n .open(session)\n .map((op) => ({\n operationId: op.operationId,\n session: op.session,\n status: op.status === \"queued\" ? \"queued\" : \"running\"\n }));\n }\n\n // ── Used by ThinkSession and ThinkSessions ───────────────────────────────\n\n /** @internal */\n async enqueue(\n session: ThinkSessionId,\n input: OperationInput,\n options: ThinkSubmitOptions\n ): Promise<ThinkReceipt> {\n // The shared harness interface lets a caller ask to steer. Refuse it\n // rather than queue it as a follow-up, which is not what was asked.\n const whenBusy: unknown = options.whenBusy;\n if (whenBusy === \"steer\") throw new SteerNotSupportedError(session);\n await this.lifecycle.ready();\n const operationId = options.operationId ?? crypto.randomUUID();\n const store = this.#tables();\n let accepted = false;\n this.lifecycle.storage.transactionSync(() => {\n store.ensureSession(session);\n if (options.clientTools !== undefined) {\n store.setClientTools(session, options.clientTools);\n }\n accepted = store.insert(\n session,\n operationId,\n input,\n options.source ?? \"server\"\n );\n });\n if (accepted) {\n this.#events.emit(session, {\n type: \"operation\",\n status: { operationId, status: \"queued\" }\n });\n }\n // The wake first, so a job is due before anything runs; then run now\n // rather than waiting for the alarm.\n await this.#wake(session);\n this.#ensureDrive(session);\n return { operationId, session, accepted };\n }\n\n /** @internal Stop one operation, or everything open in a session. */\n async abort(session: ThinkSessionId, operationId?: string): Promise<boolean> {\n await this.lifecycle.ready();\n const store = this.#tables();\n const targets =\n operationId === undefined\n ? store.open(session)\n : [store.get(session, operationId)].filter(\n (op): op is OperationRecord =>\n op !== undefined &&\n (op.status === \"queued\" || op.status === \"running\")\n );\n for (const op of targets) {\n const live = this.#live.get(session);\n if (live?.operationId === op.operationId) {\n live.abort.abort();\n } else if (op.status === \"queued\") {\n store.update(session, op.operationId, {\n status: \"unanswered\",\n reason: \"withdrawn\"\n });\n await this.#settled(session, op.operationId);\n } else {\n // Running, but not in this isolate: an eviction left it for the wake.\n await this.#abandon(op, \"aborted\");\n }\n }\n return targets.length > 0;\n }\n\n /** @internal Wait for an operation to settle. */\n async wait(\n session: ThinkSessionId,\n operationId: string,\n signal?: AbortSignal\n ): Promise<ThinkOperationResult> {\n await this.lifecycle.ready();\n for (;;) {\n const op = this.#tables().get(session, operationId);\n if (!op) {\n return {\n operationId,\n session,\n status: \"unanswered\",\n reason: \"not_found\"\n };\n }\n if (op.status === \"done\" || op.status === \"unanswered\") {\n return this.#result(op);\n }\n await new Promise<void>((resolveWait, reject) => {\n if (signal?.aborted) {\n reject(signal.reason);\n return;\n }\n const key = waiterKey(session, operationId);\n const waiters = this.#waiters.get(key) ?? new Set();\n this.#waiters.set(key, waiters);\n const done = () => {\n signal?.removeEventListener(\"abort\", aborted);\n resolveWait();\n };\n const aborted = () => {\n waiters.delete(done);\n reject(signal?.reason);\n };\n waiters.add(done);\n signal?.addEventListener(\"abort\", aborted, { once: true });\n });\n }\n }\n\n /** @internal */\n async inspect(\n session: ThinkSessionId,\n operationId: string\n ): Promise<ThinkOperationStatus | undefined> {\n await this.lifecycle.ready();\n const op = this.#tables().get(session, operationId);\n if (!op) return undefined;\n switch (op.status) {\n case \"queued\":\n case \"running\":\n return { operationId, session, status: op.status };\n case \"done\":\n case \"unanswered\":\n return this.#result(op);\n }\n }\n\n /** @internal The active transcript of a session. */\n async messages(session: ThinkSessionId): Promise<UIMessage[]> {\n return asUIMessages(await this.#handle(session).getHistory());\n }\n\n /** @internal Abort everything in a session and clear its transcript. */\n async reset(session: ThinkSessionId, handoff?: string): Promise<void> {\n await this.abort(session);\n await this.#drives.get(session);\n const handle = this.#handle(session);\n this.#ownClears.set(session, (this.#ownClears.get(session) ?? 0) + 1);\n try {\n await handle.clearMessages();\n } finally {\n const left = (this.#ownClears.get(session) ?? 1) - 1;\n if (left === 0) this.#ownClears.delete(session);\n else this.#ownClears.set(session, left);\n }\n this.#tables().deleteSettled(session);\n this.#events.emit(session, { type: \"reset\" });\n if (handoff) {\n const note: UIMessage = {\n id: crypto.randomUUID(),\n role: \"system\",\n parts: [{ type: \"text\", text: handoff }]\n };\n const release = this.#markOwn(session, [note.id]);\n try {\n await handle.appendMessage(asSessionMessage(note));\n } finally {\n release();\n }\n this.#events.emit(session, { type: \"message\", message: note });\n }\n }\n\n /** @internal */\n subscribe(session: ThinkSessionId, listener: ThinkSessionListener) {\n return this.#events.subscribe(session, listener);\n }\n\n /** @internal The shared harness interface's watch. */\n async watch(session: ThinkSessionId): Promise<SessionWatch> {\n await this.lifecycle.ready();\n let watcher: Watcher | undefined;\n const early: SessionEvent[][] = [];\n // Listen before reading, so nothing that happens during the read is\n // lost; a message read and then re-sent only replaces itself.\n const unsubscribe = this.#events.subscribe(session, (event) => {\n const events = toSessionEvents(event);\n if (watcher) watcher.push(events);\n else early.push(events);\n });\n const live = this.#live.get(session);\n const partial = live ? [...live.partial] : this.#recoverableChunks(session);\n const messages = await this.messages(session);\n const open = this.#tables().open(session);\n const running = open.find((op) => op.status === \"running\");\n const state: SessionState = {\n messages: messages.map((message) => toTranscriptMessage(message)),\n pending: open.map((op) => ({\n operationId: op.operationId,\n status: op.status === \"queued\" ? \"queued\" : \"placed\"\n })),\n ...(running && {\n run: {\n operations: [running.operationId],\n ...(partial.length > 0 && {\n partial: partial.flatMap((chunk) => {\n const converted = toResponseChunk(chunk, {});\n return converted ? [converted] : [];\n })\n })\n }\n })\n };\n watcher = new Watcher(state, unsubscribe);\n for (const events of early) watcher.push(events);\n return watcher;\n }\n\n /** @internal The running operation and its model call's chunks so far. */\n async inFlight(session: ThinkSessionId): Promise<ThinkInFlight | undefined> {\n await this.lifecycle.ready();\n const running = this.#tables()\n .open(session)\n .find((op) => op.status === \"running\");\n if (!running) return undefined;\n const live = this.#live.get(session);\n if (live?.operationId === running.operationId) {\n return {\n operationId: running.operationId,\n continuation: live.continues,\n chunks: [...live.partial]\n };\n }\n // Left by an eviction: the stream holds what was durable.\n return {\n operationId: running.operationId,\n continuation: (await this.#message(running)) !== undefined,\n chunks: running.streamId ? this.#streamChunks(running.streamId) : []\n };\n }\n\n /**\n * Listen to every session's events, for a host that serves several\n * sessions over one set of connections. Returns the unsubscribe.\n */\n observe(listener: ThinkHarnessListener): () => void {\n return this.#events.observe(listener);\n }\n\n /** @internal */\n async createSession(parent?: ThinkSessionId): Promise<ThinkSession> {\n await this.lifecycle.ready();\n const id = crypto.randomUUID();\n this.#tables().ensureSession(id, parent);\n return this.session(id);\n }\n\n /** @internal Copy a session's active path into a new session. */\n async fork(from: ThinkSessionId): Promise<ThinkSession> {\n const source = this.#handle(from);\n const rows = await source.getHistoryRowStats();\n const fork = await this.createSession(from);\n const target = this.#handle(fork.id);\n let parentId: string | null = null;\n for (const row of rows) {\n const message = await source.getMessage(row.id);\n if (!message) continue;\n await target.appendMessage(message, { parentId });\n parentId = message.id;\n }\n return fork;\n }\n\n /** @internal */\n async listSessions(): Promise<ThinkSessionInfo[]> {\n await this.lifecycle.ready();\n const store = this.#tables();\n const busy = new Set(store.open().map((op) => op.session));\n return store.sessions().map((record) => ({\n id: record.id,\n ...(record.parent !== undefined && { parent: record.parent }),\n busy: busy.has(record.id)\n }));\n }\n\n // ── The wake ─────────────────────────────────────────────────────────────\n\n /** Schedule the session's wake job, now or at `time`. */\n #wake(session: ThinkSessionId, time = Date.now()): Promise<unknown> {\n // A push made while the job is dispatching supersedes that dispatch's\n // outcome, so a submit is never lost to a wake that is completing.\n return this.lifecycle.jobs.push({\n id: wakeJobId(session),\n fn: WAKE_FN,\n time,\n payload: { session },\n singleflight: true,\n recoveryLoop: true\n });\n }\n\n /**\n * One run of a session's wake job. With work open, it makes sure a drive\n * is running and keeps a heartbeat; with none, it completes.\n */\n #wakeStep(session: ThinkSessionId): LifecycleJobOutcome {\n const heartbeat = { rescheduleAt: Date.now() + this.#heartbeatMs };\n if (this.#drives.has(session)) return heartbeat;\n if (this.#tables().open(session).length === 0) return undefined;\n const drive = this.#ensureDrive(session);\n // The drive runs past this dispatch, inside the alarm's work, so a\n // memory-limit reset during it counts against the job's breaker.\n this.lifecycle.trackAlarmWork(drive);\n return heartbeat;\n }\n\n /** Run the session's open operations in order, unless already running. */\n #ensureDrive(session: ThinkSessionId): Promise<void> {\n const running = this.#drives.get(session);\n if (running) return running;\n let wakeAt: number | undefined;\n const drive = (async () => {\n try {\n await this.lifecycle.runInHostContext(async () => {\n for (;;) {\n const op = this.#tables().open(session)[0];\n if (!op) return;\n const outcome = await this.#run(op);\n if (outcome.retryAt !== undefined) {\n wakeAt = outcome.retryAt;\n return;\n }\n }\n });\n } catch (error) {\n // The harness's own storage failed. The heartbeat tries again.\n console.error(\"ThinkHarness drive failed\", error);\n wakeAt = Date.now() + this.#heartbeatMs;\n } finally {\n this.#drives.delete(session);\n }\n // Re-check now (or at the backoff), so the job completes as soon as\n // the session has nothing left.\n await this.#wake(session, wakeAt);\n })();\n this.#drives.set(session, drive);\n return drive;\n }\n\n // ── Running one operation ────────────────────────────────────────────────\n\n async #run(first: OperationRecord): Promise<RunOutcome> {\n const { session, operationId } = first;\n const live: LiveRun = {\n operationId,\n abort: new AbortController(),\n partial: [],\n continues: false\n };\n this.#live.set(session, live);\n try {\n let op: OperationRecord | undefined = first;\n if (op.status === \"queued\") {\n op = await this.#place(op);\n if (!op) return {};\n }\n const continuation = (await this.#message(op)) !== undefined;\n this.#events.emit(session, {\n type: \"run-start\",\n operationId,\n continuation\n });\n try {\n return await this.#steps(session, operationId, live);\n } finally {\n this.#events.emit(session, { type: \"run-end\", operationId });\n }\n } catch (error) {\n console.error(`ThinkHarness operation ${operationId} failed`, error);\n const op = this.#tables().get(session, operationId);\n if (op && (op.status === \"running\" || op.status === \"queued\")) {\n await this.#abandon(op, errorText(error));\n }\n return {};\n } finally {\n this.#live.delete(session);\n }\n }\n\n async #steps(\n session: ThinkSessionId,\n operationId: string,\n live: LiveRun\n ): Promise<RunOutcome> {\n const maxSteps = this.#options.maxSteps ?? DEFAULT_MAX_STEPS;\n for (;;) {\n const op = this.#tables().get(session, operationId);\n if (!op || op.status !== \"running\") return {};\n if (live.abort.signal.aborted) {\n await this.#abandon(op, \"aborted\");\n return {};\n }\n if (op.abandonReason !== undefined) {\n await this.#abandon(op, op.abandonReason);\n return {};\n }\n const message = await this.#message(op);\n const tools = await this.#tools(session);\n const action = nextAction(\n op,\n message,\n (name) => isServerTool(tools, name),\n maxSteps\n );\n switch (action._tag) {\n case \"recover-model\": {\n const outcome = await this.#recoverModel(op, message);\n if (outcome) return outcome;\n break;\n }\n case \"call-model\": {\n const outcome = await this.#callModel(op, message, tools, live);\n if (outcome) return outcome;\n break;\n }\n case \"run-tools\":\n if (!message) return {};\n await this.#runTools(op, message, action.calls, tools, live);\n break;\n case \"await-input\":\n case \"end\":\n await this.#commit(session, undefined, () => {\n this.#tables().update(session, operationId, {\n status: \"done\",\n text: textOf(message)\n });\n });\n await this.#settled(session, operationId, message);\n return {};\n }\n }\n }\n\n /**\n * Place a queued operation: write what it brings to the transcript and\n * mark it running, in one transaction. Returns the running operation, or\n * undefined when placing settled it.\n */\n async #place(op: OperationRecord): Promise<OperationRecord | undefined> {\n const { session, operationId } = op;\n const store = this.#tables();\n const handle = this.#handle(session);\n const input = op.input;\n const placed: UIMessage[] = [];\n let settledText: string | undefined;\n let unanswered: string | undefined;\n\n const running = (change: {\n readonly parentId?: string;\n readonly messageId: string;\n }) =>\n store.update(session, operationId, {\n status: \"running\",\n parentId: change.parentId ?? null,\n messageId: change.messageId,\n pendingModel: true\n });\n\n switch (input.kind) {\n case \"messages\": {\n let messages = input.messages;\n if (op.source === \"client\") {\n // Untrusted input may only add user messages. It may not rewrite\n // a stored message, even one off the active path, by reusing its\n // id: those are dropped.\n if (messages.some((message) => message.role !== \"user\")) {\n unanswered = \"client_role\";\n break;\n }\n const fresh: UIMessage[] = [];\n for (const message of messages) {\n if (!(await handle.getMessage(message.id))) fresh.push(message);\n }\n messages = fresh;\n }\n const last = messages.at(-1);\n if (!last) {\n unanswered = \"empty\";\n break;\n }\n await this.#commit(session, undefined, (put) => {\n let parentId: string | undefined;\n for (const message of messages) {\n put(message, { parentId, source: op.source });\n parentId = message.id;\n placed.push(message);\n }\n running({ parentId: last.id, messageId: crypto.randomUUID() });\n });\n break;\n }\n case \"answer\": {\n const history = asUIMessages(await handle.getHistory());\n const tools = await this.#tools(session);\n const answer = input.answer;\n if (answer.type === \"tool-result\" && op.source === \"client\") {\n // A client answers only its own tools. A server tool's result\n // comes from running it, under its approval policy.\n const call = history\n .flatMap((message) => message.parts)\n .find(\n (part): part is ToolCallPart =>\n isToolCallPart(part) && part.toolCallId === answer.toolCallId\n );\n if (call && isServerTool(tools, toolNameOf(call))) {\n unanswered = \"not_client_tool\";\n break;\n }\n }\n const answered = answerToolCall(history, toolCallAnswer(answer));\n if (!answered) {\n unanswered = \"not_waiting\";\n break;\n }\n const latest = history.at(-1);\n const continues =\n input.autoContinue &&\n latest?.id === answered.id &&\n nextAction(\n { streamId: undefined, pendingModel: true, steps: 0 },\n answered,\n (name) => isServerTool(tools, name),\n Number.POSITIVE_INFINITY\n )._tag !== \"await-input\";\n await this.#commit(session, undefined, (put) => {\n put(answered);\n placed.push(answered);\n if (continues) running({ messageId: answered.id });\n else {\n store.update(session, operationId, {\n status: \"done\",\n text: textOf(answered)\n });\n }\n });\n if (!continues) settledText = textOf(answered);\n break;\n }\n case \"regenerate\": {\n const history = asUIMessages(await handle.getHistory());\n const target =\n input.messageId ??\n [...history].reverse().find((message) => message.role === \"user\")?.id;\n if (!target || !(await handle.getMessage(target))) {\n unanswered = \"not_found\";\n break;\n }\n await this.#commit(session, undefined, () =>\n running({ parentId: target, messageId: crypto.randomUUID() })\n );\n break;\n }\n case \"continue\": {\n const latest = await handle.getLatestLeaf();\n if (!latest) {\n unanswered = \"not_found\";\n break;\n }\n await this.#commit(session, undefined, () =>\n latest.role === \"assistant\"\n ? running({ messageId: latest.id })\n : running({ parentId: latest.id, messageId: crypto.randomUUID() })\n );\n break;\n }\n }\n\n for (const message of placed) {\n this.#events.emit(session, { type: \"message\", message, operationId });\n }\n if (unanswered !== undefined) {\n store.update(session, operationId, {\n status: \"unanswered\",\n reason: unanswered\n });\n await this.#settled(session, operationId);\n return undefined;\n }\n if (settledText !== undefined) {\n await this.#settled(session, operationId);\n return undefined;\n }\n this.#events.emit(session, {\n type: \"operation\",\n status: { operationId, status: \"placed\" }\n });\n return store.get(session, operationId);\n }\n\n // ── Model calls ──────────────────────────────────────────────────────────\n\n /**\n * One model call. Its chunks go to a stream as they arrive; when it ends,\n * the message is persisted and the stream discarded in one transaction.\n * Returns an outcome only when the operation must wait.\n */\n async #callModel(\n op: OperationRecord,\n existing: UIMessage | undefined,\n tools: ToolSet,\n live: LiveRun\n ): Promise<RunOutcome | undefined> {\n const { session, operationId } = op;\n const messageId = op.messageId ?? crypto.randomUUID();\n const hooks = this.#options.hooks;\n const handle = this.#handle(session);\n const history = asUIMessages(\n await handle.getHistory({ leafId: existing ? existing.id : op.parentId })\n );\n const system = await resolve(this.#options.system, session);\n const config =\n (await hooks?.beforeTurn?.({\n session,\n operationId,\n step: op.steps,\n continuation: existing !== undefined,\n messages: history,\n system,\n tools: Object.keys(tools)\n })) ?? {};\n const model = config.model ?? (await resolve(this.#options.model, session));\n if (model === undefined) throw new Error(\"ThinkHarness has no model\");\n const offered = modelTools(tools, config.activeTools);\n const effectiveSystem = config.system ?? system;\n const messages: ModelMessage[] =\n config.messages ??\n (await convertToModelMessages(history, {\n tools,\n ignoreIncompleteToolCalls: true\n }));\n\n // The stream id is durable before the stream exists, so an eviction at\n // any point leaves evidence the next wake recovers from.\n const streamId = `think:${crypto.randomUUID()}`;\n this.#tables().update(session, operationId, { streamId, messageId });\n const writer = await this.#streams.open(streamId, {\n tag: streamTag(session, operationId),\n metadata: { session, operationId, messageId }\n });\n\n const stall = new AbortController();\n const signal = AbortSignal.any([live.abort.signal, stall.signal]);\n let modelError: unknown;\n let final: UIMessage | undefined;\n let finishReason: string | undefined;\n let caught: unknown;\n live.partial = [];\n live.continues = existing !== undefined;\n let segment: UIMessageChunk[] = [];\n let segmentBytes = 0;\n // Chunks are written in segments, for fewer storage writes, but never\n // held longer than FLUSH_AFTER_MS: what a client has seen should be\n // what recovery finds after an eviction.\n let flushTimer: ReturnType<typeof setTimeout> | undefined;\n const flush = () => {\n if (flushTimer !== undefined) clearTimeout(flushTimer);\n flushTimer = undefined;\n if (segment.length === 0) return;\n // SAFETY: UI message chunks are JSON by the AI SDK's contract.\n writer.append(segment as unknown as StreamJson);\n segment = [];\n segmentBytes = 0;\n };\n\n try {\n const result = streamText({\n model,\n ...(effectiveSystem !== undefined && { system: effectiveSystem }),\n messages,\n tools: offered,\n ...(config.toolChoice !== undefined && {\n toolChoice: config.toolChoice\n }),\n ...(config.providerOptions !== undefined && {\n providerOptions: config.providerOptions\n }),\n ...(config.maxOutputTokens !== undefined && {\n maxOutputTokens: config.maxOutputTokens\n }),\n ...(config.temperature !== undefined && {\n temperature: config.temperature\n }),\n stopWhen: stepCountIs(1),\n abortSignal: signal,\n onError: ({ error }) => {\n modelError ??= error;\n }\n });\n const stream = toUIMessageStream({\n stream: result.stream,\n tools: offered,\n // Only a continuation passes the transcript: the AI SDK continues\n // the last message when it is the assistant's, which a new answer\n // must not do (the last message may be a compaction summary).\n originalMessages: existing ? history : [],\n generateMessageId: () => messageId,\n onEnd: ({ responseMessage }) => {\n final = responseMessage;\n }\n });\n const stallTimeoutMs =\n this.#options.recovery?.stallTimeoutMs ?? DEFAULT_STALL_TIMEOUT_MS;\n for await (const chunk of untilAborted(\n iterateWithStallWatchdog(stream, stallTimeoutMs, () =>\n stall.abort(new ChatStreamStalledError(\"Model stream stalled\"))\n ),\n live.abort.signal\n )) {\n if (chunk.type === \"finish\") finishReason = chunk.finishReason;\n live.partial.push(chunk);\n segment.push(chunk);\n segmentBytes += JSON.stringify(chunk).length;\n if (\n segment.length >= SEGMENT_CHUNKS ||\n segmentBytes >= SEGMENT_MAX_BYTES\n ) {\n flush();\n } else {\n flushTimer ??= setTimeout(flush, FLUSH_AFTER_MS);\n }\n this.#events.emit(session, { type: \"chunk\", operationId, chunk });\n if (hooks?.onChunk) {\n try {\n hooks.onChunk({ session, operationId, chunk });\n } catch (error) {\n console.error(\"ThinkHarness onChunk hook failed\", error);\n }\n }\n }\n } catch (error) {\n caught = error;\n }\n flush();\n\n const message = final ?? accumulate(messageId, existing, live.partial);\n const partial = message ? settledPartial(message) : undefined;\n const keep = partial && hasContent(partial) ? partial : undefined;\n const stalled =\n caught instanceof ChatStreamStalledError || stall.signal.aborted;\n const failure = stalled ? undefined : (modelError ?? caught);\n\n if (live.abort.signal.aborted) {\n await this.#commit(session, streamId, (put) => {\n if (keep) put(keep, { parentId: op.parentId });\n this.#tables().update(session, operationId, {\n status: \"unanswered\",\n reason: \"aborted\",\n streamId: null\n });\n });\n await this.#settled(session, operationId, keep);\n return {};\n }\n\n if (stalled || failure !== undefined) {\n if (failure !== undefined) {\n try {\n await hooks?.onError?.(failure, { session, operationId });\n } catch (error) {\n console.error(\"ThinkHarness onError hook failed\", error);\n }\n }\n const kind = stalled\n ? \"retry\"\n : (hooks?.classifyError?.(failure) ?? \"fail\");\n if (\n kind === \"context-overflow\" &&\n op.overflowRetries < MAX_OVERFLOW_RETRIES\n ) {\n await this.#commit(session, streamId, (put) => {\n if (keep) put(keep, { parentId: op.parentId });\n this.#tables().update(session, operationId, {\n streamId: null,\n overflowRetries: op.overflowRetries + 1\n });\n });\n try {\n await handle.compact();\n } catch (error) {\n console.warn(\"ThinkHarness could not compact the session\", error);\n }\n return undefined;\n }\n if (kind === \"retry\") {\n return this.#interrupted(op, streamId, keep);\n }\n await this.#commit(session, streamId, (put) => {\n if (keep) put(keep, { parentId: op.parentId });\n this.#tables().update(session, operationId, {\n status: \"unanswered\",\n reason: errorText(failure),\n streamId: null\n });\n });\n await this.#settled(session, operationId, keep);\n return {};\n }\n\n if (!message) throw new Error(\"The model call produced no message\");\n const toolCalls = lastStep(message).some(\n (part) => isToolCallPart(part) && !part.providerExecuted\n );\n await this.#commit(session, streamId, (put) => {\n put(message, { parentId: op.parentId });\n this.#tables().update(session, operationId, {\n streamId: null,\n steps: op.steps + 1,\n interruptions: 0,\n pendingModel: toolCalls\n });\n });\n live.partial = [];\n live.continues = true;\n this.#events.emit(session, { type: \"message\", message, operationId });\n await hooks?.onStepFinish?.({\n session,\n operationId,\n step: op.steps,\n message,\n finishReason\n });\n return undefined;\n }\n\n /**\n * A model call an eviction cut short: keep what it produced, then call\n * the model again to continue the same message, within the budget.\n */\n async #recoverModel(\n op: OperationRecord,\n existing: UIMessage | undefined\n ): Promise<RunOutcome | undefined> {\n const streamId = op.streamId;\n if (streamId === undefined) return undefined;\n const chunks = this.#streamChunks(streamId);\n const rebuilt =\n chunks.length > 0\n ? accumulate(op.messageId ?? crypto.randomUUID(), existing, chunks)\n : undefined;\n const partial = rebuilt ? settledPartial(rebuilt) : undefined;\n const keep = partial && hasContent(partial) ? partial : undefined;\n return this.#interrupted(op, streamId, keep);\n }\n\n /** Count an interruption, keep the partial, and decide whether to go on. */\n async #interrupted(\n op: OperationRecord,\n streamId: string,\n partial: UIMessage | undefined\n ): Promise<RunOutcome | undefined> {\n const { session, operationId } = op;\n const recovery = this.#options.recovery;\n const attempt = op.interruptions + 1;\n const maxAttempts = recovery?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;\n let decision: \"continue\" | \"abandon\" =\n attempt > maxAttempts ? \"abandon\" : \"continue\";\n if (decision === \"continue\" && this.#options.hooks?.onRecovery) {\n decision = await this.#options.hooks.onRecovery({\n session,\n operationId,\n attempt,\n partial\n });\n }\n await this.#commit(session, streamId, (put) => {\n if (partial) put(partial, { parentId: op.parentId });\n this.#tables().update(session, operationId, {\n streamId: null,\n interruptions: attempt,\n ...(decision === \"abandon\" && {\n status: \"unanswered\",\n reason: \"interrupted\"\n })\n });\n });\n if (partial) {\n this.#events.emit(session, {\n type: \"message\",\n message: partial,\n operationId\n });\n }\n if (decision === \"abandon\") {\n await this.#settled(session, operationId, partial);\n return {};\n }\n const delay = backoff(attempt, recovery?.backoffMs ?? DEFAULT_BACKOFF_MS);\n return delay > 0 ? { retryAt: Date.now() + delay } : undefined;\n }\n\n // ── Tool calls ───────────────────────────────────────────────────────────\n\n async #runTools(\n op: OperationRecord,\n message: UIMessage,\n calls: readonly ToolCallPart[],\n tools: ToolSet,\n live: LiveRun\n ): Promise<void> {\n const { session, operationId } = op;\n const store = this.#tables();\n const hooks = this.#options.hooks;\n const history = asUIMessages(\n await this.#handle(session).getHistory({ leafId: message.id })\n );\n const modelMessages = await convertToModelMessages(history.slice(0, -1), {\n tools,\n ignoreIncompleteToolCalls: true\n });\n // The drive owns this message while it runs tools; every completion\n // updates this copy and persists it whole.\n let current = message;\n\n const toRun: ToolCallPart[] = [];\n const approvals: string[] = [];\n for (const call of calls) {\n const toolName = toolNameOf(call);\n const tool = tools[toolName];\n if (!tool) continue;\n if (call.state === \"input-available\") {\n const needsApproval =\n (await this.#options.toolApproval?.({\n session,\n toolName,\n toolCallId: call.toolCallId,\n input: call.input\n })) ||\n (await toolNeedsApproval(tool, call.input, {\n toolCallId: call.toolCallId,\n messages: modelMessages\n }));\n if (needsApproval) {\n approvals.push(call.toolCallId);\n continue;\n }\n }\n toRun.push(call);\n }\n if (approvals.length > 0) {\n for (const toolCallId of approvals) {\n current = withToolPart(\n current,\n toolCallId,\n (part) =>\n // SAFETY: the new state is set with exactly the fields it requires.\n ({\n ...part,\n state: \"approval-requested\",\n approval: { id: `approval:${toolCallId}` }\n }) as ToolCallPart\n );\n }\n const snapshot = current;\n await this.#commit(session, undefined, (put) => put(snapshot));\n this.#events.emit(session, {\n type: \"message\",\n message: snapshot,\n operationId\n });\n }\n\n await Promise.all(\n toRun.map(async (call) => {\n const toolName = toolNameOf(call);\n const tool = tools[toolName];\n if (!tool) return;\n const { toolCallId } = call;\n const started = store.toolCall(session, toolCallId);\n let outcome: ToolOutcome | undefined;\n if (started) {\n // Started before, with no result in the transcript: an eviction\n // cut it short.\n const policy = toolRecovery(tool);\n const maxAttempts =\n this.#options.recovery?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;\n if (policy === \"report\" || started.attempts >= maxAttempts) {\n outcome = { ok: false, errorText: INTERRUPTED_TOOL_ERROR };\n }\n }\n let attempt = started?.attempts ?? 0;\n let input: unknown = call.input;\n if (!outcome) {\n attempt = store.startToolCall(session, toolCallId, operationId);\n const decision = await hooks?.beforeToolCall?.({\n session,\n operationId,\n toolCallId,\n toolName,\n input,\n attempt\n });\n if (decision?.action === \"block\") {\n outcome = { ok: false, errorText: decision.reason };\n } else if (decision?.action === \"substitute\") {\n outcome = { ok: true, output: decision.output };\n } else {\n if (decision?.action === \"run\" && decision.input !== undefined) {\n input = decision.input;\n }\n outcome = await executeTool(tool, input, {\n toolCallId,\n messages: modelMessages,\n abortSignal: live.abort.signal,\n onPreliminary: (output) =>\n this.#events.emit(session, {\n type: \"chunk\",\n operationId,\n chunk: {\n type: \"tool-output-available\",\n toolCallId,\n output,\n preliminary: true\n }\n })\n });\n }\n }\n const settled = outcome;\n await hooks?.afterToolCall?.({\n session,\n operationId,\n toolCallId,\n toolName,\n input,\n attempt,\n ...settled\n });\n current = withToolPart(current, toolCallId, (part) =>\n withOutcome(part, settled)\n );\n const snapshot = current;\n await this.#commit(session, undefined, (put) => {\n put(snapshot);\n store.finishToolCall(session, toolCallId);\n store.update(session, operationId, { interruptions: 0 });\n });\n this.#events.emit(session, {\n type: \"chunk\",\n operationId,\n chunk: settled.ok\n ? {\n type: \"tool-output-available\",\n toolCallId,\n output: settled.output\n }\n : {\n type: \"tool-output-error\",\n toolCallId,\n errorText: settled.errorText\n }\n });\n this.#events.emit(session, {\n type: \"message\",\n message: snapshot,\n operationId\n });\n })\n );\n }\n\n // ── Settling ─────────────────────────────────────────────────────────────\n\n /**\n * End an operation that cannot run on: keep what its interrupted model\n * call produced, mark any tool call it left open as failed, and settle\n * it `unanswered`.\n */\n async #abandon(op: OperationRecord, reason: string): Promise<void> {\n const { session, operationId } = op;\n const existing = await this.#message(op);\n let message = existing;\n const chunks =\n op.streamId === undefined ? [] : this.#streamChunks(op.streamId);\n if (chunks.length > 0) {\n const rebuilt = accumulate(\n op.messageId ?? crypto.randomUUID(),\n existing,\n chunks\n );\n if (rebuilt) message = settledPartial(rebuilt);\n }\n if (message) {\n for (const part of lastStep(message)) {\n if (\n isToolCallPart(part) &&\n !part.providerExecuted &&\n (part.state === \"input-available\" ||\n part.state === \"approval-responded\")\n ) {\n message = withToolPart(message, part.toolCallId, (call) =>\n withOutcome(call, { ok: false, errorText: reason })\n );\n }\n }\n }\n const keep =\n message && hasContent(message) && message !== existing\n ? message\n : undefined;\n await this.#commit(session, op.streamId, (put) => {\n if (keep) put(keep, { parentId: op.parentId });\n this.#tables().update(session, operationId, {\n status: \"unanswered\",\n reason,\n streamId: null\n });\n });\n if (keep) {\n this.#events.emit(session, {\n type: \"message\",\n message: keep,\n operationId\n });\n }\n await this.#settled(session, operationId, keep ?? existing);\n }\n\n /** Tell everyone an operation settled. Its row is already written. */\n async #settled(\n session: ThinkSessionId,\n operationId: string,\n message?: UIMessage\n ): Promise<void> {\n const op = this.#tables().get(session, operationId);\n if (!op) return;\n const result = this.#result(op);\n this.#events.emit(session, {\n type: \"operation\",\n status:\n result.status === \"done\"\n ? {\n operationId,\n status: \"done\",\n ...(result.text !== undefined && { text: result.text })\n }\n : {\n operationId,\n status: \"unanswered\",\n ...(result.reason !== undefined && { reason: result.reason })\n }\n });\n const key = waiterKey(session, operationId);\n for (const waiter of this.#waiters.get(key) ?? []) waiter();\n this.#waiters.delete(key);\n try {\n await this.#options.hooks?.onTurnEnd?.({\n ...result,\n ...(message && { message })\n });\n } catch (error) {\n console.error(\"ThinkHarness onTurnEnd hook failed\", error);\n }\n }\n\n #result(op: OperationRecord): ThinkOperationResult {\n const { operationId, session } = op;\n return op.status === \"done\"\n ? {\n operationId,\n session,\n status: \"done\",\n text: op.text ?? \"\",\n ...(op.messageId !== undefined && { messageId: op.messageId })\n }\n : {\n operationId,\n session,\n status: \"unanswered\",\n ...(op.reason !== undefined && { reason: op.reason })\n };\n }\n\n // ── Storage ──────────────────────────────────────────────────────────────\n\n #tables(): OperationRecords {\n this.#records ??= new OperationRecords(this.lifecycle.storage.sql);\n this.#records.ensureTables();\n return this.#records;\n }\n\n /** The Sessions handle for a session, configured on first use. */\n /**\n * Give the Sessions and Streams the harness owns this capability's\n * Lifecycle services. Done on first use, not only in `onStart`, because an\n * RPC can read a transcript before startup (the read itself then waits\n * for startup).\n */\n #bindOwned(): void {\n if (this.#bound) return;\n bindLifecycleCapability(this.#sessions, this.lifecycle);\n bindLifecycleCapability(this.#streams, this.lifecycle);\n this.#bound = true;\n // Writes made on a session's Sessions handle (from `configureSession`)\n // go around the harness; pass them on as events, so listeners and chat\n // clients see them too. The harness's own writes already emitted theirs.\n this.#sessions.subscribe((change) => {\n const session = change.sessionId;\n switch (change.type) {\n case \"append\":\n case \"update\":\n case \"import\":\n if (this.#takeOwn(session, change.message.id)) return;\n this.#events.emit(session, {\n type: \"message\",\n message: asUIMessage(change.message)\n });\n return;\n case \"clear\":\n if ((this.#ownClears.get(session) ?? 0) > 0) return;\n this.#events.emit(session, { type: \"reset\" });\n return;\n case \"delete\":\n case \"compact\":\n case \"compaction\":\n // No one message describes these: the active path changed.\n this.#events.emit(session, { type: \"transcript\" });\n return;\n }\n });\n }\n\n /** Note messages the harness is about to write; returns the release. */\n #markOwn(session: ThinkSessionId, ids: readonly string[]): () => void {\n let own = this.#ownMessages.get(session);\n if (!own) {\n own = new Map();\n this.#ownMessages.set(session, own);\n }\n for (const id of ids) own.set(id, (own.get(id) ?? 0) + 1);\n return () => {\n const current = this.#ownMessages.get(session);\n if (!current) return;\n for (const id of ids) {\n const left = (current.get(id) ?? 1) - 1;\n if (left <= 0) current.delete(id);\n else current.set(id, left);\n }\n if (current.size === 0) this.#ownMessages.delete(session);\n };\n }\n\n /** Whether a change is one of the harness's own writes; consumes the mark. */\n #takeOwn(session: ThinkSessionId, id: string): boolean {\n const own = this.#ownMessages.get(session);\n const count = own?.get(id);\n if (!own || count === undefined) return false;\n if (count <= 1) own.delete(id);\n else own.set(id, count - 1);\n if (own.size === 0) this.#ownMessages.delete(session);\n return true;\n }\n\n /** @internal The answers to a message: its children in the tree. */\n async branches(\n session: ThinkSessionId,\n messageId: string\n ): Promise<UIMessage[]> {\n return asUIMessages(await this.#handle(session).getBranches(messageId));\n }\n\n /** @internal Full-text search over a session's messages. */\n search(\n session: ThinkSessionId,\n query: string,\n options?: { readonly limit?: number }\n ): Promise<SearchResult[]> {\n return this.#handle(session).search(\n query,\n options?.limit === undefined ? undefined : { limit: options.limit }\n );\n }\n\n /** @internal Compact a session with its compaction function. */\n async compact(session: ThinkSessionId): Promise<CompactResult | null> {\n // The change feed reports the compaction as a transcript event.\n return this.#handle(session).compact();\n }\n\n #handle(session: ThinkSessionId): Session {\n this.#bindOwned();\n const handle = this.#sessions.session(session);\n if (!this.#configured.has(session)) {\n this.#configured.add(session);\n this.#options.configureSession?.(handle, session);\n }\n return handle;\n }\n\n async #message(op: OperationRecord): Promise<UIMessage | undefined> {\n if (op.messageId === undefined) return undefined;\n const message = await this.#handle(op.session).getMessage(op.messageId);\n return message ? asUIMessages([message])[0] : undefined;\n }\n\n async #tools(session: ThinkSessionId): Promise<ToolSet> {\n const tools = (await resolve(this.#options.tools, session)) ?? {};\n const client = createToolsFromClientSchemas(\n this.#tables().clientTools(session)\n );\n // A client cannot replace a server tool: the server's definition, its\n // execute and its approval policy win on a name clash.\n for (const name of Object.keys(client)) {\n if (Object.hasOwn(tools, name)) {\n console.warn(\n `ThinkHarness ignored a client tool named \"${name}\": a server tool has that name`\n );\n }\n }\n return { ...client, ...tools };\n }\n\n /**\n * Persist messages and operation changes in one transaction; with a\n * stream id, the transaction also settles and discards that stream (the\n * cutover), so an eviction leaves either the stream or the message.\n */\n async #commit(\n session: ThinkSessionId,\n streamId: string | undefined,\n writes: (put: Put) => void\n ): Promise<void> {\n const sync = this.#handle(session).__DO_NOT_USE_WILL_BREAK__sync();\n const afters: (() => Promise<void>)[] = [];\n const ids: string[] = [];\n const commit = () => {\n afters.length = 0;\n ids.length = 0;\n writes((message, options = {}) => {\n ids.push(message.id);\n afters.push(\n sync.upsert(asSessionMessage(message), {\n ...(options.parentId !== undefined && {\n parentId: options.parentId\n }),\n source: options.source ?? \"server\"\n }).after\n );\n });\n };\n try {\n const settled =\n streamId !== undefined &&\n this.#streams\n .__DO_NOT_USE_WILL_BREAK__sync()\n .settle(streamId, \"completed\", null, { commit, discard: true });\n if (!settled) this.lifecycle.storage.transactionSync(commit);\n } catch (error) {\n // The transaction rolled back, but the session's caches counted it.\n sync.abandon();\n throw error;\n }\n const release = this.#markOwn(session, ids);\n try {\n for (const after of afters) await after();\n } finally {\n release();\n }\n }\n\n /** Every chunk a stream holds, without waiting for more. */\n #streamChunks(streamId: string): UIMessageChunk[] {\n const streams = this.#streams.__DO_NOT_USE_WILL_BREAK__sync();\n if (!streams.getStream(streamId)) return [];\n const chunks: UIMessageChunk[] = [];\n let from = 0;\n for (;;) {\n const rows = streams.readChunks(streamId, from, READ_PAGE);\n for (const row of rows) {\n // SAFETY: the harness writes each segment as UIMessageChunk[].\n const segment = JSON.parse(row.chunk) as UIMessageChunk[];\n chunks.push(...segment);\n }\n if (rows.length < READ_PAGE) return chunks;\n from = (rows.at(-1)?.seq ?? from) + 1;\n }\n }\n\n /** Chunks an evicted model call left in its stream, for a late watcher. */\n #recoverableChunks(session: ThinkSessionId): UIMessageChunk[] {\n const running = this.#tables()\n .open(session)\n .find((op) => op.status === \"running\");\n return running?.streamId ? this.#streamChunks(running.streamId) : [];\n }\n}\n\n/**\n * Rebuild a message from the chunks of a model call, applied on top of the\n * message as it was before the call.\n */\nfunction accumulate(\n messageId: string,\n existing: UIMessage | undefined,\n chunks: readonly UIMessageChunk[]\n): UIMessage | undefined {\n if (chunks.length === 0) return existing;\n const accumulator = new StreamAccumulator({\n messageId: existing?.id ?? messageId,\n continuation: existing !== undefined,\n ...(existing && {\n existingParts: existing.parts,\n ...(isRecord(existing.metadata) && {\n existingMetadata: existing.metadata\n })\n })\n });\n for (const chunk of chunks) {\n // SAFETY: StreamChunkData is the loose JSON view of a UI message chunk.\n accumulator.applyChunk(chunk as unknown as StreamChunkData);\n }\n const message = accumulator.toMessage();\n return { ...message, role: \"assistant\" };\n}\n\n/**\n * Stop iterating as soon as `signal` aborts, even if the source never\n * notices: a model stream that ignores its abort signal must not hold an\n * aborted turn open.\n */\nasync function* untilAborted<T>(\n source: AsyncIterable<T>,\n signal: AbortSignal\n): AsyncGenerator<T> {\n const iterator = source[Symbol.asyncIterator]();\n let onAbort: () => void = () => {};\n const aborted = new Promise<\"aborted\">((resolveAbort) => {\n onAbort = () => resolveAbort(\"aborted\");\n if (signal.aborted) onAbort();\n else signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n try {\n for (;;) {\n const next = await Promise.race([iterator.next(), aborted]);\n if (next === \"aborted\") {\n // Release the source without waiting on it.\n void iterator.return?.().catch(() => {});\n return;\n }\n if (next.done) return;\n yield next.value;\n }\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n}\n\n/**\n * Classify the context-window overflow errors of common providers\n * (Anthropic, OpenAI, Google, Bedrock, Mistral and others) as\n * `\"context-overflow\"`, and everything else as `\"fail\"`. Pass it as\n * `hooks.classifyError`, or call it from your own classifier.\n *\n * @param error - The model call's error.\n * @returns `\"context-overflow\"` or `\"fail\"`.\n * @experimental\n */\nexport function classifyContextOverflow(error: unknown): ThinkErrorClass {\n let text: string;\n if (error instanceof Error) text = error.message;\n else if (typeof error === \"string\") text = error;\n else {\n try {\n text = JSON.stringify(error);\n } catch {\n text = String(error);\n }\n }\n return CONTEXT_OVERFLOW_PATTERN.test(text) ? \"context-overflow\" : \"fail\";\n}\n\nconst CONTEXT_OVERFLOW_PATTERN =\n /prompt is too long|context[_ ]length[_ ]exceeded|maximum context length|exceeds the maximum number of tokens|input token count|reduce the length of|input is too long|too many (?:input )?tokens|context window/i;\n\n/** A tool's own recovery field, or the default. */\nfunction toolRecovery(tool: object): ToolRecovery {\n return \"recovery\" in tool && tool.recovery === \"rerun\" ? \"rerun\" : \"report\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction backoff(attempt: number, baseMs: number): number {\n if (attempt <= 1) return 0;\n return Math.min(baseMs * 2 ** (attempt - 2), MAX_BACKOFF_MS);\n}\n\nfunction streamTag(session: ThinkSessionId, operationId: string): string {\n return `think:${JSON.stringify([session, operationId])}`;\n}\n\nfunction waiterKey(session: ThinkSessionId, operationId: string): string {\n return JSON.stringify([session, operationId]);\n}\n\n/** Project a session event onto the shared harness interface's events. */\nfunction toSessionEvents(event: ThinkSessionEvent): SessionEvent[] {\n switch (event.type) {\n case \"operation\":\n return [{ type: \"operation\", status: event.status }];\n case \"run-start\":\n return [{ type: \"run-start\", operations: [event.operationId] }];\n case \"run-end\":\n return [{ type: \"run-end\", operations: [event.operationId] }];\n case \"chunk\": {\n const chunk = toResponseChunk(event.chunk, {});\n return chunk ? [{ type: \"chunk\", chunk }] : [];\n }\n case \"message\":\n return [{ type: \"message\", message: toTranscriptMessage(event.message) }];\n case \"reset\":\n return [{ type: \"reset\" }];\n case \"transcript\":\n // The shared interface has no \"re-read\" event; a watch sees the\n // change in its next state.\n return [];\n }\n}\n\n/**\n * One session, addressed through the harness.\n *\n * @experimental\n */\nexport class ThinkSession implements HarnessSession {\n readonly #harness: ThinkHarness;\n /** The session's id. */\n readonly id: ThinkSessionId;\n\n /**\n * @param harness - The harness that owns the session.\n * @param id - The session's id.\n */\n constructor(harness: ThinkHarness, id: ThinkSessionId) {\n this.#harness = harness;\n this.id = id;\n }\n\n /** Durably submit input. Resolves before the model runs. */\n submit(\n input: ThinkInput,\n options: ThinkSubmitOptions = {}\n ): Promise<ThinkReceipt> {\n const operationId = options.operationId ?? crypto.randomUUID();\n return this.#harness.enqueue(\n this.id,\n operationInput(input, operationId, options.autoContinue ?? true),\n { ...options, operationId }\n );\n }\n\n /** Submit and wait for the answer and the updated transcript. */\n async prompt(\n input: ThinkInput,\n options: ThinkSubmitOptions = {}\n ): Promise<ThinkPromptResponse> {\n const receipt = await this.submit(input, options);\n const result = await this.wait(receipt.operationId);\n return { ...result, messages: await this.messages() };\n }\n\n /**\n * Answer a user message again. The new answer is a branch beside the\n * earlier ones, which `Session.getBranches()` still reads.\n *\n * @param messageId - The user message. Default: the latest one.\n */\n regenerate(\n messageId?: string,\n options: Pick<ThinkSubmitOptions, \"operationId\"> = {}\n ): Promise<ThinkReceipt> {\n return this.#harness.enqueue(\n this.id,\n { kind: \"regenerate\", ...(messageId !== undefined && { messageId }) },\n options\n );\n }\n\n /** Call the model again to continue the latest message. */\n continue(\n options: Pick<ThinkSubmitOptions, \"operationId\"> = {}\n ): Promise<ThinkReceipt> {\n return this.#harness.enqueue(this.id, { kind: \"continue\" }, options);\n }\n\n /** Wait for an operation to settle. Aborting `signal` stops only the wait. */\n wait(\n operationId: string,\n signal?: AbortSignal\n ): Promise<ThinkOperationResult> {\n return this.#harness.wait(this.id, operationId, signal);\n }\n\n /**\n * Withdraw one queued operation or abort it while it runs; with no id,\n * everything open in the session.\n */\n abort(operationId?: string): Promise<boolean> {\n return this.#harness.abort(this.id, operationId);\n }\n\n /** Abort everything and clear the transcript, optionally leaving a note. */\n reset(handoff?: string): Promise<void> {\n return this.#harness.reset(this.id, handoff);\n }\n\n /** The active transcript. */\n messages(): Promise<UIMessage[]> {\n return this.#harness.messages(this.id);\n }\n\n /** Operations not settled yet, oldest first. */\n pending(): Promise<ThinkPendingOperation[]> {\n return this.#harness.pending(this.id);\n }\n\n /**\n * The running operation, with the chunks its model call has streamed so\n * far, including those an eviction left behind. Send them, then\n * `subscribe()`'s chunk events, to a client that joins mid-turn.\n */\n inFlight(): Promise<ThinkInFlight | undefined> {\n return this.#harness.inFlight(this.id);\n }\n\n /**\n * The answers to a message: its children in the transcript tree. A\n * regenerated answer is a branch beside the earlier ones.\n *\n * @param messageId - The message, usually a user message.\n */\n branches(messageId: string): Promise<UIMessage[]> {\n return this.#harness.branches(this.id, messageId);\n }\n\n /** Full-text search over this session's messages. */\n search(\n query: string,\n options?: { readonly limit?: number }\n ): Promise<SearchResult[]> {\n return this.#harness.search(this.id, query, options);\n }\n\n /**\n * Summarize older messages with the compaction function set in\n * `configureSession`. Resolves to null when there was nothing to compact.\n */\n compact(): Promise<CompactResult | null> {\n return this.#harness.compact(this.id);\n }\n\n /** Listen to the session's events in the AI SDK's vocabulary. */\n subscribe(listener: ThinkSessionListener): () => void {\n return this.#harness.subscribe(this.id, listener);\n }\n\n /** The shared harness interface's watch: the state, then every change. */\n watch(): Promise<SessionWatch> {\n return this.#harness.watch(this.id);\n }\n\n /**\n * Submit input and stream its answer to `callback`, as Think's `chat()`\n * does: `onStart`, then `onEvent` with each UI chunk as JSON, then\n * `onDone` or `onError`. Works over RPC with an `RpcTarget` callback.\n *\n * The callback lives in memory. If the object is evicted mid-turn the\n * turn still finishes, but the callback is gone; a caller that must not\n * lose the answer should `wait()` on the receipt as well.\n */\n async chat(\n input: ThinkInput,\n callback: ThinkStreamCallback,\n options: ThinkSubmitOptions = {}\n ): Promise<ThinkOperationResult> {\n const operationId = options.operationId ?? crypto.randomUUID();\n let delivered = Promise.resolve();\n const deliver = (fn: () => void | Promise<void>) => {\n delivered = delivered.then(fn).catch((error: unknown) => {\n console.error(\"ThinkHarness chat callback failed\", error);\n });\n };\n const unsubscribe = this.subscribe((event) => {\n if (event.type === \"chunk\" && event.operationId === operationId) {\n deliver(() => callback.onEvent(JSON.stringify(event.chunk)));\n }\n });\n try {\n const receipt = await this.submit(input, { ...options, operationId });\n deliver(() => callback.onStart?.({ operationId: receipt.operationId }));\n const result = await this.wait(receipt.operationId);\n unsubscribe();\n await delivered;\n if (result.status === \"done\") await callback.onDone();\n else await callback.onError(result.reason ?? \"unanswered\");\n return result;\n } finally {\n unsubscribe();\n }\n }\n\n /** One operation's status, or undefined when the id is unknown. */\n inspect(operationId: string): Promise<ThinkOperationStatus | undefined> {\n return this.#harness.inspect(this.id, operationId);\n }\n\n /** Whether the session has open work. */\n async busy(): Promise<boolean> {\n return (await this.pending()).length > 0;\n }\n}\n\n/**\n * Every session in this object.\n *\n * @experimental\n */\nexport class ThinkSessions implements HarnessSessions {\n readonly #harness: ThinkHarness;\n\n /** @param harness - The harness that owns the sessions. */\n constructor(harness: ThinkHarness) {\n this.#harness = harness;\n }\n\n /** A handle on one session. */\n get(id: ThinkSessionId): ThinkSession {\n return this.#harness.session(id);\n }\n\n /** A new, empty session. */\n create(): Promise<ThinkSession> {\n return this.#harness.createSession();\n }\n\n /** A new session that starts with `from`'s active transcript. */\n fork(from: ThinkSessionId): Promise<ThinkSession> {\n return this.#harness.fork(from);\n }\n\n /** Every session, with whether it has open work. */\n list(): Promise<ThinkSessionInfo[]> {\n return this.#harness.listSessions();\n }\n}\n","/**\n * Think's chat wire protocol (`cf_agent_chat_*`) over a ThinkHarness\n * session, so `useAgentChat` from `agents/chat/react` (or\n * `@cloudflare/think/react`) talks to a ThinkHarness host unchanged.\n */\nimport type { JSONSchema7, UIMessage, UIMessageChunk } from \"ai\";\nimport type { Json } from \"../../experimental/channels/protocol\";\nimport { LifecycleCapability } from \"../../lifecycle/capability\";\nimport type { CapabilityRequestContext } from \"../../lifecycle/capability-runner\";\nimport type { Connection } from \"../../lifecycle/types\";\nimport {\n parseProtocolMessage,\n type ChatProtocolEvent\n} from \"../../chat/parse-protocol\";\nimport {\n CHAT_MESSAGE_TYPES,\n STREAM_RESUME_NONE_REASONS\n} from \"../../chat/protocol\";\nimport type { ClientToolSchema } from \"../../chat/client-tools\";\nimport type {\n WebSocketHandlers,\n WebSocketMessage\n} from \"../../websockets/options\";\nimport type { ThinkSessionEvent } from \"./events\";\nimport { ROOT_SESSION, type ThinkHarness } from \"./harness\";\nimport type { ThinkSessionId } from \"./types\";\n\n/** `WebSocket.OPEN`; the constant is not defined on every runtime's global. */\nconst OPEN = 1;\n\n/**\n * The connections the chat protocol talks to: the WebSockets capability\n * fits as is.\n *\n * @experimental\n */\nexport type ThinkChatConnections = {\n getConnections(): Iterable<Connection>;\n use(handlers: WebSocketHandlers): void;\n};\n\n/** `ThinkChat`'s options. @experimental */\nexport type ThinkChatOptions = {\n readonly harness: ThinkHarness;\n /** The WebSockets capability the clients connect through. */\n readonly webSockets: ThinkChatConnections;\n /** The session the chat serves. Default: the root session. */\n readonly session?: ThinkSessionId;\n};\n\n/** Per-operation framing state, in memory. */\ntype Framing = {\n /** Whether the operation's chunks continue a message the client has. */\n readonly continuation: boolean;\n /** The connection that asked for it, if one did. */\n readonly requester: string | undefined;\n /** The last model call's finish chunk, sent just before the terminal frame. */\n finish: UIMessageChunk | undefined;\n /**\n * Whether the operation's `start` went out. An operation that calls the\n * model several times extends one assistant message, so clients get one\n * message stream: one `start`, the chunks of every call, one `finish`.\n */\n started: boolean;\n};\n\nfunction send(connection: Connection, frame: object): void {\n if (connection.readyState !== OPEN) return;\n try {\n connection.send(JSON.stringify(frame));\n } catch {\n // The socket closed between the state check and the send.\n }\n}\n\n/** The chat request body `useAgentChat` sends. */\ntype ChatRequestBody = {\n readonly messages?: readonly UIMessage[];\n readonly trigger?: string;\n readonly messageId?: string;\n readonly clientTools?: readonly ClientToolSchema[];\n};\n\nfunction parseBody(body: unknown): ChatRequestBody {\n if (typeof body !== \"string\" || body === \"\") return {};\n try {\n const parsed: unknown = JSON.parse(body);\n // SAFETY: the client sends the AI SDK's chat request body; every field\n // is optional and checked before use.\n return typeof parsed === \"object\" && parsed !== null\n ? (parsed as ChatRequestBody)\n : {};\n } catch {\n return {};\n }\n}\n\nfunction clientToolsOf(\n value: readonly { name: string; description?: string; parameters?: unknown }[]\n): ClientToolSchema[] {\n return value.map((tool) => ({\n name: tool.name,\n ...(tool.description !== undefined && { description: tool.description }),\n // SAFETY: the client sends its tools' JSON Schemas.\n ...(tool.parameters !== undefined && {\n parameters: tool.parameters as JSONSchema7\n })\n }));\n}\n\n/**\n * Serves one ThinkHarness session over Think's chat WebSocket protocol and\n * its `GET …/get-messages` route. Install it on the Lifecycle after the\n * harness and the WebSockets capability:\n *\n * ```ts\n * readonly webSockets = new WebSockets();\n * readonly chat = new ThinkChat({ harness: this.harness, webSockets: this.webSockets });\n * readonly lifecycle = Lifecycle.install(this)\n * .use(this.harness)\n * .use(this.webSockets).use(this.chat);\n * ```\n *\n * Supported: chat requests (`submit-message` and `regenerate-message`),\n * cancel, clear, client tool results, approvals, and stream resume after\n * a reconnect or an eviction. Not supported: `messageConcurrency`\n * strategies other than queueing, client transcript sync, and the\n * recovery progress frame.\n *\n * @experimental The API may change between releases.\n */\nexport class ThinkChat extends LifecycleCapability {\n readonly #harness: ThinkHarness;\n readonly #webSockets: ThinkChatConnections;\n readonly #session: ThinkSessionId;\n readonly #framing = new Map<string, Framing>();\n /** Connections told of a stream, left out of live frames until they ACK. */\n readonly #awaitingAck = new Set<string>();\n /** Per connection, the continuation flag its replay set for an operation. */\n readonly #replayed = new Map<\n string,\n { operationId: string; continuation: boolean }\n >();\n /** Connections that asked for an operation, by operation id. */\n readonly #requesters = new Map<string, string>();\n /** Connections told STREAM_PENDING, with their probe ids. */\n readonly #pendingProbes = new Map<string, string | undefined>();\n readonly #unobserve: () => void;\n\n /** @param options - The harness, its WebSockets, and the session to serve. */\n constructor(options: ThinkChatOptions) {\n super(\"think-chat\");\n this.#harness = options.harness;\n this.#webSockets = options.webSockets;\n this.#session = options.session ?? ROOT_SESSION;\n this.#webSockets.use({\n onConnect: (connection) => this.#onConnect(connection),\n onMessage: (connection, message) => this.#onMessage(connection, message),\n onClose: (connection) => this.#forget(connection),\n onError: (connection) => this.#forget(connection)\n });\n this.#unobserve = this.#harness.observe((session, event) => {\n if (session === this.#session) this.#onEvent(event);\n });\n }\n\n /** Answer `GET …/get-messages` with the session's transcript. */\n async onRequest(\n context: CapabilityRequestContext\n ): Promise<Response | undefined> {\n const { request } = context;\n if (request.method !== \"GET\") return undefined;\n if (!new URL(request.url).pathname.endsWith(\"/get-messages\")) {\n return undefined;\n }\n return Response.json(await this.#harness.session(this.#session).messages());\n }\n\n /** Stop listening to the harness. */\n dispose(): void {\n this.#unobserve();\n }\n\n // ── Connections ──────────────────────────────────────────────────────────\n\n async #onConnect(connection: Connection): Promise<void> {\n const session = this.#harness.session(this.#session);\n send(connection, {\n type: CHAT_MESSAGE_TYPES.CHAT_MESSAGES,\n messages: await session.messages(),\n connect: true\n });\n const inFlight = await session.inFlight();\n if (inFlight) this.#offerResume(connection, inFlight.operationId);\n }\n\n #forget(connection: Connection): void {\n this.#awaitingAck.delete(connection.id);\n this.#pendingProbes.delete(connection.id);\n this.#replayed.delete(connection.id);\n }\n\n #offerResume(\n connection: Connection,\n operationId: string,\n probeId?: string\n ): void {\n this.#awaitingAck.add(connection.id);\n send(connection, {\n type: CHAT_MESSAGE_TYPES.STREAM_RESUMING,\n id: operationId,\n ...(probeId !== undefined && { probeId })\n });\n }\n\n async #onMessage(\n connection: Connection,\n raw: WebSocketMessage\n ): Promise<boolean> {\n if (typeof raw !== \"string\") return false;\n const event = parseProtocolMessage(raw);\n if (!event) return false;\n await this.#handle(connection, event);\n return true;\n }\n\n async #handle(connection: Connection, event: ChatProtocolEvent) {\n const session = this.#harness.session(this.#session);\n switch (event.type) {\n case \"chat-request\": {\n const body = parseBody(event.init.body);\n const clientTools = body.clientTools\n ? { clientTools: body.clientTools }\n : {};\n this.#requesters.set(event.id, connection.id);\n if (body.trigger === \"regenerate-message\") {\n await session.regenerate(undefined, { operationId: event.id });\n return;\n }\n const known = new Set(\n (await session.messages()).map((message) => message.id)\n );\n const fresh = (body.messages ?? []).filter(\n (message) => !known.has(message.id)\n );\n const receipt = await session.submit(fresh, {\n operationId: event.id,\n source: \"client\",\n ...clientTools\n });\n if (!receipt.accepted) {\n // A resend: if the operation already ended, end this request too.\n const status = await session.inspect(event.id);\n if (status?.status === \"done\" || status?.status === \"unanswered\") {\n this.#requesters.delete(event.id);\n await this.#finish(\n {\n operationId: status.operationId,\n status: status.status,\n ...(\"reason\" in status &&\n status.reason !== undefined && { reason: status.reason })\n },\n undefined,\n connection\n );\n }\n }\n return;\n }\n case \"cancel\":\n await session.abort(event.id);\n return;\n case \"clear\":\n await session.reset();\n for (const other of this.#webSockets.getConnections()) {\n if (other.id !== connection.id) {\n send(other, { type: CHAT_MESSAGE_TYPES.CHAT_CLEAR });\n }\n }\n return;\n case \"tool-result\": {\n const operationId = crypto.randomUUID();\n this.#requesters.set(operationId, connection.id);\n await session.submit(\n {\n type: \"tool-result\",\n toolCallId: event.toolCallId,\n result:\n event.state === \"output-error\"\n ? {\n ok: false,\n ...(event.errorText !== undefined && {\n errorText: event.errorText\n })\n }\n : {\n ok: true,\n // SAFETY: the client sends tool outputs as JSON.\n output: (event.output ?? null) as Json\n }\n },\n {\n operationId,\n source: \"client\",\n autoContinue: event.autoContinue ?? true,\n ...(event.clientTools && {\n clientTools: clientToolsOf(event.clientTools)\n })\n }\n );\n return;\n }\n case \"tool-approval\": {\n const approvalId = await this.#approvalId(event.toolCallId);\n if (approvalId === undefined) return;\n const operationId = crypto.randomUUID();\n this.#requesters.set(operationId, connection.id);\n await session.submit(\n { type: \"approval\", approvalId, approved: event.approved },\n {\n operationId,\n source: \"client\",\n autoContinue: event.autoContinue ?? true\n }\n );\n return;\n }\n case \"stream-resume-request\": {\n const inFlight = await session.inFlight();\n if (inFlight) {\n this.#offerResume(connection, inFlight.operationId, event.probeId);\n } else if ((await session.pending()).length > 0) {\n // Answered later: with an offer when the work starts streaming,\n // or \"none\" if it ends without streaming.\n this.#pendingProbes.set(connection.id, event.probeId);\n send(connection, {\n type: CHAT_MESSAGE_TYPES.STREAM_PENDING,\n ...(event.probeId !== undefined && { probeId: event.probeId })\n });\n } else {\n send(connection, {\n type: CHAT_MESSAGE_TYPES.STREAM_RESUME_NONE,\n reason: STREAM_RESUME_NONE_REASONS.IDLE,\n ...(event.probeId !== undefined && { probeId: event.probeId })\n });\n }\n return;\n }\n case \"stream-resume-ack\":\n await this.#replay(connection, event.id);\n return;\n case \"messages\":\n // The transcript is the server's; a client's copy is not applied.\n return;\n }\n }\n\n /** Replay a running model call's chunks to one connection, then go live. */\n async #replay(connection: Connection, operationId: string): Promise<void> {\n const inFlight = await this.#harness.session(this.#session).inFlight();\n if (!inFlight || inFlight.operationId !== operationId) {\n this.#awaitingAck.delete(connection.id);\n send(connection, {\n type: CHAT_MESSAGE_TYPES.USE_CHAT_RESPONSE,\n id: operationId,\n body: \"\",\n done: true,\n replay: true\n });\n return;\n }\n const { continuation, chunks } = inFlight;\n // Synchronous from here: the replay and the switch to live frames\n // happen with no chunk in between.\n let seq = 0;\n for (const chunk of chunks) {\n send(connection, {\n type: CHAT_MESSAGE_TYPES.USE_CHAT_RESPONSE,\n id: operationId,\n body: JSON.stringify(chunk),\n done: false,\n replay: true,\n seq: seq++,\n ...(continuation && { continuation: true })\n });\n }\n send(connection, {\n type: CHAT_MESSAGE_TYPES.USE_CHAT_RESPONSE,\n id: operationId,\n body: \"\",\n done: false,\n replay: true,\n replayComplete: true,\n ...(continuation && { continuation: true })\n });\n this.#replayed.set(connection.id, { operationId, continuation });\n this.#awaitingAck.delete(connection.id);\n }\n\n async #approvalId(toolCallId: string): Promise<string | undefined> {\n const messages = await this.#harness.session(this.#session).messages();\n for (const message of [...messages].reverse()) {\n for (const part of message.parts) {\n if (\n \"toolCallId\" in part &&\n part.toolCallId === toolCallId &&\n \"approval\" in part &&\n part.approval\n ) {\n return part.approval.id;\n }\n }\n }\n return undefined;\n }\n\n // ── Harness events ───────────────────────────────────────────────────────\n\n #onEvent(event: ThinkSessionEvent): void {\n switch (event.type) {\n case \"run-start\": {\n const requester = this.#requesters.get(event.operationId);\n this.#framing.set(event.operationId, {\n continuation: event.continuation,\n requester,\n finish: undefined,\n started: false\n });\n // Probes told to keep waiting learn which stream to resume.\n for (const connection of this.#webSockets.getConnections()) {\n if (!this.#pendingProbes.has(connection.id)) continue;\n const probeId = this.#pendingProbes.get(connection.id);\n this.#pendingProbes.delete(connection.id);\n this.#offerResume(connection, event.operationId, probeId);\n }\n // Someone who answered a tool call learns of the continuation from\n // an offer, as Think does; a chat request's sender already owns it.\n if (event.continuation && requester !== undefined) {\n for (const connection of this.#webSockets.getConnections()) {\n if (connection.id === requester) {\n this.#offerResume(connection, event.operationId);\n }\n }\n }\n return;\n }\n case \"chunk\": {\n const framing = this.#framing.get(event.operationId);\n if (event.chunk.type === \"finish\") {\n if (framing) framing.finish = event.chunk;\n return;\n }\n if (event.chunk.type === \"start\" && framing) {\n if (framing.started) return;\n framing.started = true;\n }\n this.#broadcastChunk(event.operationId, event.chunk, framing);\n return;\n }\n case \"message\": {\n // Messages written while placing an operation (the user's, or a\n // tool answer applied); a running turn's arrive as chunks.\n const running =\n event.operationId !== undefined &&\n this.#framing.has(event.operationId);\n if (running) return;\n const requester =\n event.operationId === undefined\n ? undefined\n : this.#requesters.get(event.operationId);\n void this.#broadcastTranscript(requester);\n return;\n }\n case \"operation\": {\n const { status } = event;\n if (status.status !== \"done\" && status.status !== \"unanswered\") {\n return;\n }\n const framing = this.#framing.get(status.operationId);\n this.#framing.delete(status.operationId);\n this.#requesters.delete(status.operationId);\n void this.#finish(status, framing).then(() => this.#resolveProbes());\n return;\n }\n case \"transcript\":\n void this.#broadcastTranscript();\n return;\n case \"reset\":\n for (const connection of this.#webSockets.getConnections()) {\n send(connection, { type: CHAT_MESSAGE_TYPES.CHAT_CLEAR });\n }\n return;\n case \"run-end\":\n return;\n }\n }\n\n #broadcastChunk(\n operationId: string,\n chunk: UIMessageChunk,\n framing: Framing | undefined\n ): void {\n const body = JSON.stringify(chunk);\n for (const connection of this.#webSockets.getConnections()) {\n if (this.#awaitingAck.has(connection.id)) continue;\n const replayed = this.#replayed.get(connection.id);\n const continuation =\n replayed?.operationId === operationId\n ? replayed.continuation\n : (framing?.continuation ?? false);\n send(connection, {\n type: CHAT_MESSAGE_TYPES.USE_CHAT_RESPONSE,\n id: operationId,\n body,\n done: false,\n ...(continuation && { continuation: true })\n });\n }\n }\n\n async #broadcastTranscript(except?: string): Promise<void> {\n const messages = await this.#harness.session(this.#session).messages();\n for (const connection of this.#webSockets.getConnections()) {\n if (connection.id === except) continue;\n send(connection, { type: CHAT_MESSAGE_TYPES.CHAT_MESSAGES, messages });\n }\n }\n\n /** Tell probes still waiting that nothing will stream, once the session is idle. */\n async #resolveProbes(): Promise<void> {\n if (this.#pendingProbes.size === 0) return;\n const session = this.#harness.session(this.#session);\n if ((await session.pending()).length > 0) return;\n for (const connection of this.#webSockets.getConnections()) {\n if (!this.#pendingProbes.has(connection.id)) continue;\n const probeId = this.#pendingProbes.get(connection.id);\n this.#pendingProbes.delete(connection.id);\n send(connection, {\n type: CHAT_MESSAGE_TYPES.STREAM_RESUME_NONE,\n reason: STREAM_RESUME_NONE_REASONS.IDLE,\n ...(probeId !== undefined && { probeId })\n });\n }\n }\n\n /** The transcript first, then the terminal frame (#2119). */\n async #finish(\n status: {\n readonly operationId: string;\n readonly status: \"done\" | \"unanswered\";\n readonly reason?: string;\n },\n framing: Framing | undefined,\n only?: Connection\n ): Promise<void> {\n const { operationId } = status;\n if (framing?.finish) {\n this.#broadcastChunk(operationId, framing.finish, framing);\n }\n const messages = await this.#harness.session(this.#session).messages();\n const reason = status.status === \"unanswered\" ? status.reason : undefined;\n const outcome =\n status.status === \"done\"\n ? \"completed\"\n : reason === \"aborted\"\n ? \"aborted\"\n : reason === \"withdrawn\" ||\n reason === \"not_waiting\" ||\n reason === \"not_found\" ||\n reason === \"empty\"\n ? \"skipped\"\n : \"error\";\n const connections = only ? [only] : this.#webSockets.getConnections();\n for (const connection of connections) {\n send(connection, { type: CHAT_MESSAGE_TYPES.CHAT_MESSAGES, messages });\n send(connection, {\n type: CHAT_MESSAGE_TYPES.USE_CHAT_RESPONSE,\n id: operationId,\n body: outcome === \"error\" ? (reason ?? \"\") : \"\",\n done: true,\n outcome,\n ...(outcome === \"error\" && { error: true }),\n ...(framing?.continuation && { continuation: true })\n });\n this.#awaitingAck.delete(connection.id);\n if (this.#replayed.get(connection.id)?.operationId === operationId) {\n this.#replayed.delete(connection.id);\n }\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["OPEN","isRecord","compute","harnessInput"],"sources":["../../../src/harness/think/events.ts","../../../src/harness/think/records.ts","../../../src/harness/think/tools.ts","../../../src/harness/think/turn.ts","../../../src/harness/think/harness.ts","../../../src/harness/think/chat.ts"],"sourcesContent":["/**\n * Live events for one session, in the AI SDK's vocabulary, and the\n * projection of them onto the shared harness interface's watch.\n */\nimport type { UIMessage, UIMessageChunk } from \"ai\";\nimport type {\n OperationStatus,\n SessionEvent,\n SessionState,\n SessionWatch\n} from \"../../experimental/channels/harness\";\n\n/**\n * Something that happened in a session, as the AI SDK describes it.\n *\n * @experimental\n */\nexport type ThinkSessionEvent =\n | { readonly type: \"operation\"; readonly status: OperationStatus }\n | {\n readonly type: \"run-start\";\n readonly operationId: string;\n /** Whether the operation continues an assistant message already persisted. */\n readonly continuation: boolean;\n }\n | { readonly type: \"run-end\"; readonly operationId: string }\n /**\n * A streamed chunk of the operation's assistant message. Chunks of one\n * model call continue the message as persisted before that call.\n */\n | {\n readonly type: \"chunk\";\n readonly operationId: string;\n readonly chunk: UIMessageChunk;\n }\n /** A message was persisted; it replaces any message with its id. */\n | {\n readonly type: \"message\";\n readonly message: UIMessage;\n /** The operation that wrote it. */\n readonly operationId?: string;\n }\n /** The session was reset. Messages that follow belong to the new context. */\n | { readonly type: \"reset\" }\n /**\n * The transcript changed in a way no single message describes: messages\n * were deleted, or a compaction changed what the model sees. Re-read it.\n */\n | { readonly type: \"transcript\" };\n\n/** A listener for a session's events. @experimental */\nexport type ThinkSessionListener = (event: ThinkSessionEvent) => void;\n\n/** A listener for every session's events. @experimental */\nexport type ThinkHarnessListener = (\n session: string,\n event: ThinkSessionEvent\n) => void;\n\n/** Fan-out of session events to listeners, per session. */\nexport class SessionEvents {\n readonly #listeners = new Map<string, Set<ThinkSessionListener>>();\n readonly #observers = new Set<ThinkHarnessListener>();\n\n /** Listen to every session. Returns the unsubscribe. */\n observe(listener: ThinkHarnessListener): () => void {\n this.#observers.add(listener);\n return () => {\n this.#observers.delete(listener);\n };\n }\n\n /** Listen to one session. Returns the unsubscribe. */\n subscribe(session: string, listener: ThinkSessionListener): () => void {\n let listeners = this.#listeners.get(session);\n if (!listeners) {\n listeners = new Set();\n this.#listeners.set(session, listeners);\n }\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) this.#listeners.delete(session);\n };\n }\n\n /** Deliver an event to a session's listeners. A throwing listener is logged. */\n emit(session: string, event: ThinkSessionEvent): void {\n for (const observer of this.#observers) {\n try {\n observer(session, event);\n } catch (error) {\n console.error(\"A ThinkHarness observer failed\", error);\n }\n }\n for (const listener of this.#listeners.get(session) ?? []) {\n try {\n listener(event);\n } catch (error) {\n console.error(\"A ThinkHarness session listener failed\", error);\n }\n }\n }\n}\n\n/** One watch: events queue until `start`, then reach the listener in order. */\nexport class Watcher implements SessionWatch {\n readonly closed: Promise<void>;\n readonly state: SessionState;\n #close: () => void = () => {};\n #listener: ((events: readonly SessionEvent[]) => Promise<void>) | undefined;\n readonly #queue: SessionEvent[][] = [];\n readonly #onStop: () => void;\n #draining = false;\n #stopped = false;\n\n constructor(state: SessionState, onStop: () => void) {\n this.state = state;\n this.#onStop = onStop;\n this.closed = new Promise((resolve) => {\n this.#close = resolve;\n });\n }\n\n /** Start delivering queued and later events. */\n start(listener: (events: readonly SessionEvent[]) => Promise<void>): void {\n this.#listener = listener;\n void this.#drain();\n }\n\n /** Stop the watch. */\n async stop(): Promise<void> {\n if (this.#stopped) return;\n this.#stopped = true;\n this.#onStop();\n this.#close();\n }\n\n /** Queue events for the listener. */\n push(events: SessionEvent[]): void {\n if (this.#stopped || events.length === 0) return;\n this.#queue.push(events);\n void this.#drain();\n }\n\n async #drain(): Promise<void> {\n if (!this.#listener || this.#draining) return;\n this.#draining = true;\n try {\n for (;;) {\n const events = this.#queue.shift();\n if (!events || this.#stopped) return;\n try {\n await this.#listener(events);\n } catch (error) {\n console.error(\"A ThinkHarness session watcher failed\", error);\n }\n }\n } finally {\n this.#draining = false;\n }\n }\n}\n","/**\n * ThinkHarness's own durable records: which sessions exist, the queue of\n * operations in each, and the tool calls the harness has started. Messages\n * are not here; they live in the Sessions capability, and in-flight model\n * output lives in the Streams capability.\n *\n * The records are kept in the shared, harness-agnostic store\n * (`agents/harness/store`), under the `cf_think_harness_store_` prefix. This\n * module is the translation between the harness's records and the store's\n * opaque JSON: an operation's progress is its `meta`, a done operation's\n * text is its `result`, and a session's declared client tools and started\n * tool calls are its `state`.\n *\n * Every write is synchronous, so a write can join the transaction a Streams\n * cutover or a Sessions write commits in.\n */\nimport type { UIMessage } from \"ai\";\nimport type { ClientToolSchema } from \"../../chat/client-tools\";\nimport type { ToolAnswer } from \"../../experimental/channels/harness\";\nimport {\n openHarnessStore,\n type HarnessStore,\n type JsonValue,\n type OperationRecord as StoredOperation\n} from \"../store/store\";\n\n/** What an operation asks the harness to do, as stored. */\nexport type OperationInput =\n /** Place these user messages, then answer them. */\n | { readonly kind: \"messages\"; readonly messages: readonly UIMessage[] }\n /** Record a tool result or approval, then continue the turn it unblocks. */\n | {\n readonly kind: \"answer\";\n readonly answer: ToolAnswer;\n /** Whether to continue the turn once nothing else is awaited. */\n readonly autoContinue: boolean;\n }\n /** Answer a user message again, on a new branch beside earlier answers. */\n | { readonly kind: \"regenerate\"; readonly messageId?: string }\n /** Continue the latest assistant message. */\n | { readonly kind: \"continue\" };\n\n/** Where an operation is in its life. */\nexport type OperationStatus = \"queued\" | \"running\" | \"done\" | \"unanswered\";\n\n/** One operation, parsed. */\nexport type OperationRecord = {\n readonly session: string;\n readonly operationId: string;\n readonly seq: number;\n readonly input: OperationInput;\n readonly status: OperationStatus;\n readonly source: \"client\" | \"server\";\n /** The message a new assistant message is a child of. */\n readonly parentId: string | undefined;\n /** This operation's assistant message, once it has one. */\n readonly messageId: string | undefined;\n /** The stream of the model call in progress, if one is. */\n readonly streamId: string | undefined;\n /** Whether the model has to be called before the turn can end. */\n readonly pendingModel: boolean;\n /** Model calls made so far. */\n readonly steps: number;\n /** Interruptions since the turn last made progress. */\n readonly interruptions: number;\n /** Context-overflow retries spent. */\n readonly overflowRetries: number;\n /** Why an `unanswered` operation ended. */\n readonly reason: string | undefined;\n /** A `done` operation's answer. */\n readonly text: string | undefined;\n /** Set when the operation must be settled unanswered rather than run on. */\n readonly abandonReason: string | undefined;\n readonly createdAt: number;\n};\n\n/** A tool call the harness started, so an eviction mid-call is noticed. */\nexport type ToolCallRecord = {\n readonly session: string;\n readonly toolCallId: string;\n readonly operationId: string;\n readonly attempts: number;\n};\n\n/** A session the harness knows of. */\nexport type SessionRecord = {\n readonly id: string;\n readonly parent: string | undefined;\n readonly createdAt: number;\n};\n\n/**\n * A change to an operation's progress. A field left out is unchanged;\n * `null` clears it.\n */\nexport type OperationProgress = {\n readonly parentId?: string | null;\n readonly messageId?: string | null;\n readonly streamId?: string | null;\n readonly pendingModel?: boolean;\n readonly steps?: number;\n readonly interruptions?: number;\n readonly overflowRetries?: number;\n readonly abandonReason?: string | null;\n};\n\n/** How an operation ended. */\nexport type OperationSettlement =\n | { readonly status: \"done\"; readonly text: string }\n | { readonly status: \"unanswered\"; readonly reason: string };\n\n/** The shared store's table prefix for ThinkHarness's records. */\nconst STORE_PREFIX = \"cf_think_harness_store_\";\n\n/** The tables ThinkHarness kept its records in before the shared store. */\nconst LEGACY_SESSIONS = \"cf_think_harness_sessions\";\nconst LEGACY_OPERATIONS = \"cf_think_harness_operations\";\nconst LEGACY_TOOL_CALLS = \"cf_think_harness_tool_calls\";\n\nconst OPEN = [\"queued\", \"running\"] as const;\n\n/** An operation's progress, as kept in the store's `meta`. */\ntype OperationMeta = {\n readonly source: \"client\" | \"server\";\n readonly parentId: string | null;\n readonly messageId: string | null;\n readonly streamId: string | null;\n readonly pendingModel: boolean;\n readonly steps: number;\n readonly interruptions: number;\n readonly overflowRetries: number;\n readonly abandonReason: string | null;\n};\n\n/** A started tool call, as kept in its session's state. */\ntype StartedToolCall = {\n readonly operationId: string;\n readonly attempts: number;\n};\n\n/** A session's harness-owned state, as kept in the store. */\ntype SessionState = {\n readonly clientTools: readonly ClientToolSchema[];\n readonly toolCalls: Readonly<Record<string, StartedToolCall>>;\n};\n\nconst EMPTY_STATE: SessionState = { clientTools: [], toolCalls: {} };\n\nfunction isRecord(\n value: JsonValue | undefined\n): value is { readonly [key: string]: JsonValue } {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stringOrNull(value: JsonValue | undefined): string | null {\n return typeof value === \"string\" ? value : null;\n}\n\nfunction count(value: JsonValue | undefined): number {\n return typeof value === \"number\" ? value : 0;\n}\n\nfunction parseMeta(value: JsonValue): OperationMeta {\n const fields = isRecord(value) ? value : {};\n return {\n source: fields.source === \"client\" ? \"client\" : \"server\",\n parentId: stringOrNull(fields.parentId),\n messageId: stringOrNull(fields.messageId),\n streamId: stringOrNull(fields.streamId),\n pendingModel: fields.pendingModel === true,\n steps: count(fields.steps),\n interruptions: count(fields.interruptions),\n overflowRetries: count(fields.overflowRetries),\n abandonReason: stringOrNull(fields.abandonReason)\n };\n}\n\nfunction newMeta(source: \"client\" | \"server\"): OperationMeta {\n return {\n source,\n parentId: null,\n messageId: null,\n streamId: null,\n pendingModel: false,\n steps: 0,\n interruptions: 0,\n overflowRetries: 0,\n abandonReason: null\n };\n}\n\nfunction metaJson(meta: OperationMeta): JsonValue {\n return { ...meta };\n}\n\nfunction withProgress(\n meta: OperationMeta,\n change: OperationProgress\n): OperationMeta {\n return {\n source: meta.source,\n parentId: change.parentId === undefined ? meta.parentId : change.parentId,\n messageId:\n change.messageId === undefined ? meta.messageId : change.messageId,\n streamId: change.streamId === undefined ? meta.streamId : change.streamId,\n pendingModel: change.pendingModel ?? meta.pendingModel,\n steps: change.steps ?? meta.steps,\n interruptions: change.interruptions ?? meta.interruptions,\n overflowRetries: change.overflowRetries ?? meta.overflowRetries,\n abandonReason:\n change.abandonReason === undefined\n ? meta.abandonReason\n : change.abandonReason\n };\n}\n\nfunction inputJson(input: OperationInput): JsonValue {\n // SAFETY: an OperationInput is plain JSON: UI messages and tool answers\n // as clients send them, which the harness always stored as JSON.\n return input as unknown as JsonValue;\n}\n\nfunction parseInput(value: JsonValue): OperationInput {\n // SAFETY: inputs are stored only by `insert` (from an OperationInput) or\n // imported from the legacy table, which `insert` also wrote.\n return value as unknown as OperationInput;\n}\n\nfunction parseText(result: JsonValue): string | undefined {\n return isRecord(result) && typeof result.text === \"string\"\n ? result.text\n : undefined;\n}\n\nfunction parseSessionState(value: JsonValue | undefined): SessionState {\n if (!isRecord(value)) return EMPTY_STATE;\n // Keyed by model-chosen ids, so no prototype: `__proto__` stays a key.\n const toolCalls: Record<string, StartedToolCall> = Object.create(null);\n const calls = value.toolCalls;\n if (isRecord(calls)) {\n for (const [toolCallId, call] of Object.entries(calls)) {\n if (\n isRecord(call) &&\n typeof call.operationId === \"string\" &&\n typeof call.attempts === \"number\"\n ) {\n toolCalls[toolCallId] = {\n operationId: call.operationId,\n attempts: call.attempts\n };\n }\n }\n }\n return {\n clientTools: Array.isArray(value.clientTools)\n ? // SAFETY: written only by `setClientTools` from ClientToolSchema[],\n // or imported from the legacy column it also wrote.\n (value.clientTools as unknown as ClientToolSchema[])\n : [],\n toolCalls\n };\n}\n\nfunction sessionStateJson(state: SessionState): JsonValue {\n return {\n // SAFETY: a ClientToolSchema is plain JSON: a name, a description and\n // a JSON Schema.\n clientTools: state.clientTools as unknown as JsonValue,\n toolCalls: { ...state.toolCalls }\n };\n}\n\nfunction parseOperation(stored: StoredOperation): OperationRecord {\n const meta = parseMeta(stored.meta);\n return {\n session: stored.session,\n operationId: stored.id,\n seq: stored.seq,\n input: parseInput(stored.input),\n status: stored.status,\n source: meta.source,\n parentId: meta.parentId ?? undefined,\n messageId: meta.messageId ?? undefined,\n streamId: meta.streamId ?? undefined,\n pendingModel: meta.pendingModel,\n steps: meta.steps,\n interruptions: meta.interruptions,\n overflowRetries: meta.overflowRetries,\n reason: stored.reason,\n text: stored.status === \"done\" ? parseText(stored.result) : undefined,\n abandonReason: meta.abandonReason ?? undefined,\n createdAt: stored.createdAt\n };\n}\n\n/**\n * The harness's records, over the shared harness store: sessions, the\n * operation queue, and started tool calls. Opening it moves records an\n * earlier version left in its own tables into the store.\n */\nexport class OperationRecords {\n readonly #store: HarnessStore;\n\n /**\n * Open the records, creating the store's tables and importing any legacy\n * tables. Cheap after the first time: keep one per isolate.\n *\n * @param storage - The Durable Object's storage.\n */\n constructor(storage: DurableObjectStorage) {\n this.#store = openHarnessStore(storage, { prefix: STORE_PREFIX });\n importLegacyTables(storage, this.#store);\n }\n\n // ── Sessions ─────────────────────────────────────────────────────────────\n\n /** Record a session, unless it exists. */\n ensureSession(id: string, parent?: string): void {\n this.#store.createSession({\n id,\n ...(parent !== undefined && { parent }),\n state: sessionStateJson(EMPTY_STATE)\n });\n }\n\n /** Every session, oldest first. */\n sessions(): SessionRecord[] {\n return this.#store.sessions().map((session) => ({\n id: session.id,\n parent: session.parent,\n createdAt: session.createdAt\n }));\n }\n\n /** The client tools a session's client last declared. */\n clientTools(session: string): ClientToolSchema[] {\n return [...this.#state(session).clientTools];\n }\n\n /** Replace the client tools a session's client declared. */\n setClientTools(session: string, tools: readonly ClientToolSchema[]): void {\n this.#updateState(session, (state) => ({ ...state, clientTools: tools }));\n }\n\n #state(session: string): SessionState {\n return parseSessionState(this.#store.session(session)?.state);\n }\n\n #updateState(\n session: string,\n change: (state: SessionState) => SessionState\n ): void {\n this.#store.transaction(() => {\n const stored = this.#store.session(session);\n if (!stored) return;\n this.#store.setSessionState(\n session,\n sessionStateJson(change(parseSessionState(stored.state)))\n );\n });\n }\n\n // ── Operations ───────────────────────────────────────────────────────────\n\n /** Insert a queued operation. Returns false when the id already exists. */\n insert(\n session: string,\n operationId: string,\n input: OperationInput,\n source: \"client\" | \"server\"\n ): boolean {\n return this.#store.enqueue({\n session,\n id: operationId,\n input: inputJson(input),\n meta: metaJson(newMeta(source))\n }).accepted;\n }\n\n /** One operation. */\n get(session: string, operationId: string): OperationRecord | undefined {\n const stored = this.#store.operation(session, operationId);\n return stored ? parseOperation(stored) : undefined;\n }\n\n /** Unsettled operations, oldest first; every session when none is given. */\n open(session?: string): OperationRecord[] {\n return this.#store\n .operations({\n ...(session !== undefined && { session }),\n status: OPEN\n })\n .map(parseOperation);\n }\n\n /** Change an operation's progress. */\n update(\n session: string,\n operationId: string,\n change: OperationProgress\n ): void {\n this.#store.transaction(() => {\n const stored = this.#store.operation(session, operationId);\n if (!stored) return;\n this.#store.setOperationMeta(\n session,\n operationId,\n metaJson(withProgress(parseMeta(stored.meta), change))\n );\n });\n }\n\n /**\n * Move a queued operation to running, with its progress so far.\n * Returns false when it was not queued.\n */\n start(\n session: string,\n operationId: string,\n change: OperationProgress\n ): boolean {\n return this.#store.transaction(() => {\n if (!this.#store.start(session, operationId)) return false;\n this.update(session, operationId, change);\n return true;\n });\n }\n\n /**\n * Settle an open operation, with a last change to its progress. Returns\n * false when it had already settled.\n */\n settle(\n session: string,\n operationId: string,\n outcome: OperationSettlement,\n change: OperationProgress = {}\n ): boolean {\n return this.#store.transaction(() => {\n const settled = this.#store.settle(\n session,\n operationId,\n outcome.status === \"done\"\n ? { status: \"done\", result: { text: outcome.text } }\n : outcome\n );\n if (settled) this.update(session, operationId, change);\n return settled;\n });\n }\n\n /** Forget every settled operation in a session, for a reset. */\n deleteSettled(session: string): void {\n this.#store.transaction(() => {\n this.#store.deleteSettled(session);\n this.#updateState(session, (state) => ({ ...state, toolCalls: {} }));\n });\n }\n\n // ── Tool calls ───────────────────────────────────────────────────────────\n\n /** The record of a started tool call, if it was started. */\n toolCall(session: string, toolCallId: string): ToolCallRecord | undefined {\n const { toolCalls } = this.#state(session);\n // An id such as `constructor` must not read an inherited property.\n if (!Object.hasOwn(toolCalls, toolCallId)) return undefined;\n const call = toolCalls[toolCallId];\n return call && { session, toolCallId, ...call };\n }\n\n /** Record that a tool call is starting. Returns the attempt number. */\n startToolCall(\n session: string,\n toolCallId: string,\n operationId: string\n ): number {\n const attempts = (this.toolCall(session, toolCallId)?.attempts ?? 0) + 1;\n this.#updateState(session, (state) => ({\n ...state,\n toolCalls: { ...state.toolCalls, [toolCallId]: { operationId, attempts } }\n }));\n return attempts;\n }\n\n /** Forget a tool call once its result is in the transcript. */\n finishToolCall(session: string, toolCallId: string): void {\n this.#updateState(session, (state) => {\n const { [toolCallId]: _finished, ...toolCalls } = state.toolCalls;\n return { ...state, toolCalls };\n });\n }\n}\n\n// ── The legacy tables ──────────────────────────────────────────────────────\n\ntype LegacySessionRow = {\n id: string;\n parent: string | null;\n client_tools: string | null;\n created_at: number;\n};\n\ntype LegacyToolCallRow = {\n session_id: string;\n tool_call_id: string;\n operation_id: string;\n attempts: number;\n};\n\ntype LegacyOperationRow = {\n session_id: string;\n operation_id: string;\n input: string;\n status: string;\n source: string;\n parent_id: string | null;\n message_id: string | null;\n stream_id: string | null;\n pending_model: number;\n steps: number;\n interruptions: number;\n overflow_retries: number;\n reason: string | null;\n text: string | null;\n /** Missing from tables created before the column was added. */\n abandon_reason?: string | null;\n};\n\nfunction parseJsonColumn(text: string): JsonValue {\n // SAFETY: the legacy columns were written with JSON.stringify.\n return JSON.parse(text) as JsonValue;\n}\n\n/**\n * Move the records an earlier version kept in its own tables into the\n * store, then drop those tables, in one transaction: either every record\n * moves or none does and the next start tries again. Operations keep their\n * order, status and progress; sessions keep their creation time, client\n * tools and started tool calls, so an operation that was in flight resumes\n * and recovers as it would have.\n */\nfunction importLegacyTables(\n storage: DurableObjectStorage,\n store: HarnessStore\n): void {\n const sql = storage.sql;\n const present = new Set(\n sql\n .exec<{ name: string }>(\n `SELECT name FROM sqlite_master WHERE type = 'table' AND name IN (?, ?, ?)`,\n LEGACY_SESSIONS,\n LEGACY_OPERATIONS,\n LEGACY_TOOL_CALLS\n )\n .toArray()\n .map((row) => row.name)\n );\n if (present.size === 0) return;\n\n storage.transactionSync(() => {\n const states = new Map<string, SessionState>();\n if (present.has(LEGACY_SESSIONS)) {\n const rows = sql\n .exec<LegacySessionRow>(\n `SELECT id, parent, client_tools, created_at FROM ${LEGACY_SESSIONS}\n ORDER BY created_at, id`\n )\n .toArray();\n for (const row of rows) {\n store.createSession({\n id: row.id,\n ...(row.parent !== null && { parent: row.parent }),\n createdAt: row.created_at\n });\n states.set(\n row.id,\n parseSessionState({\n clientTools:\n row.client_tools === null\n ? []\n : parseJsonColumn(row.client_tools),\n toolCalls: {}\n })\n );\n }\n }\n if (present.has(LEGACY_TOOL_CALLS)) {\n const rows = sql\n .exec<LegacyToolCallRow>(\n `SELECT session_id, tool_call_id, operation_id, attempts\n FROM ${LEGACY_TOOL_CALLS}`\n )\n .toArray();\n for (const row of rows) {\n const state = states.get(row.session_id) ?? EMPTY_STATE;\n states.set(row.session_id, {\n ...state,\n toolCalls: {\n ...state.toolCalls,\n [row.tool_call_id]: {\n operationId: row.operation_id,\n attempts: row.attempts\n }\n }\n });\n }\n }\n for (const [id, state] of states) {\n // A session the legacy sessions table lacked is created here.\n store.createSession({ id });\n store.setSessionState(id, sessionStateJson(state));\n }\n\n if (present.has(LEGACY_OPERATIONS)) {\n const rows = sql\n .exec<LegacyOperationRow>(\n `SELECT * FROM ${LEGACY_OPERATIONS} ORDER BY seq`\n )\n .toArray();\n for (const row of rows) importLegacyOperation(store, row);\n }\n\n for (const table of [\n LEGACY_SESSIONS,\n LEGACY_OPERATIONS,\n LEGACY_TOOL_CALLS\n ]) {\n sql.exec(`DROP TABLE IF EXISTS ${table}`);\n }\n });\n}\n\nfunction importLegacyOperation(\n store: HarnessStore,\n row: LegacyOperationRow\n): void {\n const session = row.session_id;\n const id = row.operation_id;\n if (!store.session(session)) {\n store.createSession({ id: session, state: sessionStateJson(EMPTY_STATE) });\n }\n const meta: OperationMeta = {\n source: row.source === \"client\" ? \"client\" : \"server\",\n parentId: row.parent_id,\n messageId: row.message_id,\n streamId: row.stream_id,\n pendingModel: row.pending_model === 1,\n steps: row.steps,\n interruptions: row.interruptions,\n overflowRetries: row.overflow_retries,\n abandonReason: row.abandon_reason ?? null\n };\n // Legacy tables exist beside the store only after a rollback to a version\n // that cannot see the store, so a legacy row is the newer record of its\n // id: it replaces the store's.\n store.deleteOperation(session, id);\n // Enqueued in the legacy order, so the store's order is the same.\n store.enqueue({\n session,\n id,\n input: parseJsonColumn(row.input),\n meta: metaJson(meta)\n });\n switch (row.status) {\n case \"queued\":\n return;\n case \"running\":\n store.start(session, id);\n return;\n case \"done\":\n store.settle(session, id, {\n status: \"done\",\n result: { text: row.text ?? \"\" }\n });\n return;\n case \"unanswered\":\n // Every legacy path that settled an operation unanswered gave a reason.\n store.settle(session, id, {\n status: \"unanswered\",\n reason: row.reason ?? \"unanswered\"\n });\n return;\n default:\n throw new Error(\n `Unknown ThinkHarness operation status ${row.status} in ${LEGACY_OPERATIONS}`\n );\n }\n}\n","/**\n * The harness runs server tools itself, one durable call at a time, so the\n * model is only ever offered tool definitions: no `execute`, no\n * `needsApproval`. That way the AI SDK ends each model call at its tool\n * calls, and the harness decides how to run, approve, or recover each one.\n */\nimport type { ModelMessage, Tool, ToolSet } from \"ai\";\n\n/** The model-facing copy of a tool set, restricted to `activeTools` if given. */\nexport function modelTools(\n tools: ToolSet,\n activeTools: readonly string[] | undefined\n): ToolSet {\n const active = activeTools ? new Set(activeTools) : undefined;\n const offered: ToolSet = {};\n for (const [name, tool] of Object.entries(tools)) {\n if (active && !active.has(name)) continue;\n if (tool.type === \"provider\") {\n offered[name] = tool;\n continue;\n }\n const {\n execute: _execute,\n needsApproval: _needsApproval,\n ...definition\n } = tool;\n // A tool's `recovery` field is the harness's, not the model's.\n if (\"recovery\" in definition) delete definition.recovery;\n // SAFETY: a tool without `execute` and `needsApproval` is still a tool\n // of the same kind; both fields are optional on every Tool variant.\n offered[name] = definition as ToolSet[string];\n }\n return offered;\n}\n\n/** Whether the harness runs this tool, as opposed to a client or provider. */\nexport function isServerTool(tools: ToolSet, name: string): boolean {\n const tool = Object.hasOwn(tools, name) ? tools[name] : undefined;\n return (\n tool !== undefined &&\n tool.type !== \"provider\" &&\n typeof tool.execute === \"function\"\n );\n}\n\n/** Whether a tool's own `needsApproval` asks for approval of this call. */\nexport async function toolNeedsApproval(\n tool: Tool,\n input: unknown,\n options: { readonly toolCallId: string; readonly messages: ModelMessage[] }\n): Promise<boolean> {\n const needsApproval = tool.needsApproval;\n if (typeof needsApproval === \"function\") {\n return Boolean(\n await needsApproval(input, { ...options, context: undefined })\n );\n }\n return needsApproval === true;\n}\n\n/** A tool call's outcome. */\nexport type ToolOutcome =\n | { readonly ok: true; readonly output: unknown }\n | { readonly ok: false; readonly errorText: string };\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Symbol.asyncIterator in value &&\n typeof value[Symbol.asyncIterator] === \"function\"\n );\n}\n\n/**\n * Run one tool's `execute`. A streaming tool's outputs before its last are\n * reported to `onPreliminary`; its last output is the result.\n */\nexport async function executeTool(\n tool: Tool,\n input: unknown,\n options: {\n readonly toolCallId: string;\n readonly messages: ModelMessage[];\n readonly abortSignal: AbortSignal;\n readonly onPreliminary: (output: unknown) => void;\n }\n): Promise<ToolOutcome> {\n const execute = tool.execute;\n if (typeof execute !== \"function\") {\n return { ok: false, errorText: \"The tool has no execute function\" };\n }\n try {\n const result: unknown = await execute(input, {\n toolCallId: options.toolCallId,\n messages: options.messages,\n abortSignal: options.abortSignal,\n context: undefined\n });\n if (!isAsyncIterable(result)) return { ok: true, output: result };\n let last: unknown;\n let seen = false;\n for await (const output of result) {\n if (seen) options.onPreliminary(last);\n last = output;\n seen = true;\n }\n return { ok: true, output: last };\n } catch (error) {\n return {\n ok: false,\n errorText: error instanceof Error ? error.message : String(error)\n };\n }\n}\n","/**\n * What a turn does next, read from durable state alone: the operation's\n * progress fields and its assistant message. The harness asks after every\n * step, and again after an eviction, so a turn picks up exactly where its\n * last durable write left it.\n */\nimport type { UIMessage } from \"ai\";\n\ntype UIPart = UIMessage[\"parts\"][number];\n\n/** A tool call part of a UI message. */\nexport type ToolCallPart = Extract<UIPart, { toolCallId: string }>;\n\n/** The next thing a turn does. */\nexport type TurnAction =\n /** A model call was cut short; rebuild it from its stream. */\n | { readonly _tag: \"recover-model\" }\n | { readonly _tag: \"call-model\" }\n /** Run these server tool calls, then call the model again. */\n | { readonly _tag: \"run-tools\"; readonly calls: readonly ToolCallPart[] }\n /** A client tool result or an approval is needed before going on. */\n | { readonly _tag: \"await-input\" }\n | { readonly _tag: \"end\" };\n\n/** The durable progress of a turn. */\nexport type TurnProgress = {\n readonly streamId: string | undefined;\n readonly pendingModel: boolean;\n readonly steps: number;\n};\n\n/** Whether a part is a tool call. */\nexport function isToolCallPart(part: UIPart): part is ToolCallPart {\n return (\n (part.type.startsWith(\"tool-\") || part.type === \"dynamic-tool\") &&\n \"toolCallId\" in part\n );\n}\n\n/** The tool name a tool call part carries. */\nexport function toolNameOf(part: ToolCallPart): string {\n return part.type === \"dynamic-tool\"\n ? part.toolName\n : part.type.slice(\"tool-\".length);\n}\n\n/** The parts of a message's last model step. */\nexport function lastStep(message: UIMessage): UIPart[] {\n let start = 0;\n message.parts.forEach((part, index) => {\n if (part.type === \"step-start\") start = index + 1;\n });\n return message.parts.slice(start);\n}\n\n/** Whether a tool call has its result, error or denial. */\nexport function isSettled(part: ToolCallPart): boolean {\n return (\n part.state === \"output-available\" ||\n part.state === \"output-error\" ||\n part.state === \"output-denied\"\n );\n}\n\n/**\n * Decide the turn's next action.\n *\n * @param progress - The operation's durable progress.\n * @param message - The turn's assistant message, once it has one.\n * @param isServerTool - Whether the harness runs a tool of this name.\n * @param maxSteps - Most model calls one operation makes.\n * @returns What to do next.\n */\nexport function nextAction(\n progress: TurnProgress,\n message: UIMessage | undefined,\n isServerTool: (name: string) => boolean,\n maxSteps: number\n): TurnAction {\n if (progress.streamId !== undefined) return { _tag: \"recover-model\" };\n if (message === undefined) {\n return progress.pendingModel ? { _tag: \"call-model\" } : { _tag: \"end\" };\n }\n const runnable: ToolCallPart[] = [];\n let awaiting = false;\n for (const part of lastStep(message)) {\n if (!isToolCallPart(part) || isSettled(part) || part.providerExecuted) {\n continue;\n }\n const server = isServerTool(toolNameOf(part));\n switch (part.state) {\n case \"input-available\":\n if (server) runnable.push(part);\n else awaiting = true;\n break;\n case \"approval-responded\":\n if (server && part.approval.approved) runnable.push(part);\n else awaiting = true;\n break;\n case \"approval-requested\":\n awaiting = true;\n break;\n case \"input-streaming\":\n // Only an interrupted model call leaves one, and recovery drops it.\n break;\n }\n }\n if (runnable.length > 0) return { _tag: \"run-tools\", calls: runnable };\n if (awaiting) return { _tag: \"await-input\" };\n if (progress.pendingModel && progress.steps < maxSteps) {\n return { _tag: \"call-model\" };\n }\n return { _tag: \"end\" };\n}\n\n/** The text of a message's text parts. */\nexport function textOf(message: UIMessage | undefined): string {\n if (!message) return \"\";\n return message.parts\n .map((part) => (part.type === \"text\" ? part.text : \"\"))\n .join(\"\");\n}\n\n/**\n * The partial message an interrupted model call leaves, made safe to keep:\n * tool calls whose input never finished streaming are dropped, since the\n * model never committed to them.\n */\nexport function settledPartial(message: UIMessage): UIMessage {\n return {\n ...message,\n parts: message.parts.filter(\n (part) => !(isToolCallPart(part) && part.state === \"input-streaming\")\n )\n };\n}\n\n/** Whether a message has anything besides step markers. */\nexport function hasContent(message: UIMessage): boolean {\n return message.parts.some((part) => part.type !== \"step-start\");\n}\n","import {\n convertToModelMessages,\n stepCountIs,\n streamText,\n toUIMessageStream,\n type ModelMessage,\n type ToolSet,\n type UIMessage,\n type UIMessageChunk\n} from \"ai\";\n// Imported from their modules, not \"../../lifecycle\", which loads\n// cloudflare:workers.\nimport {\n bindLifecycleCapability,\n LifecycleCapability\n} from \"../../lifecycle/capability\";\nimport { Sessions } from \"../../sessions/sessions\";\nimport { Streams } from \"../../streams/streams\";\nimport type { MemoryLimitContext } from \"../../lifecycle/capability-runner\";\nimport type {\n LifecycleJobContext,\n LifecycleJobOutcome\n} from \"../../lifecycle/job-queue\";\nimport { createToolsFromClientSchemas } from \"../../chat/client-tools\";\nimport type { StreamChunkData } from \"../../chat/message-builder\";\nimport {\n ChatStreamStalledError,\n iterateWithStallWatchdog\n} from \"../../chat/stall-watchdog\";\nimport { StreamAccumulator } from \"../../chat/stream-accumulator\";\nimport type {\n AgentHarness,\n HarnessInput,\n HarnessSession,\n HarnessSessions,\n SessionEvent,\n SessionState,\n SessionWatch,\n ToolAnswer\n} from \"../../experimental/channels/harness\";\nimport type { CompactResult } from \"../../sessions/compaction-helpers\";\nimport type { Session } from \"../../sessions/handle\";\nimport type { SearchResult, SessionMessage } from \"../../sessions/types\";\nimport type { StreamJson } from \"../../streams/types\";\nimport {\n answerToolCall,\n toResponseChunk,\n toTranscriptMessage,\n type ToolCallAnswer\n} from \"../ai-sdk/turns\";\nimport {\n SessionEvents,\n Watcher,\n type ThinkHarnessListener,\n type ThinkSessionEvent,\n type ThinkSessionListener\n} from \"./events\";\nimport {\n OperationRecords,\n type OperationInput,\n type OperationRecord\n} from \"./records\";\nimport {\n executeTool,\n isServerTool,\n modelTools,\n toolNeedsApproval,\n type ToolOutcome\n} from \"./tools\";\nimport {\n hasContent,\n isToolCallPart,\n lastStep,\n nextAction,\n settledPartial,\n textOf,\n toolNameOf,\n type ToolCallPart\n} from \"./turn\";\nimport type {\n PerSession,\n ThinkErrorClass,\n ThinkHarnessOptions,\n ThinkInFlight,\n ThinkInput,\n ThinkOperationStatus,\n ThinkStreamCallback,\n ThinkOperationResult,\n ThinkPendingOperation,\n ThinkPromptResponse,\n ThinkReceipt,\n ThinkSessionId,\n ThinkSessionInfo,\n ThinkSubmitOptions,\n ToolRecovery\n} from \"./types\";\n\n/**\n * Thrown by `submit()` when asked to steer a running turn, which\n * ThinkHarness does not support. Submit without `whenBusy` to queue the\n * input behind the running turn instead.\n *\n * @experimental\n */\nexport class SteerNotSupportedError extends Error {\n /** Stable tag for matching without `instanceof`. */\n readonly _tag = \"SteerNotSupportedError\" as const;\n\n /** @param session - The session the submission was for. */\n constructor(readonly session: ThinkSessionId) {\n super(\n 'ThinkHarness does not support whenBusy: \"steer\". Submit without it to queue the input behind the running turn.'\n );\n this.name = \"SteerNotSupportedError\";\n }\n}\n\n/** The root session's id: the Sessions capability's default session. */\nexport const ROOT_SESSION: ThinkSessionId = \"\";\n\nconst WAKE_FN = \"wake\";\nconst HEARTBEAT_MS = 30_000;\nconst DEFAULT_MAX_STEPS = 10;\nconst DEFAULT_MAX_ATTEMPTS = 10;\nconst DEFAULT_BACKOFF_MS = 1_000;\nconst MAX_BACKOFF_MS = 60_000;\nconst DEFAULT_STALL_TIMEOUT_MS = 120_000;\nconst MAX_OVERFLOW_RETRIES = 1;\n/** Ceiling for one stored segment, under the 2 MB SQLite row limit. */\nconst STREAM_MAX_CHUNK_BYTES = 1_900_000;\n/** Chunks packed into one stored stream segment. */\nconst SEGMENT_CHUNKS = 10;\n/** Raw bytes packed into one stored segment before it is written. */\nconst SEGMENT_MAX_BYTES = 256_000;\n/** Longest a streamed chunk waits in memory before it is written. */\nconst FLUSH_AFTER_MS = 100;\n/** Segments read at a time when rebuilding an interrupted model call. */\nconst READ_PAGE = 50;\n\nconst INTERRUPTED_TOOL_ERROR =\n \"The tool call was interrupted before it finished, because the agent restarted. It may or may not have taken effect.\";\n\ntype WakeTiming = {\n /** Heartbeat of a session's wake job while it runs. Default 30_000. */\n readonly heartbeatMs?: number;\n};\n\nlet setWakeTiming: (harness: ThinkHarness, timing: WakeTiming) => void;\n\n/**\n * @internal Shorten a harness's heartbeat, so a test suite does not sit on\n * the real one. Not exported from `agents/harness/think`.\n */\nexport function setWakeTimingForTests(\n harness: ThinkHarness,\n timing: WakeTiming\n): void {\n setWakeTiming(harness, timing);\n}\n\n/** The operation a session is running in this isolate. */\ntype LiveRun = {\n readonly operationId: string;\n readonly abort: AbortController;\n /** Chunks of the model call in progress. */\n partial: UIMessageChunk[];\n /** Whether that call continues a message already persisted. */\n continues: boolean;\n};\n\n/** What an operation's run asks of the drive when it stops early. */\ntype RunOutcome = { readonly retryAt?: number };\n\n/** A durable write: put messages and update operations, in one transaction. */\ntype Put = (\n message: UIMessage,\n options?: {\n readonly parentId?: string;\n readonly source?: \"client\" | \"server\";\n }\n) => void;\n\nfunction wakeJobId(session: ThinkSessionId): string {\n return `think-wake:${session}`;\n}\n\nfunction sessionOfJob(payload: unknown): ThinkSessionId | undefined {\n return typeof payload === \"object\" &&\n payload !== null &&\n \"session\" in payload &&\n typeof payload.session === \"string\"\n ? payload.session\n : undefined;\n}\n\nasync function resolve<T>(\n value: PerSession<T> | undefined,\n session: ThinkSessionId\n): Promise<T | undefined> {\n if (typeof value === \"function\") {\n // SAFETY: PerSession<T> is T or a function of the session context, and\n // no T the harness takes (a model, a system prompt, a tool set) is a\n // function, so a function here is the per-session form.\n const compute = value as (context: {\n session: ThinkSessionId;\n }) => T | Promise<T>;\n return compute({ session });\n }\n return value;\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isToolAnswer(input: ThinkInput): input is ToolAnswer {\n return (\n typeof input === \"object\" &&\n !Array.isArray(input) &&\n \"type\" in input &&\n (input.type === \"approval\" || input.type === \"tool-result\")\n );\n}\n\nfunction isUIMessage(input: ThinkInput): input is UIMessage {\n return (\n typeof input === \"object\" &&\n !Array.isArray(input) &&\n \"role\" in input &&\n \"parts\" in input\n );\n}\n\nfunction harnessInputMessage(input: HarnessInput, id: string): UIMessage {\n return {\n id: input.messageId ?? id,\n role: \"user\",\n parts: input.parts.map((part) =>\n part.type === \"text\"\n ? { type: \"text\", text: part.text }\n : {\n type: \"file\",\n mediaType: part.mediaType,\n url: part.url,\n ...(part.filename !== undefined && { filename: part.filename })\n }\n )\n };\n}\n\n/** The stored form of an input. */\nfunction operationInput(\n input: ThinkInput,\n operationId: string,\n autoContinue: boolean\n): OperationInput {\n if (typeof input === \"string\") {\n return {\n kind: \"messages\",\n messages: [\n {\n id: operationId,\n role: \"user\",\n parts: [{ type: \"text\", text: input }]\n }\n ]\n };\n }\n if (Array.isArray(input)) {\n // SAFETY: the only array a ThinkInput can be is readonly UIMessage[].\n return { kind: \"messages\", messages: input as readonly UIMessage[] };\n }\n if (isToolAnswer(input)) {\n return { kind: \"answer\", answer: input, autoContinue };\n }\n if (isUIMessage(input)) return { kind: \"messages\", messages: [input] };\n // SAFETY: the remaining ThinkInput is the shared HarnessInput.\n const harnessInput = input as HarnessInput;\n return {\n kind: \"messages\",\n messages: [harnessInputMessage(harnessInput, operationId)]\n };\n}\n\nfunction toolCallAnswer(answer: ToolAnswer): ToolCallAnswer {\n return answer.type === \"approval\"\n ? {\n type: \"approval-response\",\n approvalId: answer.approvalId,\n approved: answer.approved,\n ...(answer.reason !== undefined && { reason: answer.reason })\n }\n : {\n type: \"tool-result\",\n toolCallId: answer.toolCallId,\n result: answer.result\n };\n}\n\n/** Replace one tool call part of a message. */\nfunction withToolPart(\n message: UIMessage,\n toolCallId: string,\n update: (part: ToolCallPart) => ToolCallPart\n): UIMessage {\n return {\n ...message,\n parts: message.parts.map((part) =>\n isToolCallPart(part) && part.toolCallId === toolCallId\n ? update(part)\n : part\n )\n };\n}\n\nfunction withOutcome(part: ToolCallPart, outcome: ToolOutcome): ToolCallPart {\n // SAFETY: the new state is set with exactly the fields it requires.\n return (\n outcome.ok\n ? {\n ...part,\n state: \"output-available\",\n output: outcome.output,\n preliminary: undefined\n }\n : { ...part, state: \"output-error\", errorText: outcome.errorText }\n ) as ToolCallPart;\n}\n\nfunction asUIMessages(messages: readonly SessionMessage[]): UIMessage[] {\n // SAFETY: every message in a ThinkHarness session was written by the\n // harness from a UIMessage, and Sessions returns what was written.\n return messages as unknown as UIMessage[];\n}\n\nfunction asUIMessage(message: SessionMessage): UIMessage {\n // SAFETY: as for asUIMessages, one message at a time.\n return message as unknown as UIMessage;\n}\n\nfunction asSessionMessage(message: UIMessage): SessionMessage {\n // SAFETY: SessionMessage is the structural subset of UIMessage that\n // Sessions reads; a UIMessage is accepted as is.\n return message as unknown as SessionMessage;\n}\n\n/**\n * Think's agent loop hosted in a Durable Object, behind the same small\n * harness interface as `PiHarness`: `harness.prompt()`, `harness.sessions`,\n * `harness.session(id)`. It implements the shared `AgentHarness`\n * interface, so a Channels host can serve its sessions.\n *\n * Transcripts live in a Sessions capability and in-flight model output in\n * a Streams capability, both owned by the harness, and the harness's queue\n * of operations in its own table. The harness runs every server tool call itself, so after an\n * eviction it knows exactly which call was cut short and applies that\n * tool's recovery policy.\n *\n * Durability is the Lifecycle's job queue, used directly: one wake job per\n * session. A submission is written, then the session's wake is scheduled.\n * While a session has work, the wake job reschedules itself as a heartbeat,\n * so an eviction leaves it due and its alarm restarts the object. Each step\n * of a turn reads only durable state, so the restarted object continues\n * where the last write left off.\n *\n * @experimental The API may change between releases.\n */\nexport class ThinkHarness<TOOLS extends ToolSet = ToolSet>\n extends LifecycleCapability\n implements AgentHarness\n{\n /** Every session in this object. */\n readonly sessions: ThinkSessions;\n readonly #options: ThinkHarnessOptions<TOOLS>;\n readonly #events = new SessionEvents();\n readonly #drives = new Map<ThinkSessionId, Promise<void>>();\n readonly #live = new Map<ThinkSessionId, LiveRun>();\n readonly #waiters = new Map<string, Set<() => void>>();\n readonly #configured = new Set<ThinkSessionId>();\n /**\n * In-flight model output. Only the harness reads it, so the harness owns\n * it rather than asking the host to install a Streams capability. It\n * shares the `cf_agents_streams` tables with any Streams the host has.\n */\n readonly #streams = new Streams({ maxChunkBytes: STREAM_MAX_CHUNK_BYTES });\n /**\n * The transcripts. The harness writes every message, and its operations\n * point at them, so it owns the Sessions capability too; a second one\n * writing the same tables would leave this one's caches stale. A\n * session's branches, search and compaction are on `ThinkSession`.\n */\n readonly #sessions: Sessions;\n #bound = false;\n /**\n * Messages the harness is writing, per session, by id, so the change feed\n * skips their events (the harness emits its own) without also skipping a\n * direct write that lands meanwhile.\n */\n readonly #ownMessages = new Map<ThinkSessionId, Map<string, number>>();\n /** Clears of the harness's own in progress, per session. */\n readonly #ownClears = new Map<ThinkSessionId, number>();\n #heartbeatMs = HEARTBEAT_MS;\n #records: OperationRecords | undefined;\n\n static {\n setWakeTiming = (harness, timing) => harness.#setWakeTiming(timing);\n }\n\n /**\n * @param options - The model, tools and hooks.\n */\n constructor(options: ThinkHarnessOptions<TOOLS>) {\n super(\"think-harness\");\n this.#options = options;\n this.#sessions = new Sessions({\n ...(options.reservedMetadataKeys && {\n reservedMetadataKeys: options.reservedMetadataKeys\n })\n });\n this.sessions = new ThinkSessions(this);\n }\n\n #setWakeTiming(timing: WakeTiming): void {\n const heartbeat = timing.heartbeatMs;\n if (heartbeat !== undefined) {\n if (!Number.isFinite(heartbeat) || heartbeat <= 0) {\n throw new Error(\"ThinkHarness heartbeatMs must be a positive number\");\n }\n this.#heartbeatMs = heartbeat;\n }\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────────────\n\n /** Create the harness's tables and wake every session with open work. */\n override async onStart(): Promise<void> {\n this.#bindOwned();\n await this.#sessions.onStart();\n await this.#streams.onStart();\n const store = this.#tables();\n store.ensureSession(ROOT_SESSION);\n const sessions = new Set(store.open().map((op) => op.session));\n for (const session of sessions) {\n // A wake already set for later is a recovery backoff or the alarm\n // memory-limit breaker's delay; replacing it with one due now would\n // skip that wait.\n const wake = this.lifecycle.jobs.get(wakeJobId(session));\n if (wake && wake.time > Date.now()) continue;\n await this.#wake(session);\n }\n }\n\n /**\n * The alarm memory-limit breaker sealed: the work it stopped would only\n * run out of memory again. Mark the running operations to be settled\n * `unanswered` with reason `\"out_of_memory\"` rather than run again.\n * Queued operations behind them still run. Runs after the isolate's\n * work unwound, so it keeps to small synchronous writes.\n */\n onMemoryLimit(context: MemoryLimitContext): void {\n if (!context.sealed) return;\n // Only mark them: rebuilding a partial answer here could run out of\n // memory again. The next drive settles each marked operation through\n // the usual path, which keeps the partial and tells clients.\n const store = this.#tables();\n for (const op of store.open()) {\n if (op.status !== \"running\") continue;\n store.update(op.session, op.operationId, {\n abandonReason: \"out_of_memory\"\n });\n }\n }\n\n /** Run a session's wake job. */\n async onJob(\n context: LifecycleJobContext\n ): Promise<LifecycleJobOutcome | void> {\n if (context.job.fn !== WAKE_FN) return;\n const session = sessionOfJob(context.job.payload);\n if (session !== undefined) return this.#wakeStep(session);\n }\n\n // ── The harness interface ────────────────────────────────────────────────\n\n /**\n * A handle on one session. No I/O until you call it.\n *\n * @param id - The session. Default: the root session.\n */\n session(id: ThinkSessionId = ROOT_SESSION): ThinkSession {\n return new ThinkSession(this, id);\n }\n\n /** Submit to the root session and wait for the answer. */\n prompt(\n input: ThinkInput,\n options: ThinkSubmitOptions = {}\n ): Promise<ThinkPromptResponse> {\n return this.session().prompt(input, options);\n }\n\n /** Durably submit to the root session. Resolves before the model runs. */\n submit(\n input: ThinkInput,\n options: ThinkSubmitOptions = {}\n ): Promise<ThinkReceipt> {\n return this.session().submit(input, options);\n }\n\n /** Operations not settled yet, oldest first, in one session or all. */\n async pending(session?: ThinkSessionId): Promise<ThinkPendingOperation[]> {\n await this.lifecycle.ready();\n return this.#tables()\n .open(session)\n .map((op) => ({\n operationId: op.operationId,\n session: op.session,\n status: op.status === \"queued\" ? \"queued\" : \"running\"\n }));\n }\n\n // ── Used by ThinkSession and ThinkSessions ───────────────────────────────\n\n /** @internal */\n async enqueue(\n session: ThinkSessionId,\n input: OperationInput,\n options: ThinkSubmitOptions\n ): Promise<ThinkReceipt> {\n // The shared harness interface lets a caller ask to steer. Refuse it\n // rather than queue it as a follow-up, which is not what was asked.\n const whenBusy: unknown = options.whenBusy;\n if (whenBusy === \"steer\") throw new SteerNotSupportedError(session);\n await this.lifecycle.ready();\n const operationId = options.operationId ?? crypto.randomUUID();\n const store = this.#tables();\n let accepted = false;\n this.lifecycle.storage.transactionSync(() => {\n store.ensureSession(session);\n if (options.clientTools !== undefined) {\n store.setClientTools(session, options.clientTools);\n }\n accepted = store.insert(\n session,\n operationId,\n input,\n options.source ?? \"server\"\n );\n });\n if (accepted) {\n this.#events.emit(session, {\n type: \"operation\",\n status: { operationId, status: \"queued\" }\n });\n }\n // The wake first, so a job is due before anything runs; then run now\n // rather than waiting for the alarm.\n await this.#wake(session);\n this.#ensureDrive(session);\n return { operationId, session, accepted };\n }\n\n /** @internal Stop one operation, or everything open in a session. */\n async abort(session: ThinkSessionId, operationId?: string): Promise<boolean> {\n await this.lifecycle.ready();\n const store = this.#tables();\n const targets =\n operationId === undefined\n ? store.open(session)\n : [store.get(session, operationId)].filter(\n (op): op is OperationRecord =>\n op !== undefined &&\n (op.status === \"queued\" || op.status === \"running\")\n );\n for (const op of targets) {\n const live = this.#live.get(session);\n if (live?.operationId === op.operationId) {\n live.abort.abort();\n } else if (op.status === \"queued\") {\n store.settle(session, op.operationId, {\n status: \"unanswered\",\n reason: \"withdrawn\"\n });\n await this.#settled(session, op.operationId);\n } else {\n // Running, but not in this isolate: an eviction left it for the wake.\n await this.#abandon(op, \"aborted\");\n }\n }\n return targets.length > 0;\n }\n\n /** @internal Wait for an operation to settle. */\n async wait(\n session: ThinkSessionId,\n operationId: string,\n signal?: AbortSignal\n ): Promise<ThinkOperationResult> {\n await this.lifecycle.ready();\n for (;;) {\n const op = this.#tables().get(session, operationId);\n if (!op) {\n return {\n operationId,\n session,\n status: \"unanswered\",\n reason: \"not_found\"\n };\n }\n if (op.status === \"done\" || op.status === \"unanswered\") {\n return this.#result(op);\n }\n await new Promise<void>((resolveWait, reject) => {\n if (signal?.aborted) {\n reject(signal.reason);\n return;\n }\n const key = waiterKey(session, operationId);\n const waiters = this.#waiters.get(key) ?? new Set();\n this.#waiters.set(key, waiters);\n const done = () => {\n signal?.removeEventListener(\"abort\", aborted);\n resolveWait();\n };\n const aborted = () => {\n waiters.delete(done);\n reject(signal?.reason);\n };\n waiters.add(done);\n signal?.addEventListener(\"abort\", aborted, { once: true });\n });\n }\n }\n\n /** @internal */\n async inspect(\n session: ThinkSessionId,\n operationId: string\n ): Promise<ThinkOperationStatus | undefined> {\n await this.lifecycle.ready();\n const op = this.#tables().get(session, operationId);\n if (!op) return undefined;\n switch (op.status) {\n case \"queued\":\n case \"running\":\n return { operationId, session, status: op.status };\n case \"done\":\n case \"unanswered\":\n return this.#result(op);\n }\n }\n\n /** @internal The active transcript of a session. */\n async messages(session: ThinkSessionId): Promise<UIMessage[]> {\n return asUIMessages(await this.#handle(session).getHistory());\n }\n\n /** @internal Abort everything in a session and clear its transcript. */\n async reset(session: ThinkSessionId, handoff?: string): Promise<void> {\n await this.abort(session);\n await this.#drives.get(session);\n const handle = this.#handle(session);\n this.#ownClears.set(session, (this.#ownClears.get(session) ?? 0) + 1);\n try {\n await handle.clearMessages();\n } finally {\n const left = (this.#ownClears.get(session) ?? 1) - 1;\n if (left === 0) this.#ownClears.delete(session);\n else this.#ownClears.set(session, left);\n }\n this.#tables().deleteSettled(session);\n this.#events.emit(session, { type: \"reset\" });\n if (handoff) {\n const note: UIMessage = {\n id: crypto.randomUUID(),\n role: \"system\",\n parts: [{ type: \"text\", text: handoff }]\n };\n const release = this.#markOwn(session, [note.id]);\n try {\n await handle.appendMessage(asSessionMessage(note));\n } finally {\n release();\n }\n this.#events.emit(session, { type: \"message\", message: note });\n }\n }\n\n /** @internal */\n subscribe(session: ThinkSessionId, listener: ThinkSessionListener) {\n return this.#events.subscribe(session, listener);\n }\n\n /** @internal The shared harness interface's watch. */\n async watch(session: ThinkSessionId): Promise<SessionWatch> {\n await this.lifecycle.ready();\n let watcher: Watcher | undefined;\n const early: SessionEvent[][] = [];\n // Listen before reading, so nothing that happens during the read is\n // lost; a message read and then re-sent only replaces itself.\n const unsubscribe = this.#events.subscribe(session, (event) => {\n const events = toSessionEvents(event);\n if (watcher) watcher.push(events);\n else early.push(events);\n });\n const live = this.#live.get(session);\n const partial = live ? [...live.partial] : this.#recoverableChunks(session);\n const messages = await this.messages(session);\n const open = this.#tables().open(session);\n const running = open.find((op) => op.status === \"running\");\n const state: SessionState = {\n messages: messages.map((message) => toTranscriptMessage(message)),\n pending: open.map((op) => ({\n operationId: op.operationId,\n status: op.status === \"queued\" ? \"queued\" : \"placed\"\n })),\n ...(running && {\n run: {\n operations: [running.operationId],\n ...(partial.length > 0 && {\n partial: partial.flatMap((chunk) => {\n const converted = toResponseChunk(chunk, {});\n return converted ? [converted] : [];\n })\n })\n }\n })\n };\n watcher = new Watcher(state, unsubscribe);\n for (const events of early) watcher.push(events);\n return watcher;\n }\n\n /** @internal The running operation and its model call's chunks so far. */\n async inFlight(session: ThinkSessionId): Promise<ThinkInFlight | undefined> {\n await this.lifecycle.ready();\n const running = this.#tables()\n .open(session)\n .find((op) => op.status === \"running\");\n if (!running) return undefined;\n const live = this.#live.get(session);\n if (live?.operationId === running.operationId) {\n return {\n operationId: running.operationId,\n continuation: live.continues,\n chunks: [...live.partial]\n };\n }\n // Left by an eviction: the stream holds what was durable.\n return {\n operationId: running.operationId,\n continuation: (await this.#message(running)) !== undefined,\n chunks: running.streamId ? this.#streamChunks(running.streamId) : []\n };\n }\n\n /**\n * Listen to every session's events, for a host that serves several\n * sessions over one set of connections. Returns the unsubscribe.\n */\n observe(listener: ThinkHarnessListener): () => void {\n return this.#events.observe(listener);\n }\n\n /** @internal */\n async createSession(parent?: ThinkSessionId): Promise<ThinkSession> {\n await this.lifecycle.ready();\n const id = crypto.randomUUID();\n this.#tables().ensureSession(id, parent);\n return this.session(id);\n }\n\n /** @internal Copy a session's active path into a new session. */\n async fork(from: ThinkSessionId): Promise<ThinkSession> {\n const source = this.#handle(from);\n const rows = await source.getHistoryRowStats();\n const fork = await this.createSession(from);\n const target = this.#handle(fork.id);\n let parentId: string | null = null;\n for (const row of rows) {\n const message = await source.getMessage(row.id);\n if (!message) continue;\n await target.appendMessage(message, { parentId });\n parentId = message.id;\n }\n return fork;\n }\n\n /** @internal */\n async listSessions(): Promise<ThinkSessionInfo[]> {\n await this.lifecycle.ready();\n const store = this.#tables();\n const busy = new Set(store.open().map((op) => op.session));\n return store.sessions().map((record) => ({\n id: record.id,\n ...(record.parent !== undefined && { parent: record.parent }),\n busy: busy.has(record.id)\n }));\n }\n\n // ── The wake ─────────────────────────────────────────────────────────────\n\n /** Schedule the session's wake job, now or at `time`. */\n #wake(session: ThinkSessionId, time = Date.now()): Promise<unknown> {\n // A push made while the job is dispatching supersedes that dispatch's\n // outcome, so a submit is never lost to a wake that is completing.\n return this.lifecycle.jobs.push({\n id: wakeJobId(session),\n fn: WAKE_FN,\n time,\n payload: { session },\n singleflight: true,\n recoveryLoop: true\n });\n }\n\n /**\n * One run of a session's wake job. With work open, it makes sure a drive\n * is running and keeps a heartbeat; with none, it completes.\n */\n #wakeStep(session: ThinkSessionId): LifecycleJobOutcome {\n const heartbeat = { rescheduleAt: Date.now() + this.#heartbeatMs };\n if (this.#drives.has(session)) return heartbeat;\n if (this.#tables().open(session).length === 0) return undefined;\n const drive = this.#ensureDrive(session);\n // The drive runs past this dispatch, inside the alarm's work, so a\n // memory-limit reset during it counts against the job's breaker.\n this.lifecycle.trackAlarmWork(drive);\n return heartbeat;\n }\n\n /** Run the session's open operations in order, unless already running. */\n #ensureDrive(session: ThinkSessionId): Promise<void> {\n const running = this.#drives.get(session);\n if (running) return running;\n let wakeAt: number | undefined;\n const drive = (async () => {\n try {\n await this.lifecycle.runInHostContext(async () => {\n for (;;) {\n const op = this.#tables().open(session)[0];\n if (!op) return;\n const outcome = await this.#run(op);\n if (outcome.retryAt !== undefined) {\n wakeAt = outcome.retryAt;\n return;\n }\n }\n });\n } catch (error) {\n // The harness's own storage failed. The heartbeat tries again.\n console.error(\"ThinkHarness drive failed\", error);\n wakeAt = Date.now() + this.#heartbeatMs;\n } finally {\n this.#drives.delete(session);\n }\n // Re-check now (or at the backoff), so the job completes as soon as\n // the session has nothing left.\n await this.#wake(session, wakeAt);\n })();\n this.#drives.set(session, drive);\n return drive;\n }\n\n // ── Running one operation ────────────────────────────────────────────────\n\n async #run(first: OperationRecord): Promise<RunOutcome> {\n const { session, operationId } = first;\n const live: LiveRun = {\n operationId,\n abort: new AbortController(),\n partial: [],\n continues: false\n };\n this.#live.set(session, live);\n try {\n let op: OperationRecord | undefined = first;\n if (op.status === \"queued\") {\n op = await this.#place(op);\n if (!op) return {};\n }\n const continuation = (await this.#message(op)) !== undefined;\n this.#events.emit(session, {\n type: \"run-start\",\n operationId,\n continuation\n });\n try {\n return await this.#steps(session, operationId, live);\n } finally {\n this.#events.emit(session, { type: \"run-end\", operationId });\n }\n } catch (error) {\n console.error(`ThinkHarness operation ${operationId} failed`, error);\n const op = this.#tables().get(session, operationId);\n if (op && (op.status === \"running\" || op.status === \"queued\")) {\n await this.#abandon(op, errorText(error));\n }\n return {};\n } finally {\n this.#live.delete(session);\n }\n }\n\n async #steps(\n session: ThinkSessionId,\n operationId: string,\n live: LiveRun\n ): Promise<RunOutcome> {\n const maxSteps = this.#options.maxSteps ?? DEFAULT_MAX_STEPS;\n for (;;) {\n const op = this.#tables().get(session, operationId);\n if (!op || op.status !== \"running\") return {};\n if (live.abort.signal.aborted) {\n await this.#abandon(op, \"aborted\");\n return {};\n }\n if (op.abandonReason !== undefined) {\n await this.#abandon(op, op.abandonReason);\n return {};\n }\n const message = await this.#message(op);\n const tools = await this.#tools(session);\n const action = nextAction(\n op,\n message,\n (name) => isServerTool(tools, name),\n maxSteps\n );\n switch (action._tag) {\n case \"recover-model\": {\n const outcome = await this.#recoverModel(op, message);\n if (outcome) return outcome;\n break;\n }\n case \"call-model\": {\n const outcome = await this.#callModel(op, message, tools, live);\n if (outcome) return outcome;\n break;\n }\n case \"run-tools\":\n if (!message) return {};\n await this.#runTools(op, message, action.calls, tools, live);\n break;\n case \"await-input\":\n case \"end\":\n await this.#commit(session, undefined, () => {\n this.#tables().settle(session, operationId, {\n status: \"done\",\n text: textOf(message)\n });\n });\n await this.#settled(session, operationId, message);\n return {};\n }\n }\n }\n\n /**\n * Place a queued operation: write what it brings to the transcript and\n * mark it running, in one transaction. Returns the running operation, or\n * undefined when placing settled it.\n */\n async #place(op: OperationRecord): Promise<OperationRecord | undefined> {\n const { session, operationId } = op;\n const store = this.#tables();\n const handle = this.#handle(session);\n const input = op.input;\n const placed: UIMessage[] = [];\n let settledText: string | undefined;\n let unanswered: string | undefined;\n\n const running = (change: {\n readonly parentId?: string;\n readonly messageId: string;\n }) =>\n store.start(session, operationId, {\n parentId: change.parentId ?? null,\n messageId: change.messageId,\n pendingModel: true\n });\n\n switch (input.kind) {\n case \"messages\": {\n let messages = input.messages;\n if (op.source === \"client\") {\n // Untrusted input may only add user messages. It may not rewrite\n // a stored message, even one off the active path, by reusing its\n // id: those are dropped.\n if (messages.some((message) => message.role !== \"user\")) {\n unanswered = \"client_role\";\n break;\n }\n const fresh: UIMessage[] = [];\n for (const message of messages) {\n if (!(await handle.getMessage(message.id))) fresh.push(message);\n }\n messages = fresh;\n }\n const last = messages.at(-1);\n if (!last) {\n unanswered = \"empty\";\n break;\n }\n await this.#commit(session, undefined, (put) => {\n let parentId: string | undefined;\n for (const message of messages) {\n put(message, { parentId, source: op.source });\n parentId = message.id;\n placed.push(message);\n }\n running({ parentId: last.id, messageId: crypto.randomUUID() });\n });\n break;\n }\n case \"answer\": {\n const history = asUIMessages(await handle.getHistory());\n const tools = await this.#tools(session);\n const answer = input.answer;\n if (answer.type === \"tool-result\" && op.source === \"client\") {\n // A client answers only its own tools. A server tool's result\n // comes from running it, under its approval policy.\n const call = history\n .flatMap((message) => message.parts)\n .find(\n (part): part is ToolCallPart =>\n isToolCallPart(part) && part.toolCallId === answer.toolCallId\n );\n if (call && isServerTool(tools, toolNameOf(call))) {\n unanswered = \"not_client_tool\";\n break;\n }\n }\n const answered = answerToolCall(history, toolCallAnswer(answer));\n if (!answered) {\n unanswered = \"not_waiting\";\n break;\n }\n const latest = history.at(-1);\n const continues =\n input.autoContinue &&\n latest?.id === answered.id &&\n nextAction(\n { streamId: undefined, pendingModel: true, steps: 0 },\n answered,\n (name) => isServerTool(tools, name),\n Number.POSITIVE_INFINITY\n )._tag !== \"await-input\";\n await this.#commit(session, undefined, (put) => {\n put(answered);\n placed.push(answered);\n if (continues) running({ messageId: answered.id });\n else {\n store.settle(session, operationId, {\n status: \"done\",\n text: textOf(answered)\n });\n }\n });\n if (!continues) settledText = textOf(answered);\n break;\n }\n case \"regenerate\": {\n const history = asUIMessages(await handle.getHistory());\n const target =\n input.messageId ??\n [...history].reverse().find((message) => message.role === \"user\")?.id;\n if (!target || !(await handle.getMessage(target))) {\n unanswered = \"not_found\";\n break;\n }\n await this.#commit(session, undefined, () =>\n running({ parentId: target, messageId: crypto.randomUUID() })\n );\n break;\n }\n case \"continue\": {\n const latest = await handle.getLatestLeaf();\n if (!latest) {\n unanswered = \"not_found\";\n break;\n }\n await this.#commit(session, undefined, () =>\n latest.role === \"assistant\"\n ? running({ messageId: latest.id })\n : running({ parentId: latest.id, messageId: crypto.randomUUID() })\n );\n break;\n }\n }\n\n for (const message of placed) {\n this.#events.emit(session, { type: \"message\", message, operationId });\n }\n if (unanswered !== undefined) {\n store.settle(session, operationId, {\n status: \"unanswered\",\n reason: unanswered\n });\n await this.#settled(session, operationId);\n return undefined;\n }\n if (settledText !== undefined) {\n await this.#settled(session, operationId);\n return undefined;\n }\n this.#events.emit(session, {\n type: \"operation\",\n status: { operationId, status: \"placed\" }\n });\n return store.get(session, operationId);\n }\n\n // ── Model calls ──────────────────────────────────────────────────────────\n\n /**\n * One model call. Its chunks go to a stream as they arrive; when it ends,\n * the message is persisted and the stream discarded in one transaction.\n * Returns an outcome only when the operation must wait.\n */\n async #callModel(\n op: OperationRecord,\n existing: UIMessage | undefined,\n tools: ToolSet,\n live: LiveRun\n ): Promise<RunOutcome | undefined> {\n const { session, operationId } = op;\n const messageId = op.messageId ?? crypto.randomUUID();\n const hooks = this.#options.hooks;\n const handle = this.#handle(session);\n const history = asUIMessages(\n await handle.getHistory({ leafId: existing ? existing.id : op.parentId })\n );\n const system = await resolve(this.#options.system, session);\n const config =\n (await hooks?.beforeTurn?.({\n session,\n operationId,\n step: op.steps,\n continuation: existing !== undefined,\n messages: history,\n system,\n tools: Object.keys(tools)\n })) ?? {};\n const model = config.model ?? (await resolve(this.#options.model, session));\n if (model === undefined) throw new Error(\"ThinkHarness has no model\");\n const offered = modelTools(tools, config.activeTools);\n const effectiveSystem = config.system ?? system;\n const messages: ModelMessage[] =\n config.messages ??\n (await convertToModelMessages(history, {\n tools,\n ignoreIncompleteToolCalls: true\n }));\n\n // The stream id is durable before the stream exists, so an eviction at\n // any point leaves evidence the next wake recovers from.\n const streamId = `think:${crypto.randomUUID()}`;\n this.#tables().update(session, operationId, { streamId, messageId });\n const writer = await this.#streams.open(streamId, {\n tag: streamTag(session, operationId),\n metadata: { session, operationId, messageId }\n });\n\n const stall = new AbortController();\n const signal = AbortSignal.any([live.abort.signal, stall.signal]);\n let modelError: unknown;\n let final: UIMessage | undefined;\n let finishReason: string | undefined;\n let caught: unknown;\n live.partial = [];\n live.continues = existing !== undefined;\n let segment: UIMessageChunk[] = [];\n let segmentBytes = 0;\n // Chunks are written in segments, for fewer storage writes, but never\n // held longer than FLUSH_AFTER_MS: what a client has seen should be\n // what recovery finds after an eviction.\n let flushTimer: ReturnType<typeof setTimeout> | undefined;\n const flush = () => {\n if (flushTimer !== undefined) clearTimeout(flushTimer);\n flushTimer = undefined;\n if (segment.length === 0) return;\n // SAFETY: UI message chunks are JSON by the AI SDK's contract.\n writer.append(segment as unknown as StreamJson);\n segment = [];\n segmentBytes = 0;\n };\n\n try {\n const result = streamText({\n model,\n ...(effectiveSystem !== undefined && { system: effectiveSystem }),\n messages,\n tools: offered,\n ...(config.toolChoice !== undefined && {\n toolChoice: config.toolChoice\n }),\n ...(config.providerOptions !== undefined && {\n providerOptions: config.providerOptions\n }),\n ...(config.maxOutputTokens !== undefined && {\n maxOutputTokens: config.maxOutputTokens\n }),\n ...(config.temperature !== undefined && {\n temperature: config.temperature\n }),\n stopWhen: stepCountIs(1),\n abortSignal: signal,\n onError: ({ error }) => {\n modelError ??= error;\n }\n });\n const stream = toUIMessageStream({\n stream: result.stream,\n tools: offered,\n // Only a continuation passes the transcript: the AI SDK continues\n // the last message when it is the assistant's, which a new answer\n // must not do (the last message may be a compaction summary).\n originalMessages: existing ? history : [],\n generateMessageId: () => messageId,\n onEnd: ({ responseMessage }) => {\n final = responseMessage;\n }\n });\n const stallTimeoutMs =\n this.#options.recovery?.stallTimeoutMs ?? DEFAULT_STALL_TIMEOUT_MS;\n for await (const chunk of untilAborted(\n iterateWithStallWatchdog(stream, stallTimeoutMs, () =>\n stall.abort(new ChatStreamStalledError(\"Model stream stalled\"))\n ),\n live.abort.signal\n )) {\n if (chunk.type === \"finish\") finishReason = chunk.finishReason;\n live.partial.push(chunk);\n segment.push(chunk);\n segmentBytes += JSON.stringify(chunk).length;\n if (\n segment.length >= SEGMENT_CHUNKS ||\n segmentBytes >= SEGMENT_MAX_BYTES\n ) {\n flush();\n } else {\n flushTimer ??= setTimeout(flush, FLUSH_AFTER_MS);\n }\n this.#events.emit(session, { type: \"chunk\", operationId, chunk });\n if (hooks?.onChunk) {\n try {\n hooks.onChunk({ session, operationId, chunk });\n } catch (error) {\n console.error(\"ThinkHarness onChunk hook failed\", error);\n }\n }\n }\n } catch (error) {\n caught = error;\n }\n flush();\n\n const message = final ?? accumulate(messageId, existing, live.partial);\n const partial = message ? settledPartial(message) : undefined;\n const keep = partial && hasContent(partial) ? partial : undefined;\n const stalled =\n caught instanceof ChatStreamStalledError || stall.signal.aborted;\n const failure = stalled ? undefined : (modelError ?? caught);\n\n if (live.abort.signal.aborted) {\n await this.#commit(session, streamId, (put) => {\n if (keep) put(keep, { parentId: op.parentId });\n this.#tables().settle(\n session,\n operationId,\n { status: \"unanswered\", reason: \"aborted\" },\n { streamId: null }\n );\n });\n await this.#settled(session, operationId, keep);\n return {};\n }\n\n if (stalled || failure !== undefined) {\n if (failure !== undefined) {\n try {\n await hooks?.onError?.(failure, { session, operationId });\n } catch (error) {\n console.error(\"ThinkHarness onError hook failed\", error);\n }\n }\n const kind = stalled\n ? \"retry\"\n : (hooks?.classifyError?.(failure) ?? \"fail\");\n if (\n kind === \"context-overflow\" &&\n op.overflowRetries < MAX_OVERFLOW_RETRIES\n ) {\n await this.#commit(session, streamId, (put) => {\n if (keep) put(keep, { parentId: op.parentId });\n this.#tables().update(session, operationId, {\n streamId: null,\n overflowRetries: op.overflowRetries + 1\n });\n });\n try {\n await handle.compact();\n } catch (error) {\n console.warn(\"ThinkHarness could not compact the session\", error);\n }\n return undefined;\n }\n if (kind === \"retry\") {\n return this.#interrupted(op, streamId, keep);\n }\n await this.#commit(session, streamId, (put) => {\n if (keep) put(keep, { parentId: op.parentId });\n this.#tables().settle(\n session,\n operationId,\n { status: \"unanswered\", reason: errorText(failure) },\n { streamId: null }\n );\n });\n await this.#settled(session, operationId, keep);\n return {};\n }\n\n if (!message) throw new Error(\"The model call produced no message\");\n const toolCalls = lastStep(message).some(\n (part) => isToolCallPart(part) && !part.providerExecuted\n );\n await this.#commit(session, streamId, (put) => {\n put(message, { parentId: op.parentId });\n this.#tables().update(session, operationId, {\n streamId: null,\n steps: op.steps + 1,\n interruptions: 0,\n pendingModel: toolCalls\n });\n });\n live.partial = [];\n live.continues = true;\n this.#events.emit(session, { type: \"message\", message, operationId });\n await hooks?.onStepFinish?.({\n session,\n operationId,\n step: op.steps,\n message,\n finishReason\n });\n return undefined;\n }\n\n /**\n * A model call an eviction cut short: keep what it produced, then call\n * the model again to continue the same message, within the budget.\n */\n async #recoverModel(\n op: OperationRecord,\n existing: UIMessage | undefined\n ): Promise<RunOutcome | undefined> {\n const streamId = op.streamId;\n if (streamId === undefined) return undefined;\n const chunks = this.#streamChunks(streamId);\n const rebuilt =\n chunks.length > 0\n ? accumulate(op.messageId ?? crypto.randomUUID(), existing, chunks)\n : undefined;\n const partial = rebuilt ? settledPartial(rebuilt) : undefined;\n const keep = partial && hasContent(partial) ? partial : undefined;\n return this.#interrupted(op, streamId, keep);\n }\n\n /** Count an interruption, keep the partial, and decide whether to go on. */\n async #interrupted(\n op: OperationRecord,\n streamId: string,\n partial: UIMessage | undefined\n ): Promise<RunOutcome | undefined> {\n const { session, operationId } = op;\n const recovery = this.#options.recovery;\n const attempt = op.interruptions + 1;\n const maxAttempts = recovery?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;\n let decision: \"continue\" | \"abandon\" =\n attempt > maxAttempts ? \"abandon\" : \"continue\";\n if (decision === \"continue\" && this.#options.hooks?.onRecovery) {\n decision = await this.#options.hooks.onRecovery({\n session,\n operationId,\n attempt,\n partial\n });\n }\n await this.#commit(session, streamId, (put) => {\n if (partial) put(partial, { parentId: op.parentId });\n const progress = { streamId: null, interruptions: attempt };\n if (decision === \"abandon\") {\n this.#tables().settle(\n session,\n operationId,\n { status: \"unanswered\", reason: \"interrupted\" },\n progress\n );\n } else {\n this.#tables().update(session, operationId, progress);\n }\n });\n if (partial) {\n this.#events.emit(session, {\n type: \"message\",\n message: partial,\n operationId\n });\n }\n if (decision === \"abandon\") {\n await this.#settled(session, operationId, partial);\n return {};\n }\n const delay = backoff(attempt, recovery?.backoffMs ?? DEFAULT_BACKOFF_MS);\n return delay > 0 ? { retryAt: Date.now() + delay } : undefined;\n }\n\n // ── Tool calls ───────────────────────────────────────────────────────────\n\n async #runTools(\n op: OperationRecord,\n message: UIMessage,\n calls: readonly ToolCallPart[],\n tools: ToolSet,\n live: LiveRun\n ): Promise<void> {\n const { session, operationId } = op;\n const store = this.#tables();\n const hooks = this.#options.hooks;\n const history = asUIMessages(\n await this.#handle(session).getHistory({ leafId: message.id })\n );\n const modelMessages = await convertToModelMessages(history.slice(0, -1), {\n tools,\n ignoreIncompleteToolCalls: true\n });\n // The drive owns this message while it runs tools; every completion\n // updates this copy and persists it whole.\n let current = message;\n\n const toRun: ToolCallPart[] = [];\n const approvals: string[] = [];\n for (const call of calls) {\n const toolName = toolNameOf(call);\n const tool = tools[toolName];\n if (!tool) continue;\n if (call.state === \"input-available\") {\n const needsApproval =\n (await this.#options.toolApproval?.({\n session,\n toolName,\n toolCallId: call.toolCallId,\n input: call.input\n })) ||\n (await toolNeedsApproval(tool, call.input, {\n toolCallId: call.toolCallId,\n messages: modelMessages\n }));\n if (needsApproval) {\n approvals.push(call.toolCallId);\n continue;\n }\n }\n toRun.push(call);\n }\n if (approvals.length > 0) {\n for (const toolCallId of approvals) {\n current = withToolPart(\n current,\n toolCallId,\n (part) =>\n // SAFETY: the new state is set with exactly the fields it requires.\n ({\n ...part,\n state: \"approval-requested\",\n approval: { id: `approval:${toolCallId}` }\n }) as ToolCallPart\n );\n }\n const snapshot = current;\n await this.#commit(session, undefined, (put) => put(snapshot));\n this.#events.emit(session, {\n type: \"message\",\n message: snapshot,\n operationId\n });\n }\n\n await Promise.all(\n toRun.map(async (call) => {\n const toolName = toolNameOf(call);\n const tool = tools[toolName];\n if (!tool) return;\n const { toolCallId } = call;\n const started = store.toolCall(session, toolCallId);\n let outcome: ToolOutcome | undefined;\n if (started) {\n // Started before, with no result in the transcript: an eviction\n // cut it short.\n const policy = toolRecovery(tool);\n const maxAttempts =\n this.#options.recovery?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;\n if (policy === \"report\" || started.attempts >= maxAttempts) {\n outcome = { ok: false, errorText: INTERRUPTED_TOOL_ERROR };\n }\n }\n let attempt = started?.attempts ?? 0;\n let input: unknown = call.input;\n if (!outcome) {\n attempt = store.startToolCall(session, toolCallId, operationId);\n const decision = await hooks?.beforeToolCall?.({\n session,\n operationId,\n toolCallId,\n toolName,\n input,\n attempt\n });\n if (decision?.action === \"block\") {\n outcome = { ok: false, errorText: decision.reason };\n } else if (decision?.action === \"substitute\") {\n outcome = { ok: true, output: decision.output };\n } else {\n if (decision?.action === \"run\" && decision.input !== undefined) {\n input = decision.input;\n }\n outcome = await executeTool(tool, input, {\n toolCallId,\n messages: modelMessages,\n abortSignal: live.abort.signal,\n onPreliminary: (output) =>\n this.#events.emit(session, {\n type: \"chunk\",\n operationId,\n chunk: {\n type: \"tool-output-available\",\n toolCallId,\n output,\n preliminary: true\n }\n })\n });\n }\n }\n const settled = outcome;\n await hooks?.afterToolCall?.({\n session,\n operationId,\n toolCallId,\n toolName,\n input,\n attempt,\n ...settled\n });\n current = withToolPart(current, toolCallId, (part) =>\n withOutcome(part, settled)\n );\n const snapshot = current;\n await this.#commit(session, undefined, (put) => {\n put(snapshot);\n store.finishToolCall(session, toolCallId);\n store.update(session, operationId, { interruptions: 0 });\n });\n this.#events.emit(session, {\n type: \"chunk\",\n operationId,\n chunk: settled.ok\n ? {\n type: \"tool-output-available\",\n toolCallId,\n output: settled.output\n }\n : {\n type: \"tool-output-error\",\n toolCallId,\n errorText: settled.errorText\n }\n });\n this.#events.emit(session, {\n type: \"message\",\n message: snapshot,\n operationId\n });\n })\n );\n }\n\n // ── Settling ─────────────────────────────────────────────────────────────\n\n /**\n * End an operation that cannot run on: keep what its interrupted model\n * call produced, mark any tool call it left open as failed, and settle\n * it `unanswered`.\n */\n async #abandon(op: OperationRecord, reason: string): Promise<void> {\n const { session, operationId } = op;\n const existing = await this.#message(op);\n let message = existing;\n const chunks =\n op.streamId === undefined ? [] : this.#streamChunks(op.streamId);\n if (chunks.length > 0) {\n const rebuilt = accumulate(\n op.messageId ?? crypto.randomUUID(),\n existing,\n chunks\n );\n if (rebuilt) message = settledPartial(rebuilt);\n }\n if (message) {\n for (const part of lastStep(message)) {\n if (\n isToolCallPart(part) &&\n !part.providerExecuted &&\n (part.state === \"input-available\" ||\n part.state === \"approval-responded\")\n ) {\n message = withToolPart(message, part.toolCallId, (call) =>\n withOutcome(call, { ok: false, errorText: reason })\n );\n }\n }\n }\n const keep =\n message && hasContent(message) && message !== existing\n ? message\n : undefined;\n await this.#commit(session, op.streamId, (put) => {\n if (keep) put(keep, { parentId: op.parentId });\n this.#tables().settle(\n session,\n operationId,\n { status: \"unanswered\", reason },\n { streamId: null }\n );\n });\n if (keep) {\n this.#events.emit(session, {\n type: \"message\",\n message: keep,\n operationId\n });\n }\n await this.#settled(session, operationId, keep ?? existing);\n }\n\n /** Tell everyone an operation settled. Its row is already written. */\n async #settled(\n session: ThinkSessionId,\n operationId: string,\n message?: UIMessage\n ): Promise<void> {\n const op = this.#tables().get(session, operationId);\n if (!op) return;\n const result = this.#result(op);\n this.#events.emit(session, {\n type: \"operation\",\n status:\n result.status === \"done\"\n ? {\n operationId,\n status: \"done\",\n ...(result.text !== undefined && { text: result.text })\n }\n : {\n operationId,\n status: \"unanswered\",\n ...(result.reason !== undefined && { reason: result.reason })\n }\n });\n const key = waiterKey(session, operationId);\n for (const waiter of this.#waiters.get(key) ?? []) waiter();\n this.#waiters.delete(key);\n try {\n await this.#options.hooks?.onTurnEnd?.({\n ...result,\n ...(message && { message })\n });\n } catch (error) {\n console.error(\"ThinkHarness onTurnEnd hook failed\", error);\n }\n }\n\n #result(op: OperationRecord): ThinkOperationResult {\n const { operationId, session } = op;\n return op.status === \"done\"\n ? {\n operationId,\n session,\n status: \"done\",\n text: op.text ?? \"\",\n ...(op.messageId !== undefined && { messageId: op.messageId })\n }\n : {\n operationId,\n session,\n status: \"unanswered\",\n ...(op.reason !== undefined && { reason: op.reason })\n };\n }\n\n // ── Storage ──────────────────────────────────────────────────────────────\n\n #tables(): OperationRecords {\n this.#records ??= new OperationRecords(this.lifecycle.storage);\n return this.#records;\n }\n\n /** The Sessions handle for a session, configured on first use. */\n /**\n * Give the Sessions and Streams the harness owns this capability's\n * Lifecycle services. Done on first use, not only in `onStart`, because an\n * RPC can read a transcript before startup (the read itself then waits\n * for startup).\n */\n #bindOwned(): void {\n if (this.#bound) return;\n bindLifecycleCapability(this.#sessions, this.lifecycle);\n bindLifecycleCapability(this.#streams, this.lifecycle);\n this.#bound = true;\n // Writes made on a session's Sessions handle (from `configureSession`)\n // go around the harness; pass them on as events, so listeners and chat\n // clients see them too. The harness's own writes already emitted theirs.\n this.#sessions.subscribe((change) => {\n const session = change.sessionId;\n switch (change.type) {\n case \"append\":\n case \"update\":\n case \"import\":\n if (this.#takeOwn(session, change.message.id)) return;\n this.#events.emit(session, {\n type: \"message\",\n message: asUIMessage(change.message)\n });\n return;\n case \"clear\":\n if ((this.#ownClears.get(session) ?? 0) > 0) return;\n this.#events.emit(session, { type: \"reset\" });\n return;\n case \"delete\":\n case \"compact\":\n case \"compaction\":\n // No one message describes these: the active path changed.\n this.#events.emit(session, { type: \"transcript\" });\n return;\n }\n });\n }\n\n /** Note messages the harness is about to write; returns the release. */\n #markOwn(session: ThinkSessionId, ids: readonly string[]): () => void {\n let own = this.#ownMessages.get(session);\n if (!own) {\n own = new Map();\n this.#ownMessages.set(session, own);\n }\n for (const id of ids) own.set(id, (own.get(id) ?? 0) + 1);\n return () => {\n const current = this.#ownMessages.get(session);\n if (!current) return;\n for (const id of ids) {\n const left = (current.get(id) ?? 1) - 1;\n if (left <= 0) current.delete(id);\n else current.set(id, left);\n }\n if (current.size === 0) this.#ownMessages.delete(session);\n };\n }\n\n /** Whether a change is one of the harness's own writes; consumes the mark. */\n #takeOwn(session: ThinkSessionId, id: string): boolean {\n const own = this.#ownMessages.get(session);\n const count = own?.get(id);\n if (!own || count === undefined) return false;\n if (count <= 1) own.delete(id);\n else own.set(id, count - 1);\n if (own.size === 0) this.#ownMessages.delete(session);\n return true;\n }\n\n /** @internal The answers to a message: its children in the tree. */\n async branches(\n session: ThinkSessionId,\n messageId: string\n ): Promise<UIMessage[]> {\n return asUIMessages(await this.#handle(session).getBranches(messageId));\n }\n\n /** @internal Full-text search over a session's messages. */\n search(\n session: ThinkSessionId,\n query: string,\n options?: { readonly limit?: number }\n ): Promise<SearchResult[]> {\n return this.#handle(session).search(\n query,\n options?.limit === undefined ? undefined : { limit: options.limit }\n );\n }\n\n /** @internal Compact a session with its compaction function. */\n async compact(session: ThinkSessionId): Promise<CompactResult | null> {\n // The change feed reports the compaction as a transcript event.\n return this.#handle(session).compact();\n }\n\n #handle(session: ThinkSessionId): Session {\n this.#bindOwned();\n const handle = this.#sessions.session(session);\n if (!this.#configured.has(session)) {\n this.#configured.add(session);\n this.#options.configureSession?.(handle, session);\n }\n return handle;\n }\n\n async #message(op: OperationRecord): Promise<UIMessage | undefined> {\n if (op.messageId === undefined) return undefined;\n const message = await this.#handle(op.session).getMessage(op.messageId);\n return message ? asUIMessages([message])[0] : undefined;\n }\n\n async #tools(session: ThinkSessionId): Promise<ToolSet> {\n const tools = (await resolve(this.#options.tools, session)) ?? {};\n const client = createToolsFromClientSchemas(\n this.#tables().clientTools(session)\n );\n // A client cannot replace a server tool: the server's definition, its\n // execute and its approval policy win on a name clash.\n for (const name of Object.keys(client)) {\n if (Object.hasOwn(tools, name)) {\n console.warn(\n `ThinkHarness ignored a client tool named \"${name}\": a server tool has that name`\n );\n }\n }\n return { ...client, ...tools };\n }\n\n /**\n * Persist messages and operation changes in one transaction; with a\n * stream id, the transaction also settles and discards that stream (the\n * cutover), so an eviction leaves either the stream or the message.\n */\n async #commit(\n session: ThinkSessionId,\n streamId: string | undefined,\n writes: (put: Put) => void\n ): Promise<void> {\n const sync = this.#handle(session).__DO_NOT_USE_WILL_BREAK__sync();\n const afters: (() => Promise<void>)[] = [];\n const ids: string[] = [];\n const commit = () => {\n afters.length = 0;\n ids.length = 0;\n writes((message, options = {}) => {\n ids.push(message.id);\n afters.push(\n sync.upsert(asSessionMessage(message), {\n ...(options.parentId !== undefined && {\n parentId: options.parentId\n }),\n source: options.source ?? \"server\"\n }).after\n );\n });\n };\n try {\n const settled =\n streamId !== undefined &&\n this.#streams\n .__DO_NOT_USE_WILL_BREAK__sync()\n .settle(streamId, \"completed\", null, { commit, discard: true });\n if (!settled) this.lifecycle.storage.transactionSync(commit);\n } catch (error) {\n // The transaction rolled back, but the session's caches counted it.\n sync.abandon();\n throw error;\n }\n const release = this.#markOwn(session, ids);\n try {\n for (const after of afters) await after();\n } finally {\n release();\n }\n }\n\n /** Every chunk a stream holds, without waiting for more. */\n #streamChunks(streamId: string): UIMessageChunk[] {\n const streams = this.#streams.__DO_NOT_USE_WILL_BREAK__sync();\n if (!streams.getStream(streamId)) return [];\n const chunks: UIMessageChunk[] = [];\n let from = 0;\n for (;;) {\n const rows = streams.readChunks(streamId, from, READ_PAGE);\n for (const row of rows) {\n // SAFETY: the harness writes each segment as UIMessageChunk[].\n const segment = JSON.parse(row.chunk) as UIMessageChunk[];\n chunks.push(...segment);\n }\n if (rows.length < READ_PAGE) return chunks;\n from = (rows.at(-1)?.seq ?? from) + 1;\n }\n }\n\n /** Chunks an evicted model call left in its stream, for a late watcher. */\n #recoverableChunks(session: ThinkSessionId): UIMessageChunk[] {\n const running = this.#tables()\n .open(session)\n .find((op) => op.status === \"running\");\n return running?.streamId ? this.#streamChunks(running.streamId) : [];\n }\n}\n\n/**\n * Rebuild a message from the chunks of a model call, applied on top of the\n * message as it was before the call.\n */\nfunction accumulate(\n messageId: string,\n existing: UIMessage | undefined,\n chunks: readonly UIMessageChunk[]\n): UIMessage | undefined {\n if (chunks.length === 0) return existing;\n const accumulator = new StreamAccumulator({\n messageId: existing?.id ?? messageId,\n continuation: existing !== undefined,\n ...(existing && {\n existingParts: existing.parts,\n ...(isRecord(existing.metadata) && {\n existingMetadata: existing.metadata\n })\n })\n });\n for (const chunk of chunks) {\n // SAFETY: StreamChunkData is the loose JSON view of a UI message chunk.\n accumulator.applyChunk(chunk as unknown as StreamChunkData);\n }\n const message = accumulator.toMessage();\n return { ...message, role: \"assistant\" };\n}\n\n/**\n * Stop iterating as soon as `signal` aborts, even if the source never\n * notices: a model stream that ignores its abort signal must not hold an\n * aborted turn open.\n */\nasync function* untilAborted<T>(\n source: AsyncIterable<T>,\n signal: AbortSignal\n): AsyncGenerator<T> {\n const iterator = source[Symbol.asyncIterator]();\n let onAbort: () => void = () => {};\n const aborted = new Promise<\"aborted\">((resolveAbort) => {\n onAbort = () => resolveAbort(\"aborted\");\n if (signal.aborted) onAbort();\n else signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n try {\n for (;;) {\n const next = await Promise.race([iterator.next(), aborted]);\n if (next === \"aborted\") {\n // Release the source without waiting on it.\n void iterator.return?.().catch(() => {});\n return;\n }\n if (next.done) return;\n yield next.value;\n }\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n}\n\n/**\n * Classify the context-window overflow errors of common providers\n * (Anthropic, OpenAI, Google, Bedrock, Mistral and others) as\n * `\"context-overflow\"`, and everything else as `\"fail\"`. Pass it as\n * `hooks.classifyError`, or call it from your own classifier.\n *\n * @param error - The model call's error.\n * @returns `\"context-overflow\"` or `\"fail\"`.\n * @experimental\n */\nexport function classifyContextOverflow(error: unknown): ThinkErrorClass {\n let text: string;\n if (error instanceof Error) text = error.message;\n else if (typeof error === \"string\") text = error;\n else {\n try {\n text = JSON.stringify(error);\n } catch {\n text = String(error);\n }\n }\n return CONTEXT_OVERFLOW_PATTERN.test(text) ? \"context-overflow\" : \"fail\";\n}\n\nconst CONTEXT_OVERFLOW_PATTERN =\n /prompt is too long|context[_ ]length[_ ]exceeded|maximum context length|exceeds the maximum number of tokens|input token count|reduce the length of|input is too long|too many (?:input )?tokens|context window/i;\n\n/** A tool's own recovery field, or the default. */\nfunction toolRecovery(tool: object): ToolRecovery {\n return \"recovery\" in tool && tool.recovery === \"rerun\" ? \"rerun\" : \"report\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction backoff(attempt: number, baseMs: number): number {\n if (attempt <= 1) return 0;\n return Math.min(baseMs * 2 ** (attempt - 2), MAX_BACKOFF_MS);\n}\n\nfunction streamTag(session: ThinkSessionId, operationId: string): string {\n return `think:${JSON.stringify([session, operationId])}`;\n}\n\nfunction waiterKey(session: ThinkSessionId, operationId: string): string {\n return JSON.stringify([session, operationId]);\n}\n\n/** Project a session event onto the shared harness interface's events. */\nfunction toSessionEvents(event: ThinkSessionEvent): SessionEvent[] {\n switch (event.type) {\n case \"operation\":\n return [{ type: \"operation\", status: event.status }];\n case \"run-start\":\n return [{ type: \"run-start\", operations: [event.operationId] }];\n case \"run-end\":\n return [{ type: \"run-end\", operations: [event.operationId] }];\n case \"chunk\": {\n const chunk = toResponseChunk(event.chunk, {});\n return chunk ? [{ type: \"chunk\", chunk }] : [];\n }\n case \"message\":\n return [{ type: \"message\", message: toTranscriptMessage(event.message) }];\n case \"reset\":\n return [{ type: \"reset\" }];\n case \"transcript\":\n // The shared interface has no \"re-read\" event; a watch sees the\n // change in its next state.\n return [];\n }\n}\n\n/**\n * One session, addressed through the harness.\n *\n * @experimental\n */\nexport class ThinkSession implements HarnessSession {\n readonly #harness: ThinkHarness;\n /** The session's id. */\n readonly id: ThinkSessionId;\n\n /**\n * @param harness - The harness that owns the session.\n * @param id - The session's id.\n */\n constructor(harness: ThinkHarness, id: ThinkSessionId) {\n this.#harness = harness;\n this.id = id;\n }\n\n /** Durably submit input. Resolves before the model runs. */\n submit(\n input: ThinkInput,\n options: ThinkSubmitOptions = {}\n ): Promise<ThinkReceipt> {\n const operationId = options.operationId ?? crypto.randomUUID();\n return this.#harness.enqueue(\n this.id,\n operationInput(input, operationId, options.autoContinue ?? true),\n { ...options, operationId }\n );\n }\n\n /** Submit and wait for the answer and the updated transcript. */\n async prompt(\n input: ThinkInput,\n options: ThinkSubmitOptions = {}\n ): Promise<ThinkPromptResponse> {\n const receipt = await this.submit(input, options);\n const result = await this.wait(receipt.operationId);\n return { ...result, messages: await this.messages() };\n }\n\n /**\n * Answer a user message again. The new answer is a branch beside the\n * earlier ones, which `Session.getBranches()` still reads.\n *\n * @param messageId - The user message. Default: the latest one.\n */\n regenerate(\n messageId?: string,\n options: Pick<ThinkSubmitOptions, \"operationId\"> = {}\n ): Promise<ThinkReceipt> {\n return this.#harness.enqueue(\n this.id,\n { kind: \"regenerate\", ...(messageId !== undefined && { messageId }) },\n options\n );\n }\n\n /** Call the model again to continue the latest message. */\n continue(\n options: Pick<ThinkSubmitOptions, \"operationId\"> = {}\n ): Promise<ThinkReceipt> {\n return this.#harness.enqueue(this.id, { kind: \"continue\" }, options);\n }\n\n /** Wait for an operation to settle. Aborting `signal` stops only the wait. */\n wait(\n operationId: string,\n signal?: AbortSignal\n ): Promise<ThinkOperationResult> {\n return this.#harness.wait(this.id, operationId, signal);\n }\n\n /**\n * Withdraw one queued operation or abort it while it runs; with no id,\n * everything open in the session.\n */\n abort(operationId?: string): Promise<boolean> {\n return this.#harness.abort(this.id, operationId);\n }\n\n /** Abort everything and clear the transcript, optionally leaving a note. */\n reset(handoff?: string): Promise<void> {\n return this.#harness.reset(this.id, handoff);\n }\n\n /** The active transcript. */\n messages(): Promise<UIMessage[]> {\n return this.#harness.messages(this.id);\n }\n\n /** Operations not settled yet, oldest first. */\n pending(): Promise<ThinkPendingOperation[]> {\n return this.#harness.pending(this.id);\n }\n\n /**\n * The running operation, with the chunks its model call has streamed so\n * far, including those an eviction left behind. Send them, then\n * `subscribe()`'s chunk events, to a client that joins mid-turn.\n */\n inFlight(): Promise<ThinkInFlight | undefined> {\n return this.#harness.inFlight(this.id);\n }\n\n /**\n * The answers to a message: its children in the transcript tree. A\n * regenerated answer is a branch beside the earlier ones.\n *\n * @param messageId - The message, usually a user message.\n */\n branches(messageId: string): Promise<UIMessage[]> {\n return this.#harness.branches(this.id, messageId);\n }\n\n /** Full-text search over this session's messages. */\n search(\n query: string,\n options?: { readonly limit?: number }\n ): Promise<SearchResult[]> {\n return this.#harness.search(this.id, query, options);\n }\n\n /**\n * Summarize older messages with the compaction function set in\n * `configureSession`. Resolves to null when there was nothing to compact.\n */\n compact(): Promise<CompactResult | null> {\n return this.#harness.compact(this.id);\n }\n\n /** Listen to the session's events in the AI SDK's vocabulary. */\n subscribe(listener: ThinkSessionListener): () => void {\n return this.#harness.subscribe(this.id, listener);\n }\n\n /** The shared harness interface's watch: the state, then every change. */\n watch(): Promise<SessionWatch> {\n return this.#harness.watch(this.id);\n }\n\n /**\n * Submit input and stream its answer to `callback`, as Think's `chat()`\n * does: `onStart`, then `onEvent` with each UI chunk as JSON, then\n * `onDone` or `onError`. Works over RPC with an `RpcTarget` callback.\n *\n * The callback lives in memory. If the object is evicted mid-turn the\n * turn still finishes, but the callback is gone; a caller that must not\n * lose the answer should `wait()` on the receipt as well.\n */\n async chat(\n input: ThinkInput,\n callback: ThinkStreamCallback,\n options: ThinkSubmitOptions = {}\n ): Promise<ThinkOperationResult> {\n const operationId = options.operationId ?? crypto.randomUUID();\n let delivered = Promise.resolve();\n const deliver = (fn: () => void | Promise<void>) => {\n delivered = delivered.then(fn).catch((error: unknown) => {\n console.error(\"ThinkHarness chat callback failed\", error);\n });\n };\n const unsubscribe = this.subscribe((event) => {\n if (event.type === \"chunk\" && event.operationId === operationId) {\n deliver(() => callback.onEvent(JSON.stringify(event.chunk)));\n }\n });\n try {\n const receipt = await this.submit(input, { ...options, operationId });\n deliver(() => callback.onStart?.({ operationId: receipt.operationId }));\n const result = await this.wait(receipt.operationId);\n unsubscribe();\n await delivered;\n if (result.status === \"done\") await callback.onDone();\n else await callback.onError(result.reason ?? \"unanswered\");\n return result;\n } finally {\n unsubscribe();\n }\n }\n\n /** One operation's status, or undefined when the id is unknown. */\n inspect(operationId: string): Promise<ThinkOperationStatus | undefined> {\n return this.#harness.inspect(this.id, operationId);\n }\n\n /** Whether the session has open work. */\n async busy(): Promise<boolean> {\n return (await this.pending()).length > 0;\n }\n}\n\n/**\n * Every session in this object.\n *\n * @experimental\n */\nexport class ThinkSessions implements HarnessSessions {\n readonly #harness: ThinkHarness;\n\n /** @param harness - The harness that owns the sessions. */\n constructor(harness: ThinkHarness) {\n this.#harness = harness;\n }\n\n /** A handle on one session. */\n get(id: ThinkSessionId): ThinkSession {\n return this.#harness.session(id);\n }\n\n /** A new, empty session. */\n create(): Promise<ThinkSession> {\n return this.#harness.createSession();\n }\n\n /** A new session that starts with `from`'s active transcript. */\n fork(from: ThinkSessionId): Promise<ThinkSession> {\n return this.#harness.fork(from);\n }\n\n /** Every session, with whether it has open work. */\n list(): Promise<ThinkSessionInfo[]> {\n return this.#harness.listSessions();\n }\n}\n","/**\n * Think's chat wire protocol (`cf_agent_chat_*`) over a ThinkHarness\n * session, so `useAgentChat` from `agents/chat/react` (or\n * `@cloudflare/think/react`) talks to a ThinkHarness host unchanged.\n */\nimport type { JSONSchema7, UIMessage, UIMessageChunk } from \"ai\";\nimport type { Json } from \"../../experimental/channels/protocol\";\nimport { LifecycleCapability } from \"../../lifecycle/capability\";\nimport type { CapabilityRequestContext } from \"../../lifecycle/capability-runner\";\nimport type { Connection } from \"../../lifecycle/types\";\nimport {\n parseProtocolMessage,\n type ChatProtocolEvent\n} from \"../../chat/parse-protocol\";\nimport {\n CHAT_MESSAGE_TYPES,\n STREAM_RESUME_NONE_REASONS\n} from \"../../chat/protocol\";\nimport type { ClientToolSchema } from \"../../chat/client-tools\";\nimport type {\n WebSocketHandlers,\n WebSocketMessage\n} from \"../../websockets/options\";\nimport type { ThinkSessionEvent } from \"./events\";\nimport { ROOT_SESSION, type ThinkHarness } from \"./harness\";\nimport type { ThinkSessionId } from \"./types\";\n\n/** `WebSocket.OPEN`; the constant is not defined on every runtime's global. */\nconst OPEN = 1;\n\n/**\n * The connections the chat protocol talks to: the WebSockets capability\n * fits as is.\n *\n * @experimental\n */\nexport type ThinkChatConnections = {\n getConnections(): Iterable<Connection>;\n use(handlers: WebSocketHandlers): void;\n};\n\n/** `ThinkChat`'s options. @experimental */\nexport type ThinkChatOptions = {\n readonly harness: ThinkHarness;\n /** The WebSockets capability the clients connect through. */\n readonly webSockets: ThinkChatConnections;\n /** The session the chat serves. Default: the root session. */\n readonly session?: ThinkSessionId;\n};\n\n/** Per-operation framing state, in memory. */\ntype Framing = {\n /** Whether the operation's chunks continue a message the client has. */\n readonly continuation: boolean;\n /** The connection that asked for it, if one did. */\n readonly requester: string | undefined;\n /** The last model call's finish chunk, sent just before the terminal frame. */\n finish: UIMessageChunk | undefined;\n /**\n * Whether the operation's `start` went out. An operation that calls the\n * model several times extends one assistant message, so clients get one\n * message stream: one `start`, the chunks of every call, one `finish`.\n */\n started: boolean;\n};\n\nfunction send(connection: Connection, frame: object): void {\n if (connection.readyState !== OPEN) return;\n try {\n connection.send(JSON.stringify(frame));\n } catch {\n // The socket closed between the state check and the send.\n }\n}\n\n/** The chat request body `useAgentChat` sends. */\ntype ChatRequestBody = {\n readonly messages?: readonly UIMessage[];\n readonly trigger?: string;\n readonly messageId?: string;\n readonly clientTools?: readonly ClientToolSchema[];\n};\n\nfunction parseBody(body: unknown): ChatRequestBody {\n if (typeof body !== \"string\" || body === \"\") return {};\n try {\n const parsed: unknown = JSON.parse(body);\n // SAFETY: the client sends the AI SDK's chat request body; every field\n // is optional and checked before use.\n return typeof parsed === \"object\" && parsed !== null\n ? (parsed as ChatRequestBody)\n : {};\n } catch {\n return {};\n }\n}\n\nfunction clientToolsOf(\n value: readonly { name: string; description?: string; parameters?: unknown }[]\n): ClientToolSchema[] {\n return value.map((tool) => ({\n name: tool.name,\n ...(tool.description !== undefined && { description: tool.description }),\n // SAFETY: the client sends its tools' JSON Schemas.\n ...(tool.parameters !== undefined && {\n parameters: tool.parameters as JSONSchema7\n })\n }));\n}\n\n/**\n * Serves one ThinkHarness session over Think's chat WebSocket protocol and\n * its `GET …/get-messages` route. Install it on the Lifecycle after the\n * harness and the WebSockets capability:\n *\n * ```ts\n * readonly webSockets = new WebSockets();\n * readonly chat = new ThinkChat({ harness: this.harness, webSockets: this.webSockets });\n * readonly lifecycle = Lifecycle.install(this)\n * .use(this.harness)\n * .use(this.webSockets).use(this.chat);\n * ```\n *\n * Supported: chat requests (`submit-message` and `regenerate-message`),\n * cancel, clear, client tool results, approvals, and stream resume after\n * a reconnect or an eviction. Not supported: `messageConcurrency`\n * strategies other than queueing, client transcript sync, and the\n * recovery progress frame.\n *\n * @experimental The API may change between releases.\n */\nexport class ThinkChat extends LifecycleCapability {\n readonly #harness: ThinkHarness;\n readonly #webSockets: ThinkChatConnections;\n readonly #session: ThinkSessionId;\n readonly #framing = new Map<string, Framing>();\n /** Connections told of a stream, left out of live frames until they ACK. */\n readonly #awaitingAck = new Set<string>();\n /** Per connection, the continuation flag its replay set for an operation. */\n readonly #replayed = new Map<\n string,\n { operationId: string; continuation: boolean }\n >();\n /** Connections that asked for an operation, by operation id. */\n readonly #requesters = new Map<string, string>();\n /** Connections told STREAM_PENDING, with their probe ids. */\n readonly #pendingProbes = new Map<string, string | undefined>();\n readonly #unobserve: () => void;\n\n /** @param options - The harness, its WebSockets, and the session to serve. */\n constructor(options: ThinkChatOptions) {\n super(\"think-chat\");\n this.#harness = options.harness;\n this.#webSockets = options.webSockets;\n this.#session = options.session ?? ROOT_SESSION;\n this.#webSockets.use({\n onConnect: (connection) => this.#onConnect(connection),\n onMessage: (connection, message) => this.#onMessage(connection, message),\n onClose: (connection) => this.#forget(connection),\n onError: (connection) => this.#forget(connection)\n });\n this.#unobserve = this.#harness.observe((session, event) => {\n if (session === this.#session) this.#onEvent(event);\n });\n }\n\n /** Answer `GET …/get-messages` with the session's transcript. */\n async onRequest(\n context: CapabilityRequestContext\n ): Promise<Response | undefined> {\n const { request } = context;\n if (request.method !== \"GET\") return undefined;\n if (!new URL(request.url).pathname.endsWith(\"/get-messages\")) {\n return undefined;\n }\n return Response.json(await this.#harness.session(this.#session).messages());\n }\n\n /** Stop listening to the harness. */\n dispose(): void {\n this.#unobserve();\n }\n\n // ── Connections ──────────────────────────────────────────────────────────\n\n async #onConnect(connection: Connection): Promise<void> {\n const session = this.#harness.session(this.#session);\n send(connection, {\n type: CHAT_MESSAGE_TYPES.CHAT_MESSAGES,\n messages: await session.messages(),\n connect: true\n });\n const inFlight = await session.inFlight();\n if (inFlight) this.#offerResume(connection, inFlight.operationId);\n }\n\n #forget(connection: Connection): void {\n this.#awaitingAck.delete(connection.id);\n this.#pendingProbes.delete(connection.id);\n this.#replayed.delete(connection.id);\n }\n\n #offerResume(\n connection: Connection,\n operationId: string,\n probeId?: string\n ): void {\n this.#awaitingAck.add(connection.id);\n send(connection, {\n type: CHAT_MESSAGE_TYPES.STREAM_RESUMING,\n id: operationId,\n ...(probeId !== undefined && { probeId })\n });\n }\n\n async #onMessage(\n connection: Connection,\n raw: WebSocketMessage\n ): Promise<boolean> {\n if (typeof raw !== \"string\") return false;\n const event = parseProtocolMessage(raw);\n if (!event) return false;\n await this.#handle(connection, event);\n return true;\n }\n\n async #handle(connection: Connection, event: ChatProtocolEvent) {\n const session = this.#harness.session(this.#session);\n switch (event.type) {\n case \"chat-request\": {\n const body = parseBody(event.init.body);\n const clientTools = body.clientTools\n ? { clientTools: body.clientTools }\n : {};\n this.#requesters.set(event.id, connection.id);\n if (body.trigger === \"regenerate-message\") {\n await session.regenerate(undefined, { operationId: event.id });\n return;\n }\n const known = new Set(\n (await session.messages()).map((message) => message.id)\n );\n const fresh = (body.messages ?? []).filter(\n (message) => !known.has(message.id)\n );\n const receipt = await session.submit(fresh, {\n operationId: event.id,\n source: \"client\",\n ...clientTools\n });\n if (!receipt.accepted) {\n // A resend: if the operation already ended, end this request too.\n const status = await session.inspect(event.id);\n if (status?.status === \"done\" || status?.status === \"unanswered\") {\n this.#requesters.delete(event.id);\n await this.#finish(\n {\n operationId: status.operationId,\n status: status.status,\n ...(\"reason\" in status &&\n status.reason !== undefined && { reason: status.reason })\n },\n undefined,\n connection\n );\n }\n }\n return;\n }\n case \"cancel\":\n await session.abort(event.id);\n return;\n case \"clear\":\n await session.reset();\n for (const other of this.#webSockets.getConnections()) {\n if (other.id !== connection.id) {\n send(other, { type: CHAT_MESSAGE_TYPES.CHAT_CLEAR });\n }\n }\n return;\n case \"tool-result\": {\n const operationId = crypto.randomUUID();\n this.#requesters.set(operationId, connection.id);\n await session.submit(\n {\n type: \"tool-result\",\n toolCallId: event.toolCallId,\n result:\n event.state === \"output-error\"\n ? {\n ok: false,\n ...(event.errorText !== undefined && {\n errorText: event.errorText\n })\n }\n : {\n ok: true,\n // SAFETY: the client sends tool outputs as JSON.\n output: (event.output ?? null) as Json\n }\n },\n {\n operationId,\n source: \"client\",\n autoContinue: event.autoContinue ?? true,\n ...(event.clientTools && {\n clientTools: clientToolsOf(event.clientTools)\n })\n }\n );\n return;\n }\n case \"tool-approval\": {\n const approvalId = await this.#approvalId(event.toolCallId);\n if (approvalId === undefined) return;\n const operationId = crypto.randomUUID();\n this.#requesters.set(operationId, connection.id);\n await session.submit(\n { type: \"approval\", approvalId, approved: event.approved },\n {\n operationId,\n source: \"client\",\n autoContinue: event.autoContinue ?? true\n }\n );\n return;\n }\n case \"stream-resume-request\": {\n const inFlight = await session.inFlight();\n if (inFlight) {\n this.#offerResume(connection, inFlight.operationId, event.probeId);\n } else if ((await session.pending()).length > 0) {\n // Answered later: with an offer when the work starts streaming,\n // or \"none\" if it ends without streaming.\n this.#pendingProbes.set(connection.id, event.probeId);\n send(connection, {\n type: CHAT_MESSAGE_TYPES.STREAM_PENDING,\n ...(event.probeId !== undefined && { probeId: event.probeId })\n });\n } else {\n send(connection, {\n type: CHAT_MESSAGE_TYPES.STREAM_RESUME_NONE,\n reason: STREAM_RESUME_NONE_REASONS.IDLE,\n ...(event.probeId !== undefined && { probeId: event.probeId })\n });\n }\n return;\n }\n case \"stream-resume-ack\":\n await this.#replay(connection, event.id);\n return;\n case \"messages\":\n // The transcript is the server's; a client's copy is not applied.\n return;\n }\n }\n\n /** Replay a running model call's chunks to one connection, then go live. */\n async #replay(connection: Connection, operationId: string): Promise<void> {\n const inFlight = await this.#harness.session(this.#session).inFlight();\n if (!inFlight || inFlight.operationId !== operationId) {\n this.#awaitingAck.delete(connection.id);\n send(connection, {\n type: CHAT_MESSAGE_TYPES.USE_CHAT_RESPONSE,\n id: operationId,\n body: \"\",\n done: true,\n replay: true\n });\n return;\n }\n const { continuation, chunks } = inFlight;\n // Synchronous from here: the replay and the switch to live frames\n // happen with no chunk in between.\n let seq = 0;\n for (const chunk of chunks) {\n send(connection, {\n type: CHAT_MESSAGE_TYPES.USE_CHAT_RESPONSE,\n id: operationId,\n body: JSON.stringify(chunk),\n done: false,\n replay: true,\n seq: seq++,\n ...(continuation && { continuation: true })\n });\n }\n send(connection, {\n type: CHAT_MESSAGE_TYPES.USE_CHAT_RESPONSE,\n id: operationId,\n body: \"\",\n done: false,\n replay: true,\n replayComplete: true,\n ...(continuation && { continuation: true })\n });\n this.#replayed.set(connection.id, { operationId, continuation });\n this.#awaitingAck.delete(connection.id);\n }\n\n async #approvalId(toolCallId: string): Promise<string | undefined> {\n const messages = await this.#harness.session(this.#session).messages();\n for (const message of [...messages].reverse()) {\n for (const part of message.parts) {\n if (\n \"toolCallId\" in part &&\n part.toolCallId === toolCallId &&\n \"approval\" in part &&\n part.approval\n ) {\n return part.approval.id;\n }\n }\n }\n return undefined;\n }\n\n // ── Harness events ───────────────────────────────────────────────────────\n\n #onEvent(event: ThinkSessionEvent): void {\n switch (event.type) {\n case \"run-start\": {\n const requester = this.#requesters.get(event.operationId);\n this.#framing.set(event.operationId, {\n continuation: event.continuation,\n requester,\n finish: undefined,\n started: false\n });\n // Probes told to keep waiting learn which stream to resume.\n for (const connection of this.#webSockets.getConnections()) {\n if (!this.#pendingProbes.has(connection.id)) continue;\n const probeId = this.#pendingProbes.get(connection.id);\n this.#pendingProbes.delete(connection.id);\n this.#offerResume(connection, event.operationId, probeId);\n }\n // Someone who answered a tool call learns of the continuation from\n // an offer, as Think does; a chat request's sender already owns it.\n if (event.continuation && requester !== undefined) {\n for (const connection of this.#webSockets.getConnections()) {\n if (connection.id === requester) {\n this.#offerResume(connection, event.operationId);\n }\n }\n }\n return;\n }\n case \"chunk\": {\n const framing = this.#framing.get(event.operationId);\n if (event.chunk.type === \"finish\") {\n if (framing) framing.finish = event.chunk;\n return;\n }\n if (event.chunk.type === \"start\" && framing) {\n if (framing.started) return;\n framing.started = true;\n }\n this.#broadcastChunk(event.operationId, event.chunk, framing);\n return;\n }\n case \"message\": {\n // Messages written while placing an operation (the user's, or a\n // tool answer applied); a running turn's arrive as chunks.\n const running =\n event.operationId !== undefined &&\n this.#framing.has(event.operationId);\n if (running) return;\n const requester =\n event.operationId === undefined\n ? undefined\n : this.#requesters.get(event.operationId);\n void this.#broadcastTranscript(requester);\n return;\n }\n case \"operation\": {\n const { status } = event;\n if (status.status !== \"done\" && status.status !== \"unanswered\") {\n return;\n }\n const framing = this.#framing.get(status.operationId);\n this.#framing.delete(status.operationId);\n this.#requesters.delete(status.operationId);\n void this.#finish(status, framing).then(() => this.#resolveProbes());\n return;\n }\n case \"transcript\":\n void this.#broadcastTranscript();\n return;\n case \"reset\":\n for (const connection of this.#webSockets.getConnections()) {\n send(connection, { type: CHAT_MESSAGE_TYPES.CHAT_CLEAR });\n }\n return;\n case \"run-end\":\n return;\n }\n }\n\n #broadcastChunk(\n operationId: string,\n chunk: UIMessageChunk,\n framing: Framing | undefined\n ): void {\n const body = JSON.stringify(chunk);\n for (const connection of this.#webSockets.getConnections()) {\n if (this.#awaitingAck.has(connection.id)) continue;\n const replayed = this.#replayed.get(connection.id);\n const continuation =\n replayed?.operationId === operationId\n ? replayed.continuation\n : (framing?.continuation ?? false);\n send(connection, {\n type: CHAT_MESSAGE_TYPES.USE_CHAT_RESPONSE,\n id: operationId,\n body,\n done: false,\n ...(continuation && { continuation: true })\n });\n }\n }\n\n async #broadcastTranscript(except?: string): Promise<void> {\n const messages = await this.#harness.session(this.#session).messages();\n for (const connection of this.#webSockets.getConnections()) {\n if (connection.id === except) continue;\n send(connection, { type: CHAT_MESSAGE_TYPES.CHAT_MESSAGES, messages });\n }\n }\n\n /** Tell probes still waiting that nothing will stream, once the session is idle. */\n async #resolveProbes(): Promise<void> {\n if (this.#pendingProbes.size === 0) return;\n const session = this.#harness.session(this.#session);\n if ((await session.pending()).length > 0) return;\n for (const connection of this.#webSockets.getConnections()) {\n if (!this.#pendingProbes.has(connection.id)) continue;\n const probeId = this.#pendingProbes.get(connection.id);\n this.#pendingProbes.delete(connection.id);\n send(connection, {\n type: CHAT_MESSAGE_TYPES.STREAM_RESUME_NONE,\n reason: STREAM_RESUME_NONE_REASONS.IDLE,\n ...(probeId !== undefined && { probeId })\n });\n }\n }\n\n /** The transcript first, then the terminal frame (#2119). */\n async #finish(\n status: {\n readonly operationId: string;\n readonly status: \"done\" | \"unanswered\";\n readonly reason?: string;\n },\n framing: Framing | undefined,\n only?: Connection\n ): Promise<void> {\n const { operationId } = status;\n if (framing?.finish) {\n this.#broadcastChunk(operationId, framing.finish, framing);\n }\n const messages = await this.#harness.session(this.#session).messages();\n const reason = status.status === \"unanswered\" ? status.reason : undefined;\n const outcome =\n status.status === \"done\"\n ? \"completed\"\n : reason === \"aborted\"\n ? \"aborted\"\n : reason === \"withdrawn\" ||\n reason === \"not_waiting\" ||\n reason === \"not_found\" ||\n reason === \"empty\"\n ? \"skipped\"\n : \"error\";\n const connections = only ? [only] : this.#webSockets.getConnections();\n for (const connection of connections) {\n send(connection, { type: CHAT_MESSAGE_TYPES.CHAT_MESSAGES, messages });\n send(connection, {\n type: CHAT_MESSAGE_TYPES.USE_CHAT_RESPONSE,\n id: operationId,\n body: outcome === \"error\" ? (reason ?? \"\") : \"\",\n done: true,\n outcome,\n ...(outcome === \"error\" && { error: true }),\n ...(framing?.continuation && { continuation: true })\n });\n this.#awaitingAck.delete(connection.id);\n if (this.#replayed.get(connection.id)?.operationId === operationId) {\n this.#replayed.delete(connection.id);\n }\n }\n }\n}\n"],"mappings":"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"}