zidane 9.1.1 → 9.1.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/dist/{acp-Di9WvMDF.js → acp-Cl4gCZN6.js} +7 -7
- package/dist/{acp-Di9WvMDF.js.map → acp-Cl4gCZN6.js.map} +1 -1
- package/dist/acp-cli.js +5 -5
- package/dist/acp.d.ts +2 -2
- package/dist/acp.js +1 -1
- package/dist/{agent-DJhpTS-B.js → agent-Dh_XZ7fj.js} +74 -19
- package/dist/agent-Dh_XZ7fj.js.map +1 -0
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +1 -1
- package/dist/{auth-store-port-DFgf22oo.js → auth-store-port-DBl2JUC6.js} +2 -2
- package/dist/{auth-store-port-DFgf22oo.js.map → auth-store-port-DBl2JUC6.js.map} +1 -1
- package/dist/{auto-update-restart-BFB7Ek87.js → auto-update-restart-CF_kjcJd.js} +277 -41
- package/dist/auto-update-restart-CF_kjcJd.js.map +1 -0
- package/dist/{browser-BcoCCB_n.js → browser-BkdeKnxO.js} +56 -2
- package/dist/browser-BkdeKnxO.js.map +1 -0
- package/dist/{browser-entry-ypi8CyE-.d.ts → browser-entry-BCwruqNa.d.ts} +10 -10
- package/dist/{browser-entry-ypi8CyE-.d.ts.map → browser-entry-BCwruqNa.d.ts.map} +1 -1
- package/dist/channels.d.ts +5 -5
- package/dist/chat/browser.d.ts +4 -4
- package/dist/chat/browser.js +6 -6
- package/dist/chat/pure.d.ts +5 -5
- package/dist/chat/pure.js +8 -8
- package/dist/chat.d.ts +5 -5
- package/dist/chat.js +55 -55
- package/dist/chat.js.map +1 -1
- package/dist/{cli-shared-CabruH8Z.js → cli-shared-DIV9c5Nr.js} +4 -4
- package/dist/{cli-shared-CabruH8Z.js.map → cli-shared-DIV9c5Nr.js.map} +1 -1
- package/dist/cli-style-DBEm6CyT.js +105 -0
- package/dist/cli-style-DBEm6CyT.js.map +1 -0
- package/dist/{client-core-CIixwznM.d.ts → client-core-C_4m_oL6.d.ts} +4 -4
- package/dist/{client-core-CIixwznM.d.ts.map → client-core-C_4m_oL6.d.ts.map} +1 -1
- package/dist/{client-CCaIXWue.d.ts → client-ygTASGis.d.ts} +2 -2
- package/dist/{client-CCaIXWue.d.ts.map → client-ygTASGis.d.ts.map} +1 -1
- package/dist/codemode-worker.js +8 -5
- package/dist/codemode-worker.js.map +1 -1
- package/dist/codemode.d.ts +16 -0
- package/dist/codemode.d.ts.map +1 -1
- package/dist/codemode.js +2 -2
- package/dist/{connection-loop-QmWL-fJf.d.ts → connection-loop-D_pRONCr.d.ts} +4 -4
- package/dist/{connection-loop-QmWL-fJf.d.ts.map → connection-loop-D_pRONCr.d.ts.map} +1 -1
- package/dist/contexts/daytona.d.ts +3 -3
- package/dist/contexts/docker.d.ts +1 -1
- package/dist/contexts/e2b.d.ts +2 -2
- package/dist/contexts/sandbox.d.ts +1 -1
- package/dist/{contexts-C72b0mMa.js → contexts-DLZTSRHU.js} +17 -106
- package/dist/contexts-DLZTSRHU.js.map +1 -0
- package/dist/contexts.d.ts +4 -4
- package/dist/contexts.js +2 -2
- package/dist/{credentials-wwETW8rI.js → credentials-D71duF64.js} +2 -2
- package/dist/{credentials-wwETW8rI.js.map → credentials-D71duF64.js.map} +1 -1
- package/dist/{cwd-picker-CcekODCt.js → cwd-picker-BsHA6HKv.js} +4 -4
- package/dist/{cwd-picker-CcekODCt.js.map → cwd-picker-BsHA6HKv.js.map} +1 -1
- package/dist/daemon-cli.js +4 -3
- package/dist/daemon-cli.js.map +1 -1
- package/dist/{decisions-CXmK0nz9.js → decisions-hsw5XS2g.js} +3 -1
- package/dist/decisions-hsw5XS2g.js.map +1 -0
- package/dist/{discovery-DycXFxdA.js → discovery-DD4wPWKS.js} +4 -4
- package/dist/{discovery-DycXFxdA.js.map → discovery-DD4wPWKS.js.map} +1 -1
- package/dist/durable/sqlite.d.ts +2 -2
- package/dist/durable.d.ts +1 -1
- package/dist/{engine-VQ86XGdG.js → engine-BDmtgr2O.js} +6 -6
- package/dist/{engine-VQ86XGdG.js.map → engine-BDmtgr2O.js.map} +1 -1
- package/dist/{eval-Bod0I1W_.js → eval-CfGUDAkN.js} +3 -3
- package/dist/{eval-Bod0I1W_.js.map → eval-CfGUDAkN.js.map} +1 -1
- package/dist/eval.d.ts +1 -1
- package/dist/eval.js +1 -1
- package/dist/{executor-C7RQrkEq.js → executor-EWOhLyd9.js} +4 -4
- package/dist/{executor-C7RQrkEq.js.map → executor-EWOhLyd9.js.map} +1 -1
- package/dist/{extension-mark-BqKdEZwF.js → extension-mark-_rhkDWL5.js} +9 -6
- package/dist/extension-mark-_rhkDWL5.js.map +1 -0
- package/dist/extensions/testing.d.ts +1 -1
- package/dist/extensions/testing.js +2 -2
- package/dist/{extensions-BCx4QuGB.js → extensions-DklXPjiq.js} +8 -8
- package/dist/{extensions-BCx4QuGB.js.map → extensions-DklXPjiq.js.map} +1 -1
- package/dist/{extensions-client-D8tEAcMw.d.ts → extensions-client-D4Q2XRKV.d.ts} +31 -5
- package/dist/extensions-client-D4Q2XRKV.d.ts.map +1 -0
- package/dist/extensions.d.ts +1 -1
- package/dist/extensions.js +6 -6
- package/dist/{fold-rules-DvLK8pbf.d.ts → fold-rules-1DpDwG9h.d.ts} +2 -2
- package/dist/{fold-rules-DvLK8pbf.d.ts.map → fold-rules-1DpDwG9h.d.ts.map} +1 -1
- package/dist/{google-Crva32sk.js → google-BtMW9KzL.js} +2 -2
- package/dist/{google-Crva32sk.js.map → google-BtMW9KzL.js.map} +1 -1
- package/dist/{headless-CCm-jLLT.js → headless-CQm19BL0.js} +4 -4
- package/dist/{headless-CCm-jLLT.js.map → headless-CQm19BL0.js.map} +1 -1
- package/dist/headless.d.ts +1 -1
- package/dist/headless.js +1 -1
- package/dist/history-worker.js +1 -1
- package/dist/{host-BHMs9jsN.js → host-DEoEzQal.js} +13 -4
- package/dist/host-DEoEzQal.js.map +1 -0
- package/dist/{host-scoped-settings-CrbcqOkP.js → host-scoped-settings-WBYaCork.js} +2 -2
- package/dist/{host-scoped-settings-CrbcqOkP.js.map → host-scoped-settings-WBYaCork.js.map} +1 -1
- package/dist/{host-signals-Jsjd_-4g.js → host-signals-91zyko_i.js} +5 -5
- package/dist/{host-signals-Jsjd_-4g.js.map → host-signals-91zyko_i.js.map} +1 -1
- package/dist/{host-wO_6GW0y.js → host-uP3t08w8.js} +276 -103
- package/dist/host-uP3t08w8.js.map +1 -0
- package/dist/{host-version-CNAr9pov.js → host-version-_RHlAB29.js} +2 -2
- package/dist/{host-version-CNAr9pov.js.map → host-version-_RHlAB29.js.map} +1 -1
- package/dist/{index-C6nnKu32.d.ts → index-B0PLo9jn.d.ts} +4 -4
- package/dist/{index-C6nnKu32.d.ts.map → index-B0PLo9jn.d.ts.map} +1 -1
- package/dist/{index-Djnc8Peh.d.ts → index-De4x-s76.d.ts} +14 -14
- package/dist/{index-Djnc8Peh.d.ts.map → index-De4x-s76.d.ts.map} +1 -1
- package/dist/{index-CGbOWa7y.d.ts → index-WlE93Q6d.d.ts} +411 -3
- package/dist/index-WlE93Q6d.d.ts.map +1 -0
- package/dist/{index-CCf_WeTQ.d.ts → index-f-XWIoYo.d.ts} +2 -2
- package/dist/{index-CCf_WeTQ.d.ts.map → index-f-XWIoYo.d.ts.map} +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +17 -17
- package/dist/ipc/browser-types.d.ts +304 -7
- package/dist/ipc/browser-types.d.ts.map +1 -1
- package/dist/ipc/browser.d.ts +4 -4
- package/dist/ipc/browser.js +2 -2
- package/dist/ipc/remote.d.ts +6 -6
- package/dist/ipc/remote.js +3 -3
- package/dist/{ipc-BzWhIybr.js → ipc-CatnsVEd.js} +4 -4
- package/dist/{ipc-BzWhIybr.js.map → ipc-CatnsVEd.js.map} +1 -1
- package/dist/ipc.d.ts +10 -10
- package/dist/ipc.js +8 -8
- package/dist/{json-Dj-YATkZ.js → json-BjClr43H.js} +2 -20
- package/dist/json-BjClr43H.js.map +1 -0
- package/dist/{links-CJG_rFvf.js → links-a8C9eby4.js} +9 -9
- package/dist/{links-CJG_rFvf.js.map → links-a8C9eby4.js.map} +1 -1
- package/dist/{loaded-entry-DTURJo_R.js → loaded-entry-D6jzt5HQ.js} +2 -2
- package/dist/{loaded-entry-DTURJo_R.js.map → loaded-entry-D6jzt5HQ.js.map} +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/{media-type-BtA0cbfI.d.ts → media-type-ZSmAGHvg.d.ts} +188 -7
- package/dist/media-type-ZSmAGHvg.d.ts.map +1 -0
- package/dist/{memory-DuVGrzbl.js → memory-CJy52DNi.js} +132 -31
- package/dist/memory-CJy52DNi.js.map +1 -0
- package/dist/model-test-CAtJ76kM.js.map +1 -1
- package/dist/{move-session-kylExJ5H.js → move-session-D7ILECs-.js} +4 -4
- package/dist/{move-session-kylExJ5H.js.map → move-session-D7ILECs-.js.map} +1 -1
- package/dist/{nested-call-record-DlzPeTB7.js → nested-call-record-OayszZBQ.js} +4 -3
- package/dist/nested-call-record-OayszZBQ.js.map +1 -0
- package/dist/output/stream-json.d.ts +1 -1
- package/dist/output/terminal.d.ts +1 -1
- package/dist/{path-display-COVV71Yu.js → path-display-CAWz-sMq.js} +3 -3
- package/dist/{path-display-COVV71Yu.js.map → path-display-CAWz-sMq.js.map} +1 -1
- package/dist/plugins.d.ts +1 -1
- package/dist/{prelude-CVKoUzV8.js → prelude-BwiSR1uA.js} +16 -5
- package/dist/prelude-BwiSR1uA.js.map +1 -0
- package/dist/{presets-CBt6rFfS.js → presets-CMY43nUP.js} +3 -3
- package/dist/{presets-CBt6rFfS.js.map → presets-CMY43nUP.js.map} +1 -1
- package/dist/presets.d.ts +1 -1
- package/dist/presets.js +1 -1
- package/dist/{protocol-CEVqBO-q.d.ts → protocol-C2lqKuMd.d.ts} +50 -7
- package/dist/protocol-C2lqKuMd.d.ts.map +1 -0
- package/dist/protocol-DOGyHgLQ.js.map +1 -1
- package/dist/protocol-NSllElLw.js.map +1 -1
- package/dist/providers/anthropic.d.ts +1 -1
- package/dist/providers/arcee.d.ts +1 -1
- package/dist/providers/baseten.d.ts +1 -1
- package/dist/providers/cerebras.d.ts +1 -1
- package/dist/providers/google.d.ts +1 -1
- package/dist/providers/google.js +1 -1
- package/dist/providers/local.d.ts +1 -1
- package/dist/providers/neuralwatt.d.ts +1 -1
- package/dist/providers/openai-compat.d.ts +1 -1
- package/dist/providers/openai.d.ts +1 -1
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/xai.d.ts +1 -1
- package/dist/{providers-Z0TaBp1O.js → providers-zVRxiJDv.js} +5 -5
- package/dist/providers-zVRxiJDv.js.map +1 -0
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +1 -1
- package/dist/{readonly-db-D7Z-k0pQ.js → readonly-db-DrbT8tX6.js} +2 -2
- package/dist/{readonly-db-D7Z-k0pQ.js.map → readonly-db-DrbT8tX6.js.map} +1 -1
- package/dist/{registry-BKjeBnoy.js → registry-CBoYDIND.js} +2 -2
- package/dist/{registry-BKjeBnoy.js.map → registry-CBoYDIND.js.map} +1 -1
- package/dist/{registry-B6Ww76iW.js → registry-CQOU5jvF.js} +2 -2
- package/dist/{registry-B6Ww76iW.js.map → registry-CQOU5jvF.js.map} +1 -1
- package/dist/{registry-B9INJwJR.js → registry-YUUqbYGr.js} +324 -39
- package/dist/registry-YUUqbYGr.js.map +1 -0
- package/dist/{remote-hosts-BMWoHCWO.js → remote-hosts-CT8Q95dR.js} +4 -4
- package/dist/{remote-hosts-BMWoHCWO.js.map → remote-hosts-CT8Q95dR.js.map} +1 -1
- package/dist/{repo-url-D4Dr8NfZ.js → repo-url-DLjjuVk_.js} +169 -2
- package/dist/repo-url-DLjjuVk_.js.map +1 -0
- package/dist/restate.d.ts +2 -2
- package/dist/{sandbox-BwiPGKF7.d.ts → sandbox-B4OW6oNx.d.ts} +2 -2
- package/dist/{sandbox-BwiPGKF7.d.ts.map → sandbox-B4OW6oNx.d.ts.map} +1 -1
- package/dist/script-progress-CrZ507Qq.js +900 -0
- package/dist/script-progress-CrZ507Qq.js.map +1 -0
- package/dist/session/sqlite.d.ts +1 -1
- package/dist/session.d.ts +1 -1
- package/dist/{setting-BQBSyUq0.js → setting-_jh2OtiL.js} +6 -6
- package/dist/{setting-BQBSyUq0.js.map → setting-_jh2OtiL.js.map} +1 -1
- package/dist/{settings-catalog-4IU2i_jG.js → settings-catalog-DEZlXP51.js} +14 -2
- package/dist/settings-catalog-DEZlXP51.js.map +1 -0
- package/dist/{settings-keys-iI_Y-7MC.js → settings-keys-BT0_oKjO.js} +3 -3
- package/dist/{settings-keys-iI_Y-7MC.js.map → settings-keys-BT0_oKjO.js.map} +1 -1
- package/dist/{skills-CFXRItJ6.js → skills-CEbosUlM.js} +2 -2
- package/dist/{skills-CFXRItJ6.js.map → skills-CEbosUlM.js.map} +1 -1
- package/dist/skills.d.ts +1 -1
- package/dist/skills.js +1 -1
- package/dist/{source-Bl1Z501r.js → source-3ZnEPOSa.js} +3 -2
- package/dist/source-3ZnEPOSa.js.map +1 -0
- package/dist/{sqlite-runtime-BZ2L4RaG.d.ts → sqlite-runtime-CS_LBaAN.d.ts} +2 -2
- package/dist/sqlite-runtime-CS_LBaAN.d.ts.map +1 -0
- package/dist/{src-BY_ND2xn.js → src-BmTXDta8.js} +2 -2
- package/dist/{src-BY_ND2xn.js.map → src-BmTXDta8.js.map} +1 -1
- package/dist/{store-C6gI7FfZ.js → store-ByCDaKgJ.js} +14 -3
- package/dist/store-ByCDaKgJ.js.map +1 -0
- package/dist/{system-freeze-m5o1sGIM.js → system-freeze-DxJ-lRhu.js} +3 -3
- package/dist/{system-freeze-m5o1sGIM.js.map → system-freeze-DxJ-lRhu.js.map} +1 -1
- package/dist/{todo-edits-CbukbjyV.js → todo-edits-Dyj32ds6.js} +4 -3
- package/dist/todo-edits-Dyj32ds6.js.map +1 -0
- package/dist/tools/fetch-url.d.ts +1 -1
- package/dist/tools/web-search.d.ts +1 -1
- package/dist/{tools-CVTGhggj.js → tools-BsrGQ8K4.js} +2 -2
- package/dist/{tools-CVTGhggj.js.map → tools-BsrGQ8K4.js.map} +1 -1
- package/dist/tools.d.ts +1 -1
- package/dist/tools.js +3 -3
- package/dist/{transcript-anchors-CiSi_UBn.js → transcript-anchors-DMjvyUjk.js} +3 -3
- package/dist/{transcript-anchors-CiSi_UBn.js.map → transcript-anchors-DMjvyUjk.js.map} +1 -1
- package/dist/{transcript-reconcile-jbSBjLq2.js → transcript-reconcile-DpQO85wl.js} +3 -3
- package/dist/{transcript-reconcile-jbSBjLq2.js.map → transcript-reconcile-DpQO85wl.js.map} +1 -1
- package/dist/tui.d.ts +9 -9
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +289 -38
- package/dist/tui.js.map +1 -1
- package/dist/{types-bDQagoiL.d.ts → types-2HrgolQz.d.ts} +20 -8
- package/dist/types-2HrgolQz.d.ts.map +1 -0
- package/dist/types-4q1bFG53.js +122 -0
- package/dist/types-4q1bFG53.js.map +1 -0
- package/dist/{types-DnRd9_cA.d.ts → types-SXqk6hLD.d.ts} +3 -3
- package/dist/{types-DnRd9_cA.d.ts.map → types-SXqk6hLD.d.ts.map} +1 -1
- package/dist/types-myxheQkw.js.map +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/{usage-summary-BfcXjiSM.js → usage-summary-BM7B3JdI.js} +2 -2
- package/dist/{usage-summary-BfcXjiSM.js.map → usage-summary-BM7B3JdI.js.map} +1 -1
- package/dist/{version-DqqqvHDP.js → version-DwQI12WA.js} +2 -2
- package/dist/{version-DqqqvHDP.js.map → version-DwQI12WA.js.map} +1 -1
- package/dist/{wait-task-BX4NcOOm.js → wait-task-BiI5UaZQ.js} +13 -3
- package/dist/wait-task-BiI5UaZQ.js.map +1 -0
- package/dist/{wire-CLm2rMK0.js → wire-Dxwxb7QQ.js} +2 -2
- package/dist/{wire-CLm2rMK0.js.map → wire-Dxwxb7QQ.js.map} +1 -1
- package/dist/{write-file-0E6TUJ9A.js → write-file-Dquu7MzB.js} +5 -3
- package/dist/write-file-Dquu7MzB.js.map +1 -0
- package/dist/{ws-DfGGYQ4W.js → ws-CA3o2nie.js} +4 -4
- package/dist/{ws-DfGGYQ4W.js.map → ws-CA3o2nie.js.map} +1 -1
- package/dist/{ws-client-CFMbhsNq.js → ws-client-C0iPAAzc.js} +2 -2
- package/dist/{ws-client-CFMbhsNq.js.map → ws-client-C0iPAAzc.js.map} +1 -1
- package/docs/CHAT.md +55 -0
- package/docs/CODEMODE.md +37 -0
- package/docs/EXTENSIONS.md +8 -6
- package/docs/RELEASE-NOTES-NEXT.md +48 -1
- package/docs/RELEASE.md +9 -1
- package/package.json +2 -3
- package/dist/agent-DJhpTS-B.js.map +0 -1
- package/dist/auto-update-restart-BFB7Ek87.js.map +0 -1
- package/dist/browser-BcoCCB_n.js.map +0 -1
- package/dist/contexts-C72b0mMa.js.map +0 -1
- package/dist/decisions-CXmK0nz9.js.map +0 -1
- package/dist/extension-mark-BqKdEZwF.js.map +0 -1
- package/dist/extensions-client-D8tEAcMw.d.ts.map +0 -1
- package/dist/host-BHMs9jsN.js.map +0 -1
- package/dist/host-wO_6GW0y.js.map +0 -1
- package/dist/index-CGbOWa7y.d.ts.map +0 -1
- package/dist/json-Dj-YATkZ.js.map +0 -1
- package/dist/media-type-BtA0cbfI.d.ts.map +0 -1
- package/dist/memory-DuVGrzbl.js.map +0 -1
- package/dist/nested-call-events-BYk8XvGX.js +0 -182
- package/dist/nested-call-events-BYk8XvGX.js.map +0 -1
- package/dist/nested-call-record-DlzPeTB7.js.map +0 -1
- package/dist/prelude-CVKoUzV8.js.map +0 -1
- package/dist/protocol-CEVqBO-q.d.ts.map +0 -1
- package/dist/providers-Z0TaBp1O.js.map +0 -1
- package/dist/registry-B9INJwJR.js.map +0 -1
- package/dist/repo-url-D4Dr8NfZ.js.map +0 -1
- package/dist/settings-catalog-4IU2i_jG.js.map +0 -1
- package/dist/source-Bl1Z501r.js.map +0 -1
- package/dist/sqlite-runtime-BZ2L4RaG.d.ts.map +0 -1
- package/dist/store-C6gI7FfZ.js.map +0 -1
- package/dist/todo-edits-CbukbjyV.js.map +0 -1
- package/dist/types-DTMEhKJO.js +0 -14
- package/dist/types-DTMEhKJO.js.map +0 -1
- package/dist/types-bDQagoiL.d.ts.map +0 -1
- package/dist/wait-task-BX4NcOOm.js.map +0 -1
- package/dist/write-file-0E6TUJ9A.js.map +0 -1
- package/scripts/eval.ts +0 -179
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipc-BzWhIybr.js","names":[],"sources":["../src/ipc/attach.ts","../src/ipc/remote-oauth.ts","../src/ipc/workspace-exec-stream.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 OpenTUI front-end talks to the host through\n * `connectIpcClient` too.\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/project-root'\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\n/** Options for {@link runAttach}. */\nexport interface AttachOptions {\n /**\n * Path of the daemon socket.\n * @default defaultSocketPath()\n */\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 /**\n * Working directory of a new session. Its project decides which sessions the picker lists.\n * @default process.cwd()\n */\n cwd?: string\n /** Client version, surfaced in the host's diagnostics. */\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 /**\n * Stream the output is written to.\n * @default process.stdout\n */\n stdout?: NodeJS.WritableStream\n}\n\ninterface PendingAsk {\n resolve: (line: string) => void\n}\n\n/**\n * Runs the `zidane attach` terminal client: picks or creates a session on the daemon (or a remote server), replays its transcript, and relays input and live signals until the user detaches.\n * Rejects when the connection to the daemon or server drops. It does not exit the process.\n * @param options - Connection target, session choice and streams.\n * @returns A promise that resolves when the user detaches.\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","/**\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\n/** What to sign in to: a provider by key, or an MCP server by name. */\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\n/** Hooks a window supplies to {@link runRemoteOAuth}: open the browser, take pasted input, answer the provider's questions, and abort. */\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 /** Aborts the sign-in. The run rejects with \"OAuth login aborted\". */\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\n/**\n * Runs the client half of a remote OAuth sign-in against a host.\n * Starts the flow on the host, opens the URL through the UI, forwards the code from the loopback listener or from `paste`, and resolves with the host's outcome, which never carries a token. Rejects when aborted or when the UI cannot answer a question the provider asks.\n * @param client - Client used for the `auth.oauth.*` requests.\n * @param target - Provider or MCP server to sign in to.\n * @param ui - Browser, prompt and abort hooks.\n * @returns The sign-in outcome: the provider status or the MCP server name.\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 // The host pinned another redirect (an MCP server's pre-registered\n // client, `oauth.callbackPort`): listen there instead.\n if (loopback && begin.redirectUri && begin.redirectUri !== loopback.redirectUri) {\n loopback.promise.catch(() => undefined) // closing rejects it; nothing waits on it\n await loopback.close()\n loopback = undefined\n }\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\n/** Outcome of {@link runWorkspaceExecStream}, shaped like a local `!` run. */\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 /** Wall-clock time of the run in milliseconds. */\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\n/** Options for {@link runWorkspaceExecStream}. */\nexport interface WorkspaceExecStreamOptions {\n /** Cancels the command on the host when aborted. */\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\n/**\n * Runs a command in a session's workspace on a host and streams its output.\n * The result has the shape of a local `!` run. A host without `sessions.workspaceExecStream` gets the buffered `sessions.workspaceExec` instead, and then an abort stops the wait, not the command.\n * @param client - Client used for requests and signals.\n * @param params - Session, command and optional working directory.\n * @param options - Abort signal, chunk callback and timeouts.\n * @returns The output, exit code and flags describing how it ended.\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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"}
|
|
1
|
+
{"version":3,"file":"ipc-CatnsVEd.js","names":[],"sources":["../src/ipc/attach.ts","../src/ipc/remote-oauth.ts","../src/ipc/workspace-exec-stream.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 OpenTUI front-end talks to the host through\n * `connectIpcClient` too.\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/project-root'\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\n/** Options for {@link runAttach}. */\nexport interface AttachOptions {\n /**\n * Path of the daemon socket.\n * @default defaultSocketPath()\n */\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 /**\n * Working directory of a new session. Its project decides which sessions the picker lists.\n * @default process.cwd()\n */\n cwd?: string\n /** Client version, surfaced in the host's diagnostics. */\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 /**\n * Stream the output is written to.\n * @default process.stdout\n */\n stdout?: NodeJS.WritableStream\n}\n\ninterface PendingAsk {\n resolve: (line: string) => void\n}\n\n/**\n * Runs the `zidane attach` terminal client: picks or creates a session on the daemon (or a remote server), replays its transcript, and relays input and live signals until the user detaches.\n * Rejects when the connection to the daemon or server drops. It does not exit the process.\n * @param options - Connection target, session choice and streams.\n * @returns A promise that resolves when the user detaches.\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","/**\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\n/** What to sign in to: a provider by key, or an MCP server by name. */\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\n/** Hooks a window supplies to {@link runRemoteOAuth}: open the browser, take pasted input, answer the provider's questions, and abort. */\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 /** Aborts the sign-in. The run rejects with \"OAuth login aborted\". */\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\n/**\n * Runs the client half of a remote OAuth sign-in against a host.\n * Starts the flow on the host, opens the URL through the UI, forwards the code from the loopback listener or from `paste`, and resolves with the host's outcome, which never carries a token. Rejects when aborted or when the UI cannot answer a question the provider asks.\n * @param client - Client used for the `auth.oauth.*` requests.\n * @param target - Provider or MCP server to sign in to.\n * @param ui - Browser, prompt and abort hooks.\n * @returns The sign-in outcome: the provider status or the MCP server name.\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 // The host pinned another redirect (an MCP server's pre-registered\n // client, `oauth.callbackPort`): listen there instead.\n if (loopback && begin.redirectUri && begin.redirectUri !== loopback.redirectUri) {\n loopback.promise.catch(() => undefined) // closing rejects it; nothing waits on it\n await loopback.close()\n loopback = undefined\n }\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\n/** Outcome of {@link runWorkspaceExecStream}, shaped like a local `!` run. */\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 /** Wall-clock time of the run in milliseconds. */\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\n/** Options for {@link runWorkspaceExecStream}. */\nexport interface WorkspaceExecStreamOptions {\n /** Cancels the command on the host when aborted. */\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\n/**\n * Runs a command in a session's workspace on a host and streams its output.\n * The result has the shape of a local `!` run. A host without `sessions.workspaceExecStream` gets the buffered `sessions.workspaceExec` instead, and then an abort stops the wait, not the command.\n * @param client - Client used for requests and signals.\n * @param params - Session, command and optional working directory.\n * @param options - Abort signal, chunk callback and timeouts.\n * @returns The output, exit code and flags describing how it ended.\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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"}
|
package/dist/ipc.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Px as resolveStorageDirs, jx as StorageDirs } from "./index-
|
|
2
|
-
import { $o as createMemoryApprovalsStore, Ca as CompactionEntry, Ea as ChatHost, Go as createInteractionHub, Jo as EditOutcomeLedger,
|
|
3
|
-
import { rs as createChatHost } from "./browser-entry-
|
|
4
|
-
import { $ as scopeAllows, A as LOAD_EVENTS_PAGE_TURNS, B as SessionResumeResult, C as IPC_PROTOCOL_VERSION, D as IpcParams, E as IpcMethods, F as SESSION_TURNS_PAGE, G as loadAllEvents, H as SignalMeta, I as SIGNAL_SEQ_FIELD, J as CLIENT_SCOPES, K as loadEventsPage, L as SequencedSignal, M as ModelFallbackRef, N as REDACTED, O as IpcResult, P as SESSION_TURNS_MAX_PAGE, Q as methodScope, R as SessionDocumentHead, S as IPC_MIN_PROTOCOL_VERSION, T as IpcMethodName, U as extensionInstallErrorData, V as SessionRow, W as hostRefOf, X as METHOD_SCOPES, Y as ClientScope, Z as isClientScope, _ as HostOAuthBegin, a as FsRoots, b as HostProviderAuth, c as HostAuthMethod, d as HostCatalogMcp, f as HostCatalogPlugin, g as HostModelProvider, h as HostModelInfo, i as FsDirListing, j as LoadEventsPaging, k as LOAD_EVENTS_MAX_PAGE_TURNS, l as HostCatalogError, m as HostKind, n as ExtensionInstallErrorData, o as HelloParams, p as HostCatalogSkill, q as loadSessionDocument, r as FsDirEntry, s as HelloResult, t as CreateSessionParams, u as HostCatalogExtension, v as HostOAuthComplete, w as IpcErrorCode, x as HostRef, y as HostOAuthStep, z as SessionEventsPage } from "./protocol-
|
|
5
|
-
import { a as IPC_BUILD_ID, c as ensureDaemonRunning, i as EnsureDaemonOptions, l as probeSocket, n as connectIpcClient, o as daemonSocketName, r as connectOrSpawnDaemon, s as defaultSocketPath, t as IpcClientOptions, u as selfDaemonSpawnCommand } from "./client-
|
|
6
|
-
import { d as extractEditPayloadForGate, f as readFileSafe, m as serializePreview, p as resolveCwdPath } from "./index-
|
|
7
|
-
import { n as IpcVersionMismatchError, t as IpcClient } from "./client-core-
|
|
8
|
-
import { i as createExtensionsClient, r as ExtensionsUiServer, t as ExtensionsClient } from "./extensions-client-
|
|
9
|
-
import { $ as MachineLinksHandlerOptions, A as WorkerRequestError, B as IpcDaemon, C as createTranscriptHistoryWorker, D as WorkerRpcHandler, E as WorkerRpcContext, F as watchFileChanges, G as transcriptPage, H as startIpcDaemon, I as fixPath, J as ReplayRead, K as turnCutPoints, L as mergePath, M as WorkerRpcClientOptions, N as WorkerUnavailableError, O as serveWorkerRpc, P as createWorkerRpcClient, Q as createMachineHandlers, R as shellPath, S as createHostTranscriptPager, T as WorkerPortLike, U as WHOLE_RUN_PAGES, V as IpcDaemonOptions, W as exchangeBoundaries, X as TranscriptReplayCache, Y as TranscriptReplay, Z as createTranscriptReplayCache, _ as HISTORY_WORKER_KILL_SWITCH, a as RemoteOAuthTarget, at as HostEnvironmentOptions, b as HostTranscriptPager, c as InProcessClientOptions, ct as createFileApprovalsStore, d as startInProcessHost, dt as AttachOptions, et as createMachineLinkHandlers, f as TranscriptRead, ft as runAttach, g as readTurnsAt, h as readTranscript, i as RemoteOAuthStart, it as DaemonEnvironment, j as WorkerRpcClient, k as WorkerLike, l as InProcessHost, lt as createHostEnvironment, m as createTranscriptReader, n as WorkspaceExecStreamResult, nt as createHostImagePort, o as RemoteOAuthUi, ot as SharedHostSetup, p as TranscriptReader, q as ReplayData, r as runWorkspaceExecStream, rt as decisionsPort, s as runRemoteOAuth, st as createDaemonEnvironment, t as WorkspaceExecStreamOptions, tt as HostImagePortDeps, u as InProcessHostOptions, ut as DaemonExtensionsHost, v as HistoryWorkerInit, w as historyWorkerUrl, x as TranscriptHistoryWorker, y as HistoryWorkerRequest, z as shellPathAsync } from "./index-
|
|
10
|
-
export { type ApprovalHub, type ApprovalOriginator, type ApprovalRequestInput, type AttachOptions, CLIENT_SCOPES, type ChatHost, type ChatHostEnvironment, type ClientScope, type CompactionEntry, type CreateSessionParams, type DaemonEnvironment, type DaemonExtensionsHost, EditOutcomeLedger, type EnsureDaemonOptions, type ExtensionInstallErrorData, type ExtensionsClient, type ExtensionsUiServer, type FsDirEntry, type FsDirListing, type FsRoots, HISTORY_WORKER_KILL_SWITCH, type HelloParams, type HelloResult, type HistoryWorkerInit, type HistoryWorkerRequest, type HostAuthMethod, type HostCatalogError, type HostCatalogExtension, type HostCatalogMcp, type HostCatalogPlugin, type HostCatalogSkill, type HostEnvironmentOptions, type HostImagePortDeps, type HostKind, type HostModelInfo, type HostModelProvider, type HostOAuthBegin, type HostOAuthComplete, type HostOAuthStep, type HostProviderAuth, type HostRef, type HostSettings, type HostSignal, type HostTranscriptPager, IPC_BUILD_ID, IPC_MIN_PROTOCOL_VERSION, IPC_PROTOCOL_VERSION, type InProcessClientOptions, type InProcessHost, type InProcessHostOptions, type InteractionHub, type IpcClient, type IpcClientOptions, type IpcDaemon, type IpcDaemonOptions, IpcErrorCode, type IpcMethodName, type IpcMethods, type IpcParams, type IpcResult, IpcVersionMismatchError, LOAD_EVENTS_MAX_PAGE_TURNS, LOAD_EVENTS_PAGE_TURNS, type LoadEventsPaging, MACHINE_PROTOCOL_VERSION, METHOD_SCOPES, MachineErrorCode, type MachineInfo, type MachineLinksHandlerOptions, type MachineRoot, type MachineStatusChange, type ModelFallbackRef, type PendingAnnotation, type PendingApprovalsStore, type PendingInteraction, type PromptAttachment, type QueuedItem, REDACTED, type RemoteOAuthStart, type RemoteOAuthTarget, type RemoteOAuthUi, type ReplayData, type ReplayRead, type RunningWorkItem, SESSION_TURNS_MAX_PAGE, SESSION_TURNS_PAGE, SIGNAL_SEQ_FIELD, type SendOptions, type SequencedSignal, type SerializedPreview, type SessionDocumentHead, type SessionEventsPage, type SessionPresence, type SessionResumeResult, type SessionRow, type SharedHostSetup, type SignalMeta, type StorageDirs, type TodosSnapshot, type TranscriptHistoryWorker, type TranscriptRead, type TranscriptReader, type TranscriptReplay, type TranscriptReplayCache, WHOLE_RUN_PAGES, type WireApprovalRequest, type WorkerLike, type WorkerPortLike, WorkerRequestError, type WorkerRpcClient, type WorkerRpcClientOptions, type WorkerRpcContext, type WorkerRpcHandler, WorkerUnavailableError, type WorkspaceExecStreamOptions, type WorkspaceExecStreamResult, connectIpcClient, connectOrSpawnDaemon, createApprovalHub, createChatHost, createDaemonEnvironment, createExtensionsClient, createFileApprovalsStore, createHostEnvironment, createHostImagePort, createHostTranscriptPager, createInteractionHub, createMachineHandlers, createMachineLinkHandlers, createMemoryApprovalsStore, createTranscriptHistoryWorker, createTranscriptReader, createTranscriptReplayCache, createWorkerRpcClient, daemonSocketName, decisionsPort, defaultSocketPath, ensureDaemonRunning, exchangeBoundaries, extensionInstallErrorData, extractEditPayloadForGate, fixPath, historyWorkerUrl, hostRefOf, isClientScope, loadAllEvents, loadEventsPage, loadSessionDocument, mergePath, methodScope, probeSocket, readFileSafe, readTranscript, readTurnsAt, resolveCwdPath, resolveStorageDirs, runAttach, runCompaction, runRemoteOAuth, runWorkspaceExecStream, scopeAllows, selfDaemonSpawnCommand, serializePreview, serveWorkerRpc, shellPath, shellPathAsync, startInProcessHost, startIpcDaemon, transcriptPage, turnCutPoints, watchFileChanges };
|
|
1
|
+
import { Px as resolveStorageDirs, jx as StorageDirs } from "./index-WlE93Q6d.js";
|
|
2
|
+
import { $o as createMemoryApprovalsStore, Ca as CompactionEntry, Ea as ChatHost, Go as createInteractionHub, Jo as EditOutcomeLedger, Qo as createApprovalHub, Sl as MachineStatusChange, Ta as runCompaction, Wo as InteractionHub, Xo as ApprovalHub, Yo as PendingAnnotation, Zo as ApprovalRequestInput, _s as TodosSnapshot, bl as MachineRoot, cs as PendingInteraction, ds as QueuedItem, es as ChatHostEnvironment, fs as RunningWorkItem, gl as MachineInfo, hl as MachineErrorCode, hs as SessionPresence, ls as PromptAttachment, ml as MACHINE_PROTOCOL_VERSION, ms as SerializedPreview, ns as ApprovalOriginator, os as HostSettings, ps as SendOptions, ss as HostSignal, ts as PendingApprovalsStore, vs as WireApprovalRequest } from "./media-type-ZSmAGHvg.js";
|
|
3
|
+
import { rs as createChatHost } from "./browser-entry-BCwruqNa.js";
|
|
4
|
+
import { $ as scopeAllows, A as LOAD_EVENTS_PAGE_TURNS, B as SessionResumeResult, C as IPC_PROTOCOL_VERSION, D as IpcParams, E as IpcMethods, F as SESSION_TURNS_PAGE, G as loadAllEvents, H as SignalMeta, I as SIGNAL_SEQ_FIELD, J as CLIENT_SCOPES, K as loadEventsPage, L as SequencedSignal, M as ModelFallbackRef, N as REDACTED, O as IpcResult, P as SESSION_TURNS_MAX_PAGE, Q as methodScope, R as SessionDocumentHead, S as IPC_MIN_PROTOCOL_VERSION, T as IpcMethodName, U as extensionInstallErrorData, V as SessionRow, W as hostRefOf, X as METHOD_SCOPES, Y as ClientScope, Z as isClientScope, _ as HostOAuthBegin, a as FsRoots, b as HostProviderAuth, c as HostAuthMethod, d as HostCatalogMcp, f as HostCatalogPlugin, g as HostModelProvider, h as HostModelInfo, i as FsDirListing, j as LoadEventsPaging, k as LOAD_EVENTS_MAX_PAGE_TURNS, l as HostCatalogError, m as HostKind, n as ExtensionInstallErrorData, o as HelloParams, p as HostCatalogSkill, q as loadSessionDocument, r as FsDirEntry, s as HelloResult, t as CreateSessionParams, u as HostCatalogExtension, v as HostOAuthComplete, w as IpcErrorCode, x as HostRef, y as HostOAuthStep, z as SessionEventsPage } from "./protocol-C2lqKuMd.js";
|
|
5
|
+
import { a as IPC_BUILD_ID, c as ensureDaemonRunning, i as EnsureDaemonOptions, l as probeSocket, n as connectIpcClient, o as daemonSocketName, r as connectOrSpawnDaemon, s as defaultSocketPath, t as IpcClientOptions, u as selfDaemonSpawnCommand } from "./client-ygTASGis.js";
|
|
6
|
+
import { d as extractEditPayloadForGate, f as readFileSafe, m as serializePreview, p as resolveCwdPath } from "./index-B0PLo9jn.js";
|
|
7
|
+
import { n as IpcVersionMismatchError, t as IpcClient } from "./client-core-C_4m_oL6.js";
|
|
8
|
+
import { a as BlockRunClient, i as createExtensionsClient, o as BlockRunOnHostOptions, r as ExtensionsUiServer, s as runBlockOnHost, t as ExtensionsClient } from "./extensions-client-D4Q2XRKV.js";
|
|
9
|
+
import { $ as MachineLinksHandlerOptions, A as WorkerRequestError, B as IpcDaemon, C as createTranscriptHistoryWorker, D as WorkerRpcHandler, E as WorkerRpcContext, F as watchFileChanges, G as transcriptPage, H as startIpcDaemon, I as fixPath, J as ReplayRead, K as turnCutPoints, L as mergePath, M as WorkerRpcClientOptions, N as WorkerUnavailableError, O as serveWorkerRpc, P as createWorkerRpcClient, Q as createMachineHandlers, R as shellPath, S as createHostTranscriptPager, T as WorkerPortLike, U as WHOLE_RUN_PAGES, V as IpcDaemonOptions, W as exchangeBoundaries, X as TranscriptReplayCache, Y as TranscriptReplay, Z as createTranscriptReplayCache, _ as HISTORY_WORKER_KILL_SWITCH, a as RemoteOAuthTarget, at as HostEnvironmentOptions, b as HostTranscriptPager, c as InProcessClientOptions, ct as createFileApprovalsStore, d as startInProcessHost, dt as AttachOptions, et as createMachineLinkHandlers, f as TranscriptRead, ft as runAttach, g as readTurnsAt, h as readTranscript, i as RemoteOAuthStart, it as DaemonEnvironment, j as WorkerRpcClient, k as WorkerLike, l as InProcessHost, lt as createHostEnvironment, m as createTranscriptReader, n as WorkspaceExecStreamResult, nt as createHostImagePort, o as RemoteOAuthUi, ot as SharedHostSetup, p as TranscriptReader, q as ReplayData, r as runWorkspaceExecStream, rt as decisionsPort, s as runRemoteOAuth, st as createDaemonEnvironment, t as WorkspaceExecStreamOptions, tt as HostImagePortDeps, u as InProcessHostOptions, ut as DaemonExtensionsHost, v as HistoryWorkerInit, w as historyWorkerUrl, x as TranscriptHistoryWorker, y as HistoryWorkerRequest, z as shellPathAsync } from "./index-De4x-s76.js";
|
|
10
|
+
export { type ApprovalHub, type ApprovalOriginator, type ApprovalRequestInput, type AttachOptions, type BlockRunClient, type BlockRunOnHostOptions, CLIENT_SCOPES, type ChatHost, type ChatHostEnvironment, type ClientScope, type CompactionEntry, type CreateSessionParams, type DaemonEnvironment, type DaemonExtensionsHost, EditOutcomeLedger, type EnsureDaemonOptions, type ExtensionInstallErrorData, type ExtensionsClient, type ExtensionsUiServer, type FsDirEntry, type FsDirListing, type FsRoots, HISTORY_WORKER_KILL_SWITCH, type HelloParams, type HelloResult, type HistoryWorkerInit, type HistoryWorkerRequest, type HostAuthMethod, type HostCatalogError, type HostCatalogExtension, type HostCatalogMcp, type HostCatalogPlugin, type HostCatalogSkill, type HostEnvironmentOptions, type HostImagePortDeps, type HostKind, type HostModelInfo, type HostModelProvider, type HostOAuthBegin, type HostOAuthComplete, type HostOAuthStep, type HostProviderAuth, type HostRef, type HostSettings, type HostSignal, type HostTranscriptPager, IPC_BUILD_ID, IPC_MIN_PROTOCOL_VERSION, IPC_PROTOCOL_VERSION, type InProcessClientOptions, type InProcessHost, type InProcessHostOptions, type InteractionHub, type IpcClient, type IpcClientOptions, type IpcDaemon, type IpcDaemonOptions, IpcErrorCode, type IpcMethodName, type IpcMethods, type IpcParams, type IpcResult, IpcVersionMismatchError, LOAD_EVENTS_MAX_PAGE_TURNS, LOAD_EVENTS_PAGE_TURNS, type LoadEventsPaging, MACHINE_PROTOCOL_VERSION, METHOD_SCOPES, MachineErrorCode, type MachineInfo, type MachineLinksHandlerOptions, type MachineRoot, type MachineStatusChange, type ModelFallbackRef, type PendingAnnotation, type PendingApprovalsStore, type PendingInteraction, type PromptAttachment, type QueuedItem, REDACTED, type RemoteOAuthStart, type RemoteOAuthTarget, type RemoteOAuthUi, type ReplayData, type ReplayRead, type RunningWorkItem, SESSION_TURNS_MAX_PAGE, SESSION_TURNS_PAGE, SIGNAL_SEQ_FIELD, type SendOptions, type SequencedSignal, type SerializedPreview, type SessionDocumentHead, type SessionEventsPage, type SessionPresence, type SessionResumeResult, type SessionRow, type SharedHostSetup, type SignalMeta, type StorageDirs, type TodosSnapshot, type TranscriptHistoryWorker, type TranscriptRead, type TranscriptReader, type TranscriptReplay, type TranscriptReplayCache, WHOLE_RUN_PAGES, type WireApprovalRequest, type WorkerLike, type WorkerPortLike, WorkerRequestError, type WorkerRpcClient, type WorkerRpcClientOptions, type WorkerRpcContext, type WorkerRpcHandler, WorkerUnavailableError, type WorkspaceExecStreamOptions, type WorkspaceExecStreamResult, connectIpcClient, connectOrSpawnDaemon, createApprovalHub, createChatHost, createDaemonEnvironment, createExtensionsClient, createFileApprovalsStore, createHostEnvironment, createHostImagePort, createHostTranscriptPager, createInteractionHub, createMachineHandlers, createMachineLinkHandlers, createMemoryApprovalsStore, createTranscriptHistoryWorker, createTranscriptReader, createTranscriptReplayCache, createWorkerRpcClient, daemonSocketName, decisionsPort, defaultSocketPath, ensureDaemonRunning, exchangeBoundaries, extensionInstallErrorData, extractEditPayloadForGate, fixPath, historyWorkerUrl, hostRefOf, isClientScope, loadAllEvents, loadEventsPage, loadSessionDocument, mergePath, methodScope, probeSocket, readFileSafe, readTranscript, readTurnsAt, resolveCwdPath, resolveStorageDirs, runAttach, runBlockOnHost, runCompaction, runRemoteOAuth, runWorkspaceExecStream, scopeAllows, selfDaemonSpawnCommand, serializePreview, serveWorkerRpc, shellPath, shellPathAsync, startInProcessHost, startIpcDaemon, transcriptPage, turnCutPoints, watchFileChanges };
|
package/dist/ipc.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { A as connectOrSpawnDaemon, D as watchFileChanges, T as decisionsPort, _ as createMachineLinkHandlers, a as shellPath, b as createHostEnvironment, d as createTranscriptHistoryWorker, f as historyWorkerUrl, g as createMachineHandlers, h as createWorkerRpcClient, i as mergePath, k as connectIpcClient, l as HISTORY_WORKER_KILL_SWITCH, m as WorkerUnavailableError, n as startInProcessHost, o as shellPathAsync, p as WorkerRequestError, r as fixPath, s as startIpcDaemon, u as createHostTranscriptPager, v as createDaemonEnvironment, w as createHostImagePort, y as createFileApprovalsStore } from "./memory-
|
|
1
|
+
import { A as connectOrSpawnDaemon, D as watchFileChanges, T as decisionsPort, _ as createMachineLinkHandlers, a as shellPath, b as createHostEnvironment, d as createTranscriptHistoryWorker, f as historyWorkerUrl, g as createMachineHandlers, h as createWorkerRpcClient, i as mergePath, k as connectIpcClient, l as HISTORY_WORKER_KILL_SWITCH, m as WorkerUnavailableError, n as startInProcessHost, o as shellPathAsync, p as WorkerRequestError, r as fixPath, s as startIpcDaemon, u as createHostTranscriptPager, v as createDaemonEnvironment, w as createHostImagePort, y as createFileApprovalsStore } from "./memory-CJy52DNi.js";
|
|
2
2
|
import { t as resolveStorageDirs } from "./xdg-DFSAQQG8.js";
|
|
3
|
-
import { Jn as resolveCwdPath, Kn as extractEditPayloadForGate, Yn as serializePreview, br as createMemoryApprovalsStore, nn as createChatHost, qn as readFileSafe, rn as createInteractionHub, vr as runCompaction, yr as createApprovalHub } from "./auto-update-restart-
|
|
4
|
-
import {
|
|
3
|
+
import { Jn as resolveCwdPath, Kn as extractEditPayloadForGate, Yn as serializePreview, br as createMemoryApprovalsStore, nn as createChatHost, qn as readFileSafe, rn as createInteractionHub, vr as runCompaction, yr as createApprovalHub } from "./auto-update-restart-CF_kjcJd.js";
|
|
4
|
+
import { ct as MACHINE_PROTOCOL_VERSION, ut as MachineErrorCode } from "./repo-url-DLjjuVk_.js";
|
|
5
5
|
import { M as EditOutcomeLedger } from "./model-test-CAtJ76kM.js";
|
|
6
|
-
import { c as daemonSocketName, f as probeSocket, i as IpcVersionMismatchError, l as defaultSocketPath, p as selfDaemonSpawnCommand, s as IPC_BUILD_ID, u as ensureDaemonRunning } from "./settings-keys-
|
|
6
|
+
import { c as daemonSocketName, f as probeSocket, i as IpcVersionMismatchError, l as defaultSocketPath, p as selfDaemonSpawnCommand, s as IPC_BUILD_ID, u as ensureDaemonRunning } from "./settings-keys-BT0_oKjO.js";
|
|
7
7
|
import { a as LOAD_EVENTS_PAGE_TURNS, c as SESSION_TURNS_MAX_PAGE, d as extensionInstallErrorData, f as hostRefOf, g as loadSessionDocument, i as LOAD_EVENTS_MAX_PAGE_TURNS, l as SESSION_TURNS_PAGE, m as loadEventsPage, n as IPC_PROTOCOL_VERSION, p as loadAllEvents, r as IpcErrorCode, s as REDACTED, t as IPC_MIN_PROTOCOL_VERSION, u as SIGNAL_SEQ_FIELD } from "./protocol-DOGyHgLQ.js";
|
|
8
|
-
import { n as runRemoteOAuth, r as runAttach, t as runWorkspaceExecStream } from "./ipc-
|
|
9
|
-
import { _ as methodScope, g as isClientScope, h as METHOD_SCOPES, m as CLIENT_SCOPES, u as createExtensionsClient, v as scopeAllows } from "./browser-
|
|
10
|
-
import { a as exchangeBoundaries, c as turnCutPoints, i as WHOLE_RUN_PAGES, r as createTranscriptReplayCache, s as transcriptPage } from "./readonly-db-
|
|
8
|
+
import { n as runRemoteOAuth, r as runAttach, t as runWorkspaceExecStream } from "./ipc-CatnsVEd.js";
|
|
9
|
+
import { _ as methodScope, g as isClientScope, h as METHOD_SCOPES, m as CLIENT_SCOPES, u as createExtensionsClient, v as scopeAllows, x as runBlockOnHost } from "./browser-BkdeKnxO.js";
|
|
10
|
+
import { a as exchangeBoundaries, c as turnCutPoints, i as WHOLE_RUN_PAGES, r as createTranscriptReplayCache, s as transcriptPage } from "./readonly-db-DrbT8tX6.js";
|
|
11
11
|
import { i as serveWorkerRpc, n as readTranscript, r as readTurnsAt, t as createTranscriptReader } from "./transcript-reader-DGrC9E6f.js";
|
|
12
|
-
export { CLIENT_SCOPES, EditOutcomeLedger, HISTORY_WORKER_KILL_SWITCH, IPC_BUILD_ID, IPC_MIN_PROTOCOL_VERSION, IPC_PROTOCOL_VERSION, IpcErrorCode, IpcVersionMismatchError, LOAD_EVENTS_MAX_PAGE_TURNS, LOAD_EVENTS_PAGE_TURNS, MACHINE_PROTOCOL_VERSION, METHOD_SCOPES, MachineErrorCode, REDACTED, SESSION_TURNS_MAX_PAGE, SESSION_TURNS_PAGE, SIGNAL_SEQ_FIELD, WHOLE_RUN_PAGES, WorkerRequestError, WorkerUnavailableError, connectIpcClient, connectOrSpawnDaemon, createApprovalHub, createChatHost, createDaemonEnvironment, createExtensionsClient, createFileApprovalsStore, createHostEnvironment, createHostImagePort, createHostTranscriptPager, createInteractionHub, createMachineHandlers, createMachineLinkHandlers, createMemoryApprovalsStore, createTranscriptHistoryWorker, createTranscriptReader, createTranscriptReplayCache, createWorkerRpcClient, daemonSocketName, decisionsPort, defaultSocketPath, ensureDaemonRunning, exchangeBoundaries, extensionInstallErrorData, extractEditPayloadForGate, fixPath, historyWorkerUrl, hostRefOf, isClientScope, loadAllEvents, loadEventsPage, loadSessionDocument, mergePath, methodScope, probeSocket, readFileSafe, readTranscript, readTurnsAt, resolveCwdPath, resolveStorageDirs, runAttach, runCompaction, runRemoteOAuth, runWorkspaceExecStream, scopeAllows, selfDaemonSpawnCommand, serializePreview, serveWorkerRpc, shellPath, shellPathAsync, startInProcessHost, startIpcDaemon, transcriptPage, turnCutPoints, watchFileChanges };
|
|
12
|
+
export { CLIENT_SCOPES, EditOutcomeLedger, HISTORY_WORKER_KILL_SWITCH, IPC_BUILD_ID, IPC_MIN_PROTOCOL_VERSION, IPC_PROTOCOL_VERSION, IpcErrorCode, IpcVersionMismatchError, LOAD_EVENTS_MAX_PAGE_TURNS, LOAD_EVENTS_PAGE_TURNS, MACHINE_PROTOCOL_VERSION, METHOD_SCOPES, MachineErrorCode, REDACTED, SESSION_TURNS_MAX_PAGE, SESSION_TURNS_PAGE, SIGNAL_SEQ_FIELD, WHOLE_RUN_PAGES, WorkerRequestError, WorkerUnavailableError, connectIpcClient, connectOrSpawnDaemon, createApprovalHub, createChatHost, createDaemonEnvironment, createExtensionsClient, createFileApprovalsStore, createHostEnvironment, createHostImagePort, createHostTranscriptPager, createInteractionHub, createMachineHandlers, createMachineLinkHandlers, createMemoryApprovalsStore, createTranscriptHistoryWorker, createTranscriptReader, createTranscriptReplayCache, createWorkerRpcClient, daemonSocketName, decisionsPort, defaultSocketPath, ensureDaemonRunning, exchangeBoundaries, extensionInstallErrorData, extractEditPayloadForGate, fixPath, historyWorkerUrl, hostRefOf, isClientScope, loadAllEvents, loadEventsPage, loadSessionDocument, mergePath, methodScope, probeSocket, readFileSafe, readTranscript, readTurnsAt, resolveCwdPath, resolveStorageDirs, runAttach, runBlockOnHost, runCompaction, runRemoteOAuth, runWorkspaceExecStream, scopeAllows, selfDaemonSpawnCommand, serializePreview, serveWorkerRpc, shellPath, shellPathAsync, startInProcessHost, startIpcDaemon, transcriptPage, turnCutPoints, watchFileChanges };
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { resolve, sep } from "node:path";
|
|
2
1
|
//#region src/extensions/shared.ts
|
|
3
2
|
const DANGEROUS_RECORD_KEYS = /* @__PURE__ */ new Set([
|
|
4
3
|
"__proto__",
|
|
@@ -14,23 +13,6 @@ function isSafeRecordKey(key) {
|
|
|
14
13
|
return key.length > 0 && !DANGEROUS_RECORD_KEYS.has(key);
|
|
15
14
|
}
|
|
16
15
|
/**
|
|
17
|
-
* Resolve a path inside one extension's storage root for the given scope.
|
|
18
|
-
* `..` segments never escape the root: such a path resolves to the root itself.
|
|
19
|
-
*
|
|
20
|
-
* @param paths - The host's paths.
|
|
21
|
-
* @param extensionName - The extension id.
|
|
22
|
-
* @param scope - The storage area.
|
|
23
|
-
* @param segments - Path segments under the root.
|
|
24
|
-
* @returns The absolute path.
|
|
25
|
-
*/
|
|
26
|
-
function extensionStoragePath(paths, extensionName, scope, ...segments) {
|
|
27
|
-
const base = scope === "cache" ? paths.cacheDir : scope === "data" ? paths.dataDir : scope === "project" || scope === "session" ? paths.projectRoot ?? paths.dataDir : paths.configDir ?? paths.dataDir;
|
|
28
|
-
const root = resolve(base, "extensions", extensionName);
|
|
29
|
-
const target = resolve(root, ...segments);
|
|
30
|
-
if (target !== root && !target.startsWith(root + sep)) return root;
|
|
31
|
-
return target;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
16
|
* Stamp the contributing extension onto a skill.
|
|
35
17
|
*
|
|
36
18
|
* `SkillConfig.source` carries the scope (project / user / inline) and is
|
|
@@ -111,6 +93,6 @@ function frozenCopy(value) {
|
|
|
111
93
|
return Object.freeze(out);
|
|
112
94
|
}
|
|
113
95
|
//#endregion
|
|
114
|
-
export {
|
|
96
|
+
export { withProvenance as a, isSafeRecordKey as i, frozenCopy as n, isJson as r, deepEqual as t };
|
|
115
97
|
|
|
116
|
-
//# sourceMappingURL=json-
|
|
98
|
+
//# sourceMappingURL=json-BjClr43H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-BjClr43H.js","names":[],"sources":["../src/extensions/shared.ts","../src/extensions/storage/json.ts"],"sourcesContent":["/**\n * Small helpers the runtime's domains share: safe record keys and skill\n * provenance. Storage paths are in `./storage/paths`.\n */\n\nimport type { SkillConfig } from '../skills'\nimport type { LoadedExtensionSource } from './types'\n\nconst DANGEROUS_RECORD_KEYS = new Set(['__proto__', 'prototype', 'constructor'])\n\n/**\n * Whether `key` can be used as a plain-object key without touching the prototype chain.\n *\n * @param key - The key.\n */\nexport function isSafeRecordKey(key: string): boolean {\n return key.length > 0 && !DANGEROUS_RECORD_KEYS.has(key)\n}\n\n/**\n * Stamp the contributing extension onto a skill.\n *\n * `SkillConfig.source` carries the scope (project / user / inline) and is\n * defaulted here for extensions that don't set it. The extension NAME goes in\n * `metadata` under the `zidane.` prefix the Agent Skills spec reserves for\n * client-specific keys, so the skill stays spec-conformant while a host UI can\n * still say which extension shipped it.\n *\n * @param skill - The skill.\n * @param source - Where the extension came from.\n * @param extensionName - The extension id.\n * @returns The stamped skill.\n */\nexport function withProvenance(skill: SkillConfig, source: LoadedExtensionSource, extensionName: string): SkillConfig {\n return {\n ...skill,\n source: skill.source ?? source,\n metadata: { ...skill.metadata, 'zidane.extension': extensionName },\n }\n}\n","/**\n * JSON value helpers for the storage domain: validation, structural\n * equality (so unchanged values push nothing) and frozen copies (so cached\n * values can be handed out without being mutated behind the cache's back).\n */\n\nimport type { Json } from '../api/storage'\nimport { isSafeRecordKey } from '../shared'\n\n/** Deepest nesting accepted in a stored value. */\nconst MAX_DEPTH = 64\n\n/**\n * Whether `value` is plain JSON: finite numbers, plain objects with safe\n * keys (see {@link isSafeRecordKey}), arrays, strings, booleans and null.\n *\n * @param value - Candidate value.\n * @param depth - Current nesting level. Callers leave it at 0.\n */\nexport function isJson(value: unknown, depth = 0): value is Json {\n if (value === null || typeof value === 'string' || typeof value === 'boolean')\n return true\n if (typeof value === 'number')\n return Number.isFinite(value)\n if (typeof value !== 'object' || depth >= MAX_DEPTH)\n return false\n if (Array.isArray(value))\n return value.every(item => isJson(item, depth + 1))\n const proto = Object.getPrototypeOf(value)\n if (proto !== Object.prototype && proto !== null)\n return false\n return Object.entries(value).every(([key, child]) => isSafeRecordKey(key) && isJson(child, depth + 1))\n}\n\n/**\n * Structural equality over arrays and plain objects; `Object.is` for\n * everything else. Used to drop echoes and spurious selector pushes.\n *\n * @param a - First value.\n * @param b - Second value.\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b))\n return true\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null)\n return false\n if (Array.isArray(a) !== Array.isArray(b))\n return false\n if (Array.isArray(a)) {\n const other = b as unknown[]\n return a.length === other.length && a.every((item, i) => deepEqual(item, other[i]))\n }\n const protoA = Object.getPrototypeOf(a)\n const protoB = Object.getPrototypeOf(b)\n const plain = (p: unknown): boolean => p === Object.prototype || p === null\n if (!plain(protoA) || !plain(protoB))\n return false\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length)\n return false\n return keysA.every(key => Object.hasOwn(b, key)\n && deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]))\n}\n\n/**\n * A deep, frozen copy of a JSON value.\n *\n * @param value - Value already checked with {@link isJson}.\n */\nexport function frozenCopy<T extends Json>(value: T): T {\n if (value === null || typeof value !== 'object')\n return value\n if (Array.isArray(value))\n return Object.freeze(value.map(item => frozenCopy(item))) as unknown as T\n const out: Record<string, Json> = {}\n for (const [key, child] of Object.entries(value))\n out[key] = frozenCopy(child as Json)\n return Object.freeze(out) as unknown as T\n}\n"],"mappings":";AAQA,MAAM,wCAAwB,IAAI,IAAI;CAAC;CAAa;CAAa;AAAa,CAAC;;;;;;AAO/E,SAAgB,gBAAgB,KAAsB;CACpD,OAAO,IAAI,SAAS,KAAK,CAAC,sBAAsB,IAAI,GAAG;AACzD;;;;;;;;;;;;;;;AAgBA,SAAgB,eAAe,OAAoB,QAA+B,eAAoC;CACpH,OAAO;EACL,GAAG;EACH,QAAQ,MAAM,UAAU;EACxB,UAAU;GAAE,GAAG,MAAM;GAAU,oBAAoB;EAAc;CACnE;AACF;;;;AC7BA,MAAM,YAAY;;;;;;;;AASlB,SAAgB,OAAO,OAAgB,QAAQ,GAAkB;CAC/D,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,OAAO,UAAU,WAClE,OAAO;CACT,IAAI,OAAO,UAAU,UACnB,OAAO,OAAO,SAAS,KAAK;CAC9B,IAAI,OAAO,UAAU,YAAY,SAAS,WACxC,OAAO;CACT,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,MAAM,OAAM,SAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC;CACpD,MAAM,QAAQ,OAAO,eAAe,KAAK;CACzC,IAAI,UAAU,OAAO,aAAa,UAAU,MAC1C,OAAO;CACT,OAAO,OAAO,QAAQ,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,WAAW,gBAAgB,GAAG,KAAK,OAAO,OAAO,QAAQ,CAAC,CAAC;AACvG;;;;;;;;AASA,SAAgB,UAAU,GAAY,GAAqB;CACzD,IAAI,OAAO,GAAG,GAAG,CAAC,GAChB,OAAO;CACT,IAAI,OAAO,MAAM,YAAY,OAAO,MAAM,YAAY,MAAM,QAAQ,MAAM,MACxE,OAAO;CACT,IAAI,MAAM,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,GACtC,OAAO;CACT,IAAI,MAAM,QAAQ,CAAC,GAAG;EACpB,MAAM,QAAQ;EACd,OAAO,EAAE,WAAW,MAAM,UAAU,EAAE,OAAO,MAAM,MAAM,UAAU,MAAM,MAAM,EAAE,CAAC;CACpF;CACA,MAAM,SAAS,OAAO,eAAe,CAAC;CACtC,MAAM,SAAS,OAAO,eAAe,CAAC;CACtC,MAAM,SAAS,MAAwB,MAAM,OAAO,aAAa,MAAM;CACvE,IAAI,CAAC,MAAM,MAAM,KAAK,CAAC,MAAM,MAAM,GACjC,OAAO;CACT,MAAM,QAAQ,OAAO,KAAK,CAAC;CAC3B,MAAM,QAAQ,OAAO,KAAK,CAAC;CAC3B,IAAI,MAAM,WAAW,MAAM,QACzB,OAAO;CACT,OAAO,MAAM,OAAM,QAAO,OAAO,OAAO,GAAG,GAAG,KACzC,UAAW,EAA8B,MAAO,EAA8B,IAAI,CAAC;AAC1F;;;;;;AAOA,SAAgB,WAA2B,OAAa;CACtD,IAAI,UAAU,QAAQ,OAAO,UAAU,UACrC,OAAO;CACT,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,OAAO,OAAO,MAAM,KAAI,SAAQ,WAAW,IAAI,CAAC,CAAC;CAC1D,MAAM,MAA4B,CAAC;CACnC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAC7C,IAAI,OAAO,WAAW,KAAa;CACrC,OAAO,OAAO,OAAO,GAAG;AAC1B"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { i as writeJsonFileAtomic, t as OWNER_ONLY } from "./atomic-write-BewQOXlD.js";
|
|
2
|
-
import { t as ZIDANE_VERSION } from "./version-
|
|
3
|
-
import { S as writeCredentialEntry, u as readCredentialEntry } from "./credentials-
|
|
2
|
+
import { t as ZIDANE_VERSION } from "./version-DwQI12WA.js";
|
|
3
|
+
import { S as writeCredentialEntry, u as readCredentialEntry } from "./credentials-D71duF64.js";
|
|
4
4
|
import { n as JsonRpcRemoteError, t as JsonRpcConnectionClosedError } from "./json-rpc-G0rBfEar.js";
|
|
5
|
-
import { Un as MachineLinkLostError } from "./auto-update-restart-
|
|
6
|
-
import {
|
|
5
|
+
import { Un as MachineLinkLostError } from "./auto-update-restart-CF_kjcJd.js";
|
|
6
|
+
import { dt as isValidMachineName, ft as machineCredentialKey, ut as MachineErrorCode } from "./repo-url-DLjjuVk_.js";
|
|
7
7
|
import { t as HostIdentityError } from "./connection-BaHd3T-D.js";
|
|
8
|
-
import { i as IpcVersionMismatchError } from "./settings-keys-
|
|
8
|
+
import { i as IpcVersionMismatchError } from "./settings-keys-BT0_oKjO.js";
|
|
9
9
|
import { t as keepHostConnected } from "./connection-loop-DSCehV3W.js";
|
|
10
10
|
import { n as displayHostUrl } from "./url-znC3tmKE.js";
|
|
11
|
-
import { r as hostsFilePath, t as createHostRegistry } from "./registry-
|
|
12
|
-
import { r as connectWsClient, t as HostAuthError } from "./ws-client-
|
|
13
|
-
import { createMachineExecutor, shareableRoot } from "./executor-
|
|
11
|
+
import { r as hostsFilePath, t as createHostRegistry } from "./registry-CQOU5jvF.js";
|
|
12
|
+
import { r as connectWsClient, t as HostAuthError } from "./ws-client-C0iPAAzc.js";
|
|
13
|
+
import { createMachineExecutor, shareableRoot } from "./executor-EWOhLyd9.js";
|
|
14
14
|
import { n as machineIdentity } from "./identity-0ysCiQZw.js";
|
|
15
15
|
import { isAbsolute, join } from "node:path";
|
|
16
16
|
import { closeSync, existsSync, linkSync, mkdirSync, openSync, readFileSync, realpathSync, renameSync, rmSync, statSync, utimesSync, writeSync } from "node:fs";
|
|
@@ -635,4 +635,4 @@ function startMachineLinks(options) {
|
|
|
635
635
|
//#endregion
|
|
636
636
|
export { startMachineLinks };
|
|
637
637
|
|
|
638
|
-
//# sourceMappingURL=links-
|
|
638
|
+
//# sourceMappingURL=links-a8C9eby4.js.map
|