@astralyn/pi 0.87.5 → 0.99.0
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/CHANGELOG.md +51 -6
- package/README.md +3 -3
- package/dist/bun/runtime-setup.js +4 -1
- package/dist/bun/runtime-setup.js.map +1 -1
- package/dist/bundle/chunks/anthropic-messages-KIXY7EDT.js +6 -0
- package/dist/bundle/chunks/anthropic.js +2 -2
- package/dist/bundle/chunks/azure-openai-responses-RPBERDXD.js +2 -0
- package/dist/bundle/chunks/bedrock-converse-stream.js +8 -8
- package/dist/bundle/chunks/{chunk-LPQCB2VJ.js → chunk-A576H74Y.js} +2 -2
- package/dist/bundle/chunks/{chunk-NW5FIDD7.js → chunk-ABVRAYXT.js} +3 -3
- package/dist/bundle/chunks/{chunk-I5IVW2WS.js → chunk-CLLDCO64.js} +1 -1
- package/dist/bundle/chunks/chunk-DEWXBB6W.js +2 -0
- package/dist/bundle/chunks/chunk-G4RY3GN7.js +11 -0
- package/dist/bundle/chunks/chunk-GCKVOFWP.js +2 -0
- package/dist/bundle/chunks/chunk-MPDALHNJ.js +2 -0
- package/dist/bundle/chunks/chunk-OO6DJ3CL.js +31 -0
- package/dist/bundle/chunks/{chunk-EWLAVDVN.js → chunk-VW2P3X6P.js} +921 -293
- package/dist/bundle/chunks/chunk-VWCWZD6E.js +2 -0
- package/dist/bundle/chunks/cloudflare-workers-ai-system-one-ZYSAFXXL.js +2 -0
- package/dist/bundle/chunks/codemode-worker.js +295 -0
- package/dist/bundle/chunks/github-copilot.js +1 -1
- package/dist/bundle/chunks/google-generative-ai-SDNQVVXA.js +2 -0
- package/dist/bundle/chunks/google-vertex-LZXOLBIO.js +2 -0
- package/dist/bundle/chunks/llama-cpp-classify-7IYGGPND.js +22 -0
- package/dist/bundle/chunks/meta.js +2 -0
- package/dist/bundle/chunks/mistral-conversations-VYKPSSAM.js +5 -0
- package/dist/bundle/chunks/openai-chatgpt.js +75 -0
- package/dist/bundle/chunks/openai-codex-responses-HZ4VUDXD.js +10 -0
- package/dist/bundle/chunks/openai-codex.js +2 -2
- package/dist/bundle/chunks/openai-completions-SKDGF6OE.js +7 -0
- package/dist/bundle/chunks/openai-responses-FPML4SSG.js +3 -0
- package/dist/bundle/chunks/{openrouter-images-6XDE2CEW.js → openrouter-images-5524IQHX.js} +1 -1
- package/dist/bundle/chunks/openrouter.js +2 -2
- package/dist/bundle/chunks/{pi-messages-MQMPIPNC.js → pi-messages-HZZ7GEEW.js} +2 -2
- package/dist/bundle/chunks/radius.js +2 -2
- package/dist/bundle/chunks/typesafe-system-one-Z2CDLKEY.js +2 -0
- package/dist/bundle/chunks/virtual-modules-TQRORWJQ.js +2 -0
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +4 -3
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +38 -30
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/config.d.ts +18 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +30 -4
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +13 -13
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +2 -2
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +14 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +107 -58
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +505 -298
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bug-report.js +1 -1
- package/dist/core/bug-report.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +1 -22
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/utils.d.ts +2 -1
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js +25 -18
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/context-snapshot.d.ts +17 -4
- package/dist/core/context-snapshot.d.ts.map +1 -1
- package/dist/core/context-snapshot.js +48 -50
- package/dist/core/context-snapshot.js.map +1 -1
- package/dist/core/crash-log.d.ts.map +1 -1
- package/dist/core/crash-log.js +2 -1
- package/dist/core/crash-log.js.map +1 -1
- package/dist/core/export-html/template.css +10 -0
- package/dist/core/export-html/template.js +66 -17
- package/dist/core/extensions/distribution-api.d.ts +1 -8
- package/dist/core/extensions/distribution-api.d.ts.map +1 -1
- package/dist/core/extensions/distribution-api.js +6 -6
- package/dist/core/extensions/distribution-api.js.map +1 -1
- package/dist/core/extensions/index.d.ts +3 -3
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +58 -7
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +22 -3
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +124 -8
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +306 -30
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts +2 -2
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js +3 -3
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/keybindings.d.ts +40 -5
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +10 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/mcp-servers.d.ts +98 -0
- package/dist/core/mcp-servers.d.ts.map +1 -0
- package/dist/core/mcp-servers.js +158 -0
- package/dist/core/mcp-servers.js.map +1 -0
- package/dist/core/model-registry.d.ts +13 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +25 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +2 -2
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +5 -5
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +41 -3
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +167 -17
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/nested-tool-calls.d.ts +102 -0
- package/dist/core/nested-tool-calls.d.ts.map +1 -0
- package/dist/core/nested-tool-calls.js +177 -0
- package/dist/core/nested-tool-calls.js.map +1 -0
- package/dist/core/package-manager.d.ts +4 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +58 -12
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/provider-composer.d.ts +40 -21
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +92 -40
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts +8 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +18 -3
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resource-loader.d.ts +7 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +160 -35
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts +3 -3
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +84 -14
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +9 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +22 -22
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +36 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +108 -2
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/source-info.d.ts +8 -0
- package/dist/core/source-info.d.ts.map +1 -1
- package/dist/core/source-info.js +16 -0
- package/dist/core/source-info.js.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tasks/delivery.d.ts +40 -0
- package/dist/core/tasks/delivery.d.ts.map +1 -0
- package/dist/core/tasks/delivery.js +157 -0
- package/dist/core/tasks/delivery.js.map +1 -0
- package/dist/core/tasks/history.d.ts +4 -0
- package/dist/core/tasks/history.d.ts.map +1 -0
- package/dist/core/{background → tasks}/history.js +24 -48
- package/dist/core/tasks/history.js.map +1 -0
- package/dist/core/{background → tasks}/output.d.ts +4 -4
- package/dist/core/tasks/output.d.ts.map +1 -0
- package/dist/core/{background → tasks}/output.js +11 -11
- package/dist/core/tasks/output.js.map +1 -0
- package/dist/core/tasks/presentation.d.ts +9 -0
- package/dist/core/tasks/presentation.d.ts.map +1 -0
- package/dist/core/{background → tasks}/presentation.js +53 -51
- package/dist/core/tasks/presentation.js.map +1 -0
- package/dist/core/{background/service.d.ts → tasks/runtime.d.ts} +22 -23
- package/dist/core/tasks/runtime.d.ts.map +1 -0
- package/dist/core/{background/service.js → tasks/runtime.js} +154 -198
- package/dist/core/tasks/runtime.js.map +1 -0
- package/dist/core/tasks/session.d.ts +49 -0
- package/dist/core/tasks/session.d.ts.map +1 -0
- package/dist/core/tasks/session.js +129 -0
- package/dist/core/tasks/session.js.map +1 -0
- package/dist/core/tasks/store.d.ts +32 -0
- package/dist/core/tasks/store.d.ts.map +1 -0
- package/dist/core/tasks/store.js +135 -0
- package/dist/core/tasks/store.js.map +1 -0
- package/dist/core/{background → tasks}/types.d.ts +80 -62
- package/dist/core/tasks/types.d.ts.map +1 -0
- package/dist/core/{background → tasks}/types.js +9 -9
- package/dist/core/tasks/types.js.map +1 -0
- package/dist/core/tasks/view-data.d.ts +8 -0
- package/dist/core/tasks/view-data.d.ts.map +1 -0
- package/dist/core/tasks/view-data.js +61 -0
- package/dist/core/tasks/view-data.js.map +1 -0
- package/dist/core/tasks/view.d.ts +30 -0
- package/dist/core/tasks/view.d.ts.map +1 -0
- package/dist/core/tasks/view.js +50 -0
- package/dist/core/tasks/view.js.map +1 -0
- package/dist/core/tools/bash.d.ts +8 -95
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +8 -240
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +0 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +2 -0
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +2 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +2 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +9 -0
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +0 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +11 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +36 -0
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/powershell.d.ts +6 -2
- package/dist/core/tools/powershell.d.ts.map +1 -1
- package/dist/core/tools/powershell.js +1 -1
- package/dist/core/tools/powershell.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +0 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +6 -7
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +26 -11
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/renderers/bash.d.ts +1 -1
- package/dist/core/tools/renderers/bash.d.ts.map +1 -1
- package/dist/core/tools/renderers/bash.js +65 -12
- package/dist/core/tools/renderers/bash.js.map +1 -1
- package/dist/core/tools/renderers/edit.d.ts.map +1 -1
- package/dist/core/tools/renderers/edit.js +4 -22
- package/dist/core/tools/renderers/edit.js.map +1 -1
- package/dist/core/tools/renderers/find.d.ts.map +1 -1
- package/dist/core/tools/renderers/find.js +7 -6
- package/dist/core/tools/renderers/find.js.map +1 -1
- package/dist/core/tools/renderers/grep.d.ts.map +1 -1
- package/dist/core/tools/renderers/grep.js +8 -7
- package/dist/core/tools/renderers/grep.js.map +1 -1
- package/dist/core/tools/renderers/index.d.ts.map +1 -1
- package/dist/core/tools/renderers/index.js +5 -7
- package/dist/core/tools/renderers/index.js.map +1 -1
- package/dist/core/tools/renderers/ls.d.ts.map +1 -1
- package/dist/core/tools/renderers/ls.js +3 -2
- package/dist/core/tools/renderers/ls.js.map +1 -1
- package/dist/core/tools/renderers/read.d.ts.map +1 -1
- package/dist/core/tools/renderers/read.js +10 -14
- package/dist/core/tools/renderers/read.js.map +1 -1
- package/dist/core/tools/renderers/shell-task.d.ts +4 -0
- package/dist/core/tools/renderers/shell-task.d.ts.map +1 -0
- package/dist/core/tools/renderers/shell-task.js +35 -0
- package/dist/core/tools/renderers/shell-task.js.map +1 -0
- package/dist/core/tools/renderers/write.d.ts.map +1 -1
- package/dist/core/tools/renderers/write.js +3 -2
- package/dist/core/tools/renderers/write.js.map +1 -1
- package/dist/core/tools/shell-execution.d.ts +4 -5
- package/dist/core/tools/shell-execution.d.ts.map +1 -1
- package/dist/core/tools/shell-execution.js +19 -3
- package/dist/core/tools/shell-execution.js.map +1 -1
- package/dist/core/tools/shell-tool.d.ts +93 -0
- package/dist/core/tools/shell-tool.d.ts.map +1 -0
- package/dist/core/tools/shell-tool.js +251 -0
- package/dist/core/tools/shell-tool.js.map +1 -0
- package/dist/core/tools/tasks/actions.d.ts +12 -0
- package/dist/core/tools/tasks/actions.d.ts.map +1 -0
- package/dist/{extensions/background → core/tools/tasks}/actions.js +20 -19
- package/dist/core/tools/tasks/actions.js.map +1 -0
- package/dist/core/tools/tasks/constants.d.ts +24 -0
- package/dist/core/tools/tasks/constants.d.ts.map +1 -0
- package/dist/{extensions/background → core/tools/tasks}/constants.js +11 -9
- package/dist/core/tools/tasks/constants.js.map +1 -0
- package/dist/{extensions/background → core/tools/tasks}/schema.d.ts +6 -6
- package/dist/core/tools/tasks/schema.d.ts.map +1 -0
- package/dist/{extensions/background → core/tools/tasks}/schema.js +17 -17
- package/dist/core/tools/tasks/schema.js.map +1 -0
- package/dist/{extensions/background → core/tools/tasks}/types.d.ts +15 -17
- package/dist/core/tools/tasks/types.d.ts.map +1 -0
- package/dist/core/tools/tasks/types.js.map +1 -0
- package/dist/core/tools/tasks.d.ts +14 -0
- package/dist/core/tools/tasks.d.ts.map +1 -0
- package/dist/core/tools/tasks.js +40 -0
- package/dist/core/tools/tasks.js.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts +5 -8
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +4 -4
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/truncate.d.ts +14 -0
- package/dist/core/tools/truncate.d.ts.map +1 -1
- package/dist/core/tools/truncate.js +29 -0
- package/dist/core/tools/truncate.js.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +1 -0
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/core/usage-totals.d.ts +5 -3
- package/dist/core/usage-totals.d.ts.map +1 -1
- package/dist/core/usage-totals.js +27 -4
- package/dist/core/usage-totals.js.map +1 -1
- package/dist/core/virtual-models.d.ts +115 -0
- package/dist/core/virtual-models.d.ts.map +1 -0
- package/dist/core/virtual-models.js +117 -0
- package/dist/core/virtual-models.js.map +1 -0
- package/dist/extensions/codemode/execute.d.ts +16 -0
- package/dist/extensions/codemode/execute.d.ts.map +1 -0
- package/dist/extensions/codemode/execute.js +390 -0
- package/dist/extensions/codemode/execute.js.map +1 -0
- package/dist/extensions/codemode/execute.lazy.d.ts +3 -0
- package/dist/extensions/codemode/execute.lazy.d.ts.map +1 -0
- package/dist/extensions/codemode/execute.lazy.js +3 -0
- package/dist/extensions/codemode/execute.lazy.js.map +1 -0
- package/dist/extensions/codemode/index.d.ts +21 -0
- package/dist/extensions/codemode/index.d.ts.map +1 -0
- package/dist/extensions/codemode/index.js +36 -0
- package/dist/extensions/codemode/index.js.map +1 -0
- package/dist/extensions/codemode/renderer.d.ts +12 -0
- package/dist/extensions/codemode/renderer.d.ts.map +1 -0
- package/dist/extensions/codemode/renderer.js +119 -0
- package/dist/extensions/codemode/renderer.js.map +1 -0
- package/dist/extensions/codemode/search.d.ts +33 -0
- package/dist/extensions/codemode/search.d.ts.map +1 -0
- package/dist/extensions/codemode/search.js +117 -0
- package/dist/extensions/codemode/search.js.map +1 -0
- package/dist/extensions/codemode/tool.d.ts +122 -0
- package/dist/extensions/codemode/tool.d.ts.map +1 -0
- package/dist/extensions/codemode/tool.js +324 -0
- package/dist/extensions/codemode/tool.js.map +1 -0
- package/dist/extensions/codemode/worker.d.ts +7 -0
- package/dist/extensions/codemode/worker.d.ts.map +1 -0
- package/dist/extensions/codemode/worker.js +7 -0
- package/dist/extensions/codemode/worker.js.map +1 -0
- package/dist/extensions/deepwiki/schema.d.ts +1 -1
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +14 -12
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +65 -13
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/extensions/mcp/cli.d.ts +21 -0
- package/dist/extensions/mcp/cli.d.ts.map +1 -0
- package/dist/extensions/mcp/cli.js +485 -0
- package/dist/extensions/mcp/cli.js.map +1 -0
- package/dist/extensions/mcp/cli.lazy.d.ts +3 -0
- package/dist/extensions/mcp/cli.lazy.d.ts.map +1 -0
- package/dist/extensions/mcp/cli.lazy.js +3 -0
- package/dist/extensions/mcp/cli.lazy.js.map +1 -0
- package/dist/extensions/mcp/config.d.ts +70 -0
- package/dist/extensions/mcp/config.d.ts.map +1 -0
- package/dist/extensions/mcp/config.js +146 -0
- package/dist/extensions/mcp/config.js.map +1 -0
- package/dist/extensions/mcp/index.d.ts +52 -0
- package/dist/extensions/mcp/index.d.ts.map +1 -0
- package/dist/extensions/mcp/index.js +904 -0
- package/dist/extensions/mcp/index.js.map +1 -0
- package/dist/extensions/mcp/log.d.ts +16 -0
- package/dist/extensions/mcp/log.d.ts.map +1 -0
- package/dist/extensions/mcp/log.js +64 -0
- package/dist/extensions/mcp/log.js.map +1 -0
- package/dist/extensions/mcp/oauth.d.ts +94 -0
- package/dist/extensions/mcp/oauth.d.ts.map +1 -0
- package/dist/extensions/mcp/oauth.js +330 -0
- package/dist/extensions/mcp/oauth.js.map +1 -0
- package/dist/extensions/mcp/resources.d.ts +43 -0
- package/dist/extensions/mcp/resources.d.ts.map +1 -0
- package/dist/extensions/mcp/resources.js +262 -0
- package/dist/extensions/mcp/resources.js.map +1 -0
- package/dist/extensions/mcp/runtime.d.ts +96 -0
- package/dist/extensions/mcp/runtime.d.ts.map +1 -0
- package/dist/extensions/mcp/runtime.js +372 -0
- package/dist/extensions/mcp/runtime.js.map +1 -0
- package/dist/extensions/mcp/runtime.lazy.d.ts +3 -0
- package/dist/extensions/mcp/runtime.lazy.d.ts.map +1 -0
- package/dist/extensions/mcp/runtime.lazy.js +3 -0
- package/dist/extensions/mcp/runtime.lazy.js.map +1 -0
- package/dist/extensions/mcp/tools.d.ts +83 -0
- package/dist/extensions/mcp/tools.d.ts.map +1 -0
- package/dist/extensions/mcp/tools.js +233 -0
- package/dist/extensions/mcp/tools.js.map +1 -0
- package/dist/extensions/mcp/ui.d.ts +60 -0
- package/dist/extensions/mcp/ui.d.ts.map +1 -0
- package/dist/extensions/mcp/ui.js +166 -0
- package/dist/extensions/mcp/ui.js.map +1 -0
- package/dist/extensions/question/detail-pane.d.ts +12 -0
- package/dist/extensions/question/detail-pane.d.ts.map +1 -0
- package/dist/extensions/question/detail-pane.js +42 -0
- package/dist/extensions/question/detail-pane.js.map +1 -0
- package/dist/extensions/question/dialog.d.ts.map +1 -1
- package/dist/extensions/question/dialog.js +175 -105
- package/dist/extensions/question/dialog.js.map +1 -1
- package/dist/extensions/question/option-window.d.ts +26 -0
- package/dist/extensions/question/option-window.d.ts.map +1 -0
- package/dist/extensions/question/option-window.js +53 -0
- package/dist/extensions/question/option-window.js.map +1 -0
- package/dist/extensions/question/render-cache.d.ts +4 -4
- package/dist/extensions/question/render-cache.d.ts.map +1 -1
- package/dist/extensions/question/render-cache.js +10 -11
- package/dist/extensions/question/render-cache.js.map +1 -1
- package/dist/extensions/statusline/index.js +2 -2
- package/dist/extensions/statusline/index.js.map +1 -1
- package/dist/extensions/todo/index.d.ts.map +1 -1
- package/dist/extensions/todo/index.js +12 -8
- package/dist/extensions/todo/index.js.map +1 -1
- package/dist/extensions/todo/view.d.ts +3 -3
- package/dist/extensions/todo/view.d.ts.map +1 -1
- package/dist/extensions/todo/view.js +7 -6
- package/dist/extensions/todo/view.js.map +1 -1
- package/dist/extensions/tool-search/index.d.ts +12 -0
- package/dist/extensions/tool-search/index.d.ts.map +1 -0
- package/dist/extensions/tool-search/index.js +20 -0
- package/dist/extensions/tool-search/index.js.map +1 -0
- package/dist/extensions/tool-search/tool.d.ts +72 -0
- package/dist/extensions/tool-search/tool.d.ts.map +1 -0
- package/dist/extensions/tool-search/tool.js +208 -0
- package/dist/extensions/tool-search/tool.js.map +1 -0
- package/dist/index.d.ts +13 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +10 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +13 -3
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +3 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts +4 -4
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.js +8 -2
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +7 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +42 -3
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +1 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/pi-logo.d.ts +12 -0
- package/dist/modes/interactive/components/pi-logo.d.ts.map +1 -0
- package/dist/modes/interactive/components/pi-logo.js +25 -0
- package/dist/modes/interactive/components/pi-logo.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +28 -6
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/status-marker.d.ts +4 -4
- package/dist/modes/interactive/components/status-marker.js +4 -4
- package/dist/modes/interactive/components/status-marker.js.map +1 -1
- package/dist/modes/interactive/components/themed-text.d.ts +17 -0
- package/dist/modes/interactive/components/themed-text.d.ts.map +1 -0
- package/dist/modes/interactive/components/themed-text.js +28 -0
- package/dist/modes/interactive/components/themed-text.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +2 -4
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +221 -173
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/tasks/completion-render.d.ts +8 -0
- package/dist/modes/interactive/tasks/completion-render.d.ts.map +1 -0
- package/dist/{extensions/background → modes/interactive/tasks}/completion-render.js +33 -30
- package/dist/modes/interactive/tasks/completion-render.js.map +1 -0
- package/dist/modes/interactive/tasks/fallback-view.d.ts +4 -0
- package/dist/modes/interactive/tasks/fallback-view.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/fallback-view.js +27 -0
- package/dist/modes/interactive/tasks/fallback-view.js.map +1 -0
- package/dist/modes/interactive/tasks/index.d.ts +12 -0
- package/dist/modes/interactive/tasks/index.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/index.js +97 -0
- package/dist/modes/interactive/tasks/index.js.map +1 -0
- package/dist/modes/interactive/tasks/manager.d.ts +67 -0
- package/dist/modes/interactive/tasks/manager.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/manager.js +380 -0
- package/dist/modes/interactive/tasks/manager.js.map +1 -0
- package/dist/{extensions/background → modes/interactive/tasks}/render.d.ts +13 -13
- package/dist/modes/interactive/tasks/render.d.ts.map +1 -0
- package/dist/{extensions/background → modes/interactive/tasks}/render.js +18 -18
- package/dist/modes/interactive/tasks/render.js.map +1 -0
- package/dist/{extensions/background → modes/interactive/tasks}/task-view.d.ts +7 -7
- package/dist/modes/interactive/tasks/task-view.d.ts.map +1 -0
- package/dist/{extensions/background → modes/interactive/tasks}/task-view.js +4 -4
- package/dist/modes/interactive/tasks/task-view.js.map +1 -0
- package/dist/{extensions/background → modes/interactive/tasks}/text.d.ts +1 -1
- package/dist/modes/interactive/tasks/text.d.ts.map +1 -0
- package/dist/{extensions/background → modes/interactive/tasks}/text.js +1 -1
- package/dist/modes/interactive/tasks/text.js.map +1 -0
- package/dist/modes/interactive/tasks/viewport.d.ts +15 -0
- package/dist/modes/interactive/tasks/viewport.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/viewport.js +49 -0
- package/dist/modes/interactive/tasks/viewport.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +59 -72
- package/dist/modes/interactive/theme/light.json +57 -69
- package/dist/modes/interactive/theme/system-theme.d.ts +54 -0
- package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/system-theme.js +535 -0
- package/dist/modes/interactive/theme/system-theme.js.map +1 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts +46 -6
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +125 -47
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme-json.d.ts +1 -0
- package/dist/modes/interactive/theme/theme-json.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-json.js +3 -1
- package/dist/modes/interactive/theme/theme-json.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.json +7 -2
- package/dist/modes/interactive/theme/theme.d.ts +70 -39
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +247 -314
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/tool-view/chat.d.ts +20 -0
- package/dist/modes/interactive/tool-view/chat.d.ts.map +1 -0
- package/dist/modes/interactive/tool-view/chat.js +46 -0
- package/dist/modes/interactive/tool-view/chat.js.map +1 -0
- package/dist/modes/interactive/tool-view/fallback.d.ts +14 -0
- package/dist/modes/interactive/tool-view/fallback.d.ts.map +1 -0
- package/dist/modes/interactive/tool-view/fallback.js +55 -0
- package/dist/modes/interactive/tool-view/fallback.js.map +1 -0
- package/dist/modes/interactive/tool-view/style.d.ts +63 -0
- package/dist/modes/interactive/tool-view/style.d.ts.map +1 -0
- package/dist/modes/interactive/tool-view/style.js +83 -0
- package/dist/modes/interactive/tool-view/style.js.map +1 -0
- package/dist/modes/interactive/{components → tool-view}/tool-execution.d.ts +17 -24
- package/dist/modes/interactive/tool-view/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/{components → tool-view}/tool-execution.js +42 -116
- package/dist/modes/interactive/tool-view/tool-execution.js.map +1 -0
- package/dist/modes/interactive/tui-renderer.d.ts +2 -1
- package/dist/modes/interactive/tui-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/tui-renderer.js +1 -0
- package/dist/modes/interactive/tui-renderer.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +6 -6
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +12 -8
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +7 -9
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +10 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +6 -2
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +14 -17
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +5 -0
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/paths.d.ts +3 -3
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +5 -4
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/shell.d.ts +1 -3
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +3 -30
- package/dist/utils/shell.js.map +1 -1
- package/docs/bundled/README.md +22 -8
- package/docs/bundled/extensions/question.md +6 -5
- package/docs/bundled/extensions/statusline.md +2 -2
- package/docs/bundled/tasks.md +141 -0
- package/docs/bundled/tool-presentation.md +41 -31
- package/docs/custom-provider.md +44 -0
- package/docs/docs.json +10 -6
- package/docs/extensions.md +90 -90
- package/docs/index.md +2 -1
- package/docs/keybindings.md +19 -7
- package/docs/llama-cpp.md +12 -1
- package/docs/mcp.md +188 -0
- package/docs/models.md +35 -0
- package/docs/packages.md +4 -0
- package/docs/providers.md +6 -0
- package/docs/rpc.md +5 -3
- package/docs/sdk.md +26 -16
- package/docs/security.md +4 -0
- package/docs/session-format.md +18 -11
- package/docs/settings.md +26 -2
- package/docs/themes.md +27 -5
- package/docs/tui.md +20 -0
- package/docs/usage.md +61 -3
- package/docs/virtual-models.md +114 -0
- package/docs/windows.md +2 -0
- package/examples/README.md +1 -1
- package/examples/extensions/README.md +2 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +4 -4
- package/examples/extensions/debug-provider.ts +90 -0
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/jev-router.ts +113 -0
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/rpc-client.ts +1 -1
- package/examples/rpc-extension-ui.ts +1 -1
- package/examples/sdk/14-codemode-mcp.ts +61 -0
- package/examples/sdk/README.md +1 -0
- package/npm-shrinkwrap.json +409 -423
- package/package.json +13 -10
- package/dist/bundle/chunks/anthropic-messages-XWFTZP2N.js +0 -6
- package/dist/bundle/chunks/azure-openai-responses-HS35BQV6.js +0 -2
- package/dist/bundle/chunks/chunk-2IO5GDBS.js +0 -11
- package/dist/bundle/chunks/chunk-APQ4ACY3.js +0 -2
- package/dist/bundle/chunks/chunk-EDBLK2JQ.js +0 -2
- package/dist/bundle/chunks/chunk-NUHFSC37.js +0 -25
- package/dist/bundle/chunks/google-generative-ai-NOVAJBFC.js +0 -2
- package/dist/bundle/chunks/google-vertex-4VHCZJV5.js +0 -2
- package/dist/bundle/chunks/mistral-conversations-WC6A2WCJ.js +0 -5
- package/dist/bundle/chunks/openai-codex-responses-XCDG75W2.js +0 -10
- package/dist/bundle/chunks/openai-completions-SHS3CAEL.js +0 -7
- package/dist/bundle/chunks/openai-responses-UT6XFKC7.js +0 -2
- package/dist/bundle/chunks/virtual-modules-W3OGMIX7.js +0 -2
- package/dist/core/background/history.d.ts +0 -4
- package/dist/core/background/history.d.ts.map +0 -1
- package/dist/core/background/history.js.map +0 -1
- package/dist/core/background/output.d.ts.map +0 -1
- package/dist/core/background/output.js.map +0 -1
- package/dist/core/background/presentation.d.ts +0 -9
- package/dist/core/background/presentation.d.ts.map +0 -1
- package/dist/core/background/presentation.js.map +0 -1
- package/dist/core/background/service.d.ts.map +0 -1
- package/dist/core/background/service.js.map +0 -1
- package/dist/core/background/session.d.ts +0 -63
- package/dist/core/background/session.d.ts.map +0 -1
- package/dist/core/background/session.js +0 -222
- package/dist/core/background/session.js.map +0 -1
- package/dist/core/background/types.d.ts.map +0 -1
- package/dist/core/background/types.js.map +0 -1
- package/dist/core/model-stream-options.d.ts +0 -6
- package/dist/core/model-stream-options.d.ts.map +0 -1
- package/dist/core/model-stream-options.js +0 -20
- package/dist/core/model-stream-options.js.map +0 -1
- package/dist/extensions/background/actions.d.ts +0 -11
- package/dist/extensions/background/actions.d.ts.map +0 -1
- package/dist/extensions/background/actions.js.map +0 -1
- package/dist/extensions/background/completion-render.d.ts +0 -8
- package/dist/extensions/background/completion-render.d.ts.map +0 -1
- package/dist/extensions/background/completion-render.js.map +0 -1
- package/dist/extensions/background/constants.d.ts +0 -22
- package/dist/extensions/background/constants.d.ts.map +0 -1
- package/dist/extensions/background/constants.js.map +0 -1
- package/dist/extensions/background/index.d.ts +0 -7
- package/dist/extensions/background/index.d.ts.map +0 -1
- package/dist/extensions/background/index.js +0 -109
- package/dist/extensions/background/index.js.map +0 -1
- package/dist/extensions/background/keybindings.d.ts +0 -10
- package/dist/extensions/background/keybindings.d.ts.map +0 -1
- package/dist/extensions/background/keybindings.js +0 -14
- package/dist/extensions/background/keybindings.js.map +0 -1
- package/dist/extensions/background/manager.d.ts +0 -80
- package/dist/extensions/background/manager.d.ts.map +0 -1
- package/dist/extensions/background/manager.js +0 -673
- package/dist/extensions/background/manager.js.map +0 -1
- package/dist/extensions/background/render.d.ts.map +0 -1
- package/dist/extensions/background/render.js.map +0 -1
- package/dist/extensions/background/schema.d.ts.map +0 -1
- package/dist/extensions/background/schema.js.map +0 -1
- package/dist/extensions/background/task-view.d.ts.map +0 -1
- package/dist/extensions/background/task-view.js.map +0 -1
- package/dist/extensions/background/text.d.ts.map +0 -1
- package/dist/extensions/background/text.js.map +0 -1
- package/dist/extensions/background/types.d.ts.map +0 -1
- package/dist/extensions/background/types.js.map +0 -1
- package/dist/extensions/subagent/activity.d.ts +0 -34
- package/dist/extensions/subagent/activity.d.ts.map +0 -1
- package/dist/extensions/subagent/activity.js +0 -192
- package/dist/extensions/subagent/activity.js.map +0 -1
- package/dist/extensions/subagent/agents-command.d.ts +0 -4
- package/dist/extensions/subagent/agents-command.d.ts.map +0 -1
- package/dist/extensions/subagent/agents-command.js +0 -230
- package/dist/extensions/subagent/agents-command.js.map +0 -1
- package/dist/extensions/subagent/agents.d.ts +0 -6
- package/dist/extensions/subagent/agents.d.ts.map +0 -1
- package/dist/extensions/subagent/agents.js +0 -53
- package/dist/extensions/subagent/agents.js.map +0 -1
- package/dist/extensions/subagent/budget.d.ts +0 -15
- package/dist/extensions/subagent/budget.d.ts.map +0 -1
- package/dist/extensions/subagent/budget.js +0 -123
- package/dist/extensions/subagent/budget.js.map +0 -1
- package/dist/extensions/subagent/cancellation.d.ts +0 -29
- package/dist/extensions/subagent/cancellation.d.ts.map +0 -1
- package/dist/extensions/subagent/cancellation.js +0 -91
- package/dist/extensions/subagent/cancellation.js.map +0 -1
- package/dist/extensions/subagent/constants.d.ts +0 -25
- package/dist/extensions/subagent/constants.d.ts.map +0 -1
- package/dist/extensions/subagent/constants.js +0 -50
- package/dist/extensions/subagent/constants.js.map +0 -1
- package/dist/extensions/subagent/index.d.ts +0 -3
- package/dist/extensions/subagent/index.d.ts.map +0 -1
- package/dist/extensions/subagent/index.js +0 -151
- package/dist/extensions/subagent/index.js.map +0 -1
- package/dist/extensions/subagent/model-selection.d.ts +0 -16
- package/dist/extensions/subagent/model-selection.d.ts.map +0 -1
- package/dist/extensions/subagent/model-selection.js +0 -51
- package/dist/extensions/subagent/model-selection.js.map +0 -1
- package/dist/extensions/subagent/render.d.ts +0 -24
- package/dist/extensions/subagent/render.d.ts.map +0 -1
- package/dist/extensions/subagent/render.js +0 -336
- package/dist/extensions/subagent/render.js.map +0 -1
- package/dist/extensions/subagent/resolve.d.ts +0 -31
- package/dist/extensions/subagent/resolve.d.ts.map +0 -1
- package/dist/extensions/subagent/resolve.js +0 -111
- package/dist/extensions/subagent/resolve.js.map +0 -1
- package/dist/extensions/subagent/runner.d.ts +0 -35
- package/dist/extensions/subagent/runner.d.ts.map +0 -1
- package/dist/extensions/subagent/runner.js +0 -255
- package/dist/extensions/subagent/runner.js.map +0 -1
- package/dist/extensions/subagent/schema.d.ts +0 -28
- package/dist/extensions/subagent/schema.d.ts.map +0 -1
- package/dist/extensions/subagent/schema.js +0 -58
- package/dist/extensions/subagent/schema.js.map +0 -1
- package/dist/extensions/subagent/sdk-runner.d.ts +0 -33
- package/dist/extensions/subagent/sdk-runner.d.ts.map +0 -1
- package/dist/extensions/subagent/sdk-runner.js +0 -331
- package/dist/extensions/subagent/sdk-runner.js.map +0 -1
- package/dist/extensions/subagent/settings.d.ts +0 -8
- package/dist/extensions/subagent/settings.d.ts.map +0 -1
- package/dist/extensions/subagent/settings.js +0 -206
- package/dist/extensions/subagent/settings.js.map +0 -1
- package/dist/extensions/subagent/state.d.ts +0 -102
- package/dist/extensions/subagent/state.d.ts.map +0 -1
- package/dist/extensions/subagent/state.js +0 -383
- package/dist/extensions/subagent/state.js.map +0 -1
- package/dist/extensions/subagent/text.d.ts +0 -6
- package/dist/extensions/subagent/text.d.ts.map +0 -1
- package/dist/extensions/subagent/text.js +0 -66
- package/dist/extensions/subagent/text.js.map +0 -1
- package/dist/extensions/subagent/types.d.ts +0 -91
- package/dist/extensions/subagent/types.d.ts.map +0 -1
- package/dist/extensions/subagent/types.js +0 -2
- package/dist/extensions/subagent/types.js.map +0 -1
- package/dist/extensions/subagent/ui/agents-dialog.d.ts +0 -4
- package/dist/extensions/subagent/ui/agents-dialog.d.ts.map +0 -1
- package/dist/extensions/subagent/ui/agents-dialog.js +0 -84
- package/dist/extensions/subagent/ui/agents-dialog.js.map +0 -1
- package/dist/extensions/subagent/ui/choice-menu.d.ts +0 -39
- package/dist/extensions/subagent/ui/choice-menu.d.ts.map +0 -1
- package/dist/extensions/subagent/ui/choice-menu.js +0 -93
- package/dist/extensions/subagent/ui/choice-menu.js.map +0 -1
- package/dist/extensions/subagent/ui/choices.d.ts +0 -36
- package/dist/extensions/subagent/ui/choices.d.ts.map +0 -1
- package/dist/extensions/subagent/ui/choices.js +0 -54
- package/dist/extensions/subagent/ui/choices.js.map +0 -1
- package/dist/extensions/subagent/ui/model-list.d.ts +0 -66
- package/dist/extensions/subagent/ui/model-list.d.ts.map +0 -1
- package/dist/extensions/subagent/ui/model-list.js +0 -235
- package/dist/extensions/subagent/ui/model-list.js.map +0 -1
- package/dist/extensions/subagent/ui/model-picker.d.ts +0 -47
- package/dist/extensions/subagent/ui/model-picker.d.ts.map +0 -1
- package/dist/extensions/subagent/ui/model-picker.js +0 -143
- package/dist/extensions/subagent/ui/model-picker.js.map +0 -1
- package/dist/extensions/subagent/ui/profile-settings-menu.d.ts +0 -41
- package/dist/extensions/subagent/ui/profile-settings-menu.d.ts.map +0 -1
- package/dist/extensions/subagent/ui/profile-settings-menu.js +0 -98
- package/dist/extensions/subagent/ui/profile-settings-menu.js.map +0 -1
- package/dist/modes/interactive/components/tool-chrome.d.ts +0 -28
- package/dist/modes/interactive/components/tool-chrome.d.ts.map +0 -1
- package/dist/modes/interactive/components/tool-chrome.js +0 -84
- package/dist/modes/interactive/components/tool-chrome.js.map +0 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +0 -1
- package/dist/modes/interactive/components/tool-execution.js.map +0 -1
- package/dist/modes/interactive/components/tool-group.d.ts +0 -17
- package/dist/modes/interactive/components/tool-group.d.ts.map +0 -1
- package/dist/modes/interactive/components/tool-group.js +0 -78
- package/dist/modes/interactive/components/tool-group.js.map +0 -1
- package/dist/modes/interactive/tool-chat.d.ts +0 -21
- package/dist/modes/interactive/tool-chat.d.ts.map +0 -1
- package/dist/modes/interactive/tool-chat.js +0 -58
- package/dist/modes/interactive/tool-chat.js.map +0 -1
- package/docs/bundled/extensions/background.md +0 -132
- package/docs/bundled/extensions/subagent.md +0 -148
- /package/dist/{extensions/background → core/tools/tasks}/types.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/statusline/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * statusline — fixed two-line footer for Pi.\n *\n * Balanced left/right layout:\n * Line 1: Model (provider) · effort ~cwd · branch\n * Line 2: CTX used/window ↑in ↓out R W CH $cost\n *\n * Extension statuses are pinned to the center of line 2 when space permits.\n * Pi does not expose auto-compaction state to custom footer factories, so the\n * native `(auto)` marker cannot be reproduced without depending on private APIs.\n */\nimport type { Usage } from \"@earendil-works/pi-ai\";\nimport { truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../core/extensions/types.ts\";\nimport type { SessionEntry } from \"../../core/session-manager.ts\";\nimport {\n\taddUsageToTotals,\n\tcreateUsageTotals,\n\tgetAccountedUsages,\n\tgetBackgroundUsageRecord,\n\ttype UsageTotals,\n} from \"../../core/usage-totals.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\n\nconst CONTEXT_WARNING_PERCENT = 40;\nconst CONTEXT_ERROR_PERCENT = 80;\nconst MIN_GAP = 1;\n\ntype ThinkingLevel = \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n\ninterface UsageSummary extends UsageTotals {\n\tlatestCacheHitPercent?: number;\n}\n\ninterface UsageFormatOptions {\n\tincludeCacheRead: boolean;\n\tincludeCacheWrite: boolean;\n}\n\nfunction isTui(ctx: ExtensionContext): boolean {\n\treturn ctx.mode === \"tui\";\n}\n\n/** Shorten a path to `~` relative to the user's home directory. */\nfunction formatWorkingDirectory(cwd: string): string {\n\tconst rawHomeDirectory = process.env.USERPROFILE || process.env.HOME || \"\";\n\tconst homeDirectory = rawHomeDirectory.replace(/[\\\\/]+$/, \"\");\n\tif (!homeDirectory) return cwd;\n\n\tconst normalizePath = (filePath: string) => filePath.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\").toLowerCase();\n\tconst normalizedHomeDirectory = normalizePath(homeDirectory);\n\tconst normalizedCwd = normalizePath(cwd);\n\tif (normalizedCwd === normalizedHomeDirectory) return \"~\";\n\tif (normalizedCwd.startsWith(`${normalizedHomeDirectory}/`)) {\n\t\treturn `~${cwd.slice(homeDirectory.length).replace(/\\\\/g, \"/\")}`;\n\t}\n\treturn cwd;\n}\n\n/** Collapse a display path to `~/basename` or bare basename when tight. */\nfunction pathBasename(displayPath: string): string {\n\tconst normalized = displayPath.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n\tif (!normalized || normalized === \"~\") return normalized || displayPath;\n\tconst slash = normalized.lastIndexOf(\"/\");\n\tif (slash < 0) return normalized;\n\tconst base = normalized.slice(slash + 1);\n\tif (normalized.startsWith(\"~/\")) return `~/${base}`;\n\treturn base;\n}\n\n/** Format token counts like Pi's native footer: 999, 1.2k, 34k, 1.0M. */\nfunction formatTokenCount(tokenCount: number): string {\n\tif (tokenCount < 1000) return `${tokenCount}`;\n\tif (tokenCount < 10_000) return `${(tokenCount / 1000).toFixed(1)}k`;\n\tif (tokenCount < 1_000_000) return `${Math.round(tokenCount / 1000)}k`;\n\tif (tokenCount < 10_000_000) return `${(tokenCount / 1_000_000).toFixed(1)}M`;\n\treturn `${Math.round(tokenCount / 1_000_000)}M`;\n}\n\n/** Flatten extension status text to a single printable line. */\nfunction sanitizeStatus(text: string): string {\n\treturn text\n\t\t.replace(/[\\r\\n\\t]/g, \" \")\n\t\t.replace(/ +/g, \" \")\n\t\t.trim();\n}\n\nfunction joinSegments(segments: string[], separator: string): string {\n\treturn segments.filter((segment) => segment.length > 0).join(separator);\n}\n\ninterface BranchStats {\n\tthinkingLevel: ThinkingLevel;\n\tusage: UsageSummary;\n}\n\n/**\n * Latest thinking level and parent cache hit rate, plus accounted branch usage.\n * Cached across footer paints while leaf identity + usage fingerprint hold.\n */\nfunction entryUsage(entry: SessionEntry): Usage | undefined {\n\tif (entry.type === \"message\") {\n\t\tif (entry.message.role === \"assistant\") return entry.message.usage;\n\t\tif (entry.message.role === \"toolResult\") return entry.message.usage;\n\t\treturn undefined;\n\t}\n\tif (entry.type === \"branch_summary\" || entry.type === \"compaction\") return entry.usage;\n\treturn getBackgroundUsageRecord(entry)?.usage;\n}\n\nfunction computeBranchStats(branchEntries: SessionEntry[]): BranchStats {\n\tlet thinkingLevel: ThinkingLevel = \"off\";\n\tconst usageTotals = createUsageTotals();\n\tlet latestCacheHitPercent: number | undefined;\n\n\tfor (const usage of getAccountedUsages(branchEntries)) addUsageToTotals(usageTotals, usage);\n\n\tfor (const entry of branchEntries) {\n\t\tif (entry.type === \"thinking_level_change\") {\n\t\t\tthinkingLevel = entry.thinkingLevel as ThinkingLevel;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst usage = entryUsage(entry);\n\t\tif (!usage) continue;\n\n\t\t// Keep CH tied to the latest assistant request, matching the native\n\t\t// footer; tool and summary usage contributes only to cumulative totals.\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tconst latestPromptTokens = usage.input + usage.cacheRead + usage.cacheWrite;\n\t\t\tconst latestRequestUsedCache = usage.cacheRead > 0 || usage.cacheWrite > 0;\n\t\t\tlatestCacheHitPercent =\n\t\t\t\tlatestRequestUsedCache && latestPromptTokens > 0 ? (usage.cacheRead / latestPromptTokens) * 100 : undefined;\n\t\t}\n\t}\n\n\treturn { thinkingLevel, usage: { ...usageTotals, latestCacheHitPercent } };\n}\n\n/**\n * Fingerprint the leaf so streaming usage updates invalidate even when the\n * SessionEntry object identity is reused in place.\n */\nfunction leafUsageFingerprint(entry: SessionEntry | undefined): string {\n\tif (!entry) return \"\";\n\tconst usage = entryUsage(entry);\n\tif (!usage) return \"\";\n\treturn [usage.input, usage.output, usage.cacheRead, usage.cacheWrite, usage.cost.total].join(\":\");\n}\n\n/** Cache keyed by branch length + leaf identity + usage fingerprint. */\ninterface BranchStatsCache {\n\tlength: number;\n\tlastEntry: SessionEntry | undefined;\n\tleafUsage: string;\n\tstats: BranchStats;\n}\n\nfunction getBranchStats(branchEntries: SessionEntry[], cache: { current: BranchStatsCache | null }): BranchStats {\n\tconst lastEntry = branchEntries.length > 0 ? branchEntries[branchEntries.length - 1] : undefined;\n\tconst leafUsage = leafUsageFingerprint(lastEntry);\n\tconst cached = cache.current;\n\tif (\n\t\tcached &&\n\t\tcached.length === branchEntries.length &&\n\t\tcached.lastEntry === lastEntry &&\n\t\tcached.leafUsage === leafUsage\n\t) {\n\t\treturn cached.stats;\n\t}\n\n\tconst stats = computeBranchStats(branchEntries);\n\tcache.current = { length: branchEntries.length, lastEntry, leafUsage, stats };\n\treturn stats;\n}\n\n/** Avoid rebuilding the branch path (leaf→root walk) on every footer paint. */\ninterface BranchPathCache {\n\tleafId: string | null;\n\tentries: SessionEntry[];\n}\n\nfunction getBranchEntries(\n\tgetLeafId: () => string | null,\n\tgetBranch: () => SessionEntry[],\n\tcache: { current: BranchPathCache | null },\n): SessionEntry[] {\n\tconst leafId = getLeafId();\n\tconst cached = cache.current;\n\tif (cached && cached.leafId === leafId) return cached.entries;\n\tconst entries = getBranch();\n\tcache.current = { leafId, entries };\n\treturn entries;\n}\n\nfunction formatContextUsage(ctx: ExtensionContext, theme: Theme): string {\n\tconst contextUsage = ctx.getContextUsage();\n\tconst contextWindow = contextUsage?.contextWindow ?? ctx.model?.contextWindow;\n\tconst contextWindowSuffix = contextWindow ? `/${formatTokenCount(contextWindow)}` : \"\";\n\tif (contextUsage?.percent == null) {\n\t\treturn theme.fg(\"accent\", `CTX ?%${contextWindowSuffix}`);\n\t}\n\n\tconst label = `CTX ${contextUsage.percent.toFixed(1)}%${contextWindowSuffix}`;\n\tif (contextUsage.percent > CONTEXT_ERROR_PERCENT) return theme.fg(\"error\", label);\n\tif (contextUsage.percent > CONTEXT_WARNING_PERCENT) return theme.fg(\"warning\", label);\n\treturn theme.fg(\"accent\", label);\n}\n\nfunction formatUsageSummary(\n\tsummary: UsageSummary,\n\tusesSubscription: boolean,\n\ttheme: Theme,\n\toptions: UsageFormatOptions = { includeCacheRead: true, includeCacheWrite: true },\n): string {\n\tconst usageParts: string[] = [];\n\tif (summary.input > 0) usageParts.push(`↑${formatTokenCount(summary.input)}`);\n\tif (summary.output > 0) usageParts.push(`↓${formatTokenCount(summary.output)}`);\n\tif (options.includeCacheRead && summary.cacheRead > 0) {\n\t\tusageParts.push(`R${formatTokenCount(summary.cacheRead)}`);\n\t}\n\tif (options.includeCacheWrite && summary.cacheWrite > 0) {\n\t\tusageParts.push(`W${formatTokenCount(summary.cacheWrite)}`);\n\t}\n\tif (summary.latestCacheHitPercent !== undefined) {\n\t\tusageParts.push(`CH${summary.latestCacheHitPercent.toFixed(1)}%`);\n\t}\n\tif (summary.cost > 0) {\n\t\tusageParts.push(`$${summary.cost.toFixed(3)}${usesSubscription ? \" (sub)\" : \"\"}`);\n\t}\n\tif (usageParts.length === 0) return \"\";\n\treturn theme.fg(\"dim\", usageParts.join(\" \"));\n}\n\n/** True when the string already carries SGR color codes from an extension. */\nfunction hasAnsiColor(text: string): boolean {\n\treturn text.includes(\"\\x1b[\");\n}\n\nfunction formatExtensionStatuses(statuses: ReadonlyMap<string, string>, theme: Theme): string {\n\tconst parts = Array.from(statuses.entries())\n\t\t.sort(([firstKey], [secondKey]) => firstKey.localeCompare(secondKey))\n\t\t.map(([, text]) => sanitizeStatus(text))\n\t\t.filter(Boolean)\n\t\t// Extensions may pre-color status text. Don't re-wrap those.\n\t\t.map((text) => (hasAnsiColor(text) ? text : theme.fg(\"muted\", text)));\n\treturn parts.join(\" \");\n}\n\n/** Left-align `left`, right-align `right`, filling the gap with spaces. */\nfunction layoutLeftRight(left: string, right: string, width: number, theme: Theme): string {\n\tconst ellipsis = theme.fg(\"dim\", \"...\");\n\tif (width <= 0) return \"\";\n\tif (!right) return truncateToWidth(left, width, ellipsis);\n\tif (!left) {\n\t\tconst rightWidth = visibleWidth(right);\n\t\tif (rightWidth >= width) return truncateToWidth(right, width, ellipsis);\n\t\treturn `${\" \".repeat(width - rightWidth)}${right}`;\n\t}\n\n\tlet leftText = left;\n\tlet rightText = right;\n\tlet leftWidth = visibleWidth(leftText);\n\tlet rightWidth = visibleWidth(rightText);\n\n\tif (leftWidth + rightWidth + MIN_GAP > width) {\n\t\t// Prefer keeping the right side readable; give it up to ~45% when both compete.\n\t\tconst maxRightWidth = Math.min(rightWidth, Math.max(8, Math.floor(width * 0.45)));\n\t\tif (rightWidth > maxRightWidth) {\n\t\t\trightText = truncateToWidth(rightText, maxRightWidth, ellipsis);\n\t\t\trightWidth = visibleWidth(rightText);\n\t\t}\n\t\tconst maxLeftWidth = width - rightWidth - MIN_GAP;\n\t\tif (maxLeftWidth < 1) return truncateToWidth(rightText, width, ellipsis);\n\t\tleftText = truncateToWidth(leftText, maxLeftWidth, ellipsis);\n\t\tleftWidth = visibleWidth(leftText);\n\t}\n\n\tconst gap = Math.max(MIN_GAP, width - leftWidth - rightWidth);\n\treturn `${leftText}${\" \".repeat(gap)}${rightText}`;\n}\n\n/**\n * Line 2 zones: CTX left, extension status pinned to the line center, usage\n * right. The status anchors to the absolute center of the line so it does not\n * drift as the usage cluster grows; when the side zones collide with the\n * center anchor, the free space is balanced instead. Drops the status first\n * when space is tight; caller should pass progressively smaller rights.\n */\nfunction layoutSecondaryLine(\n\tcontextText: string,\n\tstatusText: string,\n\tusageText: string,\n\twidth: number,\n\ttheme: Theme,\n): string {\n\tconst ellipsis = theme.fg(\"dim\", \"...\");\n\tif (!statusText) {\n\t\tif (!usageText) return truncateToWidth(contextText, width, ellipsis);\n\t\treturn layoutLeftRight(contextText, usageText, width, theme);\n\t}\n\n\tconst contextWidth = visibleWidth(contextText);\n\tconst usageWidth = visibleWidth(usageText);\n\tconst statusWidth = visibleWidth(statusText);\n\tconst needed = contextWidth + usageWidth + statusWidth + MIN_GAP * 2;\n\n\tif (needed <= width) {\n\t\tconst centerStart = Math.floor((width - statusWidth) / 2);\n\t\tconst centeredLeftPad = centerStart - contextWidth;\n\t\tconst centeredRightPad = width - centerStart - statusWidth - usageWidth;\n\t\tif (centeredLeftPad >= MIN_GAP && centeredRightPad >= MIN_GAP) {\n\t\t\treturn `${contextText}${\" \".repeat(centeredLeftPad)}${statusText}${\" \".repeat(centeredRightPad)}${usageText}`;\n\t\t}\n\t\tconst free = width - contextWidth - usageWidth - statusWidth;\n\t\tconst leftPad = Math.floor(free / 2);\n\t\tconst rightPad = free - leftPad;\n\t\treturn `${contextText}${\" \".repeat(leftPad)}${statusText}${\" \".repeat(rightPad)}${usageText}`;\n\t}\n\n\t// Not enough room for a full middle status — keep CTX · usage, drop status.\n\treturn layoutLeftRight(contextText, usageText, width, theme);\n}\n\nfunction fitsLeftRight(left: string, right: string, width: number): boolean {\n\tif (!right) return visibleWidth(left) <= width;\n\tif (!left) return visibleWidth(right) <= width;\n\treturn visibleWidth(left) + visibleWidth(right) + MIN_GAP <= width;\n}\n\n/** Progressive drop: branch → short path → drop provider → truncate. */\nfunction fitPrimaryLine(options: {\n\tmodelWithProvider: string;\n\tmodelName: string;\n\teffortPart: string;\n\tcwdFull: string;\n\tcwdShort: string;\n\tbranchPart: string;\n\tseparator: string;\n\twidth: number;\n\ttheme: Theme;\n}): string {\n\tconst { modelWithProvider, modelName, effortPart, cwdFull, cwdShort, branchPart, separator, width, theme } = options;\n\n\tconst leftRich = joinSegments([modelWithProvider, effortPart], separator);\n\tconst leftPlain = joinSegments([modelName, effortPart], separator);\n\n\tconst candidates: Array<{ left: string; right: string }> = [\n\t\t{ left: leftRich, right: joinSegments([cwdFull, branchPart], separator) },\n\t\t{ left: leftRich, right: cwdFull },\n\t\t{ left: leftRich, right: joinSegments([cwdShort, branchPart], separator) },\n\t\t{ left: leftRich, right: cwdShort },\n\t\t{ left: leftPlain, right: joinSegments([cwdShort, branchPart], separator) },\n\t\t{ left: leftPlain, right: cwdShort },\n\t\t{ left: leftPlain, right: \"\" },\n\t];\n\n\tfor (const candidate of candidates) {\n\t\tif (fitsLeftRight(candidate.left, candidate.right, width)) {\n\t\t\treturn layoutLeftRight(candidate.left, candidate.right, width, theme);\n\t\t}\n\t}\n\n\treturn layoutLeftRight(leftPlain, cwdShort, width, theme);\n}\n\n/** Progressive drop on the usage side: full → drop W → drop R; status fills middle when space allows. */\nfunction fitSecondaryLine(options: {\n\tcontextText: string;\n\tstatusText: string;\n\tusageCandidates: string[];\n\twidth: number;\n\ttheme: Theme;\n}): string {\n\tconst { contextText, statusText, usageCandidates, width, theme } = options;\n\n\tif (usageCandidates.length === 0) {\n\t\treturn layoutSecondaryLine(contextText, statusText, \"\", width, theme);\n\t}\n\n\tfor (const usageText of usageCandidates) {\n\t\tif (fitsLeftRight(contextText, usageText, width)) {\n\t\t\treturn layoutSecondaryLine(contextText, statusText, usageText, width, theme);\n\t\t}\n\t}\n\n\tconst fallbackUsage = usageCandidates[0] ?? \"\";\n\treturn layoutLeftRight(contextText, fallbackUsage, width, theme);\n}\n\nexport default function statusline(pi: ExtensionAPI): void {\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tif (!isTui(ctx)) return;\n\n\t\t// Per-footer instance: branch path + stats cached across paints until the\n\t\t// leaf moves (or streaming usage on the leaf changes).\n\t\tconst branchPathCache: { current: BranchPathCache | null } = { current: null };\n\t\tconst branchStatsCache: { current: BranchStatsCache | null } = { current: null };\n\n\t\tctx.ui.setFooter((tui, theme, footerData) => {\n\t\t\tconst unsubscribeFromBranchChanges = footerData.onBranchChange(() => tui.requestRender());\n\t\t\treturn {\n\t\t\t\tdispose: unsubscribeFromBranchChanges,\n\t\t\t\tinvalidate() {\n\t\t\t\t\tbranchPathCache.current = null;\n\t\t\t\t\tbranchStatsCache.current = null;\n\t\t\t\t},\n\t\t\t\trender(width: number): string[] {\n\t\t\t\t\tconst branchEntries = getBranchEntries(\n\t\t\t\t\t\t() => ctx.sessionManager.getLeafId(),\n\t\t\t\t\t\t() => ctx.sessionManager.getBranch(),\n\t\t\t\t\t\tbranchPathCache,\n\t\t\t\t\t);\n\t\t\t\t\tconst { thinkingLevel, usage: usageSummary } = getBranchStats(branchEntries, branchStatsCache);\n\t\t\t\t\tconst model = ctx.model;\n\t\t\t\t\tconst modelName = theme.fg(\"toolTitle\", theme.bold(model?.name ?? model?.id ?? \"no-model\"));\n\t\t\t\t\tconst providerPart = model?.provider ? theme.fg(\"muted\", `(${model.provider})`) : \"\";\n\t\t\t\t\tconst modelWithProvider = providerPart ? `${modelName} ${providerPart}` : modelName;\n\n\t\t\t\t\tlet effortPart = \"\";\n\t\t\t\t\tif (model?.reasoning && thinkingLevel !== \"off\") {\n\t\t\t\t\t\teffortPart = theme.getThinkingBorderColor(thinkingLevel)(thinkingLevel);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst separator = theme.fg(\"dim\", \" · \");\n\t\t\t\t\tconst cwdDisplay = formatWorkingDirectory(ctx.cwd);\n\t\t\t\t\tconst cwdFull = theme.fg(\"success\", cwdDisplay);\n\t\t\t\t\tconst cwdShort = theme.fg(\"success\", pathBasename(cwdDisplay));\n\t\t\t\t\tconst gitBranch = footerData.getGitBranch();\n\t\t\t\t\tconst branchPart = gitBranch ? theme.fg(\"accent\", gitBranch) : \"\";\n\n\t\t\t\t\tconst primaryLine = fitPrimaryLine({\n\t\t\t\t\t\tmodelWithProvider,\n\t\t\t\t\t\tmodelName,\n\t\t\t\t\t\teffortPart,\n\t\t\t\t\t\tcwdFull,\n\t\t\t\t\t\tcwdShort,\n\t\t\t\t\t\tbranchPart,\n\t\t\t\t\t\tseparator,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\ttheme,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst contextText = formatContextUsage(ctx, theme);\n\t\t\t\t\tconst usesSubscription = model ? ctx.modelRegistry.isUsingOAuth(model) : false;\n\t\t\t\t\tconst usageCandidates = [\n\t\t\t\t\t\tformatUsageSummary(usageSummary, usesSubscription, theme, {\n\t\t\t\t\t\t\tincludeCacheRead: true,\n\t\t\t\t\t\t\tincludeCacheWrite: true,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tformatUsageSummary(usageSummary, usesSubscription, theme, {\n\t\t\t\t\t\t\tincludeCacheRead: true,\n\t\t\t\t\t\t\tincludeCacheWrite: false,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tformatUsageSummary(usageSummary, usesSubscription, theme, {\n\t\t\t\t\t\t\tincludeCacheRead: false,\n\t\t\t\t\t\t\tincludeCacheWrite: false,\n\t\t\t\t\t\t}),\n\t\t\t\t\t];\n\t\t\t\t\t// Deduplicate identical progressive candidates (e.g. when W/R are zero).\n\t\t\t\t\tconst uniqueUsageCandidates = [...new Set(usageCandidates.filter(Boolean))];\n\t\t\t\t\tconst statusText = formatExtensionStatuses(footerData.getExtensionStatuses(), theme);\n\n\t\t\t\t\tconst secondaryLine = fitSecondaryLine({\n\t\t\t\t\t\tcontextText,\n\t\t\t\t\t\tstatusText,\n\t\t\t\t\t\tusageCandidates: uniqueUsageCandidates,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\ttheme,\n\t\t\t\t\t});\n\n\t\t\t\t\treturn [primaryLine, secondaryLine];\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t});\n\n\tpi.on(\"session_shutdown\", (_event, ctx) => {\n\t\tif (isTui(ctx)) ctx.ui.setFooter(undefined);\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/statusline/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * statusline — fixed two-line footer for Pi.\n *\n * Balanced left/right layout:\n * Line 1: Model (provider) · effort ~cwd · branch\n * Line 2: CTX used/window ↑in ↓out R W CH $cost\n *\n * Extension statuses are pinned to the center of line 2 when space permits.\n * Pi does not expose auto-compaction state to custom footer factories, so the\n * native `(auto)` marker cannot be reproduced without depending on private APIs.\n */\nimport type { Usage } from \"@earendil-works/pi-ai\";\nimport { truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../core/extensions/types.ts\";\nimport type { SessionEntry } from \"../../core/session-manager.ts\";\nimport {\n\taddUsageToTotals,\n\tcreateUsageTotals,\n\tgetAccountedUsages,\n\tgetTaskUsageRecord,\n\ttype UsageTotals,\n} from \"../../core/usage-totals.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\n\nconst CONTEXT_WARNING_PERCENT = 40;\nconst CONTEXT_ERROR_PERCENT = 80;\nconst MIN_GAP = 1;\n\ntype ThinkingLevel = \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n\ninterface UsageSummary extends UsageTotals {\n\tlatestCacheHitPercent?: number;\n}\n\ninterface UsageFormatOptions {\n\tincludeCacheRead: boolean;\n\tincludeCacheWrite: boolean;\n}\n\nfunction isTui(ctx: ExtensionContext): boolean {\n\treturn ctx.mode === \"tui\";\n}\n\n/** Shorten a path to `~` relative to the user's home directory. */\nfunction formatWorkingDirectory(cwd: string): string {\n\tconst rawHomeDirectory = process.env.USERPROFILE || process.env.HOME || \"\";\n\tconst homeDirectory = rawHomeDirectory.replace(/[\\\\/]+$/, \"\");\n\tif (!homeDirectory) return cwd;\n\n\tconst normalizePath = (filePath: string) => filePath.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\").toLowerCase();\n\tconst normalizedHomeDirectory = normalizePath(homeDirectory);\n\tconst normalizedCwd = normalizePath(cwd);\n\tif (normalizedCwd === normalizedHomeDirectory) return \"~\";\n\tif (normalizedCwd.startsWith(`${normalizedHomeDirectory}/`)) {\n\t\treturn `~${cwd.slice(homeDirectory.length).replace(/\\\\/g, \"/\")}`;\n\t}\n\treturn cwd;\n}\n\n/** Collapse a display path to `~/basename` or bare basename when tight. */\nfunction pathBasename(displayPath: string): string {\n\tconst normalized = displayPath.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n\tif (!normalized || normalized === \"~\") return normalized || displayPath;\n\tconst slash = normalized.lastIndexOf(\"/\");\n\tif (slash < 0) return normalized;\n\tconst base = normalized.slice(slash + 1);\n\tif (normalized.startsWith(\"~/\")) return `~/${base}`;\n\treturn base;\n}\n\n/** Format token counts like Pi's native footer: 999, 1.2k, 34k, 1.0M. */\nfunction formatTokenCount(tokenCount: number): string {\n\tif (tokenCount < 1000) return `${tokenCount}`;\n\tif (tokenCount < 10_000) return `${(tokenCount / 1000).toFixed(1)}k`;\n\tif (tokenCount < 1_000_000) return `${Math.round(tokenCount / 1000)}k`;\n\tif (tokenCount < 10_000_000) return `${(tokenCount / 1_000_000).toFixed(1)}M`;\n\treturn `${Math.round(tokenCount / 1_000_000)}M`;\n}\n\n/** Flatten extension status text to a single printable line. */\nfunction sanitizeStatus(text: string): string {\n\treturn text\n\t\t.replace(/[\\r\\n\\t]/g, \" \")\n\t\t.replace(/ +/g, \" \")\n\t\t.trim();\n}\n\nfunction joinSegments(segments: string[], separator: string): string {\n\treturn segments.filter((segment) => segment.length > 0).join(separator);\n}\n\ninterface BranchStats {\n\tthinkingLevel: ThinkingLevel;\n\tusage: UsageSummary;\n}\n\n/**\n * Latest thinking level and parent cache hit rate, plus accounted branch usage.\n * Cached across footer paints while leaf identity + usage fingerprint hold.\n */\nfunction entryUsage(entry: SessionEntry): Usage | undefined {\n\tif (entry.type === \"message\") {\n\t\tif (entry.message.role === \"assistant\") return entry.message.usage;\n\t\tif (entry.message.role === \"toolResult\") return entry.message.usage;\n\t\treturn undefined;\n\t}\n\tif (entry.type === \"branch_summary\" || entry.type === \"compaction\") return entry.usage;\n\treturn getTaskUsageRecord(entry)?.usage;\n}\n\nfunction computeBranchStats(branchEntries: SessionEntry[]): BranchStats {\n\tlet thinkingLevel: ThinkingLevel = \"off\";\n\tconst usageTotals = createUsageTotals();\n\tlet latestCacheHitPercent: number | undefined;\n\n\tfor (const usage of getAccountedUsages(branchEntries)) addUsageToTotals(usageTotals, usage);\n\n\tfor (const entry of branchEntries) {\n\t\tif (entry.type === \"thinking_level_change\") {\n\t\t\tthinkingLevel = entry.thinkingLevel as ThinkingLevel;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst usage = entryUsage(entry);\n\t\tif (!usage) continue;\n\n\t\t// Keep CH tied to the latest assistant request, matching the native\n\t\t// footer; tool and summary usage contributes only to cumulative totals.\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tconst latestPromptTokens = usage.input + usage.cacheRead + usage.cacheWrite;\n\t\t\tconst latestRequestUsedCache = usage.cacheRead > 0 || usage.cacheWrite > 0;\n\t\t\tlatestCacheHitPercent =\n\t\t\t\tlatestRequestUsedCache && latestPromptTokens > 0 ? (usage.cacheRead / latestPromptTokens) * 100 : undefined;\n\t\t}\n\t}\n\n\treturn { thinkingLevel, usage: { ...usageTotals, latestCacheHitPercent } };\n}\n\n/**\n * Fingerprint the leaf so streaming usage updates invalidate even when the\n * SessionEntry object identity is reused in place.\n */\nfunction leafUsageFingerprint(entry: SessionEntry | undefined): string {\n\tif (!entry) return \"\";\n\tconst usage = entryUsage(entry);\n\tif (!usage) return \"\";\n\treturn [usage.input, usage.output, usage.cacheRead, usage.cacheWrite, usage.cost.total].join(\":\");\n}\n\n/** Cache keyed by branch length + leaf identity + usage fingerprint. */\ninterface BranchStatsCache {\n\tlength: number;\n\tlastEntry: SessionEntry | undefined;\n\tleafUsage: string;\n\tstats: BranchStats;\n}\n\nfunction getBranchStats(branchEntries: SessionEntry[], cache: { current: BranchStatsCache | null }): BranchStats {\n\tconst lastEntry = branchEntries.length > 0 ? branchEntries[branchEntries.length - 1] : undefined;\n\tconst leafUsage = leafUsageFingerprint(lastEntry);\n\tconst cached = cache.current;\n\tif (\n\t\tcached &&\n\t\tcached.length === branchEntries.length &&\n\t\tcached.lastEntry === lastEntry &&\n\t\tcached.leafUsage === leafUsage\n\t) {\n\t\treturn cached.stats;\n\t}\n\n\tconst stats = computeBranchStats(branchEntries);\n\tcache.current = { length: branchEntries.length, lastEntry, leafUsage, stats };\n\treturn stats;\n}\n\n/** Avoid rebuilding the branch path (leaf→root walk) on every footer paint. */\ninterface BranchPathCache {\n\tleafId: string | null;\n\tentries: SessionEntry[];\n}\n\nfunction getBranchEntries(\n\tgetLeafId: () => string | null,\n\tgetBranch: () => SessionEntry[],\n\tcache: { current: BranchPathCache | null },\n): SessionEntry[] {\n\tconst leafId = getLeafId();\n\tconst cached = cache.current;\n\tif (cached && cached.leafId === leafId) return cached.entries;\n\tconst entries = getBranch();\n\tcache.current = { leafId, entries };\n\treturn entries;\n}\n\nfunction formatContextUsage(ctx: ExtensionContext, theme: Theme): string {\n\tconst contextUsage = ctx.getContextUsage();\n\tconst contextWindow = contextUsage?.contextWindow ?? ctx.model?.contextWindow;\n\tconst contextWindowSuffix = contextWindow ? `/${formatTokenCount(contextWindow)}` : \"\";\n\tif (contextUsage?.percent == null) {\n\t\treturn theme.fg(\"accent\", `CTX ?%${contextWindowSuffix}`);\n\t}\n\n\tconst label = `CTX ${contextUsage.percent.toFixed(1)}%${contextWindowSuffix}`;\n\tif (contextUsage.percent > CONTEXT_ERROR_PERCENT) return theme.fg(\"error\", label);\n\tif (contextUsage.percent > CONTEXT_WARNING_PERCENT) return theme.fg(\"warning\", label);\n\treturn theme.fg(\"accent\", label);\n}\n\nfunction formatUsageSummary(\n\tsummary: UsageSummary,\n\tusesSubscription: boolean,\n\ttheme: Theme,\n\toptions: UsageFormatOptions = { includeCacheRead: true, includeCacheWrite: true },\n): string {\n\tconst usageParts: string[] = [];\n\tif (summary.input > 0) usageParts.push(`↑${formatTokenCount(summary.input)}`);\n\tif (summary.output > 0) usageParts.push(`↓${formatTokenCount(summary.output)}`);\n\tif (options.includeCacheRead && summary.cacheRead > 0) {\n\t\tusageParts.push(`R${formatTokenCount(summary.cacheRead)}`);\n\t}\n\tif (options.includeCacheWrite && summary.cacheWrite > 0) {\n\t\tusageParts.push(`W${formatTokenCount(summary.cacheWrite)}`);\n\t}\n\tif (summary.latestCacheHitPercent !== undefined) {\n\t\tusageParts.push(`CH${summary.latestCacheHitPercent.toFixed(1)}%`);\n\t}\n\tif (summary.cost > 0) {\n\t\tusageParts.push(`$${summary.cost.toFixed(3)}${usesSubscription ? \" (sub)\" : \"\"}`);\n\t}\n\tif (usageParts.length === 0) return \"\";\n\treturn theme.fg(\"dim\", usageParts.join(\" \"));\n}\n\n/** True when the string already carries SGR color codes from an extension. */\nfunction hasAnsiColor(text: string): boolean {\n\treturn text.includes(\"\\x1b[\");\n}\n\nfunction formatExtensionStatuses(statuses: ReadonlyMap<string, string>, theme: Theme): string {\n\tconst parts = Array.from(statuses.entries())\n\t\t.sort(([firstKey], [secondKey]) => firstKey.localeCompare(secondKey))\n\t\t.map(([, text]) => sanitizeStatus(text))\n\t\t.filter(Boolean)\n\t\t// Extensions may pre-color status text. Don't re-wrap those.\n\t\t.map((text) => (hasAnsiColor(text) ? text : theme.fg(\"muted\", text)));\n\treturn parts.join(\" \");\n}\n\n/** Left-align `left`, right-align `right`, filling the gap with spaces. */\nfunction layoutLeftRight(left: string, right: string, width: number, theme: Theme): string {\n\tconst ellipsis = theme.fg(\"dim\", \"...\");\n\tif (width <= 0) return \"\";\n\tif (!right) return truncateToWidth(left, width, ellipsis);\n\tif (!left) {\n\t\tconst rightWidth = visibleWidth(right);\n\t\tif (rightWidth >= width) return truncateToWidth(right, width, ellipsis);\n\t\treturn `${\" \".repeat(width - rightWidth)}${right}`;\n\t}\n\n\tlet leftText = left;\n\tlet rightText = right;\n\tlet leftWidth = visibleWidth(leftText);\n\tlet rightWidth = visibleWidth(rightText);\n\n\tif (leftWidth + rightWidth + MIN_GAP > width) {\n\t\t// Prefer keeping the right side readable; give it up to ~45% when both compete.\n\t\tconst maxRightWidth = Math.min(rightWidth, Math.max(8, Math.floor(width * 0.45)));\n\t\tif (rightWidth > maxRightWidth) {\n\t\t\trightText = truncateToWidth(rightText, maxRightWidth, ellipsis);\n\t\t\trightWidth = visibleWidth(rightText);\n\t\t}\n\t\tconst maxLeftWidth = width - rightWidth - MIN_GAP;\n\t\tif (maxLeftWidth < 1) return truncateToWidth(rightText, width, ellipsis);\n\t\tleftText = truncateToWidth(leftText, maxLeftWidth, ellipsis);\n\t\tleftWidth = visibleWidth(leftText);\n\t}\n\n\tconst gap = Math.max(MIN_GAP, width - leftWidth - rightWidth);\n\treturn `${leftText}${\" \".repeat(gap)}${rightText}`;\n}\n\n/**\n * Line 2 zones: CTX left, extension status pinned to the line center, usage\n * right. The status anchors to the absolute center of the line so it does not\n * drift as the usage cluster grows; when the side zones collide with the\n * center anchor, the free space is balanced instead. Drops the status first\n * when space is tight; caller should pass progressively smaller rights.\n */\nfunction layoutSecondaryLine(\n\tcontextText: string,\n\tstatusText: string,\n\tusageText: string,\n\twidth: number,\n\ttheme: Theme,\n): string {\n\tconst ellipsis = theme.fg(\"dim\", \"...\");\n\tif (!statusText) {\n\t\tif (!usageText) return truncateToWidth(contextText, width, ellipsis);\n\t\treturn layoutLeftRight(contextText, usageText, width, theme);\n\t}\n\n\tconst contextWidth = visibleWidth(contextText);\n\tconst usageWidth = visibleWidth(usageText);\n\tconst statusWidth = visibleWidth(statusText);\n\tconst needed = contextWidth + usageWidth + statusWidth + MIN_GAP * 2;\n\n\tif (needed <= width) {\n\t\tconst centerStart = Math.floor((width - statusWidth) / 2);\n\t\tconst centeredLeftPad = centerStart - contextWidth;\n\t\tconst centeredRightPad = width - centerStart - statusWidth - usageWidth;\n\t\tif (centeredLeftPad >= MIN_GAP && centeredRightPad >= MIN_GAP) {\n\t\t\treturn `${contextText}${\" \".repeat(centeredLeftPad)}${statusText}${\" \".repeat(centeredRightPad)}${usageText}`;\n\t\t}\n\t\tconst free = width - contextWidth - usageWidth - statusWidth;\n\t\tconst leftPad = Math.floor(free / 2);\n\t\tconst rightPad = free - leftPad;\n\t\treturn `${contextText}${\" \".repeat(leftPad)}${statusText}${\" \".repeat(rightPad)}${usageText}`;\n\t}\n\n\t// Not enough room for a full middle status — keep CTX · usage, drop status.\n\treturn layoutLeftRight(contextText, usageText, width, theme);\n}\n\nfunction fitsLeftRight(left: string, right: string, width: number): boolean {\n\tif (!right) return visibleWidth(left) <= width;\n\tif (!left) return visibleWidth(right) <= width;\n\treturn visibleWidth(left) + visibleWidth(right) + MIN_GAP <= width;\n}\n\n/** Progressive drop: branch → short path → drop provider → truncate. */\nfunction fitPrimaryLine(options: {\n\tmodelWithProvider: string;\n\tmodelName: string;\n\teffortPart: string;\n\tcwdFull: string;\n\tcwdShort: string;\n\tbranchPart: string;\n\tseparator: string;\n\twidth: number;\n\ttheme: Theme;\n}): string {\n\tconst { modelWithProvider, modelName, effortPart, cwdFull, cwdShort, branchPart, separator, width, theme } = options;\n\n\tconst leftRich = joinSegments([modelWithProvider, effortPart], separator);\n\tconst leftPlain = joinSegments([modelName, effortPart], separator);\n\n\tconst candidates: Array<{ left: string; right: string }> = [\n\t\t{ left: leftRich, right: joinSegments([cwdFull, branchPart], separator) },\n\t\t{ left: leftRich, right: cwdFull },\n\t\t{ left: leftRich, right: joinSegments([cwdShort, branchPart], separator) },\n\t\t{ left: leftRich, right: cwdShort },\n\t\t{ left: leftPlain, right: joinSegments([cwdShort, branchPart], separator) },\n\t\t{ left: leftPlain, right: cwdShort },\n\t\t{ left: leftPlain, right: \"\" },\n\t];\n\n\tfor (const candidate of candidates) {\n\t\tif (fitsLeftRight(candidate.left, candidate.right, width)) {\n\t\t\treturn layoutLeftRight(candidate.left, candidate.right, width, theme);\n\t\t}\n\t}\n\n\treturn layoutLeftRight(leftPlain, cwdShort, width, theme);\n}\n\n/** Progressive drop on the usage side: full → drop W → drop R; status fills middle when space allows. */\nfunction fitSecondaryLine(options: {\n\tcontextText: string;\n\tstatusText: string;\n\tusageCandidates: string[];\n\twidth: number;\n\ttheme: Theme;\n}): string {\n\tconst { contextText, statusText, usageCandidates, width, theme } = options;\n\n\tif (usageCandidates.length === 0) {\n\t\treturn layoutSecondaryLine(contextText, statusText, \"\", width, theme);\n\t}\n\n\tfor (const usageText of usageCandidates) {\n\t\tif (fitsLeftRight(contextText, usageText, width)) {\n\t\t\treturn layoutSecondaryLine(contextText, statusText, usageText, width, theme);\n\t\t}\n\t}\n\n\tconst fallbackUsage = usageCandidates[0] ?? \"\";\n\treturn layoutLeftRight(contextText, fallbackUsage, width, theme);\n}\n\nexport default function statusline(pi: ExtensionAPI): void {\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tif (!isTui(ctx)) return;\n\n\t\t// Per-footer instance: branch path + stats cached across paints until the\n\t\t// leaf moves (or streaming usage on the leaf changes).\n\t\tconst branchPathCache: { current: BranchPathCache | null } = { current: null };\n\t\tconst branchStatsCache: { current: BranchStatsCache | null } = { current: null };\n\n\t\tctx.ui.setFooter((tui, theme, footerData) => {\n\t\t\tconst unsubscribeFromBranchChanges = footerData.onBranchChange(() => tui.requestRender());\n\t\t\treturn {\n\t\t\t\tdispose: unsubscribeFromBranchChanges,\n\t\t\t\tinvalidate() {\n\t\t\t\t\tbranchPathCache.current = null;\n\t\t\t\t\tbranchStatsCache.current = null;\n\t\t\t\t},\n\t\t\t\trender(width: number): string[] {\n\t\t\t\t\tconst branchEntries = getBranchEntries(\n\t\t\t\t\t\t() => ctx.sessionManager.getLeafId(),\n\t\t\t\t\t\t() => ctx.sessionManager.getBranch(),\n\t\t\t\t\t\tbranchPathCache,\n\t\t\t\t\t);\n\t\t\t\t\tconst { thinkingLevel, usage: usageSummary } = getBranchStats(branchEntries, branchStatsCache);\n\t\t\t\t\tconst model = ctx.model;\n\t\t\t\t\tconst modelName = theme.fg(\"toolTitle\", theme.bold(model?.name ?? model?.id ?? \"no-model\"));\n\t\t\t\t\tconst providerPart = model?.provider ? theme.fg(\"muted\", `(${model.provider})`) : \"\";\n\t\t\t\t\tconst modelWithProvider = providerPart ? `${modelName} ${providerPart}` : modelName;\n\n\t\t\t\t\tlet effortPart = \"\";\n\t\t\t\t\tif (model?.reasoning && thinkingLevel !== \"off\") {\n\t\t\t\t\t\teffortPart = theme.getThinkingBorderColor(thinkingLevel)(thinkingLevel);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst separator = theme.fg(\"dim\", \" · \");\n\t\t\t\t\tconst cwdDisplay = formatWorkingDirectory(ctx.cwd);\n\t\t\t\t\tconst cwdFull = theme.fg(\"success\", cwdDisplay);\n\t\t\t\t\tconst cwdShort = theme.fg(\"success\", pathBasename(cwdDisplay));\n\t\t\t\t\tconst gitBranch = footerData.getGitBranch();\n\t\t\t\t\tconst branchPart = gitBranch ? theme.fg(\"accent\", gitBranch) : \"\";\n\n\t\t\t\t\tconst primaryLine = fitPrimaryLine({\n\t\t\t\t\t\tmodelWithProvider,\n\t\t\t\t\t\tmodelName,\n\t\t\t\t\t\teffortPart,\n\t\t\t\t\t\tcwdFull,\n\t\t\t\t\t\tcwdShort,\n\t\t\t\t\t\tbranchPart,\n\t\t\t\t\t\tseparator,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\ttheme,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst contextText = formatContextUsage(ctx, theme);\n\t\t\t\t\tconst usesSubscription = model ? ctx.modelRegistry.isUsingOAuth(model) : false;\n\t\t\t\t\tconst usageCandidates = [\n\t\t\t\t\t\tformatUsageSummary(usageSummary, usesSubscription, theme, {\n\t\t\t\t\t\t\tincludeCacheRead: true,\n\t\t\t\t\t\t\tincludeCacheWrite: true,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tformatUsageSummary(usageSummary, usesSubscription, theme, {\n\t\t\t\t\t\t\tincludeCacheRead: true,\n\t\t\t\t\t\t\tincludeCacheWrite: false,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tformatUsageSummary(usageSummary, usesSubscription, theme, {\n\t\t\t\t\t\t\tincludeCacheRead: false,\n\t\t\t\t\t\t\tincludeCacheWrite: false,\n\t\t\t\t\t\t}),\n\t\t\t\t\t];\n\t\t\t\t\t// Deduplicate identical progressive candidates (e.g. when W/R are zero).\n\t\t\t\t\tconst uniqueUsageCandidates = [...new Set(usageCandidates.filter(Boolean))];\n\t\t\t\t\tconst statusText = formatExtensionStatuses(footerData.getExtensionStatuses(), theme);\n\n\t\t\t\t\tconst secondaryLine = fitSecondaryLine({\n\t\t\t\t\t\tcontextText,\n\t\t\t\t\t\tstatusText,\n\t\t\t\t\t\tusageCandidates: uniqueUsageCandidates,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\ttheme,\n\t\t\t\t\t});\n\n\t\t\t\t\treturn [primaryLine, secondaryLine];\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t});\n\n\tpi.on(\"session_shutdown\", (_event, ctx) => {\n\t\tif (isTui(ctx)) ctx.ui.setFooter(undefined);\n\t});\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAEN,KAAK,YAAY,EAGjB,MAAM,gCAAgC,CAAC;AA6BxC,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAEN,KAAK,YAAY,EAGjB,MAAM,gCAAgC,CAAC;AA6BxC,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA8EnD"}
|
|
@@ -12,7 +12,7 @@ import { isStaleExtensionContextError, } from "../../core/extensions/types.js";
|
|
|
12
12
|
import { TODO_PROMPT_GUIDELINES, TODO_PROMPT_SNIPPET, TODO_TOOL_DESCRIPTION, TODO_TOOL_LABEL, TODO_TOOL_NAME, TODOS_COMMAND_NAME, } from "./constants.js";
|
|
13
13
|
import { TodoParamsSchema } from "./schema.js";
|
|
14
14
|
import { createTodoStore, replayTodosFromBranch } from "./state.js";
|
|
15
|
-
import { formatCommandList, formatTodoCall, formatTodoContent,
|
|
15
|
+
import { formatCommandList, formatTodoCall, formatTodoContent, formatTodoSummary } from "./view.js";
|
|
16
16
|
import { TodoWidget } from "./widget.js";
|
|
17
17
|
function safeReplay(ctx, store) {
|
|
18
18
|
// Every ctx.sessionManager access stays inside the guard: a lifecycle event
|
|
@@ -38,10 +38,6 @@ export default function todo(pi) {
|
|
|
38
38
|
parameters: TodoParamsSchema,
|
|
39
39
|
constrainedSampling: { type: "json_schema", strict: "prefer" },
|
|
40
40
|
executionMode: "sequential",
|
|
41
|
-
// Consecutive todo calls collapse into one run like read/find's `explore`
|
|
42
|
-
// group; the widget already carries the live list, so the transcript only
|
|
43
|
-
// needs the sequence of operations.
|
|
44
|
-
toolGroup: TODO_TOOL_NAME,
|
|
45
41
|
async execute(_toolCallId, params, _signal, _onUpdate) {
|
|
46
42
|
// Validation errors throw before any state mutation, so the store is
|
|
47
43
|
// untouched on failure.
|
|
@@ -49,11 +45,19 @@ export default function todo(pi) {
|
|
|
49
45
|
const text = formatTodoContent(details.change, details.state);
|
|
50
46
|
return { content: [{ type: "text", text }], details };
|
|
51
47
|
},
|
|
48
|
+
// The widget already carries the live list, so a collapsed row is one
|
|
49
|
+
// result-aware line and the result text appears only when expanded.
|
|
52
50
|
renderCall(args, theme, context) {
|
|
53
51
|
const text = context.lastComponent ?? new Text("", 0, 0);
|
|
54
|
-
text.setText(context.
|
|
55
|
-
?
|
|
56
|
-
:
|
|
52
|
+
text.setText(context.expanded
|
|
53
|
+
? formatTodoCall(args, theme, true, context.result)
|
|
54
|
+
: formatTodoSummary(args, theme, context));
|
|
55
|
+
return text;
|
|
56
|
+
},
|
|
57
|
+
renderResult(result, options, theme, context) {
|
|
58
|
+
const text = context.lastComponent ?? new Text("", 0, 0);
|
|
59
|
+
const output = result.content.flatMap((block) => (block.type === "text" ? [block.text] : [])).join("\n");
|
|
60
|
+
text.setText(options.expanded ? theme.fg("toolOutput", output) : "");
|
|
57
61
|
return text;
|
|
58
62
|
},
|
|
59
63
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/todo/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAGN,4BAA4B,GAE5B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACN,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,kBAAkB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAoB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAkB,MAAM,YAAY,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/todo/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * todo — Pi-native task tracking for multi-step work.\n *\n * State is conversation-backed: every tool result carries a full v3 snapshot\n * in `details`, and lifecycle handlers replay the current branch into the\n * closure store created by createTodoStore(). Resume, /reload, and /tree\n * navigation stay aligned with the conversation without a disk database or\n * any per-session global state.\n */\nimport { Text } from \"@earendil-works/pi-tui\";\nimport {\n\ttype AgentToolResult,\n\ttype ExtensionAPI,\n\tisStaleExtensionContextError,\n\ttype ToolExecutionMode,\n} from \"../../core/extensions/types.ts\";\nimport {\n\tTODO_PROMPT_GUIDELINES,\n\tTODO_PROMPT_SNIPPET,\n\tTODO_TOOL_DESCRIPTION,\n\tTODO_TOOL_LABEL,\n\tTODO_TOOL_NAME,\n\tTODOS_COMMAND_NAME,\n} from \"./constants.ts\";\nimport { type TodoDetails, TodoParamsSchema } from \"./schema.ts\";\nimport { createTodoStore, replayTodosFromBranch, type TodoStore } from \"./state.ts\";\nimport { formatCommandList, formatTodoCall, formatTodoContent, formatTodoSummary } from \"./view.ts\";\nimport { TodoWidget } from \"./widget.ts\";\n\ninterface TodoSessionCtx {\n\tsessionManager: { getBranch(): Iterable<unknown> };\n}\n\nfunction safeReplay(ctx: TodoSessionCtx, store: TodoStore): void {\n\t// Every ctx.sessionManager access stays inside the guard: a lifecycle event\n\t// can race session replacement (resume, /tree, /reload), and a stale ctx\n\t// just means another session took over — nothing left to replay for it.\n\ttry {\n\t\tstore.replaceState(replayTodosFromBranch(ctx));\n\t} catch (error) {\n\t\tif (!isStaleExtensionContextError(error)) throw error;\n\t}\n}\n\nexport default function todo(pi: ExtensionAPI): void {\n\tconst store = createTodoStore();\n\tlet widget: TodoWidget | undefined;\n\n\tpi.registerTool({\n\t\tname: TODO_TOOL_NAME,\n\t\tlabel: TODO_TOOL_LABEL,\n\t\tdescription: TODO_TOOL_DESCRIPTION,\n\t\tpromptSnippet: TODO_PROMPT_SNIPPET,\n\t\tpromptGuidelines: TODO_PROMPT_GUIDELINES,\n\t\tparameters: TodoParamsSchema,\n\t\tconstrainedSampling: { type: \"json_schema\", strict: \"prefer\" },\n\t\texecutionMode: \"sequential\" as ToolExecutionMode,\n\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate): Promise<AgentToolResult<TodoDetails>> {\n\t\t\t// Validation errors throw before any state mutation, so the store is\n\t\t\t// untouched on failure.\n\t\t\tconst details = store.execute(params);\n\t\t\tconst text = formatTodoContent(details.change, details.state);\n\t\t\treturn { content: [{ type: \"text\", text }], details };\n\t\t},\n\n\t\t// The widget already carries the live list, so a collapsed row is one\n\t\t// result-aware line and the result text appears only when expanded.\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(\n\t\t\t\tcontext.expanded\n\t\t\t\t\t? formatTodoCall(args, theme, true, context.result)\n\t\t\t\t\t: formatTodoSummary(args, theme, context),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\tconst output = result.content.flatMap((block) => (block.type === \"text\" ? [block.text] : [])).join(\"\\n\");\n\t\t\ttext.setText(options.expanded ? theme.fg(\"toolOutput\", output) : \"\");\n\t\t\treturn text;\n\t\t},\n\t});\n\n\tpi.registerCommand(TODOS_COMMAND_NAME, {\n\t\tdescription: \"Show the complete todo list for the current conversation branch\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (!ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\"/todos requires an interactive UI.\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tctx.ui.notify(formatCommandList(store.getState()), \"info\");\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsafeReplay(ctx, store);\n\t\tif (ctx.hasUI) {\n\t\t\twidget ??= new TodoWidget(() => store.getState());\n\t\t\twidget.setUI(ctx.ui);\n\t\t\twidget.update();\n\t\t}\n\t});\n\n\tpi.on(\"session_tree\", async (_event, ctx) => {\n\t\tsafeReplay(ctx, store);\n\t\twidget?.update();\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, _ctx) => {\n\t\t// The store belongs to this extension runtime and is collected with it;\n\t\t// the next runtime restores its own store during session_start.\n\t\twidget?.dispose();\n\t\twidget = undefined;\n\t});\n\n\tpi.on(\"tool_execution_end\", async (event) => {\n\t\tif (event.toolName !== TODO_TOOL_NAME || event.isError) return;\n\t\twidget?.update();\n\t});\n}\n"]}
|
|
@@ -25,12 +25,12 @@ export declare function formatTodoContent(change: TodoChange, state: TodoState):
|
|
|
25
25
|
type TodoCallArgs = Partial<Record<keyof TodoParams, unknown>>;
|
|
26
26
|
/** One-line call summary when collapsed; headline plus details when expanded. */
|
|
27
27
|
export declare function formatTodoCall(args: TodoCallArgs | undefined, theme: Theme, expanded: boolean, result?: AgentToolResult<unknown>): string;
|
|
28
|
-
export interface
|
|
28
|
+
export interface TodoSummaryContext {
|
|
29
29
|
isError: boolean;
|
|
30
30
|
isPartial: boolean;
|
|
31
31
|
result?: AgentToolResult<unknown>;
|
|
32
32
|
}
|
|
33
|
-
/** Compact result-aware summary
|
|
34
|
-
export declare function
|
|
33
|
+
/** Compact result-aware one-line summary of a collapsed todo row. */
|
|
34
|
+
export declare function formatTodoSummary(args: TodoCallArgs | undefined, theme: Theme, context: TodoSummaryContext): string;
|
|
35
35
|
export {};
|
|
36
36
|
//# sourceMappingURL=view.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/view.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAOpE,OAAO,EAEN,KAAK,UAAU,EAEf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,UAAU,EACf,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAIlD,CAAC;AAmBF,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAEtD;AAsBD,gHAAgH;AAChH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAwDxF;AAID,iFAAiF;AACjF,iBAAS,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAYhD;AAED,yFAAyF;AACzF,eAAO,MAAM,iBAAiB,uBAAiB,CAAC;AAUhD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CA+B9E;AASD,KAAK,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AAkR/D,iFAAiF;AACjF,wBAAgB,cAAc,CAC7B,IAAI,EAAE,YAAY,GAAG,SAAS,EAC9B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,OAAO,EACjB,MAAM,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,GAC/B,MAAM,CAGR;AAiID,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/extensions/todo/view.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAOpE,OAAO,EAEN,KAAK,UAAU,EAEf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,UAAU,EACf,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAIlD,CAAC;AAmBF,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAEtD;AAsBD,gHAAgH;AAChH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAwDxF;AAID,iFAAiF;AACjF,iBAAS,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAYhD;AAED,yFAAyF;AACzF,eAAO,MAAM,iBAAiB,uBAAiB,CAAC;AAUhD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CA+B9E;AASD,KAAK,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AAkR/D,iFAAiF;AACjF,wBAAgB,cAAc,CAC7B,IAAI,EAAE,YAAY,GAAG,SAAS,EAC9B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,OAAO,EACjB,MAAM,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,GAC/B,MAAM,CAGR;AAiID,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;CAClC;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAyBnH"}
|
|
@@ -175,7 +175,7 @@ const CALL_ITEMS_MAX = TODO_MAX_BATCH_ITEMS;
|
|
|
175
175
|
const CALL_SUBJECT_PREVIEW_COUNT = 2;
|
|
176
176
|
const CALL_SUBJECT_PREVIEW_WIDTH = 72;
|
|
177
177
|
const CALL_DESCRIPTION_PREVIEW_LENGTH = 120;
|
|
178
|
-
const
|
|
178
|
+
const SUMMARY_FAILURE_MAX_LENGTH = 120;
|
|
179
179
|
/** Record-like read; proxies that throw on inspection are treated as absent. */
|
|
180
180
|
function safeRecord(value) {
|
|
181
181
|
try {
|
|
@@ -485,7 +485,7 @@ function updatedEntries(value) {
|
|
|
485
485
|
}
|
|
486
486
|
return entries;
|
|
487
487
|
}
|
|
488
|
-
function
|
|
488
|
+
function formatTodoSuccessSummary(args, theme, result) {
|
|
489
489
|
const parsed = todoDetails(result.details);
|
|
490
490
|
if (!parsed)
|
|
491
491
|
return undefined;
|
|
@@ -546,8 +546,8 @@ function formatTodoGroupSuccess(args, theme, result) {
|
|
|
546
546
|
void args;
|
|
547
547
|
return segments.join(theme.fg("dim", " ; "));
|
|
548
548
|
}
|
|
549
|
-
/** Compact result-aware summary
|
|
550
|
-
export function
|
|
549
|
+
/** Compact result-aware one-line summary of a collapsed todo row. */
|
|
550
|
+
export function formatTodoSummary(args, theme, context) {
|
|
551
551
|
if (context.isError) {
|
|
552
552
|
let reason = "tool failed";
|
|
553
553
|
try {
|
|
@@ -560,7 +560,8 @@ export function formatTodoGroupCall(args, theme, context) {
|
|
|
560
560
|
.trim();
|
|
561
561
|
if (!text)
|
|
562
562
|
continue;
|
|
563
|
-
reason =
|
|
563
|
+
reason =
|
|
564
|
+
text.length > SUMMARY_FAILURE_MAX_LENGTH ? `${text.slice(0, SUMMARY_FAILURE_MAX_LENGTH - 1)}…` : text;
|
|
564
565
|
break;
|
|
565
566
|
}
|
|
566
567
|
}
|
|
@@ -570,7 +571,7 @@ export function formatTodoGroupCall(args, theme, context) {
|
|
|
570
571
|
return `${formatTodoCall(args, theme, false)} ${theme.fg("error", `failed: ${reason}`)}`;
|
|
571
572
|
}
|
|
572
573
|
if (!context.isPartial && context.result) {
|
|
573
|
-
const summary =
|
|
574
|
+
const summary = formatTodoSuccessSummary(args, theme, context.result);
|
|
574
575
|
if (summary)
|
|
575
576
|
return summary;
|
|
576
577
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/extensions/todo/view.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * todo/view.ts — v3 presentation: the one-line above-editor widget renderer,\n * tool call/group renderers, the /todos list formatter, and model-facing\n * result text. Wire input (args, details, snapshots) is read defensively and\n * bounded so partial or hostile input cannot grow output without limit.\n */\n\nimport { truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult } from \"../../core/extensions/types.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport {\n\tTODO_MAX_BATCH_ITEMS,\n\tTODO_MAX_DESCRIPTION_LENGTH,\n\tTODO_MAX_ITEMS,\n\tTODO_MAX_SUBJECT_LENGTH,\n} from \"./constants.ts\";\nimport {\n\tTODO_DETAILS_SCHEMA_VERSION,\n\ttype TodoChange,\n\ttype TodoItem,\n\ttype TodoParams,\n\ttype TodoState,\n\ttype TodoStatus,\n} from \"./schema.ts\";\n\nexport const STATUS_MARK: Record<TodoStatus, string> = {\n\tpending: \"[ ]\",\n\tin_progress: \"[>]\",\n\tcompleted: \"[x]\",\n};\n\nconst STATUS_COLOR: Record<TodoStatus, \"dim\" | \"warning\" | \"success\"> = {\n\tpending: \"dim\",\n\tin_progress: \"warning\",\n\tcompleted: \"success\",\n};\n\nconst STATUS_RANK: Record<TodoStatus, number> = {\n\tin_progress: 0,\n\tpending: 1,\n\tcompleted: 2,\n};\n\n// --- One-line widget --------------------------------------------------------\n\nconst WIDGET_HEADER_SEPARATOR = \" · \";\nconst WIDGET_ITEM_SEPARATOR = \" \";\n\n/** True while any open task exists; the widget is registered only in that case. */\nexport function hasOpenTodos(state: TodoState): boolean {\n\treturn state.items.some((item) => item.status === \"pending\" || item.status === \"in_progress\");\n}\n\n/** Status counts across the whole list. */\nfunction widgetCounts(state: TodoState): { active: number; pending: number; completed: number } {\n\tconst counts = { active: 0, pending: 0, completed: 0 };\n\tfor (const item of state.items) {\n\t\tif (item.status === \"in_progress\") counts.active++;\n\t\telse if (item.status === \"pending\") counts.pending++;\n\t\telse counts.completed++;\n\t}\n\treturn counts;\n}\n\nfunction widgetSegment(item: TodoItem, subject: string, theme: Theme): string {\n\treturn `${theme.fg(STATUS_COLOR[item.status], STATUS_MARK[item.status])} ${theme.fg(\"accent\", `#${item.id}`)} ${theme.fg(\"text\", subject)}`;\n}\n\nfunction widgetLine(header: string, segments: string[], overflow: string): string {\n\tconst body = [...segments, ...(overflow ? [overflow] : [])].join(WIDGET_ITEM_SEPARATOR);\n\treturn body ? `${header}${WIDGET_HEADER_SEPARATOR}${body}` : header;\n}\n\n/** One-line widget: `Todos 2/6 · [>] #4 s [ ] #5 s +N more`; only hidden open tasks count in the overflow. */\nexport function renderWidgetLine(state: TodoState, theme: Theme, width: number): string[] {\n\tconst safeWidth = Math.max(1, width);\n\tconst items = state.items;\n\tconst candidates = items\n\t\t.filter((item) => item.status !== \"completed\")\n\t\t.sort((first, second) => STATUS_RANK[first.status] - STATUS_RANK[second.status] || first.id - second.id);\n\tif (candidates.length === 0) return [];\n\n\tconst total = items.length;\n\tconst completed = items.filter((item) => item.status === \"completed\").length;\n\tconst header = `${theme.fg(\"accent\", \"Todos\")} ${theme.fg(\"dim\", `${completed}/${total}`)}`;\n\tconst shown: Array<{ item: TodoItem; subject: string }> = [];\n\tlet overflow = \"\";\n\n\t// Count only open tasks not shown by the trial segments.\n\tconst bestOverflow = (trial: Array<{ item: TodoItem; subject: string }>): string | undefined => {\n\t\tconst remaining = candidates.length - trial.length;\n\t\tconst segments = trial.map((entry) => widgetSegment(entry.item, entry.subject, theme));\n\t\tif (remaining <= 0) return visibleWidth(widgetLine(header, segments, \"\")) <= safeWidth ? \"\" : undefined;\n\t\tconst short = theme.fg(\"dim\", `+${remaining} more`);\n\t\treturn visibleWidth(widgetLine(header, segments, short)) <= safeWidth ? short : undefined;\n\t};\n\n\t// Extreme narrow widths: the best summary that fits, then the bare header.\n\tconst fallback = (): string[] => {\n\t\tconst best = bestOverflow([]);\n\t\tif (best !== undefined) return [widgetLine(header, [], best)];\n\t\tif (visibleWidth(header) <= safeWidth) return [header];\n\t\treturn [truncateToWidth(header, safeWidth, \"…\")];\n\t};\n\n\t// Segments are added whole, active first then pending by id, while the\n\t// line keeps fitting; only the active subject may be truncated.\n\tfor (const candidate of candidates) {\n\t\tconst best = bestOverflow([...shown, { item: candidate, subject: candidate.subject }]);\n\t\tif (best !== undefined) {\n\t\t\tshown.push({ item: candidate, subject: candidate.subject });\n\t\t\toverflow = best;\n\t\t\tcontinue;\n\t\t}\n\t\tif (candidate.status !== \"in_progress\") break;\n\t\tconst remaining = candidates.length - shown.length - 1;\n\t\tconst suffix = remaining > 0 ? `${WIDGET_ITEM_SEPARATOR}+${remaining} more` : \"\";\n\t\tconst prefix = `${header}${WIDGET_HEADER_SEPARATOR}${widgetSegment(candidate, \"\", theme)}${suffix}`;\n\t\tconst available = safeWidth - visibleWidth(prefix);\n\t\tif (available < 1) return fallback();\n\t\tshown.push({ item: candidate, subject: truncateToWidth(candidate.subject, available, \"…\") });\n\t\toverflow = bestOverflow(shown) ?? \"\";\n\t}\n\n\tif (shown.length === 0) return fallback();\n\n\tconst segments = shown.map((entry) => widgetSegment(entry.item, entry.subject, theme));\n\tconst line = widgetLine(header, segments, overflow);\n\t// Safety net: the visible width always stays within the terminal width.\n\treturn [visibleWidth(line) <= safeWidth ? line : truncateToWidth(line, safeWidth, \"…\")];\n}\n\n// --- Full list (used by /todos and the model-facing list result) ------------\n\n/** `Todos: X in progress, Y pending, Z completed` header plus two-line tasks. */\nfunction formatTodoList(state: TodoState): string {\n\tif (state.items.length === 0) return \"No todos.\";\n\tconst counts = widgetCounts(state);\n\tconst lines = [`Todos: ${counts.active} in progress, ${counts.pending} pending, ${counts.completed} completed`];\n\tconst items = [...state.items].sort(\n\t\t(first, second) => STATUS_RANK[first.status] - STATUS_RANK[second.status] || first.id - second.id,\n\t);\n\tfor (const item of items) {\n\t\tlines.push(`${STATUS_MARK[item.status]} #${item.id} ${item.subject}`);\n\t\tlines.push(` ${item.description}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\n/** /todos command output: full list, subject line plus indented description per task. */\nexport const formatCommandList = formatTodoList;\n\n// --- Model-facing result text ------------------------------------------------\n\n/** `#1–#3` for a consecutive run, `#1, #2` otherwise. */\nfunction formatIdRange(ids: number[]): string {\n\tconst consecutive = ids.length > 1 && ids.every((id, index) => id === ids[0] + index);\n\treturn consecutive ? `#${ids[0]}–#${ids[ids.length - 1]}` : ids.map((id) => `#${id}`).join(\", \");\n}\n\n/**\n * One-line change summary for a completed call, e.g.\n * `Created 1 task: #7: Wire parser (in_progress); Updated #1 (pending -> completed): S; demoted #5 to pending; auto-removed completed #1–#3 to stay within 20`.\n * A call that changed nothing (including `{}`) returns the full list.\n */\nexport function formatTodoContent(change: TodoChange, state: TodoState): string {\n\tconst parts: string[] = [];\n\tif (change.created.length > 0) {\n\t\tconst labels = change.created.map((id) => {\n\t\t\tconst item = state.items.find((entry) => entry.id === id);\n\t\t\tif (!item) return `#${id}`;\n\t\t\tconst suffix = item.status === \"pending\" ? \"\" : ` (${item.status})`;\n\t\t\treturn `#${id}: ${item.subject}${suffix}`;\n\t\t});\n\t\tconst noun = change.created.length === 1 ? \"task\" : \"tasks\";\n\t\tparts.push(`Created ${change.created.length} ${noun}: ${labels.join(\"; \")}`);\n\t}\n\tfor (const entry of change.updated) {\n\t\tconst item = state.items.find((candidate) => candidate.id === entry.id);\n\t\tconst subject = item ? `: ${item.subject}` : \"\";\n\t\tconst transition = entry.from === entry.to ? \"\" : ` (${entry.from} -> ${entry.to})`;\n\t\tparts.push(`Updated #${entry.id}${transition}${subject}`);\n\t}\n\tif (change.demotedId !== undefined) parts.push(`demoted #${change.demotedId} to pending`);\n\tif (change.deleted.length > 0) {\n\t\tconst noun = change.deleted.length === 1 ? \"task\" : \"tasks\";\n\t\tconst labels = change.deleted.map((entry) => `#${entry.id}: ${entry.subject}`);\n\t\tparts.push(`Deleted ${change.deleted.length} ${noun}: ${labels.join(\"; \")}`);\n\t}\n\tfor (const id of change.absent) parts.push(`#${id} already absent`);\n\tif (change.evicted.length > 0) {\n\t\tconst ids = change.evicted.map((entry) => entry.id);\n\t\tparts.push(`auto-removed completed ${formatIdRange(ids)} to stay within ${TODO_MAX_ITEMS}`);\n\t}\n\tif (parts.length === 0) return formatTodoList(state);\n\treturn parts.join(\"; \");\n}\n\n// --- Tool calls and collapsed group summaries -------------------------------\n\n// Collapsed todo calls join the `todo` group as one headline per row. Args can\n// be partial or hostile and details may come from any source, so one defensive\n// reading family (record/field/text/id/status/array) serves both renderers.\n// Output stays bounded: batches at 20, subjects at 160, descriptions at 500.\n\ntype TodoCallArgs = Partial<Record<keyof TodoParams, unknown>>;\n\nconst CALL_ITEMS_MAX = TODO_MAX_BATCH_ITEMS;\nconst CALL_SUBJECT_PREVIEW_COUNT = 2;\nconst CALL_SUBJECT_PREVIEW_WIDTH = 72;\nconst CALL_DESCRIPTION_PREVIEW_LENGTH = 120;\nconst GROUP_FAILURE_MAX_LENGTH = 120;\n\n/** Record-like read; proxies that throw on inspection are treated as absent. */\nfunction safeRecord(value: unknown): Record<string, unknown> | undefined {\n\ttry {\n\t\treturn value !== null && typeof value === \"object\" && !Array.isArray(value)\n\t\t\t? (value as Record<string, unknown>)\n\t\t\t: undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Field read that never throws, even for exotic objects with throwing getters. */\nfunction safeValue(record: Record<string, unknown> | undefined, key: string): unknown {\n\ttry {\n\t\treturn record?.[key];\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction safeString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\n/** Trimmed, whitespace-collapsed, length-clipped text (empty when absent). */\nfunction clipText(value: unknown, max: number): string {\n\treturn safeString(value)?.trim().replace(/\\s+/g, \" \").slice(0, max) ?? \"\";\n}\n\nconst safeSubject = (value: unknown): string => clipText(value, TODO_MAX_SUBJECT_LENGTH);\nconst safeDescription = (value: unknown): string => clipText(value, TODO_MAX_DESCRIPTION_LENGTH);\n\nfunction safeId(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 1 ? value : undefined;\n}\n\nfunction safeStatus(value: unknown): TodoStatus | undefined {\n\tconst status = safeString(value);\n\tif (status === \"pending\" || status === \"in_progress\" || status === \"completed\") return status;\n\treturn undefined;\n}\n\nfunction readArray(value: unknown, limit = CALL_ITEMS_MAX): { values: unknown[]; length: number } | undefined {\n\ttry {\n\t\tif (!Array.isArray(value)) return undefined;\n\t\tconst length = value.length;\n\t\tconst values: unknown[] = [];\n\t\tfor (let index = 0; index < Math.min(length, limit); index++) {\n\t\t\ttry {\n\t\t\t\tvalues.push(value[index]);\n\t\t\t} catch {\n\t\t\t\tvalues.push(undefined);\n\t\t\t}\n\t\t}\n\t\treturn { values, length };\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Id lists: invalid entries drop (rendering never rejects the whole call). */\nfunction readIds(value: unknown): number[] | undefined {\n\tconst array = readArray(value);\n\tif (!array) return undefined;\n\tconst ids: number[] = [];\n\tfor (const entry of array.values) {\n\t\tconst id = safeId(entry);\n\t\tif (id !== undefined) ids.push(id);\n\t}\n\treturn ids;\n}\n\ninterface CreateCallItem {\n\tsubject: string;\n\tdescription: string;\n\tstatus?: TodoStatus;\n}\n\n/** Create args: sparse or invalid entries drop; the batch caps at the maximum. */\nfunction batchCreateItems(value: unknown): CreateCallItem[] {\n\tconst result: CreateCallItem[] = [];\n\tfor (const raw of readArray(value)?.values ?? []) {\n\t\tconst item = safeRecord(raw);\n\t\tif (!item) continue;\n\t\tconst entry: CreateCallItem = {\n\t\t\tsubject: safeSubject(safeValue(item, \"subject\")),\n\t\t\tdescription: safeDescription(safeValue(item, \"description\")),\n\t\t};\n\t\tconst status = safeStatus(safeValue(item, \"status\"));\n\t\tif (status) entry.status = status;\n\t\tresult.push(entry);\n\t}\n\treturn result;\n}\n\ninterface UpdateCallItem {\n\tid?: number;\n\tsubject: string;\n\tdescription: string;\n\tstatus?: TodoStatus;\n}\n\n/** Update args: sparse or invalid entries drop; the batch caps at the maximum. */\nfunction batchUpdateItems(value: unknown): UpdateCallItem[] {\n\tconst result: UpdateCallItem[] = [];\n\tfor (const raw of readArray(value)?.values ?? []) {\n\t\tconst item = safeRecord(raw);\n\t\tif (!item) continue;\n\t\tconst entry: UpdateCallItem = {\n\t\t\tsubject: safeSubject(safeValue(item, \"subject\")),\n\t\t\tdescription: safeDescription(safeValue(item, \"description\")),\n\t\t};\n\t\tconst id = safeId(safeValue(item, \"id\"));\n\t\tif (id !== undefined) entry.id = id;\n\t\tconst status = safeStatus(safeValue(item, \"status\"));\n\t\tif (status) entry.status = status;\n\t\tresult.push(entry);\n\t}\n\treturn result;\n}\n\nfunction descriptionPreview(value: string): string {\n\tconst text = value.replace(/\\s+/g, \" \");\n\treturn text.length > CALL_DESCRIPTION_PREVIEW_LENGTH\n\t\t? `${text.slice(0, CALL_DESCRIPTION_PREVIEW_LENGTH - 1)}…`\n\t\t: text;\n}\n\n/** At most two subjects, each truncated to the preview width, plus `+N more`. */\nfunction formatSubjectPreview(subjects: string[], total: number): string {\n\t// Filter before slicing so an empty subject (streaming args) does not consume\n\t// a preview slot.\n\tconst shown = subjects\n\t\t.filter(Boolean)\n\t\t.slice(0, CALL_SUBJECT_PREVIEW_COUNT)\n\t\t.map((subject) => truncateToWidth(subject, CALL_SUBJECT_PREVIEW_WIDTH, \"…\"));\n\tif (!shown.length) return \"\";\n\tconst hidden = Math.max(0, total - shown.length);\n\treturn `${shown.join(\", \")}${hidden ? `, +${hidden} more` : \"\"}`;\n}\n\n/** v3 details guard shared by the call and group renderers. */\nfunction todoDetails(value: unknown): { change: Record<string, unknown>; state: Record<string, unknown> } | undefined {\n\tconst details = safeRecord(value);\n\tif (!details || safeValue(details, \"schemaVersion\") !== TODO_DETAILS_SCHEMA_VERSION) return undefined;\n\tconst change = safeRecord(safeValue(details, \"change\"));\n\tconst state = safeRecord(safeValue(details, \"state\"));\n\tif (!change || !state) return undefined;\n\treturn { change, state };\n}\n\n/** Result ids for an expanded create, only when they match the shown items. */\nfunction createResultIds(result: AgentToolResult<unknown> | undefined, count: number): number[] | undefined {\n\tconst details = todoDetails(result?.details);\n\tif (!details) return undefined;\n\tconst ids = readIds(safeValue(details.change, \"created\"));\n\treturn ids && ids.length === count && count > 0 ? ids : undefined;\n}\n\n/** Removed entries from a settled result, for the expanded delete detail lines. */\nfunction deleteResultRemoved(result: AgentToolResult<unknown> | undefined): Array<{ id: number; subject: string }> {\n\tconst details = todoDetails(result?.details);\n\tif (!details) return [];\n\treturn idSubjectEntries(safeValue(details.change, \"deleted\"));\n}\n\n/** Absent ids from a settled delete, for the expanded delete detail lines. */\nfunction deleteResultAbsent(result: AgentToolResult<unknown> | undefined): number[] {\n\tconst details = todoDetails(result?.details);\n\tif (!details) return [];\n\treturn readIds(safeValue(details.change, \"absent\")) ?? [];\n}\n\n/** Headline plus the parameters the result never echoes as detail lines. */\nfunction formatCallParts(\n\targs: TodoCallArgs | undefined,\n\ttheme: Theme,\n\tresult?: AgentToolResult<unknown>,\n): { headline: string; details: string[] } {\n\tconst details: string[] = [];\n\tconst segments: string[] = [];\n\tconst pushSegment = (verb: string, body: string): void => {\n\t\tconst title = segments.length === 0 ? `todo ${verb}` : verb;\n\t\tsegments.push(\n\t\t\tbody ? `${theme.fg(\"toolTitle\", theme.bold(title))} ${body}` : theme.fg(\"toolTitle\", theme.bold(title)),\n\t\t);\n\t};\n\n\tconst hasCreate = args?.create !== undefined;\n\tconst hasUpdate = args?.update !== undefined;\n\tconst hasDelete = args?.delete !== undefined;\n\n\tif (hasCreate) {\n\t\tconst items = batchCreateItems(args?.create);\n\t\tconst rawCount = readArray(args?.create)?.length;\n\t\t// An empty array is strict-mode filler: the call lists the tasks, so the\n\t\t// group earns no segment of its own.\n\t\tif (rawCount !== 0) {\n\t\t\tconst body: string[] = [];\n\t\t\tif (rawCount !== undefined) {\n\t\t\t\tconst count = Math.min(rawCount, CALL_ITEMS_MAX);\n\t\t\t\tbody.push(theme.fg(\"dim\", `${count} ${count === 1 ? \"task\" : \"tasks\"}`));\n\t\t\t\tconst preview = formatSubjectPreview(\n\t\t\t\t\titems.map((item) => item.subject),\n\t\t\t\t\tcount,\n\t\t\t\t);\n\t\t\t\tif (preview) body.push(theme.fg(\"dim\", \"·\"), theme.fg(\"text\", preview));\n\t\t\t}\n\t\t\tpushSegment(\"create\", body.join(\" \"));\n\t\t}\n\t\tconst ids = createResultIds(result, items.length);\n\t\tfor (const [index, item] of items.entries()) {\n\t\t\tconst marker = ids ? theme.fg(\"accent\", `#${ids[index]}`) : theme.fg(\"accent\", `${index + 1}.`);\n\t\t\tconst status =\n\t\t\t\titem.status && item.status !== \"pending\"\n\t\t\t\t\t? ` ${theme.fg(STATUS_COLOR[item.status], `(${item.status})`)}`\n\t\t\t\t\t: \"\";\n\t\t\tdetails.push(item.subject ? `${marker} ${theme.fg(\"text\", item.subject)}${status}` : marker);\n\t\t\tif (item.description) details.push(` ${theme.fg(\"dim\", descriptionPreview(item.description))}`);\n\t\t}\n\t}\n\n\tif (hasUpdate) {\n\t\tconst items = batchUpdateItems(args?.update);\n\t\tconst rawCount = readArray(args?.update)?.length;\n\t\tif (rawCount !== 0) {\n\t\t\tconst entries: string[] = [];\n\t\t\tfor (const item of items) {\n\t\t\t\tconst parts: string[] = [];\n\t\t\t\tif (item.id !== undefined) parts.push(theme.fg(\"accent\", `#${item.id}`));\n\t\t\t\tif (item.status) parts.push(theme.fg(STATUS_COLOR[item.status], item.status));\n\t\t\t\tif (item.subject)\n\t\t\t\t\tparts.push(theme.fg(\"text\", truncateToWidth(item.subject, CALL_SUBJECT_PREVIEW_WIDTH, \"…\")));\n\t\t\t\tif (parts.length > 0) entries.push(parts.join(\" \"));\n\t\t\t}\n\t\t\tpushSegment(\"update\", entries.join(theme.fg(\"dim\", \", \")));\n\t\t}\n\t\tfor (const item of items) {\n\t\t\tif (item.description) details.push(` ${theme.fg(\"dim\", descriptionPreview(item.description))}`);\n\t\t}\n\t}\n\n\tif (hasDelete) {\n\t\tconst rawCount = readArray(args?.delete)?.length;\n\t\tif (rawCount !== 0) {\n\t\t\tconst ids = readIds(args?.delete) ?? [];\n\t\t\tpushSegment(\"delete\", ids.length > 0 ? theme.fg(\"accent\", ids.map((id) => `#${id}`).join(\", \")) : \"\");\n\t\t}\n\t\t// The headline already carries the ids, so details only earn their lines\n\t\t// once the result names what was actually removed or already absent.\n\t\tfor (const entry of deleteResultRemoved(result)) {\n\t\t\tdetails.push(`${theme.fg(\"accent\", `#${entry.id}`)} ${theme.fg(\"text\", entry.subject)}`);\n\t\t}\n\t\tfor (const id of deleteResultAbsent(result)) {\n\t\t\tdetails.push(theme.fg(\"dim\", `#${id} already absent`));\n\t\t}\n\t}\n\n\tif (segments.length === 0) {\n\t\t// No group fields at all: the call lists the tasks.\n\t\tsegments.push(theme.fg(\"toolTitle\", theme.bold(\"todo list\")));\n\t}\n\n\treturn { headline: segments.join(theme.fg(\"dim\", \" ; \")), details };\n}\n\n/** One-line call summary when collapsed; headline plus details when expanded. */\nexport function formatTodoCall(\n\targs: TodoCallArgs | undefined,\n\ttheme: Theme,\n\texpanded: boolean,\n\tresult?: AgentToolResult<unknown>,\n): string {\n\tconst { headline, details } = formatCallParts(args, theme, result);\n\treturn !expanded || details.length === 0 ? headline : [headline, ...details].join(\"\\n\");\n}\n\n/** Id -> item index plus status counts over the v3 snapshot (one defensive walk). */\nfunction stateIndex(state: Record<string, unknown>):\n\t| {\n\t\t\tbyId: Map<number, Record<string, unknown>>;\n\t\t\tcounts: { inProgress: number; pending: number; completed: number };\n\t }\n\t| undefined {\n\tconst array = readArray(safeValue(state, \"items\"), TODO_MAX_ITEMS);\n\tif (!array || array.length > TODO_MAX_ITEMS) return undefined;\n\tconst byId = new Map<number, Record<string, unknown>>();\n\tconst counts = { inProgress: 0, pending: 0, completed: 0 };\n\tfor (const raw of array.values) {\n\t\tconst item = safeRecord(raw);\n\t\tif (!item) continue;\n\t\tconst id = safeId(safeValue(item, \"id\"));\n\t\tif (id !== undefined && !byId.has(id)) byId.set(id, item);\n\t\tconst status = safeStatus(safeValue(item, \"status\"));\n\t\tif (status === \"in_progress\") counts.inProgress++;\n\t\telse if (status === \"pending\") counts.pending++;\n\t\telse if (status === \"completed\") counts.completed++;\n\t}\n\treturn { byId, counts };\n}\n\nfunction stateSubject(map: Map<number, Record<string, unknown>>, id: number): string {\n\tconst item = map.get(id);\n\treturn item ? safeSubject(safeValue(item, \"subject\")) : \"\";\n}\n\n/** Id+subject entries (deleted, evicted): invalid entries drop. */\nfunction idSubjectEntries(value: unknown): Array<{ id: number; subject: string }> {\n\tconst entries: Array<{ id: number; subject: string }> = [];\n\tfor (const raw of readArray(value)?.values ?? []) {\n\t\tconst item = safeRecord(raw);\n\t\tconst id = safeId(safeValue(item, \"id\"));\n\t\tconst subject = safeSubject(safeValue(item, \"subject\"));\n\t\tif (id === undefined || !subject) continue;\n\t\tentries.push({ id, subject });\n\t}\n\treturn entries;\n}\n\n/** Updated entries: {id, from, to} records, invalid entries drop. */\nfunction updatedEntries(value: unknown): Array<{ id: number; from?: TodoStatus; to?: TodoStatus }> {\n\tconst entries: Array<{ id: number; from?: TodoStatus; to?: TodoStatus }> = [];\n\tfor (const raw of readArray(value)?.values ?? []) {\n\t\tconst item = safeRecord(raw);\n\t\tconst id = safeId(safeValue(item, \"id\"));\n\t\tif (id === undefined) continue;\n\t\tconst entry: { id: number; from?: TodoStatus; to?: TodoStatus } = { id };\n\t\tconst from = safeStatus(safeValue(item, \"from\"));\n\t\tif (from) entry.from = from;\n\t\tconst to = safeStatus(safeValue(item, \"to\"));\n\t\tif (to) entry.to = to;\n\t\tentries.push(entry);\n\t}\n\treturn entries;\n}\n\nfunction formatTodoGroupSuccess(\n\targs: TodoCallArgs | undefined,\n\ttheme: Theme,\n\tresult: AgentToolResult<unknown>,\n): string | undefined {\n\tconst parsed = todoDetails(result.details);\n\tif (!parsed) return undefined;\n\tconst { change, state } = parsed;\n\tconst index = stateIndex(state);\n\tconst segments: string[] = [];\n\tconst pushVerb = (word: string, body: string): void => {\n\t\tconst title = segments.length === 0 ? `todo ${word}` : word;\n\t\tsegments.push(body ? `${theme.fg(\"toolTitle\", title)} ${body}` : theme.fg(\"toolTitle\", title));\n\t};\n\tconst withPreview = (word: string, ids: number[], subjects: string[]): void => {\n\t\tconst text = formatSubjectPreview(subjects, subjects.length);\n\t\tconst base = theme.fg(\"accent\", formatIdRange(ids));\n\t\tpushVerb(word, text ? `${base}${theme.fg(\"dim\", \" · \")}${theme.fg(\"text\", text)}` : base);\n\t};\n\n\tconst created = readIds(safeValue(change, \"created\")) ?? [];\n\tif (created.length > 0 && index) {\n\t\twithPreview(\n\t\t\t\"created\",\n\t\t\tcreated,\n\t\t\tcreated.map((id) => stateSubject(index.byId, id)),\n\t\t);\n\t}\n\tfor (const entry of updatedEntries(safeValue(change, \"updated\"))) {\n\t\tconst parts = [theme.fg(\"accent\", `#${entry.id}`)];\n\t\tif (entry.to) parts.push(theme.fg(STATUS_COLOR[entry.to], entry.to));\n\t\tconst subject = index ? stateSubject(index.byId, entry.id) : \"\";\n\t\tif (subject) parts.push(theme.fg(\"text\", truncateToWidth(subject, CALL_SUBJECT_PREVIEW_WIDTH, \"…\")));\n\t\tpushVerb(\"updated\", parts.join(\" \"));\n\t}\n\tconst demotedId = safeId(safeValue(change, \"demotedId\"));\n\tif (demotedId !== undefined) segments.push(theme.fg(\"dim\", `demoted #${demotedId}`));\n\tconst deleted = idSubjectEntries(safeValue(change, \"deleted\"));\n\tif (deleted.length > 0) {\n\t\twithPreview(\n\t\t\t\"deleted\",\n\t\t\tdeleted.map((entry) => entry.id),\n\t\t\tdeleted.map((entry) => entry.subject),\n\t\t);\n\t}\n\tfor (const id of readIds(safeValue(change, \"absent\")) ?? []) {\n\t\tsegments.push(theme.fg(\"dim\", `#${id} already absent`));\n\t}\n\tconst evicted = idSubjectEntries(safeValue(change, \"evicted\"));\n\tif (evicted.length > 0) {\n\t\tsegments.push(theme.fg(\"dim\", `auto-removed ${evicted.map((entry) => `#${entry.id}`).join(\", \")}`));\n\t}\n\n\tif (segments.length === 0) {\n\t\t// Empty change: the call listed the tasks.\n\t\tif (!index) return undefined;\n\t\tconst parts: string[] = [];\n\t\tif (index.counts.inProgress > 0) parts.push(`${index.counts.inProgress} in progress`);\n\t\tif (index.counts.pending > 0) parts.push(`${index.counts.pending} pending`);\n\t\tif (index.counts.completed > 0) parts.push(`${index.counts.completed} completed`);\n\t\treturn `${theme.fg(\"toolTitle\", \"todo list\")}: ${theme.fg(\"dim\", parts.length ? parts.join(\", \") : \"no tasks\")}`;\n\t}\n\t// The update segment can still pick up the requested subject when the state\n\t// no longer holds it (e.g. the task was deleted by a hostile snapshot).\n\tvoid args;\n\treturn segments.join(theme.fg(\"dim\", \" ; \"));\n}\n\nexport interface TodoGroupRenderContext {\n\tisError: boolean;\n\tisPartial: boolean;\n\tresult?: AgentToolResult<unknown>;\n}\n\n/** Compact result-aware summary used only by collapsed todo tool groups. */\nexport function formatTodoGroupCall(\n\targs: TodoCallArgs | undefined,\n\ttheme: Theme,\n\tcontext: TodoGroupRenderContext,\n): string {\n\tif (context.isError) {\n\t\tlet reason = \"tool failed\";\n\t\ttry {\n\t\t\tfor (const block of context.result?.content.slice(0, 8) ?? []) {\n\t\t\t\tif (block.type !== \"text\" || typeof block.text !== \"string\") continue;\n\t\t\t\tconst text = block.text\n\t\t\t\t\t.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \")\n\t\t\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t\t\t.trim();\n\t\t\t\tif (!text) continue;\n\t\t\t\treason = text.length > GROUP_FAILURE_MAX_LENGTH ? `${text.slice(0, GROUP_FAILURE_MAX_LENGTH - 1)}…` : text;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Tool results can come from historical or third-party sources.\n\t\t}\n\t\treturn `${formatTodoCall(args, theme, false)} ${theme.fg(\"error\", `failed: ${reason}`)}`;\n\t}\n\tif (!context.isPartial && context.result) {\n\t\tconst summary = formatTodoGroupSuccess(args, theme, context.result);\n\t\tif (summary) return summary;\n\t}\n\treturn formatTodoCall(args, theme, false);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/extensions/todo/view.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * todo/view.ts — v3 presentation: the one-line above-editor widget renderer,\n * tool call/group renderers, the /todos list formatter, and model-facing\n * result text. Wire input (args, details, snapshots) is read defensively and\n * bounded so partial or hostile input cannot grow output without limit.\n */\n\nimport { truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult } from \"../../core/extensions/types.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport {\n\tTODO_MAX_BATCH_ITEMS,\n\tTODO_MAX_DESCRIPTION_LENGTH,\n\tTODO_MAX_ITEMS,\n\tTODO_MAX_SUBJECT_LENGTH,\n} from \"./constants.ts\";\nimport {\n\tTODO_DETAILS_SCHEMA_VERSION,\n\ttype TodoChange,\n\ttype TodoItem,\n\ttype TodoParams,\n\ttype TodoState,\n\ttype TodoStatus,\n} from \"./schema.ts\";\n\nexport const STATUS_MARK: Record<TodoStatus, string> = {\n\tpending: \"[ ]\",\n\tin_progress: \"[>]\",\n\tcompleted: \"[x]\",\n};\n\nconst STATUS_COLOR: Record<TodoStatus, \"dim\" | \"warning\" | \"success\"> = {\n\tpending: \"dim\",\n\tin_progress: \"warning\",\n\tcompleted: \"success\",\n};\n\nconst STATUS_RANK: Record<TodoStatus, number> = {\n\tin_progress: 0,\n\tpending: 1,\n\tcompleted: 2,\n};\n\n// --- One-line widget --------------------------------------------------------\n\nconst WIDGET_HEADER_SEPARATOR = \" · \";\nconst WIDGET_ITEM_SEPARATOR = \" \";\n\n/** True while any open task exists; the widget is registered only in that case. */\nexport function hasOpenTodos(state: TodoState): boolean {\n\treturn state.items.some((item) => item.status === \"pending\" || item.status === \"in_progress\");\n}\n\n/** Status counts across the whole list. */\nfunction widgetCounts(state: TodoState): { active: number; pending: number; completed: number } {\n\tconst counts = { active: 0, pending: 0, completed: 0 };\n\tfor (const item of state.items) {\n\t\tif (item.status === \"in_progress\") counts.active++;\n\t\telse if (item.status === \"pending\") counts.pending++;\n\t\telse counts.completed++;\n\t}\n\treturn counts;\n}\n\nfunction widgetSegment(item: TodoItem, subject: string, theme: Theme): string {\n\treturn `${theme.fg(STATUS_COLOR[item.status], STATUS_MARK[item.status])} ${theme.fg(\"accent\", `#${item.id}`)} ${theme.fg(\"text\", subject)}`;\n}\n\nfunction widgetLine(header: string, segments: string[], overflow: string): string {\n\tconst body = [...segments, ...(overflow ? [overflow] : [])].join(WIDGET_ITEM_SEPARATOR);\n\treturn body ? `${header}${WIDGET_HEADER_SEPARATOR}${body}` : header;\n}\n\n/** One-line widget: `Todos 2/6 · [>] #4 s [ ] #5 s +N more`; only hidden open tasks count in the overflow. */\nexport function renderWidgetLine(state: TodoState, theme: Theme, width: number): string[] {\n\tconst safeWidth = Math.max(1, width);\n\tconst items = state.items;\n\tconst candidates = items\n\t\t.filter((item) => item.status !== \"completed\")\n\t\t.sort((first, second) => STATUS_RANK[first.status] - STATUS_RANK[second.status] || first.id - second.id);\n\tif (candidates.length === 0) return [];\n\n\tconst total = items.length;\n\tconst completed = items.filter((item) => item.status === \"completed\").length;\n\tconst header = `${theme.fg(\"accent\", \"Todos\")} ${theme.fg(\"dim\", `${completed}/${total}`)}`;\n\tconst shown: Array<{ item: TodoItem; subject: string }> = [];\n\tlet overflow = \"\";\n\n\t// Count only open tasks not shown by the trial segments.\n\tconst bestOverflow = (trial: Array<{ item: TodoItem; subject: string }>): string | undefined => {\n\t\tconst remaining = candidates.length - trial.length;\n\t\tconst segments = trial.map((entry) => widgetSegment(entry.item, entry.subject, theme));\n\t\tif (remaining <= 0) return visibleWidth(widgetLine(header, segments, \"\")) <= safeWidth ? \"\" : undefined;\n\t\tconst short = theme.fg(\"dim\", `+${remaining} more`);\n\t\treturn visibleWidth(widgetLine(header, segments, short)) <= safeWidth ? short : undefined;\n\t};\n\n\t// Extreme narrow widths: the best summary that fits, then the bare header.\n\tconst fallback = (): string[] => {\n\t\tconst best = bestOverflow([]);\n\t\tif (best !== undefined) return [widgetLine(header, [], best)];\n\t\tif (visibleWidth(header) <= safeWidth) return [header];\n\t\treturn [truncateToWidth(header, safeWidth, \"…\")];\n\t};\n\n\t// Segments are added whole, active first then pending by id, while the\n\t// line keeps fitting; only the active subject may be truncated.\n\tfor (const candidate of candidates) {\n\t\tconst best = bestOverflow([...shown, { item: candidate, subject: candidate.subject }]);\n\t\tif (best !== undefined) {\n\t\t\tshown.push({ item: candidate, subject: candidate.subject });\n\t\t\toverflow = best;\n\t\t\tcontinue;\n\t\t}\n\t\tif (candidate.status !== \"in_progress\") break;\n\t\tconst remaining = candidates.length - shown.length - 1;\n\t\tconst suffix = remaining > 0 ? `${WIDGET_ITEM_SEPARATOR}+${remaining} more` : \"\";\n\t\tconst prefix = `${header}${WIDGET_HEADER_SEPARATOR}${widgetSegment(candidate, \"\", theme)}${suffix}`;\n\t\tconst available = safeWidth - visibleWidth(prefix);\n\t\tif (available < 1) return fallback();\n\t\tshown.push({ item: candidate, subject: truncateToWidth(candidate.subject, available, \"…\") });\n\t\toverflow = bestOverflow(shown) ?? \"\";\n\t}\n\n\tif (shown.length === 0) return fallback();\n\n\tconst segments = shown.map((entry) => widgetSegment(entry.item, entry.subject, theme));\n\tconst line = widgetLine(header, segments, overflow);\n\t// Safety net: the visible width always stays within the terminal width.\n\treturn [visibleWidth(line) <= safeWidth ? line : truncateToWidth(line, safeWidth, \"…\")];\n}\n\n// --- Full list (used by /todos and the model-facing list result) ------------\n\n/** `Todos: X in progress, Y pending, Z completed` header plus two-line tasks. */\nfunction formatTodoList(state: TodoState): string {\n\tif (state.items.length === 0) return \"No todos.\";\n\tconst counts = widgetCounts(state);\n\tconst lines = [`Todos: ${counts.active} in progress, ${counts.pending} pending, ${counts.completed} completed`];\n\tconst items = [...state.items].sort(\n\t\t(first, second) => STATUS_RANK[first.status] - STATUS_RANK[second.status] || first.id - second.id,\n\t);\n\tfor (const item of items) {\n\t\tlines.push(`${STATUS_MARK[item.status]} #${item.id} ${item.subject}`);\n\t\tlines.push(` ${item.description}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\n/** /todos command output: full list, subject line plus indented description per task. */\nexport const formatCommandList = formatTodoList;\n\n// --- Model-facing result text ------------------------------------------------\n\n/** `#1–#3` for a consecutive run, `#1, #2` otherwise. */\nfunction formatIdRange(ids: number[]): string {\n\tconst consecutive = ids.length > 1 && ids.every((id, index) => id === ids[0] + index);\n\treturn consecutive ? `#${ids[0]}–#${ids[ids.length - 1]}` : ids.map((id) => `#${id}`).join(\", \");\n}\n\n/**\n * One-line change summary for a completed call, e.g.\n * `Created 1 task: #7: Wire parser (in_progress); Updated #1 (pending -> completed): S; demoted #5 to pending; auto-removed completed #1–#3 to stay within 20`.\n * A call that changed nothing (including `{}`) returns the full list.\n */\nexport function formatTodoContent(change: TodoChange, state: TodoState): string {\n\tconst parts: string[] = [];\n\tif (change.created.length > 0) {\n\t\tconst labels = change.created.map((id) => {\n\t\t\tconst item = state.items.find((entry) => entry.id === id);\n\t\t\tif (!item) return `#${id}`;\n\t\t\tconst suffix = item.status === \"pending\" ? \"\" : ` (${item.status})`;\n\t\t\treturn `#${id}: ${item.subject}${suffix}`;\n\t\t});\n\t\tconst noun = change.created.length === 1 ? \"task\" : \"tasks\";\n\t\tparts.push(`Created ${change.created.length} ${noun}: ${labels.join(\"; \")}`);\n\t}\n\tfor (const entry of change.updated) {\n\t\tconst item = state.items.find((candidate) => candidate.id === entry.id);\n\t\tconst subject = item ? `: ${item.subject}` : \"\";\n\t\tconst transition = entry.from === entry.to ? \"\" : ` (${entry.from} -> ${entry.to})`;\n\t\tparts.push(`Updated #${entry.id}${transition}${subject}`);\n\t}\n\tif (change.demotedId !== undefined) parts.push(`demoted #${change.demotedId} to pending`);\n\tif (change.deleted.length > 0) {\n\t\tconst noun = change.deleted.length === 1 ? \"task\" : \"tasks\";\n\t\tconst labels = change.deleted.map((entry) => `#${entry.id}: ${entry.subject}`);\n\t\tparts.push(`Deleted ${change.deleted.length} ${noun}: ${labels.join(\"; \")}`);\n\t}\n\tfor (const id of change.absent) parts.push(`#${id} already absent`);\n\tif (change.evicted.length > 0) {\n\t\tconst ids = change.evicted.map((entry) => entry.id);\n\t\tparts.push(`auto-removed completed ${formatIdRange(ids)} to stay within ${TODO_MAX_ITEMS}`);\n\t}\n\tif (parts.length === 0) return formatTodoList(state);\n\treturn parts.join(\"; \");\n}\n\n// --- Tool calls and collapsed group summaries -------------------------------\n\n// Collapsed todo calls join the `todo` group as one headline per row. Args can\n// be partial or hostile and details may come from any source, so one defensive\n// reading family (record/field/text/id/status/array) serves both renderers.\n// Output stays bounded: batches at 20, subjects at 160, descriptions at 500.\n\ntype TodoCallArgs = Partial<Record<keyof TodoParams, unknown>>;\n\nconst CALL_ITEMS_MAX = TODO_MAX_BATCH_ITEMS;\nconst CALL_SUBJECT_PREVIEW_COUNT = 2;\nconst CALL_SUBJECT_PREVIEW_WIDTH = 72;\nconst CALL_DESCRIPTION_PREVIEW_LENGTH = 120;\nconst SUMMARY_FAILURE_MAX_LENGTH = 120;\n\n/** Record-like read; proxies that throw on inspection are treated as absent. */\nfunction safeRecord(value: unknown): Record<string, unknown> | undefined {\n\ttry {\n\t\treturn value !== null && typeof value === \"object\" && !Array.isArray(value)\n\t\t\t? (value as Record<string, unknown>)\n\t\t\t: undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Field read that never throws, even for exotic objects with throwing getters. */\nfunction safeValue(record: Record<string, unknown> | undefined, key: string): unknown {\n\ttry {\n\t\treturn record?.[key];\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction safeString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\n/** Trimmed, whitespace-collapsed, length-clipped text (empty when absent). */\nfunction clipText(value: unknown, max: number): string {\n\treturn safeString(value)?.trim().replace(/\\s+/g, \" \").slice(0, max) ?? \"\";\n}\n\nconst safeSubject = (value: unknown): string => clipText(value, TODO_MAX_SUBJECT_LENGTH);\nconst safeDescription = (value: unknown): string => clipText(value, TODO_MAX_DESCRIPTION_LENGTH);\n\nfunction safeId(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value >= 1 ? value : undefined;\n}\n\nfunction safeStatus(value: unknown): TodoStatus | undefined {\n\tconst status = safeString(value);\n\tif (status === \"pending\" || status === \"in_progress\" || status === \"completed\") return status;\n\treturn undefined;\n}\n\nfunction readArray(value: unknown, limit = CALL_ITEMS_MAX): { values: unknown[]; length: number } | undefined {\n\ttry {\n\t\tif (!Array.isArray(value)) return undefined;\n\t\tconst length = value.length;\n\t\tconst values: unknown[] = [];\n\t\tfor (let index = 0; index < Math.min(length, limit); index++) {\n\t\t\ttry {\n\t\t\t\tvalues.push(value[index]);\n\t\t\t} catch {\n\t\t\t\tvalues.push(undefined);\n\t\t\t}\n\t\t}\n\t\treturn { values, length };\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Id lists: invalid entries drop (rendering never rejects the whole call). */\nfunction readIds(value: unknown): number[] | undefined {\n\tconst array = readArray(value);\n\tif (!array) return undefined;\n\tconst ids: number[] = [];\n\tfor (const entry of array.values) {\n\t\tconst id = safeId(entry);\n\t\tif (id !== undefined) ids.push(id);\n\t}\n\treturn ids;\n}\n\ninterface CreateCallItem {\n\tsubject: string;\n\tdescription: string;\n\tstatus?: TodoStatus;\n}\n\n/** Create args: sparse or invalid entries drop; the batch caps at the maximum. */\nfunction batchCreateItems(value: unknown): CreateCallItem[] {\n\tconst result: CreateCallItem[] = [];\n\tfor (const raw of readArray(value)?.values ?? []) {\n\t\tconst item = safeRecord(raw);\n\t\tif (!item) continue;\n\t\tconst entry: CreateCallItem = {\n\t\t\tsubject: safeSubject(safeValue(item, \"subject\")),\n\t\t\tdescription: safeDescription(safeValue(item, \"description\")),\n\t\t};\n\t\tconst status = safeStatus(safeValue(item, \"status\"));\n\t\tif (status) entry.status = status;\n\t\tresult.push(entry);\n\t}\n\treturn result;\n}\n\ninterface UpdateCallItem {\n\tid?: number;\n\tsubject: string;\n\tdescription: string;\n\tstatus?: TodoStatus;\n}\n\n/** Update args: sparse or invalid entries drop; the batch caps at the maximum. */\nfunction batchUpdateItems(value: unknown): UpdateCallItem[] {\n\tconst result: UpdateCallItem[] = [];\n\tfor (const raw of readArray(value)?.values ?? []) {\n\t\tconst item = safeRecord(raw);\n\t\tif (!item) continue;\n\t\tconst entry: UpdateCallItem = {\n\t\t\tsubject: safeSubject(safeValue(item, \"subject\")),\n\t\t\tdescription: safeDescription(safeValue(item, \"description\")),\n\t\t};\n\t\tconst id = safeId(safeValue(item, \"id\"));\n\t\tif (id !== undefined) entry.id = id;\n\t\tconst status = safeStatus(safeValue(item, \"status\"));\n\t\tif (status) entry.status = status;\n\t\tresult.push(entry);\n\t}\n\treturn result;\n}\n\nfunction descriptionPreview(value: string): string {\n\tconst text = value.replace(/\\s+/g, \" \");\n\treturn text.length > CALL_DESCRIPTION_PREVIEW_LENGTH\n\t\t? `${text.slice(0, CALL_DESCRIPTION_PREVIEW_LENGTH - 1)}…`\n\t\t: text;\n}\n\n/** At most two subjects, each truncated to the preview width, plus `+N more`. */\nfunction formatSubjectPreview(subjects: string[], total: number): string {\n\t// Filter before slicing so an empty subject (streaming args) does not consume\n\t// a preview slot.\n\tconst shown = subjects\n\t\t.filter(Boolean)\n\t\t.slice(0, CALL_SUBJECT_PREVIEW_COUNT)\n\t\t.map((subject) => truncateToWidth(subject, CALL_SUBJECT_PREVIEW_WIDTH, \"…\"));\n\tif (!shown.length) return \"\";\n\tconst hidden = Math.max(0, total - shown.length);\n\treturn `${shown.join(\", \")}${hidden ? `, +${hidden} more` : \"\"}`;\n}\n\n/** v3 details guard shared by the call and group renderers. */\nfunction todoDetails(value: unknown): { change: Record<string, unknown>; state: Record<string, unknown> } | undefined {\n\tconst details = safeRecord(value);\n\tif (!details || safeValue(details, \"schemaVersion\") !== TODO_DETAILS_SCHEMA_VERSION) return undefined;\n\tconst change = safeRecord(safeValue(details, \"change\"));\n\tconst state = safeRecord(safeValue(details, \"state\"));\n\tif (!change || !state) return undefined;\n\treturn { change, state };\n}\n\n/** Result ids for an expanded create, only when they match the shown items. */\nfunction createResultIds(result: AgentToolResult<unknown> | undefined, count: number): number[] | undefined {\n\tconst details = todoDetails(result?.details);\n\tif (!details) return undefined;\n\tconst ids = readIds(safeValue(details.change, \"created\"));\n\treturn ids && ids.length === count && count > 0 ? ids : undefined;\n}\n\n/** Removed entries from a settled result, for the expanded delete detail lines. */\nfunction deleteResultRemoved(result: AgentToolResult<unknown> | undefined): Array<{ id: number; subject: string }> {\n\tconst details = todoDetails(result?.details);\n\tif (!details) return [];\n\treturn idSubjectEntries(safeValue(details.change, \"deleted\"));\n}\n\n/** Absent ids from a settled delete, for the expanded delete detail lines. */\nfunction deleteResultAbsent(result: AgentToolResult<unknown> | undefined): number[] {\n\tconst details = todoDetails(result?.details);\n\tif (!details) return [];\n\treturn readIds(safeValue(details.change, \"absent\")) ?? [];\n}\n\n/** Headline plus the parameters the result never echoes as detail lines. */\nfunction formatCallParts(\n\targs: TodoCallArgs | undefined,\n\ttheme: Theme,\n\tresult?: AgentToolResult<unknown>,\n): { headline: string; details: string[] } {\n\tconst details: string[] = [];\n\tconst segments: string[] = [];\n\tconst pushSegment = (verb: string, body: string): void => {\n\t\tconst title = segments.length === 0 ? `todo ${verb}` : verb;\n\t\tsegments.push(\n\t\t\tbody ? `${theme.fg(\"toolTitle\", theme.bold(title))} ${body}` : theme.fg(\"toolTitle\", theme.bold(title)),\n\t\t);\n\t};\n\n\tconst hasCreate = args?.create !== undefined;\n\tconst hasUpdate = args?.update !== undefined;\n\tconst hasDelete = args?.delete !== undefined;\n\n\tif (hasCreate) {\n\t\tconst items = batchCreateItems(args?.create);\n\t\tconst rawCount = readArray(args?.create)?.length;\n\t\t// An empty array is strict-mode filler: the call lists the tasks, so the\n\t\t// group earns no segment of its own.\n\t\tif (rawCount !== 0) {\n\t\t\tconst body: string[] = [];\n\t\t\tif (rawCount !== undefined) {\n\t\t\t\tconst count = Math.min(rawCount, CALL_ITEMS_MAX);\n\t\t\t\tbody.push(theme.fg(\"dim\", `${count} ${count === 1 ? \"task\" : \"tasks\"}`));\n\t\t\t\tconst preview = formatSubjectPreview(\n\t\t\t\t\titems.map((item) => item.subject),\n\t\t\t\t\tcount,\n\t\t\t\t);\n\t\t\t\tif (preview) body.push(theme.fg(\"dim\", \"·\"), theme.fg(\"text\", preview));\n\t\t\t}\n\t\t\tpushSegment(\"create\", body.join(\" \"));\n\t\t}\n\t\tconst ids = createResultIds(result, items.length);\n\t\tfor (const [index, item] of items.entries()) {\n\t\t\tconst marker = ids ? theme.fg(\"accent\", `#${ids[index]}`) : theme.fg(\"accent\", `${index + 1}.`);\n\t\t\tconst status =\n\t\t\t\titem.status && item.status !== \"pending\"\n\t\t\t\t\t? ` ${theme.fg(STATUS_COLOR[item.status], `(${item.status})`)}`\n\t\t\t\t\t: \"\";\n\t\t\tdetails.push(item.subject ? `${marker} ${theme.fg(\"text\", item.subject)}${status}` : marker);\n\t\t\tif (item.description) details.push(` ${theme.fg(\"dim\", descriptionPreview(item.description))}`);\n\t\t}\n\t}\n\n\tif (hasUpdate) {\n\t\tconst items = batchUpdateItems(args?.update);\n\t\tconst rawCount = readArray(args?.update)?.length;\n\t\tif (rawCount !== 0) {\n\t\t\tconst entries: string[] = [];\n\t\t\tfor (const item of items) {\n\t\t\t\tconst parts: string[] = [];\n\t\t\t\tif (item.id !== undefined) parts.push(theme.fg(\"accent\", `#${item.id}`));\n\t\t\t\tif (item.status) parts.push(theme.fg(STATUS_COLOR[item.status], item.status));\n\t\t\t\tif (item.subject)\n\t\t\t\t\tparts.push(theme.fg(\"text\", truncateToWidth(item.subject, CALL_SUBJECT_PREVIEW_WIDTH, \"…\")));\n\t\t\t\tif (parts.length > 0) entries.push(parts.join(\" \"));\n\t\t\t}\n\t\t\tpushSegment(\"update\", entries.join(theme.fg(\"dim\", \", \")));\n\t\t}\n\t\tfor (const item of items) {\n\t\t\tif (item.description) details.push(` ${theme.fg(\"dim\", descriptionPreview(item.description))}`);\n\t\t}\n\t}\n\n\tif (hasDelete) {\n\t\tconst rawCount = readArray(args?.delete)?.length;\n\t\tif (rawCount !== 0) {\n\t\t\tconst ids = readIds(args?.delete) ?? [];\n\t\t\tpushSegment(\"delete\", ids.length > 0 ? theme.fg(\"accent\", ids.map((id) => `#${id}`).join(\", \")) : \"\");\n\t\t}\n\t\t// The headline already carries the ids, so details only earn their lines\n\t\t// once the result names what was actually removed or already absent.\n\t\tfor (const entry of deleteResultRemoved(result)) {\n\t\t\tdetails.push(`${theme.fg(\"accent\", `#${entry.id}`)} ${theme.fg(\"text\", entry.subject)}`);\n\t\t}\n\t\tfor (const id of deleteResultAbsent(result)) {\n\t\t\tdetails.push(theme.fg(\"dim\", `#${id} already absent`));\n\t\t}\n\t}\n\n\tif (segments.length === 0) {\n\t\t// No group fields at all: the call lists the tasks.\n\t\tsegments.push(theme.fg(\"toolTitle\", theme.bold(\"todo list\")));\n\t}\n\n\treturn { headline: segments.join(theme.fg(\"dim\", \" ; \")), details };\n}\n\n/** One-line call summary when collapsed; headline plus details when expanded. */\nexport function formatTodoCall(\n\targs: TodoCallArgs | undefined,\n\ttheme: Theme,\n\texpanded: boolean,\n\tresult?: AgentToolResult<unknown>,\n): string {\n\tconst { headline, details } = formatCallParts(args, theme, result);\n\treturn !expanded || details.length === 0 ? headline : [headline, ...details].join(\"\\n\");\n}\n\n/** Id -> item index plus status counts over the v3 snapshot (one defensive walk). */\nfunction stateIndex(state: Record<string, unknown>):\n\t| {\n\t\t\tbyId: Map<number, Record<string, unknown>>;\n\t\t\tcounts: { inProgress: number; pending: number; completed: number };\n\t }\n\t| undefined {\n\tconst array = readArray(safeValue(state, \"items\"), TODO_MAX_ITEMS);\n\tif (!array || array.length > TODO_MAX_ITEMS) return undefined;\n\tconst byId = new Map<number, Record<string, unknown>>();\n\tconst counts = { inProgress: 0, pending: 0, completed: 0 };\n\tfor (const raw of array.values) {\n\t\tconst item = safeRecord(raw);\n\t\tif (!item) continue;\n\t\tconst id = safeId(safeValue(item, \"id\"));\n\t\tif (id !== undefined && !byId.has(id)) byId.set(id, item);\n\t\tconst status = safeStatus(safeValue(item, \"status\"));\n\t\tif (status === \"in_progress\") counts.inProgress++;\n\t\telse if (status === \"pending\") counts.pending++;\n\t\telse if (status === \"completed\") counts.completed++;\n\t}\n\treturn { byId, counts };\n}\n\nfunction stateSubject(map: Map<number, Record<string, unknown>>, id: number): string {\n\tconst item = map.get(id);\n\treturn item ? safeSubject(safeValue(item, \"subject\")) : \"\";\n}\n\n/** Id+subject entries (deleted, evicted): invalid entries drop. */\nfunction idSubjectEntries(value: unknown): Array<{ id: number; subject: string }> {\n\tconst entries: Array<{ id: number; subject: string }> = [];\n\tfor (const raw of readArray(value)?.values ?? []) {\n\t\tconst item = safeRecord(raw);\n\t\tconst id = safeId(safeValue(item, \"id\"));\n\t\tconst subject = safeSubject(safeValue(item, \"subject\"));\n\t\tif (id === undefined || !subject) continue;\n\t\tentries.push({ id, subject });\n\t}\n\treturn entries;\n}\n\n/** Updated entries: {id, from, to} records, invalid entries drop. */\nfunction updatedEntries(value: unknown): Array<{ id: number; from?: TodoStatus; to?: TodoStatus }> {\n\tconst entries: Array<{ id: number; from?: TodoStatus; to?: TodoStatus }> = [];\n\tfor (const raw of readArray(value)?.values ?? []) {\n\t\tconst item = safeRecord(raw);\n\t\tconst id = safeId(safeValue(item, \"id\"));\n\t\tif (id === undefined) continue;\n\t\tconst entry: { id: number; from?: TodoStatus; to?: TodoStatus } = { id };\n\t\tconst from = safeStatus(safeValue(item, \"from\"));\n\t\tif (from) entry.from = from;\n\t\tconst to = safeStatus(safeValue(item, \"to\"));\n\t\tif (to) entry.to = to;\n\t\tentries.push(entry);\n\t}\n\treturn entries;\n}\n\nfunction formatTodoSuccessSummary(\n\targs: TodoCallArgs | undefined,\n\ttheme: Theme,\n\tresult: AgentToolResult<unknown>,\n): string | undefined {\n\tconst parsed = todoDetails(result.details);\n\tif (!parsed) return undefined;\n\tconst { change, state } = parsed;\n\tconst index = stateIndex(state);\n\tconst segments: string[] = [];\n\tconst pushVerb = (word: string, body: string): void => {\n\t\tconst title = segments.length === 0 ? `todo ${word}` : word;\n\t\tsegments.push(body ? `${theme.fg(\"toolTitle\", title)} ${body}` : theme.fg(\"toolTitle\", title));\n\t};\n\tconst withPreview = (word: string, ids: number[], subjects: string[]): void => {\n\t\tconst text = formatSubjectPreview(subjects, subjects.length);\n\t\tconst base = theme.fg(\"accent\", formatIdRange(ids));\n\t\tpushVerb(word, text ? `${base}${theme.fg(\"dim\", \" · \")}${theme.fg(\"text\", text)}` : base);\n\t};\n\n\tconst created = readIds(safeValue(change, \"created\")) ?? [];\n\tif (created.length > 0 && index) {\n\t\twithPreview(\n\t\t\t\"created\",\n\t\t\tcreated,\n\t\t\tcreated.map((id) => stateSubject(index.byId, id)),\n\t\t);\n\t}\n\tfor (const entry of updatedEntries(safeValue(change, \"updated\"))) {\n\t\tconst parts = [theme.fg(\"accent\", `#${entry.id}`)];\n\t\tif (entry.to) parts.push(theme.fg(STATUS_COLOR[entry.to], entry.to));\n\t\tconst subject = index ? stateSubject(index.byId, entry.id) : \"\";\n\t\tif (subject) parts.push(theme.fg(\"text\", truncateToWidth(subject, CALL_SUBJECT_PREVIEW_WIDTH, \"…\")));\n\t\tpushVerb(\"updated\", parts.join(\" \"));\n\t}\n\tconst demotedId = safeId(safeValue(change, \"demotedId\"));\n\tif (demotedId !== undefined) segments.push(theme.fg(\"dim\", `demoted #${demotedId}`));\n\tconst deleted = idSubjectEntries(safeValue(change, \"deleted\"));\n\tif (deleted.length > 0) {\n\t\twithPreview(\n\t\t\t\"deleted\",\n\t\t\tdeleted.map((entry) => entry.id),\n\t\t\tdeleted.map((entry) => entry.subject),\n\t\t);\n\t}\n\tfor (const id of readIds(safeValue(change, \"absent\")) ?? []) {\n\t\tsegments.push(theme.fg(\"dim\", `#${id} already absent`));\n\t}\n\tconst evicted = idSubjectEntries(safeValue(change, \"evicted\"));\n\tif (evicted.length > 0) {\n\t\tsegments.push(theme.fg(\"dim\", `auto-removed ${evicted.map((entry) => `#${entry.id}`).join(\", \")}`));\n\t}\n\n\tif (segments.length === 0) {\n\t\t// Empty change: the call listed the tasks.\n\t\tif (!index) return undefined;\n\t\tconst parts: string[] = [];\n\t\tif (index.counts.inProgress > 0) parts.push(`${index.counts.inProgress} in progress`);\n\t\tif (index.counts.pending > 0) parts.push(`${index.counts.pending} pending`);\n\t\tif (index.counts.completed > 0) parts.push(`${index.counts.completed} completed`);\n\t\treturn `${theme.fg(\"toolTitle\", \"todo list\")}: ${theme.fg(\"dim\", parts.length ? parts.join(\", \") : \"no tasks\")}`;\n\t}\n\t// The update segment can still pick up the requested subject when the state\n\t// no longer holds it (e.g. the task was deleted by a hostile snapshot).\n\tvoid args;\n\treturn segments.join(theme.fg(\"dim\", \" ; \"));\n}\n\nexport interface TodoSummaryContext {\n\tisError: boolean;\n\tisPartial: boolean;\n\tresult?: AgentToolResult<unknown>;\n}\n\n/** Compact result-aware one-line summary of a collapsed todo row. */\nexport function formatTodoSummary(args: TodoCallArgs | undefined, theme: Theme, context: TodoSummaryContext): string {\n\tif (context.isError) {\n\t\tlet reason = \"tool failed\";\n\t\ttry {\n\t\t\tfor (const block of context.result?.content.slice(0, 8) ?? []) {\n\t\t\t\tif (block.type !== \"text\" || typeof block.text !== \"string\") continue;\n\t\t\t\tconst text = block.text\n\t\t\t\t\t.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/g, \" \")\n\t\t\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t\t\t.trim();\n\t\t\t\tif (!text) continue;\n\t\t\t\treason =\n\t\t\t\t\ttext.length > SUMMARY_FAILURE_MAX_LENGTH ? `${text.slice(0, SUMMARY_FAILURE_MAX_LENGTH - 1)}…` : text;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Tool results can come from historical or third-party sources.\n\t\t}\n\t\treturn `${formatTodoCall(args, theme, false)} ${theme.fg(\"error\", `failed: ${reason}`)}`;\n\t}\n\tif (!context.isPartial && context.result) {\n\t\tconst summary = formatTodoSuccessSummary(args, theme, context.result);\n\t\tif (summary) return summary;\n\t}\n\treturn formatTodoCall(args, theme, false);\n}\n"]}
|