zidane 7.2.5 → 8.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +34 -6
- package/dist/{acp-D-tVyUjw.js → acp-DQDhi2dj.js} +230 -77
- package/dist/acp-DQDhi2dj.js.map +1 -0
- package/dist/acp-cli.d.ts +1 -1
- package/dist/acp-cli.js +9 -66
- package/dist/acp-cli.js.map +1 -1
- package/dist/acp.d.ts +10 -590
- package/dist/acp.d.ts.map +1 -1
- package/dist/acp.js +3 -3
- package/dist/{agent-D0zZnGbt.js → agent-DSLNmBp0.js} +14401 -13214
- package/dist/agent-DSLNmBp0.js.map +1 -0
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +3 -2
- package/dist/aliasing-lVFbm81n.js +217 -0
- package/dist/aliasing-lVFbm81n.js.map +1 -0
- package/dist/{anthropic-C2aole0G.js → anthropic-CD00LhUP.js} +1442 -1264
- package/dist/anthropic-CD00LhUP.js.map +1 -0
- package/dist/artifacts-CV2hUKnL.js.map +1 -1
- package/dist/{atomic-write-B7zr1ddF.js → atomic-write-Ijgf2Mhc.js} +13 -3
- package/dist/atomic-write-Ijgf2Mhc.js.map +1 -0
- package/dist/call-tool-dHlbGOIY.js +70 -0
- package/dist/call-tool-dHlbGOIY.js.map +1 -0
- package/dist/chat/pure.d.ts +372 -6
- package/dist/chat/pure.d.ts.map +1 -1
- package/dist/chat/pure.js +35 -244
- package/dist/chat/pure.js.map +1 -1
- package/dist/{approvals-DKaJZYlm.js → chat-JPJJ8uu5.js} +15879 -14631
- package/dist/chat-JPJJ8uu5.js.map +1 -0
- package/dist/chat.d.ts +4 -6
- package/dist/chat.js +23 -12
- package/dist/cli-shared-C-YCaglL.js +159 -0
- package/dist/cli-shared-C-YCaglL.js.map +1 -0
- package/dist/client-core-BQSyDALT.d.ts +2115 -0
- package/dist/client-core-BQSyDALT.d.ts.map +1 -0
- package/dist/codemode-worker.d.ts +1 -0
- package/dist/codemode-worker.js +155 -0
- package/dist/codemode-worker.js.map +1 -0
- package/dist/codemode.d.ts +352 -0
- package/dist/codemode.d.ts.map +1 -0
- package/dist/codemode.js +5 -0
- package/dist/connection-Dr-Js4yZ.d.ts +28 -0
- package/dist/connection-Dr-Js4yZ.d.ts.map +1 -0
- package/dist/connection-loop-gdh22LTI.js +112 -0
- package/dist/connection-loop-gdh22LTI.js.map +1 -0
- package/dist/context-segments-BHKlagL6.js +1016 -0
- package/dist/context-segments-BHKlagL6.js.map +1 -0
- package/dist/{context-transport-T_6AYIvy.js → context-transport-DSMTUsK1.js} +3 -3
- package/dist/{context-transport-T_6AYIvy.js.map → context-transport-DSMTUsK1.js.map} +1 -1
- package/dist/contexts/daytona.d.ts +19 -8
- package/dist/contexts/daytona.d.ts.map +1 -1
- package/dist/contexts/daytona.js +1 -440
- package/dist/contexts/docker.d.ts +36 -7
- package/dist/contexts/docker.d.ts.map +1 -1
- package/dist/contexts/docker.js +1 -456
- package/dist/contexts/e2b.d.ts +68 -13
- package/dist/contexts/e2b.d.ts.map +1 -1
- package/dist/contexts/e2b.js +1 -382
- package/dist/contexts/sandbox.d.ts +1 -1
- package/dist/contexts/sandbox.js +5 -0
- package/dist/contexts/sandbox.js.map +1 -1
- package/dist/{contexts-CRE9pw07.js → contexts-d7UolYot.js} +1059 -524
- package/dist/contexts-d7UolYot.js.map +1 -0
- package/dist/contexts.d.ts +3 -3
- package/dist/contexts.js +1 -1
- package/dist/cred-keys-GpBg71cP.js +105 -0
- package/dist/cred-keys-GpBg71cP.js.map +1 -0
- package/dist/{auth-BG2rVKSt.js → credentials-JttEuRON.js} +55 -206
- package/dist/credentials-JttEuRON.js.map +1 -0
- package/dist/{cursor-iojRXHF9.js → cursor-CdjaQTBW.js} +3 -3
- package/dist/{cursor-iojRXHF9.js.map → cursor-CdjaQTBW.js.map} +1 -1
- package/dist/daemon-cli.d.ts +1 -1
- package/dist/daemon-cli.js +3 -2
- package/dist/daemon-cli.js.map +1 -1
- package/dist/daytona-DG3omipZ.js +513 -0
- package/dist/daytona-DG3omipZ.js.map +1 -0
- package/dist/defaults-Cx3zvDOV.js +23 -0
- package/dist/defaults-Cx3zvDOV.js.map +1 -0
- package/dist/dispatcher-BMlu2BmZ.js +4941 -0
- package/dist/dispatcher-BMlu2BmZ.js.map +1 -0
- package/dist/docker-BZhMMJUp.js +727 -0
- package/dist/docker-BZhMMJUp.js.map +1 -0
- package/dist/e2b-CEVOdRib.js +480 -0
- package/dist/e2b-CEVOdRib.js.map +1 -0
- package/dist/edit-utils-EGosADZq.js +234 -0
- package/dist/edit-utils-EGosADZq.js.map +1 -0
- package/dist/environment-8wsKE2Ln.js +214 -0
- package/dist/environment-8wsKE2Ln.js.map +1 -0
- package/dist/eval-BNcvle_J.js +1595 -0
- package/dist/eval-BNcvle_J.js.map +1 -0
- package/dist/eval.d.ts +2 -2
- package/dist/eval.js +1 -1489
- package/dist/executor-Cx5-8yqi.js +621 -0
- package/dist/executor-Cx5-8yqi.js.map +1 -0
- package/dist/extension-authoring-DyGGmq9V.js +385 -0
- package/dist/extension-authoring-DyGGmq9V.js.map +1 -0
- package/dist/extensions.d.ts +2 -2
- package/dist/extensions.js +3 -3
- package/dist/{fetch-url-DX75gpL0.js → fetch-url-Ct2TjDWt.js} +4 -4
- package/dist/{fetch-url-DX75gpL0.js.map → fetch-url-Ct2TjDWt.js.map} +1 -1
- package/dist/{format-BF745pLL.js → format-C2NQEVUH.js} +39 -2
- package/dist/format-C2NQEVUH.js.map +1 -0
- package/dist/format-bytes-C7tfc3Zm.js +55 -0
- package/dist/format-bytes-C7tfc3Zm.js.map +1 -0
- package/dist/headless-C_rNUuYC.js +960 -0
- package/dist/headless-C_rNUuYC.js.map +1 -0
- package/dist/headless.d.ts +1 -1
- package/dist/headless.js +1 -413
- package/dist/{history-search-C4bk1Wz_.js → history-search-CcYzF8-0.js} +7 -3
- package/dist/history-search-CcYzF8-0.js.map +1 -0
- package/dist/history-search-worker.d.ts +1 -1
- package/dist/history-search-worker.js +1 -1
- package/dist/host-D7NrI03V.js +378 -0
- package/dist/host-D7NrI03V.js.map +1 -0
- package/dist/host-signals-BcP5QKUD.js +118 -0
- package/dist/host-signals-BcP5QKUD.js.map +1 -0
- package/dist/identity-CwfO8K-t.js +26 -0
- package/dist/identity-CwfO8K-t.js.map +1 -0
- package/dist/{index-BgN1T3lk.d.ts → index-BGe1fQT7.d.ts} +10987 -9320
- package/dist/index-BGe1fQT7.d.ts.map +1 -0
- package/dist/index-BVQsIKGn.d.ts +448 -0
- package/dist/index-BVQsIKGn.d.ts.map +1 -0
- package/dist/{index-C6NEd5y_.d.ts → index-CHABJd-L.d.ts} +3386 -502
- package/dist/index-CHABJd-L.d.ts.map +1 -0
- package/dist/{index-C37_ppWv.d.ts → index-D6a7qXpg.d.ts} +2 -3
- package/dist/index-D6a7qXpg.d.ts.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.js +27 -23
- package/dist/{completion-core-BRo86R_L.js → inline-ghost-BVRQeGoL.js} +50 -2
- package/dist/inline-ghost-BVRQeGoL.js.map +1 -0
- package/dist/ipc/remote.d.ts +313 -0
- package/dist/ipc/remote.d.ts.map +1 -0
- package/dist/ipc/remote.js +4 -0
- package/dist/ipc.d.ts +6 -964
- package/dist/ipc.js +403 -4
- package/dist/ipc.js.map +1 -0
- package/dist/{isolation-Kfoof0MM.d.ts → isolation-D9L650W5.d.ts} +100 -15
- package/dist/isolation-D9L650W5.d.ts.map +1 -0
- package/dist/json-rpc--HXQti1E.js +350 -0
- package/dist/json-rpc--HXQti1E.js.map +1 -0
- package/dist/links-j8rED1sR.js +603 -0
- package/dist/links-j8rED1sR.js.map +1 -0
- package/dist/local-terminal-D8QThwo_.js +252 -0
- package/dist/local-terminal-D8QThwo_.js.map +1 -0
- package/dist/{logger--C1VQjwJ.js → logger-Gtqlayx8.js} +199 -173
- package/dist/logger-Gtqlayx8.js.map +1 -0
- package/dist/logs-view-CWG8aUAG.js.map +1 -1
- package/dist/{mcp-CgNd-f3F.js → mcp-_wecH9Qe.js} +608 -562
- package/dist/mcp-_wecH9Qe.js.map +1 -0
- package/dist/mcp.d.ts +2 -2
- package/dist/mcp.js +2 -2
- package/dist/media-sniff-UKijEaiQ.js.map +1 -1
- package/dist/{messages-2jcOA_5R.js → messages-BqiwcD2Q.js} +1017 -1014
- package/dist/messages-BqiwcD2Q.js.map +1 -0
- package/dist/{oauth-DxHO17JE.js → oauth-Px_pBB9W.js} +5 -5
- package/dist/{oauth-DxHO17JE.js.map → oauth-Px_pBB9W.js.map} +1 -1
- package/dist/{openai-compat-Dy56weK8.js → openai-compat-CFrpH7uq.js} +432 -589
- package/dist/openai-compat-CFrpH7uq.js.map +1 -0
- package/dist/orchestration-BCGmB8Ps.js +511 -0
- package/dist/orchestration-BCGmB8Ps.js.map +1 -0
- package/dist/output/stream-json.d.ts +1 -2
- package/dist/output/stream-json.d.ts.map +1 -1
- package/dist/output/stream-json.js +1 -1
- package/dist/output/terminal.d.ts +1 -2
- package/dist/output/terminal.d.ts.map +1 -1
- package/dist/output/terminal.js +13 -7
- package/dist/output/terminal.js.map +1 -1
- package/dist/{plugins-gbI7SBA6.js → plugins-DS7mahzZ.js} +20 -101
- package/dist/plugins-DS7mahzZ.js.map +1 -0
- package/dist/plugins.d.ts +1 -1
- package/dist/plugins.js +1 -2
- package/dist/prelude-Cxo4t74B.js +517 -0
- package/dist/prelude-Cxo4t74B.js.map +1 -0
- package/dist/presets.d.ts +1 -1
- package/dist/presets.js +1 -2
- package/dist/project-root-B8zADr4o.js +167 -0
- package/dist/project-root-B8zADr4o.js.map +1 -0
- package/dist/project-user-paths-BSgtrRxl.js +58 -0
- package/dist/project-user-paths-BSgtrRxl.js.map +1 -0
- package/dist/{prompts-Pqc3JdW_.d.ts → prompts-DYcvqShf.d.ts} +14 -11
- package/dist/prompts-DYcvqShf.d.ts.map +1 -0
- package/dist/protocol-DnhqqSmE.js +13 -0
- package/dist/protocol-DnhqqSmE.js.map +1 -0
- package/dist/providers/anthropic.d.ts +2 -2
- package/dist/providers/anthropic.js +1 -2
- package/dist/providers/arcee.d.ts +1 -1
- package/dist/providers/arcee.js +1 -1
- package/dist/providers/baseten.d.ts +1 -1
- package/dist/providers/baseten.js +1 -1
- package/dist/providers/cerebras.d.ts +1 -1
- package/dist/providers/cerebras.js +3 -2
- package/dist/providers/cerebras.js.map +1 -1
- package/dist/providers/local.d.ts +1 -1
- package/dist/providers/local.js +1 -1
- package/dist/providers/openai-compat.d.ts +1 -1
- package/dist/providers/openai-compat.js +1 -2
- package/dist/providers/openai.d.ts +1 -1
- package/dist/providers/openai.js +15 -12
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/openrouter.js +3 -2
- package/dist/providers/openrouter.js.map +1 -1
- package/dist/providers/xai.d.ts +1 -1
- package/dist/providers/xai.js +3 -3
- package/dist/{providers-BVhnFyiY.js → providers-XUR7F4Hi.js} +4 -4
- package/dist/{providers-BVhnFyiY.js.map → providers-XUR7F4Hi.js.map} +1 -1
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +4 -4
- package/dist/registry-D6ShBWJU.js +5234 -0
- package/dist/registry-D6ShBWJU.js.map +1 -0
- package/dist/remote-hosts-BtA_9ZGp.js +97 -0
- package/dist/remote-hosts-BtA_9ZGp.js.map +1 -0
- package/dist/restate.d.ts +2 -3
- package/dist/restate.d.ts.map +1 -1
- package/dist/restate.js +631 -572
- package/dist/restate.js.map +1 -1
- package/dist/run-summary-CklLiZ4y.js +288 -0
- package/dist/run-summary-CklLiZ4y.js.map +1 -0
- package/dist/{sandbox-BH0WQkXn.d.ts → sandbox-C5dR5DwQ.d.ts} +6 -3
- package/dist/sandbox-C5dR5DwQ.d.ts.map +1 -0
- package/dist/session/sqlite.d.ts +1 -2
- package/dist/session/sqlite.d.ts.map +1 -1
- package/dist/session/sqlite.js +1 -616
- package/dist/session-factory-BUGY5P40.js +1576 -0
- package/dist/session-factory-BUGY5P40.js.map +1 -0
- package/dist/{session-BqRP1hS7.js → session-xh9JXu6i.js} +94 -52
- package/dist/session-xh9JXu6i.js.map +1 -0
- package/dist/session.d.ts +1 -1
- package/dist/session.js +2 -2
- package/dist/settings-keys-Ckf29NeM.js +677 -0
- package/dist/settings-keys-Ckf29NeM.js.map +1 -0
- package/dist/shell-path-Dqaoow2J.js +412 -0
- package/dist/shell-path-Dqaoow2J.js.map +1 -0
- package/dist/{skills-BC3dodWp.js → skills-DKqZJm4X.js} +430 -470
- package/dist/skills-DKqZJm4X.js.map +1 -0
- package/dist/skills.d.ts +2 -2
- package/dist/skills.js +1 -2
- package/dist/source-mPExaUm8.js +381 -0
- package/dist/source-mPExaUm8.js.map +1 -0
- package/dist/sqlite-DV1DQzN2.js +698 -0
- package/dist/sqlite-DV1DQzN2.js.map +1 -0
- package/dist/{src-CkNQKFKr.js → src-BRMYRJib.js} +903 -1121
- package/dist/src-BRMYRJib.js.map +1 -0
- package/dist/{stdio-DPpBDPx5.js → stdio-C6YyoW3I.js} +4 -4
- package/dist/{stdio-DPpBDPx5.js.map → stdio-C6YyoW3I.js.map} +1 -1
- package/dist/{stdio-loader-Bbx19dMZ.js → stdio-loader-C830Vg-Z.js} +4 -4
- package/dist/{stdio-loader-Bbx19dMZ.js.map → stdio-loader-C830Vg-Z.js.map} +1 -1
- package/dist/system-prompt-MNVHatSD.d.ts.map +1 -1
- package/dist/timeout-DEaqslLO.d.ts.map +1 -1
- package/dist/todo-edits-Dn251YUP.js +1790 -0
- package/dist/todo-edits-Dn251YUP.js.map +1 -0
- package/dist/{turn-operations-DrbJlpq9.js → tool-formatters-IQFDrdrs.js} +1456 -2120
- package/dist/tool-formatters-IQFDrdrs.js.map +1 -0
- package/dist/tool-state-Dku6YqAB.js +989 -0
- package/dist/tool-state-Dku6YqAB.js.map +1 -0
- package/dist/tools/fetch-url.d.ts +1 -2
- package/dist/tools/fetch-url.d.ts.map +1 -1
- package/dist/tools/fetch-url.js +1 -2
- package/dist/tools/prompts.d.ts +1 -1
- package/dist/tools/prompts.js +7 -7
- package/dist/tools/prompts.js.map +1 -1
- package/dist/tools/web-search.d.ts +1 -2
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +2 -2
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools-_DnT3AGM.js +578 -0
- package/dist/tools-_DnT3AGM.js.map +1 -0
- package/dist/tools.d.ts +3 -3
- package/dist/tools.js +4 -2
- package/dist/tui.d.ts +534 -517
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +34933 -27243
- package/dist/tui.js.map +1 -1
- package/dist/turn-operations-B8sokwi5.js +333 -0
- package/dist/turn-operations-B8sokwi5.js.map +1 -0
- package/dist/turn-operations-DQX5ZZni.d.ts +3089 -0
- package/dist/turn-operations-DQX5ZZni.d.ts.map +1 -0
- package/dist/types-C7ZFOztE.d.ts +132 -0
- package/dist/types-C7ZFOztE.d.ts.map +1 -0
- package/dist/types-CH5XpIHw.js +114 -0
- package/dist/types-CH5XpIHw.js.map +1 -0
- package/dist/{types-CWgENVLY.js → types-Cu0ZGDu9.js} +10 -6
- package/dist/types-Cu0ZGDu9.js.map +1 -0
- package/dist/types-IqegbJEE.d.ts +624 -0
- package/dist/types-IqegbJEE.d.ts.map +1 -0
- package/dist/types.d.ts +4 -4
- package/dist/types.js +1 -1
- package/dist/url-D8HCl65b.js +1259 -0
- package/dist/url-D8HCl65b.js.map +1 -0
- package/dist/wasm-BVT-j5cl.js +33 -0
- package/dist/wasm-BVT-j5cl.js.map +1 -0
- package/dist/workspace-exec-stream-SV2R9d5S.js +355 -0
- package/dist/workspace-exec-stream-SV2R9d5S.js.map +1 -0
- package/dist/ws-CIHMvlSh.js +952 -0
- package/dist/ws-CIHMvlSh.js.map +1 -0
- package/dist/ws-client-N7NxzvQp.js +230 -0
- package/dist/ws-client-N7NxzvQp.js.map +1 -0
- package/dist/{xai-CazjStOK.js → xai-CvJTeLrI.js} +165 -5
- package/dist/xai-CvJTeLrI.js.map +1 -0
- package/dist/xdg-zweed0-t.js +117 -0
- package/dist/xdg-zweed0-t.js.map +1 -0
- package/docs/ACP.md +52 -0
- package/docs/ARCHITECTURE.md +103 -6
- package/docs/ARTIFACTS.md +8 -4
- package/docs/CHAT.md +165 -14
- package/docs/EXECUTION_CONTEXT.md +8 -0
- package/docs/EXTENSIONS.md +123 -2
- package/docs/HEADLESS.md +2 -0
- package/docs/IPC.md +775 -64
- package/docs/MACHINES.md +456 -0
- package/docs/PANELS.md +3 -0
- package/docs/README.md +4 -0
- package/docs/RESTATE.md +3 -2
- package/docs/RUN_IN_BACKGROUND.md +10 -2
- package/docs/SERVER.md +1085 -0
- package/docs/SKILL.md +6 -1
- package/docs/TERMINAL.md +75 -0
- package/docs/TUI.md +65 -14
- package/package.json +58 -26
- package/scripts/eval.ts +4 -0
- package/dist/acp-D-tVyUjw.js.map +0 -1
- package/dist/agent-D0zZnGbt.js.map +0 -1
- package/dist/anthropic-C2aole0G.js.map +0 -1
- package/dist/approvals-DKaJZYlm.js.map +0 -1
- package/dist/atomic-write-B7zr1ddF.js.map +0 -1
- package/dist/auth-BG2rVKSt.js.map +0 -1
- package/dist/completion-core-BRo86R_L.js.map +0 -1
- package/dist/contexts/daytona.js.map +0 -1
- package/dist/contexts/docker.js.map +0 -1
- package/dist/contexts/e2b.js.map +0 -1
- package/dist/contexts-CRE9pw07.js.map +0 -1
- package/dist/eval.js.map +0 -1
- package/dist/format-BF745pLL.js.map +0 -1
- package/dist/glob-DluQFSw1.js +0 -270
- package/dist/glob-DluQFSw1.js.map +0 -1
- package/dist/headless.js.map +0 -1
- package/dist/history-search-C4bk1Wz_.js.map +0 -1
- package/dist/index-BgN1T3lk.d.ts.map +0 -1
- package/dist/index-C37_ppWv.d.ts.map +0 -1
- package/dist/index-C6NEd5y_.d.ts.map +0 -1
- package/dist/ipc-BKVIIOqH.js +0 -331
- package/dist/ipc-BKVIIOqH.js.map +0 -1
- package/dist/ipc.d.ts.map +0 -1
- package/dist/isolation-Kfoof0MM.d.ts.map +0 -1
- package/dist/json-rpc-rSWMUh9b.js +0 -192
- package/dist/json-rpc-rSWMUh9b.js.map +0 -1
- package/dist/logger--C1VQjwJ.js.map +0 -1
- package/dist/mcp-CgNd-f3F.js.map +0 -1
- package/dist/messages-2jcOA_5R.js.map +0 -1
- package/dist/openai-compat-Dy56weK8.js.map +0 -1
- package/dist/output-cap-C9zukcCj.js +0 -100
- package/dist/output-cap-C9zukcCj.js.map +0 -1
- package/dist/panels-B6gRk4bf.js +0 -789
- package/dist/panels-B6gRk4bf.js.map +0 -1
- package/dist/plugins-gbI7SBA6.js.map +0 -1
- package/dist/prompts-Pqc3JdW_.d.ts.map +0 -1
- package/dist/run-summary-BU_NgwUT.js +0 -269
- package/dist/run-summary-BU_NgwUT.js.map +0 -1
- package/dist/sandbox-BH0WQkXn.d.ts.map +0 -1
- package/dist/session/sqlite.js.map +0 -1
- package/dist/session-BqRP1hS7.js.map +0 -1
- package/dist/shell-path-DfdXrGg9.js +0 -1549
- package/dist/shell-path-DfdXrGg9.js.map +0 -1
- package/dist/skills-BC3dodWp.js.map +0 -1
- package/dist/src-CkNQKFKr.js.map +0 -1
- package/dist/todo-edits-UOwgxGKu.js +0 -528
- package/dist/todo-edits-UOwgxGKu.js.map +0 -1
- package/dist/tool-formatters-DoRLnfuD.d.ts +0 -759
- package/dist/tool-formatters-DoRLnfuD.d.ts.map +0 -1
- package/dist/transcript-anchors-BeudMbXx.d.ts +0 -1762
- package/dist/transcript-anchors-BeudMbXx.d.ts.map +0 -1
- package/dist/turn-operations-C8bMBDl_.d.ts +0 -1258
- package/dist/turn-operations-C8bMBDl_.d.ts.map +0 -1
- package/dist/turn-operations-DrbJlpq9.js.map +0 -1
- package/dist/types-CWgENVLY.js.map +0 -1
- package/dist/xai-CazjStOK.js.map +0 -1
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
import { Buffer } from "node:buffer";
|
|
2
|
-
//#region src/acp/json-rpc.ts
|
|
3
|
-
function createJsonRpcConnection(options) {
|
|
4
|
-
let nextId = 1;
|
|
5
|
-
let closed = false;
|
|
6
|
-
let buffer = Buffer.alloc(0);
|
|
7
|
-
const pending = /* @__PURE__ */ new Map();
|
|
8
|
-
const writeMessage = (message) => {
|
|
9
|
-
if (closed) return;
|
|
10
|
-
const json = JSON.stringify({
|
|
11
|
-
...message,
|
|
12
|
-
jsonrpc: "2.0"
|
|
13
|
-
});
|
|
14
|
-
if (options.framing === "content-length") {
|
|
15
|
-
const bytes = Buffer.byteLength(json);
|
|
16
|
-
options.output.write(`Content-Length: ${bytes}\r\n\r\n${json}`);
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
options.output.write(`${json}\n`);
|
|
20
|
-
};
|
|
21
|
-
const handleParsed = async (message) => {
|
|
22
|
-
if (!isObject(message)) {
|
|
23
|
-
writeMessage(errorResponse(null, -32600, "Invalid JSON-RPC message."));
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
const msg = message;
|
|
27
|
-
if ("id" in msg && ("result" in msg || "error" in msg)) {
|
|
28
|
-
const request = pending.get(msg.id);
|
|
29
|
-
if (!request) return;
|
|
30
|
-
pending.delete(msg.id);
|
|
31
|
-
if ("error" in msg && msg.error) request.reject(new JsonRpcRemoteError(msg.error.message, msg.error.code, msg.error.data));
|
|
32
|
-
else request.resolve(msg.result);
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
if (typeof msg.method !== "string") {
|
|
36
|
-
writeMessage(errorResponse(("id" in msg ? msg.id : null) ?? null, -32600, "Missing JSON-RPC method."));
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
if ("id" in msg) {
|
|
40
|
-
try {
|
|
41
|
-
const response = await options.onRequest(msg);
|
|
42
|
-
if (response) writeMessage(response);
|
|
43
|
-
} catch (err) {
|
|
44
|
-
writeMessage(errorResponse(msg.id, -32603, err instanceof Error ? err.message : String(err)));
|
|
45
|
-
}
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
try {
|
|
49
|
-
await options.onNotification?.(msg);
|
|
50
|
-
} catch (err) {
|
|
51
|
-
options.onError?.(err instanceof Error ? err : new Error(String(err)));
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
const onData = (chunk) => {
|
|
55
|
-
buffer = Buffer.concat([buffer, typeof chunk === "string" ? Buffer.from(chunk) : chunk]);
|
|
56
|
-
for (;;) {
|
|
57
|
-
let parsed;
|
|
58
|
-
try {
|
|
59
|
-
parsed = readNextMessage(buffer);
|
|
60
|
-
} catch (err) {
|
|
61
|
-
const newline = buffer.indexOf("\n");
|
|
62
|
-
buffer = newline >= 0 ? buffer.subarray(newline + 1) : Buffer.alloc(0);
|
|
63
|
-
writeMessage(errorResponse(null, -32700, err instanceof Error ? err.message : String(err)));
|
|
64
|
-
continue;
|
|
65
|
-
}
|
|
66
|
-
if (!parsed) break;
|
|
67
|
-
buffer = parsed.rest;
|
|
68
|
-
handleParsed(parsed.message);
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
const onError = (err) => {
|
|
72
|
-
options.onError?.(err);
|
|
73
|
-
};
|
|
74
|
-
return {
|
|
75
|
-
start() {
|
|
76
|
-
options.input.on("data", onData);
|
|
77
|
-
options.input.on("error", onError);
|
|
78
|
-
},
|
|
79
|
-
close() {
|
|
80
|
-
closed = true;
|
|
81
|
-
options.input.off("data", onData);
|
|
82
|
-
options.input.off("error", onError);
|
|
83
|
-
for (const request of pending.values()) request.reject(new JsonRpcConnectionClosedError());
|
|
84
|
-
pending.clear();
|
|
85
|
-
},
|
|
86
|
-
sendNotification(method, params) {
|
|
87
|
-
writeMessage({
|
|
88
|
-
jsonrpc: "2.0",
|
|
89
|
-
method,
|
|
90
|
-
...params !== void 0 ? { params } : {}
|
|
91
|
-
});
|
|
92
|
-
},
|
|
93
|
-
sendRequest(method, params) {
|
|
94
|
-
if (closed) return Promise.reject(/* @__PURE__ */ new Error("JSON-RPC connection is closed."));
|
|
95
|
-
const id = nextId++;
|
|
96
|
-
writeMessage({
|
|
97
|
-
jsonrpc: "2.0",
|
|
98
|
-
id,
|
|
99
|
-
method,
|
|
100
|
-
...params !== void 0 ? { params } : {}
|
|
101
|
-
});
|
|
102
|
-
return new Promise((resolve, reject) => {
|
|
103
|
-
pending.set(id, {
|
|
104
|
-
resolve,
|
|
105
|
-
reject
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* The transport closed while requests were in flight. Distinct from
|
|
113
|
-
* {@link JsonRpcRemoteError} because it is not a reply — nothing on the other
|
|
114
|
-
* side said anything — and callers must be able to tell "the daemon rejected
|
|
115
|
-
* this" from "the daemon went away" without parsing a message string. Every
|
|
116
|
-
* pending request is rejected with one of these on `close()`.
|
|
117
|
-
*/
|
|
118
|
-
var JsonRpcConnectionClosedError = class extends Error {
|
|
119
|
-
constructor() {
|
|
120
|
-
super("JSON-RPC connection closed.");
|
|
121
|
-
this.name = "JsonRpcConnectionClosedError";
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
var JsonRpcRemoteError = class extends Error {
|
|
125
|
-
code;
|
|
126
|
-
data;
|
|
127
|
-
constructor(message, code, data) {
|
|
128
|
-
super(message);
|
|
129
|
-
this.code = code;
|
|
130
|
-
this.data = data;
|
|
131
|
-
this.name = "JsonRpcRemoteError";
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
function successResponse(id, result = {}) {
|
|
135
|
-
return {
|
|
136
|
-
jsonrpc: "2.0",
|
|
137
|
-
id,
|
|
138
|
-
result
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
function errorResponse(id, code, message, data) {
|
|
142
|
-
return {
|
|
143
|
-
jsonrpc: "2.0",
|
|
144
|
-
id,
|
|
145
|
-
error: {
|
|
146
|
-
code,
|
|
147
|
-
message,
|
|
148
|
-
...data !== void 0 ? { data } : {}
|
|
149
|
-
}
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
function readNextMessage(input) {
|
|
153
|
-
if (input.length === 0) return null;
|
|
154
|
-
const headerEnd = input.indexOf("\r\n\r\n");
|
|
155
|
-
if (headerEnd >= 0) {
|
|
156
|
-
const header = input.subarray(0, headerEnd).toString("utf8");
|
|
157
|
-
const match = /^Content-Length:\s*(\d+)/im.exec(header);
|
|
158
|
-
if (!match) return readLineMessage(input);
|
|
159
|
-
const length = Number(match[1]);
|
|
160
|
-
const bodyStart = headerEnd + 4;
|
|
161
|
-
const bodyEnd = bodyStart + length;
|
|
162
|
-
if (input.length < bodyEnd) return null;
|
|
163
|
-
const body = input.subarray(bodyStart, bodyEnd).toString("utf8");
|
|
164
|
-
return {
|
|
165
|
-
message: JSON.parse(body),
|
|
166
|
-
rest: input.subarray(bodyEnd)
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
if (/^Content-Length:/i.test(input.subarray(0, Math.min(input.length, 32)).toString("utf8"))) return null;
|
|
170
|
-
return readLineMessage(input);
|
|
171
|
-
}
|
|
172
|
-
function readLineMessage(input) {
|
|
173
|
-
let rest = input;
|
|
174
|
-
for (;;) {
|
|
175
|
-
const lineEnd = rest.indexOf("\n");
|
|
176
|
-
if (lineEnd < 0) return null;
|
|
177
|
-
const line = rest.subarray(0, lineEnd).toString("utf8").trim();
|
|
178
|
-
rest = rest.subarray(lineEnd + 1);
|
|
179
|
-
if (line.length === 0) continue;
|
|
180
|
-
return {
|
|
181
|
-
message: JSON.parse(line),
|
|
182
|
-
rest
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
function isObject(value) {
|
|
187
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
188
|
-
}
|
|
189
|
-
//#endregion
|
|
190
|
-
export { successResponse as a, errorResponse as i, JsonRpcRemoteError as n, createJsonRpcConnection as r, JsonRpcConnectionClosedError as t };
|
|
191
|
-
|
|
192
|
-
//# sourceMappingURL=json-rpc-rSWMUh9b.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"json-rpc-rSWMUh9b.js","names":[],"sources":["../src/acp/json-rpc.ts"],"sourcesContent":["import type { Readable, Writable } from 'node:stream'\nimport type { AcpPeer, JsonRpcFailure, JsonRpcId, JsonRpcMessage, JsonRpcRequest, JsonRpcResponse } from './types'\nimport { Buffer } from 'node:buffer'\nimport { AcpErrorCode } from './types'\n\nexport interface JsonRpcConnectionOptions {\n input: Readable\n output: Writable\n onRequest: (message: JsonRpcRequest) => Promise<JsonRpcResponse | null | undefined> | JsonRpcResponse | null | undefined\n onNotification?: (message: JsonRpcMessage & { method: string, id?: undefined }) => void | Promise<void>\n framing?: 'content-length' | 'newline'\n onError?: (error: Error) => void\n}\n\nexport interface JsonRpcConnection extends AcpPeer {\n start: () => void\n close: () => void\n}\n\ninterface PendingRequest {\n resolve: (value: unknown) => void\n reject: (error: Error) => void\n}\n\nexport function createJsonRpcConnection(options: JsonRpcConnectionOptions): JsonRpcConnection {\n let nextId = 1\n let closed = false\n let buffer: Buffer<ArrayBufferLike> = Buffer.alloc(0)\n const pending = new Map<JsonRpcId, PendingRequest>()\n\n const writeMessage = (message: JsonRpcMessage): void => {\n if (closed)\n return\n const json = JSON.stringify({ ...message, jsonrpc: '2.0' })\n // ACP stdio framing is newline-delimited JSON (NDJSON) and is the default.\n // `JSON.stringify` escapes any embedded newline, so a serialized message is\n // always a single line. LSP-style `Content-Length` framing is opt-in for\n // non-ACP transports only.\n if (options.framing === 'content-length') {\n const bytes = Buffer.byteLength(json)\n options.output.write(`Content-Length: ${bytes}\\r\\n\\r\\n${json}`)\n return\n }\n options.output.write(`${json}\\n`)\n }\n\n const handleParsed = async (message: unknown): Promise<void> => {\n if (!isObject(message)) {\n writeMessage(errorResponse(null, AcpErrorCode.InvalidRequest, 'Invalid JSON-RPC message.'))\n return\n }\n\n const msg = message as unknown as JsonRpcMessage\n if ('id' in msg && ('result' in msg || 'error' in msg)) {\n const request = pending.get(msg.id)\n if (!request)\n return\n pending.delete(msg.id)\n if ('error' in msg && msg.error) {\n request.reject(new JsonRpcRemoteError(msg.error.message, msg.error.code, msg.error.data))\n }\n else {\n request.resolve((msg as { result?: unknown }).result)\n }\n return\n }\n\n if (typeof (msg as { method?: unknown }).method !== 'string') {\n writeMessage(errorResponse(('id' in msg ? msg.id : null) ?? null, AcpErrorCode.InvalidRequest, 'Missing JSON-RPC method.'))\n return\n }\n\n if ('id' in msg) {\n try {\n const response = await options.onRequest(msg as JsonRpcRequest)\n if (response)\n writeMessage(response)\n }\n catch (err) {\n writeMessage(errorResponse(msg.id, AcpErrorCode.InternalError, err instanceof Error ? err.message : String(err)))\n }\n return\n }\n\n try {\n await options.onNotification?.(msg as JsonRpcMessage & { method: string, id?: undefined })\n }\n catch (err) {\n options.onError?.(err instanceof Error ? err : new Error(String(err)))\n }\n }\n\n const onData = (chunk: Buffer | string): void => {\n buffer = Buffer.concat([buffer, typeof chunk === 'string' ? Buffer.from(chunk) : chunk])\n for (;;) {\n let parsed: { message: unknown, rest: Buffer<ArrayBufferLike> } | null\n try {\n parsed = readNextMessage(buffer)\n }\n catch (err) {\n // Resync to the next newline: drop ONLY the malformed line instead\n // of zeroing the whole receive buffer, so one bad line can't discard\n // well-formed messages already buffered behind it. A parse error\n // implies a complete (newline-terminated) line was seen, so this\n // always consumes at least one byte — the loop can't spin.\n const newline = buffer.indexOf('\\n')\n buffer = newline >= 0 ? buffer.subarray(newline + 1) : Buffer.alloc(0)\n writeMessage(errorResponse(null, AcpErrorCode.ParseError, err instanceof Error ? err.message : String(err)))\n continue\n }\n if (!parsed)\n break\n buffer = parsed.rest\n void handleParsed(parsed.message)\n }\n }\n\n const onError = (err: Error): void => {\n options.onError?.(err)\n }\n\n return {\n start() {\n options.input.on('data', onData)\n options.input.on('error', onError)\n },\n close() {\n closed = true\n options.input.off('data', onData)\n options.input.off('error', onError)\n for (const request of pending.values())\n request.reject(new JsonRpcConnectionClosedError())\n pending.clear()\n },\n sendNotification(method: string, params?: unknown) {\n writeMessage({ jsonrpc: '2.0', method, ...(params !== undefined ? { params } : {}) })\n },\n sendRequest(method: string, params?: unknown) {\n if (closed)\n return Promise.reject(new Error('JSON-RPC connection is closed.'))\n const id = nextId++\n writeMessage({ jsonrpc: '2.0', id, method, ...(params !== undefined ? { params } : {}) })\n return new Promise((resolve, reject) => {\n pending.set(id, { resolve, reject })\n })\n },\n }\n}\n\n/**\n * The transport closed while requests were in flight. Distinct from\n * {@link JsonRpcRemoteError} because it is not a reply — nothing on the other\n * side said anything — and callers must be able to tell \"the daemon rejected\n * this\" from \"the daemon went away\" without parsing a message string. Every\n * pending request is rejected with one of these on `close()`.\n */\nexport class JsonRpcConnectionClosedError extends Error {\n constructor() {\n super('JSON-RPC connection closed.')\n this.name = 'JsonRpcConnectionClosedError'\n }\n}\n\nexport class JsonRpcRemoteError extends Error {\n constructor(message: string, readonly code: number, readonly data?: unknown) {\n super(message)\n this.name = 'JsonRpcRemoteError'\n }\n}\n\nexport function successResponse(id: JsonRpcId, result: unknown = {}): JsonRpcResponse {\n return { jsonrpc: '2.0', id, result }\n}\n\nexport function errorResponse(id: JsonRpcId, code: number, message: string, data?: unknown): JsonRpcFailure {\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code,\n message,\n ...(data !== undefined ? { data } : {}),\n },\n }\n}\n\nfunction readNextMessage(input: Buffer<ArrayBufferLike>): { message: unknown, rest: Buffer<ArrayBufferLike> } | null {\n if (input.length === 0)\n return null\n\n const headerEnd = input.indexOf('\\r\\n\\r\\n')\n if (headerEnd >= 0) {\n const header = input.subarray(0, headerEnd).toString('utf8')\n const match = /^Content-Length:\\s*(\\d+)/im.exec(header)\n if (!match)\n return readLineMessage(input)\n const length = Number(match[1])\n const bodyStart = headerEnd + 4\n const bodyEnd = bodyStart + length\n if (input.length < bodyEnd)\n return null\n const body = input.subarray(bodyStart, bodyEnd).toString('utf8')\n return { message: JSON.parse(body), rest: input.subarray(bodyEnd) }\n }\n\n if (/^Content-Length:/i.test(input.subarray(0, Math.min(input.length, 32)).toString('utf8')))\n return null\n\n return readLineMessage(input)\n}\n\nfunction readLineMessage(input: Buffer<ArrayBufferLike>): { message: unknown, rest: Buffer<ArrayBufferLike> } | null {\n let rest = input\n // Skip blank lines: NDJSON streams may contain stray newlines (e.g. a keep-\n // alive or a trailing separator). Emitting an error for those would be wrong.\n for (;;) {\n const lineEnd = rest.indexOf('\\n')\n if (lineEnd < 0)\n return null\n const line = rest.subarray(0, lineEnd).toString('utf8').trim()\n rest = rest.subarray(lineEnd + 1)\n if (line.length === 0)\n continue\n return { message: JSON.parse(line), rest }\n }\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger--C1VQjwJ.js","names":[],"sources":["../src/logger.ts"],"sourcesContent":["/**\n * Structured logging primitive with auto-correlation.\n *\n * Every consumer of the harness used to roll its own logger; the TUI has\n * one, downstream apps have theirs, observability backends each want a\n * slightly different shape. This module ships the smallest reasonable\n * shared surface:\n *\n * - {@link Logger} — minimal level-tagged interface (`debug` / `info` /\n * `warn` / `error`) plus a `with(...)` method that returns a child\n * logger carrying baseline attributes (`runId`, `turnId`, `callId`,\n * `childId`, `depth`, anything you want).\n * - {@link createLogger} — builds a Logger from a {@link LogSink}.\n * - {@link consoleSink} / {@link jsonSink} — built-in sinks that cover\n * the common cases (human-readable to a terminal vs. one JSON object\n * per line to a log aggregator).\n * - {@link createLoggingHooks} — installs Logger-attached hook handlers\n * on an agent so every lifecycle event lands on the sink with the\n * right correlation ids already stamped in.\n *\n * Hosts that already own a logger (pino, winston, structlog binding,\n * platform-native) plug it in via a custom {@link LogSink} — the helper\n * itself does no I/O.\n */\n\nimport type { Hookable } from 'hookable'\nimport type { WriteStream } from 'node:fs'\nimport type { AgentHooks } from './agent'\nimport { createWriteStream, mkdirSync } from 'node:fs'\nimport { dirname } from 'node:path'\n\n// `formatLogLine` lives in the node-free `chat/logs-view` so the Electron\n// renderer's Logs tab can share it without pulling this module's `node:fs`\n// sinks (and, through the root barrel, the whole agent) into a browser bundle.\nimport { formatLogLine } from './chat/logs-view'\n\n// ---------------------------------------------------------------------------\n// Core types\n// ---------------------------------------------------------------------------\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error'\n\nexport interface LogRecord {\n level: LogLevel\n /** Unix ms — set by `Logger` at emit time. */\n timestamp: number\n /** Free-form message. Sinks render this as the human-facing line. */\n message: string\n /** Structured fields. Correlation ids land here automatically. */\n attrs: Record<string, unknown>\n}\n\nexport interface LogSink {\n emit: (record: LogRecord) => void\n}\n\nexport interface Logger {\n debug: (message: string, attrs?: Record<string, unknown>) => void\n info: (message: string, attrs?: Record<string, unknown>) => void\n warn: (message: string, attrs?: Record<string, unknown>) => void\n error: (message: string, attrs?: Record<string, unknown>) => void\n /**\n * Returns a child logger that prepends the given attributes onto every\n * subsequent emit. Equivalent to `pino.child` / `winston.child`. The\n * parent and child share the same sink — children are zero-cost.\n */\n with: (extra: Record<string, unknown>) => Logger\n /**\n * Inspectable baseline attributes — handy for tests and for hook\n * handlers that want to clone-with-extra without recursing.\n */\n readonly baseAttributes: Readonly<Record<string, unknown>>\n}\n\n// ---------------------------------------------------------------------------\n// createLogger\n// ---------------------------------------------------------------------------\n\n/**\n * Build a Logger from a sink. Stateless and cheap; create one per agent\n * (or per app) and use `.with()` to attach correlation ids per-call.\n */\nexport function createLogger(\n sink: LogSink,\n baseAttributes: Readonly<Record<string, unknown>> = {},\n): Logger {\n function emit(level: LogLevel, message: string, attrs?: Record<string, unknown>): void {\n try {\n sink.emit({\n level,\n timestamp: Date.now(),\n message,\n attrs: attrs ? { ...baseAttributes, ...attrs } : { ...baseAttributes },\n })\n }\n catch {\n // Sinks should never crash the run.\n }\n }\n\n return {\n debug: (m, a) => emit('debug', m, a),\n info: (m, a) => emit('info', m, a),\n warn: (m, a) => emit('warn', m, a),\n error: (m, a) => emit('error', m, a),\n with: extra => createLogger(sink, { ...baseAttributes, ...extra }),\n baseAttributes,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Built-in sinks\n// ---------------------------------------------------------------------------\n\nexport interface ConsoleSinkOptions {\n /**\n * Minimum level to emit. Defaults to `'info'` — `debug` is dropped so\n * the harness's lifecycle logging is not noisy by default. Set to\n * `'debug'` to see every event.\n */\n minLevel?: LogLevel\n /** Custom output stream. Defaults to `process.stderr` so logs don't pollute stdout. */\n stream?: { write: (chunk: string) => void }\n}\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n}\n\nexport { formatLogLine }\n\n/**\n * Human-readable terminal sink. Renders each record as\n * `<ISO timestamp> <LEVEL> <message> <attrs as kv pairs>`.\n *\n * Honors `process.stderr` by default so log lines don't interleave with\n * the agent's stdout-bound output (chat responses, JSON results).\n */\nexport function consoleSink(options: ConsoleSinkOptions = {}): LogSink {\n const min = LEVEL_ORDER[options.minLevel ?? 'info']\n const stream = options.stream ?? process.stderr\n return {\n emit(record) {\n if (LEVEL_ORDER[record.level] < min)\n return\n stream.write(`${formatLogLine(record)}\\n`)\n },\n }\n}\n\n/**\n * One-JSON-object-per-line sink. Suitable for piping into log aggregators\n * (Datadog Agent, Fluent Bit, Loki, Vector) that expect JSONL.\n */\nexport function jsonSink(options: ConsoleSinkOptions = {}): LogSink {\n const min = LEVEL_ORDER[options.minLevel ?? 'info']\n const stream = options.stream ?? process.stderr\n return {\n emit(record) {\n if (LEVEL_ORDER[record.level] < min)\n return\n try {\n stream.write(`${JSON.stringify(record)}\\n`)\n }\n catch {\n // Non-serializable attr (cycle, BigInt, etc.). Skip rather than throw.\n }\n },\n }\n}\n\n/**\n * Fan a single record out to several sinks. Each sink's `emit` is guarded\n * so one throwing sink can't starve the others (mirrors `createLogger`'s\n * \"a sink must never crash the run\" contract).\n */\nexport function fanoutSink(sinks: readonly LogSink[]): LogSink {\n return {\n emit(record) {\n for (const sink of sinks) {\n try {\n sink.emit(record)\n }\n catch {\n // A misbehaving sink must not block its siblings.\n }\n }\n },\n }\n}\n\n/** Live handle over a {@link createRingBufferSink} — the read side the logs viewer consumes. */\nexport interface RingBufferSink extends LogSink {\n /** The buffered records, oldest first — the live array, so treat it as read-only. Bounded by `capacity`. */\n getRecords: () => readonly LogRecord[]\n /**\n * Subscribe to appends. The callback fires after each retained record is\n * pushed. Returns an unsubscribe fn. Used by the TUI logs viewer to\n * re-render on new lines without polling.\n */\n subscribe: (listener: () => void) => () => void\n}\n\nexport interface RingBufferSinkOptions {\n /** Max records retained; oldest are evicted past this. Default 2000. */\n capacity?: number\n /** Minimum level to retain. Default `'debug'` (retain everything). */\n minLevel?: LogLevel\n}\n\n/**\n * In-memory bounded log buffer backing the in-TUI logs viewer. Always\n * capturing and never touches I/O, so it's safe on the logging hot path.\n * Retains the most recent `capacity` records, dropping the oldest on\n * overflow. Kept simple (a plain array trimmed with `splice`) — TUI log\n * volume is low, so a true head-indexed ring isn't worth the complexity.\n */\nexport function createRingBufferSink(options: RingBufferSinkOptions = {}): RingBufferSink {\n const capacity = Math.max(1, options.capacity ?? 2000)\n const min = LEVEL_ORDER[options.minLevel ?? 'debug']\n const records: LogRecord[] = []\n const listeners = new Set<() => void>()\n return {\n emit(record) {\n if (LEVEL_ORDER[record.level] < min)\n return\n records.push(record)\n if (records.length > capacity)\n records.splice(0, records.length - capacity)\n for (const listener of listeners) {\n try {\n listener()\n }\n catch {\n // A viewer re-render callback must not break log capture.\n }\n }\n },\n getRecords: () => records,\n subscribe(listener) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n }\n}\n\n/** A file sink plus a `close()` for best-effort flush on teardown. */\nexport interface FileSink extends LogSink {\n /** Flush + close the underlying stream. Idempotent. */\n close: () => void\n}\n\nexport interface FileSinkOptions {\n /** Absolute path to the log file. Parent dirs are created lazily. */\n path: string\n /** Minimum level to write. Default `'debug'`. */\n minLevel?: LogLevel\n /**\n * Live gate. When it returns false the sink is fully inert — no dir, no\n * file, no I/O — so an opt-in setting can flip logging on mid-session\n * without a relaunch. Default: always enabled.\n */\n enabled?: () => boolean\n}\n\n/**\n * Append-mode file sink. The parent directory and the write stream are\n * opened lazily on the first record that passes the `enabled()` gate +\n * `minLevel`, so a disabled sink never creates the file. Writes are\n * buffered by the stream (no sync I/O per log). A single open failure\n * disables the sink rather than throwing on the logging path.\n */\nexport function createFileSink(options: FileSinkOptions): FileSink {\n const min = LEVEL_ORDER[options.minLevel ?? 'debug']\n const enabled = options.enabled ?? (() => true)\n let stream: WriteStream | null = null\n let failed = false\n const open = (): WriteStream | null => {\n if (stream || failed)\n return stream\n try {\n mkdirSync(dirname(options.path), { recursive: true })\n stream = createWriteStream(options.path, { flags: 'a' })\n return stream\n }\n catch {\n // Unwritable path (permissions, read-only FS) — disable rather than\n // retry the mkdir/open on every subsequent log line.\n failed = true\n return null\n }\n }\n return {\n emit(record) {\n if (failed || LEVEL_ORDER[record.level] < min || !enabled())\n return\n const s = open()\n if (!s)\n return\n try {\n s.write(`${formatLogLine(record)}\\n`)\n }\n catch {\n // Disk full / stream closed — stop trying rather than throw per-line.\n failed = true\n }\n },\n close() {\n if (stream) {\n try {\n stream.end()\n }\n catch {\n // Already-destroyed stream — nothing to flush.\n }\n stream = null\n }\n },\n }\n}\n\n/**\n * Filesystem-safe timestamp for a per-session log filename. ISO 8601 with\n * `:` (illegal on Windows / awkward in shells) swapped for `-` and the\n * fractional millis dropped, e.g. `2026-07-01T10-34-14`.\n */\nexport function logFileTimestamp(date: Date = new Date()): string {\n return date.toISOString().replace(/\\.\\d+Z$/, '').replace(/:/g, '-')\n}\n\n// ---------------------------------------------------------------------------\n// createLoggingHooks\n// ---------------------------------------------------------------------------\n\nexport interface LoggingHooksOptions {\n logger: Logger\n /**\n * Minimum interesting level for harness-emitted lines. Default `'info'`.\n * Set to `'debug'` to see every tool dispatch / stream event. Set to\n * `'warn'` to mute the chatty ones and only see failures + budgets.\n */\n level?: LogLevel\n /**\n * When true (default), lifecycle events (`agent:start`, `turn:before`,\n * `tool:before`, `mcp:bootstrap:start`) emit at `debug` level so they\n * stay quiet by default. Set false to mute them entirely regardless of\n * the configured minimum level — useful when piping into a tracer\n * that already captures lifecycle.\n */\n includeLifecycle?: boolean\n}\n\nexport interface LoggingHookSet {\n install: (hooks: Hookable<AgentHooks>) => () => void\n}\n\n/**\n * Install a bundle of hook handlers that emit a structured line per\n * relevant lifecycle event, automatically attaching correlation ids\n * (`runId`, `turnId`, `callId`, `childId`, `depth`, `agentName`).\n *\n * @example\n * ```ts\n * const logger = createLogger(consoleSink({ minLevel: 'debug' }), { service: 'tui' })\n * const lh = createLoggingHooks({ logger })\n * const uninstall = lh.install(agent.hooks)\n * try { await agent.run({ prompt }) }\n * finally { uninstall() }\n * ```\n */\nexport function createLoggingHooks(options: LoggingHooksOptions): LoggingHookSet {\n const root = options.logger\n const includeLifecycle = options.includeLifecycle ?? true\n const minLevel = LEVEL_ORDER[options.level ?? 'info']\n\n /**\n * Wrap a Logger so emissions below `minLevel` are dropped before they\n * hit the sink. Lets us gate harness chatter without forcing every\n * `LogSink` to re-implement level filtering. Preserves `.with()`\n * composition (children inherit the filter).\n */\n function gateLevel(logger: Logger): Logger {\n const skip = (level: LogLevel): boolean => LEVEL_ORDER[level] < minLevel\n const wrap = (l: Logger): Logger => ({\n debug: (m, a) => {\n if (!skip('debug'))\n l.debug(m, a)\n },\n info: (m, a) => {\n if (!skip('info'))\n l.info(m, a)\n },\n warn: (m, a) => {\n if (!skip('warn'))\n l.warn(m, a)\n },\n error: (m, a) => {\n if (!skip('error'))\n l.error(m, a)\n },\n with: extra => wrap(l.with(extra)),\n baseAttributes: l.baseAttributes,\n })\n return wrap(logger)\n }\n\n return {\n install(hooks: Hookable<AgentHooks>): () => void {\n const unregisters: Array<() => void> = []\n // Per-install loggers, refreshed on `agent:start` / `turn:before`.\n // Scoped INSIDE install() so concurrent installs across different\n // agents don't share state — each call to `install()` gets its own\n // attribution state.\n const gatedRoot = gateLevel(root)\n let runLogger = gatedRoot\n let turnLogger = gatedRoot\n\n // ---- Agent lifecycle --------------------------------------------\n\n unregisters.push(hooks.hook('agent:start', (ctx) => {\n runLogger = gatedRoot.with({\n runId: ctx.runId,\n ...(ctx.parentRunId ? { parentRunId: ctx.parentRunId } : {}),\n depth: ctx.depth,\n ...(ctx.agentName ? { agentName: ctx.agentName } : {}),\n })\n turnLogger = runLogger\n if (includeLifecycle)\n runLogger.debug('agent run started')\n }))\n\n unregisters.push(hooks.hook('agent:done', (stats) => {\n runLogger.info('agent run completed', {\n turns: stats.turns,\n totalIn: stats.totalIn,\n totalOut: stats.totalOut,\n ...(typeof stats.cost === 'number' ? { cost: stats.cost } : {}),\n elapsedMs: stats.elapsed,\n ...(typeof stats.timeTillFirstTokenMs === 'number' ? { ttftMs: stats.timeTillFirstTokenMs } : {}),\n })\n }))\n\n unregisters.push(hooks.hook('agent:abort', () => {\n runLogger.warn('agent run aborted')\n }))\n\n // ---- Turn / stream ---------------------------------------------\n\n unregisters.push(hooks.hook('turn:before', (ctx) => {\n turnLogger = runLogger.with({ turnId: ctx.turnId, turn: ctx.turn })\n if (includeLifecycle)\n turnLogger.debug('turn started')\n }))\n\n unregisters.push(hooks.hook('turn:after', (ctx) => {\n turnLogger.debug('turn ended', {\n inputTokens: ctx.usage.input,\n outputTokens: ctx.usage.output,\n ...(ctx.usage.finishReason ? { finishReason: ctx.usage.finishReason } : {}),\n ...(ctx.usage.modelId ? { modelId: ctx.usage.modelId } : {}),\n ...(typeof ctx.usage.timeToFirstTokenMs === 'number' ? { ttftMs: ctx.usage.timeToFirstTokenMs } : {}),\n })\n }))\n\n unregisters.push(hooks.hook('stream:error', (ctx) => {\n turnLogger.error('stream error', {\n message: ctx.err instanceof Error ? ctx.err.message : String(ctx.err),\n ...(ctx.statusCode !== undefined ? { statusCode: ctx.statusCode } : {}),\n ...(ctx.requestId !== undefined ? { requestId: ctx.requestId } : {}),\n })\n }))\n\n // ---- Tool calls -------------------------------------------------\n\n unregisters.push(hooks.hook('tool:before', (ctx) => {\n if (!includeLifecycle)\n return\n turnLogger.debug('tool started', {\n toolName: ctx.name,\n displayName: ctx.displayName,\n callId: ctx.callId,\n })\n }))\n\n unregisters.push(hooks.hook('tool:after', (ctx) => {\n if (!includeLifecycle)\n return\n turnLogger.debug('tool ended', {\n toolName: ctx.name,\n callId: ctx.callId,\n outputBytes: ctx.outputBytes,\n })\n }))\n\n unregisters.push(hooks.hook('tool:error', (ctx) => {\n turnLogger.error('tool error', {\n toolName: ctx.name,\n callId: ctx.callId,\n message: ctx.error.message,\n })\n }))\n\n unregisters.push(hooks.hook('tool:dispatched', (ctx) => {\n // Successful + gate-substitute paths are routine — only log at\n // debug level. The three \"something refused / went wrong\" paths\n // (gate-block, unknown tool, invalid input) land at warn so they\n // surface in default-config dashboards without forcing debug.\n const isAnomaly = ctx.outcome === 'gate-block'\n || ctx.outcome === 'unknown'\n || ctx.outcome === 'invalid-input'\n if (!isAnomaly && !includeLifecycle)\n return\n const lvl: LogLevel = isAnomaly ? 'warn' : 'debug'\n turnLogger[lvl]('tool dispatched', {\n toolName: ctx.name,\n callId: ctx.callId,\n outcome: ctx.outcome,\n ...(ctx.reason ? { reason: ctx.reason } : {}),\n })\n }))\n\n unregisters.push(hooks.hook('validation:reject', (ctx) => {\n turnLogger.warn('tool input rejected', {\n toolName: ctx.name,\n callId: ctx.callId,\n reason: ctx.reason,\n })\n }))\n\n // ---- Budgets ----------------------------------------------------\n\n unregisters.push(hooks.hook('budget:exceeded', (ctx) => {\n turnLogger.warn('byte budget exceeded', {\n bytes: ctx.bytes,\n budget: ctx.budget,\n })\n }))\n\n unregisters.push(hooks.hook('tool-budget:exceeded', (ctx) => {\n turnLogger.warn('tool budget exceeded', {\n toolName: ctx.tool,\n count: ctx.count,\n max: ctx.max,\n mode: ctx.mode,\n })\n }))\n\n // ---- MCP --------------------------------------------------------\n\n unregisters.push(hooks.hook('mcp:bootstrap:end', (ctx) => {\n if (ctx.ok) {\n if (includeLifecycle) {\n runLogger.debug('mcp bootstrap ok', {\n server: ctx.name,\n transport: ctx.transport,\n durationMs: ctx.durationMs,\n toolCount: ctx.toolCount,\n ...(ctx.lazy ? { lazy: true } : {}),\n ...(ctx.cached ? { cached: true } : {}),\n })\n }\n }\n else {\n runLogger.warn('mcp bootstrap failed', {\n server: ctx.name,\n transport: ctx.transport,\n durationMs: ctx.durationMs,\n message: ctx.error.message,\n })\n }\n }))\n\n unregisters.push(hooks.hook('mcp:error', (ctx) => {\n runLogger.error('mcp error', {\n server: ctx.name,\n message: ctx.error.message,\n })\n }))\n\n unregisters.push(hooks.hook('mcp:warn', (ctx) => {\n runLogger.warn('mcp warn', {\n server: ctx.name,\n message: ctx.message,\n })\n }))\n\n unregisters.push(hooks.hook('mcp:auth:required', (ctx) => {\n runLogger.warn('mcp auth required', {\n server: ctx.name,\n transport: ctx.transport,\n reason: ctx.reason,\n })\n }))\n\n unregisters.push(hooks.hook('mcp:tool:error', (ctx) => {\n turnLogger.error('mcp tool error', {\n server: ctx.server,\n tool: ctx.displayName,\n callId: ctx.callId,\n message: ctx.error.message,\n })\n }))\n\n // ---- Spawn ------------------------------------------------------\n\n unregisters.push(hooks.hook('spawn:before', (ctx) => {\n if (!includeLifecycle)\n return\n runLogger.debug('spawn started', {\n childId: ctx.id,\n depth: ctx.depth,\n })\n }))\n\n unregisters.push(hooks.hook('spawn:complete', (ctx) => {\n runLogger.info('spawn completed', {\n childId: ctx.id,\n ...(ctx.depth ? { depth: ctx.depth } : {}),\n status: ctx.status ?? 'completed',\n turns: ctx.stats.turns,\n totalIn: ctx.stats.totalIn,\n totalOut: ctx.stats.totalOut,\n ...(typeof ctx.stats.cost === 'number' ? { cost: ctx.stats.cost } : {}),\n })\n }))\n\n unregisters.push(hooks.hook('spawn:error', (ctx) => {\n runLogger.error('spawn error', {\n childId: ctx.id,\n ...(ctx.depth ? { depth: ctx.depth } : {}),\n message: ctx.error.message,\n })\n }))\n\n // -----------------------------------------------------------------\n // Disposal\n // -----------------------------------------------------------------\n\n let disposed = false\n return function uninstall() {\n if (disposed)\n return\n disposed = true\n for (const un of unregisters) {\n try {\n un()\n }\n catch { /* ignore */ }\n }\n }\n },\n }\n}\n"],"mappings":"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"}
|