@pentoshi/clai 2.0.61 → 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 +210 -91
- 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,118 @@
|
|
|
1
|
+
import type { SessionPlan } from "../../store/plan.js";
|
|
2
|
+
/** Opaque/branded string ID so distinct ID kinds cannot be mixed by accident. */
|
|
3
|
+
export type Brand<T, B extends string> = T & {
|
|
4
|
+
readonly __brand: B;
|
|
5
|
+
};
|
|
6
|
+
export type SessionId = Brand<string, "SessionId">;
|
|
7
|
+
export type TurnId = Brand<string, "TurnId">;
|
|
8
|
+
export type MessageId = Brand<string, "MessageId">;
|
|
9
|
+
export type ToolCallId = Brand<string, "ToolCallId">;
|
|
10
|
+
export type PlanId = Brand<string, "PlanId">;
|
|
11
|
+
export type TaskId = Brand<string, "TaskId">;
|
|
12
|
+
export declare const asSessionId: (value: string) => SessionId;
|
|
13
|
+
export declare const asTurnId: (value: string) => TurnId;
|
|
14
|
+
export declare const asMessageId: (value: string) => MessageId;
|
|
15
|
+
export declare const asToolCallId: (value: string) => ToolCallId;
|
|
16
|
+
export declare const asPlanId: (value: string) => PlanId;
|
|
17
|
+
export declare const asTaskId: (value: string) => TaskId;
|
|
18
|
+
/** Bumped only when the envelope shape changes in a non-additive way. */
|
|
19
|
+
export declare const APP_EVENT_VERSION: 1;
|
|
20
|
+
export interface AppEvent<TType extends string, TPayload> {
|
|
21
|
+
/** Globally unique id for this specific event occurrence. */
|
|
22
|
+
readonly id: string;
|
|
23
|
+
readonly version: typeof APP_EVENT_VERSION;
|
|
24
|
+
/** Monotonic, gap-free counter within a session, starting at 1. */
|
|
25
|
+
readonly sequence: number;
|
|
26
|
+
readonly sessionId: SessionId;
|
|
27
|
+
readonly turnId?: TurnId | undefined;
|
|
28
|
+
readonly timestamp: number;
|
|
29
|
+
readonly type: TType;
|
|
30
|
+
readonly payload: TPayload;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Tool output chunks are NOT concatenated into an unbounded string in the
|
|
34
|
+
* envelope. The payload carries a reference into the `OutputSpool` (keyed by
|
|
35
|
+
* tool-call id); components read a bounded tail on demand. See event-buffer.ts.
|
|
36
|
+
*/
|
|
37
|
+
export interface OutputChunkRef {
|
|
38
|
+
readonly toolCallId: ToolCallId;
|
|
39
|
+
/** Byte length of the chunk that was just spooled (for progress display). */
|
|
40
|
+
readonly chunkBytes: number;
|
|
41
|
+
/** Running total bytes spooled for this tool call after this chunk. */
|
|
42
|
+
readonly totalBytes: number;
|
|
43
|
+
}
|
|
44
|
+
export interface AppEventPayloads {
|
|
45
|
+
"turn-started": {
|
|
46
|
+
readonly prompt: string;
|
|
47
|
+
};
|
|
48
|
+
status: {
|
|
49
|
+
readonly text: string;
|
|
50
|
+
readonly step?: number | undefined;
|
|
51
|
+
};
|
|
52
|
+
"thinking-delta": {
|
|
53
|
+
readonly text: string;
|
|
54
|
+
};
|
|
55
|
+
"thinking-block": {
|
|
56
|
+
readonly messageId: MessageId;
|
|
57
|
+
readonly content: string;
|
|
58
|
+
};
|
|
59
|
+
"assistant-delta": {
|
|
60
|
+
readonly text: string;
|
|
61
|
+
};
|
|
62
|
+
"assistant-message": {
|
|
63
|
+
readonly messageId: MessageId;
|
|
64
|
+
readonly text: string;
|
|
65
|
+
};
|
|
66
|
+
notice: {
|
|
67
|
+
readonly level: "info" | "warn";
|
|
68
|
+
readonly text: string;
|
|
69
|
+
};
|
|
70
|
+
"tool-call": {
|
|
71
|
+
readonly toolCallId: ToolCallId;
|
|
72
|
+
readonly name: string;
|
|
73
|
+
readonly argsDisplay: string;
|
|
74
|
+
};
|
|
75
|
+
"tool-output": {
|
|
76
|
+
readonly ref: OutputChunkRef;
|
|
77
|
+
};
|
|
78
|
+
"tool-result": {
|
|
79
|
+
readonly toolCallId: ToolCallId;
|
|
80
|
+
readonly ok: boolean;
|
|
81
|
+
readonly exitCode?: number | undefined;
|
|
82
|
+
readonly summary: string;
|
|
83
|
+
readonly artifactPath?: string | undefined;
|
|
84
|
+
};
|
|
85
|
+
"tool-blocked": {
|
|
86
|
+
readonly toolCallId: ToolCallId;
|
|
87
|
+
readonly name: string;
|
|
88
|
+
readonly reason: string;
|
|
89
|
+
};
|
|
90
|
+
"plan-updated": {
|
|
91
|
+
readonly planId: PlanId;
|
|
92
|
+
readonly plan: SessionPlan;
|
|
93
|
+
};
|
|
94
|
+
"confirm-requested": {
|
|
95
|
+
readonly requestId: string;
|
|
96
|
+
readonly kind: "tool" | "pentest" | "reset" | "continue" | "plan" | "switch";
|
|
97
|
+
readonly prompt: string;
|
|
98
|
+
};
|
|
99
|
+
compacted: {
|
|
100
|
+
readonly summary: string;
|
|
101
|
+
readonly beforeTokens: number;
|
|
102
|
+
readonly afterTokens: number;
|
|
103
|
+
};
|
|
104
|
+
"turn-ended": {
|
|
105
|
+
readonly finalAnswer: string;
|
|
106
|
+
readonly steps: number;
|
|
107
|
+
};
|
|
108
|
+
"turn-aborted": Record<string, never>;
|
|
109
|
+
"turn-error": {
|
|
110
|
+
readonly message: string;
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
export type AppEventType = keyof AppEventPayloads;
|
|
114
|
+
export type TypedAppEvent<K extends AppEventType = AppEventType> = K extends AppEventType ? AppEvent<K, AppEventPayloads[K]> : never;
|
|
115
|
+
/** Any event in the app protocol, discriminated by `type`. */
|
|
116
|
+
export type AnyAppEvent = TypedAppEvent;
|
|
117
|
+
export declare function isDeltaEvent(type: AppEventType): boolean;
|
|
118
|
+
export declare function isStructuralEvent(type: AppEventType): boolean;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export const asSessionId = (value) => value;
|
|
2
|
+
export const asTurnId = (value) => value;
|
|
3
|
+
export const asMessageId = (value) => value;
|
|
4
|
+
export const asToolCallId = (value) => value;
|
|
5
|
+
export const asPlanId = (value) => value;
|
|
6
|
+
export const asTaskId = (value) => value;
|
|
7
|
+
/** Bumped only when the envelope shape changes in a non-additive way. */
|
|
8
|
+
export const APP_EVENT_VERSION = 1;
|
|
9
|
+
/**
|
|
10
|
+
* Structural events end a run of coalescible deltas. The TurnController flushes
|
|
11
|
+
* pending `assistant-delta`/`thinking-delta` text before emitting any of these
|
|
12
|
+
* so visible order is preserved (ARCHITECTURE.md "flush before structural
|
|
13
|
+
* events"). Deltas themselves are the only non-structural events.
|
|
14
|
+
*/
|
|
15
|
+
const DELTA_TYPES = new Set([
|
|
16
|
+
"assistant-delta",
|
|
17
|
+
"thinking-delta",
|
|
18
|
+
]);
|
|
19
|
+
export function isDeltaEvent(type) {
|
|
20
|
+
return DELTA_TYPES.has(type);
|
|
21
|
+
}
|
|
22
|
+
export function isStructuralEvent(type) {
|
|
23
|
+
return !DELTA_TYPES.has(type);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=app-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-event.js","sourceRoot":"","sources":["../../../src/app/events/app-event.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAa,EAAE,CAAC,KAAkB,CAAC;AAC5E,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAe,CAAC;AACnE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAa,EAAE,CAAC,KAAkB,CAAC;AAC5E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAc,EAAE,CAAC,KAAmB,CAAC;AAC/E,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAe,CAAC;AACnE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAe,CAAC;AAEnE,yEAAyE;AACzE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAU,CAAC;AAoF5C;;;;;GAKG;AACH,MAAM,WAAW,GAA8B,IAAI,GAAG,CAAe;IACnE,iBAAiB;IACjB,gBAAgB;CACjB,CAAC,CAAC;AAEH,MAAM,UAAU,YAAY,CAAC,IAAkB;IAC7C,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAkB;IAClD,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { OutputChunkRef, ToolCallId } from "./app-event.js";
|
|
2
|
+
/**
|
|
3
|
+
* Text buffer for a single tool stream. By default it keeps **all** characters
|
|
4
|
+
* (no truncation) so Ctrl+O / click-to-open always shows the full body.
|
|
5
|
+
* Pass a finite `maxChars` only for tests or memory-sensitive adapters.
|
|
6
|
+
*/
|
|
7
|
+
export interface BoundedTextState {
|
|
8
|
+
readonly tail: string;
|
|
9
|
+
readonly totalBytes: number;
|
|
10
|
+
readonly droppedBytes: number;
|
|
11
|
+
readonly truncated: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare class BoundedText {
|
|
14
|
+
private readonly maxChars;
|
|
15
|
+
private tailBuf;
|
|
16
|
+
private total;
|
|
17
|
+
private dropped;
|
|
18
|
+
/**
|
|
19
|
+
* @param maxChars Finite positive cap keeps only the last N chars.
|
|
20
|
+
* `Infinity` / `Number.POSITIVE_INFINITY` (default) keeps everything.
|
|
21
|
+
*/
|
|
22
|
+
constructor(maxChars?: number);
|
|
23
|
+
append(chunk: string): void;
|
|
24
|
+
/** Replace the buffer with an authoritative full body (never truncated). */
|
|
25
|
+
replace(text: string): void;
|
|
26
|
+
get tail(): string;
|
|
27
|
+
get totalBytes(): number;
|
|
28
|
+
get droppedBytes(): number;
|
|
29
|
+
get truncated(): boolean;
|
|
30
|
+
snapshot(): BoundedTextState;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Per-tool-call output spool. Default is unbounded so the UI never loses
|
|
34
|
+
* bytes. Full artifacts are still written to disk for persistence/export.
|
|
35
|
+
*/
|
|
36
|
+
export declare class OutputSpool {
|
|
37
|
+
private readonly maxCharsPerTool;
|
|
38
|
+
private readonly byTool;
|
|
39
|
+
/** @param maxCharsPerTool Default Infinity — keep full output. */
|
|
40
|
+
constructor(maxCharsPerTool?: number);
|
|
41
|
+
append(toolCallId: ToolCallId, chunk: string): OutputChunkRef;
|
|
42
|
+
/**
|
|
43
|
+
* Set the full authoritative body after a tool finishes (replaces any live
|
|
44
|
+
* stream so the pager never shows a truncated mid-run preview).
|
|
45
|
+
*/
|
|
46
|
+
replace(toolCallId: ToolCallId, text: string): OutputChunkRef;
|
|
47
|
+
tail(toolCallId: ToolCallId): string;
|
|
48
|
+
state(toolCallId: ToolCallId): BoundedTextState | undefined;
|
|
49
|
+
has(toolCallId: ToolCallId): boolean;
|
|
50
|
+
clear(): void;
|
|
51
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
export class BoundedText {
|
|
2
|
+
maxChars;
|
|
3
|
+
tailBuf = "";
|
|
4
|
+
total = 0;
|
|
5
|
+
dropped = 0;
|
|
6
|
+
/**
|
|
7
|
+
* @param maxChars Finite positive cap keeps only the last N chars.
|
|
8
|
+
* `Infinity` / `Number.POSITIVE_INFINITY` (default) keeps everything.
|
|
9
|
+
*/
|
|
10
|
+
constructor(maxChars = Number.POSITIVE_INFINITY) {
|
|
11
|
+
this.maxChars = maxChars;
|
|
12
|
+
if (!(this.maxChars > 0))
|
|
13
|
+
throw new RangeError("maxChars must be positive");
|
|
14
|
+
}
|
|
15
|
+
append(chunk) {
|
|
16
|
+
if (chunk.length === 0)
|
|
17
|
+
return;
|
|
18
|
+
this.total += Buffer.byteLength(chunk, "utf8");
|
|
19
|
+
const combined = this.tailBuf + chunk;
|
|
20
|
+
if (!Number.isFinite(this.maxChars) || combined.length <= this.maxChars) {
|
|
21
|
+
this.tailBuf = combined;
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const overflow = combined.length - this.maxChars;
|
|
25
|
+
this.dropped += Buffer.byteLength(combined.slice(0, overflow), "utf8");
|
|
26
|
+
this.tailBuf = combined.slice(overflow);
|
|
27
|
+
}
|
|
28
|
+
/** Replace the buffer with an authoritative full body (never truncated). */
|
|
29
|
+
replace(text) {
|
|
30
|
+
this.tailBuf = text;
|
|
31
|
+
this.total = Buffer.byteLength(text, "utf8");
|
|
32
|
+
this.dropped = 0;
|
|
33
|
+
}
|
|
34
|
+
get tail() {
|
|
35
|
+
return this.tailBuf;
|
|
36
|
+
}
|
|
37
|
+
get totalBytes() {
|
|
38
|
+
return this.total;
|
|
39
|
+
}
|
|
40
|
+
get droppedBytes() {
|
|
41
|
+
return this.dropped;
|
|
42
|
+
}
|
|
43
|
+
get truncated() {
|
|
44
|
+
return this.dropped > 0;
|
|
45
|
+
}
|
|
46
|
+
snapshot() {
|
|
47
|
+
return {
|
|
48
|
+
tail: this.tailBuf,
|
|
49
|
+
totalBytes: this.total,
|
|
50
|
+
droppedBytes: this.dropped,
|
|
51
|
+
truncated: this.dropped > 0,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Per-tool-call output spool. Default is unbounded so the UI never loses
|
|
57
|
+
* bytes. Full artifacts are still written to disk for persistence/export.
|
|
58
|
+
*/
|
|
59
|
+
export class OutputSpool {
|
|
60
|
+
maxCharsPerTool;
|
|
61
|
+
byTool = new Map();
|
|
62
|
+
/** @param maxCharsPerTool Default Infinity — keep full output. */
|
|
63
|
+
constructor(maxCharsPerTool = Number.POSITIVE_INFINITY) {
|
|
64
|
+
this.maxCharsPerTool = maxCharsPerTool;
|
|
65
|
+
}
|
|
66
|
+
append(toolCallId, chunk) {
|
|
67
|
+
let buffer = this.byTool.get(toolCallId);
|
|
68
|
+
if (!buffer) {
|
|
69
|
+
buffer = new BoundedText(this.maxCharsPerTool);
|
|
70
|
+
this.byTool.set(toolCallId, buffer);
|
|
71
|
+
}
|
|
72
|
+
buffer.append(chunk);
|
|
73
|
+
return {
|
|
74
|
+
toolCallId,
|
|
75
|
+
chunkBytes: Buffer.byteLength(chunk, "utf8"),
|
|
76
|
+
totalBytes: buffer.totalBytes,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Set the full authoritative body after a tool finishes (replaces any live
|
|
81
|
+
* stream so the pager never shows a truncated mid-run preview).
|
|
82
|
+
*/
|
|
83
|
+
replace(toolCallId, text) {
|
|
84
|
+
let buffer = this.byTool.get(toolCallId);
|
|
85
|
+
if (!buffer) {
|
|
86
|
+
buffer = new BoundedText(this.maxCharsPerTool);
|
|
87
|
+
this.byTool.set(toolCallId, buffer);
|
|
88
|
+
}
|
|
89
|
+
buffer.replace(text);
|
|
90
|
+
return {
|
|
91
|
+
toolCallId,
|
|
92
|
+
chunkBytes: Buffer.byteLength(text, "utf8"),
|
|
93
|
+
totalBytes: buffer.totalBytes,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
tail(toolCallId) {
|
|
97
|
+
return this.byTool.get(toolCallId)?.tail ?? "";
|
|
98
|
+
}
|
|
99
|
+
state(toolCallId) {
|
|
100
|
+
return this.byTool.get(toolCallId)?.snapshot();
|
|
101
|
+
}
|
|
102
|
+
has(toolCallId) {
|
|
103
|
+
return this.byTool.has(toolCallId);
|
|
104
|
+
}
|
|
105
|
+
clear() {
|
|
106
|
+
this.byTool.clear();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=event-buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-buffer.js","sourceRoot":"","sources":["../../../src/app/events/event-buffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type AppEvent, type AppEventPayloads, type AppEventType, type MessageId, type SessionId, type TurnId } from "./app-event.js";
|
|
2
|
+
/** Injectable time source so replay tests are deterministic. */
|
|
3
|
+
export interface Clock {
|
|
4
|
+
now(): number;
|
|
5
|
+
}
|
|
6
|
+
export declare const systemClock: Clock;
|
|
7
|
+
/**
|
|
8
|
+
* Mints envelope ids and domain ids that lack a natural stable id (assistant
|
|
9
|
+
* messages, thinking blocks). Tool-call ids come from the agent and are reused
|
|
10
|
+
* verbatim. Injectable so tests can assert deterministic replay output.
|
|
11
|
+
*/
|
|
12
|
+
export interface IdFactory {
|
|
13
|
+
event(): string;
|
|
14
|
+
message(): MessageId;
|
|
15
|
+
}
|
|
16
|
+
export declare function createCountingIdFactory(prefix?: string): IdFactory;
|
|
17
|
+
export declare function createRandomIdFactory(): IdFactory;
|
|
18
|
+
/**
|
|
19
|
+
* Assigns a monotonic, gap-free `sequence` per session and wraps a typed
|
|
20
|
+
* payload in the `AppEvent` envelope. One sequencer instance owns one session.
|
|
21
|
+
*/
|
|
22
|
+
export declare class EventSequencer {
|
|
23
|
+
readonly ids: IdFactory;
|
|
24
|
+
private readonly clock;
|
|
25
|
+
private seq;
|
|
26
|
+
private sessionId;
|
|
27
|
+
constructor(sessionId: SessionId, ids?: IdFactory, clock?: Clock);
|
|
28
|
+
get current(): number;
|
|
29
|
+
/** Start a fresh sequence (e.g. after /new remints the session id). */
|
|
30
|
+
rebind(sessionId: SessionId): void;
|
|
31
|
+
build<K extends AppEventType>(type: K, payload: AppEventPayloads[K], turnId?: TurnId | undefined): AppEvent<K, AppEventPayloads[K]>;
|
|
32
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { APP_EVENT_VERSION, asMessageId, } from "./app-event.js";
|
|
3
|
+
export const systemClock = { now: () => Date.now() };
|
|
4
|
+
export function createCountingIdFactory(prefix = "") {
|
|
5
|
+
let events = 0;
|
|
6
|
+
let messages = 0;
|
|
7
|
+
return {
|
|
8
|
+
event: () => `${prefix}evt-${(++events).toString(36)}`,
|
|
9
|
+
message: () => asMessageId(`${prefix}msg-${(++messages).toString(36)}`),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function createRandomIdFactory() {
|
|
13
|
+
return {
|
|
14
|
+
event: () => randomUUID(),
|
|
15
|
+
message: () => asMessageId(randomUUID()),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Assigns a monotonic, gap-free `sequence` per session and wraps a typed
|
|
20
|
+
* payload in the `AppEvent` envelope. One sequencer instance owns one session.
|
|
21
|
+
*/
|
|
22
|
+
export class EventSequencer {
|
|
23
|
+
ids;
|
|
24
|
+
clock;
|
|
25
|
+
seq = 0;
|
|
26
|
+
sessionId;
|
|
27
|
+
constructor(sessionId, ids = createRandomIdFactory(), clock = systemClock) {
|
|
28
|
+
this.ids = ids;
|
|
29
|
+
this.clock = clock;
|
|
30
|
+
this.sessionId = sessionId;
|
|
31
|
+
}
|
|
32
|
+
get current() {
|
|
33
|
+
return this.seq;
|
|
34
|
+
}
|
|
35
|
+
/** Start a fresh sequence (e.g. after /new remints the session id). */
|
|
36
|
+
rebind(sessionId) {
|
|
37
|
+
this.sessionId = sessionId;
|
|
38
|
+
this.seq = 0;
|
|
39
|
+
}
|
|
40
|
+
build(type, payload, turnId) {
|
|
41
|
+
this.seq += 1;
|
|
42
|
+
const base = {
|
|
43
|
+
id: this.ids.event(),
|
|
44
|
+
version: APP_EVENT_VERSION,
|
|
45
|
+
sequence: this.seq,
|
|
46
|
+
sessionId: this.sessionId,
|
|
47
|
+
timestamp: this.clock.now(),
|
|
48
|
+
type,
|
|
49
|
+
payload,
|
|
50
|
+
};
|
|
51
|
+
const event = turnId === undefined ? base : { ...base, turnId };
|
|
52
|
+
return event;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=sequencer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequencer.js","sourceRoot":"","sources":["../../../src/app/events/sequencer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,iBAAiB,EACjB,WAAW,GAOZ,MAAM,gBAAgB,CAAC;AAOxB,MAAM,CAAC,MAAM,WAAW,GAAU,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AAY5D,MAAM,UAAU,uBAAuB,CAAC,MAAM,GAAG,EAAE;IACjD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QACtD,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;KACxE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;QACzB,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;KACzC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,cAAc;IAMd;IACQ;IANX,GAAG,GAAG,CAAC,CAAC;IACR,SAAS,CAAY;IAE7B,YACE,SAAoB,EACX,MAAiB,qBAAqB,EAAE,EAChC,QAAe,WAAW;QADlC,QAAG,GAAH,GAAG,CAAqC;QAChC,UAAK,GAAL,KAAK,CAAqB;QAE3C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,uEAAuE;IACvE,MAAM,CAAC,SAAoB;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IACf,CAAC;IAED,KAAK,CACH,IAAO,EACP,OAA4B,EAC5B,MAA2B;QAE3B,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,GAAG;YACX,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;YACpB,OAAO,EAAE,iBAAiB;YAC1B,QAAQ,EAAE,IAAI,CAAC,GAAG;YAClB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;YAC3B,IAAI;YACJ,OAAO;SACR,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC;QAChE,OAAO,KAAyC,CAAC;IACnD,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ChatImage, ChatMessage, ProviderId } from "../../types.js";
|
|
2
|
+
import type { AgentEvent } from "../../agent/events.js";
|
|
3
|
+
import type { SessionPolicy } from "../../agent/session-policy.js";
|
|
4
|
+
import type { ConfirmationPort } from "./confirm-port.js";
|
|
5
|
+
import type { SecretPort } from "./secret-port.js";
|
|
6
|
+
export interface RunTurnRequest {
|
|
7
|
+
readonly prompt: string;
|
|
8
|
+
readonly provider?: ProviderId | undefined;
|
|
9
|
+
readonly model?: string | undefined;
|
|
10
|
+
readonly history?: readonly ChatMessage[] | undefined;
|
|
11
|
+
readonly images?: readonly ChatImage[] | undefined;
|
|
12
|
+
readonly autoConfirm?: boolean | undefined;
|
|
13
|
+
readonly maxSteps?: number | undefined;
|
|
14
|
+
}
|
|
15
|
+
export interface RunTurnHandlers {
|
|
16
|
+
readonly onEvent: (event: AgentEvent) => void;
|
|
17
|
+
readonly onMessages?: ((messages: ChatMessage[]) => void) | undefined;
|
|
18
|
+
readonly signal?: AbortSignal | undefined;
|
|
19
|
+
readonly confirm?: ConfirmationPort | undefined;
|
|
20
|
+
readonly requestSecret?: SecretPort["request"] | undefined;
|
|
21
|
+
readonly session?: SessionPolicy | undefined;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The one agent implementation, consumed through structured events (CORE-001).
|
|
25
|
+
* `runTurn` resolves with the final answer; events flow through `onEvent`.
|
|
26
|
+
*/
|
|
27
|
+
export interface AgentPort {
|
|
28
|
+
runTurn(request: RunTurnRequest, handlers: RunTurnHandlers): Promise<string>;
|
|
29
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-port.js","sourceRoot":"","sources":["../../../src/app/ports/agent-port.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clipboard access (SEL-006). Copy requires user-visible selected text; the
|
|
3
|
+
* real OSC 52 / native-clipboard adapter lands with the renderer in Phase 6.
|
|
4
|
+
* The app-layer default is in-memory so nothing writes terminal bytes here.
|
|
5
|
+
*/
|
|
6
|
+
export interface ClipboardPort {
|
|
7
|
+
writeText(text: string): Promise<void>;
|
|
8
|
+
readText?(): Promise<string | undefined>;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard-port.js","sourceRoot":"","sources":["../../../src/app/ports/clipboard-port.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ToolCall } from "../../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Typed async confirmation surface (CORE-002). The UI implements this; the
|
|
4
|
+
* agent never reads the terminal directly. Structurally identical to the
|
|
5
|
+
* legacy `ConfirmPort` in src/agent, so a v2 implementation is accepted by
|
|
6
|
+
* `runAgentLoop` without adaptation. Optional methods let minimal ports omit
|
|
7
|
+
* flows they never trigger.
|
|
8
|
+
*/
|
|
9
|
+
export interface ConfirmationPort {
|
|
10
|
+
confirmTool(call: ToolCall): Promise<boolean>;
|
|
11
|
+
confirmPentest(): Promise<boolean>;
|
|
12
|
+
confirmContinue?(steps: number): Promise<boolean>;
|
|
13
|
+
confirmAgentSwitch?(info: {
|
|
14
|
+
reason: string;
|
|
15
|
+
tools: string[];
|
|
16
|
+
}): Promise<boolean>;
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm-port.js","sourceRoot":"","sources":["../../../src/app/ports/confirm-port.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { BackgroundJob } from "../../tools/jobs.js";
|
|
2
|
+
import type { ToolResult } from "../../types.js";
|
|
3
|
+
export type { BackgroundJob };
|
|
4
|
+
/**
|
|
5
|
+
* Background job control (CORE-004, F-004). Jobs survive UI rerenders because
|
|
6
|
+
* they live in the core job manager; the UI only observes and commands them.
|
|
7
|
+
*/
|
|
8
|
+
export interface JobsPort {
|
|
9
|
+
list(): ToolResult;
|
|
10
|
+
running(): BackgroundJob[];
|
|
11
|
+
get(id: string): BackgroundJob | undefined;
|
|
12
|
+
tail(id: string, bytes?: number): Promise<ToolResult>;
|
|
13
|
+
stop(id: string): ToolResult;
|
|
14
|
+
start(command: string, options?: {
|
|
15
|
+
cwd?: string | undefined;
|
|
16
|
+
name?: string | undefined;
|
|
17
|
+
}): Promise<ToolResult>;
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs-port.js","sourceRoot":"","sources":["../../../src/app/ports/jobs-port.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ChatMessage } from "../../types.js";
|
|
2
|
+
import type { SessionPlan } from "../../store/plan.js";
|
|
3
|
+
import type { TranscriptItem } from "../../tui/state.js";
|
|
4
|
+
export interface SaveSessionOptions {
|
|
5
|
+
/** When set, upsert this session id (continuous autosave) instead of minting a new row. */
|
|
6
|
+
readonly sessionId?: string | undefined;
|
|
7
|
+
/** Optional display name. */
|
|
8
|
+
readonly name?: string | undefined;
|
|
9
|
+
/** Classic-shaped visual transcript for full /history restore. */
|
|
10
|
+
readonly transcript?: readonly TranscriptItem[] | undefined;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Session/plan persistence (CORE-005, F-008). Kept narrow so controllers depend
|
|
14
|
+
* on behavior, not on the SQLite/JSONL storage details in src/store.
|
|
15
|
+
*/
|
|
16
|
+
export interface PersistencePort {
|
|
17
|
+
saveSession(messages: readonly ChatMessage[], options?: SaveSessionOptions): Promise<void>;
|
|
18
|
+
loadPlan(sessionId: string): Promise<SessionPlan | undefined>;
|
|
19
|
+
savePlan(plan: SessionPlan): Promise<void>;
|
|
20
|
+
deletePlan(sessionId: string): Promise<void>;
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence-port.js","sourceRoot":"","sources":["../../../src/app/ports/persistence-port.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Masked secret entry (CORE-002, INPUT-009). Secret values are typed
|
|
3
|
+
* separately from generic event payloads and never enter the transcript, logs,
|
|
4
|
+
* history, or clipboard without explicit user action.
|
|
5
|
+
*/
|
|
6
|
+
export interface SecretRequest {
|
|
7
|
+
readonly title: string;
|
|
8
|
+
readonly prompt: string;
|
|
9
|
+
}
|
|
10
|
+
export interface SecretPort {
|
|
11
|
+
request(request: SecretRequest): Promise<string | undefined>;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-port.js","sourceRoot":"","sources":["../../../src/app/ports/secret-port.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type ColorMode = "truecolor" | "256" | "16" | "none";
|
|
2
|
+
/**
|
|
3
|
+
* Terminal capability report (COMPAT-001, A11Y-001). Action defaults are
|
|
4
|
+
* semantic, not byte-sequence promises: `canDistinguishShiftEnter` tells the
|
|
5
|
+
* action layer whether Shift+Enter is a usable newline binding or whether the
|
|
6
|
+
* advertised Alt/Option+Enter fallback must be shown instead.
|
|
7
|
+
*/
|
|
8
|
+
export interface TerminalCapabilities {
|
|
9
|
+
readonly columns: number;
|
|
10
|
+
readonly rows: number;
|
|
11
|
+
readonly colorMode: ColorMode;
|
|
12
|
+
readonly isTTY: boolean;
|
|
13
|
+
readonly canDistinguishShiftEnter: boolean;
|
|
14
|
+
readonly supportsOsc52: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface TerminalPort {
|
|
17
|
+
capabilities(): TerminalCapabilities;
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-port.js","sourceRoot":"","sources":["../../../src/app/ports/terminal-port.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface UpdateStatus {
|
|
2
|
+
readonly currentVersion: string;
|
|
3
|
+
readonly latestVersion?: string | undefined;
|
|
4
|
+
readonly updateAvailable: boolean;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Update check (F-012 adjacent, `/update`). Kept as a port so the check runs
|
|
8
|
+
* without corrupting TUI output and can be faked in tests.
|
|
9
|
+
*/
|
|
10
|
+
export interface UpdatesPort {
|
|
11
|
+
check(): Promise<UpdateStatus>;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updates-port.js","sourceRoot":"","sources":["../../../src/app/ports/updates-port.ts"],"names":[],"mappings":""}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -5,6 +5,8 @@ import { getConfig, getConfigPath } from '../store/config.js';
|
|
|
5
5
|
import { getHistoryPath } from '../store/history.js';
|
|
6
6
|
import { getFallbackKeysPath, probeKeychain } from '../store/keys.js';
|
|
7
7
|
import { loadScope, isScopeActive, getScopePath } from '../store/scope.js';
|
|
8
|
+
import { canUseTui } from '../tui/can-use-tui.js';
|
|
9
|
+
import { describeUiDefault, resolveUiChoice, } from '../tui-v2/bootstrap/ui-selection.js';
|
|
8
10
|
import { printProviderKeys } from './providers.js';
|
|
9
11
|
const pentestTools = [
|
|
10
12
|
'nmap', 'nikto', 'sqlmap', 'gobuster', 'ffuf', 'hydra', 'masscan',
|
|
@@ -21,6 +23,13 @@ export async function runDoctor() {
|
|
|
21
23
|
console.log(`CWD: ${system.cwd}`);
|
|
22
24
|
console.log(`Config: ${getConfigPath()}`);
|
|
23
25
|
console.log(`History: ${getHistoryPath()}`);
|
|
26
|
+
const tuiGate = canUseTui();
|
|
27
|
+
const resolvedUi = resolveUiChoice({});
|
|
28
|
+
console.log(`UI default: ${describeUiDefault()}`);
|
|
29
|
+
console.log(`UI resolved now: ${resolvedUi}` +
|
|
30
|
+
(process.env.CLAI_UI ? chalk.dim(` (CLAI_UI=${process.env.CLAI_UI})`) : ''));
|
|
31
|
+
console.log(`UI host: ${tuiGate.ok ? chalk.green('ok for full-screen TUI') : chalk.yellow(`unavailable — ${tuiGate.reason}`)}`);
|
|
32
|
+
console.log(chalk.dim(' full-screen: clai · line REPL: clai --classic | --ui=legacy'));
|
|
24
33
|
const keychain = await probeKeychain();
|
|
25
34
|
if (keychain.available) {
|
|
26
35
|
console.log(`Keychain: ${chalk.green('available')} (OS keystore)`);
|