experimental-a2 0.17.0 → 0.18.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 (211) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +1 -1
  3. package/dist/{actor-DBbe5xeE.d.ts → actor-Bjce9_5U.d.ts} +5 -5
  4. package/dist/{actor-DBbe5xeE.d.ts.map → actor-Bjce9_5U.d.ts.map} +1 -1
  5. package/dist/actor-client.d.ts +1 -1
  6. package/dist/actor-react.d.ts +3 -3
  7. package/dist/actor-react.js +1 -1
  8. package/dist/actor.d.ts +1 -1
  9. package/dist/actor.js +2 -2
  10. package/dist/{ai-UrWfKeuv.js → ai-BpOGm-zB.js} +2 -2
  11. package/dist/{ai-UrWfKeuv.js.map → ai-BpOGm-zB.js.map} +1 -1
  12. package/dist/{ai-vpGtcaCB.d.ts → ai-DrUaMyRt.d.ts} +3 -3
  13. package/dist/{ai-vpGtcaCB.d.ts.map → ai-DrUaMyRt.d.ts.map} +1 -1
  14. package/dist/ai-client.d.ts +2 -2
  15. package/dist/ai-client.js +2 -2
  16. package/dist/ai-fx.browser.d.ts +1 -0
  17. package/dist/ai-fx.browser.js +6 -0
  18. package/dist/ai-fx.browser.js.map +1 -0
  19. package/dist/ai-fx.d.ts +10 -0
  20. package/dist/ai-fx.d.ts.map +1 -0
  21. package/dist/ai-fx.js +634 -0
  22. package/dist/ai-fx.js.map +1 -0
  23. package/dist/ai-harness-BuLh_EYi.js +273 -0
  24. package/dist/ai-harness-BuLh_EYi.js.map +1 -0
  25. package/dist/ai-harness-DvsPeJeB.d.ts +26 -0
  26. package/dist/ai-harness-DvsPeJeB.d.ts.map +1 -0
  27. package/dist/ai-pi.browser.d.ts +1 -0
  28. package/dist/ai-pi.browser.js +6 -0
  29. package/dist/ai-pi.browser.js.map +1 -0
  30. package/dist/ai-pi.d.ts +17 -0
  31. package/dist/ai-pi.d.ts.map +1 -0
  32. package/dist/ai-pi.js +904 -0
  33. package/dist/ai-pi.js.map +1 -0
  34. package/dist/ai-react.d.ts +5 -5
  35. package/dist/ai-react.js +2 -2
  36. package/dist/ai-server.d.ts +47 -25
  37. package/dist/ai-server.d.ts.map +1 -1
  38. package/dist/ai-server.js +106 -37
  39. package/dist/ai-server.js.map +1 -1
  40. package/dist/ai.d.ts +1 -1
  41. package/dist/ai.js +1 -1
  42. package/dist/bounded-cache-CPHWF-8h.js +41 -0
  43. package/dist/bounded-cache-CPHWF-8h.js.map +1 -0
  44. package/dist/{client-COaiaDub.js → client-BReKqwZC.js} +3 -3
  45. package/dist/{client-COaiaDub.js.map → client-BReKqwZC.js.map} +1 -1
  46. package/dist/{client-qRnRUzBS.d.ts → client-h_DKFAjj.d.ts} +3 -3
  47. package/dist/{client-qRnRUzBS.d.ts.map → client-h_DKFAjj.d.ts.map} +1 -1
  48. package/dist/client.d.ts +3 -3
  49. package/dist/client.js +1 -1
  50. package/dist/index.d.ts +5 -5
  51. package/dist/{initial-snapshot-BrLso5x_.d.ts → initial-snapshot-Bx-c0pDP.d.ts} +2 -2
  52. package/dist/{initial-snapshot-BrLso5x_.d.ts.map → initial-snapshot-Bx-c0pDP.d.ts.map} +1 -1
  53. package/dist/{internal-CbVvEwad.js → internal-B2T3U4Rq.js} +8 -2
  54. package/dist/internal-B2T3U4Rq.js.map +1 -0
  55. package/dist/otel.d.ts +1 -1
  56. package/dist/{react-BbJ-g6Uu.d.ts → react-BBXgHWFc.d.ts} +4 -4
  57. package/dist/{react-BbJ-g6Uu.d.ts.map → react-BBXgHWFc.d.ts.map} +1 -1
  58. package/dist/react.d.ts +1 -1
  59. package/dist/react.js +1 -1
  60. package/dist/reducer-BAXc8JyF.js.map +1 -1
  61. package/dist/{reducer-BYu6DT7h.d.ts → reducer-CqA59Q6U.d.ts} +2 -2
  62. package/dist/{reducer-BYu6DT7h.d.ts.map → reducer-CqA59Q6U.d.ts.map} +1 -1
  63. package/dist/scheduler-qstash.d.ts +2 -2
  64. package/dist/scheduler-qstash.js +2 -2
  65. package/dist/scheduler-vercel.d.ts +2 -2
  66. package/dist/scheduler-vercel.js +2 -2
  67. package/dist/{server-Rj64fNvX.js → server-Dw_k_7kO.js} +93 -60
  68. package/dist/server-Dw_k_7kO.js.map +1 -0
  69. package/dist/{server-CGM8WzRG.d.ts → server-En7cbi3v.d.ts} +36 -7
  70. package/dist/server-En7cbi3v.d.ts.map +1 -0
  71. package/dist/server.d.ts +4 -4
  72. package/dist/server.js +1 -1
  73. package/dist/{session-clear-Dshpuhff.d.ts → session-clear-Bo-XTFEy.d.ts} +2 -2
  74. package/dist/session-clear-Bo-XTFEy.d.ts.map +1 -0
  75. package/dist/{store-Gpkq7WBo.d.ts → store-Djdv0bnZ.d.ts} +31 -2
  76. package/dist/store-Djdv0bnZ.d.ts.map +1 -0
  77. package/dist/store-N8PXxDAS.js.map +1 -1
  78. package/dist/store-memory.d.ts +1 -1
  79. package/dist/store-memory.js +32 -6
  80. package/dist/store-memory.js.map +1 -1
  81. package/dist/{store-polling-4_y8lETm.js → store-polling-B5FcwJfo.js} +2 -2
  82. package/dist/{store-polling-4_y8lETm.js.map → store-polling-B5FcwJfo.js.map} +1 -1
  83. package/dist/store-postgres.d.ts +1 -1
  84. package/dist/store-postgres.js +54 -3
  85. package/dist/store-postgres.js.map +1 -1
  86. package/dist/{store-presence-polling-Q1C-k2dd.js → store-presence-polling-BAwS8RWn.js} +3 -3
  87. package/dist/{store-presence-polling-Q1C-k2dd.js.map → store-presence-polling-BAwS8RWn.js.map} +1 -1
  88. package/dist/store-redis-http.d.ts +1 -1
  89. package/dist/store-redis-http.js +3 -3
  90. package/dist/{store-redis-notify-tqWNnMRu.js → store-redis-notify-BRITti_o.js} +187 -68
  91. package/dist/store-redis-notify-BRITti_o.js.map +1 -0
  92. package/dist/store-redis.d.ts +1 -1
  93. package/dist/store-redis.js +1 -1
  94. package/dist/store-sqlite.d.ts +1 -1
  95. package/dist/store-sqlite.js +32 -2
  96. package/dist/store-sqlite.js.map +1 -1
  97. package/dist/{telemetry-cZH-cibj.d.ts → telemetry-Cyfqo6Qt.d.ts} +2 -2
  98. package/dist/telemetry-Cyfqo6Qt.d.ts.map +1 -0
  99. package/dist/{wire-DjfHOvdW.js → wire-rSUglYo8.js} +2 -2
  100. package/dist/{wire-DjfHOvdW.js.map → wire-rSUglYo8.js.map} +1 -1
  101. package/docs/01-quickstart.mdx +49 -83
  102. package/docs/{guides/07-examples.mdx → 02-examples.mdx} +10 -20
  103. package/docs/actors/01-introduction.mdx +48 -86
  104. package/docs/actors/02-concurrency.mdx +43 -70
  105. package/docs/actors/03-timers.mdx +28 -42
  106. package/docs/actors/04-routes.mdx +110 -150
  107. package/docs/actors/meta.ts +1 -1
  108. package/docs/agents/01-introduction.mdx +257 -0
  109. package/docs/agents/02-tools.mdx +247 -0
  110. package/docs/agents/03-conversations.mdx +538 -0
  111. package/docs/agents/04-harnesses.mdx +136 -0
  112. package/docs/agents/meta.ts +1 -0
  113. package/docs/client/01-react.mdx +294 -0
  114. package/docs/client/02-transports.mdx +86 -0
  115. package/docs/client/03-presence.mdx +224 -0
  116. package/docs/client/meta.ts +1 -0
  117. package/docs/contract/01-events.mdx +57 -0
  118. package/docs/contract/02-state.mdx +142 -0
  119. package/docs/contract/03-sessions.mdx +175 -0
  120. package/docs/index.mdx +108 -144
  121. package/docs/reference/01-core.mdx +139 -0
  122. package/docs/reference/02-server.mdx +855 -0
  123. package/docs/reference/03-client.mdx +301 -0
  124. package/docs/reference/04-ai.mdx +722 -0
  125. package/docs/reference/05-adapters.mdx +351 -0
  126. package/docs/reference/06-errors.mdx +138 -0
  127. package/docs/reference/meta.ts +1 -1
  128. package/docs/server/01-handlers.mdx +200 -0
  129. package/docs/server/02-timers.mdx +130 -0
  130. package/docs/server/03-cancellation.mdx +141 -0
  131. package/docs/server/04-routes.mdx +243 -0
  132. package/docs/server/05-production.mdx +322 -0
  133. package/docs/server/06-guarantees.mdx +123 -0
  134. package/examples/playground/DEPLOY.md +1 -1
  135. package/examples/playground/app/a0/[appId]/page.tsx +11 -6
  136. package/examples/playground/app/a0/app-list.tsx +9 -2
  137. package/examples/playground/app/a0/app-view.tsx +9 -1
  138. package/examples/playground/app/a0/apps/[appId]/route.ts +10 -5
  139. package/examples/playground/app/a0/apps.test.ts +12 -0
  140. package/examples/playground/app/a0/apps.ts +22 -7
  141. package/examples/playground/app/a0/chat.tsx +47 -1
  142. package/examples/playground/app/a0/fx/events/route.ts +9 -0
  143. package/examples/playground/app/a0/fx/scheduler/route.ts +7 -0
  144. package/examples/playground/app/a0/fx/short/events/route.ts +11 -0
  145. package/examples/playground/app/a0/model.test.ts +18 -1
  146. package/examples/playground/app/a0/model.ts +47 -10
  147. package/examples/playground/app/a0/no-photon.cjs +4 -0
  148. package/examples/playground/app/a0/no-quickjs.cjs +3 -0
  149. package/examples/playground/app/a0/pi/events/route.ts +9 -0
  150. package/examples/playground/app/a0/pi/scheduler/route.ts +7 -0
  151. package/examples/playground/app/a0/pi/short/events/route.ts +11 -0
  152. package/examples/playground/app/a0/sandbox-log.ts +10 -4
  153. package/examples/playground/app/a0/sandbox-session.ts +152 -0
  154. package/examples/playground/app/a0/scheduler/route.ts +2 -2
  155. package/examples/playground/app/a0/server.ts +100 -45
  156. package/examples/playground/app/a0/session.ts +17 -5
  157. package/examples/playground/app/a0/shell.tsx +11 -3
  158. package/examples/playground/app/agent/ingress.test.ts +6 -3
  159. package/examples/playground/app/agent/server.ts +9 -6
  160. package/examples/playground/app/agent/telemetry.test.ts +71 -50
  161. package/examples/playground/app/canvas/[canvasId]/canvas-client.tsx +1 -1
  162. package/examples/playground/app/chat/server.test.ts +30 -26
  163. package/examples/playground/app/chat/server.ts +46 -46
  164. package/examples/playground/next.config.ts +17 -5
  165. package/examples/playground/package.json +4 -1
  166. package/examples/playground/vercel.json +18 -0
  167. package/package.json +27 -3
  168. package/src/ai-agent.ts +261 -87
  169. package/src/ai-fx.browser.ts +5 -0
  170. package/src/ai-fx.ts +833 -0
  171. package/src/ai-harness.ts +518 -0
  172. package/src/ai-model-metadata.ts +11 -6
  173. package/src/ai-pi.browser.ts +5 -0
  174. package/src/ai-pi.ts +1263 -0
  175. package/src/ai-sdk-step.ts +2 -2
  176. package/src/ai-server.ts +3 -1
  177. package/src/internal.ts +7 -0
  178. package/src/libfx.d.ts +34 -0
  179. package/src/reducer.ts +1 -1
  180. package/src/server.ts +177 -19
  181. package/src/store-memory.ts +42 -7
  182. package/src/store-postgres.ts +80 -0
  183. package/src/store-redis-core.ts +210 -79
  184. package/src/store-redis-notify.ts +2 -0
  185. package/src/store-sqlite.ts +60 -0
  186. package/src/store.ts +33 -0
  187. package/src/telemetry.ts +1 -0
  188. package/dist/internal-CbVvEwad.js.map +0 -1
  189. package/dist/server-CGM8WzRG.d.ts.map +0 -1
  190. package/dist/server-Rj64fNvX.js.map +0 -1
  191. package/dist/session-clear-Dshpuhff.d.ts.map +0 -1
  192. package/dist/store-Gpkq7WBo.d.ts.map +0 -1
  193. package/dist/store-redis-notify-tqWNnMRu.js.map +0 -1
  194. package/dist/telemetry-cZH-cibj.d.ts.map +0 -1
  195. package/docs/concepts/01-contracts.mdx +0 -237
  196. package/docs/concepts/02-handlers.mdx +0 -284
  197. package/docs/concepts/03-durability.mdx +0 -314
  198. package/docs/concepts/04-state.mdx +0 -209
  199. package/docs/guides/01-timers.mdx +0 -193
  200. package/docs/guides/02-cancellation.mdx +0 -161
  201. package/docs/guides/03-react.mdx +0 -324
  202. package/docs/guides/04-local-first.mdx +0 -47
  203. package/docs/guides/05-production.mdx +0 -534
  204. package/docs/guides/06-ai-agents.mdx +0 -1408
  205. package/docs/guides/08-application-data.mdx +0 -113
  206. package/docs/guides/09-presence.mdx +0 -262
  207. package/docs/guides/10-transports.mdx +0 -221
  208. package/docs/reference/01-api.mdx +0 -2358
  209. package/docs/reference/02-errors.mdx +0 -150
  210. /package/docs/{concepts → contract}/meta.ts +0 -0
  211. /package/docs/{guides → server}/meta.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ai-UrWfKeuv.js","names":["isRecord","isRecord","isRecord","createContract","reducer","makeReducer"],"sources":["../src/equal-json.ts","../src/ai-message-base.ts","../src/parse-partial-json.ts","../src/ai-projector.ts","../src/ai-progress-batches.ts","../src/ai-message-projection.ts","../src/ai-client-state.ts","../src/ai-control-state.ts","../src/ai-control.ts","../src/ai-id.ts","../src/ai-stored-state.ts","../src/ai-app-state.ts","../src/ai.ts"],"sourcesContent":["export const sameValue = (left: unknown, right: unknown): boolean => {\n if (Object.is(left, right)) return true\n if (\n typeof left !== 'object' ||\n left === null ||\n typeof right !== 'object' ||\n right === null\n )\n return false\n const prototype = Object.getPrototypeOf(left)\n if (\n prototype !== Object.getPrototypeOf(right) ||\n (prototype !== Object.prototype &&\n prototype !== Array.prototype &&\n prototype !== null)\n )\n return false\n if (\n Array.isArray(left) &&\n (!Array.isArray(right) || left.length !== right.length)\n )\n return false\n const keys = Reflect.ownKeys(left)\n return (\n keys.length === Reflect.ownKeys(right).length &&\n keys.every(\n (key) =>\n Object.hasOwn(right, key) &&\n sameValue(Reflect.get(left, key), Reflect.get(right, key)),\n )\n )\n}\n","import type { UIMessage } from 'ai'\nimport { sameValue } from './equal-json.ts'\n\ntype FieldUndo = { value?: unknown } | { remove: true } | { length: number }\ntype FieldsUndo = Record<string, FieldUndo>\ntype PartUndo = { value: UIMessage['parts'][number] } | { fields: FieldsUndo }\n\nexport type MessageBase = {\n partCount: number\n fields?: FieldsUndo\n parts?: Record<string, PartUndo>\n}\n\nconst record = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst assertFields = (fields: unknown): void => {\n if (fields === undefined) return\n if (!record(fields)) throw new TypeError('invalid AI message base fields')\n for (const [key, undo] of Object.entries(fields)) {\n if (\n !record(undo) ||\n Object.keys(undo).length > 1 ||\n !(\n Object.keys(undo).length === 0 ||\n 'value' in undo ||\n undo['remove'] === true ||\n (key === 'text' &&\n Number.isSafeInteger(undo['length']) &&\n (undo['length'] as number) >= 0)\n )\n )\n throw new TypeError('invalid AI message base field')\n }\n}\n\n/** Checks decoded recovery data; `restoreMessageBase` trusts this shape. */\nexport function assertMessageBase(\n value: unknown,\n): asserts value is MessageBase {\n if (\n !record(value) ||\n !Number.isSafeInteger(value['partCount']) ||\n (value['partCount'] as number) < 0 ||\n (value['partCount'] as number) > 0xffffffff - 1 ||\n Object.keys(value).some(\n (key) => !['partCount', 'fields', 'parts'].includes(key),\n ) ||\n (value['parts'] !== undefined && !record(value['parts']))\n )\n throw new TypeError('invalid AI message base')\n assertFields(value['fields'])\n const partCount = value['partCount'] as number\n for (const [key, undo] of Object.entries(value['parts'] ?? {})) {\n const index = Number(key)\n if (\n !Number.isSafeInteger(index) ||\n String(index) !== key ||\n index < 0 ||\n index >= partCount ||\n !record(undo) ||\n Object.keys(undo).length !== 1 ||\n !(('value' in undo && record(undo['value'])) || 'fields' in undo)\n )\n throw new TypeError('invalid AI message base part')\n if ('fields' in undo) assertFields(undo['fields'])\n }\n}\n\nconst restoreFields = (\n current: Record<string, unknown>,\n fields: FieldsUndo | undefined,\n): Record<string, unknown> | undefined => {\n if (fields === undefined) return current\n const restored = { ...current }\n for (const [key, undo] of Object.entries(fields)) {\n if ('remove' in undo) delete restored[key]\n else if ('length' in undo) {\n const text = current[key]\n if (typeof text !== 'string' || undo.length > text.length)\n return undefined\n restored[key] = text.slice(0, undo.length)\n } else\n Object.defineProperty(restored, key, {\n value: undo.value,\n enumerable: true,\n writable: true,\n configurable: true,\n })\n }\n return restored\n}\n\n/** `undefined` when `base` no longer describes `current`, including a removed message. */\nexport const restoreMessageBase = <M extends UIMessage>(options: {\n current: M | undefined\n base: MessageBase | undefined\n}): M | undefined => {\n const { current, base } = options\n if (base === undefined || current === undefined) return undefined\n const parts = current.parts.slice(0, base.partCount)\n for (const [key, undo] of Object.entries(base.parts ?? {})) {\n const index = Number(key)\n if ('value' in undo) {\n parts[index] = undo.value as M['parts'][number]\n continue\n }\n const part = parts[index]\n const restored =\n part === undefined\n ? undefined\n : restoreFields(part as unknown as Record<string, unknown>, undo.fields)\n if (!restored) return undefined\n parts[index] = restored as M['parts'][number]\n }\n if (\n parts.length !== base.partCount ||\n Object.keys(parts).length !== parts.length\n )\n return undefined\n const { parts: _parts, ...fields } = current\n const restored = restoreFields(fields, base.fields)\n return restored && ({ ...restored, parts } as M)\n}\n\nconst updateFields = (options: {\n before: Record<string, unknown>\n after: Record<string, unknown>\n undo?: FieldsUndo\n}): FieldsUndo | undefined => {\n const { before, after, undo } = options\n const original = restoreFields(before, undo)\n if (!original) return undefined\n return Object.fromEntries(\n [...new Set([...Object.keys(original), ...Object.keys(after)])].flatMap(\n (key) => {\n if (\n Object.hasOwn(original, key) === Object.hasOwn(after, key) &&\n sameValue(original[key], after[key])\n )\n return []\n const value = original[key]\n const next = after[key]\n const change: FieldUndo = !Object.hasOwn(original, key)\n ? { remove: true }\n : key === 'text' &&\n typeof value === 'string' &&\n typeof next === 'string' &&\n next.startsWith(value)\n ? { length: value.length }\n : value === undefined\n ? {}\n : { value }\n return [[key, change]]\n },\n ),\n )\n}\n\n/** `undefined` when `before` no longer matches `base`, so the recovery must be dropped. */\nexport const updateMessageBase = (options: {\n base: MessageBase\n before: UIMessage\n after: UIMessage\n}): MessageBase | undefined => {\n const { base, before, after } = options\n if (before === after) return base\n const { parts: beforeParts, ...beforeFields } = before\n const { parts: afterParts, ...afterFields } = after\n const fields = updateFields({\n before: beforeFields,\n after: afterFields,\n ...(base.fields && { undo: base.fields }),\n })\n if (!fields) return undefined\n const parts: Array<[string, PartUndo]> = []\n for (let index = 0; index < base.partCount; index += 1) {\n const previous = beforeParts[index]\n const current = afterParts[index]\n const undo = base.parts?.[index]\n const original = undo && 'value' in undo ? undo.value : previous\n if (!original) return undefined\n if (previous === current && undo === undefined) continue\n const originalFields = original as unknown as Record<string, unknown>\n const undoFields = undo && 'fields' in undo ? undo.fields : undefined\n if (!current) {\n const value = restoreFields(originalFields, undoFields)\n if (!value) return undefined\n parts.push([\n String(index),\n { value: value as UIMessage['parts'][number] },\n ])\n continue\n }\n const changed = updateFields({\n before: originalFields,\n after: current as unknown as Record<string, unknown>,\n ...(undoFields && { undo: undoFields }),\n })\n if (!changed) return undefined\n if (Object.keys(changed).length > 0)\n parts.push([String(index), { fields: changed }])\n }\n return {\n partCount: base.partCount,\n ...(Object.keys(fields).length > 0 && { fields }),\n ...(parts.length > 0 && { parts: Object.fromEntries(parts) }),\n }\n}\n","/*!\n * Adapted from AI SDK 7.0.58, packages/ai/src/util/fix-json.ts.\n * Source: https://github.com/vercel/ai, packages/ai/src/util/fix-json.ts.\n * Modified to expose a synchronous partial parser with strict TypeScript types.\n * Also preserves positive exponents in unfinished containers.\n * Copyright 2023 Vercel, Inc.\n * @license Apache-2.0. See src/licenses/Apache-2.0.txt.\n */\n\nexport function parsePartialJSON(text: string | undefined): unknown {\n if (text === undefined || text.trim() === '') return undefined\n try {\n return JSON.parse(text) as unknown\n } catch {\n try {\n return JSON.parse(repairPartialJSON(text)) as unknown\n } catch {\n return undefined\n }\n }\n}\n\ntype State =\n | 'ROOT'\n | 'FINISH'\n | 'INSIDE_STRING'\n | 'INSIDE_STRING_ESCAPE'\n | 'INSIDE_STRING_UNICODE_ESCAPE'\n | 'INSIDE_LITERAL'\n | 'INSIDE_NUMBER'\n | 'INSIDE_OBJECT_START'\n | 'INSIDE_OBJECT_KEY'\n | 'INSIDE_OBJECT_AFTER_KEY'\n | 'INSIDE_OBJECT_BEFORE_VALUE'\n | 'INSIDE_OBJECT_AFTER_VALUE'\n | 'INSIDE_OBJECT_AFTER_COMMA'\n | 'INSIDE_ARRAY_START'\n | 'INSIDE_ARRAY_AFTER_VALUE'\n | 'INSIDE_ARRAY_AFTER_COMMA'\n\nconst isHexDigit = (char: string): boolean =>\n (char >= '0' && char <= '9') ||\n (char >= 'A' && char <= 'F') ||\n (char >= 'a' && char <= 'f')\n\nfunction repairPartialJSON(input: string): string {\n const stack: State[] = ['ROOT']\n let lastValidIndex = -1\n let literalStart: number | null = null\n let unicodeEscapeDigits = 0\n\n function processValueStart(char: string, i: number, swapState: State) {\n {\n switch (char) {\n case '\"': {\n lastValidIndex = i\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_STRING')\n break\n }\n\n case 'f':\n case 't':\n case 'n': {\n lastValidIndex = i\n literalStart = i\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_LITERAL')\n break\n }\n\n case '-': {\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_NUMBER')\n break\n }\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9': {\n lastValidIndex = i\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_NUMBER')\n break\n }\n\n case '{': {\n lastValidIndex = i\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_OBJECT_START')\n break\n }\n\n case '[': {\n lastValidIndex = i\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_ARRAY_START')\n break\n }\n }\n }\n }\n\n function processAfterObjectValue(char: string, i: number) {\n switch (char) {\n case ',': {\n stack.pop()\n stack.push('INSIDE_OBJECT_AFTER_COMMA')\n break\n }\n case '}': {\n lastValidIndex = i\n stack.pop()\n break\n }\n }\n }\n\n function processAfterArrayValue(char: string, i: number) {\n switch (char) {\n case ',': {\n stack.pop()\n stack.push('INSIDE_ARRAY_AFTER_COMMA')\n break\n }\n case ']': {\n lastValidIndex = i\n stack.pop()\n break\n }\n }\n }\n\n for (let i = 0; i < input.length; i++) {\n const char = input[i]!\n const currentState = stack[stack.length - 1]\n\n switch (currentState) {\n case 'ROOT':\n processValueStart(char, i, 'FINISH')\n break\n\n case 'INSIDE_OBJECT_START': {\n switch (char) {\n case '\"': {\n stack.pop()\n stack.push('INSIDE_OBJECT_KEY')\n break\n }\n case '}': {\n lastValidIndex = i\n stack.pop()\n break\n }\n }\n break\n }\n\n case 'INSIDE_OBJECT_AFTER_COMMA': {\n switch (char) {\n case '\"': {\n stack.pop()\n stack.push('INSIDE_OBJECT_KEY')\n break\n }\n }\n break\n }\n\n case 'INSIDE_OBJECT_KEY': {\n switch (char) {\n case '\"': {\n stack.pop()\n stack.push('INSIDE_OBJECT_AFTER_KEY')\n break\n }\n }\n break\n }\n\n case 'INSIDE_OBJECT_AFTER_KEY': {\n switch (char) {\n case ':': {\n stack.pop()\n stack.push('INSIDE_OBJECT_BEFORE_VALUE')\n\n break\n }\n }\n break\n }\n\n case 'INSIDE_OBJECT_BEFORE_VALUE': {\n processValueStart(char, i, 'INSIDE_OBJECT_AFTER_VALUE')\n break\n }\n\n case 'INSIDE_OBJECT_AFTER_VALUE': {\n processAfterObjectValue(char, i)\n break\n }\n\n case 'INSIDE_STRING': {\n switch (char) {\n case '\"': {\n stack.pop()\n lastValidIndex = i\n break\n }\n\n case '\\\\': {\n stack.push('INSIDE_STRING_ESCAPE')\n break\n }\n\n default: {\n lastValidIndex = i\n }\n }\n\n break\n }\n\n case 'INSIDE_ARRAY_START': {\n switch (char) {\n case ']': {\n lastValidIndex = i\n stack.pop()\n break\n }\n\n default: {\n lastValidIndex = i\n processValueStart(char, i, 'INSIDE_ARRAY_AFTER_VALUE')\n break\n }\n }\n break\n }\n\n case 'INSIDE_ARRAY_AFTER_VALUE': {\n switch (char) {\n case ',': {\n stack.pop()\n stack.push('INSIDE_ARRAY_AFTER_COMMA')\n break\n }\n\n case ']': {\n lastValidIndex = i\n stack.pop()\n break\n }\n\n default: {\n lastValidIndex = i\n break\n }\n }\n\n break\n }\n\n case 'INSIDE_ARRAY_AFTER_COMMA': {\n processValueStart(char, i, 'INSIDE_ARRAY_AFTER_VALUE')\n break\n }\n\n case 'INSIDE_STRING_ESCAPE': {\n stack.pop()\n\n if (char === 'u') {\n unicodeEscapeDigits = 0\n stack.push('INSIDE_STRING_UNICODE_ESCAPE')\n } else {\n lastValidIndex = i\n }\n\n break\n }\n\n case 'INSIDE_STRING_UNICODE_ESCAPE': {\n if (isHexDigit(char)) {\n unicodeEscapeDigits++\n\n if (unicodeEscapeDigits === 4) {\n stack.pop()\n lastValidIndex = i\n }\n }\n\n break\n }\n\n case 'INSIDE_NUMBER': {\n switch (char) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9': {\n lastValidIndex = i\n break\n }\n\n case 'e':\n case 'E':\n case '-':\n case '+':\n case '.': {\n break\n }\n\n case ',': {\n stack.pop()\n\n if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {\n processAfterArrayValue(char, i)\n }\n\n if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {\n processAfterObjectValue(char, i)\n }\n\n break\n }\n\n case '}': {\n stack.pop()\n\n if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {\n processAfterObjectValue(char, i)\n }\n\n break\n }\n\n case ']': {\n stack.pop()\n\n if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {\n processAfterArrayValue(char, i)\n }\n\n break\n }\n\n default: {\n stack.pop()\n break\n }\n }\n\n break\n }\n\n case 'INSIDE_LITERAL': {\n const partialLiteral = input.substring(literalStart!, i + 1)\n\n if (\n !'false'.startsWith(partialLiteral) &&\n !'true'.startsWith(partialLiteral) &&\n !'null'.startsWith(partialLiteral)\n ) {\n stack.pop()\n\n if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {\n processAfterObjectValue(char, i)\n } else if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {\n processAfterArrayValue(char, i)\n }\n } else {\n lastValidIndex = i\n }\n\n break\n }\n }\n }\n\n let result = input.slice(0, lastValidIndex + 1)\n\n for (let i = stack.length - 1; i >= 0; i--) {\n const state = stack[i]\n\n switch (state) {\n case 'INSIDE_STRING': {\n result += '\"'\n break\n }\n\n case 'INSIDE_OBJECT_KEY':\n case 'INSIDE_OBJECT_AFTER_KEY':\n case 'INSIDE_OBJECT_AFTER_COMMA':\n case 'INSIDE_OBJECT_START':\n case 'INSIDE_OBJECT_BEFORE_VALUE':\n case 'INSIDE_OBJECT_AFTER_VALUE': {\n result += '}'\n break\n }\n\n case 'INSIDE_ARRAY_START':\n case 'INSIDE_ARRAY_AFTER_COMMA':\n case 'INSIDE_ARRAY_AFTER_VALUE': {\n result += ']'\n break\n }\n\n case 'INSIDE_LITERAL': {\n const partialLiteral = input.substring(literalStart!, input.length)\n\n if ('true'.startsWith(partialLiteral)) {\n result += 'true'.slice(partialLiteral.length)\n } else if ('false'.startsWith(partialLiteral)) {\n result += 'false'.slice(partialLiteral.length)\n } else if ('null'.startsWith(partialLiteral)) {\n result += 'null'.slice(partialLiteral.length)\n }\n }\n }\n }\n\n return result\n}\n","import { sameValue } from './equal-json.ts'\nimport type { ToolCalledPayload } from './ai.ts'\nimport type { UIMessage, UIMessageChunk } from 'ai'\nimport { parsePartialJSON } from './parse-partial-json.ts'\n\nexport type ProjectionChunk =\n UIMessageChunk | { type: 'a2-tool-called'; call: ToolCalledPayload }\n\ntype MutablePart = Record<string, unknown>\n\ntype PartialToolCall = {\n text: string\n toolName: string\n dynamic: boolean\n providerExecuted?: boolean\n providerMetadata?: unknown\n toolMetadata?: unknown\n title?: string\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst cloneMessage = <M extends UIMessage>(messageId: string, base?: M): M =>\n (base === undefined\n ? { id: messageId, role: 'assistant', parts: [] }\n : {\n ...base,\n id: messageId,\n parts: [...base.parts],\n }) as M\n\nconst editPart = ({\n parts,\n part,\n}: {\n parts: MutablePart[]\n part: MutablePart\n}): MutablePart => {\n const index = parts.indexOf(part)\n const next = { ...part }\n parts[index] = next\n return next\n}\n\nconst currentStepParts = (parts: MutablePart[]): MutablePart[] => {\n let start = parts.length - 1\n while (start >= 0 && parts[start]?.['type'] !== 'step-start') start -= 1\n return parts.slice(start + 1)\n}\n\nconst isToolPart = (part: MutablePart): boolean =>\n typeof part['toolCallId'] === 'string' &&\n (part['type'] === 'dynamic-tool' ||\n (typeof part['type'] === 'string' && part['type'].startsWith('tool-')))\n\nconst findToolPart = (\n parts: MutablePart[],\n toolCallId: string,\n): MutablePart | undefined => {\n const current = currentStepParts(parts).find(\n (part) => isToolPart(part) && part['toolCallId'] === toolCallId,\n )\n if (current) return current\n return parts.findLast(\n (part) => isToolPart(part) && part['toolCallId'] === toolCallId,\n )\n}\n\nexport const hasToolCall = ({\n message,\n call,\n}: {\n message: UIMessage\n call: ToolCalledPayload\n}): boolean => {\n const part = findToolPart(\n message.parts as unknown as MutablePart[],\n call.toolCallId,\n )\n return (\n part !== undefined &&\n part['state'] !== 'input-streaming' &&\n sameValue(part['input'], call.input) &&\n (part['callProviderMetadata'] !== undefined ||\n call.providerMetadata === undefined) &&\n (part['toolMetadata'] !== undefined || call.toolMetadata === undefined) &&\n (call.providerExecuted === undefined ||\n part['providerExecuted'] === call.providerExecuted) &&\n (call.title === undefined || part['title'] === call.title)\n )\n}\n\nconst findApprovalPart = (\n parts: MutablePart[],\n approvalId: string,\n): MutablePart | undefined =>\n parts.find((part) => {\n const approval = part['approval']\n return (\n isToolPart(part) && isRecord(approval) && approval['id'] === approvalId\n )\n })\n\nconst setOptional = (\n target: MutablePart,\n key: string,\n value: unknown,\n): void => {\n if (value !== undefined) target[key] = value\n}\n\nconst setToolPart = (options: {\n parts: MutablePart[]\n toolCallId: string\n toolName: string\n dynamic: boolean\n state: string\n input?: unknown\n rawInput?: unknown\n output?: unknown\n errorText?: string\n preliminary?: boolean | undefined\n providerExecuted?: boolean | undefined\n providerMetadata?: unknown\n toolMetadata?: unknown\n title?: string | undefined\n}): MutablePart => {\n let part = findToolPart(options.parts, options.toolCallId)\n if (!part) {\n part = {\n type: options.dynamic ? 'dynamic-tool' : `tool-${options.toolName}`,\n ...(options.dynamic ? { toolName: options.toolName } : {}),\n toolCallId: options.toolCallId,\n }\n options.parts.push(part)\n } else part = editPart({ parts: options.parts, part })\n\n part['state'] = options.state\n part['input'] = options.input\n delete part['output']\n delete part['rawInput']\n delete part['errorText']\n delete part['preliminary']\n setOptional(part, 'rawInput', options.rawInput)\n setOptional(part, 'output', options.output)\n setOptional(part, 'errorText', options.errorText)\n setOptional(part, 'preliminary', options.preliminary)\n setOptional(part, 'providerExecuted', options.providerExecuted)\n setOptional(part, 'title', options.title)\n setOptional(part, 'toolMetadata', options.toolMetadata)\n if (options.dynamic) part['toolName'] = options.toolName\n if (options.providerMetadata !== undefined) {\n part[\n options.state === 'output-available' || options.state === 'output-error'\n ? 'resultProviderMetadata'\n : 'callProviderMetadata'\n ] = options.providerMetadata\n }\n return part\n}\n\nconst mergeMetadata = (current: unknown, update: unknown): unknown => {\n if (update === undefined || update === null) return current\n return isRecord(current) && isRecord(update)\n ? { ...current, ...update }\n : update\n}\n\nexport type UIMessageCursor = {\n text: Record<string, number>\n reasoning: Record<string, number>\n tools: Record<string, PartialToolCall>\n}\n\nexport function projectUIMessage<M extends UIMessage>(options: {\n messageId: string\n base?: M\n chunks: readonly ProjectionChunk[]\n}): M {\n return projectUIMessageStream(options).message\n}\n\nexport function projectUIMessageStream<M extends UIMessage>(options: {\n messageId: string\n base?: M\n cursor?: UIMessageCursor\n chunks: readonly ProjectionChunk[]\n}): { message: M; cursor: UIMessageCursor } {\n const message = cloneMessage(options.messageId, options.base)\n const record = message as unknown as Record<string, unknown>\n const parts = message.parts as unknown as MutablePart[]\n const activeText = new Map(\n Object.entries(options.cursor?.text ?? {}).map(([id, index]) => [\n id,\n parts[index]!,\n ]),\n )\n const activeReasoning = new Map(\n Object.entries(options.cursor?.reasoning ?? {}).map(([id, index]) => [\n id,\n parts[index]!,\n ]),\n )\n const partialTools = new Map(\n Object.entries(options.cursor?.tools ?? {}).map(([id, partial]) => [\n id,\n { ...partial },\n ]),\n )\n\n for (const chunk of options.chunks) {\n switch (chunk.type) {\n case 'text-start': {\n const part: MutablePart = {\n type: 'text',\n text: '',\n state: 'streaming',\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n }\n activeText.set(chunk.id, part)\n parts.push(part)\n break\n }\n case 'text-delta': {\n let part = activeText.get(chunk.id)\n if (!part) {\n part = { type: 'text', text: '', state: 'streaming' }\n activeText.set(chunk.id, part)\n parts.push(part)\n }\n part = editPart({ parts, part })\n activeText.set(chunk.id, part)\n part['text'] =\n `${typeof part['text'] === 'string' ? part['text'] : ''}${chunk.delta}`\n setOptional(part, 'providerMetadata', chunk.providerMetadata)\n break\n }\n case 'text-end': {\n const current = activeText.get(chunk.id)\n if (current) {\n const part = editPart({ parts, part: current })\n part['state'] = 'done'\n setOptional(part, 'providerMetadata', chunk.providerMetadata)\n activeText.delete(chunk.id)\n }\n break\n }\n case 'reasoning-start': {\n const part: MutablePart = {\n type: 'reasoning',\n text: '',\n state: 'streaming',\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n }\n activeReasoning.set(chunk.id, part)\n parts.push(part)\n break\n }\n case 'reasoning-delta': {\n let part = activeReasoning.get(chunk.id)\n if (!part) {\n part = { type: 'reasoning', text: '', state: 'streaming' }\n activeReasoning.set(chunk.id, part)\n parts.push(part)\n }\n part = editPart({ parts, part })\n activeReasoning.set(chunk.id, part)\n part['text'] =\n `${typeof part['text'] === 'string' ? part['text'] : ''}${chunk.delta}`\n setOptional(part, 'providerMetadata', chunk.providerMetadata)\n break\n }\n case 'reasoning-end': {\n const current = activeReasoning.get(chunk.id)\n if (current) {\n const part = editPart({ parts, part: current })\n part['state'] = 'done'\n setOptional(part, 'providerMetadata', chunk.providerMetadata)\n activeReasoning.delete(chunk.id)\n }\n break\n }\n case 'custom':\n parts.push({\n type: 'custom',\n kind: chunk.kind,\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n })\n break\n case 'file':\n case 'reasoning-file':\n parts.push({\n type: chunk.type,\n mediaType: chunk.mediaType,\n url: chunk.url,\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n })\n break\n case 'source-url':\n parts.push({\n type: chunk.type,\n sourceId: chunk.sourceId,\n url: chunk.url,\n ...(chunk.title === undefined ? {} : { title: chunk.title }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n })\n break\n case 'source-document':\n parts.push({\n type: chunk.type,\n sourceId: chunk.sourceId,\n mediaType: chunk.mediaType,\n title: chunk.title,\n ...(chunk.filename === undefined ? {} : { filename: chunk.filename }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n })\n break\n case 'tool-input-start': {\n partialTools.set(chunk.toolCallId, {\n text: '',\n toolName: chunk.toolName,\n dynamic: chunk.dynamic === true,\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n ...(chunk.title === undefined ? {} : { title: chunk.title }),\n })\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n dynamic: chunk.dynamic === true,\n state: 'input-streaming',\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata,\n title: chunk.title,\n })\n break\n }\n case 'tool-input-delta': {\n const partial = partialTools.get(chunk.toolCallId)\n if (!partial) break\n partial.text += chunk.inputTextDelta\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName: partial.toolName,\n dynamic: partial.dynamic,\n state: 'input-streaming',\n input: parsePartialJSON(partial.text),\n providerExecuted: partial.providerExecuted,\n providerMetadata: partial.providerMetadata,\n toolMetadata: partial.toolMetadata,\n title: partial.title,\n })\n break\n }\n case 'a2-tool-called': {\n const call = chunk.call\n const current = findToolPart(parts, call.toolCallId)\n if (current) {\n const existing = editPart({ parts, part: current })\n existing['input'] = call.input\n if (existing['state'] === 'input-streaming')\n existing['state'] = 'input-available'\n if (existing['callProviderMetadata'] === undefined)\n setOptional(existing, 'callProviderMetadata', call.providerMetadata)\n if (existing['toolMetadata'] === undefined)\n setOptional(existing, 'toolMetadata', call.toolMetadata)\n setOptional(existing, 'providerExecuted', call.providerExecuted)\n setOptional(existing, 'title', call.title)\n } else {\n setToolPart({\n parts,\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n dynamic: call.dynamic === true,\n state: 'input-available',\n input: call.input,\n providerExecuted: call.providerExecuted,\n providerMetadata: call.providerMetadata,\n toolMetadata: call.toolMetadata,\n title: call.title,\n })\n }\n partialTools.delete(call.toolCallId)\n break\n }\n case 'tool-input-available':\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n dynamic: chunk.dynamic === true,\n state: 'input-available',\n input: chunk.input,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata,\n title: chunk.title,\n })\n partialTools.delete(chunk.toolCallId)\n break\n case 'tool-input-error': {\n const existing = findToolPart(parts, chunk.toolCallId)\n const dynamic = existing?.['type'] === 'dynamic-tool' || chunk.dynamic\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n dynamic: dynamic === true,\n state: 'output-error',\n input: dynamic ? chunk.input : undefined,\n rawInput: dynamic ? undefined : chunk.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata,\n title: chunk.title,\n })\n partialTools.delete(chunk.toolCallId)\n break\n }\n case 'tool-approval-request': {\n const current = findToolPart(parts, chunk.toolCallId)\n if (!current) break\n const part = editPart({ parts, part: current })\n part['state'] = 'approval-requested'\n part['approval'] = {\n id: chunk.approvalId,\n ...(chunk.isAutomatic === true ? { isAutomatic: true } : {}),\n ...(chunk.signature === undefined\n ? {}\n : { signature: chunk.signature }),\n }\n break\n }\n case 'tool-approval-response': {\n const current = findApprovalPart(parts, chunk.approvalId)\n if (!current) break\n const part = editPart({ parts, part: current })\n const approval = isRecord(part['approval']) ? part['approval'] : {}\n part['state'] = 'approval-responded'\n part['approval'] = {\n id: chunk.approvalId,\n approved: chunk.approved,\n ...(chunk.reason === undefined ? {} : { reason: chunk.reason }),\n ...(approval['isAutomatic'] === true ? { isAutomatic: true } : {}),\n ...(typeof approval['signature'] === 'string'\n ? { signature: approval['signature'] }\n : {}),\n }\n setOptional(part, 'providerExecuted', chunk.providerExecuted)\n setOptional(part, 'callProviderMetadata', chunk.providerMetadata)\n break\n }\n case 'tool-output-available': {\n const part = findToolPart(parts, chunk.toolCallId)\n if (!part) break\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName:\n part['type'] === 'dynamic-tool' &&\n typeof part['toolName'] === 'string'\n ? part['toolName']\n : String(part['type']).slice('tool-'.length),\n dynamic: part['type'] === 'dynamic-tool',\n state: 'output-available',\n input: part['input'],\n output: chunk.output,\n preliminary: chunk.preliminary,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata ?? part['toolMetadata'],\n title: typeof part['title'] === 'string' ? part['title'] : undefined,\n })\n break\n }\n case 'tool-output-error': {\n const part = findToolPart(parts, chunk.toolCallId)\n if (!part) break\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName:\n part['type'] === 'dynamic-tool' &&\n typeof part['toolName'] === 'string'\n ? part['toolName']\n : String(part['type']).slice('tool-'.length),\n dynamic: part['type'] === 'dynamic-tool',\n state: 'output-error',\n input: part['input'],\n rawInput: part['rawInput'],\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata ?? part['toolMetadata'],\n title: typeof part['title'] === 'string' ? part['title'] : undefined,\n })\n break\n }\n case 'tool-output-denied': {\n const part = findToolPart(parts, chunk.toolCallId)\n if (part) editPart({ parts, part })['state'] = 'output-denied'\n break\n }\n case 'start-step':\n parts.push({ type: 'step-start' })\n break\n case 'finish-step':\n activeText.clear()\n activeReasoning.clear()\n break\n case 'start':\n if (\n chunk.messageMetadata !== undefined &&\n chunk.messageMetadata !== null\n ) {\n record['metadata'] = mergeMetadata(\n record['metadata'],\n chunk.messageMetadata,\n )\n }\n break\n case 'finish':\n if (\n chunk.messageMetadata !== undefined &&\n chunk.messageMetadata !== null\n ) {\n record['metadata'] = mergeMetadata(\n record['metadata'],\n chunk.messageMetadata,\n )\n }\n break\n case 'message-metadata':\n if (\n chunk.messageMetadata !== undefined &&\n chunk.messageMetadata !== null\n ) {\n record['metadata'] = mergeMetadata(\n record['metadata'],\n chunk.messageMetadata,\n )\n }\n break\n case 'abort':\n case 'error':\n break\n default: {\n if (!chunk.type.startsWith('data-') || chunk.transient) break\n const existing =\n chunk.id === undefined\n ? undefined\n : parts.find(\n (part) =>\n part['type'] === chunk.type && part['id'] === chunk.id,\n )\n if (existing) editPart({ parts, part: existing })['data'] = chunk.data\n else\n parts.push({\n type: chunk.type,\n ...(chunk.id === undefined ? {} : { id: chunk.id }),\n data: chunk.data,\n })\n }\n }\n }\n\n const indexes = new Map(parts.map((part, index) => [part, index]))\n return {\n message,\n cursor: {\n text: Object.fromEntries(\n [...activeText].map(([id, part]) => [id, indexes.get(part)!]),\n ),\n reasoning: Object.fromEntries(\n [...activeReasoning].map(([id, part]) => [id, indexes.get(part)!]),\n ),\n tools: Object.fromEntries(partialTools),\n },\n }\n}\n\nexport function pauseUIMessage<M extends UIMessage>(options: {\n message: M\n toolCallIds: ReadonlySet<string>\n}): M {\n const next = structuredClone(options.message)\n next.parts = next.parts.filter(\n (part) =>\n !('toolCallId' in part && !options.toolCallIds.has(part.toolCallId)),\n )\n for (const part of next.parts) {\n if (\n (part.type === 'text' || part.type === 'reasoning') &&\n part.state === 'streaming'\n )\n part.state = 'done'\n }\n return next\n}\n\nexport function interruptUIMessage<M extends UIMessage>(\n message: M,\n toolError = 'Tool execution was interrupted.',\n): M {\n const next = structuredClone(message)\n next.parts = next.parts.filter((value) => {\n const part = value as unknown as MutablePart\n return !isToolPart(part) || part['state'] !== 'input-streaming'\n })\n for (const value of next.parts as unknown as MutablePart[]) {\n if (value['type'] === 'text' || value['type'] === 'reasoning') {\n if (value['state'] === 'streaming') value['state'] = 'done'\n continue\n }\n if (!isToolPart(value)) continue\n const state = value['state']\n if (state === 'approval-responded') {\n const approval = value['approval']\n if (isRecord(approval) && approval['approved'] === false) {\n value['state'] = 'output-denied'\n continue\n }\n }\n if (state === 'output-available' && value['preliminary'] === true) {\n delete value['output']\n delete value['preliminary']\n value['state'] = 'output-error'\n value['errorText'] = toolError\n continue\n }\n if (\n state === 'input-available' ||\n state === 'approval-requested' ||\n state === 'approval-responded'\n ) {\n if (state === 'approval-requested') delete value['approval']\n value['state'] = 'output-error'\n value['errorText'] = toolError\n }\n }\n return next\n}\n","import type { UIMessageChunk } from 'ai'\nimport type { GenerationProgressPayload } from './ai.ts'\n\n/** Progress already in a log may name its generation by ids instead of `startIndex`. */\nexport type StoredProgressPayload =\n | GenerationProgressPayload\n | {\n requestId: string\n generationId: string\n responseMessageId: string\n chunks: UIMessageChunk[]\n }\n\nexport const progressOwnedBy = ({\n payload,\n owner,\n startIndex,\n}: {\n payload: StoredProgressPayload\n owner: { requestId: string; generationId: string; responseMessageId: string }\n startIndex: number\n}): boolean =>\n 'startIndex' in payload\n ? payload.startIndex === startIndex\n : payload.requestId === owner.requestId &&\n payload.generationId === owner.generationId &&\n payload.responseMessageId === owner.responseMessageId\n\nexport type ProgressBatch = { index: number; chunks: UIMessageChunk[] }\ntype BatchBlock = ProgressBatch[] | { left: BatchBlock; right: BatchBlock }\n\nexport type ProgressBatches = {\n length: number\n tail: ProgressBatch[]\n blocks: Array<BatchBlock | null>\n}\n\nconst PAGE_SIZE = 64\n\nexport const appendProgressBatch = ({\n batches,\n batch,\n}: {\n batches: ProgressBatches\n batch: ProgressBatch\n}): ProgressBatches => {\n if (batches.tail.length < PAGE_SIZE)\n return {\n ...batches,\n length: batches.length + 1,\n tail: [...batches.tail, batch],\n }\n\n const blocks = [...batches.blocks]\n let block: BatchBlock = batches.tail\n let level = 0\n for (;;) {\n const left = blocks[level]\n if (left == null) break\n block = { left, right: block }\n blocks[level] = null\n level += 1\n }\n blocks[level] = block\n return { length: batches.length + 1, tail: [batch], blocks }\n}\n\nexport const progressBatches = (\n items: readonly ProgressBatch[] = [],\n): ProgressBatches => {\n let batches: ProgressBatches = { length: 0, tail: [], blocks: [] }\n for (const batch of items) batches = appendProgressBatch({ batches, batch })\n return batches\n}\n\nexport const flattenProgressBatches = (\n batches: ProgressBatches,\n): ProgressBatch[] => {\n const items: ProgressBatch[] = []\n const visit = (block: BatchBlock): void => {\n if (Array.isArray(block)) items.push(...block)\n else {\n visit(block.left)\n visit(block.right)\n }\n }\n // Level n holds 2^n completed pages; higher levels contain older batches.\n for (let level = batches.blocks.length - 1; level >= 0; level -= 1) {\n const block = batches.blocks[level]\n if (block) visit(block)\n }\n items.push(...batches.tail)\n return items\n}\n","import {\n restoreMessageBase,\n updateMessageBase,\n type MessageBase,\n} from './ai-message-base.ts'\nimport type { UIMessage, UIMessageChunk } from 'ai'\nimport type {\n ActiveGenerationProjection,\n AIState,\n CompactionPart,\n CompactionPartData,\n CompactionRequestedPayload,\n ApprovalRequestedPayload,\n ApprovalRespondedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n ToolActivity,\n} from './ai.ts'\nimport {\n type UIMessageCursor,\n type ProjectionChunk,\n projectUIMessageStream,\n interruptUIMessage,\n} from './ai-projector.ts'\nimport {\n flattenProgressBatches,\n appendProgressBatch,\n progressBatches,\n type ProgressBatches,\n} from './ai-progress-batches.ts'\n\nexport type MessageProjection = Omit<ActiveGenerationProjection, 'baseTools'>\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst positionOf = (messages: readonly UIMessage[], id: string): number =>\n messages.findLastIndex((message) => message.id === id)\n\nexport const findMessage = <M extends UIMessage>(\n messages: M[],\n id: string,\n): M | undefined => messages.findLast((message) => message.id === id)\n\nexport const upsertMessage = <M extends UIMessage>(\n messages: M[],\n message: M,\n): M[] => {\n const index = positionOf(messages, message.id)\n if (index === -1) return [...messages, message]\n return messages[index] === message ? messages : messages.with(index, message)\n}\n\nexport const upsertResponse = <M extends UIMessage>(options: {\n messages: M[]\n message: M\n inputId: string\n}): M[] => {\n const { messages, message, inputId } = options\n if (positionOf(messages, message.id) !== -1)\n return upsertMessage(messages, message)\n const inputIndex = positionOf(messages, inputId)\n const position = inputIndex === -1 ? messages.length : inputIndex + 1\n return [...messages.slice(0, position), message, ...messages.slice(position)]\n}\n\nexport const answerApproval = <M extends UIMessage>(\n messages: M[],\n response: ApprovalRespondedPayload,\n): M[] =>\n messages.map((message) => {\n if (message.id !== response.messageId) return message\n let changed = false\n const parts = message.parts.map((part) => {\n const candidate = part as unknown\n if (\n !isRecord(candidate) ||\n candidate['state'] !== 'approval-requested' ||\n !isRecord(candidate['approval']) ||\n candidate['approval']['id'] !== response.approvalId\n ) {\n return part\n }\n changed = true\n return {\n ...part,\n state: 'approval-responded',\n approval: {\n ...candidate['approval'],\n approved: response.approved,\n ...(response.reason === undefined ? {} : { reason: response.reason }),\n },\n } as typeof part\n })\n return changed ? ({ ...message, parts } as M) : message\n })\n\nexport const approvalRequestedChunk = (\n payload: ApprovalRequestedPayload,\n): UIMessageChunk => ({\n type: 'tool-approval-request',\n approvalId: payload.approvalId,\n toolCallId: payload.toolCallId,\n ...(payload.isAutomatic === undefined\n ? {}\n : { isAutomatic: payload.isAutomatic }),\n ...(payload.signature === undefined ? {} : { signature: payload.signature }),\n})\n\nexport const approvalRespondedChunk = (\n payload: ApprovalRespondedPayload,\n): UIMessageChunk => ({\n type: 'tool-approval-response',\n approvalId: payload.approvalId,\n approved: payload.approved,\n ...(payload.reason === undefined ? {} : { reason: payload.reason }),\n})\n\nexport const toolCalledChunk = (\n payload: ToolCalledPayload,\n): ProjectionChunk => ({ type: 'a2-tool-called', call: payload })\n\nexport const toolResultChunk = (payload: ToolResultPayload): UIMessageChunk => {\n if (payload.phase === 'input') {\n return {\n type: 'tool-input-error',\n toolCallId: payload.toolCallId,\n toolName: payload.toolName ?? 'unknown',\n input: payload.rawInput ?? payload.input,\n errorText: payload.error ?? 'Invalid tool input',\n ...(payload.dynamic === undefined ? {} : { dynamic: payload.dynamic }),\n ...(payload.providerExecuted === undefined\n ? {}\n : { providerExecuted: payload.providerExecuted }),\n ...(payload.providerMetadata === undefined\n ? {}\n : { providerMetadata: payload.providerMetadata }),\n ...(payload.toolMetadata === undefined\n ? {}\n : { toolMetadata: payload.toolMetadata }),\n } as UIMessageChunk\n }\n if (payload.denied === true) {\n return {\n type: 'tool-output-denied',\n toolCallId: payload.toolCallId,\n } as UIMessageChunk\n }\n if (payload.error !== undefined) {\n return {\n type: 'tool-output-error',\n toolCallId: payload.toolCallId,\n errorText: payload.error,\n ...(payload.dynamic === undefined ? {} : { dynamic: payload.dynamic }),\n ...(payload.providerExecuted === undefined\n ? {}\n : { providerExecuted: payload.providerExecuted }),\n ...(payload.providerMetadata === undefined\n ? {}\n : { providerMetadata: payload.providerMetadata }),\n ...(payload.toolMetadata === undefined\n ? {}\n : { toolMetadata: payload.toolMetadata }),\n } as UIMessageChunk\n }\n return {\n type: 'tool-output-available',\n toolCallId: payload.toolCallId,\n output: payload.output,\n ...(payload.preliminary === undefined\n ? {}\n : { preliminary: payload.preliminary }),\n ...(payload.dynamic === undefined ? {} : { dynamic: payload.dynamic }),\n ...(payload.providerExecuted === undefined\n ? {}\n : { providerExecuted: payload.providerExecuted }),\n ...(payload.providerMetadata === undefined\n ? {}\n : { providerMetadata: payload.providerMetadata }),\n ...(payload.toolMetadata === undefined\n ? {}\n : { toolMetadata: payload.toolMetadata }),\n } as UIMessageChunk\n}\n\nexport const projectedMessageStream = <M extends UIMessage>({\n projection,\n current,\n}: {\n projection: MessageProjection\n current: M | undefined\n}): { message: M; cursor: UIMessageCursor; throughIndex: number } => {\n const base = restoreMessageBase({ current, base: projection.base })\n const projectionEvents: Array<{\n index: number\n chunks: readonly ProjectionChunk[]\n }> = flattenProgressBatches(projection.batches)\n for (const event of projection.toolEvents) {\n projectionEvents.push({\n index: event.index,\n chunks: [\n event.type === 'ai.tool.called'\n ? toolCalledChunk(event.payload)\n : toolResultChunk(event.payload),\n ],\n })\n }\n for (const event of projection.approvalEvents) {\n projectionEvents.push({\n index: event.index,\n chunks: [\n event.type === 'ai.approval.requested'\n ? approvalRequestedChunk(event.payload)\n : approvalRespondedChunk(event.payload),\n ],\n })\n }\n const ordered = projectionEvents.toSorted(\n (left, right) => left.index - right.index,\n )\n return {\n ...projectUIMessageStream<M>({\n messageId: projection.responseMessageId,\n ...(base === undefined ? {} : { base }),\n chunks: ordered.flatMap((event) => event.chunks),\n }),\n throughIndex: ordered.at(-1)?.index ?? 0,\n }\n}\n\nexport const projectedMessage = <M extends UIMessage>(options: {\n projection: MessageProjection\n current: M | undefined\n}): M => projectedMessageStream(options).message\n\nexport const reduceToolActivity = (\n tools: ToolActivity[],\n event:\n | { type: 'ai.tool.called'; payload: ToolCalledPayload }\n | { type: 'ai.tool.result'; payload: ToolResultPayload },\n): ToolActivity[] => {\n if (event.type === 'ai.tool.called') {\n const payload = event.payload\n const activity: ToolActivity = {\n requestId: payload.requestId,\n messageId: payload.messageId,\n generationId: payload.generationId,\n toolCallId: payload.toolCallId,\n toolName: payload.toolName,\n ...(payload.dynamic === undefined ? {} : { dynamic: payload.dynamic }),\n ...(payload.providerExecuted === undefined\n ? {}\n : { providerExecuted: payload.providerExecuted }),\n ...(payload.title === undefined ? {} : { title: payload.title }),\n status: 'running',\n }\n return [\n ...tools.filter(\n (candidate) =>\n candidate.generationId !== payload.generationId ||\n candidate.toolCallId !== payload.toolCallId,\n ),\n activity,\n ]\n }\n\n const payload = event.payload\n const existing = tools.find(\n (candidate) =>\n candidate.generationId === payload.generationId &&\n candidate.toolCallId === payload.toolCallId,\n )\n const toolName = payload.toolName ?? existing?.toolName\n const dynamic = payload.dynamic ?? existing?.dynamic\n const providerExecuted =\n payload.providerExecuted ?? existing?.providerExecuted\n const activity: ToolActivity = {\n requestId: payload.requestId,\n messageId: payload.messageId,\n generationId: payload.generationId,\n toolCallId: payload.toolCallId,\n ...(toolName === undefined ? {} : { toolName }),\n ...(payload.error === undefined ? {} : { error: payload.error }),\n ...(payload.preliminary === undefined\n ? {}\n : { preliminary: payload.preliminary }),\n ...(payload.phase === undefined ? {} : { phase: payload.phase }),\n ...(dynamic === undefined ? {} : { dynamic }),\n ...(providerExecuted === undefined ? {} : { providerExecuted }),\n ...(existing?.title === undefined ? {} : { title: existing.title }),\n status: payload.denied\n ? 'denied'\n : payload.error\n ? 'failed'\n : payload.preliminary\n ? 'running'\n : 'completed',\n }\n return [\n ...tools.filter(\n (candidate) =>\n candidate.generationId !== payload.generationId ||\n candidate.toolCallId !== payload.toolCallId,\n ),\n activity,\n ]\n}\n\nexport const advanceProjection = <M extends UIMessage>({\n projection,\n base,\n chunks,\n index,\n}: {\n projection: MessageProjection\n base: M | undefined\n chunks: UIMessageChunk[]\n index: number\n}): {\n message: M\n batches: ProgressBatches\n cursor: NonNullable<MessageProjection['cursor']>\n} => {\n const ordered = index > (projection.batches.tail.at(-1)?.index ?? -1)\n const batches = ordered\n ? appendProgressBatch({\n batches: projection.batches,\n batch: { index, chunks },\n })\n : progressBatches(\n [\n ...flattenProgressBatches(projection.batches).filter(\n (batch) => batch.index !== index,\n ),\n { index, chunks },\n ].toSorted((left, right) => left.index - right.index),\n )\n const incremental =\n base !== undefined &&\n projection.cursor != null &&\n index > projection.cursor.throughIndex\n const projected = incremental\n ? projectUIMessageStream({\n messageId: projection.responseMessageId,\n base,\n cursor: projection.cursor!.stream,\n chunks,\n })\n : projectedMessageStream({\n projection: { ...projection, batches },\n current: base,\n })\n return {\n message: projected.message,\n batches,\n cursor: {\n throughIndex: incremental\n ? index\n : Math.max(\n index,\n batches.tail.at(-1)?.index ?? 0,\n projection.toolEvents.reduce(\n (latest, event) => Math.max(latest, event.index),\n 0,\n ),\n projection.approvalEvents.reduce(\n (latest, event) => Math.max(latest, event.index),\n 0,\n ),\n ),\n stream: projected.cursor,\n },\n }\n}\n\nexport const projectedTools = (\n projection: ActiveGenerationProjection,\n): ToolActivity[] =>\n projection.toolEvents.reduce(\n (tools, event) => reduceToolActivity(tools, event),\n projection.baseTools,\n )\n\nexport const restoreGenerationBase = <M extends UIMessage>(\n state: AIState<M>,\n generationId: string,\n responseMessageId: string,\n reason: 'interrupted' | 'superseded' | 'failed',\n): AIState<M> => {\n const projection =\n state.activeProjection?.generationId === generationId\n ? state.activeProjection\n : null\n const restored = restoreMessageBase({\n current: findMessage(state.messages, responseMessageId),\n base: projection?.base,\n })\n // A superseded attempt's unfinished compaction reruns in its replacement;\n // a completed one stays in effect, and so does its part.\n const base =\n restored !== undefined && reason === 'superseded'\n ? withoutRunningCompactionPart(restored, generationId)\n : restored\n return {\n ...state,\n messages:\n base === undefined\n ? state.messages.filter((message) => message.id !== responseMessageId)\n : upsertMessage(state.messages, base),\n tools:\n projection === null\n ? state.tools.filter(\n (activity) => activity.generationId !== generationId,\n )\n : projection.baseTools,\n pendingApprovals: state.pendingApprovals.filter(\n (approval) => approval.generationId !== generationId,\n ),\n pendingInputs: state.pendingInputs.filter(\n (input) => input.generationId !== generationId,\n ),\n activeGeneration: null,\n activeProjection: null,\n terminalGenerations: {\n ...state.terminalGenerations,\n [generationId]: reason,\n },\n compaction:\n projection === null\n ? state.compaction?.generationId === generationId\n ? null\n : state.compaction\n : (projection.baseCompaction ?? null),\n }\n}\n\nexport const stopGenerationTools = (\n tools: ToolActivity[],\n generationId: string | undefined,\n responseMessageId: string,\n error: string,\n): ToolActivity[] =>\n tools.map((activity) =>\n activity.status === 'running' &&\n (generationId === undefined\n ? activity.messageId === responseMessageId\n : activity.generationId === generationId)\n ? { ...activity, status: 'failed', error, preliminary: false }\n : activity,\n )\n\nexport const interruptGenerationProjection = <M extends UIMessage>(\n state: AIState<M>,\n generationId: string,\n responseMessageId: string,\n cutoff: number,\n): AIState<M> | null => {\n const projection =\n state.activeProjection?.generationId === generationId\n ? state.activeProjection\n : null\n if (projection === null) return null\n const retained: ActiveGenerationProjection = {\n ...projection,\n batches: progressBatches(\n flattenProgressBatches(projection.batches).filter(\n (batch) => batch.index <= cutoff,\n ),\n ),\n toolEvents: projection.toolEvents.filter(\n (toolEvent) => toolEvent.index <= cutoff,\n ),\n approvalEvents: projection.approvalEvents.filter(\n (approvalEvent) => approvalEvent.index <= cutoff,\n ),\n }\n const shouldProject =\n retained.base !== undefined || retained.batches.length > 0\n const restored = restoreGenerationBase(\n state,\n generationId,\n responseMessageId,\n 'interrupted',\n )\n return {\n ...restored,\n messages: shouldProject\n ? upsertMessage(\n state.messages,\n interruptUIMessage(\n projectedMessage({\n projection: retained,\n current: findMessage(state.messages, responseMessageId),\n }),\n ),\n )\n : restored.messages,\n tools: stopGenerationTools(\n projectedTools(retained),\n generationId,\n responseMessageId,\n 'Tool execution was interrupted.',\n ),\n usage:\n projection.completionIndex === undefined ||\n projection.completionIndex <= cutoff\n ? restored.usage\n : restored.usage.filter((entry) => entry.generationId !== generationId),\n }\n}\n\nexport const retainMessageBase = <\n S extends {\n messages: UIMessage[]\n activeProjection: { responseMessageId: string; base?: MessageBase } | null\n },\n>(options: {\n before: S\n after: S\n}): S => {\n const { before, after } = options\n const projection = after.activeProjection\n if (\n before.messages === after.messages ||\n !projection?.base ||\n projection.base !== before.activeProjection?.base\n )\n return after\n const previous = findMessage(before.messages, projection.responseMessageId)\n const current = findMessage(after.messages, projection.responseMessageId)\n if (previous !== undefined && previous === current) return after\n // A response removed or rewritten outside this tracking (for example, by an\n // extension's own transition) cannot be restored, so a later re-created\n // message must not inherit the stale recovery.\n const base =\n previous &&\n current &&\n updateMessageBase({\n base: projection.base,\n before: previous,\n after: current,\n })\n const { base: _stale, ...unrecoverable } = projection\n return {\n ...after,\n activeProjection: base ? { ...unrecoverable, base } : unrecoverable,\n }\n}\n\nexport const isCompactionPart = (part: {\n type: string\n}): part is CompactionPart => part.type === 'data-a2-compaction'\n\nconst compactionPartOf = (message: UIMessage, generationId: string): number =>\n message.parts.findIndex(\n (part) => isCompactionPart(part) && part.id === generationId,\n )\n\nconst withoutRunningCompactionPart = <M extends UIMessage>(\n message: M,\n generationId: string,\n): M => {\n const index = compactionPartOf(message, generationId)\n const part = message.parts[index]\n return part !== undefined &&\n isCompactionPart(part) &&\n part.data.status === 'running'\n ? { ...message, parts: message.parts.toSpliced(index, 1) }\n : message\n}\n\n/**\n * Compaction runs before its model step streams, so the part lands between\n * the response's earlier steps and this one. Counting it in the step's base\n * keeps it through Stop cutoffs, failures, and retries of that step.\n */\nexport const addCompactionPart = <M extends UIMessage>(\n state: AIState<M>,\n payload: CompactionRequestedPayload,\n): AIState<M> => {\n const projection = state.activeProjection\n if (projection?.generationId !== payload.generationId) return state\n const current = findMessage(state.messages, projection.responseMessageId)\n if (\n current === undefined\n ? projection.base !== undefined\n : projection.base?.partCount !== current.parts.length\n )\n return state\n const inputTokens = payload.inputTokens ?? payload.inputTokenEstimate\n const part: CompactionPart = {\n type: 'data-a2-compaction',\n id: payload.generationId,\n data: {\n status: 'running',\n ...(inputTokens === undefined ? {} : { inputTokens }),\n ...(payload.thresholdTokens === undefined\n ? {}\n : { thresholdTokens: payload.thresholdTokens }),\n },\n }\n const message = (\n current === undefined\n ? { id: projection.responseMessageId, role: 'assistant', parts: [part] }\n : { ...current, parts: [...current.parts, part] }\n ) as M\n return {\n ...state,\n messages: upsertResponse({\n messages: state.messages,\n message,\n inputId: state.activeGeneration?.messageId ?? message.id,\n }),\n activeProjection: {\n ...projection,\n cursor: null,\n base:\n projection.base === undefined\n ? { partCount: 1 }\n : { ...projection.base, partCount: projection.base.partCount + 1 },\n },\n }\n}\n\nexport const settleCompactionPart = <M extends UIMessage>(options: {\n state: AIState<M>\n generationId: string\n data: Partial<CompactionPartData>\n}): AIState<M> => {\n const { state, generationId, data } = options\n const position = state.messages.findLastIndex(\n (message) => compactionPartOf(message, generationId) !== -1,\n )\n if (position === -1) return state\n const message = state.messages[position]!\n const index = compactionPartOf(message, generationId)\n const part = message.parts[index] as unknown as CompactionPart\n return {\n ...state,\n messages: state.messages.with(position, {\n ...message,\n parts: message.parts.with(index, {\n ...part,\n data: { ...part.data, ...data },\n } as unknown as M['parts'][number]),\n }),\n }\n}\n\n/** A running compaction whose state reverted without completing was abandoned. */\nexport const settleAbandonedCompaction = <M extends UIMessage>(\n before: AIState<M>,\n after: AIState<M>,\n): AIState<M> => {\n const running = before.compaction\n if (\n running?.status !== 'running' ||\n after.compaction === running ||\n (after.compaction?.status === 'completed' &&\n after.compaction.generationId === running.generationId)\n )\n return after\n const interrupted =\n after.status === 'closed' ||\n after.pausedGenerationIds?.[running.generationId] === true ||\n after.terminalGenerations?.[running.generationId] === 'interrupted'\n return settleCompactionPart({\n state: after,\n generationId: running.generationId,\n data: { status: interrupted ? 'interrupted' : 'failed' },\n })\n}\n","import type { UIMessage } from 'ai'\nimport type { AIState } from './ai.ts'\nimport type { ControlCommand, InboxItem } from './ai-control.ts'\nimport {\n interruptGenerationProjection,\n settleAbandonedCompaction,\n} from './ai-message-projection.ts'\n\nexport type QueueCommand<M extends UIMessage> = Extract<\n ControlCommand<M>,\n {\n action:\n | 'send'\n | 'edit'\n | 'move'\n | 'remove'\n | 'send-now'\n | 'steer'\n | 'pause'\n | 'resume'\n | 'stop'\n }\n>\nexport type PendingQueueCommand<M extends UIMessage> = {\n commandId: string\n command: QueueCommand<M>\n}\n\nexport const isQueueCommand = <M extends UIMessage>(\n command: ControlCommand<M>,\n): command is QueueCommand<M> =>\n command.action === 'send' ||\n command.action === 'edit' ||\n command.action === 'move' ||\n command.action === 'remove' ||\n command.action === 'send-now' ||\n command.action === 'steer' ||\n command.action === 'pause' ||\n command.action === 'resume' ||\n command.action === 'stop'\n\nconst moveItem = <M extends UIMessage>({\n items,\n inputId,\n beforeId,\n}: {\n items: InboxItem<M>[]\n inputId: string\n beforeId: string | null\n}): InboxItem<M>[] => {\n const from = items.findIndex((item) => item.id === inputId)\n if (\n from < 0 ||\n inputId === beforeId ||\n (beforeId !== null && !items.some((item) => item.id === beforeId))\n )\n return items\n const next = [...items]\n const [item] = next.splice(from, 1)\n const to =\n beforeId === null\n ? next.length\n : next.findIndex((entry) => entry.id === beforeId)\n next.splice(to, 0, item!)\n return next\n}\n\nexport function projectAIClientState<M extends UIMessage>(\n state: AIState<M>,\n): AIState<M> {\n const pending = state.pendingQueueCommands ?? []\n if (state.status === 'closed') return state\n if (\n pending.length === 0 &&\n !state.inbox.items.some((item) => item.afterStepOf !== undefined)\n )\n return state\n let messages = state.messages\n let { items, paused } = state.inbox\n let turnId = state.active?.turnId ?? null\n let starting = false\n let suspended =\n state.active?.phase === 'paused' || state.active?.phase === 'pausing'\n let messageIds: Set<string> | undefined\n const show = (message: M): void => {\n messageIds ??= new Set(messages.map((item) => item.id))\n if (messageIds.has(message.id)) return\n if (messages === state.messages) messages = state.messages.slice()\n messages.push(message)\n messageIds.add(message.id)\n }\n const admit = (): void => {\n if (turnId !== null || paused || items.length === 0) return\n let count = 0\n for (const item of items) {\n count += 1\n show(item.message)\n if (item.generate) {\n turnId = item.id\n starting = true\n suspended = false\n break\n }\n }\n if (count > 0) items = items.slice(count)\n }\n for (const { command } of pending) {\n switch (command.action) {\n case 'send':\n case 'steer': {\n if (\n items.some((item) => item.id === command.message.id) ||\n turnId === command.message.id\n )\n break\n const item = {\n ...(command.action === 'steer'\n ? { afterStepOf: command.turnId }\n : {}),\n id: command.message.id,\n message: command.message,\n generate:\n command.message.role === 'user' &&\n (command.action === 'steer' || command.generate !== false),\n }\n items = command.action === 'steer' ? [item, ...items] : [...items, item]\n break\n }\n case 'edit':\n items = items.map((item) =>\n item.id === command.message.id &&\n item.message.role === command.message.role\n ? { ...item, message: command.message }\n : item,\n )\n break\n case 'move':\n items = moveItem({\n items,\n inputId: command.inputId,\n beforeId: command.beforeId,\n })\n break\n case 'remove':\n items = items.filter((item) => item.id !== command.inputId)\n break\n case 'send-now': {\n if (turnId !== command.turnId) break\n const selected = items.find((item) => item.id === command.inputId)\n if (!selected || selected.message.role !== 'user') break\n items = items.map((item) =>\n item.id === selected.id\n ? {\n ...item,\n generate: true,\n ...(turnId === null ? {} : { afterStepOf: turnId }),\n }\n : item,\n )\n items = moveItem({\n items,\n inputId: command.inputId,\n beforeId: items[0]?.id ?? null,\n })\n break\n }\n case 'pause':\n paused = true\n if (command.when === 'now') suspended = true\n break\n case 'resume':\n paused = false\n suspended = false\n break\n case 'stop':\n continue\n }\n admit()\n }\n items = items.filter((item) => {\n if (item.afterStepOf === undefined) return true\n show(item.message)\n return false\n })\n const displayed = {\n ...state,\n messages,\n inbox: { items, paused },\n starting: starting && !suspended,\n }\n const stop = pending.find(\n ({ command }) =>\n command.action === 'stop' && command.turnId === state.active?.turnId,\n )?.command\n if (stop?.action !== 'stop') return displayed\n const projection = state.activeProjection\n const stopped =\n projection === null\n ? displayed\n : (interruptGenerationProjection(\n displayed,\n projection.generationId,\n projection.responseMessageId,\n stop.lastSeenIndex ?? Number.POSITIVE_INFINITY,\n ) ?? displayed)\n return settleAbandonedCompaction(displayed, {\n ...stopped,\n active: null,\n status: paused ? 'paused' : 'idle',\n starting: false,\n activeGeneration: null,\n activeRequestId: null,\n activeRequestReason: null,\n activeRequestSourceGenerationId: null,\n activeResponseMessageId: null,\n pendingApprovals: [],\n pendingInputs: [],\n error: null,\n })\n}\n","import type {\n AIControlState,\n ControlCommit,\n ControlChange,\n} from './ai-control.ts'\nimport type { UIMessage } from 'ai'\n\ntype RecordValue = Record<string, unknown> | unknown[]\nconst container = (value: unknown): value is RecordValue =>\n typeof value === 'object' && value !== null\nconst same = (left: unknown, right: unknown): boolean =>\n JSON.stringify(left) === JSON.stringify(right)\n\nexport const controlChanges = ({\n before,\n after,\n}: {\n before: unknown\n after: unknown\n}): ControlChange[] => {\n const changes: ControlChange[] = []\n const visit = (\n left: unknown,\n right: unknown,\n path: (string | number)[],\n ): void => {\n if (same(left, right)) return\n if (Array.isArray(left) && Array.isArray(right)) {\n let prefix = 0\n while (\n prefix < Math.min(left.length, right.length) &&\n same(left[prefix], right[prefix])\n )\n prefix += 1\n let suffix = 0\n while (\n suffix < Math.min(left.length, right.length) - prefix &&\n same(left[left.length - 1 - suffix], right[right.length - 1 - suffix])\n )\n suffix += 1\n if (left.length === right.length) {\n for (let index = prefix; index < left.length - suffix; index += 1)\n visit(left[index], right[index], [...path, index])\n } else\n changes.push({\n path,\n splice: {\n index: prefix,\n deleteCount: left.length - prefix - suffix,\n items: right.slice(prefix, right.length - suffix),\n },\n })\n return\n }\n if (\n container(left) &&\n container(right) &&\n !Array.isArray(left) &&\n !Array.isArray(right)\n ) {\n if (Object.keys(right).length === 0) {\n changes.push({ path, value: right })\n return\n }\n for (const key of Object.keys(left))\n if (!Object.hasOwn(right, key))\n changes.push({ path: [...path, key], remove: true })\n for (const key of Object.keys(right))\n visit(Object.hasOwn(left, key) ? left[key] : undefined, right[key], [\n ...path,\n key,\n ])\n return\n }\n changes.push({ path, value: right })\n }\n visit(before, after, [])\n return changes\n}\n\nexport const applyControlChanges = <T>({\n state,\n changes,\n}: {\n state: T\n changes: readonly ControlChange[]\n}): T => {\n if (changes.length === 0) return state\n let next = structuredClone(state)\n for (const change of changes) {\n const path = change.path\n if (path.length === 0) {\n next = structuredClone(change.value) as T\n continue\n }\n let target: unknown = next\n for (const key of path.slice(0, -1)) {\n if (!container(target) || !Object.hasOwn(target, key))\n throw new TypeError('Invalid AI control change path')\n target = (target as Record<string | number, unknown>)[key]\n }\n if (!container(target))\n throw new TypeError('Invalid AI control change target')\n const parent = target as Record<string | number, unknown>\n const key = path.at(-1)!\n if (change.remove) delete parent[key]\n else if (change.splice) {\n const items = parent[key] as unknown[]\n Object.defineProperty(parent, key, {\n value: [\n ...items.slice(0, change.splice.index),\n ...structuredClone(change.splice.items),\n ...items.slice(change.splice.index + change.splice.deleteCount),\n ],\n enumerable: true,\n configurable: true,\n writable: true,\n })\n } else if (change.move) {\n const items = parent[key] as unknown[]\n const [item] = items.splice(change.move.from, 1)\n items.splice(change.move.to, 0, item)\n } else\n Object.defineProperty(parent, key, {\n value: structuredClone(change.value),\n enumerable: true,\n configurable: true,\n writable: true,\n })\n }\n return next\n}\n\nexport const controlCommit = <M extends UIMessage>(options: {\n before: AIControlState<M>\n after: AIControlState<M>\n moves: ControlChange[]\n}): ControlCommit => {\n const active = options.after.active\n const response = options.after.coordinator.response\n return {\n changes: [\n ...options.moves,\n ...controlChanges({ before: options.before, after: options.after }),\n ],\n view: {\n turnId: active?.turnId ?? null,\n version: active?.version ?? null,\n phase: active?.phase ?? null,\n paused: options.after.inbox.paused,\n closed: options.after.coordinator.closed,\n requestId: response?.activeRequestId ?? null,\n requestReason: response?.requestReason ?? null,\n sourceGenerationId: response?.sourceGenerationId ?? null,\n responseMessageId: response?.responseMessageId ?? null,\n },\n }\n}\n","import type { UIMessage } from 'ai'\nimport type { AICoordinatorState } from './ai-coordinator.ts'\nimport type {\n ApprovalRespondedPayload,\n GenerationStartedPayload,\n GenerationReason,\n InputRequestedPayload,\n InputRespondedPayload,\n MessageInterruptedPayload,\n RetryRequestedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\n\nexport type InboxItem<M extends UIMessage = UIMessage> = {\n id: string\n message: M\n generate: boolean\n afterStepOf?: string\n}\n\nexport type ControlCommand<M extends UIMessage = UIMessage> =\n | { action: 'send'; message: M; generate?: boolean }\n | { action: 'edit'; message: M }\n | { action: 'move'; inputId: string; beforeId: string | null }\n | { action: 'remove'; inputId: string }\n | {\n action: 'send-now'\n inputId: string\n turnId: string | null\n lastSeenIndex?: number\n }\n | { action: 'stop'; turnId: string; lastSeenIndex?: number }\n | { action: 'steer'; turnId: string; message: M; lastSeenIndex?: number }\n | { action: 'pause'; when: 'now' | 'after-turn' }\n | { action: 'resume' }\n | { action: 'tool-result'; result: ToolResultPayload }\n | { action: 'approval'; response: ApprovalRespondedPayload }\n | { action: 'input'; response: InputRespondedPayload }\n | { action: 'request-input'; request: InputRequestedPayload }\n | { action: 'retry'; request: RetryRequestedPayload }\n | { action: 'interrupt'; request: MessageInterruptedPayload }\n\nexport type ControlReceipt = {\n commandId: string\n work?: true\n outcome: 'applied' | 'rejected'\n reason?:\n | 'not-pending'\n | 'role-mismatch'\n | 'stale-turn'\n | 'not-found'\n | 'closed'\n | 'stale-work'\n | 'not-user-input'\n}\n\nexport type ActiveTurn<M extends UIMessage = UIMessage> = {\n turnId: string\n input: InboxItem<M>\n phase:\n | 'starting'\n | 'generating'\n | 'tools'\n | 'waiting'\n | 'failed'\n | 'pausing'\n | 'paused'\n}\n\nexport type ControlWork = {\n id: string\n version: number\n settled: boolean\n attempt?: number\n facts?: string[]\n}\n\nexport type AIControlState<M extends UIMessage = UIMessage> = {\n pendingStops: Record<string, string>\n inbox: { paused: boolean; items: InboxItem<M>[] }\n active:\n | (ActiveTurn<M> & {\n version: number\n suspended: boolean\n model: ControlWork | null\n })\n | null\n coordinator: AICoordinatorState\n}\n\nexport type WorkFact = { type: string; id: string; payload: unknown }\nexport type WorkReport = {\n attempt: number\n workId: string\n turnId: string\n version: number\n kind: 'model' | 'tool'\n settled: boolean\n events: WorkFact[]\n}\n\nexport type ToolExecutionRequest = {\n turnId: string\n version: number\n call: ToolCalledPayload\n generation: GenerationStartedPayload\n}\n\nexport const initialControlState = <\n M extends UIMessage,\n>(): AIControlState<M> => ({\n pendingStops: {},\n inbox: { paused: false, items: [] },\n active: null,\n coordinator: { closed: false, queued: [] },\n})\n\nexport type ControlChange = {\n path: (string | number)[]\n value?: unknown\n remove?: true\n splice?: { index: number; deleteCount: number; items: unknown[] }\n move?: { from: number; to: number }\n}\n\nexport type ControlCommit = {\n changes: ControlChange[]\n view: {\n turnId: string | null\n version: number | null\n phase: ActiveTurn['phase'] | null\n paused: boolean\n closed: boolean\n requestId: string | null\n requestReason: GenerationReason | null\n sourceGenerationId: string | null\n responseMessageId: string | null\n }\n}\n","import { idempotentId } from './idempotent-id.ts'\n\nexport const AI_EVENT_ID_PREFIX = 'a2.ai:'\n\nexport const aiEventId = async (...parts: string[]): Promise<string> =>\n `${AI_EVENT_ID_PREFIX}${await idempotentId(...parts)}`\n","import { assertMessageBase, restoreMessageBase } from './ai-message-base.ts'\nimport { sameValue } from './equal-json.ts'\nimport type { UIMessage } from 'ai'\nimport type { AIState } from './ai.ts'\nimport type { MessageProjection } from './ai-message-projection.ts'\nimport type { EventDefs } from './contract.ts'\nimport type { Reducer } from './reducer.ts'\nimport { withReducerRuntime } from './reducer-runtime.ts'\n\ntype Value =\n null | boolean | number | string | Value[] | { [key: string]: Value }\ntype Payload = { value?: unknown }\ntype Undo =\n | { value: Value }\n | { length: number; items: Record<string, Undo> }\n | { fields: Record<string, Undo>; remove: string[] }\n\ntype Projection = {\n fields: Value\n tools?: Undo\n}\n\nexport type AIStoredState = {\n version: 3\n fields: Value\n projection: Projection | null\n values: Payload[]\n}\n\nexport type AIStoredView = {\n messages: UIMessage[]\n activeProjection:\n (MessageProjection & { baseTools?: AIState['tools'] }) | null\n tools?: AIState['tools']\n usage?: AIState['usage']\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst hasKeys = (\n value: unknown,\n { required, optional = [] }: { required: string[]; optional?: string[] },\n): value is Record<string, unknown> =>\n isRecord(value) &&\n required.every((key) => Object.hasOwn(value, key)) &&\n Object.keys(value).every(\n (key) => required.includes(key) || optional.includes(key),\n )\n\nconst reference = (value: Value): number | undefined => {\n if (!isRecord(value) || !Object.hasOwn(value, '$a2Value')) return undefined\n const id = value['$a2Value']\n if (\n typeof id !== 'number' ||\n !Number.isSafeInteger(id) ||\n id < 0 ||\n Object.keys(value).length !== 1\n )\n throw new TypeError('invalid AI payload reference')\n return id\n}\n\nconst payloadFields = new Set([\n 'input',\n 'output',\n 'rawInput',\n 'metadata',\n 'providerMetadata',\n 'callProviderMetadata',\n 'resultProviderMetadata',\n 'toolMetadata',\n 'data',\n])\n\nconst keyFor = (value: unknown): string =>\n value === undefined ? 'undefined' : JSON.stringify(value)\n\nconst restore = (current: Value, undo: Undo | undefined): Value => {\n if (undo === undefined) return current\n if (!isRecord(undo)) throw new TypeError('invalid AI recovery change')\n if ('value' in undo) {\n if (!hasKeys(undo, { required: ['value'] }))\n throw new TypeError('invalid AI replacement recovery')\n return undo.value\n }\n if ('length' in undo) {\n if (\n !hasKeys(undo, { required: ['length', 'items'] }) ||\n !Number.isSafeInteger(undo.length) ||\n undo.length < 0 ||\n undo.length > 0xffffffff ||\n !isRecord(undo.items) ||\n !Array.isArray(current)\n )\n throw new TypeError('invalid AI array recovery')\n const items = Object.entries(undo.items)\n let added = 0\n for (const [key, patch] of items) {\n const index = Number(key)\n if (\n !Number.isSafeInteger(index) ||\n index < 0 ||\n index >= undo.length ||\n String(index) !== key ||\n patch === undefined\n )\n throw new TypeError('invalid AI array recovery index')\n if (index >= current.length) added += 1\n }\n if (added !== Math.max(0, undo.length - current.length))\n throw new TypeError('incomplete AI array recovery')\n const result = current.slice(0, undo.length)\n result.length = undo.length\n for (const [index, patch] of items)\n result[Number(index)] = restore(current[Number(index)] ?? null, patch)\n return result\n }\n if (\n !hasKeys(undo, { required: ['fields', 'remove'] }) ||\n !isRecord(undo.fields) ||\n !Array.isArray(undo.remove) ||\n Object.keys(undo.remove).length !== undo.remove.length ||\n Array.from(undo.remove).some((key) => typeof key !== 'string') ||\n new Set(undo.remove).size !== undo.remove.length ||\n !isRecord(current) ||\n reference(current) !== undefined\n )\n throw new TypeError('invalid AI object recovery')\n const result = { ...current } as Record<string, Value>\n for (const key of undo.remove) delete result[key]\n for (const [key, patch] of Object.entries(undo.fields)) {\n if (patch === undefined || undo.remove.includes(key))\n throw new TypeError('invalid AI object recovery field')\n Object.defineProperty(result, key, {\n value: restore(Object.hasOwn(result, key) ? result[key]! : null, patch),\n enumerable: true,\n configurable: true,\n writable: true,\n })\n }\n return result\n}\n\nconst difference = (current: Value, before: Value): Undo | undefined => {\n if (current === before) return undefined\n if (reference(current) !== undefined || reference(before) !== undefined)\n return reference(current) === reference(before)\n ? undefined\n : { value: before }\n if (Array.isArray(current) && Array.isArray(before)) {\n const items: Record<string, Undo> = {}\n for (const [index, value] of before.entries()) {\n const patch =\n index < current.length ? difference(current[index]!, value) : { value }\n if (patch !== undefined) items[index] = patch\n }\n return current.length === before.length && Object.keys(items).length === 0\n ? undefined\n : { length: before.length, items }\n }\n if (isRecord(current) && isRecord(before)) {\n const fields: Record<string, Undo> = {}\n const remove = Object.keys(current).filter(\n (key) => !Object.hasOwn(before, key),\n )\n for (const [key, value] of Object.entries(before)) {\n const patch = Object.hasOwn(current, key)\n ? difference(current[key] as Value, value as Value)\n : { value: value as Value }\n if (patch !== undefined)\n Object.defineProperty(fields, key, {\n value: patch,\n enumerable: true,\n configurable: true,\n writable: true,\n })\n }\n return remove.length === 0 && Object.keys(fields).length === 0\n ? undefined\n : { fields, remove }\n }\n return { value: before }\n}\n\nconst storeState = <S extends AIStoredView>(state: S): AIStoredState => {\n const packed = new WeakMap<object, Value>()\n const values: Payload[] = []\n const ids = new Map<unknown, number>()\n const contents = new Map<string, number[]>()\n const intern = (value: unknown): Value => {\n let id = ids.get(value)\n if (id !== undefined) return { $a2Value: id }\n const key =\n typeof value === 'object' && value !== null ? keyFor(value) : undefined\n const candidates = key === undefined ? undefined : contents.get(key)\n if (candidates !== undefined)\n id = candidates.find((candidate) =>\n sameValue(values[candidate]!.value, value),\n )\n if (id === undefined) {\n id = values.length\n values.push(value === undefined ? {} : { value })\n }\n ids.set(value, id)\n if (key !== undefined && !candidates?.includes(id))\n contents.set(key, [...(candidates ?? []), id])\n return { $a2Value: id }\n }\n const pack = (value: unknown, field?: string): Value => {\n if (\n value === undefined ||\n (typeof value === 'string' && value.length > 80) ||\n (field !== undefined &&\n payloadFields.has(field) &&\n !(field === 'input' && isRecord(value) && 'message' in value)) ||\n (isRecord(value) && Object.hasOwn(value, '$a2Value'))\n )\n return intern(value)\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n typeof value === 'number'\n )\n return value\n if (typeof value !== 'object')\n throw new TypeError('AI state must contain JSON values')\n const cached = packed.get(value)\n if (cached !== undefined) return cached\n const result: Value = Array.isArray(value)\n ? value.map((item) => pack(item))\n : Object.fromEntries(\n Object.entries(value)\n .toSorted(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([key, item]) => [key, pack(item, key)]),\n )\n packed.set(value, result)\n return result\n }\n const saveProjection = (\n projection: NonNullable<AIStoredView['activeProjection']>,\n tools: AIStoredView['tools'],\n ): Projection => {\n const { baseTools, ...fields } = projection\n const toolPatch =\n baseTools === undefined\n ? undefined\n : difference(pack(tools), pack(baseTools))\n return {\n fields: pack(fields),\n ...(toolPatch === undefined ? {} : { tools: toolPatch }),\n }\n }\n const { activeProjection, ...fields } = state\n const projection =\n activeProjection === null\n ? null\n : saveProjection(activeProjection, state.tools)\n return {\n version: 3,\n fields: pack(fields),\n projection,\n values,\n }\n}\n\nconst loadState = <S extends AIStoredView>(stored: AIStoredState): S => {\n const unpack = (value: Value): unknown => {\n const id = reference(value)\n if (id !== undefined) {\n if (!Object.hasOwn(stored.values, id))\n throw new TypeError('missing AI payload')\n return stored.values[id]!.value\n }\n if (Array.isArray(value)) {\n if (Object.keys(value).length !== value.length)\n throw new TypeError('invalid AI stored array')\n return Array.from(value, unpack)\n }\n if (isRecord(value))\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n unpack(item as Value),\n ]),\n )\n if (\n value === null ||\n typeof value === 'boolean' ||\n typeof value === 'string' ||\n (typeof value === 'number' && Number.isFinite(value))\n )\n return value\n throw new TypeError('invalid AI stored value')\n }\n const fields = stored.fields as Record<string, Value>\n const state = unpack(stored.fields) as S\n const loadProjection = (\n saved: Projection,\n tools: Value | undefined,\n ): AIStoredView['activeProjection'] => {\n if (\n !hasKeys(saved, {\n required: ['fields'],\n optional: ['tools'],\n }) ||\n !isRecord(saved.fields) ||\n ('tools' in saved && saved.tools === undefined)\n )\n throw new TypeError('invalid AI projection recovery')\n const projection = unpack(saved.fields) as NonNullable<\n AIStoredView['activeProjection']\n >\n if (projection.base !== undefined) {\n assertMessageBase(projection.base)\n const current = state.messages.find(\n (message) => message.id === projection.responseMessageId,\n )\n if (\n current !== undefined &&\n restoreMessageBase({ current, base: projection.base }) === undefined\n )\n throw new TypeError('AI message base does not match its message')\n }\n if (tools !== undefined)\n projection.baseTools = unpack(\n restore(tools, saved.tools),\n ) as AIState['tools']\n else if (saved.tools !== undefined)\n throw new TypeError('missing AI recovery tools')\n return projection\n }\n state.activeProjection =\n stored.projection === null\n ? null\n : loadProjection(stored.projection, fields['tools']!)\n return state\n}\n\nexport const withAIStorage = <D extends EventDefs, S extends AIStoredView>(\n source: Reducer<D, S>,\n): Reducer<D, S> =>\n withReducerRuntime({\n reducer: source,\n storage: {\n encode: (state: S) => storeState(state),\n decode(value: unknown): S {\n if (\n !hasKeys(value, {\n required: ['version', 'fields', 'projection', 'values'],\n }) ||\n value['version'] !== 3 ||\n !Array.isArray(value['values']) ||\n !isRecord(value['fields']) ||\n (value['projection'] !== null && !isRecord(value['projection']))\n )\n throw new TypeError('invalid AI stored state')\n const state = value as AIStoredState\n if (Object.keys(state.values).length !== state.values.length)\n throw new TypeError('invalid AI payload table')\n for (const payload of state.values) {\n if (!hasKeys(payload, { required: [], optional: ['value'] }))\n throw new TypeError('invalid AI payload table')\n }\n return loadState<S>(state)\n },\n },\n })\n","import type { AIState } from './ai.ts'\nimport type { ContractEvent, EventDefs } from './contract.ts'\n\n/** An application reducer folded beside the AI protocol, from events alone. */\nexport type AppReducer<D extends EventDefs, X extends object> = {\n /** Snapshot identity of the application state. Rename it when `fold` changes. */\n name: string\n initialState: X\n fold: (state: X, event: ContractEvent<D>) => X\n}\n\n// Every AIState key, so application state is exactly the rest of a merged state.\nconst aiStateKeys: Record<keyof AIState, true> = {\n inbox: true,\n pendingQueueCommands: true,\n active: true,\n starting: true,\n receipt: true,\n pausedGenerationIds: true,\n session: true,\n messages: true,\n status: true,\n activeGeneration: true,\n activeRequestId: true,\n activeRequestReason: true,\n activeRequestSourceGenerationId: true,\n activeResponseMessageId: true,\n activeProjection: true,\n responseOwners: true,\n terminalRequestIds: true,\n terminalGenerations: true,\n pendingApprovals: true,\n pendingInputs: true,\n tools: true,\n compaction: true,\n modelMetadata: true,\n usage: true,\n error: true,\n}\n\nexport const isAIStateKey = (key: string): boolean =>\n Object.hasOwn(aiStateKeys, key)\n\nconst keep = (state: object, ai: boolean): Record<string, unknown> => {\n const kept: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(state))\n if (isAIStateKey(key) === ai) kept[key] = value\n return kept\n}\n\n/** The application part of a merged state: every key `AIState` does not own. */\nexport const appSlice = <X extends object>(state: object): X =>\n keep(state, false) as X\n\n/** A merged state with its application part replaced. */\nexport const withAppSlice = <S extends object>(state: S, app: object): S =>\n ({ ...keep(state, true), ...keep(app, false) }) as S\n\n// agentContract() registers every reducer it builds here, keyed by the reducer\n// so spread contracts keep it: agent() serves only these, and folds their\n// application state into the model-context checkpoint every generation reads.\nconst agentReducers = new WeakMap<\n object,\n AppReducer<EventDefs, object> | null\n>()\n\nexport const registerAgentReducer = (\n reducer: object,\n app: AppReducer<EventDefs, object> | undefined,\n): void => {\n agentReducers.set(reducer, app ?? null)\n}\n\nconst reducerOf = (contract: { reducer?: unknown }): object | undefined =>\n typeof contract.reducer === 'object' && contract.reducer !== null\n ? contract.reducer\n : undefined\n\nexport const isAgentContract = (contract: { reducer?: unknown }): boolean => {\n const reducer = reducerOf(contract)\n return reducer !== undefined && agentReducers.has(reducer)\n}\n\nexport const appReducerOf = (contract: {\n reducer?: unknown\n}): AppReducer<EventDefs, object> | undefined => {\n const reducer = reducerOf(contract)\n return reducer === undefined\n ? undefined\n : (agentReducers.get(reducer) ?? undefined)\n}\n","import type { MessageBase } from './ai-message-base.ts'\nimport { reducer as makeReducer } from './reducer.ts'\n/**\n * experimental-a2/ai — the isomorphic AI protocol.\n *\n * Event schemas, the `AIState` reducer, `agentContract()` for extending\n * both, and pure builders for the events applications append. Model calls\n * and tool implementations stay in experimental-a2/ai/server.\n */\n\nimport type {\n FinishReason,\n JSONValue,\n LanguageModelCallOptions,\n LanguageModelUsage,\n UIMessage,\n UIMessageChunk,\n} from 'ai'\nimport {\n isQueueCommand,\n projectAIClientState,\n type PendingQueueCommand,\n} from './ai-client-state.ts'\nexport type { PendingQueueCommand } from './ai-client-state.ts'\nimport { applyControlChanges } from './ai-control-state.ts'\nimport { initialControlState } from './ai-control.ts'\nimport { AI_EVENT_ID_PREFIX } from './ai-id.ts'\nimport type {\n ControlCommit,\n ActiveTurn,\n ControlCommand,\n ControlReceipt,\n InboxItem,\n ToolExecutionRequest,\n WorkReport,\n} from './ai-control.ts'\nexport type {\n ActiveTurn,\n ControlCommand,\n ControlReceipt,\n InboxItem,\n} from './ai-control.ts'\nimport { contract as createContract } from './contract.ts'\nimport type { Contract, ContractEvent, EventDefs } from './contract.ts'\nimport {\n interruptUIMessage,\n pauseUIMessage,\n projectUIMessage,\n projectUIMessageStream,\n hasToolCall,\n type ProjectionChunk,\n type UIMessageCursor,\n} from './ai-projector.ts'\nimport { ambientToolScopeStorage } from './internal.ts'\nimport {\n upsertMessage,\n retainMessageBase,\n findMessage,\n upsertResponse,\n answerApproval,\n approvalRequestedChunk,\n toolResultChunk,\n toolCalledChunk,\n advanceProjection,\n projectedTools,\n restoreGenerationBase,\n stopGenerationTools,\n interruptGenerationProjection,\n projectedMessage,\n projectedMessageStream,\n reduceToolActivity,\n addCompactionPart,\n isCompactionPart,\n settleAbandonedCompaction,\n settleCompactionPart,\n} from './ai-message-projection.ts'\nimport type { Reducer } from './reducer.ts'\nimport { withReducerRuntime } from './reducer-runtime.ts'\nimport { withAIStorage } from './ai-stored-state.ts'\nimport {\n appSlice,\n isAIStateKey,\n registerAgentReducer,\n withAppSlice,\n type AppReducer,\n} from './ai-app-state.ts'\nimport {\n flattenProgressBatches,\n progressBatches,\n progressOwnedBy,\n type ProgressBatches,\n type StoredProgressPayload,\n} from './ai-progress-batches.ts'\nimport type { HandlerContext } from './server.ts'\nimport type { StandardSchemaV1 } from './standard-schema.ts'\nimport { assertSyncSchema, validateSync } from './validate.ts'\n\nexport type AgentStatus =\n 'idle' | 'generating' | 'waiting' | 'failed' | 'closed' | 'paused'\n\nexport type GenerationReason = 'message' | 'tool' | 'input' | 'retry' | 'resume'\n\nexport type ReasoningLevel = NonNullable<LanguageModelCallOptions['reasoning']>\n\nexport const reasoningLevels: readonly ReasoningLevel[] = [\n 'provider-default',\n 'none',\n 'minimal',\n 'low',\n 'medium',\n 'high',\n 'xhigh',\n]\n\nexport type CompactionPartData = {\n status: 'running' | 'completed' | 'failed' | 'interrupted'\n inputTokens?: number\n thresholdTokens?: number\n summary?: string\n usage?: LanguageModelUsage\n}\n\n/** The transcript part A2 adds to a response where its context was compacted. */\nexport type CompactionPart = {\n type: 'data-a2-compaction'\n id: string\n data: CompactionPartData\n}\n\nexport { isCompactionPart }\n\n/**\n * A transcript message: `M` plus the compaction part A2 adds, so\n * `isCompactionPart` narrows even when `M` declares its own data parts.\n */\nexport type TranscriptMessage<M extends UIMessage> = Omit<M, 'parts'> & {\n parts: Array<M['parts'][number] | CompactionPart>\n}\n\nexport type SessionCreatedPayload = { metadata?: JSONValue }\nexport type SessionClosedPayload = { reason?: string }\nexport type MessageCreatedPayload<M extends UIMessage> = {\n message: M\n /** For user messages, false records passive context. Omission or true schedules. */\n generate?: boolean\n}\nexport type MessageCompletedPayload = { messageId: string }\ntype MessageInterruption = {\n messageId: string\n reason?: string\n /** Last confirmed event-log index visible to the interrupter. */\n lastSeenIndex?: number\n}\nexport type MessageInterruptedPayload = MessageInterruption &\n (\n | { generationId: string; requestId?: never }\n | { requestId: string; generationId?: never }\n )\nexport type GenerationRequestedPayload = {\n control?: { turnId: string; version: number }\n messageId: string\n reason: GenerationReason\n responseMessageId: string\n sourceGenerationId?: string\n}\nexport type RetryGenerationOptions = {\n messageId: string\n responseMessageId: string\n retryId: string\n}\nexport type RetryRequestedPayload = RetryGenerationOptions\nexport type GenerationStartedPayload = {\n requestId: string\n messageId: string\n generationId: string\n responseMessageId: string\n attempt: number\n /** Absent when the attempt failed before its model resolved. */\n model?: string\n promptThroughIndex?: number\n}\nexport type GenerationProgressPayload = {\n /** Log index of the generation's `ai.generation.started`. */\n startIndex: number\n chunks: UIMessageChunk[]\n}\nexport type GenerationCompletedPayload = {\n requestId: string\n messageId: string\n generationId: string\n responseMessageId: string\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n inputTokenEstimate?: number\n}\nexport type GenerationFailedPayload = {\n requestId: string\n messageId: string\n generationId: string\n responseMessageId: string\n error: string\n /** True when a later attempt replaced an incomplete attempt. */\n superseded?: boolean\n stepLimit?: boolean\n}\nexport type ToolCalledPayload = {\n requestId: string\n messageId: string\n generationId: string\n toolCallId: string\n toolName: string\n input: unknown\n dynamic?: boolean\n providerExecuted?: boolean\n supportsDeferredResults?: boolean\n providerMetadata?: unknown\n toolMetadata?: unknown\n title?: string\n}\nexport type ToolResultPayload = {\n requestId: string\n messageId: string\n generationId: string\n toolCallId: string\n toolName?: string\n input?: unknown\n rawInput?: unknown\n output?: unknown\n error?: string\n denied?: boolean\n preliminary?: boolean\n phase?: 'input' | 'execution'\n dynamic?: boolean\n providerExecuted?: boolean\n providerMetadata?: unknown\n toolMetadata?: unknown\n}\nexport type ApprovalRequestedPayload = {\n requestId: string\n messageId: string\n generationId: string\n approvalId: string\n toolCallId: string\n isAutomatic?: boolean\n signature?: string\n}\nexport type ApprovalRespondedPayload = {\n requestId: string\n messageId: string\n generationId: string\n approvalId: string\n approved: boolean\n reason?: string\n}\nexport type InputRequestedPayload = {\n requestId: string\n messageId: string\n generationId: string\n inputId: string\n name: string\n question?: JSONValue\n}\nexport type InputRespondedPayload = {\n requestId: string\n messageId: string\n generationId: string\n inputId: string\n name: string\n value: JSONValue\n}\nexport type ModelLimits = {\n contextWindow: number\n maxOutputTokens: number\n}\nexport type ModelMetadataRequestedPayload = { modelId: string }\nexport type ModelMetadataResolvedPayload = {\n modelId: string\n limits: ModelLimits | null\n}\nexport type ModelMetadataState =\n | { status: 'pending' }\n | { status: 'resolved'; limits: ModelLimits }\n | { status: 'unavailable' }\n\nexport type CompactionRequestedPayload = {\n generationId: string\n throughMessageId: string\n throughIndex?: number\n inputTokenEstimate?: number\n inputTokens?: number\n thresholdTokens?: number\n}\nexport type CompactionCompletedPayload<M extends UIMessage> = {\n generationId: string\n throughMessageId: string\n throughIndex?: number\n messages: M[]\n retainedMessageIds?: string[]\n summary?: string\n usage?: LanguageModelUsage\n}\n\nexport type AIEventDefs<M extends UIMessage = UIMessage> = {\n 'ai.control.requested': StandardSchemaV1<ControlCommand<M>>\n 'ai.control.committed': StandardSchemaV1<ControlCommit>\n 'ai.control.decided': StandardSchemaV1<ControlReceipt>\n 'ai.work.reported': StandardSchemaV1<WorkReport>\n 'ai.tool.execution.requested': StandardSchemaV1<ToolExecutionRequest>\n 'ai.generation.paused': StandardSchemaV1<{\n generationId: string\n messageId: string\n }>\n 'ai.session.created': StandardSchemaV1<SessionCreatedPayload>\n 'ai.session.closed': StandardSchemaV1<SessionClosedPayload>\n 'ai.message.created': StandardSchemaV1<MessageCreatedPayload<M>>\n 'ai.message.completed': StandardSchemaV1<MessageCompletedPayload>\n 'ai.message.interrupted': StandardSchemaV1<MessageInterruptedPayload>\n 'ai.generation.requested': StandardSchemaV1<GenerationRequestedPayload>\n 'ai.retry.requested': StandardSchemaV1<RetryRequestedPayload>\n 'ai.generation.started': StandardSchemaV1<GenerationStartedPayload>\n 'ai.generation.progress': StandardSchemaV1<GenerationProgressPayload>\n 'ai.generation.completed': StandardSchemaV1<GenerationCompletedPayload>\n 'ai.generation.failed': StandardSchemaV1<GenerationFailedPayload>\n 'ai.tool.called': StandardSchemaV1<ToolCalledPayload>\n 'ai.tool.result': StandardSchemaV1<ToolResultPayload>\n 'ai.approval.requested': StandardSchemaV1<ApprovalRequestedPayload>\n 'ai.approval.responded': StandardSchemaV1<ApprovalRespondedPayload>\n 'ai.input.requested': StandardSchemaV1<InputRequestedPayload>\n 'ai.input.responded': StandardSchemaV1<InputRespondedPayload>\n 'ai.compaction.requested': StandardSchemaV1<CompactionRequestedPayload>\n 'ai.compaction.completed': StandardSchemaV1<CompactionCompletedPayload<M>>\n 'ai.model.metadata.requested': StandardSchemaV1<ModelMetadataRequestedPayload>\n 'ai.model.metadata.resolved': StandardSchemaV1<ModelMetadataResolvedPayload>\n}\n\nexport type ActiveGeneration = GenerationStartedPayload & {\n /** Log index of this generation's `ai.generation.started`. */\n startIndex: number\n}\n\nexport type ActiveGenerationProjection = {\n generationId: string\n responseMessageId: string\n /** Log index of the completed model step while its response remains interruptible. */\n completionIndex?: number\n base?: MessageBase\n promptThroughIndex?: number\n cursor?: { throughIndex: number; stream: UIMessageCursor } | null\n baseCompaction?: CompactionState | null\n batches: ProgressBatches\n baseTools: ToolActivity[]\n toolEvents: Array<\n | { index: number; type: 'ai.tool.called'; payload: ToolCalledPayload }\n | { index: number; type: 'ai.tool.result'; payload: ToolResultPayload }\n >\n approvalEvents: Array<\n | {\n index: number\n type: 'ai.approval.requested'\n payload: ApprovalRequestedPayload\n }\n | {\n index: number\n type: 'ai.approval.responded'\n payload: ApprovalRespondedPayload\n }\n >\n}\n\nexport type PendingApproval = ApprovalRequestedPayload\nexport type PendingInput = InputRequestedPayload\n\nexport type ToolActivity = {\n requestId: string\n messageId: string\n generationId: string\n toolCallId: string\n toolName?: string\n error?: string\n preliminary?: boolean\n phase?: 'input' | 'execution'\n dynamic?: boolean\n providerExecuted?: boolean\n title?: string\n status: 'running' | 'completed' | 'failed' | 'denied'\n}\n\nexport type CompactionState = {\n status: 'running' | 'completed'\n generationId: string\n throughMessageId: string\n throughIndex?: number\n summary?: string\n usage?: LanguageModelUsage\n}\n\nexport type GenerationUsage = {\n generationId: string\n usage: LanguageModelUsage\n}\n\nexport type AIState<M extends UIMessage = UIMessage> = {\n inbox: { paused: boolean; items: InboxItem<M>[] }\n pendingQueueCommands?: PendingQueueCommand<M>[]\n active: ActiveTurn<M> | null\n starting: boolean\n receipt: ControlReceipt | null\n pausedGenerationIds?: Record<string, true>\n session: { created: boolean; metadata?: JSONValue }\n messages: TranscriptMessage<M>[]\n status: AgentStatus\n activeGeneration: ActiveGeneration | null\n activeRequestId: string | null\n activeRequestReason: GenerationReason | null\n activeRequestSourceGenerationId: string | null\n activeResponseMessageId: string | null\n activeProjection: ActiveGenerationProjection | null\n responseOwners: Record<\n string,\n Pick<GenerationStartedPayload, 'generationId' | 'requestId' | 'attempt'>\n >\n terminalRequestIds?: Record<string, true>\n terminalGenerations?: Record<\n string,\n 'completed' | 'failed' | 'interrupted' | 'superseded'\n >\n pendingApprovals: PendingApproval[]\n pendingInputs: PendingInput[]\n tools: ToolActivity[]\n compaction: CompactionState | null\n modelMetadata: Record<string, ModelMetadataState>\n usage: GenerationUsage[]\n error: string | null\n}\n\n/** The `UIMessage` type a contract's `ai.message.created` schema carries. */\nexport type AIMessageOf<D> = D extends {\n readonly 'ai.message.created': infer S extends StandardSchemaV1\n}\n ? StandardSchemaV1.InferOutput<S> extends MessageCreatedPayload<\n infer M extends UIMessage\n >\n ? M\n : UIMessage\n : UIMessage\n\n/** What `agentContract()` returns: the AI protocol, with `X` as application state. */\nexport type AgentContract<\n M extends UIMessage = UIMessage,\n D extends EventDefs = AIEventDefs<M>,\n X extends object = Record<never, never>,\n> = Contract<D, Record<never, never>, AgentReducer<M, D, X>>\n\nexport type AgentToolEventDefs = EventDefs &\n Pick<AIEventDefs, 'ai.tool.execution.requested'>\n\n/** The durable handler context supplied when A2 executes a local AI tool. */\nexport type AgentToolContext<D extends AgentToolEventDefs> = HandlerContext<\n D,\n 'ai.tool.execution.requested'\n>\n\n/** Application state folded after the AI protocol, on the server and in clients. */\n/** Rejects application state keys that would shadow `AIState`'s. */\ntype OwnKeys<X> = { [K in Extract<keyof X, keyof AIState>]: never }\n/** Rejects a stateless application reducer, whose name would not be built in. */\ntype NonEmpty<X> = keyof X extends never ? never : unknown\n\n/**\n * The reducer `agentContract()` builds. Without application state it carries\n * the built-in name, which is what lets the contract-free client fold it.\n * `~appState` is type-only, absent at runtime: it carries the application\n * state's type to `agent()`, and marks the reducer as `agentContract()`'s.\n */\nexport type AgentReducer<\n M extends UIMessage,\n D extends EventDefs,\n X extends object,\n> = (keyof X extends never\n ? Reducer<D, AIState<M>> & { readonly name: typeof AI_STATE_REDUCER }\n : Reducer<D, AIState<M> & X>) & { readonly '~appState': X }\n\nexport type AgentContractOptions<\n M extends UIMessage,\n E extends EventDefs,\n X extends object,\n> = {\n name: string\n events?: E\n /** Optional stricter schema for custom UIMessage metadata/data/tool types. */\n messageSchema?: StandardSchemaV1<M>\n /**\n * Application state, folded from events beside `AIState` and merged into\n * it. `fold` sees only this state, never the transcript.\n */\n reducer?: {\n /** Snapshot identity of the application state. Rename it when `fold` changes. */\n name: string\n initialState: X & OwnKeys<X> & NonEmpty<X>\n fold: (\n state: NoInfer<X>,\n event: ContractEvent<AIEventDefs<M> & NoInfer<E>>,\n ) => NoInfer<X>\n }\n}\n\ntype SchemaResult<T> = StandardSchemaV1.Result<T>\n\nconst issue = <T>(message: string): SchemaResult<T> => ({\n issues: [{ message }],\n})\n\nconst schema = <T>(\n label: string,\n parse: (value: unknown) => SchemaResult<T>,\n): StandardSchemaV1<T> => ({\n '~standard': {\n version: 1,\n vendor: 'a2',\n validate(value) {\n try {\n return parse(value)\n } catch (error) {\n return issue(\n `${label}: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n },\n },\n})\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst isJSONCompatible = (\n value: unknown,\n seen: Set<object> = new Set(),\n): boolean => {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean'\n ) {\n return true\n }\n if (typeof value === 'number') return Number.isFinite(value)\n if (typeof value === 'undefined') return true\n if (typeof value !== 'object') return false\n if (seen.has(value)) return false\n seen.add(value)\n const valid = Array.isArray(value)\n ? value.every((item) => isJSONCompatible(item, seen))\n : Object.getPrototypeOf(value) === Object.prototype &&\n Object.values(value).every((item) => isJSONCompatible(item, seen))\n seen.delete(value)\n return valid\n}\n\nconst jsonObject = <T extends object>(\n label: string,\n check: (value: Record<string, unknown>) => boolean,\n): StandardSchemaV1<T> =>\n schema(label, (value) => {\n if (!isRecord(value) || !isJSONCompatible(value) || !check(value)) {\n return issue(`invalid ${label}`)\n }\n return { value: value as T }\n })\n\nconst stringField = (value: Record<string, unknown>, key: string): boolean =>\n typeof value[key] === 'string' && value[key].length > 0\n\nconst optionalIndexField = (\n value: Record<string, unknown>,\n key: string,\n): boolean =>\n value[key] === undefined ||\n (typeof value[key] === 'number' &&\n Number.isSafeInteger(value[key]) &&\n value[key] >= 0)\n\nconst optionalStringField = (\n value: Record<string, unknown>,\n key: string,\n): boolean => value[key] === undefined || typeof value[key] === 'string'\n\nconst messageValue = (value: unknown): value is UIMessage =>\n isRecord(value) &&\n typeof value['id'] === 'string' &&\n (value['role'] === 'user' ||\n value['role'] === 'assistant' ||\n value['role'] === 'system') &&\n Array.isArray(value['parts']) &&\n value['parts'].every(\n (part) => isRecord(part) && typeof part['type'] === 'string',\n ) &&\n isJSONCompatible(value)\n\nconst validateMessage = <M extends UIMessage>(\n value: unknown,\n messageSchema?: StandardSchemaV1<M>,\n): SchemaResult<M> => {\n if (!messageValue(value)) return issue('invalid AI SDK UIMessage')\n if (!messageSchema) return { value: value as M }\n return validateSync(messageSchema, value, 'the AI message')\n}\n\nconst messagePayloadSchema = <M extends UIMessage>(\n messageSchema?: StandardSchemaV1<M>,\n): StandardSchemaV1<MessageCreatedPayload<M>> =>\n schema('ai.message.created', (value) => {\n if (!isRecord(value)) return issue('invalid ai.message.created payload')\n const message = validateMessage(value['message'], messageSchema)\n if (message.issues) return { issues: message.issues }\n const generate = value['generate']\n if (generate !== undefined && typeof generate !== 'boolean') {\n return issue('invalid ai.message.created generate flag')\n }\n return {\n value: {\n message: message.value,\n ...(generate === false ? { generate: false } : {}),\n },\n }\n })\n\nconst progressPayloadSchema: StandardSchemaV1<GenerationProgressPayload> =\n schema('ai.generation.progress', (value) => {\n if (\n !isRecord(value) ||\n !isJSONCompatible(value) ||\n typeof value['startIndex'] !== 'number' ||\n !optionalIndexField(value, 'startIndex') ||\n !Array.isArray(value['chunks']) ||\n !value['chunks'].every(\n (chunk) => isRecord(chunk) && typeof chunk['type'] === 'string',\n )\n ) {\n return issue('invalid ai.generation.progress payload')\n }\n return { value: value as GenerationProgressPayload }\n })\n\nconst completedPayloadSchema: StandardSchemaV1<GenerationCompletedPayload> =\n schema('ai.generation.completed', (value) => {\n if (\n !isRecord(value) ||\n !isJSONCompatible(value) ||\n !stringField(value, 'requestId') ||\n !stringField(value, 'messageId') ||\n !stringField(value, 'generationId') ||\n !stringField(value, 'responseMessageId') ||\n !optionalIndexField(value, 'inputTokenEstimate') ||\n !optionalStringField(value, 'finishReason')\n ) {\n return issue('invalid ai.generation.completed payload')\n }\n return { value: value as GenerationCompletedPayload }\n })\n\nconst compactionPayloadSchema = <M extends UIMessage>(\n messageSchema?: StandardSchemaV1<M>,\n): StandardSchemaV1<CompactionCompletedPayload<M>> =>\n schema('ai.compaction.completed', (value) => {\n if (\n !isRecord(value) ||\n !isJSONCompatible(value) ||\n !stringField(value, 'generationId') ||\n !stringField(value, 'throughMessageId') ||\n !optionalIndexField(value, 'throughIndex') ||\n !optionalStringField(value, 'summary') ||\n !Array.isArray(value['messages']) ||\n (value['retainedMessageIds'] !== undefined &&\n (!Array.isArray(value['retainedMessageIds']) ||\n !value['retainedMessageIds'].every(\n (candidate) => typeof candidate === 'string',\n )))\n ) {\n return issue('invalid ai.compaction.completed payload')\n }\n const messages: M[] = []\n for (const candidate of value['messages']) {\n const result = validateMessage(candidate, messageSchema)\n if (result.issues) return { issues: result.issues }\n messages.push(result.value)\n }\n return {\n value: {\n generationId: value['generationId'] as string,\n throughMessageId: value['throughMessageId'] as string,\n ...(value['throughIndex'] === undefined\n ? {}\n : { throughIndex: value['throughIndex'] as number }),\n messages,\n ...(value['summary'] === undefined\n ? {}\n : { summary: value['summary'] as string }),\n ...(value['usage'] === undefined\n ? {}\n : { usage: value['usage'] as LanguageModelUsage }),\n ...(value['retainedMessageIds'] === undefined\n ? {}\n : { retainedMessageIds: value['retainedMessageIds'] as string[] }),\n },\n }\n })\n\nexport function createEvents<M extends UIMessage = UIMessage>(options?: {\n messageSchema?: StandardSchemaV1<M>\n}): AIEventDefs<M> {\n const messageSchema = options?.messageSchema\n if (messageSchema) assertSyncSchema(messageSchema, 'the AI message schema')\n const definition: AIEventDefs<M> = {\n 'ai.control.requested': schema('ai.control.requested', (value) => {\n if (!isRecord(value) || !isJSONCompatible(value))\n return issue('invalid AI command')\n const action = value['action']\n const forwarded = {\n approval: ['ai.approval.responded', 'response'],\n 'tool-result': ['ai.tool.result', 'result'],\n input: ['ai.input.responded', 'response'],\n 'request-input': ['ai.input.requested', 'request'],\n retry: ['ai.retry.requested', 'request'],\n interrupt: ['ai.message.interrupted', 'request'],\n } as const\n if (typeof action === 'string' && Object.hasOwn(forwarded, action)) {\n const [type, key] = forwarded[action as keyof typeof forwarded]\n const payload = validateSync(\n definition[type] as StandardSchemaV1<unknown>,\n value[key],\n 'AI command',\n )\n if (payload.issues) return { issues: payload.issues }\n return { value: { action, [key]: payload.value } as ControlCommand<M> }\n }\n if (action === 'send' || action === 'edit' || action === 'steer') {\n const parsed = validateMessage(value['message'], messageSchema)\n if (parsed.issues) return parsed\n if (\n (action === 'send' || action === 'steer') &&\n (parsed.value.id.length === 0 ||\n parsed.value.id.startsWith(AI_EVENT_ID_PREFIX))\n )\n return issue(\n 'AI input IDs must be nonempty and outside the reserved internal prefix',\n )\n if (\n (action === 'steer' &&\n (!stringField(value, 'turnId') ||\n !optionalIndexField(value, 'lastSeenIndex'))) ||\n (action === 'send' &&\n value['generate'] !== undefined &&\n typeof value['generate'] !== 'boolean')\n )\n return issue('invalid AI command')\n return {\n value: { ...value, message: parsed.value } as ControlCommand<M>,\n }\n }\n if (\n (action === 'remove' && stringField(value, 'inputId')) ||\n (action === 'send-now' &&\n stringField(value, 'inputId') &&\n (value['turnId'] === null || stringField(value, 'turnId')) &&\n optionalIndexField(value, 'lastSeenIndex')) ||\n (action === 'move' &&\n stringField(value, 'inputId') &&\n (value['beforeId'] === null || stringField(value, 'beforeId'))) ||\n (action === 'stop' &&\n stringField(value, 'turnId') &&\n optionalIndexField(value, 'lastSeenIndex')) ||\n (action === 'pause' &&\n (value['when'] === 'now' || value['when'] === 'after-turn')) ||\n action === 'resume'\n )\n return { value: value as ControlCommand<M> }\n return issue('invalid AI command')\n }),\n 'ai.control.committed': jsonObject(\n 'ai.control.committed',\n (value) => Array.isArray(value['changes']) && isRecord(value['view']),\n ),\n 'ai.control.decided': jsonObject(\n 'ai.control.decided',\n (value) =>\n stringField(value, 'commandId') &&\n (value['outcome'] === 'applied' || value['outcome'] === 'rejected'),\n ),\n 'ai.work.reported': schema('ai.work.reported', (value) => {\n if (\n !isRecord(value) ||\n !isJSONCompatible(value) ||\n !stringField(value, 'workId') ||\n !stringField(value, 'turnId') ||\n typeof value['version'] !== 'number' ||\n !optionalIndexField(value, 'version') ||\n typeof value['attempt'] !== 'number' ||\n !Number.isSafeInteger(value['attempt']) ||\n value['attempt'] < 1 ||\n typeof value['settled'] !== 'boolean' ||\n (value['kind'] !== 'model' && value['kind'] !== 'tool') ||\n !Array.isArray(value['events'])\n )\n return issue('invalid AI work report')\n const allowed = new Set([\n 'ai.generation.started',\n 'ai.generation.completed',\n 'ai.generation.failed',\n 'ai.tool.called',\n 'ai.tool.result',\n 'ai.approval.requested',\n 'ai.approval.responded',\n 'ai.compaction.requested',\n 'ai.compaction.completed',\n 'ai.model.metadata.requested',\n ])\n const events: WorkReport['events'] = []\n for (const event of value['events']) {\n if (\n !isRecord(event) ||\n !stringField(event, 'id') ||\n typeof event['type'] !== 'string' ||\n !allowed.has(event['type']) ||\n (value['kind'] === 'tool' && event['type'] !== 'ai.tool.result')\n )\n return issue('invalid AI work fact')\n const parsed = validateSync(\n definition[\n event['type'] as keyof AIEventDefs<M>\n ] as StandardSchemaV1<unknown>,\n event['payload'],\n 'AI work fact',\n )\n if (parsed.issues) return { issues: parsed.issues }\n events.push({\n id: event['id'] as string,\n type: event['type'],\n payload: parsed.value,\n })\n }\n return { value: { ...value, events } as WorkReport }\n }),\n 'ai.tool.execution.requested': jsonObject(\n 'ai.tool.execution.requested',\n (value) =>\n stringField(value, 'turnId') &&\n optionalIndexField(value, 'version') &&\n isRecord(value['call']) &&\n isRecord(value['generation']),\n ),\n 'ai.generation.paused': jsonObject(\n 'ai.generation.paused',\n (value) =>\n stringField(value, 'generationId') && stringField(value, 'messageId'),\n ),\n 'ai.session.created': jsonObject('ai.session.created', () => true),\n 'ai.session.closed': jsonObject('ai.session.closed', (value) =>\n optionalStringField(value, 'reason'),\n ),\n 'ai.message.created': messagePayloadSchema(messageSchema),\n 'ai.message.completed': jsonObject('ai.message.completed', (value) =>\n stringField(value, 'messageId'),\n ),\n 'ai.message.interrupted': jsonObject(\n 'ai.message.interrupted',\n (value) =>\n stringField(value, 'messageId') &&\n ((stringField(value, 'generationId') &&\n value['requestId'] === undefined) ||\n (stringField(value, 'requestId') &&\n value['generationId'] === undefined)) &&\n optionalStringField(value, 'reason') &&\n (value['lastSeenIndex'] === undefined ||\n (typeof value['lastSeenIndex'] === 'number' &&\n Number.isInteger(value['lastSeenIndex']) &&\n value['lastSeenIndex'] >= 0)),\n ),\n 'ai.generation.requested': jsonObject(\n 'ai.generation.requested',\n (value) =>\n stringField(value, 'messageId') &&\n stringField(value, 'responseMessageId') &&\n optionalStringField(value, 'sourceGenerationId') &&\n (value['reason'] !== 'tool' ||\n stringField(value, 'sourceGenerationId')) &&\n (value['reason'] === 'message' ||\n value['reason'] === 'tool' ||\n value['reason'] === 'input' ||\n value['reason'] === 'retry' ||\n value['reason'] === 'resume'),\n ),\n 'ai.retry.requested': jsonObject(\n 'ai.retry.requested',\n (value) =>\n stringField(value, 'messageId') &&\n stringField(value, 'responseMessageId') &&\n stringField(value, 'retryId'),\n ),\n 'ai.generation.started': jsonObject(\n 'ai.generation.started',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'responseMessageId') &&\n typeof value['attempt'] === 'number' &&\n Number.isInteger(value['attempt']) &&\n value['attempt'] > 0 &&\n (value['model'] === undefined || stringField(value, 'model')) &&\n optionalIndexField(value, 'promptThroughIndex'),\n ),\n 'ai.generation.progress': progressPayloadSchema,\n 'ai.generation.completed': completedPayloadSchema,\n 'ai.generation.failed': jsonObject(\n 'ai.generation.failed',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'responseMessageId') &&\n stringField(value, 'error') &&\n (value['superseded'] === undefined ||\n typeof value['superseded'] === 'boolean') &&\n (value['stepLimit'] === undefined ||\n typeof value['stepLimit'] === 'boolean'),\n ),\n 'ai.tool.called': jsonObject(\n 'ai.tool.called',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'toolCallId') &&\n stringField(value, 'toolName') &&\n (value['dynamic'] === undefined ||\n typeof value['dynamic'] === 'boolean') &&\n (value['providerExecuted'] === undefined ||\n typeof value['providerExecuted'] === 'boolean') &&\n (value['supportsDeferredResults'] === undefined ||\n typeof value['supportsDeferredResults'] === 'boolean') &&\n optionalStringField(value, 'title'),\n ),\n 'ai.tool.result': jsonObject(\n 'ai.tool.result',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'toolCallId') &&\n optionalStringField(value, 'toolName') &&\n optionalStringField(value, 'error') &&\n (value['denied'] === undefined ||\n typeof value['denied'] === 'boolean') &&\n (value['preliminary'] === undefined ||\n typeof value['preliminary'] === 'boolean') &&\n (value['phase'] === undefined ||\n value['phase'] === 'input' ||\n value['phase'] === 'execution') &&\n (value['dynamic'] === undefined ||\n typeof value['dynamic'] === 'boolean') &&\n (value['providerExecuted'] === undefined ||\n typeof value['providerExecuted'] === 'boolean'),\n ),\n 'ai.approval.requested': jsonObject(\n 'ai.approval.requested',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'approvalId') &&\n stringField(value, 'toolCallId') &&\n (value['isAutomatic'] === undefined ||\n typeof value['isAutomatic'] === 'boolean') &&\n optionalStringField(value, 'signature'),\n ),\n 'ai.approval.responded': jsonObject(\n 'ai.approval.responded',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'approvalId') &&\n typeof value['approved'] === 'boolean' &&\n optionalStringField(value, 'reason'),\n ),\n 'ai.input.requested': jsonObject(\n 'ai.input.requested',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'inputId') &&\n stringField(value, 'name'),\n ),\n 'ai.input.responded': jsonObject(\n 'ai.input.responded',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'inputId') &&\n stringField(value, 'name'),\n ),\n 'ai.compaction.requested': jsonObject(\n 'ai.compaction.requested',\n (value) =>\n stringField(value, 'generationId') &&\n stringField(value, 'throughMessageId') &&\n optionalIndexField(value, 'throughIndex') &&\n optionalIndexField(value, 'inputTokenEstimate') &&\n optionalIndexField(value, 'inputTokens') &&\n optionalIndexField(value, 'thresholdTokens'),\n ),\n 'ai.compaction.completed': compactionPayloadSchema(messageSchema),\n 'ai.model.metadata.requested': jsonObject(\n 'ai.model.metadata.requested',\n (value) => stringField(value, 'modelId'),\n ),\n 'ai.model.metadata.resolved': jsonObject(\n 'ai.model.metadata.resolved',\n (value) =>\n stringField(value, 'modelId') &&\n (value['limits'] === null ||\n (isRecord(value['limits']) &&\n typeof value['limits']['contextWindow'] === 'number' &&\n Number.isSafeInteger(value['limits']['contextWindow']) &&\n value['limits']['contextWindow'] > 0 &&\n typeof value['limits']['maxOutputTokens'] === 'number' &&\n Number.isSafeInteger(value['limits']['maxOutputTokens']) &&\n value['limits']['maxOutputTokens'] > 0)),\n ),\n }\n return definition\n}\n\nexport const events: AIEventDefs<UIMessage> = createEvents()\n\nconst initialState = <M extends UIMessage>(): AIState<M> => ({\n inbox: initialControlState<M>().inbox,\n pendingQueueCommands: [],\n active: null,\n starting: false,\n receipt: null,\n session: { created: false },\n messages: [],\n status: 'idle',\n activeGeneration: null,\n activeRequestId: null,\n activeRequestReason: null,\n activeRequestSourceGenerationId: null,\n activeResponseMessageId: null,\n activeProjection: null,\n responseOwners: {},\n pendingApprovals: [],\n pendingInputs: [],\n tools: [],\n compaction: null,\n modelMetadata: {},\n usage: [],\n error: null,\n})\n\nconst projectMessageChunks = <M extends UIMessage>(\n messages: M[],\n messageId: string,\n chunks: ProjectionChunk[],\n): M[] => {\n const base = findMessage(messages, messageId)\n return upsertMessage(\n messages,\n projectUIMessage<M>({\n messageId,\n ...(base === undefined ? {} : { base }),\n chunks,\n }),\n )\n}\n\nconst waitingStatus = <M extends UIMessage>(state: AIState<M>): AgentStatus => {\n if (state.pendingApprovals.length > 0 || state.pendingInputs.length > 0) {\n return 'waiting'\n }\n return state.activeGeneration !== null ||\n state.tools.some((activity) => activity.status === 'running')\n ? 'generating'\n : 'idle'\n}\n\nconst lifecycleStatus = <M extends UIMessage>(\n previous: AIState<M>,\n next: AIState<M>,\n): AgentStatus =>\n previous.status === 'failed' ? 'failed' : waitingStatus(next)\n\nconst isStaleGeneration = <M extends UIMessage>(\n state: AIState<M>,\n messageId: string,\n owner: { generationId: string; requestId: string },\n): boolean => {\n const current = state.responseOwners[messageId]\n return (\n current !== undefined &&\n (current.generationId !== owner.generationId ||\n current.requestId !== owner.requestId)\n )\n}\n\nconst projectedResponse = <M extends UIMessage>(options: {\n state: AIState<M>\n projection: ActiveGenerationProjection\n}): TranscriptMessage<M> => {\n const message = projectedMessage({\n projection: options.projection,\n current: findMessage(\n options.state.messages,\n options.projection.responseMessageId,\n ),\n })\n return options.state.pausedGenerationIds?.[options.projection.generationId]\n ? pauseUIMessage({\n message,\n toolCallIds: new Set(\n options.state.tools.map((tool) => tool.toolCallId),\n ),\n })\n : message\n}\n\nconst terminalGenerationReason = <M extends UIMessage>(\n state: AIState<M>,\n generationId: string,\n requestId?: string,\n): 'completed' | 'failed' | 'interrupted' | 'superseded' | undefined => {\n const terminal = state.terminalGenerations?.[generationId]\n if (terminal !== undefined) return terminal\n return requestId !== undefined &&\n state.terminalRequestIds?.[requestId] === true\n ? 'interrupted'\n : undefined\n}\n\n/** Pure projection of the built-in AI protocol. Unknown extension events are ignored. */\nexport function reduceAIState<M extends UIMessage>(\n state: AIState<M>,\n event: { type: string; payload: unknown; index: number; id?: string },\n): AIState<M> {\n return settleAbandonedCompaction(\n state,\n retainMessageBase({\n before: state,\n after: reduceAIEvent(state, event),\n }),\n )\n}\n\nfunction reduceAIEvent<M extends UIMessage>(\n state: AIState<M>,\n event: { type: string; payload: unknown; index: number; id?: string },\n): AIState<M> {\n if (state.status === 'closed') return state\n switch (event.type) {\n case 'ai.control.requested': {\n const command = event.payload as ControlCommand<M>\n if (!event.id || !isQueueCommand(command)) return state\n const pending = state.pendingQueueCommands ?? []\n if (pending.some((item) => item.commandId === event.id)) return state\n if (\n (command.action === 'send' || command.action === 'steer') &&\n (state.messages.some((message) => message.id === command.message.id) ||\n state.inbox.items.some((item) => item.id === command.message.id))\n )\n return state\n return {\n ...state,\n pendingQueueCommands: [...pending, { commandId: event.id, command }],\n }\n }\n case 'ai.control.committed': {\n const commit = event.payload as ControlCommit\n const visible = applyControlChanges({\n state: { inbox: state.inbox, active: state.active },\n changes: commit.changes.filter(\n (change) => change.path[0] === 'inbox' || change.path[0] === 'active',\n ),\n })\n const { phase } = commit.view\n const status: AgentStatus = commit.view.closed\n ? 'closed'\n : phase === 'paused' ||\n phase === 'pausing' ||\n (commit.view.paused && phase === null)\n ? 'paused'\n : phase === 'failed'\n ? 'failed'\n : phase === 'starting' || phase === 'generating'\n ? 'generating'\n : phase\n ? 'waiting'\n : 'idle'\n return {\n ...state,\n ...visible,\n status,\n activeRequestId: commit.view.requestId,\n activeRequestReason: commit.view.requestReason,\n activeRequestSourceGenerationId: commit.view.sourceGenerationId,\n activeResponseMessageId: commit.view.responseMessageId,\n }\n }\n case 'ai.control.decided': {\n const receipt = event.payload as ControlReceipt\n if (receipt.work) return state\n const pending = state.pendingQueueCommands ?? []\n const settled = pending.find(\n (item) => item.commandId === receipt.commandId,\n )\n return {\n ...state,\n receipt,\n ...(settled === undefined\n ? {}\n : {\n pendingQueueCommands: pending.filter(\n (item) => item.commandId !== receipt.commandId,\n ),\n }),\n }\n }\n case 'ai.generation.paused': {\n const payload = event.payload as {\n generationId: string\n messageId: string\n }\n const toolCallIds = new Set(\n state.tools\n .filter((tool) => tool.messageId === payload.messageId)\n .map((tool) => tool.toolCallId),\n )\n const projection = state.activeProjection\n return {\n ...state,\n activeGeneration: null,\n activeProjection:\n projection?.generationId === payload.generationId\n ? {\n ...projection,\n cursor: null,\n batches: progressBatches(\n flattenProgressBatches(projection.batches).map((batch) => ({\n index: batch.index,\n chunks: batch.chunks.filter(\n (chunk) =>\n !('toolCallId' in chunk) ||\n toolCallIds.has(chunk.toolCallId),\n ),\n })),\n ),\n }\n : projection,\n compaction:\n state.compaction?.status === 'running'\n ? (projection?.baseCompaction ?? null)\n : state.compaction,\n messages: state.messages.map((message) =>\n message.id === payload.messageId\n ? pauseUIMessage({ message, toolCallIds })\n : message,\n ),\n pausedGenerationIds: {\n ...state.pausedGenerationIds,\n [payload.generationId]: true,\n },\n }\n }\n case 'ai.model.metadata.requested': {\n const { modelId } = event.payload as ModelMetadataRequestedPayload\n if (Object.hasOwn(state.modelMetadata, modelId)) return state\n return {\n ...state,\n modelMetadata: {\n ...state.modelMetadata,\n [modelId]: { status: 'pending' },\n },\n }\n }\n case 'ai.model.metadata.resolved': {\n const { modelId, limits } = event.payload as ModelMetadataResolvedPayload\n return {\n ...state,\n modelMetadata: {\n ...state.modelMetadata,\n [modelId]:\n limits === null\n ? { status: 'unavailable' }\n : { status: 'resolved', limits },\n },\n }\n }\n case 'ai.session.created': {\n const payload = event.payload as SessionCreatedPayload\n return {\n ...state,\n session: {\n created: true,\n ...(payload.metadata === undefined\n ? state.session.metadata === undefined\n ? {}\n : { metadata: state.session.metadata }\n : { metadata: payload.metadata }),\n },\n }\n }\n case 'ai.session.closed':\n return {\n ...state,\n active: null,\n inbox: { paused: true, items: [] },\n pendingQueueCommands: [],\n status: 'closed',\n compaction:\n state.compaction?.status === 'running'\n ? (state.activeProjection?.baseCompaction ?? null)\n : state.compaction,\n activeGeneration: null,\n activeRequestId: null,\n activeRequestReason: null,\n activeRequestSourceGenerationId: null,\n activeResponseMessageId: null,\n activeProjection: null,\n }\n case 'ai.message.created': {\n const { message } = event.payload as MessageCreatedPayload<M>\n return {\n ...state,\n messages: upsertMessage(state.messages, message),\n activeProjection:\n state.activeProjection?.responseMessageId === message.id\n ? { ...state.activeProjection, cursor: null }\n : state.activeProjection,\n }\n }\n case 'ai.message.completed': {\n const { messageId } = event.payload as MessageCompletedPayload\n const owner = state.responseOwners[messageId]\n const generationId = owner?.generationId\n const requestId = owner?.requestId\n if (\n generationId === undefined ||\n terminalGenerationReason(state, generationId, requestId) !== undefined\n ) {\n return state\n }\n return {\n ...state,\n activeRequestId: null,\n activeRequestReason: null,\n activeRequestSourceGenerationId: null,\n activeResponseMessageId: null,\n activeProjection:\n state.activeProjection?.generationId === generationId\n ? null\n : state.activeProjection,\n terminalGenerations: {\n ...state.terminalGenerations,\n [generationId]: 'completed',\n },\n ...(requestId === undefined\n ? {}\n : {\n terminalRequestIds: {\n ...state.terminalRequestIds,\n [requestId]: true,\n },\n }),\n }\n }\n case 'ai.generation.requested': {\n const payload = event.payload as GenerationRequestedPayload\n const schedulesToolContinuation = payload.reason === 'tool'\n const responseMessageId = payload.responseMessageId\n const owner = state.responseOwners[responseMessageId]\n const ownerGenerationId = owner?.generationId\n const ownerRequestId = owner?.requestId\n const requestId = (event as { id?: string }).id\n if (\n requestId !== undefined &&\n state.terminalRequestIds?.[requestId] === true\n ) {\n return state\n }\n const acceptsRequest =\n (payload.control !== undefined && state.activeRequestId === event.id) ||\n payload.reason === 'message' ||\n (payload.reason === 'tool'\n ? ownerGenerationId !== undefined &&\n payload.sourceGenerationId === ownerGenerationId &&\n state.activeRequestId === ownerRequestId &&\n state.status !== 'failed'\n : payload.reason === 'retry'\n ? state.status === 'failed'\n : ownerGenerationId !== undefined &&\n payload.sourceGenerationId === ownerGenerationId &&\n state.activeRequestId === ownerRequestId &&\n state.status !== 'failed')\n if (!acceptsRequest) return state\n const base =\n payload.reason === 'retry' &&\n state.activeProjection &&\n state.activeProjection.completionIndex === undefined\n ? restoreGenerationBase(\n state,\n state.activeProjection.generationId,\n responseMessageId,\n 'failed',\n )\n : state\n return {\n ...base,\n activeProjection:\n payload.reason === 'retry' ? null : state.activeProjection,\n status: schedulesToolContinuation ? state.status : 'generating',\n activeRequestId: requestId ?? null,\n activeRequestReason: payload.reason,\n activeRequestSourceGenerationId: payload.sourceGenerationId ?? null,\n activeResponseMessageId: responseMessageId,\n error: schedulesToolContinuation ? state.error : null,\n }\n }\n case 'ai.generation.started': {\n const payload = event.payload as GenerationStartedPayload\n if (\n state.terminalRequestIds?.[payload.requestId] === true ||\n terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n ) !== undefined\n ) {\n return state\n }\n if (\n state.activeRequestId !== null &&\n state.activeRequestId !== payload.requestId\n ) {\n return state\n }\n const currentOwner = state.responseOwners[payload.responseMessageId]\n const currentTerminal =\n currentOwner === undefined\n ? undefined\n : terminalGenerationReason(\n state,\n currentOwner.generationId,\n currentOwner.requestId,\n )\n if (\n currentTerminal === 'completed' ||\n currentTerminal === 'interrupted'\n ) {\n return state\n }\n if (\n currentOwner?.requestId === payload.requestId &&\n currentOwner.attempt >= payload.attempt\n )\n return state\n const activeGeneration = state.activeGeneration\n const replacesActiveAttempt =\n activeGeneration !== null &&\n activeGeneration.requestId === payload.requestId &&\n activeGeneration.responseMessageId === payload.responseMessageId &&\n activeGeneration.attempt < payload.attempt &&\n state.activeProjection?.generationId === activeGeneration.generationId\n const baseState = replacesActiveAttempt\n ? restoreGenerationBase(\n state,\n activeGeneration.generationId,\n activeGeneration.responseMessageId,\n 'superseded',\n )\n : state\n const baseMessage = findMessage(\n baseState.messages,\n payload.responseMessageId,\n )\n return {\n ...baseState,\n status: 'generating',\n activeGeneration: { ...payload, startIndex: event.index },\n activeResponseMessageId: null,\n responseOwners: {\n ...baseState.responseOwners,\n [payload.responseMessageId]: {\n generationId: payload.generationId,\n requestId: payload.requestId,\n attempt: payload.attempt,\n },\n },\n activeProjection: {\n generationId: payload.generationId,\n responseMessageId: payload.responseMessageId,\n promptThroughIndex: payload.promptThroughIndex ?? event.index - 1,\n ...(baseMessage === undefined\n ? {}\n : { base: { partCount: baseMessage.parts.length } }),\n baseCompaction: baseState.compaction,\n batches: progressBatches(),\n baseTools: baseState.tools,\n toolEvents: [],\n approvalEvents: [],\n },\n error: null,\n }\n }\n case 'ai.generation.progress': {\n const payload = event.payload as StoredProgressPayload\n const generation = state.activeGeneration\n const activeProjection = state.activeProjection\n if (\n generation === null ||\n !progressOwnedBy({\n payload,\n owner: generation,\n startIndex: generation.startIndex,\n }) ||\n state.pausedGenerationIds?.[generation.generationId] ||\n terminalGenerationReason(\n state,\n generation.generationId,\n generation.requestId,\n ) !== undefined ||\n activeProjection?.generationId !== generation.generationId\n ) {\n return state\n }\n const progress = advanceProjection({\n projection: activeProjection,\n base: findMessage(state.messages, activeProjection.responseMessageId),\n chunks: payload.chunks,\n index: event.index,\n })\n return {\n ...state,\n messages: upsertResponse({\n messages: state.messages,\n message: progress.message,\n inputId: generation.messageId,\n }),\n activeProjection: {\n ...activeProjection,\n batches: progress.batches,\n cursor: progress.cursor,\n },\n status: 'generating',\n }\n }\n case 'ai.generation.completed': {\n const payload = event.payload as GenerationCompletedPayload\n if (\n terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n ) !== undefined\n ) {\n return state\n }\n if (\n state.activeGeneration?.generationId !== payload.generationId ||\n state.activeGeneration.requestId !== payload.requestId\n ) {\n return state\n }\n const usage = payload.usage\n ? [\n ...state.usage.filter(\n (entry) => entry.generationId !== payload.generationId,\n ),\n { generationId: payload.generationId, usage: payload.usage },\n ]\n : state.usage\n const next = {\n ...state,\n activeGeneration: null,\n activeProjection:\n state.activeProjection?.generationId === payload.generationId\n ? { ...state.activeProjection, completionIndex: event.index }\n : state.activeProjection,\n usage,\n }\n return { ...next, status: waitingStatus(next) }\n }\n case 'ai.generation.failed': {\n const payload = event.payload as GenerationFailedPayload\n if (\n terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n ) !== undefined\n ) {\n return state\n }\n if (\n (state.activeGeneration?.generationId !== payload.generationId ||\n state.activeGeneration.requestId !== payload.requestId) &&\n !(\n payload.stepLimit === true &&\n state.activeRequestReason === 'tool' &&\n state.responseOwners[payload.responseMessageId]?.requestId ===\n payload.requestId &&\n state.responseOwners[payload.responseMessageId]?.generationId ===\n payload.generationId &&\n state.activeRequestSourceGenerationId === payload.generationId &&\n state.activeResponseMessageId === payload.responseMessageId\n )\n ) {\n return state\n }\n if (payload.superseded === true) {\n return restoreGenerationBase(\n state,\n payload.generationId,\n payload.responseMessageId,\n 'superseded',\n )\n }\n const projection =\n state.activeProjection?.generationId === payload.generationId\n ? state.activeProjection\n : null\n const shouldProject =\n projection !== null &&\n (projection.base !== undefined || projection.batches.length > 0)\n return {\n ...state,\n messages: shouldProject\n ? upsertMessage(\n state.messages,\n interruptUIMessage(\n projectedMessage({\n projection,\n current: findMessage(\n state.messages,\n projection.responseMessageId,\n ),\n }),\n `Generation failed before tool completion: ${payload.error}`,\n ),\n )\n : state.messages,\n status: 'failed',\n activeGeneration: null,\n activeResponseMessageId: null,\n activeProjection: projection,\n terminalGenerations: {\n ...state.terminalGenerations,\n [payload.generationId]: 'failed',\n },\n terminalRequestIds: {\n ...state.terminalRequestIds,\n [payload.requestId]: true,\n ...(state.activeRequestId === null\n ? {}\n : { [state.activeRequestId]: true as const }),\n },\n compaction:\n projection?.generationId === payload.generationId\n ? (projection.baseCompaction ?? null)\n : state.compaction?.generationId === payload.generationId\n ? null\n : state.compaction,\n pendingApprovals: state.pendingApprovals.filter(\n (approval) => approval.generationId !== payload.generationId,\n ),\n pendingInputs: state.pendingInputs.filter(\n (input) => input.generationId !== payload.generationId,\n ),\n tools: stopGenerationTools(\n state.tools,\n payload.generationId,\n payload.responseMessageId,\n payload.error,\n ),\n error: payload.error,\n }\n }\n case 'ai.message.interrupted': {\n const payload = event.payload as MessageInterruptedPayload\n const owner = state.responseOwners[payload.messageId]\n const currentGenerationId = owner?.generationId\n const targetRequestId =\n payload.requestId ??\n (owner?.generationId === payload.generationId\n ? owner?.requestId\n : undefined)\n const ownsRequestPhase =\n payload.requestId !== undefined &&\n state.activeGeneration === null &&\n state.activeRequestId === payload.requestId &&\n state.activeResponseMessageId === payload.messageId\n if (\n currentGenerationId !== undefined &&\n !ownsRequestPhase &&\n (payload.generationId !== undefined\n ? currentGenerationId !== payload.generationId\n : owner?.requestId !== payload.requestId)\n ) {\n return state\n }\n if (\n state.activeGeneration === null &&\n state.activeRequestId !== null &&\n state.activeResponseMessageId === payload.messageId &&\n targetRequestId !== state.activeRequestId\n ) {\n return state\n }\n const currentTerminal =\n currentGenerationId === undefined\n ? undefined\n : terminalGenerationReason(\n state,\n currentGenerationId,\n owner?.requestId,\n )\n if (\n currentTerminal === 'completed' ||\n currentTerminal === 'interrupted' ||\n currentTerminal === 'superseded'\n ) {\n return state\n }\n const active = state.activeGeneration\n if (active === null) {\n if (\n payload.requestId !== undefined &&\n state.activeRequestId !== null &&\n state.activeRequestId === payload.requestId &&\n state.activeResponseMessageId === payload.messageId\n ) {\n const projectedState =\n currentGenerationId === undefined\n ? null\n : interruptGenerationProjection(\n state,\n currentGenerationId,\n payload.messageId,\n payload.lastSeenIndex ?? Number.POSITIVE_INFINITY,\n )\n const baseState = projectedState ?? state\n return {\n ...baseState,\n status: 'idle',\n activeRequestId: null,\n activeRequestReason: null,\n activeRequestSourceGenerationId: null,\n activeResponseMessageId: null,\n activeProjection: null,\n terminalRequestIds: {\n ...baseState.terminalRequestIds,\n [payload.requestId]: true,\n },\n ...(currentGenerationId === undefined\n ? {}\n : {\n terminalGenerations: {\n ...baseState.terminalGenerations,\n [currentGenerationId]: 'interrupted' as const,\n },\n }),\n error: null,\n }\n }\n const targetGenerationId =\n payload.generationId ??\n (currentGenerationId !== undefined &&\n owner?.requestId === payload.requestId\n ? currentGenerationId\n : undefined)\n if (targetGenerationId === undefined) return state\n if (currentGenerationId !== targetGenerationId) return state\n const matchesGeneration = (generationId: string): boolean =>\n targetGenerationId === generationId\n const hasMessageWork =\n state.pendingApprovals.some(\n (approval) =>\n approval.messageId === payload.messageId &&\n matchesGeneration(approval.generationId),\n ) ||\n state.pendingInputs.some(\n (input) =>\n input.messageId === payload.messageId &&\n matchesGeneration(input.generationId),\n ) ||\n state.tools.some(\n (activity) =>\n activity.messageId === payload.messageId &&\n activity.status === 'running' &&\n matchesGeneration(activity.generationId),\n )\n const resolvesFailedGeneration =\n state.status === 'failed' &&\n currentGenerationId === targetGenerationId &&\n (state.activeRequestId === null ||\n state.activeRequestId === targetRequestId ||\n (state.activeRequestReason === 'tool' &&\n state.activeRequestSourceGenerationId === targetGenerationId))\n const resolvesCurrentGeneration =\n currentGenerationId === targetGenerationId &&\n currentTerminal === undefined\n if (\n !hasMessageWork &&\n !resolvesFailedGeneration &&\n !resolvesCurrentGeneration\n ) {\n return state\n }\n const pendingRequestId = state.activeRequestId\n const projectedState = interruptGenerationProjection(\n state,\n targetGenerationId,\n payload.messageId,\n payload.lastSeenIndex ?? Number.POSITIVE_INFINITY,\n )\n const baseState = projectedState ?? state\n const next = {\n ...baseState,\n activeRequestId: null,\n activeRequestReason: null,\n activeRequestSourceGenerationId: null,\n activeResponseMessageId: null,\n activeProjection: null,\n messages:\n projectedState === null\n ? state.messages.map((message) =>\n message.id === payload.messageId\n ? interruptUIMessage(message)\n : message,\n )\n : baseState.messages,\n pendingApprovals: baseState.pendingApprovals.filter(\n (approval) =>\n approval.messageId !== payload.messageId ||\n !matchesGeneration(approval.generationId),\n ),\n pendingInputs: baseState.pendingInputs.filter(\n (input) =>\n input.messageId !== payload.messageId ||\n !matchesGeneration(input.generationId),\n ),\n tools:\n projectedState === null\n ? stopGenerationTools(\n state.tools,\n targetGenerationId,\n payload.messageId,\n 'Tool execution was interrupted.',\n )\n : baseState.tools,\n terminalGenerations: {\n ...baseState.terminalGenerations,\n [targetGenerationId]: 'interrupted' as const,\n },\n ...(pendingRequestId === null\n ? {}\n : {\n terminalRequestIds: {\n ...baseState.terminalRequestIds,\n [pendingRequestId]: true as const,\n },\n }),\n error: resolvesFailedGeneration ? null : state.error,\n }\n return {\n ...next,\n status: waitingStatus(next),\n }\n }\n if (\n payload.messageId !== active.responseMessageId ||\n (payload.generationId !== active.generationId &&\n payload.requestId !== active.requestId)\n ) {\n return state\n }\n const cutoff = payload.lastSeenIndex ?? Number.POSITIVE_INFINITY\n const projectedState = interruptGenerationProjection(\n state,\n active.generationId,\n active.responseMessageId,\n cutoff,\n )\n const baseState =\n projectedState ??\n restoreGenerationBase(\n state,\n active.generationId,\n active.responseMessageId,\n 'interrupted',\n )\n const next = {\n ...baseState,\n activeRequestId: null,\n activeRequestReason: null,\n activeRequestSourceGenerationId: null,\n activeResponseMessageId: null,\n terminalRequestIds: {\n ...baseState.terminalRequestIds,\n [active.requestId]: true as const,\n },\n tools:\n projectedState === null\n ? stopGenerationTools(\n baseState.tools,\n active.generationId,\n active.responseMessageId,\n 'Tool execution was interrupted.',\n )\n : baseState.tools,\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.tool.called': {\n const payload = event.payload as ToolCalledPayload\n const projection = state.activeProjection\n if (\n isStaleGeneration(state, payload.messageId, payload) ||\n terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n ) !== undefined\n ) {\n return state\n }\n if (\n state.tools.some(\n (activity) =>\n activity.generationId === payload.generationId &&\n activity.toolCallId === payload.toolCallId &&\n activity.status === 'failed' &&\n state.activeGeneration?.generationId !== payload.generationId,\n )\n ) {\n return state\n }\n if (projection?.generationId !== payload.generationId) {\n const next = {\n ...state,\n messages: projectMessageChunks(state.messages, payload.messageId, [\n toolCalledChunk(payload),\n ]),\n tools: reduceToolActivity(state.tools, {\n type: 'ai.tool.called',\n payload,\n }),\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n const activeProjection: ActiveGenerationProjection = {\n ...projection,\n cursor: null,\n toolEvents: [\n ...projection.toolEvents,\n { index: event.index, type: 'ai.tool.called', payload },\n ],\n }\n const base = findMessage(state.messages, payload.messageId)\n const paused = state.pausedGenerationIds?.[payload.generationId]\n const cursor = projection.cursor\n const incremental =\n base && cursor && !paused && event.index > cursor.throughIndex\n const projected = incremental\n ? {\n ...(hasToolCall({ message: base, call: payload })\n ? { message: base, cursor: cursor.stream }\n : projectUIMessageStream({\n messageId: payload.messageId,\n base,\n cursor: cursor.stream,\n chunks: [toolCalledChunk(payload)],\n })),\n throughIndex: event.index,\n }\n : projectedMessageStream({\n projection: activeProjection,\n current: base,\n })\n activeProjection.cursor = paused\n ? null\n : { throughIndex: projected.throughIndex, stream: projected.cursor }\n const next = {\n ...state,\n activeProjection,\n messages: upsertResponse({\n messages: state.messages,\n message: paused\n ? projectedResponse({ state, projection: activeProjection })\n : projected.message,\n inputId:\n state.activeGeneration?.messageId ??\n state.active?.input.id ??\n payload.messageId,\n }),\n tools: projectedTools(activeProjection),\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.tool.result': {\n const payload = event.payload as ToolResultPayload\n const projection = state.activeProjection\n const terminalReason = terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n )\n const completesFailedTool =\n terminalReason === 'failed' &&\n state.status === 'failed' &&\n payload.preliminary !== true &&\n projection?.generationId === payload.generationId &&\n projectedTools(projection).some(\n (activity) =>\n activity.generationId === payload.generationId &&\n activity.toolCallId === payload.toolCallId &&\n activity.status === 'running',\n )\n if (\n isStaleGeneration(state, payload.messageId, payload) ||\n (terminalReason !== undefined && !completesFailedTool)\n ) {\n return state\n }\n if (\n state.tools.some(\n (activity) =>\n activity.generationId === payload.generationId &&\n activity.toolCallId === payload.toolCallId &&\n activity.status === 'failed' &&\n state.activeGeneration?.generationId !== payload.generationId &&\n !completesFailedTool,\n )\n ) {\n return state\n }\n if (projection?.generationId !== payload.generationId) {\n const next = {\n ...state,\n messages: projectMessageChunks(state.messages, payload.messageId, [\n toolResultChunk(payload),\n ]),\n tools: reduceToolActivity(state.tools, {\n type: 'ai.tool.result',\n payload,\n }),\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n const activeProjection: ActiveGenerationProjection = {\n ...projection,\n cursor: null,\n toolEvents: [\n ...projection.toolEvents,\n { index: event.index, type: 'ai.tool.result', payload },\n ],\n }\n const projected = projectedResponse({\n state,\n projection: activeProjection,\n })\n const tools = projectedTools(activeProjection)\n const failureError = state.error ?? 'Generation failed.'\n const next = {\n ...state,\n messages: upsertMessage(\n state.messages,\n terminalReason === 'failed'\n ? interruptUIMessage(\n projected,\n `Generation failed before tool completion: ${failureError}`,\n )\n : projected,\n ),\n activeProjection,\n tools:\n terminalReason === 'failed'\n ? stopGenerationTools(\n tools,\n payload.generationId,\n payload.messageId,\n failureError,\n )\n : tools,\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.approval.requested': {\n const payload = event.payload as ApprovalRequestedPayload\n const projection = state.activeProjection\n if (\n isStaleGeneration(state, payload.messageId, payload) ||\n terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n ) !== undefined\n ) {\n return state\n }\n if (\n state.tools.some(\n (activity) =>\n activity.generationId === payload.generationId &&\n activity.toolCallId === payload.toolCallId &&\n activity.status === 'failed' &&\n state.activeGeneration?.generationId !== payload.generationId,\n )\n ) {\n return state\n }\n const activeProjection =\n projection?.generationId === payload.generationId\n ? {\n ...projection,\n cursor: null,\n approvalEvents: [\n ...projection.approvalEvents,\n {\n index: event.index,\n type: 'ai.approval.requested' as const,\n payload,\n },\n ],\n }\n : projection\n const next = {\n ...state,\n messages:\n activeProjection === null || activeProjection === projection\n ? projectMessageChunks(state.messages, payload.messageId, [\n approvalRequestedChunk(payload),\n ])\n : upsertMessage(\n state.messages,\n projectedResponse({ state, projection: activeProjection }),\n ),\n activeProjection,\n pendingApprovals:\n payload.isAutomatic === true\n ? state.pendingApprovals\n : [\n ...state.pendingApprovals.filter(\n (approval) =>\n approval.approvalId !== payload.approvalId ||\n approval.messageId !== payload.messageId,\n ),\n payload,\n ],\n }\n return {\n ...next,\n status: lifecycleStatus(state, next),\n }\n }\n case 'ai.approval.responded': {\n const payload = event.payload as ApprovalRespondedPayload\n if (\n isStaleGeneration(state, payload.messageId, payload) ||\n terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n ) !== undefined\n ) {\n return state\n }\n const projection = state.activeProjection\n const pendingRequest = state.pendingApprovals.find(\n (candidate) =>\n candidate.approvalId === payload.approvalId &&\n candidate.messageId === payload.messageId &&\n candidate.generationId === payload.generationId,\n )\n const activeRequest = projection?.approvalEvents.findLast(\n (candidate) =>\n candidate.type === 'ai.approval.requested' &&\n candidate.payload.approvalId === payload.approvalId &&\n candidate.payload.messageId === payload.messageId &&\n candidate.payload.generationId === payload.generationId,\n )\n if (\n state.status === 'failed' &&\n pendingRequest === undefined &&\n activeRequest === undefined\n ) {\n return state\n }\n const activeProjection =\n projection !== null && activeRequest !== undefined\n ? {\n ...projection,\n cursor: null,\n approvalEvents: [\n ...projection.approvalEvents,\n {\n index: event.index,\n type: 'ai.approval.responded' as const,\n payload,\n },\n ],\n }\n : projection\n const next = {\n ...state,\n messages:\n activeProjection === null || activeProjection === projection\n ? answerApproval(state.messages, payload)\n : upsertMessage(\n state.messages,\n projectedResponse({ state, projection: activeProjection }),\n ),\n activeProjection:\n activeProjection === null\n ? null\n : { ...activeProjection, cursor: null },\n pendingApprovals: state.pendingApprovals.filter(\n (approval) =>\n approval.approvalId !== payload.approvalId ||\n approval.messageId !== payload.messageId ||\n approval.generationId !== payload.generationId,\n ),\n }\n return {\n ...next,\n status: lifecycleStatus(state, next),\n }\n }\n case 'ai.input.requested': {\n const payload = event.payload as InputRequestedPayload\n if (\n isStaleGeneration(state, payload.messageId, payload) ||\n terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n ) !== undefined\n ) {\n return state\n }\n const next = {\n ...state,\n pendingInputs: [\n ...state.pendingInputs.filter(\n (input) =>\n input.messageId !== payload.messageId ||\n input.generationId !== payload.generationId ||\n input.inputId !== payload.inputId,\n ),\n payload,\n ],\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.input.responded': {\n const payload = event.payload as InputRespondedPayload\n if (\n isStaleGeneration(state, payload.messageId, payload) ||\n terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n ) !== undefined\n ) {\n return state\n }\n const next = {\n ...state,\n pendingInputs: state.pendingInputs.filter(\n (input) =>\n input.inputId !== payload.inputId ||\n input.messageId !== payload.messageId ||\n input.generationId !== payload.generationId,\n ),\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.compaction.requested': {\n const payload = event.payload as CompactionRequestedPayload\n if (state.activeGeneration?.generationId !== payload.generationId) {\n return state\n }\n return addCompactionPart(\n { ...state, compaction: { status: 'running', ...payload } },\n payload,\n )\n }\n case 'ai.compaction.completed': {\n const payload = event.payload as CompactionCompletedPayload<M>\n if (\n state.activeGeneration?.generationId !== payload.generationId ||\n state.compaction?.status !== 'running' ||\n state.compaction.generationId !== payload.generationId\n ) {\n return state\n }\n const {\n messages: _messages,\n retainedMessageIds: _retained,\n ...summary\n } = payload\n const compaction: CompactionState = {\n status: 'completed',\n ...summary,\n throughIndex:\n payload.throughIndex ?? state.activeProjection!.promptThroughIndex!,\n }\n const projection = state.activeProjection\n return settleCompactionPart({\n state: {\n ...state,\n compaction,\n activeProjection: projection && {\n ...projection,\n baseCompaction: compaction,\n // A new base identity records the completed part as the step's\n // starting point, so a later cutoff cannot revert it to running.\n ...(projection.base === undefined\n ? {}\n : { base: { ...projection.base } }),\n },\n },\n generationId: payload.generationId,\n data: {\n status: 'completed',\n ...(summary.summary === undefined\n ? {}\n : { summary: summary.summary }),\n ...(summary.usage === undefined ? {} : { usage: summary.usage }),\n },\n })\n }\n default:\n return state\n }\n}\n\n/** Derive AI SDK UI messages directly from an A2 event history. */\nexport function deriveUIMessages<M extends UIMessage = UIMessage>(\n history: readonly { type: string; payload: unknown; index: number }[],\n): TranscriptMessage<M>[] {\n let state = initialState<M>()\n for (const event of history) state = reduceAIState(state, event)\n return state.messages\n}\n\ntype CommandInput<C> = { type: 'ai.control.requested'; payload: C; id?: string }\ntype ControlInput<\n M extends UIMessage,\n A extends ControlCommand<M>['action'],\n> = CommandInput<Extract<ControlCommand<M>, { action: A }>> &\n (A extends 'send' | 'steer' ? { id: string } : {})\n\nexport type AIInputs = {\n message<M extends UIMessage>(\n message: M,\n options?: { generate?: boolean },\n ): ControlInput<M, 'send'>[]\n seed<M extends UIMessage>(message: M): ControlInput<M, 'send'>[]\n queue: {\n remove(options: { inputId: string }): ControlInput<UIMessage, 'remove'>[]\n sendNow(options: {\n inputId: string\n turnId: string | null\n lastSeenIndex?: number\n }): ControlInput<UIMessage, 'send-now'>[]\n edit<M extends UIMessage>(options: {\n message: M\n }): ControlInput<M, 'edit'>[]\n move(options: {\n inputId: string\n beforeId: string | null\n }): ControlInput<UIMessage, 'move'>[]\n }\n stop(options: {\n turnId: string\n lastSeenIndex?: number\n }): ControlInput<UIMessage, 'stop'>[]\n steer<M extends UIMessage>(options: {\n turnId: string\n message: M\n lastSeenIndex?: number\n }): ControlInput<M, 'steer'>[]\n pause(options: {\n when: 'now' | 'after-turn'\n }): ControlInput<UIMessage, 'pause'>[]\n resume(): ControlInput<UIMessage, 'resume'>[]\n approval(\n response: ApprovalRespondedPayload,\n ): ControlInput<UIMessage, 'approval'>[]\n input(response: InputRespondedPayload): ControlInput<UIMessage, 'input'>[]\n requestInput(\n request: InputRequestedPayload,\n ): ControlInput<UIMessage, 'request-input'>[]\n retry(request: RetryGenerationOptions): ControlInput<UIMessage, 'retry'>[]\n interrupt(\n request: MessageInterruptedPayload,\n ): ControlInput<UIMessage, 'interrupt'>[]\n toolResult(\n result: ToolResultPayload,\n ): ControlInput<UIMessage, 'tool-result'>[]\n}\n\nconst commandInput = <C extends ControlCommand<UIMessage>>(\n payload: C,\n): CommandInput<C>[] => [{ type: 'ai.control.requested', payload }]\nconst messageInput = <M extends UIMessage>(\n message: M,\n generate?: boolean,\n): ControlInput<M, 'send'>[] => [\n {\n type: 'ai.control.requested',\n id: message.id,\n payload: {\n action: 'send',\n message,\n ...(generate === false ? { generate: false } : {}),\n },\n },\n]\n\n/** Pure append inputs for the built-in AI protocol. */\nexport const inputs: AIInputs = {\n toolResult: (result) => commandInput({ action: 'tool-result', result }),\n queue: {\n remove: (options) => commandInput({ action: 'remove', ...options }),\n sendNow: (options) => commandInput({ action: 'send-now', ...options }),\n edit: (options) => commandInput({ action: 'edit', ...options }),\n move: (options) => commandInput({ action: 'move', ...options }),\n },\n stop: (options) => commandInput({ action: 'stop', ...options }),\n steer: (options) => [\n {\n type: 'ai.control.requested',\n id: options.message.id,\n payload: { action: 'steer', ...options },\n },\n ],\n pause: (options) => commandInput({ action: 'pause', ...options }),\n resume: () => commandInput({ action: 'resume' }),\n message<M extends UIMessage>(message: M, options?: { generate?: boolean }) {\n return messageInput(message, options?.generate)\n },\n seed<M extends UIMessage>(message: M) {\n return messageInput(message, false)\n },\n approval: (response) => [\n {\n ...commandInput({ action: 'approval', response })[0]!,\n id: `ai.approval:${encodeURIComponent(response.requestId)}:${encodeURIComponent(response.messageId)}:${encodeURIComponent(response.generationId)}:${encodeURIComponent(response.approvalId)}:response`,\n },\n ],\n input: (response) => [\n {\n ...commandInput({ action: 'input', response })[0]!,\n id: `ai.input:${encodeURIComponent(response.requestId)}:${encodeURIComponent(response.messageId)}:${encodeURIComponent(response.generationId)}:${encodeURIComponent(response.inputId)}:response`,\n },\n ],\n requestInput: (request) => [\n {\n ...commandInput({ action: 'request-input', request })[0]!,\n id: `ai.input:${encodeURIComponent(request.requestId)}:${encodeURIComponent(request.messageId)}:${encodeURIComponent(request.generationId)}:${encodeURIComponent(request.inputId)}:request`,\n },\n ],\n retry: (request) => [\n {\n ...commandInput({ action: 'retry', request })[0]!,\n id: `ai.retry:${request.retryId}`,\n },\n ],\n interrupt: (request) => [\n {\n ...commandInput({ action: 'interrupt', request })[0]!,\n id: `ai.interrupt:${request.generationId ?? request.requestId}`,\n },\n ],\n}\n\n/**\n * Read the durable handler context ambient to the current AI tool\n * execution. A2 runs each local tool's `execute` inside this scope, so\n * plain AI SDK `tool()` definitions reach their `event`, `attempt`,\n * `session`, and `signal` without an A2-specific wrapper. Pass the\n * agent's contract to type application events; it is verified against\n * the executing agent.\n */\nexport function handlerContext<D extends AgentToolEventDefs = AIEventDefs>(\n contract?: Contract<D>,\n): AgentToolContext<D> {\n const scope = ambientToolScopeStorage()?.getStore()\n if (scope === undefined) {\n throw new TypeError(\n \"handlerContext() requires an ambient A2 tool execution: call it inside a local tool's execute, or wrap direct tool tests with runWithHandlerContext\",\n )\n }\n if (\n contract !== undefined &&\n scope.contract !== undefined &&\n scope.contract.name !== contract.name\n ) {\n throw new TypeError(\n `handlerContext('${contract.name}') was called during a tool execution for agent '${scope.contract.name}'`,\n )\n }\n return scope.context as AgentToolContext<D>\n}\n\n/** The built-in AI reducer's name, and so its checkpoint identity. */\nexport const AI_STATE_REDUCER = 'a2.ai.state.v26'\n\n/**\n * The built-in AI protocol plus application events, as a core contract whose\n * reducer folds `AIState`. Isomorphic: share it when a client needs\n * application events or extended state; otherwise `agent({ name })` on the\n * server builds one and clients use the built-in protocol.\n */\nexport function agentContract<\n M extends UIMessage = UIMessage,\n E extends EventDefs = Record<never, never>,\n X extends object = Record<never, never>,\n>(\n options: AgentContractOptions<M, E, X>,\n): AgentContract<M, AIEventDefs<M> & E, X> {\n type D = AIEventDefs<M> & E\n const builtIns = createEvents(\n options.messageSchema === undefined\n ? undefined\n : { messageSchema: options.messageSchema },\n )\n const extensions = options.events ?? ({} as E)\n for (const key of Object.keys(extensions)) {\n if (Object.hasOwn(builtIns, key)) {\n throw new TypeError(\n `agent event '${key}' conflicts with a built-in event`,\n )\n }\n }\n const vocabulary = createContract({\n name: options.name,\n events: { ...builtIns, ...extensions } as D,\n })\n const app = options.reducer as AppReducer<D, X> | undefined\n const aiState = initialState<M>()\n for (const key of Object.keys(app?.initialState ?? {})) {\n if (isAIStateKey(key))\n throw new TypeError(`agent state '${key}' conflicts with AIState`)\n }\n const reducer = makeReducer({\n contract: vocabulary,\n // Application checkpoints embed AI state, so they advance with it.\n name:\n app === undefined ? AI_STATE_REDUCER : `${app.name}+${AI_STATE_REDUCER}`,\n initialState: { ...aiState, ...app?.initialState } as AIState<M> & X,\n }).fold((state, event) => {\n const next = reduceAIState(state, event) as AIState<M> & X\n if (app === undefined) return next\n const before = appSlice<X>(state)\n const after = app.fold(before, event as ContractEvent<D>)\n return after === before ? next : withAppSlice(next, after)\n })\n const shared = createContract({\n name: options.name,\n events: vocabulary.events,\n reducer: withAIStorage(\n withReducerRuntime({\n reducer,\n project: projectAIClientState<M> as unknown as (\n state: AIState<M> & X,\n ) => AIState<M> & X,\n }),\n ),\n })\n registerAgentReducer(\n shared.reducer,\n app as unknown as AppReducer<EventDefs, object> | undefined,\n )\n return shared as unknown as AgentContract<M, AIEventDefs<M> & E, X>\n}\n\nexport type {\n FinishReason,\n JSONValue,\n LanguageModelUsage,\n UIMessage,\n UIMessageChunk,\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ai-BpOGm-zB.js","names":["isRecord","isRecord","isRecord","createContract","reducer","makeReducer"],"sources":["../src/equal-json.ts","../src/ai-message-base.ts","../src/parse-partial-json.ts","../src/ai-projector.ts","../src/ai-progress-batches.ts","../src/ai-message-projection.ts","../src/ai-client-state.ts","../src/ai-control-state.ts","../src/ai-control.ts","../src/ai-id.ts","../src/ai-stored-state.ts","../src/ai-app-state.ts","../src/ai.ts"],"sourcesContent":["export const sameValue = (left: unknown, right: unknown): boolean => {\n if (Object.is(left, right)) return true\n if (\n typeof left !== 'object' ||\n left === null ||\n typeof right !== 'object' ||\n right === null\n )\n return false\n const prototype = Object.getPrototypeOf(left)\n if (\n prototype !== Object.getPrototypeOf(right) ||\n (prototype !== Object.prototype &&\n prototype !== Array.prototype &&\n prototype !== null)\n )\n return false\n if (\n Array.isArray(left) &&\n (!Array.isArray(right) || left.length !== right.length)\n )\n return false\n const keys = Reflect.ownKeys(left)\n return (\n keys.length === Reflect.ownKeys(right).length &&\n keys.every(\n (key) =>\n Object.hasOwn(right, key) &&\n sameValue(Reflect.get(left, key), Reflect.get(right, key)),\n )\n )\n}\n","import type { UIMessage } from 'ai'\nimport { sameValue } from './equal-json.ts'\n\ntype FieldUndo = { value?: unknown } | { remove: true } | { length: number }\ntype FieldsUndo = Record<string, FieldUndo>\ntype PartUndo = { value: UIMessage['parts'][number] } | { fields: FieldsUndo }\n\nexport type MessageBase = {\n partCount: number\n fields?: FieldsUndo\n parts?: Record<string, PartUndo>\n}\n\nconst record = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst assertFields = (fields: unknown): void => {\n if (fields === undefined) return\n if (!record(fields)) throw new TypeError('invalid AI message base fields')\n for (const [key, undo] of Object.entries(fields)) {\n if (\n !record(undo) ||\n Object.keys(undo).length > 1 ||\n !(\n Object.keys(undo).length === 0 ||\n 'value' in undo ||\n undo['remove'] === true ||\n (key === 'text' &&\n Number.isSafeInteger(undo['length']) &&\n (undo['length'] as number) >= 0)\n )\n )\n throw new TypeError('invalid AI message base field')\n }\n}\n\n/** Checks decoded recovery data; `restoreMessageBase` trusts this shape. */\nexport function assertMessageBase(\n value: unknown,\n): asserts value is MessageBase {\n if (\n !record(value) ||\n !Number.isSafeInteger(value['partCount']) ||\n (value['partCount'] as number) < 0 ||\n (value['partCount'] as number) > 0xffffffff - 1 ||\n Object.keys(value).some(\n (key) => !['partCount', 'fields', 'parts'].includes(key),\n ) ||\n (value['parts'] !== undefined && !record(value['parts']))\n )\n throw new TypeError('invalid AI message base')\n assertFields(value['fields'])\n const partCount = value['partCount'] as number\n for (const [key, undo] of Object.entries(value['parts'] ?? {})) {\n const index = Number(key)\n if (\n !Number.isSafeInteger(index) ||\n String(index) !== key ||\n index < 0 ||\n index >= partCount ||\n !record(undo) ||\n Object.keys(undo).length !== 1 ||\n !(('value' in undo && record(undo['value'])) || 'fields' in undo)\n )\n throw new TypeError('invalid AI message base part')\n if ('fields' in undo) assertFields(undo['fields'])\n }\n}\n\nconst restoreFields = (\n current: Record<string, unknown>,\n fields: FieldsUndo | undefined,\n): Record<string, unknown> | undefined => {\n if (fields === undefined) return current\n const restored = { ...current }\n for (const [key, undo] of Object.entries(fields)) {\n if ('remove' in undo) delete restored[key]\n else if ('length' in undo) {\n const text = current[key]\n if (typeof text !== 'string' || undo.length > text.length)\n return undefined\n restored[key] = text.slice(0, undo.length)\n } else\n Object.defineProperty(restored, key, {\n value: undo.value,\n enumerable: true,\n writable: true,\n configurable: true,\n })\n }\n return restored\n}\n\n/** `undefined` when `base` no longer describes `current`, including a removed message. */\nexport const restoreMessageBase = <M extends UIMessage>(options: {\n current: M | undefined\n base: MessageBase | undefined\n}): M | undefined => {\n const { current, base } = options\n if (base === undefined || current === undefined) return undefined\n const parts = current.parts.slice(0, base.partCount)\n for (const [key, undo] of Object.entries(base.parts ?? {})) {\n const index = Number(key)\n if ('value' in undo) {\n parts[index] = undo.value as M['parts'][number]\n continue\n }\n const part = parts[index]\n const restored =\n part === undefined\n ? undefined\n : restoreFields(part as unknown as Record<string, unknown>, undo.fields)\n if (!restored) return undefined\n parts[index] = restored as M['parts'][number]\n }\n if (\n parts.length !== base.partCount ||\n Object.keys(parts).length !== parts.length\n )\n return undefined\n const { parts: _parts, ...fields } = current\n const restored = restoreFields(fields, base.fields)\n return restored && ({ ...restored, parts } as M)\n}\n\nconst updateFields = (options: {\n before: Record<string, unknown>\n after: Record<string, unknown>\n undo?: FieldsUndo\n}): FieldsUndo | undefined => {\n const { before, after, undo } = options\n const original = restoreFields(before, undo)\n if (!original) return undefined\n return Object.fromEntries(\n [...new Set([...Object.keys(original), ...Object.keys(after)])].flatMap(\n (key) => {\n if (\n Object.hasOwn(original, key) === Object.hasOwn(after, key) &&\n sameValue(original[key], after[key])\n )\n return []\n const value = original[key]\n const next = after[key]\n const change: FieldUndo = !Object.hasOwn(original, key)\n ? { remove: true }\n : key === 'text' &&\n typeof value === 'string' &&\n typeof next === 'string' &&\n next.startsWith(value)\n ? { length: value.length }\n : value === undefined\n ? {}\n : { value }\n return [[key, change]]\n },\n ),\n )\n}\n\n/** `undefined` when `before` no longer matches `base`, so the recovery must be dropped. */\nexport const updateMessageBase = (options: {\n base: MessageBase\n before: UIMessage\n after: UIMessage\n}): MessageBase | undefined => {\n const { base, before, after } = options\n if (before === after) return base\n const { parts: beforeParts, ...beforeFields } = before\n const { parts: afterParts, ...afterFields } = after\n const fields = updateFields({\n before: beforeFields,\n after: afterFields,\n ...(base.fields && { undo: base.fields }),\n })\n if (!fields) return undefined\n const parts: Array<[string, PartUndo]> = []\n for (let index = 0; index < base.partCount; index += 1) {\n const previous = beforeParts[index]\n const current = afterParts[index]\n const undo = base.parts?.[index]\n const original = undo && 'value' in undo ? undo.value : previous\n if (!original) return undefined\n if (previous === current && undo === undefined) continue\n const originalFields = original as unknown as Record<string, unknown>\n const undoFields = undo && 'fields' in undo ? undo.fields : undefined\n if (!current) {\n const value = restoreFields(originalFields, undoFields)\n if (!value) return undefined\n parts.push([\n String(index),\n { value: value as UIMessage['parts'][number] },\n ])\n continue\n }\n const changed = updateFields({\n before: originalFields,\n after: current as unknown as Record<string, unknown>,\n ...(undoFields && { undo: undoFields }),\n })\n if (!changed) return undefined\n if (Object.keys(changed).length > 0)\n parts.push([String(index), { fields: changed }])\n }\n return {\n partCount: base.partCount,\n ...(Object.keys(fields).length > 0 && { fields }),\n ...(parts.length > 0 && { parts: Object.fromEntries(parts) }),\n }\n}\n","/*!\n * Adapted from AI SDK 7.0.58, packages/ai/src/util/fix-json.ts.\n * Source: https://github.com/vercel/ai, packages/ai/src/util/fix-json.ts.\n * Modified to expose a synchronous partial parser with strict TypeScript types.\n * Also preserves positive exponents in unfinished containers.\n * Copyright 2023 Vercel, Inc.\n * @license Apache-2.0. See src/licenses/Apache-2.0.txt.\n */\n\nexport function parsePartialJSON(text: string | undefined): unknown {\n if (text === undefined || text.trim() === '') return undefined\n try {\n return JSON.parse(text) as unknown\n } catch {\n try {\n return JSON.parse(repairPartialJSON(text)) as unknown\n } catch {\n return undefined\n }\n }\n}\n\ntype State =\n | 'ROOT'\n | 'FINISH'\n | 'INSIDE_STRING'\n | 'INSIDE_STRING_ESCAPE'\n | 'INSIDE_STRING_UNICODE_ESCAPE'\n | 'INSIDE_LITERAL'\n | 'INSIDE_NUMBER'\n | 'INSIDE_OBJECT_START'\n | 'INSIDE_OBJECT_KEY'\n | 'INSIDE_OBJECT_AFTER_KEY'\n | 'INSIDE_OBJECT_BEFORE_VALUE'\n | 'INSIDE_OBJECT_AFTER_VALUE'\n | 'INSIDE_OBJECT_AFTER_COMMA'\n | 'INSIDE_ARRAY_START'\n | 'INSIDE_ARRAY_AFTER_VALUE'\n | 'INSIDE_ARRAY_AFTER_COMMA'\n\nconst isHexDigit = (char: string): boolean =>\n (char >= '0' && char <= '9') ||\n (char >= 'A' && char <= 'F') ||\n (char >= 'a' && char <= 'f')\n\nfunction repairPartialJSON(input: string): string {\n const stack: State[] = ['ROOT']\n let lastValidIndex = -1\n let literalStart: number | null = null\n let unicodeEscapeDigits = 0\n\n function processValueStart(char: string, i: number, swapState: State) {\n {\n switch (char) {\n case '\"': {\n lastValidIndex = i\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_STRING')\n break\n }\n\n case 'f':\n case 't':\n case 'n': {\n lastValidIndex = i\n literalStart = i\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_LITERAL')\n break\n }\n\n case '-': {\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_NUMBER')\n break\n }\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9': {\n lastValidIndex = i\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_NUMBER')\n break\n }\n\n case '{': {\n lastValidIndex = i\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_OBJECT_START')\n break\n }\n\n case '[': {\n lastValidIndex = i\n stack.pop()\n stack.push(swapState)\n stack.push('INSIDE_ARRAY_START')\n break\n }\n }\n }\n }\n\n function processAfterObjectValue(char: string, i: number) {\n switch (char) {\n case ',': {\n stack.pop()\n stack.push('INSIDE_OBJECT_AFTER_COMMA')\n break\n }\n case '}': {\n lastValidIndex = i\n stack.pop()\n break\n }\n }\n }\n\n function processAfterArrayValue(char: string, i: number) {\n switch (char) {\n case ',': {\n stack.pop()\n stack.push('INSIDE_ARRAY_AFTER_COMMA')\n break\n }\n case ']': {\n lastValidIndex = i\n stack.pop()\n break\n }\n }\n }\n\n for (let i = 0; i < input.length; i++) {\n const char = input[i]!\n const currentState = stack[stack.length - 1]\n\n switch (currentState) {\n case 'ROOT':\n processValueStart(char, i, 'FINISH')\n break\n\n case 'INSIDE_OBJECT_START': {\n switch (char) {\n case '\"': {\n stack.pop()\n stack.push('INSIDE_OBJECT_KEY')\n break\n }\n case '}': {\n lastValidIndex = i\n stack.pop()\n break\n }\n }\n break\n }\n\n case 'INSIDE_OBJECT_AFTER_COMMA': {\n switch (char) {\n case '\"': {\n stack.pop()\n stack.push('INSIDE_OBJECT_KEY')\n break\n }\n }\n break\n }\n\n case 'INSIDE_OBJECT_KEY': {\n switch (char) {\n case '\"': {\n stack.pop()\n stack.push('INSIDE_OBJECT_AFTER_KEY')\n break\n }\n }\n break\n }\n\n case 'INSIDE_OBJECT_AFTER_KEY': {\n switch (char) {\n case ':': {\n stack.pop()\n stack.push('INSIDE_OBJECT_BEFORE_VALUE')\n\n break\n }\n }\n break\n }\n\n case 'INSIDE_OBJECT_BEFORE_VALUE': {\n processValueStart(char, i, 'INSIDE_OBJECT_AFTER_VALUE')\n break\n }\n\n case 'INSIDE_OBJECT_AFTER_VALUE': {\n processAfterObjectValue(char, i)\n break\n }\n\n case 'INSIDE_STRING': {\n switch (char) {\n case '\"': {\n stack.pop()\n lastValidIndex = i\n break\n }\n\n case '\\\\': {\n stack.push('INSIDE_STRING_ESCAPE')\n break\n }\n\n default: {\n lastValidIndex = i\n }\n }\n\n break\n }\n\n case 'INSIDE_ARRAY_START': {\n switch (char) {\n case ']': {\n lastValidIndex = i\n stack.pop()\n break\n }\n\n default: {\n lastValidIndex = i\n processValueStart(char, i, 'INSIDE_ARRAY_AFTER_VALUE')\n break\n }\n }\n break\n }\n\n case 'INSIDE_ARRAY_AFTER_VALUE': {\n switch (char) {\n case ',': {\n stack.pop()\n stack.push('INSIDE_ARRAY_AFTER_COMMA')\n break\n }\n\n case ']': {\n lastValidIndex = i\n stack.pop()\n break\n }\n\n default: {\n lastValidIndex = i\n break\n }\n }\n\n break\n }\n\n case 'INSIDE_ARRAY_AFTER_COMMA': {\n processValueStart(char, i, 'INSIDE_ARRAY_AFTER_VALUE')\n break\n }\n\n case 'INSIDE_STRING_ESCAPE': {\n stack.pop()\n\n if (char === 'u') {\n unicodeEscapeDigits = 0\n stack.push('INSIDE_STRING_UNICODE_ESCAPE')\n } else {\n lastValidIndex = i\n }\n\n break\n }\n\n case 'INSIDE_STRING_UNICODE_ESCAPE': {\n if (isHexDigit(char)) {\n unicodeEscapeDigits++\n\n if (unicodeEscapeDigits === 4) {\n stack.pop()\n lastValidIndex = i\n }\n }\n\n break\n }\n\n case 'INSIDE_NUMBER': {\n switch (char) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9': {\n lastValidIndex = i\n break\n }\n\n case 'e':\n case 'E':\n case '-':\n case '+':\n case '.': {\n break\n }\n\n case ',': {\n stack.pop()\n\n if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {\n processAfterArrayValue(char, i)\n }\n\n if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {\n processAfterObjectValue(char, i)\n }\n\n break\n }\n\n case '}': {\n stack.pop()\n\n if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {\n processAfterObjectValue(char, i)\n }\n\n break\n }\n\n case ']': {\n stack.pop()\n\n if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {\n processAfterArrayValue(char, i)\n }\n\n break\n }\n\n default: {\n stack.pop()\n break\n }\n }\n\n break\n }\n\n case 'INSIDE_LITERAL': {\n const partialLiteral = input.substring(literalStart!, i + 1)\n\n if (\n !'false'.startsWith(partialLiteral) &&\n !'true'.startsWith(partialLiteral) &&\n !'null'.startsWith(partialLiteral)\n ) {\n stack.pop()\n\n if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {\n processAfterObjectValue(char, i)\n } else if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {\n processAfterArrayValue(char, i)\n }\n } else {\n lastValidIndex = i\n }\n\n break\n }\n }\n }\n\n let result = input.slice(0, lastValidIndex + 1)\n\n for (let i = stack.length - 1; i >= 0; i--) {\n const state = stack[i]\n\n switch (state) {\n case 'INSIDE_STRING': {\n result += '\"'\n break\n }\n\n case 'INSIDE_OBJECT_KEY':\n case 'INSIDE_OBJECT_AFTER_KEY':\n case 'INSIDE_OBJECT_AFTER_COMMA':\n case 'INSIDE_OBJECT_START':\n case 'INSIDE_OBJECT_BEFORE_VALUE':\n case 'INSIDE_OBJECT_AFTER_VALUE': {\n result += '}'\n break\n }\n\n case 'INSIDE_ARRAY_START':\n case 'INSIDE_ARRAY_AFTER_COMMA':\n case 'INSIDE_ARRAY_AFTER_VALUE': {\n result += ']'\n break\n }\n\n case 'INSIDE_LITERAL': {\n const partialLiteral = input.substring(literalStart!, input.length)\n\n if ('true'.startsWith(partialLiteral)) {\n result += 'true'.slice(partialLiteral.length)\n } else if ('false'.startsWith(partialLiteral)) {\n result += 'false'.slice(partialLiteral.length)\n } else if ('null'.startsWith(partialLiteral)) {\n result += 'null'.slice(partialLiteral.length)\n }\n }\n }\n }\n\n return result\n}\n","import { sameValue } from './equal-json.ts'\nimport type { ToolCalledPayload } from './ai.ts'\nimport type { UIMessage, UIMessageChunk } from 'ai'\nimport { parsePartialJSON } from './parse-partial-json.ts'\n\nexport type ProjectionChunk =\n UIMessageChunk | { type: 'a2-tool-called'; call: ToolCalledPayload }\n\ntype MutablePart = Record<string, unknown>\n\ntype PartialToolCall = {\n text: string\n toolName: string\n dynamic: boolean\n providerExecuted?: boolean\n providerMetadata?: unknown\n toolMetadata?: unknown\n title?: string\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst cloneMessage = <M extends UIMessage>(messageId: string, base?: M): M =>\n (base === undefined\n ? { id: messageId, role: 'assistant', parts: [] }\n : {\n ...base,\n id: messageId,\n parts: [...base.parts],\n }) as M\n\nconst editPart = ({\n parts,\n part,\n}: {\n parts: MutablePart[]\n part: MutablePart\n}): MutablePart => {\n const index = parts.indexOf(part)\n const next = { ...part }\n parts[index] = next\n return next\n}\n\nconst currentStepParts = (parts: MutablePart[]): MutablePart[] => {\n let start = parts.length - 1\n while (start >= 0 && parts[start]?.['type'] !== 'step-start') start -= 1\n return parts.slice(start + 1)\n}\n\nconst isToolPart = (part: MutablePart): boolean =>\n typeof part['toolCallId'] === 'string' &&\n (part['type'] === 'dynamic-tool' ||\n (typeof part['type'] === 'string' && part['type'].startsWith('tool-')))\n\nconst findToolPart = (\n parts: MutablePart[],\n toolCallId: string,\n): MutablePart | undefined => {\n const current = currentStepParts(parts).find(\n (part) => isToolPart(part) && part['toolCallId'] === toolCallId,\n )\n if (current) return current\n return parts.findLast(\n (part) => isToolPart(part) && part['toolCallId'] === toolCallId,\n )\n}\n\nexport const hasToolCall = ({\n message,\n call,\n}: {\n message: UIMessage\n call: ToolCalledPayload\n}): boolean => {\n const part = findToolPart(\n message.parts as unknown as MutablePart[],\n call.toolCallId,\n )\n return (\n part !== undefined &&\n part['state'] !== 'input-streaming' &&\n sameValue(part['input'], call.input) &&\n (part['callProviderMetadata'] !== undefined ||\n call.providerMetadata === undefined) &&\n (part['toolMetadata'] !== undefined || call.toolMetadata === undefined) &&\n (call.providerExecuted === undefined ||\n part['providerExecuted'] === call.providerExecuted) &&\n (call.title === undefined || part['title'] === call.title)\n )\n}\n\nconst findApprovalPart = (\n parts: MutablePart[],\n approvalId: string,\n): MutablePart | undefined =>\n parts.find((part) => {\n const approval = part['approval']\n return (\n isToolPart(part) && isRecord(approval) && approval['id'] === approvalId\n )\n })\n\nconst setOptional = (\n target: MutablePart,\n key: string,\n value: unknown,\n): void => {\n if (value !== undefined) target[key] = value\n}\n\nconst setToolPart = (options: {\n parts: MutablePart[]\n toolCallId: string\n toolName: string\n dynamic: boolean\n state: string\n input?: unknown\n rawInput?: unknown\n output?: unknown\n errorText?: string\n preliminary?: boolean | undefined\n providerExecuted?: boolean | undefined\n providerMetadata?: unknown\n toolMetadata?: unknown\n title?: string | undefined\n}): MutablePart => {\n let part = findToolPart(options.parts, options.toolCallId)\n if (!part) {\n part = {\n type: options.dynamic ? 'dynamic-tool' : `tool-${options.toolName}`,\n ...(options.dynamic ? { toolName: options.toolName } : {}),\n toolCallId: options.toolCallId,\n }\n options.parts.push(part)\n } else part = editPart({ parts: options.parts, part })\n\n part['state'] = options.state\n part['input'] = options.input\n delete part['output']\n delete part['rawInput']\n delete part['errorText']\n delete part['preliminary']\n setOptional(part, 'rawInput', options.rawInput)\n setOptional(part, 'output', options.output)\n setOptional(part, 'errorText', options.errorText)\n setOptional(part, 'preliminary', options.preliminary)\n setOptional(part, 'providerExecuted', options.providerExecuted)\n setOptional(part, 'title', options.title)\n setOptional(part, 'toolMetadata', options.toolMetadata)\n if (options.dynamic) part['toolName'] = options.toolName\n if (options.providerMetadata !== undefined) {\n part[\n options.state === 'output-available' || options.state === 'output-error'\n ? 'resultProviderMetadata'\n : 'callProviderMetadata'\n ] = options.providerMetadata\n }\n return part\n}\n\nconst mergeMetadata = (current: unknown, update: unknown): unknown => {\n if (update === undefined || update === null) return current\n return isRecord(current) && isRecord(update)\n ? { ...current, ...update }\n : update\n}\n\nexport type UIMessageCursor = {\n text: Record<string, number>\n reasoning: Record<string, number>\n tools: Record<string, PartialToolCall>\n}\n\nexport function projectUIMessage<M extends UIMessage>(options: {\n messageId: string\n base?: M\n chunks: readonly ProjectionChunk[]\n}): M {\n return projectUIMessageStream(options).message\n}\n\nexport function projectUIMessageStream<M extends UIMessage>(options: {\n messageId: string\n base?: M\n cursor?: UIMessageCursor\n chunks: readonly ProjectionChunk[]\n}): { message: M; cursor: UIMessageCursor } {\n const message = cloneMessage(options.messageId, options.base)\n const record = message as unknown as Record<string, unknown>\n const parts = message.parts as unknown as MutablePart[]\n const activeText = new Map(\n Object.entries(options.cursor?.text ?? {}).map(([id, index]) => [\n id,\n parts[index]!,\n ]),\n )\n const activeReasoning = new Map(\n Object.entries(options.cursor?.reasoning ?? {}).map(([id, index]) => [\n id,\n parts[index]!,\n ]),\n )\n const partialTools = new Map(\n Object.entries(options.cursor?.tools ?? {}).map(([id, partial]) => [\n id,\n { ...partial },\n ]),\n )\n\n for (const chunk of options.chunks) {\n switch (chunk.type) {\n case 'text-start': {\n const part: MutablePart = {\n type: 'text',\n text: '',\n state: 'streaming',\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n }\n activeText.set(chunk.id, part)\n parts.push(part)\n break\n }\n case 'text-delta': {\n let part = activeText.get(chunk.id)\n if (!part) {\n part = { type: 'text', text: '', state: 'streaming' }\n activeText.set(chunk.id, part)\n parts.push(part)\n }\n part = editPart({ parts, part })\n activeText.set(chunk.id, part)\n part['text'] =\n `${typeof part['text'] === 'string' ? part['text'] : ''}${chunk.delta}`\n setOptional(part, 'providerMetadata', chunk.providerMetadata)\n break\n }\n case 'text-end': {\n const current = activeText.get(chunk.id)\n if (current) {\n const part = editPart({ parts, part: current })\n part['state'] = 'done'\n setOptional(part, 'providerMetadata', chunk.providerMetadata)\n activeText.delete(chunk.id)\n }\n break\n }\n case 'reasoning-start': {\n const part: MutablePart = {\n type: 'reasoning',\n text: '',\n state: 'streaming',\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n }\n activeReasoning.set(chunk.id, part)\n parts.push(part)\n break\n }\n case 'reasoning-delta': {\n let part = activeReasoning.get(chunk.id)\n if (!part) {\n part = { type: 'reasoning', text: '', state: 'streaming' }\n activeReasoning.set(chunk.id, part)\n parts.push(part)\n }\n part = editPart({ parts, part })\n activeReasoning.set(chunk.id, part)\n part['text'] =\n `${typeof part['text'] === 'string' ? part['text'] : ''}${chunk.delta}`\n setOptional(part, 'providerMetadata', chunk.providerMetadata)\n break\n }\n case 'reasoning-end': {\n const current = activeReasoning.get(chunk.id)\n if (current) {\n const part = editPart({ parts, part: current })\n part['state'] = 'done'\n setOptional(part, 'providerMetadata', chunk.providerMetadata)\n activeReasoning.delete(chunk.id)\n }\n break\n }\n case 'custom':\n parts.push({\n type: 'custom',\n kind: chunk.kind,\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n })\n break\n case 'file':\n case 'reasoning-file':\n parts.push({\n type: chunk.type,\n mediaType: chunk.mediaType,\n url: chunk.url,\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n })\n break\n case 'source-url':\n parts.push({\n type: chunk.type,\n sourceId: chunk.sourceId,\n url: chunk.url,\n ...(chunk.title === undefined ? {} : { title: chunk.title }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n })\n break\n case 'source-document':\n parts.push({\n type: chunk.type,\n sourceId: chunk.sourceId,\n mediaType: chunk.mediaType,\n title: chunk.title,\n ...(chunk.filename === undefined ? {} : { filename: chunk.filename }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n })\n break\n case 'tool-input-start': {\n partialTools.set(chunk.toolCallId, {\n text: '',\n toolName: chunk.toolName,\n dynamic: chunk.dynamic === true,\n ...(chunk.providerExecuted === undefined\n ? {}\n : { providerExecuted: chunk.providerExecuted }),\n ...(chunk.providerMetadata === undefined\n ? {}\n : { providerMetadata: chunk.providerMetadata }),\n ...(chunk.toolMetadata === undefined\n ? {}\n : { toolMetadata: chunk.toolMetadata }),\n ...(chunk.title === undefined ? {} : { title: chunk.title }),\n })\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n dynamic: chunk.dynamic === true,\n state: 'input-streaming',\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata,\n title: chunk.title,\n })\n break\n }\n case 'tool-input-delta': {\n const partial = partialTools.get(chunk.toolCallId)\n if (!partial) break\n partial.text += chunk.inputTextDelta\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName: partial.toolName,\n dynamic: partial.dynamic,\n state: 'input-streaming',\n input: parsePartialJSON(partial.text),\n providerExecuted: partial.providerExecuted,\n providerMetadata: partial.providerMetadata,\n toolMetadata: partial.toolMetadata,\n title: partial.title,\n })\n break\n }\n case 'a2-tool-called': {\n const call = chunk.call\n const current = findToolPart(parts, call.toolCallId)\n if (current) {\n const existing = editPart({ parts, part: current })\n existing['input'] = call.input\n if (existing['state'] === 'input-streaming')\n existing['state'] = 'input-available'\n if (existing['callProviderMetadata'] === undefined)\n setOptional(existing, 'callProviderMetadata', call.providerMetadata)\n if (existing['toolMetadata'] === undefined)\n setOptional(existing, 'toolMetadata', call.toolMetadata)\n setOptional(existing, 'providerExecuted', call.providerExecuted)\n setOptional(existing, 'title', call.title)\n } else {\n setToolPart({\n parts,\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n dynamic: call.dynamic === true,\n state: 'input-available',\n input: call.input,\n providerExecuted: call.providerExecuted,\n providerMetadata: call.providerMetadata,\n toolMetadata: call.toolMetadata,\n title: call.title,\n })\n }\n partialTools.delete(call.toolCallId)\n break\n }\n case 'tool-input-available':\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n dynamic: chunk.dynamic === true,\n state: 'input-available',\n input: chunk.input,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata,\n title: chunk.title,\n })\n partialTools.delete(chunk.toolCallId)\n break\n case 'tool-input-error': {\n const existing = findToolPart(parts, chunk.toolCallId)\n const dynamic = existing?.['type'] === 'dynamic-tool' || chunk.dynamic\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n dynamic: dynamic === true,\n state: 'output-error',\n input: dynamic ? chunk.input : undefined,\n rawInput: dynamic ? undefined : chunk.input,\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata,\n title: chunk.title,\n })\n partialTools.delete(chunk.toolCallId)\n break\n }\n case 'tool-approval-request': {\n const current = findToolPart(parts, chunk.toolCallId)\n if (!current) break\n const part = editPart({ parts, part: current })\n part['state'] = 'approval-requested'\n part['approval'] = {\n id: chunk.approvalId,\n ...(chunk.isAutomatic === true ? { isAutomatic: true } : {}),\n ...(chunk.signature === undefined\n ? {}\n : { signature: chunk.signature }),\n }\n break\n }\n case 'tool-approval-response': {\n const current = findApprovalPart(parts, chunk.approvalId)\n if (!current) break\n const part = editPart({ parts, part: current })\n const approval = isRecord(part['approval']) ? part['approval'] : {}\n part['state'] = 'approval-responded'\n part['approval'] = {\n id: chunk.approvalId,\n approved: chunk.approved,\n ...(chunk.reason === undefined ? {} : { reason: chunk.reason }),\n ...(approval['isAutomatic'] === true ? { isAutomatic: true } : {}),\n ...(typeof approval['signature'] === 'string'\n ? { signature: approval['signature'] }\n : {}),\n }\n setOptional(part, 'providerExecuted', chunk.providerExecuted)\n setOptional(part, 'callProviderMetadata', chunk.providerMetadata)\n break\n }\n case 'tool-output-available': {\n const part = findToolPart(parts, chunk.toolCallId)\n if (!part) break\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName:\n part['type'] === 'dynamic-tool' &&\n typeof part['toolName'] === 'string'\n ? part['toolName']\n : String(part['type']).slice('tool-'.length),\n dynamic: part['type'] === 'dynamic-tool',\n state: 'output-available',\n input: part['input'],\n output: chunk.output,\n preliminary: chunk.preliminary,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata ?? part['toolMetadata'],\n title: typeof part['title'] === 'string' ? part['title'] : undefined,\n })\n break\n }\n case 'tool-output-error': {\n const part = findToolPart(parts, chunk.toolCallId)\n if (!part) break\n setToolPart({\n parts,\n toolCallId: chunk.toolCallId,\n toolName:\n part['type'] === 'dynamic-tool' &&\n typeof part['toolName'] === 'string'\n ? part['toolName']\n : String(part['type']).slice('tool-'.length),\n dynamic: part['type'] === 'dynamic-tool',\n state: 'output-error',\n input: part['input'],\n rawInput: part['rawInput'],\n errorText: chunk.errorText,\n providerExecuted: chunk.providerExecuted,\n providerMetadata: chunk.providerMetadata,\n toolMetadata: chunk.toolMetadata ?? part['toolMetadata'],\n title: typeof part['title'] === 'string' ? part['title'] : undefined,\n })\n break\n }\n case 'tool-output-denied': {\n const part = findToolPart(parts, chunk.toolCallId)\n if (part) editPart({ parts, part })['state'] = 'output-denied'\n break\n }\n case 'start-step':\n parts.push({ type: 'step-start' })\n break\n case 'finish-step':\n activeText.clear()\n activeReasoning.clear()\n break\n case 'start':\n if (\n chunk.messageMetadata !== undefined &&\n chunk.messageMetadata !== null\n ) {\n record['metadata'] = mergeMetadata(\n record['metadata'],\n chunk.messageMetadata,\n )\n }\n break\n case 'finish':\n if (\n chunk.messageMetadata !== undefined &&\n chunk.messageMetadata !== null\n ) {\n record['metadata'] = mergeMetadata(\n record['metadata'],\n chunk.messageMetadata,\n )\n }\n break\n case 'message-metadata':\n if (\n chunk.messageMetadata !== undefined &&\n chunk.messageMetadata !== null\n ) {\n record['metadata'] = mergeMetadata(\n record['metadata'],\n chunk.messageMetadata,\n )\n }\n break\n case 'abort':\n case 'error':\n break\n default: {\n if (!chunk.type.startsWith('data-') || chunk.transient) break\n const existing =\n chunk.id === undefined\n ? undefined\n : parts.find(\n (part) =>\n part['type'] === chunk.type && part['id'] === chunk.id,\n )\n if (existing) editPart({ parts, part: existing })['data'] = chunk.data\n else\n parts.push({\n type: chunk.type,\n ...(chunk.id === undefined ? {} : { id: chunk.id }),\n data: chunk.data,\n })\n }\n }\n }\n\n const indexes = new Map(parts.map((part, index) => [part, index]))\n return {\n message,\n cursor: {\n text: Object.fromEntries(\n [...activeText].map(([id, part]) => [id, indexes.get(part)!]),\n ),\n reasoning: Object.fromEntries(\n [...activeReasoning].map(([id, part]) => [id, indexes.get(part)!]),\n ),\n tools: Object.fromEntries(partialTools),\n },\n }\n}\n\nexport function pauseUIMessage<M extends UIMessage>(options: {\n message: M\n toolCallIds: ReadonlySet<string>\n}): M {\n const next = structuredClone(options.message)\n next.parts = next.parts.filter(\n (part) =>\n !('toolCallId' in part && !options.toolCallIds.has(part.toolCallId)),\n )\n for (const part of next.parts) {\n if (\n (part.type === 'text' || part.type === 'reasoning') &&\n part.state === 'streaming'\n )\n part.state = 'done'\n }\n return next\n}\n\nexport function interruptUIMessage<M extends UIMessage>(\n message: M,\n toolError = 'Tool execution was interrupted.',\n): M {\n const next = structuredClone(message)\n next.parts = next.parts.filter((value) => {\n const part = value as unknown as MutablePart\n return !isToolPart(part) || part['state'] !== 'input-streaming'\n })\n for (const value of next.parts as unknown as MutablePart[]) {\n if (value['type'] === 'text' || value['type'] === 'reasoning') {\n if (value['state'] === 'streaming') value['state'] = 'done'\n continue\n }\n if (!isToolPart(value)) continue\n const state = value['state']\n if (state === 'approval-responded') {\n const approval = value['approval']\n if (isRecord(approval) && approval['approved'] === false) {\n value['state'] = 'output-denied'\n continue\n }\n }\n if (state === 'output-available' && value['preliminary'] === true) {\n delete value['output']\n delete value['preliminary']\n value['state'] = 'output-error'\n value['errorText'] = toolError\n continue\n }\n if (\n state === 'input-available' ||\n state === 'approval-requested' ||\n state === 'approval-responded'\n ) {\n if (state === 'approval-requested') delete value['approval']\n value['state'] = 'output-error'\n value['errorText'] = toolError\n }\n }\n return next\n}\n","import type { UIMessageChunk } from 'ai'\nimport type { GenerationProgressPayload } from './ai.ts'\n\n/** Progress already in a log may name its generation by ids instead of `startIndex`. */\nexport type StoredProgressPayload =\n | GenerationProgressPayload\n | {\n requestId: string\n generationId: string\n responseMessageId: string\n chunks: UIMessageChunk[]\n }\n\nexport const progressOwnedBy = ({\n payload,\n owner,\n startIndex,\n}: {\n payload: StoredProgressPayload\n owner: { requestId: string; generationId: string; responseMessageId: string }\n startIndex: number\n}): boolean =>\n 'startIndex' in payload\n ? payload.startIndex === startIndex\n : payload.requestId === owner.requestId &&\n payload.generationId === owner.generationId &&\n payload.responseMessageId === owner.responseMessageId\n\nexport type ProgressBatch = { index: number; chunks: UIMessageChunk[] }\ntype BatchBlock = ProgressBatch[] | { left: BatchBlock; right: BatchBlock }\n\nexport type ProgressBatches = {\n length: number\n tail: ProgressBatch[]\n blocks: Array<BatchBlock | null>\n}\n\nconst PAGE_SIZE = 64\n\nexport const appendProgressBatch = ({\n batches,\n batch,\n}: {\n batches: ProgressBatches\n batch: ProgressBatch\n}): ProgressBatches => {\n if (batches.tail.length < PAGE_SIZE)\n return {\n ...batches,\n length: batches.length + 1,\n tail: [...batches.tail, batch],\n }\n\n const blocks = [...batches.blocks]\n let block: BatchBlock = batches.tail\n let level = 0\n for (;;) {\n const left = blocks[level]\n if (left == null) break\n block = { left, right: block }\n blocks[level] = null\n level += 1\n }\n blocks[level] = block\n return { length: batches.length + 1, tail: [batch], blocks }\n}\n\nexport const progressBatches = (\n items: readonly ProgressBatch[] = [],\n): ProgressBatches => {\n let batches: ProgressBatches = { length: 0, tail: [], blocks: [] }\n for (const batch of items) batches = appendProgressBatch({ batches, batch })\n return batches\n}\n\nexport const flattenProgressBatches = (\n batches: ProgressBatches,\n): ProgressBatch[] => {\n const items: ProgressBatch[] = []\n const visit = (block: BatchBlock): void => {\n if (Array.isArray(block)) items.push(...block)\n else {\n visit(block.left)\n visit(block.right)\n }\n }\n // Level n holds 2^n completed pages; higher levels contain older batches.\n for (let level = batches.blocks.length - 1; level >= 0; level -= 1) {\n const block = batches.blocks[level]\n if (block) visit(block)\n }\n items.push(...batches.tail)\n return items\n}\n","import {\n restoreMessageBase,\n updateMessageBase,\n type MessageBase,\n} from './ai-message-base.ts'\nimport type { UIMessage, UIMessageChunk } from 'ai'\nimport type {\n ActiveGenerationProjection,\n AIState,\n CompactionPart,\n CompactionPartData,\n CompactionRequestedPayload,\n ApprovalRequestedPayload,\n ApprovalRespondedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n ToolActivity,\n} from './ai.ts'\nimport {\n type UIMessageCursor,\n type ProjectionChunk,\n projectUIMessageStream,\n interruptUIMessage,\n} from './ai-projector.ts'\nimport {\n flattenProgressBatches,\n appendProgressBatch,\n progressBatches,\n type ProgressBatches,\n} from './ai-progress-batches.ts'\n\nexport type MessageProjection = Omit<ActiveGenerationProjection, 'baseTools'>\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst positionOf = (messages: readonly UIMessage[], id: string): number =>\n messages.findLastIndex((message) => message.id === id)\n\nexport const findMessage = <M extends UIMessage>(\n messages: M[],\n id: string,\n): M | undefined => messages.findLast((message) => message.id === id)\n\nexport const upsertMessage = <M extends UIMessage>(\n messages: M[],\n message: M,\n): M[] => {\n const index = positionOf(messages, message.id)\n if (index === -1) return [...messages, message]\n return messages[index] === message ? messages : messages.with(index, message)\n}\n\nexport const upsertResponse = <M extends UIMessage>(options: {\n messages: M[]\n message: M\n inputId: string\n}): M[] => {\n const { messages, message, inputId } = options\n if (positionOf(messages, message.id) !== -1)\n return upsertMessage(messages, message)\n const inputIndex = positionOf(messages, inputId)\n const position = inputIndex === -1 ? messages.length : inputIndex + 1\n return [...messages.slice(0, position), message, ...messages.slice(position)]\n}\n\nexport const answerApproval = <M extends UIMessage>(\n messages: M[],\n response: ApprovalRespondedPayload,\n): M[] =>\n messages.map((message) => {\n if (message.id !== response.messageId) return message\n let changed = false\n const parts = message.parts.map((part) => {\n const candidate = part as unknown\n if (\n !isRecord(candidate) ||\n candidate['state'] !== 'approval-requested' ||\n !isRecord(candidate['approval']) ||\n candidate['approval']['id'] !== response.approvalId\n ) {\n return part\n }\n changed = true\n return {\n ...part,\n state: 'approval-responded',\n approval: {\n ...candidate['approval'],\n approved: response.approved,\n ...(response.reason === undefined ? {} : { reason: response.reason }),\n },\n } as typeof part\n })\n return changed ? ({ ...message, parts } as M) : message\n })\n\nexport const approvalRequestedChunk = (\n payload: ApprovalRequestedPayload,\n): UIMessageChunk => ({\n type: 'tool-approval-request',\n approvalId: payload.approvalId,\n toolCallId: payload.toolCallId,\n ...(payload.isAutomatic === undefined\n ? {}\n : { isAutomatic: payload.isAutomatic }),\n ...(payload.signature === undefined ? {} : { signature: payload.signature }),\n})\n\nexport const approvalRespondedChunk = (\n payload: ApprovalRespondedPayload,\n): UIMessageChunk => ({\n type: 'tool-approval-response',\n approvalId: payload.approvalId,\n approved: payload.approved,\n ...(payload.reason === undefined ? {} : { reason: payload.reason }),\n})\n\nexport const toolCalledChunk = (\n payload: ToolCalledPayload,\n): ProjectionChunk => ({ type: 'a2-tool-called', call: payload })\n\nexport const toolResultChunk = (payload: ToolResultPayload): UIMessageChunk => {\n if (payload.phase === 'input') {\n return {\n type: 'tool-input-error',\n toolCallId: payload.toolCallId,\n toolName: payload.toolName ?? 'unknown',\n input: payload.rawInput ?? payload.input,\n errorText: payload.error ?? 'Invalid tool input',\n ...(payload.dynamic === undefined ? {} : { dynamic: payload.dynamic }),\n ...(payload.providerExecuted === undefined\n ? {}\n : { providerExecuted: payload.providerExecuted }),\n ...(payload.providerMetadata === undefined\n ? {}\n : { providerMetadata: payload.providerMetadata }),\n ...(payload.toolMetadata === undefined\n ? {}\n : { toolMetadata: payload.toolMetadata }),\n } as UIMessageChunk\n }\n if (payload.denied === true) {\n return {\n type: 'tool-output-denied',\n toolCallId: payload.toolCallId,\n } as UIMessageChunk\n }\n if (payload.error !== undefined) {\n return {\n type: 'tool-output-error',\n toolCallId: payload.toolCallId,\n errorText: payload.error,\n ...(payload.dynamic === undefined ? {} : { dynamic: payload.dynamic }),\n ...(payload.providerExecuted === undefined\n ? {}\n : { providerExecuted: payload.providerExecuted }),\n ...(payload.providerMetadata === undefined\n ? {}\n : { providerMetadata: payload.providerMetadata }),\n ...(payload.toolMetadata === undefined\n ? {}\n : { toolMetadata: payload.toolMetadata }),\n } as UIMessageChunk\n }\n return {\n type: 'tool-output-available',\n toolCallId: payload.toolCallId,\n output: payload.output,\n ...(payload.preliminary === undefined\n ? {}\n : { preliminary: payload.preliminary }),\n ...(payload.dynamic === undefined ? {} : { dynamic: payload.dynamic }),\n ...(payload.providerExecuted === undefined\n ? {}\n : { providerExecuted: payload.providerExecuted }),\n ...(payload.providerMetadata === undefined\n ? {}\n : { providerMetadata: payload.providerMetadata }),\n ...(payload.toolMetadata === undefined\n ? {}\n : { toolMetadata: payload.toolMetadata }),\n } as UIMessageChunk\n}\n\nexport const projectedMessageStream = <M extends UIMessage>({\n projection,\n current,\n}: {\n projection: MessageProjection\n current: M | undefined\n}): { message: M; cursor: UIMessageCursor; throughIndex: number } => {\n const base = restoreMessageBase({ current, base: projection.base })\n const projectionEvents: Array<{\n index: number\n chunks: readonly ProjectionChunk[]\n }> = flattenProgressBatches(projection.batches)\n for (const event of projection.toolEvents) {\n projectionEvents.push({\n index: event.index,\n chunks: [\n event.type === 'ai.tool.called'\n ? toolCalledChunk(event.payload)\n : toolResultChunk(event.payload),\n ],\n })\n }\n for (const event of projection.approvalEvents) {\n projectionEvents.push({\n index: event.index,\n chunks: [\n event.type === 'ai.approval.requested'\n ? approvalRequestedChunk(event.payload)\n : approvalRespondedChunk(event.payload),\n ],\n })\n }\n const ordered = projectionEvents.toSorted(\n (left, right) => left.index - right.index,\n )\n return {\n ...projectUIMessageStream<M>({\n messageId: projection.responseMessageId,\n ...(base === undefined ? {} : { base }),\n chunks: ordered.flatMap((event) => event.chunks),\n }),\n throughIndex: ordered.at(-1)?.index ?? 0,\n }\n}\n\nexport const projectedMessage = <M extends UIMessage>(options: {\n projection: MessageProjection\n current: M | undefined\n}): M => projectedMessageStream(options).message\n\nexport const reduceToolActivity = (\n tools: ToolActivity[],\n event:\n | { type: 'ai.tool.called'; payload: ToolCalledPayload }\n | { type: 'ai.tool.result'; payload: ToolResultPayload },\n): ToolActivity[] => {\n if (event.type === 'ai.tool.called') {\n const payload = event.payload\n const activity: ToolActivity = {\n requestId: payload.requestId,\n messageId: payload.messageId,\n generationId: payload.generationId,\n toolCallId: payload.toolCallId,\n toolName: payload.toolName,\n ...(payload.dynamic === undefined ? {} : { dynamic: payload.dynamic }),\n ...(payload.providerExecuted === undefined\n ? {}\n : { providerExecuted: payload.providerExecuted }),\n ...(payload.title === undefined ? {} : { title: payload.title }),\n status: 'running',\n }\n return [\n ...tools.filter(\n (candidate) =>\n candidate.generationId !== payload.generationId ||\n candidate.toolCallId !== payload.toolCallId,\n ),\n activity,\n ]\n }\n\n const payload = event.payload\n const existing = tools.find(\n (candidate) =>\n candidate.generationId === payload.generationId &&\n candidate.toolCallId === payload.toolCallId,\n )\n const toolName = payload.toolName ?? existing?.toolName\n const dynamic = payload.dynamic ?? existing?.dynamic\n const providerExecuted =\n payload.providerExecuted ?? existing?.providerExecuted\n const activity: ToolActivity = {\n requestId: payload.requestId,\n messageId: payload.messageId,\n generationId: payload.generationId,\n toolCallId: payload.toolCallId,\n ...(toolName === undefined ? {} : { toolName }),\n ...(payload.error === undefined ? {} : { error: payload.error }),\n ...(payload.preliminary === undefined\n ? {}\n : { preliminary: payload.preliminary }),\n ...(payload.phase === undefined ? {} : { phase: payload.phase }),\n ...(dynamic === undefined ? {} : { dynamic }),\n ...(providerExecuted === undefined ? {} : { providerExecuted }),\n ...(existing?.title === undefined ? {} : { title: existing.title }),\n status: payload.denied\n ? 'denied'\n : payload.error\n ? 'failed'\n : payload.preliminary\n ? 'running'\n : 'completed',\n }\n return [\n ...tools.filter(\n (candidate) =>\n candidate.generationId !== payload.generationId ||\n candidate.toolCallId !== payload.toolCallId,\n ),\n activity,\n ]\n}\n\nexport const advanceProjection = <M extends UIMessage>({\n projection,\n base,\n chunks,\n index,\n}: {\n projection: MessageProjection\n base: M | undefined\n chunks: UIMessageChunk[]\n index: number\n}): {\n message: M\n batches: ProgressBatches\n cursor: NonNullable<MessageProjection['cursor']>\n} => {\n const ordered = index > (projection.batches.tail.at(-1)?.index ?? -1)\n const batches = ordered\n ? appendProgressBatch({\n batches: projection.batches,\n batch: { index, chunks },\n })\n : progressBatches(\n [\n ...flattenProgressBatches(projection.batches).filter(\n (batch) => batch.index !== index,\n ),\n { index, chunks },\n ].toSorted((left, right) => left.index - right.index),\n )\n const incremental =\n base !== undefined &&\n projection.cursor != null &&\n index > projection.cursor.throughIndex\n const projected = incremental\n ? projectUIMessageStream({\n messageId: projection.responseMessageId,\n base,\n cursor: projection.cursor!.stream,\n chunks,\n })\n : projectedMessageStream({\n projection: { ...projection, batches },\n current: base,\n })\n return {\n message: projected.message,\n batches,\n cursor: {\n throughIndex: incremental\n ? index\n : Math.max(\n index,\n batches.tail.at(-1)?.index ?? 0,\n projection.toolEvents.reduce(\n (latest, event) => Math.max(latest, event.index),\n 0,\n ),\n projection.approvalEvents.reduce(\n (latest, event) => Math.max(latest, event.index),\n 0,\n ),\n ),\n stream: projected.cursor,\n },\n }\n}\n\nexport const projectedTools = (\n projection: ActiveGenerationProjection,\n): ToolActivity[] =>\n projection.toolEvents.reduce(\n (tools, event) => reduceToolActivity(tools, event),\n projection.baseTools,\n )\n\nexport const restoreGenerationBase = <M extends UIMessage>(\n state: AIState<M>,\n generationId: string,\n responseMessageId: string,\n reason: 'interrupted' | 'superseded' | 'failed',\n): AIState<M> => {\n const projection =\n state.activeProjection?.generationId === generationId\n ? state.activeProjection\n : null\n const restored = restoreMessageBase({\n current: findMessage(state.messages, responseMessageId),\n base: projection?.base,\n })\n // A superseded attempt's unfinished compaction reruns in its replacement;\n // a completed one stays in effect, and so does its part.\n const base =\n restored !== undefined && reason === 'superseded'\n ? withoutRunningCompactionPart(restored, generationId)\n : restored\n return {\n ...state,\n messages:\n base === undefined\n ? state.messages.filter((message) => message.id !== responseMessageId)\n : upsertMessage(state.messages, base),\n tools:\n projection === null\n ? state.tools.filter(\n (activity) => activity.generationId !== generationId,\n )\n : projection.baseTools,\n pendingApprovals: state.pendingApprovals.filter(\n (approval) => approval.generationId !== generationId,\n ),\n pendingInputs: state.pendingInputs.filter(\n (input) => input.generationId !== generationId,\n ),\n activeGeneration: null,\n activeProjection: null,\n terminalGenerations: {\n ...state.terminalGenerations,\n [generationId]: reason,\n },\n compaction:\n projection === null\n ? state.compaction?.generationId === generationId\n ? null\n : state.compaction\n : (projection.baseCompaction ?? null),\n }\n}\n\nexport const stopGenerationTools = (\n tools: ToolActivity[],\n generationId: string | undefined,\n responseMessageId: string,\n error: string,\n): ToolActivity[] =>\n tools.map((activity) =>\n activity.status === 'running' &&\n (generationId === undefined\n ? activity.messageId === responseMessageId\n : activity.generationId === generationId)\n ? { ...activity, status: 'failed', error, preliminary: false }\n : activity,\n )\n\nexport const interruptGenerationProjection = <M extends UIMessage>(\n state: AIState<M>,\n generationId: string,\n responseMessageId: string,\n cutoff: number,\n): AIState<M> | null => {\n const projection =\n state.activeProjection?.generationId === generationId\n ? state.activeProjection\n : null\n if (projection === null) return null\n const retained: ActiveGenerationProjection = {\n ...projection,\n batches: progressBatches(\n flattenProgressBatches(projection.batches).filter(\n (batch) => batch.index <= cutoff,\n ),\n ),\n toolEvents: projection.toolEvents.filter(\n (toolEvent) => toolEvent.index <= cutoff,\n ),\n approvalEvents: projection.approvalEvents.filter(\n (approvalEvent) => approvalEvent.index <= cutoff,\n ),\n }\n const shouldProject =\n retained.base !== undefined || retained.batches.length > 0\n const restored = restoreGenerationBase(\n state,\n generationId,\n responseMessageId,\n 'interrupted',\n )\n return {\n ...restored,\n messages: shouldProject\n ? upsertMessage(\n state.messages,\n interruptUIMessage(\n projectedMessage({\n projection: retained,\n current: findMessage(state.messages, responseMessageId),\n }),\n ),\n )\n : restored.messages,\n tools: stopGenerationTools(\n projectedTools(retained),\n generationId,\n responseMessageId,\n 'Tool execution was interrupted.',\n ),\n usage:\n projection.completionIndex === undefined ||\n projection.completionIndex <= cutoff\n ? restored.usage\n : restored.usage.filter((entry) => entry.generationId !== generationId),\n }\n}\n\nexport const retainMessageBase = <\n S extends {\n messages: UIMessage[]\n activeProjection: { responseMessageId: string; base?: MessageBase } | null\n },\n>(options: {\n before: S\n after: S\n}): S => {\n const { before, after } = options\n const projection = after.activeProjection\n if (\n before.messages === after.messages ||\n !projection?.base ||\n projection.base !== before.activeProjection?.base\n )\n return after\n const previous = findMessage(before.messages, projection.responseMessageId)\n const current = findMessage(after.messages, projection.responseMessageId)\n if (previous !== undefined && previous === current) return after\n // A response removed or rewritten outside this tracking (for example, by an\n // extension's own transition) cannot be restored, so a later re-created\n // message must not inherit the stale recovery.\n const base =\n previous &&\n current &&\n updateMessageBase({\n base: projection.base,\n before: previous,\n after: current,\n })\n const { base: _stale, ...unrecoverable } = projection\n return {\n ...after,\n activeProjection: base ? { ...unrecoverable, base } : unrecoverable,\n }\n}\n\nexport const isCompactionPart = (part: {\n type: string\n}): part is CompactionPart => part.type === 'data-a2-compaction'\n\nconst compactionPartOf = (message: UIMessage, generationId: string): number =>\n message.parts.findIndex(\n (part) => isCompactionPart(part) && part.id === generationId,\n )\n\nconst withoutRunningCompactionPart = <M extends UIMessage>(\n message: M,\n generationId: string,\n): M => {\n const index = compactionPartOf(message, generationId)\n const part = message.parts[index]\n return part !== undefined &&\n isCompactionPart(part) &&\n part.data.status === 'running'\n ? { ...message, parts: message.parts.toSpliced(index, 1) }\n : message\n}\n\n/**\n * Compaction runs before its model step streams, so the part lands between\n * the response's earlier steps and this one. Counting it in the step's base\n * keeps it through Stop cutoffs, failures, and retries of that step.\n */\nexport const addCompactionPart = <M extends UIMessage>(\n state: AIState<M>,\n payload: CompactionRequestedPayload,\n): AIState<M> => {\n const projection = state.activeProjection\n if (projection?.generationId !== payload.generationId) return state\n const current = findMessage(state.messages, projection.responseMessageId)\n if (\n current === undefined\n ? projection.base !== undefined\n : projection.base?.partCount !== current.parts.length\n )\n return state\n const inputTokens = payload.inputTokens ?? payload.inputTokenEstimate\n const part: CompactionPart = {\n type: 'data-a2-compaction',\n id: payload.generationId,\n data: {\n status: 'running',\n ...(inputTokens === undefined ? {} : { inputTokens }),\n ...(payload.thresholdTokens === undefined\n ? {}\n : { thresholdTokens: payload.thresholdTokens }),\n },\n }\n const message = (\n current === undefined\n ? { id: projection.responseMessageId, role: 'assistant', parts: [part] }\n : { ...current, parts: [...current.parts, part] }\n ) as M\n return {\n ...state,\n messages: upsertResponse({\n messages: state.messages,\n message,\n inputId: state.activeGeneration?.messageId ?? message.id,\n }),\n activeProjection: {\n ...projection,\n cursor: null,\n base:\n projection.base === undefined\n ? { partCount: 1 }\n : { ...projection.base, partCount: projection.base.partCount + 1 },\n },\n }\n}\n\nexport const settleCompactionPart = <M extends UIMessage>(options: {\n state: AIState<M>\n generationId: string\n data: Partial<CompactionPartData>\n}): AIState<M> => {\n const { state, generationId, data } = options\n const position = state.messages.findLastIndex(\n (message) => compactionPartOf(message, generationId) !== -1,\n )\n if (position === -1) return state\n const message = state.messages[position]!\n const index = compactionPartOf(message, generationId)\n const part = message.parts[index] as unknown as CompactionPart\n return {\n ...state,\n messages: state.messages.with(position, {\n ...message,\n parts: message.parts.with(index, {\n ...part,\n data: { ...part.data, ...data },\n } as unknown as M['parts'][number]),\n }),\n }\n}\n\n/** A running compaction whose state reverted without completing was abandoned. */\nexport const settleAbandonedCompaction = <M extends UIMessage>(\n before: AIState<M>,\n after: AIState<M>,\n): AIState<M> => {\n const running = before.compaction\n if (\n running?.status !== 'running' ||\n after.compaction === running ||\n (after.compaction?.status === 'completed' &&\n after.compaction.generationId === running.generationId)\n )\n return after\n const interrupted =\n after.status === 'closed' ||\n after.pausedGenerationIds?.[running.generationId] === true ||\n after.terminalGenerations?.[running.generationId] === 'interrupted'\n return settleCompactionPart({\n state: after,\n generationId: running.generationId,\n data: { status: interrupted ? 'interrupted' : 'failed' },\n })\n}\n","import type { UIMessage } from 'ai'\nimport type { AIState } from './ai.ts'\nimport type { ControlCommand, InboxItem } from './ai-control.ts'\nimport {\n interruptGenerationProjection,\n settleAbandonedCompaction,\n} from './ai-message-projection.ts'\n\nexport type QueueCommand<M extends UIMessage> = Extract<\n ControlCommand<M>,\n {\n action:\n | 'send'\n | 'edit'\n | 'move'\n | 'remove'\n | 'send-now'\n | 'steer'\n | 'pause'\n | 'resume'\n | 'stop'\n }\n>\nexport type PendingQueueCommand<M extends UIMessage> = {\n commandId: string\n command: QueueCommand<M>\n}\n\nexport const isQueueCommand = <M extends UIMessage>(\n command: ControlCommand<M>,\n): command is QueueCommand<M> =>\n command.action === 'send' ||\n command.action === 'edit' ||\n command.action === 'move' ||\n command.action === 'remove' ||\n command.action === 'send-now' ||\n command.action === 'steer' ||\n command.action === 'pause' ||\n command.action === 'resume' ||\n command.action === 'stop'\n\nconst moveItem = <M extends UIMessage>({\n items,\n inputId,\n beforeId,\n}: {\n items: InboxItem<M>[]\n inputId: string\n beforeId: string | null\n}): InboxItem<M>[] => {\n const from = items.findIndex((item) => item.id === inputId)\n if (\n from < 0 ||\n inputId === beforeId ||\n (beforeId !== null && !items.some((item) => item.id === beforeId))\n )\n return items\n const next = [...items]\n const [item] = next.splice(from, 1)\n const to =\n beforeId === null\n ? next.length\n : next.findIndex((entry) => entry.id === beforeId)\n next.splice(to, 0, item!)\n return next\n}\n\nexport function projectAIClientState<M extends UIMessage>(\n state: AIState<M>,\n): AIState<M> {\n const pending = state.pendingQueueCommands ?? []\n if (state.status === 'closed') return state\n if (\n pending.length === 0 &&\n !state.inbox.items.some((item) => item.afterStepOf !== undefined)\n )\n return state\n let messages = state.messages\n let { items, paused } = state.inbox\n let turnId = state.active?.turnId ?? null\n let starting = false\n let suspended =\n state.active?.phase === 'paused' || state.active?.phase === 'pausing'\n let messageIds: Set<string> | undefined\n const show = (message: M): void => {\n messageIds ??= new Set(messages.map((item) => item.id))\n if (messageIds.has(message.id)) return\n if (messages === state.messages) messages = state.messages.slice()\n messages.push(message)\n messageIds.add(message.id)\n }\n const admit = (): void => {\n if (turnId !== null || paused || items.length === 0) return\n let count = 0\n for (const item of items) {\n count += 1\n show(item.message)\n if (item.generate) {\n turnId = item.id\n starting = true\n suspended = false\n break\n }\n }\n if (count > 0) items = items.slice(count)\n }\n for (const { command } of pending) {\n switch (command.action) {\n case 'send':\n case 'steer': {\n if (\n items.some((item) => item.id === command.message.id) ||\n turnId === command.message.id\n )\n break\n const item = {\n ...(command.action === 'steer'\n ? { afterStepOf: command.turnId }\n : {}),\n id: command.message.id,\n message: command.message,\n generate:\n command.message.role === 'user' &&\n (command.action === 'steer' || command.generate !== false),\n }\n items = command.action === 'steer' ? [item, ...items] : [...items, item]\n break\n }\n case 'edit':\n items = items.map((item) =>\n item.id === command.message.id &&\n item.message.role === command.message.role\n ? { ...item, message: command.message }\n : item,\n )\n break\n case 'move':\n items = moveItem({\n items,\n inputId: command.inputId,\n beforeId: command.beforeId,\n })\n break\n case 'remove':\n items = items.filter((item) => item.id !== command.inputId)\n break\n case 'send-now': {\n if (turnId !== command.turnId) break\n const selected = items.find((item) => item.id === command.inputId)\n if (!selected || selected.message.role !== 'user') break\n items = items.map((item) =>\n item.id === selected.id\n ? {\n ...item,\n generate: true,\n ...(turnId === null ? {} : { afterStepOf: turnId }),\n }\n : item,\n )\n items = moveItem({\n items,\n inputId: command.inputId,\n beforeId: items[0]?.id ?? null,\n })\n break\n }\n case 'pause':\n paused = true\n if (command.when === 'now') suspended = true\n break\n case 'resume':\n paused = false\n suspended = false\n break\n case 'stop':\n continue\n }\n admit()\n }\n items = items.filter((item) => {\n if (item.afterStepOf === undefined) return true\n show(item.message)\n return false\n })\n const displayed = {\n ...state,\n messages,\n inbox: { items, paused },\n starting: starting && !suspended,\n }\n const stop = pending.find(\n ({ command }) =>\n command.action === 'stop' && command.turnId === state.active?.turnId,\n )?.command\n if (stop?.action !== 'stop') return displayed\n const projection = state.activeProjection\n const stopped =\n projection === null\n ? displayed\n : (interruptGenerationProjection(\n displayed,\n projection.generationId,\n projection.responseMessageId,\n stop.lastSeenIndex ?? Number.POSITIVE_INFINITY,\n ) ?? displayed)\n return settleAbandonedCompaction(displayed, {\n ...stopped,\n active: null,\n status: paused ? 'paused' : 'idle',\n starting: false,\n activeGeneration: null,\n activeRequestId: null,\n activeRequestReason: null,\n activeRequestSourceGenerationId: null,\n activeResponseMessageId: null,\n pendingApprovals: [],\n pendingInputs: [],\n error: null,\n })\n}\n","import type {\n AIControlState,\n ControlCommit,\n ControlChange,\n} from './ai-control.ts'\nimport type { UIMessage } from 'ai'\n\ntype RecordValue = Record<string, unknown> | unknown[]\nconst container = (value: unknown): value is RecordValue =>\n typeof value === 'object' && value !== null\nconst same = (left: unknown, right: unknown): boolean =>\n JSON.stringify(left) === JSON.stringify(right)\n\nexport const controlChanges = ({\n before,\n after,\n}: {\n before: unknown\n after: unknown\n}): ControlChange[] => {\n const changes: ControlChange[] = []\n const visit = (\n left: unknown,\n right: unknown,\n path: (string | number)[],\n ): void => {\n if (same(left, right)) return\n if (Array.isArray(left) && Array.isArray(right)) {\n let prefix = 0\n while (\n prefix < Math.min(left.length, right.length) &&\n same(left[prefix], right[prefix])\n )\n prefix += 1\n let suffix = 0\n while (\n suffix < Math.min(left.length, right.length) - prefix &&\n same(left[left.length - 1 - suffix], right[right.length - 1 - suffix])\n )\n suffix += 1\n if (left.length === right.length) {\n for (let index = prefix; index < left.length - suffix; index += 1)\n visit(left[index], right[index], [...path, index])\n } else\n changes.push({\n path,\n splice: {\n index: prefix,\n deleteCount: left.length - prefix - suffix,\n items: right.slice(prefix, right.length - suffix),\n },\n })\n return\n }\n if (\n container(left) &&\n container(right) &&\n !Array.isArray(left) &&\n !Array.isArray(right)\n ) {\n if (Object.keys(right).length === 0) {\n changes.push({ path, value: right })\n return\n }\n for (const key of Object.keys(left))\n if (!Object.hasOwn(right, key))\n changes.push({ path: [...path, key], remove: true })\n for (const key of Object.keys(right))\n visit(Object.hasOwn(left, key) ? left[key] : undefined, right[key], [\n ...path,\n key,\n ])\n return\n }\n changes.push({ path, value: right })\n }\n visit(before, after, [])\n return changes\n}\n\nexport const applyControlChanges = <T>({\n state,\n changes,\n}: {\n state: T\n changes: readonly ControlChange[]\n}): T => {\n if (changes.length === 0) return state\n let next = structuredClone(state)\n for (const change of changes) {\n const path = change.path\n if (path.length === 0) {\n next = structuredClone(change.value) as T\n continue\n }\n let target: unknown = next\n for (const key of path.slice(0, -1)) {\n if (!container(target) || !Object.hasOwn(target, key))\n throw new TypeError('Invalid AI control change path')\n target = (target as Record<string | number, unknown>)[key]\n }\n if (!container(target))\n throw new TypeError('Invalid AI control change target')\n const parent = target as Record<string | number, unknown>\n const key = path.at(-1)!\n if (change.remove) delete parent[key]\n else if (change.splice) {\n const items = parent[key] as unknown[]\n Object.defineProperty(parent, key, {\n value: [\n ...items.slice(0, change.splice.index),\n ...structuredClone(change.splice.items),\n ...items.slice(change.splice.index + change.splice.deleteCount),\n ],\n enumerable: true,\n configurable: true,\n writable: true,\n })\n } else if (change.move) {\n const items = parent[key] as unknown[]\n const [item] = items.splice(change.move.from, 1)\n items.splice(change.move.to, 0, item)\n } else\n Object.defineProperty(parent, key, {\n value: structuredClone(change.value),\n enumerable: true,\n configurable: true,\n writable: true,\n })\n }\n return next\n}\n\nexport const controlCommit = <M extends UIMessage>(options: {\n before: AIControlState<M>\n after: AIControlState<M>\n moves: ControlChange[]\n}): ControlCommit => {\n const active = options.after.active\n const response = options.after.coordinator.response\n return {\n changes: [\n ...options.moves,\n ...controlChanges({ before: options.before, after: options.after }),\n ],\n view: {\n turnId: active?.turnId ?? null,\n version: active?.version ?? null,\n phase: active?.phase ?? null,\n paused: options.after.inbox.paused,\n closed: options.after.coordinator.closed,\n requestId: response?.activeRequestId ?? null,\n requestReason: response?.requestReason ?? null,\n sourceGenerationId: response?.sourceGenerationId ?? null,\n responseMessageId: response?.responseMessageId ?? null,\n },\n }\n}\n","import type { UIMessage } from 'ai'\nimport type { AICoordinatorState } from './ai-coordinator.ts'\nimport type {\n ApprovalRespondedPayload,\n GenerationStartedPayload,\n GenerationReason,\n InputRequestedPayload,\n InputRespondedPayload,\n MessageInterruptedPayload,\n RetryRequestedPayload,\n ToolCalledPayload,\n ToolResultPayload,\n} from './ai.ts'\n\nexport type InboxItem<M extends UIMessage = UIMessage> = {\n id: string\n message: M\n generate: boolean\n afterStepOf?: string\n}\n\nexport type ControlCommand<M extends UIMessage = UIMessage> =\n | { action: 'send'; message: M; generate?: boolean }\n | { action: 'edit'; message: M }\n | { action: 'move'; inputId: string; beforeId: string | null }\n | { action: 'remove'; inputId: string }\n | {\n action: 'send-now'\n inputId: string\n turnId: string | null\n lastSeenIndex?: number\n }\n | { action: 'stop'; turnId: string; lastSeenIndex?: number }\n | { action: 'steer'; turnId: string; message: M; lastSeenIndex?: number }\n | { action: 'pause'; when: 'now' | 'after-turn' }\n | { action: 'resume' }\n | { action: 'tool-result'; result: ToolResultPayload }\n | { action: 'approval'; response: ApprovalRespondedPayload }\n | { action: 'input'; response: InputRespondedPayload }\n | { action: 'request-input'; request: InputRequestedPayload }\n | { action: 'retry'; request: RetryRequestedPayload }\n | { action: 'interrupt'; request: MessageInterruptedPayload }\n\nexport type ControlReceipt = {\n commandId: string\n work?: true\n outcome: 'applied' | 'rejected'\n reason?:\n | 'not-pending'\n | 'role-mismatch'\n | 'stale-turn'\n | 'not-found'\n | 'closed'\n | 'stale-work'\n | 'not-user-input'\n}\n\nexport type ActiveTurn<M extends UIMessage = UIMessage> = {\n turnId: string\n input: InboxItem<M>\n phase:\n | 'starting'\n | 'generating'\n | 'tools'\n | 'waiting'\n | 'failed'\n | 'pausing'\n | 'paused'\n}\n\nexport type ControlWork = {\n id: string\n version: number\n settled: boolean\n attempt?: number\n facts?: string[]\n}\n\nexport type AIControlState<M extends UIMessage = UIMessage> = {\n pendingStops: Record<string, string>\n inbox: { paused: boolean; items: InboxItem<M>[] }\n active:\n | (ActiveTurn<M> & {\n version: number\n suspended: boolean\n model: ControlWork | null\n })\n | null\n coordinator: AICoordinatorState\n}\n\nexport type WorkFact = { type: string; id: string; payload: unknown }\nexport type WorkReport = {\n attempt: number\n workId: string\n turnId: string\n version: number\n kind: 'model' | 'tool'\n settled: boolean\n events: WorkFact[]\n}\n\nexport type ToolExecutionRequest = {\n turnId: string\n version: number\n call: ToolCalledPayload\n generation: GenerationStartedPayload\n}\n\nexport const initialControlState = <\n M extends UIMessage,\n>(): AIControlState<M> => ({\n pendingStops: {},\n inbox: { paused: false, items: [] },\n active: null,\n coordinator: { closed: false, queued: [] },\n})\n\nexport type ControlChange = {\n path: (string | number)[]\n value?: unknown\n remove?: true\n splice?: { index: number; deleteCount: number; items: unknown[] }\n move?: { from: number; to: number }\n}\n\nexport type ControlCommit = {\n changes: ControlChange[]\n view: {\n turnId: string | null\n version: number | null\n phase: ActiveTurn['phase'] | null\n paused: boolean\n closed: boolean\n requestId: string | null\n requestReason: GenerationReason | null\n sourceGenerationId: string | null\n responseMessageId: string | null\n }\n}\n","import { idempotentId } from './idempotent-id.ts'\n\nexport const AI_EVENT_ID_PREFIX = 'a2.ai:'\n\nexport const aiEventId = async (...parts: string[]): Promise<string> =>\n `${AI_EVENT_ID_PREFIX}${await idempotentId(...parts)}`\n","import { assertMessageBase, restoreMessageBase } from './ai-message-base.ts'\nimport { sameValue } from './equal-json.ts'\nimport type { UIMessage } from 'ai'\nimport type { AIState } from './ai.ts'\nimport type { MessageProjection } from './ai-message-projection.ts'\nimport type { EventDefs } from './contract.ts'\nimport type { Reducer } from './reducer.ts'\nimport { withReducerRuntime } from './reducer-runtime.ts'\n\ntype Value =\n null | boolean | number | string | Value[] | { [key: string]: Value }\ntype Payload = { value?: unknown }\ntype Undo =\n | { value: Value }\n | { length: number; items: Record<string, Undo> }\n | { fields: Record<string, Undo>; remove: string[] }\n\ntype Projection = {\n fields: Value\n tools?: Undo\n}\n\nexport type AIStoredState = {\n version: 3\n fields: Value\n projection: Projection | null\n values: Payload[]\n}\n\nexport type AIStoredView = {\n messages: UIMessage[]\n activeProjection:\n (MessageProjection & { baseTools?: AIState['tools'] }) | null\n tools?: AIState['tools']\n usage?: AIState['usage']\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst hasKeys = (\n value: unknown,\n { required, optional = [] }: { required: string[]; optional?: string[] },\n): value is Record<string, unknown> =>\n isRecord(value) &&\n required.every((key) => Object.hasOwn(value, key)) &&\n Object.keys(value).every(\n (key) => required.includes(key) || optional.includes(key),\n )\n\nconst reference = (value: Value): number | undefined => {\n if (!isRecord(value) || !Object.hasOwn(value, '$a2Value')) return undefined\n const id = value['$a2Value']\n if (\n typeof id !== 'number' ||\n !Number.isSafeInteger(id) ||\n id < 0 ||\n Object.keys(value).length !== 1\n )\n throw new TypeError('invalid AI payload reference')\n return id\n}\n\nconst payloadFields = new Set([\n 'input',\n 'output',\n 'rawInput',\n 'metadata',\n 'providerMetadata',\n 'callProviderMetadata',\n 'resultProviderMetadata',\n 'toolMetadata',\n 'data',\n])\n\nconst keyFor = (value: unknown): string =>\n value === undefined ? 'undefined' : JSON.stringify(value)\n\nconst restore = (current: Value, undo: Undo | undefined): Value => {\n if (undo === undefined) return current\n if (!isRecord(undo)) throw new TypeError('invalid AI recovery change')\n if ('value' in undo) {\n if (!hasKeys(undo, { required: ['value'] }))\n throw new TypeError('invalid AI replacement recovery')\n return undo.value\n }\n if ('length' in undo) {\n if (\n !hasKeys(undo, { required: ['length', 'items'] }) ||\n !Number.isSafeInteger(undo.length) ||\n undo.length < 0 ||\n undo.length > 0xffffffff ||\n !isRecord(undo.items) ||\n !Array.isArray(current)\n )\n throw new TypeError('invalid AI array recovery')\n const items = Object.entries(undo.items)\n let added = 0\n for (const [key, patch] of items) {\n const index = Number(key)\n if (\n !Number.isSafeInteger(index) ||\n index < 0 ||\n index >= undo.length ||\n String(index) !== key ||\n patch === undefined\n )\n throw new TypeError('invalid AI array recovery index')\n if (index >= current.length) added += 1\n }\n if (added !== Math.max(0, undo.length - current.length))\n throw new TypeError('incomplete AI array recovery')\n const result = current.slice(0, undo.length)\n result.length = undo.length\n for (const [index, patch] of items)\n result[Number(index)] = restore(current[Number(index)] ?? null, patch)\n return result\n }\n if (\n !hasKeys(undo, { required: ['fields', 'remove'] }) ||\n !isRecord(undo.fields) ||\n !Array.isArray(undo.remove) ||\n Object.keys(undo.remove).length !== undo.remove.length ||\n Array.from(undo.remove).some((key) => typeof key !== 'string') ||\n new Set(undo.remove).size !== undo.remove.length ||\n !isRecord(current) ||\n reference(current) !== undefined\n )\n throw new TypeError('invalid AI object recovery')\n const result = { ...current } as Record<string, Value>\n for (const key of undo.remove) delete result[key]\n for (const [key, patch] of Object.entries(undo.fields)) {\n if (patch === undefined || undo.remove.includes(key))\n throw new TypeError('invalid AI object recovery field')\n Object.defineProperty(result, key, {\n value: restore(Object.hasOwn(result, key) ? result[key]! : null, patch),\n enumerable: true,\n configurable: true,\n writable: true,\n })\n }\n return result\n}\n\nconst difference = (current: Value, before: Value): Undo | undefined => {\n if (current === before) return undefined\n if (reference(current) !== undefined || reference(before) !== undefined)\n return reference(current) === reference(before)\n ? undefined\n : { value: before }\n if (Array.isArray(current) && Array.isArray(before)) {\n const items: Record<string, Undo> = {}\n for (const [index, value] of before.entries()) {\n const patch =\n index < current.length ? difference(current[index]!, value) : { value }\n if (patch !== undefined) items[index] = patch\n }\n return current.length === before.length && Object.keys(items).length === 0\n ? undefined\n : { length: before.length, items }\n }\n if (isRecord(current) && isRecord(before)) {\n const fields: Record<string, Undo> = {}\n const remove = Object.keys(current).filter(\n (key) => !Object.hasOwn(before, key),\n )\n for (const [key, value] of Object.entries(before)) {\n const patch = Object.hasOwn(current, key)\n ? difference(current[key] as Value, value as Value)\n : { value: value as Value }\n if (patch !== undefined)\n Object.defineProperty(fields, key, {\n value: patch,\n enumerable: true,\n configurable: true,\n writable: true,\n })\n }\n return remove.length === 0 && Object.keys(fields).length === 0\n ? undefined\n : { fields, remove }\n }\n return { value: before }\n}\n\nconst storeState = <S extends AIStoredView>(state: S): AIStoredState => {\n const packed = new WeakMap<object, Value>()\n const values: Payload[] = []\n const ids = new Map<unknown, number>()\n const contents = new Map<string, number[]>()\n const intern = (value: unknown): Value => {\n let id = ids.get(value)\n if (id !== undefined) return { $a2Value: id }\n const key =\n typeof value === 'object' && value !== null ? keyFor(value) : undefined\n const candidates = key === undefined ? undefined : contents.get(key)\n if (candidates !== undefined)\n id = candidates.find((candidate) =>\n sameValue(values[candidate]!.value, value),\n )\n if (id === undefined) {\n id = values.length\n values.push(value === undefined ? {} : { value })\n }\n ids.set(value, id)\n if (key !== undefined && !candidates?.includes(id))\n contents.set(key, [...(candidates ?? []), id])\n return { $a2Value: id }\n }\n const pack = (value: unknown, field?: string): Value => {\n if (\n value === undefined ||\n (typeof value === 'string' && value.length > 80) ||\n (field !== undefined &&\n payloadFields.has(field) &&\n !(field === 'input' && isRecord(value) && 'message' in value)) ||\n (isRecord(value) && Object.hasOwn(value, '$a2Value'))\n )\n return intern(value)\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n typeof value === 'number'\n )\n return value\n if (typeof value !== 'object')\n throw new TypeError('AI state must contain JSON values')\n const cached = packed.get(value)\n if (cached !== undefined) return cached\n const result: Value = Array.isArray(value)\n ? value.map((item) => pack(item))\n : Object.fromEntries(\n Object.entries(value)\n .toSorted(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([key, item]) => [key, pack(item, key)]),\n )\n packed.set(value, result)\n return result\n }\n const saveProjection = (\n projection: NonNullable<AIStoredView['activeProjection']>,\n tools: AIStoredView['tools'],\n ): Projection => {\n const { baseTools, ...fields } = projection\n const toolPatch =\n baseTools === undefined\n ? undefined\n : difference(pack(tools), pack(baseTools))\n return {\n fields: pack(fields),\n ...(toolPatch === undefined ? {} : { tools: toolPatch }),\n }\n }\n const { activeProjection, ...fields } = state\n const projection =\n activeProjection === null\n ? null\n : saveProjection(activeProjection, state.tools)\n return {\n version: 3,\n fields: pack(fields),\n projection,\n values,\n }\n}\n\nconst loadState = <S extends AIStoredView>(stored: AIStoredState): S => {\n const unpack = (value: Value): unknown => {\n const id = reference(value)\n if (id !== undefined) {\n if (!Object.hasOwn(stored.values, id))\n throw new TypeError('missing AI payload')\n return stored.values[id]!.value\n }\n if (Array.isArray(value)) {\n if (Object.keys(value).length !== value.length)\n throw new TypeError('invalid AI stored array')\n return Array.from(value, unpack)\n }\n if (isRecord(value))\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n unpack(item as Value),\n ]),\n )\n if (\n value === null ||\n typeof value === 'boolean' ||\n typeof value === 'string' ||\n (typeof value === 'number' && Number.isFinite(value))\n )\n return value\n throw new TypeError('invalid AI stored value')\n }\n const fields = stored.fields as Record<string, Value>\n const state = unpack(stored.fields) as S\n const loadProjection = (\n saved: Projection,\n tools: Value | undefined,\n ): AIStoredView['activeProjection'] => {\n if (\n !hasKeys(saved, {\n required: ['fields'],\n optional: ['tools'],\n }) ||\n !isRecord(saved.fields) ||\n ('tools' in saved && saved.tools === undefined)\n )\n throw new TypeError('invalid AI projection recovery')\n const projection = unpack(saved.fields) as NonNullable<\n AIStoredView['activeProjection']\n >\n if (projection.base !== undefined) {\n assertMessageBase(projection.base)\n const current = state.messages.find(\n (message) => message.id === projection.responseMessageId,\n )\n if (\n current !== undefined &&\n restoreMessageBase({ current, base: projection.base }) === undefined\n )\n throw new TypeError('AI message base does not match its message')\n }\n if (tools !== undefined)\n projection.baseTools = unpack(\n restore(tools, saved.tools),\n ) as AIState['tools']\n else if (saved.tools !== undefined)\n throw new TypeError('missing AI recovery tools')\n return projection\n }\n state.activeProjection =\n stored.projection === null\n ? null\n : loadProjection(stored.projection, fields['tools']!)\n return state\n}\n\nexport const withAIStorage = <D extends EventDefs, S extends AIStoredView>(\n source: Reducer<D, S>,\n): Reducer<D, S> =>\n withReducerRuntime({\n reducer: source,\n storage: {\n encode: (state: S) => storeState(state),\n decode(value: unknown): S {\n if (\n !hasKeys(value, {\n required: ['version', 'fields', 'projection', 'values'],\n }) ||\n value['version'] !== 3 ||\n !Array.isArray(value['values']) ||\n !isRecord(value['fields']) ||\n (value['projection'] !== null && !isRecord(value['projection']))\n )\n throw new TypeError('invalid AI stored state')\n const state = value as AIStoredState\n if (Object.keys(state.values).length !== state.values.length)\n throw new TypeError('invalid AI payload table')\n for (const payload of state.values) {\n if (!hasKeys(payload, { required: [], optional: ['value'] }))\n throw new TypeError('invalid AI payload table')\n }\n return loadState<S>(state)\n },\n },\n })\n","import type { AIState } from './ai.ts'\nimport type { ContractEvent, EventDefs } from './contract.ts'\n\n/** An application reducer folded beside the AI protocol, from events alone. */\nexport type AppReducer<D extends EventDefs, X extends object> = {\n /** Snapshot identity of the application state. Rename it when `fold` changes. */\n name: string\n initialState: X\n fold: (state: X, event: ContractEvent<D>) => X\n}\n\n// Every AIState key, so application state is exactly the rest of a merged state.\nconst aiStateKeys: Record<keyof AIState, true> = {\n inbox: true,\n pendingQueueCommands: true,\n active: true,\n starting: true,\n receipt: true,\n pausedGenerationIds: true,\n session: true,\n messages: true,\n status: true,\n activeGeneration: true,\n activeRequestId: true,\n activeRequestReason: true,\n activeRequestSourceGenerationId: true,\n activeResponseMessageId: true,\n activeProjection: true,\n responseOwners: true,\n terminalRequestIds: true,\n terminalGenerations: true,\n pendingApprovals: true,\n pendingInputs: true,\n tools: true,\n compaction: true,\n modelMetadata: true,\n usage: true,\n error: true,\n}\n\nexport const isAIStateKey = (key: string): boolean =>\n Object.hasOwn(aiStateKeys, key)\n\nconst keep = (state: object, ai: boolean): Record<string, unknown> => {\n const kept: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(state))\n if (isAIStateKey(key) === ai) kept[key] = value\n return kept\n}\n\n/** The application part of a merged state: every key `AIState` does not own. */\nexport const appSlice = <X extends object>(state: object): X =>\n keep(state, false) as X\n\n/** A merged state with its application part replaced. */\nexport const withAppSlice = <S extends object>(state: S, app: object): S =>\n ({ ...keep(state, true), ...keep(app, false) }) as S\n\n// agentContract() registers every reducer it builds here, keyed by the reducer\n// so spread contracts keep it: agent() serves only these, and folds their\n// application state into the model-context checkpoint every generation reads.\nconst agentReducers = new WeakMap<\n object,\n AppReducer<EventDefs, object> | null\n>()\n\nexport const registerAgentReducer = (\n reducer: object,\n app: AppReducer<EventDefs, object> | undefined,\n): void => {\n agentReducers.set(reducer, app ?? null)\n}\n\nconst reducerOf = (contract: { reducer?: unknown }): object | undefined =>\n typeof contract.reducer === 'object' && contract.reducer !== null\n ? contract.reducer\n : undefined\n\nexport const isAgentContract = (contract: { reducer?: unknown }): boolean => {\n const reducer = reducerOf(contract)\n return reducer !== undefined && agentReducers.has(reducer)\n}\n\nexport const appReducerOf = (contract: {\n reducer?: unknown\n}): AppReducer<EventDefs, object> | undefined => {\n const reducer = reducerOf(contract)\n return reducer === undefined\n ? undefined\n : (agentReducers.get(reducer) ?? undefined)\n}\n","import type { MessageBase } from './ai-message-base.ts'\nimport { reducer as makeReducer } from './reducer.ts'\n/**\n * experimental-a2/ai — the isomorphic AI protocol.\n *\n * Event schemas, the `AIState` reducer, `agentContract()` for extending\n * both, and pure builders for the events applications append. Model calls\n * and tool implementations stay in experimental-a2/ai/server.\n */\n\nimport type {\n FinishReason,\n JSONValue,\n LanguageModelCallOptions,\n LanguageModelUsage,\n UIMessage,\n UIMessageChunk,\n} from 'ai'\nimport {\n isQueueCommand,\n projectAIClientState,\n type PendingQueueCommand,\n} from './ai-client-state.ts'\nexport type { PendingQueueCommand } from './ai-client-state.ts'\nimport { applyControlChanges } from './ai-control-state.ts'\nimport { initialControlState } from './ai-control.ts'\nimport { AI_EVENT_ID_PREFIX } from './ai-id.ts'\nimport type {\n ControlCommit,\n ActiveTurn,\n ControlCommand,\n ControlReceipt,\n InboxItem,\n ToolExecutionRequest,\n WorkReport,\n} from './ai-control.ts'\nexport type {\n ActiveTurn,\n ControlCommand,\n ControlReceipt,\n InboxItem,\n} from './ai-control.ts'\nimport { contract as createContract } from './contract.ts'\nimport type { Contract, ContractEvent, EventDefs } from './contract.ts'\nimport {\n interruptUIMessage,\n pauseUIMessage,\n projectUIMessage,\n projectUIMessageStream,\n hasToolCall,\n type ProjectionChunk,\n type UIMessageCursor,\n} from './ai-projector.ts'\nimport { ambientToolScopeStorage } from './internal.ts'\nimport {\n upsertMessage,\n retainMessageBase,\n findMessage,\n upsertResponse,\n answerApproval,\n approvalRequestedChunk,\n toolResultChunk,\n toolCalledChunk,\n advanceProjection,\n projectedTools,\n restoreGenerationBase,\n stopGenerationTools,\n interruptGenerationProjection,\n projectedMessage,\n projectedMessageStream,\n reduceToolActivity,\n addCompactionPart,\n isCompactionPart,\n settleAbandonedCompaction,\n settleCompactionPart,\n} from './ai-message-projection.ts'\nimport type { Reducer } from './reducer.ts'\nimport { withReducerRuntime } from './reducer-runtime.ts'\nimport { withAIStorage } from './ai-stored-state.ts'\nimport {\n appSlice,\n isAIStateKey,\n registerAgentReducer,\n withAppSlice,\n type AppReducer,\n} from './ai-app-state.ts'\nimport {\n flattenProgressBatches,\n progressBatches,\n progressOwnedBy,\n type ProgressBatches,\n type StoredProgressPayload,\n} from './ai-progress-batches.ts'\nimport type { HandlerContext } from './server.ts'\nimport type { StandardSchemaV1 } from './standard-schema.ts'\nimport { assertSyncSchema, validateSync } from './validate.ts'\n\nexport type AgentStatus =\n 'idle' | 'generating' | 'waiting' | 'failed' | 'closed' | 'paused'\n\nexport type GenerationReason = 'message' | 'tool' | 'input' | 'retry' | 'resume'\n\nexport type ReasoningLevel = NonNullable<LanguageModelCallOptions['reasoning']>\n\nexport const reasoningLevels: readonly ReasoningLevel[] = [\n 'provider-default',\n 'none',\n 'minimal',\n 'low',\n 'medium',\n 'high',\n 'xhigh',\n]\n\nexport type CompactionPartData = {\n status: 'running' | 'completed' | 'failed' | 'interrupted'\n inputTokens?: number\n thresholdTokens?: number\n summary?: string\n usage?: LanguageModelUsage\n}\n\n/** The transcript part A2 adds to a response where its context was compacted. */\nexport type CompactionPart = {\n type: 'data-a2-compaction'\n id: string\n data: CompactionPartData\n}\n\nexport { isCompactionPart }\n\n/**\n * A transcript message: `M` plus the compaction part A2 adds, so\n * `isCompactionPart` narrows even when `M` declares its own data parts.\n */\nexport type TranscriptMessage<M extends UIMessage> = Omit<M, 'parts'> & {\n parts: Array<M['parts'][number] | CompactionPart>\n}\n\nexport type SessionCreatedPayload = { metadata?: JSONValue }\nexport type SessionClosedPayload = { reason?: string }\nexport type MessageCreatedPayload<M extends UIMessage> = {\n message: M\n /** For user messages, false records passive context. Omission or true schedules. */\n generate?: boolean\n}\nexport type MessageCompletedPayload = { messageId: string }\ntype MessageInterruption = {\n messageId: string\n reason?: string\n /** Last confirmed event-log index visible to the interrupter. */\n lastSeenIndex?: number\n}\nexport type MessageInterruptedPayload = MessageInterruption &\n (\n | { generationId: string; requestId?: never }\n | { requestId: string; generationId?: never }\n )\nexport type GenerationRequestedPayload = {\n control?: { turnId: string; version: number }\n messageId: string\n reason: GenerationReason\n responseMessageId: string\n sourceGenerationId?: string\n}\nexport type RetryGenerationOptions = {\n messageId: string\n responseMessageId: string\n retryId: string\n}\nexport type RetryRequestedPayload = RetryGenerationOptions\nexport type GenerationStartedPayload = {\n requestId: string\n messageId: string\n generationId: string\n responseMessageId: string\n attempt: number\n /** Absent when the attempt failed before its model resolved. */\n model?: string\n promptThroughIndex?: number\n}\nexport type GenerationProgressPayload = {\n /** Log index of the generation's `ai.generation.started`. */\n startIndex: number\n chunks: UIMessageChunk[]\n}\nexport type GenerationCompletedPayload = {\n requestId: string\n messageId: string\n generationId: string\n responseMessageId: string\n finishReason?: FinishReason\n usage?: LanguageModelUsage\n inputTokenEstimate?: number\n}\nexport type GenerationFailedPayload = {\n requestId: string\n messageId: string\n generationId: string\n responseMessageId: string\n error: string\n /** True when a later attempt replaced an incomplete attempt. */\n superseded?: boolean\n stepLimit?: boolean\n}\nexport type ToolCalledPayload = {\n requestId: string\n messageId: string\n generationId: string\n toolCallId: string\n toolName: string\n input: unknown\n dynamic?: boolean\n providerExecuted?: boolean\n supportsDeferredResults?: boolean\n providerMetadata?: unknown\n toolMetadata?: unknown\n title?: string\n}\nexport type ToolResultPayload = {\n requestId: string\n messageId: string\n generationId: string\n toolCallId: string\n toolName?: string\n input?: unknown\n rawInput?: unknown\n output?: unknown\n error?: string\n denied?: boolean\n preliminary?: boolean\n phase?: 'input' | 'execution'\n dynamic?: boolean\n providerExecuted?: boolean\n providerMetadata?: unknown\n toolMetadata?: unknown\n}\nexport type ApprovalRequestedPayload = {\n requestId: string\n messageId: string\n generationId: string\n approvalId: string\n toolCallId: string\n isAutomatic?: boolean\n signature?: string\n}\nexport type ApprovalRespondedPayload = {\n requestId: string\n messageId: string\n generationId: string\n approvalId: string\n approved: boolean\n reason?: string\n}\nexport type InputRequestedPayload = {\n requestId: string\n messageId: string\n generationId: string\n inputId: string\n name: string\n question?: JSONValue\n}\nexport type InputRespondedPayload = {\n requestId: string\n messageId: string\n generationId: string\n inputId: string\n name: string\n value: JSONValue\n}\nexport type ModelLimits = {\n contextWindow: number\n maxOutputTokens: number\n}\nexport type ModelMetadataRequestedPayload = { modelId: string }\nexport type ModelMetadataResolvedPayload = {\n modelId: string\n limits: ModelLimits | null\n}\nexport type ModelMetadataState =\n | { status: 'pending' }\n | { status: 'resolved'; limits: ModelLimits }\n | { status: 'unavailable' }\n\nexport type CompactionRequestedPayload = {\n generationId: string\n throughMessageId: string\n throughIndex?: number\n inputTokenEstimate?: number\n inputTokens?: number\n thresholdTokens?: number\n}\nexport type CompactionCompletedPayload<M extends UIMessage> = {\n generationId: string\n throughMessageId: string\n throughIndex?: number\n messages: M[]\n retainedMessageIds?: string[]\n summary?: string\n usage?: LanguageModelUsage\n}\n\nexport type AIEventDefs<M extends UIMessage = UIMessage> = {\n 'ai.control.requested': StandardSchemaV1<ControlCommand<M>>\n 'ai.control.committed': StandardSchemaV1<ControlCommit>\n 'ai.control.decided': StandardSchemaV1<ControlReceipt>\n 'ai.work.reported': StandardSchemaV1<WorkReport>\n 'ai.tool.execution.requested': StandardSchemaV1<ToolExecutionRequest>\n 'ai.generation.paused': StandardSchemaV1<{\n generationId: string\n messageId: string\n }>\n 'ai.session.created': StandardSchemaV1<SessionCreatedPayload>\n 'ai.session.closed': StandardSchemaV1<SessionClosedPayload>\n 'ai.message.created': StandardSchemaV1<MessageCreatedPayload<M>>\n 'ai.message.completed': StandardSchemaV1<MessageCompletedPayload>\n 'ai.message.interrupted': StandardSchemaV1<MessageInterruptedPayload>\n 'ai.generation.requested': StandardSchemaV1<GenerationRequestedPayload>\n 'ai.retry.requested': StandardSchemaV1<RetryRequestedPayload>\n 'ai.generation.started': StandardSchemaV1<GenerationStartedPayload>\n 'ai.generation.progress': StandardSchemaV1<GenerationProgressPayload>\n 'ai.generation.completed': StandardSchemaV1<GenerationCompletedPayload>\n 'ai.generation.failed': StandardSchemaV1<GenerationFailedPayload>\n 'ai.tool.called': StandardSchemaV1<ToolCalledPayload>\n 'ai.tool.result': StandardSchemaV1<ToolResultPayload>\n 'ai.approval.requested': StandardSchemaV1<ApprovalRequestedPayload>\n 'ai.approval.responded': StandardSchemaV1<ApprovalRespondedPayload>\n 'ai.input.requested': StandardSchemaV1<InputRequestedPayload>\n 'ai.input.responded': StandardSchemaV1<InputRespondedPayload>\n 'ai.compaction.requested': StandardSchemaV1<CompactionRequestedPayload>\n 'ai.compaction.completed': StandardSchemaV1<CompactionCompletedPayload<M>>\n 'ai.model.metadata.requested': StandardSchemaV1<ModelMetadataRequestedPayload>\n 'ai.model.metadata.resolved': StandardSchemaV1<ModelMetadataResolvedPayload>\n}\n\nexport type ActiveGeneration = GenerationStartedPayload & {\n /** Log index of this generation's `ai.generation.started`. */\n startIndex: number\n}\n\nexport type ActiveGenerationProjection = {\n generationId: string\n responseMessageId: string\n /** Log index of the completed model step while its response remains interruptible. */\n completionIndex?: number\n base?: MessageBase\n promptThroughIndex?: number\n cursor?: { throughIndex: number; stream: UIMessageCursor } | null\n baseCompaction?: CompactionState | null\n batches: ProgressBatches\n baseTools: ToolActivity[]\n toolEvents: Array<\n | { index: number; type: 'ai.tool.called'; payload: ToolCalledPayload }\n | { index: number; type: 'ai.tool.result'; payload: ToolResultPayload }\n >\n approvalEvents: Array<\n | {\n index: number\n type: 'ai.approval.requested'\n payload: ApprovalRequestedPayload\n }\n | {\n index: number\n type: 'ai.approval.responded'\n payload: ApprovalRespondedPayload\n }\n >\n}\n\nexport type PendingApproval = ApprovalRequestedPayload\nexport type PendingInput = InputRequestedPayload\n\nexport type ToolActivity = {\n requestId: string\n messageId: string\n generationId: string\n toolCallId: string\n toolName?: string\n error?: string\n preliminary?: boolean\n phase?: 'input' | 'execution'\n dynamic?: boolean\n providerExecuted?: boolean\n title?: string\n status: 'running' | 'completed' | 'failed' | 'denied'\n}\n\nexport type CompactionState = {\n status: 'running' | 'completed'\n generationId: string\n throughMessageId: string\n throughIndex?: number\n summary?: string\n usage?: LanguageModelUsage\n}\n\nexport type GenerationUsage = {\n generationId: string\n usage: LanguageModelUsage\n}\n\nexport type AIState<M extends UIMessage = UIMessage> = {\n inbox: { paused: boolean; items: InboxItem<M>[] }\n pendingQueueCommands?: PendingQueueCommand<M>[]\n active: ActiveTurn<M> | null\n starting: boolean\n receipt: ControlReceipt | null\n pausedGenerationIds?: Record<string, true>\n session: { created: boolean; metadata?: JSONValue }\n messages: TranscriptMessage<M>[]\n status: AgentStatus\n activeGeneration: ActiveGeneration | null\n activeRequestId: string | null\n activeRequestReason: GenerationReason | null\n activeRequestSourceGenerationId: string | null\n activeResponseMessageId: string | null\n activeProjection: ActiveGenerationProjection | null\n responseOwners: Record<\n string,\n Pick<GenerationStartedPayload, 'generationId' | 'requestId' | 'attempt'>\n >\n terminalRequestIds?: Record<string, true>\n terminalGenerations?: Record<\n string,\n 'completed' | 'failed' | 'interrupted' | 'superseded'\n >\n pendingApprovals: PendingApproval[]\n pendingInputs: PendingInput[]\n tools: ToolActivity[]\n compaction: CompactionState | null\n modelMetadata: Record<string, ModelMetadataState>\n usage: GenerationUsage[]\n error: string | null\n}\n\n/** The `UIMessage` type a contract's `ai.message.created` schema carries. */\nexport type AIMessageOf<D> = D extends {\n readonly 'ai.message.created': infer S extends StandardSchemaV1\n}\n ? StandardSchemaV1.InferOutput<S> extends MessageCreatedPayload<\n infer M extends UIMessage\n >\n ? M\n : UIMessage\n : UIMessage\n\n/** What `agentContract()` returns: the AI protocol, with `X` as application state. */\nexport type AgentContract<\n M extends UIMessage = UIMessage,\n D extends EventDefs = AIEventDefs<M>,\n X extends object = Record<never, never>,\n> = Contract<D, Record<never, never>, AgentReducer<M, D, X>>\n\nexport type AgentToolEventDefs = EventDefs &\n Pick<AIEventDefs, 'ai.tool.execution.requested'>\n\n/** The durable handler context supplied when A2 executes a local AI tool. */\nexport type AgentToolContext<D extends AgentToolEventDefs> = HandlerContext<\n D,\n 'ai.tool.execution.requested'\n>\n\n/** Application state folded after the AI protocol, on the server and in clients. */\n/** Rejects application state keys that would shadow `AIState`'s. */\ntype OwnKeys<X> = { [K in Extract<keyof X, keyof AIState>]: never }\n/** Rejects a stateless application reducer, whose name would not be built in. */\ntype NonEmpty<X> = keyof X extends never ? never : unknown\n\n/**\n * The reducer `agentContract()` builds. Without application state it carries\n * the built-in name, which is what lets the contract-free client fold it.\n * `~appState` is type-only, absent at runtime: it carries the application\n * state's type to `agent()`, and marks the reducer as `agentContract()`'s.\n */\nexport type AgentReducer<\n M extends UIMessage,\n D extends EventDefs,\n X extends object,\n> = (keyof X extends never\n ? Reducer<D, AIState<M>> & { readonly name: typeof AI_STATE_REDUCER }\n : Reducer<D, AIState<M> & X>) & { readonly '~appState': X }\n\nexport type AgentContractOptions<\n M extends UIMessage,\n E extends EventDefs,\n X extends object,\n> = {\n name: string\n events?: E\n /** Optional stricter schema for custom UIMessage metadata/data/tool types. */\n messageSchema?: StandardSchemaV1<M>\n /**\n * Application state, folded from events beside `AIState` and merged into\n * it. `fold` sees only this state, never the transcript.\n */\n reducer?: {\n /** Snapshot identity of the application state. Rename it when `fold` changes. */\n name: string\n initialState: X & OwnKeys<X> & NonEmpty<X>\n fold: (\n state: NoInfer<X>,\n event: ContractEvent<AIEventDefs<M> & NoInfer<E>>,\n ) => NoInfer<X>\n }\n}\n\ntype SchemaResult<T> = StandardSchemaV1.Result<T>\n\nconst issue = <T>(message: string): SchemaResult<T> => ({\n issues: [{ message }],\n})\n\nconst schema = <T>(\n label: string,\n parse: (value: unknown) => SchemaResult<T>,\n): StandardSchemaV1<T> => ({\n '~standard': {\n version: 1,\n vendor: 'a2',\n validate(value) {\n try {\n return parse(value)\n } catch (error) {\n return issue(\n `${label}: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n },\n },\n})\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst isJSONCompatible = (\n value: unknown,\n seen: Set<object> = new Set(),\n): boolean => {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean'\n ) {\n return true\n }\n if (typeof value === 'number') return Number.isFinite(value)\n if (typeof value === 'undefined') return true\n if (typeof value !== 'object') return false\n if (seen.has(value)) return false\n seen.add(value)\n const valid = Array.isArray(value)\n ? value.every((item) => isJSONCompatible(item, seen))\n : Object.getPrototypeOf(value) === Object.prototype &&\n Object.values(value).every((item) => isJSONCompatible(item, seen))\n seen.delete(value)\n return valid\n}\n\nconst jsonObject = <T extends object>(\n label: string,\n check: (value: Record<string, unknown>) => boolean,\n): StandardSchemaV1<T> =>\n schema(label, (value) => {\n if (!isRecord(value) || !isJSONCompatible(value) || !check(value)) {\n return issue(`invalid ${label}`)\n }\n return { value: value as T }\n })\n\nconst stringField = (value: Record<string, unknown>, key: string): boolean =>\n typeof value[key] === 'string' && value[key].length > 0\n\nconst optionalIndexField = (\n value: Record<string, unknown>,\n key: string,\n): boolean =>\n value[key] === undefined ||\n (typeof value[key] === 'number' &&\n Number.isSafeInteger(value[key]) &&\n value[key] >= 0)\n\nconst optionalStringField = (\n value: Record<string, unknown>,\n key: string,\n): boolean => value[key] === undefined || typeof value[key] === 'string'\n\nconst messageValue = (value: unknown): value is UIMessage =>\n isRecord(value) &&\n typeof value['id'] === 'string' &&\n (value['role'] === 'user' ||\n value['role'] === 'assistant' ||\n value['role'] === 'system') &&\n Array.isArray(value['parts']) &&\n value['parts'].every(\n (part) => isRecord(part) && typeof part['type'] === 'string',\n ) &&\n isJSONCompatible(value)\n\nconst validateMessage = <M extends UIMessage>(\n value: unknown,\n messageSchema?: StandardSchemaV1<M>,\n): SchemaResult<M> => {\n if (!messageValue(value)) return issue('invalid AI SDK UIMessage')\n if (!messageSchema) return { value: value as M }\n return validateSync(messageSchema, value, 'the AI message')\n}\n\nconst messagePayloadSchema = <M extends UIMessage>(\n messageSchema?: StandardSchemaV1<M>,\n): StandardSchemaV1<MessageCreatedPayload<M>> =>\n schema('ai.message.created', (value) => {\n if (!isRecord(value)) return issue('invalid ai.message.created payload')\n const message = validateMessage(value['message'], messageSchema)\n if (message.issues) return { issues: message.issues }\n const generate = value['generate']\n if (generate !== undefined && typeof generate !== 'boolean') {\n return issue('invalid ai.message.created generate flag')\n }\n return {\n value: {\n message: message.value,\n ...(generate === false ? { generate: false } : {}),\n },\n }\n })\n\nconst progressPayloadSchema: StandardSchemaV1<GenerationProgressPayload> =\n schema('ai.generation.progress', (value) => {\n if (\n !isRecord(value) ||\n !isJSONCompatible(value) ||\n typeof value['startIndex'] !== 'number' ||\n !optionalIndexField(value, 'startIndex') ||\n !Array.isArray(value['chunks']) ||\n !value['chunks'].every(\n (chunk) => isRecord(chunk) && typeof chunk['type'] === 'string',\n )\n ) {\n return issue('invalid ai.generation.progress payload')\n }\n return { value: value as GenerationProgressPayload }\n })\n\nconst completedPayloadSchema: StandardSchemaV1<GenerationCompletedPayload> =\n schema('ai.generation.completed', (value) => {\n if (\n !isRecord(value) ||\n !isJSONCompatible(value) ||\n !stringField(value, 'requestId') ||\n !stringField(value, 'messageId') ||\n !stringField(value, 'generationId') ||\n !stringField(value, 'responseMessageId') ||\n !optionalIndexField(value, 'inputTokenEstimate') ||\n !optionalStringField(value, 'finishReason')\n ) {\n return issue('invalid ai.generation.completed payload')\n }\n return { value: value as GenerationCompletedPayload }\n })\n\nconst compactionPayloadSchema = <M extends UIMessage>(\n messageSchema?: StandardSchemaV1<M>,\n): StandardSchemaV1<CompactionCompletedPayload<M>> =>\n schema('ai.compaction.completed', (value) => {\n if (\n !isRecord(value) ||\n !isJSONCompatible(value) ||\n !stringField(value, 'generationId') ||\n !stringField(value, 'throughMessageId') ||\n !optionalIndexField(value, 'throughIndex') ||\n !optionalStringField(value, 'summary') ||\n !Array.isArray(value['messages']) ||\n (value['retainedMessageIds'] !== undefined &&\n (!Array.isArray(value['retainedMessageIds']) ||\n !value['retainedMessageIds'].every(\n (candidate) => typeof candidate === 'string',\n )))\n ) {\n return issue('invalid ai.compaction.completed payload')\n }\n const messages: M[] = []\n for (const candidate of value['messages']) {\n const result = validateMessage(candidate, messageSchema)\n if (result.issues) return { issues: result.issues }\n messages.push(result.value)\n }\n return {\n value: {\n generationId: value['generationId'] as string,\n throughMessageId: value['throughMessageId'] as string,\n ...(value['throughIndex'] === undefined\n ? {}\n : { throughIndex: value['throughIndex'] as number }),\n messages,\n ...(value['summary'] === undefined\n ? {}\n : { summary: value['summary'] as string }),\n ...(value['usage'] === undefined\n ? {}\n : { usage: value['usage'] as LanguageModelUsage }),\n ...(value['retainedMessageIds'] === undefined\n ? {}\n : { retainedMessageIds: value['retainedMessageIds'] as string[] }),\n },\n }\n })\n\nexport function createEvents<M extends UIMessage = UIMessage>(options?: {\n messageSchema?: StandardSchemaV1<M>\n}): AIEventDefs<M> {\n const messageSchema = options?.messageSchema\n if (messageSchema) assertSyncSchema(messageSchema, 'the AI message schema')\n const definition: AIEventDefs<M> = {\n 'ai.control.requested': schema('ai.control.requested', (value) => {\n if (!isRecord(value) || !isJSONCompatible(value))\n return issue('invalid AI command')\n const action = value['action']\n const forwarded = {\n approval: ['ai.approval.responded', 'response'],\n 'tool-result': ['ai.tool.result', 'result'],\n input: ['ai.input.responded', 'response'],\n 'request-input': ['ai.input.requested', 'request'],\n retry: ['ai.retry.requested', 'request'],\n interrupt: ['ai.message.interrupted', 'request'],\n } as const\n if (typeof action === 'string' && Object.hasOwn(forwarded, action)) {\n const [type, key] = forwarded[action as keyof typeof forwarded]\n const payload = validateSync(\n definition[type] as StandardSchemaV1<unknown>,\n value[key],\n 'AI command',\n )\n if (payload.issues) return { issues: payload.issues }\n return { value: { action, [key]: payload.value } as ControlCommand<M> }\n }\n if (action === 'send' || action === 'edit' || action === 'steer') {\n const parsed = validateMessage(value['message'], messageSchema)\n if (parsed.issues) return parsed\n if (\n (action === 'send' || action === 'steer') &&\n (parsed.value.id.length === 0 ||\n parsed.value.id.startsWith(AI_EVENT_ID_PREFIX))\n )\n return issue(\n 'AI input IDs must be nonempty and outside the reserved internal prefix',\n )\n if (\n (action === 'steer' &&\n (!stringField(value, 'turnId') ||\n !optionalIndexField(value, 'lastSeenIndex'))) ||\n (action === 'send' &&\n value['generate'] !== undefined &&\n typeof value['generate'] !== 'boolean')\n )\n return issue('invalid AI command')\n return {\n value: { ...value, message: parsed.value } as ControlCommand<M>,\n }\n }\n if (\n (action === 'remove' && stringField(value, 'inputId')) ||\n (action === 'send-now' &&\n stringField(value, 'inputId') &&\n (value['turnId'] === null || stringField(value, 'turnId')) &&\n optionalIndexField(value, 'lastSeenIndex')) ||\n (action === 'move' &&\n stringField(value, 'inputId') &&\n (value['beforeId'] === null || stringField(value, 'beforeId'))) ||\n (action === 'stop' &&\n stringField(value, 'turnId') &&\n optionalIndexField(value, 'lastSeenIndex')) ||\n (action === 'pause' &&\n (value['when'] === 'now' || value['when'] === 'after-turn')) ||\n action === 'resume'\n )\n return { value: value as ControlCommand<M> }\n return issue('invalid AI command')\n }),\n 'ai.control.committed': jsonObject(\n 'ai.control.committed',\n (value) => Array.isArray(value['changes']) && isRecord(value['view']),\n ),\n 'ai.control.decided': jsonObject(\n 'ai.control.decided',\n (value) =>\n stringField(value, 'commandId') &&\n (value['outcome'] === 'applied' || value['outcome'] === 'rejected'),\n ),\n 'ai.work.reported': schema('ai.work.reported', (value) => {\n if (\n !isRecord(value) ||\n !isJSONCompatible(value) ||\n !stringField(value, 'workId') ||\n !stringField(value, 'turnId') ||\n typeof value['version'] !== 'number' ||\n !optionalIndexField(value, 'version') ||\n typeof value['attempt'] !== 'number' ||\n !Number.isSafeInteger(value['attempt']) ||\n value['attempt'] < 1 ||\n typeof value['settled'] !== 'boolean' ||\n (value['kind'] !== 'model' && value['kind'] !== 'tool') ||\n !Array.isArray(value['events'])\n )\n return issue('invalid AI work report')\n const allowed = new Set([\n 'ai.generation.started',\n 'ai.generation.completed',\n 'ai.generation.failed',\n 'ai.tool.called',\n 'ai.tool.result',\n 'ai.approval.requested',\n 'ai.approval.responded',\n 'ai.compaction.requested',\n 'ai.compaction.completed',\n 'ai.model.metadata.requested',\n ])\n const events: WorkReport['events'] = []\n for (const event of value['events']) {\n if (\n !isRecord(event) ||\n !stringField(event, 'id') ||\n typeof event['type'] !== 'string' ||\n !allowed.has(event['type']) ||\n (value['kind'] === 'tool' && event['type'] !== 'ai.tool.result')\n )\n return issue('invalid AI work fact')\n const parsed = validateSync(\n definition[\n event['type'] as keyof AIEventDefs<M>\n ] as StandardSchemaV1<unknown>,\n event['payload'],\n 'AI work fact',\n )\n if (parsed.issues) return { issues: parsed.issues }\n events.push({\n id: event['id'] as string,\n type: event['type'],\n payload: parsed.value,\n })\n }\n return { value: { ...value, events } as WorkReport }\n }),\n 'ai.tool.execution.requested': jsonObject(\n 'ai.tool.execution.requested',\n (value) =>\n stringField(value, 'turnId') &&\n optionalIndexField(value, 'version') &&\n isRecord(value['call']) &&\n isRecord(value['generation']),\n ),\n 'ai.generation.paused': jsonObject(\n 'ai.generation.paused',\n (value) =>\n stringField(value, 'generationId') && stringField(value, 'messageId'),\n ),\n 'ai.session.created': jsonObject('ai.session.created', () => true),\n 'ai.session.closed': jsonObject('ai.session.closed', (value) =>\n optionalStringField(value, 'reason'),\n ),\n 'ai.message.created': messagePayloadSchema(messageSchema),\n 'ai.message.completed': jsonObject('ai.message.completed', (value) =>\n stringField(value, 'messageId'),\n ),\n 'ai.message.interrupted': jsonObject(\n 'ai.message.interrupted',\n (value) =>\n stringField(value, 'messageId') &&\n ((stringField(value, 'generationId') &&\n value['requestId'] === undefined) ||\n (stringField(value, 'requestId') &&\n value['generationId'] === undefined)) &&\n optionalStringField(value, 'reason') &&\n (value['lastSeenIndex'] === undefined ||\n (typeof value['lastSeenIndex'] === 'number' &&\n Number.isInteger(value['lastSeenIndex']) &&\n value['lastSeenIndex'] >= 0)),\n ),\n 'ai.generation.requested': jsonObject(\n 'ai.generation.requested',\n (value) =>\n stringField(value, 'messageId') &&\n stringField(value, 'responseMessageId') &&\n optionalStringField(value, 'sourceGenerationId') &&\n (value['reason'] !== 'tool' ||\n stringField(value, 'sourceGenerationId')) &&\n (value['reason'] === 'message' ||\n value['reason'] === 'tool' ||\n value['reason'] === 'input' ||\n value['reason'] === 'retry' ||\n value['reason'] === 'resume'),\n ),\n 'ai.retry.requested': jsonObject(\n 'ai.retry.requested',\n (value) =>\n stringField(value, 'messageId') &&\n stringField(value, 'responseMessageId') &&\n stringField(value, 'retryId'),\n ),\n 'ai.generation.started': jsonObject(\n 'ai.generation.started',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'responseMessageId') &&\n typeof value['attempt'] === 'number' &&\n Number.isInteger(value['attempt']) &&\n value['attempt'] > 0 &&\n (value['model'] === undefined || stringField(value, 'model')) &&\n optionalIndexField(value, 'promptThroughIndex'),\n ),\n 'ai.generation.progress': progressPayloadSchema,\n 'ai.generation.completed': completedPayloadSchema,\n 'ai.generation.failed': jsonObject(\n 'ai.generation.failed',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'responseMessageId') &&\n stringField(value, 'error') &&\n (value['superseded'] === undefined ||\n typeof value['superseded'] === 'boolean') &&\n (value['stepLimit'] === undefined ||\n typeof value['stepLimit'] === 'boolean'),\n ),\n 'ai.tool.called': jsonObject(\n 'ai.tool.called',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'toolCallId') &&\n stringField(value, 'toolName') &&\n (value['dynamic'] === undefined ||\n typeof value['dynamic'] === 'boolean') &&\n (value['providerExecuted'] === undefined ||\n typeof value['providerExecuted'] === 'boolean') &&\n (value['supportsDeferredResults'] === undefined ||\n typeof value['supportsDeferredResults'] === 'boolean') &&\n optionalStringField(value, 'title'),\n ),\n 'ai.tool.result': jsonObject(\n 'ai.tool.result',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'toolCallId') &&\n optionalStringField(value, 'toolName') &&\n optionalStringField(value, 'error') &&\n (value['denied'] === undefined ||\n typeof value['denied'] === 'boolean') &&\n (value['preliminary'] === undefined ||\n typeof value['preliminary'] === 'boolean') &&\n (value['phase'] === undefined ||\n value['phase'] === 'input' ||\n value['phase'] === 'execution') &&\n (value['dynamic'] === undefined ||\n typeof value['dynamic'] === 'boolean') &&\n (value['providerExecuted'] === undefined ||\n typeof value['providerExecuted'] === 'boolean'),\n ),\n 'ai.approval.requested': jsonObject(\n 'ai.approval.requested',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'approvalId') &&\n stringField(value, 'toolCallId') &&\n (value['isAutomatic'] === undefined ||\n typeof value['isAutomatic'] === 'boolean') &&\n optionalStringField(value, 'signature'),\n ),\n 'ai.approval.responded': jsonObject(\n 'ai.approval.responded',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'approvalId') &&\n typeof value['approved'] === 'boolean' &&\n optionalStringField(value, 'reason'),\n ),\n 'ai.input.requested': jsonObject(\n 'ai.input.requested',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'inputId') &&\n stringField(value, 'name'),\n ),\n 'ai.input.responded': jsonObject(\n 'ai.input.responded',\n (value) =>\n stringField(value, 'requestId') &&\n stringField(value, 'messageId') &&\n stringField(value, 'generationId') &&\n stringField(value, 'inputId') &&\n stringField(value, 'name'),\n ),\n 'ai.compaction.requested': jsonObject(\n 'ai.compaction.requested',\n (value) =>\n stringField(value, 'generationId') &&\n stringField(value, 'throughMessageId') &&\n optionalIndexField(value, 'throughIndex') &&\n optionalIndexField(value, 'inputTokenEstimate') &&\n optionalIndexField(value, 'inputTokens') &&\n optionalIndexField(value, 'thresholdTokens'),\n ),\n 'ai.compaction.completed': compactionPayloadSchema(messageSchema),\n 'ai.model.metadata.requested': jsonObject(\n 'ai.model.metadata.requested',\n (value) => stringField(value, 'modelId'),\n ),\n 'ai.model.metadata.resolved': jsonObject(\n 'ai.model.metadata.resolved',\n (value) =>\n stringField(value, 'modelId') &&\n (value['limits'] === null ||\n (isRecord(value['limits']) &&\n typeof value['limits']['contextWindow'] === 'number' &&\n Number.isSafeInteger(value['limits']['contextWindow']) &&\n value['limits']['contextWindow'] > 0 &&\n typeof value['limits']['maxOutputTokens'] === 'number' &&\n Number.isSafeInteger(value['limits']['maxOutputTokens']) &&\n value['limits']['maxOutputTokens'] > 0)),\n ),\n }\n return definition\n}\n\nexport const events: AIEventDefs<UIMessage> = createEvents()\n\nconst initialState = <M extends UIMessage>(): AIState<M> => ({\n inbox: initialControlState<M>().inbox,\n pendingQueueCommands: [],\n active: null,\n starting: false,\n receipt: null,\n session: { created: false },\n messages: [],\n status: 'idle',\n activeGeneration: null,\n activeRequestId: null,\n activeRequestReason: null,\n activeRequestSourceGenerationId: null,\n activeResponseMessageId: null,\n activeProjection: null,\n responseOwners: {},\n pendingApprovals: [],\n pendingInputs: [],\n tools: [],\n compaction: null,\n modelMetadata: {},\n usage: [],\n error: null,\n})\n\nconst projectMessageChunks = <M extends UIMessage>(\n messages: M[],\n messageId: string,\n chunks: ProjectionChunk[],\n): M[] => {\n const base = findMessage(messages, messageId)\n return upsertMessage(\n messages,\n projectUIMessage<M>({\n messageId,\n ...(base === undefined ? {} : { base }),\n chunks,\n }),\n )\n}\n\nconst waitingStatus = <M extends UIMessage>(state: AIState<M>): AgentStatus => {\n if (state.pendingApprovals.length > 0 || state.pendingInputs.length > 0) {\n return 'waiting'\n }\n return state.activeGeneration !== null ||\n state.tools.some((activity) => activity.status === 'running')\n ? 'generating'\n : 'idle'\n}\n\nconst lifecycleStatus = <M extends UIMessage>(\n previous: AIState<M>,\n next: AIState<M>,\n): AgentStatus =>\n previous.status === 'failed' ? 'failed' : waitingStatus(next)\n\nconst isStaleGeneration = <M extends UIMessage>(\n state: AIState<M>,\n messageId: string,\n owner: { generationId: string; requestId: string },\n): boolean => {\n const current = state.responseOwners[messageId]\n return (\n current !== undefined &&\n (current.generationId !== owner.generationId ||\n current.requestId !== owner.requestId)\n )\n}\n\nconst projectedResponse = <M extends UIMessage>(options: {\n state: AIState<M>\n projection: ActiveGenerationProjection\n}): TranscriptMessage<M> => {\n const message = projectedMessage({\n projection: options.projection,\n current: findMessage(\n options.state.messages,\n options.projection.responseMessageId,\n ),\n })\n return options.state.pausedGenerationIds?.[options.projection.generationId]\n ? pauseUIMessage({\n message,\n toolCallIds: new Set(\n options.state.tools.map((tool) => tool.toolCallId),\n ),\n })\n : message\n}\n\nconst terminalGenerationReason = <M extends UIMessage>(\n state: AIState<M>,\n generationId: string,\n requestId?: string,\n): 'completed' | 'failed' | 'interrupted' | 'superseded' | undefined => {\n const terminal = state.terminalGenerations?.[generationId]\n if (terminal !== undefined) return terminal\n return requestId !== undefined &&\n state.terminalRequestIds?.[requestId] === true\n ? 'interrupted'\n : undefined\n}\n\n/** Pure projection of the built-in AI protocol. Unknown extension events are ignored. */\nexport function reduceAIState<M extends UIMessage>(\n state: AIState<M>,\n event: { type: string; payload: unknown; index: number; id?: string },\n): AIState<M> {\n return settleAbandonedCompaction(\n state,\n retainMessageBase({\n before: state,\n after: reduceAIEvent(state, event),\n }),\n )\n}\n\nfunction reduceAIEvent<M extends UIMessage>(\n state: AIState<M>,\n event: { type: string; payload: unknown; index: number; id?: string },\n): AIState<M> {\n if (state.status === 'closed') return state\n switch (event.type) {\n case 'ai.control.requested': {\n const command = event.payload as ControlCommand<M>\n if (!event.id || !isQueueCommand(command)) return state\n const pending = state.pendingQueueCommands ?? []\n if (pending.some((item) => item.commandId === event.id)) return state\n if (\n (command.action === 'send' || command.action === 'steer') &&\n (state.messages.some((message) => message.id === command.message.id) ||\n state.inbox.items.some((item) => item.id === command.message.id))\n )\n return state\n return {\n ...state,\n pendingQueueCommands: [...pending, { commandId: event.id, command }],\n }\n }\n case 'ai.control.committed': {\n const commit = event.payload as ControlCommit\n const visible = applyControlChanges({\n state: { inbox: state.inbox, active: state.active },\n changes: commit.changes.filter(\n (change) => change.path[0] === 'inbox' || change.path[0] === 'active',\n ),\n })\n const { phase } = commit.view\n const status: AgentStatus = commit.view.closed\n ? 'closed'\n : phase === 'paused' ||\n phase === 'pausing' ||\n (commit.view.paused && phase === null)\n ? 'paused'\n : phase === 'failed'\n ? 'failed'\n : phase === 'starting' || phase === 'generating'\n ? 'generating'\n : phase\n ? 'waiting'\n : 'idle'\n return {\n ...state,\n ...visible,\n status,\n activeRequestId: commit.view.requestId,\n activeRequestReason: commit.view.requestReason,\n activeRequestSourceGenerationId: commit.view.sourceGenerationId,\n activeResponseMessageId: commit.view.responseMessageId,\n }\n }\n case 'ai.control.decided': {\n const receipt = event.payload as ControlReceipt\n if (receipt.work) return state\n const pending = state.pendingQueueCommands ?? []\n const settled = pending.find(\n (item) => item.commandId === receipt.commandId,\n )\n return {\n ...state,\n receipt,\n ...(settled === undefined\n ? {}\n : {\n pendingQueueCommands: pending.filter(\n (item) => item.commandId !== receipt.commandId,\n ),\n }),\n }\n }\n case 'ai.generation.paused': {\n const payload = event.payload as {\n generationId: string\n messageId: string\n }\n const toolCallIds = new Set(\n state.tools\n .filter((tool) => tool.messageId === payload.messageId)\n .map((tool) => tool.toolCallId),\n )\n const projection = state.activeProjection\n return {\n ...state,\n activeGeneration: null,\n activeProjection:\n projection?.generationId === payload.generationId\n ? {\n ...projection,\n cursor: null,\n batches: progressBatches(\n flattenProgressBatches(projection.batches).map((batch) => ({\n index: batch.index,\n chunks: batch.chunks.filter(\n (chunk) =>\n !('toolCallId' in chunk) ||\n toolCallIds.has(chunk.toolCallId),\n ),\n })),\n ),\n }\n : projection,\n compaction:\n state.compaction?.status === 'running'\n ? (projection?.baseCompaction ?? null)\n : state.compaction,\n messages: state.messages.map((message) =>\n message.id === payload.messageId\n ? pauseUIMessage({ message, toolCallIds })\n : message,\n ),\n pausedGenerationIds: {\n ...state.pausedGenerationIds,\n [payload.generationId]: true,\n },\n }\n }\n case 'ai.model.metadata.requested': {\n const { modelId } = event.payload as ModelMetadataRequestedPayload\n if (Object.hasOwn(state.modelMetadata, modelId)) return state\n return {\n ...state,\n modelMetadata: {\n ...state.modelMetadata,\n [modelId]: { status: 'pending' },\n },\n }\n }\n case 'ai.model.metadata.resolved': {\n const { modelId, limits } = event.payload as ModelMetadataResolvedPayload\n return {\n ...state,\n modelMetadata: {\n ...state.modelMetadata,\n [modelId]:\n limits === null\n ? { status: 'unavailable' }\n : { status: 'resolved', limits },\n },\n }\n }\n case 'ai.session.created': {\n const payload = event.payload as SessionCreatedPayload\n return {\n ...state,\n session: {\n created: true,\n ...(payload.metadata === undefined\n ? state.session.metadata === undefined\n ? {}\n : { metadata: state.session.metadata }\n : { metadata: payload.metadata }),\n },\n }\n }\n case 'ai.session.closed':\n return {\n ...state,\n active: null,\n inbox: { paused: true, items: [] },\n pendingQueueCommands: [],\n status: 'closed',\n compaction:\n state.compaction?.status === 'running'\n ? (state.activeProjection?.baseCompaction ?? null)\n : state.compaction,\n activeGeneration: null,\n activeRequestId: null,\n activeRequestReason: null,\n activeRequestSourceGenerationId: null,\n activeResponseMessageId: null,\n activeProjection: null,\n }\n case 'ai.message.created': {\n const { message } = event.payload as MessageCreatedPayload<M>\n return {\n ...state,\n messages: upsertMessage(state.messages, message),\n activeProjection:\n state.activeProjection?.responseMessageId === message.id\n ? { ...state.activeProjection, cursor: null }\n : state.activeProjection,\n }\n }\n case 'ai.message.completed': {\n const { messageId } = event.payload as MessageCompletedPayload\n const owner = state.responseOwners[messageId]\n const generationId = owner?.generationId\n const requestId = owner?.requestId\n if (\n generationId === undefined ||\n terminalGenerationReason(state, generationId, requestId) !== undefined\n ) {\n return state\n }\n return {\n ...state,\n activeRequestId: null,\n activeRequestReason: null,\n activeRequestSourceGenerationId: null,\n activeResponseMessageId: null,\n activeProjection:\n state.activeProjection?.generationId === generationId\n ? null\n : state.activeProjection,\n terminalGenerations: {\n ...state.terminalGenerations,\n [generationId]: 'completed',\n },\n ...(requestId === undefined\n ? {}\n : {\n terminalRequestIds: {\n ...state.terminalRequestIds,\n [requestId]: true,\n },\n }),\n }\n }\n case 'ai.generation.requested': {\n const payload = event.payload as GenerationRequestedPayload\n const schedulesToolContinuation = payload.reason === 'tool'\n const responseMessageId = payload.responseMessageId\n const owner = state.responseOwners[responseMessageId]\n const ownerGenerationId = owner?.generationId\n const ownerRequestId = owner?.requestId\n const requestId = (event as { id?: string }).id\n if (\n requestId !== undefined &&\n state.terminalRequestIds?.[requestId] === true\n ) {\n return state\n }\n const acceptsRequest =\n (payload.control !== undefined && state.activeRequestId === event.id) ||\n payload.reason === 'message' ||\n (payload.reason === 'tool'\n ? ownerGenerationId !== undefined &&\n payload.sourceGenerationId === ownerGenerationId &&\n state.activeRequestId === ownerRequestId &&\n state.status !== 'failed'\n : payload.reason === 'retry'\n ? state.status === 'failed'\n : ownerGenerationId !== undefined &&\n payload.sourceGenerationId === ownerGenerationId &&\n state.activeRequestId === ownerRequestId &&\n state.status !== 'failed')\n if (!acceptsRequest) return state\n const base =\n payload.reason === 'retry' &&\n state.activeProjection &&\n state.activeProjection.completionIndex === undefined\n ? restoreGenerationBase(\n state,\n state.activeProjection.generationId,\n responseMessageId,\n 'failed',\n )\n : state\n return {\n ...base,\n activeProjection:\n payload.reason === 'retry' ? null : state.activeProjection,\n status: schedulesToolContinuation ? state.status : 'generating',\n activeRequestId: requestId ?? null,\n activeRequestReason: payload.reason,\n activeRequestSourceGenerationId: payload.sourceGenerationId ?? null,\n activeResponseMessageId: responseMessageId,\n error: schedulesToolContinuation ? state.error : null,\n }\n }\n case 'ai.generation.started': {\n const payload = event.payload as GenerationStartedPayload\n if (\n state.terminalRequestIds?.[payload.requestId] === true ||\n terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n ) !== undefined\n ) {\n return state\n }\n if (\n state.activeRequestId !== null &&\n state.activeRequestId !== payload.requestId\n ) {\n return state\n }\n const currentOwner = state.responseOwners[payload.responseMessageId]\n const currentTerminal =\n currentOwner === undefined\n ? undefined\n : terminalGenerationReason(\n state,\n currentOwner.generationId,\n currentOwner.requestId,\n )\n if (\n currentTerminal === 'completed' ||\n currentTerminal === 'interrupted'\n ) {\n return state\n }\n if (\n currentOwner?.requestId === payload.requestId &&\n currentOwner.attempt >= payload.attempt\n )\n return state\n const activeGeneration = state.activeGeneration\n const replacesActiveAttempt =\n activeGeneration !== null &&\n activeGeneration.requestId === payload.requestId &&\n activeGeneration.responseMessageId === payload.responseMessageId &&\n activeGeneration.attempt < payload.attempt &&\n state.activeProjection?.generationId === activeGeneration.generationId\n const baseState = replacesActiveAttempt\n ? restoreGenerationBase(\n state,\n activeGeneration.generationId,\n activeGeneration.responseMessageId,\n 'superseded',\n )\n : state\n const baseMessage = findMessage(\n baseState.messages,\n payload.responseMessageId,\n )\n return {\n ...baseState,\n status: 'generating',\n activeGeneration: { ...payload, startIndex: event.index },\n activeResponseMessageId: null,\n responseOwners: {\n ...baseState.responseOwners,\n [payload.responseMessageId]: {\n generationId: payload.generationId,\n requestId: payload.requestId,\n attempt: payload.attempt,\n },\n },\n activeProjection: {\n generationId: payload.generationId,\n responseMessageId: payload.responseMessageId,\n promptThroughIndex: payload.promptThroughIndex ?? event.index - 1,\n ...(baseMessage === undefined\n ? {}\n : { base: { partCount: baseMessage.parts.length } }),\n baseCompaction: baseState.compaction,\n batches: progressBatches(),\n baseTools: baseState.tools,\n toolEvents: [],\n approvalEvents: [],\n },\n error: null,\n }\n }\n case 'ai.generation.progress': {\n const payload = event.payload as StoredProgressPayload\n const generation = state.activeGeneration\n const activeProjection = state.activeProjection\n if (\n generation === null ||\n !progressOwnedBy({\n payload,\n owner: generation,\n startIndex: generation.startIndex,\n }) ||\n state.pausedGenerationIds?.[generation.generationId] ||\n terminalGenerationReason(\n state,\n generation.generationId,\n generation.requestId,\n ) !== undefined ||\n activeProjection?.generationId !== generation.generationId\n ) {\n return state\n }\n const progress = advanceProjection({\n projection: activeProjection,\n base: findMessage(state.messages, activeProjection.responseMessageId),\n chunks: payload.chunks,\n index: event.index,\n })\n return {\n ...state,\n messages: upsertResponse({\n messages: state.messages,\n message: progress.message,\n inputId: generation.messageId,\n }),\n activeProjection: {\n ...activeProjection,\n batches: progress.batches,\n cursor: progress.cursor,\n },\n status: 'generating',\n }\n }\n case 'ai.generation.completed': {\n const payload = event.payload as GenerationCompletedPayload\n if (\n terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n ) !== undefined\n ) {\n return state\n }\n if (\n state.activeGeneration?.generationId !== payload.generationId ||\n state.activeGeneration.requestId !== payload.requestId\n ) {\n return state\n }\n const usage = payload.usage\n ? [\n ...state.usage.filter(\n (entry) => entry.generationId !== payload.generationId,\n ),\n { generationId: payload.generationId, usage: payload.usage },\n ]\n : state.usage\n const next = {\n ...state,\n activeGeneration: null,\n activeProjection:\n state.activeProjection?.generationId === payload.generationId\n ? { ...state.activeProjection, completionIndex: event.index }\n : state.activeProjection,\n usage,\n }\n return { ...next, status: waitingStatus(next) }\n }\n case 'ai.generation.failed': {\n const payload = event.payload as GenerationFailedPayload\n if (\n terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n ) !== undefined\n ) {\n return state\n }\n if (\n (state.activeGeneration?.generationId !== payload.generationId ||\n state.activeGeneration.requestId !== payload.requestId) &&\n !(\n payload.stepLimit === true &&\n state.activeRequestReason === 'tool' &&\n state.responseOwners[payload.responseMessageId]?.requestId ===\n payload.requestId &&\n state.responseOwners[payload.responseMessageId]?.generationId ===\n payload.generationId &&\n state.activeRequestSourceGenerationId === payload.generationId &&\n state.activeResponseMessageId === payload.responseMessageId\n )\n ) {\n return state\n }\n if (payload.superseded === true) {\n return restoreGenerationBase(\n state,\n payload.generationId,\n payload.responseMessageId,\n 'superseded',\n )\n }\n const projection =\n state.activeProjection?.generationId === payload.generationId\n ? state.activeProjection\n : null\n const shouldProject =\n projection !== null &&\n (projection.base !== undefined || projection.batches.length > 0)\n return {\n ...state,\n messages: shouldProject\n ? upsertMessage(\n state.messages,\n interruptUIMessage(\n projectedMessage({\n projection,\n current: findMessage(\n state.messages,\n projection.responseMessageId,\n ),\n }),\n `Generation failed before tool completion: ${payload.error}`,\n ),\n )\n : state.messages,\n status: 'failed',\n activeGeneration: null,\n activeResponseMessageId: null,\n activeProjection: projection,\n terminalGenerations: {\n ...state.terminalGenerations,\n [payload.generationId]: 'failed',\n },\n terminalRequestIds: {\n ...state.terminalRequestIds,\n [payload.requestId]: true,\n ...(state.activeRequestId === null\n ? {}\n : { [state.activeRequestId]: true as const }),\n },\n compaction:\n projection?.generationId === payload.generationId\n ? (projection.baseCompaction ?? null)\n : state.compaction?.generationId === payload.generationId\n ? null\n : state.compaction,\n pendingApprovals: state.pendingApprovals.filter(\n (approval) => approval.generationId !== payload.generationId,\n ),\n pendingInputs: state.pendingInputs.filter(\n (input) => input.generationId !== payload.generationId,\n ),\n tools: stopGenerationTools(\n state.tools,\n payload.generationId,\n payload.responseMessageId,\n payload.error,\n ),\n error: payload.error,\n }\n }\n case 'ai.message.interrupted': {\n const payload = event.payload as MessageInterruptedPayload\n const owner = state.responseOwners[payload.messageId]\n const currentGenerationId = owner?.generationId\n const targetRequestId =\n payload.requestId ??\n (owner?.generationId === payload.generationId\n ? owner?.requestId\n : undefined)\n const ownsRequestPhase =\n payload.requestId !== undefined &&\n state.activeGeneration === null &&\n state.activeRequestId === payload.requestId &&\n state.activeResponseMessageId === payload.messageId\n if (\n currentGenerationId !== undefined &&\n !ownsRequestPhase &&\n (payload.generationId !== undefined\n ? currentGenerationId !== payload.generationId\n : owner?.requestId !== payload.requestId)\n ) {\n return state\n }\n if (\n state.activeGeneration === null &&\n state.activeRequestId !== null &&\n state.activeResponseMessageId === payload.messageId &&\n targetRequestId !== state.activeRequestId\n ) {\n return state\n }\n const currentTerminal =\n currentGenerationId === undefined\n ? undefined\n : terminalGenerationReason(\n state,\n currentGenerationId,\n owner?.requestId,\n )\n if (\n currentTerminal === 'completed' ||\n currentTerminal === 'interrupted' ||\n currentTerminal === 'superseded'\n ) {\n return state\n }\n const active = state.activeGeneration\n if (active === null) {\n if (\n payload.requestId !== undefined &&\n state.activeRequestId !== null &&\n state.activeRequestId === payload.requestId &&\n state.activeResponseMessageId === payload.messageId\n ) {\n const projectedState =\n currentGenerationId === undefined\n ? null\n : interruptGenerationProjection(\n state,\n currentGenerationId,\n payload.messageId,\n payload.lastSeenIndex ?? Number.POSITIVE_INFINITY,\n )\n const baseState = projectedState ?? state\n return {\n ...baseState,\n status: 'idle',\n activeRequestId: null,\n activeRequestReason: null,\n activeRequestSourceGenerationId: null,\n activeResponseMessageId: null,\n activeProjection: null,\n terminalRequestIds: {\n ...baseState.terminalRequestIds,\n [payload.requestId]: true,\n },\n ...(currentGenerationId === undefined\n ? {}\n : {\n terminalGenerations: {\n ...baseState.terminalGenerations,\n [currentGenerationId]: 'interrupted' as const,\n },\n }),\n error: null,\n }\n }\n const targetGenerationId =\n payload.generationId ??\n (currentGenerationId !== undefined &&\n owner?.requestId === payload.requestId\n ? currentGenerationId\n : undefined)\n if (targetGenerationId === undefined) return state\n if (currentGenerationId !== targetGenerationId) return state\n const matchesGeneration = (generationId: string): boolean =>\n targetGenerationId === generationId\n const hasMessageWork =\n state.pendingApprovals.some(\n (approval) =>\n approval.messageId === payload.messageId &&\n matchesGeneration(approval.generationId),\n ) ||\n state.pendingInputs.some(\n (input) =>\n input.messageId === payload.messageId &&\n matchesGeneration(input.generationId),\n ) ||\n state.tools.some(\n (activity) =>\n activity.messageId === payload.messageId &&\n activity.status === 'running' &&\n matchesGeneration(activity.generationId),\n )\n const resolvesFailedGeneration =\n state.status === 'failed' &&\n currentGenerationId === targetGenerationId &&\n (state.activeRequestId === null ||\n state.activeRequestId === targetRequestId ||\n (state.activeRequestReason === 'tool' &&\n state.activeRequestSourceGenerationId === targetGenerationId))\n const resolvesCurrentGeneration =\n currentGenerationId === targetGenerationId &&\n currentTerminal === undefined\n if (\n !hasMessageWork &&\n !resolvesFailedGeneration &&\n !resolvesCurrentGeneration\n ) {\n return state\n }\n const pendingRequestId = state.activeRequestId\n const projectedState = interruptGenerationProjection(\n state,\n targetGenerationId,\n payload.messageId,\n payload.lastSeenIndex ?? Number.POSITIVE_INFINITY,\n )\n const baseState = projectedState ?? state\n const next = {\n ...baseState,\n activeRequestId: null,\n activeRequestReason: null,\n activeRequestSourceGenerationId: null,\n activeResponseMessageId: null,\n activeProjection: null,\n messages:\n projectedState === null\n ? state.messages.map((message) =>\n message.id === payload.messageId\n ? interruptUIMessage(message)\n : message,\n )\n : baseState.messages,\n pendingApprovals: baseState.pendingApprovals.filter(\n (approval) =>\n approval.messageId !== payload.messageId ||\n !matchesGeneration(approval.generationId),\n ),\n pendingInputs: baseState.pendingInputs.filter(\n (input) =>\n input.messageId !== payload.messageId ||\n !matchesGeneration(input.generationId),\n ),\n tools:\n projectedState === null\n ? stopGenerationTools(\n state.tools,\n targetGenerationId,\n payload.messageId,\n 'Tool execution was interrupted.',\n )\n : baseState.tools,\n terminalGenerations: {\n ...baseState.terminalGenerations,\n [targetGenerationId]: 'interrupted' as const,\n },\n ...(pendingRequestId === null\n ? {}\n : {\n terminalRequestIds: {\n ...baseState.terminalRequestIds,\n [pendingRequestId]: true as const,\n },\n }),\n error: resolvesFailedGeneration ? null : state.error,\n }\n return {\n ...next,\n status: waitingStatus(next),\n }\n }\n if (\n payload.messageId !== active.responseMessageId ||\n (payload.generationId !== active.generationId &&\n payload.requestId !== active.requestId)\n ) {\n return state\n }\n const cutoff = payload.lastSeenIndex ?? Number.POSITIVE_INFINITY\n const projectedState = interruptGenerationProjection(\n state,\n active.generationId,\n active.responseMessageId,\n cutoff,\n )\n const baseState =\n projectedState ??\n restoreGenerationBase(\n state,\n active.generationId,\n active.responseMessageId,\n 'interrupted',\n )\n const next = {\n ...baseState,\n activeRequestId: null,\n activeRequestReason: null,\n activeRequestSourceGenerationId: null,\n activeResponseMessageId: null,\n terminalRequestIds: {\n ...baseState.terminalRequestIds,\n [active.requestId]: true as const,\n },\n tools:\n projectedState === null\n ? stopGenerationTools(\n baseState.tools,\n active.generationId,\n active.responseMessageId,\n 'Tool execution was interrupted.',\n )\n : baseState.tools,\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.tool.called': {\n const payload = event.payload as ToolCalledPayload\n const projection = state.activeProjection\n if (\n isStaleGeneration(state, payload.messageId, payload) ||\n terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n ) !== undefined\n ) {\n return state\n }\n if (\n state.tools.some(\n (activity) =>\n activity.generationId === payload.generationId &&\n activity.toolCallId === payload.toolCallId &&\n activity.status === 'failed' &&\n state.activeGeneration?.generationId !== payload.generationId,\n )\n ) {\n return state\n }\n if (projection?.generationId !== payload.generationId) {\n const next = {\n ...state,\n messages: projectMessageChunks(state.messages, payload.messageId, [\n toolCalledChunk(payload),\n ]),\n tools: reduceToolActivity(state.tools, {\n type: 'ai.tool.called',\n payload,\n }),\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n const activeProjection: ActiveGenerationProjection = {\n ...projection,\n cursor: null,\n toolEvents: [\n ...projection.toolEvents,\n { index: event.index, type: 'ai.tool.called', payload },\n ],\n }\n const base = findMessage(state.messages, payload.messageId)\n const paused = state.pausedGenerationIds?.[payload.generationId]\n const cursor = projection.cursor\n const incremental =\n base && cursor && !paused && event.index > cursor.throughIndex\n const projected = incremental\n ? {\n ...(hasToolCall({ message: base, call: payload })\n ? { message: base, cursor: cursor.stream }\n : projectUIMessageStream({\n messageId: payload.messageId,\n base,\n cursor: cursor.stream,\n chunks: [toolCalledChunk(payload)],\n })),\n throughIndex: event.index,\n }\n : projectedMessageStream({\n projection: activeProjection,\n current: base,\n })\n activeProjection.cursor = paused\n ? null\n : { throughIndex: projected.throughIndex, stream: projected.cursor }\n const next = {\n ...state,\n activeProjection,\n messages: upsertResponse({\n messages: state.messages,\n message: paused\n ? projectedResponse({ state, projection: activeProjection })\n : projected.message,\n inputId:\n state.activeGeneration?.messageId ??\n state.active?.input.id ??\n payload.messageId,\n }),\n tools: projectedTools(activeProjection),\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.tool.result': {\n const payload = event.payload as ToolResultPayload\n const projection = state.activeProjection\n const terminalReason = terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n )\n const completesFailedTool =\n terminalReason === 'failed' &&\n state.status === 'failed' &&\n payload.preliminary !== true &&\n projection?.generationId === payload.generationId &&\n projectedTools(projection).some(\n (activity) =>\n activity.generationId === payload.generationId &&\n activity.toolCallId === payload.toolCallId &&\n activity.status === 'running',\n )\n if (\n isStaleGeneration(state, payload.messageId, payload) ||\n (terminalReason !== undefined && !completesFailedTool)\n ) {\n return state\n }\n if (\n state.tools.some(\n (activity) =>\n activity.generationId === payload.generationId &&\n activity.toolCallId === payload.toolCallId &&\n activity.status === 'failed' &&\n state.activeGeneration?.generationId !== payload.generationId &&\n !completesFailedTool,\n )\n ) {\n return state\n }\n if (projection?.generationId !== payload.generationId) {\n const next = {\n ...state,\n messages: projectMessageChunks(state.messages, payload.messageId, [\n toolResultChunk(payload),\n ]),\n tools: reduceToolActivity(state.tools, {\n type: 'ai.tool.result',\n payload,\n }),\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n const activeProjection: ActiveGenerationProjection = {\n ...projection,\n cursor: null,\n toolEvents: [\n ...projection.toolEvents,\n { index: event.index, type: 'ai.tool.result', payload },\n ],\n }\n const projected = projectedResponse({\n state,\n projection: activeProjection,\n })\n const tools = projectedTools(activeProjection)\n const failureError = state.error ?? 'Generation failed.'\n const next = {\n ...state,\n messages: upsertMessage(\n state.messages,\n terminalReason === 'failed'\n ? interruptUIMessage(\n projected,\n `Generation failed before tool completion: ${failureError}`,\n )\n : projected,\n ),\n activeProjection,\n tools:\n terminalReason === 'failed'\n ? stopGenerationTools(\n tools,\n payload.generationId,\n payload.messageId,\n failureError,\n )\n : tools,\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.approval.requested': {\n const payload = event.payload as ApprovalRequestedPayload\n const projection = state.activeProjection\n if (\n isStaleGeneration(state, payload.messageId, payload) ||\n terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n ) !== undefined\n ) {\n return state\n }\n if (\n state.tools.some(\n (activity) =>\n activity.generationId === payload.generationId &&\n activity.toolCallId === payload.toolCallId &&\n activity.status === 'failed' &&\n state.activeGeneration?.generationId !== payload.generationId,\n )\n ) {\n return state\n }\n const activeProjection =\n projection?.generationId === payload.generationId\n ? {\n ...projection,\n cursor: null,\n approvalEvents: [\n ...projection.approvalEvents,\n {\n index: event.index,\n type: 'ai.approval.requested' as const,\n payload,\n },\n ],\n }\n : projection\n const next = {\n ...state,\n messages:\n activeProjection === null || activeProjection === projection\n ? projectMessageChunks(state.messages, payload.messageId, [\n approvalRequestedChunk(payload),\n ])\n : upsertMessage(\n state.messages,\n projectedResponse({ state, projection: activeProjection }),\n ),\n activeProjection,\n pendingApprovals:\n payload.isAutomatic === true\n ? state.pendingApprovals\n : [\n ...state.pendingApprovals.filter(\n (approval) =>\n approval.approvalId !== payload.approvalId ||\n approval.messageId !== payload.messageId,\n ),\n payload,\n ],\n }\n return {\n ...next,\n status: lifecycleStatus(state, next),\n }\n }\n case 'ai.approval.responded': {\n const payload = event.payload as ApprovalRespondedPayload\n if (\n isStaleGeneration(state, payload.messageId, payload) ||\n terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n ) !== undefined\n ) {\n return state\n }\n const projection = state.activeProjection\n const pendingRequest = state.pendingApprovals.find(\n (candidate) =>\n candidate.approvalId === payload.approvalId &&\n candidate.messageId === payload.messageId &&\n candidate.generationId === payload.generationId,\n )\n const activeRequest = projection?.approvalEvents.findLast(\n (candidate) =>\n candidate.type === 'ai.approval.requested' &&\n candidate.payload.approvalId === payload.approvalId &&\n candidate.payload.messageId === payload.messageId &&\n candidate.payload.generationId === payload.generationId,\n )\n if (\n state.status === 'failed' &&\n pendingRequest === undefined &&\n activeRequest === undefined\n ) {\n return state\n }\n const activeProjection =\n projection !== null && activeRequest !== undefined\n ? {\n ...projection,\n cursor: null,\n approvalEvents: [\n ...projection.approvalEvents,\n {\n index: event.index,\n type: 'ai.approval.responded' as const,\n payload,\n },\n ],\n }\n : projection\n const next = {\n ...state,\n messages:\n activeProjection === null || activeProjection === projection\n ? answerApproval(state.messages, payload)\n : upsertMessage(\n state.messages,\n projectedResponse({ state, projection: activeProjection }),\n ),\n activeProjection:\n activeProjection === null\n ? null\n : { ...activeProjection, cursor: null },\n pendingApprovals: state.pendingApprovals.filter(\n (approval) =>\n approval.approvalId !== payload.approvalId ||\n approval.messageId !== payload.messageId ||\n approval.generationId !== payload.generationId,\n ),\n }\n return {\n ...next,\n status: lifecycleStatus(state, next),\n }\n }\n case 'ai.input.requested': {\n const payload = event.payload as InputRequestedPayload\n if (\n isStaleGeneration(state, payload.messageId, payload) ||\n terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n ) !== undefined\n ) {\n return state\n }\n const next = {\n ...state,\n pendingInputs: [\n ...state.pendingInputs.filter(\n (input) =>\n input.messageId !== payload.messageId ||\n input.generationId !== payload.generationId ||\n input.inputId !== payload.inputId,\n ),\n payload,\n ],\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.input.responded': {\n const payload = event.payload as InputRespondedPayload\n if (\n isStaleGeneration(state, payload.messageId, payload) ||\n terminalGenerationReason(\n state,\n payload.generationId,\n payload.requestId,\n ) !== undefined\n ) {\n return state\n }\n const next = {\n ...state,\n pendingInputs: state.pendingInputs.filter(\n (input) =>\n input.inputId !== payload.inputId ||\n input.messageId !== payload.messageId ||\n input.generationId !== payload.generationId,\n ),\n }\n return { ...next, status: lifecycleStatus(state, next) }\n }\n case 'ai.compaction.requested': {\n const payload = event.payload as CompactionRequestedPayload\n if (state.activeGeneration?.generationId !== payload.generationId) {\n return state\n }\n return addCompactionPart(\n { ...state, compaction: { status: 'running', ...payload } },\n payload,\n )\n }\n case 'ai.compaction.completed': {\n const payload = event.payload as CompactionCompletedPayload<M>\n if (\n state.activeGeneration?.generationId !== payload.generationId ||\n state.compaction?.status !== 'running' ||\n state.compaction.generationId !== payload.generationId\n ) {\n return state\n }\n const {\n messages: _messages,\n retainedMessageIds: _retained,\n ...summary\n } = payload\n const compaction: CompactionState = {\n status: 'completed',\n ...summary,\n throughIndex:\n payload.throughIndex ?? state.activeProjection!.promptThroughIndex!,\n }\n const projection = state.activeProjection\n return settleCompactionPart({\n state: {\n ...state,\n compaction,\n activeProjection: projection && {\n ...projection,\n baseCompaction: compaction,\n // A new base identity records the completed part as the step's\n // starting point, so a later cutoff cannot revert it to running.\n ...(projection.base === undefined\n ? {}\n : { base: { ...projection.base } }),\n },\n },\n generationId: payload.generationId,\n data: {\n status: 'completed',\n ...(summary.summary === undefined\n ? {}\n : { summary: summary.summary }),\n ...(summary.usage === undefined ? {} : { usage: summary.usage }),\n },\n })\n }\n default:\n return state\n }\n}\n\n/** Derive AI SDK UI messages directly from an A2 event history. */\nexport function deriveUIMessages<M extends UIMessage = UIMessage>(\n history: readonly { type: string; payload: unknown; index: number }[],\n): TranscriptMessage<M>[] {\n let state = initialState<M>()\n for (const event of history) state = reduceAIState(state, event)\n return state.messages\n}\n\ntype CommandInput<C> = { type: 'ai.control.requested'; payload: C; id?: string }\ntype ControlInput<\n M extends UIMessage,\n A extends ControlCommand<M>['action'],\n> = CommandInput<Extract<ControlCommand<M>, { action: A }>> &\n (A extends 'send' | 'steer' ? { id: string } : {})\n\nexport type AIInputs = {\n message<M extends UIMessage>(\n message: M,\n options?: { generate?: boolean },\n ): ControlInput<M, 'send'>[]\n seed<M extends UIMessage>(message: M): ControlInput<M, 'send'>[]\n queue: {\n remove(options: { inputId: string }): ControlInput<UIMessage, 'remove'>[]\n sendNow(options: {\n inputId: string\n turnId: string | null\n lastSeenIndex?: number\n }): ControlInput<UIMessage, 'send-now'>[]\n edit<M extends UIMessage>(options: {\n message: M\n }): ControlInput<M, 'edit'>[]\n move(options: {\n inputId: string\n beforeId: string | null\n }): ControlInput<UIMessage, 'move'>[]\n }\n stop(options: {\n turnId: string\n lastSeenIndex?: number\n }): ControlInput<UIMessage, 'stop'>[]\n steer<M extends UIMessage>(options: {\n turnId: string\n message: M\n lastSeenIndex?: number\n }): ControlInput<M, 'steer'>[]\n pause(options: {\n when: 'now' | 'after-turn'\n }): ControlInput<UIMessage, 'pause'>[]\n resume(): ControlInput<UIMessage, 'resume'>[]\n approval(\n response: ApprovalRespondedPayload,\n ): ControlInput<UIMessage, 'approval'>[]\n input(response: InputRespondedPayload): ControlInput<UIMessage, 'input'>[]\n requestInput(\n request: InputRequestedPayload,\n ): ControlInput<UIMessage, 'request-input'>[]\n retry(request: RetryGenerationOptions): ControlInput<UIMessage, 'retry'>[]\n interrupt(\n request: MessageInterruptedPayload,\n ): ControlInput<UIMessage, 'interrupt'>[]\n toolResult(\n result: ToolResultPayload,\n ): ControlInput<UIMessage, 'tool-result'>[]\n}\n\nconst commandInput = <C extends ControlCommand<UIMessage>>(\n payload: C,\n): CommandInput<C>[] => [{ type: 'ai.control.requested', payload }]\nconst messageInput = <M extends UIMessage>(\n message: M,\n generate?: boolean,\n): ControlInput<M, 'send'>[] => [\n {\n type: 'ai.control.requested',\n id: message.id,\n payload: {\n action: 'send',\n message,\n ...(generate === false ? { generate: false } : {}),\n },\n },\n]\n\n/** Pure append inputs for the built-in AI protocol. */\nexport const inputs: AIInputs = {\n toolResult: (result) => commandInput({ action: 'tool-result', result }),\n queue: {\n remove: (options) => commandInput({ action: 'remove', ...options }),\n sendNow: (options) => commandInput({ action: 'send-now', ...options }),\n edit: (options) => commandInput({ action: 'edit', ...options }),\n move: (options) => commandInput({ action: 'move', ...options }),\n },\n stop: (options) => commandInput({ action: 'stop', ...options }),\n steer: (options) => [\n {\n type: 'ai.control.requested',\n id: options.message.id,\n payload: { action: 'steer', ...options },\n },\n ],\n pause: (options) => commandInput({ action: 'pause', ...options }),\n resume: () => commandInput({ action: 'resume' }),\n message<M extends UIMessage>(message: M, options?: { generate?: boolean }) {\n return messageInput(message, options?.generate)\n },\n seed<M extends UIMessage>(message: M) {\n return messageInput(message, false)\n },\n approval: (response) => [\n {\n ...commandInput({ action: 'approval', response })[0]!,\n id: `ai.approval:${encodeURIComponent(response.requestId)}:${encodeURIComponent(response.messageId)}:${encodeURIComponent(response.generationId)}:${encodeURIComponent(response.approvalId)}:response`,\n },\n ],\n input: (response) => [\n {\n ...commandInput({ action: 'input', response })[0]!,\n id: `ai.input:${encodeURIComponent(response.requestId)}:${encodeURIComponent(response.messageId)}:${encodeURIComponent(response.generationId)}:${encodeURIComponent(response.inputId)}:response`,\n },\n ],\n requestInput: (request) => [\n {\n ...commandInput({ action: 'request-input', request })[0]!,\n id: `ai.input:${encodeURIComponent(request.requestId)}:${encodeURIComponent(request.messageId)}:${encodeURIComponent(request.generationId)}:${encodeURIComponent(request.inputId)}:request`,\n },\n ],\n retry: (request) => [\n {\n ...commandInput({ action: 'retry', request })[0]!,\n id: `ai.retry:${request.retryId}`,\n },\n ],\n interrupt: (request) => [\n {\n ...commandInput({ action: 'interrupt', request })[0]!,\n id: `ai.interrupt:${request.generationId ?? request.requestId}`,\n },\n ],\n}\n\n/**\n * Read the durable handler context ambient to the current AI tool\n * execution. A2 runs each local tool's `execute` inside this scope, so\n * plain AI SDK `tool()` definitions reach their `event`, `attempt`,\n * `session`, and `signal` without an A2-specific wrapper. Pass the\n * agent's contract to type application events; it is verified against\n * the executing agent.\n */\nexport function handlerContext<D extends AgentToolEventDefs = AIEventDefs>(\n contract?: Contract<D>,\n): AgentToolContext<D> {\n const scope = ambientToolScopeStorage()?.getStore()\n if (scope === undefined) {\n throw new TypeError(\n \"handlerContext() requires an ambient A2 tool execution: call it inside a local tool's execute, or wrap direct tool tests with runWithHandlerContext\",\n )\n }\n if (\n contract !== undefined &&\n scope.contract !== undefined &&\n scope.contract.name !== contract.name\n ) {\n throw new TypeError(\n `handlerContext('${contract.name}') was called during a tool execution for agent '${scope.contract.name}'`,\n )\n }\n return scope.context as AgentToolContext<D>\n}\n\n/** The built-in AI reducer's name, and so its checkpoint identity. */\nexport const AI_STATE_REDUCER = 'a2.ai.state.v26'\n\n/**\n * The built-in AI protocol plus application events, as a core contract whose\n * reducer folds `AIState`. Isomorphic: share it when a client needs\n * application events or extended state; otherwise `agent({ name })` on the\n * server builds one and clients use the built-in protocol.\n */\nexport function agentContract<\n M extends UIMessage = UIMessage,\n E extends EventDefs = Record<never, never>,\n X extends object = Record<never, never>,\n>(\n options: AgentContractOptions<M, E, X>,\n): AgentContract<M, AIEventDefs<M> & E, X> {\n type D = AIEventDefs<M> & E\n const builtIns = createEvents(\n options.messageSchema === undefined\n ? undefined\n : { messageSchema: options.messageSchema },\n )\n const extensions = options.events ?? ({} as E)\n for (const key of Object.keys(extensions)) {\n if (Object.hasOwn(builtIns, key)) {\n throw new TypeError(\n `agent event '${key}' conflicts with a built-in event`,\n )\n }\n }\n const vocabulary = createContract({\n name: options.name,\n events: { ...builtIns, ...extensions } as D,\n })\n const app = options.reducer as AppReducer<D, X> | undefined\n const aiState = initialState<M>()\n for (const key of Object.keys(app?.initialState ?? {})) {\n if (isAIStateKey(key))\n throw new TypeError(`agent state '${key}' conflicts with AIState`)\n }\n const reducer = makeReducer({\n contract: vocabulary,\n // Application checkpoints embed AI state, so they advance with it.\n name:\n app === undefined ? AI_STATE_REDUCER : `${app.name}+${AI_STATE_REDUCER}`,\n initialState: { ...aiState, ...app?.initialState } as AIState<M> & X,\n }).fold((state, event) => {\n const next = reduceAIState(state, event) as AIState<M> & X\n if (app === undefined) return next\n const before = appSlice<X>(state)\n const after = app.fold(before, event as ContractEvent<D>)\n return after === before ? next : withAppSlice(next, after)\n })\n const shared = createContract({\n name: options.name,\n events: vocabulary.events,\n reducer: withAIStorage(\n withReducerRuntime({\n reducer,\n project: projectAIClientState<M> as unknown as (\n state: AIState<M> & X,\n ) => AIState<M> & X,\n }),\n ),\n })\n registerAgentReducer(\n shared.reducer,\n app as unknown as AppReducer<EventDefs, object> | undefined,\n )\n return shared as unknown as AgentContract<M, AIEventDefs<M> & E, X>\n}\n\nexport type {\n FinishReason,\n JSONValue,\n LanguageModelUsage,\n UIMessage,\n UIMessageChunk,\n}\n"],"mappings":"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"}