@pentoshi/clai 2.0.62 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +262 -368
- package/dist/agent/context-manager.d.ts +5 -0
- package/dist/agent/context-manager.js +14 -2
- package/dist/agent/context-manager.js.map +1 -1
- package/dist/agent/events.d.ts +4 -1
- package/dist/agent/runner.js +150 -83
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/tool-call-parser.d.ts +15 -0
- package/dist/agent/tool-call-parser.js +171 -2
- package/dist/agent/tool-call-parser.js.map +1 -1
- package/dist/app/adapters/agent-event-adapter.d.ts +29 -0
- package/dist/app/adapters/agent-event-adapter.js +143 -0
- package/dist/app/adapters/agent-event-adapter.js.map +1 -0
- package/dist/app/adapters/current-agent-adapter.d.ts +7 -0
- package/dist/app/adapters/current-agent-adapter.js +27 -0
- package/dist/app/adapters/current-agent-adapter.js.map +1 -0
- package/dist/app/adapters/current-jobs-adapter.d.ts +4 -0
- package/dist/app/adapters/current-jobs-adapter.js +13 -0
- package/dist/app/adapters/current-jobs-adapter.js.map +1 -0
- package/dist/app/adapters/current-store-adapter.d.ts +3 -0
- package/dist/app/adapters/current-store-adapter.js +22 -0
- package/dist/app/adapters/current-store-adapter.js.map +1 -0
- package/dist/app/adapters/current-terminal-adapter.d.ts +9 -0
- package/dist/app/adapters/current-terminal-adapter.js +31 -0
- package/dist/app/adapters/current-terminal-adapter.js.map +1 -0
- package/dist/app/adapters/current-updates-adapter.d.ts +7 -0
- package/dist/app/adapters/current-updates-adapter.js +31 -0
- package/dist/app/adapters/current-updates-adapter.js.map +1 -0
- package/dist/app/adapters/in-memory-clipboard-adapter.d.ts +10 -0
- package/dist/app/adapters/in-memory-clipboard-adapter.js +20 -0
- package/dist/app/adapters/in-memory-clipboard-adapter.js.map +1 -0
- package/dist/app/commands/command.d.ts +24 -0
- package/dist/app/commands/command.js +4 -0
- package/dist/app/commands/command.js.map +1 -0
- package/dist/app/commands/registry.d.ts +45 -0
- package/dist/app/commands/registry.js +164 -0
- package/dist/app/commands/registry.js.map +1 -0
- package/dist/app/controllers/disposable.d.ts +15 -0
- package/dist/app/controllers/disposable.js +38 -0
- package/dist/app/controllers/disposable.js.map +1 -0
- package/dist/app/controllers/job-controller.d.ts +22 -0
- package/dist/app/controllers/job-controller.js +35 -0
- package/dist/app/controllers/job-controller.js.map +1 -0
- package/dist/app/controllers/plan-controller.d.ts +31 -0
- package/dist/app/controllers/plan-controller.js +69 -0
- package/dist/app/controllers/plan-controller.js.map +1 -0
- package/dist/app/controllers/session-controller.d.ts +167 -0
- package/dist/app/controllers/session-controller.js +467 -0
- package/dist/app/controllers/session-controller.js.map +1 -0
- package/dist/app/controllers/turn-controller.d.ts +52 -0
- package/dist/app/controllers/turn-controller.js +118 -0
- package/dist/app/controllers/turn-controller.js.map +1 -0
- package/dist/app/events/app-event.d.ts +118 -0
- package/dist/app/events/app-event.js +25 -0
- package/dist/app/events/app-event.js.map +1 -0
- package/dist/app/events/event-buffer.d.ts +51 -0
- package/dist/app/events/event-buffer.js +109 -0
- package/dist/app/events/event-buffer.js.map +1 -0
- package/dist/app/events/sequencer.d.ts +32 -0
- package/dist/app/events/sequencer.js +55 -0
- package/dist/app/events/sequencer.js.map +1 -0
- package/dist/app/ports/agent-port.d.ts +29 -0
- package/dist/app/ports/agent-port.js +2 -0
- package/dist/app/ports/agent-port.js.map +1 -0
- package/dist/app/ports/clipboard-port.d.ts +9 -0
- package/dist/app/ports/clipboard-port.js +2 -0
- package/dist/app/ports/clipboard-port.js.map +1 -0
- package/dist/app/ports/confirm-port.d.ts +17 -0
- package/dist/app/ports/confirm-port.js +2 -0
- package/dist/app/ports/confirm-port.js.map +1 -0
- package/dist/app/ports/jobs-port.d.ts +18 -0
- package/dist/app/ports/jobs-port.js +2 -0
- package/dist/app/ports/jobs-port.js.map +1 -0
- package/dist/app/ports/persistence-port.d.ts +21 -0
- package/dist/app/ports/persistence-port.js +2 -0
- package/dist/app/ports/persistence-port.js.map +1 -0
- package/dist/app/ports/secret-port.d.ts +12 -0
- package/dist/app/ports/secret-port.js +2 -0
- package/dist/app/ports/secret-port.js.map +1 -0
- package/dist/app/ports/terminal-port.d.ts +18 -0
- package/dist/app/ports/terminal-port.js +2 -0
- package/dist/app/ports/terminal-port.js.map +1 -0
- package/dist/app/ports/updates-port.d.ts +12 -0
- package/dist/app/ports/updates-port.js +2 -0
- package/dist/app/ports/updates-port.js.map +1 -0
- package/dist/commands/doctor.js +9 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/update.js +1 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/index.js +9 -6
- package/dist/index.js.map +1 -1
- package/dist/llm/router.js +4 -2
- package/dist/llm/router.js.map +1 -1
- package/dist/prompts/index.d.ts +1 -1
- package/dist/prompts/index.js +5 -3
- package/dist/prompts/index.js.map +1 -1
- package/dist/repl/slash-commands.js +1 -1
- package/dist/repl/slash-commands.js.map +1 -1
- package/dist/repl.js +35 -107
- package/dist/repl.js.map +1 -1
- package/dist/store/config.js +3 -1
- package/dist/store/config.js.map +1 -1
- package/dist/store/history.d.ts +26 -2
- package/dist/store/history.js +383 -72
- package/dist/store/history.js.map +1 -1
- package/dist/store/logs.js +3 -3
- package/dist/store/logs.js.map +1 -1
- package/dist/store/paths.d.ts +6 -0
- package/dist/store/paths.js +38 -0
- package/dist/store/paths.js.map +1 -0
- package/dist/store/plan.js +8 -5
- package/dist/store/plan.js.map +1 -1
- package/dist/tools/jobs.js +2 -2
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/registry.js +117 -46
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/shell.js +2 -2
- package/dist/tools/shell.js.map +1 -1
- package/dist/tui/state.js +20 -17
- package/dist/tui/state.js.map +1 -1
- package/dist/tui-v2/actions/action-id.d.ts +14 -0
- package/dist/tui-v2/actions/action-id.js +109 -0
- package/dist/tui-v2/actions/action-id.js.map +1 -0
- package/dist/tui-v2/actions/action-router.d.ts +18 -0
- package/dist/tui-v2/actions/action-router.js +62 -0
- package/dist/tui-v2/actions/action-router.js.map +1 -0
- package/dist/tui-v2/actions/chord-from-key.d.ts +26 -0
- package/dist/tui-v2/actions/chord-from-key.js +45 -0
- package/dist/tui-v2/actions/chord-from-key.js.map +1 -0
- package/dist/tui-v2/actions/keymap.d.ts +24 -0
- package/dist/tui-v2/actions/keymap.js +134 -0
- package/dist/tui-v2/actions/keymap.js.map +1 -0
- package/dist/tui-v2/app/App.d.ts +13 -0
- package/dist/tui-v2/app/App.js +320 -0
- package/dist/tui-v2/app/App.js.map +1 -0
- package/dist/tui-v2/app/command-handlers.d.ts +8 -0
- package/dist/tui-v2/app/command-handlers.js +66 -0
- package/dist/tui-v2/app/command-handlers.js.map +1 -0
- package/dist/tui-v2/app/commands/config-commands.d.ts +14 -0
- package/dist/tui-v2/app/commands/config-commands.js +161 -0
- package/dist/tui-v2/app/commands/config-commands.js.map +1 -0
- package/dist/tui-v2/app/commands/key-commands.d.ts +9 -0
- package/dist/tui-v2/app/commands/key-commands.js +263 -0
- package/dist/tui-v2/app/commands/key-commands.js.map +1 -0
- package/dist/tui-v2/app/commands/picker-commands.d.ts +24 -0
- package/dist/tui-v2/app/commands/picker-commands.js +423 -0
- package/dist/tui-v2/app/commands/picker-commands.js.map +1 -0
- package/dist/tui-v2/app/commands/session-commands.d.ts +19 -0
- package/dist/tui-v2/app/commands/session-commands.js +162 -0
- package/dist/tui-v2/app/commands/session-commands.js.map +1 -0
- package/dist/tui-v2/app/plan-lifecycle.d.ts +16 -0
- package/dist/tui-v2/app/plan-lifecycle.js +59 -0
- package/dist/tui-v2/app/plan-lifecycle.js.map +1 -0
- package/dist/tui-v2/app/providers.d.ts +17 -0
- package/dist/tui-v2/app/providers.js +32 -0
- package/dist/tui-v2/app/providers.js.map +1 -0
- package/dist/tui-v2/bootstrap/capabilities.d.ts +35 -0
- package/dist/tui-v2/bootstrap/capabilities.js +93 -0
- package/dist/tui-v2/bootstrap/capabilities.js.map +1 -0
- package/dist/tui-v2/bootstrap/composition-root.d.ts +85 -0
- package/dist/tui-v2/bootstrap/composition-root.js +131 -0
- package/dist/tui-v2/bootstrap/composition-root.js.map +1 -0
- package/dist/tui-v2/bootstrap/disable-native-selection.d.ts +11 -0
- package/dist/tui-v2/bootstrap/disable-native-selection.js +13 -0
- package/dist/tui-v2/bootstrap/disable-native-selection.js.map +1 -0
- package/dist/tui-v2/bootstrap/lifecycle.d.ts +62 -0
- package/dist/tui-v2/bootstrap/lifecycle.js +123 -0
- package/dist/tui-v2/bootstrap/lifecycle.js.map +1 -0
- package/dist/tui-v2/bootstrap/osc52-clipboard.d.ts +28 -0
- package/dist/tui-v2/bootstrap/osc52-clipboard.js +44 -0
- package/dist/tui-v2/bootstrap/osc52-clipboard.js.map +1 -0
- package/dist/tui-v2/bootstrap/overlay-ports.d.ts +12 -0
- package/dist/{tui/confirm.js → tui-v2/bootstrap/overlay-ports.js} +17 -25
- package/dist/tui-v2/bootstrap/overlay-ports.js.map +1 -0
- package/dist/tui-v2/bootstrap/pager-export.d.ts +24 -0
- package/dist/tui-v2/bootstrap/pager-export.js +87 -0
- package/dist/tui-v2/bootstrap/pager-export.js.map +1 -0
- package/dist/tui-v2/bootstrap/start-tui-v2.d.ts +15 -0
- package/dist/tui-v2/bootstrap/start-tui-v2.js +95 -0
- package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -0
- package/dist/tui-v2/bootstrap/ui-selection.d.ts +30 -0
- package/dist/tui-v2/bootstrap/ui-selection.js +59 -0
- package/dist/tui-v2/bootstrap/ui-selection.js.map +1 -0
- package/dist/tui-v2/components/completion/completion-menu.d.ts +23 -0
- package/dist/tui-v2/components/completion/completion-menu.js +84 -0
- package/dist/tui-v2/components/completion/completion-menu.js.map +1 -0
- package/dist/tui-v2/components/jobs/jobs-panel.d.ts +16 -0
- package/dist/tui-v2/components/jobs/jobs-panel.js +92 -0
- package/dist/tui-v2/components/jobs/jobs-panel.js.map +1 -0
- package/dist/tui-v2/components/modal/confirm-modal.d.ts +21 -0
- package/dist/tui-v2/components/modal/confirm-modal.js +71 -0
- package/dist/tui-v2/components/modal/confirm-modal.js.map +1 -0
- package/dist/tui-v2/components/modal/prompt-actions-modal.d.ts +15 -0
- package/dist/tui-v2/components/modal/prompt-actions-modal.js +80 -0
- package/dist/tui-v2/components/modal/prompt-actions-modal.js.map +1 -0
- package/dist/tui-v2/components/modal/secret-modal.d.ts +24 -0
- package/dist/tui-v2/components/modal/secret-modal.js +50 -0
- package/dist/tui-v2/components/modal/secret-modal.js.map +1 -0
- package/dist/tui-v2/components/overlay/overlay-host.d.ts +17 -0
- package/dist/tui-v2/components/overlay/overlay-host.js +28 -0
- package/dist/tui-v2/components/overlay/overlay-host.js.map +1 -0
- package/dist/tui-v2/components/pager/pager.d.ts +20 -0
- package/dist/tui-v2/components/pager/pager.js +396 -0
- package/dist/tui-v2/components/pager/pager.js.map +1 -0
- package/dist/tui-v2/components/picker/picker.d.ts +17 -0
- package/dist/tui-v2/components/picker/picker.js +222 -0
- package/dist/tui-v2/components/picker/picker.js.map +1 -0
- package/dist/tui-v2/components/plan/plan-view.d.ts +20 -0
- package/dist/tui-v2/components/plan/plan-view.js +116 -0
- package/dist/tui-v2/components/plan/plan-view.js.map +1 -0
- package/dist/tui-v2/components/queue/queue-panel.d.ts +23 -0
- package/dist/tui-v2/components/queue/queue-panel.js +58 -0
- package/dist/tui-v2/components/queue/queue-panel.js.map +1 -0
- package/dist/tui-v2/components/status/status-line.d.ts +27 -0
- package/dist/tui-v2/components/status/status-line.js +158 -0
- package/dist/tui-v2/components/status/status-line.js.map +1 -0
- package/dist/tui-v2/components/toast/toast-host.d.ts +15 -0
- package/dist/tui-v2/components/toast/toast-host.js +48 -0
- package/dist/tui-v2/components/toast/toast-host.js.map +1 -0
- package/dist/tui-v2/components/transcript/assistant-message.d.ts +20 -0
- package/dist/tui-v2/components/transcript/assistant-message.js +35 -0
- package/dist/tui-v2/components/transcript/assistant-message.js.map +1 -0
- package/dist/tui-v2/components/transcript/compacted-row.d.ts +19 -0
- package/dist/tui-v2/components/transcript/compacted-row.js +94 -0
- package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -0
- package/dist/tui-v2/components/transcript/intro-card.d.ts +19 -0
- package/dist/tui-v2/components/transcript/intro-card.js +50 -0
- package/dist/tui-v2/components/transcript/intro-card.js.map +1 -0
- package/dist/tui-v2/components/transcript/linkable-text.d.ts +21 -0
- package/dist/tui-v2/components/transcript/linkable-text.js +46 -0
- package/dist/tui-v2/components/transcript/linkable-text.js.map +1 -0
- package/dist/tui-v2/components/transcript/notice-row.d.ts +14 -0
- package/dist/tui-v2/components/transcript/notice-row.js +40 -0
- package/dist/tui-v2/components/transcript/notice-row.js.map +1 -0
- package/dist/tui-v2/components/transcript/search-bar.d.ts +19 -0
- package/dist/tui-v2/components/transcript/search-bar.js +7 -0
- package/dist/tui-v2/components/transcript/search-bar.js.map +1 -0
- package/dist/tui-v2/components/transcript/thinking-block.d.ts +22 -0
- package/dist/tui-v2/components/transcript/thinking-block.js +27 -0
- package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -0
- package/dist/tui-v2/components/transcript/tool-card.d.ts +26 -0
- package/dist/tui-v2/components/transcript/tool-card.js +175 -0
- package/dist/tui-v2/components/transcript/tool-card.js.map +1 -0
- package/dist/tui-v2/components/transcript/transcript-row.d.ts +25 -0
- package/dist/tui-v2/components/transcript/transcript-row.js +30 -0
- package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -0
- package/dist/tui-v2/components/transcript/transcript-scroll-port.d.ts +52 -0
- package/dist/tui-v2/components/transcript/transcript-scroll-port.js +86 -0
- package/dist/tui-v2/components/transcript/transcript-scroll-port.js.map +1 -0
- package/dist/tui-v2/components/transcript/transcript-view.d.ts +24 -0
- package/dist/tui-v2/components/transcript/transcript-view.js +403 -0
- package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -0
- package/dist/tui-v2/components/transcript/use-click-without-drag.d.ts +13 -0
- package/dist/tui-v2/components/transcript/use-click-without-drag.js +35 -0
- package/dist/tui-v2/components/transcript/use-click-without-drag.js.map +1 -0
- package/dist/tui-v2/components/transcript/use-native-selection-copy.d.ts +10 -0
- package/dist/tui-v2/components/transcript/use-native-selection-copy.js +37 -0
- package/dist/tui-v2/components/transcript/use-native-selection-copy.js.map +1 -0
- package/dist/tui-v2/components/transcript/use-transcript-selection.d.ts +23 -0
- package/dist/tui-v2/components/transcript/use-transcript-selection.js +136 -0
- package/dist/tui-v2/components/transcript/use-transcript-selection.js.map +1 -0
- package/dist/tui-v2/components/transcript/user-message.d.ts +10 -0
- package/dist/tui-v2/components/transcript/user-message.js +23 -0
- package/dist/tui-v2/components/transcript/user-message.js.map +1 -0
- package/dist/tui-v2/composer/arrow-intent.d.ts +23 -0
- package/dist/tui-v2/composer/arrow-intent.js +35 -0
- package/dist/tui-v2/composer/arrow-intent.js.map +1 -0
- package/dist/tui-v2/composer/completion.d.ts +37 -0
- package/dist/tui-v2/composer/completion.js +67 -0
- package/dist/tui-v2/composer/completion.js.map +1 -0
- package/dist/tui-v2/composer/composer-editor.d.ts +33 -0
- package/dist/tui-v2/composer/composer-editor.js +620 -0
- package/dist/tui-v2/composer/composer-editor.js.map +1 -0
- package/dist/tui-v2/composer/composer-height.d.ts +21 -0
- package/dist/tui-v2/composer/composer-height.js +29 -0
- package/dist/tui-v2/composer/composer-height.js.map +1 -0
- package/dist/tui-v2/composer/composer-meta.d.ts +9 -0
- package/dist/tui-v2/composer/composer-meta.js +38 -0
- package/dist/tui-v2/composer/composer-meta.js.map +1 -0
- package/dist/tui-v2/composer/history-nav.d.ts +15 -0
- package/dist/tui-v2/composer/history-nav.js +16 -0
- package/dist/tui-v2/composer/history-nav.js.map +1 -0
- package/dist/tui-v2/composer/newline-hint.d.ts +13 -0
- package/dist/tui-v2/composer/newline-hint.js +13 -0
- package/dist/tui-v2/composer/newline-hint.js.map +1 -0
- package/dist/tui-v2/composer/paste-placeholder.d.ts +35 -0
- package/dist/tui-v2/composer/paste-placeholder.js +55 -0
- package/dist/tui-v2/composer/paste-placeholder.js.map +1 -0
- package/dist/tui-v2/composer/prompt-history.d.ts +22 -0
- package/dist/tui-v2/composer/prompt-history.js +51 -0
- package/dist/tui-v2/composer/prompt-history.js.map +1 -0
- package/dist/tui-v2/composer/secret-buffer.d.ts +20 -0
- package/dist/tui-v2/composer/secret-buffer.js +42 -0
- package/dist/tui-v2/composer/secret-buffer.js.map +1 -0
- package/dist/tui-v2/composer/textarea-keybindings.d.ts +22 -0
- package/dist/tui-v2/composer/textarea-keybindings.js +27 -0
- package/dist/tui-v2/composer/textarea-keybindings.js.map +1 -0
- package/dist/tui-v2/controllers/focus-controller.d.ts +30 -0
- package/dist/tui-v2/controllers/focus-controller.js +80 -0
- package/dist/tui-v2/controllers/focus-controller.js.map +1 -0
- package/dist/tui-v2/controllers/overlay-controller.d.ts +99 -0
- package/dist/tui-v2/controllers/overlay-controller.js +195 -0
- package/dist/tui-v2/controllers/overlay-controller.js.map +1 -0
- package/dist/tui-v2/controllers/selection-controller.d.ts +76 -0
- package/dist/tui-v2/controllers/selection-controller.js +238 -0
- package/dist/tui-v2/controllers/selection-controller.js.map +1 -0
- package/dist/tui-v2/controllers/toast-controller.d.ts +35 -0
- package/dist/tui-v2/controllers/toast-controller.js +88 -0
- package/dist/tui-v2/controllers/toast-controller.js.map +1 -0
- package/dist/tui-v2/layout/compute-layout.d.ts +59 -0
- package/dist/tui-v2/layout/compute-layout.js +170 -0
- package/dist/tui-v2/layout/compute-layout.js.map +1 -0
- package/dist/tui-v2/rendering/ansi-to-styled.d.ts +17 -0
- package/dist/tui-v2/rendering/ansi-to-styled.js +217 -0
- package/dist/tui-v2/rendering/ansi-to-styled.js.map +1 -0
- package/dist/tui-v2/rendering/batch-sections.d.ts +45 -0
- package/dist/tui-v2/rendering/batch-sections.js +109 -0
- package/dist/tui-v2/rendering/batch-sections.js.map +1 -0
- package/dist/tui-v2/rendering/link-detector.d.ts +16 -0
- package/dist/tui-v2/rendering/link-detector.js +43 -0
- package/dist/tui-v2/rendering/link-detector.js.map +1 -0
- package/dist/tui-v2/rendering/open-tool-output.d.ts +28 -0
- package/dist/tui-v2/rendering/open-tool-output.js +138 -0
- package/dist/tui-v2/rendering/open-tool-output.js.map +1 -0
- package/dist/tui-v2/rendering/picker-filter.d.ts +22 -0
- package/dist/tui-v2/rendering/picker-filter.js +68 -0
- package/dist/tui-v2/rendering/picker-filter.js.map +1 -0
- package/dist/tui-v2/rendering/plan-view.d.ts +32 -0
- package/dist/tui-v2/rendering/plan-view.js +196 -0
- package/dist/tui-v2/rendering/plan-view.js.map +1 -0
- package/dist/tui-v2/rendering/render-markdown-lines.d.ts +29 -0
- package/dist/tui-v2/rendering/render-markdown-lines.js +46 -0
- package/dist/tui-v2/rendering/render-markdown-lines.js.map +1 -0
- package/dist/tui-v2/rendering/sanitize-display.d.ts +13 -0
- package/dist/tui-v2/rendering/sanitize-display.js +24 -0
- package/dist/tui-v2/rendering/sanitize-display.js.map +1 -0
- package/dist/tui-v2/rendering/theme.d.ts +67 -0
- package/dist/tui-v2/rendering/theme.js +74 -0
- package/dist/tui-v2/rendering/theme.js.map +1 -0
- package/dist/tui-v2/rendering/tool-presenter.d.ts +39 -0
- package/dist/tui-v2/rendering/tool-presenter.js +207 -0
- package/dist/tui-v2/rendering/tool-presenter.js.map +1 -0
- package/dist/tui-v2/rendering/transcript-export.d.ts +11 -0
- package/dist/tui-v2/rendering/transcript-export.js +18 -0
- package/dist/tui-v2/rendering/transcript-export.js.map +1 -0
- package/dist/tui-v2/rendering/transcript-semantic.d.ts +17 -0
- package/dist/tui-v2/rendering/transcript-semantic.js +67 -0
- package/dist/tui-v2/rendering/transcript-semantic.js.map +1 -0
- package/dist/tui-v2/state/pager-search.d.ts +22 -0
- package/dist/tui-v2/state/pager-search.js +78 -0
- package/dist/tui-v2/state/pager-search.js.map +1 -0
- package/dist/tui-v2/state/semantic-document.d.ts +34 -0
- package/dist/tui-v2/state/semantic-document.js +201 -0
- package/dist/tui-v2/state/semantic-document.js.map +1 -0
- package/dist/tui-v2/state/transcript-compaction.d.ts +24 -0
- package/dist/tui-v2/state/transcript-compaction.js +79 -0
- package/dist/tui-v2/state/transcript-compaction.js.map +1 -0
- package/dist/tui-v2/state/transcript-hydrate.d.ts +27 -0
- package/dist/tui-v2/state/transcript-hydrate.js +272 -0
- package/dist/tui-v2/state/transcript-hydrate.js.map +1 -0
- package/dist/tui-v2/state/transcript-reducer.d.ts +10 -0
- package/dist/tui-v2/state/transcript-reducer.js +281 -0
- package/dist/tui-v2/state/transcript-reducer.js.map +1 -0
- package/dist/tui-v2/state/transcript-search.d.ts +17 -0
- package/dist/tui-v2/state/transcript-search.js +38 -0
- package/dist/tui-v2/state/transcript-search.js.map +1 -0
- package/dist/tui-v2/state/transcript-store.d.ts +32 -0
- package/dist/tui-v2/state/transcript-store.js +66 -0
- package/dist/tui-v2/state/transcript-store.js.map +1 -0
- package/dist/tui-v2/state/transcript-struct.d.ts +15 -0
- package/dist/tui-v2/state/transcript-struct.js +133 -0
- package/dist/tui-v2/state/transcript-struct.js.map +1 -0
- package/dist/tui-v2/state/transcript-types.d.ts +76 -0
- package/dist/tui-v2/state/transcript-types.js +65 -0
- package/dist/tui-v2/state/transcript-types.js.map +1 -0
- package/dist/tui-v2/state/use-overlay.d.ts +3 -0
- package/dist/tui-v2/state/use-overlay.js +6 -0
- package/dist/tui-v2/state/use-overlay.js.map +1 -0
- package/dist/tui-v2/state/use-plan.d.ts +4 -0
- package/dist/tui-v2/state/use-plan.js +6 -0
- package/dist/tui-v2/state/use-plan.js.map +1 -0
- package/dist/tui-v2/state/use-session-state.d.ts +2 -0
- package/dist/tui-v2/state/use-session-state.js +7 -0
- package/dist/tui-v2/state/use-session-state.js.map +1 -0
- package/dist/tui-v2/state/use-toast.d.ts +3 -0
- package/dist/tui-v2/state/use-toast.js +15 -0
- package/dist/tui-v2/state/use-toast.js.map +1 -0
- package/dist/tui-v2/state/use-transcript-store.d.ts +10 -0
- package/dist/tui-v2/state/use-transcript-store.js +12 -0
- package/dist/tui-v2/state/use-transcript-store.js.map +1 -0
- package/dist/ui/intro-card.js +3 -3
- package/dist/ui/intro-card.js.map +1 -1
- package/dist/ui/intro-header.d.ts +23 -0
- package/dist/ui/intro-header.js +232 -0
- package/dist/ui/intro-header.js.map +1 -0
- package/dist/ui/markdown.js +0 -1
- package/dist/ui/markdown.js.map +1 -1
- package/dist/ui/mentions.d.ts +9 -2
- package/dist/ui/mentions.js +102 -4
- package/dist/ui/mentions.js.map +1 -1
- package/dist/ui/output-pane.js +1 -1
- package/dist/ui/output-pane.js.map +1 -1
- package/dist/ui/plan-pane.d.ts +8 -0
- package/dist/ui/plan-pane.js +38 -0
- package/dist/ui/plan-pane.js.map +1 -1
- package/dist/ui/wordmark.d.ts +5 -0
- package/dist/ui/wordmark.js +6 -1
- package/dist/ui/wordmark.js.map +1 -1
- package/package.json +14 -10
- package/dist/tui/App.d.ts +0 -12
- package/dist/tui/App.js +0 -2174
- package/dist/tui/App.js.map +0 -1
- package/dist/tui/components/ConfirmModal.d.ts +0 -9
- package/dist/tui/components/ConfirmModal.js +0 -55
- package/dist/tui/components/ConfirmModal.js.map +0 -1
- package/dist/tui/components/JobsPanel.d.ts +0 -11
- package/dist/tui/components/JobsPanel.js +0 -55
- package/dist/tui/components/JobsPanel.js.map +0 -1
- package/dist/tui/components/Pager.d.ts +0 -14
- package/dist/tui/components/Pager.js +0 -56
- package/dist/tui/components/Pager.js.map +0 -1
- package/dist/tui/components/PickerPanel.d.ts +0 -15
- package/dist/tui/components/PickerPanel.js +0 -126
- package/dist/tui/components/PickerPanel.js.map +0 -1
- package/dist/tui/components/PlanSidebar.d.ts +0 -6
- package/dist/tui/components/PlanSidebar.js +0 -99
- package/dist/tui/components/PlanSidebar.js.map +0 -1
- package/dist/tui/components/SecretInputPanel.d.ts +0 -7
- package/dist/tui/components/SecretInputPanel.js +0 -38
- package/dist/tui/components/SecretInputPanel.js.map +0 -1
- package/dist/tui/confirm.d.ts +0 -16
- package/dist/tui/confirm.js.map +0 -1
- package/dist/tui/default.d.ts +0 -6
- package/dist/tui/default.js +0 -11
- package/dist/tui/default.js.map +0 -1
- package/dist/tui/hooks/useAgentRunner.d.ts +0 -73
- package/dist/tui/hooks/useAgentRunner.js +0 -277
- package/dist/tui/hooks/useAgentRunner.js.map +0 -1
- package/dist/tui/hooks/useJobs.d.ts +0 -7
- package/dist/tui/hooks/useJobs.js +0 -39
- package/dist/tui/hooks/useJobs.js.map +0 -1
- package/dist/tui/hooks/useSpinner.d.ts +0 -5
- package/dist/tui/hooks/useSpinner.js +0 -21
- package/dist/tui/hooks/useSpinner.js.map +0 -1
- package/dist/tui/hooks/useTerminalSize.d.ts +0 -9
- package/dist/tui/hooks/useTerminalSize.js +0 -26
- package/dist/tui/hooks/useTerminalSize.js.map +0 -1
- package/dist/tui/index.d.ts +0 -10
- package/dist/tui/index.js +0 -37
- package/dist/tui/index.js.map +0 -1
- package/dist/tui/key-intent.d.ts +0 -36
- package/dist/tui/key-intent.js +0 -54
- package/dist/tui/key-intent.js.map +0 -1
- package/dist/tui/mouse.d.ts +0 -8
- package/dist/tui/mouse.js +0 -34
- package/dist/tui/mouse.js.map +0 -1
- package/dist/tui/plan-sidebar-lines.d.ts +0 -2
- package/dist/tui/plan-sidebar-lines.js +0 -140
- package/dist/tui/plan-sidebar-lines.js.map +0 -1
- package/dist/tui/render-lines.d.ts +0 -22
- package/dist/tui/render-lines.js +0 -611
- package/dist/tui/render-lines.js.map +0 -1
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse and present tool.batch output as nested sub-tool sections
|
|
3
|
+
* (classic TUI parity).
|
|
4
|
+
*
|
|
5
|
+
* Batch runners emit labeled sections:
|
|
6
|
+
* ── #1 dns.lookup [ok exit=0]
|
|
7
|
+
* …
|
|
8
|
+
* ── #2 web.fetch [fail exit=1]
|
|
9
|
+
* …
|
|
10
|
+
*/
|
|
11
|
+
import { cleanToolOutputLines, presentOutput } from "./tool-presenter.js";
|
|
12
|
+
const HEADER_RE = /^──\s+#(\d+)\s+([\w.]+)\s+\[(ok|fail)(?:\s+exit=(\d+))?\]/;
|
|
13
|
+
/**
|
|
14
|
+
* Split a completed tool.batch output into per-sub-tool sections.
|
|
15
|
+
* Returns [] when the body is not in the labeled batch format.
|
|
16
|
+
*/
|
|
17
|
+
export function parseBatchSections(output) {
|
|
18
|
+
const sections = [];
|
|
19
|
+
let current = null;
|
|
20
|
+
const bodyLines = [];
|
|
21
|
+
for (const line of output.replace(/\r/g, "").split("\n")) {
|
|
22
|
+
const m = HEADER_RE.exec(line);
|
|
23
|
+
if (m) {
|
|
24
|
+
if (current !== null) {
|
|
25
|
+
sections.push({
|
|
26
|
+
...current,
|
|
27
|
+
body: bodyLines.join("\n").trim(),
|
|
28
|
+
});
|
|
29
|
+
bodyLines.length = 0;
|
|
30
|
+
}
|
|
31
|
+
const exitCode = m[4] !== undefined ? parseInt(m[4], 10) : undefined;
|
|
32
|
+
current = {
|
|
33
|
+
index: parseInt(m[1], 10),
|
|
34
|
+
name: m[2],
|
|
35
|
+
ok: m[3] === "ok",
|
|
36
|
+
exitCode: Number.isFinite(exitCode) ? exitCode : undefined,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
else if (current !== null) {
|
|
40
|
+
bodyLines.push(line);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (current !== null) {
|
|
44
|
+
sections.push({
|
|
45
|
+
...current,
|
|
46
|
+
body: bodyLines.join("\n").trim(),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return sections;
|
|
50
|
+
}
|
|
51
|
+
/** Present one nested sub-tool for the card (collapsed head/tail or full). */
|
|
52
|
+
export function presentBatchSection(section, expanded) {
|
|
53
|
+
const presented = presentOutput(section.body, undefined, expanded);
|
|
54
|
+
// Prefer cleaned body even when presentOutput samples ends for huge text.
|
|
55
|
+
const hasBody = section.body.trim().length > 0;
|
|
56
|
+
return {
|
|
57
|
+
glyph: section.ok ? "✓" : "✗",
|
|
58
|
+
statusLabel: section.ok
|
|
59
|
+
? section.exitCode !== undefined
|
|
60
|
+
? `done (exit ${section.exitCode})`
|
|
61
|
+
: "done"
|
|
62
|
+
: section.exitCode !== undefined
|
|
63
|
+
? `failed (exit ${section.exitCode})`
|
|
64
|
+
: "failed",
|
|
65
|
+
name: section.name,
|
|
66
|
+
lines: hasBody ? presented.lines : [],
|
|
67
|
+
hiddenAboveCount: presented.hiddenAboveCount,
|
|
68
|
+
hasBody,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** Human summary line under the parent batch header. */
|
|
72
|
+
export function batchSummaryLine(sections) {
|
|
73
|
+
if (sections.length === 0)
|
|
74
|
+
return "";
|
|
75
|
+
const failed = sections.filter((s) => !s.ok).length;
|
|
76
|
+
if (failed === 0) {
|
|
77
|
+
return `${sections.length} sub-tool(s) — all ok`;
|
|
78
|
+
}
|
|
79
|
+
return `${failed}/${sections.length} sub-tool(s) failed`;
|
|
80
|
+
}
|
|
81
|
+
/** True when this tool item should use nested batch UI. */
|
|
82
|
+
export function isBatchToolName(name) {
|
|
83
|
+
return name === "tool.batch";
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Rebuild a single section as a labeled block for the pager (matches
|
|
87
|
+
* runner formatting so the full-batch view stays familiar).
|
|
88
|
+
*/
|
|
89
|
+
export function formatBatchSectionForPager(section) {
|
|
90
|
+
const status = section.ok ? "ok" : "fail";
|
|
91
|
+
const exit = section.exitCode !== undefined ? ` exit=${section.exitCode}` : "";
|
|
92
|
+
const head = `── #${section.index} ${section.name} [${status}${exit}]`;
|
|
93
|
+
const body = section.body.trim();
|
|
94
|
+
return body ? `${head}\n${body}` : head;
|
|
95
|
+
}
|
|
96
|
+
/** Full batch body for the parent pager — prefer original spool order. */
|
|
97
|
+
export function formatBatchForPager(sections, raw) {
|
|
98
|
+
if (sections.length === 0)
|
|
99
|
+
return raw;
|
|
100
|
+
// Prefer the raw spool so nothing is lost; fall back to reassembly.
|
|
101
|
+
if (raw.trim().length > 0)
|
|
102
|
+
return raw;
|
|
103
|
+
return sections.map(formatBatchSectionForPager).join("\n\n");
|
|
104
|
+
}
|
|
105
|
+
/** Preview helper used by tests — clean lines without expand sampling. */
|
|
106
|
+
export function cleanBatchBodyLines(body) {
|
|
107
|
+
return cleanToolOutputLines(body);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=batch-sections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-sections.js","sourceRoot":"","sources":["../../../src/tui-v2/rendering/batch-sections.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure URL/file-path span detector (SEL/CHAT "clickable links/file paths").
|
|
3
|
+
*
|
|
4
|
+
* Renderer-independent so components decorate text without each one
|
|
5
|
+
* reimplementing the regexes, and so the detection rules are unit-testable
|
|
6
|
+
* without mounting a terminal.
|
|
7
|
+
*/
|
|
8
|
+
export type LinkKind = "url" | "path";
|
|
9
|
+
export interface LinkSpan {
|
|
10
|
+
readonly kind: LinkKind;
|
|
11
|
+
readonly start: number;
|
|
12
|
+
readonly end: number;
|
|
13
|
+
readonly value: string;
|
|
14
|
+
}
|
|
15
|
+
/** Detects URLs first, then file paths in the remaining, non-overlapping text. */
|
|
16
|
+
export declare function detectLinks(text: string): LinkSpan[];
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure URL/file-path span detector (SEL/CHAT "clickable links/file paths").
|
|
3
|
+
*
|
|
4
|
+
* Renderer-independent so components decorate text without each one
|
|
5
|
+
* reimplementing the regexes, and so the detection rules are unit-testable
|
|
6
|
+
* without mounting a terminal.
|
|
7
|
+
*/
|
|
8
|
+
const URL_RE = /https?:\/\/[^\s<>"')\]]+/g;
|
|
9
|
+
// Heuristic: a `~/`, `./`, `../`, or absolute `/` prefix, path segments, and a
|
|
10
|
+
// final segment with an extension; optional `:line[:col]` for editor jumps.
|
|
11
|
+
const PATH_RE = /(?:~\/|\.{1,2}\/|\/)[\w.\-/]*[\w-]+\.\w+(?::\d+(?::\d+)?)?/g;
|
|
12
|
+
const TRAILING_PUNCTUATION = /[.,;:!?)\]'"]+$/;
|
|
13
|
+
function trimTrailing(value) {
|
|
14
|
+
return value.replace(TRAILING_PUNCTUATION, "");
|
|
15
|
+
}
|
|
16
|
+
function overlaps(spans, start, end) {
|
|
17
|
+
return spans.some((s) => start < s.end && end > s.start);
|
|
18
|
+
}
|
|
19
|
+
/** Detects URLs first, then file paths in the remaining, non-overlapping text. */
|
|
20
|
+
export function detectLinks(text) {
|
|
21
|
+
const spans = [];
|
|
22
|
+
for (const match of text.matchAll(URL_RE)) {
|
|
23
|
+
const start = match.index ?? 0;
|
|
24
|
+
const raw = match[0];
|
|
25
|
+
const trimmed = trimTrailing(raw);
|
|
26
|
+
if (!trimmed)
|
|
27
|
+
continue;
|
|
28
|
+
spans.push({ kind: "url", start, end: start + trimmed.length, value: trimmed });
|
|
29
|
+
}
|
|
30
|
+
for (const match of text.matchAll(PATH_RE)) {
|
|
31
|
+
const start = match.index ?? 0;
|
|
32
|
+
const raw = match[0];
|
|
33
|
+
const trimmed = trimTrailing(raw);
|
|
34
|
+
if (!trimmed)
|
|
35
|
+
continue;
|
|
36
|
+
const end = start + trimmed.length;
|
|
37
|
+
if (overlaps(spans, start, end))
|
|
38
|
+
continue;
|
|
39
|
+
spans.push({ kind: "path", start, end, value: trimmed });
|
|
40
|
+
}
|
|
41
|
+
return spans.sort((a, b) => a.start - b.start);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=link-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-detector.js","sourceRoot":"","sources":["../../../src/tui-v2/rendering/link-detector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,MAAM,MAAM,GAAG,2BAA2B,CAAC;AAC3C,+EAA+E;AAC/E,4EAA4E;AAC5E,MAAM,OAAO,GAAG,6DAA6D,CAAC;AAC9E,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAE/C,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,QAAQ,CAAC,KAA0B,EAAE,KAAa,EAAE,GAAW;IACtE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,KAAK,GAAe,EAAE,CAAC;IAE7B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,GAAG,GAAG,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;QACnC,IAAI,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;YAAE,SAAS;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Open full tool output in the pager modal (scroll + search + Esc/q).
|
|
3
|
+
* Prefers the on-disk artifact, then the unbounded spool. Never re-truncates.
|
|
4
|
+
*
|
|
5
|
+
* Bodies that are pure JSON get pretty-printed so web.search dumps aren't
|
|
6
|
+
* one messy minified blob.
|
|
7
|
+
*/
|
|
8
|
+
import type { AppServices } from "../bootstrap/composition-root.js";
|
|
9
|
+
import type { ToolItem } from "../state/transcript-types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Prefer a human-readable hit list for web.search-style payloads.
|
|
12
|
+
* Falls back to pretty JSON, then the raw text.
|
|
13
|
+
*/
|
|
14
|
+
export declare function formatToolPagerBody(raw: string): string;
|
|
15
|
+
/** Short, stable title: `web.search · output` (args live in the body header). */
|
|
16
|
+
export declare function toolPagerTitle(name: string, argsDisplay: string | undefined): string;
|
|
17
|
+
export interface OpenToolOutputOptions {
|
|
18
|
+
/**
|
|
19
|
+
* When set, use this body instead of spool/artifact (e.g. one tool.batch
|
|
20
|
+
* sub-section). Title still comes from `item`.
|
|
21
|
+
*/
|
|
22
|
+
readonly bodyOverride?: string;
|
|
23
|
+
/** Override the pager title (defaults to toolPagerTitle). */
|
|
24
|
+
readonly titleOverride?: string;
|
|
25
|
+
/** Skip artifact lookup even if item.artifactPath is set. */
|
|
26
|
+
readonly skipArtifact?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare function openToolOutputPager(services: AppServices, item: Pick<ToolItem, "toolCallId" | "name" | "argsDisplay" | "artifactPath">, options?: OpenToolOutputOptions): Promise<void>;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Open full tool output in the pager modal (scroll + search + Esc/q).
|
|
3
|
+
* Prefers the on-disk artifact, then the unbounded spool. Never re-truncates.
|
|
4
|
+
*
|
|
5
|
+
* Bodies that are pure JSON get pretty-printed so web.search dumps aren't
|
|
6
|
+
* one messy minified blob.
|
|
7
|
+
*/
|
|
8
|
+
import { readFile } from "node:fs/promises";
|
|
9
|
+
import { asToolCallId } from "../../app/events/app-event.js";
|
|
10
|
+
/**
|
|
11
|
+
* Prefer a human-readable hit list for web.search-style payloads.
|
|
12
|
+
* Falls back to pretty JSON, then the raw text.
|
|
13
|
+
*/
|
|
14
|
+
export function formatToolPagerBody(raw) {
|
|
15
|
+
const trimmed = raw.trim();
|
|
16
|
+
if (!trimmed)
|
|
17
|
+
return raw;
|
|
18
|
+
// Optional one-line summary above a JSON block:
|
|
19
|
+
// duckduckgo: 5 results
|
|
20
|
+
// { "results": [ ... ] }
|
|
21
|
+
let prefix = "";
|
|
22
|
+
let jsonText = trimmed;
|
|
23
|
+
const firstBrace = trimmed.search(/[{\[]/);
|
|
24
|
+
if (firstBrace > 0) {
|
|
25
|
+
prefix = trimmed.slice(0, firstBrace).trimEnd();
|
|
26
|
+
jsonText = trimmed.slice(firstBrace).trim();
|
|
27
|
+
}
|
|
28
|
+
if (jsonText[0] !== "{" && jsonText[0] !== "[")
|
|
29
|
+
return raw;
|
|
30
|
+
try {
|
|
31
|
+
const parsed = JSON.parse(jsonText);
|
|
32
|
+
const hits = extractSearchHits(parsed);
|
|
33
|
+
if (hits && hits.length > 0) {
|
|
34
|
+
const head = prefix || `${hits.length} result${hits.length === 1 ? "" : "s"}`;
|
|
35
|
+
const blocks = hits.map((hit, i) => {
|
|
36
|
+
const title = (hit.title || "(no title)").trim();
|
|
37
|
+
const url = (hit.url || "").trim();
|
|
38
|
+
const snippet = (hit.snippet || "").trim().replace(/\s+/g, " ");
|
|
39
|
+
const lines = [`${i + 1}. ${title}`];
|
|
40
|
+
if (url)
|
|
41
|
+
lines.push(` ${url}`);
|
|
42
|
+
if (snippet)
|
|
43
|
+
lines.push(` ${snippet}`);
|
|
44
|
+
return lines.join("\n");
|
|
45
|
+
});
|
|
46
|
+
return `${head}\n\n${blocks.join("\n\n")}`;
|
|
47
|
+
}
|
|
48
|
+
// Generic JSON — pretty-print only.
|
|
49
|
+
const pretty = JSON.stringify(parsed, null, 2);
|
|
50
|
+
return prefix ? `${prefix}\n\n${pretty}` : pretty;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return raw;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function extractSearchHits(parsed) {
|
|
57
|
+
if (!parsed || typeof parsed !== "object")
|
|
58
|
+
return undefined;
|
|
59
|
+
const obj = parsed;
|
|
60
|
+
if (!Array.isArray(obj.results))
|
|
61
|
+
return undefined;
|
|
62
|
+
const hits = [];
|
|
63
|
+
for (const entry of obj.results) {
|
|
64
|
+
if (!entry || typeof entry !== "object")
|
|
65
|
+
continue;
|
|
66
|
+
const e = entry;
|
|
67
|
+
if (typeof e.title !== "string" && typeof e.url !== "string")
|
|
68
|
+
continue;
|
|
69
|
+
hits.push({
|
|
70
|
+
title: typeof e.title === "string" ? e.title : undefined,
|
|
71
|
+
url: typeof e.url === "string" ? e.url : undefined,
|
|
72
|
+
snippet: typeof e.snippet === "string" ? e.snippet : undefined,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return hits.length > 0 ? hits : undefined;
|
|
76
|
+
}
|
|
77
|
+
/** Short, stable title: `web.search · output` (args live in the body header). */
|
|
78
|
+
export function toolPagerTitle(name, argsDisplay) {
|
|
79
|
+
if (!argsDisplay)
|
|
80
|
+
return `${name} · output`;
|
|
81
|
+
// Keep the query readable but don't let it double as a second title line.
|
|
82
|
+
const short = argsDisplay.length > 48 ? `${argsDisplay.slice(0, 45)}…` : argsDisplay;
|
|
83
|
+
return `${name} · ${short}`;
|
|
84
|
+
}
|
|
85
|
+
export async function openToolOutputPager(services, item, options = {}) {
|
|
86
|
+
try {
|
|
87
|
+
let body;
|
|
88
|
+
let fromArtifact = false;
|
|
89
|
+
if (options.bodyOverride !== undefined) {
|
|
90
|
+
body = options.bodyOverride;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
const spoolTail = services.session.spool.tail(asToolCallId(item.toolCallId));
|
|
94
|
+
body = spoolTail;
|
|
95
|
+
if (item.artifactPath && !options.skipArtifact) {
|
|
96
|
+
try {
|
|
97
|
+
const full = await readFile(item.artifactPath, "utf8");
|
|
98
|
+
if (full.length >= body.length) {
|
|
99
|
+
body = full;
|
|
100
|
+
fromArtifact = true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// Fall back to spool.
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
body = body
|
|
109
|
+
.replace(/^(ok|failed)\n/gm, "")
|
|
110
|
+
.replace(/^full output saved to .+\n?/gim, "")
|
|
111
|
+
.replace(/^artifact: .+\n?/gim, "")
|
|
112
|
+
.trimEnd();
|
|
113
|
+
body = formatToolPagerBody(body);
|
|
114
|
+
// Optional one-line query header so the border title can stay short.
|
|
115
|
+
let header = "";
|
|
116
|
+
if (options.bodyOverride === undefined &&
|
|
117
|
+
item.argsDisplay &&
|
|
118
|
+
item.argsDisplay.length > 0) {
|
|
119
|
+
const label = item.name === "shell.exec" ? "command" : "query";
|
|
120
|
+
header = `${label}: ${item.argsDisplay}\n\n`;
|
|
121
|
+
}
|
|
122
|
+
let note = "";
|
|
123
|
+
if (item.artifactPath && options.bodyOverride === undefined) {
|
|
124
|
+
note =
|
|
125
|
+
`\n\n── full output saved at ──\n${item.artifactPath}` +
|
|
126
|
+
(fromArtifact ? "" : "\n(spool body; artifact unreadable)");
|
|
127
|
+
}
|
|
128
|
+
const title = options.titleOverride ?? toolPagerTitle(item.name, item.argsDisplay);
|
|
129
|
+
const opened = services.overlay.openPager(title, `${header}${body || "(no output)"}${note}`);
|
|
130
|
+
if (!opened) {
|
|
131
|
+
services.session.notice("warn", "could not open output pager (another overlay is open)");
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
services.session.notice("warn", `failed to open tool output: ${err instanceof Error ? err.message : String(err)}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=open-tool-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-tool-output.js","sourceRoot":"","sources":["../../../src/tui-v2/rendering/open-tool-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure fuzzy-search ranking for the generic picker (PICK-001, V2-071).
|
|
3
|
+
*
|
|
4
|
+
* Ranks by subsequence span: every query character must appear in order, not
|
|
5
|
+
* necessarily consecutively, and a tighter span (matched characters packed
|
|
6
|
+
* closer together) ranks higher. Ported from the classic TUI's PickerPanel so
|
|
7
|
+
* both frontends agree on match behavior; kept renderer-independent here so it
|
|
8
|
+
* is unit-testable without mounting a component.
|
|
9
|
+
*/
|
|
10
|
+
export interface PickerOption {
|
|
11
|
+
readonly value: string;
|
|
12
|
+
readonly label: string;
|
|
13
|
+
readonly description?: string | undefined;
|
|
14
|
+
readonly active?: boolean | undefined;
|
|
15
|
+
}
|
|
16
|
+
export interface PickerFilterOptions {
|
|
17
|
+
readonly searchDescription?: boolean | undefined;
|
|
18
|
+
}
|
|
19
|
+
/** Filters and ranks options by `query`; empty query returns options unchanged. */
|
|
20
|
+
export declare function filterPickerOptions(options: readonly PickerOption[], query: string, filterOptions?: PickerFilterOptions): PickerOption[];
|
|
21
|
+
/** Index of the active option within `options`, or 0 if none is active. */
|
|
22
|
+
export declare function activeIndex(options: readonly PickerOption[]): number;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure fuzzy-search ranking for the generic picker (PICK-001, V2-071).
|
|
3
|
+
*
|
|
4
|
+
* Ranks by subsequence span: every query character must appear in order, not
|
|
5
|
+
* necessarily consecutively, and a tighter span (matched characters packed
|
|
6
|
+
* closer together) ranks higher. Ported from the classic TUI's PickerPanel so
|
|
7
|
+
* both frontends agree on match behavior; kept renderer-independent here so it
|
|
8
|
+
* is unit-testable without mounting a component.
|
|
9
|
+
*/
|
|
10
|
+
function subsequenceSpan(needle, text) {
|
|
11
|
+
let j = 0;
|
|
12
|
+
let firstIdx = -1;
|
|
13
|
+
let lastIdx = -1;
|
|
14
|
+
for (let i = 0; i < text.length && j < needle.length; i += 1) {
|
|
15
|
+
if (text[i] === needle[j]) {
|
|
16
|
+
if (firstIdx === -1)
|
|
17
|
+
firstIdx = i;
|
|
18
|
+
lastIdx = i;
|
|
19
|
+
j += 1;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return j === needle.length ? lastIdx - firstIdx : null;
|
|
23
|
+
}
|
|
24
|
+
function bestFieldScore(option, needle, searchDescription) {
|
|
25
|
+
const fields = [option.label, option.value];
|
|
26
|
+
if (searchDescription && option.description)
|
|
27
|
+
fields.push(option.description);
|
|
28
|
+
let best;
|
|
29
|
+
const seen = new Set();
|
|
30
|
+
for (let rank = 0; rank < fields.length; rank += 1) {
|
|
31
|
+
const field = fields[rank].toLowerCase();
|
|
32
|
+
if (seen.has(field))
|
|
33
|
+
continue;
|
|
34
|
+
seen.add(field);
|
|
35
|
+
const span = subsequenceSpan(needle, field);
|
|
36
|
+
if (span === null)
|
|
37
|
+
continue;
|
|
38
|
+
let score = span + rank * 10_000;
|
|
39
|
+
if (field.startsWith(needle))
|
|
40
|
+
score -= 1_000_000;
|
|
41
|
+
else if (field.includes(needle))
|
|
42
|
+
score -= 500_000;
|
|
43
|
+
if (best === undefined || score < best)
|
|
44
|
+
best = score;
|
|
45
|
+
}
|
|
46
|
+
return best;
|
|
47
|
+
}
|
|
48
|
+
/** Filters and ranks options by `query`; empty query returns options unchanged. */
|
|
49
|
+
export function filterPickerOptions(options, query, filterOptions = {}) {
|
|
50
|
+
const needle = query.trim().toLowerCase().replace(/\s+/g, "");
|
|
51
|
+
if (!needle)
|
|
52
|
+
return [...options];
|
|
53
|
+
const searchDescription = filterOptions.searchDescription ?? true;
|
|
54
|
+
const scored = [];
|
|
55
|
+
for (const option of options) {
|
|
56
|
+
const score = bestFieldScore(option, needle, searchDescription);
|
|
57
|
+
if (score !== undefined)
|
|
58
|
+
scored.push({ option, score });
|
|
59
|
+
}
|
|
60
|
+
scored.sort((a, b) => a.score - b.score);
|
|
61
|
+
return scored.map((entry) => entry.option);
|
|
62
|
+
}
|
|
63
|
+
/** Index of the active option within `options`, or 0 if none is active. */
|
|
64
|
+
export function activeIndex(options) {
|
|
65
|
+
const index = options.findIndex((option) => option.active);
|
|
66
|
+
return Math.max(0, index);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=picker-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picker-filter.js","sourceRoot":"","sources":["../../../src/tui-v2/rendering/picker-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure display helpers for the plan pane + Ctrl+P pager body (PLAN-001, V2-070).
|
|
3
|
+
*/
|
|
4
|
+
import type { PlanStatus, PlanTask, SessionPlan, TaskState } from "../../store/plan.js";
|
|
5
|
+
export interface PlanProgressView {
|
|
6
|
+
readonly done: number;
|
|
7
|
+
readonly total: number;
|
|
8
|
+
/** Single compact label, e.g. "8/8 complete" — no bar, no duplication. */
|
|
9
|
+
readonly label: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const TASK_GLYPH: Record<TaskState, string>;
|
|
12
|
+
export declare const TASK_STATE_LABEL: Record<TaskState, string>;
|
|
13
|
+
export declare const STATUS_LABEL: Record<PlanStatus, string>;
|
|
14
|
+
export type PlanColorToken = "muted" | "foreground" | "accent" | "success" | "activity" | "cyan" | "magenta" | "mode";
|
|
15
|
+
export declare function planStatusColor(status: PlanStatus): PlanColorToken;
|
|
16
|
+
export declare function taskStateColor(state: TaskState): PlanColorToken;
|
|
17
|
+
export declare function progressView(plan: SessionPlan): PlanProgressView;
|
|
18
|
+
export declare function taskLabel(task: PlanTask): string;
|
|
19
|
+
export declare function activeTaskId(plan: SessionPlan): string | undefined;
|
|
20
|
+
/** Soft-wrap without ellipsis — full text, never truncated. */
|
|
21
|
+
export declare function wrapPlanText(text: string, width: number): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Strip redundant `t1:` / `t1 -` prefixes when the model baked the task id
|
|
24
|
+
* into the title (keeps the pager readable).
|
|
25
|
+
*/
|
|
26
|
+
export declare function cleanTaskTitle(task: PlanTask): string;
|
|
27
|
+
/**
|
|
28
|
+
* Full plan body for the OpenTUI pager (Ctrl+P / /plan).
|
|
29
|
+
* Plain text only — no chalk/ANSI (those look messy in the pager).
|
|
30
|
+
* Tasks are card-like blocks with clear rules between them.
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatPlanPagerDocument(plan: SessionPlan): string;
|