@astralyn/pi 0.99.0 → 1.0.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 +39 -3
- package/dist/bundle/chunks/anthropic-messages-CG2BSDQS.js +6 -0
- package/dist/bundle/chunks/anthropic.js +2 -2
- package/dist/bundle/chunks/{azure-openai-responses-RPBERDXD.js → azure-openai-responses-PBA4QKCM.js} +1 -1
- package/dist/bundle/chunks/bedrock-converse-stream.js +2 -2
- package/dist/bundle/chunks/{chunk-ABVRAYXT.js → chunk-6UFFVA7M.js} +2 -2
- package/dist/bundle/chunks/chunk-GIG5IHES.js +2 -0
- package/dist/bundle/chunks/{chunk-VW2P3X6P.js → chunk-HESRDUKO.js} +414 -666
- package/dist/bundle/chunks/{chunk-A576H74Y.js → chunk-PFZKRUMO.js} +1 -1
- package/dist/bundle/chunks/chunk-SGLYRVQL.js +2 -0
- package/dist/bundle/chunks/chunk-TRHTWM3C.js +2 -0
- package/dist/bundle/chunks/{chunk-DEWXBB6W.js → chunk-V66VGGOM.js} +1 -1
- package/dist/bundle/chunks/chunk-Z2RKSI3O.js +2 -0
- package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-ZYSAFXXL.js → cloudflare-workers-ai-system-one-YB7XPPP4.js} +1 -1
- package/dist/bundle/chunks/codemode-worker.js +67 -8
- package/dist/bundle/chunks/github-copilot.js +1 -1
- package/dist/bundle/chunks/{google-generative-ai-SDNQVVXA.js → google-generative-ai-V5ZM5MCL.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-LZXOLBIO.js → google-vertex-22THOFP5.js} +1 -1
- package/dist/bundle/chunks/{llama-cpp-classify-7IYGGPND.js → llama-cpp-classify-R7DQLTQN.js} +1 -1
- package/dist/bundle/chunks/{mistral-conversations-VYKPSSAM.js → mistral-conversations-WHSCJJWP.js} +1 -1
- package/dist/bundle/chunks/openai-chatgpt.js +1 -1
- package/dist/bundle/chunks/{openai-codex-responses-HZ4VUDXD.js → openai-codex-responses-N7GDPBPP.js} +1 -1
- package/dist/bundle/chunks/openai-codex.js +1 -1
- package/dist/bundle/chunks/{openai-completions-SKDGF6OE.js → openai-completions-RGGQK5UW.js} +1 -1
- package/dist/bundle/chunks/{openai-responses-FPML4SSG.js → openai-responses-3ZLD5JYI.js} +1 -1
- package/dist/bundle/chunks/{openrouter-images-5524IQHX.js → openrouter-images-YP3YVB54.js} +1 -1
- package/dist/bundle/chunks/openrouter.js +1 -1
- package/dist/bundle/chunks/radius.js +1 -1
- package/dist/bundle/chunks/{typesafe-system-one-Z2CDLKEY.js → typesafe-system-one-RREJAKWB.js} +1 -1
- package/dist/bundle/chunks/virtual-modules-4RQ2L6W4.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.js +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/config.d.ts +5 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -13
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +21 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +64 -11
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +13 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/types.d.ts +6 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/keybindings.d.ts +51 -11
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +11 -3
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/mcp-servers.d.ts +34 -7
- package/dist/core/mcp-servers.d.ts.map +1 -1
- package/dist/core/mcp-servers.js +52 -11
- package/dist/core/mcp-servers.js.map +1 -1
- package/dist/core/model-registry.d.ts +3 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +4 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-runtime.d.ts +6 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +22 -18
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/radius.d.ts +2 -0
- package/dist/core/radius.d.ts.map +1 -1
- package/dist/core/radius.js +2 -0
- package/dist/core/radius.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +4 -9
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +1 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +7 -5
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +2 -1
- package/dist/core/settings-manager.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/format.d.ts +7 -0
- package/dist/core/tasks/format.d.ts.map +1 -0
- package/dist/core/tasks/format.js +14 -0
- package/dist/core/tasks/format.js.map +1 -0
- package/dist/core/tasks/history.d.ts.map +1 -1
- package/dist/core/tasks/history.js +0 -19
- package/dist/core/tasks/history.js.map +1 -1
- package/dist/core/tasks/output.d.ts +8 -0
- package/dist/core/tasks/output.d.ts.map +1 -1
- package/dist/core/tasks/output.js +19 -0
- package/dist/core/tasks/output.js.map +1 -1
- package/dist/core/tasks/presentation.d.ts +1 -3
- package/dist/core/tasks/presentation.d.ts.map +1 -1
- package/dist/core/tasks/presentation.js +79 -166
- package/dist/core/tasks/presentation.js.map +1 -1
- package/dist/core/tasks/runtime.d.ts +16 -9
- package/dist/core/tasks/runtime.d.ts.map +1 -1
- package/dist/core/tasks/runtime.js +89 -106
- package/dist/core/tasks/runtime.js.map +1 -1
- package/dist/core/tasks/session.d.ts.map +1 -1
- package/dist/core/tasks/session.js +13 -4
- package/dist/core/tasks/session.js.map +1 -1
- package/dist/core/tasks/store.d.ts +20 -6
- package/dist/core/tasks/store.d.ts.map +1 -1
- package/dist/core/tasks/store.js +45 -18
- package/dist/core/tasks/store.js.map +1 -1
- package/dist/core/tasks/types.d.ts +14 -54
- package/dist/core/tasks/types.d.ts.map +1 -1
- package/dist/core/tasks/types.js +1 -5
- package/dist/core/tasks/types.js.map +1 -1
- package/dist/core/tools/renderers/bash.d.ts.map +1 -1
- package/dist/core/tools/renderers/bash.js +11 -34
- package/dist/core/tools/renderers/bash.js.map +1 -1
- package/dist/core/tools/shell-execution.d.ts +0 -1
- package/dist/core/tools/shell-execution.d.ts.map +1 -1
- package/dist/core/tools/shell-execution.js +3 -10
- package/dist/core/tools/shell-execution.js.map +1 -1
- package/dist/core/tools/shell-tool.d.ts.map +1 -1
- package/dist/core/tools/shell-tool.js +2 -4
- package/dist/core/tools/shell-tool.js.map +1 -1
- package/dist/core/tools/tasks/actions.d.ts +1 -1
- package/dist/core/tools/tasks/actions.d.ts.map +1 -1
- package/dist/core/tools/tasks/actions.js +26 -12
- package/dist/core/tools/tasks/actions.js.map +1 -1
- package/dist/core/tools/tasks/constants.d.ts +2 -6
- package/dist/core/tools/tasks/constants.d.ts.map +1 -1
- package/dist/core/tools/tasks/constants.js +2 -6
- package/dist/core/tools/tasks/constants.js.map +1 -1
- package/dist/core/tools/tasks/schema.d.ts +1 -1
- package/dist/core/tools/tasks/schema.d.ts.map +1 -1
- package/dist/core/tools/tasks/schema.js +8 -7
- package/dist/core/tools/tasks/schema.js.map +1 -1
- package/dist/core/tools/tasks/types.d.ts +8 -38
- package/dist/core/tools/tasks/types.d.ts.map +1 -1
- package/dist/core/tools/tasks/types.js +6 -11
- package/dist/core/tools/tasks/types.js.map +1 -1
- package/dist/core/virtual-models.d.ts +2 -0
- package/dist/core/virtual-models.d.ts.map +1 -1
- package/dist/core/virtual-models.js +19 -12
- package/dist/core/virtual-models.js.map +1 -1
- package/dist/extensions/btw/agent.d.ts +17 -8
- package/dist/extensions/btw/agent.d.ts.map +1 -1
- package/dist/extensions/btw/agent.js +74 -76
- package/dist/extensions/btw/agent.js.map +1 -1
- package/dist/extensions/btw/controller.d.ts +0 -1
- package/dist/extensions/btw/controller.d.ts.map +1 -1
- package/dist/extensions/btw/controller.js +26 -33
- package/dist/extensions/btw/controller.js.map +1 -1
- package/dist/extensions/btw/panel.d.ts +13 -14
- package/dist/extensions/btw/panel.d.ts.map +1 -1
- package/dist/extensions/btw/panel.js +38 -29
- package/dist/extensions/btw/panel.js.map +1 -1
- package/dist/extensions/codemode/execute.d.ts.map +1 -1
- package/dist/extensions/codemode/execute.js +197 -51
- package/dist/extensions/codemode/execute.js.map +1 -1
- package/dist/extensions/codemode/renderer.d.ts.map +1 -1
- package/dist/extensions/codemode/renderer.js +43 -25
- package/dist/extensions/codemode/renderer.js.map +1 -1
- package/dist/extensions/codemode/tool.d.ts +12 -11
- package/dist/extensions/codemode/tool.d.ts.map +1 -1
- package/dist/extensions/codemode/tool.js +73 -129
- package/dist/extensions/codemode/tool.js.map +1 -1
- package/dist/extensions/codemode/worker.d.ts +1 -1
- package/dist/extensions/codemode/worker.js +1 -1
- package/dist/extensions/codemode/worker.js.map +1 -1
- package/dist/extensions/deepwiki/schema.d.ts +1 -1
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +0 -2
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/mcp/cli.d.ts.map +1 -1
- package/dist/extensions/mcp/cli.js +20 -5
- package/dist/extensions/mcp/cli.js.map +1 -1
- package/dist/extensions/mcp/config.d.ts +4 -2
- package/dist/extensions/mcp/config.d.ts.map +1 -1
- package/dist/extensions/mcp/config.js +14 -2
- package/dist/extensions/mcp/config.js.map +1 -1
- package/dist/extensions/mcp/index.d.ts +32 -8
- package/dist/extensions/mcp/index.d.ts.map +1 -1
- package/dist/extensions/mcp/index.js +235 -61
- package/dist/extensions/mcp/index.js.map +1 -1
- package/dist/extensions/mcp/oauth.d.ts +10 -7
- package/dist/extensions/mcp/oauth.d.ts.map +1 -1
- package/dist/extensions/mcp/oauth.js +56 -31
- package/dist/extensions/mcp/oauth.js.map +1 -1
- package/dist/extensions/mcp/runtime.d.ts +2 -0
- package/dist/extensions/mcp/runtime.d.ts.map +1 -1
- package/dist/extensions/mcp/runtime.js +16 -9
- package/dist/extensions/mcp/runtime.js.map +1 -1
- package/dist/extensions/mcp/tools.d.ts +5 -4
- package/dist/extensions/mcp/tools.d.ts.map +1 -1
- package/dist/extensions/mcp/tools.js +33 -15
- package/dist/extensions/mcp/tools.js.map +1 -1
- package/dist/extensions/mcp/ui.d.ts.map +1 -1
- package/dist/extensions/mcp/ui.js +4 -2
- package/dist/extensions/mcp/ui.js.map +1 -1
- package/dist/extensions/provider/catalog.d.ts +8 -1
- package/dist/extensions/provider/catalog.d.ts.map +1 -1
- package/dist/extensions/provider/catalog.js +31 -0
- package/dist/extensions/provider/catalog.js.map +1 -1
- package/dist/extensions/provider/connection.d.ts +4 -1
- package/dist/extensions/provider/connection.d.ts.map +1 -1
- package/dist/extensions/provider/connection.js +1 -5
- package/dist/extensions/provider/connection.js.map +1 -1
- package/dist/extensions/provider/editing.d.ts +36 -0
- package/dist/extensions/provider/editing.d.ts.map +1 -0
- package/dist/extensions/provider/editing.js +99 -0
- package/dist/extensions/provider/editing.js.map +1 -0
- package/dist/extensions/provider/json-fields.d.ts +5 -0
- package/dist/extensions/provider/json-fields.d.ts.map +1 -0
- package/dist/extensions/provider/json-fields.js +31 -0
- package/dist/extensions/provider/json-fields.js.map +1 -0
- package/dist/extensions/provider/store.d.ts +1 -4
- package/dist/extensions/provider/store.d.ts.map +1 -1
- package/dist/extensions/provider/store.js +2 -30
- package/dist/extensions/provider/store.js.map +1 -1
- package/dist/extensions/provider/ui/builtin-data.d.ts +0 -2
- package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -1
- package/dist/extensions/provider/ui/builtin-data.js +14 -79
- package/dist/extensions/provider/ui/builtin-data.js.map +1 -1
- package/dist/extensions/provider/ui/compat.d.ts.map +1 -1
- package/dist/extensions/provider/ui/compat.js +6 -9
- package/dist/extensions/provider/ui/compat.js.map +1 -1
- package/dist/extensions/provider/ui/controls.d.ts +48 -0
- package/dist/extensions/provider/ui/controls.d.ts.map +1 -0
- package/dist/extensions/provider/ui/controls.js +108 -0
- package/dist/extensions/provider/ui/controls.js.map +1 -0
- package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -1
- package/dist/extensions/provider/ui/dictionary.js +6 -9
- package/dist/extensions/provider/ui/dictionary.js.map +1 -1
- package/dist/extensions/provider/ui/editor.d.ts +3 -3
- package/dist/extensions/provider/ui/editor.d.ts.map +1 -1
- package/dist/extensions/provider/ui/editor.js +35 -140
- package/dist/extensions/provider/ui/editor.js.map +1 -1
- package/dist/extensions/provider/ui/fetch-models.d.ts +0 -3
- package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -1
- package/dist/extensions/provider/ui/fetch-models.js +49 -44
- package/dist/extensions/provider/ui/fetch-models.js.map +1 -1
- package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -1
- package/dist/extensions/provider/ui/model-fields.js +11 -14
- package/dist/extensions/provider/ui/model-fields.js.map +1 -1
- package/dist/extensions/provider/ui/model-options.d.ts +4 -34
- package/dist/extensions/provider/ui/model-options.d.ts.map +1 -1
- package/dist/extensions/provider/ui/model-options.js +90 -271
- package/dist/extensions/provider/ui/model-options.js.map +1 -1
- package/dist/extensions/provider/ui/pane.d.ts +4 -18
- package/dist/extensions/provider/ui/pane.d.ts.map +1 -1
- package/dist/extensions/provider/ui/pane.js.map +1 -1
- package/dist/extensions/provider/ui/provider-fields.d.ts +2 -19
- package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -1
- package/dist/extensions/provider/ui/provider-fields.js +58 -171
- package/dist/extensions/provider/ui/provider-fields.js.map +1 -1
- package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -1
- package/dist/extensions/provider/ui/thinking-map.js +6 -9
- package/dist/extensions/provider/ui/thinking-map.js.map +1 -1
- package/dist/extensions/question/detail-pane.d.ts +7 -2
- package/dist/extensions/question/detail-pane.d.ts.map +1 -1
- package/dist/extensions/question/detail-pane.js +16 -5
- package/dist/extensions/question/detail-pane.js.map +1 -1
- package/dist/extensions/question/dialog-view.d.ts +41 -0
- package/dist/extensions/question/dialog-view.d.ts.map +1 -0
- package/dist/extensions/question/dialog-view.js +329 -0
- package/dist/extensions/question/dialog-view.js.map +1 -0
- package/dist/extensions/question/dialog.d.ts +3 -3
- package/dist/extensions/question/dialog.d.ts.map +1 -1
- package/dist/extensions/question/dialog.js +220 -634
- package/dist/extensions/question/dialog.js.map +1 -1
- package/dist/extensions/question/index.d.ts.map +1 -1
- package/dist/extensions/question/index.js +2 -3
- package/dist/extensions/question/index.js.map +1 -1
- package/dist/extensions/question/render.d.ts.map +1 -1
- package/dist/extensions/question/render.js +22 -32
- package/dist/extensions/question/render.js.map +1 -1
- package/dist/extensions/question/results.d.ts.map +1 -1
- package/dist/extensions/question/results.js +56 -12
- package/dist/extensions/question/results.js.map +1 -1
- package/dist/extensions/question/schema.d.ts +21 -6
- package/dist/extensions/question/schema.d.ts.map +1 -1
- package/dist/extensions/question/schema.js.map +1 -1
- package/dist/extensions/question/state.d.ts +9 -7
- package/dist/extensions/question/state.d.ts.map +1 -1
- package/dist/extensions/question/state.js +63 -54
- package/dist/extensions/question/state.js.map +1 -1
- package/dist/extensions/question/types.d.ts +41 -18
- package/dist/extensions/question/types.d.ts.map +1 -1
- package/dist/extensions/question/types.js.map +1 -1
- package/dist/extensions/statusline/index.d.ts +4 -0
- package/dist/extensions/statusline/index.d.ts.map +1 -1
- package/dist/extensions/statusline/index.js +18 -355
- package/dist/extensions/statusline/index.js.map +1 -1
- package/dist/extensions/statusline/render.d.ts +19 -0
- package/dist/extensions/statusline/render.d.ts.map +1 -0
- package/dist/extensions/statusline/render.js +163 -0
- package/dist/extensions/statusline/render.js.map +1 -0
- package/dist/extensions/statusline/usage.d.ts +12 -0
- package/dist/extensions/statusline/usage.d.ts.map +1 -0
- package/dist/extensions/statusline/usage.js +36 -0
- package/dist/extensions/statusline/usage.js.map +1 -0
- package/dist/extensions/tool-search/tool.d.ts +5 -4
- package/dist/extensions/tool-search/tool.d.ts.map +1 -1
- package/dist/extensions/tool-search/tool.js +7 -28
- package/dist/extensions/tool-search/tool.js.map +1 -1
- package/dist/extensions/web-search/execute.d.ts +1 -5
- package/dist/extensions/web-search/execute.d.ts.map +1 -1
- package/dist/extensions/web-search/execute.js +4 -9
- package/dist/extensions/web-search/execute.js.map +1 -1
- package/dist/extensions/web-search/format.d.ts +12 -3
- package/dist/extensions/web-search/format.d.ts.map +1 -1
- package/dist/extensions/web-search/format.js +33 -25
- package/dist/extensions/web-search/format.js.map +1 -1
- package/dist/extensions/web-search/index.d.ts.map +1 -1
- package/dist/extensions/web-search/index.js +6 -29
- package/dist/extensions/web-search/index.js.map +1 -1
- package/dist/extensions/web-search/providers/deepseek.d.ts.map +1 -1
- package/dist/extensions/web-search/providers/deepseek.js +0 -1
- package/dist/extensions/web-search/providers/deepseek.js.map +1 -1
- package/dist/extensions/web-search/providers/http.d.ts +1 -1
- package/dist/extensions/web-search/providers/http.d.ts.map +1 -1
- package/dist/extensions/web-search/providers/http.js.map +1 -1
- package/dist/extensions/web-search/providers/minimax.d.ts.map +1 -1
- package/dist/extensions/web-search/providers/minimax.js +0 -1
- package/dist/extensions/web-search/providers/minimax.js.map +1 -1
- package/dist/extensions/web-search/render.d.ts +7 -2
- package/dist/extensions/web-search/render.d.ts.map +1 -1
- package/dist/extensions/web-search/render.js +32 -4
- package/dist/extensions/web-search/render.js.map +1 -1
- package/dist/extensions/web-search/results.d.ts.map +1 -1
- package/dist/extensions/web-search/results.js +3 -8
- package/dist/extensions/web-search/results.js.map +1 -1
- package/dist/extensions/web-search/types.d.ts +4 -2
- package/dist/extensions/web-search/types.d.ts.map +1 -1
- package/dist/extensions/web-search/types.js.map +1 -1
- package/dist/index.d.ts +2 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +6 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +8 -2
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +24 -21
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/pi-logo-animation.d.ts +68 -0
- package/dist/modes/interactive/components/pi-logo-animation.d.ts.map +1 -0
- package/dist/modes/interactive/components/pi-logo-animation.js +1076 -0
- package/dist/modes/interactive/components/pi-logo-animation.js.map +1 -0
- package/dist/modes/interactive/components/pi-logo-animation.lazy.d.ts +7 -0
- package/dist/modes/interactive/components/pi-logo-animation.lazy.d.ts.map +1 -0
- package/dist/modes/interactive/components/pi-logo-animation.lazy.js +12 -0
- package/dist/modes/interactive/components/pi-logo-animation.lazy.js.map +1 -0
- package/dist/modes/interactive/components/pi-logo.d.ts +7 -0
- package/dist/modes/interactive/components/pi-logo.d.ts.map +1 -1
- package/dist/modes/interactive/components/pi-logo.js +13 -1
- package/dist/modes/interactive/components/pi-logo.js.map +1 -1
- package/dist/modes/interactive/components/radius-login-selector.d.ts +15 -0
- package/dist/modes/interactive/components/radius-login-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/radius-login-selector.js +83 -0
- package/dist/modes/interactive/components/radius-login-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +5 -5
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/status-marker.d.ts +0 -2
- package/dist/modes/interactive/components/status-marker.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-marker.js +0 -4
- package/dist/modes/interactive/components/status-marker.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +5 -4
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts +27 -3
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js +36 -6
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +10 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +167 -40
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/tasks/completion-render.d.ts +1 -1
- package/dist/modes/interactive/tasks/completion-render.d.ts.map +1 -1
- package/dist/modes/interactive/tasks/completion-render.js +28 -82
- package/dist/modes/interactive/tasks/completion-render.js.map +1 -1
- package/dist/modes/interactive/tasks/index.d.ts.map +1 -1
- package/dist/modes/interactive/tasks/index.js +18 -13
- package/dist/modes/interactive/tasks/index.js.map +1 -1
- package/dist/modes/interactive/tasks/inspector.d.ts +35 -0
- package/dist/modes/interactive/tasks/inspector.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/inspector.js +93 -0
- package/dist/modes/interactive/tasks/inspector.js.map +1 -0
- package/dist/modes/interactive/tasks/layout.d.ts +40 -0
- package/dist/modes/interactive/tasks/layout.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/layout.js +212 -0
- package/dist/modes/interactive/tasks/layout.js.map +1 -0
- package/dist/modes/interactive/tasks/list.d.ts +21 -0
- package/dist/modes/interactive/tasks/list.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/list.js +96 -0
- package/dist/modes/interactive/tasks/list.js.map +1 -0
- package/dist/modes/interactive/tasks/manager.d.ts +29 -36
- package/dist/modes/interactive/tasks/manager.d.ts.map +1 -1
- package/dist/modes/interactive/tasks/manager.js +315 -315
- package/dist/modes/interactive/tasks/manager.js.map +1 -1
- package/dist/modes/interactive/tasks/model.d.ts +21 -0
- package/dist/modes/interactive/tasks/model.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/model.js +41 -0
- package/dist/modes/interactive/tasks/model.js.map +1 -0
- package/dist/modes/interactive/tasks/render.d.ts +5 -19
- package/dist/modes/interactive/tasks/render.d.ts.map +1 -1
- package/dist/modes/interactive/tasks/render.js +18 -102
- package/dist/modes/interactive/tasks/render.js.map +1 -1
- package/dist/modes/interactive/tasks/task-view.d.ts +8 -48
- package/dist/modes/interactive/tasks/task-view.d.ts.map +1 -1
- package/dist/modes/interactive/tasks/task-view.js +11 -51
- package/dist/modes/interactive/tasks/task-view.js.map +1 -1
- package/dist/modes/interactive/tasks/text.d.ts +1 -7
- package/dist/modes/interactive/tasks/text.d.ts.map +1 -1
- package/dist/modes/interactive/tasks/text.js +6 -29
- package/dist/modes/interactive/tasks/text.js.map +1 -1
- package/dist/modes/interactive/tasks/viewport.d.ts +2 -0
- package/dist/modes/interactive/tasks/viewport.d.ts.map +1 -1
- package/dist/modes/interactive/tasks/viewport.js +17 -7
- package/dist/modes/interactive/tasks/viewport.js.map +1 -1
- package/dist/modes/interactive/tasks/views.d.ts +9 -0
- package/dist/modes/interactive/tasks/views.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/views.js +42 -0
- package/dist/modes/interactive/tasks/views.js.map +1 -0
- package/dist/modes/interactive/theme/system-theme.d.ts +2 -1
- package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/system-theme.js +16 -5
- package/dist/modes/interactive/theme/system-theme.js.map +1 -1
- package/docs/bundled/README.md +0 -1
- package/docs/bundled/extensions/question.md +2 -2
- package/docs/bundled/extensions/statusline.md +24 -15
- package/docs/bundled/tasks.md +34 -48
- package/docs/codemode.md +207 -0
- package/docs/docs.json +4 -4
- package/docs/environment-variables.md +1 -1
- package/docs/extensions.md +7 -9
- package/docs/keybindings.md +13 -6
- package/docs/mcp.md +142 -82
- package/docs/models.md +21 -0
- package/docs/providers.md +8 -0
- package/docs/sdk.md +2 -2
- package/docs/session-format.md +12 -22
- package/docs/settings.md +4 -2
- package/docs/tui.md +1 -1
- package/docs/usage.md +6 -16
- package/examples/README.md +1 -1
- package/examples/extensions/README.md +1 -2
- package/examples/extensions/built-in-tool-renderer.ts +16 -40
- 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/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/minimal-mode.ts +24 -96
- 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/sdk/14-codemode-mcp.ts +2 -2
- package/npm-shrinkwrap.json +69 -58
- package/package.json +11 -10
- package/dist/bundle/chunks/anthropic-messages-KIXY7EDT.js +0 -6
- package/dist/bundle/chunks/chunk-CLLDCO64.js +0 -2
- package/dist/bundle/chunks/chunk-UUSTLCVC.js +0 -2
- package/dist/bundle/chunks/chunk-VWCWZD6E.js +0 -2
- package/dist/bundle/chunks/virtual-modules-TQRORWJQ.js +0 -2
- package/dist/core/tasks/view-data.d.ts +0 -8
- package/dist/core/tasks/view-data.d.ts.map +0 -1
- package/dist/core/tasks/view-data.js +0 -61
- package/dist/core/tasks/view-data.js.map +0 -1
- package/dist/core/tasks/view.d.ts +0 -30
- package/dist/core/tasks/view.d.ts.map +0 -1
- package/dist/core/tasks/view.js +0 -50
- package/dist/core/tasks/view.js.map +0 -1
- package/dist/core/tools/renderers/shell-task.d.ts +0 -4
- package/dist/core/tools/renderers/shell-task.d.ts.map +0 -1
- package/dist/core/tools/renderers/shell-task.js +0 -35
- package/dist/core/tools/renderers/shell-task.js.map +0 -1
- package/dist/extensions/todo/constants.d.ts +0 -16
- package/dist/extensions/todo/constants.d.ts.map +0 -1
- package/dist/extensions/todo/constants.js +0 -30
- package/dist/extensions/todo/constants.js.map +0 -1
- package/dist/extensions/todo/index.d.ts +0 -3
- package/dist/extensions/todo/index.d.ts.map +0 -1
- package/dist/extensions/todo/index.js +0 -98
- package/dist/extensions/todo/index.js.map +0 -1
- package/dist/extensions/todo/schema.d.ts +0 -60
- package/dist/extensions/todo/schema.d.ts.map +0 -1
- package/dist/extensions/todo/schema.js +0 -56
- package/dist/extensions/todo/schema.js.map +0 -1
- package/dist/extensions/todo/state.d.ts +0 -34
- package/dist/extensions/todo/state.d.ts.map +0 -1
- package/dist/extensions/todo/state.js +0 -425
- package/dist/extensions/todo/state.js.map +0 -1
- package/dist/extensions/todo/view.d.ts +0 -36
- package/dist/extensions/todo/view.d.ts.map +0 -1
- package/dist/extensions/todo/view.js +0 -580
- package/dist/extensions/todo/view.js.map +0 -1
- package/dist/extensions/todo/widget.d.ts +0 -15
- package/dist/extensions/todo/widget.d.ts.map +0 -1
- package/dist/extensions/todo/widget.js +0 -50
- package/dist/extensions/todo/widget.js.map +0 -1
- package/dist/modes/interactive/tasks/fallback-view.d.ts +0 -4
- package/dist/modes/interactive/tasks/fallback-view.d.ts.map +0 -1
- package/dist/modes/interactive/tasks/fallback-view.js +0 -27
- package/dist/modes/interactive/tasks/fallback-view.js.map +0 -1
- package/docs/bundled/extensions/todo.md +0 -104
- package/examples/extensions/todo.ts +0 -297
|
@@ -1,580 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* todo/view.ts — v3 presentation: the one-line above-editor widget renderer,
|
|
3
|
-
* tool call/group renderers, the /todos list formatter, and model-facing
|
|
4
|
-
* result text. Wire input (args, details, snapshots) is read defensively and
|
|
5
|
-
* bounded so partial or hostile input cannot grow output without limit.
|
|
6
|
-
*/
|
|
7
|
-
import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
|
|
8
|
-
import { TODO_MAX_BATCH_ITEMS, TODO_MAX_DESCRIPTION_LENGTH, TODO_MAX_ITEMS, TODO_MAX_SUBJECT_LENGTH, } from "./constants.js";
|
|
9
|
-
import { TODO_DETAILS_SCHEMA_VERSION, } from "./schema.js";
|
|
10
|
-
export const STATUS_MARK = {
|
|
11
|
-
pending: "[ ]",
|
|
12
|
-
in_progress: "[>]",
|
|
13
|
-
completed: "[x]",
|
|
14
|
-
};
|
|
15
|
-
const STATUS_COLOR = {
|
|
16
|
-
pending: "dim",
|
|
17
|
-
in_progress: "warning",
|
|
18
|
-
completed: "success",
|
|
19
|
-
};
|
|
20
|
-
const STATUS_RANK = {
|
|
21
|
-
in_progress: 0,
|
|
22
|
-
pending: 1,
|
|
23
|
-
completed: 2,
|
|
24
|
-
};
|
|
25
|
-
// --- One-line widget --------------------------------------------------------
|
|
26
|
-
const WIDGET_HEADER_SEPARATOR = " · ";
|
|
27
|
-
const WIDGET_ITEM_SEPARATOR = " ";
|
|
28
|
-
/** True while any open task exists; the widget is registered only in that case. */
|
|
29
|
-
export function hasOpenTodos(state) {
|
|
30
|
-
return state.items.some((item) => item.status === "pending" || item.status === "in_progress");
|
|
31
|
-
}
|
|
32
|
-
/** Status counts across the whole list. */
|
|
33
|
-
function widgetCounts(state) {
|
|
34
|
-
const counts = { active: 0, pending: 0, completed: 0 };
|
|
35
|
-
for (const item of state.items) {
|
|
36
|
-
if (item.status === "in_progress")
|
|
37
|
-
counts.active++;
|
|
38
|
-
else if (item.status === "pending")
|
|
39
|
-
counts.pending++;
|
|
40
|
-
else
|
|
41
|
-
counts.completed++;
|
|
42
|
-
}
|
|
43
|
-
return counts;
|
|
44
|
-
}
|
|
45
|
-
function widgetSegment(item, subject, theme) {
|
|
46
|
-
return `${theme.fg(STATUS_COLOR[item.status], STATUS_MARK[item.status])} ${theme.fg("accent", `#${item.id}`)} ${theme.fg("text", subject)}`;
|
|
47
|
-
}
|
|
48
|
-
function widgetLine(header, segments, overflow) {
|
|
49
|
-
const body = [...segments, ...(overflow ? [overflow] : [])].join(WIDGET_ITEM_SEPARATOR);
|
|
50
|
-
return body ? `${header}${WIDGET_HEADER_SEPARATOR}${body}` : header;
|
|
51
|
-
}
|
|
52
|
-
/** One-line widget: `Todos 2/6 · [>] #4 s [ ] #5 s +N more`; only hidden open tasks count in the overflow. */
|
|
53
|
-
export function renderWidgetLine(state, theme, width) {
|
|
54
|
-
const safeWidth = Math.max(1, width);
|
|
55
|
-
const items = state.items;
|
|
56
|
-
const candidates = items
|
|
57
|
-
.filter((item) => item.status !== "completed")
|
|
58
|
-
.sort((first, second) => STATUS_RANK[first.status] - STATUS_RANK[second.status] || first.id - second.id);
|
|
59
|
-
if (candidates.length === 0)
|
|
60
|
-
return [];
|
|
61
|
-
const total = items.length;
|
|
62
|
-
const completed = items.filter((item) => item.status === "completed").length;
|
|
63
|
-
const header = `${theme.fg("accent", "Todos")} ${theme.fg("dim", `${completed}/${total}`)}`;
|
|
64
|
-
const shown = [];
|
|
65
|
-
let overflow = "";
|
|
66
|
-
// Count only open tasks not shown by the trial segments.
|
|
67
|
-
const bestOverflow = (trial) => {
|
|
68
|
-
const remaining = candidates.length - trial.length;
|
|
69
|
-
const segments = trial.map((entry) => widgetSegment(entry.item, entry.subject, theme));
|
|
70
|
-
if (remaining <= 0)
|
|
71
|
-
return visibleWidth(widgetLine(header, segments, "")) <= safeWidth ? "" : undefined;
|
|
72
|
-
const short = theme.fg("dim", `+${remaining} more`);
|
|
73
|
-
return visibleWidth(widgetLine(header, segments, short)) <= safeWidth ? short : undefined;
|
|
74
|
-
};
|
|
75
|
-
// Extreme narrow widths: the best summary that fits, then the bare header.
|
|
76
|
-
const fallback = () => {
|
|
77
|
-
const best = bestOverflow([]);
|
|
78
|
-
if (best !== undefined)
|
|
79
|
-
return [widgetLine(header, [], best)];
|
|
80
|
-
if (visibleWidth(header) <= safeWidth)
|
|
81
|
-
return [header];
|
|
82
|
-
return [truncateToWidth(header, safeWidth, "…")];
|
|
83
|
-
};
|
|
84
|
-
// Segments are added whole, active first then pending by id, while the
|
|
85
|
-
// line keeps fitting; only the active subject may be truncated.
|
|
86
|
-
for (const candidate of candidates) {
|
|
87
|
-
const best = bestOverflow([...shown, { item: candidate, subject: candidate.subject }]);
|
|
88
|
-
if (best !== undefined) {
|
|
89
|
-
shown.push({ item: candidate, subject: candidate.subject });
|
|
90
|
-
overflow = best;
|
|
91
|
-
continue;
|
|
92
|
-
}
|
|
93
|
-
if (candidate.status !== "in_progress")
|
|
94
|
-
break;
|
|
95
|
-
const remaining = candidates.length - shown.length - 1;
|
|
96
|
-
const suffix = remaining > 0 ? `${WIDGET_ITEM_SEPARATOR}+${remaining} more` : "";
|
|
97
|
-
const prefix = `${header}${WIDGET_HEADER_SEPARATOR}${widgetSegment(candidate, "", theme)}${suffix}`;
|
|
98
|
-
const available = safeWidth - visibleWidth(prefix);
|
|
99
|
-
if (available < 1)
|
|
100
|
-
return fallback();
|
|
101
|
-
shown.push({ item: candidate, subject: truncateToWidth(candidate.subject, available, "…") });
|
|
102
|
-
overflow = bestOverflow(shown) ?? "";
|
|
103
|
-
}
|
|
104
|
-
if (shown.length === 0)
|
|
105
|
-
return fallback();
|
|
106
|
-
const segments = shown.map((entry) => widgetSegment(entry.item, entry.subject, theme));
|
|
107
|
-
const line = widgetLine(header, segments, overflow);
|
|
108
|
-
// Safety net: the visible width always stays within the terminal width.
|
|
109
|
-
return [visibleWidth(line) <= safeWidth ? line : truncateToWidth(line, safeWidth, "…")];
|
|
110
|
-
}
|
|
111
|
-
// --- Full list (used by /todos and the model-facing list result) ------------
|
|
112
|
-
/** `Todos: X in progress, Y pending, Z completed` header plus two-line tasks. */
|
|
113
|
-
function formatTodoList(state) {
|
|
114
|
-
if (state.items.length === 0)
|
|
115
|
-
return "No todos.";
|
|
116
|
-
const counts = widgetCounts(state);
|
|
117
|
-
const lines = [`Todos: ${counts.active} in progress, ${counts.pending} pending, ${counts.completed} completed`];
|
|
118
|
-
const items = [...state.items].sort((first, second) => STATUS_RANK[first.status] - STATUS_RANK[second.status] || first.id - second.id);
|
|
119
|
-
for (const item of items) {
|
|
120
|
-
lines.push(`${STATUS_MARK[item.status]} #${item.id} ${item.subject}`);
|
|
121
|
-
lines.push(` ${item.description}`);
|
|
122
|
-
}
|
|
123
|
-
return lines.join("\n");
|
|
124
|
-
}
|
|
125
|
-
/** /todos command output: full list, subject line plus indented description per task. */
|
|
126
|
-
export const formatCommandList = formatTodoList;
|
|
127
|
-
// --- Model-facing result text ------------------------------------------------
|
|
128
|
-
/** `#1–#3` for a consecutive run, `#1, #2` otherwise. */
|
|
129
|
-
function formatIdRange(ids) {
|
|
130
|
-
const consecutive = ids.length > 1 && ids.every((id, index) => id === ids[0] + index);
|
|
131
|
-
return consecutive ? `#${ids[0]}–#${ids[ids.length - 1]}` : ids.map((id) => `#${id}`).join(", ");
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* One-line change summary for a completed call, e.g.
|
|
135
|
-
* `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`.
|
|
136
|
-
* A call that changed nothing (including `{}`) returns the full list.
|
|
137
|
-
*/
|
|
138
|
-
export function formatTodoContent(change, state) {
|
|
139
|
-
const parts = [];
|
|
140
|
-
if (change.created.length > 0) {
|
|
141
|
-
const labels = change.created.map((id) => {
|
|
142
|
-
const item = state.items.find((entry) => entry.id === id);
|
|
143
|
-
if (!item)
|
|
144
|
-
return `#${id}`;
|
|
145
|
-
const suffix = item.status === "pending" ? "" : ` (${item.status})`;
|
|
146
|
-
return `#${id}: ${item.subject}${suffix}`;
|
|
147
|
-
});
|
|
148
|
-
const noun = change.created.length === 1 ? "task" : "tasks";
|
|
149
|
-
parts.push(`Created ${change.created.length} ${noun}: ${labels.join("; ")}`);
|
|
150
|
-
}
|
|
151
|
-
for (const entry of change.updated) {
|
|
152
|
-
const item = state.items.find((candidate) => candidate.id === entry.id);
|
|
153
|
-
const subject = item ? `: ${item.subject}` : "";
|
|
154
|
-
const transition = entry.from === entry.to ? "" : ` (${entry.from} -> ${entry.to})`;
|
|
155
|
-
parts.push(`Updated #${entry.id}${transition}${subject}`);
|
|
156
|
-
}
|
|
157
|
-
if (change.demotedId !== undefined)
|
|
158
|
-
parts.push(`demoted #${change.demotedId} to pending`);
|
|
159
|
-
if (change.deleted.length > 0) {
|
|
160
|
-
const noun = change.deleted.length === 1 ? "task" : "tasks";
|
|
161
|
-
const labels = change.deleted.map((entry) => `#${entry.id}: ${entry.subject}`);
|
|
162
|
-
parts.push(`Deleted ${change.deleted.length} ${noun}: ${labels.join("; ")}`);
|
|
163
|
-
}
|
|
164
|
-
for (const id of change.absent)
|
|
165
|
-
parts.push(`#${id} already absent`);
|
|
166
|
-
if (change.evicted.length > 0) {
|
|
167
|
-
const ids = change.evicted.map((entry) => entry.id);
|
|
168
|
-
parts.push(`auto-removed completed ${formatIdRange(ids)} to stay within ${TODO_MAX_ITEMS}`);
|
|
169
|
-
}
|
|
170
|
-
if (parts.length === 0)
|
|
171
|
-
return formatTodoList(state);
|
|
172
|
-
return parts.join("; ");
|
|
173
|
-
}
|
|
174
|
-
const CALL_ITEMS_MAX = TODO_MAX_BATCH_ITEMS;
|
|
175
|
-
const CALL_SUBJECT_PREVIEW_COUNT = 2;
|
|
176
|
-
const CALL_SUBJECT_PREVIEW_WIDTH = 72;
|
|
177
|
-
const CALL_DESCRIPTION_PREVIEW_LENGTH = 120;
|
|
178
|
-
const SUMMARY_FAILURE_MAX_LENGTH = 120;
|
|
179
|
-
/** Record-like read; proxies that throw on inspection are treated as absent. */
|
|
180
|
-
function safeRecord(value) {
|
|
181
|
-
try {
|
|
182
|
-
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
183
|
-
? value
|
|
184
|
-
: undefined;
|
|
185
|
-
}
|
|
186
|
-
catch {
|
|
187
|
-
return undefined;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
/** Field read that never throws, even for exotic objects with throwing getters. */
|
|
191
|
-
function safeValue(record, key) {
|
|
192
|
-
try {
|
|
193
|
-
return record?.[key];
|
|
194
|
-
}
|
|
195
|
-
catch {
|
|
196
|
-
return undefined;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
function safeString(value) {
|
|
200
|
-
return typeof value === "string" ? value : undefined;
|
|
201
|
-
}
|
|
202
|
-
/** Trimmed, whitespace-collapsed, length-clipped text (empty when absent). */
|
|
203
|
-
function clipText(value, max) {
|
|
204
|
-
return safeString(value)?.trim().replace(/\s+/g, " ").slice(0, max) ?? "";
|
|
205
|
-
}
|
|
206
|
-
const safeSubject = (value) => clipText(value, TODO_MAX_SUBJECT_LENGTH);
|
|
207
|
-
const safeDescription = (value) => clipText(value, TODO_MAX_DESCRIPTION_LENGTH);
|
|
208
|
-
function safeId(value) {
|
|
209
|
-
return typeof value === "number" && Number.isSafeInteger(value) && value >= 1 ? value : undefined;
|
|
210
|
-
}
|
|
211
|
-
function safeStatus(value) {
|
|
212
|
-
const status = safeString(value);
|
|
213
|
-
if (status === "pending" || status === "in_progress" || status === "completed")
|
|
214
|
-
return status;
|
|
215
|
-
return undefined;
|
|
216
|
-
}
|
|
217
|
-
function readArray(value, limit = CALL_ITEMS_MAX) {
|
|
218
|
-
try {
|
|
219
|
-
if (!Array.isArray(value))
|
|
220
|
-
return undefined;
|
|
221
|
-
const length = value.length;
|
|
222
|
-
const values = [];
|
|
223
|
-
for (let index = 0; index < Math.min(length, limit); index++) {
|
|
224
|
-
try {
|
|
225
|
-
values.push(value[index]);
|
|
226
|
-
}
|
|
227
|
-
catch {
|
|
228
|
-
values.push(undefined);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
return { values, length };
|
|
232
|
-
}
|
|
233
|
-
catch {
|
|
234
|
-
return undefined;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
/** Id lists: invalid entries drop (rendering never rejects the whole call). */
|
|
238
|
-
function readIds(value) {
|
|
239
|
-
const array = readArray(value);
|
|
240
|
-
if (!array)
|
|
241
|
-
return undefined;
|
|
242
|
-
const ids = [];
|
|
243
|
-
for (const entry of array.values) {
|
|
244
|
-
const id = safeId(entry);
|
|
245
|
-
if (id !== undefined)
|
|
246
|
-
ids.push(id);
|
|
247
|
-
}
|
|
248
|
-
return ids;
|
|
249
|
-
}
|
|
250
|
-
/** Create args: sparse or invalid entries drop; the batch caps at the maximum. */
|
|
251
|
-
function batchCreateItems(value) {
|
|
252
|
-
const result = [];
|
|
253
|
-
for (const raw of readArray(value)?.values ?? []) {
|
|
254
|
-
const item = safeRecord(raw);
|
|
255
|
-
if (!item)
|
|
256
|
-
continue;
|
|
257
|
-
const entry = {
|
|
258
|
-
subject: safeSubject(safeValue(item, "subject")),
|
|
259
|
-
description: safeDescription(safeValue(item, "description")),
|
|
260
|
-
};
|
|
261
|
-
const status = safeStatus(safeValue(item, "status"));
|
|
262
|
-
if (status)
|
|
263
|
-
entry.status = status;
|
|
264
|
-
result.push(entry);
|
|
265
|
-
}
|
|
266
|
-
return result;
|
|
267
|
-
}
|
|
268
|
-
/** Update args: sparse or invalid entries drop; the batch caps at the maximum. */
|
|
269
|
-
function batchUpdateItems(value) {
|
|
270
|
-
const result = [];
|
|
271
|
-
for (const raw of readArray(value)?.values ?? []) {
|
|
272
|
-
const item = safeRecord(raw);
|
|
273
|
-
if (!item)
|
|
274
|
-
continue;
|
|
275
|
-
const entry = {
|
|
276
|
-
subject: safeSubject(safeValue(item, "subject")),
|
|
277
|
-
description: safeDescription(safeValue(item, "description")),
|
|
278
|
-
};
|
|
279
|
-
const id = safeId(safeValue(item, "id"));
|
|
280
|
-
if (id !== undefined)
|
|
281
|
-
entry.id = id;
|
|
282
|
-
const status = safeStatus(safeValue(item, "status"));
|
|
283
|
-
if (status)
|
|
284
|
-
entry.status = status;
|
|
285
|
-
result.push(entry);
|
|
286
|
-
}
|
|
287
|
-
return result;
|
|
288
|
-
}
|
|
289
|
-
function descriptionPreview(value) {
|
|
290
|
-
const text = value.replace(/\s+/g, " ");
|
|
291
|
-
return text.length > CALL_DESCRIPTION_PREVIEW_LENGTH
|
|
292
|
-
? `${text.slice(0, CALL_DESCRIPTION_PREVIEW_LENGTH - 1)}…`
|
|
293
|
-
: text;
|
|
294
|
-
}
|
|
295
|
-
/** At most two subjects, each truncated to the preview width, plus `+N more`. */
|
|
296
|
-
function formatSubjectPreview(subjects, total) {
|
|
297
|
-
// Filter before slicing so an empty subject (streaming args) does not consume
|
|
298
|
-
// a preview slot.
|
|
299
|
-
const shown = subjects
|
|
300
|
-
.filter(Boolean)
|
|
301
|
-
.slice(0, CALL_SUBJECT_PREVIEW_COUNT)
|
|
302
|
-
.map((subject) => truncateToWidth(subject, CALL_SUBJECT_PREVIEW_WIDTH, "…"));
|
|
303
|
-
if (!shown.length)
|
|
304
|
-
return "";
|
|
305
|
-
const hidden = Math.max(0, total - shown.length);
|
|
306
|
-
return `${shown.join(", ")}${hidden ? `, +${hidden} more` : ""}`;
|
|
307
|
-
}
|
|
308
|
-
/** v3 details guard shared by the call and group renderers. */
|
|
309
|
-
function todoDetails(value) {
|
|
310
|
-
const details = safeRecord(value);
|
|
311
|
-
if (!details || safeValue(details, "schemaVersion") !== TODO_DETAILS_SCHEMA_VERSION)
|
|
312
|
-
return undefined;
|
|
313
|
-
const change = safeRecord(safeValue(details, "change"));
|
|
314
|
-
const state = safeRecord(safeValue(details, "state"));
|
|
315
|
-
if (!change || !state)
|
|
316
|
-
return undefined;
|
|
317
|
-
return { change, state };
|
|
318
|
-
}
|
|
319
|
-
/** Result ids for an expanded create, only when they match the shown items. */
|
|
320
|
-
function createResultIds(result, count) {
|
|
321
|
-
const details = todoDetails(result?.details);
|
|
322
|
-
if (!details)
|
|
323
|
-
return undefined;
|
|
324
|
-
const ids = readIds(safeValue(details.change, "created"));
|
|
325
|
-
return ids && ids.length === count && count > 0 ? ids : undefined;
|
|
326
|
-
}
|
|
327
|
-
/** Removed entries from a settled result, for the expanded delete detail lines. */
|
|
328
|
-
function deleteResultRemoved(result) {
|
|
329
|
-
const details = todoDetails(result?.details);
|
|
330
|
-
if (!details)
|
|
331
|
-
return [];
|
|
332
|
-
return idSubjectEntries(safeValue(details.change, "deleted"));
|
|
333
|
-
}
|
|
334
|
-
/** Absent ids from a settled delete, for the expanded delete detail lines. */
|
|
335
|
-
function deleteResultAbsent(result) {
|
|
336
|
-
const details = todoDetails(result?.details);
|
|
337
|
-
if (!details)
|
|
338
|
-
return [];
|
|
339
|
-
return readIds(safeValue(details.change, "absent")) ?? [];
|
|
340
|
-
}
|
|
341
|
-
/** Headline plus the parameters the result never echoes as detail lines. */
|
|
342
|
-
function formatCallParts(args, theme, result) {
|
|
343
|
-
const details = [];
|
|
344
|
-
const segments = [];
|
|
345
|
-
const pushSegment = (verb, body) => {
|
|
346
|
-
const title = segments.length === 0 ? `todo ${verb}` : verb;
|
|
347
|
-
segments.push(body ? `${theme.fg("toolTitle", theme.bold(title))} ${body}` : theme.fg("toolTitle", theme.bold(title)));
|
|
348
|
-
};
|
|
349
|
-
const hasCreate = args?.create !== undefined;
|
|
350
|
-
const hasUpdate = args?.update !== undefined;
|
|
351
|
-
const hasDelete = args?.delete !== undefined;
|
|
352
|
-
if (hasCreate) {
|
|
353
|
-
const items = batchCreateItems(args?.create);
|
|
354
|
-
const rawCount = readArray(args?.create)?.length;
|
|
355
|
-
// An empty array is strict-mode filler: the call lists the tasks, so the
|
|
356
|
-
// group earns no segment of its own.
|
|
357
|
-
if (rawCount !== 0) {
|
|
358
|
-
const body = [];
|
|
359
|
-
if (rawCount !== undefined) {
|
|
360
|
-
const count = Math.min(rawCount, CALL_ITEMS_MAX);
|
|
361
|
-
body.push(theme.fg("dim", `${count} ${count === 1 ? "task" : "tasks"}`));
|
|
362
|
-
const preview = formatSubjectPreview(items.map((item) => item.subject), count);
|
|
363
|
-
if (preview)
|
|
364
|
-
body.push(theme.fg("dim", "·"), theme.fg("text", preview));
|
|
365
|
-
}
|
|
366
|
-
pushSegment("create", body.join(" "));
|
|
367
|
-
}
|
|
368
|
-
const ids = createResultIds(result, items.length);
|
|
369
|
-
for (const [index, item] of items.entries()) {
|
|
370
|
-
const marker = ids ? theme.fg("accent", `#${ids[index]}`) : theme.fg("accent", `${index + 1}.`);
|
|
371
|
-
const status = item.status && item.status !== "pending"
|
|
372
|
-
? ` ${theme.fg(STATUS_COLOR[item.status], `(${item.status})`)}`
|
|
373
|
-
: "";
|
|
374
|
-
details.push(item.subject ? `${marker} ${theme.fg("text", item.subject)}${status}` : marker);
|
|
375
|
-
if (item.description)
|
|
376
|
-
details.push(` ${theme.fg("dim", descriptionPreview(item.description))}`);
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
if (hasUpdate) {
|
|
380
|
-
const items = batchUpdateItems(args?.update);
|
|
381
|
-
const rawCount = readArray(args?.update)?.length;
|
|
382
|
-
if (rawCount !== 0) {
|
|
383
|
-
const entries = [];
|
|
384
|
-
for (const item of items) {
|
|
385
|
-
const parts = [];
|
|
386
|
-
if (item.id !== undefined)
|
|
387
|
-
parts.push(theme.fg("accent", `#${item.id}`));
|
|
388
|
-
if (item.status)
|
|
389
|
-
parts.push(theme.fg(STATUS_COLOR[item.status], item.status));
|
|
390
|
-
if (item.subject)
|
|
391
|
-
parts.push(theme.fg("text", truncateToWidth(item.subject, CALL_SUBJECT_PREVIEW_WIDTH, "…")));
|
|
392
|
-
if (parts.length > 0)
|
|
393
|
-
entries.push(parts.join(" "));
|
|
394
|
-
}
|
|
395
|
-
pushSegment("update", entries.join(theme.fg("dim", ", ")));
|
|
396
|
-
}
|
|
397
|
-
for (const item of items) {
|
|
398
|
-
if (item.description)
|
|
399
|
-
details.push(` ${theme.fg("dim", descriptionPreview(item.description))}`);
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
if (hasDelete) {
|
|
403
|
-
const rawCount = readArray(args?.delete)?.length;
|
|
404
|
-
if (rawCount !== 0) {
|
|
405
|
-
const ids = readIds(args?.delete) ?? [];
|
|
406
|
-
pushSegment("delete", ids.length > 0 ? theme.fg("accent", ids.map((id) => `#${id}`).join(", ")) : "");
|
|
407
|
-
}
|
|
408
|
-
// The headline already carries the ids, so details only earn their lines
|
|
409
|
-
// once the result names what was actually removed or already absent.
|
|
410
|
-
for (const entry of deleteResultRemoved(result)) {
|
|
411
|
-
details.push(`${theme.fg("accent", `#${entry.id}`)} ${theme.fg("text", entry.subject)}`);
|
|
412
|
-
}
|
|
413
|
-
for (const id of deleteResultAbsent(result)) {
|
|
414
|
-
details.push(theme.fg("dim", `#${id} already absent`));
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
if (segments.length === 0) {
|
|
418
|
-
// No group fields at all: the call lists the tasks.
|
|
419
|
-
segments.push(theme.fg("toolTitle", theme.bold("todo list")));
|
|
420
|
-
}
|
|
421
|
-
return { headline: segments.join(theme.fg("dim", " ; ")), details };
|
|
422
|
-
}
|
|
423
|
-
/** One-line call summary when collapsed; headline plus details when expanded. */
|
|
424
|
-
export function formatTodoCall(args, theme, expanded, result) {
|
|
425
|
-
const { headline, details } = formatCallParts(args, theme, result);
|
|
426
|
-
return !expanded || details.length === 0 ? headline : [headline, ...details].join("\n");
|
|
427
|
-
}
|
|
428
|
-
/** Id -> item index plus status counts over the v3 snapshot (one defensive walk). */
|
|
429
|
-
function stateIndex(state) {
|
|
430
|
-
const array = readArray(safeValue(state, "items"), TODO_MAX_ITEMS);
|
|
431
|
-
if (!array || array.length > TODO_MAX_ITEMS)
|
|
432
|
-
return undefined;
|
|
433
|
-
const byId = new Map();
|
|
434
|
-
const counts = { inProgress: 0, pending: 0, completed: 0 };
|
|
435
|
-
for (const raw of array.values) {
|
|
436
|
-
const item = safeRecord(raw);
|
|
437
|
-
if (!item)
|
|
438
|
-
continue;
|
|
439
|
-
const id = safeId(safeValue(item, "id"));
|
|
440
|
-
if (id !== undefined && !byId.has(id))
|
|
441
|
-
byId.set(id, item);
|
|
442
|
-
const status = safeStatus(safeValue(item, "status"));
|
|
443
|
-
if (status === "in_progress")
|
|
444
|
-
counts.inProgress++;
|
|
445
|
-
else if (status === "pending")
|
|
446
|
-
counts.pending++;
|
|
447
|
-
else if (status === "completed")
|
|
448
|
-
counts.completed++;
|
|
449
|
-
}
|
|
450
|
-
return { byId, counts };
|
|
451
|
-
}
|
|
452
|
-
function stateSubject(map, id) {
|
|
453
|
-
const item = map.get(id);
|
|
454
|
-
return item ? safeSubject(safeValue(item, "subject")) : "";
|
|
455
|
-
}
|
|
456
|
-
/** Id+subject entries (deleted, evicted): invalid entries drop. */
|
|
457
|
-
function idSubjectEntries(value) {
|
|
458
|
-
const entries = [];
|
|
459
|
-
for (const raw of readArray(value)?.values ?? []) {
|
|
460
|
-
const item = safeRecord(raw);
|
|
461
|
-
const id = safeId(safeValue(item, "id"));
|
|
462
|
-
const subject = safeSubject(safeValue(item, "subject"));
|
|
463
|
-
if (id === undefined || !subject)
|
|
464
|
-
continue;
|
|
465
|
-
entries.push({ id, subject });
|
|
466
|
-
}
|
|
467
|
-
return entries;
|
|
468
|
-
}
|
|
469
|
-
/** Updated entries: {id, from, to} records, invalid entries drop. */
|
|
470
|
-
function updatedEntries(value) {
|
|
471
|
-
const entries = [];
|
|
472
|
-
for (const raw of readArray(value)?.values ?? []) {
|
|
473
|
-
const item = safeRecord(raw);
|
|
474
|
-
const id = safeId(safeValue(item, "id"));
|
|
475
|
-
if (id === undefined)
|
|
476
|
-
continue;
|
|
477
|
-
const entry = { id };
|
|
478
|
-
const from = safeStatus(safeValue(item, "from"));
|
|
479
|
-
if (from)
|
|
480
|
-
entry.from = from;
|
|
481
|
-
const to = safeStatus(safeValue(item, "to"));
|
|
482
|
-
if (to)
|
|
483
|
-
entry.to = to;
|
|
484
|
-
entries.push(entry);
|
|
485
|
-
}
|
|
486
|
-
return entries;
|
|
487
|
-
}
|
|
488
|
-
function formatTodoSuccessSummary(args, theme, result) {
|
|
489
|
-
const parsed = todoDetails(result.details);
|
|
490
|
-
if (!parsed)
|
|
491
|
-
return undefined;
|
|
492
|
-
const { change, state } = parsed;
|
|
493
|
-
const index = stateIndex(state);
|
|
494
|
-
const segments = [];
|
|
495
|
-
const pushVerb = (word, body) => {
|
|
496
|
-
const title = segments.length === 0 ? `todo ${word}` : word;
|
|
497
|
-
segments.push(body ? `${theme.fg("toolTitle", title)} ${body}` : theme.fg("toolTitle", title));
|
|
498
|
-
};
|
|
499
|
-
const withPreview = (word, ids, subjects) => {
|
|
500
|
-
const text = formatSubjectPreview(subjects, subjects.length);
|
|
501
|
-
const base = theme.fg("accent", formatIdRange(ids));
|
|
502
|
-
pushVerb(word, text ? `${base}${theme.fg("dim", " · ")}${theme.fg("text", text)}` : base);
|
|
503
|
-
};
|
|
504
|
-
const created = readIds(safeValue(change, "created")) ?? [];
|
|
505
|
-
if (created.length > 0 && index) {
|
|
506
|
-
withPreview("created", created, created.map((id) => stateSubject(index.byId, id)));
|
|
507
|
-
}
|
|
508
|
-
for (const entry of updatedEntries(safeValue(change, "updated"))) {
|
|
509
|
-
const parts = [theme.fg("accent", `#${entry.id}`)];
|
|
510
|
-
if (entry.to)
|
|
511
|
-
parts.push(theme.fg(STATUS_COLOR[entry.to], entry.to));
|
|
512
|
-
const subject = index ? stateSubject(index.byId, entry.id) : "";
|
|
513
|
-
if (subject)
|
|
514
|
-
parts.push(theme.fg("text", truncateToWidth(subject, CALL_SUBJECT_PREVIEW_WIDTH, "…")));
|
|
515
|
-
pushVerb("updated", parts.join(" "));
|
|
516
|
-
}
|
|
517
|
-
const demotedId = safeId(safeValue(change, "demotedId"));
|
|
518
|
-
if (demotedId !== undefined)
|
|
519
|
-
segments.push(theme.fg("dim", `demoted #${demotedId}`));
|
|
520
|
-
const deleted = idSubjectEntries(safeValue(change, "deleted"));
|
|
521
|
-
if (deleted.length > 0) {
|
|
522
|
-
withPreview("deleted", deleted.map((entry) => entry.id), deleted.map((entry) => entry.subject));
|
|
523
|
-
}
|
|
524
|
-
for (const id of readIds(safeValue(change, "absent")) ?? []) {
|
|
525
|
-
segments.push(theme.fg("dim", `#${id} already absent`));
|
|
526
|
-
}
|
|
527
|
-
const evicted = idSubjectEntries(safeValue(change, "evicted"));
|
|
528
|
-
if (evicted.length > 0) {
|
|
529
|
-
segments.push(theme.fg("dim", `auto-removed ${evicted.map((entry) => `#${entry.id}`).join(", ")}`));
|
|
530
|
-
}
|
|
531
|
-
if (segments.length === 0) {
|
|
532
|
-
// Empty change: the call listed the tasks.
|
|
533
|
-
if (!index)
|
|
534
|
-
return undefined;
|
|
535
|
-
const parts = [];
|
|
536
|
-
if (index.counts.inProgress > 0)
|
|
537
|
-
parts.push(`${index.counts.inProgress} in progress`);
|
|
538
|
-
if (index.counts.pending > 0)
|
|
539
|
-
parts.push(`${index.counts.pending} pending`);
|
|
540
|
-
if (index.counts.completed > 0)
|
|
541
|
-
parts.push(`${index.counts.completed} completed`);
|
|
542
|
-
return `${theme.fg("toolTitle", "todo list")}: ${theme.fg("dim", parts.length ? parts.join(", ") : "no tasks")}`;
|
|
543
|
-
}
|
|
544
|
-
// The update segment can still pick up the requested subject when the state
|
|
545
|
-
// no longer holds it (e.g. the task was deleted by a hostile snapshot).
|
|
546
|
-
void args;
|
|
547
|
-
return segments.join(theme.fg("dim", " ; "));
|
|
548
|
-
}
|
|
549
|
-
/** Compact result-aware one-line summary of a collapsed todo row. */
|
|
550
|
-
export function formatTodoSummary(args, theme, context) {
|
|
551
|
-
if (context.isError) {
|
|
552
|
-
let reason = "tool failed";
|
|
553
|
-
try {
|
|
554
|
-
for (const block of context.result?.content.slice(0, 8) ?? []) {
|
|
555
|
-
if (block.type !== "text" || typeof block.text !== "string")
|
|
556
|
-
continue;
|
|
557
|
-
const text = block.text
|
|
558
|
-
.replace(/[\u0000-\u001f\u007f-\u009f]/g, " ")
|
|
559
|
-
.replace(/\s+/g, " ")
|
|
560
|
-
.trim();
|
|
561
|
-
if (!text)
|
|
562
|
-
continue;
|
|
563
|
-
reason =
|
|
564
|
-
text.length > SUMMARY_FAILURE_MAX_LENGTH ? `${text.slice(0, SUMMARY_FAILURE_MAX_LENGTH - 1)}…` : text;
|
|
565
|
-
break;
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
catch {
|
|
569
|
-
// Tool results can come from historical or third-party sources.
|
|
570
|
-
}
|
|
571
|
-
return `${formatTodoCall(args, theme, false)} ${theme.fg("error", `failed: ${reason}`)}`;
|
|
572
|
-
}
|
|
573
|
-
if (!context.isPartial && context.result) {
|
|
574
|
-
const summary = formatTodoSuccessSummary(args, theme, context.result);
|
|
575
|
-
if (summary)
|
|
576
|
-
return summary;
|
|
577
|
-
}
|
|
578
|
-
return formatTodoCall(args, theme, false);
|
|
579
|
-
}
|
|
580
|
-
//# sourceMappingURL=view.js.map
|