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
package/dist/ipc.js
CHANGED
|
@@ -1,4 +1,403 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { t as
|
|
4
|
-
|
|
1
|
+
import { a as projectRootOf } from "./project-root-B8zADr4o.js";
|
|
2
|
+
import { t as resolveStorageDirs } from "./xdg-zweed0-t.js";
|
|
3
|
+
import { $t as MachineErrorCode, Zt as MACHINE_PROTOCOL_VERSION } from "./tool-formatters-IQFDrdrs.js";
|
|
4
|
+
import { Cr as runCompaction, Jt as createChatHost, Sr as EditOutcomeLedger, Tr as createMemoryApprovalsStore, Yt as createInteractionHub, cr as resolveCwdPath, lr as serializePreview, or as extractEditPayloadForGate, sr as readFileSafe, wr as createApprovalHub } from "./chat-JPJJ8uu5.js";
|
|
5
|
+
import { C as IPC_BUILD_ID, E as ensureDaemonRunning, O as probeSocket, T as defaultSocketPath, _ as loadAllEvents, b as loadSessionDocument, c as IpcErrorCode, f as REDACTED, g as hostRefOf, h as SIGNAL_SEQ_FIELD, i as IpcVersionMismatchError, k as selfDaemonSpawnCommand, l as LOAD_EVENTS_MAX_PAGE_TURNS, m as SESSION_TURNS_PAGE, p as SESSION_TURNS_MAX_PAGE, s as IPC_PROTOCOL_VERSION, u as LOAD_EVENTS_PAGE_TURNS, v as loadEventsPage, w as daemonSocketName } from "./settings-keys-Ckf29NeM.js";
|
|
6
|
+
import { a as turnCutPoints, c as createDaemonEnvironment, d as connectIpcClient, f as connectOrSpawnDaemon, i as transcriptPage, l as createFileApprovalsStore, n as WHOLE_RUN_PAGES, o as createMachineHandlers, r as exchangeBoundaries, s as createMachineLinkHandlers, u as createHostEnvironment } from "./dispatcher-BMlu2BmZ.js";
|
|
7
|
+
import { a as startIpcDaemon, i as shellPathAsync, n as mergePath, r as shellPath, t as fixPath } from "./shell-path-Dqaoow2J.js";
|
|
8
|
+
import { n as runRemoteOAuth, r as startInProcessHost, t as runWorkspaceExecStream } from "./workspace-exec-stream-SV2R9d5S.js";
|
|
9
|
+
import process from "node:process";
|
|
10
|
+
import { createInterface } from "node:readline";
|
|
11
|
+
//#region src/ipc/attach.ts
|
|
12
|
+
const DIM = "\x1B[2m";
|
|
13
|
+
const BOLD = "\x1B[1m";
|
|
14
|
+
const CYAN = "\x1B[36m";
|
|
15
|
+
const YELLOW = "\x1B[33m";
|
|
16
|
+
const RED = "\x1B[31m";
|
|
17
|
+
const RESET = "\x1B[0m";
|
|
18
|
+
async function runAttach(options = {}) {
|
|
19
|
+
const out = options.stdout ?? process.stdout;
|
|
20
|
+
const write = (text) => void out.write(text);
|
|
21
|
+
const cwd = options.cwd ?? process.cwd();
|
|
22
|
+
const ensureOptions = {
|
|
23
|
+
socketPath: options.socketPath ?? defaultSocketPath(),
|
|
24
|
+
...options.spawnCommand ? { spawnCommand: options.spawnCommand } : {}
|
|
25
|
+
};
|
|
26
|
+
let failRun = null;
|
|
27
|
+
const what = options.host ? "server" : "daemon";
|
|
28
|
+
const onClose = () => {
|
|
29
|
+
write(`\n${RED}${what} connection lost${RESET}\n`);
|
|
30
|
+
failRun?.(/* @__PURE__ */ new Error(`${what} connection lost`));
|
|
31
|
+
};
|
|
32
|
+
const appVersion = options.appVersion ? { appVersion: options.appVersion } : {};
|
|
33
|
+
const client = options.host ? await (await import("./ws-client-N7NxzvQp.js").then((n) => n.r)).connectWsClient({
|
|
34
|
+
url: options.host.url,
|
|
35
|
+
...options.host.token ? { token: options.host.token } : {},
|
|
36
|
+
...appVersion,
|
|
37
|
+
onClose
|
|
38
|
+
}) : await connectOrSpawnDaemon({
|
|
39
|
+
...ensureOptions,
|
|
40
|
+
...appVersion,
|
|
41
|
+
onClose
|
|
42
|
+
});
|
|
43
|
+
write(options.host ? `${DIM}connected to zidane server ${client.hello.hostName ?? options.host.url} (v${client.hello.appVersion})${RESET}\n` : `${DIM}connected to zidane daemon (pid ${client.hello.pid}, v${client.hello.appVersion})${RESET}\n`);
|
|
44
|
+
const rl = createInterface({
|
|
45
|
+
input: options.stdin ?? process.stdin,
|
|
46
|
+
output: out,
|
|
47
|
+
prompt: `${BOLD}> ${RESET}`
|
|
48
|
+
});
|
|
49
|
+
const lines = createLineRouter(rl, write);
|
|
50
|
+
const hitl = createHitlQueue();
|
|
51
|
+
const session = await pickSession(client, {
|
|
52
|
+
ask: lines.ask,
|
|
53
|
+
write,
|
|
54
|
+
cwd,
|
|
55
|
+
...options
|
|
56
|
+
});
|
|
57
|
+
if (!session) {
|
|
58
|
+
rl.close();
|
|
59
|
+
client.close();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
write(`${BOLD}session${RESET} ${session.id} ${DIM}(${session.title})${RESET}\n`);
|
|
63
|
+
write(`${DIM}tools run in ${session.cwd}. /interrupt stops a run, /exit detaches (the run keeps going)${RESET}\n\n`);
|
|
64
|
+
const bufferedSignals = [];
|
|
65
|
+
let signalSink = (s) => bufferedSignals.push(s);
|
|
66
|
+
const unsubscribe = client.onSignal((s) => signalSink(s));
|
|
67
|
+
await replayTranscript(client, session.id, write);
|
|
68
|
+
let running = await client.request("chat.isRunning", { sessionId: session.id });
|
|
69
|
+
if (running) write(`${DIM}a run is in progress, following it live${RESET}\n`);
|
|
70
|
+
const view = createEventView(write);
|
|
71
|
+
const answerApproval = (request) => handleApproval(client, lines.ask, write, request);
|
|
72
|
+
const answerInteraction = (request) => handleInteraction(client, lines.ask, write, request);
|
|
73
|
+
const onSignal = (signal) => {
|
|
74
|
+
if (signal.kind === "approval:resolved" || signal.kind === "interaction:resolved") {
|
|
75
|
+
hitl.markResolved(signal.requestId);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (signal.kind === "approval:request") {
|
|
79
|
+
if (signal.request.sessionId === session.id) hitl.enqueue(signal.request.id, () => answerApproval(signal.request));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if ("sessionId" in signal && signal.sessionId !== session.id) return;
|
|
83
|
+
switch (signal.kind) {
|
|
84
|
+
case "run:start":
|
|
85
|
+
running = true;
|
|
86
|
+
view.resetRun();
|
|
87
|
+
break;
|
|
88
|
+
case "run:end":
|
|
89
|
+
running = false;
|
|
90
|
+
write(signal.ok ? "\n" : `\n${RED}run failed: ${signal.error ?? "unknown error"}${RESET}\n`);
|
|
91
|
+
if (!lines.isAsking()) rl.prompt();
|
|
92
|
+
break;
|
|
93
|
+
case "event":
|
|
94
|
+
view.render(signal.event);
|
|
95
|
+
break;
|
|
96
|
+
case "compacting:start":
|
|
97
|
+
write(`${DIM}compacting…${RESET}\n`);
|
|
98
|
+
break;
|
|
99
|
+
case "interaction:request": hitl.enqueue(signal.request.id, () => answerInteraction(signal.request));
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
for (const request of await client.request("approvals.listPending", {})) if (request.sessionId === session.id) hitl.enqueue(request.id, () => answerApproval(request));
|
|
103
|
+
for (const pending of await client.request("interactions.list", { sessionId: session.id })) if (pending.live) hitl.enqueue(pending.request.id, () => answerInteraction(pending.request));
|
|
104
|
+
signalSink = onSignal;
|
|
105
|
+
for (const buffered of bufferedSignals.splice(0)) onSignal(buffered);
|
|
106
|
+
const detach = () => {
|
|
107
|
+
unsubscribe();
|
|
108
|
+
rl.close();
|
|
109
|
+
client.close();
|
|
110
|
+
write(`\n${DIM}detached, the session keeps running in the ${what}${RESET}\n`);
|
|
111
|
+
};
|
|
112
|
+
rl.on("SIGINT", () => {
|
|
113
|
+
if (running) {
|
|
114
|
+
client.request("chat.interrupt", { sessionId: session.id }).catch(() => void 0);
|
|
115
|
+
write(`\n${DIM}interrupt sent${RESET}\n`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
detach();
|
|
119
|
+
});
|
|
120
|
+
await new Promise((resolve, reject) => {
|
|
121
|
+
failRun = (error) => {
|
|
122
|
+
unsubscribe();
|
|
123
|
+
rl.close();
|
|
124
|
+
client.close();
|
|
125
|
+
reject(error);
|
|
126
|
+
};
|
|
127
|
+
rl.on("close", () => resolve());
|
|
128
|
+
lines.armSubmit(createLineSubmitter({
|
|
129
|
+
client,
|
|
130
|
+
sessionId: session.id,
|
|
131
|
+
rl,
|
|
132
|
+
write,
|
|
133
|
+
view,
|
|
134
|
+
detach: () => {
|
|
135
|
+
detach();
|
|
136
|
+
resolve();
|
|
137
|
+
}
|
|
138
|
+
}));
|
|
139
|
+
if (!running) rl.prompt();
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Line routing: normally a line is a prompt for the model, but while an
|
|
144
|
+
* approval / interaction / picker question is pending, the next line
|
|
145
|
+
* answers it instead. One slot suffices — questions are asked serially.
|
|
146
|
+
*/
|
|
147
|
+
function createLineRouter(rl, write) {
|
|
148
|
+
let pendingAsk = null;
|
|
149
|
+
let submitLine = null;
|
|
150
|
+
/** Prompt lines typed before the input loop is armed (mid-boot) queue up. */
|
|
151
|
+
const earlyLines = [];
|
|
152
|
+
rl.on("line", (line) => {
|
|
153
|
+
if (pendingAsk) {
|
|
154
|
+
const slot = pendingAsk;
|
|
155
|
+
pendingAsk = null;
|
|
156
|
+
slot.resolve(line);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (submitLine) submitLine(line);
|
|
160
|
+
else earlyLines.push(line);
|
|
161
|
+
});
|
|
162
|
+
return {
|
|
163
|
+
ask: (prompt) => {
|
|
164
|
+
write(prompt);
|
|
165
|
+
return new Promise((resolve) => {
|
|
166
|
+
pendingAsk = { resolve };
|
|
167
|
+
});
|
|
168
|
+
},
|
|
169
|
+
isAsking: () => pendingAsk !== null,
|
|
170
|
+
armSubmit: (submit) => {
|
|
171
|
+
submitLine = submit;
|
|
172
|
+
while (earlyLines.length > 0) submit(earlyLines.shift());
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/** One typed line: a local command, or a prompt pushed to the session. */
|
|
177
|
+
function createLineSubmitter({ client, sessionId, rl, write, view, detach }) {
|
|
178
|
+
return (line) => {
|
|
179
|
+
const text = line.trim();
|
|
180
|
+
if (text.length === 0) {
|
|
181
|
+
rl.prompt();
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (text === "/exit" || text === "/quit") {
|
|
185
|
+
detach();
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
if (text === "/interrupt") {
|
|
189
|
+
client.request("chat.interrupt", { sessionId }).catch(() => void 0);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
view.expectOwnEcho(text);
|
|
193
|
+
client.request("chat.pushQueued", {
|
|
194
|
+
sessionId,
|
|
195
|
+
message: text
|
|
196
|
+
}).then(({ delivered }) => {
|
|
197
|
+
if (delivered === "steer") write(`${DIM}(steered into the live run)${RESET}\n`);
|
|
198
|
+
}).catch((err) => {
|
|
199
|
+
view.releaseOwnEcho(text);
|
|
200
|
+
write(`${RED}${err instanceof Error ? err.message : String(err)}${RESET}\n`);
|
|
201
|
+
rl.prompt();
|
|
202
|
+
});
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* HITL prompts share the single `ask` slot, so approvals / interactions
|
|
207
|
+
* MUST be asked one at a time — the startup rehydrate loops and live
|
|
208
|
+
* signals can otherwise fire several handlers at once, each overwriting the
|
|
209
|
+
* previous resolver and leaving those prompts hung forever (unanswerable
|
|
210
|
+
* from this window). Chain every handler on the previous one so they run
|
|
211
|
+
* strictly sequentially.
|
|
212
|
+
*/
|
|
213
|
+
function createHitlQueue() {
|
|
214
|
+
let hitlQueue = Promise.resolve();
|
|
215
|
+
const queuedHitlIds = /* @__PURE__ */ new Set();
|
|
216
|
+
const resolvedHitlIds = /* @__PURE__ */ new Set();
|
|
217
|
+
return {
|
|
218
|
+
enqueue: (requestId, task) => {
|
|
219
|
+
if (queuedHitlIds.has(requestId) || resolvedHitlIds.has(requestId)) return;
|
|
220
|
+
queuedHitlIds.add(requestId);
|
|
221
|
+
hitlQueue = hitlQueue.then(async () => {
|
|
222
|
+
if (resolvedHitlIds.has(requestId)) return;
|
|
223
|
+
await task();
|
|
224
|
+
}, () => void 0);
|
|
225
|
+
},
|
|
226
|
+
markResolved: (requestId) => {
|
|
227
|
+
resolvedHitlIds.add(requestId);
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
async function handleApproval(client, ask, write, request) {
|
|
232
|
+
write(`\n${YELLOW}approval needed${RESET}: ${BOLD}${request.tool}${RESET}\n`);
|
|
233
|
+
write(`${DIM}${clipLines(JSON.stringify(request.input, null, 2), 12)}${RESET}\n`);
|
|
234
|
+
const answer = await ask(`${YELLOW}[y]es once / [s]ession / [a]lways (safelist) / [n]o: ${RESET}`);
|
|
235
|
+
const decision = answer.trim().toLowerCase() === "y" ? "accept-once" : answer.trim().toLowerCase() === "s" ? "accept-session" : answer.trim().toLowerCase() === "a" ? "accept-safelist" : "deny";
|
|
236
|
+
await client.request("approvals.resolve", {
|
|
237
|
+
requestId: request.id,
|
|
238
|
+
decision
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
async function handleInteraction(client, ask, write, request) {
|
|
242
|
+
if (request.kind === "plan") {
|
|
243
|
+
write(`\n${YELLOW}plan:${RESET} ${BOLD}${request.payload.title}${RESET}\n${request.payload.plan}\n`);
|
|
244
|
+
const c = (await ask(`${YELLOW}[a]pprove / [r]eject / re[v]ise (with comment): ${RESET}`)).trim().toLowerCase();
|
|
245
|
+
if (c === "v") {
|
|
246
|
+
const comment = await ask("comment: ");
|
|
247
|
+
await client.request("interactions.respond", {
|
|
248
|
+
requestId: request.id,
|
|
249
|
+
response: {
|
|
250
|
+
kind: "plan",
|
|
251
|
+
decision: "revise",
|
|
252
|
+
comment
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
await client.request("interactions.respond", {
|
|
258
|
+
requestId: request.id,
|
|
259
|
+
response: {
|
|
260
|
+
kind: "plan",
|
|
261
|
+
decision: c === "a" ? "approve" : "reject"
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
if (request.payload.intro) write(`\n${request.payload.intro}\n`);
|
|
267
|
+
const answers = {};
|
|
268
|
+
for (const question of request.payload.questions) {
|
|
269
|
+
if (question.type === "confirm") {
|
|
270
|
+
const answer = await ask(`${YELLOW}${question.prompt}${RESET} [y/n]: `);
|
|
271
|
+
answers[question.id] = answer.trim().toLowerCase().startsWith("y");
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
if (question.type === "select") {
|
|
275
|
+
write(`${YELLOW}${question.prompt}${RESET}\n`);
|
|
276
|
+
question.choices.forEach((choice, i) => write(` ${i + 1}. ${choice.label}\n`));
|
|
277
|
+
const picks = (await ask(question.multi ? "pick (comma-separated numbers): " : "pick a number: ")).split(",").map((part) => question.choices[Number.parseInt(part.trim(), 10) - 1]?.id).filter((id) => typeof id === "string");
|
|
278
|
+
answers[question.id] = question.multi ? picks : picks[0] ?? "";
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
answers[question.id] = await ask(`${YELLOW}${question.prompt}${RESET}: `);
|
|
282
|
+
}
|
|
283
|
+
await client.request("interactions.respond", {
|
|
284
|
+
requestId: request.id,
|
|
285
|
+
response: {
|
|
286
|
+
kind: "question",
|
|
287
|
+
answers
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
function createEventView(write) {
|
|
292
|
+
let lastEventKind = null;
|
|
293
|
+
/**
|
|
294
|
+
* The host broadcasts every window's user message as a `user-prompt`
|
|
295
|
+
* event — render it so this window sees prompts posted elsewhere. Our
|
|
296
|
+
* OWN just-sent messages are skipped once each (readline already echoed
|
|
297
|
+
* them). A multiset (text → count) handles rapid identical sends and
|
|
298
|
+
* never suppresses another window's matching message beyond our own
|
|
299
|
+
* outstanding count.
|
|
300
|
+
*/
|
|
301
|
+
const ownEchoes = /* @__PURE__ */ new Map();
|
|
302
|
+
const render = (event) => {
|
|
303
|
+
switch (event.kind) {
|
|
304
|
+
case "user-prompt": {
|
|
305
|
+
const outstanding = ownEchoes.get(event.text) ?? 0;
|
|
306
|
+
if (outstanding > 0) {
|
|
307
|
+
if (outstanding === 1) ownEchoes.delete(event.text);
|
|
308
|
+
else ownEchoes.set(event.text, outstanding - 1);
|
|
309
|
+
break;
|
|
310
|
+
}
|
|
311
|
+
write(`\n${BOLD}> ${event.text}${RESET}\n`);
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
case "markdown":
|
|
315
|
+
if (lastEventKind !== "markdown" && lastEventKind !== null) write("\n");
|
|
316
|
+
write(event.text);
|
|
317
|
+
break;
|
|
318
|
+
case "thinking":
|
|
319
|
+
if (lastEventKind !== "thinking") write(`${DIM}(thinking…)${RESET}\n`);
|
|
320
|
+
break;
|
|
321
|
+
case "tool":
|
|
322
|
+
write(`\n${CYAN}▸ ${event.text}${RESET}\n`);
|
|
323
|
+
break;
|
|
324
|
+
case "tool-result":
|
|
325
|
+
write(`${DIM}${clipLines(event.text, 3)}${RESET}\n`);
|
|
326
|
+
break;
|
|
327
|
+
case "task-notification":
|
|
328
|
+
case "info":
|
|
329
|
+
write(`${DIM}${event.text}${RESET}\n`);
|
|
330
|
+
break;
|
|
331
|
+
case "error": write(`${RED}${event.text}${RESET}\n`);
|
|
332
|
+
}
|
|
333
|
+
lastEventKind = event.kind;
|
|
334
|
+
};
|
|
335
|
+
return {
|
|
336
|
+
render,
|
|
337
|
+
resetRun: () => {
|
|
338
|
+
lastEventKind = null;
|
|
339
|
+
},
|
|
340
|
+
expectOwnEcho: (text) => {
|
|
341
|
+
ownEchoes.set(text, (ownEchoes.get(text) ?? 0) + 1);
|
|
342
|
+
},
|
|
343
|
+
releaseOwnEcho: (text) => {
|
|
344
|
+
const outstanding = ownEchoes.get(text) ?? 0;
|
|
345
|
+
if (outstanding <= 1) ownEchoes.delete(text);
|
|
346
|
+
else ownEchoes.set(text, outstanding - 1);
|
|
347
|
+
}
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
async function pickSession(client, ctx) {
|
|
351
|
+
const projectRoot = projectRootOf(ctx.cwd);
|
|
352
|
+
if (ctx.createNew) return client.request("sessions.create", { cwd: ctx.cwd });
|
|
353
|
+
const rows = await client.request("sessions.list", {
|
|
354
|
+
projectRoot,
|
|
355
|
+
archive: "active"
|
|
356
|
+
});
|
|
357
|
+
if (ctx.sessionId) {
|
|
358
|
+
const match = rows.find((r) => r.id === ctx.sessionId || r.id.startsWith(ctx.sessionId));
|
|
359
|
+
if (match) return match;
|
|
360
|
+
const global = (await client.request("sessions.list", {})).find((r) => r.id === ctx.sessionId || r.id.startsWith(ctx.sessionId));
|
|
361
|
+
if (global) return global;
|
|
362
|
+
ctx.write(`${RED}no session matching "${ctx.sessionId}"${RESET}\n`);
|
|
363
|
+
return null;
|
|
364
|
+
}
|
|
365
|
+
if (rows.length === 0) return client.request("sessions.create", { cwd: ctx.cwd });
|
|
366
|
+
ctx.write(`${BOLD}sessions in ${projectRoot}:${RESET}\n`);
|
|
367
|
+
rows.slice(0, 15).forEach((row, i) => {
|
|
368
|
+
const status = row.status === "running" ? ` ${YELLOW}● running${RESET}` : "";
|
|
369
|
+
ctx.write(` ${i + 1}. ${row.title} ${DIM}(${row.id.slice(0, 8)})${RESET}${status}\n`);
|
|
370
|
+
});
|
|
371
|
+
const answer = await ctx.ask("pick a number, or [n]ew: ");
|
|
372
|
+
if (answer.trim().toLowerCase() === "n") return client.request("sessions.create", { cwd: ctx.cwd });
|
|
373
|
+
const picked = rows[Number.parseInt(answer.trim(), 10) - 1];
|
|
374
|
+
if (!picked) {
|
|
375
|
+
ctx.write(`${RED}invalid pick${RESET}\n`);
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
return picked;
|
|
379
|
+
}
|
|
380
|
+
const REPLAY_EVENT_CAP = 60;
|
|
381
|
+
async function replayTranscript(client, sessionId, write) {
|
|
382
|
+
const page = await loadEventsPage((method, params) => client.request(method, params), {
|
|
383
|
+
sessionId,
|
|
384
|
+
limit: REPLAY_EVENT_CAP
|
|
385
|
+
});
|
|
386
|
+
const events = page.events;
|
|
387
|
+
if (events.length === 0) return;
|
|
388
|
+
const tail = events.slice(-60);
|
|
389
|
+
if (events.length > tail.length || (page.cursor ?? 0) > 0) write(`${DIM}… earlier events omitted${RESET}\n`);
|
|
390
|
+
for (const event of tail) if (event.kind === "user-prompt") write(`\n${BOLD}> ${event.text}${RESET}\n`);
|
|
391
|
+
else if (event.kind === "markdown") write(`${event.text}\n`);
|
|
392
|
+
else if (event.kind === "tool") write(`${CYAN}▸ ${event.text}${RESET}\n`);
|
|
393
|
+
write("\n");
|
|
394
|
+
}
|
|
395
|
+
function clipLines(text, max) {
|
|
396
|
+
const lines = text.split("\n");
|
|
397
|
+
if (lines.length <= max) return text;
|
|
398
|
+
return `${lines.slice(0, max).join("\n")}\n${DIM}… ${lines.length - max} more lines${RESET}`;
|
|
399
|
+
}
|
|
400
|
+
//#endregion
|
|
401
|
+
export { EditOutcomeLedger, IPC_BUILD_ID, IPC_PROTOCOL_VERSION, IpcErrorCode, IpcVersionMismatchError, LOAD_EVENTS_MAX_PAGE_TURNS, LOAD_EVENTS_PAGE_TURNS, MACHINE_PROTOCOL_VERSION, MachineErrorCode, REDACTED, SESSION_TURNS_MAX_PAGE, SESSION_TURNS_PAGE, SIGNAL_SEQ_FIELD, WHOLE_RUN_PAGES, connectIpcClient, connectOrSpawnDaemon, createApprovalHub, createChatHost, createDaemonEnvironment, createFileApprovalsStore, createHostEnvironment, createInteractionHub, createMachineHandlers, createMachineLinkHandlers, createMemoryApprovalsStore, daemonSocketName, defaultSocketPath, ensureDaemonRunning, exchangeBoundaries, extractEditPayloadForGate, fixPath, hostRefOf, loadAllEvents, loadEventsPage, loadSessionDocument, mergePath, probeSocket, readFileSafe, resolveCwdPath, resolveStorageDirs, runAttach, runCompaction, runRemoteOAuth, runWorkspaceExecStream, selfDaemonSpawnCommand, serializePreview, shellPath, shellPathAsync, startInProcessHost, startIpcDaemon, transcriptPage, turnCutPoints };
|
|
402
|
+
|
|
403
|
+
//# sourceMappingURL=ipc.js.map
|
package/dist/ipc.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc.js","names":[],"sources":["../src/ipc/attach.ts"],"sourcesContent":["import type { Interface } from 'node:readline'\n/**\n * `zidane attach` — a thin terminal client over the daemon protocol.\n *\n * Deliberately minimal (readline, no TUI framework): it exists to prove and\n * exercise the multi-window contract — several attach clients plus the GUI\n * can watch the SAME session converge live, answer each other's approvals,\n * and steer the same run. The full OpenTUI front-end migrates onto\n * `connectIpcClient` separately.\n *\n * Everything here is presentation: all state lives in the daemon.\n */\nimport type { InteractionRequest, StreamEvent } from '../chat/index'\nimport type { AnswerValue } from '../chat/interactions'\nimport type { IpcClient } from './client'\nimport type { EnsureDaemonOptions } from './daemon/lifecycle'\nimport type { HostSignal, SessionRow, WireApprovalRequest } from './protocol'\nimport process from 'node:process'\nimport { createInterface } from 'node:readline'\nimport { projectRootOf } from '../chat/index'\nimport { connectOrSpawnDaemon } from './client'\nimport { defaultSocketPath } from './daemon/lifecycle'\nimport { loadEventsPage } from './protocol'\n\nconst DIM = '\\u001B[2m'\nconst BOLD = '\\u001B[1m'\nconst CYAN = '\\u001B[36m'\nconst YELLOW = '\\u001B[33m'\nconst RED = '\\u001B[31m'\nconst RESET = '\\u001B[0m'\n\nexport interface AttachOptions {\n socketPath?: string\n /** Attach to this session id (prefix match against the list). */\n sessionId?: string\n /** Create a fresh session instead of picking. */\n createNew?: boolean\n cwd?: string\n appVersion?: string\n /** Spawn-on-demand command when no daemon is listening. */\n spawnCommand?: string[]\n /**\n * Attach to a remote zidane-server instead of the local daemon (`zidane\n * attach --host <wss-url> --token <t>`). Nothing is spawned or drained.\n */\n host?: { url: string, token?: string }\n /** Injectable streams for tests. */\n stdin?: NodeJS.ReadableStream\n stdout?: NodeJS.WritableStream\n}\n\ninterface PendingAsk {\n resolve: (line: string) => void\n}\n\nexport async function runAttach(options: AttachOptions = {}): Promise<void> {\n const out = options.stdout ?? process.stdout\n const write = (text: string): void => void out.write(text)\n const cwd = options.cwd ?? process.cwd()\n\n const ensureOptions: EnsureDaemonOptions = {\n socketPath: options.socketPath ?? defaultSocketPath(),\n ...(options.spawnCommand ? { spawnCommand: options.spawnCommand } : {}),\n }\n /*\n * Library-safe failure: `runAttach` is exported from `zidane/ipc`, so a\n * dropped daemon REJECTS (the CLI wrapper owns the exit code) instead\n * of killing an embedder's process from inside the library.\n */\n let failRun: ((error: Error) => void) | null = null\n\n const what = options.host ? 'server' : 'daemon'\n const onClose = (): void => {\n write(`\\n${RED}${what} connection lost${RESET}\\n`)\n failRun?.(new Error(`${what} connection lost`))\n }\n const appVersion = options.appVersion ? { appVersion: options.appVersion } : {}\n // Local: drain-and-respawn on version mismatch, so a stale daemon self-heals\n // instead of hard-failing the window. Remote: a server is never drained.\n const client: IpcClient = options.host\n ? await (await import('./transports/ws-client')).connectWsClient({ url: options.host.url, ...(options.host.token ? { token: options.host.token } : {}), ...appVersion, onClose })\n : await connectOrSpawnDaemon({ ...ensureOptions, ...appVersion, onClose })\n\n write(options.host\n ? `${DIM}connected to zidane server ${client.hello.hostName ?? options.host.url} (v${client.hello.appVersion})${RESET}\\n`\n : `${DIM}connected to zidane daemon (pid ${client.hello.pid}, v${client.hello.appVersion})${RESET}\\n`)\n\n const rl = createInterface({\n input: (options.stdin ?? process.stdin) as NodeJS.ReadableStream,\n output: out as NodeJS.WritableStream,\n prompt: `${BOLD}> ${RESET}`,\n })\n\n // Registered BEFORE the session picker so `ask` works during picking.\n const lines = createLineRouter(rl, write)\n const hitl = createHitlQueue()\n\n const session = await pickSession(client, { ask: lines.ask, write, cwd, ...options })\n if (!session) {\n rl.close()\n client.close()\n return\n }\n\n write(`${BOLD}session${RESET} ${session.id} ${DIM}(${session.title})${RESET}\\n`)\n write(`${DIM}tools run in ${session.cwd}. /interrupt stops a run, /exit detaches (the run keeps going)${RESET}\\n\\n`)\n\n /*\n * Subscribe BEFORE replaying the transcript / snapshotting run state so\n * stream events emitted in that window aren't permanently lost from this\n * client's view. Signals that arrive during replay buffer here and drain\n * once the replay completes.\n */\n const bufferedSignals: HostSignal[] = []\n let signalSink: (signal: HostSignal) => void = s => bufferedSignals.push(s)\n const unsubscribe = client.onSignal(s => signalSink(s))\n\n await replayTranscript(client, session.id, write)\n\n let running = await client.request('chat.isRunning', { sessionId: session.id })\n if (running)\n write(`${DIM}a run is in progress, following it live${RESET}\\n`)\n\n const view = createEventView(write)\n const answerApproval = (request: WireApprovalRequest): Promise<void> => handleApproval(client, lines.ask, write, request)\n const answerInteraction = (request: InteractionRequest): Promise<void> => handleInteraction(client, lines.ask, write, request)\n\n const onSignal = (signal: HostSignal): void => {\n // Converge on resolution: mark the id answered so a queued-but-not-yet-\n // prompted request is skipped instead of blocking on stdin, and record\n // it so late backfill can't re-raise it.\n if (signal.kind === 'approval:resolved' || signal.kind === 'interaction:resolved') {\n hitl.markResolved(signal.requestId)\n return\n }\n\n if (signal.kind === 'approval:request') {\n // Only surface approvals for the attached session — other windows'\n // sessions raise their own prompts in their own windows.\n if (signal.request.sessionId === session.id)\n hitl.enqueue(signal.request.id, () => answerApproval(signal.request))\n return\n }\n\n if ('sessionId' in signal && signal.sessionId !== session.id)\n return\n\n switch (signal.kind) {\n case 'run:start':\n running = true\n view.resetRun()\n break\n case 'run:end':\n running = false\n write(signal.ok ? '\\n' : `\\n${RED}run failed: ${signal.error ?? 'unknown error'}${RESET}\\n`)\n if (!lines.isAsking())\n rl.prompt()\n break\n case 'event':\n view.render(signal.event)\n break\n case 'compacting:start':\n write(`${DIM}compacting…${RESET}\\n`)\n break\n case 'interaction:request':\n hitl.enqueue(signal.request.id, () => answerInteraction(signal.request))\n break\n default:\n break\n }\n }\n\n // Surface HITL state left pending before this window attached. Done\n // BEFORE draining buffered signals so a live `*:request` that arrived\n // during backfill de-dups against the same id (via the HITL queue's ids).\n for (const request of await client.request('approvals.listPending', {})) {\n if (request.sessionId === session.id)\n hitl.enqueue(request.id, () => answerApproval(request))\n }\n for (const pending of await client.request('interactions.list', { sessionId: session.id })) {\n if (pending.live)\n hitl.enqueue(pending.request.id, () => answerInteraction(pending.request))\n }\n\n // Drain signals buffered during replay/backfill, then hand live signals\n // straight to `onSignal`.\n signalSink = onSignal\n for (const buffered of bufferedSignals.splice(0))\n onSignal(buffered)\n\n /* ----------------------------------------------------------------------\n * Input loop\n * -------------------------------------------------------------------- */\n\n const detach = (): void => {\n unsubscribe()\n rl.close()\n client.close()\n write(`\\n${DIM}detached, the session keeps running in the ${what}${RESET}\\n`)\n }\n\n rl.on('SIGINT', () => {\n if (running) {\n // Fire-and-forget: a dead daemon rejects the request, and an\n // uncaught rejection would crash the attach client.\n client.request('chat.interrupt', { sessionId: session.id }).catch(() => undefined)\n write(`\\n${DIM}interrupt sent${RESET}\\n`)\n return\n }\n detach()\n })\n\n await new Promise<void>((resolve, reject) => {\n failRun = (error) => {\n unsubscribe()\n rl.close()\n client.close()\n reject(error)\n }\n rl.on('close', () => resolve())\n\n lines.armSubmit(createLineSubmitter({\n client,\n sessionId: session.id,\n rl,\n write,\n view,\n detach: () => {\n detach()\n resolve()\n },\n }))\n\n if (!running)\n rl.prompt()\n })\n}\n\n/* --------------------------------------------------------------------------\n * Line routing\n * ------------------------------------------------------------------------ */\n\n/**\n * Line routing: normally a line is a prompt for the model, but while an\n * approval / interaction / picker question is pending, the next line\n * answers it instead. One slot suffices — questions are asked serially.\n */\nfunction createLineRouter(rl: Interface, write: (text: string) => void): {\n ask: (prompt: string) => Promise<string>\n isAsking: () => boolean\n /** Arm the input loop; prompt lines typed before it was armed (mid-boot) are submitted first, in order. */\n armSubmit: (submit: (line: string) => void) => void\n} {\n let pendingAsk: PendingAsk | null = null\n let submitLine: ((line: string) => void) | null = null\n /** Prompt lines typed before the input loop is armed (mid-boot) queue up. */\n const earlyLines: string[] = []\n\n rl.on('line', (line) => {\n if (pendingAsk) {\n const slot = pendingAsk\n pendingAsk = null\n slot.resolve(line)\n return\n }\n if (submitLine)\n submitLine(line)\n else\n earlyLines.push(line)\n })\n\n return {\n ask: (prompt) => {\n write(prompt)\n return new Promise<string>((resolve) => {\n pendingAsk = { resolve }\n })\n },\n isAsking: () => pendingAsk !== null,\n armSubmit: (submit) => {\n submitLine = submit\n while (earlyLines.length > 0)\n submit(earlyLines.shift()!)\n },\n }\n}\n\n/** One typed line: a local command, or a prompt pushed to the session. */\nfunction createLineSubmitter({ client, sessionId, rl, write, view, detach }: {\n client: IpcClient\n sessionId: string\n rl: Interface\n write: (text: string) => void\n view: EventView\n /** `/exit`: detach and end the attach. */\n detach: () => void\n}): (line: string) => void {\n return (line) => {\n const text = line.trim()\n if (text.length === 0) {\n rl.prompt()\n return\n }\n if (text === '/exit' || text === '/quit') {\n detach()\n return\n }\n if (text === '/interrupt') {\n client.request('chat.interrupt', { sessionId }).catch(() => undefined)\n return\n }\n\n view.expectOwnEcho(text)\n void client.request('chat.pushQueued', { sessionId, message: text }).then(({ delivered }) => {\n if (delivered === 'steer')\n write(`${DIM}(steered into the live run)${RESET}\\n`)\n }).catch((err) => {\n // Send failed: the host never broadcast the prompt, so release the\n // pending echo suppression to avoid eating a later identical one.\n view.releaseOwnEcho(text)\n write(`${RED}${err instanceof Error ? err.message : String(err)}${RESET}\\n`)\n rl.prompt()\n })\n }\n}\n\n/* --------------------------------------------------------------------------\n * HITL prompts\n * ------------------------------------------------------------------------ */\n\n/**\n * HITL prompts share the single `ask` slot, so approvals / interactions\n * MUST be asked one at a time — the startup rehydrate loops and live\n * signals can otherwise fire several handlers at once, each overwriting the\n * previous resolver and leaving those prompts hung forever (unanswerable\n * from this window). Chain every handler on the previous one so they run\n * strictly sequentially.\n */\nfunction createHitlQueue(): {\n enqueue: (requestId: string, task: () => Promise<void>) => void\n markResolved: (requestId: string) => void\n} {\n let hitlQueue: Promise<void> = Promise.resolve()\n\n /*\n * De-dup + resolution tracking for HITL prompts. A request can arrive\n * both via `*:listPending` backfill AND a live `*:request` signal, and\n * another window can answer it while it's still queued here. We track\n * every id we've queued (so we never prompt twice) and every id the host\n * reported resolved (so a queued-but-not-yet-prompted request is skipped\n * instead of blocking the queue on a no-op stdin answer).\n */\n const queuedHitlIds = new Set<string>()\n const resolvedHitlIds = new Set<string>()\n\n return {\n enqueue: (requestId, task) => {\n if (queuedHitlIds.has(requestId) || resolvedHitlIds.has(requestId))\n return\n queuedHitlIds.add(requestId)\n hitlQueue = hitlQueue.then(async () => {\n // Another window may have answered it while it waited in the queue.\n if (resolvedHitlIds.has(requestId))\n return\n await task()\n }, () => undefined)\n },\n markResolved: (requestId) => {\n resolvedHitlIds.add(requestId)\n },\n }\n}\n\nasync function handleApproval(\n client: IpcClient,\n ask: (prompt: string) => Promise<string>,\n write: (text: string) => void,\n request: WireApprovalRequest,\n): Promise<void> {\n write(`\\n${YELLOW}approval needed${RESET}: ${BOLD}${request.tool}${RESET}\\n`)\n write(`${DIM}${clipLines(JSON.stringify(request.input, null, 2), 12)}${RESET}\\n`)\n const answer = await ask(`${YELLOW}[y]es once / [s]ession / [a]lways (safelist) / [n]o: ${RESET}`)\n const decision\n = answer.trim().toLowerCase() === 'y'\n ? 'accept-once'\n : answer.trim().toLowerCase() === 's'\n ? 'accept-session'\n : answer.trim().toLowerCase() === 'a'\n ? 'accept-safelist'\n : 'deny'\n await client.request('approvals.resolve', { requestId: request.id, decision })\n}\n\nasync function handleInteraction(\n client: IpcClient,\n ask: (prompt: string) => Promise<string>,\n write: (text: string) => void,\n request: InteractionRequest,\n): Promise<void> {\n if (request.kind === 'plan') {\n write(`\\n${YELLOW}plan:${RESET} ${BOLD}${request.payload.title}${RESET}\\n${request.payload.plan}\\n`)\n const answer = await ask(`${YELLOW}[a]pprove / [r]eject / re[v]ise (with comment): ${RESET}`)\n const c = answer.trim().toLowerCase()\n if (c === 'v') {\n const comment = await ask('comment: ')\n await client.request('interactions.respond', {\n requestId: request.id,\n response: { kind: 'plan', decision: 'revise', comment },\n })\n return\n }\n await client.request('interactions.respond', {\n requestId: request.id,\n response: { kind: 'plan', decision: c === 'a' ? 'approve' : 'reject' },\n })\n return\n }\n\n if (request.payload.intro)\n write(`\\n${request.payload.intro}\\n`)\n const answers: Record<string, AnswerValue> = {}\n for (const question of request.payload.questions) {\n if (question.type === 'confirm') {\n const answer = await ask(`${YELLOW}${question.prompt}${RESET} [y/n]: `)\n answers[question.id] = answer.trim().toLowerCase().startsWith('y')\n continue\n }\n if (question.type === 'select') {\n write(`${YELLOW}${question.prompt}${RESET}\\n`)\n question.choices.forEach((choice, i) => write(` ${i + 1}. ${choice.label}\\n`))\n const answer = await ask(question.multi ? 'pick (comma-separated numbers): ' : 'pick a number: ')\n const picks = answer\n .split(',')\n .map(part => question.choices[Number.parseInt(part.trim(), 10) - 1]?.id)\n .filter((id): id is string => typeof id === 'string')\n answers[question.id] = question.multi ? picks : (picks[0] ?? '')\n continue\n }\n answers[question.id] = await ask(`${YELLOW}${question.prompt}${RESET}: `)\n }\n await client.request('interactions.respond', {\n requestId: request.id,\n response: { kind: 'question', answers },\n })\n}\n\n/* --------------------------------------------------------------------------\n * Signal rendering\n * ------------------------------------------------------------------------ */\n\ninterface EventView {\n render: (event: StreamEvent) => void\n /** A run started: the next event opens fresh (no separator carried over). */\n resetRun: () => void\n /** This window just sent `text`; skip its `user-prompt` echo once. */\n expectOwnEcho: (text: string) => void\n /** The send failed, so the echo will never come: stop expecting it. */\n releaseOwnEcho: (text: string) => void\n}\n\nfunction createEventView(write: (text: string) => void): EventView {\n let lastEventKind: StreamEvent['kind'] | null = null\n\n /**\n * The host broadcasts every window's user message as a `user-prompt`\n * event — render it so this window sees prompts posted elsewhere. Our\n * OWN just-sent messages are skipped once each (readline already echoed\n * them). A multiset (text → count) handles rapid identical sends and\n * never suppresses another window's matching message beyond our own\n * outstanding count.\n */\n const ownEchoes = new Map<string, number>()\n\n const render = (event: StreamEvent): void => {\n switch (event.kind) {\n case 'user-prompt': {\n const outstanding = ownEchoes.get(event.text) ?? 0\n if (outstanding > 0) {\n if (outstanding === 1)\n ownEchoes.delete(event.text)\n else\n ownEchoes.set(event.text, outstanding - 1)\n break\n }\n write(`\\n${BOLD}> ${event.text}${RESET}\\n`)\n break\n }\n case 'markdown':\n if (lastEventKind !== 'markdown' && lastEventKind !== null)\n write('\\n')\n write(event.text)\n break\n case 'thinking':\n // Streamed reasoning stays out of the transcript — show a pulse once.\n if (lastEventKind !== 'thinking')\n write(`${DIM}(thinking…)${RESET}\\n`)\n break\n case 'tool':\n write(`\\n${CYAN}▸ ${event.text}${RESET}\\n`)\n break\n case 'tool-result':\n write(`${DIM}${clipLines(event.text, 3)}${RESET}\\n`)\n break\n case 'task-notification':\n case 'info':\n write(`${DIM}${event.text}${RESET}\\n`)\n break\n case 'error':\n write(`${RED}${event.text}${RESET}\\n`)\n break\n default:\n break\n }\n lastEventKind = event.kind\n }\n\n return {\n render,\n resetRun: () => {\n lastEventKind = null\n },\n expectOwnEcho: (text) => {\n ownEchoes.set(text, (ownEchoes.get(text) ?? 0) + 1)\n },\n releaseOwnEcho: (text) => {\n const outstanding = ownEchoes.get(text) ?? 0\n if (outstanding <= 1)\n ownEchoes.delete(text)\n else\n ownEchoes.set(text, outstanding - 1)\n },\n }\n}\n\n/* --------------------------------------------------------------------------\n * Session picking\n * ------------------------------------------------------------------------ */\n\nasync function pickSession(\n client: IpcClient,\n ctx: {\n ask: (prompt: string) => Promise<string>\n write: (text: string) => void\n cwd: string\n sessionId?: string\n createNew?: boolean\n },\n): Promise<SessionRow | null> {\n const projectRoot = projectRootOf(ctx.cwd)\n\n if (ctx.createNew)\n return client.request('sessions.create', { cwd: ctx.cwd })\n\n const rows = await client.request('sessions.list', { projectRoot, archive: 'active' })\n\n if (ctx.sessionId) {\n const match = rows.find(r => r.id === ctx.sessionId || r.id.startsWith(ctx.sessionId!))\n if (match)\n return match\n // Not in this project — try the full list before giving up.\n const all = await client.request('sessions.list', {})\n const global = all.find(r => r.id === ctx.sessionId || r.id.startsWith(ctx.sessionId!))\n if (global)\n return global\n ctx.write(`${RED}no session matching \"${ctx.sessionId}\"${RESET}\\n`)\n return null\n }\n\n if (rows.length === 0)\n return client.request('sessions.create', { cwd: ctx.cwd })\n\n ctx.write(`${BOLD}sessions in ${projectRoot}:${RESET}\\n`)\n rows.slice(0, 15).forEach((row, i) => {\n const status = row.status === 'running' ? ` ${YELLOW}● running${RESET}` : ''\n ctx.write(` ${i + 1}. ${row.title} ${DIM}(${row.id.slice(0, 8)})${RESET}${status}\\n`)\n })\n\n const answer = await ctx.ask('pick a number, or [n]ew: ')\n if (answer.trim().toLowerCase() === 'n')\n return client.request('sessions.create', { cwd: ctx.cwd })\n\n const picked = rows[Number.parseInt(answer.trim(), 10) - 1]\n if (!picked) {\n ctx.write(`${RED}invalid pick${RESET}\\n`)\n return null\n }\n return picked\n}\n\n/* --------------------------------------------------------------------------\n * Transcript replay\n * ------------------------------------------------------------------------ */\n\nconst REPLAY_EVENT_CAP = 60\n\nasync function replayTranscript(\n client: IpcClient,\n sessionId: string,\n write: (text: string) => void,\n): Promise<void> {\n // The last turns only (one bounded reply), not the whole transcript.\n const page = await loadEventsPage((method, params) => client.request(method, params), { sessionId, limit: REPLAY_EVENT_CAP })\n const events = page.events\n if (events.length === 0)\n return\n\n const tail = events.slice(-REPLAY_EVENT_CAP)\n if (events.length > tail.length || (page.cursor ?? 0) > 0)\n write(`${DIM}… earlier events omitted${RESET}\\n`)\n\n for (const event of tail) {\n if (event.kind === 'user-prompt')\n write(`\\n${BOLD}> ${event.text}${RESET}\\n`)\n else if (event.kind === 'markdown')\n write(`${event.text}\\n`)\n else if (event.kind === 'tool')\n write(`${CYAN}▸ ${event.text}${RESET}\\n`)\n }\n write('\\n')\n}\n\nfunction clipLines(text: string, max: number): string {\n const lines = text.split('\\n')\n if (lines.length <= max)\n return text\n return `${lines.slice(0, max).join('\\n')}\\n${DIM}… ${lines.length - max} more lines${RESET}`\n}\n"],"mappings":"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"}
|