@astralyn/pi 1.4.11 → 1.5.1
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 +79 -0
- package/dist/bundle/chunks/anthropic-messages-G5ZGBHOH.js +6 -0
- package/dist/bundle/chunks/azure-openai-responses-EMPTMYNF.js +2 -0
- package/dist/bundle/chunks/bedrock-converse-stream.js +22 -15
- package/dist/bundle/chunks/{chunk-TH3QDDPD.js → chunk-3YGNXVKM.js} +1 -1
- package/dist/bundle/chunks/chunk-AXX7FFFD.js +2 -0
- package/dist/bundle/chunks/chunk-FNGB3ASD.js +2 -0
- package/dist/bundle/chunks/chunk-FPALVF3F.js +4 -0
- package/dist/bundle/chunks/chunk-H3UF54OB.js +9 -0
- package/dist/bundle/chunks/{chunk-NUQMVNKQ.js → chunk-HLVMLRZJ.js} +58 -62
- package/dist/bundle/chunks/chunk-IC6JXX2J.js +10 -0
- package/dist/bundle/chunks/{chunk-MZJC45TM.js → chunk-J7L6O5XA.js} +3 -3
- package/dist/bundle/chunks/{chunk-DLVLAQEG.js → chunk-KBFO53OG.js} +3 -3
- package/dist/bundle/chunks/chunk-M3D4ADUT.js +1503 -0
- package/dist/bundle/chunks/{chunk-TPVFPFJP.js → chunk-P7VXFB2M.js} +1 -1
- package/dist/bundle/chunks/chunk-PSYLMRL6.js +9 -0
- package/dist/bundle/chunks/chunk-QNZARXLE.js +82 -0
- package/dist/bundle/chunks/chunk-RAIYJ5FC.js +4 -0
- package/dist/bundle/chunks/{chunk-OV2VMHBX.js → chunk-SR6EWNPW.js} +1 -1
- package/dist/bundle/chunks/chunk-TA3YH2ZI.js +16 -0
- package/dist/bundle/chunks/{chunk-24FY4C5S.js → chunk-TRSJS3FM.js} +1 -1
- package/dist/bundle/chunks/chunk-ZRI3ICDE.js +2 -0
- package/dist/bundle/chunks/{cli-MBFCFGI2.js → cli-LAZQG54B.js} +11 -9
- package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-7BKATOEJ.js → cloudflare-workers-ai-system-one-4L2ABUJE.js} +1 -1
- package/dist/bundle/chunks/{execute-VLAIP26K.js → execute-SSRW6NGS.js} +1 -1
- package/dist/bundle/chunks/github-copilot.js +1 -1
- package/dist/bundle/chunks/{google-generative-ai-HTUSU45F.js → google-generative-ai-OOVDGS5W.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-AVQV4P76.js → google-vertex-IK5RNG7J.js} +1 -1
- package/dist/bundle/chunks/image-resize-worker.js +1 -1
- package/dist/bundle/chunks/kimi-coding.js +1 -1
- package/dist/bundle/chunks/{llama-cpp-classify-27QYLJZY.js → llama-cpp-classify-XHAVT37C.js} +1 -1
- package/dist/bundle/chunks/meta.js +1 -1
- package/dist/bundle/chunks/mistral-conversations-Z56KY4OJ.js +5 -0
- package/dist/bundle/chunks/{openai-codex-responses-Q25MHDFX.js → openai-codex-responses-5NAH3SK6.js} +1 -1
- package/dist/bundle/chunks/openai-completions-S7S6PO3J.js +7 -0
- package/dist/bundle/chunks/{openai-decisions-3WYFPGSK.js → openai-decisions-7A36EAHE.js} +1 -1
- package/dist/bundle/chunks/{openai-responses-E4BNZIQK.js → openai-responses-ZQRZJKH4.js} +1 -1
- package/dist/bundle/chunks/{openrouter-images-CBP3OPOD.js → openrouter-images-X7PX72ON.js} +1 -1
- package/dist/bundle/chunks/pi-messages-TXNWPLI4.js +8 -0
- package/dist/bundle/chunks/radius.js +1 -1
- package/dist/bundle/chunks/{runtime-3RPOJS5T.js → runtime-X3XOMNXQ.js} +1 -1
- package/dist/bundle/chunks/{typesafe-system-one-BNICP2LS.js → typesafe-system-one-XJGMSHWL.js} +1 -1
- package/dist/bundle/chunks/virtual-modules-NFDW2JKH.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 +8 -7
- package/dist/cli/args.js.map +1 -1
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +24 -5
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +0 -5
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +12 -28
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +21 -14
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +67 -93
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +4 -2
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +16 -4
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/exec.d.ts +9 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js +104 -60
- package/dist/core/exec.js.map +1 -1
- package/dist/core/export-html/template.css +9 -0
- package/dist/core/export-html/template.js +165 -45
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js +5 -0
- package/dist/core/export-html/tool-renderer.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 +7 -6
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/pi-ai-extension-view.d.ts +19 -0
- package/dist/core/extensions/pi-ai-extension-view.d.ts.map +1 -0
- package/dist/core/extensions/pi-ai-extension-view.js +22 -0
- package/dist/core/extensions/pi-ai-extension-view.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +0 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +7 -12
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +41 -23
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/virtual-modules.js +8 -7
- package/dist/core/extensions/virtual-modules.js.map +1 -1
- package/dist/core/mcp-servers.d.ts +11 -4
- package/dist/core/mcp-servers.d.ts.map +1 -1
- package/dist/core/mcp-servers.js +15 -5
- package/dist/core/mcp-servers.js.map +1 -1
- package/dist/core/model-config.d.ts +1678 -2029
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +2 -3
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +16 -10
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/package-manager.d.ts +14 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +160 -46
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/pi-ai-schemas.d.ts +163 -0
- package/dist/core/pi-ai-schemas.d.ts.map +1 -0
- package/dist/core/pi-ai-schemas.js +21 -0
- package/dist/core/pi-ai-schemas.js.map +1 -0
- package/dist/core/pi-manifest.d.ts +1 -0
- package/dist/core/pi-manifest.d.ts.map +1 -1
- package/dist/core/pi-manifest.js +4 -0
- package/dist/core/pi-manifest.js.map +1 -1
- package/dist/core/project-trust.js +1 -1
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/quiescence.d.ts +24 -0
- package/dist/core/quiescence.d.ts.map +1 -0
- package/dist/core/quiescence.js +81 -0
- package/dist/core/quiescence.js.map +1 -0
- package/dist/core/resource-loader.d.ts +4 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +41 -28
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +3 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +7 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +32 -13
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +2 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +11 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-schema.d.ts +4 -2
- package/dist/core/settings-schema.d.ts.map +1 -1
- package/dist/core/settings-schema.js +8 -1
- package/dist/core/settings-schema.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +6 -14
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-command-name.d.ts +6 -0
- package/dist/core/slash-command-name.d.ts.map +1 -0
- package/dist/core/slash-command-name.js +11 -0
- package/dist/core/slash-command-name.js.map +1 -0
- package/dist/core/slash-commands.js +2 -2
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/source-info.d.ts +9 -0
- package/dist/core/source-info.d.ts.map +1 -1
- package/dist/core/source-info.js +13 -0
- package/dist/core/source-info.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +5 -6
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tasks/activity.d.ts +14 -0
- package/dist/core/tasks/activity.d.ts.map +1 -0
- package/dist/core/tasks/activity.js +58 -0
- package/dist/core/tasks/activity.js.map +1 -0
- package/dist/core/tasks/codec.d.ts +14 -0
- package/dist/core/tasks/codec.d.ts.map +1 -1
- package/dist/core/tasks/codec.js +57 -4
- package/dist/core/tasks/codec.js.map +1 -1
- package/dist/core/tasks/execution.d.ts.map +1 -1
- package/dist/core/tasks/execution.js +2 -2
- package/dist/core/tasks/execution.js.map +1 -1
- package/dist/core/tasks/output.d.ts +4 -1
- package/dist/core/tasks/output.d.ts.map +1 -1
- package/dist/core/tasks/output.js +33 -0
- package/dist/core/tasks/output.js.map +1 -1
- package/dist/core/tasks/record.d.ts +1 -7
- package/dist/core/tasks/record.d.ts.map +1 -1
- package/dist/core/tasks/record.js +0 -18
- package/dist/core/tasks/record.js.map +1 -1
- package/dist/core/tasks/reminder.d.ts +3 -2
- package/dist/core/tasks/reminder.d.ts.map +1 -1
- package/dist/core/tasks/reminder.js +4 -3
- package/dist/core/tasks/reminder.js.map +1 -1
- package/dist/core/tasks/runtime.d.ts +0 -2
- package/dist/core/tasks/runtime.d.ts.map +1 -1
- package/dist/core/tasks/runtime.js +2 -15
- package/dist/core/tasks/runtime.js.map +1 -1
- package/dist/core/tasks/session.d.ts +9 -2
- package/dist/core/tasks/session.d.ts.map +1 -1
- package/dist/core/tasks/session.js +23 -9
- package/dist/core/tasks/session.js.map +1 -1
- package/dist/core/tasks/types.d.ts +20 -20
- package/dist/core/tasks/types.d.ts.map +1 -1
- package/dist/core/tasks/types.js +1 -1
- package/dist/core/tasks/types.js.map +1 -1
- package/dist/core/tools/bash.d.ts +8 -7
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +6 -5
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts +3 -3
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +2 -4
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts +2 -2
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +2 -2
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/ls.d.ts +2 -2
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/powershell.d.ts +1 -5
- package/dist/core/tools/powershell.d.ts.map +1 -1
- package/dist/core/tools/read.d.ts +2 -2
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +4 -6
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +19 -41
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/renderers/bash.d.ts.map +1 -1
- package/dist/core/tools/renderers/bash.js +3 -25
- package/dist/core/tools/renderers/bash.js.map +1 -1
- package/dist/core/tools/renderers/write.d.ts.map +1 -1
- package/dist/core/tools/renderers/write.js +18 -19
- package/dist/core/tools/renderers/write.js.map +1 -1
- package/dist/core/tools/shell-execution.d.ts +20 -13
- package/dist/core/tools/shell-execution.d.ts.map +1 -1
- package/dist/core/tools/shell-execution.js +165 -183
- package/dist/core/tools/shell-execution.js.map +1 -1
- package/dist/core/tools/shell-tool.d.ts +9 -14
- package/dist/core/tools/shell-tool.d.ts.map +1 -1
- package/dist/core/tools/shell-tool.js +38 -66
- package/dist/core/tools/shell-tool.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -4
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +2 -3
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/write.d.ts +2 -2
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +30 -13
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/core/usage-totals.d.ts +0 -9
- package/dist/core/usage-totals.d.ts.map +1 -1
- package/dist/core/usage-totals.js +24 -91
- package/dist/core/usage-totals.js.map +1 -1
- package/dist/extensions/agent/activity-lines.d.ts +2 -7
- package/dist/extensions/agent/activity-lines.d.ts.map +1 -1
- package/dist/extensions/agent/activity-lines.js +6 -74
- package/dist/extensions/agent/activity-lines.js.map +1 -1
- package/dist/extensions/agent/activity.d.ts +0 -21
- package/dist/extensions/agent/activity.d.ts.map +1 -1
- package/dist/extensions/agent/activity.js +0 -63
- package/dist/extensions/agent/activity.js.map +1 -1
- package/dist/extensions/agent/progress.d.ts +0 -3
- package/dist/extensions/agent/progress.d.ts.map +1 -1
- package/dist/extensions/agent/progress.js +11 -10
- package/dist/extensions/agent/progress.js.map +1 -1
- package/dist/extensions/agent/render.js +1 -1
- package/dist/extensions/agent/render.js.map +1 -1
- package/dist/extensions/agent/tool.d.ts.map +1 -1
- package/dist/extensions/agent/tool.js +0 -6
- package/dist/extensions/agent/tool.js.map +1 -1
- package/dist/extensions/agent/types.d.ts +3 -11
- package/dist/extensions/agent/types.d.ts.map +1 -1
- package/dist/extensions/agent/types.js.map +1 -1
- package/dist/{core/isolated-session.d.ts → extensions/agent/worker-session.d.ts} +6 -6
- package/dist/extensions/agent/worker-session.d.ts.map +1 -0
- package/dist/{core/isolated-session.js → extensions/agent/worker-session.js} +9 -9
- package/dist/extensions/agent/worker-session.js.map +1 -0
- package/dist/extensions/agent/worker.d.ts +0 -3
- package/dist/extensions/agent/worker.d.ts.map +1 -1
- package/dist/extensions/agent/worker.js +2 -3
- package/dist/extensions/agent/worker.js.map +1 -1
- package/dist/extensions/btw/agent.d.ts.map +1 -1
- package/dist/extensions/btw/agent.js +2 -1
- package/dist/extensions/btw/agent.js.map +1 -1
- package/dist/extensions/cached-compaction/render.d.ts.map +1 -1
- package/dist/extensions/cached-compaction/render.js +3 -3
- package/dist/extensions/cached-compaction/render.js.map +1 -1
- package/dist/extensions/codemode/renderer.d.ts.map +1 -1
- package/dist/extensions/codemode/renderer.js +6 -2
- package/dist/extensions/codemode/renderer.js.map +1 -1
- package/dist/extensions/codemode/tool.d.ts +2 -1
- package/dist/extensions/codemode/tool.d.ts.map +1 -1
- package/dist/extensions/codemode/tool.js +33 -8
- package/dist/extensions/codemode/tool.js.map +1 -1
- package/dist/extensions/deepwiki/schema.d.ts.map +1 -1
- package/dist/extensions/deepwiki/schema.js +1 -1
- package/dist/extensions/deepwiki/schema.js.map +1 -1
- package/dist/extensions/llama/ui.d.ts.map +1 -1
- package/dist/extensions/llama/ui.js +16 -4
- package/dist/extensions/llama/ui.js.map +1 -1
- package/dist/extensions/mcp/cli.d.ts.map +1 -1
- package/dist/extensions/mcp/cli.js +34 -8
- package/dist/extensions/mcp/cli.js.map +1 -1
- package/dist/extensions/mcp/oauth.d.ts +1 -1
- package/dist/extensions/mcp/oauth.d.ts.map +1 -1
- package/dist/extensions/mcp/oauth.js +36 -13
- package/dist/extensions/mcp/oauth.js.map +1 -1
- package/dist/extensions/mcp/ui.d.ts +1 -0
- package/dist/extensions/mcp/ui.d.ts.map +1 -1
- package/dist/extensions/mcp/ui.js +33 -24
- package/dist/extensions/mcp/ui.js.map +1 -1
- package/dist/extensions/run-summary/index.d.ts +1 -1
- package/dist/extensions/run-summary/index.d.ts.map +1 -1
- package/dist/extensions/run-summary/index.js +11 -23
- package/dist/extensions/run-summary/index.js.map +1 -1
- package/dist/extensions/statusline/usage.d.ts.map +1 -1
- package/dist/extensions/statusline/usage.js +2 -1
- package/dist/extensions/statusline/usage.js.map +1 -1
- package/dist/extensions/tasks/tool/schema.d.ts.map +1 -1
- package/dist/extensions/tasks/tool/schema.js +1 -1
- package/dist/extensions/tasks/tool/schema.js.map +1 -1
- package/dist/extensions/tasks/ui/completion-render.d.ts +5 -1
- package/dist/extensions/tasks/ui/completion-render.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/completion-render.js +25 -70
- package/dist/extensions/tasks/ui/completion-render.js.map +1 -1
- package/dist/extensions/tasks/ui/inspector.d.ts +1 -1
- package/dist/extensions/tasks/ui/inspector.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/inspector.js +3 -7
- package/dist/extensions/tasks/ui/inspector.js.map +1 -1
- package/dist/extensions/tasks/ui/manager.d.ts +1 -1
- package/dist/extensions/tasks/ui/manager.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/manager.js.map +1 -1
- package/dist/extensions/tasks/ui/views.d.ts +3 -4
- package/dist/extensions/tasks/ui/views.d.ts.map +1 -1
- package/dist/extensions/tasks/ui/views.js +15 -14
- package/dist/extensions/tasks/ui/views.js.map +1 -1
- package/dist/extensions/tool-presentation/fallback.d.ts.map +1 -0
- package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/fallback.js +5 -5
- package/dist/extensions/tool-presentation/fallback.js.map +1 -0
- package/dist/extensions/tool-presentation/index.js +1 -1
- package/dist/extensions/tool-presentation/index.js.map +1 -1
- package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/shell.d.ts +1 -1
- package/dist/extensions/tool-presentation/shell.d.ts.map +1 -0
- package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/shell.js +3 -3
- package/dist/extensions/tool-presentation/shell.js.map +1 -0
- package/dist/extensions/tool-search/tool.d.ts +21 -6
- package/dist/extensions/tool-search/tool.d.ts.map +1 -1
- package/dist/extensions/tool-search/tool.js +104 -36
- package/dist/extensions/tool-search/tool.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +15 -8
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +5 -3
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +61 -45
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector-skills.d.ts +54 -0
- package/dist/modes/interactive/components/config-selector-skills.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector-skills.js +178 -0
- package/dist/modes/interactive/components/config-selector-skills.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +2 -11
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +31 -181
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +7 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +2 -1
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +2 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts +2 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +4 -0
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +5 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +103 -10
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/markdown-transform.d.ts +2 -1
- package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
- package/dist/modes/interactive/components/markdown-transform.js +3 -2
- package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +17 -6
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +13 -4
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +14 -3
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts +4 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js +86 -22
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts +2 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +15 -23
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.js +2 -0
- package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
- package/dist/modes/interactive/components/task-activity-list.d.ts +5 -0
- package/dist/modes/interactive/components/task-activity-list.d.ts.map +1 -0
- package/dist/modes/interactive/components/task-activity-list.js +68 -0
- package/dist/modes/interactive/components/task-activity-list.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +7 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +48 -9
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +5 -6
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +9 -1
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts +3 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +4 -2
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/editor-host.d.ts.map +1 -1
- package/dist/modes/interactive/editor-host.js +3 -2
- package/dist/modes/interactive/editor-host.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts +1 -0
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js +17 -5
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +8 -12
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +169 -112
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/model-search.d.ts +10 -0
- package/dist/modes/interactive/model-search.d.ts.map +1 -1
- package/dist/modes/interactive/model-search.js +21 -0
- package/dist/modes/interactive/model-search.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +10 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +30 -23
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/tool-view/chat.d.ts +2 -2
- package/dist/modes/interactive/tool-view/chat.d.ts.map +1 -1
- package/dist/modes/interactive/tool-view/chat.js +22 -19
- package/dist/modes/interactive/tool-view/chat.js.map +1 -1
- package/dist/modes/interactive/transcript-layout.d.ts +2 -0
- package/dist/modes/interactive/transcript-layout.d.ts.map +1 -1
- package/dist/modes/interactive/transcript-layout.js +5 -2
- package/dist/modes/interactive/transcript-layout.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +9 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +23 -23
- 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 +0 -3
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +55 -4
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/ansi.js +5 -2
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/clipboard-command.d.ts.map +1 -1
- package/dist/utils/clipboard-command.js +4 -0
- package/dist/utils/clipboard-command.js.map +1 -1
- package/dist/utils/git.d.ts +1 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js +5 -3
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/open-browser.d.ts.map +1 -1
- package/dist/utils/open-browser.js +4 -1
- package/dist/utils/open-browser.js.map +1 -1
- package/dist/utils/paths.d.ts +17 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +42 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +14 -0
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/syntax-highlight.d.ts +5 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -1
- package/dist/utils/syntax-highlight.js +7 -0
- package/dist/utils/syntax-highlight.js.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +30 -35
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/usage.d.ts +5 -0
- package/dist/utils/usage.d.ts.map +1 -0
- package/dist/utils/usage.js +16 -0
- package/dist/utils/usage.js.map +1 -0
- package/docs/bundled/README.md +1 -1
- package/docs/bundled/extensions/agent.md +5 -5
- package/docs/bundled/extensions/run-summary.md +4 -4
- package/docs/bundled/tasks.md +2 -4
- package/docs/bundled/tool-presentation.md +2 -2
- package/docs/custom-provider.md +1 -1
- package/docs/environment-variables.md +2 -0
- package/docs/extensions.md +38 -21
- package/docs/keybindings.md +1 -1
- package/docs/llama-cpp.md +17 -12
- package/docs/mcp.md +6 -4
- package/docs/packages.md +26 -1
- package/docs/rpc.md +1 -1
- package/docs/sdk.md +7 -5
- package/docs/session-format.md +2 -2
- package/docs/sessions.md +10 -0
- package/docs/settings.md +5 -4
- package/docs/terminal-setup.md +2 -2
- package/docs/tmux.md +6 -0
- package/docs/tui.md +12 -7
- package/docs/usage.md +19 -9
- package/docs/windows.md +29 -0
- package/examples/extensions/README.md +2 -1
- package/examples/extensions/custom-provider-anthropic/index.ts +27 -31
- 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/debug-provider.ts +2 -2
- package/examples/extensions/gondolin/package-lock.json +19 -29
- package/examples/extensions/gondolin/package.json +2 -2
- package/examples/extensions/preset.ts +2 -0
- package/examples/extensions/reload-runtime.ts +17 -5
- package/examples/extensions/tools.ts +2 -0
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/package.json +9 -9
- package/schemas/models.schema.json +36 -36
- package/schemas/settings.schema.json +17 -0
- package/dist/bundle/chunks/anthropic-messages-HWL6AS7T.js +0 -6
- package/dist/bundle/chunks/azure-openai-responses-4YYPDYV5.js +0 -2
- package/dist/bundle/chunks/chunk-6JS2SOFO.js +0 -11
- package/dist/bundle/chunks/chunk-ANCZPKX7.js +0 -2
- package/dist/bundle/chunks/chunk-FEZ5RM2B.js +0 -2
- package/dist/bundle/chunks/chunk-LPF7HQ3S.js +0 -4
- package/dist/bundle/chunks/chunk-MMNIHCU7.js +0 -2
- package/dist/bundle/chunks/chunk-PUU43PDV.js +0 -1484
- package/dist/bundle/chunks/chunk-R267VV5T.js +0 -82
- package/dist/bundle/chunks/chunk-RVKT7OUB.js +0 -9
- package/dist/bundle/chunks/chunk-SA2AQYEI.js +0 -7
- package/dist/bundle/chunks/chunk-ZAIGBRV5.js +0 -16
- package/dist/bundle/chunks/mistral-conversations-V2JJTMJ5.js +0 -5
- package/dist/bundle/chunks/openai-completions-TXZXILJR.js +0 -7
- package/dist/bundle/chunks/pi-messages-LBJQ4NGP.js +0 -8
- package/dist/bundle/chunks/virtual-modules-63XNTSVN.js +0 -2
- package/dist/core/isolated-session.d.ts.map +0 -1
- package/dist/core/isolated-session.js.map +0 -1
- package/dist/modes/interactive/tool-view/fallback.d.ts.map +0 -1
- package/dist/modes/interactive/tool-view/fallback.js.map +0 -1
- package/dist/modes/interactive/tool-view/shell.d.ts.map +0 -1
- package/dist/modes/interactive/tool-view/shell.js.map +0 -1
- package/dist/utils/path-identity.d.ts +0 -12
- package/dist/utils/path-identity.d.ts.map +0 -1
- package/dist/utils/path-identity.js +0 -63
- package/dist/utils/path-identity.js.map +0 -1
- package/examples/extensions/sandbox/index.ts +0 -321
- package/examples/extensions/sandbox/package-lock.json +0 -92
- package/examples/extensions/sandbox/package.json +0 -19
- /package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/fallback.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/extensions/tasks/ui/manager.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,OAAO,mBAAmB,CAAC;AAC3B,OAAO,EAGN,KAAK,GAGL,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAwC,MAAM,8BAA8B,CAAC;AACpG,OAAO,EAAE,0BAA0B,EAAE,MAAM,wDAAwD,CAAC;AAGpG,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAoB,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAoD,aAAa,EAAwB,MAAM,YAAY,CAAC;AACnH,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAgB7C,MAAM,MAAM,GAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC7C,uEAAuE;AACvE,MAAM,WAAW,GAAG,IAAI,CAAC;AACzB,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,OAAO,GAAoB;IAChC,kBAAkB;IAClB,gBAAgB;IAChB,0BAA0B;IAC1B,uBAAuB;IACvB,mBAAmB;IACnB,kBAAkB;IAClB,eAAe;IACf,kBAAkB;IAClB,qBAAqB;IACrB,yBAAyB;IACzB,gBAAgB;CAChB,CAAC;AAEF,4GAA4G;AAC5G,SAAS,iBAAiB,CAAC,IAAkB;IAC5C,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,wBAAwB,CAAC;IACjE,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,2BAA2B,CAAC;IACnE,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,SAAS;IAmBrB,YAAY,OAAyB;QAlBrC,YAAO,GAAG,KAAK,CAAC;QAIC,SAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAK/B,SAAI,GAAc,MAAM,CAAC;QAEzB,UAAK,GAAe,MAAM,CAAC;QAC3B,UAAK,GAAG,IAAI,CAAC;QACb,eAAU,GAAG,KAAK,CAAC;QACnB,kBAAa,GAAG,KAAK,CAAC;QACtB,aAAQ,GAAG,KAAK,CAAC;QAIxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS,GAAG,IAAI,aAAa,CAAC;YAClC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE;SAChD,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,SAAS,CAAC,uBAAuB,EAAE,CAAC;QACzC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;YAC9C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACrB,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW;gBAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7D,CAAC,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,2FAA2F;IAC3F,IAAY,KAAK;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5F,CAAC;IACO,MAAM,CAAC,EAAsB;QACpC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IACO,IAAI;QACX,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QACzC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;QACzC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,EAAE,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC7G,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAC9E,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACtC,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,0BAA0B,CAAC,CAAC;YACtG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC;QAC/B,CAAC;aAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QACjC,CAAC;IACF,CAAC;IACO,SAAS,CAAC,OAAO,GAAG,KAAK;QAChC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,aAAa,KAAK,OAAO,CAAC;QAC/B,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,KAAK,OAAO,CAAC,OAAO,EAAE;aACpB,IAAI,CAAC,KAAK,IAAI,EAAE;YAChB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC;YACnC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjF,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACjC,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACX,6CAA6C;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IACD,UAAU;QACT,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;IACO,OAAO,CAAC,IAAe;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IACD,4GAA4G;IACpG,MAAM,CAAC,IAAsB,EAAE,IAAY;QAClD,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAC/B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACtD,CAAC,EAAE,WAAW,CAAC,CAAC;QAChB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC;IAC9B,CAAC;IACO,aAAa;QACpB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC3B,CAAC;IACD;;;OAGG;IACK,MAAM;QACb,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACxB,KAAK,QAAQ;gBACZ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACxB,MAAM;YACP,KAAK,MAAM,CAAC;YACZ,KAAK,aAAa;gBACjB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACrB,MAAM;YACP,KAAK,QAAQ;gBACZ,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW;oBAC3F,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;;oBAChB,IAAI,CAAC,KAAK,EAAE,CAAC;gBAClB,MAAM;QACR,CAAC;IACF,CAAC;IACO,KAAK;QACZ,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IACO,eAAe;QACtB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IACO,WAAW;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;;YACtC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IACO,WAAW;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa;YAAE,OAAO;QACxC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;QACrC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,EAAE,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,OAAO;QACpE,0FAA0F;QAC1F,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,gCAAgC,CAAC,CAAC;IACpG,CAAC;IACO,cAAc;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,MAAM,GACX,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrG,IAAI,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC/B,OAAO;QACR,CAAC;QACD,IAAI,CAAC;YACJ,uEAAuE;YACvE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,sCAAsC,CAAC,CAAC;QACxG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/F,CAAC;IACF,CAAC;IACO,WAAW;QAClB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC,CAAC;QAC9F,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7G,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;IACrB,CAAC;IACO,YAAY,CAAC,MAAe;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO;QACnC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC;QACtE,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;YAAE,OAAO;QAC3B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,CAAC,eAAe,EAAE,CAAC;IACxB,CAAC;IACO,IAAI;QACX,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;IAChF,CAAC;IACO,MAAM,CAAC,GAAkB;QAChC,QAAQ,GAAG,EAAE,CAAC;YACb,KAAK,kBAAkB;gBACtB,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,MAAM;YACP,KAAK,uBAAuB,CAAC;YAC7B,KAAK,mBAAmB;gBACvB,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW;oBAC7B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,KAAK,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;gBAChF,MAAM;YACP,KAAK,qBAAqB,CAAC;YAC3B,KAAK,yBAAyB;gBAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC1D,MAAM;YACP,KAAK,kBAAkB;gBACtB,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;oBACzE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC1C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACtB,CAAC;gBACD,MAAM;YACP,KAAK,eAAe,CAAC;YACrB,KAAK,kBAAkB;gBACtB,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;oBAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACnG,IAAI,CAAC,eAAe,EAAE,CAAC;gBACxB,CAAC;;oBAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,kBAAkB,CAAC,CAAC;gBAC1F,MAAM;YACP,KAAK,gBAAgB;gBACpB,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,MAAM;YACP,KAAK,uBAAuB;gBAC3B,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,MAAM;YACP,KAAK,0BAA0B;gBAC9B,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,MAAM;YACP,KAAK,gBAAgB;gBACpB,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,YAAY,EAAE,EAAE,CAAC,CAAC;gBAC7D,MAAM;QACR,CAAC;IACF,CAAC;IACD,2DAA2D;IACnD,OAAO,CAAC,MAAkB;QACjC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,QAAQ;gBACZ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC3B,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;gBACpB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;oBAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC1D,MAAM;YACP,KAAK,KAAK;gBACT,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;gBACzB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;gBACtC,MAAM;YACP,KAAK,KAAK;gBACT,IAAI,MAAM,CAAC,GAAG,KAAK,kBAAkB;oBAAE,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;gBAChE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACxB,MAAM;YACP,KAAK,MAAM;gBACV,IAAI,CAAC,IAAI,EAAE,CAAC;gBACZ,MAAM;YACP,KAAK,MAAM;gBACV,IAAI,CAAC,MAAM,EAAE,CAAC;gBACd,MAAM;QACR,CAAC;IACF,CAAC;IACO,IAAI,CAAC,SAAiB,EAAE,IAAI,GAAG,KAAK;QAC3C,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACzC,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACpF,MAAM,IAAI,GAAG,IAAI;gBAChB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC9F,CAAC,CAAC,CAAC,KAAK,GAAG,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YACnD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;QACxB,CAAC;;YAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAChF,CAAC;IACD,WAAW,CAAC,IAAY;QACvB,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC;YACJ,IAAI,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;gBAC3B,4EAA4E;gBAC5E,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC;oBAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YAChF,CAAC;iBAAM,CAAC;gBACP,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACxB,KAAK,MAAM;wBACV,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;wBACzC,MAAM;oBACP,KAAK,QAAQ;wBACZ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;wBACxC,MAAM;oBACP,KAAK,aAAa;wBACjB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;wBACxB,MAAM;oBACP,KAAK,QAAQ;wBACZ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;wBACvB,MAAM;gBACR,CAAC;YACF,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAClC,CAAC;IACO,SAAS,CAAC,QAAsB,EAAE,IAAY;QACrD,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACpC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;aACjG,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC;YACjF,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;aAChD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC;YAClF,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC;aACrD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,qBAAqB,CAAC;YACtF,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAC5D,CAAC;IACO,WAAW,CAAC,KAAY,EAAE,IAAY;QAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACpC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;aACpD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC;YAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aACrE,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC;YAClF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC;aACjD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,qBAAqB,CAAC;YACtF,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC;aAClD,CAAC;YACL,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,eAAe,EAAE,CAAC;QACxB,CAAC;IACF,CAAC;IACO,YAAY,CAAC,IAAY;QAChC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACpC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,uBAAuB,CAAC;YAAE,IAAI,CAAC,WAAW,EAAE,CAAC;aAC7D,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAC/D,CAAC;IACO,WAAW,CAAC,IAAY;QAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACpC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,OAAO;QACR,CAAC;QACD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;QACnG,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;QACzG,IAAI,MAAM,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;aAClE,IAAI,QAAQ,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;aAC5E,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;aACxD,CAAC;YACL,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YACzD,IAAI,GAAG;gBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACF,CAAC;IACD,WAAW,CAAC,KAAoB;QAC/B,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK;YAAE,OAAO;QACpE,qFAAqF;QACrF,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAO,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAC9F,CAAC;QACF,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAChD,IAAI,MAAM,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;gBACrF,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM;wBAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACtE,CAAC;qBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;oBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;;oBACtD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3E,CAAC;QACF,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;YAC5G,IAAI,CAAC;gBACJ,IAAI,GAAG;oBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;qBAC7B,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;oBAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;YACrE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7F,CAAC;QACF,CAAC;;YAAM,OAAO;QACd,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;IACzD,CAAC;IACD,MAAM,CAAC,KAAa;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,MAAM,GAAG,iBAAiB,CAAC;YAC/B,KAAK;YACL,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI;YACtC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YACzB,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW;YACrC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;SACrC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC1B,CAAC;IACD,oGAAoG;IAC5F,SAAS,CAAC,EAAU;QAC3B,IAAI,CAAC;YACJ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IACD,OAAO;QACN,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3C,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACnC,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;CACD","sourcesContent":["/** Panel lifecycle and input routing; selection, output ownership and layout have separate owners. */\nimport \"../keybindings.ts\";\nimport {\n\ttype Component,\n\ttype Focusable,\n\tInput,\n\ttype TuiMouseEvent,\n\ttype TuiMouseEventResult,\n} from \"@earendil-works/pi-tui\";\nimport type { AppKeybinding, KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport { isTaskTerminal, type TaskSnapshot, type TasksContext } from \"../../../core/tasks/types.ts\";\nimport { STATUS_SPINNER_INTERVAL_MS } from \"../../../modes/interactive/components/status-marker.ts\";\nimport type { Theme } from \"../../../modes/interactive/theme/theme.ts\";\nimport type { Feedback } from \"./footer.ts\";\nimport { TaskInspector } from \"./inspector.ts\";\nimport { renderTasksLayout, type TasksLayout } from \"./layout.ts\";\nimport { TaskList } from \"./list.ts\";\nimport { type PanelFocus, type PanelMode, type TaskAction, TaskSelection, type TasksPanelState } from \"./model.ts\";\nimport { cleanTaskText } from \"./text.ts\";\nimport { TaskViewport } from \"./viewport.ts\";\n\nexport type TasksManagerHost = Pick<\n\tTasksContext,\n\t\"list\" | \"read\" | \"kill\" | \"subscribe\" | \"retain\" | \"canDetach\" | \"detach\" | \"presentOutput\"\n>;\nexport interface TasksMenuOptions {\n\ttui: { requestRender(): void; terminal: { rows: number; columns: number } };\n\ttheme: Theme;\n\tkeybindings: Pick<KeybindingsManager, \"matches\" | \"getKeys\">;\n\thost: TasksManagerHost;\n\tstate?: TasksPanelState;\n\tonClose(): void;\n\tpollIntervalMs?: number;\n}\n\nconst BROWSE: PanelMode = { kind: \"browse\" };\n/** Feedback outlives a glance but not the next thing the user does. */\nconst FEEDBACK_MS = 4000;\nconst QUERY_LIMIT = 512;\nconst actions: AppKeybinding[] = [\n\t\"app.tasks.search\",\n\t\"app.tasks.kill\",\n\t\"app.tasks.detachSelected\",\n\t\"app.tasks.previousTab\",\n\t\"app.tasks.nextTab\",\n\t\"app.tasks.follow\",\n\t\"app.tasks.top\",\n\t\"app.tasks.bottom\",\n\t\"app.tasks.nextFocus\",\n\t\"app.tasks.previousFocus\",\n\t\"app.tasks.help\",\n];\n\n/** Why a stop or background request cannot apply to this task, for the states the footer does not offer. */\nfunction unavailableReason(task: TaskSnapshot): string | undefined {\n\tif (isTaskTerminal(task.status)) return \"Task already finished.\";\n\tif (task.status === \"stopping\") return \"Task is already stopping.\";\n\treturn undefined;\n}\n\nexport class TasksMenu implements Component, Focusable {\n\tfocused = false;\n\tprivate readonly options: TasksMenuOptions;\n\tprivate readonly selection: TaskSelection;\n\tprivate readonly inspector: TaskInspector;\n\tprivate readonly list = new TaskList();\n\tprivate readonly unsubscribe: () => void;\n\tprivate readonly pollTimer: ReturnType<typeof setInterval>;\n\tprivate animationTimer?: ReturnType<typeof setInterval>;\n\tprivate feedbackTimer?: ReturnType<typeof setTimeout>;\n\tprivate mode: PanelMode = BROWSE;\n\tprivate feedback?: Feedback;\n\tprivate focus: PanelFocus = \"list\";\n\tprivate dirty = true;\n\tprivate tickQueued = false;\n\tprivate refreshQueued = false;\n\tprivate disposed = false;\n\tprivate width: number;\n\tprivate layout?: TasksLayout;\n\tconstructor(options: TasksMenuOptions) {\n\t\tthis.options = options;\n\t\tthis.width = options.tui.terminal.columns;\n\t\tthis.selection = new TaskSelection(options.state ?? { tab: \"output\" });\n\t\tthis.inspector = new TaskInspector({\n\t\t\thost: options.host,\n\t\t\ttheme: options.theme,\n\t\t\trequestRender: () => options.tui.requestRender(),\n\t\t});\n\t\tthis.sync();\n\t\tthis.selection.selectStartedSinceClose();\n\t\tthis.inspector.select(this.selection.selected);\n\t\tthis.list.showSelection();\n\t\tthis.unsubscribe = options.host.subscribe(() => {\n\t\t\tthis.dirty = true;\n\t\t\tthis.queueTick();\n\t\t\toptions.tui.requestRender();\n\t\t});\n\t\tthis.pollTimer = setInterval(() => {\n\t\t\tthis.queueTick(true);\n\t\t\tif (this.selection.activeCount) options.tui.requestRender();\n\t\t}, options.pollIntervalMs ?? 1000);\n\t\tthis.pollTimer.unref?.();\n\t\tthis.queueTick(true);\n\t}\n\t/** The search text, owned by the search mode: browsing always sees every retained task. */\n\tprivate get query(): string {\n\t\treturn this.mode.kind === \"search\" ? this.mode.input.getValue().slice(0, QUERY_LIMIT) : \"\";\n\t}\n\tprivate select(id: string | undefined): void {\n\t\tthis.selection.select(id, this.query);\n\t}\n\tprivate sync(): void {\n\t\tif (this.disposed || !this.dirty) return;\n\t\tthis.dirty = false;\n\t\tthis.selection.sync(this.options.host.list(), this.query);\n\t\tthis.inspector.select(this.selection.selected);\n\t\tthis.inspector.prune(new Set(this.selection.all.map((task) => task.id)));\n\t\tconst selected = this.selection.selected;\n\t\tif (this.mode.kind === \"confirmStop\" && (this.mode.taskId !== selected?.id || isTaskTerminal(selected.status)))\n\t\t\tthis.setMode(BROWSE);\n\t\tconst animates = this.selection.all.some((task) => task.status === \"running\");\n\t\tif (animates && !this.animationTimer) {\n\t\t\tthis.animationTimer = setInterval(() => this.options.tui.requestRender(), STATUS_SPINNER_INTERVAL_MS);\n\t\t\tthis.animationTimer.unref?.();\n\t\t} else if (!animates) {\n\t\t\tclearInterval(this.animationTimer);\n\t\t\tthis.animationTimer = undefined;\n\t\t}\n\t}\n\tprivate queueTick(refresh = false): void {\n\t\tif (this.disposed) return;\n\t\tthis.refreshQueued ||= refresh;\n\t\tif (this.tickQueued) return;\n\t\tthis.tickQueued = true;\n\t\tvoid Promise.resolve()\n\t\t\t.then(async () => {\n\t\t\t\tthis.tickQueued = false;\n\t\t\t\tif (this.disposed) return;\n\t\t\t\tconst refresh = this.refreshQueued;\n\t\t\t\tthis.refreshQueued = false;\n\t\t\t\tthis.sync();\n\t\t\t\tif (refresh || (this.inspector.task && isTaskTerminal(this.inspector.task.status)))\n\t\t\t\t\tawait this.inspector.refresh();\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\t/* Task observers cannot reject execution. */\n\t\t\t});\n\t}\n\tinvalidate(): void {\n\t\tthis.inspector.invalidate();\n\t}\n\tprivate setMode(next: PanelMode): void {\n\t\tthis.mode = next;\n\t}\n\t/** Reports an action that did not do what was asked; it clears on the next input or after a few seconds. */\n\tprivate notify(tone: Feedback[\"tone\"], text: string): void {\n\t\tthis.clearFeedback();\n\t\tthis.feedback = { tone, text };\n\t\tthis.feedbackTimer = setTimeout(() => {\n\t\t\tthis.feedbackTimer = undefined;\n\t\t\tthis.feedback = undefined;\n\t\t\tif (!this.disposed) this.options.tui.requestRender();\n\t\t}, FEEDBACK_MS);\n\t\tthis.feedbackTimer.unref?.();\n\t}\n\tprivate clearFeedback(): void {\n\t\tclearTimeout(this.feedbackTimer);\n\t\tthis.feedbackTimer = undefined;\n\t\tthis.feedback = undefined;\n\t}\n\t/**\n\t * Unwinds exactly one layer: search, help or a confirmation; then the inspector back to the\n\t * list when the list is hidden; from plain browsing it closes the panel.\n\t */\n\tprivate escape(): void {\n\t\tswitch (this.mode.kind) {\n\t\t\tcase \"search\":\n\t\t\t\tthis.finishSearch(true);\n\t\t\t\tbreak;\n\t\t\tcase \"help\":\n\t\t\tcase \"confirmStop\":\n\t\t\t\tthis.setMode(BROWSE);\n\t\t\t\tbreak;\n\t\t\tcase \"browse\":\n\t\t\t\tif (this.layout && !this.layout.tooSmall && !this.layout.split && this.focus === \"inspector\")\n\t\t\t\t\tthis.focus = \"list\";\n\t\t\t\telse this.close();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tprivate close(): void {\n\t\tthis.dispose();\n\t\tthis.options.onClose();\n\t}\n\tprivate selectedChanged(): void {\n\t\tif (this.mode.kind === \"confirmStop\") this.setMode(BROWSE);\n\t\tthis.list.showSelection();\n\t\tthis.inspector.select(this.selection.selected);\n\t\tthis.queueTick(true);\n\t}\n\tprivate requestStop(): void {\n\t\tconst task = this.selection.selected;\n\t\tif (!task) return;\n\t\tconst reason = unavailableReason(task);\n\t\tif (reason) this.notify(\"warning\", reason);\n\t\telse this.setMode({ kind: \"confirmStop\", taskId: task.id });\n\t}\n\tprivate confirmStop(): void {\n\t\tconst mode = this.mode;\n\t\tif (mode.kind !== \"confirmStop\") return;\n\t\tthis.setMode(BROWSE);\n\t\tconst task = this.selection.selected;\n\t\tif (mode.taskId !== task?.id || isTaskTerminal(task.status)) return;\n\t\t// A granted request shows as Stopping on the row and header; only a refusal needs saying.\n\t\tif (!this.options.host.kill(mode.taskId)) this.notify(\"warning\", \"No new cancellation requested.\");\n\t}\n\tprivate detachSelected(): void {\n\t\tconst task = this.selection.selected;\n\t\tif (!task) return;\n\t\tconst reason =\n\t\t\tunavailableReason(task) ?? (task.mode === \"background\" ? \"Task is already in the background.\" : \"\");\n\t\tif (reason) {\n\t\t\tthis.notify(\"warning\", reason);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\t// The core decides; a full background lane throws its own explanation.\n\t\t\tif (!this.options.host.detach(task.id)) this.notify(\"warning\", \"This task cannot move to background.\");\n\t\t} catch (error) {\n\t\t\tthis.notify(\"warning\", cleanTaskText(error instanceof Error ? error.message : String(error)));\n\t\t}\n\t}\n\tprivate startSearch(): void {\n\t\tconst input = new Input({ prompt: \"Find task: \", placeholder: \"title, command, kind or ID\" });\n\t\tinput.focused = true;\n\t\tthis.setMode({ kind: \"search\", restore: { id: this.selection.state.selectedId, focus: this.focus }, input });\n\t\tthis.focus = \"list\";\n\t}\n\tprivate finishSearch(cancel: boolean): void {\n\t\tconst mode = this.mode;\n\t\tif (mode.kind !== \"search\") return;\n\t\tconst id = cancel ? mode.restore.id : this.selection.state.selectedId;\n\t\tif (!cancel && !id) return;\n\t\tthis.focus = cancel ? mode.restore.focus : \"list\";\n\t\tthis.setMode(BROWSE);\n\t\tthis.select(id);\n\t\tthis.selectedChanged();\n\t}\n\tprivate open(): void {\n\t\tif (this.focus === \"list\" && this.selection.selected) this.focus = \"inspector\";\n\t}\n\tprivate action(key: AppKeybinding): void {\n\t\tswitch (key) {\n\t\t\tcase \"app.tasks.search\":\n\t\t\t\tthis.startSearch();\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.previousTab\":\n\t\t\tcase \"app.tasks.nextTab\":\n\t\t\t\tif (this.focus === \"inspector\")\n\t\t\t\t\tthis.selection.state.tab = key === \"app.tasks.previousTab\" ? \"output\" : \"info\";\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.nextFocus\":\n\t\t\tcase \"app.tasks.previousFocus\":\n\t\t\t\tthis.focus = this.focus === \"list\" ? \"inspector\" : \"list\";\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.follow\":\n\t\t\t\tif (this.focus === \"inspector\" && this.selection.state.tab === \"output\") {\n\t\t\t\t\tthis.inspector.position.output.jump(true);\n\t\t\t\t\tthis.queueTick(true);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.top\":\n\t\t\tcase \"app.tasks.bottom\":\n\t\t\t\tif (this.focus === \"list\") {\n\t\t\t\t\tthis.select(key === \"app.tasks.top\" ? this.selection.rows[0]?.id : this.selection.rows.at(-1)?.id);\n\t\t\t\t\tthis.selectedChanged();\n\t\t\t\t} else this.inspector.position[this.selection.state.tab].jump(key === \"app.tasks.bottom\");\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.kill\":\n\t\t\t\tthis.requestStop();\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.confirmStop\":\n\t\t\t\tthis.confirmStop();\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.detachSelected\":\n\t\t\t\tthis.detachSelected();\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.help\":\n\t\t\t\tthis.setMode({ kind: \"help\", viewport: new TaskViewport() });\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t/** Performs what a click on a rendered target asks for. */\n\tprivate perform(action: TaskAction): void {\n\t\tswitch (action.kind) {\n\t\t\tcase \"select\":\n\t\t\t\tthis.select(action.taskId);\n\t\t\t\tthis.selectedChanged();\n\t\t\t\tthis.focus = \"list\";\n\t\t\t\tif (this.mode.kind === \"search\") this.finishSearch(false);\n\t\t\t\tbreak;\n\t\t\tcase \"tab\":\n\t\t\t\tthis.focus = \"inspector\";\n\t\t\t\tthis.selection.state.tab = action.tab;\n\t\t\t\tbreak;\n\t\t\tcase \"key\":\n\t\t\t\tif (action.key === \"app.tasks.follow\") this.focus = \"inspector\";\n\t\t\t\tthis.action(action.key);\n\t\t\t\tbreak;\n\t\t\tcase \"open\":\n\t\t\t\tthis.open();\n\t\t\t\tbreak;\n\t\t\tcase \"back\":\n\t\t\t\tthis.escape();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tprivate move(direction: number, page = false): void {\n\t\tif (this.mode.kind === \"help\") {\n\t\t\tthis.mode.viewport.move(direction, page);\n\t\t\treturn;\n\t\t}\n\t\tif (this.focus === \"list\") {\n\t\t\tconst rows = this.selection.rows;\n\t\t\tif (!rows.length) return;\n\t\t\tconst index = rows.findIndex((task) => task.id === this.selection.state.selectedId);\n\t\t\tconst next = page\n\t\t\t\t? Math.max(0, Math.min(rows.length - 1, index + direction * (this.layout?.listPageSize ?? 1)))\n\t\t\t\t: (index + direction + rows.length) % rows.length;\n\t\t\tthis.select(rows[next]?.id);\n\t\t\tthis.selectedChanged();\n\t\t} else this.inspector.position[this.selection.state.tab].move(direction, page);\n\t}\n\thandleInput(data: string): void {\n\t\tif (this.disposed) return;\n\t\tthis.sync();\n\t\tthis.render(this.width);\n\t\tthis.clearFeedback();\n\t\ttry {\n\t\t\tif (this.layout?.tooSmall) {\n\t\t\t\t// The resize notice owns the screen; keys must not act on the hidden panel.\n\t\t\t\tif (this.options.keybindings.matches(data, \"tui.select.cancel\")) this.escape();\n\t\t\t} else {\n\t\t\t\tswitch (this.mode.kind) {\n\t\t\t\t\tcase \"help\":\n\t\t\t\t\t\tthis.helpInput(this.mode.viewport, data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"search\":\n\t\t\t\t\t\tthis.searchInput(this.mode.input, data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"confirmStop\":\n\t\t\t\t\t\tthis.confirmInput(data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"browse\":\n\t\t\t\t\t\tthis.browseInput(data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.notify(\"error\", cleanTaskText(error instanceof Error ? error.message : String(error)));\n\t\t}\n\t\tif (this.disposed) return;\n\t\tthis.queueTick(true);\n\t\tthis.options.tui.requestRender();\n\t}\n\tprivate helpInput(viewport: TaskViewport, data: string): void {\n\t\tconst kb = this.options.keybindings;\n\t\tif (kb.matches(data, \"tui.select.cancel\") || kb.matches(data, \"app.tasks.help\")) this.setMode(BROWSE);\n\t\telse if (kb.matches(data, \"app.tasks.top\") || kb.matches(data, \"app.tasks.bottom\"))\n\t\t\tviewport.jump(kb.matches(data, \"app.tasks.bottom\"));\n\t\telse if (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.editor.pageUp\"))\n\t\t\tviewport.move(-1, kb.matches(data, \"tui.editor.pageUp\"));\n\t\telse if (kb.matches(data, \"tui.select.down\") || kb.matches(data, \"tui.editor.pageDown\"))\n\t\t\tviewport.move(1, kb.matches(data, \"tui.editor.pageDown\"));\n\t}\n\tprivate searchInput(input: Input, data: string): void {\n\t\tconst kb = this.options.keybindings;\n\t\tif (kb.matches(data, \"tui.select.cancel\")) this.escape();\n\t\telse if (kb.matches(data, \"tui.select.confirm\")) this.finishSearch(false);\n\t\telse if (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.pageUp\"))\n\t\t\tthis.move(-1, kb.matches(data, \"tui.select.pageUp\"));\n\t\telse if (kb.matches(data, \"tui.select.down\") || kb.matches(data, \"tui.select.pageDown\"))\n\t\t\tthis.move(1, kb.matches(data, \"tui.select.pageDown\"));\n\t\telse {\n\t\t\tinput.handleInput(data);\n\t\t\tthis.selection.refresh(this.query);\n\t\t\tthis.selectedChanged();\n\t\t}\n\t}\n\tprivate confirmInput(data: string): void {\n\t\tconst kb = this.options.keybindings;\n\t\tif (kb.matches(data, \"app.tasks.confirmStop\")) this.confirmStop();\n\t\telse if (kb.matches(data, \"tui.select.cancel\")) this.escape();\n\t}\n\tprivate browseInput(data: string): void {\n\t\tconst kb = this.options.keybindings;\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.escape();\n\t\t\treturn;\n\t\t}\n\t\tconst pageUp = kb.matches(data, this.focus === \"list\" ? \"tui.select.pageUp\" : \"tui.editor.pageUp\");\n\t\tconst pageDown = kb.matches(data, this.focus === \"list\" ? \"tui.select.pageDown\" : \"tui.editor.pageDown\");\n\t\tif (pageUp || kb.matches(data, \"tui.select.up\")) this.move(-1, pageUp);\n\t\telse if (pageDown || kb.matches(data, \"tui.select.down\")) this.move(1, pageDown);\n\t\telse if (kb.matches(data, \"tui.select.confirm\")) this.open();\n\t\telse {\n\t\t\tconst key = actions.find((key) => kb.matches(data, key));\n\t\t\tif (key) this.action(key);\n\t\t}\n\t}\n\thandleMouse(event: TuiMouseEvent): TuiMouseEventResult | undefined {\n\t\tif (this.disposed || event.ctrl || event.alt || event.shift) return;\n\t\t// Feedback is transient: a click retracts it and acts, exactly like a keypress does.\n\t\tthis.clearFeedback();\n\t\tthis.render(event.width);\n\t\tconst layout = this.layout!;\n\t\tconst region = layout.regions.find(\n\t\t\t(r) => event.y >= r.y && event.y < r.y + r.height && event.x >= r.x && event.x < r.x + r.width,\n\t\t);\n\t\tif (event.type === \"wheel\" && event.wheelDelta) {\n\t\t\tif (region) {\n\t\t\t\tconst delta = Math.sign(event.wheelDelta) * Math.min(20, Math.abs(event.wheelDelta));\n\t\t\t\tif (region.pane === \"help\") {\n\t\t\t\t\tif (this.mode.kind === \"help\") this.mode.viewport.move(delta, false);\n\t\t\t\t} else if (region.pane === \"list\") this.list.scroll(delta);\n\t\t\t\telse this.inspector.position[this.selection.state.tab].move(delta, false);\n\t\t\t}\n\t\t} else if (event.type === \"click\" && event.button === \"left\") {\n\t\t\tconst hit = layout.hits.find((hit) => hit.y === event.y && event.x >= hit.x && event.x < hit.x + hit.width);\n\t\t\ttry {\n\t\t\t\tif (hit) this.perform(hit.action);\n\t\t\t\telse if (region && region.pane !== \"help\") this.focus = region.pane;\n\t\t\t} catch (error) {\n\t\t\t\tthis.notify(\"error\", cleanTaskText(error instanceof Error ? error.message : String(error)));\n\t\t\t}\n\t\t} else return;\n\t\tthis.queueTick(true);\n\t\tthis.options.tui.requestRender();\n\t\treturn { handled: true, focus: event.type === \"click\" };\n\t}\n\trender(width: number): string[] {\n\t\tthis.width = width;\n\t\tthis.sync();\n\t\tthis.layout = renderTasksLayout({\n\t\t\twidth,\n\t\t\theight: this.options.tui.terminal.rows,\n\t\t\ttheme: this.options.theme,\n\t\t\tkeybindings: this.options.keybindings,\n\t\t\tselection: this.selection,\n\t\t\tinspector: this.inspector,\n\t\t\tlist: this.list,\n\t\t\tfocus: this.focus,\n\t\t\tmode: this.mode,\n\t\t\tfeedback: this.feedback,\n\t\t\tcanDetach: (id) => this.canDetach(id),\n\t\t});\n\t\treturn this.layout.lines;\n\t}\n\t/** The panel's selection can lag the runtime by a notification; a task that is gone cannot move. */\n\tprivate canDetach(id: string): boolean {\n\t\ttry {\n\t\t\treturn this.options.host.canDetach(id);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tthis.selection.state.closedAt = Date.now();\n\t\tclearInterval(this.pollTimer);\n\t\tclearInterval(this.animationTimer);\n\t\tthis.clearFeedback();\n\t\tthis.unsubscribe();\n\t\tthis.inspector.dispose();\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../../src/extensions/tasks/ui/manager.ts"],"names":[],"mappings":"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","sourcesContent":["/** Panel lifecycle and input routing; selection, output ownership and layout have separate owners. */\nimport \"../keybindings.ts\";\nimport {\n\ttype Component,\n\ttype Focusable,\n\tInput,\n\ttype TuiMouseEvent,\n\ttype TuiMouseEventResult,\n} from \"@earendil-works/pi-tui\";\nimport type { AppKeybinding, KeybindingsManager } from \"../../../core/keybindings.ts\";\nimport { isTaskTerminal, type TaskSnapshot, type TasksContext } from \"../../../core/tasks/types.ts\";\nimport { STATUS_SPINNER_INTERVAL_MS } from \"../../../modes/interactive/components/status-marker.ts\";\nimport type { Theme } from \"../../../modes/interactive/theme/theme.ts\";\nimport type { Feedback } from \"./footer.ts\";\nimport { TaskInspector } from \"./inspector.ts\";\nimport { renderTasksLayout, type TasksLayout } from \"./layout.ts\";\nimport { TaskList } from \"./list.ts\";\nimport { type PanelFocus, type PanelMode, type TaskAction, TaskSelection, type TasksPanelState } from \"./model.ts\";\nimport { cleanTaskText } from \"./text.ts\";\nimport { TaskViewport } from \"./viewport.ts\";\n\nexport type TasksManagerHost = Pick<\n\tTasksContext,\n\t\"list\" | \"read\" | \"kill\" | \"subscribe\" | \"retain\" | \"canDetach\" | \"detach\"\n>;\nexport interface TasksMenuOptions {\n\ttui: { requestRender(): void; terminal: { rows: number; columns: number } };\n\ttheme: Theme;\n\tkeybindings: Pick<KeybindingsManager, \"matches\" | \"getKeys\">;\n\thost: TasksManagerHost;\n\tstate?: TasksPanelState;\n\tonClose(): void;\n\tpollIntervalMs?: number;\n}\n\nconst BROWSE: PanelMode = { kind: \"browse\" };\n/** Feedback outlives a glance but not the next thing the user does. */\nconst FEEDBACK_MS = 4000;\nconst QUERY_LIMIT = 512;\nconst actions: AppKeybinding[] = [\n\t\"app.tasks.search\",\n\t\"app.tasks.kill\",\n\t\"app.tasks.detachSelected\",\n\t\"app.tasks.previousTab\",\n\t\"app.tasks.nextTab\",\n\t\"app.tasks.follow\",\n\t\"app.tasks.top\",\n\t\"app.tasks.bottom\",\n\t\"app.tasks.nextFocus\",\n\t\"app.tasks.previousFocus\",\n\t\"app.tasks.help\",\n];\n\n/** Why a stop or background request cannot apply to this task, for the states the footer does not offer. */\nfunction unavailableReason(task: TaskSnapshot): string | undefined {\n\tif (isTaskTerminal(task.status)) return \"Task already finished.\";\n\tif (task.status === \"stopping\") return \"Task is already stopping.\";\n\treturn undefined;\n}\n\nexport class TasksMenu implements Component, Focusable {\n\tfocused = false;\n\tprivate readonly options: TasksMenuOptions;\n\tprivate readonly selection: TaskSelection;\n\tprivate readonly inspector: TaskInspector;\n\tprivate readonly list = new TaskList();\n\tprivate readonly unsubscribe: () => void;\n\tprivate readonly pollTimer: ReturnType<typeof setInterval>;\n\tprivate animationTimer?: ReturnType<typeof setInterval>;\n\tprivate feedbackTimer?: ReturnType<typeof setTimeout>;\n\tprivate mode: PanelMode = BROWSE;\n\tprivate feedback?: Feedback;\n\tprivate focus: PanelFocus = \"list\";\n\tprivate dirty = true;\n\tprivate tickQueued = false;\n\tprivate refreshQueued = false;\n\tprivate disposed = false;\n\tprivate width: number;\n\tprivate layout?: TasksLayout;\n\tconstructor(options: TasksMenuOptions) {\n\t\tthis.options = options;\n\t\tthis.width = options.tui.terminal.columns;\n\t\tthis.selection = new TaskSelection(options.state ?? { tab: \"output\" });\n\t\tthis.inspector = new TaskInspector({\n\t\t\thost: options.host,\n\t\t\ttheme: options.theme,\n\t\t\trequestRender: () => options.tui.requestRender(),\n\t\t});\n\t\tthis.sync();\n\t\tthis.selection.selectStartedSinceClose();\n\t\tthis.inspector.select(this.selection.selected);\n\t\tthis.list.showSelection();\n\t\tthis.unsubscribe = options.host.subscribe(() => {\n\t\t\tthis.dirty = true;\n\t\t\tthis.queueTick();\n\t\t\toptions.tui.requestRender();\n\t\t});\n\t\tthis.pollTimer = setInterval(() => {\n\t\t\tthis.queueTick(true);\n\t\t\tif (this.selection.activeCount) options.tui.requestRender();\n\t\t}, options.pollIntervalMs ?? 1000);\n\t\tthis.pollTimer.unref?.();\n\t\tthis.queueTick(true);\n\t}\n\t/** The search text, owned by the search mode: browsing always sees every retained task. */\n\tprivate get query(): string {\n\t\treturn this.mode.kind === \"search\" ? this.mode.input.getValue().slice(0, QUERY_LIMIT) : \"\";\n\t}\n\tprivate select(id: string | undefined): void {\n\t\tthis.selection.select(id, this.query);\n\t}\n\tprivate sync(): void {\n\t\tif (this.disposed || !this.dirty) return;\n\t\tthis.dirty = false;\n\t\tthis.selection.sync(this.options.host.list(), this.query);\n\t\tthis.inspector.select(this.selection.selected);\n\t\tthis.inspector.prune(new Set(this.selection.all.map((task) => task.id)));\n\t\tconst selected = this.selection.selected;\n\t\tif (this.mode.kind === \"confirmStop\" && (this.mode.taskId !== selected?.id || isTaskTerminal(selected.status)))\n\t\t\tthis.setMode(BROWSE);\n\t\tconst animates = this.selection.all.some((task) => task.status === \"running\");\n\t\tif (animates && !this.animationTimer) {\n\t\t\tthis.animationTimer = setInterval(() => this.options.tui.requestRender(), STATUS_SPINNER_INTERVAL_MS);\n\t\t\tthis.animationTimer.unref?.();\n\t\t} else if (!animates) {\n\t\t\tclearInterval(this.animationTimer);\n\t\t\tthis.animationTimer = undefined;\n\t\t}\n\t}\n\tprivate queueTick(refresh = false): void {\n\t\tif (this.disposed) return;\n\t\tthis.refreshQueued ||= refresh;\n\t\tif (this.tickQueued) return;\n\t\tthis.tickQueued = true;\n\t\tvoid Promise.resolve()\n\t\t\t.then(async () => {\n\t\t\t\tthis.tickQueued = false;\n\t\t\t\tif (this.disposed) return;\n\t\t\t\tconst refresh = this.refreshQueued;\n\t\t\t\tthis.refreshQueued = false;\n\t\t\t\tthis.sync();\n\t\t\t\tif (refresh || (this.inspector.task && isTaskTerminal(this.inspector.task.status)))\n\t\t\t\t\tawait this.inspector.refresh();\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\t/* Task observers cannot reject execution. */\n\t\t\t});\n\t}\n\tinvalidate(): void {\n\t\tthis.inspector.invalidate();\n\t}\n\tprivate setMode(next: PanelMode): void {\n\t\tthis.mode = next;\n\t}\n\t/** Reports an action that did not do what was asked; it clears on the next input or after a few seconds. */\n\tprivate notify(tone: Feedback[\"tone\"], text: string): void {\n\t\tthis.clearFeedback();\n\t\tthis.feedback = { tone, text };\n\t\tthis.feedbackTimer = setTimeout(() => {\n\t\t\tthis.feedbackTimer = undefined;\n\t\t\tthis.feedback = undefined;\n\t\t\tif (!this.disposed) this.options.tui.requestRender();\n\t\t}, FEEDBACK_MS);\n\t\tthis.feedbackTimer.unref?.();\n\t}\n\tprivate clearFeedback(): void {\n\t\tclearTimeout(this.feedbackTimer);\n\t\tthis.feedbackTimer = undefined;\n\t\tthis.feedback = undefined;\n\t}\n\t/**\n\t * Unwinds exactly one layer: search, help or a confirmation; then the inspector back to the\n\t * list when the list is hidden; from plain browsing it closes the panel.\n\t */\n\tprivate escape(): void {\n\t\tswitch (this.mode.kind) {\n\t\t\tcase \"search\":\n\t\t\t\tthis.finishSearch(true);\n\t\t\t\tbreak;\n\t\t\tcase \"help\":\n\t\t\tcase \"confirmStop\":\n\t\t\t\tthis.setMode(BROWSE);\n\t\t\t\tbreak;\n\t\t\tcase \"browse\":\n\t\t\t\tif (this.layout && !this.layout.tooSmall && !this.layout.split && this.focus === \"inspector\")\n\t\t\t\t\tthis.focus = \"list\";\n\t\t\t\telse this.close();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tprivate close(): void {\n\t\tthis.dispose();\n\t\tthis.options.onClose();\n\t}\n\tprivate selectedChanged(): void {\n\t\tif (this.mode.kind === \"confirmStop\") this.setMode(BROWSE);\n\t\tthis.list.showSelection();\n\t\tthis.inspector.select(this.selection.selected);\n\t\tthis.queueTick(true);\n\t}\n\tprivate requestStop(): void {\n\t\tconst task = this.selection.selected;\n\t\tif (!task) return;\n\t\tconst reason = unavailableReason(task);\n\t\tif (reason) this.notify(\"warning\", reason);\n\t\telse this.setMode({ kind: \"confirmStop\", taskId: task.id });\n\t}\n\tprivate confirmStop(): void {\n\t\tconst mode = this.mode;\n\t\tif (mode.kind !== \"confirmStop\") return;\n\t\tthis.setMode(BROWSE);\n\t\tconst task = this.selection.selected;\n\t\tif (mode.taskId !== task?.id || isTaskTerminal(task.status)) return;\n\t\t// A granted request shows as Stopping on the row and header; only a refusal needs saying.\n\t\tif (!this.options.host.kill(mode.taskId)) this.notify(\"warning\", \"No new cancellation requested.\");\n\t}\n\tprivate detachSelected(): void {\n\t\tconst task = this.selection.selected;\n\t\tif (!task) return;\n\t\tconst reason =\n\t\t\tunavailableReason(task) ?? (task.mode === \"background\" ? \"Task is already in the background.\" : \"\");\n\t\tif (reason) {\n\t\t\tthis.notify(\"warning\", reason);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\t// The core decides; a full background lane throws its own explanation.\n\t\t\tif (!this.options.host.detach(task.id)) this.notify(\"warning\", \"This task cannot move to background.\");\n\t\t} catch (error) {\n\t\t\tthis.notify(\"warning\", cleanTaskText(error instanceof Error ? error.message : String(error)));\n\t\t}\n\t}\n\tprivate startSearch(): void {\n\t\tconst input = new Input({ prompt: \"Find task: \", placeholder: \"title, command, kind or ID\" });\n\t\tinput.focused = true;\n\t\tthis.setMode({ kind: \"search\", restore: { id: this.selection.state.selectedId, focus: this.focus }, input });\n\t\tthis.focus = \"list\";\n\t}\n\tprivate finishSearch(cancel: boolean): void {\n\t\tconst mode = this.mode;\n\t\tif (mode.kind !== \"search\") return;\n\t\tconst id = cancel ? mode.restore.id : this.selection.state.selectedId;\n\t\tif (!cancel && !id) return;\n\t\tthis.focus = cancel ? mode.restore.focus : \"list\";\n\t\tthis.setMode(BROWSE);\n\t\tthis.select(id);\n\t\tthis.selectedChanged();\n\t}\n\tprivate open(): void {\n\t\tif (this.focus === \"list\" && this.selection.selected) this.focus = \"inspector\";\n\t}\n\tprivate action(key: AppKeybinding): void {\n\t\tswitch (key) {\n\t\t\tcase \"app.tasks.search\":\n\t\t\t\tthis.startSearch();\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.previousTab\":\n\t\t\tcase \"app.tasks.nextTab\":\n\t\t\t\tif (this.focus === \"inspector\")\n\t\t\t\t\tthis.selection.state.tab = key === \"app.tasks.previousTab\" ? \"output\" : \"info\";\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.nextFocus\":\n\t\t\tcase \"app.tasks.previousFocus\":\n\t\t\t\tthis.focus = this.focus === \"list\" ? \"inspector\" : \"list\";\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.follow\":\n\t\t\t\tif (this.focus === \"inspector\" && this.selection.state.tab === \"output\") {\n\t\t\t\t\tthis.inspector.position.output.jump(true);\n\t\t\t\t\tthis.queueTick(true);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.top\":\n\t\t\tcase \"app.tasks.bottom\":\n\t\t\t\tif (this.focus === \"list\") {\n\t\t\t\t\tthis.select(key === \"app.tasks.top\" ? this.selection.rows[0]?.id : this.selection.rows.at(-1)?.id);\n\t\t\t\t\tthis.selectedChanged();\n\t\t\t\t} else this.inspector.position[this.selection.state.tab].jump(key === \"app.tasks.bottom\");\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.kill\":\n\t\t\t\tthis.requestStop();\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.confirmStop\":\n\t\t\t\tthis.confirmStop();\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.detachSelected\":\n\t\t\t\tthis.detachSelected();\n\t\t\t\tbreak;\n\t\t\tcase \"app.tasks.help\":\n\t\t\t\tthis.setMode({ kind: \"help\", viewport: new TaskViewport() });\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t/** Performs what a click on a rendered target asks for. */\n\tprivate perform(action: TaskAction): void {\n\t\tswitch (action.kind) {\n\t\t\tcase \"select\":\n\t\t\t\tthis.select(action.taskId);\n\t\t\t\tthis.selectedChanged();\n\t\t\t\tthis.focus = \"list\";\n\t\t\t\tif (this.mode.kind === \"search\") this.finishSearch(false);\n\t\t\t\tbreak;\n\t\t\tcase \"tab\":\n\t\t\t\tthis.focus = \"inspector\";\n\t\t\t\tthis.selection.state.tab = action.tab;\n\t\t\t\tbreak;\n\t\t\tcase \"key\":\n\t\t\t\tif (action.key === \"app.tasks.follow\") this.focus = \"inspector\";\n\t\t\t\tthis.action(action.key);\n\t\t\t\tbreak;\n\t\t\tcase \"open\":\n\t\t\t\tthis.open();\n\t\t\t\tbreak;\n\t\t\tcase \"back\":\n\t\t\t\tthis.escape();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tprivate move(direction: number, page = false): void {\n\t\tif (this.mode.kind === \"help\") {\n\t\t\tthis.mode.viewport.move(direction, page);\n\t\t\treturn;\n\t\t}\n\t\tif (this.focus === \"list\") {\n\t\t\tconst rows = this.selection.rows;\n\t\t\tif (!rows.length) return;\n\t\t\tconst index = rows.findIndex((task) => task.id === this.selection.state.selectedId);\n\t\t\tconst next = page\n\t\t\t\t? Math.max(0, Math.min(rows.length - 1, index + direction * (this.layout?.listPageSize ?? 1)))\n\t\t\t\t: (index + direction + rows.length) % rows.length;\n\t\t\tthis.select(rows[next]?.id);\n\t\t\tthis.selectedChanged();\n\t\t} else this.inspector.position[this.selection.state.tab].move(direction, page);\n\t}\n\thandleInput(data: string): void {\n\t\tif (this.disposed) return;\n\t\tthis.sync();\n\t\tthis.render(this.width);\n\t\tthis.clearFeedback();\n\t\ttry {\n\t\t\tif (this.layout?.tooSmall) {\n\t\t\t\t// The resize notice owns the screen; keys must not act on the hidden panel.\n\t\t\t\tif (this.options.keybindings.matches(data, \"tui.select.cancel\")) this.escape();\n\t\t\t} else {\n\t\t\t\tswitch (this.mode.kind) {\n\t\t\t\t\tcase \"help\":\n\t\t\t\t\t\tthis.helpInput(this.mode.viewport, data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"search\":\n\t\t\t\t\t\tthis.searchInput(this.mode.input, data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"confirmStop\":\n\t\t\t\t\t\tthis.confirmInput(data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"browse\":\n\t\t\t\t\t\tthis.browseInput(data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.notify(\"error\", cleanTaskText(error instanceof Error ? error.message : String(error)));\n\t\t}\n\t\tif (this.disposed) return;\n\t\tthis.queueTick(true);\n\t\tthis.options.tui.requestRender();\n\t}\n\tprivate helpInput(viewport: TaskViewport, data: string): void {\n\t\tconst kb = this.options.keybindings;\n\t\tif (kb.matches(data, \"tui.select.cancel\") || kb.matches(data, \"app.tasks.help\")) this.setMode(BROWSE);\n\t\telse if (kb.matches(data, \"app.tasks.top\") || kb.matches(data, \"app.tasks.bottom\"))\n\t\t\tviewport.jump(kb.matches(data, \"app.tasks.bottom\"));\n\t\telse if (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.editor.pageUp\"))\n\t\t\tviewport.move(-1, kb.matches(data, \"tui.editor.pageUp\"));\n\t\telse if (kb.matches(data, \"tui.select.down\") || kb.matches(data, \"tui.editor.pageDown\"))\n\t\t\tviewport.move(1, kb.matches(data, \"tui.editor.pageDown\"));\n\t}\n\tprivate searchInput(input: Input, data: string): void {\n\t\tconst kb = this.options.keybindings;\n\t\tif (kb.matches(data, \"tui.select.cancel\")) this.escape();\n\t\telse if (kb.matches(data, \"tui.select.confirm\")) this.finishSearch(false);\n\t\telse if (kb.matches(data, \"tui.select.up\") || kb.matches(data, \"tui.select.pageUp\"))\n\t\t\tthis.move(-1, kb.matches(data, \"tui.select.pageUp\"));\n\t\telse if (kb.matches(data, \"tui.select.down\") || kb.matches(data, \"tui.select.pageDown\"))\n\t\t\tthis.move(1, kb.matches(data, \"tui.select.pageDown\"));\n\t\telse {\n\t\t\tinput.handleInput(data);\n\t\t\tthis.selection.refresh(this.query);\n\t\t\tthis.selectedChanged();\n\t\t}\n\t}\n\tprivate confirmInput(data: string): void {\n\t\tconst kb = this.options.keybindings;\n\t\tif (kb.matches(data, \"app.tasks.confirmStop\")) this.confirmStop();\n\t\telse if (kb.matches(data, \"tui.select.cancel\")) this.escape();\n\t}\n\tprivate browseInput(data: string): void {\n\t\tconst kb = this.options.keybindings;\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.escape();\n\t\t\treturn;\n\t\t}\n\t\tconst pageUp = kb.matches(data, this.focus === \"list\" ? \"tui.select.pageUp\" : \"tui.editor.pageUp\");\n\t\tconst pageDown = kb.matches(data, this.focus === \"list\" ? \"tui.select.pageDown\" : \"tui.editor.pageDown\");\n\t\tif (pageUp || kb.matches(data, \"tui.select.up\")) this.move(-1, pageUp);\n\t\telse if (pageDown || kb.matches(data, \"tui.select.down\")) this.move(1, pageDown);\n\t\telse if (kb.matches(data, \"tui.select.confirm\")) this.open();\n\t\telse {\n\t\t\tconst key = actions.find((key) => kb.matches(data, key));\n\t\t\tif (key) this.action(key);\n\t\t}\n\t}\n\thandleMouse(event: TuiMouseEvent): TuiMouseEventResult | undefined {\n\t\tif (this.disposed || event.ctrl || event.alt || event.shift) return;\n\t\t// Feedback is transient: a click retracts it and acts, exactly like a keypress does.\n\t\tthis.clearFeedback();\n\t\tthis.render(event.width);\n\t\tconst layout = this.layout!;\n\t\tconst region = layout.regions.find(\n\t\t\t(r) => event.y >= r.y && event.y < r.y + r.height && event.x >= r.x && event.x < r.x + r.width,\n\t\t);\n\t\tif (event.type === \"wheel\" && event.wheelDelta) {\n\t\t\tif (region) {\n\t\t\t\tconst delta = Math.sign(event.wheelDelta) * Math.min(20, Math.abs(event.wheelDelta));\n\t\t\t\tif (region.pane === \"help\") {\n\t\t\t\t\tif (this.mode.kind === \"help\") this.mode.viewport.move(delta, false);\n\t\t\t\t} else if (region.pane === \"list\") this.list.scroll(delta);\n\t\t\t\telse this.inspector.position[this.selection.state.tab].move(delta, false);\n\t\t\t}\n\t\t} else if (event.type === \"click\" && event.button === \"left\") {\n\t\t\tconst hit = layout.hits.find((hit) => hit.y === event.y && event.x >= hit.x && event.x < hit.x + hit.width);\n\t\t\ttry {\n\t\t\t\tif (hit) this.perform(hit.action);\n\t\t\t\telse if (region && region.pane !== \"help\") this.focus = region.pane;\n\t\t\t} catch (error) {\n\t\t\t\tthis.notify(\"error\", cleanTaskText(error instanceof Error ? error.message : String(error)));\n\t\t\t}\n\t\t} else return;\n\t\tthis.queueTick(true);\n\t\tthis.options.tui.requestRender();\n\t\treturn { handled: true, focus: event.type === \"click\" };\n\t}\n\trender(width: number): string[] {\n\t\tthis.width = width;\n\t\tthis.sync();\n\t\tthis.layout = renderTasksLayout({\n\t\t\twidth,\n\t\t\theight: this.options.tui.terminal.rows,\n\t\t\ttheme: this.options.theme,\n\t\t\tkeybindings: this.options.keybindings,\n\t\t\tselection: this.selection,\n\t\t\tinspector: this.inspector,\n\t\t\tlist: this.list,\n\t\t\tfocus: this.focus,\n\t\t\tmode: this.mode,\n\t\t\tfeedback: this.feedback,\n\t\t\tcanDetach: (id) => this.canDetach(id),\n\t\t});\n\t\treturn this.layout.lines;\n\t}\n\t/** The panel's selection can lag the runtime by a notification; a task that is gone cannot move. */\n\tprivate canDetach(id: string): boolean {\n\t\ttry {\n\t\t\treturn this.options.host.canDetach(id);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tthis.selection.state.closedAt = Date.now();\n\t\tclearInterval(this.pollTimer);\n\t\tclearInterval(this.animationTimer);\n\t\tthis.clearFeedback();\n\t\tthis.unsubscribe();\n\t\tthis.inspector.dispose();\n\t}\n}\n"]}
|
|
@@ -11,9 +11,8 @@ export declare function streamsLog(task: TaskSnapshot): boolean;
|
|
|
11
11
|
/**
|
|
12
12
|
* Output: a log streams from its file through bounded reads. Any other task shows what its
|
|
13
13
|
* executor published, current with every snapshot: the human `display` when there is one,
|
|
14
|
-
* otherwise the model-facing result.
|
|
15
|
-
*
|
|
16
|
-
* clipped to the width.
|
|
14
|
+
* otherwise the model-facing result. Structured live activities share the interactive renderer;
|
|
15
|
+
* their bounded text remains the fallback for other hosts and settled snapshots.
|
|
17
16
|
*/
|
|
18
|
-
export declare function outputLines(task: TaskSnapshot, read: TaskRead | undefined, theme: Theme, width: number
|
|
17
|
+
export declare function outputLines(task: TaskSnapshot, read: TaskRead | undefined, theme: Theme, width: number): string[];
|
|
19
18
|
//# sourceMappingURL=views.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../../../src/extensions/tasks/ui/views.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../../../src/extensions/tasks/ui/views.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEhG,OAAO,EAAmC,KAAK,KAAK,EAAE,MAAM,2CAA2C,CAAC;AAKxG;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAiCrF;AAED,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BjH"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/** The inspector's Details and Output content, computed once per task snapshot and output read. */
|
|
2
|
-
import { Markdown,
|
|
2
|
+
import { Markdown, visibleWidth, wrapTextWithAnsi } from "@earendil-works/pi-tui";
|
|
3
3
|
import { isTaskTerminal } from "../../../core/tasks/types.js";
|
|
4
|
+
import { taskActivityLines } from "../../../modes/interactive/components/task-activity-list.js";
|
|
4
5
|
import { getMarkdownTheme, highlightCode } from "../../../modes/interactive/theme/theme.js";
|
|
5
6
|
import { cleanTaskText } from "./text.js";
|
|
6
7
|
/**
|
|
@@ -53,29 +54,29 @@ export function streamsLog(task) {
|
|
|
53
54
|
/**
|
|
54
55
|
* Output: a log streams from its file through bounded reads. Any other task shows what its
|
|
55
56
|
* executor published, current with every snapshot: the human `display` when there is one,
|
|
56
|
-
* otherwise the model-facing result.
|
|
57
|
-
*
|
|
58
|
-
* clipped to the width.
|
|
57
|
+
* otherwise the model-facing result. Structured live activities share the interactive renderer;
|
|
58
|
+
* their bounded text remains the fallback for other hosts and settled snapshots.
|
|
59
59
|
*/
|
|
60
|
-
export function outputLines(task, read, theme, width
|
|
61
|
-
if (live && !isTaskTerminal(task.status))
|
|
62
|
-
return live.map((line) => truncateToWidth(line, Math.max(1, width)));
|
|
60
|
+
export function outputLines(task, read, theme, width) {
|
|
63
61
|
const empty = task.status === "completed"
|
|
64
62
|
? "Completed with no output."
|
|
65
63
|
: isTaskTerminal(task.status)
|
|
66
64
|
? "No saved output."
|
|
67
65
|
: "No output yet.";
|
|
68
66
|
const fromLog = streamsLog(task) && read !== undefined && !read.readError;
|
|
69
|
-
const human = task.display?.text ? task.display : undefined;
|
|
67
|
+
const human = task.display?.text || task.display?.activities?.length ? task.display : undefined;
|
|
70
68
|
const published = human ?? task.result;
|
|
71
69
|
const text = cleanTaskText((fromLog ? read.text : published?.text) || empty);
|
|
72
|
-
|
|
70
|
+
const activities = !fromLog && !isTaskTerminal(task.status) && human?.activities?.length ? human.activities : undefined;
|
|
71
|
+
// Logs and plain live progress keep their plain rendering; only a settled report's result is Markdown.
|
|
73
72
|
const markdown = !fromLog && !human && task.output === "report" && task.status === "completed";
|
|
74
|
-
const output =
|
|
75
|
-
?
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
73
|
+
const output = activities
|
|
74
|
+
? taskActivityLines(activities, Math.max(1, width), theme, human?.earlierActivities ?? 0)
|
|
75
|
+
: markdown
|
|
76
|
+
? new Markdown(text, 0, 0, getMarkdownTheme(), {
|
|
77
|
+
color: (line) => theme.fg("toolOutput", line),
|
|
78
|
+
}).render(Math.max(1, width))
|
|
79
|
+
: text.split("\n").map((line) => theme.fg("toolOutput", line));
|
|
79
80
|
if (read?.readError)
|
|
80
81
|
output.unshift(theme.fg("warning", "Log unavailable; showing saved result."));
|
|
81
82
|
if (!fromLog && published?.truncated)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views.js","sourceRoot":"","sources":["../../../../src/extensions/tasks/ui/views.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"views.js","sourceRoot":"","sources":["../../../../src/extensions/tasks/ui/views.ts"],"names":[],"mappings":"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","sourcesContent":["/** The inspector's Details and Output content, computed once per task snapshot and output read. */\nimport { Markdown, visibleWidth, wrapTextWithAnsi } from \"@earendil-works/pi-tui\";\nimport { isTaskTerminal, type TaskRead, type TaskSnapshot } from \"../../../core/tasks/types.ts\";\nimport { taskActivityLines } from \"../../../modes/interactive/components/task-activity-list.ts\";\nimport { getMarkdownTheme, highlightCode, type Theme } from \"../../../modes/interactive/theme/theme.ts\";\nimport { cleanTaskText } from \"./text.ts\";\n\ntype DetailRow = [label: string, value: string, tone?: \"warning\"];\n\n/**\n * Details: identity first, then the executor's input and facts as aligned rows whose values wrap\n * within their own column to `width`, then a multi-line input block. The source, status and\n * runtime are in the inspector header.\n */\nexport function detailLines(task: TaskSnapshot, theme: Theme, width: number): string[] {\n\tconst input = task.input && {\n\t\t...task.input,\n\t\tlabel: cleanTaskText(task.input.label),\n\t\ttext: cleanTaskText(task.input.text),\n\t};\n\tconst inputLines = input\n\t\t? input.language\n\t\t\t? highlightCode(input.text, input.language)\n\t\t\t: input.text.split(\"\\n\")\n\t\t: [];\n\tconst rows: DetailRow[] = [[\"Task ID\", task.id]];\n\tif (task.error) rows.push([\"Error\", cleanTaskText(task.error).replace(/\\n/g, \" \"), \"warning\"]);\n\t// Without an input, the title is the only complete description of the work.\n\tif (!input) rows.push([\"Title\", cleanTaskText(task.title)]);\n\telse if (inputLines.length <= 1) rows.push([input.label, inputLines[0] ?? \"\"]);\n\tfor (const [label, value] of task.facts ?? []) rows.push([cleanTaskText(label), cleanTaskText(value)]);\n\t// A fact that already names the output file would repeat it.\n\tconst shownAsFact = task.facts?.some(([, value]) => value === task.outputPath);\n\tif (task.outputPath && !shownAsFact)\n\t\trows.push([task.output === \"log\" ? \"Log\" : \"Full report\", cleanTaskText(task.outputPath)]);\n\tconst labelWidth = Math.max(9, ...rows.map(([label]) => visibleWidth(label))) + 1;\n\t// Values wrap inside their own column, so continuation lines hang under the first value line.\n\tconst valueWidth = Math.max(1, width - labelWidth);\n\tconst lines = rows.flatMap(([label, value, tone]) =>\n\t\twrapTextWithAnsi(value, valueWidth).map((line, index) => {\n\t\t\tconst lead = index ? \" \".repeat(labelWidth) : label + \" \".repeat(labelWidth - visibleWidth(label));\n\t\t\treturn lead + (tone ? theme.fg(tone, line) : line);\n\t\t}),\n\t);\n\tif (input && inputLines.length > 1) lines.push(\"\", theme.fg(\"accent\", input.label), ...inputLines);\n\tif (input?.truncated) lines.push(theme.fg(\"warning\", `[Saved ${input.label.toLowerCase()} truncated.]`));\n\treturn lines;\n}\n\n/** Whether Output streams from a file; any other task shows what its executor published. */\nexport function streamsLog(task: TaskSnapshot): boolean {\n\treturn task.output === \"log\" && task.outputPath !== undefined;\n}\n\n/**\n * Output: a log streams from its file through bounded reads. Any other task shows what its\n * executor published, current with every snapshot: the human `display` when there is one,\n * otherwise the model-facing result. Structured live activities share the interactive renderer;\n * their bounded text remains the fallback for other hosts and settled snapshots.\n */\nexport function outputLines(task: TaskSnapshot, read: TaskRead | undefined, theme: Theme, width: number): string[] {\n\tconst empty =\n\t\ttask.status === \"completed\"\n\t\t\t? \"Completed with no output.\"\n\t\t\t: isTaskTerminal(task.status)\n\t\t\t\t? \"No saved output.\"\n\t\t\t\t: \"No output yet.\";\n\tconst fromLog = streamsLog(task) && read !== undefined && !read.readError;\n\tconst human = task.display?.text || task.display?.activities?.length ? task.display : undefined;\n\tconst published = human ?? task.result;\n\tconst text = cleanTaskText((fromLog ? read.text : published?.text) || empty);\n\tconst activities =\n\t\t!fromLog && !isTaskTerminal(task.status) && human?.activities?.length ? human.activities : undefined;\n\t// Logs and plain live progress keep their plain rendering; only a settled report's result is Markdown.\n\tconst markdown = !fromLog && !human && task.output === \"report\" && task.status === \"completed\";\n\tconst output = activities\n\t\t? taskActivityLines(activities, Math.max(1, width), theme, human?.earlierActivities ?? 0)\n\t\t: markdown\n\t\t\t? new Markdown(text, 0, 0, getMarkdownTheme(), {\n\t\t\t\t\tcolor: (line) => theme.fg(\"toolOutput\", line),\n\t\t\t\t}).render(Math.max(1, width))\n\t\t\t: text.split(\"\\n\").map((line) => theme.fg(\"toolOutput\", line));\n\tif (read?.readError) output.unshift(theme.fg(\"warning\", \"Log unavailable; showing saved result.\"));\n\tif (!fromLog && published?.truncated)\n\t\toutput.push(theme.fg(\"warning\", human ? \"Output truncated.\" : \"Saved result truncated.\"));\n\treturn output;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../../src/extensions/tool-presentation/fallback.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,wBAAwB,CAAC;AAO/E,oGAAoG;AACpG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAexD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,UAAQ,GAAG,SAAS,CAK/F;AAED,oGAAoG;AACpG,qBAAa,uBAAwB,YAAW,SAAS;IACxD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAU;gBAEd,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO;IAK7C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAa/B,UAAU,IAAI,IAAI;CAClB"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/** Generic call and result presentation for a tool that supplies no renderer. */
|
|
2
2
|
import { Text, truncateToWidth } from "@earendil-works/pi-tui";
|
|
3
|
-
import { formatToolCallWithArgs } from "
|
|
4
|
-
import { keyHint } from "
|
|
5
|
-
import { truncateToVisualLines } from "
|
|
6
|
-
import { theme } from "
|
|
7
|
-
import { toolStyle } from "
|
|
3
|
+
import { formatToolCallWithArgs } from "../../core/tools/render-utils.js";
|
|
4
|
+
import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
|
|
5
|
+
import { truncateToVisualLines } from "../../modes/interactive/components/visual-truncate.js";
|
|
6
|
+
import { theme } from "../../modes/interactive/theme/theme.js";
|
|
7
|
+
import { toolStyle } from "../../modes/interactive/tool-view/style.js";
|
|
8
8
|
/** One-line `key=value` summary of a call's arguments, bounded by `toolStyle.fallbackArgsWidth`. */
|
|
9
9
|
export function formatFallbackArgs(args) {
|
|
10
10
|
if (!args || typeof args !== "object")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback.js","sourceRoot":"","sources":["../../../src/extensions/tool-presentation/fallback.ts"],"names":[],"mappings":"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","sourcesContent":["/** Generic call and result presentation for a tool that supplies no renderer. */\n\nimport { type Component, Text, truncateToWidth } from \"@earendil-works/pi-tui\";\nimport { formatToolCallWithArgs } from \"../../core/tools/render-utils.ts\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { truncateToVisualLines } from \"../../modes/interactive/components/visual-truncate.ts\";\nimport { theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { toolStyle } from \"../../modes/interactive/tool-view/style.ts\";\n\n/** One-line `key=value` summary of a call's arguments, bounded by `toolStyle.fallbackArgsWidth`. */\nexport function formatFallbackArgs(args: unknown): string {\n\tif (!args || typeof args !== \"object\") return \"\";\n\tconst entries = Object.entries(args);\n\tif (entries.length === 0) return \"\";\n\tconst summary = entries\n\t\t.map(([key, value]) => {\n\t\t\ttry {\n\t\t\t\treturn `${key}=${JSON.stringify(value) ?? String(value)}`;\n\t\t\t} catch {\n\t\t\t\treturn `${key}=${String(value)}`;\n\t\t\t}\n\t\t})\n\t\t.join(\" \")\n\t\t.replace(/\\s+/g, \" \");\n\treturn truncateToWidth(summary, toolStyle.fallbackArgsWidth, \"...\");\n}\n\nexport function createCallFallback(toolName: string, args: unknown, expanded = false): Component {\n\tif (expanded) return new Text(formatToolCallWithArgs(toolName, args, theme, true), 0, 0);\n\tconst summary = formatFallbackArgs(args);\n\tconst suffix = summary ? theme.fg(\"dim\", `(${summary})`) : \"\";\n\treturn new Text(`${theme.fg(\"toolTitle\", theme.bold(toolName))}${suffix}`, 0, 0);\n}\n\n/** The last `toolStyle.collapsed.fallbackLines` lines of the output, or all of it when expanded. */\nexport class FallbackResultComponent implements Component {\n\tprivate output: string;\n\tprivate expanded: boolean;\n\n\tconstructor(output: string, expanded: boolean) {\n\t\tthis.output = output;\n\t\tthis.expanded = expanded;\n\t}\n\n\trender(width: number): string[] {\n\t\tconst styledOutput = theme.fg(\"toolOutput\", this.output);\n\t\tif (this.expanded) return new Text(styledOutput, 0, 0).render(width);\n\n\t\tconst preview = truncateToVisualLines(styledOutput, toolStyle.collapsed.fallbackLines, width);\n\t\tif (preview.skippedCount <= 0) return preview.visualLines;\n\t\tconst noun = preview.skippedCount === 1 ? \"line\" : \"lines\";\n\t\tconst hint =\n\t\t\ttheme.fg(\"muted\", `... (${preview.skippedCount} earlier ${noun},`) +\n\t\t\t` ${keyHint(\"app.tools.expand\", \"to expand\")}${theme.fg(\"muted\", \")\")}`;\n\t\treturn [truncateToWidth(hint, width, \"...\"), ...preview.visualLines];\n\t}\n\n\tinvalidate(): void {}\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { withToolShell } from "
|
|
1
|
+
import { withToolShell } from "./shell.js";
|
|
2
2
|
/**
|
|
3
3
|
* Distribution tool chrome. Only TUI shell metadata is attached here: renderer functions,
|
|
4
4
|
* execution, and HTML export remain owned by their original providers.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/tool-presentation/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/tool-presentation/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAgB;IACxD,EAAE,CAAC,oBAAoB,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["import type { ExtensionAPI } from \"../../core/extensions/types.ts\";\nimport { withToolShell } from \"./shell.ts\";\n\n/**\n * Distribution tool chrome. Only TUI shell metadata is attached here: renderer functions,\n * execution, and HTML export remain owned by their original providers.\n */\nexport default function toolPresentation(pi: ExtensionAPI): void {\n\tpi.registerToolRenderer((toolName, next) => withToolShell(toolName, next()));\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ToolDefinition, ToolExecutionShell, ToolRenderers } from "
|
|
1
|
+
import type { ToolDefinition, ToolExecutionShell, ToolRenderers } from "../../core/extensions/types.ts";
|
|
2
2
|
export type ToolDefinitionLike = ToolRenderers | ToolDefinition<any, any, any>;
|
|
3
3
|
/**
|
|
4
4
|
* Create the distribution's TUI chrome without changing a tool's call or result renderers.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../src/extensions/tool-presentation/shell.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,cAAc,EACd,kBAAkB,EAElB,aAAa,EACb,MAAM,gCAAgC,CAAC;AAMxC,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAS/E;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,GAAG,SAAS,GAAG,kBAAkB,CAuBhH;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,GAAG,SAAS,GAAG,kBAAkB,CAG9G"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Container } from "@earendil-works/pi-tui";
|
|
2
|
-
import { getTextOutput as getRenderedTextOutput } from "
|
|
3
|
-
import { createAllToolRenderers } from "
|
|
2
|
+
import { getTextOutput as getRenderedTextOutput } from "../../core/tools/render-utils.js";
|
|
3
|
+
import { createAllToolRenderers } from "../../core/tools/renderers/index.js";
|
|
4
|
+
import { FramedComponent, toolMarkerColor, toolStatus, toolStyle } from "../../modes/interactive/tool-view/style.js";
|
|
4
5
|
import { createCallFallback, FallbackResultComponent } from "./fallback.js";
|
|
5
|
-
import { FramedComponent, toolMarkerColor, toolStatus, toolStyle } from "./style.js";
|
|
6
6
|
let builtInRenderers;
|
|
7
7
|
function builtInResultRenderer(toolName) {
|
|
8
8
|
builtInRenderers ??= createAllToolRenderers();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/extensions/tool-presentation/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAOnE,OAAO,EAAE,aAAa,IAAI,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4CAA4C,CAAC;AACrH,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAI5E,IAAI,gBAAuE,CAAC;AAE5E,SAAS,qBAAqB,CAAC,QAAgB;IAC9C,gBAAgB,KAAK,sBAAsB,EAAE,CAAC;IAC9C,OAAQ,gBAAkD,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;AACpF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,UAA0C;IAC3F,MAAM,cAAc,GAAG,UAAU,EAAE,YAAY,CAAC;IAChD,OAAO;QACN,IAAI,GAAG;YACN,OAAO,SAAS,CAAC,GAAG,CAAC;QACtB,CAAC;QACD,KAAK,CAAC,SAAoB,EAAE,IAAuB,EAAE,OAA0B;YAC9E,OAAO,IAAI,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO;YAC/B,OAAO,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC7D,CAAC;QACD,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO;YAC7C,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;YACjE,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC;QACzF,CAAC;QACD,gBAAgB,CAAC,OAAO;YACvB,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,OAAO,KAAK,CAAC;YACvG,MAAM,OAAO,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YAChD,iGAAiG;YACjG,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,cAAc,CAAC;QAC5D,CAAC;KACD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,UAA0C;IACzF,IAAI,UAAU,EAAE,WAAW,KAAK,MAAM,IAAI,UAAU,EAAE,KAAK;QAAE,OAAO,UAAU,CAAC;IAC/E,OAAO,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;AAChF,CAAC","sourcesContent":["import { type Component, Container } from \"@earendil-works/pi-tui\";\nimport type {\n\tToolDefinition,\n\tToolExecutionShell,\n\tToolRenderContext,\n\tToolRenderers,\n} from \"../../core/extensions/types.ts\";\nimport { getTextOutput as getRenderedTextOutput } from \"../../core/tools/render-utils.ts\";\nimport { createAllToolRenderers } from \"../../core/tools/renderers/index.ts\";\nimport { FramedComponent, toolMarkerColor, toolStatus, toolStyle } from \"../../modes/interactive/tool-view/style.ts\";\nimport { createCallFallback, FallbackResultComponent } from \"./fallback.ts\";\n\nexport type ToolDefinitionLike = ToolRenderers | ToolDefinition<any, any, any>;\n\nlet builtInRenderers: ReturnType<typeof createAllToolRenderers> | undefined;\n\nfunction builtInResultRenderer(toolName: string): ToolRenderers[\"renderResult\"] {\n\tbuiltInRenderers ??= createAllToolRenderers();\n\treturn (builtInRenderers as Record<string, ToolRenderers>)[toolName]?.renderResult;\n}\n\n/**\n * Create the distribution's TUI chrome without changing a tool's call or result renderers.\n * The native component invokes these fallbacks only when the corresponding renderer slot is empty\n * or fails. HTML export never reads this object.\n */\nexport function createToolShell(toolName: string, definition: ToolDefinitionLike | undefined): ToolExecutionShell {\n\tconst resultRenderer = definition?.renderResult;\n\treturn {\n\t\tget gap() {\n\t\t\treturn toolStyle.gap;\n\t\t},\n\t\tframe(component: Component, kind: \"header\" | \"body\", context: ToolRenderContext): Component {\n\t\t\treturn new FramedComponent(component, kind, () => toolMarkerColor(toolStatus(context)));\n\t\t},\n\t\trenderCall(args, _theme, context) {\n\t\t\treturn createCallFallback(toolName, args, context.expanded);\n\t\t},\n\t\trenderResult(result, _options, _theme, context) {\n\t\t\tconst output = getRenderedTextOutput(result, context.showImages);\n\t\t\treturn output ? new FallbackResultComponent(output, context.expanded) : new Container();\n\t\t},\n\t\tshouldHideResult(context) {\n\t\t\tif (context.expanded || context.isError || !toolStyle.collapsed.headerOnly.has(toolName)) return false;\n\t\t\tconst builtIn = builtInResultRenderer(toolName);\n\t\t\t// Only fold the built-in result renderer. An extension that replaces it owns its collapsed view.\n\t\t\treturn builtIn !== undefined && builtIn === resultRenderer;\n\t\t},\n\t};\n}\n\n/**\n * Attach the distribution shell while preserving renderer identity and explicit shell ownership.\n * In particular, this does not set renderShell or wrap renderCall/renderResult, so HTML export and\n * other renderer resolvers continue to see the original functions.\n */\nexport function withToolShell(toolName: string, definition: ToolDefinitionLike | undefined): ToolDefinitionLike {\n\tif (definition?.renderShell === \"self\" || definition?.shell) return definition;\n\treturn { ...(definition ?? {}), shell: createToolShell(toolName, definition) };\n}\n"]}
|
|
@@ -11,10 +11,13 @@ import { type Static, Type } from "typebox";
|
|
|
11
11
|
import type { ExtensionAPI, ToolDefinition, ToolInfo, ToolNamespace } from "../../core/extensions/types.ts";
|
|
12
12
|
export declare const TOOL_SEARCH_TOOL_NAME = "tool_search";
|
|
13
13
|
export declare const DEFAULT_TOOL_SEARCH_LIMIT = 8;
|
|
14
|
-
/** A tool as the ranker sees it: its name and the
|
|
14
|
+
/** A tool as the ranker sees it: its name and the texts built by {@link createToolSearchDocument}. */
|
|
15
15
|
export interface ToolSearchDocument {
|
|
16
16
|
name: string;
|
|
17
|
+
/** Description, schema descriptions, and property names. */
|
|
17
18
|
text: string;
|
|
19
|
+
/** Name, description, and instructions of the tool's namespace. */
|
|
20
|
+
namespaceText?: string;
|
|
18
21
|
}
|
|
19
22
|
export interface ToolSearchMatch {
|
|
20
23
|
name: string;
|
|
@@ -24,15 +27,27 @@ export interface ToolSearchMatch {
|
|
|
24
27
|
export interface ToolRanker {
|
|
25
28
|
rank(query: string, documents: readonly ToolSearchDocument[], limit: number): ToolSearchMatch[];
|
|
26
29
|
}
|
|
27
|
-
/**
|
|
30
|
+
/** Unicode word segmentation with identifier boundaries and English stop words/singular forms. */
|
|
28
31
|
export declare function tokenize(text: string): string[];
|
|
29
32
|
/**
|
|
30
|
-
* Search text of a tool: the
|
|
31
|
-
*
|
|
32
|
-
* description and instructions.
|
|
33
|
+
* Search text of a tool: the description and the schema descriptions and property names, and
|
|
34
|
+
* separately the namespace name, description, and instructions. The ranker reads the name from `name`.
|
|
33
35
|
*/
|
|
34
36
|
export declare function createToolSearchDocument(tool: Pick<ToolInfo, "name" | "description" | "parameters">, namespace?: ToolNamespace): ToolSearchDocument;
|
|
35
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* Okapi BM25 over the description, with the name and the namespace as separate fields:
|
|
39
|
+
* - a tool that matches more of the query's terms, in any field, ranks above one that matches
|
|
40
|
+
* fewer, whatever their scores: for `screenshot window`, a tool whose description has both words
|
|
41
|
+
* beats `window`, whose name has one;
|
|
42
|
+
* - a query term in the name scores more than any number of mentions in the description;
|
|
43
|
+
* - a tool whose whole local name is in the query (`app` in `peekaboo app` for
|
|
44
|
+
* `mcp__peekaboo__app`) gets a bonus worth one more match of every query term, so among tools
|
|
45
|
+
* matching as many terms it mostly wins over tools that only mention the words;
|
|
46
|
+
* - a query that is exactly a tool's name ranks that tool first, before coverage.
|
|
47
|
+
*
|
|
48
|
+
* The description alone is length-normalized, so a long name or long namespace instructions do
|
|
49
|
+
* not lower a tool's score. Ties keep document order.
|
|
50
|
+
*/
|
|
36
51
|
export declare class Bm25Ranker implements ToolRanker {
|
|
37
52
|
private readonly k1;
|
|
38
53
|
private readonly b;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/extensions/tool-search/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EACX,YAAY,EACZ,cAAc,EAEd,QAAQ,EACR,aAAa,EACb,MAAM,gCAAgC,CAAC;AAExC,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AACnD,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/extensions/tool-search/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EACX,YAAY,EACZ,cAAc,EAEd,QAAQ,EACR,aAAa,EACb,MAAM,gCAAgC,CAAC;AAExC,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AACnD,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,sGAAsG;AACtG,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACd;AAED,2FAA2F;AAC3F,MAAM,WAAW,UAAU;IAC1B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE,CAAC;CAChG;AAoCD,kGAAkG;AAClG,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAe/C;AAuBD;;;GAGG;AACH,wBAAgB,wBAAwB,CACvC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,YAAY,CAAC,EAC3D,SAAS,CAAC,EAAE,aAAa,GACvB,kBAAkB,CAOpB;AA0DD;;;;;;;;;;;;;GAaG;AACH,qBAAa,UAAW,YAAW,UAAU;IAC5C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAS;gBAEf,OAAO,GAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAO;IAKrD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE;CAwC/F;AAED,eAAO,MAAM,gBAAgB;;;EAK3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACrC,iCAAiC;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACrC;;;OAGG;IACH,KAAK,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,GAAG,gBAAgB,GAAG,gBAAgB,CAAC,CAAC;CAChF;AA2BD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,2VAAyX,CAAC;AAE9Z,wBAAgB,8BAA8B,CAC7C,OAAO,GAAE,qBAA0B,GACjC,cAAc,CAAC,OAAO,gBAAgB,EAAE,qBAAqB,CAAC,CAyBhE"}
|