gemi 0.191.0 → 0.193.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.
- package/dist/ai/Agent.d.ts +16 -1
- package/dist/ai/Agent.d.ts.map +1 -1
- package/dist/ai/AgentController.d.ts +143 -3
- package/dist/ai/AgentController.d.ts.map +1 -1
- package/dist/ai/client/index.d.ts +1 -1
- package/dist/ai/client/index.d.ts.map +1 -1
- package/dist/ai/client/index.js +59 -1
- package/dist/ai/client/index.js.map +1 -1
- package/dist/ai/index.d.ts +3 -3
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +91 -68
- package/dist/ai/index.js.map +5 -5
- package/dist/ai/jobs/AgentJob.d.ts +32 -0
- package/dist/ai/jobs/AgentJob.d.ts.map +1 -1
- package/dist/ai/jobs/index.d.ts +1 -1
- package/dist/ai/jobs/index.d.ts.map +1 -1
- package/dist/ai/store/DatabaseAgentStore.d.ts +66 -3
- package/dist/ai/store/DatabaseAgentStore.d.ts.map +1 -1
- package/dist/ai/store/MemoryAgentStore.d.ts +12 -0
- package/dist/ai/store/MemoryAgentStore.d.ts.map +1 -1
- package/dist/ai/types.d.ts +18 -0
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/ai/useChat.d.ts +15 -0
- package/dist/ai/useChat.d.ts.map +1 -1
- package/dist/app/index.js +1 -1
- package/dist/bun/plugin.js +1 -1
- package/dist/bun/preload.js +1 -1
- package/dist/{chunk-6z3wv71t.js → chunk-0m1a636t.js} +2 -2
- package/dist/{chunk-6z3wv71t.js.map → chunk-0m1a636t.js.map} +1 -1
- package/dist/{chunk-00g20rfa.js → chunk-0mb77yd2.js} +2 -2
- package/dist/{chunk-00g20rfa.js.map → chunk-0mb77yd2.js.map} +1 -1
- package/dist/{chunk-qz6grt61.js → chunk-0p76bhy2.js} +2 -2
- package/dist/{chunk-qz6grt61.js.map → chunk-0p76bhy2.js.map} +1 -1
- package/dist/{chunk-zwj4w4zt.js → chunk-17mdszc3.js} +2 -2
- package/dist/{chunk-zwj4w4zt.js.map → chunk-17mdszc3.js.map} +1 -1
- package/dist/{chunk-yt5n62nj.js → chunk-199nvtrj.js} +2 -2
- package/dist/{chunk-yt5n62nj.js.map → chunk-199nvtrj.js.map} +1 -1
- package/dist/{chunk-w2z4jc4v.js → chunk-1mpwzjxa.js} +3 -3
- package/dist/{chunk-w2z4jc4v.js.map → chunk-1mpwzjxa.js.map} +1 -1
- package/dist/{chunk-dsgjdk94.js → chunk-24jgzc8y.js} +2 -2
- package/dist/{chunk-dsgjdk94.js.map → chunk-24jgzc8y.js.map} +1 -1
- package/dist/{chunk-fgk1e5xe.js → chunk-4s7st9y4.js} +3 -3
- package/dist/{chunk-fgk1e5xe.js.map → chunk-4s7st9y4.js.map} +1 -1
- package/dist/{chunk-epb0qfce.js → chunk-5zx4e2wa.js} +3 -3
- package/dist/{chunk-epb0qfce.js.map → chunk-5zx4e2wa.js.map} +1 -1
- package/dist/{chunk-s5z8qcdv.js → chunk-67ex6nem.js} +3 -3
- package/dist/{chunk-s5z8qcdv.js.map → chunk-67ex6nem.js.map} +1 -1
- package/dist/{chunk-790dx3s7.js → chunk-67zz58cw.js} +2 -2
- package/dist/{chunk-790dx3s7.js.map → chunk-67zz58cw.js.map} +1 -1
- package/dist/{chunk-kcg2znz2.js → chunk-6frbegay.js} +2 -2
- package/dist/{chunk-kcg2znz2.js.map → chunk-6frbegay.js.map} +1 -1
- package/dist/{chunk-0gvw46j0.js → chunk-6n44t4hn.js} +2 -2
- package/dist/{chunk-0gvw46j0.js.map → chunk-6n44t4hn.js.map} +1 -1
- package/dist/{chunk-baknm4tn.js → chunk-6rmz0mkm.js} +2 -2
- package/dist/{chunk-baknm4tn.js.map → chunk-6rmz0mkm.js.map} +1 -1
- package/dist/{chunk-k9f7gww2.js → chunk-6wsmdf51.js} +2 -2
- package/dist/{chunk-k9f7gww2.js.map → chunk-6wsmdf51.js.map} +1 -1
- package/dist/{chunk-6rdr7ne2.js → chunk-7bbtre2j.js} +2 -2
- package/dist/{chunk-6rdr7ne2.js.map → chunk-7bbtre2j.js.map} +1 -1
- package/dist/{chunk-xc2m8qa1.js → chunk-7k43y71n.js} +2 -2
- package/dist/{chunk-xc2m8qa1.js.map → chunk-7k43y71n.js.map} +1 -1
- package/dist/{chunk-er7xemh2.js → chunk-7ynahcy6.js} +2 -2
- package/dist/{chunk-er7xemh2.js.map → chunk-7ynahcy6.js.map} +1 -1
- package/dist/{chunk-7des5zys.js → chunk-7zpjdwfq.js} +3 -3
- package/dist/{chunk-7des5zys.js.map → chunk-7zpjdwfq.js.map} +1 -1
- package/dist/{chunk-yn2av14e.js → chunk-8em2ebj1.js} +2 -2
- package/dist/{chunk-yn2av14e.js.map → chunk-8em2ebj1.js.map} +1 -1
- package/dist/{chunk-nc37phkt.js → chunk-8pfy75y6.js} +3 -3
- package/dist/{chunk-nc37phkt.js.map → chunk-8pfy75y6.js.map} +1 -1
- package/dist/chunk-8ysrmyer.js +24 -0
- package/dist/{chunk-j2twdj8b.js.map → chunk-8ysrmyer.js.map} +3 -3
- package/dist/{chunk-8f8bp75w.js → chunk-8zeky0fj.js} +5 -5
- package/dist/{chunk-8f8bp75w.js.map → chunk-8zeky0fj.js.map} +3 -3
- package/dist/{chunk-khzss89b.js → chunk-9dfrsj4m.js} +2 -2
- package/dist/{chunk-khzss89b.js.map → chunk-9dfrsj4m.js.map} +1 -1
- package/dist/{chunk-fcj0e64h.js → chunk-9hmm8acy.js} +1 -1
- package/dist/{chunk-rp2h86ph.js → chunk-9m04tdzh.js} +1 -1
- package/dist/{chunk-ca76mcea.js → chunk-bd14zwmj.js} +25 -21
- package/dist/{chunk-ca76mcea.js.map → chunk-bd14zwmj.js.map} +4 -4
- package/dist/{chunk-g52hvs5q.js → chunk-bhfwp3gz.js} +2 -2
- package/dist/{chunk-g52hvs5q.js.map → chunk-bhfwp3gz.js.map} +1 -1
- package/dist/{chunk-2adfcfdw.js → chunk-bm7z4vj9.js} +2 -2
- package/dist/{chunk-2adfcfdw.js.map → chunk-bm7z4vj9.js.map} +1 -1
- package/dist/{chunk-e9nmsgnd.js → chunk-c36sbvnz.js} +2 -2
- package/dist/{chunk-e9nmsgnd.js.map → chunk-c36sbvnz.js.map} +1 -1
- package/dist/{chunk-x1ng1dnx.js → chunk-ccx7rt7y.js} +2 -2
- package/dist/{chunk-x1ng1dnx.js.map → chunk-ccx7rt7y.js.map} +1 -1
- package/dist/{chunk-xqzrd7st.js → chunk-ce73s4kh.js} +2 -2
- package/dist/{chunk-xqzrd7st.js.map → chunk-ce73s4kh.js.map} +1 -1
- package/dist/{chunk-3z55zyfe.js → chunk-cx3n8qyr.js} +2 -2
- package/dist/{chunk-3z55zyfe.js.map → chunk-cx3n8qyr.js.map} +1 -1
- package/dist/{chunk-xwa8vtg5.js → chunk-d0khszc9.js} +2 -2
- package/dist/{chunk-xwa8vtg5.js.map → chunk-d0khszc9.js.map} +1 -1
- package/dist/{chunk-frvca65w.js → chunk-efgemgbe.js} +2 -2
- package/dist/{chunk-frvca65w.js.map → chunk-efgemgbe.js.map} +1 -1
- package/dist/{chunk-6tsyk2mr.js → chunk-ejc0mbe3.js} +2 -2
- package/dist/{chunk-6tsyk2mr.js.map → chunk-ejc0mbe3.js.map} +1 -1
- package/dist/{chunk-hv6nbbty.js → chunk-etzd00a8.js} +2 -2
- package/dist/{chunk-hv6nbbty.js.map → chunk-etzd00a8.js.map} +1 -1
- package/dist/{chunk-6a3t825g.js → chunk-f02anz24.js} +2 -2
- package/dist/{chunk-6a3t825g.js.map → chunk-f02anz24.js.map} +1 -1
- package/dist/{chunk-qy678j5z.js → chunk-fbxnxze2.js} +1 -1
- package/dist/{chunk-j16ekp16.js → chunk-freerpzc.js} +1 -1
- package/dist/{chunk-h8knqrc5.js → chunk-fryj3asn.js} +2 -2
- package/dist/{chunk-h8knqrc5.js.map → chunk-fryj3asn.js.map} +1 -1
- package/dist/{chunk-vzzt4kpk.js → chunk-h688s2ba.js} +2 -2
- package/dist/{chunk-vzzt4kpk.js.map → chunk-h688s2ba.js.map} +1 -1
- package/dist/{chunk-bc1k2206.js → chunk-hwq0kk1d.js} +1 -1
- package/dist/{chunk-mvs6brkk.js → chunk-j34ektzj.js} +2 -2
- package/dist/{chunk-mvs6brkk.js.map → chunk-j34ektzj.js.map} +1 -1
- package/dist/{chunk-ds684s0w.js → chunk-jbee3n3p.js} +2 -2
- package/dist/{chunk-ds684s0w.js.map → chunk-jbee3n3p.js.map} +1 -1
- package/dist/{chunk-80kpxp4m.js → chunk-k1c0xd8r.js} +2 -2
- package/dist/{chunk-80kpxp4m.js.map → chunk-k1c0xd8r.js.map} +1 -1
- package/dist/{chunk-tmz3gf96.js → chunk-k8gn0q91.js} +1 -1
- package/dist/{chunk-fq006ypv.js → chunk-m0aq07nj.js} +2 -2
- package/dist/{chunk-fq006ypv.js.map → chunk-m0aq07nj.js.map} +1 -1
- package/dist/{chunk-8p7a2ctj.js → chunk-m3180wkp.js} +2 -2
- package/dist/{chunk-8p7a2ctj.js.map → chunk-m3180wkp.js.map} +1 -1
- package/dist/{chunk-s1wj0ff8.js → chunk-m37vvh99.js} +2 -2
- package/dist/{chunk-s1wj0ff8.js.map → chunk-m37vvh99.js.map} +1 -1
- package/dist/{chunk-mmzf9c2e.js → chunk-m4r8btey.js} +2 -2
- package/dist/{chunk-mmzf9c2e.js.map → chunk-m4r8btey.js.map} +1 -1
- package/dist/{chunk-8mgz2na4.js → chunk-mdrsec0r.js} +2 -2
- package/dist/{chunk-8mgz2na4.js.map → chunk-mdrsec0r.js.map} +1 -1
- package/dist/{chunk-t6ng9yxp.js → chunk-p00rd4ja.js} +2 -2
- package/dist/{chunk-t6ng9yxp.js.map → chunk-p00rd4ja.js.map} +1 -1
- package/dist/{chunk-rf4a3tnm.js → chunk-qfb6r3cq.js} +3 -3
- package/dist/{chunk-rf4a3tnm.js.map → chunk-qfb6r3cq.js.map} +1 -1
- package/dist/{chunk-mqvyhqa6.js → chunk-r7vnxqck.js} +2 -2
- package/dist/{chunk-mqvyhqa6.js.map → chunk-r7vnxqck.js.map} +1 -1
- package/dist/{chunk-bwmyd47e.js → chunk-rf9c6e49.js} +2 -2
- package/dist/{chunk-bwmyd47e.js.map → chunk-rf9c6e49.js.map} +1 -1
- package/dist/{chunk-1987f978.js → chunk-ryfty6mj.js} +3 -3
- package/dist/{chunk-1987f978.js.map → chunk-ryfty6mj.js.map} +1 -1
- package/dist/{chunk-6bhscseq.js → chunk-sqev442x.js} +4 -4
- package/dist/{chunk-6bhscseq.js.map → chunk-sqev442x.js.map} +1 -1
- package/dist/{chunk-npd1501w.js → chunk-t86nc1jd.js} +2 -2
- package/dist/{chunk-npd1501w.js.map → chunk-t86nc1jd.js.map} +1 -1
- package/dist/{chunk-qp1nzdjc.js → chunk-thq8tc9x.js} +3 -3
- package/dist/{chunk-qp1nzdjc.js.map → chunk-thq8tc9x.js.map} +1 -1
- package/dist/{chunk-cbw4676x.js → chunk-tngf3h1g.js} +2 -2
- package/dist/{chunk-cbw4676x.js.map → chunk-tngf3h1g.js.map} +1 -1
- package/dist/{chunk-n415vvxw.js → chunk-tt5qk0xt.js} +2 -2
- package/dist/{chunk-n415vvxw.js.map → chunk-tt5qk0xt.js.map} +1 -1
- package/dist/{chunk-b35mk5rd.js → chunk-tvsjq0my.js} +2 -2
- package/dist/{chunk-b35mk5rd.js.map → chunk-tvsjq0my.js.map} +1 -1
- package/dist/{chunk-2k948anx.js → chunk-vr48swd0.js} +2 -2
- package/dist/{chunk-2k948anx.js.map → chunk-vr48swd0.js.map} +1 -1
- package/dist/{chunk-sz0avnch.js → chunk-wa1xmvgr.js} +2 -2
- package/dist/{chunk-sz0avnch.js.map → chunk-wa1xmvgr.js.map} +1 -1
- package/dist/chunk-waq4kj7n.js +5 -0
- package/dist/{chunk-qv3y19h5.js.map → chunk-waq4kj7n.js.map} +1 -1
- package/dist/{chunk-8b897pc1.js → chunk-xsx69765.js} +2 -2
- package/dist/{chunk-8b897pc1.js.map → chunk-xsx69765.js.map} +1 -1
- package/dist/{chunk-eqnrk0p8.js → chunk-xwz5fmwy.js} +2 -2
- package/dist/{chunk-eqnrk0p8.js.map → chunk-xwz5fmwy.js.map} +1 -1
- package/dist/{chunk-ct2kqpv5.js → chunk-xzz6ps4z.js} +2 -2
- package/dist/{chunk-ct2kqpv5.js.map → chunk-xzz6ps4z.js.map} +1 -1
- package/dist/{chunk-s91xa67z.js → chunk-y67rmd3y.js} +2 -2
- package/dist/{chunk-s91xa67z.js.map → chunk-y67rmd3y.js.map} +1 -1
- package/dist/{chunk-1e7pnsx2.js → chunk-z1aeh05w.js} +3 -3
- package/dist/{chunk-1e7pnsx2.js.map → chunk-z1aeh05w.js.map} +1 -1
- package/dist/{chunk-070cacy8.js → chunk-z7mbhc68.js} +2 -2
- package/dist/{chunk-070cacy8.js.map → chunk-z7mbhc68.js.map} +1 -1
- package/dist/{chunk-pjjwbs2f.js → chunk-z8dxdqzm.js} +2 -2
- package/dist/{chunk-pjjwbs2f.js.map → chunk-z8dxdqzm.js.map} +1 -1
- package/dist/{chunk-9q5g3a9t.js → chunk-z9pq557m.js} +2 -2
- package/dist/{chunk-9q5g3a9t.js.map → chunk-z9pq557m.js.map} +1 -1
- package/dist/{chunk-dhwxcedm.js → chunk-zcrhagx5.js} +2 -2
- package/dist/{chunk-dhwxcedm.js.map → chunk-zcrhagx5.js.map} +1 -1
- package/dist/chunks/{RealtimeClient-CyGWZr6p.js → RealtimeClient-bPI28SVg.js} +2 -2
- package/dist/chunks/{RealtimeClient-CyGWZr6p.js.map → RealtimeClient-bPI28SVg.js.map} +1 -1
- package/dist/chunks/{ThemeProvider-BnmnRvEc.js → ThemeProvider-BstCYMfV.js} +104 -32
- package/dist/chunks/{ThemeProvider-BnmnRvEc.js.map → ThemeProvider-BstCYMfV.js.map} +1 -1
- package/dist/chunks/{fetchFileRequest-D4fAcY7D.js → fetchFileRequest-BD9pg9RL.js} +2 -2
- package/dist/chunks/{fetchFileRequest-D4fAcY7D.js.map → fetchFileRequest-BD9pg9RL.js.map} +1 -1
- package/dist/chunks/{live-B4RW02g2.js → live-DYLCi077.js} +3 -3
- package/dist/chunks/{live-B4RW02g2.js.map → live-DYLCi077.js.map} +1 -1
- package/dist/chunks/{mutationExtras-DgdYjcaa.js → mutationExtras-Bo8pvlEx.js} +2 -2
- package/dist/chunks/{mutationExtras-DgdYjcaa.js.map → mutationExtras-Bo8pvlEx.js.map} +1 -1
- package/dist/chunks/{subscriptionStream-Ca5V54ee.js → subscriptionStream-CtwEcda9.js} +2 -2
- package/dist/chunks/{subscriptionStream-Ca5V54ee.js.map → subscriptionStream-CtwEcda9.js.map} +1 -1
- package/dist/client/chunkLoadRecovery.d.ts +39 -5
- package/dist/client/chunkLoadRecovery.d.ts.map +1 -1
- package/dist/client/index.js +4 -4
- package/dist/config/index.js +1 -1
- package/dist/console/run.js +2 -2
- package/dist/console/run.js.map +1 -1
- package/dist/container/index.js +2 -2
- package/dist/container/index.js.map +1 -1
- package/dist/database/index.js +2 -2
- package/dist/database/index.js.map +1 -1
- package/dist/email/index.js +2 -2
- package/dist/email/index.js.map +1 -1
- package/dist/facades/index.js +1 -1
- package/dist/foundation/index.js +2 -2
- package/dist/foundation/index.js.map +1 -1
- package/dist/http/ApiRouter.d.ts +1 -0
- package/dist/http/ApiRouter.d.ts.map +1 -1
- package/dist/http/index.js +2 -2
- package/dist/http/index.js.map +1 -1
- package/dist/i18n/dictionaryRuntime.js +2 -2
- package/dist/i18n/dictionaryRuntime.js.map +1 -1
- package/dist/i18n/index.js +2 -2
- package/dist/i18n/index.js.map +1 -1
- package/dist/kernel/index.js +2 -2
- package/dist/kernel/index.js.map +1 -1
- package/dist/orm/index.js +2 -2
- package/dist/orm/index.js.map +1 -1
- package/dist/probe/index.js +2 -2
- package/dist/probe/index.js.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/services/index.js +2 -2
- package/dist/services/index.js.map +1 -1
- package/dist/services/queue/work.js +2 -2
- package/dist/services/queue/work.js.map +1 -1
- package/dist/stats/route-table.js +1 -1
- package/dist/support/index.js +2 -2
- package/dist/support/index.js.map +1 -1
- package/dist/testing/index.js +2 -2
- package/dist/vitest/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-j2twdj8b.js +0 -24
- package/dist/chunk-qv3y19h5.js +0 -5
- /package/dist/{chunk-fcj0e64h.js.map → chunk-9hmm8acy.js.map} +0 -0
- /package/dist/{chunk-rp2h86ph.js.map → chunk-9m04tdzh.js.map} +0 -0
- /package/dist/{chunk-qy678j5z.js.map → chunk-fbxnxze2.js.map} +0 -0
- /package/dist/{chunk-j16ekp16.js.map → chunk-freerpzc.js.map} +0 -0
- /package/dist/{chunk-bc1k2206.js.map → chunk-hwq0kk1d.js.map} +0 -0
- /package/dist/{chunk-tmz3gf96.js.map → chunk-k8gn0q91.js.map} +0 -0
package/dist/ai/index.js.map
CHANGED
|
@@ -28,17 +28,17 @@
|
|
|
28
28
|
"import type { AgentTurn, AgentTurnParams } from \"./AgentController\";\nimport type { RealtimeClient, RealtimeSession, RealtimeTool } from \"./providers/realtime\";\nimport type { RealtimeEvent, RealtimeSideband } from \"./providers/sideband\";\nimport { addUsage, emptyUsage } from \"./runtime\";\nimport type {\n AgentStreamEvent,\n ClientToolResult,\n ClientTurn,\n PendingToolCall,\n Usage,\n} from \"./types\";\nimport { ToolError } from \"./redact\";\nimport type { VoiceToolHandler } from \"./voiceMcp\";\nimport type { VoiceSessionStore } from \"./voiceStore\";\nimport type { VoiceEndReason } from \"./voice/wire\";\n\n/**\n * A voice front for an `AgentController` (#921).\n *\n * @experimental Not yet verified against a live Azure or OpenAI call; names and\n * behaviour may change in a minor release.\n *\n * THE SHAPE. A realtime voice model talks to the user; the agent the app\n * already has does the work. The voice model gets one delegate tool\n * (`ask_agent({ request })` by default) and three small ones (`stop_work`,\n * `work_status`, `answer_question`). This class runs on the call's sideband,\n * where those function calls arrive, and turns a delegated request into\n * `controller.startTurn(...)` — so the work goes through the controller's\n * `authorizeRequest`, `runOwner`, `context()`, limits, hooks, tools and store,\n * exactly like a typed message, and lands on the same thread the chat shows.\n *\n * WHY NOT GIVE THE VOICE MODEL THE AGENT'S TOOLS. A real agent has dozens of\n * tools, deferred namespaces and prompts tuned for its own model; a realtime\n * model is weaker at long tool chains and re-bills every tool schema on every\n * response; and real work takes minutes, which a voice cannot block on.\n * Delegation keeps one source of truth for what the agent can do.\n *\n * WHAT IT DOES WHILE A TURN RUNS:\n *\n * - The turn's tool calls (or the app's `progress` summary of its events) go\n * into the voice conversation as quiet notes, at most one per\n * `progressIntervalMs`, so the voice can say where the work is when asked.\n * - When the turn ends, its text goes back as the delegate call's\n * `function_call_output`, and the voice is asked to respond, so it speaks the\n * outcome. A turn that ends `awaiting-input` hands its questions to the voice;\n * the spoken answer comes back through `answer_question` as\n * `startTurn({ turn: { toolResults } })`.\n * - One turn at a time. A second request is queued (up to `maxQueued`) and\n * answered at once with `queued`, so the voice can say \"after this one\"; a run\n * already going on the thread (a typed message) is waited for, and looked\n * for again right before `startTurn`. `liveRuns` is per process, so a run on\n * another instance is not seen, and a typed message that starts in the\n * instant between that last look and `startTurn` is superseded, as two typed\n * messages would be.\n * - Delegated turns run as the `user` captured when the call started, for the\n * whole call. A sign-out mid-call is seen only when `authorizeRequest`\n * refuses a turn.\n * - Barge-in stays the vendor's (server VAD cancels the spoken response) and\n * never stops the work. Only `stop_work` does.\n *\n * Ending the call does not stop a running turn: the turn is the thread's, and\n * the chat shows how it ends.\n */\n\n// --- public types ----------------------------------------------------------\n\n/** What the bridge needs of a controller: its `startTurn`. Pass the class. */\nexport type VoiceTurnController<Body extends object> = {\n startTurn(params: AgentTurnParams<Body>): Promise<AgentTurn>;\n};\n\n/** Where the bridge looks for a run already going on the thread. An\n * `AgentController`'s `liveRuns`. */\nexport type VoiceLiveRuns = {\n find(params: { threadId: string }): Promise<{ runId: string } | null>;\n get(runId: string): { result(): Promise<unknown> } | null;\n};\n\nexport type VoiceLimits = {\n /** The call is ended after this long. Default 15 minutes. */\n maxDurationMs?: number;\n /** Ended after this long with nobody speaking and no work running.\n * Default 2 minutes. */\n idleTimeoutMs?: number;\n /** Requests waiting behind the running one. Default 3. */\n maxQueued?: number;\n /** At most one progress note per this long. Default 4 seconds. */\n progressIntervalMs?: number;\n /** How long a closing line may play before the call is hung up. Default 10 s. */\n closingLineMs?: number;\n /** How often `onTick` is called. Default one minute. */\n tickMs?: number;\n /** When the vendor refuses the hangup, how long the sideband is kept open\n * (still metering) waiting for the vendor to end the call. Default 30 s. */\n hangupGraceMs?: number;\n /** A `tools` / MCP call's timeout. Default 60 s. */\n toolTimeoutMs?: number;\n /** `tools` / MCP calls allowed per rolling minute; more are answered\n * `busy`. Default 20. */\n maxToolCallsPerMinute?: number;\n /** A tool's output is cut to this many characters of JSON before the voice\n * model sees it: every character is billed again on each response.\n * Default 8000. */\n toolOutputChars?: number;\n};\n\n/** Lines the voice says before the bridge hangs up. `null` hangs up silently. */\nexport type VoiceLines = {\n maxDuration?: string | null;\n idle?: string | null;\n error?: string | null;\n};\n\nexport type VoiceDelegate = {\n /** The delegate tool's name. Default `ask_agent`. */\n name?: string;\n /** What the voice model is told the tool does. */\n description?: string;\n};\n\nexport type VoiceUsageInfo = {\n sessionId: string;\n /** Usage so far, this response included. */\n total: Usage;\n /** Since the bridge started. */\n elapsedMs: number;\n /** Transcription so far: billed apart from `total`, at the transcription\n * model's rates. */\n transcription: VoiceTranscriptionUsage;\n};\n\n/** Input transcription's usage: tokens for a token-billed model, seconds for a\n * duration-billed one. */\nexport type VoiceTranscriptionUsage = { usage: Usage; seconds: number };\n\nexport type VoiceTranscriptLine = { role: \"user\" | \"assistant\"; text: string; at: number };\n\n/** One `tools` / MCP call and how it went. */\nexport type VoiceToolCallRecord = {\n name: string;\n status: \"running\" | \"done\" | \"failed\" | \"refused\" | \"busy\";\n durationMs?: number;\n /** For `failed` / `refused`: what the model was told. */\n message?: string;\n};\n\n/** One delegated request and how it went. */\nexport type VoiceRequestRecord = {\n request: string;\n status: \"queued\" | \"running\" | \"done\" | \"refused\" | \"dropped\";\n runId?: string;\n finishReason?: string;\n};\n\nexport type VoiceSummary = {\n sessionId: string;\n callId?: string;\n threadId: string;\n reason: VoiceEndReason;\n startedAt: number;\n endedAt: number;\n durationMs: number;\n /** Whole seconds, rounded up: what a per-second or per-minute price reads. */\n seconds: number;\n /** The voice model's responses (`response.done`). */\n usage: Usage;\n /** Input transcription, billed separately from `usage`. */\n transcription: VoiceTranscriptionUsage;\n /** What was said, from the vendor's transcripts. The app decides what to keep. */\n transcript: VoiceTranscriptLine[];\n requests: VoiceRequestRecord[];\n /** Each `tools` / MCP call. */\n toolCalls: VoiceToolCallRecord[];\n /** `error` events the vendor sent, in order. */\n errors: { code?: string; message: string }[];\n};\n\n/**\n * Thrown from `onUsage` or `onTick` to end the call: out of credits, a daily\n * cap. `line` is said first (\"You're out of credits; buy a pack to keep\n * talking.\"), then the call is hung up with reason `usage`.\n */\nexport class VoiceHangup extends Error {\n readonly line?: string;\n\n constructor(line?: string) {\n super(line ?? \"Voice session ended by the app.\");\n this.name = \"VoiceHangup\";\n this.line = line;\n }\n}\n\nexport type VoiceBridgeParams<Body extends object = Record<string, unknown>> = {\n controller: VoiceTurnController<Body>;\n threadId: string;\n /** Who delegated turns run as: `startTurn`'s `user`. */\n user?: unknown;\n body?: Body;\n /** The call: a provider's realtime client and the call id, or a sideband\n * already open (tests, or an app that opened its own). */\n call:\n | { realtime: RealtimeClient; callId: string }\n | { sideband: RealtimeSideband; callId?: string };\n /** Default: a random id. The `VoiceSessionRecord`'s id when there is a store. */\n sessionId?: string;\n /** When set, the latest `body` is read from here before every delegated\n * turn, and the end is recorded. */\n store?: VoiceSessionStore;\n /** Runs already going on the thread are waited for. An `AgentController`'s\n * `liveRuns`. */\n liveRuns?: VoiceLiveRuns;\n delegate?: VoiceDelegate;\n limits?: VoiceLimits;\n lines?: VoiceLines;\n /** The session the call was created with. A `session.updated` whose\n * instructions or tool names differ from it ends the call (a client can send\n * `session.update` on the data channel). */\n session?: RealtimeSession;\n /** A one-line summary of a run event for a progress note, or nothing. The\n * default names each tool call and reads a string (or `message`) a tool\n * yields. */\n progress?: (event: AgentStreamEvent) => string | null | undefined;\n /** A note for the voice when `setBody` changes the body (\"The user selected\n * the hero section.\"). */\n contextNote?: (body: Body) => string | null | undefined;\n /** After each response, with its usage. Throw `VoiceHangup` to end the call.\n * Hooks run in order, off the event loop: a slow one does not delay the\n * call's tool handling. */\n onUsage?: (usage: Usage, info: VoiceUsageInfo) => void | Promise<void>;\n /** After each transcribed utterance, with its usage (`usage` for a\n * token-billed model, `seconds` for a duration-billed one). Throw\n * `VoiceHangup` to end the call. */\n onTranscriptionUsage?: (\n usage: { usage?: Usage; seconds?: number },\n info: VoiceUsageInfo,\n ) => void | Promise<void>;\n /** Every `tickMs`, for time-based metering. Throw `VoiceHangup` to end the call. */\n onTick?: (info: VoiceUsageInfo) => void | Promise<void>;\n /** Once, when the call has ended. */\n onEnd?: (summary: VoiceSummary) => void | Promise<void>;\n /** Every sideband event, for logs. */\n onEvent?: (event: RealtimeEvent) => void;\n /**\n * Tools the bridge runs in this process when the voice calls them, beside\n * the delegate: the app's MCP tools (`mcpVoiceTools`), or its own. Their\n * definitions must also be in the session's `tools` (`this.voice()` adds\n * them).\n */\n tools?: VoiceToolHandler[];\n /** After each `tools` call, in the same hook chain as `onUsage`. Throw\n * `VoiceHangup` to end the call. */\n onToolCall?: (call: VoiceToolCallRecord, info: VoiceUsageInfo) => void | Promise<void>;\n};\n\nexport const DEFAULT_DELEGATE_NAME = \"ask_agent\";\n\nconst DEFAULT_LIMITS = {\n maxDurationMs: 15 * 60_000,\n idleTimeoutMs: 2 * 60_000,\n maxQueued: 3,\n progressIntervalMs: 4_000,\n closingLineMs: 10_000,\n tickMs: 60_000,\n hangupGraceMs: 30_000,\n toolTimeoutMs: 60_000,\n maxToolCallsPerMinute: 20,\n toolOutputChars: 8_000,\n} satisfies Required<VoiceLimits>;\n\nconst DEFAULT_LINES = {\n maxDuration:\n \"We've reached the time limit for this voice session. Tap the microphone to start again.\",\n idle: \"It's gone quiet, so I'll hang up. Tap the microphone when you want to talk again.\",\n error: null,\n} satisfies Required<VoiceLines>;\n\n/**\n * The tools the voice model is given, for its session. `createCall` needs them\n * in `session.tools`; `this.voice()` adds them itself.\n */\nexport function voiceTools(delegate: VoiceDelegate = {}): RealtimeTool[] {\n return [\n {\n name: delegate.name ?? DEFAULT_DELEGATE_NAME,\n description:\n delegate.description ??\n \"Hand one self-contained request to the agent that does the work, in the user's own words with references resolved. It can take minutes; the result comes back when it is done, so tell the user you are on it.\",\n parameters: {\n type: \"object\",\n properties: { request: { type: \"string\", description: \"What the user wants done.\" } },\n required: [\"request\"],\n additionalProperties: false,\n },\n },\n {\n name: \"stop_work\",\n description: \"Stop the work that is running, and drop any requests waiting behind it.\",\n parameters: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"work_status\",\n description: \"What the agent is doing right now, and what is waiting.\",\n parameters: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"answer_question\",\n description:\n \"Answer the question the agent asked (it came back from a request with status needs_input). For an approval, set approve.\",\n parameters: {\n type: \"object\",\n properties: {\n answer: { type: \"string\", description: \"The user's answer, in their words.\" },\n approve: { type: \"boolean\", description: \"For an approval: whether the user approved.\" },\n },\n required: [\"answer\"],\n additionalProperties: false,\n },\n },\n ];\n}\n\n// --- the bridge ------------------------------------------------------------\n\ntype Job = {\n record: VoiceRequestRecord;\n turn: ClientTurn;\n /** The function call to answer when the job ends; `undefined` once answered. */\n callId?: string;\n handle?: AgentTurn;\n /** `stop_work` arrived before the turn started: it is not started. */\n stopRequested?: boolean;\n};\n\n/** Live bridges in this process, by session id. */\nconst live = new Map<string, VoiceBridge<any>>();\n\nexport class VoiceBridge<Body extends object = Record<string, unknown>> {\n readonly sessionId: string;\n readonly threadId: string;\n readonly callId?: string;\n /** Resolves with the summary once the call has ended and `onEnd` has run. */\n readonly ended: Promise<VoiceSummary>;\n\n private readonly params: VoiceBridgeParams<Body>;\n private readonly sideband: RealtimeSideband;\n private readonly hangupCall: () => Promise<void>;\n private readonly limits: Required<VoiceLimits>;\n private readonly lines: Required<VoiceLines>;\n private readonly delegateName: string;\n private readonly startedAt = Date.now();\n\n private body: Body;\n private usage: Usage = emptyUsage();\n private transcription: VoiceTranscriptionUsage = { usage: emptyUsage(), seconds: 0 };\n /** Hooks run one after another, off the event loop. */\n private hooks: Promise<void> = Promise.resolve();\n /** The `event_id` of the bridge's own `response.create` not yet answered. */\n private pendingCreate?: string;\n private transcript: VoiceTranscriptLine[] = [];\n private requests: VoiceRequestRecord[] = [];\n private toolCalls: VoiceToolCallRecord[] = [];\n private toolHandlers = new Map<string, VoiceToolHandler>();\n private toolsRunning = 0;\n private toolCallTimes: number[] = [];\n private errors: VoiceSummary[\"errors\"] = [];\n private running?: Job;\n private queue: Job[] = [];\n private pending: PendingToolCall[] = [];\n private lastProgress?: string;\n private lastNoteAt = 0;\n private noteTimer?: ReturnType<typeof setTimeout>;\n private responseActive = false;\n private responseWanted = false;\n private ending?: Promise<VoiceSummary>;\n private timers: ReturnType<typeof setTimeout>[] = [];\n private idleTimer?: ReturnType<typeof setTimeout>;\n private tickTimer?: ReturnType<typeof setInterval>;\n private resolveEnded!: (summary: VoiceSummary) => void;\n private closingWaiter?: (event: RealtimeEvent) => void;\n\n /** Starts the bridge on a call that has been created. */\n static start<Body extends object>(params: VoiceBridgeParams<Body>): VoiceBridge<Body> {\n return new VoiceBridge(params);\n }\n\n /** A bridge running in this process, by session id. */\n static get(sessionId: string): VoiceBridge<any> | undefined {\n return live.get(sessionId);\n }\n\n /** Ends every call this process holds, e.g. on shutdown, with an optional\n * line (\"Voice paused, tap to resume.\"). */\n static async endAll(line?: string | null): Promise<void> {\n await Promise.all([...live.values()].map((bridge) => bridge.end(\"hangup\", line)));\n }\n\n private constructor(params: VoiceBridgeParams<Body>) {\n this.params = params;\n this.sessionId = params.sessionId ?? crypto.randomUUID();\n this.threadId = params.threadId;\n this.body = (params.body ?? {}) as Body;\n this.limits = { ...DEFAULT_LIMITS, ...definedOnly(params.limits) };\n this.lines = { ...DEFAULT_LINES, ...definedOnly(params.lines) };\n this.delegateName = params.delegate?.name ?? DEFAULT_DELEGATE_NAME;\n const reserved = new Set(voiceTools(params.delegate).map((tool) => tool.name));\n for (const handler of params.tools ?? []) {\n if (reserved.has(handler.tool.name) || this.toolHandlers.has(handler.tool.name)) {\n throw new Error(`VoiceBridge: two tools are named \"${handler.tool.name}\".`);\n }\n this.toolHandlers.set(handler.tool.name, handler);\n }\n\n if (\"realtime\" in params.call) {\n const { realtime, callId } = params.call;\n this.callId = callId;\n this.sideband = realtime.sideband(callId);\n this.hangupCall = () => this.sideband.hangup();\n } else {\n this.callId = params.call.callId ?? params.call.sideband.callId;\n this.sideband = params.call.sideband;\n this.hangupCall = () => this.sideband.hangup();\n }\n\n this.ended = new Promise((resolve) => (this.resolveEnded = resolve));\n live.set(this.sessionId, this);\n\n this.timers.push(\n setTimeout(\n () => void this.end(\"max_duration\", this.lines.maxDuration),\n this.limits.maxDurationMs,\n ),\n );\n this.tickTimer = setInterval(() => void this.tick(), this.limits.tickMs);\n this.touch();\n void this.listen();\n }\n\n // --- the app's handles ----------------------------------------------------\n\n /** The body delegated turns get from now on. Says `contextNote`'s line to\n * the voice when there is one. */\n setBody(body: Body): void {\n this.body = body;\n const note = this.params.contextNote?.(body);\n if (note) this.sideband.addNote(note);\n }\n\n /** Ends the call: says `line` first when given, then hangs up. */\n end(reason: VoiceEndReason = \"hangup\", line?: string | null): Promise<VoiceSummary> {\n return (this.ending ??= this.finish(reason, line ?? null));\n }\n\n // --- events ---------------------------------------------------------------\n\n private async listen(): Promise<void> {\n for await (const event of this.sideband) {\n try {\n this.params.onEvent?.(event);\n } catch {\n // A logger's bug must not end the call.\n }\n this.closingWaiter?.(event);\n await this.handle(event);\n }\n }\n\n private async handle(event: RealtimeEvent): Promise<void> {\n switch (event.type) {\n case \"input_audio_buffer.speech_started\":\n this.touch();\n return;\n case \"response.created\":\n this.responseActive = true;\n this.pendingCreate = undefined;\n this.touch();\n return;\n case \"response.done\": {\n this.responseActive = false;\n if (this.responseWanted && !this.ending) {\n this.responseWanted = false;\n this.createResponse();\n }\n const usage = (event as { usage?: Usage }).usage;\n if (usage) {\n this.usage = addUsage(this.usage, usage);\n const info = this.info();\n this.hook(() => this.params.onUsage?.(usage, info));\n }\n return;\n }\n case \"conversation.item.input_audio_transcription.completed\": {\n const done = event as {\n transcript?: unknown;\n transcriptionUsage?: Usage;\n transcriptionSeconds?: number;\n };\n this.say(\"user\", String(done.transcript ?? \"\"));\n if (done.transcriptionUsage || done.transcriptionSeconds !== undefined) {\n this.transcription = {\n usage: done.transcriptionUsage\n ? addUsage(this.transcription.usage, done.transcriptionUsage)\n : this.transcription.usage,\n seconds: this.transcription.seconds + (done.transcriptionSeconds ?? 0),\n };\n const info = this.info();\n const usage = {\n ...(done.transcriptionUsage ? { usage: done.transcriptionUsage } : {}),\n ...(done.transcriptionSeconds !== undefined\n ? { seconds: done.transcriptionSeconds }\n : {}),\n };\n this.hook(() => this.params.onTranscriptionUsage?.(usage, info));\n }\n return;\n }\n case \"response.output_audio_transcript.done\":\n this.say(\"assistant\", String((event as { transcript?: unknown }).transcript ?? \"\"));\n return;\n case \"response.output_text.done\":\n this.say(\"assistant\", String((event as { text?: unknown }).text ?? \"\"));\n return;\n case \"response.function_call_arguments.done\": {\n const call = event as { call_id: string; name: string; arguments: string };\n this.touch();\n if (!this.ending) this.call(call.call_id, call.name, call.arguments);\n return;\n }\n case \"session.updated\":\n if (this.tampered((event as { session?: Record<string, any> }).session)) {\n void this.end(\"session_tampered\", null);\n }\n return;\n case \"error\": {\n const error = (event as { error?: { code?: string; message?: string; event_id?: string } })\n .error;\n this.errors.push({ code: error?.code, message: String(error?.message ?? \"\") });\n // The vendor refused the bridge's own `response.create`: no response\n // will start, so stop waiting for one — or, when one is already\n // running, ask again once it is done.\n if (this.pendingCreate && error?.event_id === this.pendingCreate) {\n this.pendingCreate = undefined;\n if (error.code === \"conversation_already_has_active_response\") {\n this.responseActive = true;\n this.responseWanted = true;\n } else {\n this.responseActive = false;\n }\n }\n return;\n }\n case \"sideband.closed\": {\n const closed = event as { code: number; byClient: boolean };\n if (!this.ending && !closed.byClient) {\n void this.end(closed.code === 1000 ? \"call_ended\" : \"sideband_lost\", null);\n }\n return;\n }\n }\n }\n\n private say(role: \"user\" | \"assistant\", text: string): void {\n if (text.trim()) this.transcript.push({ role, text, at: Date.now() });\n }\n\n // --- the tools ------------------------------------------------------------\n\n private call(callId: string, name: string, rawArgs: string): void {\n const args = parseArgs(rawArgs);\n if (name === this.delegateName) {\n const request = typeof args.request === \"string\" ? args.request.trim() : \"\";\n if (!request)\n return this.answer(callId, { status: \"error\", message: \"The request was empty.\" });\n return this.enqueue({\n record: { request, status: \"queued\" },\n turn: { text: request },\n callId,\n });\n }\n const handler = this.toolHandlers.get(name);\n if (handler) return void this.runTool(callId, handler, args);\n switch (name) {\n case \"stop_work\": {\n const running = this.running;\n if (running) {\n running.stopRequested = true;\n running.handle?.stop({ reason: \"Stopped by voice.\" });\n }\n const dropped = this.dropQueue();\n return this.answer(callId, { stopped: Boolean(running), dropped });\n }\n case \"work_status\":\n return this.answer(callId, {\n running: this.running\n ? { request: this.running.record.request, step: this.lastProgress ?? \"starting\" }\n : null,\n queued: this.queue.map((job) => job.record.request),\n ...(this.pending.length ? { needsInput: this.questions() } : {}),\n });\n case \"answer_question\": {\n if (!this.pending.length) {\n return this.answer(callId, { status: \"error\", message: \"There is no open question.\" });\n }\n const answer = typeof args.answer === \"string\" ? args.answer : \"\";\n const approve = typeof args.approve === \"boolean\" ? args.approve : undefined;\n const toolResults = this.pending.map((call) => toolResult(call, answer, approve));\n this.pending = [];\n return this.enqueue({\n record: { request: `(answer) ${answer}`, status: \"queued\" },\n turn: { toolResults },\n callId,\n });\n }\n default:\n return this.answer(callId, {\n status: \"error\",\n message: `There is no tool called ${name}.`,\n });\n }\n }\n\n private enqueue(job: Job): void {\n if (!this.running) {\n this.requests.push(job.record);\n void this.run(job);\n return;\n }\n if (this.queue.length >= this.limits.maxQueued) {\n return this.answer(job.callId!, {\n status: \"busy\",\n message: \"Too many requests are waiting. Ask the user to wait for the current one.\",\n });\n }\n this.requests.push(job.record);\n this.queue.push(job);\n this.answer(job.callId!, {\n status: \"queued\",\n position: this.queue.length,\n message: \"It will start when the current request is done.\",\n });\n job.callId = undefined;\n }\n\n private async run(job: Job): Promise<void> {\n this.running = job;\n job.record.status = \"running\";\n this.lastProgress = undefined;\n this.pauseIdle();\n try {\n const waited = new Set<string>();\n await this.waitForThread(waited);\n const body = await this.latestBody();\n // Looked for again: a typed message may have started while the body was\n // read. The window left is the one `find` takes.\n while (!job.stopRequested && (await this.waitForThread(waited))) {\n // waited for one more\n }\n if (job.stopRequested || this.ending) {\n job.record.status = \"dropped\";\n this.complete(job, { status: \"stopped\" });\n return;\n }\n let turn: AgentTurn;\n try {\n turn = await this.params.controller.startTurn({\n threadId: this.threadId,\n user: this.params.user,\n body,\n turn: job.turn,\n });\n } catch (error) {\n job.record.status = \"refused\";\n this.complete(job, {\n status: \"refused\",\n message: error instanceof Error ? error.message : \"The request could not be started.\",\n });\n return;\n }\n job.handle = turn;\n job.record.runId = turn.runId;\n void this.follow(turn);\n const result = await turn.result();\n job.record.status = \"done\";\n job.record.finishReason = result.finishReason;\n if (result.finishReason === \"awaiting-input\" && result.pending.length) {\n this.pending = result.pending;\n this.complete(job, {\n status: \"needs_input\",\n text: result.text,\n questions: this.questions(),\n });\n } else if (result.finishReason === \"error\") {\n this.complete(job, {\n status: \"failed\",\n message: result.error?.message ?? \"The work failed.\",\n });\n } else if (result.finishReason === \"aborted\") {\n this.complete(job, { status: \"stopped\", text: result.text });\n } else {\n this.complete(job, { status: \"done\", text: result.text });\n }\n } catch (error) {\n job.record.status = \"done\";\n this.complete(job, {\n status: \"failed\",\n message: error instanceof Error ? error.message : \"The work failed.\",\n });\n } finally {\n this.running = undefined;\n this.flushNote();\n const next = this.queue.shift();\n if (next && !this.ending) void this.run(next);\n else this.touch();\n }\n }\n\n /**\n * A `tools` / MCP call. It runs beside the voice (the event loop goes on),\n * under the per-minute limit and its timeout, and its output goes back as\n * the call's `function_call_output`. A failure's message reaches the model\n * only when it is a `ToolError`'s.\n */\n private async runTool(\n callId: string,\n handler: VoiceToolHandler,\n args: Record<string, unknown>,\n ): Promise<void> {\n const name = handler.tool.name;\n const now = Date.now();\n this.toolCallTimes = this.toolCallTimes.filter((at) => now - at < 60_000);\n if (this.toolCallTimes.length >= this.limits.maxToolCallsPerMinute) {\n const record: VoiceToolCallRecord = { name, status: \"busy\" };\n this.toolCalls.push(record);\n this.answer(callId, {\n status: \"busy\",\n message: \"Too many tool calls in the last minute. Tell the user to wait a moment.\",\n });\n return;\n }\n this.toolCallTimes.push(now);\n\n const record: VoiceToolCallRecord = { name, status: \"running\" };\n this.toolCalls.push(record);\n this.toolsRunning += 1;\n this.pauseIdle();\n const abort = new AbortController();\n const timeoutMs = handler.timeoutMs ?? this.limits.toolTimeoutMs;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let payload: Record<string, unknown>;\n try {\n const output = await Promise.race([\n handler.run(args, { sessionId: this.sessionId, signal: abort.signal }),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n // The refusal first: a tool that answers its abort must not win the race.\n reject(new ToolError(`\"${name}\" took longer than ${Math.round(timeoutMs / 1000)} s.`));\n abort.abort();\n }, timeoutMs);\n }),\n ]);\n record.status = \"done\";\n payload = { status: \"done\", output: this.clip(output) };\n } catch (error) {\n if (error instanceof VoiceHangup) {\n record.status = \"refused\";\n record.message = error.message;\n void this.end(\"usage\", error.line ?? null);\n return;\n }\n const message = error instanceof ToolError ? error.message : \"The tool failed.\";\n if (!(error instanceof ToolError)) {\n console.error(`[gemi/ai] the voice tool \"${name}\" threw.`, error);\n }\n record.status = \"failed\";\n record.message = message;\n payload = { status: \"failed\", message };\n } finally {\n clearTimeout(timer);\n record.durationMs = Date.now() - now;\n this.toolsRunning -= 1;\n this.touch();\n }\n const info = this.info();\n this.hook(() => this.params.onToolCall?.({ ...record }, info));\n if (!this.ending) this.answer(callId, payload);\n }\n\n /** A tool's output, cut to `toolOutputChars` of JSON. */\n private clip(output: unknown): unknown {\n let json: string | undefined;\n try {\n json = JSON.stringify(output);\n } catch {\n return String(output);\n }\n if (json === undefined || json.length <= this.limits.toolOutputChars) return output;\n return `${json.slice(0, this.limits.toolOutputChars)}… (cut: ${json.length} characters in all)`;\n }\n\n /** A run already going on the thread (a typed message) is waited for, not\n * superseded. */\n private async waitForThread(waited = new Set<string>()): Promise<boolean> {\n const runs = this.params.liveRuns;\n if (!runs) return false;\n const found = await runs.find({ threadId: this.threadId });\n // A run already waited for counts as over, even if a store still lists it.\n const run = found && !waited.has(found.runId) ? runs.get(found.runId) : null;\n if (!found || !run) return false;\n waited.add(found.runId);\n await run.result().catch(() => undefined);\n return true;\n }\n\n private async latestBody(): Promise<Body> {\n const store = this.params.store;\n if (!store) return this.body;\n const record = await store.get(this.sessionId).catch(() => null);\n if (record) this.body = record.body as Body;\n return this.body;\n }\n\n private async follow(turn: AgentTurn): Promise<void> {\n const summarize = this.params.progress ?? defaultProgress();\n try {\n for await (const event of turn.run) {\n const line = summarize(event as AgentStreamEvent);\n if (line) this.note(line);\n }\n } catch {\n // Progress is a courtesy; the result is read separately.\n }\n }\n\n private complete(job: Job, payload: Record<string, unknown>): void {\n if (this.ending) return;\n if (job.callId) {\n this.sideband.functionOutput(job.callId, payload);\n job.callId = undefined;\n } else {\n this.sideband.addNote(\n `Update on the earlier request \"${job.record.request}\": ${JSON.stringify(payload)}`,\n );\n }\n this.respond();\n }\n\n private answer(callId: string, payload: Record<string, unknown>): void {\n this.sideband.functionOutput(callId, payload);\n this.respond();\n }\n\n /** Asks the voice to speak, once the response in flight (if any) is done:\n * a second `response.create` while one is active is refused by the vendor. */\n private respond(): void {\n if (this.ending) return;\n if (this.responseActive) {\n this.responseWanted = true;\n return;\n }\n this.responseActive = true;\n this.createResponse();\n }\n\n /** `response.create` with an `event_id`, so a refusal can be told apart. */\n private createResponse(): void {\n const eventId = `gemi_voice_${crypto.randomUUID()}`;\n this.pendingCreate = eventId;\n this.sideband.send({ type: \"response.create\", event_id: eventId });\n }\n\n private questions() {\n return this.pending.map((call) => ({\n kind: call.kind,\n tool: String(call.name),\n input: call.input,\n }));\n }\n\n private dropQueue(): number {\n const dropped = this.queue.splice(0);\n for (const job of dropped) job.record.status = \"dropped\";\n return dropped.length;\n }\n\n // --- progress notes -------------------------------------------------------\n\n private note(line: string): void {\n if (line === this.lastProgress) return;\n this.lastProgress = line;\n const wait = this.lastNoteAt + this.limits.progressIntervalMs - Date.now();\n if (wait <= 0) return this.flushNote();\n this.noteTimer ??= setTimeout(() => this.flushNote(), wait);\n }\n\n private flushNote(): void {\n if (this.noteTimer) clearTimeout(this.noteTimer);\n this.noteTimer = undefined;\n if (!this.lastProgress || this.ending || !this.running) return;\n this.lastNoteAt = Date.now();\n this.sideband.addNote(`Progress on \"${this.running.record.request}\": ${this.lastProgress}`);\n }\n\n // --- limits ---------------------------------------------------------------\n\n private touch(): void {\n if (this.idleTimer) clearTimeout(this.idleTimer);\n this.idleTimer = undefined;\n if (this.running || this.toolsRunning > 0 || this.ending) return;\n this.idleTimer = setTimeout(\n () => void this.end(\"idle\", this.lines.idle),\n this.limits.idleTimeoutMs,\n );\n }\n\n private pauseIdle(): void {\n if (this.idleTimer) clearTimeout(this.idleTimer);\n this.idleTimer = undefined;\n }\n\n private info(): VoiceUsageInfo {\n return {\n sessionId: this.sessionId,\n total: this.usage,\n elapsedMs: Date.now() - this.startedAt,\n transcription: this.transcription,\n };\n }\n\n private tick(): void {\n if (this.ending) return;\n const info = this.info();\n this.hook(() => this.params.onTick?.(info));\n }\n\n /** Runs an app hook after the ones before it, without holding up the\n * sideband's events. */\n private hook(fn: () => void | Promise<void>): void {\n this.hooks = this.hooks.then(async () => {\n try {\n await fn();\n } catch (error) {\n if (error instanceof VoiceHangup) void this.end(\"usage\", error.line ?? null);\n else {\n console.error(\"[gemi/ai] a voice hook threw; ending the call.\", error);\n void this.end(\"error\", this.lines.error);\n }\n }\n });\n }\n\n private tampered(session: Record<string, any> | undefined): boolean {\n const expected = this.params.session;\n if (!expected || !session) return false;\n if (\n expected.instructions !== undefined &&\n session.instructions !== undefined &&\n session.instructions !== expected.instructions\n ) {\n return true;\n }\n if (Array.isArray(session.tools)) {\n // `expected.tools` already holds the voice tools when the session came\n // from `this.voice()`, and not when an app passed its own: a set either way.\n const want = new Set(\n [...voiceTools(this.params.delegate), ...(expected.tools ?? [])].map((tool) => tool.name),\n );\n const got = new Set(session.tools.map((tool: { name?: unknown }) => String(tool?.name)));\n if (want.size !== got.size || [...want].some((name) => !got.has(name))) return true;\n }\n return false;\n }\n\n // --- the end --------------------------------------------------------------\n\n private async finish(reason: VoiceEndReason, line: string | null): Promise<VoiceSummary> {\n for (const timer of this.timers) clearTimeout(timer);\n if (this.idleTimer) clearTimeout(this.idleTimer);\n if (this.noteTimer) clearTimeout(this.noteTimer);\n if (this.tickTimer) clearInterval(this.tickTimer);\n this.dropQueue();\n\n const open = reason !== \"call_ended\" && reason !== \"sideband_lost\";\n if (line && open) await this.closingLine(line);\n if (reason !== \"call_ended\") await this.hangUp();\n else this.sideband.close();\n // Hooks queued before the end (the last response's usage) finish first.\n await this.hooks;\n\n const endedAt = Date.now();\n const durationMs = endedAt - this.startedAt;\n const summary: VoiceSummary = {\n sessionId: this.sessionId,\n ...(this.callId ? { callId: this.callId } : {}),\n threadId: this.threadId,\n reason,\n startedAt: this.startedAt,\n endedAt,\n durationMs,\n seconds: Math.ceil(durationMs / 1000),\n usage: this.usage,\n transcription: this.transcription,\n transcript: this.transcript,\n requests: this.requests,\n toolCalls: this.toolCalls,\n errors: this.errors,\n };\n live.delete(this.sessionId);\n await this.params.store\n ?.update(this.sessionId, { endedAt, endReason: reason })\n .catch(() => undefined);\n try {\n await this.params.onEnd?.(summary);\n } catch (error) {\n console.error(\"[gemi/ai] a voice session's onEnd threw.\", error);\n }\n this.resolveEnded(summary);\n return summary;\n }\n\n /**\n * Hangs the call up. When the vendor refuses, the sideband stays open (it is\n * what meters the call) until the vendor ends the call or `hangupGraceMs`\n * passes, so usage that arrives meanwhile is still counted.\n */\n private async hangUp(): Promise<void> {\n try {\n await this.hangupCall();\n } catch (error) {\n console.error(\"[gemi/ai] a voice call could not be hung up; waiting for the vendor.\", error);\n this.errors.push({\n code: \"hangup_failed\",\n message: error instanceof Error ? error.message : String(error),\n });\n let timer: ReturnType<typeof setTimeout> | undefined;\n await Promise.race([\n this.sideband.closed,\n new Promise((resolve) => (timer = setTimeout(resolve, this.limits.hangupGraceMs))),\n ]);\n clearTimeout(timer);\n this.sideband.close();\n }\n }\n\n /**\n * Says `line` and waits for it to finish playing, or `closingLineMs`,\n * whichever is first.\n *\n * A response still running is cancelled first, and its own `response.done`\n * is waited for before the line is asked for: a `response.create` sent\n * while one is active is refused, and the cancelled response's audio events\n * must not count as the line's. The line's response is then matched by id:\n * its `response.done`, then `output_audio_buffer.stopped` for it (a\n * WebRTC event; if the sideband does not get it, `closingLineMs` ends the\n * wait).\n */\n private async closingLine(line: string): Promise<void> {\n await new Promise<void>((resolve) => {\n const eventId = `gemi_voice_closing_${crypto.randomUUID()}`;\n const cancelId = `gemi_voice_cancel_${crypto.randomUUID()}`;\n let stage: \"cancelling\" | \"asked\" | \"playing\" = this.responseActive ? \"cancelling\" : \"asked\";\n let lineResponse: string | undefined;\n const timer = setTimeout(finish, this.limits.closingLineMs);\n function finish() {\n clearTimeout(timer);\n resolve();\n }\n const ask = () => {\n stage = \"asked\";\n this.sideband.send({\n type: \"response.create\",\n event_id: eventId,\n response: {\n instructions: `Say exactly this to the user, and nothing else: \"${line}\"`,\n tool_choice: \"none\",\n },\n });\n };\n this.closingWaiter = (event) => {\n const e = event as {\n type: string;\n response?: { id?: string };\n response_id?: string;\n error?: { event_id?: string };\n };\n if (e.type === \"sideband.closed\") return finish();\n if (stage === \"cancelling\") {\n // Done (cancelled), or the cancel refused because nothing was active.\n if (\n e.type === \"response.done\" ||\n (e.type === \"error\" && e.error?.event_id === cancelId)\n ) {\n ask();\n }\n return;\n }\n if (e.type === \"error\" && e.error?.event_id === eventId) return finish();\n if (e.type === \"response.created\" && !lineResponse) {\n lineResponse = e.response?.id;\n return;\n }\n const ours = (id?: string) => !lineResponse || !id || id === lineResponse;\n if (e.type === \"response.done\" && ours(e.response?.id)) stage = \"playing\";\n else if (\n e.type === \"output_audio_buffer.stopped\" &&\n stage === \"playing\" &&\n ours(e.response_id)\n ) {\n finish();\n }\n };\n if (stage === \"cancelling\")\n this.sideband.send({ type: \"response.cancel\", event_id: cancelId });\n else ask();\n });\n this.closingWaiter = undefined;\n }\n}\n\n// --- helpers ---------------------------------------------------------------\n\nfunction definedOnly<T extends object>(value: T | undefined): Partial<T> {\n if (!value) return {};\n return Object.fromEntries(Object.entries(value).filter(([, v]) => v !== undefined)) as Partial<T>;\n}\n\nfunction parseArgs(raw: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\n/**\n * The spoken answer onto a pending call. A question gets the answer as its\n * output. An approval is approved when `approve` says so, and otherwise denied\n * with the answer as the reason: a voice that did not say \"yes\" has not\n * approved anything. A client tool cannot run in a voice call, so it is denied.\n */\nfunction toolResult(\n call: PendingToolCall,\n answer: string,\n approve: boolean | undefined,\n): ClientToolResult {\n const base = {\n toolCallId: call.toolCallId,\n signature: call.signature,\n ...(call.path ? { path: call.path } : {}),\n };\n if (call.kind === \"question\") return { ...base, output: answer };\n if (call.kind === \"approval\") {\n return { ...base, approve: approve === true, ...(answer ? { reason: answer } : {}) };\n }\n return { ...base, approve: false, reason: \"Not available in a voice call.\" };\n}\n\n/** Names each tool call once, and reads a string (or `message`, `label`,\n * `title`) a tool yields. */\nfunction defaultProgress(): (event: AgentStreamEvent) => string | undefined {\n const seen = new Set<string>();\n return (event) => {\n if (event.type === \"tool-call\") {\n if (event.part.partial || event.resent || seen.has(event.part.toolCallId)) return undefined;\n seen.add(event.part.toolCallId);\n return `running ${String(event.part.name)}`;\n }\n if (event.type === \"tool-progress\") {\n const data = event.data as unknown;\n if (typeof data === \"string\") return data;\n if (data && typeof data === \"object\") {\n for (const key of [\"message\", \"label\", \"title\"] as const) {\n const value = (data as Record<string, unknown>)[key];\n if (typeof value === \"string\" && value) return value;\n }\n }\n }\n return undefined;\n };\n}\n",
|
|
29
29
|
"import { HttpRequest } from \"../http/HttpRequest\";\nimport { RequestContext } from \"../http/requestContext\";\nimport type {\n McpCaller,\n McpRegistry,\n McpToolDescriptor,\n McpToolFilter,\n} from \"../services/mcp/McpRegistry\";\nimport type { RealtimeTool } from \"./providers/realtime\";\n\n/**\n * The app's MCP tools in a voice call (#921), run in this process on the\n * call's sideband.\n *\n * WHY NOT THE REALTIME API'S NATIVE `mcp` TOOL. The native tool has the vendor\n * call the app's `/mcp` endpoint with an `authorization` the session carries.\n * The browser holds the call's data channel, and that channel delivers\n * `session.created` / `session.updated` with the session's tools. Nothing the\n * vendors document says the `mcp` tool's `authorization` (or its `headers`) is\n * left out of those events, so a token in it has to be assumed visible to the\n * browser. The native tool also runs the calls at the vendor: the server sees\n * them only after the fact, so it can't refuse, rate-limit or meter them\n * before they run, and the endpoint has to be reachable from the internet.\n *\n * So the calls come to the server instead, like every other tool call of the\n * voice: the model calls a plain function tool, the bridge receives it on the\n * sideband, and runs it here through `McpRegistry.execute`. That means:\n *\n * - No token is minted at all. The caller is a principal built here from the\n * user `start` saw, exactly as the MCP endpoint builds one from a verified\n * credential: `{ kind: \"remote\", principal: { user, via: \"voice\", id, scopes } }`.\n * - The registry applies its remote rules: only tools exposed to remote\n * callers and reached by `scopes`, features checked per call, and nothing\n * of the browser's own request crosses over (the route runs as the\n * principal's user).\n * - `authorize` runs before each call (keep it on the session's site, say),\n * and the bridge's limits and `onToolCall` hook apply, the same hook chain\n * as `onUsage`, so `VoiceHangup` works there too.\n *\n * Tools with `requiresApproval` are left out. A voice call has no approval\n * screen, and the registry refuses a remote call to such a tool without one.\n */\n\n/** A tool the voice model may call that the bridge runs in this process. */\nexport type VoiceToolHandler = {\n /** What the voice model sees: name, description, parameters. */\n tool: RealtimeTool;\n /**\n * Runs one call. `input` is the model's arguments, parsed from JSON and not\n * validated: validate them. Throw a `ToolError` for a failure the model\n * should read; any other error reaches the model as \"The tool failed.\"\n */\n run(input: unknown, info: VoiceToolRunInfo): Promise<unknown>;\n /** Overrides `limits.toolTimeoutMs` for this tool. */\n timeoutMs?: number;\n};\n\nexport type VoiceToolRunInfo = {\n sessionId: string;\n /** Aborted when the call takes longer than its timeout. */\n signal: AbortSignal;\n};\n\n/** One call to a `VoiceToolHandler`, as `authorize` sees it. */\nexport type VoiceToolCall = { name: string; input: unknown; sessionId: string };\n\nexport type VoiceMcpOptions = {\n /** The app's registry: `app(McpRegistry)`. */\n registry: McpRegistry<any>;\n /** Narrows the tools, as `McpRegistry.list` does. */\n filter?: McpToolFilter;\n /**\n * The scopes this call's principal carries, which decide the tools it sees\n * and may call. Default: every scope the registry declares.\n */\n scopes?: readonly string[];\n /**\n * Before each call. Throw a `ToolError` to refuse with a sentence the model\n * reads (a tool aimed at another site), or a `VoiceHangup` to end the call.\n */\n authorize?: (call: VoiceToolCall) => void | Promise<void>;\n /** Per call. Default: `limits.toolTimeoutMs`. */\n timeoutMs?: number;\n};\n\n/** Where an MCP call made from a voice call is dispatched from. Never sent. */\nconst VOICE_MCP_URL = \"http://gemi.internal/__gemi__/voice/mcp\";\n\n/**\n * The registry's tools as `VoiceToolHandler`s, for the user `user`. Call it\n * inside the request that starts the call: features are evaluated against it\n * for the listing (and again, per call, by `execute`).\n *\n * Throws when `user` is empty: MCP tools run as a signed-in user, never as\n * nobody.\n */\nexport async function mcpVoiceTools(\n options: VoiceMcpOptions,\n who: { user: unknown; sessionId: string },\n): Promise<VoiceToolHandler[]> {\n if (!who.user) {\n throw new Error(\n \"Voice MCP tools run as the signed-in user, and this voice session has none. Give `mcp` only to a signed-in user's session.\",\n );\n }\n const { registry } = options;\n const scopes = options.scopes ?? registry.scopes().map((scope) => scope.name);\n const callerFor = (req: HttpRequest<any, any>): McpCaller => ({\n kind: \"remote\",\n req,\n principal: {\n user: who.user as never,\n via: \"voice\",\n id: `voice:${who.sessionId}`,\n scopes,\n },\n });\n\n const descriptors: McpToolDescriptor[] = await registry.available(\n callerFor(serverRequest()),\n options.filter,\n );\n return descriptors\n .filter((descriptor) => !descriptor.requiresApproval)\n .map((descriptor) => ({\n tool: {\n name: descriptor.name,\n description: descriptor.description,\n parameters: descriptor.inputSchema,\n },\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n run: (input, info) => {\n const req = serverRequest();\n // A request scope of its own, carrying the user, as `startTurn` opens\n // one: the call runs long after the request that started it.\n return RequestContext.run(\n req,\n async () => {\n await options.authorize?.({ name: descriptor.name, input, sessionId: info.sessionId });\n return registry.execute(callerFor(req), descriptor.name, input, undefined, {\n signal: info.signal,\n });\n },\n { user: who.user as never },\n );\n },\n }));\n}\n\nfunction serverRequest(): HttpRequest<any, any> {\n return new HttpRequest<any, any>(\n new Request(VOICE_MCP_URL, { method: \"POST\" }),\n {},\n \"api\",\n new URL(VOICE_MCP_URL).pathname,\n );\n}\n",
|
|
30
30
|
"import type { VoiceEndReason } from \"./voice/wire\";\n\n/**\n * A voice session's state, outside the process that holds its sideband (#921).\n *\n * A `PATCH` (the selection changed) or a `DELETE` (the user pressed End) can\n * land on any instance behind a load balancer. The instance that answers it\n * reads and writes the session here; the instance holding the sideband reads\n * the latest `body` before every delegated turn. Ending does not need the\n * holder at all: whoever answers the `DELETE` hangs the call up at the vendor,\n * and the holder's sideband sees the call close.\n *\n * Small and JSON-shaped on purpose, so a database or Redis implementation is a\n * page of code. `MemoryVoiceSessionStore` is the process-local default.\n */\nexport type VoiceSessionRecord = {\n id: string;\n /** The vendor's call id. */\n callId: string;\n threadId: string;\n /** `runOwner` of the request that started it; `null` is nobody. */\n owner: string | null;\n /** The controller's `Body`, as last sent. */\n body: Record<string, unknown>;\n /** Epoch ms. */\n startedAt: number;\n endedAt?: number;\n endReason?: VoiceEndReason;\n};\n\nexport interface VoiceSessionStore {\n create(record: VoiceSessionRecord): Promise<void>;\n get(id: string): Promise<VoiceSessionRecord | null>;\n /** Merges `patch` into the record. A missing record is not an error. */\n update(id: string, patch: Partial<Omit<VoiceSessionRecord, \"id\">>): Promise<void>;\n}\n\n/**\n * Process-local. Ended sessions are dropped after `retainEndedMs` (default 10\n * minutes), so a long-lived process does not keep every call it ever had.\n */\nexport class MemoryVoiceSessionStore implements VoiceSessionStore {\n private readonly records = new Map<string, VoiceSessionRecord>();\n private readonly retainEndedMs: number;\n\n constructor(options: { retainEndedMs?: number } = {}) {\n this.retainEndedMs = options.retainEndedMs ?? 10 * 60_000;\n }\n\n async create(record: VoiceSessionRecord): Promise<void> {\n this.sweep();\n this.records.set(record.id, structuredClone(record));\n }\n\n async get(id: string): Promise<VoiceSessionRecord | null> {\n const record = this.records.get(id);\n return record ? structuredClone(record) : null;\n }\n\n async update(id: string, patch: Partial<Omit<VoiceSessionRecord, \"id\">>): Promise<void> {\n const record = this.records.get(id);\n if (!record) return;\n this.records.set(id, { ...record, ...structuredClone(patch), id });\n }\n\n private sweep(): void {\n const cutoff = Date.now() - this.retainEndedMs;\n for (const [id, record] of this.records) {\n if (record.endedAt !== undefined && record.endedAt < cutoff) this.records.delete(id);\n }\n }\n}\n\n/** The store `AgentController.voiceStore` uses unless an app sets another. */\nexport const defaultVoiceStore = new MemoryVoiceSessionStore();\n",
|
|
31
|
-
"import type { SQL, TransactionSQL } from \"bun\";\n\nimport type { DatabaseConnection } from \"../../database/Connection\";\nimport type { Dialect } from \"../../database/dialect\";\nimport { currentConnectionName, currentTransaction, withTransaction } from \"../../orm/context\";\nimport type { AgentStore } from \"../AgentController\";\nimport { keepSummary, type ThreadSummary } from \"../contextCompaction\";\nimport type { AgentMessage } from \"../types\";\n\nexport type DatabaseAgentStoreOptions = {\n /**\n * The threads table. Default `gemi_agent_threads`. A plain identifier\n * (letters, digits and underscores), because it is spliced into every\n * statement.\n */\n threadsTable?: string;\n /** The messages table. Default `gemi_agent_messages`. A plain identifier. */\n messagesTable?: string;\n};\n\n/** One thread, as `listThreads` and `getThread` answer it. */\nexport type AgentThreadRecord = {\n id: string;\n /** What `createThread` was given as `userId`, as a string, or `null`. */\n userId: string | null;\n /** The first user message's text, cut at 100 characters, once there is one. */\n title: string | null;\n /** Epoch milliseconds, from the database's clock. */\n createdAt: number;\n /** Epoch milliseconds of the last write. */\n updatedAt: number;\n};\n\ntype Row = Record<string, unknown>;\n\n/** Each SQLite client's transactions, chained so they run one at a time. */\nconst sqliteQueue = new WeakMap<SQL, Promise<void>>();\n\n/** How much of the first user message becomes the thread's title. */\nconst TITLE_LENGTH = 100;\n\n/**\n * Conversations (#1063) in two tables of the app's own database, so a thread\n * outlives the process and every instance reads the same one. The durable\n * `AgentStore`; `MemoryAgentStore` stays the default.\n *\n * export class ChatController extends AgentController {\n * agent = chatAgent;\n * store = agentStore; // new DatabaseAgentStore(app(DatabaseManager).connection()), once, at module scope\n * }\n *\n * Written for SQLite, Postgres and MySQL 8 / MariaDB 10.6+ in raw SQL, like\n * the other database stores, and the tables are the app's to create: add the\n * Prisma models from the docs, or call `createTable()`.\n *\n * - **Messages** are rows of JSON, one per message id, in the order the thread\n * first saw them. `appendMessages` replaces a message it already holds in\n * place, so a message written several times during a run keeps one row.\n * - **One writer per thread at a time.** An append runs in a transaction that\n * first updates the thread's row, which locks it on Postgres and MySQL (and\n * takes SQLite's write lock), so two appends to one thread cannot hand out\n * the same position.\n * - **Summaries** for `contextWindow.compact` live on the thread's row and go\n * with it; `lockSummary` is a compare-and-set on the same row, so several\n * instances do not summarise the same thread at once.\n * - **Ownership is the app's.** `createThread` records the `userId` it is\n * given and `listThreads` filters on it, but nothing here checks who is\n * asking: the app's routes do, as they do for any thread id.\n */\nexport class DatabaseAgentStore implements AgentStore {\n readonly threadsTable: string;\n readonly messagesTable: string;\n private readonly sql: SQL;\n private readonly dialect: Dialect;\n private readonly connection: string | undefined;\n\n constructor(\n connection: Pick<DatabaseConnection, \"sql\" | \"dialect\"> &\n Partial<Pick<DatabaseConnection, \"name\">>,\n options: DatabaseAgentStoreOptions = {},\n ) {\n this.threadsTable = plainIdentifier(options.threadsTable ?? \"gemi_agent_threads\", \"threads\");\n this.messagesTable = plainIdentifier(\n options.messagesTable ?? \"gemi_agent_messages\",\n \"messages\",\n );\n this.sql = connection.sql;\n this.dialect = connection.dialect;\n this.connection = connection.name;\n }\n\n /**\n * Creates both tables and their indexes if they do not exist: the DDL Prisma\n * generates for the models in the docs. For tests and for an app that does\n * not manage its schema with Prisma.\n */\n async createTable(): Promise<void> {\n const statements = createAgentStoreTableStatements(\n this.dialect,\n this.threadsTable,\n this.messagesTable,\n );\n for (const statement of statements) await this.sql.unsafe(statement);\n }\n\n async createThread(params: { userId?: string | number }): Promise<{ threadId: string }> {\n const q = this.q();\n const threadId = crypto.randomUUID();\n const userId = params.userId === undefined || params.userId === null ? null : String(params.userId);\n const now = this.clock(q);\n await q`\n INSERT INTO ${this.threads(q)} (id, user_id, created_at, updated_at)\n VALUES (${threadId}, ${userId}, ${now}, ${now})\n `;\n return { threadId };\n }\n\n async loadThread(threadId: string): Promise<AgentMessage[] | null> {\n const q = this.q();\n const thread: Row[] = await q`SELECT id FROM ${this.threads(q)} WHERE id = ${threadId}`;\n if (thread.length === 0) return null;\n const rows: Row[] = await q`\n SELECT message FROM ${this.messages(q)}\n WHERE thread_id = ${threadId}\n ORDER BY position\n `;\n return rows.map((row) => JSON.parse(String(row.message)) as AgentMessage);\n }\n\n async appendMessages(threadId: string, messages: AgentMessage[]): Promise<void> {\n if (messages.length === 0) {\n // Still an error for a thread that is not there, like a non-empty one.\n if ((await this.getThread(threadId)) === null) throw missingThread(threadId);\n return;\n }\n await this.atomically(async (q) => {\n // The write lock first: the row on Postgres and MySQL, the database on\n // SQLite. Everything below reads and writes under it.\n await q`UPDATE ${this.threads(q)} SET updated_at = ${this.clock(q)} WHERE id = ${threadId}`;\n const thread: Row[] = await q`\n SELECT title FROM ${this.threads(q)} WHERE id = ${threadId}\n `;\n if (thread.length === 0) throw missingThread(threadId);\n\n const ids = [...new Set(messages.map((message) => message.id))];\n const held: Row[] = await q`\n SELECT id FROM ${this.messages(q)}\n WHERE thread_id = ${threadId} AND id IN (${list(q, ids)})\n `;\n const existing = new Set(held.map((row) => String(row.id)));\n const [last] = (await q`\n SELECT MAX(position) AS position FROM ${this.messages(q)} WHERE thread_id = ${threadId}\n `) as Row[];\n let position =\n last?.position === null || last?.position === undefined ? 0 : Number(last.position) + 1;\n\n for (const message of messages) {\n const body = JSON.stringify(message);\n if (existing.has(message.id)) {\n await q`\n UPDATE ${this.messages(q)} SET message = ${body}\n WHERE thread_id = ${threadId} AND id = ${message.id}\n `;\n } else {\n await q`\n INSERT INTO ${this.messages(q)} (thread_id, id, position, message, created_at)\n VALUES (${threadId}, ${message.id}, ${position}, ${body}, ${this.clock(q)})\n `;\n existing.add(message.id);\n position += 1;\n }\n }\n\n if (thread[0]!.title === null || thread[0]!.title === undefined) {\n const title = titleOf(messages);\n if (title !== null) {\n await q`\n UPDATE ${this.threads(q)} SET title = ${title}\n WHERE id = ${threadId} AND title IS NULL\n `;\n }\n }\n });\n }\n\n async removeMessages(threadId: string, messageIds: string[]): Promise<void> {\n if (messageIds.length === 0) return;\n const q = this.q();\n await q`\n DELETE FROM ${this.messages(q)}\n WHERE thread_id = ${threadId} AND id IN (${list(q, [...new Set(messageIds)])})\n `;\n }\n\n async loadSummaries(threadId: string): Promise<ThreadSummary[]> {\n const q = this.q();\n const [row] = (await q`\n SELECT summaries FROM ${this.threads(q)} WHERE id = ${threadId}\n `) as Row[];\n return row ? parseSummaries(row.summaries) : [];\n }\n\n async saveSummary(threadId: string, summary: ThreadSummary): Promise<void> {\n await this.atomically(async (q) => {\n await q`UPDATE ${this.threads(q)} SET updated_at = updated_at WHERE id = ${threadId}`;\n const [row] = (await q`\n SELECT summaries FROM ${this.threads(q)} WHERE id = ${threadId}\n `) as Row[];\n // A thread that is gone has nothing to summarise; the summary goes with it.\n if (!row) return;\n const summaries = keepSummary(parseSummaries(row.summaries), summary);\n await q`\n UPDATE ${this.threads(q)} SET summaries = ${JSON.stringify(summaries)}\n WHERE id = ${threadId}\n `;\n });\n }\n\n /**\n * A compare-and-set on the thread's row: taken when no one holds it or the\n * holder's `ttlMs` has run out. One lock per thread rather than per cut,\n * which only means two cuts of one thread are not summarised at once.\n */\n async lockSummary(\n threadId: string,\n cutMessageId: string,\n ttlMs: number,\n ): Promise<(() => Promise<void>) | null> {\n const q = this.q();\n const token = `${cutMessageId}:${crypto.randomUUID()}`;\n const now = this.clock(q);\n const result = await q`\n UPDATE ${this.threads(q)}\n SET summary_lock = ${token}, summary_lock_until = ${now} + ${this.ms(q, ttlMs)}\n WHERE id = ${threadId} AND (summary_lock_until IS NULL OR summary_lock_until <= ${now})\n `;\n if (affected(result) === 0) return null;\n return async () => {\n const q = this.q();\n await q`\n UPDATE ${this.threads(q)} SET summary_lock = NULL, summary_lock_until = NULL\n WHERE id = ${threadId} AND summary_lock = ${token}\n `;\n };\n }\n\n // --- for the app's own routes ------------------------------------------\n\n /** One thread's record, or `null` for an id the store does not have. */\n async getThread(threadId: string): Promise<AgentThreadRecord | null> {\n const q = this.q();\n const [row] = (await q`\n SELECT id, user_id, title, created_at, updated_at FROM ${this.threads(q)}\n WHERE id = ${threadId}\n `) as Row[];\n return row ? threadOf(row) : null;\n }\n\n /**\n * The threads, most recently written first: all of them, or one user's\n * (`userId` as `createThread` was given it). For a \"your conversations\"\n * list; `limit` defaults to 50, and `offset` pages.\n */\n async listThreads(\n options: { userId?: string | number | null; limit?: number; offset?: number } = {},\n ): Promise<AgentThreadRecord[]> {\n const q = this.q();\n const limit = Math.max(0, Math.floor(options.limit ?? 50));\n const offset = Math.max(0, Math.floor(options.offset ?? 0));\n const where =\n options.userId === undefined\n ? q`1 = 1`\n : options.userId === null\n ? q`user_id IS NULL`\n : q`user_id = ${String(options.userId)}`;\n const rows: Row[] = await q`\n SELECT id, user_id, title, created_at, updated_at FROM ${this.threads(q)}\n WHERE ${where}\n ORDER BY updated_at DESC, id DESC\n LIMIT ${limit} OFFSET ${offset}\n `;\n return rows.map(threadOf);\n }\n\n /**\n * Deletes the thread, its messages and its summaries. An id the store does\n * not have is ignored. Agent memories scoped to the thread are not touched:\n * see `AgentMemories.deleteScope`.\n */\n async deleteThread(threadId: string): Promise<void> {\n await this.atomically(async (q) => {\n await q`DELETE FROM ${this.messages(q)} WHERE thread_id = ${threadId}`;\n await q`DELETE FROM ${this.threads(q)} WHERE id = ${threadId}`;\n });\n }\n\n // --- plumbing -------------------------------------------------------------\n\n /**\n * Runs `fn` in a transaction: a savepoint in the open ORM transaction when it\n * is on this store's connection, a transaction of its own otherwise.\n */\n private atomically<T>(fn: (q: SQL) => Promise<T>): Promise<T> {\n if (this.joinable()) {\n return withTransaction(this.sql, (tx) => fn(tx as unknown as SQL), {\n connection: this.connection,\n });\n }\n const begin = () => this.sql.begin((tx) => fn(tx as unknown as SQL)) as Promise<T>;\n if (this.dialect !== \"sqlite\") return begin();\n // One SQLite client is one connection, which holds one transaction at a\n // time: a second `begin` while the first is open fails with \"cannot start\n // a transaction within a transaction\". So this client's transactions take\n // turns. (Several clients on one file wait on SQLite's own lock.)\n const previous = sqliteQueue.get(this.sql) ?? Promise.resolve();\n const next = previous.then(begin, begin);\n sqliteQueue.set(\n this.sql,\n next.then(\n () => {},\n () => {},\n ),\n );\n return next;\n }\n\n /** The open ORM transaction, when it is on this store's connection. */\n private joinable(): TransactionSQL | undefined {\n if (this.connection === undefined) return undefined;\n const tx = currentTransaction();\n if (tx === undefined || currentConnectionName() !== this.connection) return undefined;\n return tx;\n }\n\n /** Read at each call and never kept: a stored transaction handle outlives its transaction. */\n private q(): SQL {\n return (this.joinable() as SQL | undefined) ?? this.sql;\n }\n\n private quote(name: string) {\n return this.dialect === \"mysql\" || this.dialect === \"mariadb\" ? `\\`${name}\\`` : `\"${name}\"`;\n }\n\n private threads(q: SQL) {\n return q.unsafe(this.quote(this.threadsTable));\n }\n\n private messages(q: SQL) {\n return q.unsafe(this.quote(this.messagesTable));\n }\n\n /** The database's clock, in epoch milliseconds. As in `DatabaseAgentJobStore`. */\n private clock(q: SQL) {\n switch (this.dialect) {\n case \"postgres\":\n return q`floor(extract(epoch from statement_timestamp()) * 1000)::bigint`;\n case \"mysql\":\n case \"mariadb\":\n return q`(TIMESTAMPDIFF(MICROSECOND, '1970-01-01 00:00:00', UTC_TIMESTAMP(6)) DIV 1000)`;\n case \"sqlite\":\n return q`CAST((julianday('now') - 2440587.5) * 86400000 AS INTEGER)`;\n }\n }\n\n private ms(q: SQL, value: number) {\n const ms = Math.max(0, Math.round(value));\n return this.dialect === \"mysql\" || this.dialect === \"mariadb\"\n ? q`CAST(${ms} AS SIGNED)`\n : q`CAST(${ms} AS BIGINT)`;\n }\n}\n\nfunction plainIdentifier(table: string, which: string): string {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(table)) {\n throw new Error(\n `The agent ${which} table name \"${table}\" is not a plain identifier. Use letters, digits and underscores.`,\n );\n }\n return table;\n}\n\nfunction missingThread(threadId: string): Error {\n // As `MemoryAgentStore` says it: the controller checks before the run and\n // never reaches this; a store-level caller that does gets told.\n return new Error(`Thread ${threadId} does not exist here, or has been deleted.`);\n}\n\nfunction list(q: SQL, values: string[]) {\n return values.map((value) => q`${value}`).reduce((all, one) => q`${all}, ${one}`);\n}\n\nfunction titleOf(messages: AgentMessage[]): string | null {\n for (const message of messages) {\n if (message.role !== \"user\") continue;\n const text = message.content\n .map((part) => (part.type === \"text\" ? part.text : \"\"))\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n if (text) return text.length > TITLE_LENGTH ? `${text.slice(0, TITLE_LENGTH - 1)}…` : text;\n }\n return null;\n}\n\nfunction parseSummaries(value: unknown): ThreadSummary[] {\n if (value === null || value === undefined || value === \"\") return [];\n const parsed = JSON.parse(String(value));\n return Array.isArray(parsed) ? (parsed as ThreadSummary[]) : [];\n}\n\nfunction threadOf(row: Row): AgentThreadRecord {\n return {\n id: String(row.id),\n userId: row.user_id === null || row.user_id === undefined ? null : String(row.user_id),\n title: row.title === null || row.title === undefined ? null : String(row.title),\n createdAt: Number(row.created_at),\n updatedAt: Number(row.updated_at),\n };\n}\n\n/** Rows an `UPDATE` touched, across the three drivers. */\nfunction affected(result: unknown): number {\n const counts = result as { count?: number | null; affectedRows?: number | null };\n return Math.max(Number(counts.count ?? 0), Number(counts.affectedRows ?? 0));\n}\n\n/**\n * The tables as Prisma generates them for the models in the docs, with\n * `IF NOT EXISTS` added.\n */\nexport function createAgentStoreTableStatements(\n dialect: Dialect,\n threadsTable: string,\n messagesTable: string,\n): string[] {\n if (dialect === \"mysql\" || dialect === \"mariadb\") {\n return [\n `CREATE TABLE IF NOT EXISTS \\`${threadsTable}\\` (\n \\`id\\` VARCHAR(191) NOT NULL,\n \\`user_id\\` VARCHAR(191) NULL,\n \\`title\\` TEXT NULL,\n \\`summaries\\` LONGTEXT NULL,\n \\`summary_lock\\` VARCHAR(191) NULL,\n \\`summary_lock_until\\` BIGINT NULL,\n \\`created_at\\` BIGINT NOT NULL,\n \\`updated_at\\` BIGINT NOT NULL,\n\n INDEX \\`${threadsTable}_user_id_updated_at_idx\\`(\\`user_id\\`, \\`updated_at\\`),\n PRIMARY KEY (\\`id\\`)\n) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`,\n `CREATE TABLE IF NOT EXISTS \\`${messagesTable}\\` (\n \\`thread_id\\` VARCHAR(191) NOT NULL,\n \\`id\\` VARCHAR(191) NOT NULL,\n \\`position\\` INTEGER NOT NULL,\n \\`message\\` LONGTEXT NOT NULL,\n \\`created_at\\` BIGINT NOT NULL,\n\n UNIQUE INDEX \\`${messagesTable}_thread_id_position_key\\`(\\`thread_id\\`, \\`position\\`),\n PRIMARY KEY (\\`thread_id\\`, \\`id\\`)\n) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`,\n ];\n }\n\n const threadsKey =\n dialect === \"sqlite\" ? `\"id\" TEXT NOT NULL PRIMARY KEY,` : `\"id\" TEXT NOT NULL,`;\n const threadsConstraint =\n dialect === \"sqlite\" ? \"\" : `,\\n\\n CONSTRAINT \"${threadsTable}_pkey\" PRIMARY KEY (\"id\")`;\n return [\n `CREATE TABLE IF NOT EXISTS \"${threadsTable}\" (\n ${threadsKey}\n \"user_id\" TEXT,\n \"title\" TEXT,\n \"summaries\" TEXT,\n \"summary_lock\" TEXT,\n \"summary_lock_until\" BIGINT,\n \"created_at\" BIGINT NOT NULL,\n \"updated_at\" BIGINT NOT NULL${threadsConstraint}\n)`,\n `CREATE INDEX IF NOT EXISTS \"${threadsTable}_user_id_updated_at_idx\" ON \"${threadsTable}\"(\"user_id\", \"updated_at\")`,\n `CREATE TABLE IF NOT EXISTS \"${messagesTable}\" (\n \"thread_id\" TEXT NOT NULL,\n \"id\" TEXT NOT NULL,\n \"position\" INTEGER NOT NULL,\n \"message\" TEXT NOT NULL,\n \"created_at\" BIGINT NOT NULL,\n\n CONSTRAINT \"${messagesTable}_pkey\" PRIMARY KEY (\"thread_id\", \"id\")\n)`,\n `CREATE UNIQUE INDEX IF NOT EXISTS \"${messagesTable}_thread_id_position_key\" ON \"${messagesTable}\"(\"thread_id\", \"position\")`,\n ];\n}\n",
|
|
31
|
+
"import type { SQL, TransactionSQL } from \"bun\";\n\nimport type { DatabaseConnection } from \"../../database/Connection\";\nimport type { Dialect } from \"../../database/dialect\";\nimport { currentConnectionName, currentTransaction, withTransaction } from \"../../orm/context\";\nimport type { AgentStore } from \"../AgentController\";\nimport { keepSummary, type ThreadSummary } from \"../contextCompaction\";\nimport type { AgentMessage } from \"../types\";\n\nexport type DatabaseAgentStoreOptions = {\n /**\n * The threads table. Default `gemi_agent_threads`. A plain identifier\n * (letters, digits and underscores), because it is spliced into every\n * statement.\n */\n threadsTable?: string;\n /** The messages table. Default `gemi_agent_messages`. A plain identifier. */\n messagesTable?: string;\n /**\n * Refuse every call on the unscoped store (#1177): only a `forScope(scope)`\n * view reads or writes threads. For an app where every thread belongs to a\n * tenant, so a call that forgot its scope is an error rather than a read\n * across all of them. `createTable()` is still allowed. Default `false`.\n */\n requireScope?: boolean;\n /**\n * Called first in every transaction a scoped view opens itself (#1177), with\n * the transaction and the scope. For row-level security keyed on a session\n * setting:\n *\n * beginScope: (tx, scope) => tx`SELECT set_config('app.current_id', ${scope}, true)`\n *\n * With it, every call of a scoped view runs in such a transaction, reads\n * included, so the policy applies to writes made after the request ended\n * (a run's messages as it streams). A call made inside an open ORM\n * transaction on this store's connection joins that one instead, which is\n * the app's, and the app's own setting applies; the hook is not called.\n */\n beginScope?: (tx: SQL, scope: string) => unknown;\n};\n\n/** One thread, as `listThreads` and `getThread` answer it. */\nexport type AgentThreadRecord = {\n id: string;\n /** What `createThread` was given as `userId`, as a string, or `null`. */\n userId: string | null;\n /** The first user message's text, cut at 100 characters, once there is one. */\n title: string | null;\n /** Epoch milliseconds, from the database's clock. */\n createdAt: number;\n /** Epoch milliseconds of the last write. */\n updatedAt: number;\n};\n\ntype Row = Record<string, unknown>;\n\n/** Each SQLite client's transactions, chained so they run one at a time. */\nconst sqliteQueue = new WeakMap<SQL, Promise<void>>();\n\n/** How much of the first user message becomes the thread's title. */\nconst TITLE_LENGTH = 100;\n\n/**\n * Conversations (#1063) in two tables of the app's own database, so a thread\n * outlives the process and every instance reads the same one. The durable\n * `AgentStore`; `MemoryAgentStore` stays the default.\n *\n * export class ChatController extends AgentController {\n * agent = chatAgent;\n * store = agentStore; // new DatabaseAgentStore(app(DatabaseManager).connection()), once, at module scope\n * }\n *\n * Written for SQLite, Postgres and MySQL 8 / MariaDB 10.6+ in raw SQL, like\n * the other database stores, and the tables are the app's to create: add the\n * Prisma models from the docs, or call `createTable()`.\n *\n * - **Messages** are rows of JSON, one per message id, in the order the thread\n * first saw them. `appendMessages` replaces a message it already holds in\n * place, so a message written several times during a run keeps one row.\n * - **One writer per thread at a time.** An append runs in a transaction that\n * first updates the thread's row, which locks it on Postgres and MySQL (and\n * takes SQLite's write lock), so two appends to one thread cannot hand out\n * the same position.\n * - **Summaries** for `contextWindow.compact` live on the thread's row and go\n * with it; `lockSummary` is a compare-and-set on the same row, so several\n * instances do not summarise the same thread at once.\n * - **Ownership is the app's.** `createThread` records the `userId` it is\n * given and `listThreads` filters on it, but nothing here checks who is\n * asking: the app's routes do, as they do for any thread id.\n * - **Scopes** (#1177): `forScope(scope)` is the same store bound to one\n * tenant key. It records the scope on every thread and message it writes and\n * filters every read and write by it, so a thread of another scope is one it\n * does not have. The unscoped store is today's: it reads every row, scoped\n * or not, and its statements do not name the `scope` column, so an app that\n * never scopes needs no migration. `requireScope` refuses it outright;\n * `beginScope` opens each scoped call's transaction (row-level security).\n */\nexport class DatabaseAgentStore implements AgentStore {\n readonly threadsTable: string;\n readonly messagesTable: string;\n /** The scope this view is bound to (`forScope`), or `null` for the store itself. */\n readonly scope: string | null = null;\n private readonly sql: SQL;\n private readonly dialect: Dialect;\n private readonly connection: string | undefined;\n private readonly options: DatabaseAgentStoreOptions;\n\n constructor(\n connection: Pick<DatabaseConnection, \"sql\" | \"dialect\"> &\n Partial<Pick<DatabaseConnection, \"name\">>,\n options: DatabaseAgentStoreOptions = {},\n ) {\n this.threadsTable = plainIdentifier(options.threadsTable ?? \"gemi_agent_threads\", \"threads\");\n this.messagesTable = plainIdentifier(\n options.messagesTable ?? \"gemi_agent_messages\",\n \"messages\",\n );\n this.sql = connection.sql;\n this.dialect = connection.dialect;\n this.connection = connection.name;\n this.options = options;\n }\n\n /**\n * This store bound to one scope, a tenant key (#1177): every thread and\n * message it writes carries the scope, and every read and write is filtered\n * by it. Cheap: the view shares the store's connection, so make one per\n * request or per job. A view's `forScope` binds the store, not the view.\n */\n forScope(scope: string): DatabaseAgentStore {\n if (typeof scope !== \"string\" || scope === \"\") {\n throw new TypeError(\"A DatabaseAgentStore scope is a non-empty string.\");\n }\n const view = new DatabaseAgentStore(\n { sql: this.sql, dialect: this.dialect, name: this.connection },\n this.options,\n );\n (view as { scope: string | null }).scope = scope;\n return view;\n }\n\n /**\n * Creates both tables and their indexes if they do not exist: the DDL Prisma\n * generates for the models in the docs. For tests and for an app that does\n * not manage its schema with Prisma.\n */\n async createTable(): Promise<void> {\n const statements = createAgentStoreTableStatements(\n this.dialect,\n this.threadsTable,\n this.messagesTable,\n );\n for (const statement of statements) await this.sql.unsafe(statement);\n await this.addScopeColumns();\n }\n\n /**\n * Adds the `scope` columns and index (#1177) to tables created before them,\n * and does nothing to tables that have them. `createTable()` calls it; an app\n * that manages its schema with Prisma adds the fields to its models instead\n * (see the upgrade notes).\n */\n async addScopeColumns(): Promise<void> {\n const statements = addScopeColumnStatements(this.dialect, this.threadsTable, this.messagesTable);\n for (const [table, alter] of statements) {\n if (await this.hasColumn(table, \"scope\")) continue;\n for (const statement of alter) await this.sql.unsafe(statement);\n }\n }\n\n private async hasColumn(table: string, column: string): Promise<boolean> {\n try {\n await this.sql.unsafe(`SELECT ${column} FROM ${this.quote(table)} WHERE 1 = 0`);\n return true;\n } catch {\n return false;\n }\n }\n\n async createThread(params: { userId?: string | number }): Promise<{ threadId: string }> {\n const threadId = crypto.randomUUID();\n const userId = params.userId === undefined || params.userId === null ? null : String(params.userId);\n await this.run(async (q) => {\n const now = this.clock(q);\n if (this.scope === null) {\n await q`\n INSERT INTO ${this.threads(q)} (id, user_id, created_at, updated_at)\n VALUES (${threadId}, ${userId}, ${now}, ${now})\n `;\n } else {\n await q`\n INSERT INTO ${this.threads(q)} (id, scope, user_id, created_at, updated_at)\n VALUES (${threadId}, ${this.scope}, ${userId}, ${now}, ${now})\n `;\n }\n });\n return { threadId };\n }\n\n async loadThread(threadId: string): Promise<AgentMessage[] | null> {\n return this.run(async (q) => {\n const thread: Row[] = await q`\n SELECT id FROM ${this.threads(q)} WHERE id = ${threadId} AND ${this.inScope(q)}\n `;\n if (thread.length === 0) return null;\n const rows: Row[] = await q`\n SELECT message FROM ${this.messages(q)}\n WHERE thread_id = ${threadId} AND ${this.inScope(q)}\n ORDER BY position\n `;\n return rows.map((row) => JSON.parse(String(row.message)) as AgentMessage);\n });\n }\n\n async appendMessages(threadId: string, messages: AgentMessage[]): Promise<void> {\n if (messages.length === 0) {\n // Still an error for a thread that is not there, like a non-empty one.\n if ((await this.getThread(threadId)) === null) throw missingThread(threadId);\n return;\n }\n await this.atomically(async (q) => {\n // The write lock first: the row on Postgres and MySQL, the database on\n // SQLite. Everything below reads and writes under it.\n await q`\n UPDATE ${this.threads(q)} SET updated_at = ${this.clock(q)}\n WHERE id = ${threadId} AND ${this.inScope(q)}\n `;\n const thread: Row[] = await q`\n SELECT title FROM ${this.threads(q)} WHERE id = ${threadId} AND ${this.inScope(q)}\n `;\n if (thread.length === 0) throw missingThread(threadId);\n\n const ids = [...new Set(messages.map((message) => message.id))];\n const held: Row[] = await q`\n SELECT id FROM ${this.messages(q)}\n WHERE thread_id = ${threadId} AND id IN (${list(q, ids)})\n `;\n const existing = new Set(held.map((row) => String(row.id)));\n const [last] = (await q`\n SELECT MAX(position) AS position FROM ${this.messages(q)} WHERE thread_id = ${threadId}\n `) as Row[];\n let position =\n last?.position === null || last?.position === undefined ? 0 : Number(last.position) + 1;\n\n for (const message of messages) {\n const body = JSON.stringify(message);\n if (existing.has(message.id)) {\n await q`\n UPDATE ${this.messages(q)} SET message = ${body}\n WHERE thread_id = ${threadId} AND id = ${message.id}\n `;\n } else if (this.scope === null) {\n await q`\n INSERT INTO ${this.messages(q)} (thread_id, id, position, message, created_at)\n VALUES (${threadId}, ${message.id}, ${position}, ${body}, ${this.clock(q)})\n `;\n existing.add(message.id);\n position += 1;\n } else {\n await q`\n INSERT INTO ${this.messages(q)} (thread_id, scope, id, position, message, created_at)\n VALUES (${threadId}, ${this.scope}, ${message.id}, ${position}, ${body}, ${this.clock(q)})\n `;\n existing.add(message.id);\n position += 1;\n }\n }\n\n if (thread[0]!.title === null || thread[0]!.title === undefined) {\n const title = titleOf(messages);\n if (title !== null) {\n await q`\n UPDATE ${this.threads(q)} SET title = ${title}\n WHERE id = ${threadId} AND title IS NULL\n `;\n }\n }\n });\n }\n\n async removeMessages(threadId: string, messageIds: string[]): Promise<void> {\n if (messageIds.length === 0) return;\n await this.run(async (q) => {\n await q`\n DELETE FROM ${this.messages(q)}\n WHERE thread_id = ${threadId} AND ${this.inScope(q)}\n AND id IN (${list(q, [...new Set(messageIds)])})\n `;\n });\n }\n\n async loadSummaries(threadId: string): Promise<ThreadSummary[]> {\n return this.run(async (q) => {\n const [row] = (await q`\n SELECT summaries FROM ${this.threads(q)} WHERE id = ${threadId} AND ${this.inScope(q)}\n `) as Row[];\n return row ? parseSummaries(row.summaries) : [];\n });\n }\n\n async saveSummary(threadId: string, summary: ThreadSummary): Promise<void> {\n await this.atomically(async (q) => {\n await q`\n UPDATE ${this.threads(q)} SET updated_at = updated_at\n WHERE id = ${threadId} AND ${this.inScope(q)}\n `;\n const [row] = (await q`\n SELECT summaries FROM ${this.threads(q)} WHERE id = ${threadId} AND ${this.inScope(q)}\n `) as Row[];\n // A thread that is gone has nothing to summarise; the summary goes with it.\n if (!row) return;\n const summaries = keepSummary(parseSummaries(row.summaries), summary);\n await q`\n UPDATE ${this.threads(q)} SET summaries = ${JSON.stringify(summaries)}\n WHERE id = ${threadId}\n `;\n });\n }\n\n /**\n * A compare-and-set on the thread's row: taken when no one holds it or the\n * holder's `ttlMs` has run out. One lock per thread rather than per cut,\n * which only means two cuts of one thread are not summarised at once.\n */\n async lockSummary(\n threadId: string,\n cutMessageId: string,\n ttlMs: number,\n ): Promise<(() => Promise<void>) | null> {\n const token = `${cutMessageId}:${crypto.randomUUID()}`;\n const taken = await this.run(async (q) => {\n const now = this.clock(q);\n const result = await q`\n UPDATE ${this.threads(q)}\n SET summary_lock = ${token}, summary_lock_until = ${now} + ${this.ms(q, ttlMs)}\n WHERE id = ${threadId} AND ${this.inScope(q)}\n AND (summary_lock_until IS NULL OR summary_lock_until <= ${now})\n `;\n return affected(result) > 0;\n });\n if (!taken) return null;\n return async () => {\n await this.run(async (q) => {\n await q`\n UPDATE ${this.threads(q)} SET summary_lock = NULL, summary_lock_until = NULL\n WHERE id = ${threadId} AND ${this.inScope(q)} AND summary_lock = ${token}\n `;\n });\n };\n }\n\n // --- for the app's own routes ------------------------------------------\n\n /** One thread's record, or `null` for an id the store does not have. */\n async getThread(threadId: string): Promise<AgentThreadRecord | null> {\n return this.run(async (q) => {\n const [row] = (await q`\n SELECT id, user_id, title, created_at, updated_at FROM ${this.threads(q)}\n WHERE id = ${threadId} AND ${this.inScope(q)}\n `) as Row[];\n return row ? threadOf(row) : null;\n });\n }\n\n /**\n * The threads, most recently written first: all of them, or one user's\n * (`userId` as `createThread` was given it). For a \"your conversations\"\n * list; `limit` defaults to 50, and `offset` pages. A scoped view lists its\n * scope's threads only.\n */\n async listThreads(\n options: { userId?: string | number | null; limit?: number; offset?: number } = {},\n ): Promise<AgentThreadRecord[]> {\n const limit = Math.max(0, Math.floor(options.limit ?? 50));\n const offset = Math.max(0, Math.floor(options.offset ?? 0));\n return this.run(async (q) => {\n const where =\n options.userId === undefined\n ? q`1 = 1`\n : options.userId === null\n ? q`user_id IS NULL`\n : q`user_id = ${String(options.userId)}`;\n const rows: Row[] = await q`\n SELECT id, user_id, title, created_at, updated_at FROM ${this.threads(q)}\n WHERE ${this.inScope(q)} AND ${where}\n ORDER BY updated_at DESC, id DESC\n LIMIT ${limit} OFFSET ${offset}\n `;\n return rows.map(threadOf);\n });\n }\n\n /**\n * Deletes the thread, its messages and its summaries. An id the store does\n * not have is ignored. Agent memories scoped to the thread are not touched:\n * see `AgentMemories.deleteScope`.\n */\n async deleteThread(threadId: string): Promise<void> {\n await this.atomically(async (q) => {\n // The thread's scope is checked on the thread's row; its messages go\n // only once the row is known to be this view's.\n const thread: Row[] = await q`\n SELECT id FROM ${this.threads(q)} WHERE id = ${threadId} AND ${this.inScope(q)}\n `;\n if (thread.length === 0) return;\n await q`DELETE FROM ${this.messages(q)} WHERE thread_id = ${threadId}`;\n await q`DELETE FROM ${this.threads(q)} WHERE id = ${threadId}`;\n });\n }\n\n // --- plumbing -------------------------------------------------------------\n\n /**\n * Runs `fn` in a transaction: a savepoint in the open ORM transaction when it\n * is on this store's connection, a transaction of its own otherwise.\n */\n private atomically<T>(fn: (q: SQL) => Promise<T>): Promise<T> {\n this.guard();\n if (this.joinable()) {\n return withTransaction(this.sql, (tx) => fn(tx as unknown as SQL), {\n connection: this.connection,\n });\n }\n const scope = this.scope;\n const beginScope = this.options.beginScope;\n const begin = () =>\n this.sql.begin(async (tx) => {\n if (scope !== null && beginScope) await beginScope(tx as unknown as SQL, scope);\n return fn(tx as unknown as SQL);\n }) as Promise<T>;\n if (this.dialect !== \"sqlite\") return begin();\n // One SQLite client is one connection, which holds one transaction at a\n // time: a second `begin` while the first is open fails with \"cannot start\n // a transaction within a transaction\". So this client's transactions take\n // turns. (Several clients on one file wait on SQLite's own lock.)\n const previous = sqliteQueue.get(this.sql) ?? Promise.resolve();\n const next = previous.then(begin, begin);\n sqliteQueue.set(\n this.sql,\n next.then(\n () => {},\n () => {},\n ),\n );\n return next;\n }\n\n /** The open ORM transaction, when it is on this store's connection. */\n private joinable(): TransactionSQL | undefined {\n if (this.connection === undefined) return undefined;\n const tx = currentTransaction();\n if (tx === undefined || currentConnectionName() !== this.connection) return undefined;\n return tx;\n }\n\n /**\n * Runs one call's statements: in the open ORM transaction when there is one\n * on this connection, in a transaction of its own when a scoped view has\n * `beginScope` (so the hook's setting covers them), on the client otherwise.\n * The handle is read at each call and never kept: a stored transaction\n * handle outlives its transaction.\n */\n private run<T>(fn: (q: SQL) => Promise<T>): Promise<T> {\n this.guard();\n const tx = this.joinable() as SQL | undefined;\n if (tx) return fn(tx);\n if (this.scope !== null && this.options.beginScope) return this.atomically(fn);\n return fn(this.sql);\n }\n\n private guard() {\n if (this.scope === null && this.options.requireScope) {\n throw new Error(\n \"This DatabaseAgentStore requires a scope: call it through store.forScope(scope).\",\n );\n }\n }\n\n /** The scope condition: `1 = 1` on the unscoped store, which reads every row. */\n private inScope(q: SQL) {\n return this.scope === null ? q`1 = 1` : q`scope = ${this.scope}`;\n }\n\n\n private quote(name: string) {\n return this.dialect === \"mysql\" || this.dialect === \"mariadb\" ? `\\`${name}\\`` : `\"${name}\"`;\n }\n\n private threads(q: SQL) {\n return q.unsafe(this.quote(this.threadsTable));\n }\n\n private messages(q: SQL) {\n return q.unsafe(this.quote(this.messagesTable));\n }\n\n /** The database's clock, in epoch milliseconds. As in `DatabaseAgentJobStore`. */\n private clock(q: SQL) {\n switch (this.dialect) {\n case \"postgres\":\n return q`floor(extract(epoch from statement_timestamp()) * 1000)::bigint`;\n case \"mysql\":\n case \"mariadb\":\n return q`(TIMESTAMPDIFF(MICROSECOND, '1970-01-01 00:00:00', UTC_TIMESTAMP(6)) DIV 1000)`;\n case \"sqlite\":\n return q`CAST((julianday('now') - 2440587.5) * 86400000 AS INTEGER)`;\n }\n }\n\n private ms(q: SQL, value: number) {\n const ms = Math.max(0, Math.round(value));\n return this.dialect === \"mysql\" || this.dialect === \"mariadb\"\n ? q`CAST(${ms} AS SIGNED)`\n : q`CAST(${ms} AS BIGINT)`;\n }\n}\n\nfunction plainIdentifier(table: string, which: string): string {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(table)) {\n throw new Error(\n `The agent ${which} table name \"${table}\" is not a plain identifier. Use letters, digits and underscores.`,\n );\n }\n return table;\n}\n\nfunction missingThread(threadId: string): Error {\n // As `MemoryAgentStore` says it: the controller checks before the run and\n // never reaches this; a store-level caller that does gets told.\n return new Error(`Thread ${threadId} does not exist here, or has been deleted.`);\n}\n\nfunction list(q: SQL, values: string[]) {\n return values.map((value) => q`${value}`).reduce((all, one) => q`${all}, ${one}`);\n}\n\nfunction titleOf(messages: AgentMessage[]): string | null {\n for (const message of messages) {\n // An event (#1181) is the server's, not what the person asked about.\n if (message.role !== \"user\" || message.event) continue;\n const text = message.content\n .map((part) => (part.type === \"text\" ? part.text : \"\"))\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\n if (text) return text.length > TITLE_LENGTH ? `${text.slice(0, TITLE_LENGTH - 1)}…` : text;\n }\n return null;\n}\n\nfunction parseSummaries(value: unknown): ThreadSummary[] {\n if (value === null || value === undefined || value === \"\") return [];\n const parsed = JSON.parse(String(value));\n return Array.isArray(parsed) ? (parsed as ThreadSummary[]) : [];\n}\n\nfunction threadOf(row: Row): AgentThreadRecord {\n return {\n id: String(row.id),\n userId: row.user_id === null || row.user_id === undefined ? null : String(row.user_id),\n title: row.title === null || row.title === undefined ? null : String(row.title),\n createdAt: Number(row.created_at),\n updatedAt: Number(row.updated_at),\n };\n}\n\n/** Rows an `UPDATE` touched, across the three drivers. */\nfunction affected(result: unknown): number {\n const counts = result as { count?: number | null; affectedRows?: number | null };\n return Math.max(Number(counts.count ?? 0), Number(counts.affectedRows ?? 0));\n}\n\n/**\n * The tables as Prisma generates them for the models in the docs, with\n * `IF NOT EXISTS` added.\n */\nexport function createAgentStoreTableStatements(\n dialect: Dialect,\n threadsTable: string,\n messagesTable: string,\n): string[] {\n if (dialect === \"mysql\" || dialect === \"mariadb\") {\n return [\n `CREATE TABLE IF NOT EXISTS \\`${threadsTable}\\` (\n \\`id\\` VARCHAR(191) NOT NULL,\n \\`scope\\` VARCHAR(191) NULL,\n \\`user_id\\` VARCHAR(191) NULL,\n \\`title\\` TEXT NULL,\n \\`summaries\\` LONGTEXT NULL,\n \\`summary_lock\\` VARCHAR(191) NULL,\n \\`summary_lock_until\\` BIGINT NULL,\n \\`created_at\\` BIGINT NOT NULL,\n \\`updated_at\\` BIGINT NOT NULL,\n\n INDEX \\`${threadsTable}_user_id_updated_at_idx\\`(\\`user_id\\`, \\`updated_at\\`),\n INDEX \\`${threadsTable}_scope_user_id_updated_at_idx\\`(\\`scope\\`, \\`user_id\\`, \\`updated_at\\`),\n PRIMARY KEY (\\`id\\`)\n) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`,\n `CREATE TABLE IF NOT EXISTS \\`${messagesTable}\\` (\n \\`thread_id\\` VARCHAR(191) NOT NULL,\n \\`scope\\` VARCHAR(191) NULL,\n \\`id\\` VARCHAR(191) NOT NULL,\n \\`position\\` INTEGER NOT NULL,\n \\`message\\` LONGTEXT NOT NULL,\n \\`created_at\\` BIGINT NOT NULL,\n\n UNIQUE INDEX \\`${messagesTable}_thread_id_position_key\\`(\\`thread_id\\`, \\`position\\`),\n PRIMARY KEY (\\`thread_id\\`, \\`id\\`)\n) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`,\n ];\n }\n\n const threadsKey =\n dialect === \"sqlite\" ? `\"id\" TEXT NOT NULL PRIMARY KEY,` : `\"id\" TEXT NOT NULL,`;\n const threadsConstraint =\n dialect === \"sqlite\" ? \"\" : `,\\n\\n CONSTRAINT \"${threadsTable}_pkey\" PRIMARY KEY (\"id\")`;\n return [\n `CREATE TABLE IF NOT EXISTS \"${threadsTable}\" (\n ${threadsKey}\n \"scope\" TEXT,\n \"user_id\" TEXT,\n \"title\" TEXT,\n \"summaries\" TEXT,\n \"summary_lock\" TEXT,\n \"summary_lock_until\" BIGINT,\n \"created_at\" BIGINT NOT NULL,\n \"updated_at\" BIGINT NOT NULL${threadsConstraint}\n)`,\n `CREATE INDEX IF NOT EXISTS \"${threadsTable}_user_id_updated_at_idx\" ON \"${threadsTable}\"(\"user_id\", \"updated_at\")`,\n `CREATE INDEX IF NOT EXISTS \"${threadsTable}_scope_user_id_updated_at_idx\" ON \"${threadsTable}\"(\"scope\", \"user_id\", \"updated_at\")`,\n `CREATE TABLE IF NOT EXISTS \"${messagesTable}\" (\n \"thread_id\" TEXT NOT NULL,\n \"scope\" TEXT,\n \"id\" TEXT NOT NULL,\n \"position\" INTEGER NOT NULL,\n \"message\" TEXT NOT NULL,\n \"created_at\" BIGINT NOT NULL,\n\n CONSTRAINT \"${messagesTable}_pkey\" PRIMARY KEY (\"thread_id\", \"id\")\n)`,\n `CREATE UNIQUE INDEX IF NOT EXISTS \"${messagesTable}_thread_id_position_key\" ON \"${messagesTable}\"(\"thread_id\", \"position\")`,\n ];\n}\n\n/**\n * What brings tables created before scopes (#1177) up to date, per table: the\n * `scope` column, and on the threads table its index. Run only for a table\n * that does not have the column yet.\n */\nexport function addScopeColumnStatements(\n dialect: Dialect,\n threadsTable: string,\n messagesTable: string,\n): [table: string, statements: string[]][] {\n if (dialect === \"mysql\" || dialect === \"mariadb\") {\n return [\n [\n threadsTable,\n [\n `ALTER TABLE \\`${threadsTable}\\` ADD COLUMN \\`scope\\` VARCHAR(191) NULL, ADD INDEX \\`${threadsTable}_scope_user_id_updated_at_idx\\`(\\`scope\\`, \\`user_id\\`, \\`updated_at\\`)`,\n ],\n ],\n [messagesTable, [`ALTER TABLE \\`${messagesTable}\\` ADD COLUMN \\`scope\\` VARCHAR(191) NULL`]],\n ];\n }\n return [\n [\n threadsTable,\n [\n `ALTER TABLE \"${threadsTable}\" ADD COLUMN \"scope\" TEXT`,\n `CREATE INDEX IF NOT EXISTS \"${threadsTable}_scope_user_id_updated_at_idx\" ON \"${threadsTable}\"(\"scope\", \"user_id\", \"updated_at\")`,\n ],\n ],\n [messagesTable, [`ALTER TABLE \"${messagesTable}\" ADD COLUMN \"scope\" TEXT`]],\n ];\n}\n",
|
|
32
32
|
"import type { AgentRun } from \"../Agent\";\nimport type { LiveRuns } from \"../AgentController\";\nimport type { AgentStreamEvent, AgentStreamFrame } from \"../types\";\n\n/** Long enough that a refresh, a tab restore or a flaky mobile connection still\n * lands on the tail; short enough that a finished run is not resident for the\n * rest of the day. */\nconst DEFAULT_TTL_MS = 60 * 1000;\n\n/**\n * The oldest an entry may get, ended or not, unless its run's own time limit is\n * longer. See `MemoryLiveRuns.maxAgeMs`.\n *\n * Six times the agent's default `maxRunDurationMs`, so it never races a\n * deadline: a run that honours its limit has ended and been evicted on the\n * `ttlMs` clock long before this. What reaches it is a run that could not be\n * stopped by its deadline, e.g. one wedged in an `onMessage` that never settles.\n */\nconst DEFAULT_MAX_AGE_MS = 60 * 60 * 1000;\n\n/** The longest delay `setTimeout` keeps; past it the runtime fires in ~1ms. */\nconst MAX_TIMER_MS = 2 ** 31 - 1;\n\n/**\n * How many frames are kept per run.\n *\n * The window has to be bounded or it is a memory leak with a long fuse: a\n * server that never restarts holding every token of every conversation it ever\n * streamed.\n *\n * It was 512 on the reasoning that a reattaching client only needs seconds of\n * catch-up. That is true of the *reattaching* client and false of the one that\n * never left: a frame is roughly a token, so 512 is a four-hundred-word answer,\n * and a reader that falls behind a longer one by more than that is cut off with\n * a 410 mid-stream. On a slow connection — the case reattachment exists for —\n * that is not exotic.\n *\n * 4096 covers essentially any single answer. It is affordable because of two\n * measured facts, and it would not have been before either:\n *\n * - `drain` no longer copies the window per wake, so a reader costs the same\n * whatever the window's size. Measured at 64 readers on a 2000-frame run:\n * 1106 ms of CPU at 4096 before, 425 ms after, and 468 ms at 512 — i.e. the\n * size stopped being a term in the cost.\n * - the entries are pointers to frames the run is holding anyway, so the\n * window costs 8 bytes each, not the frame. Eight times more of them is\n * ~28 KB per run, and a thousand concurrent runs is tens of megabytes.\n *\n * Both would change if the run's own buffer ever became bounded — then this\n * window owns the frames, and its size is their size.\n */\nconst DEFAULT_MAX_FRAMES = 4096;\n\n/**\n * A cursor older than anything still buffered.\n *\n * Deliberately an error rather than \"here is the tail I still have\". A client\n * that asked for frame 12 and silently got frame 300 onwards has a transcript\n * with a hole in it and no way to know — it will render a half-message, or an\n * `awaiting-input` for a tool call it never saw. Saying so lets the client do\n * the only correct thing, which is to reload the thread from the store.\n */\nexport class FrameCursorEvictedError extends Error {\n readonly code = \"frame_cursor_evicted\";\n\n constructor(\n readonly runId: string,\n readonly requested: number,\n readonly oldest: number,\n ) {\n super(\n `Frame ${requested} of run ${runId} has been evicted; the oldest frame ` +\n `still buffered is ${oldest}. Reload the thread instead of resuming.`,\n );\n }\n}\n\n/**\n * No run under that id in *this* process.\n *\n * Which is the honest answer, and the one worth being loud about: the run may\n * well be alive on the box next door. See the note on `MemoryLiveRuns` — behind\n * a round-robin load balancer this is what a refresh hits roughly (n-1)/n of\n * the time, and an explicit miss is the difference between a bug someone finds\n * in an hour and one that presents as \"reattach sometimes does nothing\".\n */\nexport class LiveRunNotFoundError extends Error {\n readonly code = \"live_run_not_found\";\n\n constructor(readonly runId: string) {\n super(`No live run ${runId} in this process.`);\n }\n}\n\nexport type RegisterParams = {\n threadId?: string;\n /**\n * Who started the run, as an opaque key (`AgentController.runOwner` makes it\n * `user:<id>`), or `null`/absent for a run nobody in particular owns: an\n * anonymous turn, or one the server started itself (#442).\n *\n * Recorded so `attach` and `stop` can tell the caller from the owner without a\n * store round trip: a `threadId`, a `runId` and a client-minted `clientRunId`\n * are all handles a third party can come to hold, and none of them says whose\n * run it is. An owned run answers only the same key; an unowned one answers\n * whoever holds a handle, which is what every run did before this existed.\n */\n owner?: string | null;\n /**\n * The client's own name for this run, minted before the run had one.\n *\n * `runId` does not reach the client until `run-start`, and a stateless first\n * turn has no `threadId` either, so for the length of a network round trip\n * plus the provider's time to first token there is nothing for `/stop` to\n * name — which is exactly the window a user cancels in. `useChat` sends a\n * `clientRunId` with every turn it starts; recording it here is what makes\n * that window stoppable.\n */\n clientRunId?: string;\n /**\n * Called once per frame, in order, off the buffering path.\n *\n * The controller's `on*` hooks hang off this. It is a callback rather than a\n * second `run.frames()` subscription because every extra subscriber is\n * another consumer of a generator whose multi-subscriber behaviour we do not\n * own, and one pump is one thing to reason about.\n */\n onEvent?: (event: AgentStreamEvent) => void | Promise<void>;\n /** Reported failures: a hook that threw, or a run whose frame iterator did.\n * Injectable so tests can assert on it instead of reading stderr. */\n onInternalError?: (error: unknown) => void;\n /**\n * The run's own time limit (`Agent.maxRunDurationMs`), when the caller knows\n * it. The entry's age ceiling is never shorter than this plus `ttlMs`, so a\n * run allowed two hours is not cut off at `maxAgeMs`; `null` is a run with no\n * limit, and its entry has no ceiling either. Omitted, the ceiling is\n * `maxAgeMs`.\n */\n maxRunDurationMs?: number | null;\n};\n\ntype Entry = {\n run: AgentRun;\n threadId?: string;\n /** See `RegisterParams.owner`. `null` is unowned. */\n owner: string | null;\n clientRunId?: string;\n /** A contiguous window of the run's frames, oldest first. */\n frames: AgentStreamFrame[];\n lastSeq: number;\n /**\n * The lowest `seq` still obtainable, or 0 while nothing has been dropped.\n *\n * Not derivable from `frames[0].seq`, which is what this used to compare\n * against. `seq` starts at 1, so a run that has evicted nothing still has an\n * oldest frame of 1, and a cursor of 0 — the \"I have no transcript yet\"\n * cursor that `replay` itself picks for a run registered but not yet pumped —\n * read as older than the buffer. A ten-frame run in a five-hundred-frame\n * window answered a refresh with 410, which is both false and unactionable:\n * refreshing right after sending is the case `/attach` exists to serve.\n */\n lostBefore: number;\n ended: boolean;\n /**\n * Dropped from the map while its run was still going (the age ceiling).\n * Readers finish on it as they would on `ended`, and the pump stops\n * buffering frames nobody can read any more.\n */\n evicted: boolean;\n evictAt: ReturnType<typeof setTimeout> | null;\n /** The age ceiling's timer. See `maxAgeMs`. */\n expireAt: ReturnType<typeof setTimeout> | null;\n wake: Set<() => void>;\n /**\n * Bumped on every push and on the end.\n *\n * A reader cannot just park on \"wake me when something happens\": it suspends\n * at every `yield` while its consumer reads, and anything that arrives during\n * that suspension notifies an empty waiter set — so the reader parks *after*\n * the event it was waiting for and never hears another. The version it read\n * before scanning is what closes that window: if it moved, there is more to\n * scan and the wait is skipped.\n */\n version: number;\n};\n\n/**\n * The runs currently in flight in this process, and their recent frames.\n *\n * PER-PROCESS IS NOT AN IMPLEMENTATION SHORTCUT THAT A BETTER STORE FIXES. A\n * running generator lives in one process, and a second server cannot attach to\n * it — no amount of Redis moves an in-flight async iterator across a socket.\n * Reattachment therefore needs the request to land where the run is: one\n * server, sticky routing, or a proxy that forwards by `runId`. Worth saying out\n * loud, because the failure mode behind a round-robin load balancer is a\n * refresh that usually works.\n *\n * `find` and `replay` are built so that failure is an explicit miss — a 404\n * naming the run, a 410 naming the cursor — and never an SSE stream that opens,\n * says nothing and closes. An empty stream is indistinguishable from a run that\n * finished quietly, which is exactly the confusion this is supposed to avoid.\n */\nexport class MemoryLiveRuns implements LiveRuns {\n ttlMs: number;\n readonly maxFrames: number;\n /**\n * The oldest an entry may get, counted from `register`, whether or not its\n * run has ended. Default one hour; `null` turns the ceiling off.\n *\n * Eviction normally runs on the `ttlMs` clock, which starts when the run\n * ends — so a run that never ends was never evicted, and its entry, its\n * frames and everything the run closes over stayed in the map for the life\n * of the process (#455). The agent's `maxRunDurationMs` is what ends such a\n * run now; this is the backstop for one that still does not end. When it\n * fires the run is stopped (a no-op for one that has ended) and the entry is\n * evicted `ttlMs` later, ended or not, so a reader attached to it gets the\n * stopped run's last frames and then a closed stream rather than a hang.\n *\n * Per entry it is never shorter than the run's own limit plus `ttlMs`, when\n * the registering caller passes one (`AgentController` does). Read at\n * `register`, so changing it affects runs registered afterwards.\n */\n maxAgeMs: number | null;\n\n private runs = new Map<string, Entry>();\n /** Thread to the most recently registered run for it. */\n private byThread = new Map<string, string>();\n /** The client's pre-`run-start` name for a run, to the run. */\n private byClientRun = new Map<string, string>();\n\n constructor(params: { ttlMs?: number; maxFrames?: number; maxAgeMs?: number | null } = {}) {\n this.ttlMs = params.ttlMs ?? DEFAULT_TTL_MS;\n this.maxFrames = params.maxFrames ?? DEFAULT_MAX_FRAMES;\n this.maxAgeMs = params.maxAgeMs === undefined ? DEFAULT_MAX_AGE_MS : params.maxAgeMs;\n }\n\n /**\n * Takes ownership of a run: starts buffering its frames and holds it until\n * `ttlMs` past the end.\n *\n * Settles once the run's last frame has been buffered and every `onEvent` it\n * led to has settled, and never rejects. The hooks run on a chain of their\n * own (see `pump`), so a frame's hook can be called well after the frame\n * arrived — after the run, too — and whoever needs to wait for the app's\n * code has only this to wait on: by the time a hook is called it is too late\n * to start waiting for it.\n */\n register(run: AgentRun, params: RegisterParams = {}): Promise<void> {\n const entry: Entry = {\n run: run as AgentRun,\n threadId: params.threadId,\n owner: params.owner ?? null,\n clientRunId: params.clientRunId,\n frames: [],\n lastSeq: -1,\n lostBefore: 0,\n ended: false,\n evicted: false,\n evictAt: null,\n expireAt: null,\n wake: new Set(),\n version: 0,\n };\n this.runs.set(run.runId, entry);\n if (params.threadId) {\n this.byThread.set(params.threadId, run.runId);\n }\n if (params.clientRunId) {\n this.byClientRun.set(params.clientRunId, run.runId);\n }\n this.scheduleExpiry(entry, params.maxRunDurationMs);\n return this.pump(entry, params);\n }\n\n /**\n * The run a client named before the server had named it.\n *\n * Deliberately not folded into `find`, whose parameter is part of the\n * read-side `LiveRuns` interface an app may already implement — widening that\n * parameter would break every such implementation, and this lookup is only\n * ever asked by `/stop`.\n */\n findByClientRunId(clientRunId: string): string | null {\n const runId = this.byClientRun.get(clientRunId);\n return runId && this.runs.has(runId) ? runId : null;\n }\n\n /** What the client asks after a refresh: is anything still going here? */\n async find(params: { threadId: string }): Promise<{ runId: string; seq: number } | null> {\n const runId = this.byThread.get(params.threadId);\n if (!runId) {\n return null;\n }\n const entry = this.runs.get(runId);\n if (!entry) {\n return null;\n }\n // `seq` is the last frame emitted, not the next one: it is the same number\n // the transport puts in `Last-Event-ID`, so a client can compare the two\n // without knowing which end of the range each one means.\n return { runId, seq: entry.lastSeq };\n }\n\n get(runId: string): AgentRun | null {\n return this.runs.get(runId)?.run ?? null;\n }\n\n /** Who started the run (see `RegisterParams.owner`); `null` for an unowned\n * run and for one this process does not hold. */\n ownerOf(runId: string): string | null {\n return this.runs.get(runId)?.owner ?? null;\n }\n\n /**\n * Whether `caller` may read or stop the run: an unowned run (and one this\n * process does not hold) answers anyone, an owned one only its owner. A\n * caller with no key (`null`, an anonymous request) is not the owner of\n * anything.\n */\n mayAccess(runId: string, caller: string | null): boolean {\n const owner = this.ownerOf(runId);\n return owner === null || owner === caller;\n }\n\n /** Whether the run is still going, as opposed to ended and kept for `ttlMs`,\n * or not here at all. */\n isRunning(runId: string): boolean {\n const entry = this.runs.get(runId);\n return !!entry && !entry.ended && !entry.evicted;\n }\n\n /**\n * The buffered frames from `from` onwards, followed by live ones until the\n * run ends.\n *\n * Throws before returning anything, so an evicted cursor and an unknown run\n * are still HTTP statuses rather than events on a stream that already\n * committed to a 200.\n *\n * `from` omitted means \"start wherever you still can\", not \"start at 0\".\n * These are genuinely different requests: a client that names a cursor is\n * telling us where its transcript ends, and handing it a later frame leaves\n * an invisible hole — that is the 410. A client with no cursor at all — the\n * browser reattaching on mount, which is the case `/attach` exists for — has\n * no transcript to put a hole in, and refusing it the tail because the run is\n * older than the buffer would 410 every run past `maxFrames`, i.e. every run\n * long enough to be worth reattaching to.\n */\n replay(runId: string, from?: number): AsyncIterable<AgentStreamFrame> {\n const entry = this.runs.get(runId);\n if (!entry) {\n throw new LiveRunNotFoundError(runId);\n }\n if (from !== undefined && from < entry.lostBefore) {\n throw new FrameCursorEvictedError(runId, from, entry.lostBefore);\n }\n const oldest = entry.frames[0]?.seq;\n // With nothing buffered — a run registered but not yet pumped — `lastSeq`\n // is -1 and this is 0, which is the same answer by another route.\n return this.drain(entry, runId, from ?? oldest ?? entry.lastSeq + 1);\n }\n\n /** Test seam: drops everything and cancels the pending eviction timers. */\n clear(): void {\n for (const entry of this.runs.values()) {\n if (entry.evictAt) {\n clearTimeout(entry.evictAt);\n }\n if (entry.expireAt) {\n clearTimeout(entry.expireAt);\n }\n // Marked ended before waking: a reader parked on `wait` would otherwise\n // come back, find the entry unfinished, and park again forever.\n entry.ended = true;\n this.notify(entry);\n }\n this.runs.clear();\n this.byThread.clear();\n this.byClientRun.clear();\n }\n\n get size(): number {\n return this.runs.size;\n }\n\n private async pump(entry: Entry, params: RegisterParams): Promise<void> {\n // Hooks run on their own chain: they stay in order relative to each other,\n // and a slow one never stalls the buffer a reattaching client reads from.\n let hooks = Promise.resolve();\n try {\n for await (const frame of entry.run.frames()) {\n // Evicted by the age ceiling with the run still going: nobody can\n // reach this entry any more, so its frames are not kept. The hooks\n // below still hear them — they are the app's, and the run is not over.\n if (entry.evicted) {\n const onEvent = params.onEvent;\n if (onEvent) {\n hooks = hooks.then(() => onEvent(frame.event)).catch((err) => report(params, err));\n }\n continue;\n }\n entry.frames.push(frame);\n entry.lastSeq = frame.seq;\n if (entry.frames.length > this.maxFrames) {\n const dropped = entry.frames.shift();\n if (dropped) entry.lostBefore = dropped.seq + 1;\n }\n this.notify(entry);\n const onEvent = params.onEvent;\n if (onEvent) {\n hooks = hooks.then(() => onEvent(frame.event)).catch((err) => report(params, err));\n }\n }\n } catch (err) {\n // The run's own iterator failed. There is nothing left to replay, so the\n // entry ends here; whoever is attached sees the stream close.\n report(params, err);\n } finally {\n entry.ended = true;\n if (entry.expireAt) {\n clearTimeout(entry.expireAt);\n entry.expireAt = null;\n }\n this.notify(entry);\n // Eviction is scheduled off the ttl clock, BEFORE the hook chain is\n // awaited. `hooks` is app code — `onAwaitingInput` is documented as the\n // place to notify an approver, i.e. network I/O — and a `fetch` with no\n // timeout never rejects, it just never settles. Awaiting it first made\n // retention conditional on app code: one hanging hook pinned its entry,\n // its 512 frames, the run and everything the run closes over in the map\n // for the life of the process, and `find` kept answering with a run that\n // ended hours ago. Retention is this class's job and belongs on its own\n // clock. A hook still pending when the timer fires simply outlives the\n // entry, which is fine — it holds no reference the map needed.\n this.scheduleEviction(entry);\n await hooks;\n }\n }\n\n private async *drain(\n entry: Entry,\n runId: string,\n from: number,\n ): AsyncGenerator<AgentStreamFrame, void, void> {\n let cursor = from;\n while (true) {\n const seen = entry.version;\n // The window is contiguous and ordered, so a reader's position in it is\n // arithmetic, not a search. This used to copy the whole window on every\n // wake and scan it for frames past the cursor, which is O(window) per\n // frame per reader — invisible at a 512-frame cap and the reason the cap\n // could not be raised. Indexing makes the window's size stop mattering.\n for (;;) {\n if (cursor < entry.lostBefore) {\n // The window rolled past this reader mid-stream. Same reasoning as\n // the pre-flight check: a gap the client cannot see is worse than a\n // stream that stops and says why. Re-checked inside the loop rather\n // than once per wake, because a yield suspends this reader for as\n // long as its consumer takes and the pump keeps running.\n throw new FrameCursorEvictedError(runId, cursor, entry.lostBefore);\n }\n const frames = entry.frames;\n const oldest = frames[0]?.seq;\n if (oldest === undefined) {\n break;\n }\n // Clamped rather than treated as a gap: a cursor below the first seq\n // that ever existed is \"from the beginning\", not a lost position.\n const index = Math.max(0, cursor - oldest);\n if (index >= frames.length) {\n break;\n }\n const frame = frames[index]!;\n yield frame;\n cursor = frame.seq + 1;\n }\n if ((entry.ended && cursor > entry.lastSeq) || entry.evicted) {\n return;\n }\n await this.wait(entry, seen);\n }\n }\n\n private wait(entry: Entry, seen: number): Promise<void> {\n if (entry.version !== seen) {\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => entry.wake.add(resolve));\n }\n\n private notify(entry: Entry): void {\n entry.version++;\n const waiters = Array.from(entry.wake);\n entry.wake.clear();\n for (const resolve of waiters) {\n resolve();\n }\n }\n\n private scheduleEviction(entry: Entry): void {\n if (entry.evictAt) {\n return;\n }\n const timer = setTimeout(() => {\n const runId = entry.run.runId;\n if (!entry.ended) {\n // The age ceiling, with the run still going. Its frames are released\n // here because the pump of a run that has not ended still holds the\n // entry, and readers are told to finish (see `drain`), since `ended`\n // may never come. An ended entry keeps both: a reader still behind on\n // it finishes the tail it was reading, as it always has.\n entry.evicted = true;\n entry.frames = [];\n }\n if (this.runs.get(runId) === entry) this.runs.delete(runId);\n if (entry.threadId && this.byThread.get(entry.threadId) === runId) {\n this.byThread.delete(entry.threadId);\n }\n if (entry.clientRunId && this.byClientRun.get(entry.clientRunId) === runId) {\n this.byClientRun.delete(entry.clientRunId);\n }\n // Anyone still draining is holding an ended entry; wake them so they see\n // `ended` and finish rather than hanging on a promise nothing resolves.\n this.notify(entry);\n }, this.ttlMs);\n // A finished run must not be the reason a process stays up.\n (timer as { unref?: () => void }).unref?.();\n entry.evictAt = timer;\n }\n\n /**\n * The age ceiling: stops the run and starts the `ttlMs` eviction clock at\n * `maxAgeMs` after `register`, whether or not the run has ended. See\n * `maxAgeMs`.\n */\n private scheduleExpiry(entry: Entry, runLimit: number | null | undefined): void {\n if (this.maxAgeMs === null || runLimit === null) return;\n const ceiling =\n runLimit === undefined ? this.maxAgeMs : Math.max(this.maxAgeMs, runLimit + this.ttlMs);\n if (!Number.isFinite(ceiling) || ceiling > MAX_TIMER_MS) return;\n const timer = setTimeout(() => {\n entry.expireAt = null;\n if (entry.ended) return;\n try {\n entry.run.stop({\n reason: `The run was still going ${Math.round(ceiling / 1000)}s after it started, past the live-run registry's age limit.`,\n });\n } catch {\n // A run whose `stop` throws is evicted all the same.\n }\n this.scheduleEviction(entry);\n }, ceiling);\n // Like the eviction timer: never the reason a process stays up.\n (timer as { unref?: () => void }).unref?.();\n entry.expireAt = timer;\n }\n}\n\n/**\n * The process-wide default, shared by every `AgentController` that does not\n * bring its own. One map per process is the whole point — see the class note.\n */\nexport const liveRuns = new MemoryLiveRuns();\n\n/**\n * Hands `err` to `onInternalError`, which is app code too: one that throws is\n * dropped rather than rejecting the hook chain, and with it `register`'s\n * promise, which says it never rejects.\n */\nfunction report(params: RegisterParams, err: unknown): void {\n try {\n params.onInternalError?.(err);\n } catch {\n // Nothing is left to tell.\n }\n}\n",
|
|
33
33
|
"/**\n * WHO UPLOADED A PROVIDER FILE (#443).\n *\n * A provider's file id (`file-…`) is scoped to the OpenAI/Azure org, not to\n * any user of the app: the vendor will hand the document to whichever request\n * names it. So an id is a bearer token for the file, and ids leak — a shared\n * transcript, a log line, a browser history entry. Before this, a user who\n * learned another user's id could put it in their own `turn.files` and have\n * the model read the other user's document.\n *\n * `AgentController.upload` now records the id with the uploader's owner key\n * (the same `runOwner(req)` that owns a run, #442), and `stream` refuses a\n * turn naming an id recorded for anyone else with a 403.\n *\n * A record is `{ owner, name, mimeType, size, createdAt }`, keyed by the\n * provider's id. `owner: null` is an anonymous upload and is unowned: it\n * answers whoever holds the id, exactly as every id did before this existed.\n */\nexport type FileOwnerRecord = {\n /** `runOwner(req)` at upload: `user:<id>` by default, `null` for anonymous. */\n owner: string | null;\n name?: string;\n mimeType?: string;\n size?: number;\n createdAt: string;\n};\n\n/**\n * Where the records live. Two methods so an app can put them in its own table:\n *\n * class DbFileOwners implements FileOwners {\n * async record(fileId, record) { await db.agentFile.create({ data: { fileId, ...record } }) }\n * async get(fileId) { return db.agentFile.findUnique({ where: { fileId } }) }\n * }\n *\n * `get` answers `null` for an id it has no record of. What the controller does\n * with that is `AgentController.requireKnownFiles`.\n */\nexport interface FileOwners {\n record(fileId: string, record: FileOwnerRecord): Promise<void>;\n get(fileId: string): Promise<FileOwnerRecord | null>;\n}\n\n/**\n * The default: records last as long as the process, like `MemoryAgentStore`\n * and `MemoryAttachmentStore`. Bounded, oldest first, so an upload loop cannot\n * grow it without end; an evicted id reads as unknown.\n *\n * A record is never overwritten: the first owner of an id keeps it, so a\n * second `record` for the same id (which a provider never mints, but a buggy\n * or hostile override could forward) cannot move a file to another user.\n */\nexport class MemoryFileOwners implements FileOwners {\n private readonly records = new Map<string, FileOwnerRecord>();\n\n constructor(private readonly maxEntries = 100_000) {}\n\n async record(fileId: string, record: FileOwnerRecord): Promise<void> {\n if (this.records.has(fileId)) return;\n this.records.set(fileId, { ...record });\n while (this.records.size > this.maxEntries) {\n const oldest = this.records.keys().next().value;\n if (oldest === undefined) break;\n this.records.delete(oldest);\n }\n }\n\n async get(fileId: string): Promise<FileOwnerRecord | null> {\n const record = this.records.get(fileId);\n return record ? { ...record } : null;\n }\n}\n\nexport const defaultFileOwners = new MemoryFileOwners();\n",
|
|
34
34
|
"import { app } from \"../../foundation/app\";\nimport { RedisManager } from \"../../services/redis/RedisManager\";\nimport type { ToolResultPart } from \"../types\";\n\n/**\n * EXECUTION RECEIPTS: what makes an approved tool run at most once (#458).\n *\n * A pending call's signature stops an approval being forged, and its spent\n * nonce (`NonceStore`, #445) stops it being *accepted* twice. Neither records\n * what the approved tool did. So a retried submit whose response was lost, a\n * proxy retry, or an answer that reaches two instances whose nonce stores are\n * not shared, either runs `execute` again for a tool that already charged a\n * card, or is refused and the user is told their approval was not used when\n * it was.\n *\n * A receipt store closes that. Before an approved tool runs, the run claims a\n * deterministic execution id (an HMAC, under its own HKDF-derived key, of the\n * call the signature covers: issuing run, tool call id, tool name, canonical\n * input, nesting path and subject). The claim answers one of three things:\n *\n * claimed — nobody has run it: run it, then `complete` with its result.\n * replay — it already ran: the stored result is returned as the call's\n * result, and the tool is not run.\n * blocked — a claim is held but no result recorded: another instance is\n * running it right now, or the process that was running it died.\n * The call gets a `tool_error` result the model can read, and the\n * tool is not run. Not knowing whether a side effect happened is\n * exactly the case where running it again is wrong.\n *\n * Opt-in: `AgentController.receipts` (or `receipts` on `Agent.stream`). Without\n * a store an approved tool runs exactly as before.\n *\n * Implementations:\n *\n * MemoryReceiptStore — one process, lost on restart.\n * RedisReceiptStore — on the app's Redis; shared and atomic.\n * your own — e.g. a table keyed by the execution id:\n *\n * CREATE TABLE agent_tool_receipts (\n * id text PRIMARY KEY,\n * result jsonb, -- NULL while the call is running\n * expires_at timestamptz NOT NULL\n * );\n *\n * class DbReceiptStore implements ReceiptStore {\n * async claim(id, expiresAt) {\n * const inserted = await db.$executeRaw`\n * INSERT INTO agent_tool_receipts (id, expires_at)\n * VALUES (${id}, ${new Date(expiresAt)})\n * ON CONFLICT (id) DO NOTHING`;\n * if (inserted === 1) return { status: \"claimed\" };\n * const [row] = await db.$queryRaw`\n * SELECT result FROM agent_tool_receipts WHERE id = ${id}`;\n * return row?.result ? { status: \"replay\", result: row.result } : { status: \"blocked\" };\n * }\n * async complete(id, result) {\n * await db.$executeRaw`\n * UPDATE agent_tool_receipts SET result = ${result} WHERE id = ${id}`;\n * }\n * async release(id) {\n * await db.$executeRaw`\n * DELETE FROM agent_tool_receipts WHERE id = ${id} AND result IS NULL`;\n * }\n * }\n * // and, from a cron: DELETE FROM agent_tool_receipts WHERE expires_at < now()\n *\n * A receipt only has to outlive the token it answers: past `expiresAt` the\n * signature fails verification on its own, so the call cannot be presented\n * again and the receipt may be dropped.\n */\nexport interface ReceiptStore {\n /**\n * Claims `executionId` until `expiresAt` (epoch milliseconds), if nobody has.\n * Must be atomic across every process sharing the store: two concurrent\n * claims never both answer `claimed`.\n *\n * A rejection refuses the answer, as a `NonceStore` that throws does: an\n * idempotency guard that runs the tool anyway when its store is down is not\n * a guard.\n */\n claim(executionId: string, expiresAt: number): Promise<ReceiptClaim>;\n /**\n * Records the result of a claimed execution, kept until `expiresAt`. Called\n * once the tool's result is known, which may be after the run that claimed\n * it was stopped. A rejection is logged; the claim then stays held, so a\n * replay is `blocked` rather than run again.\n */\n complete(executionId: string, result: ToolResultPart, expiresAt: number): Promise<void>;\n /**\n * Drops a claim that never ran: the answer was refused after it was claimed\n * (its nonce was already spent). A recorded result is never released.\n */\n release(executionId: string): Promise<void>;\n}\n\nexport type ReceiptClaim =\n | { status: \"claimed\" }\n | { status: \"replay\"; result: ToolResultPart }\n | { status: \"blocked\" };\n\ntype MemoryReceipt = { result?: ToolResultPart; expiresAt: number };\n\n/**\n * The in-process store. Holds each receipt until its token expires, swept\n * amortized O(1) per claim. Results are copied in and out, so a caller that\n * edits the part it was handed cannot change what a replay returns.\n */\nexport class MemoryReceiptStore implements ReceiptStore {\n private readonly receipts = new Map<string, MemoryReceipt>();\n private sweepAt = 1024;\n /** Injectable for tests. */\n constructor(private readonly now: () => number = Date.now) {}\n\n async claim(executionId: string, expiresAt: number): Promise<ReceiptClaim> {\n const now = this.now();\n if (this.receipts.size >= this.sweepAt) this.sweep(now);\n const existing = this.receipts.get(executionId);\n if (existing && existing.expiresAt > now) {\n return existing.result\n ? { status: \"replay\", result: structuredClone(existing.result) }\n : { status: \"blocked\" };\n }\n this.receipts.set(executionId, { expiresAt });\n return { status: \"claimed\" };\n }\n\n async complete(executionId: string, result: ToolResultPart, expiresAt: number): Promise<void> {\n this.receipts.set(executionId, { result: structuredClone(result), expiresAt });\n }\n\n async release(executionId: string): Promise<void> {\n const existing = this.receipts.get(executionId);\n if (existing && !existing.result) this.receipts.delete(executionId);\n }\n\n get size(): number {\n return this.receipts.size;\n }\n\n private sweep(now: number) {\n for (const [id, receipt] of this.receipts) {\n if (receipt.expiresAt <= now) this.receipts.delete(id);\n }\n this.sweepAt = Math.max(1024, this.receipts.size * 2);\n }\n}\n\n/** The slice of Bun's `RedisClient` this store needs: `send(command, args)`. */\nexport interface ReceiptRedisClient {\n send(command: string, args: string[]): Promise<any>;\n}\n\nexport interface RedisReceiptStoreOptions {\n /**\n * Client to run against. Defaults to the app's shared client from\n * `RedisServiceProvider`, resolved on first use.\n */\n client?: ReceiptRedisClient;\n /** Key namespace. Defaults to `gemi:ai:receipt`. */\n prefix?: string;\n}\n\nconst PENDING = \"pending\";\nconst DONE = \"done:\";\n\n/** `SET NX`, and on a miss the value that was there, in one round trip. */\nconst CLAIM_SCRIPT = `\nif redis.call('SET', KEYS[1], ARGV[1], 'PX', ARGV[2], 'NX') then return 'claimed' end\nlocal held = redis.call('GET', KEYS[1])\nif not held then return ARGV[1] end\nreturn held`;\n\n/** Deletes the key only while it is an unfinished claim. */\nconst RELEASE_SCRIPT = `\nif redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('DEL', KEYS[1]) end\nreturn 0`;\n\n/**\n * Receipts in Redis, shared by every instance of the app. A claim is a\n * `SET ... NX` run in a script with the read that follows a miss, so claiming\n * is atomic; `PX` drops each key at the token's expiry.\n *\n * ```ts\n * const receipts = new RedisReceiptStore();\n *\n * class ChatController extends AgentController<typeof chat> {\n * agent = chat;\n * receipts = receipts;\n * }\n * ```\n */\nexport class RedisReceiptStore implements ReceiptStore {\n private readonly injectedClient?: ReceiptRedisClient;\n private readonly prefix: string;\n\n constructor(options: RedisReceiptStoreOptions = {}) {\n this.injectedClient = options.client;\n this.prefix = options.prefix ?? \"gemi:ai:receipt\";\n }\n\n async claim(executionId: string, expiresAt: number): Promise<ReceiptClaim> {\n const reply = await this.client.send(\"EVAL\", [\n CLAIM_SCRIPT,\n \"1\",\n this.key(executionId),\n PENDING,\n ttl(expiresAt),\n ]);\n // Anything else the script did not return (a client that maps an odd\n // reply to `null`, say) is `blocked`: never a reason to run the tool.\n if (reply === \"claimed\") return { status: \"claimed\" };\n const held = String(reply ?? \"\");\n if (held.startsWith(DONE)) {\n return { status: \"replay\", result: JSON.parse(held.slice(DONE.length)) as ToolResultPart };\n }\n return { status: \"blocked\" };\n }\n\n async complete(executionId: string, result: ToolResultPart, expiresAt: number): Promise<void> {\n await this.client.send(\"SET\", [\n this.key(executionId),\n DONE + JSON.stringify(result),\n \"PX\",\n ttl(expiresAt),\n ]);\n }\n\n async release(executionId: string): Promise<void> {\n await this.client.send(\"EVAL\", [RELEASE_SCRIPT, \"1\", this.key(executionId), PENDING]);\n }\n\n private key(executionId: string) {\n return `${this.prefix}:${executionId}`;\n }\n\n private get client(): ReceiptRedisClient {\n if (this.injectedClient) return this.injectedClient;\n const container = app();\n const client = container.bound(RedisManager) ? container.make(RedisManager).client : undefined;\n if (!client) {\n throw new Error(\n \"RedisReceiptStore could not reach the Redis client. Register RedisServiceProvider on your application, or pass a client: new RedisReceiptStore({ client }).\",\n );\n }\n return client;\n }\n}\n\n/** At least 1ms: `PX 0` is an error. */\nfunction ttl(expiresAt: number): string {\n return String(Math.max(1, Math.ceil(expiresAt - Date.now())));\n}\n",
|
|
35
|
-
"import type { AgentStore } from \"../AgentController\";\nimport { keepSummary, type ThreadSummary } from \"../contextCompaction\";\nimport type { AgentMessage } from \"../types\";\n\n/** A day. Long enough that a conversation survives a lunch break, short enough\n * that a chat nobody came back to is not still resident a week later. */\nconst DEFAULT_TTL_MS = 24 * 60 * 60 * 1000;\n\n/** How often the map is walked looking for expired threads. */\nconst SWEEP_INTERVAL_MS = 60 * 1000;\n\ntype Thread = {\n messages: AgentMessage[];\n /** `contextWindow.compact`'s summaries of this thread, most recent first. */\n summaries?: ThreadSummary[];\n /** Bumped by every read and every write: a conversation someone is still\n * having must not expire out from under them mid-turn. */\n touchedAt: number;\n};\n\n/**\n * The default store: conversations last as long as the process.\n *\n * It exists so that `threadId` works out of the box, not so that anything is\n * durable — a restart loses every thread, and a second server never had them.\n * That is the honest default for a framework store, and it is why stateless is\n * still the mode an app gets without asking: the client carrying its own\n * history survives a deploy, and this does not.\n *\n * Expiry is swept lazily rather than on a timer. A `setTimeout` per thread is a\n * timer per conversation and a reference the GC cannot collect, and an interval\n * running forever keeps a process alive that has nothing else to do — so the\n * sweep happens on access, at most once a minute, and an untouched process\n * simply stops sweeping.\n *\n * A thread the store does not have is `null` from `loadThread` and an error\n * from `appendMessages`, never an empty conversation. It used to be the other\n * way, and the three ways a thread goes missing — it expired, the id was\n * mistyped, it lived on an instance that was scaled in — all read as a fresh\n * chat: the history was gone with no signal, and the next turn was persisted\n * under the dead id as though it were the first. `clientOwnedIds` is the one\n * setup where an unknown id is not a lost thread, because the client minted it.\n */\nexport class MemoryAgentStore implements AgentStore {\n readonly ttlMs: number;\n /** The ids come from the client, not from `createThread`, so an id this\n * store has never seen is a conversation starting rather than one lost. */\n readonly clientOwnedIds: boolean;\n\n private threads = new Map<string, Thread>();\n private lastSweep = 0;\n\n constructor(params: { ttlMs?: number; clientOwnedIds?: boolean } = {}) {\n this.ttlMs = params.ttlMs ?? DEFAULT_TTL_MS;\n this.clientOwnedIds = params.clientOwnedIds ?? false;\n }\n\n async createThread(params: { userId?: string | number }): Promise<{ threadId: string }> {\n // The user id is not part of the id and not stored: this store cannot\n // authorize anything, and an id that looked like a key would invite an app\n // to treat it as one. Ownership belongs to the app's own table.\n void params;\n const threadId = crypto.randomUUID();\n this.threads.set(threadId,
|
|
35
|
+
"import type { AgentStore } from \"../AgentController\";\nimport { keepSummary, type ThreadSummary } from \"../contextCompaction\";\nimport type { AgentMessage } from \"../types\";\n\n/** A day. Long enough that a conversation survives a lunch break, short enough\n * that a chat nobody came back to is not still resident a week later. */\nconst DEFAULT_TTL_MS = 24 * 60 * 60 * 1000;\n\n/** How often the map is walked looking for expired threads. */\nconst SWEEP_INTERVAL_MS = 60 * 1000;\n\ntype Thread = {\n messages: AgentMessage[];\n /** The `forScope` view that created it (#1177); absent for the store itself. */\n scope?: string;\n /** `contextWindow.compact`'s summaries of this thread, most recent first. */\n summaries?: ThreadSummary[];\n /** Bumped by every read and every write: a conversation someone is still\n * having must not expire out from under them mid-turn. */\n touchedAt: number;\n};\n\n/**\n * The default store: conversations last as long as the process.\n *\n * It exists so that `threadId` works out of the box, not so that anything is\n * durable — a restart loses every thread, and a second server never had them.\n * That is the honest default for a framework store, and it is why stateless is\n * still the mode an app gets without asking: the client carrying its own\n * history survives a deploy, and this does not.\n *\n * Expiry is swept lazily rather than on a timer. A `setTimeout` per thread is a\n * timer per conversation and a reference the GC cannot collect, and an interval\n * running forever keeps a process alive that has nothing else to do — so the\n * sweep happens on access, at most once a minute, and an untouched process\n * simply stops sweeping.\n *\n * A thread the store does not have is `null` from `loadThread` and an error\n * from `appendMessages`, never an empty conversation. It used to be the other\n * way, and the three ways a thread goes missing — it expired, the id was\n * mistyped, it lived on an instance that was scaled in — all read as a fresh\n * chat: the history was gone with no signal, and the next turn was persisted\n * under the dead id as though it were the first. `clientOwnedIds` is the one\n * setup where an unknown id is not a lost thread, because the client minted it.\n */\nexport class MemoryAgentStore implements AgentStore {\n readonly ttlMs: number;\n /** The ids come from the client, not from `createThread`, so an id this\n * store has never seen is a conversation starting rather than one lost. */\n readonly clientOwnedIds: boolean;\n\n /** The scope this view is bound to (`forScope`), or `null` for the store itself. */\n readonly scope: string | null = null;\n\n private threads = new Map<string, Thread>();\n private lastSweep = 0;\n\n constructor(params: { ttlMs?: number; clientOwnedIds?: boolean } = {}) {\n this.ttlMs = params.ttlMs ?? DEFAULT_TTL_MS;\n this.clientOwnedIds = params.clientOwnedIds ?? false;\n }\n\n /**\n * This store bound to one scope (#1177), over the same threads: a thread\n * created or first written through the view is in its scope, and the view\n * sees no thread of another. The store itself sees every thread.\n */\n forScope(scope: string): MemoryAgentStore {\n if (typeof scope !== \"string\" || scope === \"\") {\n throw new TypeError(\"A MemoryAgentStore scope is a non-empty string.\");\n }\n const view = new MemoryAgentStore({ ttlMs: this.ttlMs, clientOwnedIds: this.clientOwnedIds });\n view.threads = this.threads;\n (view as { scope: string | null }).scope = scope;\n return view;\n }\n\n /** The thread, if this store or view may see it. */\n private visible(threadId: string): Thread | undefined {\n const thread = this.threads.get(threadId);\n if (!thread || this.scope === null || thread.scope === this.scope) return thread;\n return undefined;\n }\n\n /** A fresh thread, in this view's scope. */\n private fresh(): Thread {\n return {\n messages: [],\n touchedAt: Date.now(),\n ...(this.scope !== null ? { scope: this.scope } : {}),\n };\n }\n\n async createThread(params: { userId?: string | number }): Promise<{ threadId: string }> {\n // The user id is not part of the id and not stored: this store cannot\n // authorize anything, and an id that looked like a key would invite an app\n // to treat it as one. Ownership belongs to the app's own table.\n void params;\n const threadId = crypto.randomUUID();\n this.threads.set(threadId, this.fresh());\n this.sweep();\n return { threadId };\n }\n\n async loadThread(threadId: string): Promise<AgentMessage[] | null> {\n this.sweep();\n const thread = this.visible(threadId);\n if (!thread) {\n // Another scope's thread is not this view's to start.\n if (this.threads.has(threadId)) return null;\n // With client-owned ids the first turn arrives before anything has been\n // written under it, so unknown is empty. Otherwise unknown is a thread\n // that expired or never existed, and the controller has to be able to\n // tell: `[]` here is the silent fresh conversation this store used to\n // hand out in place of the user's history.\n return this.clientOwnedIds ? [] : null;\n }\n thread.touchedAt = Date.now();\n // Copied, so a caller that sorts or splices the result does not edit the\n // stored history in place.\n return thread.messages.slice();\n }\n\n async appendMessages(threadId: string, messages: AgentMessage[]): Promise<void> {\n this.sweep();\n let thread = this.visible(threadId);\n if (!thread) {\n if (!this.clientOwnedIds || this.threads.has(threadId)) {\n // Creating the thread here would persist a turn under an id the client\n // believes holds a longer conversation, and hide from the app that the\n // conversation is gone. The controller checks before the run and never\n // reaches this; a store-level caller that does gets told.\n throw new Error(`Thread ${threadId} does not exist here, or has expired.`);\n }\n // The client owns the id, so an append to one the store has never seen is\n // the first turn, and refusing it would lose a turn that already happened.\n thread = this.fresh();\n this.threads.set(threadId, thread);\n }\n // Upsert, not push. A turn that resolves a pending call hands back the\n // assistant message that made the call under the id it already had, now\n // with the result attached; pushing it would leave the thread holding both\n // versions, and the model would read the same call twice on every turn\n // that follows. Replacing in place keeps the message where the\n // conversation put it.\n for (const written of messages) {\n // Stored as JSON, like every other store (#1107): what `loadThread` and\n // `readThread` hand back is what a database store would, and what the\n // client types say it is (`Date`s are strings, `undefined` members gone).\n // It is also a copy, so the caller mutating its message later does not\n // edit the stored history.\n const message = JSON.parse(JSON.stringify(written)) as AgentMessage;\n const at = thread.messages.findIndex((held) => held.id === message.id);\n if (at === -1) {\n thread.messages.push(message);\n } else {\n thread.messages[at] = message;\n }\n }\n thread.touchedAt = Date.now();\n }\n\n async removeMessages(threadId: string, messageIds: string[]): Promise<void> {\n this.sweep();\n const thread = this.visible(threadId);\n if (!thread) return;\n const drop = new Set(messageIds);\n thread.messages = thread.messages.filter((message) => !drop.has(message.id));\n thread.touchedAt = Date.now();\n }\n\n async loadSummaries(threadId: string): Promise<ThreadSummary[]> {\n const thread = this.visible(threadId);\n return thread?.summaries?.slice() ?? [];\n }\n\n async saveSummary(threadId: string, summary: ThreadSummary): Promise<void> {\n // A thread that is gone has nothing to summarise; the summary goes with it.\n const thread = this.visible(threadId);\n if (!thread) return;\n thread.summaries = keepSummary(thread.summaries ?? [], summary);\n }\n\n /** Test seam, and a way for an app to drop a conversation on request. */\n delete(threadId: string): void {\n if (this.visible(threadId)) this.threads.delete(threadId);\n }\n\n get size(): number {\n return this.threads.size;\n }\n\n sweep(now = Date.now()): void {\n if (now - this.lastSweep < SWEEP_INTERVAL_MS) {\n return;\n }\n this.lastSweep = now;\n for (const [threadId, thread] of this.threads) {\n if (now - thread.touchedAt > this.ttlMs) {\n this.threads.delete(threadId);\n }\n }\n }\n}\n\n/**\n * The process-wide default every `AgentController` uses unless it is given\n * another.\n *\n * It has to be a shared instance, not a field initializer. A gemi controller is\n * constructed per request — `RouteHandler.run()` does `new Controller()` every\n * time — so `store = new MemoryAgentStore()` written in a controller field is a\n * brand new, empty store on every turn, and a threaded conversation would read\n * back nothing while looking like it was configured correctly. Anything\n * process-lived that a controller holds has to be created outside it.\n */\nexport const defaultAgentStore = new MemoryAgentStore();\n",
|
|
36
36
|
"import type {\n AgentContentPart,\n AgentError,\n AgentMessage,\n AgentStreamEvent,\n AgentStreamFrame,\n FinishReason,\n NestedRun,\n PendingToolCall,\n ToolCallPart,\n ToolShapes,\n Usage,\n} from \"../types\";\n\n/**\n * Frames to a message list.\n *\n * The rule the whole file is built around: **a client may be handed any\n * suffix of a run, and may be handed the same frame twice.** An attached\n * stream starts mid-message, a reconnect replays from a cursor, and a proxy\n * that retries is entitled to deliver a frame again. So nothing here tracks\n * \"the current message\" — every event that touches a message names it, and a\n * message the list has never heard of is created on the spot rather than\n * dropped.\n *\n * The two mechanisms that make that work:\n *\n * - `seq` guards replay. A frame at or below the state's cursor is a no-op,\n * and `applyFrame` returns the *same object* so a caller can tell nothing\n * happened. Without it a redelivered `text-delta` would append its text a\n * second time — a bug that looks fine until someone refreshes.\n * - a finished message is closed to further deltas. `seq` catches a redelivery\n * within a run, but not a server that replays a run from zero to a client\n * that already has the transcript; `message-end` is terminal, so a delta for\n * a message that already carries a finish reason is replay by definition.\n * - every mutation is either an append that the seq guard already protects,\n * or an upsert keyed by an id. Tool calls and tool results arrive more than\n * once (a call re-streams as its arguments grow), so those are keyed by\n * `toolCallId`, never pushed blindly.\n *\n * A sub-agent's transcript is built by this same function calling itself. A\n * `nested-event` is unwrapped onto the `NestedRun` hanging off its parent's\n * tool-call part and handed to `reduce` again, so every rule above holds inside\n * a nested run for free — a nested `message-start` that never arrived, a\n * nested delta after a nested `message-end`, a nested `run-end` closing off a\n * message that never ended. Two levels of nesting cost this file nothing over\n * one, which is the whole reason the wire has a `nested-event` rather than a\n * second reducer.\n */\n\nexport type ChatState<T extends ToolShapes = ToolShapes, O = unknown> = {\n messages: AgentMessage<T, O>[];\n /** Non-empty exactly while the conversation is holding a question. */\n pending: PendingToolCall<T>[];\n error: AgentError | null;\n runId?: string;\n threadId?: string;\n /**\n * The highest frame applied. This is the cursor `/attach` is asked to resume\n * from, which is why it lives in the state a client keeps rather than in the\n * stream reader that dies with the connection.\n */\n seq: number;\n /**\n * Which run `seq` counts within.\n *\n * Separate from `runId`, which is cleared when the run ends because a UI asks\n * it whether anything is live. The cursor outlives the run it belongs to: a\n * frame from run_1 redelivered after run_1 finished is still a duplicate, and\n * without somewhere to remember that, replaying a finished run would look\n * exactly like the start of a new one.\n */\n cursorRunId?: string;\n /**\n * The messages the run in hand has touched, oldest first.\n *\n * `run-end` and `markAborted` both have to finish off a message whose\n * `message-end` never arrived, and \"every assistant message with no finish\n * reason\" is the wrong set to do it over: a superseded turn from an earlier\n * run is sitting in exactly that state, and stamping it with *this* run's\n * reason would relabel an interrupted answer as a clean completion. So the\n * reducer remembers which messages this run actually wrote to, and finishes\n * off only those. Reset by `run-start`; on a mid-run attach it simply fills\n * up from the first frame that names a message, which is the same set.\n */\n runMessageIds: string[];\n /**\n * The deferred tools the model has pulled in during this run, as a set.\n *\n * Not a message part, because a `tool-search` names no tool call and no\n * message — it happens *before* any call, which is exactly what makes it\n * worth showing (\"looking for the right tool\" instead of an unexplained\n * pause). So unlike `tool-progress` and `nested-event`, which now have a home\n * on the tool-call part, this one had nowhere in `AgentMessage` to go that\n * would not have meant inventing a content part in a frozen contract.\n *\n * A set, not a log: union is the only accumulation that survives redelivery\n * without a guard, and a client attached mid-run and handed a `tool-search`\n * it has already applied must not show the same tool twice. Run-scoped and\n * reset by `run-start` — it describes a run in progress, so it is deliberately\n * not something `initialChatState` restores.\n */\n loadedTools: string[];\n finishReason?: FinishReason;\n /**\n * The run's total usage so far, from its `usage` frames: every step plus what\n * its tools spent. Run-scoped and reset by `run-start`, like `loadedTools`.\n * Each assistant message's own share is on `AgentMessage.usage` (#467).\n */\n usage?: Usage;\n};\n\nexport function initialChatState<T extends ToolShapes = ToolShapes, O = unknown>(\n init: {\n messages?: AgentMessage<T, O>[];\n pending?: PendingToolCall<T>[];\n threadId?: string;\n /** Where a restored client left off. `-1` means \"I have seen nothing\". */\n seq?: number;\n /**\n * Which run that `seq` counts within. A cursor without it is a number with\n * no units — frames number from zero in every run, so `seq: 10` means\n * nothing until you know whether the live run is the one that reached 10.\n */\n cursorRunId?: string;\n } = {},\n): ChatState<T, O> {\n return {\n messages: init.messages ? [...init.messages] : [],\n pending: init.pending ? [...init.pending] : [],\n error: null,\n threadId: init.threadId,\n seq: init.seq ?? -1,\n cursorRunId: init.cursorRunId,\n runMessageIds: [],\n loadedTools: [],\n };\n}\n\n/**\n * The calls a stored transcript is still waiting on (#1052): every\n * `AgentMessage.pending` entry whose tool call has no result yet.\n *\n * What a page opened after the turn ended needs in order to answer it. The\n * `awaiting-input` frame went to whichever client was watching then; the\n * message kept a copy, and this reads it back. A call that has a result since\n * (answered, refused by a later turn, closed as interrupted) is left out, so a\n * thread read late does not hand back a question nobody can answer any more.\n * A sub-agent's question is open while the top-level call it is nested under\n * (`path[0]`) is.\n */\nexport function openPending<T extends ToolShapes = ToolShapes, O = unknown>(\n messages: readonly AgentMessage<T, O>[],\n): PendingToolCall<T>[] {\n const resolved = new Set<string>();\n for (const message of messages) {\n for (const part of message.content) {\n if (part.type === \"tool-result\") resolved.add(part.toolCallId);\n }\n }\n const open: PendingToolCall<T>[] = [];\n for (const message of messages) {\n for (const call of message.pending ?? []) {\n if (!resolved.has(call.path?.[0] ?? call.toolCallId)) open.push(call);\n }\n }\n return open;\n}\n\n/**\n * Apply one frame.\n *\n * `now` is an argument rather than a `Date.now()` call so the reducer stays a\n * pure function of its inputs — it is only ever read when a frame arrives for a\n * message the list has not seen, which is precisely the mid-run-attach path a\n * test needs to pin down.\n */\nexport function applyFrame<T extends ToolShapes = ToolShapes, O = unknown>(\n state: ChatState<T, O>,\n frame: AgentStreamFrame<T, O>,\n now: string = new Date().toISOString(),\n): ChatState<T, O> {\n // A `seq` is a position within *one* run, so the second turn of a\n // conversation numbers its frames from zero again and the cursor left over\n // from the first would silently swallow the whole answer. `run-start` naming\n // a run this state has not seen is the one frame entitled to drop the cursor.\n const startsNewRun = frame.event.type === \"run-start\" && frame.event.runId !== state.cursorRunId;\n // Identity, not a copy: the hook reads `next === prev` as \"already applied\"\n // and skips the callbacks that would otherwise fire twice.\n if (!startsNewRun && frame.seq <= state.seq) return state;\n return { ...reduce(state, frame.event, now), seq: frame.seq };\n}\n\nfunction reduce<T extends ToolShapes, O>(\n state: ChatState<T, O>,\n event: AgentStreamFrame<T, O>[\"event\"],\n now: string,\n): ChatState<T, O> {\n switch (event.type) {\n case \"run-start\":\n return {\n ...state,\n // A run's in-progress copies, emptied so the replay that starts here\n // rebuilds them (#778). A thread read while a run is going holds what\n // the controller stored of it so far (`AgentMessage.runId`, no\n // `finishReason`), and a client that shows that read and then attaches\n // gets the run from its first frame: appending the replayed deltas to\n // the stored text printed it twice. `run-start` is frame 0, so\n // everything the copy held is on its way again. Kept in place rather\n // than dropped, so the transcript's order does not change under it.\n messages: resetInProgress(state.messages, event.runId),\n runId: event.runId,\n cursorRunId: event.runId,\n threadId: event.threadId ?? state.threadId,\n runMessageIds: [],\n loadedTools: [],\n finishReason: undefined,\n usage: undefined,\n };\n\n case \"message-start\":\n return withMessage(state, event.messageId, now, (message) => ({\n ...message,\n role: event.role,\n }));\n\n // The two additive cases, and the only two that can double text. `seq`\n // catches an ordinary redelivery, but a client resuming with a cursor the\n // server ignores — or asked for the whole run when it already had the\n // transcript — gets frames it cannot recognise as duplicates. A finished\n // message is the one thing it can: `message-end` is terminal, so a delta\n // arriving for a message that already carries a finish reason is replay by\n // definition and appending it would show the answer twice.\n case \"text-delta\":\n if (isFinished(state, event.messageId)) return state;\n return withMessage(state, event.messageId, now, (message) => ({\n ...message,\n content: appendText(message.content, event.delta),\n }));\n\n case \"reasoning-delta\":\n if (isFinished(state, event.messageId)) return state;\n return withMessage(state, event.messageId, now, (message) => ({\n ...message,\n content: appendReasoning(message.content, event.delta, event.id),\n }));\n\n case \"output-delta\":\n // `snapshot` is the whole object so far, not an increment, so the raw\n // `delta` text is dropped here on purpose: replacing beats accumulating\n // when a client may have missed the first half of the JSON.\n return withMessage(state, event.messageId, now, (message) => ({\n ...message,\n content: upsert(\n message.content,\n { type: \"output\", value: event.snapshot as O, partial: true },\n (part) => part.type === \"output\",\n ),\n }));\n\n case \"tool-call\":\n // Keyed, because the same call re-streams as its arguments fill in — and\n // *merged* rather than replaced, which the plain upsert below cannot do.\n //\n // A `tool-call` frame is the model's half of the part. `progress` and\n // `nested` are the execution's half, and they arrive on events that name\n // no message, so a part that loses them cannot rebuild them from anything\n // later in the stream. Replacing wholesale is exactly how a run replayed\n // onto a transcript that already holds it drops a sub-agent's entire\n // transcript while appearing to converge.\n return withMessage(state, event.messageId, now, (message) => {\n const index = message.content.findIndex(\n (part) => part.type === \"tool-call\" && part.toolCallId === event.part.toolCallId,\n );\n const existing = index === -1 ? undefined : (message.content[index] as ToolCallPart<T>);\n // The frame wins where it says anything — a server that persists the\n // nested transcript and re-sends it is more authoritative than what this\n // client accumulated — and the part is kept where it does not.\n const progress = event.part.progress ?? existing?.progress;\n const nested = event.part.nested ?? existing?.nested;\n // `attachments` is kept for the same reason and with a sharper\n // consequence: it is the memo `ctx.attachments.put` replays from, so a\n // stateless client that dropped it posts back a history in which the\n // tool call never attached anything — and a re-entered tool stores the\n // bytes again, uploads them again, and shows the model a second copy of\n // its own output. Losing `progress` costs a log; losing this costs\n // money and confuses the model.\n const attachments = event.part.attachments ?? existing?.attachments;\n const part = {\n ...event.part,\n ...(progress ? { progress } : {}),\n ...(nested ? { nested } : {}),\n ...(attachments ? { attachments } : {}),\n };\n const content = message.content.slice();\n if (index === -1) content.push(part);\n else content[index] = part;\n return { ...message, content };\n });\n\n case \"tool-call-discard\":\n // Partial calls of a model call the provider is asking again (#1169).\n // Only partials go: a completed call is never discarded, and a frame\n // replayed onto a transcript that already holds the finished message\n // finds nothing to remove.\n return withMessage(state, event.messageId, now, (message) => {\n const content = message.content.filter(\n (part) =>\n !(part.type === \"tool-call\" && part.partial && event.toolCallIds.includes(part.toolCallId)),\n );\n return content.length === message.content.length ? message : { ...message, content };\n });\n\n case \"tool-search\": {\n // Accumulated as a set. Every other additive event in this file leans on\n // `seq` to survive redelivery; this one cannot, because a `tool-search`\n // carries no id at all — there is nothing to key an upsert on and nothing\n // to tell a second delivery from a second search. Union is what makes the\n // question moot: applying the same frame again is the same set, and two\n // genuinely different searches that both loaded `refundOrder` are, for a\n // UI naming the tools in play, the same fact twice.\n const loaded = event.loaded.filter((name) => !state.loadedTools.includes(name));\n if (loaded.length === 0) return state;\n return { ...state, loadedTools: [...state.loadedTools, ...loaded] };\n }\n\n case \"tool-progress\":\n // Append-only, exactly like a text delta, and protected the same two\n // ways: `seq` for redelivery within a run, and the finished-message check\n // inside `withToolCall` for a run replayed onto a transcript that already\n // holds it. The tool loop emits every yield before the message it belongs\n // to is finalised, so a progress datum for a finished message is replay\n // by definition — the same argument `text-delta` makes, and with the same\n // carve-out for a message the run parked on.\n //\n // Unbounded on purpose: a tool decides how often it yields, and truncating\n // its log here would lose data the UI asked for. What is bounded is the\n // *wire* — `useChat.send` strips `progress` from the history it posts, so\n // a tool that yields ten thousand times costs ten thousand entries in this\n // tab and nothing at all on every later turn. See `forWire`.\n return withToolCall(state, event.toolCallId, (part) => ({\n ...part,\n progress: [...(part.progress ?? []), event.data],\n }));\n\n case \"nested-event\": {\n // The recursion. The sub-run's transcript is an ordinary message list, so\n // it is reduced by this function rather than by a parallel one — which is\n // why an arbitrarily deep nesting is not a case handled here at all: an\n // inner `nested-event` simply lands back in this branch, one message list\n // further down.\n const nestedEvent = event as NestedEvent;\n return withToolCall(state, event.toolCallId, (part) => {\n const runs = part.nested ?? [];\n const index = runs.findIndex((run) => run.runId === nestedEvent.runId);\n // Created on the spot when unknown, for the same reason `withMessage`\n // creates a message it never saw start: a client attached mid-run gets\n // the sub-run's tail and no `run-start`, and dropping it would leave a\n // tool call that visibly does something looking like one that hangs.\n const run: NestedRun = runs[index] ?? {\n runId: nestedEvent.runId,\n agent: nestedEvent.agent,\n messages: [],\n };\n const next = applyNested(run, nestedEvent, now);\n const nested =\n index === -1 ? [...runs, next] : runs.map((r, i) => (i === index ? next : r));\n return { ...part, nested };\n });\n }\n\n case \"tool-result\": {\n const next = withMessage(state, event.messageId, now, (message) => ({\n ...message,\n content: upsert(\n message.content,\n event.part,\n (part) => part.type === \"tool-result\" && part.toolCallId === event.part.toolCallId,\n ),\n }));\n // A result is the answer to a pending call, whoever produced it — the\n // human here, or the server after an approval. Either way it is no longer\n // pending, and leaving it in the list would keep the UI asking.\n return {\n ...next,\n pending: next.pending.filter((call) => call.toolCallId !== event.part.toolCallId),\n };\n }\n\n case \"message\": {\n // A whole message, replaced or appended by id.\n //\n // The wholesale replace the `tool-call` branch above argues against is\n // right here, and the difference is authorship. A tool-call part is\n // assembled from two sources — the model's half on this frame, the\n // execution's half on events that name no message — so a client that\n // replaces it drops what only it was holding. This message has one\n // author, the server, and is complete before it is ever sent; there is no\n // client-accumulated half to lose, so a second delivery is the same value\n // written twice.\n //\n // Appended at the end when unknown, which is where it belongs: the run\n // emits it the moment it appends it to its own history, so stream order\n // and transcript order are the same order. Not routed through\n // `withMessage`, which would create the message as `assistant` — the role\n // is on the frame and it is `user`.\n const index = state.messages.findIndex((message) => message.id === event.message.id);\n const messages = state.messages.slice();\n if (index === -1) messages.push(event.message);\n else messages[index] = event.message;\n const runMessageIds = state.runMessageIds.includes(event.message.id)\n ? state.runMessageIds\n : [...state.runMessageIds, event.message.id];\n return { ...state, messages, runMessageIds };\n }\n\n case \"message-id\": {\n // The client's own copy of its turn, renamed to the id the server stored\n // it under (#466). Only the id changes: the copy is what the user typed\n // and is already on screen, and the server never sends the turn itself.\n // The client's key for it stays (#818): `localId` is what a UI keys the\n // element by, and the rename must not remount it.\n //\n // A no-op when nothing is under `localId` — a replay after the rename,\n // or a client attached from elsewhere that never held the copy. If the\n // server's id is somehow already there too, the local copy is the\n // duplicate and goes. Not added to `runMessageIds`: a user message is\n // complete when it is sent, and `run-end` has nothing to close on it.\n const index = state.messages.findIndex((message) => message.id === event.localId);\n if (index === -1) {\n // Not this client's turn: a client attached to a run another one\n // started (#778). The server sends the stored turn along for exactly\n // this, and it goes where the run put it, before the answer. Already\n // here under the server's id (a thread read, or a replay) it is left\n // alone.\n if (!event.message || state.messages.some((m) => m.id === event.messageId)) return state;\n return { ...state, messages: [...state.messages, event.message] };\n }\n // When the server's copy is already here and the local one goes, the key\n // and the app's `metadata` move onto the copy that stays, so the element\n // the user is looking at is still the one it was.\n const local = state.messages[index]!;\n const kept = {\n localId: local.localId ?? local.id,\n ...(local.metadata ? { metadata: local.metadata } : {}),\n };\n const messages = state.messages.some((message) => message.id === event.messageId)\n ? state.messages\n .filter((_, i) => i !== index)\n .map((message) => (message.id === event.messageId ? { ...message, ...kept } : message))\n : state.messages.map((message, i) =>\n i === index ? { ...message, ...kept, id: event.messageId } : message,\n );\n return { ...state, messages };\n }\n\n case \"awaiting-input\":\n return { ...state, runId: event.runId, pending: [...event.pending] };\n\n case \"message-end\":\n return withMessage(state, event.messageId, now, (message) => ({\n ...message,\n finishReason: event.finishReason,\n // Kept, not merely acted on. Dropping the partial output leaves a UI\n // unable to tell a cut-off answer from a message that never had one, and\n // the finish reason cannot say which — see `AgentMessage.outputTruncated`.\n ...(event.outputTruncated ? { outputTruncated: true as const } : {}),\n // This message's own model call (#467). An assignment, so a replay is\n // harmless; absent on the frame, the message keeps whatever it had.\n ...(event.usage ? { usage: event.usage } : {}),\n content:\n // A run cut off by the output ceiling has no answer, and the partial\n // output part is dropped rather than completed.\n //\n // `snapshot` is `bestEffortParse` of the text so far, which closes\n // whatever brackets are open — so the last partial looks like a whole\n // document, and stamping it `partial: false` here presented a\n // half-written object as the finished one. The server already\n // withholds the output part on `length` for that reason; without this\n // the two disagreed, and the client held the more convincing lie.\n // `outputTruncated` first: it is the fact, and the finish reason is\n // not it — a step that hit the ceiling and also called a tool ends the\n // message `awaiting-input` or `max-steps`. `length` is still honoured\n // for a server that predates the field.\n event.outputTruncated || event.finishReason === \"length\"\n ? message.content.filter((part) => !(part.type === \"output\" && part.partial))\n : message.content.map((part) =>\n part.type === \"output\" && part.partial ? { ...part, partial: false } : part,\n ),\n }));\n\n case \"usage\":\n // The run's total, not any message's (#467). It used to be put on the\n // last assistant message, so a three-step run showed every token on step\n // three and nothing on the first two — and a run whose tools spent\n // through `generate()` or a sub-run billed that to a message that never\n // made the call. Each message now gets its own from `message-end`; this\n // is the turn's, on the state. An assignment, so a replay is harmless.\n return { ...state, usage: event.usage };\n\n case \"error\":\n // Clearing `pending` here is what keeps \"pending is non-empty exactly\n // when the UI is awaiting input\" true: a run that errored is not holding\n // a question any more, it is holding a failure.\n return { ...state, error: event.error, pending: [] };\n\n case \"run-end\":\n return {\n ...state,\n runId: undefined,\n finishReason: event.finishReason,\n // A safety net for the client that attached late and never saw a\n // `message-end`: once the run is over nothing is still streaming, so a\n // message left without a finish reason would show a cursor forever.\n //\n // Scoped to this run's own messages. A turn superseded by a second send\n // is also sitting there unfinished, and it was *not* finished by this\n // run — stamping it \"stop\" would tell the user, and the model on the\n // next stateless turn, that an answer cut off mid-sentence ended\n // cleanly.\n messages: finishUnended(state, event.finishReason),\n };\n\n // Every event in the union is handled above, so this is reached only by a\n // server that speaks a newer protocol than this client. Kept as a silent\n // no-op rather than an exhaustiveness assertion for that reason: an old tab\n // meeting a new event must keep rendering the rest of the stream, and the\n // seq still advances so its cursor stays right.\n default:\n return state;\n }\n}\n\n/**\n * The interrupted turn, kept.\n *\n * `stop()` calls this before the server has said anything, because the point of\n * stopping is that the UI reacts now. Whatever the assistant had produced stays\n * in the list marked `aborted` — dropping it would lose text the user already\n * read, and would leave the transcript unable to say it was cut short.\n *\n * `pending` is untouched: a question the conversation is holding survives a\n * stopped run, and clearing it would silently discard the answer the user still\n * owes.\n */\nexport function markAborted<T extends ToolShapes = ToolShapes, O = unknown>(\n state: ChatState<T, O>,\n): ChatState<T, O> {\n return {\n ...state,\n runId: undefined,\n finishReason: \"aborted\",\n // This run's messages only, for the same reason `run-end` is scoped: an\n // older turn that was already cut short is not cut short again by this one,\n // and a restored transcript may legitimately carry an unfinished message\n // that has nothing to do with the run being stopped.\n messages: finishUnended(state, \"aborted\"),\n };\n}\n\n// --- helpers -------------------------------------------------------------\n\n/**\n * The stored in-progress copies of `runId`'s messages, emptied for a replay.\n *\n * Only a message that says it is that run's and unfinished: a finished one is\n * closed to deltas already, and anything without the run's id is not this\n * run's to touch. The id goes too, since the copy is now the client's own\n * live message, the shape a streamed message has. Identity when there is\n * nothing to reset, which is every `run-start` a client streams itself.\n */\nfunction resetInProgress<T extends ToolShapes, O>(\n messages: AgentMessage<T, O>[],\n runId: string,\n): AgentMessage<T, O>[] {\n if (!messages.some((m) => m.runId === runId && m.finishReason === undefined)) return messages;\n return messages.map((message) => {\n if (message.runId !== runId || message.finishReason !== undefined) return message;\n const { runId: _runId, ...rest } = message;\n return { ...rest, content: [] };\n });\n}\n\n/**\n * The messages this run wrote, finished off with `reason` if they never ended —\n * and, inside them, the sub-runs this run left mid-sentence.\n *\n * The nesting descent is not an extra: a `NestedRun` renders with the component\n * that renders `messages`, so a nested message with no `finishReason` draws a\n * live cursor inside a block that will never receive another frame. The parent\n * ending is the last word anything will say about it, and for `markAborted`\n * there is no other word available at all — `stop()` marks the transcript\n * optimistically, before the server has answered, so no forwarded nested\n * `run-end` can arrive in time.\n *\n * It recurses through `closeRun`, which builds a `ChatState` around the sub-run\n * and calls back here, so a sub-sub-run is closed by the same three lines that\n * close the top level — the same trick `applyNested` plays on the way in.\n */\nfunction finishUnended<T extends ToolShapes, O>(\n state: ChatState<T, O>,\n reason: FinishReason,\n): AgentMessage<T, O>[] {\n return state.messages.map((message) =>\n message.role === \"assistant\" && state.runMessageIds.includes(message.id)\n ? closeMessage(message, reason)\n : message,\n );\n}\n\n/**\n * One message of this run, and the sub-runs hanging off its tool calls.\n *\n * The message's own finish reason is only filled in when it is missing, but the\n * descent happens either way: the message a run parks on is *finished* while the\n * sub-run underneath it is still live, and that is the case where the block\n * stuck streaming is easiest to hit.\n */\nfunction closeMessage<T extends ToolShapes, O>(\n message: AgentMessage<T, O>,\n reason: FinishReason,\n): AgentMessage<T, O> {\n const content = message.content.map((part) =>\n part.type === \"tool-call\" && part.nested?.some((run) => run.finishReason === undefined)\n ? {\n ...part,\n nested: part.nested.map((run) =>\n run.finishReason === undefined ? closeRun(run, reason) : run,\n ),\n }\n : part,\n );\n if (message.finishReason === undefined) return { ...message, finishReason: reason, content };\n // Identity where nothing changed, so `run-end` on a settled transcript keeps\n // the parts a UI may be memoising on.\n const changed = content.some((part, index) => part !== message.content[index]);\n return changed ? { ...message, content } : message;\n}\n\n/** A sub-run the parent outlived, stamped with the parent's reason, recursively. */\nfunction closeRun(run: NestedRun, reason: FinishReason): NestedRun {\n const sub: ChatState = {\n messages: run.messages,\n pending: [],\n error: null,\n seq: -1,\n // Every message in the transcript, for the reason `applyNested` gives: a\n // `NestedRun` is keyed by `runId` and only ever written by events carrying\n // it, so there is no other run's work in here to protect.\n runMessageIds: run.messages.map((message) => message.id),\n loadedTools: [],\n };\n return { ...run, finishReason: reason, messages: finishUnended(sub, reason) };\n}\n\ntype NestedEvent = Extract<AgentStreamEvent, { type: \"nested-event\" }>;\n\n/**\n * Run one update over the tool-call part with this id, wherever it lives.\n *\n * `tool-progress` and `nested-event` are the only events that name a tool call\n * without naming a message, so the message has to be found rather than told —\n * a scan from the newest end, because the call being worked on is the one that\n * just arrived.\n *\n * **A frame for a tool call this transcript does not have is dropped.** That is\n * the mid-run `/attach` case the whole file is written for, and it is the one\n * place the usual answer — create it on the spot — is the wrong one: a\n * `ToolCallPart` needs a tool `name` and an `input`, and neither is on these\n * events. Inventing them would put a tool call the model never made into the\n * transcript, under a name that is not a key of the agent's tools, which breaks\n * the narrowing that is the reason the shapes are carried into the browser at\n * all. So the progress is lost and the transcript stays true, rather than the\n * other way round.\n *\n * In practice a client that has the cursor has the part: `useChat` documents\n * `cursor` and `initialMessages` as things to persist together, and a client\n * that persisted one without the other is already the case that doubles text.\n * Parking the orphans until their tool call shows up was considered and is not\n * worth it — the call is *earlier* in the stream, never later, so nothing would\n * ever drain the parking lot.\n */\nfunction withToolCall<T extends ToolShapes, O>(\n state: ChatState<T, O>,\n toolCallId: string,\n update: (part: ToolCallPart<T>) => ToolCallPart<T>,\n): ChatState<T, O> {\n for (let i = state.messages.length - 1; i >= 0; i--) {\n const message = state.messages[i]!;\n const index = message.content.findIndex(\n (part) => part.type === \"tool-call\" && part.toolCallId === toolCallId,\n );\n if (index === -1) continue;\n // The replay guard, and the same one the deltas use — with the one carve-out\n // a delta does not need.\n //\n // Within a run the tool loop runs every tool before it finalises the message\n // the calls sit in, so a frame for a call inside a finished message is that\n // run being replayed onto a transcript that already has it, and appending\n // would show the progress log twice.\n //\n // But a message the run *parked* on is not a closed message. `Agent.loop`\n // finalises it with `\"awaiting-input\"` **before** emitting `awaiting-input`,\n // and the very next turn re-enters that same tool call — `resolveAnswer`\n // calls `executeTool` against the call it found in the history — so its\n // `tool-progress` and `nested-event` frames arrive after their message\n // carries a finish reason. Treating those as replay dropped every frame of\n // the resumed execution while the `tool-result` (which goes through\n // `withMessage`, unguarded) still landed: the call went silent and then\n // produced an answer, which is the bug nesting exists to fix. Worse, in\n // stateless mode the nested transcript is what the next turn replays the\n // sub-run from, so the client posted back a sub-run frozen at the question.\n //\n // The carve-out is as narrow as the case: parked, *and* the call still open.\n // Once its result has landed nothing legitimately appends to it again, so a\n // replay of a parked run is still refused for every call it answered.\n if (message.finishReason !== undefined && !isReenterable(state, message, toolCallId)) {\n return state;\n }\n const content = message.content.slice();\n content[index] = update(content[index] as ToolCallPart<T>);\n const messages = state.messages.slice();\n messages[i] = { ...message, content };\n // Counted as a message this run touched, like every event that names one\n // directly — a client whose only frames for this message were nested ones\n // still needs `run-end` to close it, or it shows a cursor forever.\n const runMessageIds = state.runMessageIds.includes(message.id)\n ? state.runMessageIds\n : [...state.runMessageIds, message.id];\n return { ...state, runMessageIds, messages };\n }\n return state;\n}\n\n/**\n * One sub-run event, applied to the sub-run's own transcript.\n *\n * The sub-state is built and thrown away per event rather than kept, because\n * there is nowhere to keep it: `NestedRun` is a wire type and holds a\n * transcript, not a reducer state. Everything the inner `reduce` needs is\n * derivable from it.\n *\n * - `seq` is `-1` and this calls `reduce`, not `applyFrame`. A nested event\n * has no sequence of its own; it is numbered in the *parent's* stream, and\n * the parent's cursor has already refused the duplicates.\n * - `runMessageIds` is every message in the transcript, which for a nested\n * run is exactly right and needs none of the parent's care. The parent\n * scopes it because its list mixes runs; a `NestedRun` is keyed by `runId`\n * and only ever written by events carrying that id, so every message in it\n * belongs to the run that is ending.\n * - `pending` is dropped. An escalated question reaches the user on the\n * *parent's* `awaiting-input`, carrying the path that says which tool to\n * re-enter; the copy inside the sub-run's own stream carries no path, so\n * surfacing it would show the question twice and make one of them\n * unanswerable.\n */\nfunction applyNested(run: NestedRun, event: NestedEvent, now: string): NestedRun {\n const sub: ChatState = {\n messages: run.messages,\n pending: [],\n error: null,\n seq: -1,\n runMessageIds: run.messages.map((message) => message.id),\n loadedTools: [],\n finishReason: run.finishReason,\n };\n const next = reduce(sub, event.event, now);\n return {\n ...run,\n // A late label is still a label: `/attach` may deliver the sub-run's tail,\n // and every nested frame carries it.\n ...(event.label !== undefined ? { label: event.label } : {}),\n messages: next.messages,\n ...(next.finishReason !== undefined ? { finishReason: next.finishReason } : {}),\n // The sub-run's own total, lifted so a UI can price the block it is\n // rendering without walking its messages — which carry only their own\n // steps' usage, not what the sub-run's tools spent. An assignment, so\n // redelivery is harmless.\n ...(next.usage !== undefined ? { usage: next.usage } : {}),\n };\n}\n\n/**\n * Whether a finished message's tool call can still be written to.\n *\n * Exactly one message can say yes: the one a run parked on, holding a call\n * nobody has answered yet. That is the resume turn — the tool is re-entered\n * from the top and streams progress and sub-run events against a message that\n * closed on the previous turn.\n *\n * \"Open\" is the server's own test, `Agent.openCalls`: a tool call with no\n * `tool-result` for it anywhere in the transcript. The result is the thing that\n * says the re-entry finished, and it always arrives *after* the frames this\n * guards — `attachToHistory` emits it once `executeTool` returns.\n */\nfunction isReenterable<T extends ToolShapes, O>(\n state: ChatState<T, O>,\n message: AgentMessage<T, O>,\n toolCallId: string,\n) {\n if (message.finishReason !== \"awaiting-input\") return false;\n return !state.messages.some((candidate) =>\n candidate.content.some((part) => part.type === \"tool-result\" && part.toolCallId === toolCallId),\n );\n}\n\nfunction isFinished<T extends ToolShapes, O>(state: ChatState<T, O>, messageId: string) {\n const message = state.messages.find((candidate) => candidate.id === messageId);\n return message !== undefined && message.finishReason !== undefined;\n}\n\nfunction withMessage<T extends ToolShapes, O>(\n state: ChatState<T, O>,\n messageId: string,\n now: string,\n update: (message: AgentMessage<T, O>) => AgentMessage<T, O>,\n): ChatState<T, O> {\n const index = state.messages.findIndex((message) => message.id === messageId);\n // Every id-carrying event marks its message as one this run touched, which is\n // what `run-end` and `markAborted` read to know whose loose ends are theirs.\n const runMessageIds = state.runMessageIds.includes(messageId)\n ? state.runMessageIds\n : [...state.runMessageIds, messageId];\n if (index === -1) {\n // The mid-stream attach. Every id-carrying event describes an assistant\n // message — `message-start` is the only event that declares a role and it\n // declares that one — so a placeholder is enough to hang the tail on.\n const blank: AgentMessage<T, O> = {\n id: messageId,\n role: \"assistant\",\n content: [],\n createdAt: now,\n };\n return { ...state, runMessageIds, messages: [...state.messages, update(blank)] };\n }\n const messages = state.messages.slice();\n messages[index] = update(messages[index]!);\n return { ...state, runMessageIds, messages };\n}\n\nfunction appendText<T extends ToolShapes, O>(\n content: AgentContentPart<T, O>[],\n delta: string,\n): AgentContentPart<T, O>[] {\n const last = content[content.length - 1];\n // Coalesced into the trailing text part, but only if it *is* trailing: a\n // delta after a tool call opens a new part, which is what lets a UI render\n // \"thinking / call / answer\" in the order it happened.\n if (last && last.type === \"text\") {\n return [...content.slice(0, -1), { type: \"text\", text: last.text + delta }];\n }\n return [...content, { type: \"text\", text: delta }];\n}\n\n/**\n * Mirrors `appendReasoning` in Agent.ts, including its merge rule: deltas join\n * the last part only when the reasoning-item id matches, so a step that\n * produced two items stays two parts instead of flattening into one under the\n * wrong id. The two implementations have to agree, because a stateless client\n * posts this content straight back and the provider matches on that id.\n */\nfunction appendReasoning<T extends ToolShapes, O>(\n content: AgentContentPart<T, O>[],\n delta: string,\n id?: string,\n): AgentContentPart<T, O>[] {\n const last = content[content.length - 1];\n if (last && last.type === \"reasoning\" && last.id === id) {\n return [...content.slice(0, -1), { ...last, text: (last.text ?? \"\") + delta }];\n }\n return [\n ...content,\n id ? { type: \"reasoning\", id, text: delta } : { type: \"reasoning\", text: delta },\n ];\n}\n\nfunction upsert<T extends ToolShapes, O>(\n content: AgentContentPart<T, O>[],\n part: AgentContentPart<T, O>,\n match: (part: AgentContentPart<T, O>) => boolean,\n): AgentContentPart<T, O>[] {\n const index = content.findIndex(match);\n if (index === -1) return [...content, part];\n const next = content.slice();\n next[index] = part;\n return next;\n}\n",
|
|
37
37
|
"import type { AgentStore } from \"../AgentController\";\nimport { applyFrame, type ChatState, initialChatState } from \"../client/reducer\";\nimport type {\n AgentMessage,\n AgentStreamFrame,\n NestedRun,\n ToolCallPart,\n ToolResultPart,\n} from \"../types\";\n\n/**\n * A threaded turn, written to the store while it runs (#617).\n *\n * The controller used to store a turn once, when its run ended. A process that\n * died mid-run (a restart, a crash, a deploy) left the thread without the turn\n * at all, not even the user's message, while the run's tools may already have\n * written durable changes. Neither the app nor the model could tell a turn that\n * never happened from one that was lost.\n *\n * So a turn is now written as it goes, through the store's own upsert:\n *\n * - **Finished messages** (`finish`), as the run reports them: the user's turn\n * before the model is asked anything, each assistant message as it closes,\n * an earlier message a turn amended. The run's own objects, so they are\n * exactly what the end-of-run write stores.\n * - **The message in progress** (`frame`), at the points worth keeping: when it\n * opens, when a tool call's arguments are complete, when a tool result\n * lands, and a whole message the run injected. It is assembled from the\n * run's frames by the client reducer (the code every client already renders\n * a live run with) and stored with no `finishReason` and the run's id in\n * `runId`, which is what lets a later reader see that its run is gone.\n * Text deltas are not a checkpoint: a store write per token is not worth\n * the text a crash would lose.\n *\n * Every write is an upsert by message id, so writing a message twice, or a\n * retried start writing the same turn again, leaves one copy. Writes go out one\n * at a time and in order, off the run's path: a slow store does not slow the\n * model, and a message's in-progress copy can never land after its finished\n * one. A write that fails is reported and the run carries on, as a hook\n * failure does; the end-of-run write stores everything again anyway.\n */\nexport class TurnJournal {\n private chain: Promise<void> = Promise.resolve();\n /** Ids whose finished copy has been queued. An in-progress copy of one of\n * these is stale by definition and is never written after it. */\n private readonly done = new Set<string>();\n private closed = false;\n private state: ChatState;\n private runId: string | undefined;\n\n constructor(\n private readonly store: AgentStore,\n private readonly threadId: string,\n /** The history the run starts from, so a tool result that lands on an\n * earlier turn's message checkpoints the whole message, not a stub of it. */\n history: AgentMessage[],\n private readonly report: (error: unknown) => void,\n ) {\n this.state = initialChatState({ messages: history });\n }\n\n /** A message the run has finished. Queued as it is, and final. */\n finish(message: AgentMessage): void {\n if (this.closed) return;\n this.done.add(message.id);\n this.write(() => [snapshot(message)]);\n }\n\n /** One frame of the run, in order. Writes the message it touched when the\n * frame is a checkpoint. */\n frame(frame: AgentStreamFrame): void {\n if (this.closed) return;\n const event = frame.event;\n if (event.type === \"run-start\") this.runId = event.runId;\n this.state = applyFrame(this.state, frame);\n\n switch (event.type) {\n case \"message\":\n // Complete when it is made (see the event), so it is written whole. Not\n // marked done: the run reports it again once the message above it\n // closes, and that copy is the one that stays.\n this.write(() => [snapshot(event.message)]);\n return;\n case \"tool-call\":\n if (event.part.partial) return;\n this.checkpoint(event.messageId);\n return;\n case \"message-start\":\n case \"tool-result\":\n this.checkpoint(event.messageId);\n return;\n default:\n return;\n }\n }\n\n /**\n * The run is over and its transcript is about to be written whole: nothing\n * more is queued after this. `messages` are the ones that write will hold,\n * so a frame still on its way cannot put an in-progress copy of one of them\n * back.\n */\n close(messages: AgentMessage[] = []): void {\n this.closed = true;\n for (const message of messages) this.done.add(message.id);\n }\n\n /** Settles once every queued write has. Never rejects. */\n settled(): Promise<void> {\n return this.chain;\n }\n\n private checkpoint(messageId: string): void {\n if (this.done.has(messageId)) return;\n const message = this.state.messages.find((held) => held.id === messageId);\n if (!message) return;\n const runId = this.runId;\n this.write(() => {\n const copy = snapshot(message);\n // Stamped only on a message still being written: the run's id is the\n // thing a reader checks for liveness, and a finished message has nothing\n // to check.\n if (copy.finishReason === undefined && runId) copy.runId = runId;\n return [copy];\n });\n }\n\n /**\n * Queues one write. The copy is taken now, before anything else can change\n * the message, and a copy that fails (a tool output that is not plain data)\n * costs that one write, not the journal: the end-of-run write still stores\n * the message.\n */\n private write(copy: () => AgentMessage[]): void {\n let messages: AgentMessage[];\n try {\n messages = copy();\n } catch (error) {\n this.report(error);\n return;\n }\n this.chain = this.chain\n .then(() => this.store.appendMessages(this.threadId, messages))\n .catch((error) => this.report(error));\n }\n}\n\n/**\n * A copy the run cannot change under the store. The run keeps writing to its\n * own objects (a tool result onto the message that made the call), and a store\n * that holds references, as `MemoryAgentStore` does, would otherwise show a\n * reader a message that changes after it was written.\n */\nfunction snapshot(message: AgentMessage): AgentMessage {\n return structuredClone(message);\n}\n\n/**\n * The thread as it stands, with every message a dead run left unfinished\n * marked as such.\n *\n * An assistant message with no `finishReason` is either still being written or\n * was being written by a run that is gone. `isLive` tells the two apart by the\n * message's `runId`; a message without one belongs to no run and is gone too.\n * Each gone one is closed as `interrupted`:\n *\n * - its own `finishReason`, so a UI shows \"cut off\" rather than a cursor that\n * never stops;\n * - a `denied` result with `cause: \"interrupted\"` for every tool call it left\n * without one, so the history stays valid for the provider (a call with no\n * output is a 400) and the model reads what happened to it;\n * - the same reason on any sub-run under its tool calls that never finished,\n * which would otherwise draw a cursor of its own.\n *\n * `settled` is the messages that changed, for the caller to write back. Running\n * this again on its own output changes nothing, which is what makes it safe to\n * run on every read.\n */\nexport async function settleInterrupted(\n messages: AgentMessage[],\n isLive: (runId: string) => boolean | Promise<boolean>,\n): Promise<{ messages: AgentMessage[]; settled: AgentMessage[] }> {\n const settled: AgentMessage[] = [];\n let resolved: Set<string> | null = null;\n const out = messages.slice();\n\n for (let at = 0; at < out.length; at++) {\n const message = out[at]!;\n if (message.role !== \"assistant\" || message.finishReason !== undefined) continue;\n if (message.runId && (await isLive(message.runId))) continue;\n\n // Computed once, and only for a thread that has something to settle,\n // which is almost never.\n resolved ??= new Set(\n messages.flatMap((held) =>\n held.content.flatMap((part) => (part.type === \"tool-result\" ? [part.toolCallId] : [])),\n ),\n );\n\n const content = message.content.map((part) =>\n part.type === \"tool-call\" ? closeCall(part as ToolCallPart) : part,\n );\n for (const part of message.content) {\n if (part.type !== \"tool-call\" || resolved.has(part.toolCallId)) continue;\n const result: ToolResultPart = {\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n name: part.name,\n status: \"denied\",\n cause: \"interrupted\",\n };\n content.push(result);\n }\n const closed: AgentMessage = { ...message, content, finishReason: \"interrupted\" };\n out[at] = closed;\n settled.push(closed);\n }\n\n return { messages: out, settled };\n}\n\n/** A call as a dead run left it: its arguments are all there will ever be,\n * and a sub-run under it that never finished is interrupted too. */\nfunction closeCall(part: ToolCallPart): ToolCallPart {\n const { partial: _partial, ...call } = part;\n if (!call.nested?.some((run) => run.finishReason === undefined)) return call as ToolCallPart;\n return { ...call, nested: call.nested.map(closeRun) } as ToolCallPart;\n}\n\nfunction closeRun(run: NestedRun): NestedRun {\n if (run.finishReason !== undefined) return run;\n return {\n ...run,\n finishReason: \"interrupted\",\n messages: run.messages.map((message) =>\n message.role === \"assistant\" && message.finishReason === undefined\n ? {\n ...message,\n finishReason: \"interrupted\" as const,\n content: message.content.map((part) =>\n part.type === \"tool-call\" ? closeCall(part as ToolCallPart) : part,\n ),\n }\n : message,\n ),\n };\n}\n",
|
|
38
38
|
"import type { Schema } from \"../Schema\";\nimport type { AgentJobRef, AgentMessage, ToolResultPart } from \"../types\";\nimport { clockOf, expire } from \"./AgentJob\";\nimport type { AgentJobRecord, AgentJobState, AgentJobStore } from \"./AgentJobStore\";\n\n/** How many of a thread's newest jobs are checked for orphans on each load. */\nconst ORPHAN_SCAN = 50;\n\nconst ANY_STATE: AgentJobState[] = [\"running\", \"ok\", \"error\"];\n\n/**\n * The thread with each background job's current state rendered over the tool\n * result that points at it (#461).\n *\n * A tool that returned a `JobHandle` left a `running` result in the thread.\n * The job settles later, into the job store, and never into the messages: a\n * live run writes whole messages, and a settle racing those writes would be\n * overwritten by the run's stale copy. So the messages are brought up to date\n * here, when the thread is loaded, which `AgentController` does under the\n * thread's lock before a turn and without writing for `readThread`.\n *\n * - A `running` result whose job settled becomes the job's `ok` or `error`\n * result, in place, with the job still named on it (`job`).\n * - A `running` result whose job is still running is left exactly as it is,\n * so the request stays byte-identical, and the prompt cache with it, until\n * the job settles.\n * - A `running` result whose job the store does not have becomes an `error`:\n * the record was lost (a memory store across a restart), and the work may or\n * may not have happened.\n *\n * `settled` is the messages that changed, for the caller to write back, so\n * the store converges and a job settled long ago costs nothing on later loads.\n *\n * `orphans` are jobs whose tool result never reached the thread: the run died\n * between starting the job and storing the result. They are found among the\n * thread's newest jobs, only once the run that started them is gone, and only\n * the ones not marked yet; the caller marks them (`orphaned`).\n */\nexport async function overlayJobs(\n messages: AgentMessage[],\n params: {\n threadId: string;\n store: AgentJobStore;\n isRunLive: (runId: string) => boolean | Promise<boolean>;\n /** The tool's output schema, to check a settled output against. */\n outputSchemaFor?: (toolName: string) => Schema<any> | undefined;\n /** The tool's `toModel` projection of a settled output (#1061). */\n modelOutputFor?: (toolName: string, output: unknown) => unknown;\n /** How many of the thread's newest jobs to read. At least 50. */\n scan?: number;\n },\n): Promise<{\n messages: AgentMessage[];\n settled: AgentMessage[];\n orphans: AgentJobRecord[];\n /** The thread's newest jobs, as they stand after this pass: for the `<jobs>` block. */\n jobs: AgentJobRecord[];\n}> {\n const { store, threadId } = params;\n const scan = Math.max(ORPHAN_SCAN, params.scan ?? 0);\n const recent = await store.listForThread(threadId, { limit: scan });\n\n // The lazy half of the deadline sweep: a running job past its deadline is\n // failed here, so an app with no cron still sees it fail.\n let now: number | undefined;\n const current = async (record: AgentJobRecord): Promise<AgentJobRecord> => {\n if (record.state !== \"running\") return record;\n now ??= await clockOf(store);\n if (record.deadlineAt > now) return record;\n await expire(store, record);\n return (await store.get(record.id)) ?? record;\n };\n for (let index = 0; index < recent.length; index++) {\n recent[index] = await current(recent[index]!);\n }\n const known = new Map(recent.map((record) => [record.id, record]));\n\n const out = messages.slice();\n const settled: AgentMessage[] = [];\n const calls = new Set<string>();\n\n for (let at = 0; at < out.length; at++) {\n const message = out[at]!;\n let content: AgentMessage[\"content\"] | null = null;\n for (let index = 0; index < message.content.length; index++) {\n const part = message.content[index]!;\n if (part.type === \"tool-call\") calls.add(part.toolCallId);\n if (part.type !== \"tool-result\" || part.status !== \"running\") continue;\n\n const id = part.job?.id;\n let record = id ? known.get(id) : undefined;\n if (id && record === undefined) {\n const found = await store.get(id);\n record = found ? await current(found) : undefined;\n if (record) known.set(id, record);\n }\n if (record?.state === \"running\") continue;\n\n content ??= message.content.slice();\n content[index] = settledResult(part, record, params.outputSchemaFor, params.modelOutputFor);\n }\n if (content) {\n const changed: AgentMessage = { ...message, content };\n out[at] = changed;\n settled.push(changed);\n }\n }\n\n const orphans: AgentJobRecord[] = [];\n for (const record of recent) {\n if (record.orphaned || calls.has(record.toolCallId)) continue;\n if (await params.isRunLive(record.runId)) continue;\n orphans.push(record);\n }\n\n return { messages: out, settled, orphans, jobs: recent };\n}\n\n/** Marks orphans found by `overlayJobs`. Never throws: it is bookkeeping. */\nexport async function markOrphans(\n store: AgentJobStore,\n orphans: AgentJobRecord[],\n report: (error: unknown) => void,\n): Promise<void> {\n for (const record of orphans) {\n try {\n await store.transition(record.id, ANY_STATE, { orphaned: true });\n } catch (error) {\n report(error);\n }\n }\n}\n\nfunction settledResult(\n part: Extract<ToolResultPart, { status: \"running\" }>,\n record: AgentJobRecord | undefined,\n outputSchemaFor: ((toolName: string) => Schema<any> | undefined) | undefined,\n modelOutputFor?: (toolName: string, output: unknown) => unknown,\n): ToolResultPart {\n const base = { type: \"tool-result\" as const, toolCallId: part.toolCallId, name: part.name };\n const ok = (output: unknown, job: AgentJobRef): ToolResultPart => {\n const modelOutput = modelOutputFor?.(String(part.name), output);\n return {\n ...base,\n status: \"ok\",\n job,\n output,\n ...(modelOutput !== undefined ? { modelOutput } : {}),\n };\n };\n if (!record) {\n return {\n ...base,\n status: \"error\",\n job: part.job,\n error: {\n code: \"tool_error\",\n message: `The background job for \"${String(part.name)}\" can no longer be found, so its result was lost. It may have run in part or in full: check its effects before repeating it.`,\n toolCallId: part.toolCallId,\n retryable: true,\n },\n };\n }\n\n const job: AgentJobRef = {\n id: record.id,\n ...(record.summary !== undefined ? { summary: record.summary } : {}),\n ...(record.usage ? { usage: record.usage } : {}),\n };\n if (record.state === \"error\") {\n return {\n ...base,\n status: \"error\",\n job,\n error: record.error ?? {\n code: \"tool_error\",\n message: `The background job for \"${String(part.name)}\" failed.`,\n toolCallId: part.toolCallId,\n retryable: true,\n },\n };\n }\n\n const schema = outputSchemaFor?.(String(part.name));\n if (schema) {\n const parsed = schema.safeParse(record.output);\n if (parsed.ok === false) {\n return {\n ...base,\n status: \"error\",\n job,\n error: {\n code: \"invalid_tool_result\",\n message: `The background job for \"${String(part.name)}\" finished with an output that does not match the tool's output schema: ${parsed.errors.join(\", \")}`,\n toolCallId: part.toolCallId,\n retryable: true,\n },\n };\n }\n return ok(parsed.value, job);\n }\n return ok(record.output, job);\n}\n",
|
|
39
|
-
"import { Storage } from \"../facades/Storage\";\nimport { Controller } from \"../http/Controller\";\nimport { refusal, RequestBreakerError } from \"../http/Error\";\nimport { HttpRequest } from \"../http/HttpRequest\";\nimport { RequestContext } from \"../http/requestContext\";\nimport { mediaType } from \"../http/mediaType\";\nimport { refusalKindForStatus } from \"../http/refusal\";\nimport type { MiddlewareInput } from \"../http/middlewareList\";\nimport type { AgentResource } from \"../http/ResourcePolicy\";\nimport type {\n AgentContext,\n AgentRun,\n AgentRunResult,\n AgentToolShapes,\n AnyAgent,\n ContextOf,\n PrepareStepContext,\n PrepareStepResult,\n ReasoningEffort,\n SkillDefinition,\n ToolEntry,\n ToolShapesOf,\n} from \"./Agent\";\nimport type { ContextWindowOptions } from \"./contextWindow\";\nimport { modelOutputOf } from \"./toolModelOutput\";\nimport { isSummaryStore, type ThreadSummary } from \"./contextCompaction\";\nimport { injectedMessageIds, toolCallInputOf } from \"./Agent\";\nimport {\n type Attachment,\n ATTACHMENT_ID_PREFIX,\n type AttachmentDestination,\n attachmentObjectName,\n type AttachmentScope,\n type AttachmentStorage,\n type AttachmentStore,\n defaultAttachmentStore,\n newAttachmentId,\n ScopedAttachments,\n} from \"./store/Attachments\";\nimport {\n FrameCursorEvictedError,\n liveRuns as defaultLiveRuns,\n LiveRunNotFoundError,\n MemoryLiveRuns,\n} from \"./store/LiveRuns\";\nimport {\n defaultFileOwners,\n type FileOwnerRecord,\n type FileOwners,\n MemoryFileOwners,\n} from \"./store/FileOwners\";\nimport {\n defaultNonceStore,\n MemoryNonceStore,\n type NonceModel,\n type NonceRedisClient,\n type NonceStore,\n PrismaNonceStore,\n type PrismaNonceStoreOptions,\n RedisNonceStore,\n type RedisNonceStoreOptions,\n} from \"./store/Nonces\";\nimport {\n MemoryReceiptStore,\n type ReceiptClaim,\n type ReceiptRedisClient,\n type ReceiptStore,\n RedisReceiptStore,\n type RedisReceiptStoreOptions,\n} from \"./store/Receipts\";\nimport { defaultAgentStore, MemoryAgentStore } from \"./store/MemoryAgentStore\";\nimport { normalizeProviderError, ProviderHttpError } from \"./providers/errors\";\nimport { redactError, unredactedError } from \"./redact\";\nimport type { ErrorRedactionInfo } from \"./redact\";\nimport { sseResponse } from \"./store/sse\";\nimport { settleInterrupted, TurnJournal } from \"./store/TurnJournal\";\nimport { AgentJobs } from \"./jobs/AgentJob\";\nimport { markOrphans, overlayJobs } from \"./jobs/overlay\";\nimport { DEFAULT_JOBS_CONTEXT_MAX, renderJobsBlock } from \"./jobs/contextBlock\";\nimport type { AgentJobRecord } from \"./jobs/AgentJobStore\";\nimport type { AgentMemoryScopes } from \"./memory/runMemory\";\nimport type { AgentUsageLimits } from \"./usageLimits\";\nimport type { Schema } from \"./Schema\";\nimport { RealtimeRequestError, type RealtimeSession } from \"./providers/realtime\";\nimport type { VoiceConfig } from \"./voiceConfig\";\nimport { defaultVoiceStore, type VoiceSessionRecord, type VoiceSessionStore } from \"./voiceStore\";\nimport { emptyUsage } from \"./runtime\";\nimport { mcpVoiceTools } from \"./voiceMcp\";\nimport { DEFAULT_DELEGATE_NAME, VoiceBridge, voiceTools } from \"./VoiceBridge\";\nimport type { VoiceStartResponse } from \"./voice/wire\";\nimport type {\n AgentError,\n AgentMessage,\n AgentStreamEvent,\n ClientTurn,\n JsonToolShapes,\n PendingToolCall,\n ToolResultPart,\n ToolShapes,\n} from \"./types\";\n\n// --- storage -------------------------------------------------------------\n\n/**\n * Where conversations live.\n *\n * Stateless is the default and nothing here is required to hold a conversation:\n * the client can carry its own history, and a pending approval travels in it\n * safely because the server signed it. What a store buys is a conversation that\n * survives the browser — and, with `/attach`, one whose interrupted turn is\n * still there after a refresh.\n */\nexport interface AgentStore {\n /**\n * Where a `threadId` comes from. `ApiRouter.agent()` mounts no route for\n * this: the app writes one, calls it here, and hands the id to `useChat` —\n * the mount is the app's because it is where ownership gets recorded, and a\n * store that holds no user cannot do that for it. An id that did not come out\n * of here is `null` from `loadThread` and a 404 from the controller, unless\n * the store's ids are the client's by design (`MemoryAgentStore`'s\n * `clientOwnedIds`).\n */\n createThread(params: { userId?: string | number }): Promise<{ threadId: string }>;\n /**\n * The history, or `null` for a thread the store does not have.\n *\n * `null` and `[]` are different answers and the controller acts on the\n * difference: an empty array is a conversation with nothing in it yet, and a\n * turn on it runs; `null` is a 404 before anything runs. A store that answers\n * `[]` for an id it has never seen turns an expired or mistyped thread into a\n * fresh conversation with no signal, and persists the next turn under the\n * dead id. Only a store whose ids are minted by the client should do that,\n * and then on purpose — see `MemoryAgentStore`'s `clientOwnedIds`.\n */\n loadThread(threadId: string): Promise<AgentMessage[] | null>;\n /**\n * Upsert by message id: replace a message the thread already holds, append\n * one it does not, and keep the order the thread had. Called with a thread\n * `loadThread` just found; must not create one.\n *\n * The name says append because that is what almost every call is, but a\n * turn that resolves a pending call reports the earlier assistant message\n * again — same id, now with the result attached — and a store that only\n * appends ends up with both versions. A table keyed by message id has the\n * lookup already but still needs an insert-or-update rather than a plain\n * insert, which would fail on the key; a store that is a list has to look\n * before it pushes.\n *\n * It is also called while a turn runs, not only when it ends (#617): with the\n * user's message as the run starts, with the assistant message in progress\n * (no `finishReason`, the run's id in `runId`) as it opens and at each tool\n * call and result, and with each message again once it is finished. The\n * same message arrives several times, and the last write is the one to\n * keep. Calls for one run never overlap: each waits for the one before.\n */\n appendMessages(threadId: string, messages: AgentMessage[]): Promise<void>;\n /**\n * Delete these messages from the thread; ids it does not hold are ignored.\n *\n * What a threaded `regenerate` needs (#451): the server owns the history,\n * so the answer being replaced has to leave the store, or the model reads\n * `user: X, assistant: A, user: X` and writes a follow-up instead of a new\n * answer. The controller calls it under the thread's lock with the last user\n * turn and everything after it, then runs that turn again.\n *\n * Optional so a store written before it still compiles; without it a turn\n * with `regenerate: true` on a thread is a 501 `regenerate_unsupported`.\n */\n removeMessages?(threadId: string, messageIds: string[]): Promise<void>;\n /**\n * Optional: where `contextWindow.compact` keeps the thread's summaries\n * (#782), so they live, and are deleted, with the thread. Implement both to\n * opt in; without them summaries go to `defaultSummaryStore`, in memory.\n * Same contract as `SummaryStore`.\n */\n loadSummaries?(threadId: string): Promise<ThreadSummary[]>;\n saveSummary?(threadId: string, summary: ThreadSummary): Promise<void>;\n /** Optional cross-process lock for one cut. See `SummaryStore.lockSummary`. */\n lockSummary?(\n threadId: string,\n cutMessageId: string,\n ttlMs: number,\n ): Promise<(() => Promise<void>) | null>;\n}\n\n/** The default: conversations last as long as the process. */\nexport { defaultAgentStore, MemoryAgentStore };\n\n/** The attachment half of the same story. See `store/Attachments.ts`. */\nexport {\n type Attachment,\n type AttachmentDestination,\n AttachmentNotFoundError,\n type AttachmentScope,\n type AttachmentStorage,\n type AttachmentStore,\n defaultAttachmentStore,\n InvalidAttachmentScopeError,\n MemoryAttachmentStore,\n type PutAttachmentParams,\n ScopedAttachments,\n type ToolAttachmentPut,\n type ToolAttachmentRecord,\n type ToolAttachments,\n} from \"./store/Attachments\";\n\n/**\n * The runs currently in flight, and their frames.\n *\n * A run outlives the request that started it, so something has to hold it while\n * no one is listening, and hold what it emitted meanwhile so a returning client\n * can catch up rather than start over. That is all this is: a per-process map\n * plus a bounded buffer.\n *\n * Per-process is not an implementation shortcut that a better store fixes — a\n * running generator lives in one process, and a second server cannot attach to\n * it. Reattachment therefore needs the request to land where the run is: one\n * server, sticky routing, or a proxy that forwards by `runId`. Worth saying out\n * loud, because the failure mode behind a round-robin load balancer is a\n * refresh that usually works.\n *\n * This is the read side, which is all `attach` and `stop` need. Registering a\n * run and replaying its buffer are on `MemoryLiveRuns`, the only implementation\n * there can be — see the note there for why a second one would not help.\n */\nexport interface LiveRuns {\n /** What the client asks after a refresh: is anything still going here? */\n find(params: { threadId: string }): Promise<{ runId: string; seq: number } | null>;\n get(runId: string): AgentRun | null;\n /** Kept for a short while after `run-end`, so a refresh a second late still\n * sees the tail instead of an empty screen. */\n ttlMs: number;\n}\n\nexport {\n FrameCursorEvictedError,\n LiveRunNotFoundError,\n MemoryLiveRuns,\n defaultLiveRuns as liveRuns,\n};\n\n/** Who uploaded each provider file id (#443). See `store/FileOwners.ts`. */\nexport { defaultFileOwners, type FileOwnerRecord, type FileOwners, MemoryFileOwners };\n/** Where approved tools' executions are recorded (#458). See `store/Receipts.ts`. */\nexport {\n MemoryReceiptStore,\n type ReceiptClaim,\n type ReceiptRedisClient,\n type ReceiptStore,\n RedisReceiptStore,\n type RedisReceiptStoreOptions,\n};\n/** Where answered calls' nonces are spent (#445). See `store/Nonces.ts`. */\nexport {\n defaultNonceStore,\n MemoryNonceStore,\n type NonceModel,\n type NonceRedisClient,\n type NonceStore,\n PrismaNonceStore,\n type PrismaNonceStoreOptions,\n RedisNonceStore,\n type RedisNonceStoreOptions,\n};\n\n// --- controller ----------------------------------------------------------\n\nexport type AgentHookContext = {\n /**\n * The request that started the turn. Its `state` is the turn's own typed\n * state (#887): a value set in `authorizeRequest()`, `instructions()` or\n * `context()` (`req.state.set(key, value)`) is read here with\n * `ctx.req.state.get(key)`, instead of a `WeakMap` keyed on the request.\n * A request answering an approval is a new turn and starts with none.\n */\n req: HttpRequest<any, any>;\n runId: string;\n threadId?: string;\n};\n\n/**\n * The call a tool result answers, as `onToolResult` gets it (#1079): the same\n * shape `onToolCall` gets. `input` is what the model sent, before the tool's\n * schema parsed it, so a call refused for a mis-typed argument has it too.\n */\nexport type ToolResultCall = {\n toolCallId: string;\n name: string;\n input: unknown;\n};\n\n/**\n * What `AgentController.startTurn` takes (#839).\n */\nexport type AgentTurnParams<Body extends object = Record<string, unknown>> = {\n /** The thread the turn is stored on, as a turn from `useChat` would be. */\n threadId: string;\n /** The user's message. Shorthand for `turn: { text }`, and wins over `turn.text`. */\n text?: string;\n /**\n * The whole turn, for files or answers: `{ text, files, toolResults }`, as\n * `useChat` sends it. Neither `text` nor `turn` is a turn with nothing in\n * it, which lets the model continue the thread.\n */\n turn?: ClientTurn;\n /**\n * Who the turn runs as: `req.ctx().user` for `authorizeRequest`, `runOwner`,\n * `context()`, the hooks and every tool, as the authentication middleware\n * would have set it. Absent or `null` is an anonymous turn.\n */\n user?: unknown;\n /** What `useChat`'s `body` option would send: `instructions()`, `context()` and `ctx.body` read it. */\n body?: Body;\n};\n\n/** A turn `AgentController.startTurn` started. */\nexport type AgentTurn = {\n runId: string;\n threadId: string;\n /** The run: iterate it (or its `frames()`) to follow the turn as it goes. */\n run: AgentRun;\n /** What the chat's stop button does. */\n stop(params?: { reason?: string }): void;\n /**\n * Settles when the run has ended, its transcript is stored and the\n * controller's hooks have run (or `hookHoldMs` has passed). Rejects only if\n * the run itself does; a failed model call resolves with `finishReason:\n * \"error\"` and `error`, as `AgentRun.result()` does.\n */\n result(): Promise<AgentTurnResult>;\n};\n\n/**\n * A message of the controller's threads, as `readThread` answers it (#1100):\n * typed by the agent's tools, so it goes into the route's\n * `useChat({ initialMessages })` with no cast. The tools' outputs, progress\n * and previews are in their JSON form (`JsonToolShapes`, #1107), as the\n * thread store hands them back and as `useChat` types them.\n *\n * A controller whose agent is not known (`AgentController`, or the\n * `AgentController<any, any>` bound the route helpers use, or an agent whose\n * tools have no literal names) answers `AgentMessage<any>`. `AgentMessage` is invariant in its tool shapes (a\n * message of an agent with more tools has parts a narrower one does not\n * expect), so a typed answer fits neither `AgentMessage<ToolShapes>` nor\n * `AgentMessage<AgentToolShapes<AnyAgent>>`, and a concrete controller would\n * no longer fit those bounds.\n */\nexport type ThreadMessage<A> = 0 extends 1 & A\n ? AgentMessage<any>\n : A extends AnyAgent\n ? // `AnyAgent`'s shapes (and an untyped tool list's) are an index signature.\n string extends keyof AgentToolShapes<A>\n ? AgentMessage<any>\n : // Re-checked against `ToolShapes` because the mapping over a generic\n // agent's shapes cannot show it keeps `input` and `output`.\n JsonToolShapes<AgentToolShapes<A>> extends infer J extends ToolShapes\n ? AgentMessage<J>\n : never\n : AgentMessage<any>;\n\n/** What `AgentTurn.result()` answers: the run's result, and what a caller reads off it. */\nexport type AgentTurnResult = AgentRunResult<ToolShapes, unknown> & {\n threadId: string;\n /** The text of the run's last assistant message; `\"\"` when it wrote none. */\n text: string;\n /**\n * The calls waiting for an answer when `finishReason` is\n * `\"awaiting-input\"`, and `[]` otherwise. They stay on the thread, signed\n * for the turn's `runOwner`: that user can answer them in the chat, or the\n * caller can with another `startTurn({ turn: { toolResults } })`.\n */\n pending: PendingToolCall[];\n};\n\n/**\n * A turn `startTurn` could not start: what the route would have answered,\n * thrown. `status` and `code` are the route's (`404` `thread_not_found`,\n * `429` `too_many_runs`, `403` for another owner's run or file...).\n */\nexport class AgentTurnError extends Error {\n readonly status: number;\n readonly code?: string;\n readonly kind?: string;\n\n constructor(message: string, params: { status: number; code?: string; kind?: string }) {\n super(message);\n this.name = \"AgentTurnError\";\n this.status = params.status;\n this.code = params.code;\n this.kind = params.kind;\n }\n\n /** @internal Reads a refusal `stream` answered. */\n static async from(response: Response): Promise<AgentTurnError> {\n let error: Record<string, unknown> = {};\n try {\n const parsed = (await response.json()) as { error?: Record<string, unknown> };\n if (parsed?.error && typeof parsed.error === \"object\") error = parsed.error;\n } catch {\n // Not a JSON refusal: the status says what there is to say.\n }\n const text = (key: string) => (typeof error[key] === \"string\" ? (error[key] as string) : undefined);\n return new AgentTurnError(\n text(\"message\") ?? `The agent turn was refused with status ${response.status}.`,\n { status: response.status, code: text(\"code\"), kind: text(\"kind\") },\n );\n }\n}\n\n/** `Body` of a controller instance type, as `AgentRouteRPC` reads it. */\ntype ControllerBody<C> = C extends { [BODY]?: infer B }\n ? B extends object\n ? B\n : Record<string, unknown>\n : Record<string, unknown>;\n\n/** The text of the last assistant message among `messages`, or `\"\"`. */\nfunction lastAssistantText(messages: AgentMessage[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (message.role !== \"assistant\") continue;\n return message.content\n .map((part) => (part.type === \"text\" ? part.text : \"\"))\n .join(\"\");\n }\n return \"\";\n}\n\n/** What `AgentController.attachmentLimits` answers. Both optional. */\nexport type AttachmentLimits = {\n /** The largest file accepted, in bytes. */\n maxBytes?: number;\n /** `<input accept>` entries: `\".pdf\"`, `\"image/*\"`, `\"text/csv\"`. */\n accept?: string[];\n};\n\n/** The file `AgentController.checkUpload` is asked about: what it is, not its bytes. */\nexport type UploadCheckFile = {\n /** The file's name as the client sent it, `\"upload\"` when it sent none. */\n name: string;\n /** In bytes. */\n size: number;\n /** As the client sent it, `\"application/octet-stream\"` when it sent none. */\n mimeType: string;\n};\n\n/**\n * What an upload hook is told beyond the request (#836): the client's `body`\n * option (what `attachmentScope` gets) and the thread the upload is for, when\n * the store knows it.\n */\nexport type UploadContext<Body extends object = Record<string, unknown>> = {\n body: Body;\n /** Only a thread the store found; an id it has never seen is left out. */\n threadId?: string;\n};\n\n/**\n * What `AgentController.checkUpload` returns to refuse a file. Answered **422**\n * with `{ error: { code, message } }`, which `useChat().attach()` rejects with\n * as an `AttachError` carrying the same `code` and `message`.\n */\nexport type UploadRefusal = {\n /** A code the composer can switch on. `\"upload_refused\"` when left out. */\n code?: string;\n /** The sentence the person reads. */\n message: string;\n};\n\n/**\n * What `POST /<path>/files` answers.\n *\n * TWO IDS, AND THEY ARE NOT INTERCHANGEABLE. `fileId` is the *provider's* id and\n * means exactly what it always meant — the value a `FilePart` carries so the\n * model can see the file. `attachmentId` is *gemi's*, and is the handle a tool\n * resolves through `ScopedAttachments` to get the bytes back. A file can have\n * both, and usually does.\n *\n * `fileId` stays first and stays named that on purpose: `useChat.uploadFile`\n * already reads it, apps already put it in a `FilePart`, and renaming it or\n * folding the two into one id would break vision for every existing app while\n * looking like a tidier API. The two ids exist because there are two systems\n * holding the file.\n *\n * Both are optional, and `destination` says which to expect: `provider` has no\n * `attachmentId` (nothing was kept), `storage` has no `fileId` (the provider\n * never saw it, so there is nothing for a `FilePart` to point at), `both` has\n * both.\n *\n * `destination` ALONE IS NOT ENOUGH TO SAY WHY AN ID IS MISSING, which is why\n * `downgraded` is here. An upload that reached a route with no authentication\n * and no `threadId` answers `destination: \"provider\"` — truthfully, that is\n * where the bytes went — and so does a controller that deliberately returns\n * `\"provider\"` from `attachmentDestination`. Those two answers were byte\n * identical, and they are the opposite situations: one is the app's policy\n * working, the other is the app's policy silently not applying because the\n * server could not tell who was calling. The server logs the second one once\n * per process; the client saw nothing at all. `downgraded` is the difference,\n * carried in the answer so a client — or an integration test — can assert on\n * it.\n */\nexport type UploadResult = {\n /** The provider's id, for a `FilePart`. Absent when the file never went there. */\n fileId?: string;\n /** gemi's id, for a tool. Absent when nothing was kept — see `attachmentScope`. */\n attachmentId?: string;\n name: string;\n mimeType: string;\n size: number;\n destination: AttachmentDestination;\n /**\n * Set only when the app's policy asked for a copy and the request had no\n * subject to file it under, so the upload fell back to the provider alone.\n * Absent when `destination` is what the app actually chose.\n *\n * A string rather than `true` because there is exactly one reason today and\n * there will be more (a store that refused the write, say), and a boolean\n * that later needs a reason beside it is two fields where one would have\n * done.\n */\n downgraded?: \"no_scope\";\n};\n\n/**\n * `Controller.kind` is typed as the literal `\"controller\"`, so a subclass that\n * declares a `kind` of its own fails the static-side check (TS2417). Widening\n * it belongs in `http/Controller.ts`, which this slice does not own; erasing\n * the static side of the base here is the smaller change and costs nothing —\n * `Controller.kind` has no reader, in this package or out of it.\n */\nconst ControllerBase = Controller as new () => Controller;\n\n/**\n * The thread a `stream` is setting up on, to the setup ahead of it. Module\n * level because the controller is constructed per request, so nothing on it\n * can be seen by the next request; keyed by thread rather than held on\n * `liveRuns` because it guards the controller's protocol, not the frames. An\n * entry is removed once the last setup queued on it releases.\n */\nconst threadLocks = new Map<string, Promise<void>>();\n\n/**\n * Each run to the promise that its transcript has been stored. Weak, so a run\n * the map has evicted is not kept alive here for a promise nobody will ask for.\n */\nconst persisted = new WeakMap<AgentRun, Promise<void>>();\n\n/**\n * The run a `startTurn` request started, by that request (#839). `stream`\n * answers a `Response`, which is what a route needs; `startTurn` needs the run\n * itself and the promise that its hooks are done, and this is how it gets them\n * without `stream` growing a second return shape. Weak, so a request nobody\n * reads back leaves nothing behind.\n */\nconst serverTurns = new WeakMap<\n HttpRequest<any, any>,\n { run: AgentRun; hooks: Promise<void> } | null\n>();\n\n/** The URL of the request `startTurn` builds. Nothing routes to it. */\nconst SERVER_TURN_URL = \"http://gemi.internal/__gemi/agent-turn\";\n\n/**\n * Turns read but not yet registered, by the client's name for them.\n *\n * A run can be stopped from `register` on, and named from `run-start` on. What\n * `/stop` could not reach was a turn still waiting its place on the thread —\n * which is where a user who sent twice and thought better of it presses stop,\n * and the wait is now as long as the old run's unwind. Falling through to\n * `threadId` there found the old run, already stopping, said `stopped: true`,\n * and the queued turn started anyway: unwatched, billing, and with no handle\n * left on the client that had let go of it. The entry is marked rather than\n * removed, because the turn itself is what answers once its wait is over.\n */\nconst pendingTurns = new Map<string, { cancelled: boolean; owner: string | null }>();\n\n// --- limits (#444) -------------------------------------------------------\n\n/** `AgentController.maxBodyBytes`'s default. */\nexport const DEFAULT_MAX_BODY_BYTES = 4 * 1024 * 1024;\n/** `AgentController.maxHistoryMessages`'s default. */\nexport const DEFAULT_MAX_HISTORY_MESSAGES = 1000;\n/** `AgentController.maxConcurrentRuns`'s default. */\nexport const DEFAULT_MAX_CONCURRENT_RUNS = 5;\n/** The cap on `attach` and `stop` bodies, which carry ids and nothing else. */\nconst SMALL_BODY_BYTES = 64 * 1024;\n\nconst noop = () => {};\n\n/**\n * The runs each `runLimitKey` has going, by lane: a thread is one lane however\n * many turns are queued or superseding on it, and a stateless turn is a lane\n * of its own. A lane is held from the moment its turn is admitted until its\n * last run ends.\n */\nclass RunSlots {\n private byKey = new Map<string, Map<string, number>>();\n\n /**\n * Admits a turn in `lane` for `key`, or answers `null` when `key` already\n * holds `limit` other lanes. Synchronous, so two turns arriving together\n * cannot both see the last free slot. The function it returns frees the\n * turn's hold; calling it twice is harmless.\n */\n take(key: string, lane: string, limit: number): (() => void) | null {\n let lanes = this.byKey.get(key);\n if (!lanes?.has(lane) && (lanes?.size ?? 0) >= limit) {\n return null;\n }\n if (!lanes) {\n lanes = new Map();\n this.byKey.set(key, lanes);\n }\n lanes.set(lane, (lanes.get(lane) ?? 0) + 1);\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const current = this.byKey.get(key);\n const count = (current?.get(lane) ?? 1) - 1;\n if (!current) return;\n if (count > 0) {\n current.set(lane, count);\n } else {\n current.delete(lane);\n if (current.size === 0) this.byKey.delete(key);\n }\n };\n }\n}\n\n/**\n * Slots are counted per `liveRuns` registry rather than per process: the\n * registry is what holds the runs being counted, and an app (or a test) with\n * two registries has two sets of runs.\n */\nconst runSlots = new WeakMap<object, RunSlots>();\nfunction runSlotsFor(liveRuns: object): RunSlots {\n let slots = runSlots.get(liveRuns);\n if (!slots) {\n slots = new RunSlots();\n runSlots.set(liveRuns, slots);\n }\n return slots;\n}\n\n/**\n * The key that carries `Body` on the instance type.\n *\n * A `declare const` unique symbol, so it exists only in the type layer — the\n * same device `Schema.ts` uses for its output type, and for the same reason: a\n * real property would be one an app could see, serialise or depend on.\n */\ndeclare const BODY: unique symbol;\n\n/**\n * What `authorizeRequest` is told about the request, per route.\n *\n * A union on `route` because `body` exists on only two of them: `stream` and\n * `upload` carry the client's `body` option, `attach` and `stop` carry none.\n * Typing it optional everywhere would make every reader of `body.pageId` on\n * `stream` write a check for a case that cannot happen there; narrowing on\n * `route` says which case it is. An override written against the older\n * `{ route; threadId? }` shape still accepts every member.\n */\nexport type AuthorizeRequestParams<Body extends object = Record<string, unknown>> =\n | { route: \"stream\" | \"upload\"; threadId?: string; body: Body }\n | { route: \"attach\" | \"stop\"; threadId?: string; body?: undefined };\n\n/**\n * What `AgentController.runTools()` answers for a turn (#1123): tools added to\n * the agent's for this run, and which tools the model is offered. Both are\n * optional; see `AgentStreamParams.tools` and `AgentStreamParams.activeTools`.\n */\nexport type AgentRunTools = {\n tools?: readonly ToolEntry[];\n activeTools?: readonly string[];\n};\n\n/**\n * HOOKS SHARED BY SEVERAL AGENT CONTROLLERS (#989), assigned to a controller's\n * `hooks`. Each one stands in for gemi's default of the controller method with\n * the same name, and takes the same arguments. See `AgentController.hooks`.\n *\n * Plain functions, not methods: they get no `this`. What one hook leaves for\n * another in the same turn (a charge made in `context`, settled in\n * `onStreamComplete`) goes on `req.state`, which every hook reaches\n * (`ctx.req.state` in the event hooks).\n */\nexport type AgentControllerHooks<Body extends object = object, Ctx = AgentContext> = {\n authorizeRequest?: (\n req: HttpRequest<any, any>,\n params: AuthorizeRequestParams<Body>,\n ) => void | Promise<void>;\n runOwner?: (req: HttpRequest<any, any>) => string | null | Promise<string | null>;\n runLimitKey?: (\n req: HttpRequest<any, any>,\n params: { owner: string | null; threadId?: string },\n ) => string | null | Promise<string | null>;\n instructions?: (\n req: HttpRequest<any, any>,\n extra: { body: Body },\n ) => string | Promise<string> | void;\n reasoning?: (\n req: HttpRequest<any, any>,\n extra: { body: Body },\n ) => ReasoningEffort | void | Promise<ReasoningEffort | void>;\n skills?: (\n req: HttpRequest<any, any>,\n extra: { body: Body },\n ) => readonly SkillDefinition[] | void | Promise<readonly SkillDefinition[] | void>;\n runTools?: (\n req: HttpRequest<any, any>,\n extra: { body: Body; context: Ctx },\n ) => AgentRunTools | void | Promise<AgentRunTools | void>;\n usageLimits?: (\n req: HttpRequest<any, any>,\n extra: { body: Body; context: Ctx },\n ) => AgentUsageLimits | void | Promise<AgentUsageLimits | void>;\n /** Builds the run's context. `Ctx` is the agents' (see `defineAgentHooks`). */\n context?: (req: HttpRequest<any, any>, extra: { body: Body }) => Ctx | Promise<Ctx>;\n memoryScopes?: (\n req: HttpRequest<any, any>,\n extra: { body: Body },\n ) => AgentMemoryScopes | Promise<AgentMemoryScopes>;\n prepareStep?: (\n step: PrepareStepContext<Ctx>,\n ctx: AgentHookContext,\n ) => PrepareStepResult | void | Promise<PrepareStepResult | void>;\n attachmentScope?: (\n req: HttpRequest<any, any>,\n threadId?: string,\n extra?: { body: Body },\n ) => AttachmentScope | null | Promise<AttachmentScope | null>;\n attachmentLimits?: (\n req: HttpRequest<any, any>,\n ) => AttachmentLimits | null | Promise<AttachmentLimits | null>;\n checkUpload?: (\n file: UploadCheckFile,\n req: HttpRequest<any, any>,\n ctx: UploadContext<Body>,\n ) => UploadRefusal | null | void | Promise<UploadRefusal | null | void>;\n attachmentDestination?: (\n file: File,\n req: HttpRequest<any, any>,\n extra?: UploadContext<Body>,\n ) => AttachmentDestination | Promise<AttachmentDestination>;\n onMessage?: (message: AgentMessage, ctx: AgentHookContext) => void | Promise<void>;\n onToolCall?: (\n call: { toolCallId: string; name: string; input: unknown },\n ctx: AgentHookContext,\n ) => void | Promise<void>;\n onToolResult?: (\n result: ToolResultPart,\n ctx: AgentHookContext,\n call: ToolResultCall,\n ) => void | Promise<void>;\n onAwaitingInput?: (pending: PendingToolCall[], ctx: AgentHookContext) => void | Promise<void>;\n redactError?: (error: AgentError, info: ErrorRedactionInfo, ctx: AgentHookContext) => AgentError;\n onError?: (error: AgentError, ctx: AgentHookContext) => void | Promise<void>;\n onStreamComplete?: (\n result: AgentRunResult<any, any>,\n ctx: AgentHookContext,\n ) => void | Promise<void>;\n reportHookFailure?: (error: unknown) => void;\n};\n\n/**\n * Types an `AgentControllerHooks` object for the `Body` its controllers take,\n * so each hook's parameters are typed without annotating them (#989). It\n * returns the object unchanged.\n *\n * ```ts\n * export const chatHooks = defineAgentHooks<{ pageId: string }>({\n * runOwner: (req) => teamOwner(req),\n * async onStreamComplete(result, ctx) {\n * await settle(result, ctx.req.state.get(charge));\n * },\n * });\n * ```\n *\n * A controller whose `Body` has at least these fields can use it.\n *\n * `Ctx` types a shared `context` hook (and `prepareStep`'s `step.context`) for\n * agents with a context of their own (#1019): `defineAgentHooks<PageBody,\n * PageContext>({ context: ... })`. It defaults to the app's `AgentContext`.\n * Hooks that build no context fit any controller, whatever its agent's.\n */\nexport function defineAgentHooks<Body extends object = object, Ctx = AgentContext>(\n hooks: AgentControllerHooks<Body, Ctx>,\n): AgentControllerHooks<Body, Ctx> {\n return hooks;\n}\n\nexport abstract class AgentController<\n A extends AnyAgent = AnyAgent,\n /**\n * The extra fields `useChat`'s `body` option sends with every turn, as they\n * arrive in `instructions()` and on `ctx.body`.\n *\n * Declaring it also types the client: `useChat` reads it back off the route\n * through `AgentRouteRPC`, so a `body` the controller does not expect is a\n * compile error at the call site rather than an `undefined` three layers\n * into a tool. It types the shape, not the contents — see `instructions`.\n *\n * Constrained to `object`, not `Record<string, unknown>`: an `interface` gets\n * no implicit index signature, so the tighter bound refused\n * `interface PageBody { pageId: string }` with a `TS2344` that names the\n * constraint and not the reason. An interface is how most apps write a request\n * shape, and turning that into a puzzle about `type` versus `interface` is a\n * poor first impression of the feature.\n */\n Body extends object = Record<string, unknown>,\n> extends ControllerBase {\n static kind = \"agent-controller\" as const;\n\n /**\n * `Body`, in a position nothing can shorten away.\n *\n * It has to appear on the instance type for `AgentRouteRPC` to infer it, and\n * `instructions`'s second parameter is not a safe place to leave that job:\n * TypeScript's parameter-wise inference stops at the shorter signature, so a\n * controller overriding `instructions(req)` — which is every override written\n * before this existed, since that was the only signature — supplied no\n * candidate and silently fell back to the open record. The client-side\n * checking then vanished on the most ordinary upgrade path, with nothing to\n * read.\n *\n * `declare` so it emits no field: there is no value here, only a type for\n * `infer B` to find. Optional and never assigned, so no subclass has to\n * mention it.\n */\n declare readonly [BODY]?: Body;\n\n /** The agent this controller serves. A property rather than a constructor\n * argument so `Router.agent(ChatController)` can take the class, matching how\n * every other controller is mounted. */\n abstract agent: A;\n\n /**\n * HOOKS SHARED WITH OTHER CONTROLLERS (#989), so an app's chats can share\n * their authorization, run owner, upload rules and billing without an\n * app-level base class between them and this one. Assign a module-level\n * object made with `defineAgentHooks`:\n *\n * export const chatHooks = defineAgentHooks<{ pageId: string }>({\n * authorizeRequest: (req, params) => authorizePage(req, params),\n * runOwner: (req) => teamOwner(req),\n * });\n *\n * class PageChatController extends AgentController<typeof pageAgent, PageBody> {\n * agent = pageAgent;\n * hooks = chatHooks;\n * }\n *\n * Each hook stands in for gemi's default of the method with the same name.\n * A method the controller overrides itself wins over the hook, and reaches\n * it with `super.method(...)`, exactly as it would reach a base class's.\n * Unset (the default), every method is gemi's own.\n *\n * Hooks of any `Ctx` are accepted, so a controller whose agent has a\n * context of its own (#1019) can share hooks that build none. Such a\n * controller builds its context in its own `context()`, which is checked\n * against the agent; a shared `context` hook is checked only against the\n * `Ctx` its `defineAgentHooks` names.\n */\n protected hooks?: AgentControllerHooks<Body, any>;\n\n /**\n * Defaults to the process-wide `MemoryAgentStore`.\n *\n * Whatever you put here, make it something that outlives the request: this\n * controller is constructed fresh for every call, so `store = new\n * MemoryAgentStore()` written here is an empty store on every turn and a\n * threaded conversation silently reads back nothing. Assign a module-level\n * instance, or a store whose state is somewhere else entirely.\n */\n store: AgentStore = defaultAgentStore;\n\n /**\n * Defaults to the process-wide map. Overridable so a test — or an app running\n * two agents that must not see each other's runs — can hold its own; not so\n * that it can be moved off the process, which is not a thing that can be\n * done. See `MemoryLiveRuns`.\n */\n liveRuns: MemoryLiveRuns = defaultLiveRuns;\n\n /**\n * VOICE (#921): what `this.voice(Controller)` needs to run voice calls in\n * front of this agent. Absent, the voice routes answer 404. See\n * `VoiceConfig` and `docs/ai-voice.md`.\n */\n voice?: VoiceConfig<Body>;\n\n /**\n * Where voice sessions are recorded, so a `PATCH` or `DELETE` that lands on\n * another instance finds the call. Defaults to the process-wide\n * `MemoryVoiceSessionStore`: assign a shared one when more than one instance\n * serves the route.\n */\n voiceStore: VoiceSessionStore = defaultVoiceStore;\n\n /**\n * Where attachment *records* live — the row that says which bytes, whose, and\n * under what id. Defaults to the process-wide `MemoryAttachmentStore`, with\n * the same warning `store` carries: assign something that outlives the\n * request, because this controller is constructed per call.\n */\n attachments: AttachmentStore = defaultAttachmentStore;\n\n /**\n * Where an attachment's *bytes* live. Defaults to the app's configured\n * `FileStorage` through the `Storage` facade, which resolves the driver per\n * call out of the container — so an app that configured S3 gets S3 here\n * without saying so twice.\n *\n * Overridable mostly for tests and for an app that keeps user uploads in a\n * different bucket from everything else.\n */\n attachmentStorage: AttachmentStorage = Storage;\n\n /**\n * Who uploaded each provider file id (#443). `upload` records the id under\n * `runOwner(req)`, and `stream` refuses a turn whose files name an id\n * recorded for another owner with a 403 `{ error: { kind: \"permission\",\n * message, status } }`. Defaults to the process-wide `MemoryFileOwners`; the\n * same warning as `store` applies — assign something that outlives the\n * request. An app with several processes, or that wants the binding to\n * survive a restart, gives it a table (see `FileOwners`).\n */\n fileOwners: FileOwners = defaultFileOwners;\n\n /**\n * Where the nonce of each answered approval or question is spent, which is\n * what makes a signed answer single-use (#445). On a stateless chat the\n * client carries its history and can rewind it to before a result existed;\n * the spent nonce is then the only thing that refuses the replayed answer.\n *\n * Defaults to the process-wide `MemoryNonceStore`, which is exact for one\n * instance and forgets on restart. An app running several instances (or\n * behind a load balancer whose affinity is best effort) assigns a shared\n * store, built once at module scope like `store`:\n *\n * const nonces = new RedisNonceStore();\n * class ChatController extends AgentController<typeof chat> {\n * nonces = nonces;\n * }\n *\n * or its own `NonceStore` over a table keyed by the nonce. In production a\n * stateless turn served with the in-memory default logs a warning once.\n */\n nonces: NonceStore = defaultNonceStore;\n\n /**\n * Where approved tools' executions are claimed and their results recorded,\n * so that an approval runs its tool at most once (#458). Off by default.\n *\n * The nonce makes an answer single-use; it does not remember what the tool\n * did. So a retried submit whose response was lost is refused (\"already\n * used\") although the tool acted, and an answer that reaches two instances\n * with unshared nonce stores runs the tool twice. With a receipt store the\n * first presentation claims the execution and records its result; a later\n * one gets that result back without running anything, and one that arrives\n * while the first is still running gets a `tool_error` result for the model.\n *\n * Assign one built at module scope, like `nonces`, shared by every instance:\n *\n * const receipts = new RedisReceiptStore();\n * class ChatController extends AgentController<typeof chat> {\n * receipts = receipts;\n * }\n *\n * or your own `ReceiptStore` over a table (see `store/Receipts.ts`).\n * `MemoryReceiptStore` is exact for one instance only.\n */\n receipts?: ReceiptStore;\n\n /**\n * Whether a turn may name a provider file id that `fileOwners` has no record\n * of. `false` by default, which is what keeps the change additive: an id\n * uploaded before the upgrade, before a restart (with the in-memory default),\n * on another process, or by the app outside `upload` still works, as every id\n * did before. An id that IS recorded for someone else is refused either way.\n *\n * Set it to `true` once `fileOwners` is durable and shared, to make the\n * binding complete: then an id is usable only by the owner it was recorded\n * for, or by anyone when it was recorded as anonymous. On a stateless chat\n * the client carries its history, so this also refuses a file a tool attached\n * earlier in the conversation; a strict app keeps its chats on a thread.\n */\n protected requireKnownFiles = false;\n\n /**\n * How long the request that started a run is held open for its hooks, in\n * milliseconds, once the run has settled. The run itself is not bounded\n * here — the request is held for as long as it runs — only the app's code\n * still going after it, from `onMessage` to an `onAwaitingInput` queued\n * behind a slow `onToolCall`.\n *\n * The hooks read the user from that request (`ctx.req.ctx().user`,\n * `Auth.user()`, a policied query), so the request stays open until they are\n * done; but a hook that never settles — a `fetch` with no timeout — would\n * then hold the store, the user and `onRequestEnd` forever, one per turn. Past\n * this the request ends anyway: `onRequestEnd` runs, the user is released,\n * and the hook runs on without one. Thirty seconds is far past a healthy\n * write or notification, so a hook that reaches it is hung rather than slow.\n * Raise it for a hook that is legitimately longer; `Infinity` holds the\n * request until the hooks are done, however long that is.\n */\n protected hookHoldMs = 30_000;\n\n /**\n * Appended to the agent's static instructions for this request — the user's\n * name, tenant, today's date.\n *\n * `body` is what `useChat`'s `body` option sent, with the four keys the wire\n * format owns removed. It is the only way to read it here: this controller\n * consumes the request body itself, so `await req.input()` answers `Body\n * already used` and takes the whole turn down with it.\n *\n * It is client-controlled, exactly like any request body. `Body` types what\n * arrives, it does not check it — a client can send anything, and a tenant id\n * read from here is the client's claim about which tenant it wants, not the\n * middleware's finding about who it is.\n */\n instructions(req: HttpRequest<any, any>, extra: { body: Body }): string | Promise<string> | void {\n return this.hooks?.instructions?.(req, extra);\n }\n\n /**\n * The reasoning effort for this turn's run (#975), when it should differ\n * from the agent's: a turn the app knows is small, say. Answer nothing to\n * keep the agent's. `prepareStep` can still change it for one model call,\n * and sees this as `step.reasoning`.\n *\n * protected reasoning(req, { body }) {\n * return body.selection ? \"low\" : undefined;\n * }\n *\n * Called once per turn, after `authorizeRequest()`, beside `instructions()`.\n * `body` is client-controlled, as there.\n */\n protected reasoning(\n req: HttpRequest<any, any>,\n extra: { body: Body },\n ): ReasoningEffort | void | Promise<ReasoningEffort | void> {\n return this.hooks?.reasoning?.(req, extra);\n }\n\n /**\n * Skills for this turn's run only (#950), beside the agent's own: the\n * designer's pack of the page being edited, when one agent serves every\n * page. Lowered like the agent's skills, so the model sees each one's name\n * and description and loads the body when it needs it, instead of the whole\n * pack riding in `instructions()` on every turn.\n *\n * protected async skills(req, { body }) {\n * const page = await Page.find(body.pageId); // authorized in authorizeRequest()\n * return page.skillPacks.map((pack) =>\n * Skill.create({ name: pack.slug, description: pack.summary, instructions: () => pack.body() }),\n * );\n * }\n *\n * Called once per turn, after `authorizeRequest()`, beside `instructions()`.\n * Answer nothing for none. A name already used by one of the agent's tools\n * or skills fails the turn. `body` is client-controlled, as there.\n */\n protected skills(\n req: HttpRequest<any, any>,\n extra: { body: Body },\n ): readonly SkillDefinition[] | void | Promise<readonly SkillDefinition[] | void> {\n return this.hooks?.skills?.(req, extra);\n }\n\n /**\n * THE TURN'S TOOLS (#1123): tools added to the agent's for this run, and\n * which of them the model is offered, decided per turn from the request and\n * the run's context.\n *\n * ```ts\n * protected async runTools(req, { context }) {\n * const tenant = context.tenant;\n * return {\n * // The tenant's own tools, built from its configuration.\n * tools: tenant.integrations.map((integration) => integrationTool(integration)),\n * // A feature that is off is not offered at all.\n * activeTools: tenant.billingEnabled ? undefined : everythingBut(\"billing\"),\n * };\n * }\n * ```\n *\n * Called once per turn, after `context()` (whose answer it is handed) and\n * before anything is asked of the model, on turns from `useChat`,\n * `startTurn` and voice alike. Answer nothing for the agent's own tools,\n * all offered: the default. A name that clashes with the agent's, or an\n * `activeTools` entry naming no tool, fails the turn. A turn that answers a\n * pending call of a run tool has to return that tool again. `body` is\n * client-controlled, as in `instructions()`.\n */\n protected runTools(\n req: HttpRequest<any, any>,\n extra: { body: Body; context: ContextOf<A> },\n ): AgentRunTools | void | Promise<AgentRunTools | void> {\n return this.hooks?.runTools?.(req, extra);\n }\n\n /**\n * THE TURN'S USAGE LIMITS (#1124): budgets on what its run may spend, its\n * own and shared ones under keys this decides (the user, the tenant, the\n * month), and `onUsage` to hear what was spent.\n *\n * ```ts\n * protected usageLimits(req, { context }) {\n * const month = new Date().toISOString().slice(0, 7);\n * return {\n * run: { tokens: 200_000, toolCalls: 50 },\n * scopes: [{ key: `tenant:${context.tenantId}:${month}`, limit: { tokens: 5_000_000 } }],\n * store: this.usageStore, // shared across instances\n * onUsage: (report) => Billing.record(context.tenantId, report.delta.tokens),\n * };\n * }\n * ```\n *\n * Called once per turn, after `context()` (whose answer it is handed), on\n * turns from `useChat`, `startTurn` and voice alike. A run over a limit\n * ends with the error code `\"usage_limit\"` (`onError` and `result().error`\n * carry `usageLimit`, which says which limit); a scope already spent ends\n * the turn before the model is called. Answer nothing for no limits: the\n * default. See `AgentUsageLimits`.\n */\n protected usageLimits(\n req: HttpRequest<any, any>,\n extra: { body: Body; context: ContextOf<A> },\n ): AgentUsageLimits | void | Promise<AgentUsageLimits | void> {\n return this.hooks?.usageLimits?.(req, extra);\n }\n\n /**\n * What every tool of this turn's run gets as `ctx.context` — the user, the\n * tenant, functions the tools call back into. See `AgentContext`.\n *\n * TYPED BY THE AGENT (#1019): it returns `ContextOf<A>`, the context the\n * agent declares (`withContext`), or what its tools need. A field or a\n * function the agent needs and this leaves out is a compile error on the\n * override. This is where the controller's injected services become the\n * functions the tools call:\n *\n * ```ts\n * constructor(private pages = PageEditor.inject()) { super(); }\n *\n * context(req, { body }) {\n * return {\n * pageId: body.pageId,\n * edit: (instruction: string) => this.pages.edit(body.pageId, instruction),\n * };\n * }\n * ```\n *\n * The same method builds the context of a chat turn, a `startTurn`, and a\n * voice call's delegated turns, so all of them are typed by it.\n *\n * The run is not given the request, so this is where the request's facts\n * become the run's: read the user the middleware authenticated here, and a\n * tool reads it from `ctx.context` instead of reaching for `req`. Runs after\n * `authorizeRequest()`, once per turn, and before anything is asked of the\n * model.\n *\n * The default is `{}`. An agent whose context has a required field needs\n * this overridden (or a `context` hook): TypeScript cannot make an inherited\n * method abstract for some agents only, so not overriding it at all is a\n * tool that finds the field missing, not a compile error. What an override\n * returns is checked.\n *\n * Values from `body` are the client's claim, exactly as in `instructions()`;\n * putting one here does not make it any more trustworthy, only easier to\n * mistake for something the server decided.\n */\n context(\n req: HttpRequest<any, any>,\n extra: { body: Body },\n ): ContextOf<A> | Promise<ContextOf<A>> {\n const hook = this.hooks?.context;\n if (hook) return hook(req, extra);\n return {} as ContextOf<A>;\n }\n\n /**\n * THE MEMORY SCOPES THIS TURN MAY USE (#936): the labels the agent declares\n * in `memory.scopes`, each resolved to the app's scope key for this caller.\n *\n * ```ts\n * protected async memoryScopes(req, { body }) {\n * const user = req.ctx().user;\n * const project = await Project.forPage(body.pageId); // authorized in authorizeRequest()\n * return {\n * project: project.memoryOff ? null : `project:${project.publicId}`,\n * user: user && !user.memoryOff ? `user:${user.publicId}` : null,\n * };\n * }\n * ```\n *\n * The model only ever names a label; the key is decided here, on the\n * server, from the request — the same defence `attachmentScope()` gives\n * attachments. A label answered with `null`, or left out, is OFF for the\n * turn: it is not in the `<memory>` block and the tools cannot name it, so\n * a per-account or per-project \"memory off\" switch is a `null` here. A\n * declared `thread` label is the turn's thread (`thread:<threadId>`) unless\n * this answers it.\n *\n * Runs after `authorizeRequest()` and `context()`, once per turn, on turns\n * from `useChat`, `startTurn` and voice alike. The default is `{}`: memory\n * stays off until a controller resolves something. Not called for an agent\n * without `memory`. Values read from `body` are the client's claim, as in\n * `context()`: check them (in `authorizeRequest()` or here) before turning\n * one into a key.\n */\n protected memoryScopes(\n req: HttpRequest<any, any>,\n extra: { body: Body },\n ): AgentMemoryScopes | Promise<AgentMemoryScopes> {\n const hook = this.hooks?.memoryScopes;\n if (hook) return hook(req, extra);\n return {};\n }\n\n /**\n * The `<memory>` block's budget, in tokens, for this controller's turns.\n * `undefined` (the default) uses the agent's `memory.maxTokens` (1,500\n * unless it says otherwise); `0` leaves the block out.\n */\n protected memoryMaxTokens: number | undefined = undefined;\n\n /**\n * Refuse a turn that arrives without a `threadId`, with a 400\n * `thread_required`, before anything runs.\n *\n * A stateless turn is otherwise open to any caller the route's middleware\n * lets through: the client carries the history, so the model runs, and is\n * billed, as a general-purpose chat. An app whose tools resolve their subject\n * from the thread can make them refuse such a turn, but the model has still\n * been paid for by then.\n *\n * It governs `stream` only. `upload` can still reach the provider without a\n * thread (a `provider` destination); refuse that in `authorizeRequest`.\n */\n protected requireThread = false;\n\n /**\n * The largest JSON body `stream` reads, in bytes (#444). Default 4 MB.\n *\n * A turn is a few kilobytes; even a long stateless chat carrying its whole\n * history is well under a megabyte, since files travel by id and not inline.\n * Without a cap the route read whatever arrived (the production server\n * accepts up to 10 GB), parsed it, and sent it to the provider at the app's\n * expense. A body over it is refused with a 413 `{ error: { kind, message,\n * status, code: \"body_too_large\" } }` before it is parsed, and before\n * `authorizeRequest`. Checked against `Content-Length` when there is one and\n * against the bytes read otherwise, so a chunked body cannot get past it.\n * `attach` and `stop` carry only ids and are held to 64 KB. `Infinity` turns\n * it off.\n */\n protected maxBodyBytes = DEFAULT_MAX_BODY_BYTES;\n\n /**\n * The most messages a stateless turn's client-carried history may hold\n * (#444). Default 1000. A longer one is a 413 `history_too_long` before\n * anything runs. Only `body.messages` counts: a threaded turn reads its\n * history from the store, which the client does not write. Every message is\n * sent to the model on every step, so this bounds what one turn can be billed\n * for as much as `maxBodyBytes` does. `Infinity` turns it off.\n */\n protected maxHistoryMessages = DEFAULT_MAX_HISTORY_MESSAGES;\n\n /**\n * Bounds what each model call of this controller's turns is sent (#473):\n * the latest turns of the thread that fit, cut at a turn start, the cut\n * moving `step` turns at a time so the prompt cache keeps hitting. See\n * `ContextWindowOptions`. `undefined` (the default) uses the agent's own\n * `contextWindow`, if it has one; `false` sends the whole history.\n *\n * The store is untouched: `loadThread` still answers the whole thread, every\n * message is still appended, and `readThread` shows all of it. Unlike\n * `maxHistoryMessages`, which refuses a stateless turn, this applies to\n * threaded and stateless turns alike and refuses nothing.\n *\n * protected contextWindow = { maxTurns: 40, maxTokens: 100_000 };\n */\n protected contextWindow: ContextWindowOptions | false | undefined = undefined;\n\n /**\n * Called before every model call of a turn's run, after the agent's own\n * `prepareStep`, with the request it hands over (`step.messages`,\n * `step.instructions`) and the turn's hook context. Answer `{ messages }`,\n * `{ instructions }`, `{ reasoning }` or `{ maxOutputTokens }` to send\n * something else for that call alone; nothing answered is stored. Not called for a sub-agent's model calls.\n *\n * protected prepareStep(step: PrepareStepContext) {\n * return { messages: windowMessages(step.history, { maxTurns: 20 }).messages };\n * }\n */\n protected prepareStep(\n step: PrepareStepContext<ContextOf<A>>,\n ctx: AgentHookContext,\n ): PrepareStepResult | void | Promise<PrepareStepResult | void> {\n return this.hooks?.prepareStep?.(step, ctx);\n }\n\n /**\n * How many runs one caller may have going at once in this process (#444).\n * Default 5. A run outlives the request that started it (so `attach` can\n * find it), which means a client can post a turn and disconnect and the run\n * still bills up to `maxSteps` model calls; without a cap, a thousand posts\n * were a thousand runs.\n *\n * Counted per `runLimitKey` (by default `runOwner`, the authenticated user),\n * and per conversation rather than per request: every turn on one thread is\n * one slot, because a thread holds one run at a time and a new turn there\n * supersedes the old one rather than adding to it. So a user resending\n * mid-answer is never refused; a user with five chats answering at once and\n * starting a sixth is, with a 429 `{ error: { kind: \"rate_limit\", message,\n * status, code: \"too_many_runs\" } }`, after `authorizeRequest` and before the\n * model is asked anything. A slot is freed when the run ends (stopped, timed\n * out, or finished). `Infinity` turns it off.\n */\n protected maxConcurrentRuns = DEFAULT_MAX_CONCURRENT_RUNS;\n\n /**\n * Who `maxConcurrentRuns` counts a turn against (#444). The default is\n * `runOwner`'s answer, the authenticated user; `null` is not counted.\n *\n * An anonymous turn is therefore not limited by default, because there is\n * nothing sound to count it under: a client address is the proxy's unless\n * `GEMI_TRUST_PROXY` is set, which would put every visitor in one bucket, and\n * the session cookie is the visitor's to drop. An app that serves anonymous\n * chats returns its own key here (`ip:${clientIp(req)}` behind a trusted\n * proxy, say), sets `requireThread`, or puts `RateLimitMiddleware` on the\n * route.\n */\n protected runLimitKey(\n req: HttpRequest<any, any>,\n params: { owner: string | null; threadId?: string },\n ): string | null | Promise<string | null> {\n const hook = this.hooks?.runLimitKey;\n if (hook) return hook(req, params);\n return params.owner;\n }\n\n /**\n * Decides whether this caller may use this route, on every one of the four:\n * `stream`, `attach`, `stop` and `upload` (#542). Throw a request breaker\n * (`InsufficientPermissionsError`, say) to refuse; return to let it through.\n *\n * It runs before the route does any work of its own: on `stream`, ahead of\n * the thread's lock and load, `instructions()` and the provider, so a refused\n * turn is not charged for, waits behind no run and does not learn whether its\n * thread exists; on `attach`, before a live run's frames are read.\n *\n * `threadId` is the one the client sent, taken on trust and not yet checked\n * against the store — which is what makes this the place to check that the\n * caller owns it. A thread-scoped app that checks it here on every route\n * keeps a thread's live answer, its stop button and its attachments to its\n * owner. It is `undefined` when the request names no thread: a stateless\n * turn, an upload without one, a stop by `runId` or `clientRunId`.\n *\n * `body` is the client's `body` option — the same object `instructions()`,\n * `context()` and `attachmentScope()` get — on the two routes that carry it,\n * `stream` and `upload` (#603). A chat with no thread and no user names its\n * subject there (a page id, say), and this is where to check that the caller\n * may touch it. `attach` and `stop` carry no body, so it is absent on them;\n * narrow on `route` to read it. Like `threadId` it is the client's claim,\n * unchecked.\n *\n * THE DEFAULT CHECKS `resource`, when there is one, and lets everything\n * through otherwise. An override that also wants it calls\n * `super.authorizeRequest(req, params)`.\n */\n protected authorizeRequest(\n req: HttpRequest<any, any>,\n params: AuthorizeRequestParams<Body>,\n ): void | Promise<void> {\n const hook = this.hooks?.authorizeRequest;\n if (hook) return hook(req, params);\n return this.resource?.authorize(req, params);\n }\n\n /**\n * THE RESOURCE THIS CHAT IS ABOUT, checked on every route by the default\n * `authorizeRequest` (#726): a resource policy's `forAgent`, which names the\n * resource's id in the `body` and the resource a thread belongs to.\n *\n * ```ts\n * resource = PagePolicy.forAgent({\n * body: (body: PageBody) => body.pageId,\n * thread: (threadId) => ChatThread.pageIdOf(threadId),\n * });\n * ```\n *\n * `stream` and `upload` are refused unless the caller may use the resource\n * the body names, and, when they name a thread, unless it is that\n * resource's. `attach` and `stop` are refused unless the caller may use the\n * thread's resource. A refusal is the policy's (a 404 by default), the same\n * for a resource or thread that does not exist. A live run still answers\n * only its `runOwner`.\n */\n protected resource?: AgentResource<Body>;\n\n /**\n * WHO OWNS A RUN THIS REQUEST STARTS, and who a request to `attach` or `stop`\n * one is (#442). An opaque key, compared with `===`; `null` is nobody.\n *\n * `stream` records it on the run, and from then on the run answers only that\n * key: `attach` to it, `stop` of it (by `runId`, `threadId` or `clientRunId`,\n * including a turn still waiting its place), and a turn on its thread that\n * would supersede it while it is still going are each refused with a 403\n * `{ error: { kind: \"permission\", message, status } }` for any other caller.\n * That holds whatever `authorizeRequest` says, which is the point: every\n * handle on a run is one a third party can come to hold (a shared link, a\n * log line, a guessable `clientRunId`), and none of them says whose it is.\n *\n * THE DEFAULT IS THE AUTHENTICATED USER, `user:<id>`, and `null` without one.\n * A `null` owner records an unowned run, which answers whoever holds a\n * handle — exactly what every run did before this existed. So:\n *\n * - an anonymous turn starts an unowned run; its `threadId` stays the\n * capability. `sessionId()` is not used as a fallback: it is a cookie the\n * visitor writes, it can be minted between the turn and the reattach (a\n * view visited in between), and a mismatch would lock a visitor out of\n * their own run. An app with its own anonymous identity returns it here.\n * - a run started by an authenticated user cannot be read or stopped by an\n * anonymous request, nor by another user.\n * - a run the server starts itself (registered on `liveRuns` with no\n * `owner`) is unowned.\n *\n * Override it for anything wider than a user — a thread shared by a team\n * returns `team:<id>` (from the user, never from the body) — or `null` to\n * turn the check off. Whatever it reads must be present on all of `stream`,\n * `attach` and `stop`, the same rule `attachmentScope` states: guard the three\n * routes with the same middleware.\n *\n * It is also the `subject` every pending call of the run is signed for\n * (#447): an approval or answer is accepted only on a turn whose `runOwner`\n * is the one the question was asked of. So it must answer the same on the\n * turn that asks and the turn that answers.\n */\n protected runOwner(req: HttpRequest<any, any>): string | null | Promise<string | null> {\n const hook = this.hooks?.runOwner;\n if (hook) return hook(req);\n const user = req.ctx?.()?.user;\n const userId = user?.id ?? user?.publicId;\n if (userId !== undefined && userId !== null && String(userId) !== \"\") {\n return `user:${String(userId)}`;\n }\n return null;\n }\n\n /**\n * STARTS A TURN FROM SERVER CODE (#839): a queue job, a command, an MCP\n * tool, a webhook. No browser and no route: the turn goes through this\n * controller's `stream` as a `useChat` turn would, on a request built here,\n * so the agent, the store, `authorizeRequest` and `resource`, `runOwner`,\n * `maxConcurrentRuns`, the thread's lock, `instructions()`, `context()`,\n * the hooks and the tools' `ctx` (`threadId`, `ctx.jobs`, `ctx.generate`)\n * are the same as for a turn from the chat.\n *\n * ```ts\n * const turn = await ChatController.startTurn({\n * threadId,\n * text: \"Make the hero darker\",\n * user, // req.ctx().user for the turn\n * body: { siteId }, // what useChat's `body` option would send\n * });\n * const { text, finishReason, pending } = await turn.result();\n * ```\n *\n * The route's middleware does not run: the caller is server code and names\n * the user itself (`null` or absent is an anonymous turn). A turn the route\n * would refuse throws an `AgentTurnError` with the status and code it would\n * have answered; a request breaker thrown by `authorizeRequest` is thrown\n * as it is.\n *\n * The run lives in the process that called this, like every run. From a\n * queue job, await `result()` so the worker does not move on without it.\n */\n static async startTurn<C extends AgentController<any, any>>(\n this: new () => C,\n params: AgentTurnParams<ControllerBody<C>>,\n ): Promise<AgentTurn> {\n const { threadId } = params;\n if (typeof threadId !== \"string\" || threadId === \"\") {\n throw new TypeError(\n \"AgentController.startTurn needs a `threadId`: a server turn is stored on a thread. Create one with the store's `createThread`.\",\n );\n }\n const turn: ClientTurn = {\n ...params.turn,\n ...(params.text !== undefined ? { text: params.text } : {}),\n };\n // The app's fields first, so none of them can take the place of the\n // envelope's.\n const payload = { ...(params.body as object | undefined), threadId, turn };\n const req = new HttpRequest<any, any>(\n new Request(SERVER_TURN_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n }),\n {},\n \"api\",\n new URL(SERVER_TURN_URL).pathname,\n );\n const controller = new this();\n // Marks the request as `startTurn`'s, so only its run is kept here.\n serverTurns.set(req, null);\n // A request scope of its own, carrying the caller's user, whether or not\n // this is called from inside another request: the run is not that\n // request's, and must not end with it or read its user.\n const response = await RequestContext.run(req, () => controller.stream(req), {\n user: params.user ?? null,\n });\n\n const started = serverTurns.get(req);\n if (!started) {\n throw await AgentTurnError.from(response);\n }\n serverTurns.delete(req);\n // Nobody reads the stream; the run goes on without it (see `toResponse`).\n response.body?.cancel().catch(noop);\n\n const { run, hooks } = started;\n let pending: PendingToolCall[] = [];\n // The pending calls are on the `awaiting-input` event, not on the result.\n // The run's frames are buffered from the start, so this misses nothing.\n const watched = (async () => {\n for await (const event of run) {\n if (event.type === \"awaiting-input\") pending = event.pending as PendingToolCall[];\n }\n })().catch(noop);\n\n let result: Promise<AgentTurnResult> | undefined;\n return {\n runId: run.runId,\n threadId,\n run,\n stop: (stopParams) => run.stop(stopParams),\n result: () =>\n (result ??= (async () => {\n const outcome = await run.result();\n // After the transcript is stored and the hooks are done (or\n // `hookHoldMs` passed), so a caller that reads the thread next sees\n // this turn in it.\n await Promise.all([hooks, watched]);\n const messages = outcome.messages as AgentMessage[];\n return {\n ...outcome,\n threadId,\n text: lastAssistantText(messages),\n pending: outcome.finishReason === \"awaiting-input\" ? pending : [],\n };\n })()),\n };\n }\n\n /**\n * `POST /<path>` — one route for every client turn. A first message, an\n * approval, an answer to a question and a client tool's result are all just\n * the next turn, so none of them gets an endpoint of its own.\n */\n async stream(req: HttpRequest<any, any> = new HttpRequest()): Promise<Response> {\n const parsed = await readJsonBody(req, this.maxBodyBytes);\n if (parsed.error) {\n // Before anything is registered or charged for. A run started off a body\n // we could not read would answer nothing, at the user's expense.\n return invalidRequest(parsed);\n }\n const body = parsed.body;\n const threadId = typeof body.threadId === \"string\" ? body.threadId : undefined;\n const parsedTurn = toClientTurn(body);\n if (parsedTurn.error) {\n return invalidRequest({ body: {}, error: parsedTurn.error });\n }\n // Reassigned by a regenerate: the turn run again is the one the store holds.\n let turn = parsedTurn.turn;\n // Replace the thread's last answer rather than answer after it (#451). Only\n // meaningful on a thread: a stateless client trims its own history.\n const regenerate = threadId !== undefined && body.regenerate === true;\n const clientRunId = typeof body.clientRunId === \"string\" ? body.clientRunId : undefined;\n // The app's fields, separated once and handed to every method that reads\n // them — `authorizeRequest`, `instructions`, `context`, `attachmentScope` —\n // so none of them can disagree about what the client sent. They cannot read\n // it themselves: `readJsonBody` has consumed the request's body by now.\n const extraBody = appBody<Body>(body);\n\n // Before `pendingTurns`, so a refused turn leaves nothing for `/stop` to\n // find. It does not yield, unlike `authorizeRequest` below.\n if (this.requireThread && !threadId) {\n return jsonResponse(400, {\n code: \"thread_required\",\n message: \"This agent takes a turn only on a thread: send a threadId.\",\n });\n }\n\n if (regenerate && !this.store.removeMessages) {\n return jsonResponse(501, {\n code: \"regenerate_unsupported\",\n message:\n \"This agent's store cannot remove messages, so a thread's answer cannot be regenerated. Implement `removeMessages` on the AgentStore.\",\n });\n }\n\n // The client's history is the only part of a stateless turn whose size the\n // client chooses and the model is billed for on every step (#444). A\n // threaded turn's `messages` are ignored, so they are not counted.\n if (\n !threadId &&\n Array.isArray(body.messages) &&\n body.messages.length > this.maxHistoryMessages\n ) {\n return limitResponse(\n 413,\n \"history_too_long\",\n `The conversation has ${body.messages.length} messages; this agent takes at most ${this.maxHistoryMessages}.`,\n );\n }\n\n // Who this run will belong to. Read before `pending` exists, so a stop that\n // finds the pending turn can already be checked against it. See `runOwner`.\n const owner = await this.runOwner(req);\n\n // From here until `register`, the only thing `/stop` can find this turn by.\n // See `pendingTurns`.\n const pending = clientRunId ? { cancelled: false, owner } : null;\n if (pending) {\n pendingTurns.set(clientRunId, pending);\n }\n\n // The whole of the stateless/threaded difference, in one expression: with a\n // thread the server owns the history, without one the client carries it.\n // Nothing else below branches on it, which is why stateless keeps working\n // even for an app that never configures a store.\n //\n // The `threadId` is the client's, and nothing here checks that this caller\n // owns it — `AgentStore` cannot, since it holds no user. A `threadId` is\n // therefore a capability and has to be unguessable (`createThread` mints a\n // uuid) and, for anything that matters, checked: override `authorizeRequest()`\n // or give it a `store` that scopes by `req.user`. The framework's job is to make\n // sure the route is behind the router's middleware in the first place,\n // which `ApiRouter.agent()` now does.\n //\n // Everything from the load on happens inside `start`, which on a thread\n // runs under the thread's lock once the previous run's transcript is in the\n // store — the load has to come after that, or it reads a history the old\n // answer is missing from. `instructions()` follows the load in there rather\n // than running ahead of the lock, so that a dead thread is still a 404\n // before the app's own work is spent on it; the cost is that a turn queued\n // behind this one waits for `instructions()` as well.\n // The run `start` registered, if it got that far: its end is what frees\n // this turn's `maxConcurrentRuns` slot.\n let started: AgentRun | null = null;\n // What a regenerate took out of the thread, kept until the run replacing\n // it has started.\n let removed: AgentMessage[] = [];\n const start = async (): Promise<Response> => {\n try {\n return await startRun();\n } finally {\n // A regenerate that never started its run — stopped while it waited,\n // or a throw from the app's hooks — puts back what it took out, since\n // no new answer is coming to replace it. Still under the thread's lock,\n // and appended at the end, which is where it was: it was the tail.\n if (threadId && removed.length > 0 && (started as AgentRun | null) === null) {\n await this.store\n .appendMessages(threadId, removed)\n .catch((err) => this.reportHookFailure(err));\n }\n }\n };\n const startRun = async (): Promise<Response> => {\n let messages: AgentMessage[];\n // The `<jobs>` block for this turn's system prompt (#461), on a thread\n // that has background jobs.\n let jobsBlock: string | null = null;\n if (threadId) {\n const history = await this.store.loadThread(threadId);\n if (!history) {\n // Before `instructions()` and before the run: nothing has been\n // charged for, and the client has to learn that its thread is gone —\n // expired, mistyped, or on an instance that no longer exists — rather\n // than see it answered as an empty conversation and have this turn\n // persisted under the dead id.\n //\n // That ordering is deliberate. An ownership check belongs in\n // `authorizeRequest()`, which has already run; one left in\n // `instructions()` has not, so a caller holding a uuid learns whether\n // it is live here without the app's say. The id is unguessable, so\n // the load stays above `instructions()`, whose own work (a database\n // read, typically) would otherwise be spent on a thread that is gone.\n // Move it below and that work is spent on every dead id instead.\n return jsonResponse(404, {\n code: \"thread_not_found\",\n message: `Thread ${threadId} does not exist here, or has expired.`,\n });\n }\n // A message a dead run left unfinished is closed here, and written\n // back, before the run is handed the history: the model then reads it\n // as interrupted, and its open calls have results. Under the thread's\n // lock and after the previous run's transcript is stored, so the only\n // unfinished message left is one no run in this process owns.\n const thread = await this.settleThread(threadId, history, { write: true });\n messages = thread.messages;\n jobsBlock = this.jobsBlock(thread.jobs);\n if (regenerate) {\n const cut = regenerationCut(messages);\n if (!cut) {\n return jsonResponse(409, {\n code: \"nothing_to_regenerate\",\n message: `Thread ${threadId} has no user turn to answer again.`,\n });\n }\n // The last user turn and everything after it leave the store, and the\n // turn is run again from what the store held — not from the client's\n // copy, which may be stale or carry local ids. The user message comes\n // back under a new id when the run reports it. Under the thread's\n // lock and after the previous run's transcript is stored, so nothing\n // writes the removed answer back. Each removed message takes its\n // `usage` with it: the thread never holds both answers' costs.\n removed = messages.slice(cut.index);\n await this.store.removeMessages!(\n threadId,\n removed.map((message) => message.id),\n );\n messages = messages.slice(0, cut.index);\n // The stored turn, under the client's `localId` for it: the message\n // is minted again, and the client has to be told the new id (#466).\n turn = turn?.localId ? { ...cut.turn, localId: turn.localId } : cut.turn;\n }\n } else {\n messages = Array.isArray(body.messages) ? (body.messages as AgentMessage[]) : [];\n warnInMemoryNonces(this.nonces);\n }\n\n const instructions =\n [(await this.instructions(req, { body: extraBody })) || undefined, jobsBlock ?? undefined]\n .filter(Boolean)\n .join(\"\\n\\n\") || undefined;\n const context = await this.context(req, { body: extraBody });\n const reasoning = (await this.reasoning(req, { body: extraBody })) || undefined;\n const skills = (await this.skills(req, { body: extraBody })) || undefined;\n const runTools = (await this.runTools(req, { body: extraBody, context })) || undefined;\n const usageLimits = (await this.usageLimits(req, { body: extraBody, context })) || undefined;\n // Above the cancel check, not below it, and that placement is the whole\n // reason this is a separate statement rather than an argument on the call\n // below: the comment on that check says nothing yields between it and\n // `register`, and an `await` for the app's `attachmentScope()` — a\n // database read, in any app that has one — is exactly the yield a stop\n // would land in and be missed.\n const attachments = await this.attachmentsFor(req, threadId, { body: extraBody });\n // For the same reason as `attachments`: an `await` on the app's code,\n // which has to come before the cancel check below.\n const memoryScopes = (this.agent as AnyAgent).memory\n ? await this.memoryScopes(req, { body: extraBody })\n : undefined;\n\n if (pending?.cancelled) {\n // Stopped while it waited. Nothing has been asked of the model and\n // nothing registered, so there is no run to end and nothing charged\n // for. Checked after the last `await` above, so that a stop landing\n // during it is not missed: from here to `register` nothing yields.\n return stoppedBeforeStart();\n }\n\n // Only a threaded turn has anywhere to be written as it runs. See\n // `TurnJournal`.\n const journal = threadId\n ? new TurnJournal(this.store, threadId, messages, (err) => this.reportHookFailure(err))\n : null;\n\n // Chosen here rather than by the run, so the hook context exists before\n // the run does: `redactError` below is handed it, and the run may call\n // it for its first frame.\n const runId = `run_${crypto.randomUUID()}`;\n const ctx: AgentHookContext = { req, runId, threadId };\n\n // The app's `onMessage` for the turn's user message, called while the\n // run goes rather than after it (#806). See `EarlyTurn`.\n const early: EarlyTurn = { id: null, notified: Promise.resolve() };\n\n const run = this.agent.stream({\n runId,\n messages,\n turn,\n threadId,\n // The run reports each message as it finishes it, the user's turn\n // first and before the model is asked anything. Only the store hears\n // about most of them here: the app's `onMessage` runs after the run,\n // in `notifyRun`, except for the turn's own message (below).\n ...(journal ? { onMessage: (message: AgentMessage) => journal.finish(message) } : {}),\n // The turn's user message, once the journal has written it: the app's\n // `onMessage` for it is called now, so whatever the app keeps beside\n // a stored message (where it was sent from, say) is there for a read\n // of the thread while the run is still going (#806). Off the run's\n // path, as the journal is: neither the store nor the hook holds up\n // the model. `notifyRun` waits for it and does not call it again.\n onTurn: (message: AgentMessage) => {\n if (early.id !== null) return;\n early.id = message.id;\n const written = journal ? journal.settled() : Promise.resolve();\n early.notified = written.then(() => this.safely(() => this.onMessage(message, ctx)));\n },\n instructions,\n // Only when answered, so the agent's own applies otherwise.\n ...(reasoning ? { reasoning } : {}),\n ...(skills && skills.length > 0 ? { skills } : {}),\n // The turn's own tools and which tools are offered (#1123).\n ...(runTools?.tools && runTools.tools.length > 0 ? { tools: runTools.tools } : {}),\n ...(runTools?.activeTools ? { activeTools: runTools.activeTools } : {}),\n // Budgets on what the run may spend (#1124).\n ...(usageLimits ? { usageLimits } : {}),\n // Built from this request once, here, and the only thing the run knows\n // about who asked. The run has no request of its own — see\n // `AgentContext` — so a tool that needs the user reads it from this.\n context,\n // Resolved once, above, and handed to every tool of the run as\n // `ctx.attachments`. It is derived from the request — the user the\n // middleware authenticated, or the thread — and never from anything the\n // model can write, which is the property that makes an attachment id\n // safe to give a model at all. `null` for a request with no subject:\n // tools still get an object, and it throws with a sentence naming\n // `attachmentScope()`.\n attachments,\n // The same object `instructions()` was handed, so the two cannot\n // disagree about what the client sent — and carried on the run\n // because a run outlives the request that started it. By the time a\n // tool executes, the body is long gone.\n // Cast because `Body` is constrained to `object` so an `interface` can be\n // used, and an interface has no index signature to satisfy\n // `Record<string, unknown>`. The value is a parsed JSON object either\n // way; the constraint is about what an app may declare, not about what\n // arrives.\n body: extraBody as Record<string, unknown>,\n // What the client, and for a tool's exception the model, is told about\n // a failure. See `redactError`.\n redactError: (error, info) => this.redactError(error, info, ctx),\n // Where answers' nonces are spent. See `nonces`.\n nonces: this.nonces,\n // Where approved tools' executions are recorded. See `receipts`.\n receipts: this.receipts,\n // The principal its pending calls are bound to (#447): an answer is\n // only accepted from the same `runOwner` the question was asked of.\n subject: owner,\n // The memory scopes the server resolved for this caller (#936). The\n // model only ever sees their labels.\n ...(memoryScopes\n ? {\n memory: {\n scopes: memoryScopes,\n ...(this.memoryMaxTokens !== undefined ? { maxTokens: this.memoryMaxTokens } : {}),\n },\n }\n : {}),\n // Background jobs (#461) settle into the thread, so only a threaded\n // turn can start one. The job records who started it.\n ...(threadId ? { jobs: { owner } } : {}),\n // What each model call is sent (#473). Only the request: the store\n // still gets every message through `journal` above.\n ...(this.contextWindow !== undefined ? { contextWindow: this.contextWindow } : {}),\n // Where `contextWindow.compact` keeps this thread's summaries, when\n // the store holds them (#782).\n ...(threadId && isSummaryStore(this.store) ? { summaryStore: this.store } : {}),\n // Only when overridden, so a controller without one adds no call.\n ...(this.prepareStep !== AgentController.prototype.prepareStep || this.hooks?.prepareStep\n ? {\n prepareStep: (step: PrepareStepContext) =>\n this.prepareStep(step as PrepareStepContext<ContextOf<A>>, ctx),\n }\n : {}),\n }) as AgentRun;\n\n // Registered before the response is built: the run is now owned by the\n // process rather than by this request, which is the property `/attach`\n // depends on and the reason a dropped connection no longer cancels\n // anything.\n const eventHooks = this.liveRuns.register(run, {\n threadId,\n // Who may attach to it and stop it from now on. See `runOwner`.\n owner,\n // The client's handle on a run it started, which is the only one that\n // exists before `run-start` reaches it. See `RegisterParams`.\n clientRunId,\n onEvent: (event) => this.dispatchEvent(event, ctx),\n onInternalError: (err) => this.reportHookFailure(err),\n // So the registry's age ceiling never cuts short a run its agent\n // allowed to be longer. See `MemoryLiveRuns.maxAgeMs`.\n maxRunDurationMs: this.agent.maxRunDurationMs,\n });\n\n started = run;\n if (journal) this.follow(run, journal);\n\n // Kept, not just fired: the next turn on this thread has to know when\n // this one's transcript is in the store. See `withThread`. The request\n // waits for more than the thread does — the hooks as well — so that\n // `onMessage` still finds the user who sent the message; the thread\n // waits only for the store, so a slow hook is not a slow next turn.\n const { stored, hooks } = this.persistRun(run, ctx, eventHooks, journal, early);\n persisted.set(run, stored);\n if (serverTurns.has(req)) serverTurns.set(req, { run, hooks });\n // Registered now, while the request is certainly open: `waitUntil` is\n // ignored once it has ended, and the run settling can end it before a\n // single hook has been called.\n req.ctx?.()?.waitUntil(hooks);\n\n return run.toResponse();\n };\n\n try {\n // After `pending` is registered, not before: the app's check is a yield —\n // a database read, typically — and a stop pressed during it has to find\n // this turn. Before the thread's lock, which ends the thread's previous\n // run, so a refused or stopped turn does not end it either.\n await this.authorizeRequest(req, { route: \"stream\", threadId, body: extraBody });\n // After the app's check, so a caller it refuses does not learn which ids\n // are someone's; before the thread's lock, so a refused turn supersedes\n // nothing. The client's history only counts without a thread: with one,\n // `body.messages` is ignored and the history comes from the store.\n const foreign = await this.foreignFile(\n [...(turn?.files ?? []), ...(threadId ? [] : clientHistoryFiles(body.messages))],\n owner,\n );\n if (foreign) {\n return foreign;\n }\n if (pending?.cancelled) {\n return stoppedBeforeStart();\n }\n // After the app's check, so a refused caller spends no slot; before the\n // thread's lock, so a turn over the limit waits behind nothing. No yield\n // between the count and the take: see `RunSlots.take`.\n const limitKey = await this.runLimitKey(req, { owner, threadId });\n const release =\n limitKey === null\n ? noop\n : runSlotsFor(this.liveRuns).take(\n limitKey,\n threadId ? `thread:${threadId}` : `run:${crypto.randomUUID()}`,\n this.maxConcurrentRuns,\n );\n if (!release) {\n return limitResponse(\n 429,\n \"too_many_runs\",\n `You already have ${this.maxConcurrentRuns} conversations answering. Wait for one to finish, or stop it, and send again.`,\n );\n }\n try {\n return threadId ? await this.withThread(threadId, owner, start) : await start();\n } finally {\n // A turn that never started a run (a dead thread, stopped while it\n // waited, a throw) frees its slot now; one that did, when the run ends.\n const run = started as AgentRun | null;\n if (run) {\n run.result().then(release, release);\n } else {\n release();\n }\n }\n } finally {\n if (pending && pendingTurns.get(clientRunId) === pending) {\n pendingTurns.delete(clientRunId);\n }\n }\n }\n\n /**\n * A thread holds one run at a time; a new turn on it ends the old one first.\n *\n * Since a dropped connection no longer stops a run, a user who sends again\n * mid-answer used to leave the first run going. It could not see the new\n * turn, the new run's `loadThread` could not see its answer, and both\n * appended when they finished — in whichever order the model returned them,\n * so the thread read `user2, assistant2, user1, assistant1`. `byThread` then\n * named the second run while the first was still live and unstoppable by\n * `threadId`.\n *\n * Stopping the old run and waiting for its transcript to land is chosen over\n * refusing the new turn with a 409, because sending again *is* the stop: it\n * is what `useChat.send` means, and a client that has to poll `/stop` until\n * the run is really gone before it may post the turn it has already shown is\n * a worse client for no better thread. The cost is that the new turn waits\n * for the old run to unwind, which is as long as its slowest tool in flight —\n * and that wait is the thing that puts `assistant1` before `user2`.\n *\n * The wait is on `persistRun`'s `stored`, not on `run.result()`. `result()`\n * settling is the transcript being final, not stored: `appendMessages` runs\n * after it, and a `loadThread` in that gap reads a history the old answer is\n * missing from, which is the original bug by a shorter route. It is also\n * *only* that: `stored` settles once the transcript is stored, and the app's\n * hooks run on in `hooks`, which holds the old run's request and not the\n * thread, so a slow `onMessage` is not a slow thread and a hung one is not a\n * hung thread.\n *\n * The lock around it is what makes a *third* turn wait for the second rather\n * than for the first. Two turns arriving together both see the same live\n * run, both stop it, both wait for it, and both start — the same race, one\n * message later. Under the lock the later one finds the earlier one\n * registered and stops that instead. Per process, like `LiveRuns`, and for\n * the same reason: the run it guards lives here.\n */\n private async withThread(\n threadId: string,\n owner: string | null,\n fn: () => Promise<Response>,\n ): Promise<Response> {\n const previous = threadLocks.get(threadId) ?? Promise.resolve();\n let release!: () => void;\n const held = new Promise<void>((resolve) => {\n release = resolve;\n });\n const tail = previous.then(() => held);\n threadLocks.set(threadId, tail);\n await previous;\n try {\n const live = await this.liveRuns.find({ threadId });\n if (\n live &&\n this.liveRuns.isRunning(live.runId) &&\n !this.liveRuns.mayAccess(live.runId, owner)\n ) {\n // Superseding is a stop, and someone else's run is not this caller's to\n // stop (#442). Only while it is still going: an ended run is kept for\n // `ttlMs` but a turn after it touches nothing of it. Whether this caller\n // may post on the thread at all is `authorizeRequest`'s question.\n return notYourRun();\n }\n const run = live ? this.liveRuns.get(live.runId) : null;\n if (run) {\n // A run that already ended is still `find`-able for `ttlMs`; stopping\n // it is a no-op and waiting on it is the append it may still be doing.\n run.stop({ reason: \"superseded by a later turn on this thread\" });\n await persisted.get(run);\n }\n return await fn();\n } finally {\n release();\n if (threadLocks.get(threadId) === tail) {\n threadLocks.delete(threadId);\n }\n }\n }\n\n /**\n * `POST /<path>/attach` — subscribe to a run already in progress, from a\n * cursor. This is a read of a live run, not a continuation of a stopped one:\n * the work never paused, the listener changed.\n *\n * The cursor is `from`, else the client's `cursor`, else `Last-Event-ID`,\n * else the oldest frame still buffered — and it is honoured only for the run\n * the client's `runId` names. A cursor the buffer has dropped is a 410 naming\n * what survives; *no* cursor is the tail, because a page reattaching on mount\n * has no transcript to leave a hole in. See `resolveCursor`.\n */\n async attach(req: HttpRequest<any, any> = new HttpRequest()): Promise<Response> {\n const parsed = await readJsonBody(req, SMALL_BODY_BYTES);\n if (parsed.error) {\n return invalidRequest(parsed);\n }\n const body = parsed.body;\n const threadId =\n typeof body.threadId === \"string\" ? body.threadId : searchParam(req, \"threadId\");\n\n if (!threadId) {\n return jsonResponse(400, {\n code: \"invalid_request\",\n message: \"attach needs a threadId: it is the handle that survives a refresh.\",\n });\n }\n\n // Before the lookup: a refused caller learns neither whether a run is live\n // on the thread nor any frame of it.\n await this.authorizeRequest(req, { route: \"attach\", threadId });\n\n // The store is not consulted. This route answers whether a run is in\n // flight here, and a run it finds was started on a thread `stream` had\n // already loaded; a miss is `no_live_run` whether or not the thread exists,\n // because a client that gets one re-reads the thread anyway (see\n // `onAttachMiss`) and learns there. The thread's own 404 is `stream`'s,\n // where a turn would otherwise be persisted under it.\n const live = await this.liveRuns.find({ threadId });\n if (live && !this.liveRuns.mayAccess(live.runId, await this.runOwner(req))) {\n // Another caller's run (#442): none of its frames, ended or not.\n return notYourRun();\n }\n if (!live) {\n // An explicit miss, not a 200 with an empty stream. See `MemoryLiveRuns`:\n // behind a round-robin load balancer this is the common case, and it has\n // to be visible as one.\n return jsonResponse(404, {\n code: \"no_live_run\",\n message: `No run in progress for thread ${threadId} in this process.`,\n });\n }\n\n // A cursor is only a number if you know which run it counts within: `seq`\n // restarts at zero in every run, so honouring a cursor from run_1 against a\n // live run_2 would skip that many frames off the head of a run this client\n // has seen nothing of. `runId` is the client saying which run its cursor\n // means; naming one that is not live forfeits the cursor and takes the\n // tail, which is as close to the start as the buffer can offer.\n //\n // Only a MISMATCH forfeits. An absent `runId` is not a wrong answer, it is\n // an older question: `from` and `Last-Event-ID` predate the pairing and\n // carry no run, and an `EventSource` reconnecting on its own will never\n // grow one. Those keep resuming exactly as before.\n const cursorRunId = typeof body.runId === \"string\" ? body.runId : undefined;\n const cursor = cursorRunId && cursorRunId !== live.runId ? undefined : resolveCursor(req, body);\n\n try {\n return sseResponse(this.liveRuns.replay(live.runId, cursor));\n } catch (err) {\n if (err instanceof FrameCursorEvictedError) {\n // 410 rather than 404: the run is there, the position is not. A client\n // that gets this reloads the thread instead of resuming into a hole.\n return jsonResponse(410, {\n code: err.code,\n message: err.message,\n oldestSeq: err.oldest,\n });\n }\n if (err instanceof LiveRunNotFoundError) {\n // Lost the race with eviction between `find` and `replay`.\n return jsonResponse(404, { code: err.code, message: err.message });\n }\n throw err;\n }\n }\n\n /**\n * `POST /<path>/stop` — the explicit cancel. Since a dropped connection no\n * longer stops a run, this and a later turn on the same thread are the only\n * things that do, and it is why stopping cannot be a client-side concern:\n * the tool loop is here, and a client that stops reading has not stopped\n * step four from charging a card.\n *\n * Returns as soon as the run is aborted, not when it has finished unwinding.\n * The terminal events — the stopped tool results, the aborted message — go\n * out on the run's own stream, so whoever is watching it sees the ending,\n * and `onMessage` records it whether anyone is watching or not.\n *\n * Answers `{ stopped }` normally, and a `Response` only to reject a request\n * it could not read — the union is the error, not a second success shape.\n */\n async stop(\n req: HttpRequest<any, any> = new HttpRequest(),\n ): Promise<{ stopped: boolean } | Response> {\n const parsed = await readJsonBody(req, SMALL_BODY_BYTES);\n if (parsed.error) {\n // `{ stopped: false }` would be the wrong answer as well as the wrong\n // status: it means \"there was nothing to stop\", and the truth is that we\n // could not tell what to stop. A client that believes the first one stops\n // asking, and the run keeps going.\n return invalidRequest(parsed);\n }\n const body = parsed.body;\n\n await this.authorizeRequest(req, {\n route: \"stop\",\n threadId: typeof body.threadId === \"string\" ? body.threadId : undefined,\n });\n\n // Three handles, most specific first, because which ones the client has\n // depends on how far the run got. `runId` is the server's own and settles\n // it. `clientRunId` covers the window before `run-start`, when the client\n // has nothing else for a stateless first turn — and, before that, a turn\n // that has not become a run yet because it is waiting its place on the\n // thread, which is ended where it waits. `threadId` is the fallback for a\n // client that did not start this run at all — one that attached to it,\n // whose replayed tail carried no `run-start`.\n const caller = await this.runOwner(req);\n let runId = typeof body.runId === \"string\" ? body.runId : undefined;\n if (!runId && typeof body.clientRunId === \"string\") {\n runId = this.liveRuns.findByClientRunId(body.clientRunId) ?? undefined;\n if (!runId) {\n const pending = pendingTurns.get(body.clientRunId);\n if (pending) {\n // A `clientRunId` is the client's own choice and only as unguessable\n // as it made it, so the turn it names is checked like a run (#442).\n if (pending.owner !== null && pending.owner !== caller) {\n return notYourRun();\n }\n // Not on to `threadId`: that names the run this turn is queued\n // behind, which is already stopping, and answering for it would\n // leave this one to start.\n pending.cancelled = true;\n return { stopped: true };\n }\n }\n }\n if (!runId && typeof body.threadId === \"string\") {\n runId = (await this.liveRuns.find({ threadId: body.threadId }))?.runId;\n }\n\n const run = runId ? this.liveRuns.get(runId) : null;\n if (!run) {\n // Already finished, already evicted, or never here. Not an error: the\n // caller wanted the run stopped and it is not running.\n return { stopped: false };\n }\n if (!this.liveRuns.mayAccess(run.runId, caller)) {\n // Someone else's run, by whichever handle (#442). See `runOwner`.\n return notYourRun();\n }\n\n run.stop({ reason: typeof body.reason === \"string\" ? body.reason : undefined });\n\n // Deliberately not awaiting `run.result()`. Unwinding means letting tools\n // in flight settle into `denied` results and finalizing the assistant\n // message, which can take as long as the slowest tool — and a stop button\n // that spins for twenty seconds is a stop button people press twice.\n return { stopped: true };\n }\n\n /**\n * WHO A SCOPE BELONGS TO, and the one question in this file whose wrong\n * answer is a data leak rather than a bug.\n *\n * An attachment id given to the model comes back *from* the model, and what\n * the model writes is a function of everything it read — the user's text, a\n * tool's output, a document someone uploaded. So the id is untrusted in\n * exactly the way a request body is, and the scope it resolves under must come\n * from the server's own knowledge of the request. Nothing that reaches this\n * method may be readable or writable by the model: `req` is the HTTP request,\n * and `threadId` is the client's handle, not the model's.\n *\n * THE DEFAULT IS THE AUTHENTICATED USER, falling back to the thread, falling\n * back to `null`.\n *\n * - `user:<id>` when the request is authenticated. `req.ctx().user` is what\n * `AuthenticationMiddleware` and the `Auth` facade put there, so an agent\n * route behind `middlewares = [\"auth\"]` — which `ApiRouter.agent()` makes\n * the default posture — has a subject without the app writing anything.\n * - `thread:<id>` for an unauthenticated chat that has a thread. A `threadId`\n * is minted by `createThread` as a uuid and is documented as a capability,\n * and `upload` only passes one here that `store.loadThread` finds;\n * an anonymous support widget has nothing better, and scoping to the\n * conversation is strictly narrower than scoping to nothing.\n * - `null` otherwise, which means no attachment id is minted at all. There is\n * no third fallback on purpose. `sessionId()` is the tempting one and it is\n * the wrong one: it is a cookie the visitor writes, documented as *not a\n * credential*, so scoping to it is scoping to a value the caller chooses —\n * which is not a scope, it is a lookup key with extra steps.\n *\n * WHAT THIS DEFAULT GETS WRONG, since it will get something wrong for someone:\n * it is per user, not per conversation, so a user's own upload from one thread\n * resolves in another thread of theirs. That is the loose direction, and it is\n * chosen because the tight one breaks the flow the framework actually ships —\n * `useChat.uploadFile` posts a file before any thread exists, so a per-thread\n * default would make the first upload of every conversation unresolvable. An\n * app that wants per-conversation isolation returns\n * `{ key: \\`user:${id}:thread:${threadId}\\` }` here and has it; an app with\n * tenants returns `{ key: \\`org:${orgId}\\` }` and has that. What the default\n * must never be is broader than a user, and it is not.\n *\n * WHATEVER THIS READS MUST BE PRESENT ON EVERY AGENT ROUTE, and the default\n * reads `req.ctx().user`, which is present only where authentication\n * middleware ran. `agent()` mounts four routes and `.middleware()` guards\n * them individually, so `middleware({ stream: \"auth\" })` — the example in\n * `ApiRouter.agent`'s own doc — leaves `POST /chat/files` unauthenticated.\n * The upload then files the record under `thread:<id>` (or nothing at all)\n * while the run that follows, on the guarded route, resolves under\n * `user:<id>`, and every id minted on upload is a miss for the rest of the\n * conversation. It fails as `AttachmentNotFoundError`, worded identically to\n * an id the model invented, which is the point of that error and is also why\n * this particular misconfiguration is invisible. Guard `upload` and `stream`\n * together, or derive the key from something both of them have.\n *\n * gemi does not detect the skew for you, and the reason is the module's whole\n * premise: noticing that an id exists under a *different* scope requires\n * looking it up without one, and an unscoped read is the thing that must not\n * exist here — not even behind a `console.warn`. So the answer is the\n * documentation you are reading and the identical error, not a probe.\n *\n * THE BODY, AND THE ONE RULE FOR READING IT (#603). The third argument is the\n * client's `body` option — what `instructions()` gets — on both routes that\n * resolve a scope: `stream`, and `upload`, where `useChat.uploadFile` sends\n * the same option beside the file. It exists for the chat that has neither a\n * user nor a thread, a stateless page builder say, whose subject is only in\n * the body:\n *\n * protected async attachmentScope(req, threadId, { body }) {\n * const scope = await super.attachmentScope(req, threadId);\n * if (scope) return scope;\n * if (typeof body.pageId !== \"string\") return null;\n * const page = await Page.findFirst({ where: { publicId: body.pageId } });\n * return page ? { key: `page:${page.publicId}` } : null;\n * }\n *\n * The `typeof` line is not tidiness. `Body` types the shape, not the contents,\n * and to an ORM `{ publicId: undefined }` is no filter at all: a request that\n * leaves `pageId` out would find the first page in the table and be filed\n * under it, along with every other request that leaves it out.\n *\n * A body field is a value the caller chose, which is exactly what the\n * `sessionId()` paragraph above refuses. What separates the keys this may be\n * built from is not whether the client sent them — `threadId` is sent by the\n * client too — but WHETHER THE VALUE IS AN UNGUESSABLE CAPABILITY WHOSE\n * EXISTENCE THE SERVER CHECKS. A page `publicId` that is looked up, as above,\n * is one, on the same footing as a `threadId` that `loadThread` finds: holding\n * it is what entitles the caller to the page, and an id nobody minted resolves\n * to nothing. `body.orgId` in an app with users is NOT one, and passing the\n * body is precisely what makes `` { key: `org:${body.orgId}` } `` spellable: an\n * org id is enumerable and the caller may not belong to that org, so that is\n * every tenant's files handed to whoever types another tenant's id. A tenant\n * comes from `req.ctx().user`, never from here. And a value interpolated\n * without being looked up is the `sessionId()` mistake again, however\n * unguessable it looks — an anonymous caller then mints a fresh scope per\n * request. Look it up, and key on what the lookup returned.\n *\n * The same skew rule as above applies to the body, and more quietly: the key\n * must come out the same on `upload` and on `stream`. `useChat` sends the one\n * `body` option to both, so a key derived from a field that stays put for the\n * whole conversation — the page, not the selected element — agrees by\n * construction. One derived from a field that changes between the upload and\n * the turn does not, and fails as that same `AttachmentNotFoundError`.\n *\n * The third argument is new, and the method keeps its first two, so an\n * override written as `attachmentScope(req, threadId)` works unchanged; one\n * that calls `super.attachmentScope(req, threadId)` may leave it off too.\n *\n * The key is opaque and compared with `===`. It is never sent to the client\n * and never shown to the model.\n */\n protected attachmentScope(\n req: HttpRequest<any, any>,\n threadId?: string,\n extra?: { body: Body },\n ): AttachmentScope | null | Promise<AttachmentScope | null> {\n const hook = this.hooks?.attachmentScope;\n if (hook) return hook(req, threadId, extra);\n const user = req.ctx()?.user;\n const userId = user?.id ?? user?.publicId;\n if (userId !== undefined && userId !== null && String(userId) !== \"\") {\n return { key: `user:${String(userId)}` };\n }\n if (threadId) {\n return { key: `thread:${threadId}` };\n }\n return null;\n }\n\n /**\n * WHAT THIS ROUTE ACCEPTS AT ALL: a size ceiling and a list of types (#683).\n * Checked once per upload, after `authorizeRequest` and before anything is\n * stored or sent to the provider, and a file outside them is answered **422**\n * with `{ error: { code, message } }` — `file_too_large` or\n * `unsupported_file_type` — which `useChat().attach()` rejects with as an\n * `AttachError`, so a composer can mark the one file.\n *\n * `accept` reads like an `<input accept>`: `\".pdf\"` matches the file name's\n * extension, `\"image/*\"` a type family, `\"text/csv\"` one type. A file\n * matching any entry is accepted. Left out (or `null` returned, the default)\n * means no limit of that kind, which is how the route behaved before.\n *\n * Here rather than in `attachmentDestination`, which an app could throw from\n * to the same end: a throw there is a 500 unless the app builds the response\n * itself, and the provider's own refusal only arrives after the bytes were\n * stored. A limit is a rule about the file, so it is answered before either.\n *\n * protected attachmentLimits() {\n * return { maxBytes: 10 * 1024 * 1024, accept: [\".pdf\", \"image/*\"] };\n * }\n */\n protected attachmentLimits(\n req: HttpRequest<any, any>,\n ): AttachmentLimits | null | Promise<AttachmentLimits | null> {\n const hook = this.hooks?.attachmentLimits;\n if (hook) return hook(req);\n return null;\n }\n\n /**\n * THE APP'S OWN RULE ABOUT ONE UPLOAD (#836): a storage quota, a per-subject\n * cap, anything that needs the file and the request's subject at once.\n * Called once per upload, after `authorizeRequest` and `attachmentLimits` and\n * before anything is stored or sent to the provider.\n *\n * It is told what the file is (`name`, `size`, `mimeType`) and what the\n * upload is about: `body`, the client's `body` option exactly as\n * `attachmentScope` gets it, and `threadId` when the store knows the thread.\n * Return nothing to let the file through, or an `UploadRefusal` to refuse it:\n * the route answers **422** with `{ error: { code, message } }` (`code`\n * defaults to `\"upload_refused\"`), and `useChat().attach()` rejects with an\n * `AttachError` carrying both, as it does for `attachmentLimits`' refusals.\n * A `RequestBreakerError` thrown here is answered as itself; anything else\n * thrown is a 500.\n *\n * protected async checkUpload(file, req, { body }) {\n * if (typeof body.pageId !== \"string\") return;\n * const page = await Page.findFirst({ where: { publicId: body.pageId } });\n * if (!page) return;\n * const used = await storageUsedBy(page);\n * if (used + file.size > capFor(page)) {\n * return { code: \"storage_full\", message: \"This site's storage is full.\" };\n * }\n * }\n *\n * The `body` rule from `attachmentScope` applies here too: it types the\n * shape, not the contents, so check a field before looking it up, and\n * decide whose quota to charge from what the lookup returned.\n *\n * Here rather than in `attachmentDestination`, which also sees the file: a\n * quota is a rule about the file and its subject, not about where the bytes\n * go, and a throw there is a 500 unless the app builds the response itself.\n *\n * A check here is not a reservation: two uploads checked at the same moment\n * both see the old usage. A cap that must never be exceeded by one file is\n * enforced where usage is recorded.\n */\n protected checkUpload(\n file: UploadCheckFile,\n req: HttpRequest<any, any>,\n ctx: UploadContext<Body>,\n ): UploadRefusal | null | void | Promise<UploadRefusal | null | void> {\n return this.hooks?.checkUpload?.(file, req, ctx);\n }\n\n /**\n * WHERE ONE FILE'S BYTES SHOULD GO. Called once per upload, with the file in\n * hand, and since #836 with the same `{ body, threadId }` that `checkUpload`\n * gets as a third argument. An override written as\n * `attachmentDestination(file, req)` works unchanged.\n *\n * The model needs to perceive a file only for vision or document reading; a\n * tool needs the bytes only to forward them. Those are different needs and\n * they were being answered the same way, because `upload` sent everything to\n * the vendor unconditionally — which is a cost and a data-minimisation problem\n * as much as a capability one. A CSV that exists to be imported belongs in\n * storage and not at the provider; an image the model must look at and no tool\n * will forward is the reverse.\n *\n * THE DEFAULT IS `\"both\"`, AND THE JUSTIFICATION IS THE FAILURE MODE, not the\n * hit rate. A mimeType table was the obvious alternative — images and PDFs to\n * the provider, everything else to storage — and it is wrong in the quiet\n * direction. Getting `\"both\"` wrong sends a file to a vendor that did not need\n * it: it costs money, it is visible on an invoice and in the vendor's file\n * list, and it is corrected by overriding one method. Getting `\"storage\"`\n * wrong drops the file out of the model's view with no error anywhere; the\n * model answers as though the image were not there, which is indistinguishable\n * from a bad prompt, and the developer debugs their instructions for an\n * afternoon. Being wrong on the invoice beats being wrong in a way that\n * presents as \"the AI is stupid\".\n *\n * `\"both\"` is also what keeps this change additive: every upload that reached\n * the provider before still reaches it, and storage is added underneath. An\n * app that never asks for an attachment id sees no difference except a second\n * copy it owns.\n *\n * A client may ask, per file, for `\"storage\"` under a `\"both\"` policy — the\n * one direction that only ever removes the vendor. It may not ask for\n * anything else, including `\"provider\"`, which would let a form field decide\n * that the app does not keep its own copy. See `narrowDestination`.\n */\n protected attachmentDestination(\n file: File,\n req: HttpRequest<any, any>,\n extra?: UploadContext<Body>,\n ): AttachmentDestination | Promise<AttachmentDestination> {\n const hook = this.hooks?.attachmentDestination;\n if (hook) return hook(file, req, extra);\n return \"both\";\n }\n\n /**\n * The attachment handle for this request — the object a tool is given.\n *\n * `null` when `attachmentScope` says the request has no subject, and a caller\n * that gets `null` must not fall back to anything: there is no unscoped handle\n * to fall back to, which is the point.\n *\n * Issue #490 hangs `ctx.attachments` off this.\n */\n protected async attachmentsFor(\n req: HttpRequest<any, any>,\n threadId?: string,\n extra: { body: Body } = { body: {} as Body },\n ): Promise<ScopedAttachments | null> {\n const scope = await this.attachmentScope(req, threadId, extra);\n if (!scope) {\n return null;\n }\n return new ScopedAttachments(this.attachments, this.attachmentStorage, scope);\n }\n\n /**\n * `POST /<voice route>` (#921): starts a voice call in front of this agent.\n *\n * Takes the browser's SDP offer (`sdp`), the chat's `threadId`, `pushToTalk`\n * and the app's `body`. Runs `authorizeRequest` (`route: \"stream\"`), then\n * `voice.start` (credits, limits: throw to refuse), creates the call at the\n * vendor with the server's key and the session `start` answered plus the\n * bridge's tools, records it in `voiceStore`, and starts a `VoiceBridge` on\n * its sideband in this process. Answers the vendor's SDP answer and the\n * session's id.\n *\n * Every failure after `start` has run calls the session's `onEnd` with\n * reason `start_failed`, so an app that charged in `start` can refund: no\n * thread (400), a refused thread (the `authorizeRequest` error), a vendor\n * failure (502, or 429 when the vendor rate-limited us, code\n * `voice_unavailable`), and a failure after the vendor call exists (500),\n * which also hangs that call up.\n *\n * @experimental Not yet verified against a live Azure or OpenAI call.\n */\n async voiceStart(\n req: HttpRequest<any, any> = new HttpRequest(),\n ): Promise<VoiceStartResponse | Response> {\n const voice = this.voice;\n if (!voice) return voiceNotEnabled();\n const parsed = await readJsonBody(req, SMALL_BODY_BYTES);\n if (parsed.error) return invalidRequest(parsed);\n const { sdp, threadId: claimed, pushToTalk } = parsed.body;\n if (typeof sdp !== \"string\" || !sdp.trimStart().startsWith(\"v=\")) {\n return jsonResponse(400, {\n code: \"invalid_request\",\n message: \"`sdp` must be the browser's SDP offer.\",\n });\n }\n const body = appBody<Body>(parsed.body, VOICE_START_KEYS);\n const clientThreadId = typeof claimed === \"string\" && claimed !== \"\" ? claimed : undefined;\n await this.authorizeRequest(req, { route: \"stream\", threadId: clientThreadId, body });\n\n const user = req.ctx?.()?.user ?? null;\n const options = await voice.start({\n req,\n body,\n threadId: clientThreadId,\n user,\n pushToTalk: pushToTalk === true,\n });\n const startedAt = Date.now();\n // From here on `start` has run, and may have charged: every way out that\n // is not a running bridge calls `onEnd` with `start_failed` (so the charge\n // can be refunded), and a vendor call that exists by then is hung up, so\n // nothing is left running with nobody metering it.\n let callId: string | undefined;\n const failed = async (error: unknown): Promise<void> => {\n if (error !== undefined) console.error(\"[gemi/ai] a voice session could not start.\", error);\n if (callId) {\n await voice.realtime.hangup(callId).catch((hangupError) => {\n console.error(\"[gemi/ai] a voice call that failed to start could not be hung up.\", hangupError);\n });\n }\n try {\n await options.onEnd?.({\n sessionId: \"\",\n ...(callId ? { callId } : {}),\n threadId: options.threadId ?? clientThreadId ?? \"\",\n reason: \"start_failed\",\n startedAt,\n endedAt: Date.now(),\n durationMs: 0,\n seconds: 0,\n usage: emptyUsage(),\n transcription: { usage: emptyUsage(), seconds: 0 },\n transcript: [],\n requests: [],\n toolCalls: [],\n errors: [],\n });\n } catch (onEndError) {\n console.error(\"[gemi/ai] a voice session's onEnd threw.\", onEndError);\n }\n };\n\n const threadId = options.threadId ?? clientThreadId;\n if (!threadId) {\n await failed(undefined);\n return jsonResponse(400, {\n code: \"invalid_request\",\n message:\n \"A voice session needs a thread: send `threadId`, or answer one from `voice.start`.\",\n });\n }\n try {\n if (threadId !== clientThreadId) {\n await this.authorizeRequest(req, { route: \"stream\", threadId, body });\n }\n } catch (error) {\n await failed(undefined);\n throw error;\n }\n\n // The id first: an MCP principal is keyed to the session.\n const sessionId = crypto.randomUUID();\n let toolHandlers = options.tools ?? [];\n try {\n if (options.mcp) {\n toolHandlers = [\n ...toolHandlers,\n ...(await mcpVoiceTools(options.mcp, { user, sessionId })),\n ];\n }\n } catch (error) {\n await failed(error);\n return jsonResponse(500, {\n code: \"voice_unavailable\",\n message: \"Voice isn't available right now.\",\n });\n }\n const session: RealtimeSession = {\n ...options.session,\n tools: [\n ...voiceTools(voice.delegate),\n ...(options.session?.tools ?? []),\n ...toolHandlers.map((handler) => handler.tool),\n ],\n ...(pushToTalk === true ? { turnDetection: null } : {}),\n };\n let call: { sdpAnswer: string; callId: string };\n try {\n call = await voice.realtime.createCall({\n sdp,\n session,\n safetyIdentifier: options.safetyIdentifier,\n });\n } catch (error) {\n await failed(error);\n const limited = error instanceof RealtimeRequestError && error.code === \"rate_limited\";\n return jsonResponse(limited ? 429 : 502, {\n code: \"voice_unavailable\",\n message: \"Voice isn't available right now.\",\n });\n }\n callId = call.callId;\n\n try {\n await this.voiceStore.create({\n id: sessionId,\n callId: call.callId,\n threadId,\n owner: await this.runOwner(req),\n body: body as Record<string, unknown>,\n startedAt,\n });\n const {\n threadId: _thread,\n session: _session,\n safetyIdentifier: _safety,\n mcp: _mcp,\n tools: _tools,\n ...hooks\n } = options;\n const bridge = VoiceBridge.start<Body>({\n ...hooks,\n tools: toolHandlers,\n controller: this.constructor as unknown as VoiceBridgeController<Body>,\n threadId,\n user,\n body,\n call: { realtime: voice.realtime, callId: call.callId },\n sessionId,\n store: this.voiceStore,\n liveRuns: this.liveRuns,\n delegate: voice.delegate,\n session,\n });\n return {\n sessionId: bridge.sessionId,\n sdp: call.sdpAnswer,\n threadId,\n delegate: voice.delegate?.name ?? DEFAULT_DELEGATE_NAME,\n endsAt: startedAt + (options.limits?.maxDurationMs ?? 15 * 60_000),\n };\n } catch (error) {\n await failed(error);\n return jsonResponse(500, {\n code: \"voice_unavailable\",\n message: \"Voice isn't available right now.\",\n });\n }\n }\n\n /**\n * `PATCH /<voice route>/:sessionId` (#921): the session's new `body` (the\n * selection, the open page). Delegated turns get it from their next start,\n * and `contextNote` tells the voice when the bridge is in this process.\n */\n async voiceUpdate(\n req: HttpRequest<any, any> = new HttpRequest(),\n ): Promise<{ updated: boolean } | Response> {\n if (!this.voice) return voiceNotEnabled();\n const found = await this.voiceSession(req);\n if (found instanceof Response) return found;\n const parsed = await readJsonBody(req, SMALL_BODY_BYTES);\n if (parsed.error) return invalidRequest(parsed);\n const body = appBody<Body>(parsed.body, []);\n await this.authorizeRequest(req, { route: \"stream\", threadId: found.threadId, body });\n if (found.endedAt !== undefined) {\n return jsonResponse(409, { code: \"voice_ended\", message: \"This voice session has ended.\" });\n }\n await this.voiceStore.update(found.id, { body: body as Record<string, unknown> });\n VoiceBridge.get(found.id)?.setBody(body);\n return { updated: true };\n }\n\n /**\n * `DELETE /<voice route>/:sessionId` (#921): ends the call. On the instance\n * holding the bridge it hangs up and runs `onEnd` before answering; on any\n * other it hangs the call up at the vendor, and the holder's sideband sees\n * the call end.\n */\n async voiceEnd(\n req: HttpRequest<any, any> = new HttpRequest(),\n ): Promise<{ ended: boolean } | Response> {\n const voice = this.voice;\n if (!voice) return voiceNotEnabled();\n const found = await this.voiceSession(req);\n if (found instanceof Response) return found;\n await this.authorizeRequest(req, {\n route: \"stream\",\n threadId: found.threadId,\n body: found.body as Body,\n });\n if (found.endedAt !== undefined) return { ended: false };\n const bridge = VoiceBridge.get(found.id);\n if (bridge) {\n await bridge.end(\"hangup\");\n } else {\n await voice.realtime.hangup(found.callId);\n await this.voiceStore.update(found.id, { endedAt: Date.now(), endReason: \"hangup\" });\n }\n return { ended: true };\n }\n\n /** The session a voice `PATCH` or `DELETE` names, if the caller owns it. */\n private async voiceSession(req: HttpRequest<any, any>): Promise<VoiceSessionRecord | Response> {\n const id = (req.params as Record<string, unknown> | undefined)?.sessionId;\n const record = typeof id === \"string\" && id ? await this.voiceStore.get(id) : null;\n if (!record) {\n return jsonResponse(404, { code: \"voice_not_found\", message: \"No such voice session.\" });\n }\n if (record.owner !== null && record.owner !== (await this.runOwner(req))) {\n return notYourRun();\n }\n return record;\n }\n\n /**\n * `POST /<path>/files` — takes an attachment and answers the handles for it.\n *\n * `fileId` IS STILL IN THE ANSWER AND STILL MEANS THE SAME THING: the\n * provider's id for the file, the thing a `FilePart` carries, unchanged. It\n * has to stay, because it is what makes vision work and what\n * `useChat.uploadFile` already reads; `attachmentId` is added beside it rather\n * than in place of it. The two are not interchangeable, and swapping them\n * would reach the vendor as a file id it has never issued — so\n * `toResponsesInput` rejects a `gemi_att_` prefix in `FilePart.fileId` with a\n * sentence saying so, rather than leaving it to whatever the vendor answers\n * (not measured).\n *\n * `fileId` is absent exactly when the file did not go to the provider, which\n * only happens when the app or the client asked for that. `attachmentId` is\n * absent when there was no scope to file the record under — see\n * `attachmentScope` — and the answer then carries `downgraded: \"no_scope\"`,\n * which is the only thing separating that case from a controller that chose\n * `\"provider\"` on purpose. Both answer `destination: \"provider\"`, because both\n * are true about where the bytes went.\n *\n * ORDER: storage first, then the provider. If the second one fails the request\n * fails either way, so the only question is where the orphan is left, and an\n * orphan in our own bucket is ours to sweep on a schedule we set, while an\n * orphan at the vendor sits under a retention policy that is not ours.\n */\n async upload(req: HttpRequest<any, any> = new HttpRequest()): Promise<UploadResult> {\n const form = await req.rawRequest.formData();\n const file = form.get(\"file\");\n if (!(file instanceof Blob)) {\n throw new Error(\"upload expects a multipart body with a `file` field.\");\n }\n const name = file instanceof File && file.name ? file.name : \"upload\";\n const mimeType = file.type || \"application/octet-stream\";\n\n // The client's `body` option, as one JSON part beside the file (#603), so\n // `authorizeRequest` and `attachmentScope` see here what they see on\n // `stream`. Read off the form already parsed: the request's body is\n // consumed, and an override cannot read it again. A malformed part is\n // refused before anything else runs, as a malformed turn is on `stream`.\n const extraBody = uploadAppBody<Body>(form.get(\"body\"));\n\n // The client's thread, read here only so an unauthenticated chat has\n // something to scope to. It is the client's own handle — `stream` already\n // takes it on trust for the whole conversation — and it is not the model's:\n // this is a form field on an HTTP request the user's browser made, not a\n // tool argument.\n //\n // It is only passed on if the store knows it. `stream` answers\n // `thread_not_found` for an id it has never seen, and this route must not\n // be looser: an invented id would otherwise be a scope, and an anonymous\n // caller could keep writing to storage by sending a fresh one each time.\n const threadField = form.get(\"threadId\");\n // The field as sent, before the store is asked about it, so a refused\n // caller does not learn whether the thread exists.\n await this.authorizeRequest(req, {\n route: \"upload\",\n threadId: typeof threadField === \"string\" && threadField.length > 0 ? threadField : undefined,\n body: extraBody,\n });\n // Before the thread is looked up, the policy is asked, or a byte is kept:\n // a file this route never takes costs nothing past this line.\n const refusal = limitRefusal(await this.attachmentLimits(req), file, name, mimeType);\n if (refusal) {\n throw new LimitedUploadError(refusal.code, refusal.message);\n }\n\n const threadId =\n typeof threadField === \"string\" &&\n threadField.length > 0 &&\n (await this.store.loadThread(threadField)) !== null\n ? threadField\n : undefined;\n\n // Who the provider's copy will belong to (#443): the same key that owns a\n // run this caller starts, so the turn that names the file finds it its own.\n const owner = await this.runOwner(req);\n const recordOwner = (fileId: string) =>\n this.fileOwners.record(fileId, {\n owner,\n name,\n mimeType,\n size: file.size,\n createdAt: new Date().toISOString(),\n });\n\n // The app's own rule about this file and its subject (#836), still before\n // anything is kept or sent.\n const uploadContext: UploadContext<Body> = { body: extraBody, threadId };\n const appRefusal = await this.checkUpload(\n { name, size: file.size, mimeType },\n req,\n uploadContext,\n );\n if (appRefusal) {\n throw new LimitedUploadError(appRefusal.code || \"upload_refused\", appRefusal.message);\n }\n\n const policy = await this.attachmentDestination(file as File, req, uploadContext);\n const destination = narrowDestination(policy, form.get(\"destination\"));\n\n const scope = await this.attachmentScope(req, threadId, { body: extraBody });\n\n // The app's policy wanted a copy of these bytes and the request has no\n // subject to file them under. Recorded rather than merely warned about,\n // because the answer has to be able to tell the client that what it is\n // getting is not the policy — see `UploadResult.downgraded`.\n const downgraded = destination !== \"provider\" && !scope;\n if (downgraded) {\n if (destination === \"storage\") {\n // Bytes were asked to be kept and there is nobody to keep them for.\n // Storing them anyway files them under a scope every caller shares, and\n // answering nothing is an upload that silently did not happen. Neither\n // is an answer; this is.\n throw new Error(\n 'This upload was routed to storage, but `attachmentScope()` returned null for the request, so there is no subject to file the attachment under. Guard the route (`this.agent(Chat).middleware({ upload: \"auth\" })`), send a `threadId` with the upload, or override `attachmentScope()`.',\n );\n }\n // Policy said `both` and the request has no subject: fall through to the\n // provider alone, which is exactly what this route did before attachments\n // existed. Downgrading rather than throwing is what keeps an\n // unauthenticated chat working across the upgrade — but a downgrade nobody\n // is told about is the failure mode this file keeps arguing against, so it\n // is warned once per process on the server and marked `downgraded` in the\n // answer, so the client can tell this apart from a deliberate\n // provider-only policy.\n warnUnscopedUploadOnce();\n }\n\n if (destination === \"provider\" || !scope) {\n // Identical to the pre-attachment behaviour, down to the answer's\n // `fileId` — plus `downgraded` when this path was not the app's choice.\n const fileId = await providerUpload(this.agent.provider, file as File);\n await recordOwner(fileId);\n const answer: UploadResult = {\n fileId,\n name,\n mimeType,\n size: file.size,\n destination: \"provider\",\n };\n if (downgraded) {\n answer.downgraded = \"no_scope\";\n }\n return answer;\n }\n\n const attachmentId = newAttachmentId();\n const objectName = await this.attachmentStorage.put({\n name: attachmentObjectName(attachmentId, name),\n body: file,\n contentType: mimeType,\n });\n\n const fileId =\n destination === \"both\" ? await providerUpload(this.agent.provider, file as File) : undefined;\n if (fileId) {\n await recordOwner(fileId);\n }\n\n const record: Attachment = {\n id: attachmentId,\n scopeKey: scope.key,\n fileId,\n objectName,\n name,\n mimeType,\n size: file.size,\n createdAt: new Date().toISOString(),\n destination,\n };\n await this.attachments.put(scope, record);\n\n return { fileId, attachmentId, name, mimeType, size: file.size, destination };\n }\n\n /**\n * The 403 for a turn naming a provider file id that is not this caller's, or\n * `null` when every id may be used (#443). See `fileOwners`.\n *\n * Only `fileId` is checked: an `attachmentId` is resolved under the request's\n * own scope, so another user's is already a not-found (`ScopedAttachments`).\n * An entry carrying the caller's own `attachmentId` beside a foreign `fileId`\n * is refused all the same — the `fileId` is what reaches the provider.\n */\n private async foreignFile(\n files: { fileId?: string }[],\n caller: string | null,\n ): Promise<Response | null> {\n const ids = new Set(\n files.map((file) => file.fileId).filter((id): id is string => typeof id === \"string\"),\n );\n for (const fileId of ids) {\n const record = await this.fileOwners.get(fileId);\n if (record ? record.owner !== null && record.owner !== caller : this.requireKnownFiles) {\n // The same sentence for a file that is someone else's and, in strict\n // mode, one nobody recorded: which of the two it is would tell a caller\n // probing ids that the id exists.\n return notYourFile();\n }\n }\n return null;\n }\n\n /**\n * Protected, not private: these exist to be overridden. `onMessage` fires for\n * every completed message, user and assistant alike, and is the intended\n * persistence point for an app that is not using `store`.\n *\n * Once per message, in the transcript's order. The turn's own user message\n * is handed over while the run is still going: on a thread once the store\n * has it, and before the model's answer, so whatever the app keeps beside it\n * is there for a read of the thread during a long run (#806). Every other\n * message is handed over after the run, as before. A run that fails or is\n * stopped after taking the turn in has still reported it.\n *\n * Every hook runs inside the request that started the run, which is held\n * open for them — after the run, and after a client that left — so\n * `ctx.req.ctx().user` is the user who sent the turn. See `hookHoldMs` for\n * how long a hook that does not finish keeps it.\n */\n protected onMessage(message: AgentMessage, ctx: AgentHookContext): void | Promise<void> {\n return this.hooks?.onMessage?.(message, ctx);\n }\n\n protected onToolCall(\n call: { toolCallId: string; name: string; input: unknown },\n ctx: AgentHookContext,\n ): void | Promise<void> {\n return this.hooks?.onToolCall?.(call, ctx);\n }\n\n /**\n * Fires once for each tool result on the run's stream (#1062): `ok`,\n * `error`, `denied` (refused, stopped, interrupted) and `running` (a\n * background job started), from the step loop and from a turn that answers\n * a pending call. The place for an audit log of what the tools did.\n *\n * A result a person approved or refused carries `result.approval`: who\n * (the run's subject) and when. This is the server's own copy, so it is\n * trustworthy in stateless mode too, unlike the one the client posts back.\n *\n * `call` is the call the result answers, with its `input` as the model sent\n * it (what `onToolCall` got), for every status: an audit of a refused call\n * can say what was refused without reading the thread (#1079).\n *\n * Top-level calls only: a sub-agent's results are on its nested transcript.\n * A background job settling later is not a result on this stream; read\n * those off the thread, or from the job store.\n */\n protected onToolResult(\n result: ToolResultPart,\n ctx: AgentHookContext,\n call: ToolResultCall,\n ): void | Promise<void> {\n return this.hooks?.onToolResult?.(result, ctx, call);\n }\n\n /** Fires before the stream ends `awaiting-input` — where to notify whoever\n * has to approve, if they are not the person watching the stream. */\n protected onAwaitingInput(\n pending: PendingToolCall[],\n ctx: AgentHookContext,\n ): void | Promise<void> {\n return this.hooks?.onAwaitingInput?.(pending, ctx);\n }\n\n /**\n * What the client is told about a failure: the run's `error` frame, and the\n * result of a tool that threw, which the model reads too and the store\n * keeps. Return the error to send.\n *\n * The default (`redactError` from `gemi/ai`) keeps `code`, `retryable` and\n * `toolCallId` and replaces every message gemi did not write with a fixed\n * sentence for its code: a provider's error body names resources,\n * deployments and request ids, and an exception's text can be a connection\n * string. A tool that throws a `ToolError` keeps its message. The full\n * detail is in `info` (`info.failure` for the run, `info.cause` for a\n * tool), in the log, on `result().error`, and in `onError`, which is handed\n * the unredacted error.\n *\n * Override it to show more, for instance everything in development:\n *\n * protected redactError(error, info, ctx) {\n * if (process.env.NODE_ENV === \"development\") return error;\n * return super.redactError(error, info, ctx);\n * }\n *\n * Only the `AgentError` fields of what it returns are sent. One that throws\n * is reported and the default is used instead.\n */\n protected redactError(\n error: AgentError,\n info: ErrorRedactionInfo,\n ctx: AgentHookContext,\n ): AgentError {\n const hook = this.hooks?.redactError;\n if (hook) return hook(error, info, ctx);\n return redactError(error, info);\n }\n\n /**\n * A failure on the run's stream, unredacted: the provider's own message,\n * and the HTTP `status` and `requestId` when there were any. The client was\n * sent `redactError`'s copy.\n */\n protected onError(error: AgentError, ctx: AgentHookContext): void | Promise<void> {\n return this.hooks?.onError?.(error, ctx);\n }\n\n protected onStreamComplete(\n result: AgentRunResult<ToolShapesOf<A[\"tools\"]>, any>,\n ctx: AgentHookContext,\n ): void | Promise<void> {\n return this.hooks?.onStreamComplete?.(result, ctx);\n }\n\n /**\n * WHAT HAPPENS WHEN A HOOK THROWS: it is reported and the run carries on.\n *\n * The alternative is to fail the run, and that trade is not close. These\n * hooks are an app's persistence and notification points; the run is a model\n * call the user has already been charged for and whose tools may already have\n * charged a card. Letting a failed `INSERT` in `onMessage` abort a generation\n * mid-sentence loses the answer as well as the row, and the user cannot\n * retry into a better outcome. So the answer survives and the failure is\n * logged.\n *\n * It is logged rather than routed to `onError`: `onError` is itself a hook,\n * and a hook that throws inside the handler for hooks that throw is a loop.\n * Override this to send it somewhere with a pager attached.\n */\n protected reportHookFailure(error: unknown): void {\n const hook = this.hooks?.reportHookFailure;\n if (hook) {\n // The reporter for failed hooks is a hook too: one that throws falls\n // back to the log rather than becoming an unhandled rejection.\n try {\n return hook(error);\n } catch (reportError) {\n console.error(\"[gemi/ai] reportHookFailure hook failed\", reportError);\n }\n }\n console.error(\"[gemi/ai] agent controller hook failed\", error);\n }\n\n private async dispatchEvent(event: AgentStreamEvent, ctx: AgentHookContext): Promise<void> {\n switch (event.type) {\n case \"tool-call\":\n // Skipped while the arguments are still streaming: a hook that fires\n // per token would fire with a half-parsed input, which is worse than\n // firing late. And skipped for a re-sent frame, which carries a parked\n // sub-run's record on a call this hook has already seen — once per call\n // is the contract, and a run that re-parks would otherwise fire it for\n // a call some earlier run made.\n if (!event.part.partial && !event.resent) {\n await this.onToolCall(\n {\n toolCallId: event.part.toolCallId,\n name: String(event.part.name),\n input: event.part.input,\n },\n ctx,\n );\n }\n return;\n case \"tool-result\": {\n const result = event.part as ToolResultPart;\n await this.onToolResult(result, ctx, {\n toolCallId: result.toolCallId,\n name: String(result.name),\n input: toolCallInputOf(result),\n });\n return;\n }\n case \"awaiting-input\":\n await this.onAwaitingInput(event.pending as PendingToolCall[], ctx);\n return;\n case \"error\":\n // The frame carries the redacted copy; the hook is server-side and\n // gets what it was made from.\n await this.onError(unredactedError(event.error), ctx);\n return;\n default:\n return;\n }\n }\n\n /**\n * The thread as a client should see it: the store's history, with any\n * assistant message a dead run left unfinished marked `interrupted` (#617).\n *\n * For the app's own route that hands a thread to `useChat` (or a native\n * session) as its initial messages. A message whose run is still going here\n * is left as it is, still being written, so the client attaches to it. `null`\n * for a thread the store does not have, as `loadThread` answers.\n *\n * It does not write: the next turn on the thread settles the same messages\n * the same way and stores them then, under the thread's lock.\n *\n * Typed by the controller's agent (#1100), as `useChat`'s `initialMessages`\n * for the route is, so the result goes there with no cast. A controller that\n * picks its agent per request is typed by the widest one, `A`.\n */\n async readThread(threadId: string): Promise<ThreadMessage<A>[] | null> {\n const history = await this.store.loadThread(threadId);\n if (!history) return null;\n const { messages } = await this.settleThread(threadId, history, { write: false });\n // The store is not typed per agent; these are this agent's messages.\n return messages as ThreadMessage<A>[];\n }\n\n /**\n * Whether the run that was writing a message is still going, so the message\n * is in progress rather than interrupted.\n *\n * The default asks this process's `liveRuns`, which is the whole answer on a\n * single instance: a run lives in the process that started it, and a run\n * that is not there died with an earlier one. A finished run still within\n * `ttlMs` counts as live, since its final write may not have landed yet.\n *\n * Behind several instances it is not the whole answer. A run on another\n * instance is not in this map, so its message reads as interrupted here\n * until that run's own writes replace it. Knowing better needs a lasting\n * record of running runs (#459); override this to consult one.\n */\n protected isRunLive(runId: string, threadId: string): boolean | Promise<boolean> {\n void threadId;\n return this.liveRuns.get(runId) !== null;\n }\n\n private async settleThread(\n threadId: string,\n history: AgentMessage[],\n { write }: { write: boolean },\n ): Promise<{ messages: AgentMessage[]; jobs: AgentJobRecord[] }> {\n const isLive = (runId: string) => this.isRunLive(runId, threadId);\n const interrupted = await settleInterrupted(history, isLive);\n let messages = interrupted.messages;\n let jobs: AgentJobRecord[] = [];\n const settled = new Map(interrupted.settled.map((message) => [message.id, message]));\n\n // Background jobs (#461): each `running` tool result gets its job's\n // current state, and the ones that settled are written back with the\n // rest. A job store that cannot be read leaves the results `running`,\n // which is what the model saw last time, rather than failing the turn.\n if (hasRunningResult(messages) || write) {\n try {\n const overlaid = await overlayJobs(messages, {\n threadId,\n store: AgentJobs.store,\n isRunLive: isLive,\n outputSchemaFor: (name) => this.toolNamed(name)?.outputSchema,\n modelOutputFor: (name, output) =>\n modelOutputOf(this.toolNamed(name), output, (err) => this.reportHookFailure(err)),\n scan: this.jobsBlockMax(),\n });\n messages = overlaid.messages;\n jobs = overlaid.jobs;\n for (const message of overlaid.settled) settled.set(message.id, message);\n if (write && overlaid.orphans.length > 0) {\n await markOrphans(AgentJobs.store, overlaid.orphans, (err) =>\n this.reportHookFailure(err),\n );\n const orphans = new Set(overlaid.orphans.map((record) => record.id));\n jobs = jobs.map((record) =>\n orphans.has(record.id) ? { ...record, orphaned: true as const } : record,\n );\n }\n } catch (err) {\n this.reportHookFailure(err);\n }\n }\n\n if (write && settled.size > 0) {\n try {\n await this.store.appendMessages(threadId, [...settled.values()]);\n } catch (err) {\n // The run still gets the settled history. The store keeps the\n // unfinished copy, and the next turn settles it the same way again.\n this.reportHookFailure(err);\n }\n }\n return { messages, jobs };\n }\n\n /** The agent's `jobs.contextBlock.max`, or 0 for no block. */\n private jobsBlockMax(): number {\n const block = (this.agent as { jobs?: { contextBlock?: { max?: number } | false } }).jobs\n ?.contextBlock;\n if (block === false) return 0;\n return block?.max ?? DEFAULT_JOBS_CONTEXT_MAX;\n }\n\n private jobsBlock(jobs: AgentJobRecord[]): string | null {\n return renderJobsBlock(jobs, this.jobsBlockMax());\n }\n\n /** A tool's output schema, by name, for checking a background job's output. */\n private toolNamed(name: string): ToolLike | undefined {\n const visit = (entries: readonly unknown[]): ToolLike | undefined => {\n for (const entry of entries) {\n const tool = entry as ToolLike & { tools?: unknown[] };\n if (Array.isArray(tool.tools)) {\n const found = visit(tool.tools);\n if (found) return found;\n } else if (tool.name === name) {\n return tool;\n }\n }\n return undefined;\n };\n return visit((this.agent as { tools?: readonly unknown[] }).tools ?? []);\n }\n\n /**\n * Feeds the run's frames to its journal as they are emitted.\n *\n * A subscriber of its own on `run.frames()` rather than a ride on the\n * `onEvent` chain: that chain waits for the app's hooks, and a slow\n * `onToolCall` must not be what decides whether a tool call was stored\n * before the process died. `frames()` is a read of the run's own buffer, the\n * one `toResponse` already reads beside `liveRuns`, so a third reader costs a\n * cursor and nothing else.\n */\n private follow(run: AgentRun, journal: TurnJournal): void {\n void (async () => {\n try {\n for await (const frame of run.frames()) journal.frame(frame);\n } catch (err) {\n this.reportHookFailure(err);\n }\n })();\n }\n\n /**\n * Runs after the stream is over, whether or not anyone was still watching it.\n *\n * The messages come from `result()` rather than from the event stream because\n * assembling a message out of deltas is the agent's job and doing it twice is\n * how the two copies drift. It also means a stopped run persists the same way\n * a finished one does: `stop()` finalizes the transcript, so by the time this\n * resolves there is a valid history to store.\n *\n * `stored` settles when the transcript is in the store, not when the app is\n * done with it. The next turn on this thread waits on that (see\n * `withThread`), and the hooks are the app's: an `onMessage` that writes to\n * something slow would make every later turn wait for it, once per message\n * of the old run, and one that never settles — which `safely` cannot catch —\n * would hold the thread, and every turn queued on it, behind an open\n * connection each. So the hooks run on after it on their own, reported the\n * same way.\n *\n * `hooks` settles once they have too, and every event-stream hook the run\n * led to (`eventHooks`), or after `hookHoldMs` of them, and is what the\n * request that started the run is held open for. Separate from\n * `stored` for the reason above, and it has to exist from the start: by the\n * time the hooks are called the run has settled, and the request with it,\n * unless something was already holding it. Neither rejects.\n */\n private persistRun(\n run: AgentRun,\n ctx: AgentHookContext,\n eventHooks: Promise<void>,\n journal: TurnJournal | null = null,\n early: EarlyTurn = { id: null, notified: Promise.resolve() },\n ): { stored: Promise<void>; hooks: Promise<void> } {\n // Assigned before `stored` settles, on every path, so `hooks` below reads\n // the chain this run actually started.\n let notified: Promise<void> = Promise.resolve();\n\n const stored = (async () => {\n let result: AgentRunResult<ToolShapes, unknown>;\n try {\n result = await run.result();\n } catch (err) {\n // What was written while it ran stays: it is the most the store can\n // know about a run that did not settle, and the next read marks it\n // interrupted once the run is gone.\n journal?.close();\n await journal?.settled();\n // After the turn's own `onMessage`, if the run got that far: the hooks\n // keep their order on every path.\n notified = early.notified.then(() =>\n this.safely(() =>\n this.onError(\n {\n code: \"unknown\",\n message: err instanceof Error ? err.message : String(err),\n retryable: false,\n },\n ctx,\n ),\n ),\n );\n return;\n }\n\n const messages = result.messages as AgentMessage[];\n\n // The writes made while it ran land first, then the transcript whole: the\n // same messages under the same ids, now final, so this replaces every\n // in-progress copy rather than adding to them.\n journal?.close(messages);\n await journal?.settled();\n\n if (ctx.threadId && messages.length > 0) {\n try {\n await this.store.appendMessages(ctx.threadId, messages);\n } catch (err) {\n this.reportHookFailure(err);\n }\n }\n\n notified = this.notifyRun(result, messages, ctx, early);\n })();\n\n // The bound starts once the run has settled, not with the run: a long run\n // is not a hung hook. `eventHooks` is in it because the event-stream hooks\n // are chained (see `MemoryLiveRuns.register`): an `onAwaitingInput` queued\n // behind a slow `onToolCall` is called after the run, and after every hook\n // above, and has nothing else to hold the request for it.\n const hooks = stored.then(() =>\n within(\n Promise.all([notified, eventHooks]).then(() => {}),\n this.hookHoldMs,\n ),\n );\n return { stored, hooks };\n }\n\n /** The hooks on a finished run, in order. Never rejects: see `safely`. */\n private async notifyRun(\n result: AgentRunResult<ToolShapes, unknown>,\n messages: AgentMessage[],\n ctx: AgentHookContext,\n early: EarlyTurn,\n ): Promise<void> {\n // The turn's message was handed to `onMessage` while the run went. It\n // comes before every message the run made after it, so waiting for it\n // here keeps the hook's order the transcript's.\n await early.notified;\n for (const message of messages) {\n if (message.id === early.id) continue;\n await this.safely(() => this.onMessage(message, ctx));\n }\n\n await this.safely(() => this.onStreamComplete(result as any, ctx));\n }\n\n private async safely(fn: () => void | Promise<void>): Promise<void> {\n try {\n await fn();\n } catch (err) {\n this.reportHookFailure(err);\n }\n }\n}\n\n/**\n * The turn's user message, as far as the app's `onMessage` has heard of it\n * (#806).\n *\n * The turn's message is the one thing a run stores that the app usually wants\n * to tag from the request: where it was sent from, whether the app sent it on\n * the user's behalf. Called after the run with everything else, those tags\n * were missing for the whole of a long run, to a reload or a second tab, while\n * the store already held the message. So it is called as soon as the journal\n * has written it, and `notifyRun` skips it by `id`: once per message, as\n * before, and in the same order.\n */\n/** What the controller reads off one of its agent's tools by name. */\ntype ToolLike = {\n name?: string;\n outputSchema?: Schema<any>;\n toModel?: (output: any) => unknown;\n};\n\ntype EarlyTurn = {\n /** The turn message's id, once the run has reported it. */\n id: string | null;\n /** Settles once its `onMessage` has. Never rejects. */\n notified: Promise<void>;\n};\n\n// --- request plumbing ----------------------------------------------------\n\n/**\n * The keys of the turn envelope itself, which `useChat` puts in the same JSON\n * object as an app's `body`.\n *\n * Listed so `appBody` can take them back out. Sharing one object was the right\n * wire choice — a nested `body` field would be a second envelope for every\n * client, including the Swift and Kotlin ones — but it does mean the app's\n * fields and the framework's are mixed together on arrival, and handing an app\n * `turn` and `messages` would invite reading them. They are this module's to\n * change; an app that depended on their shape would break on a release that\n * never mentioned them.\n */\nconst ENVELOPE_KEYS = [\"turn\", \"clientRunId\", \"threadId\", \"messages\", \"regenerate\"] as const;\n\n/**\n * The turn's own fields, which `toClientTurn` reads off the top level when the\n * body carries no `turn` object. Reserved in that form and only that form —\n * with an envelope present, a top-level `text` is the app's.\n */\nconst BARE_TURN_KEYS = [\"text\", \"files\", \"toolResults\"] as const;\n\n/**\n * An app's own fields, out of the parsed turn body.\n *\n * A fresh object rather than a `delete` on the parsed one. Nothing reads the\n * body after this today — `turn`, `threadId`, `clientRunId` and `messages` are\n * all pulled out above — so this is not load-bearing and no test pins it. It is\n * how a helper that takes a parsed body should behave regardless: the next\n * reader to move a line above this one should not have to know that the body\n * was quietly hollowed out.\n */\nfunction appBody<Body extends object>(\n body: Record<string, any>,\n reserved: readonly string[] = hasTurnEnvelope(body)\n ? ENVELOPE_KEYS\n : [...ENVELOPE_KEYS, ...BARE_TURN_KEYS],\n): Body {\n const extra: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(body)) {\n if (reserved.includes(key)) continue;\n // `JSON.parse` produces `__proto__` as an own property, and `Object.entries`\n // hands it over like any other. Assigning it with `[]` goes through\n // `Object.prototype`'s setter and changes the prototype of the object an app\n // is about to read — from a value the client chose. `defineProperty` writes\n // the key itself, which is what \"the fields the client sent\" means.\n Object.defineProperty(extra, key, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n return extra as Body;\n}\n\n/**\n * The app's fields from an upload's `body` form part — the JSON of\n * `useChat`'s `body` option — in the shape `stream` hands out.\n *\n * One JSON part rather than a form field per key: a form field is a string, so\n * `{ count: 3 }` would arrive as `\"3\"` and `Body` would lie on this route and\n * not the other. A missing part is `{}`, as a turn with no app fields is.\n *\n * Only the envelope's four names are taken back out, not the bare-turn ones:\n * `useChat` always sends a `turn` envelope, so on `stream` an app's `text` is\n * the app's, and it has to be here as well.\n *\n * Anything else — a file where the JSON should be, JSON that does not parse,\n * JSON that is not an object — is a 400, not `{}`. Read as empty, the scope\n * would quietly resolve to `null` and the upload downgrade, and the reason\n * would be a missing page rather than a broken client.\n */\nfunction uploadAppBody<Body extends object>(part: FormDataEntryValue | null): Body {\n if (part === null) {\n return {} as Body;\n }\n let parsed: unknown;\n if (typeof part === \"string\") {\n try {\n parsed = JSON.parse(part);\n } catch {\n throw new InvalidUploadError(\"The upload's `body` field is not valid JSON.\");\n }\n }\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new InvalidUploadError(\"The upload's `body` field must be a JSON object.\");\n }\n return appBody<Body>(parsed as Record<string, any>, ENVELOPE_KEYS);\n}\n\n/**\n * A 400 from `upload`, which answers `UploadResult` and so rejects by throwing.\n * The payload is the shape `stream`'s own 400s have, so a client reads both the\n * same way.\n */\nclass InvalidUploadError extends RequestBreakerError {\n constructor(message: string) {\n super(message);\n this.name = \"InvalidUploadError\";\n this.payload = {\n api: { status: 400, data: { error: { code: \"invalid_request\", message } } },\n view: {},\n };\n }\n}\n\n/**\n * The provider's upload, with a refusal of THE FILE answered as the client's\n * problem rather than the server's.\n *\n * A vendor that will not take a file answers 4xx, and before this that left\n * `upload` as an unhandled `ProviderHttpError`: a 500 that tells the person\n * attaching the file nothing about the file. MEASURED on Azure (#682,\n * 2026-10-01): with `purpose: \"user_data\"` a `.docx` was refused with `400\n * Unsupported extension: .docx. Supported extensions: .txt, .md, .pdf, …`; with\n * `assistants` the `.docx` is accepted (and read in a turn), and an `.exe` is\n * refused with `400 Invalid extension exe. Supported formats: \"c\", \"cpp\", …`.\n * Either sentence is exactly what the person needs to read, so it is passed\n * through as the message.\n *\n * Only the statuses that are about the request body: 400, 413, 415 and 422. A\n * 401/403 is our key, a 429/5xx is the vendor's day, and both stay server\n * errors — a person cannot fix either by picking another file.\n */\nasync function providerUpload(provider: { upload(file: File): Promise<string> }, file: File) {\n try {\n return await provider.upload(file);\n } catch (error) {\n if (error instanceof ProviderHttpError && REJECTED_FILE_STATUSES.has(error.status)) {\n throw new RejectedUploadError(normalizeProviderError(error).message);\n }\n throw error;\n }\n}\n\nconst REJECTED_FILE_STATUSES = new Set([400, 413, 415, 422]);\n\n/** A 422 from `upload` for a file outside `attachmentLimits`, or one\n * `checkUpload` refused. */\nclass LimitedUploadError extends RequestBreakerError {\n constructor(code: string, message: string) {\n super(message);\n this.name = \"LimitedUploadError\";\n this.payload = {\n api: { status: 422, data: { error: { code, message } } },\n view: {},\n };\n }\n}\n\n/** Why `file` is outside `limits`, or `null` when it is not. Exported for the\n * tests; the route is the only caller. */\nexport function limitRefusal(\n limits: AttachmentLimits | null | undefined,\n file: Blob,\n name: string,\n mimeType: string,\n): { code: \"file_too_large\" | \"unsupported_file_type\"; message: string } | null {\n if (!limits) return null;\n const { maxBytes, accept } = limits;\n if (typeof maxBytes === \"number\" && file.size > maxBytes) {\n return {\n code: \"file_too_large\",\n message: `${JSON.stringify(name)} is ${formatBytes(file.size)}; the limit is ${formatBytes(maxBytes)}.`,\n };\n }\n if (\n accept &&\n accept.length > 0 &&\n !accept.some((entry) => acceptMatches(entry, name, mimeType))\n ) {\n return {\n code: \"unsupported_file_type\",\n message: `${JSON.stringify(name)} is not a type this chat accepts. Accepted: ${accept.join(\", \")}.`,\n };\n }\n return null;\n}\n\nfunction acceptMatches(entry: string, name: string, mimeType: string): boolean {\n const rule = entry.trim().toLowerCase();\n if (!rule) return false;\n if (rule.startsWith(\".\")) return name.toLowerCase().endsWith(rule);\n const type = mimeType.toLowerCase().split(\";\")[0]!.trim();\n if (rule.endsWith(\"/*\")) return type.startsWith(rule.slice(0, -1));\n return type === rule;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n const units = [\"KB\", \"MB\", \"GB\"];\n let value = bytes / 1024;\n let unit = 0;\n while (value >= 1024 && unit < units.length - 1) {\n value /= 1024;\n unit++;\n }\n return `${Math.round(value * 10) / 10} ${units[unit]}`;\n}\n\n/**\n * A 422 from `upload`: the provider would not take this file. `code` is\n * `unsupported_file_type` when the vendor said the type was the problem (an\n * extension or format allow-list) and `file_rejected` otherwise, so\n * a composer can mark the one chip without parsing English. Same payload shape\n * as `InvalidUploadError`.\n */\nclass RejectedUploadError extends RequestBreakerError {\n constructor(message: string) {\n super(message);\n this.name = \"RejectedUploadError\";\n const code =\n /(unsupported|invalid) (extension|file type|format|mime)|supported (extensions|formats?)/i.test(\n message,\n )\n ? \"unsupported_file_type\"\n : \"file_rejected\";\n this.payload = {\n api: { status: 422, data: { error: { code, message } } },\n view: {},\n };\n }\n}\n\n/**\n * A body, or the reason there is not one.\n *\n * Deliberately one shape with an optional `error` rather than a discriminated\n * union on `ok`: this package compiles with `strict: false`, and without\n * `strictNullChecks` TypeScript will not narrow a union by a boolean\n * discriminant — `if (!parsed.ok)` leaves `parsed.message` an error. A field\n * that is either set or not needs no narrowing to read.\n */\ntype ParsedBody = {\n body: Record<string, any>;\n error?: string;\n /** Which HTTP error the rejection is. A missing one is the 400. */\n status?: number;\n code?: string;\n};\n\n/**\n * The body, as JSON — or a reason it is not.\n *\n * Read off the raw request rather than through `req.input()`: that path also\n * accepts `+json` types and answers its failures as a thrown refusal, while\n * these routes are held to `application/json` alone (below) and answer with\n * a `{ code, message }` body of their own.\n *\n * Matching the type by prefix is not the same as ignoring it. A body that\n * arrives as anything other than `application/json` is a 415, and the reason\n * is not tidiness: a cross-site `<form enctype=\"text/plain\">` can be made to\n * concatenate its one field into valid JSON, and a JSON parser that reads\n * whatever it is handed turns that form into a turn on someone else's\n * conversation. Insisting on `application/json` is what makes these routes\n * non-simple requests — the browser will not send one cross-origin without a\n * preflight — and that holds whether or not the app's cookies are `SameSite`\n * and whether or not `CSRFMiddleware` is mounted. Only a request that carries a\n * body is held to this; a bodiless POST has no type to check and stays `{}`.\n *\n * The three cases are kept apart deliberately. NO body is a real request — a\n * reattach, or a turn that just lets the model continue — and reads as `{}`. A\n * body that will not parse, or that parses to something other than an object,\n * is a failed request and has to say so: folding it into `{}` made a truncated\n * proxy response or a mis-serialized client indistinguishable from an empty\n * turn, so `stream` billed a model call with no history and no turn and threw\n * the user's actual message away. That presents as the model hallucinating\n * rather than as an error, which is the expensive way to debug it. Pre-flight\n * failures stay ordinary HTTP errors and never reach the event stream.\n *\n * An array counts as malformed even though `typeof [] === \"object\"`: nothing\n * downstream reads a positional body, so `[1,2,3]` could only ever have run as\n * an empty turn.\n */\nasync function readJsonBody(req: HttpRequest<any, any>, maxBytes: number): Promise<ParsedBody> {\n const raw = req?.rawRequest;\n if (!raw || raw.method === \"GET\" || raw.method === \"HEAD\" || !raw.body) {\n return { body: {} };\n }\n\n if (!isJsonContentType(raw.headers.get(\"Content-Type\"))) {\n // Before the body is read: nothing in a body about to be refused is worth\n // the bytes, and the refusal must not depend on what they were.\n return {\n body: {},\n status: 415,\n code: \"unsupported_media_type\",\n error: \"The request body must be sent as application/json.\",\n };\n }\n\n // Before a byte is read when the client declared its length, and while\n // reading when it did not (#444).\n const declared = Number(raw.headers.get(\"Content-Length\"));\n if (Number.isFinite(declared) && declared > maxBytes) {\n return bodyTooLarge(maxBytes);\n }\n\n let text: string;\n try {\n const read = await readCapped(raw, maxBytes);\n if (read === null) {\n return bodyTooLarge(maxBytes);\n }\n text = read;\n } catch {\n // A body that stopped arriving mid-flight. Same class of failure as one\n // that arrived truncated, and the same answer.\n return { body: {}, error: \"The request body could not be read.\" };\n }\n\n if (!text.trim()) {\n return { body: {} };\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n return { body: {}, error: \"The request body is not valid JSON.\" };\n }\n\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return { body: {}, error: \"The request body must be a JSON object.\" };\n }\n\n return { body: parsed as Record<string, any> };\n}\n\n/**\n * Media types compare case-insensitively and may carry parameters, so the\n * comparison is on the lowercased type with its parameters cut off, and\n * `Application/JSON; charset=utf-8` passes. It is an equality on that type\n * rather than a prefix, so `application/json-seq` and the other types that\n * merely begin with those bytes do not. None of the three types a browser will\n * send without a preflight — `text/plain`, `application/x-www-form-urlencoded`,\n * `multipart/form-data` — does either, and neither does no type at all, which\n * is what a hand-written `fetch` with a string body and no header ends up\n * sending as `text/plain`.\n */\nfunction isJsonContentType(value: string | null): boolean {\n return mediaType(value) === \"application/json\";\n}\n\n/**\n * The body as text, or `null` once more than `maxBytes` of it has arrived, at\n * which point the rest is not read. A limit that is not finite reads it all.\n */\nasync function readCapped(raw: Request, maxBytes: number): Promise<string | null> {\n if (!Number.isFinite(maxBytes) || !raw.body) {\n return await raw.text();\n }\n const reader = raw.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (size > maxBytes) {\n await reader.cancel().catch(noop);\n return null;\n }\n chunks.push(value);\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return new TextDecoder().decode(bytes);\n}\n\nfunction bodyTooLarge(maxBytes: number): ParsedBody {\n return {\n body: {},\n status: 413,\n code: \"body_too_large\",\n error: `The request body is larger than this agent accepts (${maxBytes} bytes).`,\n };\n}\n\n/**\n * A refusal for one of #444's limits: the `{ kind, message, status }` every\n * refusal has (#686), plus the `code` the agent routes' own errors carry, so a\n * client can tell the limits apart without reading the message.\n */\nfunction limitResponse(status: number, code: string, message: string): Response {\n return jsonResponse(status, {\n ...refusal(refusalKindForStatus(status), message, status),\n code,\n });\n}\n\nfunction invalidRequest(parsed: ParsedBody): Response {\n if (parsed.status === 413) {\n return limitResponse(413, parsed.code ?? \"body_too_large\", parsed.error ?? \"\");\n }\n return jsonResponse(parsed.status ?? 400, {\n code: parsed.code ?? \"invalid_request\",\n message: parsed.error,\n });\n}\n\n/**\n * Whether the turn arrived in a `turn` object of its own, rather than spread\n * across the top level of the body.\n *\n * Both forms are accepted, and which one it is decides what belongs to the app:\n * a top-level `text` is the user's message in the bare form and an app's own\n * field in the enveloped one. `toClientTurn` and `appBody` have to agree about\n * that, so they ask the same question here rather than each testing it.\n */\nfunction hasTurnEnvelope(body: Record<string, any>): boolean {\n return Boolean(body.turn) && typeof body.turn === \"object\";\n}\n\n/**\n * The client's turn, accepting both `{ turn: {...} }` and the flattened\n * `{ text, files, toolResults }` — the second is what a hand-written `fetch`\n * writes, and refusing it buys nothing.\n *\n * `turn` is `undefined` for an empty turn, which is a real request:\n * reattaching to a conversation and letting the model continue is a turn with\n * nothing in it. `error` is a turn that is refused with a 400 before anything\n * runs — see `toTurnFiles`.\n */\nfunction toClientTurn(body: Record<string, any>): { turn?: ClientTurn; error?: string } {\n const source = hasTurnEnvelope(body) ? body.turn : body;\n const turn: ClientTurn = {};\n if (typeof source.text === \"string\") {\n turn.text = source.text;\n }\n if (Array.isArray(source.files)) {\n const files = toTurnFiles(source.files);\n if (typeof files === \"string\") {\n return { error: files };\n }\n turn.files = files;\n }\n if (Array.isArray(source.toolResults)) {\n turn.toolResults = source.toolResults;\n }\n if (Object.keys(turn).length === 0) return {};\n // Envelope only: in the bare form the top level is shared with the app's own\n // fields, and an app that already sends a `localId` of its own would lose it\n // to the turn. `null` and `\"\"` read as absent, as they do for `files`.\n if (\n source === body.turn &&\n source.localId !== undefined &&\n source.localId !== null &&\n source.localId !== \"\"\n ) {\n const { localId } = source;\n if (typeof localId !== \"string\") return { error: \"turn.localId must be a string.\" };\n // Echoed back on the stream and nothing else, so the only thing to bound\n // is what one frame carries.\n if (localId.length > MAX_LOCAL_ID_LENGTH) {\n return { error: `turn.localId is longer than ${MAX_LOCAL_ID_LENGTH} characters.` };\n }\n turn.localId = localId;\n }\n return { turn };\n}\n\n/** How long `turn.localId` may be. Comfortably above `local_<uuid>`. */\nconst MAX_LOCAL_ID_LENGTH = 200;\n\n/**\n * `turn.files`, checked field by field, or the sentence refusing it.\n *\n * REFUSED, NOT FILTERED. Every entry becomes a `FilePart` in a user message,\n * and on a thread that message is stored before the provider sees it. An entry\n * the request builder cannot send — no id at all, or a gemi id in `fileId` —\n * then throws from `toResponsesInput` on this turn and on every turn after it,\n * because every later turn re-sends the history: one bad upload bricks the\n * thread. Dropping the entry instead is quieter and worse — the model answers\n * about a file it was never given, with nothing saying so. A 400 here is the\n * one place the client can still do something about it.\n *\n * Scoping is what makes a foreign `attachmentId` harmless (`ScopedAttachments`\n * answers the same not-found for another tenant's id as for an invented one),\n * so the id is not signed or looked up here. What this checks is the shape a\n * crash would come from: strings where strings go, the prefix on\n * `attachmentId`, at least one id. Unknown fields are dropped rather than\n * refused, since `attach()` answers more than a `FilePart` holds (`downgraded`)\n * and passing its answer on whole is the documented use. `null` and `\"\"` read\n * as absent, for every field: `null` is what a serializer that writes\n * `undefined` as `null` means, and `\"\"` is what a form field left blank sends.\n * Neither can be an id, so refusing `attachmentId: \"\"` for its prefix would\n * turn a blank into an error the entry's `fileId` does not deserve.\n */\nfunction toTurnFiles(raw: unknown[]): NonNullable<ClientTurn[\"files\"]> | string {\n const files: NonNullable<ClientTurn[\"files\"]> = [];\n for (const [index, entry] of raw.entries()) {\n const where = `turn.files[${index}]`;\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n return `${where} must be an object.`;\n }\n const fields: Record<string, string> = {};\n for (const key of [\"fileId\", \"attachmentId\", \"name\", \"mimeType\"] as const) {\n const value = (entry as Record<string, unknown>)[key];\n if (value === undefined || value === null || value === \"\") continue;\n if (typeof value !== \"string\") {\n return `${where}.${key} must be a string.`;\n }\n fields[key] = value;\n }\n const { fileId, attachmentId, name, mimeType } = fields;\n if (fileId?.startsWith(ATTACHMENT_ID_PREFIX)) {\n return `${where}.fileId holds a gemi attachment id (${fileId}). \\`fileId\\` is the provider's id from the upload response; put this one in \\`attachmentId\\`.`;\n }\n if (attachmentId !== undefined && !attachmentId.startsWith(ATTACHMENT_ID_PREFIX)) {\n return `${where}.attachmentId is not a gemi attachment id: it must start with \"${ATTACHMENT_ID_PREFIX}\".`;\n }\n if (!fileId && !attachmentId) {\n return `${where} has neither a \\`fileId\\` nor an \\`attachmentId\\`. Send the ids the upload response answered.`;\n }\n files.push({\n ...(fileId ? { fileId } : {}),\n ...(attachmentId ? { attachmentId } : {}),\n ...(name !== undefined ? { name } : {}),\n ...(mimeType !== undefined ? { mimeType } : {}),\n });\n }\n return files;\n}\n\n/**\n * Where to resume from, or `undefined` for \"wherever you still can\".\n *\n * An explicit `from` wins, because a client that tracked its own position knows\n * something the transport does not. Otherwise `Last-Event-ID` — the browser\n * sends it on its own when an `EventSource` reconnects, and the frames put\n * `seq` in `id:` precisely so that header is already the right question. It\n * names the last event *received*, so the resume point is one past it.\n *\n * With neither, the answer is `undefined` and NOT 0. A client reattaching on\n * mount is a fresh POST from a page that has just loaded: no `Last-Event-ID`,\n * and no cursor of its own, because the only handle it was given is the\n * `threadId`. Reading that as \"resume from frame 0\" asked `replay` for a frame\n * every run longer than `maxFrames` has already evicted, so the mount-time\n * reattach — the one case `/attach` exists for — 410'd on exactly the long runs\n * it was meant to rescue, and the documented remedy of reloading the thread\n * does not help because the store is only written at run end. `undefined` means\n * the tail, which is all such a client can use anyway.\n */\nfunction resolveCursor(req: HttpRequest<any, any>, body: Record<string, any>): number | undefined {\n if (typeof body.from === \"number\" && Number.isFinite(body.from)) {\n return Math.max(0, Math.floor(body.from));\n }\n // `cursor` is what `useChat` actually sends, and it counts the other way:\n // `from` is the frame to resume AT, `cursor` the last frame the client\n // APPLIED — the same convention as `Last-Event-ID`, and the same `+ 1`. A\n // client that has applied nothing sends -1, which is not a position but the\n // absence of one, so it falls through to the tail rather than asking for\n // frame 0 and 410ing on precisely the long runs `/attach` exists to rescue.\n if (typeof body.cursor === \"number\" && Number.isFinite(body.cursor)) {\n const applied = Math.floor(body.cursor);\n if (applied >= 0) {\n return applied + 1;\n }\n return undefined;\n }\n const header = req?.rawRequest?.headers?.get(\"Last-Event-ID\");\n if (header) {\n const seq = Number.parseInt(header, 10);\n if (Number.isFinite(seq)) {\n return Math.max(0, seq + 1);\n }\n }\n return undefined;\n}\n\nfunction searchParam(req: HttpRequest<any, any>, key: string): string | undefined {\n const value = req?.search?.get(key);\n return typeof value === \"string\" ? value : undefined;\n}\n\n/**\n * Where a threaded regenerate cuts the history: at the last message the user\n * wrote, with the turn that wrote it. A file a tool showed is a user-role\n * message too, but it is part of the answer being replaced, so it is stepped\n * over (`injectedMessageIds`, the test `historyForProvider` uses).\n */\nfunction regenerationCut(\n messages: AgentMessage[],\n): { index: number; turn: ClientTurn } | null {\n const injected = injectedMessageIds(messages);\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index]!;\n if (message.role !== \"user\" || injected.has(message.id)) continue;\n let text = \"\";\n const files: NonNullable<ClientTurn[\"files\"]> = [];\n for (const part of message.content) {\n if (part.type === \"text\") text += part.text;\n if (part.type === \"file\") {\n files.push({\n ...(part.fileId ? { fileId: part.fileId } : {}),\n ...(part.attachmentId ? { attachmentId: part.attachmentId } : {}),\n ...(part.name ? { name: part.name } : {}),\n ...(part.mimeType ? { mimeType: part.mimeType } : {}),\n });\n }\n }\n if (!text && files.length === 0) continue;\n return {\n index,\n turn: { ...(text ? { text } : {}), ...(files.length > 0 ? { files } : {}) },\n };\n }\n return null;\n}\n\n/** A turn `/stop` ended while it waited, before anything ran or was charged. */\nfunction stoppedBeforeStart(): Response {\n return jsonResponse(409, {\n code: \"stopped\",\n message: \"The turn was stopped before it started.\",\n });\n}\n\n/**\n * The refusal for a run that belongs to another caller (#442), in the shape\n * every other refusal has (`{ kind, message, status }`, #686), so `useChat` and\n * the client guards classify it as `permission` without matching on text.\n */\nfunction notYourRun(): Response {\n return jsonResponse(\n 403,\n refusal(\"permission\", \"This run belongs to someone else.\", 403) as Record<string, unknown>,\n );\n}\n\n/** The refusal for a turn naming another owner's provider file (#443). Same\n * shape as `notYourRun`. */\nfunction notYourFile(): Response {\n return jsonResponse(\n 403,\n refusal(\n \"permission\",\n \"A file in this turn was uploaded by someone else.\",\n 403,\n ) as Record<string, unknown>,\n );\n}\n\n/**\n * The file parts of a stateless chat's history, which the client carries and\n * may have written anything into. Read defensively: the history is not\n * validated anywhere else before the run, and a malformed one is the run's\n * problem, not this check's.\n */\nfunction clientHistoryFiles(messages: unknown): { fileId?: string }[] {\n if (!Array.isArray(messages)) return [];\n const files: { fileId?: string }[] = [];\n for (const message of messages) {\n const content = (message as { content?: unknown } | null)?.content;\n if (!Array.isArray(content)) continue;\n for (const part of content) {\n if (part && typeof part === \"object\" && typeof part.fileId === \"string\") {\n files.push({ fileId: part.fileId });\n }\n }\n }\n return files;\n}\n\n/** What `voiceStart` takes out of the body before the rest is the app's. */\nconst VOICE_START_KEYS = [\"sdp\", \"threadId\", \"pushToTalk\"] as const;\n\ntype VoiceBridgeController<Body extends object> = {\n startTurn(params: AgentTurnParams<Body>): Promise<AgentTurn>;\n};\n\nfunction voiceNotEnabled(): Response {\n return jsonResponse(404, {\n code: \"voice_not_enabled\",\n message: \"This agent has no voice: set `voice` on its controller.\",\n });\n}\n\nfunction jsonResponse(status: number, error: Record<string, unknown>): Response {\n return new Response(JSON.stringify({ error }), {\n status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n}\n\n// --- attachments ---------------------------------------------------------\n\n/**\n * Reads the client's `destination` field and applies it to the app's policy.\n *\n * THE ONLY THING A CLIENT MAY ASK FOR IS \"DO NOT SEND THIS TO THE VENDOR\", and\n * that is the entire permitted vocabulary: a `storage` hint under a `both`\n * policy, or a hint that agrees with the policy and changes nothing. Everything\n * else throws.\n *\n * The rule here used to be \"a hint may narrow, never widen\", counting\n * destinations, and counting is what made it wrong in one direction.\n * `both → provider` is fewer destinations and reads as narrowing, but what it\n * removes is *gemi's own copy*, while the third party still gets the file. That\n * is not a client declining exposure, it is a client overriding the app's\n * retention decision from a field in a multipart body: an app that keeps every\n * upload because a tool has to forward it — or because an auditor asked — loses\n * the copy, mints no `attachmentId`, records nothing, and gets no warning\n * either, since the bytes did reach the provider exactly as policy said. The\n * two directions are not alike, because only one of them reduces who ends up\n * holding the file.\n *\n * What is left is defensible on its own terms: `storage` keeps bytes off a\n * vendor the app was willing to send them to, which is a thing the client is\n * entitled to ask for and which cannot hurt anyone if the client is lying. A UI\n * that knows this CSV exists to be imported and will never be read by the model\n * is the case that makes a hint worth having at all. The policy hook is the\n * ceiling; the hint may only take the vendor out from under it.\n *\n * A hint the policy does not permit throws rather than being ignored. Ignoring\n * it is the shape of this bug that never gets found: the client believes it kept\n * a file off the vendor, the file went anyway, and nothing anywhere says so.\n */\nfunction narrowDestination(\n policy: AttachmentDestination,\n hint: FormDataEntryValue | null,\n): AttachmentDestination {\n if (typeof hint !== \"string\" || hint.length === 0) {\n return policy;\n }\n if (hint !== \"both\" && hint !== \"provider\" && hint !== \"storage\") {\n throw new Error(\n `Unknown attachment destination \"${hint}\". Expected \"both\", \"provider\" or \"storage\".`,\n );\n }\n if (hint === policy || (policy === \"both\" && hint === \"storage\")) {\n return hint;\n }\n if (policy === \"both\" && hint === \"provider\") {\n throw new Error(\n 'This upload asked for the \"provider\" destination under a \"both\" policy. A client may ask for \"storage\", which keeps a file away from the model provider, but it may not ask the server to stop keeping its own copy while the vendor still gets the file — that is the app\\'s retention decision. Change `attachmentDestination()` if this file should not be kept.',\n );\n }\n throw new Error(\n `This upload asked for the \"${hint}\" destination, but the server's policy for it is \"${policy}\", and a client hint may only ask for \"storage\" under a \"both\" policy. Change \\`attachmentDestination()\\` if the file really should go there.`,\n );\n}\n\n/**\n * Said once per process, not once per upload.\n *\n * The condition is a property of how the app is wired — an agent route with no\n * authentication and no `threadId` on its uploads — so it is either true for\n * every request or false for every request. Logging it per request would put a\n * line in the log for every file anyone ever uploads, which is how a warning\n * stops being read.\n */\nlet warnedAboutUnscopedUpload = false;\nfunction warnUnscopedUploadOnce(): void {\n if (warnedAboutUnscopedUpload) return;\n warnedAboutUnscopedUpload = true;\n console.warn(\n \"[gemi/ai] An upload had no attachment scope, so its bytes were sent to the model provider only and no attachment id was minted — a tool cannot forward this file. Guard the route with auth, send a `threadId` with the upload, or override `attachmentScope()`.\",\n );\n}\n\n// --- routing -------------------------------------------------------------\n//\n// `agent()` itself belongs on ApiRouter next to `resource()`, which is the\n// method it works like: one call, several routes, all of them the controller's.\n// The types are declared here because they are the ai module's contract, not\n// the router's.\n//\n// class Api extends ApiRouter {\n// routes = {\n// \"/chat\": this.agent(ChatAgentController),\n// };\n// }\n//\n// POST /chat → stream every client turn\n// POST /chat/attach → attach reattach to a run in progress\n// POST /chat/stop → stop explicit cancel\n// POST /chat/files → upload attachments\n//\n// Mounting under a single path is what gives the client one key to name. The\n// agent's tool types ride along on `AgentRoute`, so `useChat(\"/chat\")` gets them\n// out of the existing `RPC` interface — no second augmentation to generate, and\n// renaming the route moves the client key with it.\n\nexport type AgentRouteMethod = \"stream\" | \"attach\" | \"stop\" | \"upload\";\n\nexport type AgentMiddlewareConfig = Partial<Record<AgentRouteMethod, MiddlewareInput>>;\n\n/**\n * What `this.agent(Controller)` returns. `T` is unconstrained so that mounting\n * the route never resolves the controller (#774): an agent whose tools are\n * routes of the same api would otherwise resolve the api's route table from\n * inside it. That `T` is an `AgentController` class is checked when the route\n * is mounted: `this.agent()` throws otherwise.\n */\nexport type AgentRoute<T> = {\n __internal_brand: \"AgentRoute\";\n controller: T;\n middleware(config: AgentMiddlewareConfig): AgentRoute<T>;\n};\n\n/** What `CreateRPC` should produce for an agent route: enough for the client to\n * type its messages, and nothing that drags server code into the bundle. */\nexport type AgentRouteRPC<T extends new () => AgentController<any, any>> = {\n __agent: true;\n // In their JSON form (#1107): what the browser holds is what came over the\n // wire, so a `Date` in a tool's output or preview is a `string` there.\n tools: InstanceType<T>[\"agent\"] extends AnyAgent\n ? JsonToolShapes<AgentToolShapes<InstanceType<T>[\"agent\"]>>\n : ToolShapes;\n output: unknown;\n /**\n * The controller's `Body`, so `useChat` can check what it sends against what\n * the controller declared.\n *\n * Read off the phantom key rather than by matching the class, which is what\n * made this fail: `Body` used to reach the instance type only through\n * `instructions`'s second parameter, and a controller overriding\n * `instructions(req)` — the pre-existing signature, so every existing\n * override — gave inference nothing to work with and got the open record.\n */\n body: InstanceType<T> extends { [BODY]?: infer B } ? B : Record<string, unknown>;\n};\n\n// --- the voice route (#921) ----------------------------------------------\n//\n// class Api extends ApiRouter {\n// routes = {\n// \"/chat\": this.agent(ChatController),\n// \"/chat/voice\": this.voice(ChatController),\n// };\n// }\n//\n// POST /chat/voice → voiceStart create the call\n// PATCH /chat/voice/:sessionId → voiceUpdate the session's body\n// DELETE /chat/voice/:sessionId → voiceEnd hang up\n//\n// One key for the client, `useVoiceSession(\"/chat/voice\")`, as `useChat` has.\n\nexport type VoiceRouteMethod = \"start\" | \"update\" | \"end\";\n\nexport type VoiceMiddlewareConfig = Partial<Record<VoiceRouteMethod, MiddlewareInput>>;\n\n/** What `this.voice(Controller)` returns. Unconstrained `T` for the reason\n * `AgentRoute`'s is (#774); checked when the route is mounted. */\nexport type VoiceRoute<T> = {\n __internal_brand: \"VoiceRoute\";\n controller: T;\n middleware(config: VoiceMiddlewareConfig): VoiceRoute<T>;\n};\n\n/** What `CreateRPC` produces for a voice route: the controller's `Body`, for\n * `useVoiceSession`'s `body` option. */\nexport type VoiceRouteRPC<T extends new () => AgentController<any, any>> = {\n __voice: true;\n body: InstanceType<T> extends { [BODY]?: infer B } ? B : Record<string, unknown>;\n};\n\n/** The longest delay `setTimeout` keeps; past it the runtime fires in ~1ms. */\nconst MAX_TIMEOUT_MS = 2 ** 31 - 1;\n\n/**\n * Settles when `work` does or after `ms`, whichever is first, and never\n * rejects. For how long the request waits on the app's code, not for the code\n * itself, which runs on either way.\n *\n * An `ms` a timer cannot hold — `Infinity` is what \"no bound\" reads as — is\n * no bound. Handed to `setTimeout` it would fire at once, and the request\n * would end before the hooks it was raised for.\n */\nfunction within(work: Promise<void>, ms: number): Promise<void> {\n const settled = work.then(\n () => {},\n () => {},\n );\n if (!(ms <= MAX_TIMEOUT_MS)) {\n return settled;\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<void>((resolve) => {\n timer = setTimeout(resolve, ms);\n });\n return Promise.race([settled, timeout]).finally(() => clearTimeout(timer));\n}\n\nlet warnedInMemoryNonces = false;\n\n/**\n * Once per process, in production: a stateless chat whose answers are spent\n * only in this process's memory. Correct for a single instance, which is why\n * it is a warning; with several, a rewound history replays an approval once\n * per instance (#445).\n */\nfunction warnInMemoryNonces(nonces: NonceStore): void {\n if (warnedInMemoryNonces || process.env.NODE_ENV !== \"production\") return;\n if (!(nonces instanceof MemoryNonceStore)) return;\n warnedInMemoryNonces = true;\n console.warn(\n \"[gemi/ai] A stateless agent chat is spending approval nonces in process memory. \" +\n \"With more than one instance a replayed approval is accepted once per instance. \" +\n \"Set `nonces = new RedisNonceStore()` (or your own NonceStore) on the AgentController.\",\n );\n}\n\n/** Whether any message holds a tool result still waiting on a background job. */\nfunction hasRunningResult(messages: AgentMessage[]): boolean {\n return messages.some((message) =>\n message.content.some((part) => part.type === \"tool-result\" && part.status === \"running\"),\n );\n}\n"
|
|
39
|
+
"import { Storage } from \"../facades/Storage\";\nimport { Controller } from \"../http/Controller\";\nimport { refusal, RequestBreakerError } from \"../http/Error\";\nimport { HttpRequest } from \"../http/HttpRequest\";\nimport { RequestContext } from \"../http/requestContext\";\nimport { mediaType } from \"../http/mediaType\";\nimport { refusalKindForStatus } from \"../http/refusal\";\nimport type { MiddlewareInput } from \"../http/middlewareList\";\nimport type { AgentResource } from \"../http/ResourcePolicy\";\nimport type {\n AgentContext,\n AgentRun,\n AgentRunResult,\n AgentToolShapes,\n AnyAgent,\n ContextOf,\n PrepareStepContext,\n PrepareStepResult,\n ReasoningEffort,\n SkillDefinition,\n ToolEntry,\n ToolShapesOf,\n} from \"./Agent\";\nimport type { ContextWindowOptions } from \"./contextWindow\";\nimport { modelOutputOf } from \"./toolModelOutput\";\nimport { isSummaryStore, type ThreadSummary } from \"./contextCompaction\";\nimport { injectedMessageIds, toolCallInputOf } from \"./Agent\";\nimport {\n type Attachment,\n ATTACHMENT_ID_PREFIX,\n type AttachmentDestination,\n attachmentObjectName,\n type AttachmentScope,\n type AttachmentStorage,\n type AttachmentStore,\n defaultAttachmentStore,\n newAttachmentId,\n ScopedAttachments,\n} from \"./store/Attachments\";\nimport {\n FrameCursorEvictedError,\n liveRuns as defaultLiveRuns,\n LiveRunNotFoundError,\n MemoryLiveRuns,\n} from \"./store/LiveRuns\";\nimport {\n defaultFileOwners,\n type FileOwnerRecord,\n type FileOwners,\n MemoryFileOwners,\n} from \"./store/FileOwners\";\nimport {\n defaultNonceStore,\n MemoryNonceStore,\n type NonceModel,\n type NonceRedisClient,\n type NonceStore,\n PrismaNonceStore,\n type PrismaNonceStoreOptions,\n RedisNonceStore,\n type RedisNonceStoreOptions,\n} from \"./store/Nonces\";\nimport {\n MemoryReceiptStore,\n type ReceiptClaim,\n type ReceiptRedisClient,\n type ReceiptStore,\n RedisReceiptStore,\n type RedisReceiptStoreOptions,\n} from \"./store/Receipts\";\nimport { defaultAgentStore, MemoryAgentStore } from \"./store/MemoryAgentStore\";\nimport { normalizeProviderError, ProviderHttpError } from \"./providers/errors\";\nimport { redactError, unredactedError } from \"./redact\";\nimport type { ErrorRedactionInfo } from \"./redact\";\nimport { encodeFrame, sseHeaders, sseKeepalive, sseResponse } from \"./store/sse\";\nimport { settleInterrupted, TurnJournal } from \"./store/TurnJournal\";\nimport { AgentJobs } from \"./jobs/AgentJob\";\nimport { markOrphans, overlayJobs } from \"./jobs/overlay\";\nimport { DEFAULT_JOBS_CONTEXT_MAX, renderJobsBlock } from \"./jobs/contextBlock\";\nimport type { AgentJobRecord } from \"./jobs/AgentJobStore\";\nimport type { AgentMemoryScopes } from \"./memory/runMemory\";\nimport type { AgentUsageLimits } from \"./usageLimits\";\nimport type { Schema } from \"./Schema\";\nimport { RealtimeRequestError, type RealtimeSession } from \"./providers/realtime\";\nimport type { VoiceConfig } from \"./voiceConfig\";\nimport { defaultVoiceStore, type VoiceSessionRecord, type VoiceSessionStore } from \"./voiceStore\";\nimport { emptyUsage } from \"./runtime\";\nimport { mcpVoiceTools } from \"./voiceMcp\";\nimport { DEFAULT_DELEGATE_NAME, VoiceBridge, voiceTools } from \"./VoiceBridge\";\nimport type { VoiceStartResponse } from \"./voice/wire\";\nimport type {\n AgentError,\n AgentMessage,\n AgentStreamEvent,\n ClientTurn,\n JsonToolShapes,\n PendingToolCall,\n ToolResultPart,\n ToolShapes,\n} from \"./types\";\n\n// --- storage -------------------------------------------------------------\n\n/**\n * Where conversations live.\n *\n * Stateless is the default and nothing here is required to hold a conversation:\n * the client can carry its own history, and a pending approval travels in it\n * safely because the server signed it. What a store buys is a conversation that\n * survives the browser — and, with `/attach`, one whose interrupted turn is\n * still there after a refresh.\n */\nexport interface AgentStore {\n /**\n * Where a `threadId` comes from. `ApiRouter.agent()` mounts no route for\n * this: the app writes one, calls it here, and hands the id to `useChat` —\n * the mount is the app's because it is where ownership gets recorded, and a\n * store that holds no user cannot do that for it. An id that did not come out\n * of here is `null` from `loadThread` and a 404 from the controller, unless\n * the store's ids are the client's by design (`MemoryAgentStore`'s\n * `clientOwnedIds`).\n */\n createThread(params: { userId?: string | number }): Promise<{ threadId: string }>;\n /**\n * The history, or `null` for a thread the store does not have.\n *\n * `null` and `[]` are different answers and the controller acts on the\n * difference: an empty array is a conversation with nothing in it yet, and a\n * turn on it runs; `null` is a 404 before anything runs. A store that answers\n * `[]` for an id it has never seen turns an expired or mistyped thread into a\n * fresh conversation with no signal, and persists the next turn under the\n * dead id. Only a store whose ids are minted by the client should do that,\n * and then on purpose — see `MemoryAgentStore`'s `clientOwnedIds`.\n */\n loadThread(threadId: string): Promise<AgentMessage[] | null>;\n /**\n * Upsert by message id: replace a message the thread already holds, append\n * one it does not, and keep the order the thread had. Called with a thread\n * `loadThread` just found; must not create one.\n *\n * The name says append because that is what almost every call is, but a\n * turn that resolves a pending call reports the earlier assistant message\n * again — same id, now with the result attached — and a store that only\n * appends ends up with both versions. A table keyed by message id has the\n * lookup already but still needs an insert-or-update rather than a plain\n * insert, which would fail on the key; a store that is a list has to look\n * before it pushes.\n *\n * It is also called while a turn runs, not only when it ends (#617): with the\n * user's message as the run starts, with the assistant message in progress\n * (no `finishReason`, the run's id in `runId`) as it opens and at each tool\n * call and result, and with each message again once it is finished. The\n * same message arrives several times, and the last write is the one to\n * keep. Calls for one run never overlap: each waits for the one before.\n */\n appendMessages(threadId: string, messages: AgentMessage[]): Promise<void>;\n /**\n * Delete these messages from the thread; ids it does not hold are ignored.\n *\n * What a threaded `regenerate` needs (#451): the server owns the history,\n * so the answer being replaced has to leave the store, or the model reads\n * `user: X, assistant: A, user: X` and writes a follow-up instead of a new\n * answer. The controller calls it under the thread's lock with the last user\n * turn and everything after it, then runs that turn again.\n *\n * Optional so a store written before it still compiles; without it a turn\n * with `regenerate: true` on a thread is a 501 `regenerate_unsupported`.\n */\n removeMessages?(threadId: string, messageIds: string[]): Promise<void>;\n /**\n * Optional: where `contextWindow.compact` keeps the thread's summaries\n * (#782), so they live, and are deleted, with the thread. Implement both to\n * opt in; without them summaries go to `defaultSummaryStore`, in memory.\n * Same contract as `SummaryStore`.\n */\n loadSummaries?(threadId: string): Promise<ThreadSummary[]>;\n saveSummary?(threadId: string, summary: ThreadSummary): Promise<void>;\n /** Optional cross-process lock for one cut. See `SummaryStore.lockSummary`. */\n lockSummary?(\n threadId: string,\n cutMessageId: string,\n ttlMs: number,\n ): Promise<(() => Promise<void>) | null>;\n /**\n * Optional (#1177): the same store bound to one scope (a tenant key). Every\n * read and write of the returned store is inside that scope, and a thread of\n * another scope is one it does not have. What `storeScope()` needs.\n */\n forScope?(scope: string): AgentStore;\n}\n\n/** The default: conversations last as long as the process. */\nexport { defaultAgentStore, MemoryAgentStore };\n\n/** The attachment half of the same story. See `store/Attachments.ts`. */\nexport {\n type Attachment,\n type AttachmentDestination,\n AttachmentNotFoundError,\n type AttachmentScope,\n type AttachmentStorage,\n type AttachmentStore,\n defaultAttachmentStore,\n InvalidAttachmentScopeError,\n MemoryAttachmentStore,\n type PutAttachmentParams,\n ScopedAttachments,\n type ToolAttachmentPut,\n type ToolAttachmentRecord,\n type ToolAttachments,\n} from \"./store/Attachments\";\n\n/**\n * The runs currently in flight, and their frames.\n *\n * A run outlives the request that started it, so something has to hold it while\n * no one is listening, and hold what it emitted meanwhile so a returning client\n * can catch up rather than start over. That is all this is: a per-process map\n * plus a bounded buffer.\n *\n * Per-process is not an implementation shortcut that a better store fixes — a\n * running generator lives in one process, and a second server cannot attach to\n * it. Reattachment therefore needs the request to land where the run is: one\n * server, sticky routing, or a proxy that forwards by `runId`. Worth saying out\n * loud, because the failure mode behind a round-robin load balancer is a\n * refresh that usually works.\n *\n * This is the read side, which is all `attach` and `stop` need. Registering a\n * run and replaying its buffer are on `MemoryLiveRuns`, the only implementation\n * there can be — see the note there for why a second one would not help.\n */\nexport interface LiveRuns {\n /** What the client asks after a refresh: is anything still going here? */\n find(params: { threadId: string }): Promise<{ runId: string; seq: number } | null>;\n get(runId: string): AgentRun | null;\n /** Kept for a short while after `run-end`, so a refresh a second late still\n * sees the tail instead of an empty screen. */\n ttlMs: number;\n}\n\nexport {\n FrameCursorEvictedError,\n LiveRunNotFoundError,\n MemoryLiveRuns,\n defaultLiveRuns as liveRuns,\n};\n\n/** Who uploaded each provider file id (#443). See `store/FileOwners.ts`. */\nexport { defaultFileOwners, type FileOwnerRecord, type FileOwners, MemoryFileOwners };\n/** Where approved tools' executions are recorded (#458). See `store/Receipts.ts`. */\nexport {\n MemoryReceiptStore,\n type ReceiptClaim,\n type ReceiptRedisClient,\n type ReceiptStore,\n RedisReceiptStore,\n type RedisReceiptStoreOptions,\n};\n/** Where answered calls' nonces are spent (#445). See `store/Nonces.ts`. */\nexport {\n defaultNonceStore,\n MemoryNonceStore,\n type NonceModel,\n type NonceRedisClient,\n type NonceStore,\n PrismaNonceStore,\n type PrismaNonceStoreOptions,\n RedisNonceStore,\n type RedisNonceStoreOptions,\n};\n\n// --- controller ----------------------------------------------------------\n\nexport type AgentHookContext = {\n /**\n * The request that started the turn. Its `state` is the turn's own typed\n * state (#887): a value set in `authorizeRequest()`, `instructions()` or\n * `context()` (`req.state.set(key, value)`) is read here with\n * `ctx.req.state.get(key)`, instead of a `WeakMap` keyed on the request.\n * A request answering an approval is a new turn and starts with none.\n */\n req: HttpRequest<any, any>;\n runId: string;\n threadId?: string;\n};\n\n/**\n * The call a tool result answers, as `onToolResult` gets it (#1079): the same\n * shape `onToolCall` gets. `input` is what the model sent, before the tool's\n * schema parsed it, so a call refused for a mis-typed argument has it too.\n */\nexport type ToolResultCall = {\n toolCallId: string;\n name: string;\n input: unknown;\n};\n\n/**\n * What `AgentController.startTurn` takes (#839).\n */\nexport type AgentTurnParams<Body extends object = Record<string, unknown>> = {\n /** The thread the turn is stored on, as a turn from `useChat` would be. */\n threadId: string;\n /** The user's message. Shorthand for `turn: { text }`, and wins over `turn.text`. */\n text?: string;\n /**\n * The whole turn, for files or answers: `{ text, files, toolResults }`, as\n * `useChat` sends it. Neither `text` nor `turn` is a turn with nothing in\n * it, which lets the model continue the thread.\n */\n turn?: ClientTurn;\n /**\n * Who the turn runs as: `req.ctx().user` for `authorizeRequest`, `runOwner`,\n * `context()`, the hooks and every tool, as the authentication middleware\n * would have set it. Absent or `null` is an anonymous turn.\n */\n user?: unknown;\n /** What `useChat`'s `body` option would send: `instructions()`, `context()` and `ctx.body` read it. */\n body?: Body;\n /**\n * The store scope (tenant key) the turn's thread is in (#1177), for a\n * controller whose store is scoped. Wins over `storeScope()`, which still\n * answers when this is absent: it gets the request built for the turn, with\n * `user` and `body`.\n */\n scope?: string;\n /**\n * What to do when the thread already has a run going (#1178). See\n * `AgentTurnBusyPolicy`. Defaults to `\"supersede\"`, what a resend from the\n * chat does.\n */\n ifBusy?: AgentTurnBusyPolicy;\n /**\n * Something that happened, in place of a person's message (#1181): a job\n * finished, a record changed. Stored as a user message with\n * `message.event` set (`{ name, data }`) and `text` as its text; the model\n * reads it as `<event name=\"…\">`, and a UI can render it apart from what\n * the person wrote. Not with `text` or `turn`.\n */\n event?: AgentTurnEvent;\n};\n\n/** What `startTurn({ event })` takes (#1181). */\nexport type AgentTurnEvent = {\n /** Letters, digits and `.`, `_`, `:`, `-`, at most 64: `\"job-settled\"`. */\n name: string;\n /** What the model is told happened. */\n text?: string;\n /** Plain JSON data, stored with the message and shown to the model after `text`. */\n data?: unknown;\n};\n\n/** What `AgentTurnEvent.name` may be. */\nconst EVENT_NAME = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$/;\n\n/**\n * What `startTurn` does on a thread that is busy: a run still going, or a\n * turn setting up on it (#1178).\n *\n * - `\"supersede\"` (the default) stops the running run and starts once its\n * transcript is stored, as a resend from the chat does.\n * - `\"queue\"` lets the running run finish, then starts, so the turn sees that\n * run's messages. Queued turns start in the order they were queued, each\n * after the one before has ended. A queued turn holds nothing while it\n * waits: a person who sends meanwhile still supersedes the running run, and\n * the queued turn then waits for theirs too. Per process, like the thread's\n * lock.\n * - `\"skip\"` starts nothing and answers `{ skipped: true }`.\n */\nexport type AgentTurnBusyPolicy = \"supersede\" | \"queue\" | \"skip\";\n\n/** What `startTurn({ ifBusy: \"skip\" })` answers when the thread was busy. */\nexport type AgentTurnSkipped = {\n skipped: true;\n threadId: string;\n};\n\n/** A turn `AgentController.startTurn` started. */\nexport type AgentTurn = {\n runId: string;\n threadId: string;\n /** The run: iterate it (or its `frames()`) to follow the turn as it goes. */\n run: AgentRun;\n /** What the chat's stop button does. */\n stop(params?: { reason?: string }): void;\n /**\n * Settles when the run has ended, its transcript is stored and the\n * controller's hooks have run (or `hookHoldMs` has passed). Rejects only if\n * the run itself does; a failed model call resolves with `finishReason:\n * \"error\"` and `error`, as `AgentRun.result()` does.\n */\n result(): Promise<AgentTurnResult>;\n};\n\n/**\n * A message of the controller's threads, as `readThread` answers it (#1100):\n * typed by the agent's tools, so it goes into the route's\n * `useChat({ initialMessages })` with no cast. The tools' outputs, progress\n * and previews are in their JSON form (`JsonToolShapes`, #1107), as the\n * thread store hands them back and as `useChat` types them.\n *\n * A controller whose agent is not known (`AgentController`, or the\n * `AgentController<any, any>` bound the route helpers use, or an agent whose\n * tools have no literal names) answers `AgentMessage<any>`. `AgentMessage` is invariant in its tool shapes (a\n * message of an agent with more tools has parts a narrower one does not\n * expect), so a typed answer fits neither `AgentMessage<ToolShapes>` nor\n * `AgentMessage<AgentToolShapes<AnyAgent>>`, and a concrete controller would\n * no longer fit those bounds.\n */\nexport type ThreadMessage<A> = 0 extends 1 & A\n ? AgentMessage<any>\n : A extends AnyAgent\n ? // `AnyAgent`'s shapes (and an untyped tool list's) are an index signature.\n string extends keyof AgentToolShapes<A>\n ? AgentMessage<any>\n : // Re-checked against `ToolShapes` because the mapping over a generic\n // agent's shapes cannot show it keeps `input` and `output`.\n JsonToolShapes<AgentToolShapes<A>> extends infer J extends ToolShapes\n ? AgentMessage<J>\n : never\n : AgentMessage<any>;\n\n/** What `AgentTurn.result()` answers: the run's result, and what a caller reads off it. */\nexport type AgentTurnResult = AgentRunResult<ToolShapes, unknown> & {\n threadId: string;\n /** The text of the run's last assistant message; `\"\"` when it wrote none. */\n text: string;\n /**\n * The calls waiting for an answer when `finishReason` is\n * `\"awaiting-input\"`, and `[]` otherwise. They stay on the thread, signed\n * for the turn's `runOwner`: that user can answer them in the chat, or the\n * caller can with another `startTurn({ turn: { toolResults } })`.\n */\n pending: PendingToolCall[];\n};\n\n/**\n * A turn `startTurn` could not start: what the route would have answered,\n * thrown. `status` and `code` are the route's (`404` `thread_not_found`,\n * `429` `too_many_runs`, `403` for another owner's run or file...).\n */\nexport class AgentTurnError extends Error {\n readonly status: number;\n readonly code?: string;\n readonly kind?: string;\n\n constructor(message: string, params: { status: number; code?: string; kind?: string }) {\n super(message);\n this.name = \"AgentTurnError\";\n this.status = params.status;\n this.code = params.code;\n this.kind = params.kind;\n }\n\n /** @internal Reads a refusal `stream` answered. */\n static async from(response: Response): Promise<AgentTurnError> {\n let error: Record<string, unknown> = {};\n try {\n const parsed = (await response.json()) as { error?: Record<string, unknown> };\n if (parsed?.error && typeof parsed.error === \"object\") error = parsed.error;\n } catch {\n // Not a JSON refusal: the status says what there is to say.\n }\n const text = (key: string) => (typeof error[key] === \"string\" ? (error[key] as string) : undefined);\n return new AgentTurnError(\n text(\"message\") ?? `The agent turn was refused with status ${response.status}.`,\n { status: response.status, code: text(\"code\"), kind: text(\"kind\") },\n );\n }\n}\n\n/** `Body` of a controller instance type, as `AgentRouteRPC` reads it. */\ntype ControllerBody<C> = C extends { [BODY]?: infer B }\n ? B extends object\n ? B\n : Record<string, unknown>\n : Record<string, unknown>;\n\n/** The text of the last assistant message among `messages`, or `\"\"`. */\nfunction lastAssistantText(messages: AgentMessage[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (message.role !== \"assistant\") continue;\n return message.content\n .map((part) => (part.type === \"text\" ? part.text : \"\"))\n .join(\"\");\n }\n return \"\";\n}\n\n/** What `AgentController.attachmentLimits` answers. Both optional. */\nexport type AttachmentLimits = {\n /** The largest file accepted, in bytes. */\n maxBytes?: number;\n /** `<input accept>` entries: `\".pdf\"`, `\"image/*\"`, `\"text/csv\"`. */\n accept?: string[];\n};\n\n/** The file `AgentController.checkUpload` is asked about: what it is, not its bytes. */\nexport type UploadCheckFile = {\n /** The file's name as the client sent it, `\"upload\"` when it sent none. */\n name: string;\n /** In bytes. */\n size: number;\n /** As the client sent it, `\"application/octet-stream\"` when it sent none. */\n mimeType: string;\n};\n\n/**\n * What an upload hook is told beyond the request (#836): the client's `body`\n * option (what `attachmentScope` gets) and the thread the upload is for, when\n * the store knows it.\n */\nexport type UploadContext<Body extends object = Record<string, unknown>> = {\n body: Body;\n /** Only a thread the store found; an id it has never seen is left out. */\n threadId?: string;\n};\n\n/**\n * What `AgentController.checkUpload` returns to refuse a file. Answered **422**\n * with `{ error: { code, message } }`, which `useChat().attach()` rejects with\n * as an `AttachError` carrying the same `code` and `message`.\n */\nexport type UploadRefusal = {\n /** A code the composer can switch on. `\"upload_refused\"` when left out. */\n code?: string;\n /** The sentence the person reads. */\n message: string;\n};\n\n/**\n * What `POST /<path>/files` answers.\n *\n * TWO IDS, AND THEY ARE NOT INTERCHANGEABLE. `fileId` is the *provider's* id and\n * means exactly what it always meant — the value a `FilePart` carries so the\n * model can see the file. `attachmentId` is *gemi's*, and is the handle a tool\n * resolves through `ScopedAttachments` to get the bytes back. A file can have\n * both, and usually does.\n *\n * `fileId` stays first and stays named that on purpose: `useChat.uploadFile`\n * already reads it, apps already put it in a `FilePart`, and renaming it or\n * folding the two into one id would break vision for every existing app while\n * looking like a tidier API. The two ids exist because there are two systems\n * holding the file.\n *\n * Both are optional, and `destination` says which to expect: `provider` has no\n * `attachmentId` (nothing was kept), `storage` has no `fileId` (the provider\n * never saw it, so there is nothing for a `FilePart` to point at), `both` has\n * both.\n *\n * `destination` ALONE IS NOT ENOUGH TO SAY WHY AN ID IS MISSING, which is why\n * `downgraded` is here. An upload that reached a route with no authentication\n * and no `threadId` answers `destination: \"provider\"` — truthfully, that is\n * where the bytes went — and so does a controller that deliberately returns\n * `\"provider\"` from `attachmentDestination`. Those two answers were byte\n * identical, and they are the opposite situations: one is the app's policy\n * working, the other is the app's policy silently not applying because the\n * server could not tell who was calling. The server logs the second one once\n * per process; the client saw nothing at all. `downgraded` is the difference,\n * carried in the answer so a client — or an integration test — can assert on\n * it.\n */\nexport type UploadResult = {\n /** The provider's id, for a `FilePart`. Absent when the file never went there. */\n fileId?: string;\n /** gemi's id, for a tool. Absent when nothing was kept — see `attachmentScope`. */\n attachmentId?: string;\n name: string;\n mimeType: string;\n size: number;\n destination: AttachmentDestination;\n /**\n * Set only when the app's policy asked for a copy and the request had no\n * subject to file it under, so the upload fell back to the provider alone.\n * Absent when `destination` is what the app actually chose.\n *\n * A string rather than `true` because there is exactly one reason today and\n * there will be more (a store that refused the write, say), and a boolean\n * that later needs a reason beside it is two fields where one would have\n * done.\n */\n downgraded?: \"no_scope\";\n};\n\n/**\n * `Controller.kind` is typed as the literal `\"controller\"`, so a subclass that\n * declares a `kind` of its own fails the static-side check (TS2417). Widening\n * it belongs in `http/Controller.ts`, which this slice does not own; erasing\n * the static side of the base here is the smaller change and costs nothing —\n * `Controller.kind` has no reader, in this package or out of it.\n */\nconst ControllerBase = Controller as new () => Controller;\n\n/**\n * The thread a `stream` is setting up on, to the setup ahead of it. Module\n * level because the controller is constructed per request, so nothing on it\n * can be seen by the next request; keyed by thread rather than held on\n * `liveRuns` because it guards the controller's protocol, not the frames. An\n * entry is removed once the last setup queued on it releases.\n */\nconst threadLocks = new Map<string, Promise<void>>();\n\n/**\n * Each run to the promise that its transcript has been stored. Weak, so a run\n * the map has evicted is not kept alive here for a promise nobody will ask for.\n */\nconst persisted = new WeakMap<AgentRun, Promise<void>>();\n\n/**\n * The run a `startTurn` request started, by that request (#839). `stream`\n * answers a `Response`, which is what a route needs; `startTurn` needs the run\n * itself and the promise that its hooks are done, and this is how it gets them\n * without `stream` growing a second return shape. Weak, so a request nobody\n * reads back leaves nothing behind.\n */\nconst serverTurns = new WeakMap<\n HttpRequest<any, any>,\n { run: AgentRun; hooks: Promise<void> } | null\n>();\n\n/** The `scope` each `startTurn` was given, by the request it built (#1177). */\nconst serverTurnScopes = new WeakMap<HttpRequest<any, any>, string>();\n/** `startTurn`'s busy policy, by the request it built (#1178). A route's turn has none: it supersedes. */\nconst busyPolicies = new WeakMap<HttpRequest<any, any>, AgentTurnBusyPolicy>();\n\n/**\n * `startTurn`'s event, by the request it built (#1181). Kept off the request's\n * body on purpose: a client posting to the route cannot write one.\n */\nconst serverEvents = new WeakMap<HttpRequest<any, any>, AgentTurnEvent>();\n\n/** What `withThread` answers a `\"skip\"` turn on a busy thread. Never sent: `startTurn` reads it. */\nconst THREAD_BUSY = \"thread_busy\";\n\n/** The URL of the request `startTurn` builds. Nothing routes to it. */\nconst SERVER_TURN_URL = \"http://gemi.internal/__gemi/agent-turn\";\n\n/**\n * Turns read but not yet registered, by the client's name for them.\n *\n * A run can be stopped from `register` on, and named from `run-start` on. What\n * `/stop` could not reach was a turn still waiting its place on the thread —\n * which is where a user who sent twice and thought better of it presses stop,\n * and the wait is now as long as the old run's unwind. Falling through to\n * `threadId` there found the old run, already stopping, said `stopped: true`,\n * and the queued turn started anyway: unwatched, billing, and with no handle\n * left on the client that had let go of it. The entry is marked rather than\n * removed, because the turn itself is what answers once its wait is over.\n */\nconst pendingTurns = new Map<string, { cancelled: boolean; owner: string | null }>();\n\n// --- limits (#444) -------------------------------------------------------\n\n/** `AgentController.maxBodyBytes`'s default. */\nexport const DEFAULT_MAX_BODY_BYTES = 4 * 1024 * 1024;\n/** `AgentController.maxHistoryMessages`'s default. */\nexport const DEFAULT_MAX_HISTORY_MESSAGES = 1000;\n/** `AgentController.maxConcurrentRuns`'s default. */\nexport const DEFAULT_MAX_CONCURRENT_RUNS = 5;\n/** The cap on `attach` and `stop` bodies, which carry ids and nothing else. */\nconst SMALL_BODY_BYTES = 64 * 1024;\n\nconst noop = () => {};\n\n/**\n * The runs each `runLimitKey` has going, by lane: a thread is one lane however\n * many turns are queued or superseding on it, and a stateless turn is a lane\n * of its own. A lane is held from the moment its turn is admitted until its\n * last run ends.\n */\nclass RunSlots {\n private byKey = new Map<string, Map<string, number>>();\n\n /**\n * Admits a turn in `lane` for `key`, or answers `null` when `key` already\n * holds `limit` other lanes. Synchronous, so two turns arriving together\n * cannot both see the last free slot. The function it returns frees the\n * turn's hold; calling it twice is harmless.\n */\n take(key: string, lane: string, limit: number): (() => void) | null {\n let lanes = this.byKey.get(key);\n if (!lanes?.has(lane) && (lanes?.size ?? 0) >= limit) {\n return null;\n }\n if (!lanes) {\n lanes = new Map();\n this.byKey.set(key, lanes);\n }\n lanes.set(lane, (lanes.get(lane) ?? 0) + 1);\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const current = this.byKey.get(key);\n const count = (current?.get(lane) ?? 1) - 1;\n if (!current) return;\n if (count > 0) {\n current.set(lane, count);\n } else {\n current.delete(lane);\n if (current.size === 0) this.byKey.delete(key);\n }\n };\n }\n}\n\n/**\n * Slots are counted per `liveRuns` registry rather than per process: the\n * registry is what holds the runs being counted, and an app (or a test) with\n * two registries has two sets of runs.\n */\nconst runSlots = new WeakMap<object, RunSlots>();\n/**\n * Who is watching each thread (`POST /<path>/watch`, #1180), per `liveRuns`\n * registry like `runSlots`: a run is announced to the watchers of the\n * registry it was registered in. Per process, like the runs themselves.\n */\nconst threadWatchers = new WeakMap<object, Map<string, Set<(runId: string) => void>>>();\n\nfunction watchersFor(liveRuns: object): Map<string, Set<(runId: string) => void>> {\n let watchers = threadWatchers.get(liveRuns);\n if (!watchers) {\n watchers = new Map();\n threadWatchers.set(liveRuns, watchers);\n }\n return watchers;\n}\n\n/** Tells the thread's watchers a run started on it. Never throws: a watcher is a stream that may be gone. */\nfunction announceRun(liveRuns: object, threadId: string, runId: string): void {\n const listeners = threadWatchers.get(liveRuns)?.get(threadId);\n if (!listeners) return;\n for (const listener of [...listeners]) {\n try {\n listener(runId);\n } catch {\n // A closed stream; its cancel removes it.\n }\n }\n}\n\nfunction runSlotsFor(liveRuns: object): RunSlots {\n let slots = runSlots.get(liveRuns);\n if (!slots) {\n slots = new RunSlots();\n runSlots.set(liveRuns, slots);\n }\n return slots;\n}\n\n/**\n * The key that carries `Body` on the instance type.\n *\n * A `declare const` unique symbol, so it exists only in the type layer — the\n * same device `Schema.ts` uses for its output type, and for the same reason: a\n * real property would be one an app could see, serialise or depend on.\n */\ndeclare const BODY: unique symbol;\n\n/**\n * What `authorizeRequest` is told about the request, per route.\n *\n * A union on `route` because `body` exists on only two of them: `stream` and\n * `upload` carry the client's `body` option, `attach` and `stop` carry none.\n * Typing it optional everywhere would make every reader of `body.pageId` on\n * `stream` write a check for a case that cannot happen there; narrowing on\n * `route` says which case it is. An override written against the older\n * `{ route; threadId? }` shape still accepts every member.\n */\nexport type AuthorizeRequestParams<Body extends object = Record<string, unknown>> =\n | { route: \"stream\" | \"upload\"; threadId?: string; body: Body }\n | { route: \"attach\" | \"stop\"; threadId?: string; body?: undefined };\n\n/**\n * What `AgentController.runTools()` answers for a turn (#1123): tools added to\n * the agent's for this run, and which tools the model is offered. Both are\n * optional; see `AgentStreamParams.tools` and `AgentStreamParams.activeTools`.\n */\nexport type AgentRunTools = {\n tools?: readonly ToolEntry[];\n activeTools?: readonly string[];\n};\n\n/**\n * HOOKS SHARED BY SEVERAL AGENT CONTROLLERS (#989), assigned to a controller's\n * `hooks`. Each one stands in for gemi's default of the controller method with\n * the same name, and takes the same arguments. See `AgentController.hooks`.\n *\n * Plain functions, not methods: they get no `this`. What one hook leaves for\n * another in the same turn (a charge made in `context`, settled in\n * `onStreamComplete`) goes on `req.state`, which every hook reaches\n * (`ctx.req.state` in the event hooks).\n */\nexport type AgentControllerHooks<Body extends object = object, Ctx = AgentContext> = {\n authorizeRequest?: (\n req: HttpRequest<any, any>,\n params: AuthorizeRequestParams<Body>,\n ) => void | Promise<void>;\n runOwner?: (req: HttpRequest<any, any>) => string | null | Promise<string | null>;\n runLimitKey?: (\n req: HttpRequest<any, any>,\n params: { owner: string | null; threadId?: string },\n ) => string | null | Promise<string | null>;\n instructions?: (\n req: HttpRequest<any, any>,\n extra: { body: Body },\n ) => string | Promise<string> | void;\n reasoning?: (\n req: HttpRequest<any, any>,\n extra: { body: Body },\n ) => ReasoningEffort | void | Promise<ReasoningEffort | void>;\n skills?: (\n req: HttpRequest<any, any>,\n extra: { body: Body },\n ) => readonly SkillDefinition[] | void | Promise<readonly SkillDefinition[] | void>;\n runTools?: (\n req: HttpRequest<any, any>,\n extra: { body: Body; context: Ctx },\n ) => AgentRunTools | void | Promise<AgentRunTools | void>;\n usageLimits?: (\n req: HttpRequest<any, any>,\n extra: { body: Body; context: Ctx },\n ) => AgentUsageLimits | void | Promise<AgentUsageLimits | void>;\n /** Builds the run's context. `Ctx` is the agents' (see `defineAgentHooks`). */\n context?: (req: HttpRequest<any, any>, extra: { body: Body }) => Ctx | Promise<Ctx>;\n memoryScopes?: (\n req: HttpRequest<any, any>,\n extra: { body: Body },\n ) => AgentMemoryScopes | Promise<AgentMemoryScopes>;\n prepareStep?: (\n step: PrepareStepContext<Ctx>,\n ctx: AgentHookContext,\n ) => PrepareStepResult | void | Promise<PrepareStepResult | void>;\n attachmentScope?: (\n req: HttpRequest<any, any>,\n threadId?: string,\n extra?: { body: Body },\n ) => AttachmentScope | null | Promise<AttachmentScope | null>;\n attachmentLimits?: (\n req: HttpRequest<any, any>,\n ) => AttachmentLimits | null | Promise<AttachmentLimits | null>;\n checkUpload?: (\n file: UploadCheckFile,\n req: HttpRequest<any, any>,\n ctx: UploadContext<Body>,\n ) => UploadRefusal | null | void | Promise<UploadRefusal | null | void>;\n attachmentDestination?: (\n file: File,\n req: HttpRequest<any, any>,\n extra?: UploadContext<Body>,\n ) => AttachmentDestination | Promise<AttachmentDestination>;\n onMessage?: (message: AgentMessage, ctx: AgentHookContext) => void | Promise<void>;\n onToolCall?: (\n call: { toolCallId: string; name: string; input: unknown },\n ctx: AgentHookContext,\n ) => void | Promise<void>;\n onToolResult?: (\n result: ToolResultPart,\n ctx: AgentHookContext,\n call: ToolResultCall,\n ) => void | Promise<void>;\n onAwaitingInput?: (pending: PendingToolCall[], ctx: AgentHookContext) => void | Promise<void>;\n redactError?: (error: AgentError, info: ErrorRedactionInfo, ctx: AgentHookContext) => AgentError;\n onError?: (error: AgentError, ctx: AgentHookContext) => void | Promise<void>;\n onStreamComplete?: (\n result: AgentRunResult<any, any>,\n ctx: AgentHookContext,\n ) => void | Promise<void>;\n reportHookFailure?: (error: unknown) => void;\n};\n\n/**\n * Types an `AgentControllerHooks` object for the `Body` its controllers take,\n * so each hook's parameters are typed without annotating them (#989). It\n * returns the object unchanged.\n *\n * ```ts\n * export const chatHooks = defineAgentHooks<{ pageId: string }>({\n * runOwner: (req) => teamOwner(req),\n * async onStreamComplete(result, ctx) {\n * await settle(result, ctx.req.state.get(charge));\n * },\n * });\n * ```\n *\n * A controller whose `Body` has at least these fields can use it.\n *\n * `Ctx` types a shared `context` hook (and `prepareStep`'s `step.context`) for\n * agents with a context of their own (#1019): `defineAgentHooks<PageBody,\n * PageContext>({ context: ... })`. It defaults to the app's `AgentContext`.\n * Hooks that build no context fit any controller, whatever its agent's.\n */\nexport function defineAgentHooks<Body extends object = object, Ctx = AgentContext>(\n hooks: AgentControllerHooks<Body, Ctx>,\n): AgentControllerHooks<Body, Ctx> {\n return hooks;\n}\n\nexport abstract class AgentController<\n A extends AnyAgent = AnyAgent,\n /**\n * The extra fields `useChat`'s `body` option sends with every turn, as they\n * arrive in `instructions()` and on `ctx.body`.\n *\n * Declaring it also types the client: `useChat` reads it back off the route\n * through `AgentRouteRPC`, so a `body` the controller does not expect is a\n * compile error at the call site rather than an `undefined` three layers\n * into a tool. It types the shape, not the contents — see `instructions`.\n *\n * Constrained to `object`, not `Record<string, unknown>`: an `interface` gets\n * no implicit index signature, so the tighter bound refused\n * `interface PageBody { pageId: string }` with a `TS2344` that names the\n * constraint and not the reason. An interface is how most apps write a request\n * shape, and turning that into a puzzle about `type` versus `interface` is a\n * poor first impression of the feature.\n */\n Body extends object = Record<string, unknown>,\n> extends ControllerBase {\n static kind = \"agent-controller\" as const;\n\n /**\n * `Body`, in a position nothing can shorten away.\n *\n * It has to appear on the instance type for `AgentRouteRPC` to infer it, and\n * `instructions`'s second parameter is not a safe place to leave that job:\n * TypeScript's parameter-wise inference stops at the shorter signature, so a\n * controller overriding `instructions(req)` — which is every override written\n * before this existed, since that was the only signature — supplied no\n * candidate and silently fell back to the open record. The client-side\n * checking then vanished on the most ordinary upgrade path, with nothing to\n * read.\n *\n * `declare` so it emits no field: there is no value here, only a type for\n * `infer B` to find. Optional and never assigned, so no subclass has to\n * mention it.\n */\n declare readonly [BODY]?: Body;\n\n /** The agent this controller serves. A property rather than a constructor\n * argument so `Router.agent(ChatController)` can take the class, matching how\n * every other controller is mounted. */\n abstract agent: A;\n\n /**\n * HOOKS SHARED WITH OTHER CONTROLLERS (#989), so an app's chats can share\n * their authorization, run owner, upload rules and billing without an\n * app-level base class between them and this one. Assign a module-level\n * object made with `defineAgentHooks`:\n *\n * export const chatHooks = defineAgentHooks<{ pageId: string }>({\n * authorizeRequest: (req, params) => authorizePage(req, params),\n * runOwner: (req) => teamOwner(req),\n * });\n *\n * class PageChatController extends AgentController<typeof pageAgent, PageBody> {\n * agent = pageAgent;\n * hooks = chatHooks;\n * }\n *\n * Each hook stands in for gemi's default of the method with the same name.\n * A method the controller overrides itself wins over the hook, and reaches\n * it with `super.method(...)`, exactly as it would reach a base class's.\n * Unset (the default), every method is gemi's own.\n *\n * Hooks of any `Ctx` are accepted, so a controller whose agent has a\n * context of its own (#1019) can share hooks that build none. Such a\n * controller builds its context in its own `context()`, which is checked\n * against the agent; a shared `context` hook is checked only against the\n * `Ctx` its `defineAgentHooks` names.\n */\n protected hooks?: AgentControllerHooks<Body, any>;\n\n /**\n * Defaults to the process-wide `MemoryAgentStore`.\n *\n * Whatever you put here, make it something that outlives the request: this\n * controller is constructed fresh for every call, so `store = new\n * MemoryAgentStore()` written here is an empty store on every turn and a\n * threaded conversation silently reads back nothing. Assign a module-level\n * instance, or a store whose state is somewhere else entirely.\n */\n store: AgentStore = defaultAgentStore;\n\n /**\n * THE STORE SCOPE OF THIS REQUEST (#1177): a tenant key (an organisation,\n * workspace or app id) that keeps the tenant's threads apart from every\n * other's. When it answers one, `stream` and `upload` use\n * `store.forScope(scope)` instead of `store`, so a thread of another scope\n * is a 404 like an unknown id, and `attach` and `watch` answer 404 for a\n * thread not in the scope (they carry no `body`: it is `{}` there). `null`\n * (the default) uses `store` as it is.\n *\n * ```ts\n * protected storeScope(req, { body }) {\n * return `org:${req.ctx().user.orgId}`;\n * }\n * ```\n *\n * Called once per request, before the store is first read, with the\n * client's `body` (the same unchecked claim `authorizeRequest()` gets): derive\n * the scope from the authenticated user where you can. Server-started turns\n * (`startTurn`, voice) come through here too, with the turn's `user` and\n * `body`; `startTurn({ scope })` passes one explicitly, which wins. The store\n * must implement `forScope` (`DatabaseAgentStore` and `MemoryAgentStore`\n * do); one that does not is an error.\n */\n protected storeScope(\n req: HttpRequest<any, any>,\n params: { body: Body },\n ): string | null | Promise<string | null> {\n void req;\n void params;\n return null;\n }\n\n /**\n * The scope this instance's `store` was bound to by its request, `null` for\n * an unscoped one, `undefined` before any. The scoped view lives on the\n * instance because everything a run does after the request (the journal,\n * the transcript, a queued turn) reads `this.store`. That is safe because\n * gemi builds a controller per request: the router, `startTurn` and the\n * voice bridge (which calls `startTurn`) all construct a fresh one.\n */\n private boundScope: string | null | undefined = undefined;\n\n /**\n * For the routes that do not read the store (`attach`, `watch`): whether\n * the thread is in this request's scope. Always true when the request has\n * none, so an unscoped controller still never consults the store there.\n */\n private async threadInScope(req: HttpRequest<any, any>, threadId: string): Promise<boolean> {\n // Neither route carries the app's `body`.\n await this.scopeStore(req, {} as Body);\n if (this.boundScope === null) return true;\n return (await this.store.loadThread(threadId)) !== null;\n }\n\n /**\n * Swaps `store` for its scoped view, once per request. An instance reused\n * for a request in another scope (app code calling `stream` twice on one\n * controller) is refused rather than handed the first request's view, or\n * left to rescope the store under a run that is still going.\n */\n private async scopeStore(req: HttpRequest<any, any>, body: Body): Promise<void> {\n const explicit = serverTurnScopes.get(req);\n const scope = explicit ?? (await this.storeScope(req, { body })) ?? null;\n if (this.boundScope !== undefined) {\n if (this.boundScope !== scope) {\n throw new Error(\n \"This AgentController instance already served a request in another store scope. Build a controller per request (the router and startTurn do).\",\n );\n }\n return;\n }\n if (scope !== null) this.store = scopedStore(this.store, scope);\n this.boundScope = scope;\n }\n\n /**\n * Defaults to the process-wide map. Overridable so a test — or an app running\n * two agents that must not see each other's runs — can hold its own; not so\n * that it can be moved off the process, which is not a thing that can be\n * done. See `MemoryLiveRuns`.\n */\n liveRuns: MemoryLiveRuns = defaultLiveRuns;\n\n /**\n * VOICE (#921): what `this.voice(Controller)` needs to run voice calls in\n * front of this agent. Absent, the voice routes answer 404. See\n * `VoiceConfig` and `docs/ai-voice.md`.\n */\n voice?: VoiceConfig<Body>;\n\n /**\n * Where voice sessions are recorded, so a `PATCH` or `DELETE` that lands on\n * another instance finds the call. Defaults to the process-wide\n * `MemoryVoiceSessionStore`: assign a shared one when more than one instance\n * serves the route.\n */\n voiceStore: VoiceSessionStore = defaultVoiceStore;\n\n /**\n * Where attachment *records* live — the row that says which bytes, whose, and\n * under what id. Defaults to the process-wide `MemoryAttachmentStore`, with\n * the same warning `store` carries: assign something that outlives the\n * request, because this controller is constructed per call.\n */\n attachments: AttachmentStore = defaultAttachmentStore;\n\n /**\n * Where an attachment's *bytes* live. Defaults to the app's configured\n * `FileStorage` through the `Storage` facade, which resolves the driver per\n * call out of the container — so an app that configured S3 gets S3 here\n * without saying so twice.\n *\n * Overridable mostly for tests and for an app that keeps user uploads in a\n * different bucket from everything else.\n */\n attachmentStorage: AttachmentStorage = Storage;\n\n /**\n * Who uploaded each provider file id (#443). `upload` records the id under\n * `runOwner(req)`, and `stream` refuses a turn whose files name an id\n * recorded for another owner with a 403 `{ error: { kind: \"permission\",\n * message, status } }`. Defaults to the process-wide `MemoryFileOwners`; the\n * same warning as `store` applies — assign something that outlives the\n * request. An app with several processes, or that wants the binding to\n * survive a restart, gives it a table (see `FileOwners`).\n */\n fileOwners: FileOwners = defaultFileOwners;\n\n /**\n * Where the nonce of each answered approval or question is spent, which is\n * what makes a signed answer single-use (#445). On a stateless chat the\n * client carries its history and can rewind it to before a result existed;\n * the spent nonce is then the only thing that refuses the replayed answer.\n *\n * Defaults to the process-wide `MemoryNonceStore`, which is exact for one\n * instance and forgets on restart. An app running several instances (or\n * behind a load balancer whose affinity is best effort) assigns a shared\n * store, built once at module scope like `store`:\n *\n * const nonces = new RedisNonceStore();\n * class ChatController extends AgentController<typeof chat> {\n * nonces = nonces;\n * }\n *\n * or its own `NonceStore` over a table keyed by the nonce. In production a\n * stateless turn served with the in-memory default logs a warning once.\n */\n nonces: NonceStore = defaultNonceStore;\n\n /**\n * Where approved tools' executions are claimed and their results recorded,\n * so that an approval runs its tool at most once (#458). Off by default.\n *\n * The nonce makes an answer single-use; it does not remember what the tool\n * did. So a retried submit whose response was lost is refused (\"already\n * used\") although the tool acted, and an answer that reaches two instances\n * with unshared nonce stores runs the tool twice. With a receipt store the\n * first presentation claims the execution and records its result; a later\n * one gets that result back without running anything, and one that arrives\n * while the first is still running gets a `tool_error` result for the model.\n *\n * Assign one built at module scope, like `nonces`, shared by every instance:\n *\n * const receipts = new RedisReceiptStore();\n * class ChatController extends AgentController<typeof chat> {\n * receipts = receipts;\n * }\n *\n * or your own `ReceiptStore` over a table (see `store/Receipts.ts`).\n * `MemoryReceiptStore` is exact for one instance only.\n */\n receipts?: ReceiptStore;\n\n /**\n * Whether a turn may name a provider file id that `fileOwners` has no record\n * of. `false` by default, which is what keeps the change additive: an id\n * uploaded before the upgrade, before a restart (with the in-memory default),\n * on another process, or by the app outside `upload` still works, as every id\n * did before. An id that IS recorded for someone else is refused either way.\n *\n * Set it to `true` once `fileOwners` is durable and shared, to make the\n * binding complete: then an id is usable only by the owner it was recorded\n * for, or by anyone when it was recorded as anonymous. On a stateless chat\n * the client carries its history, so this also refuses a file a tool attached\n * earlier in the conversation; a strict app keeps its chats on a thread.\n */\n protected requireKnownFiles = false;\n\n /**\n * How long the request that started a run is held open for its hooks, in\n * milliseconds, once the run has settled. The run itself is not bounded\n * here — the request is held for as long as it runs — only the app's code\n * still going after it, from `onMessage` to an `onAwaitingInput` queued\n * behind a slow `onToolCall`.\n *\n * The hooks read the user from that request (`ctx.req.ctx().user`,\n * `Auth.user()`, a policied query), so the request stays open until they are\n * done; but a hook that never settles — a `fetch` with no timeout — would\n * then hold the store, the user and `onRequestEnd` forever, one per turn. Past\n * this the request ends anyway: `onRequestEnd` runs, the user is released,\n * and the hook runs on without one. Thirty seconds is far past a healthy\n * write or notification, so a hook that reaches it is hung rather than slow.\n * Raise it for a hook that is legitimately longer; `Infinity` holds the\n * request until the hooks are done, however long that is.\n */\n protected hookHoldMs = 30_000;\n\n /**\n * Appended to the agent's static instructions for this request — the user's\n * name, tenant, today's date.\n *\n * `body` is what `useChat`'s `body` option sent, with the four keys the wire\n * format owns removed. It is the only way to read it here: this controller\n * consumes the request body itself, so `await req.input()` answers `Body\n * already used` and takes the whole turn down with it.\n *\n * It is client-controlled, exactly like any request body. `Body` types what\n * arrives, it does not check it — a client can send anything, and a tenant id\n * read from here is the client's claim about which tenant it wants, not the\n * middleware's finding about who it is.\n */\n instructions(req: HttpRequest<any, any>, extra: { body: Body }): string | Promise<string> | void {\n return this.hooks?.instructions?.(req, extra);\n }\n\n /**\n * The reasoning effort for this turn's run (#975), when it should differ\n * from the agent's: a turn the app knows is small, say. Answer nothing to\n * keep the agent's. `prepareStep` can still change it for one model call,\n * and sees this as `step.reasoning`.\n *\n * protected reasoning(req, { body }) {\n * return body.selection ? \"low\" : undefined;\n * }\n *\n * Called once per turn, after `authorizeRequest()`, beside `instructions()`.\n * `body` is client-controlled, as there.\n */\n protected reasoning(\n req: HttpRequest<any, any>,\n extra: { body: Body },\n ): ReasoningEffort | void | Promise<ReasoningEffort | void> {\n return this.hooks?.reasoning?.(req, extra);\n }\n\n /**\n * Skills for this turn's run only (#950), beside the agent's own: the\n * designer's pack of the page being edited, when one agent serves every\n * page. Lowered like the agent's skills, so the model sees each one's name\n * and description and loads the body when it needs it, instead of the whole\n * pack riding in `instructions()` on every turn.\n *\n * protected async skills(req, { body }) {\n * const page = await Page.find(body.pageId); // authorized in authorizeRequest()\n * return page.skillPacks.map((pack) =>\n * Skill.create({ name: pack.slug, description: pack.summary, instructions: () => pack.body() }),\n * );\n * }\n *\n * Called once per turn, after `authorizeRequest()`, beside `instructions()`.\n * Answer nothing for none. A name already used by one of the agent's tools\n * or skills fails the turn. `body` is client-controlled, as there.\n */\n protected skills(\n req: HttpRequest<any, any>,\n extra: { body: Body },\n ): readonly SkillDefinition[] | void | Promise<readonly SkillDefinition[] | void> {\n return this.hooks?.skills?.(req, extra);\n }\n\n /**\n * THE TURN'S TOOLS (#1123): tools added to the agent's for this run, and\n * which of them the model is offered, decided per turn from the request and\n * the run's context.\n *\n * ```ts\n * protected async runTools(req, { context }) {\n * const tenant = context.tenant;\n * return {\n * // The tenant's own tools, built from its configuration.\n * tools: tenant.integrations.map((integration) => integrationTool(integration)),\n * // A feature that is off is not offered at all.\n * activeTools: tenant.billingEnabled ? undefined : everythingBut(\"billing\"),\n * };\n * }\n * ```\n *\n * Called once per turn, after `context()` (whose answer it is handed) and\n * before anything is asked of the model, on turns from `useChat`,\n * `startTurn` and voice alike. Answer nothing for the agent's own tools,\n * all offered: the default. A name that clashes with the agent's, or an\n * `activeTools` entry naming no tool, fails the turn. A turn that answers a\n * pending call of a run tool has to return that tool again. `body` is\n * client-controlled, as in `instructions()`.\n */\n protected runTools(\n req: HttpRequest<any, any>,\n extra: { body: Body; context: ContextOf<A> },\n ): AgentRunTools | void | Promise<AgentRunTools | void> {\n return this.hooks?.runTools?.(req, extra);\n }\n\n /**\n * THE TURN'S USAGE LIMITS (#1124): budgets on what its run may spend, its\n * own and shared ones under keys this decides (the user, the tenant, the\n * month), and `onUsage` to hear what was spent.\n *\n * ```ts\n * protected usageLimits(req, { context }) {\n * const month = new Date().toISOString().slice(0, 7);\n * return {\n * run: { tokens: 200_000, toolCalls: 50 },\n * scopes: [{ key: `tenant:${context.tenantId}:${month}`, limit: { tokens: 5_000_000 } }],\n * store: this.usageStore, // shared across instances\n * onUsage: (report) => Billing.record(context.tenantId, report.delta.tokens),\n * };\n * }\n * ```\n *\n * Called once per turn, after `context()` (whose answer it is handed), on\n * turns from `useChat`, `startTurn` and voice alike. A run over a limit\n * ends with the error code `\"usage_limit\"` (`onError` and `result().error`\n * carry `usageLimit`, which says which limit); a scope already spent ends\n * the turn before the model is called. Answer nothing for no limits: the\n * default. See `AgentUsageLimits`.\n */\n protected usageLimits(\n req: HttpRequest<any, any>,\n extra: { body: Body; context: ContextOf<A> },\n ): AgentUsageLimits | void | Promise<AgentUsageLimits | void> {\n return this.hooks?.usageLimits?.(req, extra);\n }\n\n /**\n * What every tool of this turn's run gets as `ctx.context` — the user, the\n * tenant, functions the tools call back into. See `AgentContext`.\n *\n * TYPED BY THE AGENT (#1019): it returns `ContextOf<A>`, the context the\n * agent declares (`withContext`), or what its tools need. A field or a\n * function the agent needs and this leaves out is a compile error on the\n * override. This is where the controller's injected services become the\n * functions the tools call:\n *\n * ```ts\n * constructor(private pages = PageEditor.inject()) { super(); }\n *\n * context(req, { body }) {\n * return {\n * pageId: body.pageId,\n * edit: (instruction: string) => this.pages.edit(body.pageId, instruction),\n * };\n * }\n * ```\n *\n * The same method builds the context of a chat turn, a `startTurn`, and a\n * voice call's delegated turns, so all of them are typed by it.\n *\n * The run is not given the request, so this is where the request's facts\n * become the run's: read the user the middleware authenticated here, and a\n * tool reads it from `ctx.context` instead of reaching for `req`. Runs after\n * `authorizeRequest()`, once per turn, and before anything is asked of the\n * model.\n *\n * The default is `{}`. An agent whose context has a required field needs\n * this overridden (or a `context` hook): TypeScript cannot make an inherited\n * method abstract for some agents only, so not overriding it at all is a\n * tool that finds the field missing, not a compile error. What an override\n * returns is checked.\n *\n * Values from `body` are the client's claim, exactly as in `instructions()`;\n * putting one here does not make it any more trustworthy, only easier to\n * mistake for something the server decided.\n */\n context(\n req: HttpRequest<any, any>,\n extra: { body: Body },\n ): ContextOf<A> | Promise<ContextOf<A>> {\n const hook = this.hooks?.context;\n if (hook) return hook(req, extra);\n return {} as ContextOf<A>;\n }\n\n /**\n * THE MEMORY SCOPES THIS TURN MAY USE (#936): the labels the agent declares\n * in `memory.scopes`, each resolved to the app's scope key for this caller.\n *\n * ```ts\n * protected async memoryScopes(req, { body }) {\n * const user = req.ctx().user;\n * const project = await Project.forPage(body.pageId); // authorized in authorizeRequest()\n * return {\n * project: project.memoryOff ? null : `project:${project.publicId}`,\n * user: user && !user.memoryOff ? `user:${user.publicId}` : null,\n * };\n * }\n * ```\n *\n * The model only ever names a label; the key is decided here, on the\n * server, from the request — the same defence `attachmentScope()` gives\n * attachments. A label answered with `null`, or left out, is OFF for the\n * turn: it is not in the `<memory>` block and the tools cannot name it, so\n * a per-account or per-project \"memory off\" switch is a `null` here. A\n * declared `thread` label is the turn's thread (`thread:<threadId>`) unless\n * this answers it.\n *\n * Runs after `authorizeRequest()` and `context()`, once per turn, on turns\n * from `useChat`, `startTurn` and voice alike. The default is `{}`: memory\n * stays off until a controller resolves something. Not called for an agent\n * without `memory`. Values read from `body` are the client's claim, as in\n * `context()`: check them (in `authorizeRequest()` or here) before turning\n * one into a key.\n */\n protected memoryScopes(\n req: HttpRequest<any, any>,\n extra: { body: Body },\n ): AgentMemoryScopes | Promise<AgentMemoryScopes> {\n const hook = this.hooks?.memoryScopes;\n if (hook) return hook(req, extra);\n return {};\n }\n\n /**\n * The `<memory>` block's budget, in tokens, for this controller's turns.\n * `undefined` (the default) uses the agent's `memory.maxTokens` (1,500\n * unless it says otherwise); `0` leaves the block out.\n */\n protected memoryMaxTokens: number | undefined = undefined;\n\n /**\n * Refuse a turn that arrives without a `threadId`, with a 400\n * `thread_required`, before anything runs.\n *\n * A stateless turn is otherwise open to any caller the route's middleware\n * lets through: the client carries the history, so the model runs, and is\n * billed, as a general-purpose chat. An app whose tools resolve their subject\n * from the thread can make them refuse such a turn, but the model has still\n * been paid for by then.\n *\n * It governs `stream` only. `upload` can still reach the provider without a\n * thread (a `provider` destination); refuse that in `authorizeRequest`.\n */\n protected requireThread = false;\n\n /**\n * The largest JSON body `stream` reads, in bytes (#444). Default 4 MB.\n *\n * A turn is a few kilobytes; even a long stateless chat carrying its whole\n * history is well under a megabyte, since files travel by id and not inline.\n * Without a cap the route read whatever arrived (the production server\n * accepts up to 10 GB), parsed it, and sent it to the provider at the app's\n * expense. A body over it is refused with a 413 `{ error: { kind, message,\n * status, code: \"body_too_large\" } }` before it is parsed, and before\n * `authorizeRequest`. Checked against `Content-Length` when there is one and\n * against the bytes read otherwise, so a chunked body cannot get past it.\n * `attach` and `stop` carry only ids and are held to 64 KB. `Infinity` turns\n * it off.\n */\n protected maxBodyBytes = DEFAULT_MAX_BODY_BYTES;\n\n /**\n * The most messages a stateless turn's client-carried history may hold\n * (#444). Default 1000. A longer one is a 413 `history_too_long` before\n * anything runs. Only `body.messages` counts: a threaded turn reads its\n * history from the store, which the client does not write. Every message is\n * sent to the model on every step, so this bounds what one turn can be billed\n * for as much as `maxBodyBytes` does. `Infinity` turns it off.\n */\n protected maxHistoryMessages = DEFAULT_MAX_HISTORY_MESSAGES;\n\n /**\n * Bounds what each model call of this controller's turns is sent (#473):\n * the latest turns of the thread that fit, cut at a turn start, the cut\n * moving `step` turns at a time so the prompt cache keeps hitting. See\n * `ContextWindowOptions`. `undefined` (the default) uses the agent's own\n * `contextWindow`, if it has one; `false` sends the whole history.\n *\n * The store is untouched: `loadThread` still answers the whole thread, every\n * message is still appended, and `readThread` shows all of it. Unlike\n * `maxHistoryMessages`, which refuses a stateless turn, this applies to\n * threaded and stateless turns alike and refuses nothing.\n *\n * protected contextWindow = { maxTurns: 40, maxTokens: 100_000 };\n */\n protected contextWindow: ContextWindowOptions | false | undefined = undefined;\n\n /**\n * Called before every model call of a turn's run, after the agent's own\n * `prepareStep`, with the request it hands over (`step.messages`,\n * `step.instructions`) and the turn's hook context. Answer `{ messages }`,\n * `{ instructions }`, `{ reasoning }` or `{ maxOutputTokens }` to send\n * something else for that call alone; nothing answered is stored. Not called for a sub-agent's model calls.\n *\n * protected prepareStep(step: PrepareStepContext) {\n * return { messages: windowMessages(step.history, { maxTurns: 20 }).messages };\n * }\n */\n protected prepareStep(\n step: PrepareStepContext<ContextOf<A>>,\n ctx: AgentHookContext,\n ): PrepareStepResult | void | Promise<PrepareStepResult | void> {\n return this.hooks?.prepareStep?.(step, ctx);\n }\n\n /**\n * How many runs one caller may have going at once in this process (#444).\n * Default 5. A run outlives the request that started it (so `attach` can\n * find it), which means a client can post a turn and disconnect and the run\n * still bills up to `maxSteps` model calls; without a cap, a thousand posts\n * were a thousand runs.\n *\n * Counted per `runLimitKey` (by default `runOwner`, the authenticated user),\n * and per conversation rather than per request: every turn on one thread is\n * one slot, because a thread holds one run at a time and a new turn there\n * supersedes the old one rather than adding to it. So a user resending\n * mid-answer is never refused; a user with five chats answering at once and\n * starting a sixth is, with a 429 `{ error: { kind: \"rate_limit\", message,\n * status, code: \"too_many_runs\" } }`, after `authorizeRequest` and before the\n * model is asked anything. A slot is freed when the run ends (stopped, timed\n * out, or finished). `Infinity` turns it off.\n */\n protected maxConcurrentRuns = DEFAULT_MAX_CONCURRENT_RUNS;\n\n /**\n * Who `maxConcurrentRuns` counts a turn against (#444). The default is\n * `runOwner`'s answer, the authenticated user; `null` is not counted.\n *\n * An anonymous turn is therefore not limited by default, because there is\n * nothing sound to count it under: a client address is the proxy's unless\n * `GEMI_TRUST_PROXY` is set, which would put every visitor in one bucket, and\n * the session cookie is the visitor's to drop. An app that serves anonymous\n * chats returns its own key here (`ip:${clientIp(req)}` behind a trusted\n * proxy, say), sets `requireThread`, or puts `RateLimitMiddleware` on the\n * route.\n */\n protected runLimitKey(\n req: HttpRequest<any, any>,\n params: { owner: string | null; threadId?: string },\n ): string | null | Promise<string | null> {\n const hook = this.hooks?.runLimitKey;\n if (hook) return hook(req, params);\n return params.owner;\n }\n\n /**\n * Decides whether this caller may use this route, on every one of the four:\n * `stream`, `attach`, `stop` and `upload` (#542). Throw a request breaker\n * (`InsufficientPermissionsError`, say) to refuse; return to let it through.\n *\n * It runs before the route does any work of its own: on `stream`, ahead of\n * the thread's lock and load, `instructions()` and the provider, so a refused\n * turn is not charged for, waits behind no run and does not learn whether its\n * thread exists; on `attach`, before a live run's frames are read.\n *\n * `threadId` is the one the client sent, taken on trust and not yet checked\n * against the store — which is what makes this the place to check that the\n * caller owns it. A thread-scoped app that checks it here on every route\n * keeps a thread's live answer, its stop button and its attachments to its\n * owner. It is `undefined` when the request names no thread: a stateless\n * turn, an upload without one, a stop by `runId` or `clientRunId`.\n *\n * `body` is the client's `body` option — the same object `instructions()`,\n * `context()` and `attachmentScope()` get — on the two routes that carry it,\n * `stream` and `upload` (#603). A chat with no thread and no user names its\n * subject there (a page id, say), and this is where to check that the caller\n * may touch it. `attach` and `stop` carry no body, so it is absent on them;\n * narrow on `route` to read it. Like `threadId` it is the client's claim,\n * unchecked.\n *\n * THE DEFAULT CHECKS `resource`, when there is one, and lets everything\n * through otherwise. An override that also wants it calls\n * `super.authorizeRequest(req, params)`.\n */\n protected authorizeRequest(\n req: HttpRequest<any, any>,\n params: AuthorizeRequestParams<Body>,\n ): void | Promise<void> {\n const hook = this.hooks?.authorizeRequest;\n if (hook) return hook(req, params);\n return this.resource?.authorize(req, params);\n }\n\n /**\n * THE RESOURCE THIS CHAT IS ABOUT, checked on every route by the default\n * `authorizeRequest` (#726): a resource policy's `forAgent`, which names the\n * resource's id in the `body` and the resource a thread belongs to.\n *\n * ```ts\n * resource = PagePolicy.forAgent({\n * body: (body: PageBody) => body.pageId,\n * thread: (threadId) => ChatThread.pageIdOf(threadId),\n * });\n * ```\n *\n * `stream` and `upload` are refused unless the caller may use the resource\n * the body names, and, when they name a thread, unless it is that\n * resource's. `attach` and `stop` are refused unless the caller may use the\n * thread's resource. A refusal is the policy's (a 404 by default), the same\n * for a resource or thread that does not exist. A live run still answers\n * only its `runOwner`.\n */\n protected resource?: AgentResource<Body>;\n\n /**\n * WHO OWNS A RUN THIS REQUEST STARTS, and who a request to `attach` or `stop`\n * one is (#442). An opaque key, compared with `===`; `null` is nobody.\n *\n * `stream` records it on the run, and from then on the run answers only that\n * key: `attach` to it, `stop` of it (by `runId`, `threadId` or `clientRunId`,\n * including a turn still waiting its place), and a turn on its thread that\n * would supersede it while it is still going are each refused with a 403\n * `{ error: { kind: \"permission\", message, status } }` for any other caller.\n * That holds whatever `authorizeRequest` says, which is the point: every\n * handle on a run is one a third party can come to hold (a shared link, a\n * log line, a guessable `clientRunId`), and none of them says whose it is.\n *\n * THE DEFAULT IS THE AUTHENTICATED USER, `user:<id>`, and `null` without one.\n * A `null` owner records an unowned run, which answers whoever holds a\n * handle — exactly what every run did before this existed. So:\n *\n * - an anonymous turn starts an unowned run; its `threadId` stays the\n * capability. `sessionId()` is not used as a fallback: it is a cookie the\n * visitor writes, it can be minted between the turn and the reattach (a\n * view visited in between), and a mismatch would lock a visitor out of\n * their own run. An app with its own anonymous identity returns it here.\n * - a run started by an authenticated user cannot be read or stopped by an\n * anonymous request, nor by another user.\n * - a run the server starts itself (registered on `liveRuns` with no\n * `owner`) is unowned.\n *\n * Override it for anything wider than a user — a thread shared by a team\n * returns `team:<id>` (from the user, never from the body) — or `null` to\n * turn the check off. Whatever it reads must be present on all of `stream`,\n * `attach` and `stop`, the same rule `attachmentScope` states: guard the three\n * routes with the same middleware.\n *\n * It is also the `subject` every pending call of the run is signed for\n * (#447): an approval or answer is accepted only on a turn whose `runOwner`\n * is the one the question was asked of. So it must answer the same on the\n * turn that asks and the turn that answers.\n */\n protected runOwner(req: HttpRequest<any, any>): string | null | Promise<string | null> {\n const hook = this.hooks?.runOwner;\n if (hook) return hook(req);\n const user = req.ctx?.()?.user;\n const userId = user?.id ?? user?.publicId;\n if (userId !== undefined && userId !== null && String(userId) !== \"\") {\n return `user:${String(userId)}`;\n }\n return null;\n }\n\n /**\n * STARTS A TURN FROM SERVER CODE (#839): a queue job, a command, an MCP\n * tool, a webhook. No browser and no route: the turn goes through this\n * controller's `stream` as a `useChat` turn would, on a request built here,\n * so the agent, the store, `authorizeRequest` and `resource`, `runOwner`,\n * `maxConcurrentRuns`, the thread's lock, `instructions()`, `context()`,\n * the hooks and the tools' `ctx` (`threadId`, `ctx.jobs`, `ctx.generate`)\n * are the same as for a turn from the chat.\n *\n * ```ts\n * const turn = await ChatController.startTurn({\n * threadId,\n * text: \"Make the hero darker\",\n * user, // req.ctx().user for the turn\n * body: { siteId }, // what useChat's `body` option would send\n * });\n * const { text, finishReason, pending } = await turn.result();\n * ```\n *\n * The route's middleware does not run: the caller is server code and names\n * the user itself (`null` or absent is an anonymous turn). A turn the route\n * would refuse throws an `AgentTurnError` with the status and code it would\n * have answered; a request breaker thrown by `authorizeRequest` is thrown\n * as it is.\n *\n * The run lives in the process that called this, like every run. From a\n * queue job, await `result()` so the worker does not move on without it.\n *\n * On a thread that already has a run going, the turn supersedes it, as a\n * resend from the chat does. Server code reacting to an event usually\n * should not cut off the answer a person is reading: pass\n * `ifBusy: \"queue\"` to start after it instead, or `ifBusy: \"skip\"` to start\n * nothing (answered `{ skipped: true }`). See `AgentTurnBusyPolicy`. A\n * queued turn's `startTurn` settles once the turn has started.\n */\n static startTurn<C extends AgentController<any, any>>(\n this: new () => C,\n params: AgentTurnParams<ControllerBody<C>> & { ifBusy: \"skip\" },\n ): Promise<AgentTurn | AgentTurnSkipped>;\n static startTurn<C extends AgentController<any, any>>(\n this: new () => C,\n params: AgentTurnParams<ControllerBody<C>> & { ifBusy?: \"supersede\" | \"queue\" },\n ): Promise<AgentTurn>;\n static startTurn<C extends AgentController<any, any>>(\n this: new () => C,\n params: AgentTurnParams<ControllerBody<C>>,\n ): Promise<AgentTurn | AgentTurnSkipped>;\n static async startTurn<C extends AgentController<any, any>>(\n this: new () => C,\n params: AgentTurnParams<ControllerBody<C>>,\n ): Promise<AgentTurn | AgentTurnSkipped> {\n const { threadId } = params;\n if (typeof threadId !== \"string\" || threadId === \"\") {\n throw new TypeError(\n \"AgentController.startTurn needs a `threadId`: a server turn is stored on a thread. Create one with the store's `createThread`.\",\n );\n }\n const ifBusy = params.ifBusy ?? \"supersede\";\n if (ifBusy !== \"supersede\" && ifBusy !== \"queue\" && ifBusy !== \"skip\") {\n throw new TypeError(\n `AgentController.startTurn's \\`ifBusy\\` is \"supersede\", \"queue\" or \"skip\"; got ${JSON.stringify(params.ifBusy)}.`,\n );\n }\n const event = params.event === undefined ? undefined : checkTurnEvent(params);\n const turn: ClientTurn = {\n ...params.turn,\n ...(params.text !== undefined ? { text: params.text } : {}),\n };\n // The app's fields first, so none of them can take the place of the\n // envelope's.\n const payload = { ...(params.body as object | undefined), threadId, turn };\n const req = new HttpRequest<any, any>(\n new Request(SERVER_TURN_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n }),\n {},\n \"api\",\n new URL(SERVER_TURN_URL).pathname,\n );\n const controller = new this();\n // Marks the request as `startTurn`'s, so only its run is kept here.\n serverTurns.set(req, null);\n if (params.scope !== undefined) serverTurnScopes.set(req, params.scope);\n busyPolicies.set(req, ifBusy);\n if (event) serverEvents.set(req, event);\n // A request scope of its own, carrying the caller's user, whether or not\n // this is called from inside another request: the run is not that\n // request's, and must not end with it or read its user.\n const response = await RequestContext.run(req, () => controller.stream(req), {\n user: params.user ?? null,\n });\n\n const started = serverTurns.get(req);\n if (!started) {\n const error = await AgentTurnError.from(response);\n if (ifBusy === \"skip\" && error.code === THREAD_BUSY) {\n return { skipped: true, threadId };\n }\n throw error;\n }\n serverTurns.delete(req);\n // Nobody reads the stream; the run goes on without it (see `toResponse`).\n response.body?.cancel().catch(noop);\n\n const { run, hooks } = started;\n let pending: PendingToolCall[] = [];\n // The pending calls are on the `awaiting-input` event, not on the result.\n // The run's frames are buffered from the start, so this misses nothing.\n const watched = (async () => {\n for await (const event of run) {\n if (event.type === \"awaiting-input\") pending = event.pending as PendingToolCall[];\n }\n })().catch(noop);\n\n let result: Promise<AgentTurnResult> | undefined;\n return {\n runId: run.runId,\n threadId,\n run,\n stop: (stopParams) => run.stop(stopParams),\n result: () =>\n (result ??= (async () => {\n const outcome = await run.result();\n // After the transcript is stored and the hooks are done (or\n // `hookHoldMs` passed), so a caller that reads the thread next sees\n // this turn in it.\n await Promise.all([hooks, watched]);\n const messages = outcome.messages as AgentMessage[];\n return {\n ...outcome,\n threadId,\n text: lastAssistantText(messages),\n pending: outcome.finishReason === \"awaiting-input\" ? pending : [],\n };\n })()),\n };\n }\n\n /**\n * `POST /<path>` — one route for every client turn. A first message, an\n * approval, an answer to a question and a client tool's result are all just\n * the next turn, so none of them gets an endpoint of its own.\n */\n async stream(req: HttpRequest<any, any> = new HttpRequest()): Promise<Response> {\n const parsed = await readJsonBody(req, this.maxBodyBytes);\n if (parsed.error) {\n // Before anything is registered or charged for. A run started off a body\n // we could not read would answer nothing, at the user's expense.\n return invalidRequest(parsed);\n }\n const body = parsed.body;\n const threadId = typeof body.threadId === \"string\" ? body.threadId : undefined;\n const parsedTurn = toClientTurn(body);\n if (parsedTurn.error) {\n return invalidRequest({ body: {}, error: parsedTurn.error });\n }\n // Reassigned by a regenerate: the turn run again is the one the store holds.\n let turn = parsedTurn.turn;\n // Replace the thread's last answer rather than answer after it (#451). Only\n // meaningful on a thread: a stateless client trims its own history.\n const regenerate = threadId !== undefined && body.regenerate === true;\n const clientRunId = typeof body.clientRunId === \"string\" ? body.clientRunId : undefined;\n // The app's fields, separated once and handed to every method that reads\n // them — `authorizeRequest`, `instructions`, `context`, `attachmentScope` —\n // so none of them can disagree about what the client sent. They cannot read\n // it themselves: `readJsonBody` has consumed the request's body by now.\n const extraBody = appBody<Body>(body);\n\n // Before `pendingTurns`, so a refused turn leaves nothing for `/stop` to\n // find. It does not yield, unlike `authorizeRequest` below.\n if (this.requireThread && !threadId) {\n return jsonResponse(400, {\n code: \"thread_required\",\n message: \"This agent takes a turn only on a thread: send a threadId.\",\n });\n }\n\n // Before the first read of the store: every one below is inside the scope.\n await this.scopeStore(req, extraBody);\n\n if (regenerate && !this.store.removeMessages) {\n return jsonResponse(501, {\n code: \"regenerate_unsupported\",\n message:\n \"This agent's store cannot remove messages, so a thread's answer cannot be regenerated. Implement `removeMessages` on the AgentStore.\",\n });\n }\n\n // The client's history is the only part of a stateless turn whose size the\n // client chooses and the model is billed for on every step (#444). A\n // threaded turn's `messages` are ignored, so they are not counted.\n if (\n !threadId &&\n Array.isArray(body.messages) &&\n body.messages.length > this.maxHistoryMessages\n ) {\n return limitResponse(\n 413,\n \"history_too_long\",\n `The conversation has ${body.messages.length} messages; this agent takes at most ${this.maxHistoryMessages}.`,\n );\n }\n\n // Who this run will belong to. Read before `pending` exists, so a stop that\n // finds the pending turn can already be checked against it. See `runOwner`.\n const owner = await this.runOwner(req);\n\n // From here until `register`, the only thing `/stop` can find this turn by.\n // See `pendingTurns`.\n const pending = clientRunId ? { cancelled: false, owner } : null;\n if (pending) {\n pendingTurns.set(clientRunId, pending);\n }\n\n // The whole of the stateless/threaded difference, in one expression: with a\n // thread the server owns the history, without one the client carries it.\n // Nothing else below branches on it, which is why stateless keeps working\n // even for an app that never configures a store.\n //\n // The `threadId` is the client's, and nothing here checks that this caller\n // owns it — `AgentStore` cannot, since it holds no user. A `threadId` is\n // therefore a capability and has to be unguessable (`createThread` mints a\n // uuid) and, for anything that matters, checked: override `authorizeRequest()`\n // or give it a `store` that scopes by `req.user`. The framework's job is to make\n // sure the route is behind the router's middleware in the first place,\n // which `ApiRouter.agent()` now does.\n //\n // Everything from the load on happens inside `start`, which on a thread\n // runs under the thread's lock once the previous run's transcript is in the\n // store — the load has to come after that, or it reads a history the old\n // answer is missing from. `instructions()` follows the load in there rather\n // than running ahead of the lock, so that a dead thread is still a 404\n // before the app's own work is spent on it; the cost is that a turn queued\n // behind this one waits for `instructions()` as well.\n // The run `start` registered, if it got that far: its end is what frees\n // this turn's `maxConcurrentRuns` slot.\n let started: AgentRun | null = null;\n // What a regenerate took out of the thread, kept until the run replacing\n // it has started.\n let removed: AgentMessage[] = [];\n const start = async (): Promise<Response> => {\n try {\n return await startRun();\n } finally {\n // A regenerate that never started its run — stopped while it waited,\n // or a throw from the app's hooks — puts back what it took out, since\n // no new answer is coming to replace it. Still under the thread's lock,\n // and appended at the end, which is where it was: it was the tail.\n if (threadId && removed.length > 0 && (started as AgentRun | null) === null) {\n await this.store\n .appendMessages(threadId, removed)\n .catch((err) => this.reportHookFailure(err));\n }\n }\n };\n const startRun = async (): Promise<Response> => {\n let messages: AgentMessage[];\n // The `<jobs>` block for this turn's system prompt (#461), on a thread\n // that has background jobs.\n let jobsBlock: string | null = null;\n if (threadId) {\n const history = await this.store.loadThread(threadId);\n if (!history) {\n // Before `instructions()` and before the run: nothing has been\n // charged for, and the client has to learn that its thread is gone —\n // expired, mistyped, or on an instance that no longer exists — rather\n // than see it answered as an empty conversation and have this turn\n // persisted under the dead id.\n //\n // That ordering is deliberate. An ownership check belongs in\n // `authorizeRequest()`, which has already run; one left in\n // `instructions()` has not, so a caller holding a uuid learns whether\n // it is live here without the app's say. The id is unguessable, so\n // the load stays above `instructions()`, whose own work (a database\n // read, typically) would otherwise be spent on a thread that is gone.\n // Move it below and that work is spent on every dead id instead.\n return jsonResponse(404, {\n code: \"thread_not_found\",\n message: `Thread ${threadId} does not exist here, or has expired.`,\n });\n }\n // A message a dead run left unfinished is closed here, and written\n // back, before the run is handed the history: the model then reads it\n // as interrupted, and its open calls have results. Under the thread's\n // lock and after the previous run's transcript is stored, so the only\n // unfinished message left is one no run in this process owns.\n const thread = await this.settleThread(threadId, history, { write: true });\n messages = thread.messages;\n jobsBlock = this.jobsBlock(thread.jobs);\n if (regenerate) {\n const cut = regenerationCut(messages);\n if (!cut) {\n return jsonResponse(409, {\n code: \"nothing_to_regenerate\",\n message: `Thread ${threadId} has no user turn to answer again.`,\n });\n }\n // The last user turn and everything after it leave the store, and the\n // turn is run again from what the store held — not from the client's\n // copy, which may be stale or carry local ids. The user message comes\n // back under a new id when the run reports it. Under the thread's\n // lock and after the previous run's transcript is stored, so nothing\n // writes the removed answer back. Each removed message takes its\n // `usage` with it: the thread never holds both answers' costs.\n removed = messages.slice(cut.index);\n await this.store.removeMessages!(\n threadId,\n removed.map((message) => message.id),\n );\n messages = messages.slice(0, cut.index);\n // The stored turn, under the client's `localId` for it: the message\n // is minted again, and the client has to be told the new id (#466).\n turn = turn?.localId ? { ...cut.turn, localId: turn.localId } : cut.turn;\n }\n } else {\n messages = Array.isArray(body.messages) ? (body.messages as AgentMessage[]) : [];\n warnInMemoryNonces(this.nonces);\n }\n\n const instructions =\n [(await this.instructions(req, { body: extraBody })) || undefined, jobsBlock ?? undefined]\n .filter(Boolean)\n .join(\"\\n\\n\") || undefined;\n const context = await this.context(req, { body: extraBody });\n const reasoning = (await this.reasoning(req, { body: extraBody })) || undefined;\n const skills = (await this.skills(req, { body: extraBody })) || undefined;\n const runTools = (await this.runTools(req, { body: extraBody, context })) || undefined;\n const usageLimits = (await this.usageLimits(req, { body: extraBody, context })) || undefined;\n // Above the cancel check, not below it, and that placement is the whole\n // reason this is a separate statement rather than an argument on the call\n // below: the comment on that check says nothing yields between it and\n // `register`, and an `await` for the app's `attachmentScope()` — a\n // database read, in any app that has one — is exactly the yield a stop\n // would land in and be missed.\n const attachments = await this.attachmentsFor(req, threadId, { body: extraBody });\n // For the same reason as `attachments`: an `await` on the app's code,\n // which has to come before the cancel check below.\n const memoryScopes = (this.agent as AnyAgent).memory\n ? await this.memoryScopes(req, { body: extraBody })\n : undefined;\n\n if (pending?.cancelled) {\n // Stopped while it waited. Nothing has been asked of the model and\n // nothing registered, so there is no run to end and nothing charged\n // for. Checked after the last `await` above, so that a stop landing\n // during it is not missed: from here to `register` nothing yields.\n return stoppedBeforeStart();\n }\n\n // Only a threaded turn has anywhere to be written as it runs. See\n // `TurnJournal`.\n const journal = threadId\n ? new TurnJournal(this.store, threadId, messages, (err) => this.reportHookFailure(err))\n : null;\n\n // Chosen here rather than by the run, so the hook context exists before\n // the run does: `redactError` below is handed it, and the run may call\n // it for its first frame.\n const runId = `run_${crypto.randomUUID()}`;\n const ctx: AgentHookContext = { req, runId, threadId };\n\n // The app's `onMessage` for the turn's user message, called while the\n // run goes rather than after it (#806). See `EarlyTurn`.\n const early: EarlyTurn = { id: null, notified: Promise.resolve() };\n\n const run = this.agent.stream({\n runId,\n messages,\n turn,\n threadId,\n // The run reports each message as it finishes it, the user's turn\n // first and before the model is asked anything. Only the store hears\n // about most of them here: the app's `onMessage` runs after the run,\n // in `notifyRun`, except for the turn's own message (below).\n ...(journal ? { onMessage: (message: AgentMessage) => journal.finish(message) } : {}),\n // The turn's user message, once the journal has written it: the app's\n // `onMessage` for it is called now, so whatever the app keeps beside\n // a stored message (where it was sent from, say) is there for a read\n // of the thread while the run is still going (#806). Off the run's\n // path, as the journal is: neither the store nor the hook holds up\n // the model. `notifyRun` waits for it and does not call it again.\n onTurn: (message: AgentMessage) => {\n if (early.id !== null) return;\n early.id = message.id;\n const written = journal ? journal.settled() : Promise.resolve();\n early.notified = written.then(() => this.safely(() => this.onMessage(message, ctx)));\n },\n instructions,\n // A server turn's event (#1181), never the client's: see `serverEvents`.\n ...(serverEvents.has(req) ? { event: serverEvents.get(req)! } : {}),\n // A server turn's message is in no client's copy, so a chat watching\n // the thread is sent it.\n ...(serverTurns.has(req) ? { echoTurn: true } : {}),\n // Only when answered, so the agent's own applies otherwise.\n ...(reasoning ? { reasoning } : {}),\n ...(skills && skills.length > 0 ? { skills } : {}),\n // The turn's own tools and which tools are offered (#1123).\n ...(runTools?.tools && runTools.tools.length > 0 ? { tools: runTools.tools } : {}),\n ...(runTools?.activeTools ? { activeTools: runTools.activeTools } : {}),\n // Budgets on what the run may spend (#1124).\n ...(usageLimits ? { usageLimits } : {}),\n // Built from this request once, here, and the only thing the run knows\n // about who asked. The run has no request of its own — see\n // `AgentContext` — so a tool that needs the user reads it from this.\n context,\n // Resolved once, above, and handed to every tool of the run as\n // `ctx.attachments`. It is derived from the request — the user the\n // middleware authenticated, or the thread — and never from anything the\n // model can write, which is the property that makes an attachment id\n // safe to give a model at all. `null` for a request with no subject:\n // tools still get an object, and it throws with a sentence naming\n // `attachmentScope()`.\n attachments,\n // The same object `instructions()` was handed, so the two cannot\n // disagree about what the client sent — and carried on the run\n // because a run outlives the request that started it. By the time a\n // tool executes, the body is long gone.\n // Cast because `Body` is constrained to `object` so an `interface` can be\n // used, and an interface has no index signature to satisfy\n // `Record<string, unknown>`. The value is a parsed JSON object either\n // way; the constraint is about what an app may declare, not about what\n // arrives.\n body: extraBody as Record<string, unknown>,\n // What the client, and for a tool's exception the model, is told about\n // a failure. See `redactError`.\n redactError: (error, info) => this.redactError(error, info, ctx),\n // Where answers' nonces are spent. See `nonces`.\n nonces: this.nonces,\n // Where approved tools' executions are recorded. See `receipts`.\n receipts: this.receipts,\n // The principal its pending calls are bound to (#447): an answer is\n // only accepted from the same `runOwner` the question was asked of.\n subject: owner,\n // The memory scopes the server resolved for this caller (#936). The\n // model only ever sees their labels.\n ...(memoryScopes\n ? {\n memory: {\n scopes: memoryScopes,\n ...(this.memoryMaxTokens !== undefined ? { maxTokens: this.memoryMaxTokens } : {}),\n },\n }\n : {}),\n // Background jobs (#461) settle into the thread, so only a threaded\n // turn can start one. The job records who started it.\n ...(threadId ? { jobs: { owner } } : {}),\n // What each model call is sent (#473). Only the request: the store\n // still gets every message through `journal` above.\n ...(this.contextWindow !== undefined ? { contextWindow: this.contextWindow } : {}),\n // Where `contextWindow.compact` keeps this thread's summaries, when\n // the store holds them (#782).\n ...(threadId && isSummaryStore(this.store) ? { summaryStore: this.store } : {}),\n // Only when overridden, so a controller without one adds no call.\n ...(this.prepareStep !== AgentController.prototype.prepareStep || this.hooks?.prepareStep\n ? {\n prepareStep: (step: PrepareStepContext) =>\n this.prepareStep(step as PrepareStepContext<ContextOf<A>>, ctx),\n }\n : {}),\n }) as AgentRun;\n\n // Registered before the response is built: the run is now owned by the\n // process rather than by this request, which is the property `/attach`\n // depends on and the reason a dropped connection no longer cancels\n // anything.\n const eventHooks = this.liveRuns.register(run, {\n threadId,\n // Who may attach to it and stop it from now on. See `runOwner`.\n owner,\n // The client's handle on a run it started, which is the only one that\n // exists before `run-start` reaches it. See `RegisterParams`.\n clientRunId,\n onEvent: (event) => this.dispatchEvent(event, ctx),\n onInternalError: (err) => this.reportHookFailure(err),\n // So the registry's age ceiling never cuts short a run its agent\n // allowed to be longer. See `MemoryLiveRuns.maxAgeMs`.\n maxRunDurationMs: this.agent.maxRunDurationMs,\n });\n\n started = run;\n if (journal) this.follow(run, journal);\n // After `register`, so a watcher that attaches on hearing it finds it.\n if (threadId) announceRun(this.liveRuns, threadId, run.runId);\n\n // Kept, not just fired: the next turn on this thread has to know when\n // this one's transcript is in the store. See `withThread`. The request\n // waits for more than the thread does — the hooks as well — so that\n // `onMessage` still finds the user who sent the message; the thread\n // waits only for the store, so a slow hook is not a slow next turn.\n const { stored, hooks } = this.persistRun(run, ctx, eventHooks, journal, early);\n persisted.set(run, stored);\n if (serverTurns.has(req)) serverTurns.set(req, { run, hooks });\n // Registered now, while the request is certainly open: `waitUntil` is\n // ignored once it has ended, and the run settling can end it before a\n // single hook has been called.\n req.ctx?.()?.waitUntil(hooks);\n\n return run.toResponse();\n };\n\n try {\n // After `pending` is registered, not before: the app's check is a yield —\n // a database read, typically — and a stop pressed during it has to find\n // this turn. Before the thread's lock, which ends the thread's previous\n // run, so a refused or stopped turn does not end it either.\n await this.authorizeRequest(req, { route: \"stream\", threadId, body: extraBody });\n // After the app's check, so a caller it refuses does not learn which ids\n // are someone's; before the thread's lock, so a refused turn supersedes\n // nothing. The client's history only counts without a thread: with one,\n // `body.messages` is ignored and the history comes from the store.\n const foreign = await this.foreignFile(\n [...(turn?.files ?? []), ...(threadId ? [] : clientHistoryFiles(body.messages))],\n owner,\n );\n if (foreign) {\n return foreign;\n }\n if (pending?.cancelled) {\n return stoppedBeforeStart();\n }\n // After the app's check, so a refused caller spends no slot; before the\n // thread's lock, so a turn over the limit waits behind nothing. No yield\n // between the count and the take: see `RunSlots.take`.\n const limitKey = await this.runLimitKey(req, { owner, threadId });\n const release =\n limitKey === null\n ? noop\n : runSlotsFor(this.liveRuns).take(\n limitKey,\n threadId ? `thread:${threadId}` : `run:${crypto.randomUUID()}`,\n this.maxConcurrentRuns,\n );\n if (!release) {\n return limitResponse(\n 429,\n \"too_many_runs\",\n `You already have ${this.maxConcurrentRuns} conversations answering. Wait for one to finish, or stop it, and send again.`,\n );\n }\n try {\n return threadId\n ? await this.withThread(threadId, owner, start, busyPolicies.get(req) ?? \"supersede\")\n : await start();\n } finally {\n // A turn that never started a run (a dead thread, stopped while it\n // waited, a throw) frees its slot now; one that did, when the run ends.\n const run = started as AgentRun | null;\n if (run) {\n run.result().then(release, release);\n } else {\n release();\n }\n }\n } finally {\n if (pending && pendingTurns.get(clientRunId) === pending) {\n pendingTurns.delete(clientRunId);\n }\n }\n }\n\n /**\n * A thread holds one run at a time; a new turn on it ends the old one first.\n *\n * Since a dropped connection no longer stops a run, a user who sends again\n * mid-answer used to leave the first run going. It could not see the new\n * turn, the new run's `loadThread` could not see its answer, and both\n * appended when they finished — in whichever order the model returned them,\n * so the thread read `user2, assistant2, user1, assistant1`. `byThread` then\n * named the second run while the first was still live and unstoppable by\n * `threadId`.\n *\n * Stopping the old run and waiting for its transcript to land is chosen over\n * refusing the new turn with a 409, because sending again *is* the stop: it\n * is what `useChat.send` means, and a client that has to poll `/stop` until\n * the run is really gone before it may post the turn it has already shown is\n * a worse client for no better thread. The cost is that the new turn waits\n * for the old run to unwind, which is as long as its slowest tool in flight —\n * and that wait is the thing that puts `assistant1` before `user2`.\n *\n * The wait is on `persistRun`'s `stored`, not on `run.result()`. `result()`\n * settling is the transcript being final, not stored: `appendMessages` runs\n * after it, and a `loadThread` in that gap reads a history the old answer is\n * missing from, which is the original bug by a shorter route. It is also\n * *only* that: `stored` settles once the transcript is stored, and the app's\n * hooks run on in `hooks`, which holds the old run's request and not the\n * thread, so a slow `onMessage` is not a slow thread and a hung one is not a\n * hung thread.\n *\n * The lock around it is what makes a *third* turn wait for the second rather\n * than for the first. Two turns arriving together both see the same live\n * run, both stop it, both wait for it, and both start — the same race, one\n * message later. Under the lock the later one finds the earlier one\n * registered and stops that instead. Per process, like `LiveRuns`, and for\n * the same reason: the run it guards lives here.\n *\n * `startTurn`'s `ifBusy` (#1178) is the one way out of superseding: a\n * `\"queue\"` turn waits for the running run to end (outside the lock, so it\n * holds no one up) and looks again; a `\"skip\"` turn answers `thread_busy`.\n */\n private async withThread(\n threadId: string,\n owner: string | null,\n fn: () => Promise<Response>,\n ifBusy: AgentTurnBusyPolicy = \"supersede\",\n ): Promise<Response> {\n if (ifBusy === \"skip\" && threadLocks.has(threadId)) {\n // A turn is setting up on the thread, or superseding its run: busy.\n return threadBusy(threadId);\n }\n for (;;) {\n const outcome = await this.underThreadLock(threadId, owner, fn, ifBusy);\n if (!(\"waitFor\" in outcome)) return outcome.response;\n // A queued turn (#1178) waits for the run outside the lock, so a person\n // who sends meanwhile is not held up behind it: their turn takes the\n // lock and supersedes the run as usual. Then it takes its own place in\n // the lock's line and looks again, which is what keeps queued turns in\n // order: the first to get the lock starts, and the next finds its run.\n await outcome.waitFor;\n }\n }\n\n /** One pass of `withThread` under the thread's lock: start, or name the run a queued turn waits for. */\n private async underThreadLock(\n threadId: string,\n owner: string | null,\n fn: () => Promise<Response>,\n ifBusy: AgentTurnBusyPolicy,\n ): Promise<{ response: Response } | { waitFor: Promise<unknown> }> {\n const previous = threadLocks.get(threadId) ?? Promise.resolve();\n let release!: () => void;\n const held = new Promise<void>((resolve) => {\n release = resolve;\n });\n const tail = previous.then(() => held);\n threadLocks.set(threadId, tail);\n await previous;\n try {\n const live = await this.liveRuns.find({ threadId });\n if (live && ifBusy !== \"supersede\" && this.liveRuns.isRunning(live.runId)) {\n if (ifBusy === \"skip\") return { response: threadBusy(threadId) };\n const run = this.liveRuns.get(live.runId);\n // Its transcript stored, as for a supersede; a run of another\n // process's registry has no `persisted`, and its end is enough.\n const ended = run ? (persisted.get(run) ?? run.result()) : null;\n if (ended) return { waitFor: ended.then(noop, noop) };\n }\n if (\n live &&\n this.liveRuns.isRunning(live.runId) &&\n !this.liveRuns.mayAccess(live.runId, owner)\n ) {\n // Superseding is a stop, and someone else's run is not this caller's to\n // stop (#442). Only while it is still going: an ended run is kept for\n // `ttlMs` but a turn after it touches nothing of it. Whether this caller\n // may post on the thread at all is `authorizeRequest`'s question.\n return { response: notYourRun() };\n }\n const run = live ? this.liveRuns.get(live.runId) : null;\n if (run) {\n // A run that already ended is still `find`-able for `ttlMs`; stopping\n // it is a no-op and waiting on it is the append it may still be doing.\n run.stop({ reason: \"superseded by a later turn on this thread\" });\n await persisted.get(run);\n }\n return { response: await fn() };\n } finally {\n release();\n if (threadLocks.get(threadId) === tail) {\n threadLocks.delete(threadId);\n }\n }\n }\n\n /**\n * `POST /<path>/attach` — subscribe to a run already in progress, from a\n * cursor. This is a read of a live run, not a continuation of a stopped one:\n * the work never paused, the listener changed.\n *\n * The cursor is `from`, else the client's `cursor`, else `Last-Event-ID`,\n * else the oldest frame still buffered — and it is honoured only for the run\n * the client's `runId` names. A cursor the buffer has dropped is a 410 naming\n * what survives; *no* cursor is the tail, because a page reattaching on mount\n * has no transcript to leave a hole in. See `resolveCursor`.\n */\n async attach(req: HttpRequest<any, any> = new HttpRequest()): Promise<Response> {\n const parsed = await readJsonBody(req, SMALL_BODY_BYTES);\n if (parsed.error) {\n return invalidRequest(parsed);\n }\n const body = parsed.body;\n const threadId =\n typeof body.threadId === \"string\" ? body.threadId : searchParam(req, \"threadId\");\n\n if (!threadId) {\n return jsonResponse(400, {\n code: \"invalid_request\",\n message: \"attach needs a threadId: it is the handle that survives a refresh.\",\n });\n }\n\n // Before the lookup: a refused caller learns neither whether a run is live\n // on the thread nor any frame of it.\n await this.authorizeRequest(req, { route: \"attach\", threadId });\n // A scoped controller (#1177) answers only for its scope's threads: a run\n // on another tenant's thread is a miss here, as no run at all is.\n if (!(await this.threadInScope(req, threadId))) return noLiveRun(threadId);\n\n // Unscoped, the store is not consulted. This route answers whether a run is in\n // flight here, and a run it finds was started on a thread `stream` had\n // already loaded; a miss is `no_live_run` whether or not the thread exists,\n // because a client that gets one re-reads the thread anyway (see\n // `onAttachMiss`) and learns there. The thread's own 404 is `stream`'s,\n // where a turn would otherwise be persisted under it.\n const live = await this.liveRuns.find({ threadId });\n if (live && !this.liveRuns.mayAccess(live.runId, await this.runOwner(req))) {\n // Another caller's run (#442): none of its frames, ended or not.\n return notYourRun();\n }\n if (!live) {\n // An explicit miss, not a 200 with an empty stream. See `MemoryLiveRuns`:\n // behind a round-robin load balancer this is the common case, and it has\n // to be visible as one.\n return noLiveRun(threadId);\n }\n\n // A cursor is only a number if you know which run it counts within: `seq`\n // restarts at zero in every run, so honouring a cursor from run_1 against a\n // live run_2 would skip that many frames off the head of a run this client\n // has seen nothing of. `runId` is the client saying which run its cursor\n // means; naming one that is not live forfeits the cursor and takes the\n // tail, which is as close to the start as the buffer can offer.\n //\n // Only a MISMATCH forfeits. An absent `runId` is not a wrong answer, it is\n // an older question: `from` and `Last-Event-ID` predate the pairing and\n // carry no run, and an `EventSource` reconnecting on its own will never\n // grow one. Those keep resuming exactly as before.\n const cursorRunId = typeof body.runId === \"string\" ? body.runId : undefined;\n const cursor = cursorRunId && cursorRunId !== live.runId ? undefined : resolveCursor(req, body);\n\n try {\n return sseResponse(this.liveRuns.replay(live.runId, cursor));\n } catch (err) {\n if (err instanceof FrameCursorEvictedError) {\n // 410 rather than 404: the run is there, the position is not. A client\n // that gets this reloads the thread instead of resuming into a hole.\n return jsonResponse(410, {\n code: err.code,\n message: err.message,\n oldestSeq: err.oldest,\n });\n }\n if (err instanceof LiveRunNotFoundError) {\n // Lost the race with eviction between `find` and `replay`.\n return jsonResponse(404, { code: err.code, message: err.message });\n }\n throw err;\n }\n }\n\n /**\n * `POST /<path>/watch` — follow a thread (#1180): an SSE stream that sends\n * `{ type: \"run-start\", runId }` for each run that starts on the thread\n * from now on, whoever started it (another tab, `startTurn` from a job),\n * and once on connect for a run already going. The client attaches to the\n * run with `/attach`; this stream carries no frames of it. `useChat`'s\n * `watch: true` opens it.\n *\n * Authorized as `attach` is (`authorizeRequest` with `route: \"attach\"`), and\n * a run is announced only to a caller `attach` would let read it\n * (`runOwner`). Per process, like `LiveRuns`: a run started in another\n * process is not announced here (#459). The stream stays open until the\n * client closes it, with keepalive comments while it is quiet.\n */\n async watch(req: HttpRequest<any, any> = new HttpRequest()): Promise<Response> {\n const parsed = await readJsonBody(req, SMALL_BODY_BYTES);\n if (parsed.error) {\n return invalidRequest(parsed);\n }\n const body = parsed.body;\n const threadId =\n typeof body.threadId === \"string\" ? body.threadId : searchParam(req, \"threadId\");\n if (!threadId) {\n return jsonResponse(400, {\n code: \"invalid_request\",\n message: \"watch needs a threadId: it is the thread whose runs are announced.\",\n });\n }\n // Before anything is said about the thread's runs, as for `attach`.\n await this.authorizeRequest(req, { route: \"attach\", threadId });\n // Another scope's thread (#1177) is one this caller cannot follow.\n if (!(await this.threadInScope(req, threadId))) {\n return jsonResponse(404, {\n code: \"thread_not_found\",\n message: `Thread ${threadId} does not exist here, or has expired.`,\n });\n }\n const owner = await this.runOwner(req);\n const liveRuns = this.liveRuns;\n const watchers = watchersFor(liveRuns);\n const live = await liveRuns.find({ threadId });\n\n let listener: ((runId: string) => void) | null = null;\n let keepalive: ReturnType<typeof sseKeepalive> | null = null;\n let seq = 0;\n const close = () => {\n keepalive?.stop();\n if (!listener) return;\n const set = watchers.get(threadId);\n set?.delete(listener);\n if (set && set.size === 0) watchers.delete(threadId);\n listener = null;\n };\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n keepalive = sseKeepalive(controller);\n const send = (runId: string) => {\n // Someone else's run (#442): `attach` would refuse it, so it is not named.\n if (!liveRuns.mayAccess(runId, owner)) return;\n try {\n controller.enqueue(\n new TextEncoder().encode(\n encodeFrame({ seq: ++seq, event: { type: \"run-start\", runId, threadId } }),\n ),\n );\n keepalive?.touch();\n } catch {\n close();\n }\n };\n listener = send;\n let set = watchers.get(threadId);\n if (!set) {\n set = new Set();\n watchers.set(threadId, set);\n }\n set.add(send);\n if (live && liveRuns.isRunning(live.runId)) send(live.runId);\n },\n cancel() {\n close();\n },\n });\n // The client going away cancels the body; the request's signal is the\n // same news by another road, for a runtime that does not cancel it.\n req.rawRequest?.signal?.addEventListener(\"abort\", close, { once: true });\n return new Response(stream, { status: 200, headers: sseHeaders() });\n }\n\n /**\n * `POST /<path>/stop` — the explicit cancel. Since a dropped connection no\n * longer stops a run, this and a later turn on the same thread are the only\n * things that do, and it is why stopping cannot be a client-side concern:\n * the tool loop is here, and a client that stops reading has not stopped\n * step four from charging a card.\n *\n * Returns as soon as the run is aborted, not when it has finished unwinding.\n * The terminal events — the stopped tool results, the aborted message — go\n * out on the run's own stream, so whoever is watching it sees the ending,\n * and `onMessage` records it whether anyone is watching or not.\n *\n * Answers `{ stopped }` normally, and a `Response` only to reject a request\n * it could not read — the union is the error, not a second success shape.\n */\n async stop(\n req: HttpRequest<any, any> = new HttpRequest(),\n ): Promise<{ stopped: boolean } | Response> {\n const parsed = await readJsonBody(req, SMALL_BODY_BYTES);\n if (parsed.error) {\n // `{ stopped: false }` would be the wrong answer as well as the wrong\n // status: it means \"there was nothing to stop\", and the truth is that we\n // could not tell what to stop. A client that believes the first one stops\n // asking, and the run keeps going.\n return invalidRequest(parsed);\n }\n const body = parsed.body;\n\n await this.authorizeRequest(req, {\n route: \"stop\",\n threadId: typeof body.threadId === \"string\" ? body.threadId : undefined,\n });\n\n // Three handles, most specific first, because which ones the client has\n // depends on how far the run got. `runId` is the server's own and settles\n // it. `clientRunId` covers the window before `run-start`, when the client\n // has nothing else for a stateless first turn — and, before that, a turn\n // that has not become a run yet because it is waiting its place on the\n // thread, which is ended where it waits. `threadId` is the fallback for a\n // client that did not start this run at all — one that attached to it,\n // whose replayed tail carried no `run-start`.\n const caller = await this.runOwner(req);\n let runId = typeof body.runId === \"string\" ? body.runId : undefined;\n if (!runId && typeof body.clientRunId === \"string\") {\n runId = this.liveRuns.findByClientRunId(body.clientRunId) ?? undefined;\n if (!runId) {\n const pending = pendingTurns.get(body.clientRunId);\n if (pending) {\n // A `clientRunId` is the client's own choice and only as unguessable\n // as it made it, so the turn it names is checked like a run (#442).\n if (pending.owner !== null && pending.owner !== caller) {\n return notYourRun();\n }\n // Not on to `threadId`: that names the run this turn is queued\n // behind, which is already stopping, and answering for it would\n // leave this one to start.\n pending.cancelled = true;\n return { stopped: true };\n }\n }\n }\n if (!runId && typeof body.threadId === \"string\") {\n runId = (await this.liveRuns.find({ threadId: body.threadId }))?.runId;\n }\n\n const run = runId ? this.liveRuns.get(runId) : null;\n if (!run) {\n // Already finished, already evicted, or never here. Not an error: the\n // caller wanted the run stopped and it is not running.\n return { stopped: false };\n }\n if (!this.liveRuns.mayAccess(run.runId, caller)) {\n // Someone else's run, by whichever handle (#442). See `runOwner`.\n return notYourRun();\n }\n\n run.stop({ reason: typeof body.reason === \"string\" ? body.reason : undefined });\n\n // Deliberately not awaiting `run.result()`. Unwinding means letting tools\n // in flight settle into `denied` results and finalizing the assistant\n // message, which can take as long as the slowest tool — and a stop button\n // that spins for twenty seconds is a stop button people press twice.\n return { stopped: true };\n }\n\n /**\n * WHO A SCOPE BELONGS TO, and the one question in this file whose wrong\n * answer is a data leak rather than a bug.\n *\n * An attachment id given to the model comes back *from* the model, and what\n * the model writes is a function of everything it read — the user's text, a\n * tool's output, a document someone uploaded. So the id is untrusted in\n * exactly the way a request body is, and the scope it resolves under must come\n * from the server's own knowledge of the request. Nothing that reaches this\n * method may be readable or writable by the model: `req` is the HTTP request,\n * and `threadId` is the client's handle, not the model's.\n *\n * THE DEFAULT IS THE AUTHENTICATED USER, falling back to the thread, falling\n * back to `null`.\n *\n * - `user:<id>` when the request is authenticated. `req.ctx().user` is what\n * `AuthenticationMiddleware` and the `Auth` facade put there, so an agent\n * route behind `middlewares = [\"auth\"]` — which `ApiRouter.agent()` makes\n * the default posture — has a subject without the app writing anything.\n * - `thread:<id>` for an unauthenticated chat that has a thread. A `threadId`\n * is minted by `createThread` as a uuid and is documented as a capability,\n * and `upload` only passes one here that `store.loadThread` finds;\n * an anonymous support widget has nothing better, and scoping to the\n * conversation is strictly narrower than scoping to nothing.\n * - `null` otherwise, which means no attachment id is minted at all. There is\n * no third fallback on purpose. `sessionId()` is the tempting one and it is\n * the wrong one: it is a cookie the visitor writes, documented as *not a\n * credential*, so scoping to it is scoping to a value the caller chooses —\n * which is not a scope, it is a lookup key with extra steps.\n *\n * WHAT THIS DEFAULT GETS WRONG, since it will get something wrong for someone:\n * it is per user, not per conversation, so a user's own upload from one thread\n * resolves in another thread of theirs. That is the loose direction, and it is\n * chosen because the tight one breaks the flow the framework actually ships —\n * `useChat.uploadFile` posts a file before any thread exists, so a per-thread\n * default would make the first upload of every conversation unresolvable. An\n * app that wants per-conversation isolation returns\n * `{ key: \\`user:${id}:thread:${threadId}\\` }` here and has it; an app with\n * tenants returns `{ key: \\`org:${orgId}\\` }` and has that. What the default\n * must never be is broader than a user, and it is not.\n *\n * WHATEVER THIS READS MUST BE PRESENT ON EVERY AGENT ROUTE, and the default\n * reads `req.ctx().user`, which is present only where authentication\n * middleware ran. `agent()` mounts four routes and `.middleware()` guards\n * them individually, so `middleware({ stream: \"auth\" })` — the example in\n * `ApiRouter.agent`'s own doc — leaves `POST /chat/files` unauthenticated.\n * The upload then files the record under `thread:<id>` (or nothing at all)\n * while the run that follows, on the guarded route, resolves under\n * `user:<id>`, and every id minted on upload is a miss for the rest of the\n * conversation. It fails as `AttachmentNotFoundError`, worded identically to\n * an id the model invented, which is the point of that error and is also why\n * this particular misconfiguration is invisible. Guard `upload` and `stream`\n * together, or derive the key from something both of them have.\n *\n * gemi does not detect the skew for you, and the reason is the module's whole\n * premise: noticing that an id exists under a *different* scope requires\n * looking it up without one, and an unscoped read is the thing that must not\n * exist here — not even behind a `console.warn`. So the answer is the\n * documentation you are reading and the identical error, not a probe.\n *\n * THE BODY, AND THE ONE RULE FOR READING IT (#603). The third argument is the\n * client's `body` option — what `instructions()` gets — on both routes that\n * resolve a scope: `stream`, and `upload`, where `useChat.uploadFile` sends\n * the same option beside the file. It exists for the chat that has neither a\n * user nor a thread, a stateless page builder say, whose subject is only in\n * the body:\n *\n * protected async attachmentScope(req, threadId, { body }) {\n * const scope = await super.attachmentScope(req, threadId);\n * if (scope) return scope;\n * if (typeof body.pageId !== \"string\") return null;\n * const page = await Page.findFirst({ where: { publicId: body.pageId } });\n * return page ? { key: `page:${page.publicId}` } : null;\n * }\n *\n * The `typeof` line is not tidiness. `Body` types the shape, not the contents,\n * and to an ORM `{ publicId: undefined }` is no filter at all: a request that\n * leaves `pageId` out would find the first page in the table and be filed\n * under it, along with every other request that leaves it out.\n *\n * A body field is a value the caller chose, which is exactly what the\n * `sessionId()` paragraph above refuses. What separates the keys this may be\n * built from is not whether the client sent them — `threadId` is sent by the\n * client too — but WHETHER THE VALUE IS AN UNGUESSABLE CAPABILITY WHOSE\n * EXISTENCE THE SERVER CHECKS. A page `publicId` that is looked up, as above,\n * is one, on the same footing as a `threadId` that `loadThread` finds: holding\n * it is what entitles the caller to the page, and an id nobody minted resolves\n * to nothing. `body.orgId` in an app with users is NOT one, and passing the\n * body is precisely what makes `` { key: `org:${body.orgId}` } `` spellable: an\n * org id is enumerable and the caller may not belong to that org, so that is\n * every tenant's files handed to whoever types another tenant's id. A tenant\n * comes from `req.ctx().user`, never from here. And a value interpolated\n * without being looked up is the `sessionId()` mistake again, however\n * unguessable it looks — an anonymous caller then mints a fresh scope per\n * request. Look it up, and key on what the lookup returned.\n *\n * The same skew rule as above applies to the body, and more quietly: the key\n * must come out the same on `upload` and on `stream`. `useChat` sends the one\n * `body` option to both, so a key derived from a field that stays put for the\n * whole conversation — the page, not the selected element — agrees by\n * construction. One derived from a field that changes between the upload and\n * the turn does not, and fails as that same `AttachmentNotFoundError`.\n *\n * The third argument is new, and the method keeps its first two, so an\n * override written as `attachmentScope(req, threadId)` works unchanged; one\n * that calls `super.attachmentScope(req, threadId)` may leave it off too.\n *\n * The key is opaque and compared with `===`. It is never sent to the client\n * and never shown to the model.\n */\n protected attachmentScope(\n req: HttpRequest<any, any>,\n threadId?: string,\n extra?: { body: Body },\n ): AttachmentScope | null | Promise<AttachmentScope | null> {\n const hook = this.hooks?.attachmentScope;\n if (hook) return hook(req, threadId, extra);\n const user = req.ctx()?.user;\n const userId = user?.id ?? user?.publicId;\n if (userId !== undefined && userId !== null && String(userId) !== \"\") {\n return { key: `user:${String(userId)}` };\n }\n if (threadId) {\n return { key: `thread:${threadId}` };\n }\n return null;\n }\n\n /**\n * WHAT THIS ROUTE ACCEPTS AT ALL: a size ceiling and a list of types (#683).\n * Checked once per upload, after `authorizeRequest` and before anything is\n * stored or sent to the provider, and a file outside them is answered **422**\n * with `{ error: { code, message } }` — `file_too_large` or\n * `unsupported_file_type` — which `useChat().attach()` rejects with as an\n * `AttachError`, so a composer can mark the one file.\n *\n * `accept` reads like an `<input accept>`: `\".pdf\"` matches the file name's\n * extension, `\"image/*\"` a type family, `\"text/csv\"` one type. A file\n * matching any entry is accepted. Left out (or `null` returned, the default)\n * means no limit of that kind, which is how the route behaved before.\n *\n * Here rather than in `attachmentDestination`, which an app could throw from\n * to the same end: a throw there is a 500 unless the app builds the response\n * itself, and the provider's own refusal only arrives after the bytes were\n * stored. A limit is a rule about the file, so it is answered before either.\n *\n * protected attachmentLimits() {\n * return { maxBytes: 10 * 1024 * 1024, accept: [\".pdf\", \"image/*\"] };\n * }\n */\n protected attachmentLimits(\n req: HttpRequest<any, any>,\n ): AttachmentLimits | null | Promise<AttachmentLimits | null> {\n const hook = this.hooks?.attachmentLimits;\n if (hook) return hook(req);\n return null;\n }\n\n /**\n * THE APP'S OWN RULE ABOUT ONE UPLOAD (#836): a storage quota, a per-subject\n * cap, anything that needs the file and the request's subject at once.\n * Called once per upload, after `authorizeRequest` and `attachmentLimits` and\n * before anything is stored or sent to the provider.\n *\n * It is told what the file is (`name`, `size`, `mimeType`) and what the\n * upload is about: `body`, the client's `body` option exactly as\n * `attachmentScope` gets it, and `threadId` when the store knows the thread.\n * Return nothing to let the file through, or an `UploadRefusal` to refuse it:\n * the route answers **422** with `{ error: { code, message } }` (`code`\n * defaults to `\"upload_refused\"`), and `useChat().attach()` rejects with an\n * `AttachError` carrying both, as it does for `attachmentLimits`' refusals.\n * A `RequestBreakerError` thrown here is answered as itself; anything else\n * thrown is a 500.\n *\n * protected async checkUpload(file, req, { body }) {\n * if (typeof body.pageId !== \"string\") return;\n * const page = await Page.findFirst({ where: { publicId: body.pageId } });\n * if (!page) return;\n * const used = await storageUsedBy(page);\n * if (used + file.size > capFor(page)) {\n * return { code: \"storage_full\", message: \"This site's storage is full.\" };\n * }\n * }\n *\n * The `body` rule from `attachmentScope` applies here too: it types the\n * shape, not the contents, so check a field before looking it up, and\n * decide whose quota to charge from what the lookup returned.\n *\n * Here rather than in `attachmentDestination`, which also sees the file: a\n * quota is a rule about the file and its subject, not about where the bytes\n * go, and a throw there is a 500 unless the app builds the response itself.\n *\n * A check here is not a reservation: two uploads checked at the same moment\n * both see the old usage. A cap that must never be exceeded by one file is\n * enforced where usage is recorded.\n */\n protected checkUpload(\n file: UploadCheckFile,\n req: HttpRequest<any, any>,\n ctx: UploadContext<Body>,\n ): UploadRefusal | null | void | Promise<UploadRefusal | null | void> {\n return this.hooks?.checkUpload?.(file, req, ctx);\n }\n\n /**\n * WHERE ONE FILE'S BYTES SHOULD GO. Called once per upload, with the file in\n * hand, and since #836 with the same `{ body, threadId }` that `checkUpload`\n * gets as a third argument. An override written as\n * `attachmentDestination(file, req)` works unchanged.\n *\n * The model needs to perceive a file only for vision or document reading; a\n * tool needs the bytes only to forward them. Those are different needs and\n * they were being answered the same way, because `upload` sent everything to\n * the vendor unconditionally — which is a cost and a data-minimisation problem\n * as much as a capability one. A CSV that exists to be imported belongs in\n * storage and not at the provider; an image the model must look at and no tool\n * will forward is the reverse.\n *\n * THE DEFAULT IS `\"both\"`, AND THE JUSTIFICATION IS THE FAILURE MODE, not the\n * hit rate. A mimeType table was the obvious alternative — images and PDFs to\n * the provider, everything else to storage — and it is wrong in the quiet\n * direction. Getting `\"both\"` wrong sends a file to a vendor that did not need\n * it: it costs money, it is visible on an invoice and in the vendor's file\n * list, and it is corrected by overriding one method. Getting `\"storage\"`\n * wrong drops the file out of the model's view with no error anywhere; the\n * model answers as though the image were not there, which is indistinguishable\n * from a bad prompt, and the developer debugs their instructions for an\n * afternoon. Being wrong on the invoice beats being wrong in a way that\n * presents as \"the AI is stupid\".\n *\n * `\"both\"` is also what keeps this change additive: every upload that reached\n * the provider before still reaches it, and storage is added underneath. An\n * app that never asks for an attachment id sees no difference except a second\n * copy it owns.\n *\n * A client may ask, per file, for `\"storage\"` under a `\"both\"` policy — the\n * one direction that only ever removes the vendor. It may not ask for\n * anything else, including `\"provider\"`, which would let a form field decide\n * that the app does not keep its own copy. See `narrowDestination`.\n */\n protected attachmentDestination(\n file: File,\n req: HttpRequest<any, any>,\n extra?: UploadContext<Body>,\n ): AttachmentDestination | Promise<AttachmentDestination> {\n const hook = this.hooks?.attachmentDestination;\n if (hook) return hook(file, req, extra);\n return \"both\";\n }\n\n /**\n * The attachment handle for this request — the object a tool is given.\n *\n * `null` when `attachmentScope` says the request has no subject, and a caller\n * that gets `null` must not fall back to anything: there is no unscoped handle\n * to fall back to, which is the point.\n *\n * Issue #490 hangs `ctx.attachments` off this.\n */\n protected async attachmentsFor(\n req: HttpRequest<any, any>,\n threadId?: string,\n extra: { body: Body } = { body: {} as Body },\n ): Promise<ScopedAttachments | null> {\n const scope = await this.attachmentScope(req, threadId, extra);\n if (!scope) {\n return null;\n }\n return new ScopedAttachments(this.attachments, this.attachmentStorage, scope);\n }\n\n /**\n * `POST /<voice route>` (#921): starts a voice call in front of this agent.\n *\n * Takes the browser's SDP offer (`sdp`), the chat's `threadId`, `pushToTalk`\n * and the app's `body`. Runs `authorizeRequest` (`route: \"stream\"`), then\n * `voice.start` (credits, limits: throw to refuse), creates the call at the\n * vendor with the server's key and the session `start` answered plus the\n * bridge's tools, records it in `voiceStore`, and starts a `VoiceBridge` on\n * its sideband in this process. Answers the vendor's SDP answer and the\n * session's id.\n *\n * Every failure after `start` has run calls the session's `onEnd` with\n * reason `start_failed`, so an app that charged in `start` can refund: no\n * thread (400), a refused thread (the `authorizeRequest` error), a vendor\n * failure (502, or 429 when the vendor rate-limited us, code\n * `voice_unavailable`), and a failure after the vendor call exists (500),\n * which also hangs that call up.\n *\n * @experimental Not yet verified against a live Azure or OpenAI call.\n */\n async voiceStart(\n req: HttpRequest<any, any> = new HttpRequest(),\n ): Promise<VoiceStartResponse | Response> {\n const voice = this.voice;\n if (!voice) return voiceNotEnabled();\n const parsed = await readJsonBody(req, SMALL_BODY_BYTES);\n if (parsed.error) return invalidRequest(parsed);\n const { sdp, threadId: claimed, pushToTalk } = parsed.body;\n if (typeof sdp !== \"string\" || !sdp.trimStart().startsWith(\"v=\")) {\n return jsonResponse(400, {\n code: \"invalid_request\",\n message: \"`sdp` must be the browser's SDP offer.\",\n });\n }\n const body = appBody<Body>(parsed.body, VOICE_START_KEYS);\n const clientThreadId = typeof claimed === \"string\" && claimed !== \"\" ? claimed : undefined;\n await this.authorizeRequest(req, { route: \"stream\", threadId: clientThreadId, body });\n\n const user = req.ctx?.()?.user ?? null;\n const options = await voice.start({\n req,\n body,\n threadId: clientThreadId,\n user,\n pushToTalk: pushToTalk === true,\n });\n const startedAt = Date.now();\n // From here on `start` has run, and may have charged: every way out that\n // is not a running bridge calls `onEnd` with `start_failed` (so the charge\n // can be refunded), and a vendor call that exists by then is hung up, so\n // nothing is left running with nobody metering it.\n let callId: string | undefined;\n const failed = async (error: unknown): Promise<void> => {\n if (error !== undefined) console.error(\"[gemi/ai] a voice session could not start.\", error);\n if (callId) {\n await voice.realtime.hangup(callId).catch((hangupError) => {\n console.error(\"[gemi/ai] a voice call that failed to start could not be hung up.\", hangupError);\n });\n }\n try {\n await options.onEnd?.({\n sessionId: \"\",\n ...(callId ? { callId } : {}),\n threadId: options.threadId ?? clientThreadId ?? \"\",\n reason: \"start_failed\",\n startedAt,\n endedAt: Date.now(),\n durationMs: 0,\n seconds: 0,\n usage: emptyUsage(),\n transcription: { usage: emptyUsage(), seconds: 0 },\n transcript: [],\n requests: [],\n toolCalls: [],\n errors: [],\n });\n } catch (onEndError) {\n console.error(\"[gemi/ai] a voice session's onEnd threw.\", onEndError);\n }\n };\n\n const threadId = options.threadId ?? clientThreadId;\n if (!threadId) {\n await failed(undefined);\n return jsonResponse(400, {\n code: \"invalid_request\",\n message:\n \"A voice session needs a thread: send `threadId`, or answer one from `voice.start`.\",\n });\n }\n try {\n if (threadId !== clientThreadId) {\n await this.authorizeRequest(req, { route: \"stream\", threadId, body });\n }\n } catch (error) {\n await failed(undefined);\n throw error;\n }\n\n // The id first: an MCP principal is keyed to the session.\n const sessionId = crypto.randomUUID();\n let toolHandlers = options.tools ?? [];\n try {\n if (options.mcp) {\n toolHandlers = [\n ...toolHandlers,\n ...(await mcpVoiceTools(options.mcp, { user, sessionId })),\n ];\n }\n } catch (error) {\n await failed(error);\n return jsonResponse(500, {\n code: \"voice_unavailable\",\n message: \"Voice isn't available right now.\",\n });\n }\n const session: RealtimeSession = {\n ...options.session,\n tools: [\n ...voiceTools(voice.delegate),\n ...(options.session?.tools ?? []),\n ...toolHandlers.map((handler) => handler.tool),\n ],\n ...(pushToTalk === true ? { turnDetection: null } : {}),\n };\n let call: { sdpAnswer: string; callId: string };\n try {\n call = await voice.realtime.createCall({\n sdp,\n session,\n safetyIdentifier: options.safetyIdentifier,\n });\n } catch (error) {\n await failed(error);\n const limited = error instanceof RealtimeRequestError && error.code === \"rate_limited\";\n return jsonResponse(limited ? 429 : 502, {\n code: \"voice_unavailable\",\n message: \"Voice isn't available right now.\",\n });\n }\n callId = call.callId;\n\n try {\n await this.voiceStore.create({\n id: sessionId,\n callId: call.callId,\n threadId,\n owner: await this.runOwner(req),\n body: body as Record<string, unknown>,\n startedAt,\n });\n const {\n threadId: _thread,\n session: _session,\n safetyIdentifier: _safety,\n mcp: _mcp,\n tools: _tools,\n ...hooks\n } = options;\n const bridge = VoiceBridge.start<Body>({\n ...hooks,\n tools: toolHandlers,\n controller: this.constructor as unknown as VoiceBridgeController<Body>,\n threadId,\n user,\n body,\n call: { realtime: voice.realtime, callId: call.callId },\n sessionId,\n store: this.voiceStore,\n liveRuns: this.liveRuns,\n delegate: voice.delegate,\n session,\n });\n return {\n sessionId: bridge.sessionId,\n sdp: call.sdpAnswer,\n threadId,\n delegate: voice.delegate?.name ?? DEFAULT_DELEGATE_NAME,\n endsAt: startedAt + (options.limits?.maxDurationMs ?? 15 * 60_000),\n };\n } catch (error) {\n await failed(error);\n return jsonResponse(500, {\n code: \"voice_unavailable\",\n message: \"Voice isn't available right now.\",\n });\n }\n }\n\n /**\n * `PATCH /<voice route>/:sessionId` (#921): the session's new `body` (the\n * selection, the open page). Delegated turns get it from their next start,\n * and `contextNote` tells the voice when the bridge is in this process.\n */\n async voiceUpdate(\n req: HttpRequest<any, any> = new HttpRequest(),\n ): Promise<{ updated: boolean } | Response> {\n if (!this.voice) return voiceNotEnabled();\n const found = await this.voiceSession(req);\n if (found instanceof Response) return found;\n const parsed = await readJsonBody(req, SMALL_BODY_BYTES);\n if (parsed.error) return invalidRequest(parsed);\n const body = appBody<Body>(parsed.body, []);\n await this.authorizeRequest(req, { route: \"stream\", threadId: found.threadId, body });\n if (found.endedAt !== undefined) {\n return jsonResponse(409, { code: \"voice_ended\", message: \"This voice session has ended.\" });\n }\n await this.voiceStore.update(found.id, { body: body as Record<string, unknown> });\n VoiceBridge.get(found.id)?.setBody(body);\n return { updated: true };\n }\n\n /**\n * `DELETE /<voice route>/:sessionId` (#921): ends the call. On the instance\n * holding the bridge it hangs up and runs `onEnd` before answering; on any\n * other it hangs the call up at the vendor, and the holder's sideband sees\n * the call end.\n */\n async voiceEnd(\n req: HttpRequest<any, any> = new HttpRequest(),\n ): Promise<{ ended: boolean } | Response> {\n const voice = this.voice;\n if (!voice) return voiceNotEnabled();\n const found = await this.voiceSession(req);\n if (found instanceof Response) return found;\n await this.authorizeRequest(req, {\n route: \"stream\",\n threadId: found.threadId,\n body: found.body as Body,\n });\n if (found.endedAt !== undefined) return { ended: false };\n const bridge = VoiceBridge.get(found.id);\n if (bridge) {\n await bridge.end(\"hangup\");\n } else {\n await voice.realtime.hangup(found.callId);\n await this.voiceStore.update(found.id, { endedAt: Date.now(), endReason: \"hangup\" });\n }\n return { ended: true };\n }\n\n /** The session a voice `PATCH` or `DELETE` names, if the caller owns it. */\n private async voiceSession(req: HttpRequest<any, any>): Promise<VoiceSessionRecord | Response> {\n const id = (req.params as Record<string, unknown> | undefined)?.sessionId;\n const record = typeof id === \"string\" && id ? await this.voiceStore.get(id) : null;\n if (!record) {\n return jsonResponse(404, { code: \"voice_not_found\", message: \"No such voice session.\" });\n }\n if (record.owner !== null && record.owner !== (await this.runOwner(req))) {\n return notYourRun();\n }\n return record;\n }\n\n /**\n * `POST /<path>/files` — takes an attachment and answers the handles for it.\n *\n * `fileId` IS STILL IN THE ANSWER AND STILL MEANS THE SAME THING: the\n * provider's id for the file, the thing a `FilePart` carries, unchanged. It\n * has to stay, because it is what makes vision work and what\n * `useChat.uploadFile` already reads; `attachmentId` is added beside it rather\n * than in place of it. The two are not interchangeable, and swapping them\n * would reach the vendor as a file id it has never issued — so\n * `toResponsesInput` rejects a `gemi_att_` prefix in `FilePart.fileId` with a\n * sentence saying so, rather than leaving it to whatever the vendor answers\n * (not measured).\n *\n * `fileId` is absent exactly when the file did not go to the provider, which\n * only happens when the app or the client asked for that. `attachmentId` is\n * absent when there was no scope to file the record under — see\n * `attachmentScope` — and the answer then carries `downgraded: \"no_scope\"`,\n * which is the only thing separating that case from a controller that chose\n * `\"provider\"` on purpose. Both answer `destination: \"provider\"`, because both\n * are true about where the bytes went.\n *\n * ORDER: storage first, then the provider. If the second one fails the request\n * fails either way, so the only question is where the orphan is left, and an\n * orphan in our own bucket is ours to sweep on a schedule we set, while an\n * orphan at the vendor sits under a retention policy that is not ours.\n */\n async upload(req: HttpRequest<any, any> = new HttpRequest()): Promise<UploadResult> {\n const form = await req.rawRequest.formData();\n const file = form.get(\"file\");\n if (!(file instanceof Blob)) {\n throw new Error(\"upload expects a multipart body with a `file` field.\");\n }\n const name = file instanceof File && file.name ? file.name : \"upload\";\n const mimeType = file.type || \"application/octet-stream\";\n\n // The client's `body` option, as one JSON part beside the file (#603), so\n // `authorizeRequest` and `attachmentScope` see here what they see on\n // `stream`. Read off the form already parsed: the request's body is\n // consumed, and an override cannot read it again. A malformed part is\n // refused before anything else runs, as a malformed turn is on `stream`.\n const extraBody = uploadAppBody<Body>(form.get(\"body\"));\n\n // The client's thread, read here only so an unauthenticated chat has\n // something to scope to. It is the client's own handle — `stream` already\n // takes it on trust for the whole conversation — and it is not the model's:\n // this is a form field on an HTTP request the user's browser made, not a\n // tool argument.\n //\n // It is only passed on if the store knows it. `stream` answers\n // `thread_not_found` for an id it has never seen, and this route must not\n // be looser: an invented id would otherwise be a scope, and an anonymous\n // caller could keep writing to storage by sending a fresh one each time.\n const threadField = form.get(\"threadId\");\n // The field as sent, before the store is asked about it, so a refused\n // caller does not learn whether the thread exists.\n await this.authorizeRequest(req, {\n route: \"upload\",\n threadId: typeof threadField === \"string\" && threadField.length > 0 ? threadField : undefined,\n body: extraBody,\n });\n // Before the thread is looked up, the policy is asked, or a byte is kept:\n // a file this route never takes costs nothing past this line.\n const refusal = limitRefusal(await this.attachmentLimits(req), file, name, mimeType);\n if (refusal) {\n throw new LimitedUploadError(refusal.code, refusal.message);\n }\n\n await this.scopeStore(req, extraBody);\n const threadId =\n typeof threadField === \"string\" &&\n threadField.length > 0 &&\n (await this.store.loadThread(threadField)) !== null\n ? threadField\n : undefined;\n\n // Who the provider's copy will belong to (#443): the same key that owns a\n // run this caller starts, so the turn that names the file finds it its own.\n const owner = await this.runOwner(req);\n const recordOwner = (fileId: string) =>\n this.fileOwners.record(fileId, {\n owner,\n name,\n mimeType,\n size: file.size,\n createdAt: new Date().toISOString(),\n });\n\n // The app's own rule about this file and its subject (#836), still before\n // anything is kept or sent.\n const uploadContext: UploadContext<Body> = { body: extraBody, threadId };\n const appRefusal = await this.checkUpload(\n { name, size: file.size, mimeType },\n req,\n uploadContext,\n );\n if (appRefusal) {\n throw new LimitedUploadError(appRefusal.code || \"upload_refused\", appRefusal.message);\n }\n\n const policy = await this.attachmentDestination(file as File, req, uploadContext);\n const destination = narrowDestination(policy, form.get(\"destination\"));\n\n const scope = await this.attachmentScope(req, threadId, { body: extraBody });\n\n // The app's policy wanted a copy of these bytes and the request has no\n // subject to file them under. Recorded rather than merely warned about,\n // because the answer has to be able to tell the client that what it is\n // getting is not the policy — see `UploadResult.downgraded`.\n const downgraded = destination !== \"provider\" && !scope;\n if (downgraded) {\n if (destination === \"storage\") {\n // Bytes were asked to be kept and there is nobody to keep them for.\n // Storing them anyway files them under a scope every caller shares, and\n // answering nothing is an upload that silently did not happen. Neither\n // is an answer; this is.\n throw new Error(\n 'This upload was routed to storage, but `attachmentScope()` returned null for the request, so there is no subject to file the attachment under. Guard the route (`this.agent(Chat).middleware({ upload: \"auth\" })`), send a `threadId` with the upload, or override `attachmentScope()`.',\n );\n }\n // Policy said `both` and the request has no subject: fall through to the\n // provider alone, which is exactly what this route did before attachments\n // existed. Downgrading rather than throwing is what keeps an\n // unauthenticated chat working across the upgrade — but a downgrade nobody\n // is told about is the failure mode this file keeps arguing against, so it\n // is warned once per process on the server and marked `downgraded` in the\n // answer, so the client can tell this apart from a deliberate\n // provider-only policy.\n warnUnscopedUploadOnce();\n }\n\n if (destination === \"provider\" || !scope) {\n // Identical to the pre-attachment behaviour, down to the answer's\n // `fileId` — plus `downgraded` when this path was not the app's choice.\n const fileId = await providerUpload(this.agent.provider, file as File);\n await recordOwner(fileId);\n const answer: UploadResult = {\n fileId,\n name,\n mimeType,\n size: file.size,\n destination: \"provider\",\n };\n if (downgraded) {\n answer.downgraded = \"no_scope\";\n }\n return answer;\n }\n\n const attachmentId = newAttachmentId();\n const objectName = await this.attachmentStorage.put({\n name: attachmentObjectName(attachmentId, name),\n body: file,\n contentType: mimeType,\n });\n\n const fileId =\n destination === \"both\" ? await providerUpload(this.agent.provider, file as File) : undefined;\n if (fileId) {\n await recordOwner(fileId);\n }\n\n const record: Attachment = {\n id: attachmentId,\n scopeKey: scope.key,\n fileId,\n objectName,\n name,\n mimeType,\n size: file.size,\n createdAt: new Date().toISOString(),\n destination,\n };\n await this.attachments.put(scope, record);\n\n return { fileId, attachmentId, name, mimeType, size: file.size, destination };\n }\n\n /**\n * The 403 for a turn naming a provider file id that is not this caller's, or\n * `null` when every id may be used (#443). See `fileOwners`.\n *\n * Only `fileId` is checked: an `attachmentId` is resolved under the request's\n * own scope, so another user's is already a not-found (`ScopedAttachments`).\n * An entry carrying the caller's own `attachmentId` beside a foreign `fileId`\n * is refused all the same — the `fileId` is what reaches the provider.\n */\n private async foreignFile(\n files: { fileId?: string }[],\n caller: string | null,\n ): Promise<Response | null> {\n const ids = new Set(\n files.map((file) => file.fileId).filter((id): id is string => typeof id === \"string\"),\n );\n for (const fileId of ids) {\n const record = await this.fileOwners.get(fileId);\n if (record ? record.owner !== null && record.owner !== caller : this.requireKnownFiles) {\n // The same sentence for a file that is someone else's and, in strict\n // mode, one nobody recorded: which of the two it is would tell a caller\n // probing ids that the id exists.\n return notYourFile();\n }\n }\n return null;\n }\n\n /**\n * Protected, not private: these exist to be overridden. `onMessage` fires for\n * every completed message, user and assistant alike, and is the intended\n * persistence point for an app that is not using `store`.\n *\n * Once per message, in the transcript's order. The turn's own user message\n * is handed over while the run is still going: on a thread once the store\n * has it, and before the model's answer, so whatever the app keeps beside it\n * is there for a read of the thread during a long run (#806). Every other\n * message is handed over after the run, as before. A run that fails or is\n * stopped after taking the turn in has still reported it.\n *\n * Every hook runs inside the request that started the run, which is held\n * open for them — after the run, and after a client that left — so\n * `ctx.req.ctx().user` is the user who sent the turn. See `hookHoldMs` for\n * how long a hook that does not finish keeps it.\n */\n protected onMessage(message: AgentMessage, ctx: AgentHookContext): void | Promise<void> {\n return this.hooks?.onMessage?.(message, ctx);\n }\n\n protected onToolCall(\n call: { toolCallId: string; name: string; input: unknown },\n ctx: AgentHookContext,\n ): void | Promise<void> {\n return this.hooks?.onToolCall?.(call, ctx);\n }\n\n /**\n * Fires once for each tool result on the run's stream (#1062): `ok`,\n * `error`, `denied` (refused, stopped, interrupted) and `running` (a\n * background job started), from the step loop and from a turn that answers\n * a pending call. The place for an audit log of what the tools did.\n *\n * A result a person approved or refused carries `result.approval`: who\n * (the run's subject) and when. This is the server's own copy, so it is\n * trustworthy in stateless mode too, unlike the one the client posts back.\n *\n * `call` is the call the result answers, with its `input` as the model sent\n * it (what `onToolCall` got), for every status: an audit of a refused call\n * can say what was refused without reading the thread (#1079).\n *\n * Top-level calls only: a sub-agent's results are on its nested transcript.\n * A background job settling later is not a result on this stream; read\n * those off the thread, or from the job store.\n */\n protected onToolResult(\n result: ToolResultPart,\n ctx: AgentHookContext,\n call: ToolResultCall,\n ): void | Promise<void> {\n return this.hooks?.onToolResult?.(result, ctx, call);\n }\n\n /** Fires before the stream ends `awaiting-input` — where to notify whoever\n * has to approve, if they are not the person watching the stream. */\n protected onAwaitingInput(\n pending: PendingToolCall[],\n ctx: AgentHookContext,\n ): void | Promise<void> {\n return this.hooks?.onAwaitingInput?.(pending, ctx);\n }\n\n /**\n * What the client is told about a failure: the run's `error` frame, and the\n * result of a tool that threw, which the model reads too and the store\n * keeps. Return the error to send.\n *\n * The default (`redactError` from `gemi/ai`) keeps `code`, `retryable` and\n * `toolCallId` and replaces every message gemi did not write with a fixed\n * sentence for its code: a provider's error body names resources,\n * deployments and request ids, and an exception's text can be a connection\n * string. A tool that throws a `ToolError` keeps its message. The full\n * detail is in `info` (`info.failure` for the run, `info.cause` for a\n * tool), in the log, on `result().error`, and in `onError`, which is handed\n * the unredacted error.\n *\n * Override it to show more, for instance everything in development:\n *\n * protected redactError(error, info, ctx) {\n * if (process.env.NODE_ENV === \"development\") return error;\n * return super.redactError(error, info, ctx);\n * }\n *\n * Only the `AgentError` fields of what it returns are sent. One that throws\n * is reported and the default is used instead.\n */\n protected redactError(\n error: AgentError,\n info: ErrorRedactionInfo,\n ctx: AgentHookContext,\n ): AgentError {\n const hook = this.hooks?.redactError;\n if (hook) return hook(error, info, ctx);\n return redactError(error, info);\n }\n\n /**\n * A failure on the run's stream, unredacted: the provider's own message,\n * and the HTTP `status` and `requestId` when there were any. The client was\n * sent `redactError`'s copy.\n */\n protected onError(error: AgentError, ctx: AgentHookContext): void | Promise<void> {\n return this.hooks?.onError?.(error, ctx);\n }\n\n protected onStreamComplete(\n result: AgentRunResult<ToolShapesOf<A[\"tools\"]>, any>,\n ctx: AgentHookContext,\n ): void | Promise<void> {\n return this.hooks?.onStreamComplete?.(result, ctx);\n }\n\n /**\n * WHAT HAPPENS WHEN A HOOK THROWS: it is reported and the run carries on.\n *\n * The alternative is to fail the run, and that trade is not close. These\n * hooks are an app's persistence and notification points; the run is a model\n * call the user has already been charged for and whose tools may already have\n * charged a card. Letting a failed `INSERT` in `onMessage` abort a generation\n * mid-sentence loses the answer as well as the row, and the user cannot\n * retry into a better outcome. So the answer survives and the failure is\n * logged.\n *\n * It is logged rather than routed to `onError`: `onError` is itself a hook,\n * and a hook that throws inside the handler for hooks that throw is a loop.\n * Override this to send it somewhere with a pager attached.\n */\n protected reportHookFailure(error: unknown): void {\n const hook = this.hooks?.reportHookFailure;\n if (hook) {\n // The reporter for failed hooks is a hook too: one that throws falls\n // back to the log rather than becoming an unhandled rejection.\n try {\n return hook(error);\n } catch (reportError) {\n console.error(\"[gemi/ai] reportHookFailure hook failed\", reportError);\n }\n }\n console.error(\"[gemi/ai] agent controller hook failed\", error);\n }\n\n private async dispatchEvent(event: AgentStreamEvent, ctx: AgentHookContext): Promise<void> {\n switch (event.type) {\n case \"tool-call\":\n // Skipped while the arguments are still streaming: a hook that fires\n // per token would fire with a half-parsed input, which is worse than\n // firing late. And skipped for a re-sent frame, which carries a parked\n // sub-run's record on a call this hook has already seen — once per call\n // is the contract, and a run that re-parks would otherwise fire it for\n // a call some earlier run made.\n if (!event.part.partial && !event.resent) {\n await this.onToolCall(\n {\n toolCallId: event.part.toolCallId,\n name: String(event.part.name),\n input: event.part.input,\n },\n ctx,\n );\n }\n return;\n case \"tool-result\": {\n const result = event.part as ToolResultPart;\n await this.onToolResult(result, ctx, {\n toolCallId: result.toolCallId,\n name: String(result.name),\n input: toolCallInputOf(result),\n });\n return;\n }\n case \"awaiting-input\":\n await this.onAwaitingInput(event.pending as PendingToolCall[], ctx);\n return;\n case \"error\":\n // The frame carries the redacted copy; the hook is server-side and\n // gets what it was made from.\n await this.onError(unredactedError(event.error), ctx);\n return;\n default:\n return;\n }\n }\n\n /**\n * The thread as a client should see it: the store's history, with any\n * assistant message a dead run left unfinished marked `interrupted` (#617).\n *\n * For the app's own route that hands a thread to `useChat` (or a native\n * session) as its initial messages. A message whose run is still going here\n * is left as it is, still being written, so the client attaches to it. `null`\n * for a thread the store does not have, as `loadThread` answers.\n *\n * It does not write: the next turn on the thread settles the same messages\n * the same way and stores them then, under the thread's lock.\n *\n * Typed by the controller's agent (#1100), as `useChat`'s `initialMessages`\n * for the route is, so the result goes there with no cast. A controller that\n * picks its agent per request is typed by the widest one, `A`.\n */\n async readThread(\n threadId: string,\n options: { scope?: string | null } = {},\n ): Promise<ThreadMessage<A>[] | null> {\n // `scope`: the thread's store scope (#1177), as `storeScope()` answers it.\n const store =\n options.scope === null || options.scope === undefined\n ? this.store\n : scopedStore(this.store, options.scope);\n const history = await store.loadThread(threadId);\n if (!history) return null;\n const { messages } = await this.settleThread(threadId, history, { write: false });\n // The store is not typed per agent; these are this agent's messages.\n return messages as ThreadMessage<A>[];\n }\n\n /**\n * Whether the run that was writing a message is still going, so the message\n * is in progress rather than interrupted.\n *\n * The default asks this process's `liveRuns`, which is the whole answer on a\n * single instance: a run lives in the process that started it, and a run\n * that is not there died with an earlier one. A finished run still within\n * `ttlMs` counts as live, since its final write may not have landed yet.\n *\n * Behind several instances it is not the whole answer. A run on another\n * instance is not in this map, so its message reads as interrupted here\n * until that run's own writes replace it. Knowing better needs a lasting\n * record of running runs (#459); override this to consult one.\n */\n protected isRunLive(runId: string, threadId: string): boolean | Promise<boolean> {\n void threadId;\n return this.liveRuns.get(runId) !== null;\n }\n\n private async settleThread(\n threadId: string,\n history: AgentMessage[],\n { write }: { write: boolean },\n ): Promise<{ messages: AgentMessage[]; jobs: AgentJobRecord[] }> {\n const isLive = (runId: string) => this.isRunLive(runId, threadId);\n const interrupted = await settleInterrupted(history, isLive);\n let messages = interrupted.messages;\n let jobs: AgentJobRecord[] = [];\n const settled = new Map(interrupted.settled.map((message) => [message.id, message]));\n\n // Background jobs (#461): each `running` tool result gets its job's\n // current state, and the ones that settled are written back with the\n // rest. A job store that cannot be read leaves the results `running`,\n // which is what the model saw last time, rather than failing the turn.\n if (hasRunningResult(messages) || write) {\n try {\n const overlaid = await overlayJobs(messages, {\n threadId,\n store: AgentJobs.store,\n isRunLive: isLive,\n outputSchemaFor: (name) => this.toolNamed(name)?.outputSchema,\n modelOutputFor: (name, output) =>\n modelOutputOf(this.toolNamed(name), output, (err) => this.reportHookFailure(err)),\n scan: this.jobsBlockMax(),\n });\n messages = overlaid.messages;\n jobs = overlaid.jobs;\n for (const message of overlaid.settled) settled.set(message.id, message);\n if (write && overlaid.orphans.length > 0) {\n await markOrphans(AgentJobs.store, overlaid.orphans, (err) =>\n this.reportHookFailure(err),\n );\n const orphans = new Set(overlaid.orphans.map((record) => record.id));\n jobs = jobs.map((record) =>\n orphans.has(record.id) ? { ...record, orphaned: true as const } : record,\n );\n }\n } catch (err) {\n this.reportHookFailure(err);\n }\n }\n\n if (write && settled.size > 0) {\n try {\n await this.store.appendMessages(threadId, [...settled.values()]);\n } catch (err) {\n // The run still gets the settled history. The store keeps the\n // unfinished copy, and the next turn settles it the same way again.\n this.reportHookFailure(err);\n }\n }\n return { messages, jobs };\n }\n\n /** The agent's `jobs.contextBlock.max`, or 0 for no block. */\n private jobsBlockMax(): number {\n const block = (this.agent as { jobs?: { contextBlock?: { max?: number } | false } }).jobs\n ?.contextBlock;\n if (block === false) return 0;\n return block?.max ?? DEFAULT_JOBS_CONTEXT_MAX;\n }\n\n private jobsBlock(jobs: AgentJobRecord[]): string | null {\n return renderJobsBlock(jobs, this.jobsBlockMax());\n }\n\n /** A tool's output schema, by name, for checking a background job's output. */\n private toolNamed(name: string): ToolLike | undefined {\n const visit = (entries: readonly unknown[]): ToolLike | undefined => {\n for (const entry of entries) {\n const tool = entry as ToolLike & { tools?: unknown[] };\n if (Array.isArray(tool.tools)) {\n const found = visit(tool.tools);\n if (found) return found;\n } else if (tool.name === name) {\n return tool;\n }\n }\n return undefined;\n };\n return visit((this.agent as { tools?: readonly unknown[] }).tools ?? []);\n }\n\n /**\n * Feeds the run's frames to its journal as they are emitted.\n *\n * A subscriber of its own on `run.frames()` rather than a ride on the\n * `onEvent` chain: that chain waits for the app's hooks, and a slow\n * `onToolCall` must not be what decides whether a tool call was stored\n * before the process died. `frames()` is a read of the run's own buffer, the\n * one `toResponse` already reads beside `liveRuns`, so a third reader costs a\n * cursor and nothing else.\n */\n private follow(run: AgentRun, journal: TurnJournal): void {\n void (async () => {\n try {\n for await (const frame of run.frames()) journal.frame(frame);\n } catch (err) {\n this.reportHookFailure(err);\n }\n })();\n }\n\n /**\n * Runs after the stream is over, whether or not anyone was still watching it.\n *\n * The messages come from `result()` rather than from the event stream because\n * assembling a message out of deltas is the agent's job and doing it twice is\n * how the two copies drift. It also means a stopped run persists the same way\n * a finished one does: `stop()` finalizes the transcript, so by the time this\n * resolves there is a valid history to store.\n *\n * `stored` settles when the transcript is in the store, not when the app is\n * done with it. The next turn on this thread waits on that (see\n * `withThread`), and the hooks are the app's: an `onMessage` that writes to\n * something slow would make every later turn wait for it, once per message\n * of the old run, and one that never settles — which `safely` cannot catch —\n * would hold the thread, and every turn queued on it, behind an open\n * connection each. So the hooks run on after it on their own, reported the\n * same way.\n *\n * `hooks` settles once they have too, and every event-stream hook the run\n * led to (`eventHooks`), or after `hookHoldMs` of them, and is what the\n * request that started the run is held open for. Separate from\n * `stored` for the reason above, and it has to exist from the start: by the\n * time the hooks are called the run has settled, and the request with it,\n * unless something was already holding it. Neither rejects.\n */\n private persistRun(\n run: AgentRun,\n ctx: AgentHookContext,\n eventHooks: Promise<void>,\n journal: TurnJournal | null = null,\n early: EarlyTurn = { id: null, notified: Promise.resolve() },\n ): { stored: Promise<void>; hooks: Promise<void> } {\n // Assigned before `stored` settles, on every path, so `hooks` below reads\n // the chain this run actually started.\n let notified: Promise<void> = Promise.resolve();\n\n const stored = (async () => {\n let result: AgentRunResult<ToolShapes, unknown>;\n try {\n result = await run.result();\n } catch (err) {\n // What was written while it ran stays: it is the most the store can\n // know about a run that did not settle, and the next read marks it\n // interrupted once the run is gone.\n journal?.close();\n await journal?.settled();\n // After the turn's own `onMessage`, if the run got that far: the hooks\n // keep their order on every path.\n notified = early.notified.then(() =>\n this.safely(() =>\n this.onError(\n {\n code: \"unknown\",\n message: err instanceof Error ? err.message : String(err),\n retryable: false,\n },\n ctx,\n ),\n ),\n );\n return;\n }\n\n const messages = result.messages as AgentMessage[];\n\n // The writes made while it ran land first, then the transcript whole: the\n // same messages under the same ids, now final, so this replaces every\n // in-progress copy rather than adding to them.\n journal?.close(messages);\n await journal?.settled();\n\n if (ctx.threadId && messages.length > 0) {\n try {\n await this.store.appendMessages(ctx.threadId, messages);\n } catch (err) {\n this.reportHookFailure(err);\n }\n }\n\n notified = this.notifyRun(result, messages, ctx, early);\n })();\n\n // The bound starts once the run has settled, not with the run: a long run\n // is not a hung hook. `eventHooks` is in it because the event-stream hooks\n // are chained (see `MemoryLiveRuns.register`): an `onAwaitingInput` queued\n // behind a slow `onToolCall` is called after the run, and after every hook\n // above, and has nothing else to hold the request for it.\n const hooks = stored.then(() =>\n within(\n Promise.all([notified, eventHooks]).then(() => {}),\n this.hookHoldMs,\n ),\n );\n return { stored, hooks };\n }\n\n /** The hooks on a finished run, in order. Never rejects: see `safely`. */\n private async notifyRun(\n result: AgentRunResult<ToolShapes, unknown>,\n messages: AgentMessage[],\n ctx: AgentHookContext,\n early: EarlyTurn,\n ): Promise<void> {\n // The turn's message was handed to `onMessage` while the run went. It\n // comes before every message the run made after it, so waiting for it\n // here keeps the hook's order the transcript's.\n await early.notified;\n for (const message of messages) {\n if (message.id === early.id) continue;\n await this.safely(() => this.onMessage(message, ctx));\n }\n\n await this.safely(() => this.onStreamComplete(result as any, ctx));\n }\n\n private async safely(fn: () => void | Promise<void>): Promise<void> {\n try {\n await fn();\n } catch (err) {\n this.reportHookFailure(err);\n }\n }\n}\n\n/**\n * The turn's user message, as far as the app's `onMessage` has heard of it\n * (#806).\n *\n * The turn's message is the one thing a run stores that the app usually wants\n * to tag from the request: where it was sent from, whether the app sent it on\n * the user's behalf. Called after the run with everything else, those tags\n * were missing for the whole of a long run, to a reload or a second tab, while\n * the store already held the message. So it is called as soon as the journal\n * has written it, and `notifyRun` skips it by `id`: once per message, as\n * before, and in the same order.\n */\n/** What the controller reads off one of its agent's tools by name. */\ntype ToolLike = {\n name?: string;\n outputSchema?: Schema<any>;\n toModel?: (output: any) => unknown;\n};\n\ntype EarlyTurn = {\n /** The turn message's id, once the run has reported it. */\n id: string | null;\n /** Settles once its `onMessage` has. Never rejects. */\n notified: Promise<void>;\n};\n\n// --- request plumbing ----------------------------------------------------\n\n/**\n * The keys of the turn envelope itself, which `useChat` puts in the same JSON\n * object as an app's `body`.\n *\n * Listed so `appBody` can take them back out. Sharing one object was the right\n * wire choice — a nested `body` field would be a second envelope for every\n * client, including the Swift and Kotlin ones — but it does mean the app's\n * fields and the framework's are mixed together on arrival, and handing an app\n * `turn` and `messages` would invite reading them. They are this module's to\n * change; an app that depended on their shape would break on a release that\n * never mentioned them.\n */\nconst ENVELOPE_KEYS = [\"turn\", \"clientRunId\", \"threadId\", \"messages\", \"regenerate\"] as const;\n\n/**\n * The turn's own fields, which `toClientTurn` reads off the top level when the\n * body carries no `turn` object. Reserved in that form and only that form —\n * with an envelope present, a top-level `text` is the app's.\n */\nconst BARE_TURN_KEYS = [\"text\", \"files\", \"toolResults\"] as const;\n\n/**\n * An app's own fields, out of the parsed turn body.\n *\n * A fresh object rather than a `delete` on the parsed one. Nothing reads the\n * body after this today — `turn`, `threadId`, `clientRunId` and `messages` are\n * all pulled out above — so this is not load-bearing and no test pins it. It is\n * how a helper that takes a parsed body should behave regardless: the next\n * reader to move a line above this one should not have to know that the body\n * was quietly hollowed out.\n */\nfunction appBody<Body extends object>(\n body: Record<string, any>,\n reserved: readonly string[] = hasTurnEnvelope(body)\n ? ENVELOPE_KEYS\n : [...ENVELOPE_KEYS, ...BARE_TURN_KEYS],\n): Body {\n const extra: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(body)) {\n if (reserved.includes(key)) continue;\n // `JSON.parse` produces `__proto__` as an own property, and `Object.entries`\n // hands it over like any other. Assigning it with `[]` goes through\n // `Object.prototype`'s setter and changes the prototype of the object an app\n // is about to read — from a value the client chose. `defineProperty` writes\n // the key itself, which is what \"the fields the client sent\" means.\n Object.defineProperty(extra, key, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n return extra as Body;\n}\n\n/**\n * The app's fields from an upload's `body` form part — the JSON of\n * `useChat`'s `body` option — in the shape `stream` hands out.\n *\n * One JSON part rather than a form field per key: a form field is a string, so\n * `{ count: 3 }` would arrive as `\"3\"` and `Body` would lie on this route and\n * not the other. A missing part is `{}`, as a turn with no app fields is.\n *\n * Only the envelope's four names are taken back out, not the bare-turn ones:\n * `useChat` always sends a `turn` envelope, so on `stream` an app's `text` is\n * the app's, and it has to be here as well.\n *\n * Anything else — a file where the JSON should be, JSON that does not parse,\n * JSON that is not an object — is a 400, not `{}`. Read as empty, the scope\n * would quietly resolve to `null` and the upload downgrade, and the reason\n * would be a missing page rather than a broken client.\n */\nfunction uploadAppBody<Body extends object>(part: FormDataEntryValue | null): Body {\n if (part === null) {\n return {} as Body;\n }\n let parsed: unknown;\n if (typeof part === \"string\") {\n try {\n parsed = JSON.parse(part);\n } catch {\n throw new InvalidUploadError(\"The upload's `body` field is not valid JSON.\");\n }\n }\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new InvalidUploadError(\"The upload's `body` field must be a JSON object.\");\n }\n return appBody<Body>(parsed as Record<string, any>, ENVELOPE_KEYS);\n}\n\n/**\n * A 400 from `upload`, which answers `UploadResult` and so rejects by throwing.\n * The payload is the shape `stream`'s own 400s have, so a client reads both the\n * same way.\n */\nclass InvalidUploadError extends RequestBreakerError {\n constructor(message: string) {\n super(message);\n this.name = \"InvalidUploadError\";\n this.payload = {\n api: { status: 400, data: { error: { code: \"invalid_request\", message } } },\n view: {},\n };\n }\n}\n\n/**\n * The provider's upload, with a refusal of THE FILE answered as the client's\n * problem rather than the server's.\n *\n * A vendor that will not take a file answers 4xx, and before this that left\n * `upload` as an unhandled `ProviderHttpError`: a 500 that tells the person\n * attaching the file nothing about the file. MEASURED on Azure (#682,\n * 2026-10-01): with `purpose: \"user_data\"` a `.docx` was refused with `400\n * Unsupported extension: .docx. Supported extensions: .txt, .md, .pdf, …`; with\n * `assistants` the `.docx` is accepted (and read in a turn), and an `.exe` is\n * refused with `400 Invalid extension exe. Supported formats: \"c\", \"cpp\", …`.\n * Either sentence is exactly what the person needs to read, so it is passed\n * through as the message.\n *\n * Only the statuses that are about the request body: 400, 413, 415 and 422. A\n * 401/403 is our key, a 429/5xx is the vendor's day, and both stay server\n * errors — a person cannot fix either by picking another file.\n */\nasync function providerUpload(provider: { upload(file: File): Promise<string> }, file: File) {\n try {\n return await provider.upload(file);\n } catch (error) {\n if (error instanceof ProviderHttpError && REJECTED_FILE_STATUSES.has(error.status)) {\n throw new RejectedUploadError(normalizeProviderError(error).message);\n }\n throw error;\n }\n}\n\nconst REJECTED_FILE_STATUSES = new Set([400, 413, 415, 422]);\n\n/** A 422 from `upload` for a file outside `attachmentLimits`, or one\n * `checkUpload` refused. */\nclass LimitedUploadError extends RequestBreakerError {\n constructor(code: string, message: string) {\n super(message);\n this.name = \"LimitedUploadError\";\n this.payload = {\n api: { status: 422, data: { error: { code, message } } },\n view: {},\n };\n }\n}\n\n/** Why `file` is outside `limits`, or `null` when it is not. Exported for the\n * tests; the route is the only caller. */\nexport function limitRefusal(\n limits: AttachmentLimits | null | undefined,\n file: Blob,\n name: string,\n mimeType: string,\n): { code: \"file_too_large\" | \"unsupported_file_type\"; message: string } | null {\n if (!limits) return null;\n const { maxBytes, accept } = limits;\n if (typeof maxBytes === \"number\" && file.size > maxBytes) {\n return {\n code: \"file_too_large\",\n message: `${JSON.stringify(name)} is ${formatBytes(file.size)}; the limit is ${formatBytes(maxBytes)}.`,\n };\n }\n if (\n accept &&\n accept.length > 0 &&\n !accept.some((entry) => acceptMatches(entry, name, mimeType))\n ) {\n return {\n code: \"unsupported_file_type\",\n message: `${JSON.stringify(name)} is not a type this chat accepts. Accepted: ${accept.join(\", \")}.`,\n };\n }\n return null;\n}\n\nfunction acceptMatches(entry: string, name: string, mimeType: string): boolean {\n const rule = entry.trim().toLowerCase();\n if (!rule) return false;\n if (rule.startsWith(\".\")) return name.toLowerCase().endsWith(rule);\n const type = mimeType.toLowerCase().split(\";\")[0]!.trim();\n if (rule.endsWith(\"/*\")) return type.startsWith(rule.slice(0, -1));\n return type === rule;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n const units = [\"KB\", \"MB\", \"GB\"];\n let value = bytes / 1024;\n let unit = 0;\n while (value >= 1024 && unit < units.length - 1) {\n value /= 1024;\n unit++;\n }\n return `${Math.round(value * 10) / 10} ${units[unit]}`;\n}\n\n/**\n * A 422 from `upload`: the provider would not take this file. `code` is\n * `unsupported_file_type` when the vendor said the type was the problem (an\n * extension or format allow-list) and `file_rejected` otherwise, so\n * a composer can mark the one chip without parsing English. Same payload shape\n * as `InvalidUploadError`.\n */\nclass RejectedUploadError extends RequestBreakerError {\n constructor(message: string) {\n super(message);\n this.name = \"RejectedUploadError\";\n const code =\n /(unsupported|invalid) (extension|file type|format|mime)|supported (extensions|formats?)/i.test(\n message,\n )\n ? \"unsupported_file_type\"\n : \"file_rejected\";\n this.payload = {\n api: { status: 422, data: { error: { code, message } } },\n view: {},\n };\n }\n}\n\n/**\n * A body, or the reason there is not one.\n *\n * Deliberately one shape with an optional `error` rather than a discriminated\n * union on `ok`: this package compiles with `strict: false`, and without\n * `strictNullChecks` TypeScript will not narrow a union by a boolean\n * discriminant — `if (!parsed.ok)` leaves `parsed.message` an error. A field\n * that is either set or not needs no narrowing to read.\n */\ntype ParsedBody = {\n body: Record<string, any>;\n error?: string;\n /** Which HTTP error the rejection is. A missing one is the 400. */\n status?: number;\n code?: string;\n};\n\n/**\n * The body, as JSON — or a reason it is not.\n *\n * Read off the raw request rather than through `req.input()`: that path also\n * accepts `+json` types and answers its failures as a thrown refusal, while\n * these routes are held to `application/json` alone (below) and answer with\n * a `{ code, message }` body of their own.\n *\n * Matching the type by prefix is not the same as ignoring it. A body that\n * arrives as anything other than `application/json` is a 415, and the reason\n * is not tidiness: a cross-site `<form enctype=\"text/plain\">` can be made to\n * concatenate its one field into valid JSON, and a JSON parser that reads\n * whatever it is handed turns that form into a turn on someone else's\n * conversation. Insisting on `application/json` is what makes these routes\n * non-simple requests — the browser will not send one cross-origin without a\n * preflight — and that holds whether or not the app's cookies are `SameSite`\n * and whether or not `CSRFMiddleware` is mounted. Only a request that carries a\n * body is held to this; a bodiless POST has no type to check and stays `{}`.\n *\n * The three cases are kept apart deliberately. NO body is a real request — a\n * reattach, or a turn that just lets the model continue — and reads as `{}`. A\n * body that will not parse, or that parses to something other than an object,\n * is a failed request and has to say so: folding it into `{}` made a truncated\n * proxy response or a mis-serialized client indistinguishable from an empty\n * turn, so `stream` billed a model call with no history and no turn and threw\n * the user's actual message away. That presents as the model hallucinating\n * rather than as an error, which is the expensive way to debug it. Pre-flight\n * failures stay ordinary HTTP errors and never reach the event stream.\n *\n * An array counts as malformed even though `typeof [] === \"object\"`: nothing\n * downstream reads a positional body, so `[1,2,3]` could only ever have run as\n * an empty turn.\n */\nasync function readJsonBody(req: HttpRequest<any, any>, maxBytes: number): Promise<ParsedBody> {\n const raw = req?.rawRequest;\n if (!raw || raw.method === \"GET\" || raw.method === \"HEAD\" || !raw.body) {\n return { body: {} };\n }\n\n if (!isJsonContentType(raw.headers.get(\"Content-Type\"))) {\n // Before the body is read: nothing in a body about to be refused is worth\n // the bytes, and the refusal must not depend on what they were.\n return {\n body: {},\n status: 415,\n code: \"unsupported_media_type\",\n error: \"The request body must be sent as application/json.\",\n };\n }\n\n // Before a byte is read when the client declared its length, and while\n // reading when it did not (#444).\n const declared = Number(raw.headers.get(\"Content-Length\"));\n if (Number.isFinite(declared) && declared > maxBytes) {\n return bodyTooLarge(maxBytes);\n }\n\n let text: string;\n try {\n const read = await readCapped(raw, maxBytes);\n if (read === null) {\n return bodyTooLarge(maxBytes);\n }\n text = read;\n } catch {\n // A body that stopped arriving mid-flight. Same class of failure as one\n // that arrived truncated, and the same answer.\n return { body: {}, error: \"The request body could not be read.\" };\n }\n\n if (!text.trim()) {\n return { body: {} };\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n return { body: {}, error: \"The request body is not valid JSON.\" };\n }\n\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return { body: {}, error: \"The request body must be a JSON object.\" };\n }\n\n return { body: parsed as Record<string, any> };\n}\n\n/**\n * Media types compare case-insensitively and may carry parameters, so the\n * comparison is on the lowercased type with its parameters cut off, and\n * `Application/JSON; charset=utf-8` passes. It is an equality on that type\n * rather than a prefix, so `application/json-seq` and the other types that\n * merely begin with those bytes do not. None of the three types a browser will\n * send without a preflight — `text/plain`, `application/x-www-form-urlencoded`,\n * `multipart/form-data` — does either, and neither does no type at all, which\n * is what a hand-written `fetch` with a string body and no header ends up\n * sending as `text/plain`.\n */\nfunction isJsonContentType(value: string | null): boolean {\n return mediaType(value) === \"application/json\";\n}\n\n/**\n * The body as text, or `null` once more than `maxBytes` of it has arrived, at\n * which point the rest is not read. A limit that is not finite reads it all.\n */\nasync function readCapped(raw: Request, maxBytes: number): Promise<string | null> {\n if (!Number.isFinite(maxBytes) || !raw.body) {\n return await raw.text();\n }\n const reader = raw.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (size > maxBytes) {\n await reader.cancel().catch(noop);\n return null;\n }\n chunks.push(value);\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return new TextDecoder().decode(bytes);\n}\n\nfunction bodyTooLarge(maxBytes: number): ParsedBody {\n return {\n body: {},\n status: 413,\n code: \"body_too_large\",\n error: `The request body is larger than this agent accepts (${maxBytes} bytes).`,\n };\n}\n\n/**\n * A refusal for one of #444's limits: the `{ kind, message, status }` every\n * refusal has (#686), plus the `code` the agent routes' own errors carry, so a\n * client can tell the limits apart without reading the message.\n */\nfunction limitResponse(status: number, code: string, message: string): Response {\n return jsonResponse(status, {\n ...refusal(refusalKindForStatus(status), message, status),\n code,\n });\n}\n\nfunction invalidRequest(parsed: ParsedBody): Response {\n if (parsed.status === 413) {\n return limitResponse(413, parsed.code ?? \"body_too_large\", parsed.error ?? \"\");\n }\n return jsonResponse(parsed.status ?? 400, {\n code: parsed.code ?? \"invalid_request\",\n message: parsed.error,\n });\n}\n\n/**\n * Whether the turn arrived in a `turn` object of its own, rather than spread\n * across the top level of the body.\n *\n * Both forms are accepted, and which one it is decides what belongs to the app:\n * a top-level `text` is the user's message in the bare form and an app's own\n * field in the enveloped one. `toClientTurn` and `appBody` have to agree about\n * that, so they ask the same question here rather than each testing it.\n */\nfunction hasTurnEnvelope(body: Record<string, any>): boolean {\n return Boolean(body.turn) && typeof body.turn === \"object\";\n}\n\n/**\n * The client's turn, accepting both `{ turn: {...} }` and the flattened\n * `{ text, files, toolResults }` — the second is what a hand-written `fetch`\n * writes, and refusing it buys nothing.\n *\n * `turn` is `undefined` for an empty turn, which is a real request:\n * reattaching to a conversation and letting the model continue is a turn with\n * nothing in it. `error` is a turn that is refused with a 400 before anything\n * runs — see `toTurnFiles`.\n */\nfunction toClientTurn(body: Record<string, any>): { turn?: ClientTurn; error?: string } {\n const source = hasTurnEnvelope(body) ? body.turn : body;\n const turn: ClientTurn = {};\n if (typeof source.text === \"string\") {\n turn.text = source.text;\n }\n if (Array.isArray(source.files)) {\n const files = toTurnFiles(source.files);\n if (typeof files === \"string\") {\n return { error: files };\n }\n turn.files = files;\n }\n if (Array.isArray(source.toolResults)) {\n turn.toolResults = source.toolResults;\n }\n if (Object.keys(turn).length === 0) return {};\n // Envelope only: in the bare form the top level is shared with the app's own\n // fields, and an app that already sends a `localId` of its own would lose it\n // to the turn. `null` and `\"\"` read as absent, as they do for `files`.\n if (\n source === body.turn &&\n source.localId !== undefined &&\n source.localId !== null &&\n source.localId !== \"\"\n ) {\n const { localId } = source;\n if (typeof localId !== \"string\") return { error: \"turn.localId must be a string.\" };\n // Echoed back on the stream and nothing else, so the only thing to bound\n // is what one frame carries.\n if (localId.length > MAX_LOCAL_ID_LENGTH) {\n return { error: `turn.localId is longer than ${MAX_LOCAL_ID_LENGTH} characters.` };\n }\n turn.localId = localId;\n }\n return { turn };\n}\n\n/** How long `turn.localId` may be. Comfortably above `local_<uuid>`. */\nconst MAX_LOCAL_ID_LENGTH = 200;\n\n/**\n * `turn.files`, checked field by field, or the sentence refusing it.\n *\n * REFUSED, NOT FILTERED. Every entry becomes a `FilePart` in a user message,\n * and on a thread that message is stored before the provider sees it. An entry\n * the request builder cannot send — no id at all, or a gemi id in `fileId` —\n * then throws from `toResponsesInput` on this turn and on every turn after it,\n * because every later turn re-sends the history: one bad upload bricks the\n * thread. Dropping the entry instead is quieter and worse — the model answers\n * about a file it was never given, with nothing saying so. A 400 here is the\n * one place the client can still do something about it.\n *\n * Scoping is what makes a foreign `attachmentId` harmless (`ScopedAttachments`\n * answers the same not-found for another tenant's id as for an invented one),\n * so the id is not signed or looked up here. What this checks is the shape a\n * crash would come from: strings where strings go, the prefix on\n * `attachmentId`, at least one id. Unknown fields are dropped rather than\n * refused, since `attach()` answers more than a `FilePart` holds (`downgraded`)\n * and passing its answer on whole is the documented use. `null` and `\"\"` read\n * as absent, for every field: `null` is what a serializer that writes\n * `undefined` as `null` means, and `\"\"` is what a form field left blank sends.\n * Neither can be an id, so refusing `attachmentId: \"\"` for its prefix would\n * turn a blank into an error the entry's `fileId` does not deserve.\n */\nfunction toTurnFiles(raw: unknown[]): NonNullable<ClientTurn[\"files\"]> | string {\n const files: NonNullable<ClientTurn[\"files\"]> = [];\n for (const [index, entry] of raw.entries()) {\n const where = `turn.files[${index}]`;\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n return `${where} must be an object.`;\n }\n const fields: Record<string, string> = {};\n for (const key of [\"fileId\", \"attachmentId\", \"name\", \"mimeType\"] as const) {\n const value = (entry as Record<string, unknown>)[key];\n if (value === undefined || value === null || value === \"\") continue;\n if (typeof value !== \"string\") {\n return `${where}.${key} must be a string.`;\n }\n fields[key] = value;\n }\n const { fileId, attachmentId, name, mimeType } = fields;\n if (fileId?.startsWith(ATTACHMENT_ID_PREFIX)) {\n return `${where}.fileId holds a gemi attachment id (${fileId}). \\`fileId\\` is the provider's id from the upload response; put this one in \\`attachmentId\\`.`;\n }\n if (attachmentId !== undefined && !attachmentId.startsWith(ATTACHMENT_ID_PREFIX)) {\n return `${where}.attachmentId is not a gemi attachment id: it must start with \"${ATTACHMENT_ID_PREFIX}\".`;\n }\n if (!fileId && !attachmentId) {\n return `${where} has neither a \\`fileId\\` nor an \\`attachmentId\\`. Send the ids the upload response answered.`;\n }\n files.push({\n ...(fileId ? { fileId } : {}),\n ...(attachmentId ? { attachmentId } : {}),\n ...(name !== undefined ? { name } : {}),\n ...(mimeType !== undefined ? { mimeType } : {}),\n });\n }\n return files;\n}\n\n/**\n * Where to resume from, or `undefined` for \"wherever you still can\".\n *\n * An explicit `from` wins, because a client that tracked its own position knows\n * something the transport does not. Otherwise `Last-Event-ID` — the browser\n * sends it on its own when an `EventSource` reconnects, and the frames put\n * `seq` in `id:` precisely so that header is already the right question. It\n * names the last event *received*, so the resume point is one past it.\n *\n * With neither, the answer is `undefined` and NOT 0. A client reattaching on\n * mount is a fresh POST from a page that has just loaded: no `Last-Event-ID`,\n * and no cursor of its own, because the only handle it was given is the\n * `threadId`. Reading that as \"resume from frame 0\" asked `replay` for a frame\n * every run longer than `maxFrames` has already evicted, so the mount-time\n * reattach — the one case `/attach` exists for — 410'd on exactly the long runs\n * it was meant to rescue, and the documented remedy of reloading the thread\n * does not help because the store is only written at run end. `undefined` means\n * the tail, which is all such a client can use anyway.\n */\nfunction resolveCursor(req: HttpRequest<any, any>, body: Record<string, any>): number | undefined {\n if (typeof body.from === \"number\" && Number.isFinite(body.from)) {\n return Math.max(0, Math.floor(body.from));\n }\n // `cursor` is what `useChat` actually sends, and it counts the other way:\n // `from` is the frame to resume AT, `cursor` the last frame the client\n // APPLIED — the same convention as `Last-Event-ID`, and the same `+ 1`. A\n // client that has applied nothing sends -1, which is not a position but the\n // absence of one, so it falls through to the tail rather than asking for\n // frame 0 and 410ing on precisely the long runs `/attach` exists to rescue.\n if (typeof body.cursor === \"number\" && Number.isFinite(body.cursor)) {\n const applied = Math.floor(body.cursor);\n if (applied >= 0) {\n return applied + 1;\n }\n return undefined;\n }\n const header = req?.rawRequest?.headers?.get(\"Last-Event-ID\");\n if (header) {\n const seq = Number.parseInt(header, 10);\n if (Number.isFinite(seq)) {\n return Math.max(0, seq + 1);\n }\n }\n return undefined;\n}\n\nfunction searchParam(req: HttpRequest<any, any>, key: string): string | undefined {\n const value = req?.search?.get(key);\n return typeof value === \"string\" ? value : undefined;\n}\n\n/**\n * Where a threaded regenerate cuts the history: at the last message the user\n * wrote, with the turn that wrote it. A file a tool showed is a user-role\n * message too, but it is part of the answer being replaced, so it is stepped\n * over (`injectedMessageIds`, the test `historyForProvider` uses).\n */\nfunction regenerationCut(\n messages: AgentMessage[],\n): { index: number; turn: ClientTurn } | null {\n const injected = injectedMessageIds(messages);\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index]!;\n if (message.role !== \"user\" || injected.has(message.id)) continue;\n let text = \"\";\n const files: NonNullable<ClientTurn[\"files\"]> = [];\n for (const part of message.content) {\n if (part.type === \"text\") text += part.text;\n if (part.type === \"file\") {\n files.push({\n ...(part.fileId ? { fileId: part.fileId } : {}),\n ...(part.attachmentId ? { attachmentId: part.attachmentId } : {}),\n ...(part.name ? { name: part.name } : {}),\n ...(part.mimeType ? { mimeType: part.mimeType } : {}),\n });\n }\n }\n if (!text && files.length === 0) continue;\n return {\n index,\n turn: { ...(text ? { text } : {}), ...(files.length > 0 ? { files } : {}) },\n };\n }\n return null;\n}\n\n/** A turn `/stop` ended while it waited, before anything ran or was charged. */\nfunction stoppedBeforeStart(): Response {\n return jsonResponse(409, {\n code: \"stopped\",\n message: \"The turn was stopped before it started.\",\n });\n}\n\n/** `startTurn`'s `event`, checked and copied, or a throw saying what is wrong with it. */\nfunction checkTurnEvent(params: AgentTurnParams<any>): AgentTurnEvent {\n const event = params.event as AgentTurnEvent;\n if (params.text !== undefined || params.turn !== undefined) {\n throw new TypeError(\n \"AgentController.startTurn takes an `event` or a `text`/`turn`, not both: an event is not a person's message.\",\n );\n }\n if (typeof event !== \"object\" || event === null || typeof event.name !== \"string\" || !EVENT_NAME.test(event.name)) {\n throw new TypeError(\n \"AgentController.startTurn's `event.name` must be letters, digits and `.`, `_`, `:`, `-` (at most 64), like \\\"job-settled\\\".\",\n );\n }\n if (event.text !== undefined && typeof event.text !== \"string\") {\n throw new TypeError(\"AgentController.startTurn's `event.text` must be a string.\");\n }\n let data: unknown;\n if (event.data !== undefined) {\n try {\n data = JSON.parse(JSON.stringify(event.data));\n } catch (error) {\n throw new TypeError(`AgentController.startTurn's \\`event.data\\` is not JSON: ${String(error)}`);\n }\n }\n return {\n name: event.name,\n ...(event.text ? { text: event.text } : {}),\n ...(data !== undefined ? { data } : {}),\n };\n}\n\n/** A `startTurn({ ifBusy: \"skip\" })` on a busy thread (#1178). `startTurn` answers `{ skipped: true }` for it. */\nfunction threadBusy(threadId: string): Response {\n return jsonResponse(409, {\n code: THREAD_BUSY,\n message: `Thread ${threadId} has a run going, and this turn was not to interrupt it.`,\n });\n}\n\n/**\n * The refusal for a run that belongs to another caller (#442), in the shape\n * every other refusal has (`{ kind, message, status }`, #686), so `useChat` and\n * the client guards classify it as `permission` without matching on text.\n */\nfunction notYourRun(): Response {\n return jsonResponse(\n 403,\n refusal(\"permission\", \"This run belongs to someone else.\", 403) as Record<string, unknown>,\n );\n}\n\n/** The refusal for a turn naming another owner's provider file (#443). Same\n * shape as `notYourRun`. */\nfunction notYourFile(): Response {\n return jsonResponse(\n 403,\n refusal(\n \"permission\",\n \"A file in this turn was uploaded by someone else.\",\n 403,\n ) as Record<string, unknown>,\n );\n}\n\n/**\n * The file parts of a stateless chat's history, which the client carries and\n * may have written anything into. Read defensively: the history is not\n * validated anywhere else before the run, and a malformed one is the run's\n * problem, not this check's.\n */\nfunction clientHistoryFiles(messages: unknown): { fileId?: string }[] {\n if (!Array.isArray(messages)) return [];\n const files: { fileId?: string }[] = [];\n for (const message of messages) {\n const content = (message as { content?: unknown } | null)?.content;\n if (!Array.isArray(content)) continue;\n for (const part of content) {\n if (part && typeof part === \"object\" && typeof part.fileId === \"string\") {\n files.push({ fileId: part.fileId });\n }\n }\n }\n return files;\n}\n\n/** What `voiceStart` takes out of the body before the rest is the app's. */\nconst VOICE_START_KEYS = [\"sdp\", \"threadId\", \"pushToTalk\"] as const;\n\ntype VoiceBridgeController<Body extends object> = {\n startTurn(params: AgentTurnParams<Body>): Promise<AgentTurn>;\n};\n\nfunction voiceNotEnabled(): Response {\n return jsonResponse(404, {\n code: \"voice_not_enabled\",\n message: \"This agent has no voice: set `voice` on its controller.\",\n });\n}\n\nfunction jsonResponse(status: number, error: Record<string, unknown>): Response {\n return new Response(JSON.stringify({ error }), {\n status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n}\n\n// --- attachments ---------------------------------------------------------\n\n/**\n * Reads the client's `destination` field and applies it to the app's policy.\n *\n * THE ONLY THING A CLIENT MAY ASK FOR IS \"DO NOT SEND THIS TO THE VENDOR\", and\n * that is the entire permitted vocabulary: a `storage` hint under a `both`\n * policy, or a hint that agrees with the policy and changes nothing. Everything\n * else throws.\n *\n * The rule here used to be \"a hint may narrow, never widen\", counting\n * destinations, and counting is what made it wrong in one direction.\n * `both → provider` is fewer destinations and reads as narrowing, but what it\n * removes is *gemi's own copy*, while the third party still gets the file. That\n * is not a client declining exposure, it is a client overriding the app's\n * retention decision from a field in a multipart body: an app that keeps every\n * upload because a tool has to forward it — or because an auditor asked — loses\n * the copy, mints no `attachmentId`, records nothing, and gets no warning\n * either, since the bytes did reach the provider exactly as policy said. The\n * two directions are not alike, because only one of them reduces who ends up\n * holding the file.\n *\n * What is left is defensible on its own terms: `storage` keeps bytes off a\n * vendor the app was willing to send them to, which is a thing the client is\n * entitled to ask for and which cannot hurt anyone if the client is lying. A UI\n * that knows this CSV exists to be imported and will never be read by the model\n * is the case that makes a hint worth having at all. The policy hook is the\n * ceiling; the hint may only take the vendor out from under it.\n *\n * A hint the policy does not permit throws rather than being ignored. Ignoring\n * it is the shape of this bug that never gets found: the client believes it kept\n * a file off the vendor, the file went anyway, and nothing anywhere says so.\n */\nfunction narrowDestination(\n policy: AttachmentDestination,\n hint: FormDataEntryValue | null,\n): AttachmentDestination {\n if (typeof hint !== \"string\" || hint.length === 0) {\n return policy;\n }\n if (hint !== \"both\" && hint !== \"provider\" && hint !== \"storage\") {\n throw new Error(\n `Unknown attachment destination \"${hint}\". Expected \"both\", \"provider\" or \"storage\".`,\n );\n }\n if (hint === policy || (policy === \"both\" && hint === \"storage\")) {\n return hint;\n }\n if (policy === \"both\" && hint === \"provider\") {\n throw new Error(\n 'This upload asked for the \"provider\" destination under a \"both\" policy. A client may ask for \"storage\", which keeps a file away from the model provider, but it may not ask the server to stop keeping its own copy while the vendor still gets the file — that is the app\\'s retention decision. Change `attachmentDestination()` if this file should not be kept.',\n );\n }\n throw new Error(\n `This upload asked for the \"${hint}\" destination, but the server's policy for it is \"${policy}\", and a client hint may only ask for \"storage\" under a \"both\" policy. Change \\`attachmentDestination()\\` if the file really should go there.`,\n );\n}\n\n/**\n * Said once per process, not once per upload.\n *\n * The condition is a property of how the app is wired — an agent route with no\n * authentication and no `threadId` on its uploads — so it is either true for\n * every request or false for every request. Logging it per request would put a\n * line in the log for every file anyone ever uploads, which is how a warning\n * stops being read.\n */\nlet warnedAboutUnscopedUpload = false;\nfunction warnUnscopedUploadOnce(): void {\n if (warnedAboutUnscopedUpload) return;\n warnedAboutUnscopedUpload = true;\n console.warn(\n \"[gemi/ai] An upload had no attachment scope, so its bytes were sent to the model provider only and no attachment id was minted — a tool cannot forward this file. Guard the route with auth, send a `threadId` with the upload, or override `attachmentScope()`.\",\n );\n}\n\n// --- routing -------------------------------------------------------------\n//\n// `agent()` itself belongs on ApiRouter next to `resource()`, which is the\n// method it works like: one call, several routes, all of them the controller's.\n// The types are declared here because they are the ai module's contract, not\n// the router's.\n//\n// class Api extends ApiRouter {\n// routes = {\n// \"/chat\": this.agent(ChatAgentController),\n// };\n// }\n//\n// POST /chat → stream every client turn\n// POST /chat/attach → attach reattach to a run in progress\n// POST /chat/stop → stop explicit cancel\n// POST /chat/files → upload attachments\n//\n// Mounting under a single path is what gives the client one key to name. The\n// agent's tool types ride along on `AgentRoute`, so `useChat(\"/chat\")` gets them\n// out of the existing `RPC` interface — no second augmentation to generate, and\n// renaming the route moves the client key with it.\n\nexport type AgentRouteMethod = \"stream\" | \"attach\" | \"stop\" | \"upload\";\n\nexport type AgentMiddlewareConfig = Partial<Record<AgentRouteMethod, MiddlewareInput>>;\n\n/**\n * What `this.agent(Controller)` returns. `T` is unconstrained so that mounting\n * the route never resolves the controller (#774): an agent whose tools are\n * routes of the same api would otherwise resolve the api's route table from\n * inside it. That `T` is an `AgentController` class is checked when the route\n * is mounted: `this.agent()` throws otherwise.\n */\nexport type AgentRoute<T> = {\n __internal_brand: \"AgentRoute\";\n controller: T;\n middleware(config: AgentMiddlewareConfig): AgentRoute<T>;\n};\n\n/** What `CreateRPC` should produce for an agent route: enough for the client to\n * type its messages, and nothing that drags server code into the bundle. */\nexport type AgentRouteRPC<T extends new () => AgentController<any, any>> = {\n __agent: true;\n // In their JSON form (#1107): what the browser holds is what came over the\n // wire, so a `Date` in a tool's output or preview is a `string` there.\n tools: InstanceType<T>[\"agent\"] extends AnyAgent\n ? JsonToolShapes<AgentToolShapes<InstanceType<T>[\"agent\"]>>\n : ToolShapes;\n output: unknown;\n /**\n * The controller's `Body`, so `useChat` can check what it sends against what\n * the controller declared.\n *\n * Read off the phantom key rather than by matching the class, which is what\n * made this fail: `Body` used to reach the instance type only through\n * `instructions`'s second parameter, and a controller overriding\n * `instructions(req)` — the pre-existing signature, so every existing\n * override — gave inference nothing to work with and got the open record.\n */\n body: InstanceType<T> extends { [BODY]?: infer B } ? B : Record<string, unknown>;\n};\n\n// --- the voice route (#921) ----------------------------------------------\n//\n// class Api extends ApiRouter {\n// routes = {\n// \"/chat\": this.agent(ChatController),\n// \"/chat/voice\": this.voice(ChatController),\n// };\n// }\n//\n// POST /chat/voice → voiceStart create the call\n// PATCH /chat/voice/:sessionId → voiceUpdate the session's body\n// DELETE /chat/voice/:sessionId → voiceEnd hang up\n//\n// One key for the client, `useVoiceSession(\"/chat/voice\")`, as `useChat` has.\n\nexport type VoiceRouteMethod = \"start\" | \"update\" | \"end\";\n\nexport type VoiceMiddlewareConfig = Partial<Record<VoiceRouteMethod, MiddlewareInput>>;\n\n/** What `this.voice(Controller)` returns. Unconstrained `T` for the reason\n * `AgentRoute`'s is (#774); checked when the route is mounted. */\nexport type VoiceRoute<T> = {\n __internal_brand: \"VoiceRoute\";\n controller: T;\n middleware(config: VoiceMiddlewareConfig): VoiceRoute<T>;\n};\n\n/** What `CreateRPC` produces for a voice route: the controller's `Body`, for\n * `useVoiceSession`'s `body` option. */\nexport type VoiceRouteRPC<T extends new () => AgentController<any, any>> = {\n __voice: true;\n body: InstanceType<T> extends { [BODY]?: infer B } ? B : Record<string, unknown>;\n};\n\n/** The longest delay `setTimeout` keeps; past it the runtime fires in ~1ms. */\nconst MAX_TIMEOUT_MS = 2 ** 31 - 1;\n\n/**\n * Settles when `work` does or after `ms`, whichever is first, and never\n * rejects. For how long the request waits on the app's code, not for the code\n * itself, which runs on either way.\n *\n * An `ms` a timer cannot hold — `Infinity` is what \"no bound\" reads as — is\n * no bound. Handed to `setTimeout` it would fire at once, and the request\n * would end before the hooks it was raised for.\n */\nfunction within(work: Promise<void>, ms: number): Promise<void> {\n const settled = work.then(\n () => {},\n () => {},\n );\n if (!(ms <= MAX_TIMEOUT_MS)) {\n return settled;\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<void>((resolve) => {\n timer = setTimeout(resolve, ms);\n });\n return Promise.race([settled, timeout]).finally(() => clearTimeout(timer));\n}\n\nlet warnedInMemoryNonces = false;\n\n/**\n * Once per process, in production: a stateless chat whose answers are spent\n * only in this process's memory. Correct for a single instance, which is why\n * it is a warning; with several, a rewound history replays an approval once\n * per instance (#445).\n */\nfunction warnInMemoryNonces(nonces: NonceStore): void {\n if (warnedInMemoryNonces || process.env.NODE_ENV !== \"production\") return;\n if (!(nonces instanceof MemoryNonceStore)) return;\n warnedInMemoryNonces = true;\n console.warn(\n \"[gemi/ai] A stateless agent chat is spending approval nonces in process memory. \" +\n \"With more than one instance a replayed approval is accepted once per instance. \" +\n \"Set `nonces = new RedisNonceStore()` (or your own NonceStore) on the AgentController.\",\n );\n}\n\n/** Whether any message holds a tool result still waiting on a background job. */\nfunction hasRunningResult(messages: AgentMessage[]): boolean {\n return messages.some((message) =>\n message.content.some((part) => part.type === \"tool-result\" && part.status === \"running\"),\n );\n}\n\n/** `store.forScope(scope)`, or an error naming what is missing (#1177). */\nfunction scopedStore(store: AgentStore, scope: string): AgentStore {\n if (typeof scope !== \"string\" || scope === \"\") {\n throw new TypeError(\"A store scope is a non-empty string.\");\n }\n if (!store.forScope) {\n throw new Error(\n \"This controller's store cannot be scoped: storeScope() or a turn's `scope` needs a store that implements `forScope` (DatabaseAgentStore or MemoryAgentStore).\",\n );\n }\n return store.forScope(scope);\n}\n\nfunction noLiveRun(threadId: string): Response {\n return jsonResponse(404, {\n code: \"no_live_run\",\n message: `No run in progress for thread ${threadId} in this process.`,\n });\n}\n"
|
|
40
40
|
],
|
|
41
|
-
"mappings": "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",
|
|
42
|
-
"debugId": "
|
|
41
|
+
"mappings": "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",
|
|
42
|
+
"debugId": "01583FE2ABE253A664756E2164756E21",
|
|
43
43
|
"names": []
|
|
44
44
|
}
|