@pentoshi/clai 2.0.62 → 3.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/README.md +262 -368
- package/dist/agent/classic-renderer.js +9 -1
- package/dist/agent/classic-renderer.js.map +1 -1
- 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 +9 -1
- package/dist/agent/plan-tool.js +80 -8
- package/dist/agent/plan-tool.js.map +1 -1
- package/dist/agent/runner.js +261 -122
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/tool-call-parser.d.ts +20 -0
- package/dist/agent/tool-call-parser.js +186 -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 +148 -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 +122 -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 +19 -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 +47 -12
- 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 +11 -8
- 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/fs.d.ts +6 -0
- package/dist/tools/fs.js +56 -6
- package/dist/tools/fs.js.map +1 -1
- package/dist/tools/jobs.js +2 -2
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/registry.js +189 -67
- 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/runtime.d.ts +19 -0
- package/dist/tui/runtime.js +92 -0
- package/dist/tui/runtime.js.map +1 -0
- package/dist/tui/state.js +22 -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 +332 -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 +22 -0
- package/dist/tui-v2/app/plan-lifecycle.js +95 -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 +20 -0
- package/dist/tui-v2/components/modal/confirm-modal.js +110 -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 +18 -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 +26 -0
- package/dist/tui-v2/components/overlay/overlay-host.js +43 -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 +120 -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 +167 -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 +41 -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 +69 -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 +205 -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 +37 -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 +57 -0
- package/dist/tui-v2/rendering/batch-sections.js +177 -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/strip-tool-surfaces.d.ts +10 -0
- package/dist/tui-v2/rendering/strip-tool-surfaces.js +32 -0
- package/dist/tui-v2/rendering/strip-tool-surfaces.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 +209 -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 +276 -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 +339 -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 +25 -12
- 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,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure presentation logic for tool cards (CHAT-004/005, V2-054/055).
|
|
3
|
+
*
|
|
4
|
+
* Collapsed cards must stay cheap even when the spool holds multi‑MB output
|
|
5
|
+
* (no full-string split on every render). Full bodies open in the pager.
|
|
6
|
+
*/
|
|
7
|
+
import { sanitizeDisplayText } from "./sanitize-display.js";
|
|
8
|
+
const STATUS_GLYPH = {
|
|
9
|
+
queued: "○",
|
|
10
|
+
running: "●",
|
|
11
|
+
ok: "✓",
|
|
12
|
+
failed: "✗",
|
|
13
|
+
blocked: "⊘",
|
|
14
|
+
};
|
|
15
|
+
const STATUS_LABEL = {
|
|
16
|
+
queued: "queued",
|
|
17
|
+
running: "running",
|
|
18
|
+
ok: "done",
|
|
19
|
+
failed: "failed",
|
|
20
|
+
blocked: "blocked",
|
|
21
|
+
};
|
|
22
|
+
export function presentTool(item) {
|
|
23
|
+
const argsLabel = item.argsDisplay
|
|
24
|
+
? item.name === "shell.exec"
|
|
25
|
+
? "command"
|
|
26
|
+
: "input"
|
|
27
|
+
: undefined;
|
|
28
|
+
let detail;
|
|
29
|
+
if (item.status === "blocked") {
|
|
30
|
+
detail = item.reason;
|
|
31
|
+
}
|
|
32
|
+
else if (item.status === "failed" && item.summary) {
|
|
33
|
+
const short = item.summary.split("\n")[0]?.trim();
|
|
34
|
+
if (short && short.length <= 120 && !/^Full output saved/i.test(short)) {
|
|
35
|
+
detail = short;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const statusLabel = item.exitCode !== undefined
|
|
39
|
+
? `${STATUS_LABEL[item.status]} (exit ${item.exitCode})`
|
|
40
|
+
: STATUS_LABEL[item.status];
|
|
41
|
+
return {
|
|
42
|
+
glyph: STATUS_GLYPH[item.status],
|
|
43
|
+
statusLabel,
|
|
44
|
+
name: item.name,
|
|
45
|
+
argsLabel,
|
|
46
|
+
argsDisplay: item.argsDisplay || undefined,
|
|
47
|
+
detail,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const COLLAPSED_HEAD_LINES = 4;
|
|
51
|
+
const COLLAPSED_TAIL_LINES = 4;
|
|
52
|
+
/**
|
|
53
|
+
* Expanded (Ctrl+O) shows the full cleaned body. Safety caps only kick in for
|
|
54
|
+
* multi‑MB spools so the TUI never tries to mount millions of lines.
|
|
55
|
+
*/
|
|
56
|
+
const EXPANDED_SAFE_CHARS = 400_000;
|
|
57
|
+
const EXPANDED_SAFE_LINES = 4_000;
|
|
58
|
+
/** Chars to sample from each end when collapsing huge spool bodies. */
|
|
59
|
+
const SAMPLE_CHARS = 4_000;
|
|
60
|
+
/** Soft wrap budget for a single preview line in the card (pager has full width). */
|
|
61
|
+
const PREVIEW_LINE_CHARS = 96;
|
|
62
|
+
/** Slightly wider when expanded so more of each line stays inside the border. */
|
|
63
|
+
const EXPANDED_LINE_CHARS = 120;
|
|
64
|
+
function formatBytes(bytes) {
|
|
65
|
+
if (bytes < 1024)
|
|
66
|
+
return `${bytes}B`;
|
|
67
|
+
if (bytes < 1024 * 1024)
|
|
68
|
+
return `${(bytes / 1024).toFixed(1)}KB`;
|
|
69
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
|
|
70
|
+
}
|
|
71
|
+
function isSpoolNoiseLine(line) {
|
|
72
|
+
const t = line.trim();
|
|
73
|
+
if (!t)
|
|
74
|
+
return false;
|
|
75
|
+
if (t === "ok" || t === "failed" || t === "✓" || t === "✗")
|
|
76
|
+
return true;
|
|
77
|
+
if (/^full output saved to\b/i.test(t))
|
|
78
|
+
return true;
|
|
79
|
+
if (/^Full output saved to:\s*/i.test(t))
|
|
80
|
+
return true;
|
|
81
|
+
if (/^\.\.\. full output saved to\b/i.test(t))
|
|
82
|
+
return true;
|
|
83
|
+
if (/^\.\.\. live preview truncated/i.test(t))
|
|
84
|
+
return true;
|
|
85
|
+
if (/^\(tool still running/i.test(t))
|
|
86
|
+
return true;
|
|
87
|
+
if (t === "...")
|
|
88
|
+
return true;
|
|
89
|
+
if (/^artifact:\s+/i.test(t))
|
|
90
|
+
return true;
|
|
91
|
+
// tool.batch progress heartbeats (live only; final body replaces spool).
|
|
92
|
+
if (/^\[batch\]\b/i.test(t))
|
|
93
|
+
return true;
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Sample start+end of a huge string so we never `.split("\n")` a multi‑MB body
|
|
98
|
+
* just to draw a collapsed card.
|
|
99
|
+
*/
|
|
100
|
+
export function sampleEnds(raw, eachEnd = SAMPLE_CHARS) {
|
|
101
|
+
if (raw.length <= eachEnd * 2)
|
|
102
|
+
return raw;
|
|
103
|
+
return `${raw.slice(0, eachEnd)}\n…\n${raw.slice(-eachEnd)}`;
|
|
104
|
+
}
|
|
105
|
+
function roughLineCount(raw) {
|
|
106
|
+
if (!raw)
|
|
107
|
+
return 0;
|
|
108
|
+
let n = 1;
|
|
109
|
+
for (let i = 0; i < raw.length; i += 1) {
|
|
110
|
+
if (raw.charCodeAt(i) === 10)
|
|
111
|
+
n += 1;
|
|
112
|
+
}
|
|
113
|
+
return n;
|
|
114
|
+
}
|
|
115
|
+
/** Soft-clip a single preview line so long rows never paint past the card border. */
|
|
116
|
+
function clipPreviewLine(line, maxChars) {
|
|
117
|
+
if (line.length <= maxChars)
|
|
118
|
+
return line;
|
|
119
|
+
return `${line.slice(0, maxChars - 1)}…`;
|
|
120
|
+
}
|
|
121
|
+
export function cleanToolOutputLines(raw, options = {}) {
|
|
122
|
+
const maxLineChars = options.maxLineChars ?? PREVIEW_LINE_CHARS;
|
|
123
|
+
const safe = sanitizeDisplayText(raw);
|
|
124
|
+
if (safe.length === 0)
|
|
125
|
+
return [];
|
|
126
|
+
const out = [];
|
|
127
|
+
let lastKept;
|
|
128
|
+
for (const line of safe.split("\n")) {
|
|
129
|
+
if (isSpoolNoiseLine(line))
|
|
130
|
+
continue;
|
|
131
|
+
if (line.trim() === "" && (out.length === 0 || lastKept === ""))
|
|
132
|
+
continue;
|
|
133
|
+
if (line === lastKept)
|
|
134
|
+
continue;
|
|
135
|
+
// Prefer human-readable markdown link titles in the compact card:
|
|
136
|
+
// [Liz Truss](https://…) → Liz Truss
|
|
137
|
+
const deLinked = line.replace(/\[([^\]]+)\]\([^)]+\)/g, "$1");
|
|
138
|
+
out.push(clipPreviewLine(deLinked, maxLineChars));
|
|
139
|
+
lastKept = line;
|
|
140
|
+
}
|
|
141
|
+
while (out.length > 0 && out[out.length - 1].trim() === "")
|
|
142
|
+
out.pop();
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Card body presentation.
|
|
147
|
+
*
|
|
148
|
+
* Collapsed: head + tail with a mid-body “··· N lines more ···” gap so the end
|
|
149
|
+
* of streaming output stays visible. Expanded (Ctrl+O): full cleaned body in
|
|
150
|
+
* place (classic parity). The unbounded raw body always lives in the spool /
|
|
151
|
+
* artifact and the click-to-open pager modal.
|
|
152
|
+
*/
|
|
153
|
+
export function presentOutput(tail, state, expanded) {
|
|
154
|
+
const totalLines = roughLineCount(tail);
|
|
155
|
+
const truncatedNotice = state?.truncated
|
|
156
|
+
? `output truncated in memory (${formatBytes(state.droppedBytes)} dropped; full output saved to disk)`
|
|
157
|
+
: undefined;
|
|
158
|
+
if (expanded) {
|
|
159
|
+
// Full in-place body. Only sample when the spool is pathologically large.
|
|
160
|
+
const source = tail.length <= EXPANDED_SAFE_CHARS
|
|
161
|
+
? tail
|
|
162
|
+
: sampleEnds(tail, Math.floor(EXPANDED_SAFE_CHARS / 2));
|
|
163
|
+
const cleaned = cleanToolOutputLines(source, {
|
|
164
|
+
maxLineChars: EXPANDED_LINE_CHARS,
|
|
165
|
+
});
|
|
166
|
+
if (cleaned.length <= EXPANDED_SAFE_LINES) {
|
|
167
|
+
const hidden = source !== tail
|
|
168
|
+
? Math.max(0, totalLines - cleaned.length)
|
|
169
|
+
: 0;
|
|
170
|
+
return { lines: cleaned, hiddenAboveCount: hidden, truncatedNotice };
|
|
171
|
+
}
|
|
172
|
+
// Extreme line counts: keep head+tail so the UI stays responsive.
|
|
173
|
+
const head = cleaned.slice(0, COLLAPSED_HEAD_LINES);
|
|
174
|
+
const visibleTail = cleaned.slice(-COLLAPSED_TAIL_LINES);
|
|
175
|
+
const hiddenAboveCount = Math.max(0, cleaned.length - COLLAPSED_HEAD_LINES - COLLAPSED_TAIL_LINES);
|
|
176
|
+
return {
|
|
177
|
+
lines: [...head, `··· ${hiddenAboveCount} lines more · open pager ···`, ...visibleTail],
|
|
178
|
+
hiddenAboveCount,
|
|
179
|
+
truncatedNotice,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
// Collapsed: cheap sample + head/tail preview.
|
|
183
|
+
const source = sampleEnds(tail, SAMPLE_CHARS);
|
|
184
|
+
const cleaned = cleanToolOutputLines(source, {
|
|
185
|
+
maxLineChars: PREVIEW_LINE_CHARS,
|
|
186
|
+
});
|
|
187
|
+
const headCount = COLLAPSED_HEAD_LINES;
|
|
188
|
+
const tailCount = COLLAPSED_TAIL_LINES;
|
|
189
|
+
const budget = headCount + tailCount;
|
|
190
|
+
let lines;
|
|
191
|
+
let hiddenAboveCount = 0;
|
|
192
|
+
if (cleaned.length <= budget) {
|
|
193
|
+
lines = cleaned;
|
|
194
|
+
if (source !== tail && totalLines > cleaned.length) {
|
|
195
|
+
hiddenAboveCount = Math.max(0, totalLines - cleaned.length);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
const head = cleaned.slice(0, headCount);
|
|
200
|
+
const visibleTail = cleaned.slice(-tailCount);
|
|
201
|
+
hiddenAboveCount = Math.max(totalLines - headCount - tailCount, cleaned.length - headCount - tailCount);
|
|
202
|
+
lines =
|
|
203
|
+
hiddenAboveCount > 0
|
|
204
|
+
? [...head, `··· ${hiddenAboveCount} lines more ···`, ...visibleTail]
|
|
205
|
+
: [...head, ...visibleTail];
|
|
206
|
+
}
|
|
207
|
+
return { lines, hiddenAboveCount, truncatedNotice };
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=tool-presenter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-presenter.js","sourceRoot":"","sources":["../../../src/tui-v2/rendering/tool-presenter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plain-text transcript export (V2-057 / V2-094).
|
|
3
|
+
*
|
|
4
|
+
* Source-order semantic text plus redaction and display sanitize so exports
|
|
5
|
+
* never ship raw API-key shapes or terminal control sequences.
|
|
6
|
+
*/
|
|
7
|
+
import type { TranscriptState } from "../state/transcript-types.js";
|
|
8
|
+
export interface TranscriptExportOptions {
|
|
9
|
+
readonly includeThinking?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function renderTranscriptPlainText(state: TranscriptState, options?: TranscriptExportOptions): string;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plain-text transcript export (V2-057 / V2-094).
|
|
3
|
+
*
|
|
4
|
+
* Source-order semantic text plus redaction and display sanitize so exports
|
|
5
|
+
* never ship raw API-key shapes or terminal control sequences.
|
|
6
|
+
*/
|
|
7
|
+
import { redactSecrets } from "../../llm/provider.js";
|
|
8
|
+
import { sanitizeDisplayText } from "./sanitize-display.js";
|
|
9
|
+
import { renderTranscriptSemanticText } from "./transcript-semantic.js";
|
|
10
|
+
export function renderTranscriptPlainText(state, options = {}) {
|
|
11
|
+
const raw = renderTranscriptSemanticText(state, {
|
|
12
|
+
thinking: options.includeThinking ? "all" : "none",
|
|
13
|
+
})
|
|
14
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
15
|
+
.trim();
|
|
16
|
+
return sanitizeDisplayText(redactSecrets(raw));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=transcript-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-export.js","sourceRoot":"","sources":["../../../src/tui-v2/rendering/transcript-export.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AAMxE,MAAM,UAAU,yBAAyB,CACvC,KAAsB,EACtB,UAAmC,EAAE;IAErC,MAAM,GAAG,GAAG,4BAA4B,CAAC,KAAK,EAAE;QAC9C,QAAQ,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;KACnD,CAAC;SACC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,IAAI,EAAE,CAAC;IACV,OAAO,mBAAmB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic, source-order text extraction for transcript selection and export.
|
|
3
|
+
*
|
|
4
|
+
* This deliberately operates on normalized items rather than terminal cells:
|
|
5
|
+
* Markdown wrapping, syntax color, and viewport culling cannot alter copied
|
|
6
|
+
* content. Optional tool output is injected by the caller so spool ownership
|
|
7
|
+
* remains outside transcript state.
|
|
8
|
+
*/
|
|
9
|
+
import { type ToolItem, type TranscriptState } from "../state/transcript-types.js";
|
|
10
|
+
import type { SemanticDocument } from "../state/semantic-document.js";
|
|
11
|
+
export type ThinkingInclusion = "none" | "visible" | "all";
|
|
12
|
+
export interface TranscriptSemanticOptions {
|
|
13
|
+
readonly thinking?: ThinkingInclusion;
|
|
14
|
+
readonly toolOutput?: (item: ToolItem) => string | undefined;
|
|
15
|
+
}
|
|
16
|
+
export declare function extractTranscriptSemanticDocument(state: TranscriptState, options?: TranscriptSemanticOptions): SemanticDocument;
|
|
17
|
+
export declare function renderTranscriptSemanticText(state: TranscriptState, options?: TranscriptSemanticOptions): string;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic, source-order text extraction for transcript selection and export.
|
|
3
|
+
*
|
|
4
|
+
* This deliberately operates on normalized items rather than terminal cells:
|
|
5
|
+
* Markdown wrapping, syntax color, and viewport culling cannot alter copied
|
|
6
|
+
* content. Optional tool output is injected by the caller so spool ownership
|
|
7
|
+
* remains outside transcript state.
|
|
8
|
+
*/
|
|
9
|
+
import { isItemExpanded, transcriptItems, } from "../state/transcript-types.js";
|
|
10
|
+
import { SEMANTIC_BLOCK_SEPARATOR } from "../state/semantic-document.js";
|
|
11
|
+
import { presentTool } from "./tool-presenter.js";
|
|
12
|
+
export function extractTranscriptSemanticDocument(state, options = {}) {
|
|
13
|
+
const thinking = options.thinking ?? "visible";
|
|
14
|
+
const blocks = [];
|
|
15
|
+
for (const item of transcriptItems(state)) {
|
|
16
|
+
if (item.kind === "thinking" && !includeThinking(state, item.id, thinking))
|
|
17
|
+
continue;
|
|
18
|
+
blocks.push({ id: item.id, text: semanticTextForItem(item, options.toolOutput) });
|
|
19
|
+
}
|
|
20
|
+
return { blocks };
|
|
21
|
+
}
|
|
22
|
+
export function renderTranscriptSemanticText(state, options = {}) {
|
|
23
|
+
return extractTranscriptSemanticDocument(state, options).blocks
|
|
24
|
+
.map((block) => block.text)
|
|
25
|
+
.join(SEMANTIC_BLOCK_SEPARATOR);
|
|
26
|
+
}
|
|
27
|
+
function includeThinking(state, itemId, inclusion) {
|
|
28
|
+
if (inclusion === "all")
|
|
29
|
+
return true;
|
|
30
|
+
if (inclusion === "none")
|
|
31
|
+
return false;
|
|
32
|
+
const item = state.byId.get(itemId);
|
|
33
|
+
return item?.kind === "thinking" && isItemExpanded(state, item);
|
|
34
|
+
}
|
|
35
|
+
function semanticTextForItem(item, toolOutput) {
|
|
36
|
+
switch (item.kind) {
|
|
37
|
+
case "user":
|
|
38
|
+
return `You:\n${item.text}`;
|
|
39
|
+
case "assistant":
|
|
40
|
+
return `Assistant:\n${item.text}`;
|
|
41
|
+
case "thinking":
|
|
42
|
+
return `Thinking:\n${item.content}`;
|
|
43
|
+
case "tool": {
|
|
44
|
+
const { statusLabel, name, argsDisplay, detail } = presentTool(item);
|
|
45
|
+
const headline = argsDisplay ? `${name} ${argsDisplay}` : name;
|
|
46
|
+
// UI cards hide full model-context summaries; export still includes
|
|
47
|
+
// summary text, then any live spool the caller injects.
|
|
48
|
+
return [
|
|
49
|
+
`Tool: ${headline} — ${statusLabel}`,
|
|
50
|
+
item.status === "blocked" ? detail : item.summary,
|
|
51
|
+
item.artifactPath ? ` artifact: ${item.artifactPath}` : undefined,
|
|
52
|
+
toolOutput?.(item),
|
|
53
|
+
]
|
|
54
|
+
.filter((part) => part !== undefined && part !== "")
|
|
55
|
+
.join("\n");
|
|
56
|
+
}
|
|
57
|
+
case "notice":
|
|
58
|
+
return `[${item.level}] ${item.text}`;
|
|
59
|
+
case "compacted":
|
|
60
|
+
return `[compacted context: ~${item.beforeTokens} -> ~${item.afterTokens} tokens]\n${item.summary}`;
|
|
61
|
+
default: {
|
|
62
|
+
const unreachable = item;
|
|
63
|
+
throw new Error(`unhandled transcript item: ${JSON.stringify(unreachable)}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=transcript-semantic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-semantic.js","sourceRoot":"","sources":["../../../src/tui-v2/rendering/transcript-semantic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Pure line-oriented search for the pager (PICK-003, V2-074). */
|
|
2
|
+
export interface PagerMatch {
|
|
3
|
+
readonly line: number;
|
|
4
|
+
readonly column: number;
|
|
5
|
+
readonly length: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function findPagerMatches(lines: readonly string[], query: string): PagerMatch[];
|
|
8
|
+
/** Wraps forward; returns -1 when there are no matches to navigate. */
|
|
9
|
+
export declare function nextPagerMatch(matches: readonly PagerMatch[], current: number): number;
|
|
10
|
+
/** Wraps backward; returns -1 when there are no matches to navigate. */
|
|
11
|
+
export declare function prevPagerMatch(matches: readonly PagerMatch[], current: number): number;
|
|
12
|
+
/** One painted run inside a pager body line. */
|
|
13
|
+
export interface PagerLineSegment {
|
|
14
|
+
readonly text: string;
|
|
15
|
+
/** Inactive hit vs the currently selected hit (Enter/n/N). */
|
|
16
|
+
readonly kind: "plain" | "match" | "active";
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Split a body line into plain/match/active segments for reverse-video paint.
|
|
20
|
+
* Overlapping ranges are not expected (non-overlapping indexOf walk).
|
|
21
|
+
*/
|
|
22
|
+
export declare function segmentPagerLine(line: string, lineIndex: number, matches: readonly PagerMatch[], activeMatchIndex: number): PagerLineSegment[];
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/** Pure line-oriented search for the pager (PICK-003, V2-074). */
|
|
2
|
+
export function findPagerMatches(lines, query) {
|
|
3
|
+
const needle = query.trim().toLowerCase();
|
|
4
|
+
if (!needle)
|
|
5
|
+
return [];
|
|
6
|
+
const matches = [];
|
|
7
|
+
for (let line = 0; line < lines.length; line += 1) {
|
|
8
|
+
const haystack = lines[line].toLowerCase();
|
|
9
|
+
let from = 0;
|
|
10
|
+
for (;;) {
|
|
11
|
+
const at = haystack.indexOf(needle, from);
|
|
12
|
+
if (at === -1)
|
|
13
|
+
break;
|
|
14
|
+
matches.push({ line, column: at, length: needle.length });
|
|
15
|
+
from = at + needle.length;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return matches;
|
|
19
|
+
}
|
|
20
|
+
/** Wraps forward; returns -1 when there are no matches to navigate. */
|
|
21
|
+
export function nextPagerMatch(matches, current) {
|
|
22
|
+
if (matches.length === 0)
|
|
23
|
+
return -1;
|
|
24
|
+
return (current + 1 + matches.length) % matches.length;
|
|
25
|
+
}
|
|
26
|
+
/** Wraps backward; returns -1 when there are no matches to navigate. */
|
|
27
|
+
export function prevPagerMatch(matches, current) {
|
|
28
|
+
if (matches.length === 0)
|
|
29
|
+
return -1;
|
|
30
|
+
return (current - 1 + matches.length) % matches.length;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Split a body line into plain/match/active segments for reverse-video paint.
|
|
34
|
+
* Overlapping ranges are not expected (non-overlapping indexOf walk).
|
|
35
|
+
*/
|
|
36
|
+
export function segmentPagerLine(line, lineIndex, matches, activeMatchIndex) {
|
|
37
|
+
const onLine = [];
|
|
38
|
+
for (let i = 0; i < matches.length; i += 1) {
|
|
39
|
+
const m = matches[i];
|
|
40
|
+
if (m.line !== lineIndex)
|
|
41
|
+
continue;
|
|
42
|
+
onLine.push({
|
|
43
|
+
column: m.column,
|
|
44
|
+
length: m.length,
|
|
45
|
+
active: i === activeMatchIndex,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
if (onLine.length === 0) {
|
|
49
|
+
return [{ text: line.length > 0 ? line : " ", kind: "plain" }];
|
|
50
|
+
}
|
|
51
|
+
onLine.sort((a, b) => a.column - b.column);
|
|
52
|
+
const segments = [];
|
|
53
|
+
let cursor = 0;
|
|
54
|
+
for (const hit of onLine) {
|
|
55
|
+
const start = Math.max(0, Math.min(line.length, hit.column));
|
|
56
|
+
const end = Math.max(start, Math.min(line.length, hit.column + hit.length));
|
|
57
|
+
if (start < cursor)
|
|
58
|
+
continue; // skip overlap
|
|
59
|
+
if (start > cursor) {
|
|
60
|
+
segments.push({ text: line.slice(cursor, start), kind: "plain" });
|
|
61
|
+
}
|
|
62
|
+
if (end > start) {
|
|
63
|
+
segments.push({
|
|
64
|
+
text: line.slice(start, end),
|
|
65
|
+
kind: hit.active ? "active" : "match",
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
cursor = end;
|
|
69
|
+
}
|
|
70
|
+
if (cursor < line.length) {
|
|
71
|
+
segments.push({ text: line.slice(cursor), kind: "plain" });
|
|
72
|
+
}
|
|
73
|
+
if (segments.length === 0) {
|
|
74
|
+
return [{ text: line.length > 0 ? line : " ", kind: "plain" }];
|
|
75
|
+
}
|
|
76
|
+
return segments;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=pager-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pager-search.js","sourceRoot":"","sources":["../../../src/tui-v2/state/pager-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer-independent semantic text coordinates used by pane selection.
|
|
3
|
+
*
|
|
4
|
+
* Anchors point at stable domain block ids and UTF-16 source offsets rather
|
|
5
|
+
* than viewport cells, so wrapping, resizing, and virtualized rows cannot
|
|
6
|
+
* change what an existing selection means.
|
|
7
|
+
*/
|
|
8
|
+
export declare const SEMANTIC_BLOCK_SEPARATOR = "\n\n";
|
|
9
|
+
export interface SemanticBlock {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly text: string;
|
|
12
|
+
}
|
|
13
|
+
export interface SemanticDocument {
|
|
14
|
+
readonly blocks: readonly SemanticBlock[];
|
|
15
|
+
}
|
|
16
|
+
export interface SemanticAnchor {
|
|
17
|
+
readonly blockId: string;
|
|
18
|
+
readonly offset: number;
|
|
19
|
+
}
|
|
20
|
+
export interface SemanticRange {
|
|
21
|
+
readonly anchor: SemanticAnchor;
|
|
22
|
+
readonly focus: SemanticAnchor;
|
|
23
|
+
}
|
|
24
|
+
export type SemanticMovement = "left" | "right" | "word-left" | "word-right" | "line-start" | "line-end" | "up" | "down";
|
|
25
|
+
export declare function normalizeSemanticDocument(document: SemanticDocument): SemanticDocument;
|
|
26
|
+
export declare function documentStart(document: SemanticDocument): SemanticAnchor | undefined;
|
|
27
|
+
export declare function documentEnd(document: SemanticDocument): SemanticAnchor | undefined;
|
|
28
|
+
export declare function clampSemanticAnchor(document: SemanticDocument, anchor: SemanticAnchor, missing?: "start" | "end"): SemanticAnchor | undefined;
|
|
29
|
+
export declare function compareSemanticAnchors(document: SemanticDocument, left: SemanticAnchor, right: SemanticAnchor): number;
|
|
30
|
+
export declare function semanticRangeText(document: SemanticDocument, range: SemanticRange): string;
|
|
31
|
+
export declare function moveSemanticAnchor(document: SemanticDocument, requested: SemanticAnchor, movement: SemanticMovement): SemanticAnchor | undefined;
|
|
32
|
+
/** SEL-005: double-click selects a whole URL/path as one unit, else a word. */
|
|
33
|
+
export declare function semanticWordRange(document: SemanticDocument, requested: SemanticAnchor): SemanticRange | undefined;
|
|
34
|
+
export declare function semanticLineRange(document: SemanticDocument, requested: SemanticAnchor): SemanticRange | undefined;
|