zidane 7.2.4 → 8.0.4
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/LICENSE +21 -0
- package/README.md +34 -6
- package/dist/{acp-D-tVyUjw.js → acp-DQDhi2dj.js} +230 -77
- package/dist/acp-DQDhi2dj.js.map +1 -0
- package/dist/acp-cli.d.ts +1 -1
- package/dist/acp-cli.js +9 -66
- package/dist/acp-cli.js.map +1 -1
- package/dist/acp.d.ts +10 -590
- package/dist/acp.d.ts.map +1 -1
- package/dist/acp.js +3 -3
- package/dist/{agent-D0zZnGbt.js → agent-DSLNmBp0.js} +14401 -13214
- package/dist/agent-DSLNmBp0.js.map +1 -0
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +3 -2
- package/dist/aliasing-lVFbm81n.js +217 -0
- package/dist/aliasing-lVFbm81n.js.map +1 -0
- package/dist/{anthropic-C2aole0G.js → anthropic-CD00LhUP.js} +1442 -1264
- package/dist/anthropic-CD00LhUP.js.map +1 -0
- package/dist/artifacts-CV2hUKnL.js.map +1 -1
- package/dist/{atomic-write-B7zr1ddF.js → atomic-write-Ijgf2Mhc.js} +13 -3
- package/dist/atomic-write-Ijgf2Mhc.js.map +1 -0
- package/dist/call-tool-dHlbGOIY.js +70 -0
- package/dist/call-tool-dHlbGOIY.js.map +1 -0
- package/dist/chat/pure.d.ts +372 -6
- package/dist/chat/pure.d.ts.map +1 -1
- package/dist/chat/pure.js +35 -244
- package/dist/chat/pure.js.map +1 -1
- package/dist/{approvals-DKaJZYlm.js → chat-JPJJ8uu5.js} +15879 -14631
- package/dist/chat-JPJJ8uu5.js.map +1 -0
- package/dist/chat.d.ts +4 -6
- package/dist/chat.js +23 -12
- package/dist/cli-shared-C-YCaglL.js +159 -0
- package/dist/cli-shared-C-YCaglL.js.map +1 -0
- package/dist/client-core-BQSyDALT.d.ts +2115 -0
- package/dist/client-core-BQSyDALT.d.ts.map +1 -0
- package/dist/codemode-worker.d.ts +1 -0
- package/dist/codemode-worker.js +155 -0
- package/dist/codemode-worker.js.map +1 -0
- package/dist/codemode.d.ts +352 -0
- package/dist/codemode.d.ts.map +1 -0
- package/dist/codemode.js +5 -0
- package/dist/connection-Dr-Js4yZ.d.ts +28 -0
- package/dist/connection-Dr-Js4yZ.d.ts.map +1 -0
- package/dist/connection-loop-gdh22LTI.js +112 -0
- package/dist/connection-loop-gdh22LTI.js.map +1 -0
- package/dist/context-segments-BHKlagL6.js +1016 -0
- package/dist/context-segments-BHKlagL6.js.map +1 -0
- package/dist/{context-transport-T_6AYIvy.js → context-transport-DSMTUsK1.js} +3 -3
- package/dist/{context-transport-T_6AYIvy.js.map → context-transport-DSMTUsK1.js.map} +1 -1
- package/dist/contexts/daytona.d.ts +19 -8
- package/dist/contexts/daytona.d.ts.map +1 -1
- package/dist/contexts/daytona.js +1 -440
- package/dist/contexts/docker.d.ts +36 -7
- package/dist/contexts/docker.d.ts.map +1 -1
- package/dist/contexts/docker.js +1 -456
- package/dist/contexts/e2b.d.ts +68 -13
- package/dist/contexts/e2b.d.ts.map +1 -1
- package/dist/contexts/e2b.js +1 -382
- package/dist/contexts/sandbox.d.ts +1 -1
- package/dist/contexts/sandbox.js +5 -0
- package/dist/contexts/sandbox.js.map +1 -1
- package/dist/{contexts-CRE9pw07.js → contexts-d7UolYot.js} +1059 -524
- package/dist/contexts-d7UolYot.js.map +1 -0
- package/dist/contexts.d.ts +3 -3
- package/dist/contexts.js +1 -1
- package/dist/cred-keys-GpBg71cP.js +105 -0
- package/dist/cred-keys-GpBg71cP.js.map +1 -0
- package/dist/{auth-BG2rVKSt.js → credentials-JttEuRON.js} +55 -206
- package/dist/credentials-JttEuRON.js.map +1 -0
- package/dist/{cursor-iojRXHF9.js → cursor-CdjaQTBW.js} +3 -3
- package/dist/{cursor-iojRXHF9.js.map → cursor-CdjaQTBW.js.map} +1 -1
- package/dist/daemon-cli.d.ts +1 -1
- package/dist/daemon-cli.js +3 -2
- package/dist/daemon-cli.js.map +1 -1
- package/dist/daytona-DG3omipZ.js +513 -0
- package/dist/daytona-DG3omipZ.js.map +1 -0
- package/dist/defaults-Cx3zvDOV.js +23 -0
- package/dist/defaults-Cx3zvDOV.js.map +1 -0
- package/dist/dispatcher-BMlu2BmZ.js +4941 -0
- package/dist/dispatcher-BMlu2BmZ.js.map +1 -0
- package/dist/docker-BZhMMJUp.js +727 -0
- package/dist/docker-BZhMMJUp.js.map +1 -0
- package/dist/e2b-CEVOdRib.js +480 -0
- package/dist/e2b-CEVOdRib.js.map +1 -0
- package/dist/edit-utils-EGosADZq.js +234 -0
- package/dist/edit-utils-EGosADZq.js.map +1 -0
- package/dist/environment-8wsKE2Ln.js +214 -0
- package/dist/environment-8wsKE2Ln.js.map +1 -0
- package/dist/eval-BNcvle_J.js +1595 -0
- package/dist/eval-BNcvle_J.js.map +1 -0
- package/dist/eval.d.ts +2 -2
- package/dist/eval.js +1 -1489
- package/dist/executor-Cx5-8yqi.js +621 -0
- package/dist/executor-Cx5-8yqi.js.map +1 -0
- package/dist/extension-authoring-DyGGmq9V.js +385 -0
- package/dist/extension-authoring-DyGGmq9V.js.map +1 -0
- package/dist/extensions.d.ts +2 -2
- package/dist/extensions.js +3 -3
- package/dist/{fetch-url-DX75gpL0.js → fetch-url-Ct2TjDWt.js} +4 -4
- package/dist/{fetch-url-DX75gpL0.js.map → fetch-url-Ct2TjDWt.js.map} +1 -1
- package/dist/{format-BF745pLL.js → format-C2NQEVUH.js} +39 -2
- package/dist/format-C2NQEVUH.js.map +1 -0
- package/dist/format-bytes-C7tfc3Zm.js +55 -0
- package/dist/format-bytes-C7tfc3Zm.js.map +1 -0
- package/dist/headless-C_rNUuYC.js +960 -0
- package/dist/headless-C_rNUuYC.js.map +1 -0
- package/dist/headless.d.ts +1 -1
- package/dist/headless.js +1 -413
- package/dist/{history-search-C4bk1Wz_.js → history-search-CcYzF8-0.js} +7 -3
- package/dist/history-search-CcYzF8-0.js.map +1 -0
- package/dist/history-search-worker.d.ts +1 -1
- package/dist/history-search-worker.js +1 -1
- package/dist/host-D7NrI03V.js +378 -0
- package/dist/host-D7NrI03V.js.map +1 -0
- package/dist/host-signals-BcP5QKUD.js +118 -0
- package/dist/host-signals-BcP5QKUD.js.map +1 -0
- package/dist/identity-CwfO8K-t.js +26 -0
- package/dist/identity-CwfO8K-t.js.map +1 -0
- package/dist/{index-BgN1T3lk.d.ts → index-BGe1fQT7.d.ts} +10987 -9320
- package/dist/index-BGe1fQT7.d.ts.map +1 -0
- package/dist/index-BVQsIKGn.d.ts +448 -0
- package/dist/index-BVQsIKGn.d.ts.map +1 -0
- package/dist/{index-C6NEd5y_.d.ts → index-CHABJd-L.d.ts} +3386 -502
- package/dist/index-CHABJd-L.d.ts.map +1 -0
- package/dist/{index-C37_ppWv.d.ts → index-D6a7qXpg.d.ts} +2 -3
- package/dist/index-D6a7qXpg.d.ts.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.js +27 -23
- package/dist/{completion-core-BRo86R_L.js → inline-ghost-BVRQeGoL.js} +50 -2
- package/dist/inline-ghost-BVRQeGoL.js.map +1 -0
- package/dist/ipc/remote.d.ts +313 -0
- package/dist/ipc/remote.d.ts.map +1 -0
- package/dist/ipc/remote.js +4 -0
- package/dist/ipc.d.ts +6 -964
- package/dist/ipc.js +403 -4
- package/dist/ipc.js.map +1 -0
- package/dist/{isolation-Kfoof0MM.d.ts → isolation-D9L650W5.d.ts} +100 -15
- package/dist/isolation-D9L650W5.d.ts.map +1 -0
- package/dist/json-rpc--HXQti1E.js +350 -0
- package/dist/json-rpc--HXQti1E.js.map +1 -0
- package/dist/links-j8rED1sR.js +603 -0
- package/dist/links-j8rED1sR.js.map +1 -0
- package/dist/local-terminal-D8QThwo_.js +252 -0
- package/dist/local-terminal-D8QThwo_.js.map +1 -0
- package/dist/{logger--C1VQjwJ.js → logger-Gtqlayx8.js} +199 -173
- package/dist/logger-Gtqlayx8.js.map +1 -0
- package/dist/logs-view-CWG8aUAG.js.map +1 -1
- package/dist/{mcp-CgNd-f3F.js → mcp-_wecH9Qe.js} +608 -562
- package/dist/mcp-_wecH9Qe.js.map +1 -0
- package/dist/mcp.d.ts +2 -2
- package/dist/mcp.js +2 -2
- package/dist/media-sniff-UKijEaiQ.js.map +1 -1
- package/dist/{messages-2jcOA_5R.js → messages-BqiwcD2Q.js} +1017 -1014
- package/dist/messages-BqiwcD2Q.js.map +1 -0
- package/dist/{oauth-DxHO17JE.js → oauth-Px_pBB9W.js} +5 -5
- package/dist/{oauth-DxHO17JE.js.map → oauth-Px_pBB9W.js.map} +1 -1
- package/dist/{openai-compat-Dy56weK8.js → openai-compat-CFrpH7uq.js} +432 -589
- package/dist/openai-compat-CFrpH7uq.js.map +1 -0
- package/dist/orchestration-BCGmB8Ps.js +511 -0
- package/dist/orchestration-BCGmB8Ps.js.map +1 -0
- package/dist/output/stream-json.d.ts +1 -2
- package/dist/output/stream-json.d.ts.map +1 -1
- package/dist/output/stream-json.js +1 -1
- package/dist/output/terminal.d.ts +1 -2
- package/dist/output/terminal.d.ts.map +1 -1
- package/dist/output/terminal.js +13 -7
- package/dist/output/terminal.js.map +1 -1
- package/dist/{plugins-gbI7SBA6.js → plugins-DS7mahzZ.js} +20 -101
- package/dist/plugins-DS7mahzZ.js.map +1 -0
- package/dist/plugins.d.ts +1 -1
- package/dist/plugins.js +1 -2
- package/dist/prelude-Cxo4t74B.js +517 -0
- package/dist/prelude-Cxo4t74B.js.map +1 -0
- package/dist/presets.d.ts +1 -1
- package/dist/presets.js +1 -2
- package/dist/project-root-B8zADr4o.js +167 -0
- package/dist/project-root-B8zADr4o.js.map +1 -0
- package/dist/project-user-paths-BSgtrRxl.js +58 -0
- package/dist/project-user-paths-BSgtrRxl.js.map +1 -0
- package/dist/{prompts-Pqc3JdW_.d.ts → prompts-DYcvqShf.d.ts} +14 -11
- package/dist/prompts-DYcvqShf.d.ts.map +1 -0
- package/dist/protocol-DnhqqSmE.js +13 -0
- package/dist/protocol-DnhqqSmE.js.map +1 -0
- package/dist/providers/anthropic.d.ts +2 -2
- package/dist/providers/anthropic.js +1 -2
- package/dist/providers/arcee.d.ts +1 -1
- package/dist/providers/arcee.js +1 -1
- package/dist/providers/baseten.d.ts +1 -1
- package/dist/providers/baseten.js +1 -1
- package/dist/providers/cerebras.d.ts +1 -1
- package/dist/providers/cerebras.js +3 -2
- package/dist/providers/cerebras.js.map +1 -1
- package/dist/providers/local.d.ts +1 -1
- package/dist/providers/local.js +1 -1
- package/dist/providers/openai-compat.d.ts +1 -1
- package/dist/providers/openai-compat.js +1 -2
- package/dist/providers/openai.d.ts +1 -1
- package/dist/providers/openai.js +15 -12
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/openrouter.js +3 -2
- package/dist/providers/openrouter.js.map +1 -1
- package/dist/providers/xai.d.ts +1 -1
- package/dist/providers/xai.js +3 -3
- package/dist/{providers-BVhnFyiY.js → providers-XUR7F4Hi.js} +4 -4
- package/dist/{providers-BVhnFyiY.js.map → providers-XUR7F4Hi.js.map} +1 -1
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +4 -4
- package/dist/registry-D6ShBWJU.js +5234 -0
- package/dist/registry-D6ShBWJU.js.map +1 -0
- package/dist/remote-hosts-BtA_9ZGp.js +97 -0
- package/dist/remote-hosts-BtA_9ZGp.js.map +1 -0
- package/dist/restate.d.ts +2 -3
- package/dist/restate.d.ts.map +1 -1
- package/dist/restate.js +631 -572
- package/dist/restate.js.map +1 -1
- package/dist/run-summary-CklLiZ4y.js +288 -0
- package/dist/run-summary-CklLiZ4y.js.map +1 -0
- package/dist/{sandbox-BH0WQkXn.d.ts → sandbox-C5dR5DwQ.d.ts} +6 -3
- package/dist/sandbox-C5dR5DwQ.d.ts.map +1 -0
- package/dist/session/sqlite.d.ts +1 -2
- package/dist/session/sqlite.d.ts.map +1 -1
- package/dist/session/sqlite.js +1 -616
- package/dist/session-factory-BUGY5P40.js +1576 -0
- package/dist/session-factory-BUGY5P40.js.map +1 -0
- package/dist/{session-BqRP1hS7.js → session-xh9JXu6i.js} +94 -52
- package/dist/session-xh9JXu6i.js.map +1 -0
- package/dist/session.d.ts +1 -1
- package/dist/session.js +2 -2
- package/dist/settings-keys-Ckf29NeM.js +677 -0
- package/dist/settings-keys-Ckf29NeM.js.map +1 -0
- package/dist/shell-path-Dqaoow2J.js +412 -0
- package/dist/shell-path-Dqaoow2J.js.map +1 -0
- package/dist/{skills-BC3dodWp.js → skills-DKqZJm4X.js} +430 -470
- package/dist/skills-DKqZJm4X.js.map +1 -0
- package/dist/skills.d.ts +2 -2
- package/dist/skills.js +1 -2
- package/dist/source-mPExaUm8.js +381 -0
- package/dist/source-mPExaUm8.js.map +1 -0
- package/dist/sqlite-DV1DQzN2.js +698 -0
- package/dist/sqlite-DV1DQzN2.js.map +1 -0
- package/dist/{src-CkNQKFKr.js → src-BRMYRJib.js} +903 -1121
- package/dist/src-BRMYRJib.js.map +1 -0
- package/dist/{stdio-DPpBDPx5.js → stdio-C6YyoW3I.js} +4 -4
- package/dist/{stdio-DPpBDPx5.js.map → stdio-C6YyoW3I.js.map} +1 -1
- package/dist/{stdio-loader-Bbx19dMZ.js → stdio-loader-C830Vg-Z.js} +4 -4
- package/dist/{stdio-loader-Bbx19dMZ.js.map → stdio-loader-C830Vg-Z.js.map} +1 -1
- package/dist/system-prompt-MNVHatSD.d.ts.map +1 -1
- package/dist/timeout-DEaqslLO.d.ts.map +1 -1
- package/dist/todo-edits-Dn251YUP.js +1790 -0
- package/dist/todo-edits-Dn251YUP.js.map +1 -0
- package/dist/{turn-operations-DrbJlpq9.js → tool-formatters-IQFDrdrs.js} +1456 -2120
- package/dist/tool-formatters-IQFDrdrs.js.map +1 -0
- package/dist/tool-state-Dku6YqAB.js +989 -0
- package/dist/tool-state-Dku6YqAB.js.map +1 -0
- package/dist/tools/fetch-url.d.ts +1 -2
- package/dist/tools/fetch-url.d.ts.map +1 -1
- package/dist/tools/fetch-url.js +1 -2
- package/dist/tools/prompts.d.ts +1 -1
- package/dist/tools/prompts.js +7 -7
- package/dist/tools/prompts.js.map +1 -1
- package/dist/tools/web-search.d.ts +1 -2
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +2 -2
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools-_DnT3AGM.js +578 -0
- package/dist/tools-_DnT3AGM.js.map +1 -0
- package/dist/tools.d.ts +3 -3
- package/dist/tools.js +4 -2
- package/dist/tui.d.ts +534 -517
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +34933 -27242
- package/dist/tui.js.map +1 -1
- package/dist/turn-operations-B8sokwi5.js +333 -0
- package/dist/turn-operations-B8sokwi5.js.map +1 -0
- package/dist/turn-operations-DQX5ZZni.d.ts +3089 -0
- package/dist/turn-operations-DQX5ZZni.d.ts.map +1 -0
- package/dist/types-C7ZFOztE.d.ts +132 -0
- package/dist/types-C7ZFOztE.d.ts.map +1 -0
- package/dist/types-CH5XpIHw.js +114 -0
- package/dist/types-CH5XpIHw.js.map +1 -0
- package/dist/{types-CWgENVLY.js → types-Cu0ZGDu9.js} +10 -6
- package/dist/types-Cu0ZGDu9.js.map +1 -0
- package/dist/types-IqegbJEE.d.ts +624 -0
- package/dist/types-IqegbJEE.d.ts.map +1 -0
- package/dist/types.d.ts +4 -4
- package/dist/types.js +1 -1
- package/dist/url-D8HCl65b.js +1259 -0
- package/dist/url-D8HCl65b.js.map +1 -0
- package/dist/wasm-BVT-j5cl.js +33 -0
- package/dist/wasm-BVT-j5cl.js.map +1 -0
- package/dist/workspace-exec-stream-SV2R9d5S.js +355 -0
- package/dist/workspace-exec-stream-SV2R9d5S.js.map +1 -0
- package/dist/ws-CIHMvlSh.js +952 -0
- package/dist/ws-CIHMvlSh.js.map +1 -0
- package/dist/ws-client-N7NxzvQp.js +230 -0
- package/dist/ws-client-N7NxzvQp.js.map +1 -0
- package/dist/{xai-CazjStOK.js → xai-CvJTeLrI.js} +165 -5
- package/dist/xai-CvJTeLrI.js.map +1 -0
- package/dist/xdg-zweed0-t.js +117 -0
- package/dist/xdg-zweed0-t.js.map +1 -0
- package/docs/ACP.md +52 -0
- package/docs/ARCHITECTURE.md +103 -6
- package/docs/ARTIFACTS.md +8 -4
- package/docs/CHAT.md +165 -14
- package/docs/EXECUTION_CONTEXT.md +8 -0
- package/docs/EXTENSIONS.md +123 -2
- package/docs/HEADLESS.md +2 -0
- package/docs/IPC.md +775 -64
- package/docs/MACHINES.md +456 -0
- package/docs/PANELS.md +3 -0
- package/docs/README.md +4 -0
- package/docs/RESTATE.md +3 -2
- package/docs/RUN_IN_BACKGROUND.md +10 -2
- package/docs/SERVER.md +1085 -0
- package/docs/SKILL.md +6 -1
- package/docs/TERMINAL.md +75 -0
- package/docs/TUI.md +65 -14
- package/package.json +58 -26
- package/scripts/eval.ts +4 -0
- package/dist/acp-D-tVyUjw.js.map +0 -1
- package/dist/agent-D0zZnGbt.js.map +0 -1
- package/dist/anthropic-C2aole0G.js.map +0 -1
- package/dist/approvals-DKaJZYlm.js.map +0 -1
- package/dist/atomic-write-B7zr1ddF.js.map +0 -1
- package/dist/auth-BG2rVKSt.js.map +0 -1
- package/dist/completion-core-BRo86R_L.js.map +0 -1
- package/dist/contexts/daytona.js.map +0 -1
- package/dist/contexts/docker.js.map +0 -1
- package/dist/contexts/e2b.js.map +0 -1
- package/dist/contexts-CRE9pw07.js.map +0 -1
- package/dist/eval.js.map +0 -1
- package/dist/format-BF745pLL.js.map +0 -1
- package/dist/glob-DluQFSw1.js +0 -270
- package/dist/glob-DluQFSw1.js.map +0 -1
- package/dist/headless.js.map +0 -1
- package/dist/history-search-C4bk1Wz_.js.map +0 -1
- package/dist/index-BgN1T3lk.d.ts.map +0 -1
- package/dist/index-C37_ppWv.d.ts.map +0 -1
- package/dist/index-C6NEd5y_.d.ts.map +0 -1
- package/dist/ipc-zVSyo6K1.js +0 -331
- package/dist/ipc-zVSyo6K1.js.map +0 -1
- package/dist/ipc.d.ts.map +0 -1
- package/dist/isolation-Kfoof0MM.d.ts.map +0 -1
- package/dist/json-rpc-rSWMUh9b.js +0 -192
- package/dist/json-rpc-rSWMUh9b.js.map +0 -1
- package/dist/logger--C1VQjwJ.js.map +0 -1
- package/dist/mcp-CgNd-f3F.js.map +0 -1
- package/dist/messages-2jcOA_5R.js.map +0 -1
- package/dist/openai-compat-Dy56weK8.js.map +0 -1
- package/dist/output-cap-C9zukcCj.js +0 -100
- package/dist/output-cap-C9zukcCj.js.map +0 -1
- package/dist/panels-B6gRk4bf.js +0 -789
- package/dist/panels-B6gRk4bf.js.map +0 -1
- package/dist/plugins-gbI7SBA6.js.map +0 -1
- package/dist/prompts-Pqc3JdW_.d.ts.map +0 -1
- package/dist/run-summary-BU_NgwUT.js +0 -269
- package/dist/run-summary-BU_NgwUT.js.map +0 -1
- package/dist/sandbox-BH0WQkXn.d.ts.map +0 -1
- package/dist/session/sqlite.js.map +0 -1
- package/dist/session-BqRP1hS7.js.map +0 -1
- package/dist/shell-path-h5czzllR.js +0 -1549
- package/dist/shell-path-h5czzllR.js.map +0 -1
- package/dist/skills-BC3dodWp.js.map +0 -1
- package/dist/src-CkNQKFKr.js.map +0 -1
- package/dist/todo-edits-UOwgxGKu.js +0 -528
- package/dist/todo-edits-UOwgxGKu.js.map +0 -1
- package/dist/tool-formatters-DoRLnfuD.d.ts +0 -759
- package/dist/tool-formatters-DoRLnfuD.d.ts.map +0 -1
- package/dist/transcript-anchors-BeudMbXx.d.ts +0 -1762
- package/dist/transcript-anchors-BeudMbXx.d.ts.map +0 -1
- package/dist/turn-operations-C8bMBDl_.d.ts +0 -1258
- package/dist/turn-operations-C8bMBDl_.d.ts.map +0 -1
- package/dist/turn-operations-DrbJlpq9.js.map +0 -1
- package/dist/types-CWgENVLY.js.map +0 -1
- package/dist/xai-CazjStOK.js.map +0 -1
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
import { u as errorMessage } from "./errors-DKiMrOKq.js";
|
|
2
|
+
import { r as createLogger, t as consoleSink } from "./logger-Gtqlayx8.js";
|
|
3
|
+
import { t as TERMINAL_ENV, u as capBufferedExecOutput } from "./local-terminal-D8QThwo_.js";
|
|
4
|
+
import { t as StreamQueue } from "./stream-queue-Cd9OJxl7.js";
|
|
5
|
+
import { Buffer } from "node:buffer";
|
|
6
|
+
//#region src/contexts/daytona-sdk.ts
|
|
7
|
+
function resolveDaytonaEnv(optionEnv, perSpawnEnv) {
|
|
8
|
+
const merged = {
|
|
9
|
+
...optionEnv,
|
|
10
|
+
...perSpawnEnv
|
|
11
|
+
};
|
|
12
|
+
return Object.keys(merged).length > 0 ? merged : void 0;
|
|
13
|
+
}
|
|
14
|
+
function normalizeDaytonaExecResult(response) {
|
|
15
|
+
return {
|
|
16
|
+
stdout: response.stdout ?? response.artifacts?.stdout ?? response.result ?? response.output ?? "",
|
|
17
|
+
stderr: response.stderr ?? "",
|
|
18
|
+
exitCode: typeof response.exitCode === "number" ? response.exitCode : 0
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
//#region src/contexts/daytona-stream.ts
|
|
23
|
+
/** A `TerminalProcess` over a Daytona PTY session. Input is chained to keep keystroke order. */
|
|
24
|
+
function daytonaTerminal(sandbox, id, pty) {
|
|
25
|
+
let input = Promise.resolve();
|
|
26
|
+
let killed = null;
|
|
27
|
+
return {
|
|
28
|
+
id,
|
|
29
|
+
reconnectable: sandbox.process.connectPty !== void 0,
|
|
30
|
+
write: (data) => {
|
|
31
|
+
input = input.then(() => pty.sendInput(data)).catch(() => {});
|
|
32
|
+
},
|
|
33
|
+
resize: (cols, rows) => {
|
|
34
|
+
pty.resize?.(cols, rows).catch(() => {});
|
|
35
|
+
},
|
|
36
|
+
kill: () => killed ??= (async () => {
|
|
37
|
+
await (sandbox.process.killPtySession?.(id) ?? pty.kill?.())?.catch(() => {});
|
|
38
|
+
await pty.disconnect().catch(() => {});
|
|
39
|
+
})(),
|
|
40
|
+
detach: () => pty.disconnect().then(() => {}, () => {}),
|
|
41
|
+
exited: pty.wait().then((result) => result?.exitCode ?? -1, () => -1)
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function daytonaTerminalMethods(get) {
|
|
45
|
+
return {
|
|
46
|
+
/**
|
|
47
|
+
* A login shell in the sandbox through a Daytona PTY session. Sessions
|
|
48
|
+
* persist server-side after the websocket drops, which is what lets
|
|
49
|
+
* `reconnectTerminal` find them again by id, and why `kill` must end the
|
|
50
|
+
* session rather than just disconnect.
|
|
51
|
+
*/
|
|
52
|
+
async openTerminal(sandboxId, options) {
|
|
53
|
+
const { sandbox, env } = get(sandboxId);
|
|
54
|
+
if (!sandbox.process.createPty) throw new Error("Daytona SDK is too old: `process.createPty` is required for terminals.");
|
|
55
|
+
const id = `zidane-tty-${Math.random().toString(36).slice(2, 10)}`;
|
|
56
|
+
const pty = await sandbox.process.createPty({
|
|
57
|
+
id,
|
|
58
|
+
...options.cwd ? { cwd: options.cwd } : {},
|
|
59
|
+
envs: resolveDaytonaEnv(env, {
|
|
60
|
+
...options.env,
|
|
61
|
+
...TERMINAL_ENV
|
|
62
|
+
}) ?? {},
|
|
63
|
+
cols: options.cols,
|
|
64
|
+
rows: options.rows,
|
|
65
|
+
onData: options.onData
|
|
66
|
+
});
|
|
67
|
+
await pty.waitForConnection();
|
|
68
|
+
return daytonaTerminal(sandbox, id, pty);
|
|
69
|
+
},
|
|
70
|
+
async reconnectTerminal(sandboxId, id, options) {
|
|
71
|
+
const { sandbox } = get(sandboxId);
|
|
72
|
+
if (!sandbox.process.connectPty) return null;
|
|
73
|
+
const pty = await sandbox.process.connectPty(id, { onData: options.onData }).catch(() => null);
|
|
74
|
+
if (!pty) return null;
|
|
75
|
+
await pty.waitForConnection();
|
|
76
|
+
const terminal = daytonaTerminal(sandbox, id, pty);
|
|
77
|
+
terminal.resize(options.cols, options.rows);
|
|
78
|
+
return terminal;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function daytonaStreamMethods(get, logger) {
|
|
83
|
+
return {
|
|
84
|
+
/**
|
|
85
|
+
* Live bidirectional stream — see `ExecutionContext.execStream`.
|
|
86
|
+
*
|
|
87
|
+
* PTY-backed, and not by preference: Daytona's process + session API
|
|
88
|
+
* exposes no stdin at all (sessions are fire-and-forget with log
|
|
89
|
+
* streaming), so a pseudo-terminal is the only interactive channel the
|
|
90
|
+
* platform offers. That forces three mitigations, all in the launch
|
|
91
|
+
* wrapper below, because a PTY is a terminal and a protocol stream is
|
|
92
|
+
* not:
|
|
93
|
+
*
|
|
94
|
+
* 1. `stty -echo` — a terminal echoes everything written to stdin back
|
|
95
|
+
* onto stdout. Without this the caller reads its own requests back
|
|
96
|
+
* as if they were responses.
|
|
97
|
+
* 2. `stty raw` — canonical mode rewrites `\n`→`\r\n` and caps a line
|
|
98
|
+
* at ~4096 bytes. Protocol frames routinely exceed that and would
|
|
99
|
+
* be silently truncated mid-message.
|
|
100
|
+
* 3. `2><file>` — a PTY has ONE stream, so the child's stderr would
|
|
101
|
+
* otherwise interleave into the protocol data and corrupt framing.
|
|
102
|
+
* It is redirected to a file inside the sandbox and surfaced on the
|
|
103
|
+
* returned handle by polling that file through the exec API.
|
|
104
|
+
*
|
|
105
|
+
* The mitigations must run before the child's first byte — but the
|
|
106
|
+
* launch line ITSELF is typed into a canonical-mode terminal, so it is
|
|
107
|
+
* echoed once (a short non-JSON line the transport's tolerant framing
|
|
108
|
+
* discards) and subject to the ~4096-byte line cap. That is why the
|
|
109
|
+
* real command lives in an uploaded script and the typed line stays
|
|
110
|
+
* short and constant: a long command line would be truncated before
|
|
111
|
+
* `stty` ever ran. The script also restores `sh` compound-command
|
|
112
|
+
* semantics that a bare `exec <command>` would break.
|
|
113
|
+
*/
|
|
114
|
+
async execStream(sandboxId, command, opts) {
|
|
115
|
+
const { sandbox, env } = get(sandboxId);
|
|
116
|
+
if (!sandbox.process.createPty) throw new Error("Daytona SDK is too old: `process.createPty` is required for execStream (used to run stdio MCP servers inside the sandbox).");
|
|
117
|
+
opts?.signal?.throwIfAborted();
|
|
118
|
+
const token = Math.random().toString(36).slice(2, 10);
|
|
119
|
+
const stderrPath = `/tmp/.zidane-stream-${token}.err`;
|
|
120
|
+
const scriptPath = `/tmp/.zidane-stream-${token}.sh`;
|
|
121
|
+
await sandbox.fs.uploadFile(Buffer.from(`exec 2>${stderrPath}\n${command}\n`), scriptPath);
|
|
122
|
+
const warnBacklog = (which) => (bytes) => logger.warn("execStream consumer is not draining output", {
|
|
123
|
+
sandboxId,
|
|
124
|
+
stream: which,
|
|
125
|
+
bufferedBytes: bytes
|
|
126
|
+
});
|
|
127
|
+
const stdout = new StreamQueue(warnBacklog("stdout"));
|
|
128
|
+
const stderr = new StreamQueue(warnBacklog("stderr"));
|
|
129
|
+
const sentinel = `Z-${token}-READY`;
|
|
130
|
+
let gateOpen = false;
|
|
131
|
+
let gateBuffer = "";
|
|
132
|
+
let openGate = () => {};
|
|
133
|
+
const gateReady = new Promise((r) => {
|
|
134
|
+
openGate = r;
|
|
135
|
+
});
|
|
136
|
+
const pty = await sandbox.process.createPty({
|
|
137
|
+
id: `zidane-stream-${token}`,
|
|
138
|
+
...opts?.cwd ? { cwd: opts.cwd } : {},
|
|
139
|
+
envs: resolveDaytonaEnv(env, opts?.env) ?? {},
|
|
140
|
+
onData: (data) => {
|
|
141
|
+
if (gateOpen) {
|
|
142
|
+
stdout.push(data);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
gateBuffer += Buffer.from(data).toString("utf8");
|
|
146
|
+
const at = gateBuffer.indexOf(sentinel);
|
|
147
|
+
if (at === -1) {
|
|
148
|
+
if (gateBuffer.length > 65536) gateBuffer = gateBuffer.slice(-1024);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
gateOpen = true;
|
|
152
|
+
openGate();
|
|
153
|
+
const rest = gateBuffer.slice(at + sentinel.length).replace(/^\r?\n/, "");
|
|
154
|
+
gateBuffer = "";
|
|
155
|
+
if (rest.length > 0) stdout.push(new TextEncoder().encode(rest));
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
await pty.waitForConnection();
|
|
159
|
+
await pty.sendInput(`stty raw -echo; printf 'Z-%s-READY\\n' ${token}; exec sh ${scriptPath}\n`);
|
|
160
|
+
let gateTimer;
|
|
161
|
+
await Promise.race([gateReady, new Promise((r) => {
|
|
162
|
+
gateTimer = setTimeout(r, 3e4);
|
|
163
|
+
})]);
|
|
164
|
+
clearTimeout(gateTimer);
|
|
165
|
+
if (!gateOpen) {
|
|
166
|
+
await (pty.kill?.() ?? Promise.resolve()).catch(() => {});
|
|
167
|
+
await pty.disconnect().catch(() => {});
|
|
168
|
+
await sandbox.process.executeCommand(`rm -f ${scriptPath} ${stderrPath}`).catch(() => {});
|
|
169
|
+
throw new Error(`Daytona execStream: PTY did not reach the ready sentinel within 30s (sandbox ${sandboxId}). The login shell may not have started.`);
|
|
170
|
+
}
|
|
171
|
+
let stderrOffset = 0;
|
|
172
|
+
let torndown = false;
|
|
173
|
+
const eofMark = `ZEOF-${token}:`;
|
|
174
|
+
const drainStderr = async () => {
|
|
175
|
+
try {
|
|
176
|
+
const res = normalizeDaytonaExecResult(await sandbox.process.executeCommand(`tail -c +${stderrOffset + 1} ${stderrPath} 2>/dev/null; printf '${eofMark}%s' "$(wc -c < ${stderrPath} 2>/dev/null || echo 0)"`));
|
|
177
|
+
const at = res.stdout.lastIndexOf(eofMark);
|
|
178
|
+
if (at === -1) return;
|
|
179
|
+
const content = res.stdout.slice(0, at);
|
|
180
|
+
const size = Number.parseInt(res.stdout.slice(at + eofMark.length).trim(), 10);
|
|
181
|
+
if (content.length > 0) stderr.push(new TextEncoder().encode(content));
|
|
182
|
+
if (Number.isFinite(size) && size > stderrOffset) stderrOffset = size;
|
|
183
|
+
} catch {}
|
|
184
|
+
};
|
|
185
|
+
const stderrTimer = setInterval(() => {
|
|
186
|
+
drainStderr();
|
|
187
|
+
}, 2e3);
|
|
188
|
+
stderrTimer.unref?.();
|
|
189
|
+
const teardown = async () => {
|
|
190
|
+
if (torndown) return;
|
|
191
|
+
torndown = true;
|
|
192
|
+
clearInterval(stderrTimer);
|
|
193
|
+
await drainStderr();
|
|
194
|
+
await sandbox.process.executeCommand(`rm -f ${scriptPath} ${stderrPath}`).catch(() => {});
|
|
195
|
+
stdout.close();
|
|
196
|
+
stderr.close();
|
|
197
|
+
};
|
|
198
|
+
const exited = pty.wait().then((result) => result?.exitCode ?? 0).catch(() => 137).finally(teardown);
|
|
199
|
+
const kill = async () => {
|
|
200
|
+
await (pty.kill?.() ?? Promise.resolve()).catch(() => {});
|
|
201
|
+
await pty.disconnect().catch(() => {});
|
|
202
|
+
await teardown();
|
|
203
|
+
};
|
|
204
|
+
if (opts?.signal) {
|
|
205
|
+
if (opts.signal.aborted) kill();
|
|
206
|
+
else {
|
|
207
|
+
const onAbort = () => {
|
|
208
|
+
kill();
|
|
209
|
+
};
|
|
210
|
+
const detach = () => opts.signal.removeEventListener("abort", onAbort);
|
|
211
|
+
opts.signal.addEventListener("abort", onAbort, { once: true });
|
|
212
|
+
exited.then(detach, detach);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
pid: pty.pid ?? -1,
|
|
217
|
+
stdout,
|
|
218
|
+
stderr,
|
|
219
|
+
write: async (data) => {
|
|
220
|
+
await pty.sendInput(data);
|
|
221
|
+
},
|
|
222
|
+
kill,
|
|
223
|
+
exited
|
|
224
|
+
};
|
|
225
|
+
} };
|
|
226
|
+
}
|
|
227
|
+
//#endregion
|
|
228
|
+
//#region src/contexts/daytona.ts
|
|
229
|
+
/** Per-probe timeout for the readiness `true` command. */
|
|
230
|
+
const READINESS_PROBE_TIMEOUT_SECONDS = 5;
|
|
231
|
+
/** Pause between readiness probes while the sandbox is still warming up. */
|
|
232
|
+
const READINESS_BACKOFF_MS = 250;
|
|
233
|
+
/** Setup scripts commonly install dependencies, so give them a generous cap. */
|
|
234
|
+
const PREGAME_TIMEOUT_SECONDS = 1800;
|
|
235
|
+
function capExecResult(result) {
|
|
236
|
+
return {
|
|
237
|
+
...capBufferedExecOutput(result.stdout, result.stderr),
|
|
238
|
+
exitCode: result.exitCode
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
function normalizeDaytonaExecError(error) {
|
|
242
|
+
const err = error;
|
|
243
|
+
if (typeof err.exitCode === "number") return {
|
|
244
|
+
stdout: typeof err.stdout === "string" ? err.stdout : typeof err.result === "string" ? err.result : typeof err.output === "string" ? err.output : "",
|
|
245
|
+
stderr: typeof err.stderr === "string" ? err.stderr : typeof err.message === "string" ? err.message : "",
|
|
246
|
+
exitCode: err.exitCode
|
|
247
|
+
};
|
|
248
|
+
return {
|
|
249
|
+
stdout: "",
|
|
250
|
+
stderr: error instanceof Error ? error.message : String(error),
|
|
251
|
+
exitCode: 124
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function toClientConfig(apiKey, apiUrl, target) {
|
|
255
|
+
const config = {};
|
|
256
|
+
if (apiKey !== void 0) config.apiKey = apiKey;
|
|
257
|
+
if (apiUrl !== void 0) config.apiUrl = apiUrl;
|
|
258
|
+
if (target !== void 0) config.target = target;
|
|
259
|
+
return Object.keys(config).length > 0 ? config : void 0;
|
|
260
|
+
}
|
|
261
|
+
function takeString(value) {
|
|
262
|
+
return typeof value === "string" && value.length > 0 ? value : void 0;
|
|
263
|
+
}
|
|
264
|
+
function resolveDaytonaCreateParams(sandboxConfig, options, envVars) {
|
|
265
|
+
const reserved = /* @__PURE__ */ new Set([
|
|
266
|
+
"provider",
|
|
267
|
+
"apiKey",
|
|
268
|
+
"apiUrl",
|
|
269
|
+
"target",
|
|
270
|
+
"sandboxId"
|
|
271
|
+
]);
|
|
272
|
+
const params = {};
|
|
273
|
+
for (const [key, value] of Object.entries(sandboxConfig)) if (!reserved.has(key) && value !== void 0) params[key] = value;
|
|
274
|
+
const language = takeString(sandboxConfig.language) ?? options.language;
|
|
275
|
+
const snapshot = takeString(sandboxConfig.snapshot) ?? options.snapshot;
|
|
276
|
+
const image = sandboxConfig.image ?? options.image;
|
|
277
|
+
const resources = sandboxConfig.resources ?? options.resources;
|
|
278
|
+
const configEnvVars = sandboxConfig.envVars;
|
|
279
|
+
const mergedEnvVars = resolveDaytonaEnv(envVars, configEnvVars);
|
|
280
|
+
if (language !== void 0) params.language = language;
|
|
281
|
+
if (snapshot !== void 0) params.snapshot = snapshot;
|
|
282
|
+
if (image !== void 0) params.image = image;
|
|
283
|
+
if (resources !== void 0) params.resources = resources;
|
|
284
|
+
if (mergedEnvVars !== void 0) params.envVars = mergedEnvVars;
|
|
285
|
+
return Object.keys(params).length > 0 ? params : void 0;
|
|
286
|
+
}
|
|
287
|
+
async function waitForDaytonaReady(sandbox, logger, opts) {
|
|
288
|
+
if (opts.timeoutSeconds <= 0) return;
|
|
289
|
+
const now = opts.now ?? Date.now;
|
|
290
|
+
const sleep = opts.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
291
|
+
const start = now();
|
|
292
|
+
const deadline = start + opts.timeoutSeconds * 1e3;
|
|
293
|
+
logger.info("waiting for Daytona sandbox to initialize", { sandboxId: sandbox.id });
|
|
294
|
+
while (true) try {
|
|
295
|
+
await sandbox.process.executeCommand("true", void 0, void 0, READINESS_PROBE_TIMEOUT_SECONDS);
|
|
296
|
+
logger.info("Daytona sandbox ready", {
|
|
297
|
+
sandboxId: sandbox.id,
|
|
298
|
+
elapsedMs: now() - start
|
|
299
|
+
});
|
|
300
|
+
return;
|
|
301
|
+
} catch {
|
|
302
|
+
if (now() >= deadline) {
|
|
303
|
+
await opts.cleanupOnTimeout?.().catch(() => {});
|
|
304
|
+
throw new Error(`Daytona sandbox ${sandbox.id} did not become ready within ${opts.timeoutSeconds}s`);
|
|
305
|
+
}
|
|
306
|
+
await sleep(READINESS_BACKOFF_MS);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
async function runDaytonaPregame(sandbox, logger, opts) {
|
|
310
|
+
const path = `/tmp/${opts.name}`;
|
|
311
|
+
logger.info("running Daytona pregame script", {
|
|
312
|
+
sandboxId: sandbox.id,
|
|
313
|
+
path
|
|
314
|
+
});
|
|
315
|
+
await sandbox.fs.uploadFile(Buffer.from(opts.content), path);
|
|
316
|
+
const quoted = JSON.stringify(path);
|
|
317
|
+
let result;
|
|
318
|
+
try {
|
|
319
|
+
result = normalizeDaytonaExecResult(await sandbox.process.executeCommand(`chmod +x ${quoted} && ${quoted}`, opts.cwd, opts.envVars, PREGAME_TIMEOUT_SECONDS));
|
|
320
|
+
} catch (err) {
|
|
321
|
+
result = normalizeDaytonaExecError(err);
|
|
322
|
+
}
|
|
323
|
+
if (result.exitCode !== 0) {
|
|
324
|
+
logger.error("Daytona pregame script failed", {
|
|
325
|
+
sandboxId: sandbox.id,
|
|
326
|
+
exitCode: result.exitCode,
|
|
327
|
+
stdout: result.stdout,
|
|
328
|
+
stderr: result.stderr
|
|
329
|
+
});
|
|
330
|
+
throw new Error(`Daytona pregame script ${opts.name} failed with exit code ${result.exitCode}`);
|
|
331
|
+
}
|
|
332
|
+
logger.info("Daytona pregame ready", {
|
|
333
|
+
sandboxId: sandbox.id,
|
|
334
|
+
stdout: result.stdout,
|
|
335
|
+
stderr: result.stderr
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
function createDaytonaProvider(options = {}) {
|
|
339
|
+
const live = /* @__PURE__ */ new Map();
|
|
340
|
+
const logger = options.logger ?? createLogger(consoleSink());
|
|
341
|
+
const readinessTimeoutSeconds = options.readinessTimeoutSeconds ?? 60;
|
|
342
|
+
async function loadSdk() {
|
|
343
|
+
try {
|
|
344
|
+
return (await import("@daytona/sdk")).Daytona;
|
|
345
|
+
} catch (err) {
|
|
346
|
+
const message = errorMessage(err);
|
|
347
|
+
const notInstalled = /cannot find (?:module|package)|module not found|failed to resolve/i.test(message);
|
|
348
|
+
throw new Error(notInstalled ? "@daytona/sdk is required for the Daytona sandbox provider. Install it with: bun add @daytona/sdk" : `@daytona/sdk is installed but failed to load: ${message}. If this mentions tslib, pin it with a root override: "overrides": { "tslib": "^2.8.1" }. See docs/RESTATE.md.`, { cause: err });
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
function get(sandboxId) {
|
|
352
|
+
const entry = live.get(sandboxId);
|
|
353
|
+
if (!entry) throw new Error(`Daytona sandbox ${sandboxId} is not tracked by this provider`);
|
|
354
|
+
return entry;
|
|
355
|
+
}
|
|
356
|
+
async function deleteOwnedSandbox(sandbox) {
|
|
357
|
+
try {
|
|
358
|
+
await sandbox.delete();
|
|
359
|
+
} catch {}
|
|
360
|
+
}
|
|
361
|
+
async function stopOwnedSandbox(sandbox) {
|
|
362
|
+
if (!sandbox.stop) {
|
|
363
|
+
logger.error("cannot stop Daytona sandbox: this @daytona/sdk install exposes no stop() method; leaving it running", { sandboxId: sandbox.id });
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
try {
|
|
367
|
+
await sandbox.stop();
|
|
368
|
+
logger.info("stopped Daytona sandbox; reconnect later via the sandboxId option (CLI: --sandbox)", { sandboxId: sandbox.id });
|
|
369
|
+
} catch (err) {
|
|
370
|
+
logger.error("failed to stop Daytona sandbox; it will run until Daytona lifecycle policy stops it", {
|
|
371
|
+
sandboxId: sandbox.id,
|
|
372
|
+
error: err instanceof Error ? err.message : String(err)
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
async function archiveOwnedSandbox(sandbox) {
|
|
377
|
+
if (!sandbox.stop || !sandbox.archive) {
|
|
378
|
+
logger.error("cannot archive Daytona sandbox: this @daytona/sdk install exposes no stop() and archive() pair; leaving it running", { sandboxId: sandbox.id });
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
try {
|
|
382
|
+
await sandbox.stop();
|
|
383
|
+
await sandbox.archive();
|
|
384
|
+
logger.info("archived Daytona sandbox; reconnect later via the sandboxId option (CLI: --sandbox)", { sandboxId: sandbox.id });
|
|
385
|
+
} catch (err) {
|
|
386
|
+
logger.error("failed to archive Daytona sandbox; it will run until Daytona lifecycle policy stops it", {
|
|
387
|
+
sandboxId: sandbox.id,
|
|
388
|
+
error: err instanceof Error ? err.message : String(err)
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
async function startAttachedSandboxIfNeeded(sandbox) {
|
|
393
|
+
if (sandbox.state !== "stopped" && sandbox.state !== "archived") return;
|
|
394
|
+
if (!sandbox.start) {
|
|
395
|
+
logger.error("cannot start Daytona sandbox before attach readiness probe: this @daytona/sdk install exposes no start() method", {
|
|
396
|
+
sandboxId: sandbox.id,
|
|
397
|
+
state: sandbox.state
|
|
398
|
+
});
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
logger.info("starting Daytona sandbox before attach readiness probe", {
|
|
402
|
+
sandboxId: sandbox.id,
|
|
403
|
+
state: sandbox.state
|
|
404
|
+
});
|
|
405
|
+
await sandbox.start(readinessTimeoutSeconds > 0 ? readinessTimeoutSeconds : void 0);
|
|
406
|
+
}
|
|
407
|
+
const streamM = daytonaStreamMethods(get, logger);
|
|
408
|
+
const termM = daytonaTerminalMethods(get);
|
|
409
|
+
return {
|
|
410
|
+
name: "daytona",
|
|
411
|
+
async spawn(config = {}) {
|
|
412
|
+
const Daytona = await loadSdk();
|
|
413
|
+
const sb = config.sandbox ?? {};
|
|
414
|
+
const apiKey = takeString(sb.apiKey) ?? options.apiKey;
|
|
415
|
+
const apiUrl = takeString(sb.apiUrl) ?? options.apiUrl;
|
|
416
|
+
const target = takeString(sb.target) ?? options.target;
|
|
417
|
+
const connectId = takeString(sb.sandboxId) ?? options.sandboxId;
|
|
418
|
+
const snapshot = takeString(sb.snapshot) ?? options.snapshot;
|
|
419
|
+
const envVars = resolveDaytonaEnv(options.env, config.env);
|
|
420
|
+
const daytona = new Daytona(toClientConfig(apiKey, apiUrl, target));
|
|
421
|
+
let attached = connectId !== void 0;
|
|
422
|
+
let sandbox = connectId !== void 0 ? await daytona.get(connectId) : await daytona.create(resolveDaytonaCreateParams(sb, options, envVars));
|
|
423
|
+
if (attached && snapshot !== void 0 && sandbox.snapshot !== snapshot) {
|
|
424
|
+
logger.info("recreating Daytona sandbox: snapshot changed", {
|
|
425
|
+
sandboxId: sandbox.id,
|
|
426
|
+
previousSnapshot: sandbox.snapshot,
|
|
427
|
+
newSnapshot: snapshot
|
|
428
|
+
});
|
|
429
|
+
await deleteOwnedSandbox(sandbox);
|
|
430
|
+
attached = false;
|
|
431
|
+
sandbox = await daytona.create(resolveDaytonaCreateParams(sb, options, envVars));
|
|
432
|
+
}
|
|
433
|
+
const owned = !attached || options.ownAttached === true;
|
|
434
|
+
if (attached) await startAttachedSandboxIfNeeded(sandbox);
|
|
435
|
+
live.set(sandbox.id, {
|
|
436
|
+
sandbox,
|
|
437
|
+
env: envVars,
|
|
438
|
+
owned
|
|
439
|
+
});
|
|
440
|
+
try {
|
|
441
|
+
await waitForDaytonaReady(sandbox, logger, {
|
|
442
|
+
timeoutSeconds: readinessTimeoutSeconds,
|
|
443
|
+
...!attached ? { cleanupOnTimeout: () => deleteOwnedSandbox(sandbox) } : {}
|
|
444
|
+
});
|
|
445
|
+
} catch (err) {
|
|
446
|
+
live.delete(sandbox.id);
|
|
447
|
+
throw err;
|
|
448
|
+
}
|
|
449
|
+
const requestedCwd = config.cwd ?? options.cwd;
|
|
450
|
+
let cwd;
|
|
451
|
+
if (requestedCwd) {
|
|
452
|
+
cwd = requestedCwd;
|
|
453
|
+
await sandbox.process.executeCommand(`mkdir -p ${JSON.stringify(cwd)}`).catch(() => {});
|
|
454
|
+
} else if (sandbox.getWorkDir) {
|
|
455
|
+
cwd = await sandbox.getWorkDir().catch(() => "");
|
|
456
|
+
if (!cwd) cwd = await sandbox.process.executeCommand("pwd").then((r) => normalizeDaytonaExecResult(r).stdout.trim()).catch(() => "") || "/home/daytona";
|
|
457
|
+
} else cwd = await sandbox.process.executeCommand("pwd").then((r) => normalizeDaytonaExecResult(r).stdout.trim()).catch(() => "") || "/home/daytona";
|
|
458
|
+
if (options.pregame) try {
|
|
459
|
+
await runDaytonaPregame(sandbox, logger, {
|
|
460
|
+
name: options.pregame.name,
|
|
461
|
+
content: options.pregame.content,
|
|
462
|
+
cwd,
|
|
463
|
+
envVars
|
|
464
|
+
});
|
|
465
|
+
} catch (err) {
|
|
466
|
+
if (!attached) await deleteOwnedSandbox(sandbox);
|
|
467
|
+
live.delete(sandbox.id);
|
|
468
|
+
throw err;
|
|
469
|
+
}
|
|
470
|
+
return {
|
|
471
|
+
id: sandbox.id,
|
|
472
|
+
cwd
|
|
473
|
+
};
|
|
474
|
+
},
|
|
475
|
+
openTerminal: termM.openTerminal,
|
|
476
|
+
reconnectTerminal: termM.reconnectTerminal,
|
|
477
|
+
async exec(sandboxId, command, opts) {
|
|
478
|
+
const { sandbox, env } = get(sandboxId);
|
|
479
|
+
const timeoutSeconds = opts?.timeout ?? 30;
|
|
480
|
+
try {
|
|
481
|
+
return capExecResult(normalizeDaytonaExecResult(await sandbox.process.executeCommand(command, opts?.cwd, resolveDaytonaEnv(env, opts?.env), timeoutSeconds > 0 ? timeoutSeconds : void 0)));
|
|
482
|
+
} catch (err) {
|
|
483
|
+
return capExecResult(normalizeDaytonaExecError(err));
|
|
484
|
+
}
|
|
485
|
+
},
|
|
486
|
+
execStream: streamM.execStream,
|
|
487
|
+
async readFile(sandboxId, path) {
|
|
488
|
+
return (await get(sandboxId).sandbox.fs.downloadFile(path)).toString("utf8");
|
|
489
|
+
},
|
|
490
|
+
async writeFile(sandboxId, path, content, encoding = "utf-8") {
|
|
491
|
+
const data = typeof content === "string" ? Buffer.from(content, encoding) : content;
|
|
492
|
+
await get(sandboxId).sandbox.fs.uploadFile(data, path);
|
|
493
|
+
},
|
|
494
|
+
async listFiles(sandboxId, path) {
|
|
495
|
+
return (await get(sandboxId).sandbox.fs.listFiles(path)).map((e) => e.isDir ? `${e.name}/` : e.name);
|
|
496
|
+
},
|
|
497
|
+
async destroy(sandboxId) {
|
|
498
|
+
const entry = live.get(sandboxId);
|
|
499
|
+
if (!entry) return;
|
|
500
|
+
if (entry.owned) {
|
|
501
|
+
const action = options.onDestroy ?? "delete";
|
|
502
|
+
if (action === "stop" || action === "pause") await stopOwnedSandbox(entry.sandbox);
|
|
503
|
+
else if (action === "archive") await archiveOwnedSandbox(entry.sandbox);
|
|
504
|
+
else if (action === "delete" || action === "kill") await deleteOwnedSandbox(entry.sandbox);
|
|
505
|
+
}
|
|
506
|
+
live.delete(sandboxId);
|
|
507
|
+
}
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
//#endregion
|
|
511
|
+
export { normalizeDaytonaExecResult as a, waitForDaytonaReady as i, resolveDaytonaCreateParams as n, resolveDaytonaEnv as o, runDaytonaPregame as r, createDaytonaProvider as t };
|
|
512
|
+
|
|
513
|
+
//# sourceMappingURL=daytona-DG3omipZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daytona-DG3omipZ.js","names":[],"sources":["../src/contexts/daytona-sdk.ts","../src/contexts/daytona-stream.ts","../src/contexts/daytona.ts"],"sourcesContent":["/**\n * Structural `@daytona/sdk` views + env/result helpers shared by the Daytona\n * provider modules. Internal module.\n */\n\nimport type { Buffer } from 'node:buffer'\nimport type { ExecResult } from './types'\n\n// ---------------------------------------------------------------------------\n// Minimal structural views of the `@daytona/sdk` surface we touch. Declared\n// locally so zidane typechecks without the optional peer dependency installed.\n// ---------------------------------------------------------------------------\n\nexport interface DaytonaExecuteResponse {\n exitCode?: number | null\n result?: string | null\n output?: string | null\n stdout?: string | null\n stderr?: string | null\n artifacts?: { stdout?: string | null }\n}\n\nexport interface DaytonaFileEntry {\n name: string\n /** Present in the Daytona SDK's FileInfo; used for the `/` dir suffix. */\n isDir?: boolean\n}\n\n/**\n * Structural subset of Daytona's `PtyHandle`.\n *\n * Daytona's process/session API has NO stdin channel at all — sessions are\n * fire-and-forget with log streaming — so a PTY is the only way to reach a\n * long-lived process interactively. See the `execStream` implementation for\n * what that costs.\n */\nexport interface DaytonaPtyHandle {\n pid?: number\n waitForConnection: () => Promise<unknown>\n sendInput: (data: string | Uint8Array) => Promise<unknown>\n wait: () => Promise<{ exitCode?: number }>\n kill?: () => Promise<unknown>\n disconnect: () => Promise<unknown>\n /** Used by terminals only. */\n resize?: (cols: number, rows: number) => Promise<unknown>\n}\n\nexport interface DaytonaSandbox {\n id: string\n state?: string\n snapshot?: string\n process: {\n executeCommand: (command: string, cwd?: string, env?: Record<string, string>, timeout?: number) => Promise<DaytonaExecuteResponse>\n /** Present in recent SDKs; only `execStream` uses it. */\n createPty?: (options: {\n /**\n * REQUIRED by the API despite reading like a convenience handle: the\n * SDK forwards it as the session id and the control plane rejects the\n * create with 400 `session ID is required` when it is absent.\n */\n id: string\n cwd?: string\n envs?: Record<string, string>\n cols?: number\n rows?: number\n onData?: (data: Uint8Array) => void\n }) => Promise<DaytonaPtyHandle>\n /** Terminals only: re-attach to a PTY session that outlived the host. */\n connectPty?: (sessionId: string, options: { onData: (data: Uint8Array) => void }) => Promise<DaytonaPtyHandle>\n killPtySession?: (sessionId: string) => Promise<void>\n }\n fs: {\n /**\n * A Node Buffer, not a bare Uint8Array — that is what the SDK declares and\n * what its download path actually materializes (`Buffer.concat` over the\n * response parts), so `readFile` decodes with `.toString('utf8')` instead\n * of guarding a union. Leaning on that is only safe because the\n * `@daytona/sdk` peer range pins `^0.187.0`: this interface is a\n * hand-rolled structural type over a lazily-imported SDK, so a wider\n * install returning a plain Uint8Array would decode to \"104,101,…\"\n * at runtime with nothing failing at compile time.\n */\n downloadFile: (path: string) => Promise<Buffer>\n uploadFile: (content: Uint8Array | Buffer, path: string) => Promise<unknown>\n listFiles: (path: string) => Promise<DaytonaFileEntry[]>\n }\n getWorkDir?: () => Promise<string>\n start?: (timeout?: number) => Promise<unknown>\n delete: (timeout?: number) => Promise<unknown>\n stop?: (timeout?: number) => Promise<unknown>\n archive?: () => Promise<unknown>\n}\n\nexport interface DaytonaClientConfig {\n apiKey?: string\n apiUrl?: string\n target?: string\n}\n\nexport interface DaytonaResources {\n cpu?: number\n memory?: number\n disk?: number\n gpu?: number\n [key: string]: unknown\n}\n\nexport interface DaytonaCreateParams {\n language?: string\n snapshot?: string\n image?: unknown\n resources?: DaytonaResources\n envVars?: Record<string, string>\n [key: string]: unknown\n}\n\nexport interface DaytonaClient {\n create: (params?: DaytonaCreateParams) => Promise<DaytonaSandbox>\n get: (sandboxIdOrName: string) => Promise<DaytonaSandbox>\n}\n\nexport type DaytonaConstructor = new (config?: DaytonaClientConfig) => DaytonaClient\n\nexport function resolveDaytonaEnv(\n optionEnv: Record<string, string> | undefined,\n perSpawnEnv: Record<string, string> | undefined,\n): Record<string, string> | undefined {\n const merged = { ...optionEnv, ...perSpawnEnv }\n return Object.keys(merged).length > 0 ? merged : undefined\n}\n\nexport function normalizeDaytonaExecResult(response: DaytonaExecuteResponse): ExecResult {\n return {\n stdout: response.stdout ?? response.artifacts?.stdout ?? response.result ?? response.output ?? '',\n stderr: response.stderr ?? '',\n exitCode: typeof response.exitCode === 'number' ? response.exitCode : 0,\n }\n}\n","/**\n * Live bidirectional `execStream` and PTY terminals of the Daytona sandbox\n * provider. Internal module.\n */\n\nimport type { Logger } from '../logger'\nimport type { DaytonaPtyHandle, DaytonaSandbox } from './daytona-sdk'\nimport type { SandboxProvider } from './sandbox'\nimport type { StreamHandle, TerminalProcess } from './types'\nimport { Buffer } from 'node:buffer'\nimport { normalizeDaytonaExecResult, resolveDaytonaEnv } from './daytona-sdk'\nimport { TERMINAL_ENV } from './local-terminal'\nimport { StreamQueue } from './stream-queue'\n\n/** Registry lookup of the provider (`get` in `createDaytonaProvider`). */\nexport type DaytonaLiveGet = (sandboxId: string) => { sandbox: DaytonaSandbox, env?: Record<string, string>, owned: boolean }\n\n/** A `TerminalProcess` over a Daytona PTY session. Input is chained to keep keystroke order. */\nfunction daytonaTerminal(sandbox: DaytonaSandbox, id: string, pty: DaytonaPtyHandle): TerminalProcess {\n let input: Promise<unknown> = Promise.resolve()\n let killed: Promise<void> | null = null\n return {\n id,\n reconnectable: sandbox.process.connectPty !== undefined,\n write: (data) => {\n input = input.then(() => pty.sendInput(data)).catch(() => {})\n },\n resize: (cols, rows) => {\n void pty.resize?.(cols, rows).catch(() => {})\n },\n kill: () => (killed ??= (async () => {\n await (sandbox.process.killPtySession?.(id) ?? pty.kill?.())?.catch(() => {})\n await pty.disconnect().catch(() => {})\n })()),\n detach: () => pty.disconnect().then(() => {}, () => {}),\n exited: pty.wait().then(result => result?.exitCode ?? -1, () => -1),\n }\n}\n\nexport function daytonaTerminalMethods(get: DaytonaLiveGet): Required<Pick<SandboxProvider, 'openTerminal' | 'reconnectTerminal'>> {\n return {\n /**\n * A login shell in the sandbox through a Daytona PTY session. Sessions\n * persist server-side after the websocket drops, which is what lets\n * `reconnectTerminal` find them again by id, and why `kill` must end the\n * session rather than just disconnect.\n */\n async openTerminal(sandboxId, options): Promise<TerminalProcess> {\n const { sandbox, env } = get(sandboxId)\n if (!sandbox.process.createPty)\n throw new Error('Daytona SDK is too old: `process.createPty` is required for terminals.')\n const id = `zidane-tty-${Math.random().toString(36).slice(2, 10)}`\n const pty = await sandbox.process.createPty({\n id,\n ...(options.cwd ? { cwd: options.cwd } : {}),\n envs: resolveDaytonaEnv(env, { ...options.env, ...TERMINAL_ENV }) ?? {},\n cols: options.cols,\n rows: options.rows,\n onData: options.onData,\n })\n await pty.waitForConnection()\n return daytonaTerminal(sandbox, id, pty)\n },\n\n async reconnectTerminal(sandboxId, id, options): Promise<TerminalProcess | null> {\n const { sandbox } = get(sandboxId)\n if (!sandbox.process.connectPty)\n return null\n const pty = await sandbox.process.connectPty(id, { onData: options.onData }).catch(() => null)\n if (!pty)\n return null\n await pty.waitForConnection()\n const terminal = daytonaTerminal(sandbox, id, pty)\n terminal.resize(options.cols, options.rows)\n return terminal\n },\n }\n}\n\nexport function daytonaStreamMethods(get: DaytonaLiveGet, logger: Logger): Required<Pick<SandboxProvider, 'execStream'>> {\n return {\n /**\n * Live bidirectional stream — see `ExecutionContext.execStream`.\n *\n * PTY-backed, and not by preference: Daytona's process + session API\n * exposes no stdin at all (sessions are fire-and-forget with log\n * streaming), so a pseudo-terminal is the only interactive channel the\n * platform offers. That forces three mitigations, all in the launch\n * wrapper below, because a PTY is a terminal and a protocol stream is\n * not:\n *\n * 1. `stty -echo` — a terminal echoes everything written to stdin back\n * onto stdout. Without this the caller reads its own requests back\n * as if they were responses.\n * 2. `stty raw` — canonical mode rewrites `\\n`→`\\r\\n` and caps a line\n * at ~4096 bytes. Protocol frames routinely exceed that and would\n * be silently truncated mid-message.\n * 3. `2><file>` — a PTY has ONE stream, so the child's stderr would\n * otherwise interleave into the protocol data and corrupt framing.\n * It is redirected to a file inside the sandbox and surfaced on the\n * returned handle by polling that file through the exec API.\n *\n * The mitigations must run before the child's first byte — but the\n * launch line ITSELF is typed into a canonical-mode terminal, so it is\n * echoed once (a short non-JSON line the transport's tolerant framing\n * discards) and subject to the ~4096-byte line cap. That is why the\n * real command lives in an uploaded script and the typed line stays\n * short and constant: a long command line would be truncated before\n * `stty` ever ran. The script also restores `sh` compound-command\n * semantics that a bare `exec <command>` would break.\n */\n async execStream(sandboxId, command, opts): Promise<StreamHandle> {\n const { sandbox, env } = get(sandboxId)\n\n if (!sandbox.process.createPty) {\n throw new Error(\n 'Daytona SDK is too old: `process.createPty` is required for execStream '\n + '(used to run stdio MCP servers inside the sandbox).',\n )\n }\n\n opts?.signal?.throwIfAborted()\n\n const token = Math.random().toString(36).slice(2, 10)\n const stderrPath = `/tmp/.zidane-stream-${token}.err`\n const scriptPath = `/tmp/.zidane-stream-${token}.sh`\n\n // `exec 2>` rebinds the shell's stderr before the command runs, so\n // the command text needs no rewriting and stays compound-safe.\n await sandbox.fs.uploadFile(\n Buffer.from(`exec 2>${stderrPath}\\n${command}\\n`),\n scriptPath,\n )\n\n // See the E2B counterpart: the PTY's `onData` is a sync `void`\n // callback, so a stalled consumer can only be reported, never slowed.\n const warnBacklog = (which: string) => (bytes: number) =>\n logger.warn('execStream consumer is not draining output', { sandboxId, stream: which, bufferedBytes: bytes })\n const stdout = new StreamQueue(warnBacklog('stdout'))\n const stderr = new StreamQueue(warnBacklog('stderr'))\n\n // Everything the shell emits before the child is actually running is\n // NOISE that must never reach the caller: the echo of our own launch\n // line (typed before `-echo` takes effect), the login shell's prompt,\n // and its line-editor redraw escapes. `createPty` is `lazyStart`, so\n // the shell frequently does not exist yet when we type — it boots\n // afterwards and REPLAYS the buffered input through its line editor.\n // Observed on a stock sandbox: the stream opened with the echoed\n // launch line, the echoed first request, `\\u001b[?2004h` bracketed\n // paste, and a `%` prompt. An MCP client parses that echoed request\n // as a message and the handshake collapses.\n //\n // So: gate the stream on a sentinel the CHILD side prints, and drop\n // every byte before it. The sentinel is assembled by `printf` at\n // runtime (`Z-%s-READY` + token) so the echoed *source* line, which\n // contains the format string rather than the result, cannot match it.\n const sentinel = `Z-${token}-READY`\n let gateOpen = false\n let gateBuffer = ''\n let openGate: () => void = () => {}\n const gateReady = new Promise<void>((r) => { openGate = r })\n\n const pty = await sandbox.process.createPty({\n id: `zidane-stream-${token}`,\n ...(opts?.cwd ? { cwd: opts.cwd } : {}),\n envs: resolveDaytonaEnv(env, opts?.env) ?? {},\n onData: (data: Uint8Array) => {\n if (gateOpen) {\n stdout.push(data)\n return\n }\n gateBuffer += Buffer.from(data).toString('utf8')\n const at = gateBuffer.indexOf(sentinel)\n if (at === -1) {\n // Bounded: never let pre-gate noise grow without limit, but keep\n // a tail longer than the sentinel so it can't be split away.\n if (gateBuffer.length > 64 * 1024)\n gateBuffer = gateBuffer.slice(-1024)\n return\n }\n gateOpen = true\n openGate()\n // Everything after the sentinel's trailing newline is real output.\n const rest = gateBuffer.slice(at + sentinel.length).replace(/^\\r?\\n/, '')\n gateBuffer = ''\n if (rest.length > 0)\n stdout.push(new TextEncoder().encode(rest))\n },\n })\n await pty.waitForConnection()\n\n // Short, constant, and under any canonical line cap. `exec` replaces\n // the login shell so the PTY's lifetime is the script's lifetime and\n // no shell prompt can reach stdout.\n await pty.sendInput(`stty raw -echo; printf 'Z-%s-READY\\\\n' ${token}; exec sh ${scriptPath}\\n`)\n\n // Block until the child is genuinely live. Without this the caller can\n // write its first frame into a shell that hasn't started, where it is\n // echoed back and misread as a response.\n let gateTimer: ReturnType<typeof setTimeout> | undefined\n await Promise.race([\n gateReady,\n new Promise<void>((r) => { gateTimer = setTimeout(r, 30_000) }),\n ])\n clearTimeout(gateTimer)\n if (!gateOpen) {\n // Full teardown, not just a disconnect: Daytona PTY sessions persist\n // server-side after the websocket drops, so a bare disconnect leaks\n // one login shell plus two /tmp files per attempt — a bootstrap\n // retry loop against a broken image would stack them until the\n // sandbox dies.\n await (pty.kill?.() ?? Promise.resolve()).catch(() => {})\n await pty.disconnect().catch(() => {})\n await sandbox.process.executeCommand(`rm -f ${scriptPath} ${stderrPath}`).catch(() => {})\n throw new Error(\n `Daytona execStream: PTY did not reach the ready sentinel within 30s `\n + `(sandbox ${sandboxId}). The login shell may not have started.`,\n )\n }\n\n // stderr file → handle.stderr. Poll rather than stream: the exec API\n // is the only other channel into the sandbox, and diagnostics don't\n // need latency. Byte offsets keep re-reads incremental.\n //\n // The offset comes from the FILE (`wc -c`), never from measuring the\n // returned content: an exec API that trims a trailing newline from\n // command output would make a content-derived offset under-advance by\n // one byte per poll, re-emitting the tail byte forever. The size rides\n // back on the same round trip as a `ZEOF-<token>:` suffix; content is\n // whatever precedes it, so content-side transforms can't drift the\n // cursor either.\n let stderrOffset = 0\n let torndown = false\n const eofMark = `ZEOF-${token}:`\n const drainStderr = async (): Promise<void> => {\n try {\n const res = normalizeDaytonaExecResult(await sandbox.process.executeCommand(\n `tail -c +${stderrOffset + 1} ${stderrPath} 2>/dev/null; printf '${eofMark}%s' \"$(wc -c < ${stderrPath} 2>/dev/null || echo 0)\"`,\n ))\n const at = res.stdout.lastIndexOf(eofMark)\n if (at === -1)\n return\n const content = res.stdout.slice(0, at)\n const size = Number.parseInt(res.stdout.slice(at + eofMark.length).trim(), 10)\n if (content.length > 0)\n stderr.push(new TextEncoder().encode(content))\n if (Number.isFinite(size) && size > stderrOffset)\n stderrOffset = size\n }\n catch {\n // Diagnostic channel — polling failures must never surface as\n // protocol errors.\n }\n }\n const stderrTimer = setInterval(() => { void drainStderr() }, 2000)\n // Guarded: Bun/Node timers support unref, test fakes may not.\n ;(stderrTimer as { unref?: () => void }).unref?.()\n\n // Shared teardown for both exit paths (natural exit and kill): one\n // final stderr drain so a crash message isn't lost, then remove the\n // script + stderr files that would otherwise accumulate in /tmp for\n // the sandbox's lifetime.\n const teardown = async (): Promise<void> => {\n if (torndown)\n return\n torndown = true\n clearInterval(stderrTimer)\n await drainStderr()\n await sandbox.process.executeCommand(`rm -f ${scriptPath} ${stderrPath}`).catch(() => {})\n stdout.close()\n stderr.close()\n }\n\n const exited = pty.wait()\n .then(result => result?.exitCode ?? 0)\n .catch(() => 137)\n .finally(teardown)\n\n const kill = async (): Promise<void> => {\n // A PTY login shell never exits on its own — killing it IS the\n // normal termination path here, not an error path.\n await (pty.kill?.() ?? Promise.resolve()).catch(() => {})\n await pty.disconnect().catch(() => {})\n await teardown()\n }\n\n if (opts?.signal) {\n if (opts.signal.aborted) {\n void kill()\n }\n else {\n // Detach on exit — the (typically run-long) signal otherwise\n // retains the `kill` closure and the PTY handle for the rest of\n // the run, one dead closure per exec.\n const onAbort = () => { void kill() }\n const detach = () => opts.signal!.removeEventListener('abort', onAbort)\n opts.signal.addEventListener('abort', onAbort, { once: true })\n exited.then(detach, detach)\n }\n }\n\n return {\n pid: pty.pid ?? -1,\n stdout,\n stderr,\n write: async (data: Uint8Array): Promise<void> => {\n await pty.sendInput(data)\n },\n kill,\n exited,\n }\n },\n }\n}\n","/**\n * Daytona sandbox provider.\n *\n * Implements {@link SandboxProvider} on top of Daytona sandboxes. Pair it with\n * {@link createSandboxContext} to run an agent's shell + filesystem tools\n * inside a Daytona sandbox:\n *\n * ```ts\n * import { createSandboxContext } from 'zidane/contexts'\n * import { createDaytonaProvider } from 'zidane/contexts/daytona'\n *\n * const execution = createSandboxContext(createDaytonaProvider())\n * ```\n *\n * Requires `@daytona/sdk` as an optional peer dependency:\n * `bun add @daytona/sdk`.\n */\nimport type { Logger } from '../logger'\nimport type { DaytonaClientConfig, DaytonaConstructor, DaytonaCreateParams, DaytonaResources, DaytonaSandbox } from './daytona-sdk'\nimport type { SandboxProvider } from './sandbox'\nimport type { ExecResult, SpawnConfig } from './types'\nimport { Buffer } from 'node:buffer'\nimport { errorMessage } from '../errors'\nimport { consoleSink, createLogger } from '../logger'\nimport { normalizeDaytonaExecResult, resolveDaytonaEnv } from './daytona-sdk'\nimport { daytonaStreamMethods, daytonaTerminalMethods } from './daytona-stream'\nimport { capBufferedExecOutput } from './output-cap'\n\nexport { normalizeDaytonaExecResult, resolveDaytonaEnv } from './daytona-sdk'\n\n// ---------------------------------------------------------------------------\n// Provider options\n// ---------------------------------------------------------------------------\n\nexport type DaytonaOnDestroy = 'delete' | 'kill' | 'stop' | 'pause' | 'archive' | 'leave'\n\nexport interface DaytonaProviderOptions {\n /** Daytona API key. Falls back to the `DAYTONA_API_KEY` env var when omitted. */\n apiKey?: string\n /** Daytona API URL. Falls back to `DAYTONA_API_URL`, then Daytona's hosted default. */\n apiUrl?: string\n /** Daytona target / region. Falls back to `DAYTONA_TARGET`, then the org default. */\n target?: string\n /**\n * Attach to a pre-existing sandbox by id or name instead of creating a fresh\n * one. By default the provider treats attached sandboxes as externally owned\n * and leaves them running on destroy/failure (set {@link ownAttached} to take\n * over the lifecycle).\n */\n sandboxId?: string\n /**\n * Take ownership of an attached ({@link sandboxId}) sandbox's lifecycle, so\n * `destroy()` applies {@link onDestroy} to it (stop / archive / delete)\n * instead of leaving it running.\n *\n * The intended caller is a durable host that *owns* the sandbox across\n * invocations: mint it once, journal its id, re-attach via `sandboxId` on\n * every replay/resume, and clean it up at the end of the logical run. Without\n * this an attached sandbox can never be stopped/deleted through the provider —\n * a leak for host-owned sandboxes. No effect when creating a fresh sandbox\n * (those are always owned). Spawn-time failures (readiness timeout, pregame\n * error) still never delete a pre-existing attached sandbox — only sandboxes\n * this provider *created* are auto-cleaned on spawn failure.\n *\n * Default: `false`.\n */\n ownAttached?: boolean\n /** Daytona snapshot used when creating a fresh sandbox. */\n snapshot?: string\n /** Runtime used for Daytona's code tooling. Shell execution works either way. */\n language?: string\n /** Daytona image/declarative builder input used when creating a fresh sandbox. */\n image?: unknown\n /** Daytona sandbox resources. */\n resources?: DaytonaResources\n /** Default working directory, applied when a spawn doesn't set `SpawnConfig.cwd`. */\n cwd?: string\n /** Environment variables baked into the sandbox and re-sent on every command. */\n env?: Record<string, string>\n /** Logger for provider-level lifecycle lines. */\n logger?: Logger\n /** Total deadline, in seconds, for the post-create readiness probe. Defaults to `60`. */\n readinessTimeoutSeconds?: number\n /** Setup script to upload and run once the sandbox is ready. */\n pregame?: { name: string, content: string }\n /**\n * What to do with an owned sandbox on destroy:\n *\n * - `'delete'` / `'kill'` (default) — call `sandbox.delete()`.\n * - `'stop'` / `'pause'` — call `sandbox.stop()` so Daytona preserves state\n * according to the runner's stop semantics.\n * - `'archive'` — stop, then archive for longer-term persistence.\n * - `'leave'` — make no API call.\n */\n onDestroy?: DaytonaOnDestroy\n}\n\n/** Per-probe timeout for the readiness `true` command. */\nconst READINESS_PROBE_TIMEOUT_SECONDS = 5\n/** Pause between readiness probes while the sandbox is still warming up. */\nconst READINESS_BACKOFF_MS = 250\n/** Setup scripts commonly install dependencies, so give them a generous cap. */\nconst PREGAME_TIMEOUT_SECONDS = 30 * 60\n\nexport interface DaytonaReadinessOptions {\n /** Total deadline in seconds. `<= 0` disables the probe entirely. */\n timeoutSeconds: number\n /** Optional cleanup for owned sandboxes that never become ready. */\n cleanupOnTimeout?: () => Promise<void>\n /** Clock source — injectable for deterministic tests. */\n now?: () => number\n /** Sleep between probes — injectable for deterministic tests. */\n sleep?: (ms: number) => Promise<void>\n}\n\nfunction capExecResult(result: ExecResult): ExecResult {\n return { ...capBufferedExecOutput(result.stdout, result.stderr), exitCode: result.exitCode }\n}\n\nfunction normalizeDaytonaExecError(error: unknown): ExecResult {\n const err = error as { exitCode?: unknown, stdout?: unknown, stderr?: unknown, result?: unknown, output?: unknown, message?: unknown }\n if (typeof err.exitCode === 'number') {\n return {\n stdout: typeof err.stdout === 'string'\n ? err.stdout\n : typeof err.result === 'string'\n ? err.result\n : typeof err.output === 'string'\n ? err.output\n : '',\n stderr: typeof err.stderr === 'string' ? err.stderr : typeof err.message === 'string' ? err.message : '',\n exitCode: err.exitCode,\n }\n }\n return { stdout: '', stderr: error instanceof Error ? error.message : String(error), exitCode: 124 }\n}\n\nfunction toClientConfig(apiKey?: string, apiUrl?: string, target?: string): DaytonaClientConfig | undefined {\n const config: DaytonaClientConfig = {}\n if (apiKey !== undefined)\n config.apiKey = apiKey\n if (apiUrl !== undefined)\n config.apiUrl = apiUrl\n if (target !== undefined)\n config.target = target\n return Object.keys(config).length > 0 ? config : undefined\n}\n\nfunction takeString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nexport function resolveDaytonaCreateParams(\n sandboxConfig: Record<string, unknown>,\n options: DaytonaProviderOptions,\n envVars: Record<string, string> | undefined,\n): DaytonaCreateParams | undefined {\n const reserved = new Set(['provider', 'apiKey', 'apiUrl', 'target', 'sandboxId'])\n const params: DaytonaCreateParams = {}\n\n for (const [key, value] of Object.entries(sandboxConfig)) {\n if (!reserved.has(key) && value !== undefined)\n params[key] = value\n }\n\n const language = takeString(sandboxConfig.language) ?? options.language\n const snapshot = takeString(sandboxConfig.snapshot) ?? options.snapshot\n const image = sandboxConfig.image ?? options.image\n const resources = (sandboxConfig.resources as DaytonaResources | undefined) ?? options.resources\n const configEnvVars = sandboxConfig.envVars as Record<string, string> | undefined\n const mergedEnvVars = resolveDaytonaEnv(envVars, configEnvVars)\n\n if (language !== undefined)\n params.language = language\n if (snapshot !== undefined)\n params.snapshot = snapshot\n if (image !== undefined)\n params.image = image\n if (resources !== undefined)\n params.resources = resources\n if (mergedEnvVars !== undefined)\n params.envVars = mergedEnvVars\n\n return Object.keys(params).length > 0 ? params : undefined\n}\n\nexport async function waitForDaytonaReady(\n sandbox: DaytonaSandbox,\n logger: Logger,\n opts: DaytonaReadinessOptions,\n): Promise<void> {\n if (opts.timeoutSeconds <= 0)\n return\n\n const now = opts.now ?? Date.now\n const sleep = opts.sleep ?? (ms => new Promise<void>(resolve => setTimeout(resolve, ms)))\n const start = now()\n const deadline = start + opts.timeoutSeconds * 1000\n\n logger.info('waiting for Daytona sandbox to initialize', { sandboxId: sandbox.id })\n\n while (true) {\n try {\n await sandbox.process.executeCommand('true', undefined, undefined, READINESS_PROBE_TIMEOUT_SECONDS)\n logger.info('Daytona sandbox ready', { sandboxId: sandbox.id, elapsedMs: now() - start })\n return\n }\n catch {\n if (now() >= deadline) {\n await opts.cleanupOnTimeout?.().catch(() => {})\n throw new Error(`Daytona sandbox ${sandbox.id} did not become ready within ${opts.timeoutSeconds}s`)\n }\n await sleep(READINESS_BACKOFF_MS)\n }\n }\n}\n\nexport async function runDaytonaPregame(\n sandbox: DaytonaSandbox,\n logger: Logger,\n opts: { name: string, content: string, cwd?: string, envVars?: Record<string, string> },\n): Promise<void> {\n const path = `/tmp/${opts.name}`\n logger.info('running Daytona pregame script', { sandboxId: sandbox.id, path })\n await sandbox.fs.uploadFile(Buffer.from(opts.content), path)\n\n const quoted = JSON.stringify(path)\n let result: ExecResult\n try {\n result = normalizeDaytonaExecResult(\n await sandbox.process.executeCommand(`chmod +x ${quoted} && ${quoted}`, opts.cwd, opts.envVars, PREGAME_TIMEOUT_SECONDS),\n )\n }\n catch (err) {\n result = normalizeDaytonaExecError(err)\n }\n\n if (result.exitCode !== 0) {\n logger.error('Daytona pregame script failed', { sandboxId: sandbox.id, exitCode: result.exitCode, stdout: result.stdout, stderr: result.stderr })\n throw new Error(`Daytona pregame script ${opts.name} failed with exit code ${result.exitCode}`)\n }\n\n logger.info('Daytona pregame ready', { sandboxId: sandbox.id, stdout: result.stdout, stderr: result.stderr })\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport function createDaytonaProvider(options: DaytonaProviderOptions = {}): SandboxProvider {\n const live = new Map<string, { sandbox: DaytonaSandbox, env?: Record<string, string>, owned: boolean }>()\n const logger = options.logger ?? createLogger(consoleSink())\n const readinessTimeoutSeconds = options.readinessTimeoutSeconds ?? 60\n\n async function loadSdk(): Promise<DaytonaConstructor> {\n try {\n const mod = await import('@daytona/sdk') as { Daytona: DaytonaConstructor }\n return mod.Daytona\n }\n catch (err) {\n // Distinguish \"not installed\" from \"installed but failed to load\". This\n // used to be a bare `catch` that reported the install hint either way,\n // which sent people to `bun add` a package that was already present. The\n // realistic load failure is a `tslib` hoist: `@daytona/sdk` declares no\n // tslib dependency of its own and reaches AWS SDK v3 through\n // `@aws-sdk/client-s3`, so a stale `@aws-crypto` v3/v4 floor\n // (`tslib: ^1.11.1`) can win the hoist and the SDK's initializer helpers\n // resolve against tslib 1.x, which lacks them. Fix with a root\n // `overrides: { \"tslib\": \"^2.8.1\" }` — see `docs/RESTATE.md`.\n const message = errorMessage(err)\n const notInstalled = /cannot find (?:module|package)|module not found|failed to resolve/i.test(message)\n throw new Error(\n notInstalled\n ? '@daytona/sdk is required for the Daytona sandbox provider. Install it with: bun add @daytona/sdk'\n : `@daytona/sdk is installed but failed to load: ${message}. If this mentions tslib, pin it with a root override: \"overrides\": { \"tslib\": \"^2.8.1\" }. See docs/RESTATE.md.`,\n { cause: err },\n )\n }\n }\n\n function get(sandboxId: string): { sandbox: DaytonaSandbox, env?: Record<string, string>, owned: boolean } {\n const entry = live.get(sandboxId)\n if (!entry)\n throw new Error(`Daytona sandbox ${sandboxId} is not tracked by this provider`)\n return entry\n }\n\n async function deleteOwnedSandbox(sandbox: DaytonaSandbox): Promise<void> {\n try {\n await sandbox.delete()\n }\n catch {\n // Already gone — nothing to clean up.\n }\n }\n\n async function stopOwnedSandbox(sandbox: DaytonaSandbox): Promise<void> {\n if (!sandbox.stop) {\n logger.error('cannot stop Daytona sandbox: this @daytona/sdk install exposes no stop() method; leaving it running', { sandboxId: sandbox.id })\n return\n }\n try {\n await sandbox.stop()\n logger.info('stopped Daytona sandbox; reconnect later via the sandboxId option (CLI: --sandbox)', { sandboxId: sandbox.id })\n }\n catch (err) {\n logger.error('failed to stop Daytona sandbox; it will run until Daytona lifecycle policy stops it', { sandboxId: sandbox.id, error: err instanceof Error ? err.message : String(err) })\n }\n }\n\n async function archiveOwnedSandbox(sandbox: DaytonaSandbox): Promise<void> {\n if (!sandbox.stop || !sandbox.archive) {\n logger.error('cannot archive Daytona sandbox: this @daytona/sdk install exposes no stop() and archive() pair; leaving it running', { sandboxId: sandbox.id })\n return\n }\n try {\n await sandbox.stop()\n await sandbox.archive()\n logger.info('archived Daytona sandbox; reconnect later via the sandboxId option (CLI: --sandbox)', { sandboxId: sandbox.id })\n }\n catch (err) {\n logger.error('failed to archive Daytona sandbox; it will run until Daytona lifecycle policy stops it', { sandboxId: sandbox.id, error: err instanceof Error ? err.message : String(err) })\n }\n }\n\n async function startAttachedSandboxIfNeeded(sandbox: DaytonaSandbox): Promise<void> {\n if (sandbox.state !== 'stopped' && sandbox.state !== 'archived')\n return\n if (!sandbox.start) {\n logger.error('cannot start Daytona sandbox before attach readiness probe: this @daytona/sdk install exposes no start() method', { sandboxId: sandbox.id, state: sandbox.state })\n return\n }\n logger.info('starting Daytona sandbox before attach readiness probe', { sandboxId: sandbox.id, state: sandbox.state })\n await sandbox.start(readinessTimeoutSeconds > 0 ? readinessTimeoutSeconds : undefined)\n }\n\n const streamM = daytonaStreamMethods(get, logger)\n const termM = daytonaTerminalMethods(get)\n\n return {\n name: 'daytona',\n\n async spawn(config: SpawnConfig = {}): Promise<{ id: string, cwd: string }> {\n const Daytona = await loadSdk()\n const sb: Record<string, unknown> = config.sandbox ?? {}\n\n const apiKey = takeString(sb.apiKey) ?? options.apiKey\n const apiUrl = takeString(sb.apiUrl) ?? options.apiUrl\n const target = takeString(sb.target) ?? options.target\n const connectId = takeString(sb.sandboxId) ?? options.sandboxId\n const snapshot = takeString(sb.snapshot) ?? options.snapshot\n const envVars = resolveDaytonaEnv(options.env, config.env)\n\n const daytona = new Daytona(toClientConfig(apiKey, apiUrl, target))\n let attached = connectId !== undefined\n let sandbox = connectId !== undefined\n ? await daytona.get(connectId)\n : await daytona.create(resolveDaytonaCreateParams(sb, options, envVars))\n\n // An attached sandbox built from a stale snapshot is recreated from\n // scratch: the caller's snapshot pin wins over the journaled sandbox.\n if (attached && snapshot !== undefined && sandbox.snapshot !== snapshot) {\n logger.info('recreating Daytona sandbox: snapshot changed', {\n sandboxId: sandbox.id,\n previousSnapshot: sandbox.snapshot,\n newSnapshot: snapshot,\n })\n await deleteOwnedSandbox(sandbox)\n attached = false\n sandbox = await daytona.create(resolveDaytonaCreateParams(sb, options, envVars))\n }\n\n // Lifecycle ownership drives `destroy()` (onDestroy). A created sandbox is\n // always owned; an attached one is owned only when the host opts in via\n // `ownAttached`. Spawn-FAILURE cleanup is separate (see below) and keyed\n // on `!attached` so a pre-existing sandbox is never auto-deleted.\n const owned = !attached || options.ownAttached === true\n\n if (attached)\n await startAttachedSandboxIfNeeded(sandbox)\n\n live.set(sandbox.id, { sandbox, env: envVars, owned })\n\n try {\n await waitForDaytonaReady(sandbox, logger, {\n timeoutSeconds: readinessTimeoutSeconds,\n // Only auto-delete a sandbox we CREATED on readiness failure — never a\n // pre-existing attached one, even when we own its lifecycle.\n ...(!attached ? { cleanupOnTimeout: () => deleteOwnedSandbox(sandbox) } : {}),\n })\n }\n catch (err) {\n live.delete(sandbox.id)\n throw err\n }\n\n const requestedCwd = config.cwd ?? options.cwd\n let cwd: string\n if (requestedCwd) {\n cwd = requestedCwd\n await sandbox.process.executeCommand(`mkdir -p ${JSON.stringify(cwd)}`).catch(() => {})\n }\n else if (sandbox.getWorkDir) {\n cwd = await sandbox.getWorkDir().catch(() => '')\n if (!cwd)\n cwd = await sandbox.process.executeCommand('pwd').then(r => normalizeDaytonaExecResult(r).stdout.trim()).catch(() => '') || '/home/daytona'\n }\n else {\n cwd = await sandbox.process.executeCommand('pwd').then(r => normalizeDaytonaExecResult(r).stdout.trim()).catch(() => '') || '/home/daytona'\n }\n\n if (options.pregame) {\n try {\n await runDaytonaPregame(sandbox, logger, { name: options.pregame.name, content: options.pregame.content, cwd, envVars })\n }\n catch (err) {\n // Spawn-failure cleanup: only delete a sandbox we created, never a\n // pre-existing attached one (the host owns its prior state).\n if (!attached)\n await deleteOwnedSandbox(sandbox)\n live.delete(sandbox.id)\n throw err\n }\n }\n\n return { id: sandbox.id, cwd }\n },\n\n openTerminal: termM.openTerminal,\n\n reconnectTerminal: termM.reconnectTerminal,\n\n async exec(sandboxId, command, opts): Promise<ExecResult> {\n const { sandbox, env } = get(sandboxId)\n const timeoutSeconds = opts?.timeout ?? 30\n try {\n // The SDK buffers the streams uncapped (see the KNOWN RESIDUAL note\n // on `ExecutionContext.fileSize`) — cap host-side before the strings\n // propagate into tool results and session history.\n return capExecResult(normalizeDaytonaExecResult(\n await sandbox.process.executeCommand(\n command,\n opts?.cwd,\n resolveDaytonaEnv(env, opts?.env),\n timeoutSeconds > 0 ? timeoutSeconds : undefined,\n ),\n ))\n }\n catch (err) {\n return capExecResult(normalizeDaytonaExecError(err))\n }\n },\n\n execStream: streamM.execStream,\n\n async readFile(sandboxId, path): Promise<string> {\n const data = await get(sandboxId).sandbox.fs.downloadFile(path)\n return data.toString('utf8')\n },\n\n async writeFile(sandboxId, path, content, encoding: BufferEncoding = 'utf-8'): Promise<void> {\n const data = typeof content === 'string' ? Buffer.from(content, encoding) : content\n await get(sandboxId).sandbox.fs.uploadFile(data, path)\n },\n\n async listFiles(sandboxId, path): Promise<string[]> {\n const entries = await get(sandboxId).sandbox.fs.listFiles(path)\n // Trailing `/` on directories — parity with process/docker contexts.\n return entries.map(e => (e.isDir ? `${e.name}/` : e.name))\n },\n\n async destroy(sandboxId): Promise<void> {\n const entry = live.get(sandboxId)\n if (!entry)\n return\n if (entry.owned) {\n const action = options.onDestroy ?? 'delete'\n if (action === 'stop' || action === 'pause')\n await stopOwnedSandbox(entry.sandbox)\n else if (action === 'archive')\n await archiveOwnedSandbox(entry.sandbox)\n else if (action === 'delete' || action === 'kill')\n await deleteOwnedSandbox(entry.sandbox)\n }\n live.delete(sandboxId)\n },\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/media/defaults.ts
|
|
2
|
+
/**
|
|
3
|
+
* Built-in `mediaBudget` for chat, headless and Restate runs. Below Anthropic's
|
|
4
|
+
* hard caps (100 images on 200k-window models, 600 otherwise; 32 MB request
|
|
5
|
+
* body) with headroom for the text of a long conversation. Providers with a
|
|
6
|
+
* lower cap (Bedrock: 20) lower `maxItems` via
|
|
7
|
+
* `ProviderCapabilities.maxMediaPerRequest`.
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_MEDIA_BUDGET = {
|
|
10
|
+
maxItems: 80,
|
|
11
|
+
maxBytes: 20971520
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Built-in `maxImageEdge`. The largest edge Anthropic accepts once a request
|
|
15
|
+
* carries more than 20 images, so keeping media inline never trips that
|
|
16
|
+
* rejection. Below the 2576 px high-resolution tier (Claude 4.7+), above the
|
|
17
|
+
* 1568 px standard tier: most of the detail survives.
|
|
18
|
+
*/
|
|
19
|
+
const DEFAULT_MAX_IMAGE_EDGE = 2e3;
|
|
20
|
+
//#endregion
|
|
21
|
+
export { DEFAULT_MEDIA_BUDGET as n, DEFAULT_MAX_IMAGE_EDGE as t };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=defaults-Cx3zvDOV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults-Cx3zvDOV.js","names":[],"sources":["../src/media/defaults.ts"],"sourcesContent":["/**\n * Built-in `mediaBudget` for chat, headless and Restate runs. Below Anthropic's\n * hard caps (100 images on 200k-window models, 600 otherwise; 32 MB request\n * body) with headroom for the text of a long conversation. Providers with a\n * lower cap (Bedrock: 20) lower `maxItems` via\n * `ProviderCapabilities.maxMediaPerRequest`.\n */\nexport const DEFAULT_MEDIA_BUDGET = { maxItems: 80, maxBytes: 20 * 1024 * 1024 } as const\n\n/**\n * Built-in `maxImageEdge`. The largest edge Anthropic accepts once a request\n * carries more than 20 images, so keeping media inline never trips that\n * rejection. Below the 2576 px high-resolution tier (Claude 4.7+), above the\n * 1568 px standard tier: most of the detail survives.\n */\nexport const DEFAULT_MAX_IMAGE_EDGE = 2000\n"],"mappings":";;;;;;;;AAOA,MAAa,uBAAuB;CAAE,UAAU;CAAI,UAAU;AAAiB;;;;;;;AAQ/E,MAAa,yBAAyB"}
|