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,355 @@
|
|
|
1
|
+
import { o as startOAuthCallback } from "./src-BRMYRJib.js";
|
|
2
|
+
import { n as JsonRpcRemoteError, t as JsonRpcConnectionClosedError } from "./json-rpc--HXQti1E.js";
|
|
3
|
+
import { g as isMethodNotFound } from "./types-CH5XpIHw.js";
|
|
4
|
+
import { C as IPC_BUILD_ID, x as ZIDANE_VERSION } from "./settings-keys-Ckf29NeM.js";
|
|
5
|
+
import { t as createHostDispatcher } from "./dispatcher-BMlu2BmZ.js";
|
|
6
|
+
//#region src/ipc/memory.ts
|
|
7
|
+
/** JSON round-trip: what crossing the socket does to a value. */
|
|
8
|
+
function wire(value) {
|
|
9
|
+
return value === void 0 ? null : JSON.parse(JSON.stringify(value));
|
|
10
|
+
}
|
|
11
|
+
async function startInProcessHost(options) {
|
|
12
|
+
const connections = /* @__PURE__ */ new Set();
|
|
13
|
+
let closing = null;
|
|
14
|
+
const dispatcher = await createHostDispatcher({
|
|
15
|
+
createEnvironment: options.createEnvironment,
|
|
16
|
+
appVersion: options.appVersion ?? "dev",
|
|
17
|
+
startedAt: Date.now(),
|
|
18
|
+
identity: { kind: "in-process" },
|
|
19
|
+
lifecycle: {
|
|
20
|
+
shutdown: () => void 0,
|
|
21
|
+
retireWhenIdle: () => void 0,
|
|
22
|
+
isRetiring: () => false
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
async function connect(clientOptions = {}) {
|
|
26
|
+
if (closing) throw new JsonRpcConnectionClosedError();
|
|
27
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
28
|
+
const pending = /* @__PURE__ */ new Set();
|
|
29
|
+
let closed = false;
|
|
30
|
+
const outbox = [];
|
|
31
|
+
let draining = false;
|
|
32
|
+
const deliver = (item) => {
|
|
33
|
+
outbox.push(item);
|
|
34
|
+
if (draining) return;
|
|
35
|
+
draining = true;
|
|
36
|
+
queueMicrotask(() => {
|
|
37
|
+
try {
|
|
38
|
+
while (outbox.length > 0) try {
|
|
39
|
+
outbox.shift()();
|
|
40
|
+
} catch {}
|
|
41
|
+
} finally {
|
|
42
|
+
draining = false;
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
const peer = {
|
|
47
|
+
ready: false,
|
|
48
|
+
watching: null,
|
|
49
|
+
send(signal, seq) {
|
|
50
|
+
if (closed) return;
|
|
51
|
+
const meta = seq === void 0 ? void 0 : { seq };
|
|
52
|
+
let copy;
|
|
53
|
+
try {
|
|
54
|
+
copy = wire(signal);
|
|
55
|
+
} catch {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
deliver(() => {
|
|
59
|
+
if (closed) return;
|
|
60
|
+
for (const listener of listeners) listener(copy, meta);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const request = (method, params) => {
|
|
65
|
+
if (closed) return Promise.reject(new JsonRpcConnectionClosedError());
|
|
66
|
+
return new Promise((resolve, reject) => {
|
|
67
|
+
pending.add(reject);
|
|
68
|
+
const settle = (outcome) => {
|
|
69
|
+
deliver(() => {
|
|
70
|
+
if (!pending.delete(reject)) return;
|
|
71
|
+
outcome();
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
dispatcher.handleRequest(method, params === void 0 ? void 0 : wire(params), peer).then((result) => {
|
|
75
|
+
settle(() => {
|
|
76
|
+
try {
|
|
77
|
+
if (result.ok) resolve(wire(result.result));
|
|
78
|
+
else reject(new JsonRpcRemoteError(result.message, result.code, result.data));
|
|
79
|
+
} catch (err) {
|
|
80
|
+
reject(err instanceof Error ? err : new Error(String(err)));
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}, (err) => settle(() => reject(err)));
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
/** Stop delivering and fail what is in flight, as a socket closing does. */
|
|
87
|
+
const shut = () => {
|
|
88
|
+
closed = true;
|
|
89
|
+
listeners.clear();
|
|
90
|
+
outbox.length = 0;
|
|
91
|
+
for (const reject of pending) reject(new JsonRpcConnectionClosedError());
|
|
92
|
+
pending.clear();
|
|
93
|
+
};
|
|
94
|
+
const connection = {
|
|
95
|
+
peer,
|
|
96
|
+
hostClosed: () => {
|
|
97
|
+
if (closed) return;
|
|
98
|
+
shut();
|
|
99
|
+
clientOptions.onClose?.();
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
dispatcher.addPeer(peer);
|
|
103
|
+
connections.add(connection);
|
|
104
|
+
const detach = () => {
|
|
105
|
+
if (closed) return;
|
|
106
|
+
shut();
|
|
107
|
+
connections.delete(connection);
|
|
108
|
+
dispatcher.removePeer(peer);
|
|
109
|
+
};
|
|
110
|
+
let hello;
|
|
111
|
+
try {
|
|
112
|
+
hello = await request("ipc.hello", {
|
|
113
|
+
protocolVersion: 13,
|
|
114
|
+
appVersion: clientOptions.appVersion ?? "dev",
|
|
115
|
+
pid: process.pid,
|
|
116
|
+
buildId: IPC_BUILD_ID,
|
|
117
|
+
codeVersion: ZIDANE_VERSION
|
|
118
|
+
});
|
|
119
|
+
} catch (err) {
|
|
120
|
+
detach();
|
|
121
|
+
throw err;
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
hello,
|
|
125
|
+
request,
|
|
126
|
+
notify: (method, params) => {
|
|
127
|
+
if (closed) return;
|
|
128
|
+
const copy = params === void 0 ? void 0 : wire(params);
|
|
129
|
+
queueMicrotask(() => {
|
|
130
|
+
if (!closed) dispatcher.handleNotification(method, copy, peer);
|
|
131
|
+
});
|
|
132
|
+
},
|
|
133
|
+
onSignal: (listener) => {
|
|
134
|
+
listeners.add(listener);
|
|
135
|
+
return () => listeners.delete(listener);
|
|
136
|
+
},
|
|
137
|
+
close: detach
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function close() {
|
|
141
|
+
closing ??= (async () => {
|
|
142
|
+
await dispatcher.host.drain();
|
|
143
|
+
for (const connection of connections) connection.hostClosed();
|
|
144
|
+
connections.clear();
|
|
145
|
+
dispatcher.detachAll();
|
|
146
|
+
})();
|
|
147
|
+
return closing;
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
host: dispatcher.host,
|
|
151
|
+
connect,
|
|
152
|
+
peerCount: () => dispatcher.peerCount(),
|
|
153
|
+
close
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
//#endregion
|
|
157
|
+
//#region src/ipc/remote-oauth.ts
|
|
158
|
+
/** The UI's answer to `step`, or why it can't give one. */
|
|
159
|
+
async function answerStep(ui, step) {
|
|
160
|
+
if (step.kind === "select" && ui.select) return ui.select(step);
|
|
161
|
+
if (step.kind === "prompt" && (ui.prompt || ui.paste)) return ui.prompt ? ui.prompt(step) : ui.paste();
|
|
162
|
+
throw new Error(`The sign-in asks "${step.message}", and this window can't answer it here: sign in on the server machine or use an API key.`);
|
|
163
|
+
}
|
|
164
|
+
const abortError = () => /* @__PURE__ */ new Error("OAuth login aborted");
|
|
165
|
+
function whenAborted(signal) {
|
|
166
|
+
return new Promise((_, reject) => {
|
|
167
|
+
if (signal?.aborted) reject(abortError());
|
|
168
|
+
signal?.addEventListener("abort", () => reject(abortError()), { once: true });
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
async function runRemoteOAuth(client, target, ui) {
|
|
172
|
+
const { signal } = ui;
|
|
173
|
+
signal?.throwIfAborted();
|
|
174
|
+
const isMcp = "mcpServer" in target;
|
|
175
|
+
let loopback;
|
|
176
|
+
const listenOptions = {
|
|
177
|
+
...signal ? { signal } : {},
|
|
178
|
+
...ui.renderPage ? { renderPage: ui.renderPage } : {},
|
|
179
|
+
provider: isMcp ? target.mcpServer : target.provider
|
|
180
|
+
};
|
|
181
|
+
if (isMcp) loopback = await startOAuthCallback({
|
|
182
|
+
...listenOptions,
|
|
183
|
+
port: 0
|
|
184
|
+
});
|
|
185
|
+
let begin;
|
|
186
|
+
try {
|
|
187
|
+
begin = await client.request("auth.oauth.begin", isMcp ? {
|
|
188
|
+
mcpServer: target.mcpServer,
|
|
189
|
+
...target.cwd !== void 0 ? { cwd: target.cwd } : {},
|
|
190
|
+
...target.kind !== void 0 ? { kind: target.kind } : {},
|
|
191
|
+
redirectUri: loopback.redirectUri
|
|
192
|
+
} : { provider: target.provider });
|
|
193
|
+
const flowId = begin.flowId;
|
|
194
|
+
const respond = async (step) => {
|
|
195
|
+
const value = await answerStep(ui, step);
|
|
196
|
+
signal?.throwIfAborted();
|
|
197
|
+
return client.request("auth.oauth.respond", {
|
|
198
|
+
flowId,
|
|
199
|
+
stepId: step.id,
|
|
200
|
+
...value !== void 0 ? { value } : {}
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
while (begin.step) begin = await respond(begin.step);
|
|
204
|
+
let listenError;
|
|
205
|
+
if (!loopback && begin.mode === "loopback" && begin.redirectUri) {
|
|
206
|
+
const redirect = new URL(begin.redirectUri);
|
|
207
|
+
try {
|
|
208
|
+
loopback = await startOAuthCallback({
|
|
209
|
+
...listenOptions,
|
|
210
|
+
port: Number(redirect.port),
|
|
211
|
+
path: redirect.pathname
|
|
212
|
+
});
|
|
213
|
+
} catch (err) {
|
|
214
|
+
listenError = `Port ${redirect.port} is busy on this computer (${err instanceof Error ? err.message : String(err)}): paste the address the browser lands on instead.`;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
ui.onStart?.({
|
|
218
|
+
...begin,
|
|
219
|
+
listening: loopback !== void 0,
|
|
220
|
+
...listenError ? { listenError } : {}
|
|
221
|
+
});
|
|
222
|
+
await ui.openUrl(begin.url);
|
|
223
|
+
/** Deliver (once), then wait; a question after the URL is answered and the wait goes on. */
|
|
224
|
+
const complete = async (params) => {
|
|
225
|
+
let outcome = await client.request("auth.oauth.complete", {
|
|
226
|
+
flowId,
|
|
227
|
+
...params
|
|
228
|
+
});
|
|
229
|
+
while (outcome.step) {
|
|
230
|
+
await respond(outcome.step);
|
|
231
|
+
outcome = await client.request("auth.oauth.complete", { flowId });
|
|
232
|
+
}
|
|
233
|
+
return outcome;
|
|
234
|
+
};
|
|
235
|
+
const ways = [whenAborted(signal)];
|
|
236
|
+
if (loopback) {
|
|
237
|
+
const handle = loopback;
|
|
238
|
+
ways.push(handle.promise.then(({ code, state }) => complete({
|
|
239
|
+
code,
|
|
240
|
+
...state !== void 0 ? { state } : {}
|
|
241
|
+
})));
|
|
242
|
+
}
|
|
243
|
+
if (ui.paste) ways.push(ui.paste().then((input) => complete({ input })));
|
|
244
|
+
if (begin.mode !== "loopback") ways.push(complete({}));
|
|
245
|
+
for (const way of ways) way.catch(() => void 0);
|
|
246
|
+
return await Promise.race(ways);
|
|
247
|
+
} catch (err) {
|
|
248
|
+
if (begin) client.request("auth.oauth.cancel", { flowId: begin.flowId }).catch(() => void 0);
|
|
249
|
+
throw err;
|
|
250
|
+
} finally {
|
|
251
|
+
await loopback?.close();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//#endregion
|
|
255
|
+
//#region src/ipc/workspace-exec-stream.ts
|
|
256
|
+
async function runWorkspaceExecStream(client, params, options = {}) {
|
|
257
|
+
const { signal } = options;
|
|
258
|
+
const started = Date.now();
|
|
259
|
+
signal?.throwIfAborted();
|
|
260
|
+
let execId = null;
|
|
261
|
+
/** Signals that arrived before the reply named the exec. */
|
|
262
|
+
const early = [];
|
|
263
|
+
let output = "";
|
|
264
|
+
let finish = () => void 0;
|
|
265
|
+
const exited = new Promise((resolve) => {
|
|
266
|
+
finish = resolve;
|
|
267
|
+
});
|
|
268
|
+
const apply = (event) => {
|
|
269
|
+
if (event.kind === "workspace:exec:data") {
|
|
270
|
+
output += event.chunk;
|
|
271
|
+
options.onChunk?.(output);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
finish(event);
|
|
275
|
+
};
|
|
276
|
+
const unsubscribe = client.onSignal((event) => {
|
|
277
|
+
if (event.kind !== "workspace:exec:data" && event.kind !== "workspace:exec:exit") return;
|
|
278
|
+
if (execId === null) early.push(event);
|
|
279
|
+
else if (event.execId === execId) apply(event);
|
|
280
|
+
});
|
|
281
|
+
try {
|
|
282
|
+
try {
|
|
283
|
+
execId = (await client.request("sessions.workspaceExecStream", {
|
|
284
|
+
sessionId: params.sessionId,
|
|
285
|
+
command: params.command,
|
|
286
|
+
...params.cwd !== void 0 ? { cwd: params.cwd } : {}
|
|
287
|
+
})).execId;
|
|
288
|
+
} catch (err) {
|
|
289
|
+
if (!isMethodNotFound(err)) throw err;
|
|
290
|
+
return await buffered(client, params, options, started);
|
|
291
|
+
}
|
|
292
|
+
for (const event of early.splice(0)) if (event.execId === execId) apply(event);
|
|
293
|
+
const id = execId;
|
|
294
|
+
const onAbort = () => {
|
|
295
|
+
client.request("sessions.workspaceExecCancel", { execId: id }).catch(() => void 0);
|
|
296
|
+
setTimeout(finish, options.cancelGraceMs ?? 1e4, null).unref?.();
|
|
297
|
+
};
|
|
298
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
299
|
+
if (signal?.aborted) onAbort();
|
|
300
|
+
let exit;
|
|
301
|
+
try {
|
|
302
|
+
exit = await exited;
|
|
303
|
+
} finally {
|
|
304
|
+
signal?.removeEventListener("abort", onAbort);
|
|
305
|
+
}
|
|
306
|
+
return {
|
|
307
|
+
output,
|
|
308
|
+
exitCode: exit === null || exit.signal !== null ? null : exit.code,
|
|
309
|
+
durationMs: Date.now() - started,
|
|
310
|
+
aborted: signal?.aborted === true,
|
|
311
|
+
overflowed: exit?.truncated === true,
|
|
312
|
+
streamed: true
|
|
313
|
+
};
|
|
314
|
+
} finally {
|
|
315
|
+
unsubscribe();
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/** An older host: one buffered exec; `signal` stops waiting for it. */
|
|
319
|
+
async function buffered(client, params, options, started) {
|
|
320
|
+
const { signal } = options;
|
|
321
|
+
const request = client.request("sessions.workspaceExec", {
|
|
322
|
+
sessionId: params.sessionId,
|
|
323
|
+
command: params.command,
|
|
324
|
+
...params.cwd !== void 0 ? { cwd: params.cwd } : {},
|
|
325
|
+
timeoutSeconds: options.fallbackTimeoutSeconds ?? 600
|
|
326
|
+
});
|
|
327
|
+
const stopped = new Promise((resolve) => {
|
|
328
|
+
if (signal?.aborted) resolve(null);
|
|
329
|
+
signal?.addEventListener("abort", () => resolve(null), { once: true });
|
|
330
|
+
});
|
|
331
|
+
request.catch(() => void 0);
|
|
332
|
+
const result = await Promise.race([request, stopped]);
|
|
333
|
+
if (!result) return {
|
|
334
|
+
output: "",
|
|
335
|
+
exitCode: null,
|
|
336
|
+
durationMs: Date.now() - started,
|
|
337
|
+
aborted: true,
|
|
338
|
+
overflowed: false,
|
|
339
|
+
streamed: false
|
|
340
|
+
};
|
|
341
|
+
const output = [result.stdout, result.stderr].filter((part) => part.trim() !== "").map((part) => part.replace(/\n$/, "")).join("\n");
|
|
342
|
+
options.onChunk?.(output);
|
|
343
|
+
return {
|
|
344
|
+
output,
|
|
345
|
+
exitCode: result.exitCode,
|
|
346
|
+
durationMs: Date.now() - started,
|
|
347
|
+
aborted: false,
|
|
348
|
+
overflowed: false,
|
|
349
|
+
streamed: false
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
//#endregion
|
|
353
|
+
export { runRemoteOAuth as n, startInProcessHost as r, runWorkspaceExecStream as t };
|
|
354
|
+
|
|
355
|
+
//# sourceMappingURL=workspace-exec-stream-SV2R9d5S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-exec-stream-SV2R9d5S.js","names":[],"sources":["../src/ipc/memory.ts","../src/ipc/remote-oauth.ts","../src/ipc/workspace-exec-stream.ts"],"sourcesContent":["/**\n * In-process transport: the host dispatcher in the window's own process, and\n * `IpcClient`s that call it directly instead of over a unix socket.\n *\n * For a window that runs its own host (TUI local mode on the shared engine):\n * the same dispatcher, method table and signal fan-out a daemon serves, with\n * no socket, no spawn and no second process. A caller sees what a socket\n * client would, so the daemon-mode code paths run on it unchanged:\n * - params, results and signals are JSON copies (as on the wire: a top-level\n * `undefined` result arrives as `null`, nested `undefined` fields are\n * dropped, and nothing is shared between the window and the host);\n * - a failed request rejects with `JsonRpcRemoteError` carrying the\n * dispatcher's code; a closed connection rejects with\n * `JsonRpcConnectionClosedError`, in-flight requests included;\n * - responses and signals arrive asynchronously, through one queue in the\n * order the host produced them (a socket reads them in write order);\n * - `close()` detaches quietly; the host shutting down calls `onClose`.\n *\n * Two socket behaviors are deliberately absent. Request deadlines exist on\n * the socket to recover from a wedged daemon by dropping the connection and\n * reconnecting; in-process there is nothing to reconnect to. And\n * `daemon.shutdown` from a client does not stop the host: its lifetime\n * belongs to the embedding window (`InProcessHost.close()`).\n */\nimport type { ChatHost } from '../chat/host/engine'\nimport type { IpcClient } from './client'\nimport type { HostPeer } from './daemon/dispatcher'\nimport type { DaemonEnvironment } from './daemon/environment'\nimport type { HelloResult, HostSignal } from './protocol'\nimport type { SignalListener } from './transports/client-core'\nimport { JsonRpcConnectionClosedError, JsonRpcRemoteError } from '../acp/json-rpc'\nimport { ZIDANE_VERSION } from '../version'\nimport { createHostDispatcher } from './daemon/dispatcher'\nimport { IPC_BUILD_ID } from './daemon/lifecycle'\nimport { IPC_PROTOCOL_VERSION } from './protocol'\n\nexport interface InProcessHostOptions {\n /** The host's environment, given the broadcast sink wired to client fan-out. */\n createEnvironment: (broadcast: (signal: HostSignal) => void) => DaemonEnvironment | Promise<DaemonEnvironment>\n /** Reported to clients as the host's `appVersion`. */\n appVersion?: string\n}\n\nexport interface InProcessClientOptions {\n /** Client version, surfaced in the host's diagnostics. */\n appVersion?: string\n /** Called when the host shuts down under a still-open client. */\n onClose?: () => void\n}\n\nexport interface InProcessHost {\n host: ChatHost\n /** A new client, already past the `ipc.hello` handshake. */\n connect: (options?: InProcessClientOptions) => Promise<IpcClient>\n peerCount: () => number\n /**\n * Shut the host down: refuse new work, abort and await every run, then\n * close the clients still open (their `onClose` fires). Idempotent.\n */\n close: () => Promise<void>\n}\n\n/** JSON round-trip: what crossing the socket does to a value. */\nfunction wire<T>(value: T): T {\n return value === undefined ? (null as T) : JSON.parse(JSON.stringify(value)) as T\n}\n\n/** One open client, from the host's side. */\ninterface Connection {\n peer: HostPeer\n /** The host is shutting down: reject what is pending, then tell the client. */\n hostClosed: () => void\n}\n\nexport async function startInProcessHost(options: InProcessHostOptions): Promise<InProcessHost> {\n const connections = new Set<Connection>()\n let closing: Promise<void> | null = null\n\n const dispatcher = await createHostDispatcher({\n createEnvironment: options.createEnvironment,\n appVersion: options.appVersion ?? 'dev',\n startedAt: Date.now(),\n identity: { kind: 'in-process' },\n lifecycle: {\n // Owned by the embedding window, see the module header.\n shutdown: () => undefined,\n // Clients are this build by construction: never a newer one to retire for.\n retireWhenIdle: () => undefined,\n isRetiring: () => false,\n },\n })\n\n async function connect(clientOptions: InProcessClientOptions = {}): Promise<IpcClient> {\n if (closing)\n throw new JsonRpcConnectionClosedError()\n const listeners = new Set<SignalListener>()\n const pending = new Set<(err: Error) => void>()\n let closed = false\n\n /*\n * Everything bound for the client goes through one FIFO drained in a\n * microtask: signals, and request outcomes once the dispatcher settles\n * them. A signal the host emits after answering a request is therefore\n * delivered after that answer, as a socket would read them.\n */\n const outbox: Array<() => void> = []\n let draining = false\n const deliver = (item: () => void): void => {\n outbox.push(item)\n if (draining)\n return\n draining = true\n queueMicrotask(() => {\n try {\n while (outbox.length > 0) {\n try {\n outbox.shift()!()\n }\n catch {\n // A throwing listener costs that one message, as on the socket\n // (the JSON-RPC reader catches it), never the connection.\n }\n }\n }\n finally {\n draining = false\n }\n })\n }\n\n const peer: HostPeer = {\n ready: false,\n watching: null,\n send(signal, seq) {\n if (closed)\n return\n const meta = seq === undefined ? undefined : { seq }\n let copy: HostSignal\n try {\n copy = wire(signal)\n }\n catch {\n // Not JSON-able: the socket server drops it the same way, and a\n // bad signal must never break fan-out to the other clients.\n return\n }\n deliver(() => {\n if (closed)\n return\n for (const listener of listeners)\n listener(copy, meta)\n })\n },\n }\n\n const request = (method: string, params: unknown): Promise<unknown> => {\n if (closed)\n return Promise.reject(new JsonRpcConnectionClosedError())\n return new Promise((resolve, reject) => {\n pending.add(reject)\n const settle = (outcome: () => void): void => {\n deliver(() => {\n if (!pending.delete(reject))\n return\n outcome()\n })\n }\n dispatcher.handleRequest(method, params === undefined ? undefined : wire(params), peer).then(\n (result) => {\n settle(() => {\n // The reject is already out of `pending`: a throw here (a result\n // that is not JSON-able) must fail the request, not hang it.\n try {\n if (result.ok)\n resolve(wire(result.result))\n else\n reject(new JsonRpcRemoteError(result.message, result.code, result.data))\n }\n catch (err) {\n reject(err instanceof Error ? err : new Error(String(err)))\n }\n })\n },\n err => settle(() => reject(err)),\n )\n })\n }\n\n /** Stop delivering and fail what is in flight, as a socket closing does. */\n const shut = (): void => {\n closed = true\n listeners.clear()\n outbox.length = 0\n for (const reject of pending)\n reject(new JsonRpcConnectionClosedError())\n pending.clear()\n }\n\n const connection: Connection = {\n peer,\n hostClosed: () => {\n if (closed)\n return\n shut()\n clientOptions.onClose?.()\n },\n }\n\n dispatcher.addPeer(peer)\n connections.add(connection)\n const detach = (): void => {\n if (closed)\n return\n shut()\n connections.delete(connection)\n dispatcher.removePeer(peer)\n }\n\n let hello: HelloResult\n try {\n hello = await request('ipc.hello', {\n protocolVersion: IPC_PROTOCOL_VERSION,\n appVersion: clientOptions.appVersion ?? 'dev',\n pid: process.pid,\n buildId: IPC_BUILD_ID,\n codeVersion: ZIDANE_VERSION,\n }) as HelloResult\n }\n catch (err) {\n detach()\n throw err\n }\n\n return {\n hello,\n request: request as IpcClient['request'],\n notify: (method, params) => {\n if (closed)\n return\n const copy = params === undefined ? undefined : wire(params)\n // Off the caller's stack, as a socket write would be.\n queueMicrotask(() => {\n if (!closed)\n void dispatcher.handleNotification(method, copy, peer)\n })\n },\n onSignal: (listener) => {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n close: detach,\n }\n }\n\n function close(): Promise<void> {\n // Same order as the socket server's shutdown: drain the host, close\n // every connection, then forget the peers without per-peer cleanup.\n closing ??= (async () => {\n await dispatcher.host.drain()\n for (const connection of connections)\n connection.hostClosed()\n connections.clear()\n dispatcher.detachAll()\n })()\n return closing\n }\n\n return {\n host: dispatcher.host,\n connect,\n peerCount: () => dispatcher.peerCount(),\n close,\n }\n}\n","/**\n * The client half of a remote OAuth sign-in (`auth.oauth.*`): the host runs\n * the login and keeps its secrets; this machine has the browser. For an MCP\n * server it opens a loopback listener first (any free port) and hands its\n * URI to the host; for a provider it listens on the provider's fixed\n * `redirect_uri` once the host names it (a busy port falls back to pasting\n * the address the browser lands on). It opens the URL, forwards the code\n * (or what the user pasted) to the host, and resolves with the host's\n * outcome, which never carries a token. Device and polling flows just wait.\n *\n * The provider's own questions (a choice between flows, a free-text\n * prompt: `HostOAuthStep`) come back from `begin` / `complete`; the UI\n * answers them (`select` / `prompt`; a prompt falls back to `paste`). A UI\n * that can't answers nothing: the sign-in ends with why, never a default.\n */\nimport type { McpOAuthCallbackPageRenderer, OAuthCallbackHandle } from '../mcp/oauth-callback'\nimport type { HostOAuthBegin, HostOAuthComplete, HostOAuthStep } from './protocol'\nimport type { IpcClient } from './transports/client-core'\nimport { startOAuthCallback } from '../mcp/oauth-callback'\n\nexport type RemoteOAuthTarget = { provider: string } | { mcpServer: string, cwd?: string, kind?: string }\n\nexport interface RemoteOAuthStart extends HostOAuthBegin {\n /** This machine catches the redirect (else: paste, or wait for a device / polling flow). */\n listening: boolean\n /** Why it doesn't (a busy port). */\n listenError?: string\n}\n\nexport interface RemoteOAuthUi {\n /** Open the browser here (best effort; the URL is shown too). */\n openUrl: (url: string) => void | Promise<void>\n /** The flow started: the URL, the mode, a device code, whether the loopback listens. */\n onStart?: (start: RemoteOAuthStart) => void\n /** What the user pastes (a code or the address the browser landed on); offered in every mode. */\n paste?: () => Promise<string>\n signal?: AbortSignal\n /** The page the browser lands on at the loopback. */\n renderPage?: McpOAuthCallbackPageRenderer\n /** The provider asks the user to choose (its option id; `undefined` cancels). */\n select?: (step: Extract<HostOAuthStep, { kind: 'select' }>) => Promise<string | undefined>\n /** The provider asks the user a question (default: {@link paste}). */\n prompt?: (step: Extract<HostOAuthStep, { kind: 'prompt' }>) => Promise<string>\n}\n\n/** The UI's answer to `step`, or why it can't give one. */\nasync function answerStep(ui: RemoteOAuthUi, step: HostOAuthStep): Promise<string | undefined> {\n if (step.kind === 'select' && ui.select)\n return ui.select(step)\n if (step.kind === 'prompt' && (ui.prompt || ui.paste))\n return ui.prompt ? ui.prompt(step) : ui.paste!()\n throw new Error(`The sign-in asks \"${step.message}\", and this window can't answer it here: sign in on the server machine or use an API key.`)\n}\n\nconst abortError = (): Error => new Error('OAuth login aborted')\n\nfunction whenAborted(signal: AbortSignal | undefined): Promise<never> {\n return new Promise<never>((_, reject) => {\n if (signal?.aborted)\n reject(abortError())\n signal?.addEventListener('abort', () => reject(abortError()), { once: true })\n })\n}\n\nexport async function runRemoteOAuth(\n client: Pick<IpcClient, 'request'>,\n target: RemoteOAuthTarget,\n ui: RemoteOAuthUi,\n): Promise<HostOAuthComplete> {\n const { signal } = ui\n signal?.throwIfAborted()\n const isMcp = 'mcpServer' in target\n let loopback: OAuthCallbackHandle | undefined\n const listenOptions = { ...(signal ? { signal } : {}), ...(ui.renderPage ? { renderPage: ui.renderPage } : {}), provider: isMcp ? target.mcpServer : target.provider }\n if (isMcp)\n loopback = await startOAuthCallback({ ...listenOptions, port: 0 })\n let begin: HostOAuthBegin | undefined\n try {\n begin = await client.request('auth.oauth.begin', isMcp\n ? { mcpServer: target.mcpServer, ...(target.cwd !== undefined ? { cwd: target.cwd } : {}), ...(target.kind !== undefined ? { kind: target.kind } : {}), redirectUri: loopback!.redirectUri }\n : { provider: target.provider })\n const flowId = begin.flowId\n const respond = async (step: HostOAuthStep): Promise<HostOAuthBegin> => {\n const value = await answerStep(ui, step)\n signal?.throwIfAborted()\n return client.request('auth.oauth.respond', { flowId, stepId: step.id, ...(value !== undefined ? { value } : {}) })\n }\n // Questions before the URL.\n while (begin.step)\n begin = await respond(begin.step)\n let listenError: string | undefined\n if (!loopback && begin.mode === 'loopback' && begin.redirectUri) {\n const redirect = new URL(begin.redirectUri)\n try {\n loopback = await startOAuthCallback({ ...listenOptions, port: Number(redirect.port), path: redirect.pathname })\n }\n catch (err) {\n listenError = `Port ${redirect.port} is busy on this computer (${err instanceof Error ? err.message : String(err)}): paste the address the browser lands on instead.`\n }\n }\n ui.onStart?.({ ...begin, listening: loopback !== undefined, ...(listenError ? { listenError } : {}) })\n await ui.openUrl(begin.url)\n\n /** Deliver (once), then wait; a question after the URL is answered and the wait goes on. */\n const complete = async (params: { code?: string, state?: string, input?: string }): Promise<HostOAuthComplete> => {\n let outcome = await client.request('auth.oauth.complete', { flowId, ...params })\n while (outcome.step) {\n await respond(outcome.step)\n outcome = await client.request('auth.oauth.complete', { flowId })\n }\n return outcome\n }\n const ways: Promise<HostOAuthComplete>[] = [whenAborted(signal)]\n if (loopback) {\n const handle = loopback\n ways.push(handle.promise.then(({ code, state }) => complete({ code, ...(state !== undefined ? { state } : {}) })))\n }\n if (ui.paste)\n ways.push(ui.paste().then(input => complete({ input })))\n // Device and polling flows finish on the host's side: wait for it.\n if (begin.mode !== 'loopback')\n ways.push(complete({}))\n for (const way of ways)\n way.catch(() => undefined)\n return await Promise.race(ways)\n }\n catch (err) {\n if (begin)\n void client.request('auth.oauth.cancel', { flowId: begin.flowId }).catch(() => undefined)\n throw err\n }\n finally {\n await loopback?.close()\n }\n}\n","/**\n * The client half of a streamed workspace command (`!` on a remote host):\n * starts `sessions.workspaceExecStream`, gathers its `workspace:exec:*`\n * signals (which may beat the reply) into one output in arrival order, and\n * cancels on the host when `signal` aborts. The result has the shape of a\n * local `!` run (`BashRunResult`), so both format and persist alike. A host\n * without the method gets the buffered `sessions.workspaceExec`, where an\n * abort stops waiting, not the command.\n */\nimport type { HostSignal } from './protocol'\nimport type { IpcClient } from './transports/client-core'\nimport { isMethodNotFound } from '../chat/hosts/connection'\n\nexport interface WorkspaceExecStreamResult {\n /** stdout and stderr in arrival order (the buffered fallback: stdout, then stderr). */\n output: string\n /** `null` when the host killed it (cancel, output cap). */\n exitCode: number | null\n durationMs: number\n /** Cancelled through `signal`. */\n aborted: boolean\n /** The host's output cap was reached and the process stopped. */\n overflowed: boolean\n /** `false`: an older host answered with the buffered exec. */\n streamed: boolean\n}\n\nexport interface WorkspaceExecStreamOptions {\n signal?: AbortSignal\n /** The whole output so far, on every chunk. */\n onChunk?: (accumulated: string) => void\n /** The buffered fallback's bound. Default 600 s. */\n fallbackTimeoutSeconds?: number\n /** How long to wait for the host's exit after a cancel before giving up on it. Default 10 s. */\n cancelGraceMs?: number\n}\n\ntype ExecSignal = Extract<HostSignal, { kind: 'workspace:exec:data' | 'workspace:exec:exit' }>\n\nexport async function runWorkspaceExecStream(\n client: Pick<IpcClient, 'request' | 'onSignal'>,\n params: { sessionId: string, command: string, cwd?: string },\n options: WorkspaceExecStreamOptions = {},\n): Promise<WorkspaceExecStreamResult> {\n const { signal } = options\n const started = Date.now()\n signal?.throwIfAborted()\n\n let execId: string | null = null\n /** Signals that arrived before the reply named the exec. */\n const early: ExecSignal[] = []\n let output = ''\n let finish: (exit: Extract<ExecSignal, { kind: 'workspace:exec:exit' }> | null) => void = () => undefined\n const exited = new Promise<Extract<ExecSignal, { kind: 'workspace:exec:exit' }> | null>((resolve) => {\n finish = resolve\n })\n const apply = (event: ExecSignal): void => {\n if (event.kind === 'workspace:exec:data') {\n output += event.chunk\n options.onChunk?.(output)\n return\n }\n finish(event)\n }\n const unsubscribe = client.onSignal((event) => {\n if (event.kind !== 'workspace:exec:data' && event.kind !== 'workspace:exec:exit')\n return\n if (execId === null)\n early.push(event)\n else if (event.execId === execId)\n apply(event)\n })\n\n try {\n try {\n execId = (await client.request('sessions.workspaceExecStream', { sessionId: params.sessionId, command: params.command, ...(params.cwd !== undefined ? { cwd: params.cwd } : {}) })).execId\n }\n catch (err) {\n if (!isMethodNotFound(err))\n throw err\n return await buffered(client, params, options, started)\n }\n for (const event of early.splice(0)) {\n if (event.execId === execId)\n apply(event)\n }\n\n const id = execId\n const onAbort = (): void => {\n void client.request('sessions.workspaceExecCancel', { execId: id }).catch(() => undefined)\n // The exit normally follows the kill; a connection lost meanwhile must not hang the caller.\n setTimeout(finish, options.cancelGraceMs ?? 10_000, null).unref?.()\n }\n signal?.addEventListener('abort', onAbort, { once: true })\n if (signal?.aborted)\n onAbort()\n let exit: Awaited<typeof exited>\n try {\n exit = await exited\n }\n finally {\n signal?.removeEventListener('abort', onAbort)\n }\n return {\n output,\n exitCode: exit === null || exit.signal !== null ? null : exit.code,\n durationMs: Date.now() - started,\n aborted: signal?.aborted === true,\n overflowed: exit?.truncated === true,\n streamed: true,\n }\n }\n finally {\n unsubscribe()\n }\n}\n\n/** An older host: one buffered exec; `signal` stops waiting for it. */\nasync function buffered(\n client: Pick<IpcClient, 'request'>,\n params: { sessionId: string, command: string, cwd?: string },\n options: WorkspaceExecStreamOptions,\n started: number,\n): Promise<WorkspaceExecStreamResult> {\n const { signal } = options\n const request = client.request('sessions.workspaceExec', {\n sessionId: params.sessionId,\n command: params.command,\n ...(params.cwd !== undefined ? { cwd: params.cwd } : {}),\n timeoutSeconds: options.fallbackTimeoutSeconds ?? 600,\n })\n const stopped = new Promise<null>((resolve) => {\n if (signal?.aborted)\n resolve(null)\n signal?.addEventListener('abort', () => resolve(null), { once: true })\n })\n request.catch(() => undefined)\n const result = await Promise.race([request, stopped])\n if (!result)\n return { output: '', exitCode: null, durationMs: Date.now() - started, aborted: true, overflowed: false, streamed: false }\n const output = [result.stdout, result.stderr].filter(part => part.trim() !== '').map(part => part.replace(/\\n$/, '')).join('\\n')\n options.onChunk?.(output)\n return { output, exitCode: result.exitCode, durationMs: Date.now() - started, aborted: false, overflowed: false, streamed: false }\n}\n"],"mappings":"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"}
|