@pentoshi/clai 3.18.3 → 4.0.2
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 +44 -24
- package/bin/postinstall-policy.mjs +3 -0
- package/bin/postinstall.mjs +6 -3
- package/dist/agent/confirm-port.d.ts +5 -17
- package/dist/agent/confirm-port.js +8 -65
- package/dist/agent/confirm-port.js.map +1 -1
- package/dist/agent/evidence-governor.d.ts +1 -1
- package/dist/agent/evidence-governor.js +2 -2
- package/dist/agent/evidence-governor.js.map +1 -1
- package/dist/agent/finalize-gate.d.ts +0 -1
- package/dist/agent/finalize-gate.js +6 -24
- package/dist/agent/finalize-gate.js.map +1 -1
- package/dist/agent/loop-guard.d.ts +1 -0
- package/dist/agent/loop-guard.js +34 -1
- package/dist/agent/loop-guard.js.map +1 -1
- package/dist/agent/must-continue.d.ts +1 -4
- package/dist/agent/must-continue.js +0 -22
- package/dist/agent/must-continue.js.map +1 -1
- package/dist/agent/outcomes.js +2 -13
- package/dist/agent/outcomes.js.map +1 -1
- package/dist/agent/plan-decision.d.ts +0 -29
- package/dist/agent/plan-decision.js +0 -96
- package/dist/agent/plan-decision.js.map +1 -1
- package/dist/agent/plan-tool.js +19 -14
- package/dist/agent/plan-tool.js.map +1 -1
- package/dist/agent/progress-pause-policy.d.ts +0 -15
- package/dist/agent/progress-pause-policy.js +0 -15
- package/dist/agent/progress-pause-policy.js.map +1 -1
- package/dist/agent/runner.js +152 -393
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/task-evidence.d.ts +6 -0
- package/dist/agent/task-evidence.js +48 -3
- package/dist/agent/task-evidence.js.map +1 -1
- package/dist/agent/tool-history.js +11 -4
- package/dist/agent/tool-history.js.map +1 -1
- package/dist/app/commands/catalog.js +397 -0
- package/dist/app/commands/catalog.js.map +1 -0
- package/dist/app/commands/registry.js +1 -1
- package/dist/app/commands/registry.js.map +1 -1
- package/dist/app/confirm-prompt-text.d.ts +17 -0
- package/dist/app/confirm-prompt-text.js +34 -0
- package/dist/app/confirm-prompt-text.js.map +1 -0
- package/dist/app/controllers/session-controller.d.ts +1 -1
- package/dist/app/controllers/session-controller.js +3 -1
- package/dist/app/controllers/session-controller.js.map +1 -1
- package/dist/app/controllers/session-prompt-queue.d.ts +5 -1
- package/dist/app/controllers/session-prompt-queue.js +47 -30
- package/dist/app/controllers/session-prompt-queue.js.map +1 -1
- package/dist/app/controllers/turn-controller.js +41 -3
- package/dist/app/controllers/turn-controller.js.map +1 -1
- package/dist/app/ports/confirm-port.d.ts +0 -1
- package/dist/app/ports/persistence-port.d.ts +1 -1
- package/dist/app/ports/transcript-item.d.ts +63 -0
- package/dist/app/ports/transcript-item.js +2 -0
- package/dist/app/ports/transcript-item.js.map +1 -0
- package/dist/classic/app/ClassicApp.d.ts +12 -0
- package/dist/classic/app/ClassicApp.js +119 -0
- package/dist/classic/app/ClassicApp.js.map +1 -0
- package/dist/classic/app/action-handlers.d.ts +45 -0
- package/dist/classic/app/action-handlers.js +280 -0
- package/dist/classic/app/action-handlers.js.map +1 -0
- package/dist/classic/app/app-wiring.d.ts +133 -0
- package/dist/classic/app/app-wiring.js +383 -0
- package/dist/classic/app/app-wiring.js.map +1 -0
- package/dist/classic/app/git-branch.d.ts +1 -0
- package/dist/classic/app/git-branch.js +50 -0
- package/dist/classic/app/git-branch.js.map +1 -0
- package/dist/classic/app/use-feed.d.ts +40 -0
- package/dist/classic/app/use-feed.js +52 -0
- package/dist/classic/app/use-feed.js.map +1 -0
- package/dist/classic/app/wiring-interactions.d.ts +40 -0
- package/dist/classic/app/wiring-interactions.js +433 -0
- package/dist/classic/app/wiring-interactions.js.map +1 -0
- package/dist/classic/app/wiring-lifecycle.d.ts +10 -0
- package/dist/classic/app/wiring-lifecycle.js +242 -0
- package/dist/classic/app/wiring-lifecycle.js.map +1 -0
- package/dist/classic/app/wiring-selection.d.ts +3 -0
- package/dist/classic/app/wiring-selection.js +113 -0
- package/dist/classic/app/wiring-selection.js.map +1 -0
- package/dist/classic/app/wiring-types.d.ts +157 -0
- package/dist/classic/app/wiring-types.js +2 -0
- package/dist/classic/app/wiring-types.js.map +1 -0
- package/dist/classic/blocks/AssistantBlock.d.ts +3 -0
- package/dist/classic/blocks/AssistantBlock.js +6 -0
- package/dist/classic/blocks/AssistantBlock.js.map +1 -0
- package/dist/classic/blocks/BatchBlock.d.ts +3 -0
- package/dist/classic/blocks/BatchBlock.js +6 -0
- package/dist/classic/blocks/BatchBlock.js.map +1 -0
- package/dist/classic/blocks/CompactedBlock.d.ts +3 -0
- package/dist/classic/blocks/CompactedBlock.js +6 -0
- package/dist/classic/blocks/CompactedBlock.js.map +1 -0
- package/dist/classic/blocks/DiffBlock.d.ts +3 -0
- package/dist/classic/blocks/DiffBlock.js +6 -0
- package/dist/classic/blocks/DiffBlock.js.map +1 -0
- package/dist/classic/blocks/IntroBlock.d.ts +3 -0
- package/dist/classic/blocks/IntroBlock.js +6 -0
- package/dist/classic/blocks/IntroBlock.js.map +1 -0
- package/dist/classic/blocks/NoticeBlock.d.ts +3 -0
- package/dist/classic/blocks/NoticeBlock.js +6 -0
- package/dist/classic/blocks/NoticeBlock.js.map +1 -0
- package/dist/classic/blocks/ThinkingBlock.d.ts +3 -0
- package/dist/classic/blocks/ThinkingBlock.js +6 -0
- package/dist/classic/blocks/ThinkingBlock.js.map +1 -0
- package/dist/classic/blocks/ToolBlock.d.ts +3 -0
- package/dist/classic/blocks/ToolBlock.js +6 -0
- package/dist/classic/blocks/ToolBlock.js.map +1 -0
- package/dist/classic/blocks/UserBlock.d.ts +3 -0
- package/dist/classic/blocks/UserBlock.js +6 -0
- package/dist/classic/blocks/UserBlock.js.map +1 -0
- package/dist/classic/blocks/assistant-lines.d.ts +10 -0
- package/dist/classic/blocks/assistant-lines.js +43 -0
- package/dist/classic/blocks/assistant-lines.js.map +1 -0
- package/dist/classic/blocks/batch-lines.d.ts +7 -0
- package/dist/classic/blocks/batch-lines.js +79 -0
- package/dist/classic/blocks/batch-lines.js.map +1 -0
- package/dist/classic/blocks/block-context.d.ts +33 -0
- package/dist/classic/blocks/block-context.js +41 -0
- package/dist/classic/blocks/block-context.js.map +1 -0
- package/dist/classic/blocks/compacted-lines.d.ts +5 -0
- package/dist/classic/blocks/compacted-lines.js +54 -0
- package/dist/classic/blocks/compacted-lines.js.map +1 -0
- package/dist/classic/blocks/diff-lines.d.ts +13 -0
- package/dist/classic/blocks/diff-lines.js +116 -0
- package/dist/classic/blocks/diff-lines.js.map +1 -0
- package/dist/classic/blocks/intro-lines.d.ts +16 -0
- package/dist/classic/blocks/intro-lines.js +23 -0
- package/dist/classic/blocks/intro-lines.js.map +1 -0
- package/dist/classic/blocks/notice-lines.d.ts +7 -0
- package/dist/classic/blocks/notice-lines.js +28 -0
- package/dist/classic/blocks/notice-lines.js.map +1 -0
- package/dist/classic/blocks/thinking-lines.d.ts +5 -0
- package/dist/classic/blocks/thinking-lines.js +34 -0
- package/dist/classic/blocks/thinking-lines.js.map +1 -0
- package/dist/classic/blocks/tool-lines.d.ts +22 -0
- package/dist/classic/blocks/tool-lines.js +135 -0
- package/dist/classic/blocks/tool-lines.js.map +1 -0
- package/dist/classic/blocks/user-lines.d.ts +5 -0
- package/dist/classic/blocks/user-lines.js +26 -0
- package/dist/classic/blocks/user-lines.js.map +1 -0
- package/dist/classic/bootstrap/osc52-renderer.d.ts +10 -0
- package/dist/classic/bootstrap/osc52-renderer.js +38 -0
- package/dist/classic/bootstrap/osc52-renderer.js.map +1 -0
- package/dist/classic/bootstrap/renderer-handle.d.ts +15 -0
- package/dist/classic/bootstrap/renderer-handle.js +22 -0
- package/dist/classic/bootstrap/renderer-handle.js.map +1 -0
- package/dist/classic/bootstrap/start-classic.d.ts +8 -0
- package/dist/classic/bootstrap/start-classic.js +130 -0
- package/dist/classic/bootstrap/start-classic.js.map +1 -0
- package/dist/classic/bootstrap/suspend-port.d.ts +14 -0
- package/dist/classic/bootstrap/suspend-port.js +29 -0
- package/dist/classic/bootstrap/suspend-port.js.map +1 -0
- package/dist/classic/bootstrap/terminal-session.d.ts +58 -0
- package/dist/classic/bootstrap/terminal-session.js +136 -0
- package/dist/classic/bootstrap/terminal-session.js.map +1 -0
- package/dist/classic/chrome/Chrome.d.ts +19 -0
- package/dist/classic/chrome/Chrome.js +30 -0
- package/dist/classic/chrome/Chrome.js.map +1 -0
- package/dist/classic/chrome/Composer.d.ts +12 -0
- package/dist/classic/chrome/Composer.js +61 -0
- package/dist/classic/chrome/Composer.js.map +1 -0
- package/dist/classic/chrome/QueuePanel.d.ts +3 -0
- package/dist/classic/chrome/QueuePanel.js +10 -0
- package/dist/classic/chrome/QueuePanel.js.map +1 -0
- package/dist/classic/chrome/ResponderStrip.d.ts +3 -0
- package/dist/classic/chrome/ResponderStrip.js +9 -0
- package/dist/classic/chrome/ResponderStrip.js.map +1 -0
- package/dist/classic/chrome/StatusBar.d.ts +3 -0
- package/dist/classic/chrome/StatusBar.js +7 -0
- package/dist/classic/chrome/StatusBar.js.map +1 -0
- package/dist/classic/chrome/ToastRow.d.ts +3 -0
- package/dist/classic/chrome/ToastRow.js +10 -0
- package/dist/classic/chrome/ToastRow.js.map +1 -0
- package/dist/classic/chrome/composer-controller.d.ts +57 -0
- package/dist/classic/chrome/composer-controller.js +345 -0
- package/dist/classic/chrome/composer-controller.js.map +1 -0
- package/dist/classic/chrome/composer-frame.d.ts +35 -0
- package/dist/classic/chrome/composer-frame.js +46 -0
- package/dist/classic/chrome/composer-frame.js.map +1 -0
- package/dist/classic/chrome/composer-keys.d.ts +4 -0
- package/dist/classic/chrome/composer-keys.js +45 -0
- package/dist/classic/chrome/composer-keys.js.map +1 -0
- package/dist/classic/chrome/context-limit-editor.d.ts +7 -0
- package/dist/classic/chrome/context-limit-editor.js +13 -0
- package/dist/classic/chrome/context-limit-editor.js.map +1 -0
- package/dist/classic/chrome/directory-row.d.ts +14 -0
- package/dist/classic/chrome/directory-row.js +26 -0
- package/dist/classic/chrome/directory-row.js.map +1 -0
- package/dist/classic/chrome/editor-model.d.ts +37 -0
- package/dist/classic/chrome/editor-model.js +195 -0
- package/dist/classic/chrome/editor-model.js.map +1 -0
- package/dist/classic/chrome/editor-view.d.ts +34 -0
- package/dist/classic/chrome/editor-view.js +141 -0
- package/dist/classic/chrome/editor-view.js.map +1 -0
- package/dist/classic/chrome/queue-rows.d.ts +10 -0
- package/dist/classic/chrome/queue-rows.js +32 -0
- package/dist/classic/chrome/queue-rows.js.map +1 -0
- package/dist/classic/chrome/responder-row.d.ts +9 -0
- package/dist/classic/chrome/responder-row.js +17 -0
- package/dist/classic/chrome/responder-row.js.map +1 -0
- package/dist/classic/chrome/row-budget.d.ts +43 -0
- package/dist/classic/chrome/row-budget.js +78 -0
- package/dist/classic/chrome/row-budget.js.map +1 -0
- package/dist/classic/chrome/status-rows.d.ts +44 -0
- package/dist/classic/chrome/status-rows.js +165 -0
- package/dist/classic/chrome/status-rows.js.map +1 -0
- package/dist/classic/chrome/toast-rows.d.ts +14 -0
- package/dist/classic/chrome/toast-rows.js +82 -0
- package/dist/classic/chrome/toast-rows.js.map +1 -0
- package/dist/classic/chrome/use-terminal-size.d.ts +14 -0
- package/dist/classic/chrome/use-terminal-size.js +38 -0
- package/dist/classic/chrome/use-terminal-size.js.map +1 -0
- package/dist/classic/feed/Feed.d.ts +17 -0
- package/dist/classic/feed/Feed.js +37 -0
- package/dist/classic/feed/Feed.js.map +1 -0
- package/dist/classic/feed/FeedStatic.d.ts +13 -0
- package/dist/classic/feed/FeedStatic.js +15 -0
- package/dist/classic/feed/FeedStatic.js.map +1 -0
- package/dist/classic/feed/LiveTail.d.ts +10 -0
- package/dist/classic/feed/LiveTail.js +20 -0
- package/dist/classic/feed/LiveTail.js.map +1 -0
- package/dist/classic/feed/ScrollbarGutter.d.ts +9 -0
- package/dist/classic/feed/ScrollbarGutter.js +42 -0
- package/dist/classic/feed/ScrollbarGutter.js.map +1 -0
- package/dist/classic/feed/block-height.d.ts +12 -0
- package/dist/classic/feed/block-height.js +34 -0
- package/dist/classic/feed/block-height.js.map +1 -0
- package/dist/classic/feed/commit-ledger.d.ts +26 -0
- package/dist/classic/feed/commit-ledger.js +52 -0
- package/dist/classic/feed/commit-ledger.js.map +1 -0
- package/dist/classic/feed/feed-blocks.d.ts +39 -0
- package/dist/classic/feed/feed-blocks.js +124 -0
- package/dist/classic/feed/feed-blocks.js.map +1 -0
- package/dist/classic/feed/live-tail-policy.d.ts +35 -0
- package/dist/classic/feed/live-tail-policy.js +80 -0
- package/dist/classic/feed/live-tail-policy.js.map +1 -0
- package/dist/classic/feed/scrollbar-rows.d.ts +6 -0
- package/dist/classic/feed/scrollbar-rows.js +18 -0
- package/dist/classic/feed/scrollbar-rows.js.map +1 -0
- package/dist/classic/feed/transcript-selection.d.ts +16 -0
- package/dist/classic/feed/transcript-selection.js +92 -0
- package/dist/classic/feed/transcript-selection.js.map +1 -0
- package/dist/classic/feed/transcript-window.d.ts +33 -0
- package/dist/classic/feed/transcript-window.js +53 -0
- package/dist/classic/feed/transcript-window.js.map +1 -0
- package/dist/classic/input/cancel-ladder.d.ts +47 -0
- package/dist/classic/input/cancel-ladder.js +100 -0
- package/dist/classic/input/cancel-ladder.js.map +1 -0
- package/dist/classic/input/chord-from-key.d.ts +2 -0
- package/dist/classic/input/chord-from-key.js +25 -0
- package/dist/classic/input/chord-from-key.js.map +1 -0
- package/dist/classic/input/input-router.d.ts +33 -0
- package/dist/classic/input/input-router.js +146 -0
- package/dist/classic/input/input-router.js.map +1 -0
- package/dist/classic/input/key-event.d.ts +39 -0
- package/dist/classic/input/key-event.js +12 -0
- package/dist/classic/input/key-event.js.map +1 -0
- package/dist/classic/input/paste-decoder.d.ts +1 -0
- package/dist/classic/input/paste-decoder.js +9 -0
- package/dist/classic/input/paste-decoder.js.map +1 -0
- package/dist/classic/input/raw-decoder.d.ts +31 -0
- package/dist/classic/input/raw-decoder.js +325 -0
- package/dist/classic/input/raw-decoder.js.map +1 -0
- package/dist/classic/input/sgr-mouse.d.ts +2 -0
- package/dist/classic/input/sgr-mouse.js +37 -0
- package/dist/classic/input/sgr-mouse.js.map +1 -0
- package/dist/classic/input/terminal-sequences.d.ts +38 -0
- package/dist/classic/input/terminal-sequences.js +111 -0
- package/dist/classic/input/terminal-sequences.js.map +1 -0
- package/dist/classic/panels/CompletionPanel.d.ts +3 -0
- package/dist/classic/panels/CompletionPanel.js +10 -0
- package/dist/classic/panels/CompletionPanel.js.map +1 -0
- package/dist/classic/panels/ConfirmPanel.d.ts +3 -0
- package/dist/classic/panels/ConfirmPanel.js +7 -0
- package/dist/classic/panels/ConfirmPanel.js.map +1 -0
- package/dist/classic/panels/JobsPanel.d.ts +3 -0
- package/dist/classic/panels/JobsPanel.js +7 -0
- package/dist/classic/panels/JobsPanel.js.map +1 -0
- package/dist/classic/panels/KeysPanel.d.ts +3 -0
- package/dist/classic/panels/KeysPanel.js +7 -0
- package/dist/classic/panels/KeysPanel.js.map +1 -0
- package/dist/classic/panels/PagerPanel.d.ts +3 -0
- package/dist/classic/panels/PagerPanel.js +7 -0
- package/dist/classic/panels/PagerPanel.js.map +1 -0
- package/dist/classic/panels/PanelFrame.d.ts +3 -0
- package/dist/classic/panels/PanelFrame.js +8 -0
- package/dist/classic/panels/PanelFrame.js.map +1 -0
- package/dist/classic/panels/PickerPanel.d.ts +3 -0
- package/dist/classic/panels/PickerPanel.js +7 -0
- package/dist/classic/panels/PickerPanel.js.map +1 -0
- package/dist/classic/panels/PlanPanel.d.ts +3 -0
- package/dist/classic/panels/PlanPanel.js +7 -0
- package/dist/classic/panels/PlanPanel.js.map +1 -0
- package/dist/classic/panels/PromptActionsPanel.d.ts +3 -0
- package/dist/classic/panels/PromptActionsPanel.js +7 -0
- package/dist/classic/panels/PromptActionsPanel.js.map +1 -0
- package/dist/classic/panels/ScopePanel.d.ts +3 -0
- package/dist/classic/panels/ScopePanel.js +7 -0
- package/dist/classic/panels/ScopePanel.js.map +1 -0
- package/dist/classic/panels/SearchPanel.d.ts +3 -0
- package/dist/classic/panels/SearchPanel.js +7 -0
- package/dist/classic/panels/SearchPanel.js.map +1 -0
- package/dist/classic/panels/SecretPanel.d.ts +3 -0
- package/dist/classic/panels/SecretPanel.js +7 -0
- package/dist/classic/panels/SecretPanel.js.map +1 -0
- package/dist/classic/panels/completion-accept.d.ts +17 -0
- package/dist/classic/panels/completion-accept.js +58 -0
- package/dist/classic/panels/completion-accept.js.map +1 -0
- package/dist/classic/panels/completion-rows.d.ts +29 -0
- package/dist/classic/panels/completion-rows.js +135 -0
- package/dist/classic/panels/completion-rows.js.map +1 -0
- package/dist/classic/panels/confirm-panel.d.ts +24 -0
- package/dist/classic/panels/confirm-panel.js +115 -0
- package/dist/classic/panels/confirm-panel.js.map +1 -0
- package/dist/classic/panels/jobs-panel.d.ts +32 -0
- package/dist/classic/panels/jobs-panel.js +116 -0
- package/dist/classic/panels/jobs-panel.js.map +1 -0
- package/dist/classic/panels/keys-panel.d.ts +40 -0
- package/dist/classic/panels/keys-panel.js +174 -0
- package/dist/classic/panels/keys-panel.js.map +1 -0
- package/dist/classic/panels/list-rows.d.ts +27 -0
- package/dist/classic/panels/list-rows.js +42 -0
- package/dist/classic/panels/list-rows.js.map +1 -0
- package/dist/classic/panels/list-window.d.ts +15 -0
- package/dist/classic/panels/list-window.js +25 -0
- package/dist/classic/panels/list-window.js.map +1 -0
- package/dist/classic/panels/pager-panel.d.ts +50 -0
- package/dist/classic/panels/pager-panel.js +238 -0
- package/dist/classic/panels/pager-panel.js.map +1 -0
- package/dist/classic/panels/panel-controller.d.ts +29 -0
- package/dist/classic/panels/panel-controller.js +320 -0
- package/dist/classic/panels/panel-controller.js.map +1 -0
- package/dist/classic/panels/panel-effect.d.ts +74 -0
- package/dist/classic/panels/panel-effect.js +7 -0
- package/dist/classic/panels/panel-effect.js.map +1 -0
- package/dist/classic/panels/panel-effects.d.ts +11 -0
- package/dist/classic/panels/panel-effects.js +105 -0
- package/dist/classic/panels/panel-effects.js.map +1 -0
- package/dist/classic/panels/panel-frame.d.ts +20 -0
- package/dist/classic/panels/panel-frame.js +47 -0
- package/dist/classic/panels/panel-frame.js.map +1 -0
- package/dist/classic/panels/panel-host.d.ts +16 -0
- package/dist/classic/panels/panel-host.js +49 -0
- package/dist/classic/panels/panel-host.js.map +1 -0
- package/dist/classic/panels/panel-initial-states.d.ts +18 -0
- package/dist/classic/panels/panel-initial-states.js +33 -0
- package/dist/classic/panels/panel-initial-states.js.map +1 -0
- package/dist/classic/panels/panel-types.d.ts +47 -0
- package/dist/classic/panels/panel-types.js +2 -0
- package/dist/classic/panels/panel-types.js.map +1 -0
- package/dist/classic/panels/panel-wheel.d.ts +20 -0
- package/dist/classic/panels/panel-wheel.js +82 -0
- package/dist/classic/panels/panel-wheel.js.map +1 -0
- package/dist/classic/panels/picker-panel.d.ts +35 -0
- package/dist/classic/panels/picker-panel.js +150 -0
- package/dist/classic/panels/picker-panel.js.map +1 -0
- package/dist/classic/panels/plan-panel.d.ts +27 -0
- package/dist/classic/panels/plan-panel.js +98 -0
- package/dist/classic/panels/plan-panel.js.map +1 -0
- package/dist/classic/panels/prompt-actions-panel.d.ts +25 -0
- package/dist/classic/panels/prompt-actions-panel.js +57 -0
- package/dist/classic/panels/prompt-actions-panel.js.map +1 -0
- package/dist/classic/panels/scope-panel.d.ts +27 -0
- package/dist/classic/panels/scope-panel.js +122 -0
- package/dist/classic/panels/scope-panel.js.map +1 -0
- package/dist/classic/panels/search-panel.d.ts +32 -0
- package/dist/classic/panels/search-panel.js +126 -0
- package/dist/classic/panels/search-panel.js.map +1 -0
- package/dist/classic/panels/secret-panel.d.ts +28 -0
- package/dist/classic/panels/secret-panel.js +70 -0
- package/dist/classic/panels/secret-panel.js.map +1 -0
- package/dist/classic/render/ansi-text.d.ts +36 -0
- package/dist/classic/render/ansi-text.js +234 -0
- package/dist/classic/render/ansi-text.js.map +1 -0
- package/dist/classic/render/glyphs.d.ts +49 -0
- package/dist/classic/render/glyphs.js +111 -0
- package/dist/classic/render/glyphs.js.map +1 -0
- package/dist/classic/render/ink-theme.d.ts +49 -0
- package/dist/classic/render/ink-theme.js +73 -0
- package/dist/classic/render/ink-theme.js.map +1 -0
- package/dist/classic/render/measure.d.ts +17 -0
- package/dist/classic/render/measure.js +33 -0
- package/dist/classic/render/measure.js.map +1 -0
- package/dist/classic/render/shell-width.d.ts +12 -0
- package/dist/classic/render/shell-width.js +23 -0
- package/dist/classic/render/shell-width.js.map +1 -0
- package/dist/classic/render/wrap.d.ts +19 -0
- package/dist/classic/render/wrap.js +102 -0
- package/dist/classic/render/wrap.js.map +1 -0
- package/dist/commands/doctor.js +9 -8
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/providers.js +43 -50
- package/dist/commands/providers.js.map +1 -1
- package/dist/commands/search-providers.js +3 -5
- package/dist/commands/search-providers.js.map +1 -1
- package/dist/index.js +76 -84
- package/dist/index.js.map +1 -1
- package/dist/llm/capabilities.js +5 -2
- package/dist/llm/capabilities.js.map +1 -1
- package/dist/llm/custom-providers.js +16 -3
- package/dist/llm/custom-providers.js.map +1 -1
- package/dist/llm/http.d.ts +5 -0
- package/dist/llm/http.js +38 -8
- package/dist/llm/http.js.map +1 -1
- package/dist/llm/meta.js +56 -24
- package/dist/llm/meta.js.map +1 -1
- package/dist/llm/modal.js +3 -2
- package/dist/llm/modal.js.map +1 -1
- package/dist/llm/router.js +36 -23
- package/dist/llm/router.js.map +1 -1
- package/dist/llm/system-messages.d.ts +1 -0
- package/dist/llm/system-messages.js +6 -0
- package/dist/llm/system-messages.js.map +1 -1
- package/dist/llm/token-usage.js +11 -1
- package/dist/llm/token-usage.js.map +1 -1
- package/dist/llm/tool-protocol.js +10 -3
- package/dist/llm/tool-protocol.js.map +1 -1
- package/dist/modes/agent.d.ts +3 -0
- package/dist/modes/agent.js +10 -3
- package/dist/modes/agent.js.map +1 -1
- package/dist/modes/ask.js +2 -2
- package/dist/modes/ask.js.map +1 -1
- package/dist/noninteractive/read-stdin.d.ts +1 -0
- package/dist/noninteractive/read-stdin.js +8 -0
- package/dist/noninteractive/read-stdin.js.map +1 -0
- package/dist/noninteractive/readline-prompts.d.ts +47 -0
- package/dist/noninteractive/readline-prompts.js +201 -0
- package/dist/noninteractive/readline-prompts.js.map +1 -0
- package/dist/noninteractive/start-noninteractive.d.ts +32 -0
- package/dist/noninteractive/start-noninteractive.js +100 -0
- package/dist/noninteractive/start-noninteractive.js.map +1 -0
- package/dist/noninteractive/stdio-confirm-port.d.ts +15 -0
- package/dist/noninteractive/stdio-confirm-port.js +45 -0
- package/dist/noninteractive/stdio-confirm-port.js.map +1 -0
- package/dist/noninteractive/stream-blocks.d.ts +117 -0
- package/dist/noninteractive/stream-blocks.js +445 -0
- package/dist/noninteractive/stream-blocks.js.map +1 -0
- package/dist/noninteractive/stream-renderer.d.ts +40 -0
- package/dist/noninteractive/stream-renderer.js +164 -0
- package/dist/noninteractive/stream-renderer.js.map +1 -0
- package/dist/noninteractive/stream-spinner.d.ts +28 -0
- package/dist/noninteractive/stream-spinner.js +45 -0
- package/dist/noninteractive/stream-spinner.js.map +1 -0
- package/dist/os/bun-runtime.js +207 -0
- package/dist/os/bun-runtime.js.map +1 -0
- package/dist/store/config.d.ts +3 -1
- package/dist/store/config.js +37 -5
- package/dist/store/config.js.map +1 -1
- package/dist/store/history.d.ts +1 -1
- package/dist/store/history.js +3 -0
- package/dist/store/history.js.map +1 -1
- package/dist/store/keys.d.ts +5 -2
- package/dist/store/keys.js +97 -14
- package/dist/store/keys.js.map +1 -1
- package/dist/tools/registry.js +27 -4
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/web/providers/duckduckgo.js +1 -1
- package/dist/tools/web/providers/duckduckgo.js.map +1 -1
- package/dist/tools/web/readable.js +1 -1
- package/dist/tools/web/readable.js.map +1 -1
- package/dist/tui-v2/app/App.js +20 -28
- package/dist/tui-v2/app/App.js.map +1 -1
- package/dist/tui-v2/bootstrap/pager-export.d.ts +9 -18
- package/dist/tui-v2/bootstrap/pager-export.js +15 -72
- package/dist/tui-v2/bootstrap/pager-export.js.map +1 -1
- package/dist/tui-v2/bootstrap/start-tui-v2.js +8 -8
- package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
- package/dist/tui-v2/components/completion/completion-menu.d.ts +2 -2
- package/dist/tui-v2/components/composer/composer-input-box.d.ts +1 -1
- package/dist/tui-v2/components/composer/paste-chip.d.ts +2 -2
- package/dist/tui-v2/components/composer/paste-chip.js +1 -1
- package/dist/tui-v2/components/composer/paste-chip.js.map +1 -1
- package/dist/tui-v2/components/jobs/jobs-panel.d.ts +2 -2
- package/dist/tui-v2/components/jobs/jobs-panel.js +4 -4
- package/dist/tui-v2/components/jobs/jobs-panel.js.map +1 -1
- package/dist/tui-v2/components/modal/confirm-modal.d.ts +3 -3
- package/dist/tui-v2/components/modal/confirm-modal.js +6 -6
- package/dist/tui-v2/components/modal/confirm-modal.js.map +1 -1
- package/dist/tui-v2/components/modal/keys-modal.d.ts +3 -3
- package/dist/tui-v2/components/modal/keys-modal.js +24 -9
- package/dist/tui-v2/components/modal/keys-modal.js.map +1 -1
- package/dist/tui-v2/components/modal/prompt-actions-modal.d.ts +3 -3
- package/dist/tui-v2/components/modal/prompt-actions-modal.js +2 -2
- package/dist/tui-v2/components/modal/prompt-actions-modal.js.map +1 -1
- package/dist/tui-v2/components/modal/scope-modal.d.ts +3 -3
- package/dist/tui-v2/components/modal/scope-modal.js +1 -1
- package/dist/tui-v2/components/modal/scope-modal.js.map +1 -1
- package/dist/tui-v2/components/modal/secret-modal.d.ts +3 -3
- package/dist/tui-v2/components/modal/secret-modal.js +2 -2
- package/dist/tui-v2/components/modal/secret-modal.js.map +1 -1
- package/dist/tui-v2/components/overlay/overlay-host.d.ts +2 -2
- package/dist/tui-v2/components/overlay/overlay-host.js +1 -1
- package/dist/tui-v2/components/overlay/overlay-host.js.map +1 -1
- package/dist/tui-v2/components/pager/pager-line.d.ts +3 -3
- package/dist/tui-v2/components/pager/pager-line.js +3 -3
- package/dist/tui-v2/components/pager/pager-line.js.map +1 -1
- package/dist/tui-v2/components/pager/pager.d.ts +3 -3
- package/dist/tui-v2/components/pager/pager.js +6 -5
- package/dist/tui-v2/components/pager/pager.js.map +1 -1
- package/dist/tui-v2/components/picker/picker.d.ts +3 -3
- package/dist/tui-v2/components/picker/picker.js +2 -2
- package/dist/tui-v2/components/picker/picker.js.map +1 -1
- package/dist/tui-v2/components/plan/plan-pane-anim.js +1 -1
- package/dist/tui-v2/components/plan/plan-pane-anim.js.map +1 -1
- package/dist/tui-v2/components/plan/plan-view.d.ts +2 -2
- package/dist/tui-v2/components/plan/plan-view.js +2 -2
- package/dist/tui-v2/components/plan/plan-view.js.map +1 -1
- package/dist/tui-v2/components/queue/queue-panel.d.ts +2 -2
- package/dist/tui-v2/components/queue/queue-panel.js +3 -3
- package/dist/tui-v2/components/queue/queue-panel.js.map +1 -1
- package/dist/tui-v2/components/status/context-limit-chip.d.ts +1 -5
- package/dist/tui-v2/components/status/context-limit-chip.js +1 -38
- package/dist/tui-v2/components/status/context-limit-chip.js.map +1 -1
- package/dist/tui-v2/components/status/status-line.d.ts +5 -34
- package/dist/tui-v2/components/status/status-line.js +7 -99
- package/dist/tui-v2/components/status/status-line.js.map +1 -1
- package/dist/tui-v2/components/toast/toast-anim.d.ts +0 -1
- package/dist/tui-v2/components/toast/toast-anim.js +2 -3
- package/dist/tui-v2/components/toast/toast-anim.js.map +1 -1
- package/dist/tui-v2/components/toast/toast-host.d.ts +2 -2
- package/dist/tui-v2/components/toast/toast-host.js +2 -2
- package/dist/tui-v2/components/toast/toast-host.js.map +1 -1
- package/dist/tui-v2/components/transcript/assistant-message.d.ts +2 -2
- package/dist/tui-v2/components/transcript/assistant-message.js +3 -2
- package/dist/tui-v2/components/transcript/assistant-message.js.map +1 -1
- package/dist/tui-v2/components/transcript/compacted-row.d.ts +3 -3
- package/dist/tui-v2/components/transcript/compacted-row.js +6 -5
- package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -1
- package/dist/tui-v2/components/transcript/file-diff-card.d.ts +1 -1
- package/dist/tui-v2/components/transcript/file-diff-card.js +1 -1
- package/dist/tui-v2/components/transcript/file-diff-card.js.map +1 -1
- package/dist/tui-v2/components/transcript/intro-card.d.ts +2 -2
- package/dist/tui-v2/components/transcript/intro-card.js +1 -1
- package/dist/tui-v2/components/transcript/intro-card.js.map +1 -1
- package/dist/tui-v2/components/transcript/linkable-text.d.ts +1 -1
- package/dist/tui-v2/components/transcript/linkable-text.js +1 -1
- package/dist/tui-v2/components/transcript/linkable-text.js.map +1 -1
- package/dist/tui-v2/components/transcript/notice-row.d.ts +2 -2
- package/dist/tui-v2/components/transcript/search-bar.d.ts +1 -1
- package/dist/tui-v2/components/transcript/thinking-block.d.ts +2 -2
- package/dist/tui-v2/components/transcript/thinking-block.js +3 -3
- package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -1
- package/dist/tui-v2/components/transcript/tool-card.d.ts +3 -3
- package/dist/tui-v2/components/transcript/tool-card.js +7 -7
- package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
- package/dist/tui-v2/components/transcript/transcript-row.d.ts +4 -4
- package/dist/tui-v2/components/transcript/transcript-scrollbar.d.ts +1 -1
- package/dist/tui-v2/components/transcript/transcript-view.d.ts +3 -3
- package/dist/tui-v2/components/transcript/transcript-view.js +6 -6
- package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -1
- package/dist/tui-v2/components/transcript/use-native-selection-copy.d.ts +1 -1
- package/dist/tui-v2/components/transcript/use-transcript-selection.d.ts +2 -2
- package/dist/tui-v2/components/transcript/use-transcript-selection.js +3 -3
- package/dist/tui-v2/components/transcript/use-transcript-selection.js.map +1 -1
- package/dist/tui-v2/components/transcript/user-message.d.ts +2 -2
- package/dist/tui-v2/components/transcript/user-message.js +1 -1
- package/dist/tui-v2/components/transcript/user-message.js.map +1 -1
- package/dist/tui-v2/composer/composer-editor.d.ts +2 -2
- package/dist/tui-v2/composer/composer-editor.js +20 -22
- package/dist/tui-v2/composer/composer-editor.js.map +1 -1
- package/dist/tui-v2/composer/composer-image-paste.d.ts +1 -1
- package/dist/tui-v2/composer/composer-image-paste.js +1 -1
- package/dist/tui-v2/composer/composer-image-paste.js.map +1 -1
- package/dist/tui-v2/composer/use-draft-actions.d.ts +2 -2
- package/dist/tui-v2/composer/use-draft-actions.js +2 -2
- package/dist/tui-v2/composer/use-draft-actions.js.map +1 -1
- package/dist/tui-v2/input/chord-from-opentui-key.d.ts +20 -0
- package/dist/tui-v2/input/chord-from-opentui-key.js +51 -0
- package/dist/tui-v2/input/chord-from-opentui-key.js.map +1 -0
- package/dist/tui-v2/rendering/pager-markdown.d.ts +2 -22
- package/dist/tui-v2/rendering/pager-markdown.js +4 -103
- package/dist/tui-v2/rendering/pager-markdown.js.map +1 -1
- package/dist/tui-v2/rendering/styled-markdown.d.ts +20 -0
- package/dist/tui-v2/rendering/styled-markdown.js +35 -0
- package/dist/tui-v2/rendering/styled-markdown.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/ui/mentions.d.ts +5 -8
- package/dist/ui/mentions.js +26 -8
- package/dist/ui/mentions.js.map +1 -1
- package/dist/ui/warn-once.d.ts +2 -0
- package/dist/ui/warn-once.js +13 -0
- package/dist/ui/warn-once.js.map +1 -0
- package/dist/ui-core/actions/action-id.d.ts +14 -0
- package/dist/ui-core/actions/action-id.js +123 -0
- package/dist/ui-core/actions/action-id.js.map +1 -0
- package/dist/ui-core/actions/action-router.js.map +1 -0
- package/dist/ui-core/actions/chord.d.ts +20 -0
- package/dist/ui-core/actions/chord.js +28 -0
- package/dist/ui-core/actions/chord.js.map +1 -0
- package/dist/ui-core/actions/format-shortcuts.js +267 -0
- package/dist/ui-core/actions/format-shortcuts.js.map +1 -0
- package/dist/ui-core/actions/keymap.d.ts +23 -0
- package/dist/ui-core/actions/keymap.js +145 -0
- package/dist/ui-core/actions/keymap.js.map +1 -0
- package/dist/ui-core/actions/mode-cycle.js.map +1 -0
- package/dist/ui-core/bootstrap/can-use-tui.js.map +1 -0
- package/dist/ui-core/bootstrap/capabilities.d.ts +37 -0
- package/dist/ui-core/bootstrap/capabilities.js +111 -0
- package/dist/ui-core/bootstrap/capabilities.js.map +1 -0
- package/dist/ui-core/bootstrap/composition-root.d.ts +92 -0
- package/dist/ui-core/bootstrap/composition-root.js.map +1 -0
- package/dist/ui-core/bootstrap/console-guard.js.map +1 -0
- package/dist/ui-core/bootstrap/console-suppress.js.map +1 -0
- package/dist/ui-core/bootstrap/lifecycle.js.map +1 -0
- package/dist/ui-core/bootstrap/overlay-ports.js +92 -0
- package/dist/ui-core/bootstrap/overlay-ports.js.map +1 -0
- package/dist/ui-core/bootstrap/ui-selection.d.ts +27 -0
- package/dist/ui-core/bootstrap/ui-selection.js +109 -0
- package/dist/ui-core/bootstrap/ui-selection.js.map +1 -0
- package/dist/ui-core/commands/command-handlers.js +86 -0
- package/dist/ui-core/commands/command-handlers.js.map +1 -0
- package/dist/ui-core/commands/config-commands.d.ts +14 -0
- package/dist/ui-core/commands/config-commands.js +315 -0
- package/dist/ui-core/commands/config-commands.js.map +1 -0
- package/dist/ui-core/commands/key-commands.d.ts +9 -0
- package/dist/ui-core/commands/key-commands.js +532 -0
- package/dist/ui-core/commands/key-commands.js.map +1 -0
- package/dist/ui-core/commands/picker-commands.d.ts +25 -0
- package/dist/ui-core/commands/picker-commands.js +1045 -0
- package/dist/ui-core/commands/picker-commands.js.map +1 -0
- package/dist/ui-core/commands/session-commands.d.ts +19 -0
- package/dist/ui-core/commands/session-commands.js +183 -0
- package/dist/ui-core/commands/session-commands.js.map +1 -0
- package/dist/ui-core/commands/startup-update.js.map +1 -0
- package/dist/ui-core/composer/arrow-intent.js.map +1 -0
- package/dist/ui-core/composer/completion.js.map +1 -0
- package/dist/ui-core/composer/composer-action-port.js.map +1 -0
- package/dist/ui-core/composer/composer-height.js +29 -0
- package/dist/ui-core/composer/composer-height.js.map +1 -0
- package/dist/ui-core/composer/composer-image-paste.d.ts +20 -0
- package/dist/ui-core/composer/composer-image-paste.js +77 -0
- package/dist/ui-core/composer/composer-image-paste.js.map +1 -0
- package/dist/ui-core/composer/composer-meta.js.map +1 -0
- package/dist/ui-core/composer/composer-wheel.d.ts +58 -0
- package/dist/ui-core/composer/composer-wheel.js +108 -0
- package/dist/ui-core/composer/composer-wheel.js.map +1 -0
- package/dist/ui-core/composer/draft-actions.d.ts +31 -0
- package/dist/ui-core/composer/draft-actions.js +45 -0
- package/dist/ui-core/composer/draft-actions.js.map +1 -0
- package/dist/ui-core/composer/history-nav.js.map +1 -0
- package/dist/ui-core/composer/input-history.js +9 -0
- package/dist/ui-core/composer/input-history.js.map +1 -0
- package/dist/ui-core/composer/newline-hint.d.ts +13 -0
- package/dist/ui-core/composer/newline-hint.js.map +1 -0
- package/dist/ui-core/composer/paste-placeholder.js.map +1 -0
- package/dist/ui-core/composer/prompt-history.js.map +1 -0
- package/dist/ui-core/composer/secret-buffer.js.map +1 -0
- package/dist/ui-core/composer/textarea-keybindings.d.ts +25 -0
- package/dist/ui-core/composer/textarea-keybindings.js +84 -0
- package/dist/ui-core/composer/textarea-keybindings.js.map +1 -0
- package/dist/ui-core/controllers/focus-controller.js.map +1 -0
- package/dist/ui-core/controllers/interruptible-controller.js.map +1 -0
- package/dist/ui-core/controllers/overlay-controller.d.ts +211 -0
- package/dist/ui-core/controllers/overlay-controller.js.map +1 -0
- package/dist/ui-core/controllers/selection-controller.js.map +1 -0
- package/dist/ui-core/controllers/toast-controller.js.map +1 -0
- package/dist/ui-core/layout/compute-layout.js.map +1 -0
- package/dist/ui-core/motion/ease.js.map +1 -0
- package/dist/ui-core/notify.js.map +1 -0
- package/dist/ui-core/plan/plan-lifecycle.js.map +1 -0
- package/dist/ui-core/ports/clipboard-osc52.js +44 -0
- package/dist/ui-core/ports/clipboard-osc52.js.map +1 -0
- package/dist/ui-core/ports/pager-export-port.d.ts +16 -0
- package/dist/ui-core/ports/pager-export-port.js +70 -0
- package/dist/ui-core/ports/pager-export-port.js.map +1 -0
- package/dist/ui-core/ports/renderer-port.d.ts +10 -0
- package/dist/ui-core/ports/renderer-port.js +2 -0
- package/dist/ui-core/ports/renderer-port.js.map +1 -0
- package/dist/ui-core/react/providers.d.ts +16 -0
- package/dist/ui-core/react/providers.js +31 -0
- package/dist/ui-core/react/providers.js.map +1 -0
- package/dist/ui-core/react/use-has-draft.js.map +1 -0
- package/dist/ui-core/react/use-overlay.js.map +1 -0
- package/dist/ui-core/react/use-plan.js.map +1 -0
- package/dist/ui-core/react/use-session-state.js.map +1 -0
- package/dist/ui-core/react/use-toast.js.map +1 -0
- package/dist/ui-core/react/use-transcript-store.d.ts +10 -0
- package/dist/ui-core/react/use-transcript-store.js.map +1 -0
- package/dist/ui-core/rendering/artifact-pager-source.js.map +1 -0
- package/dist/ui-core/rendering/batch-sections.js.map +1 -0
- package/dist/ui-core/rendering/code-block.d.ts +48 -0
- package/dist/ui-core/rendering/code-block.js +407 -0
- package/dist/ui-core/rendering/code-block.js.map +1 -0
- package/dist/ui-core/rendering/context-limit.d.ts +8 -0
- package/dist/ui-core/rendering/context-limit.js +49 -0
- package/dist/ui-core/rendering/context-limit.js.map +1 -0
- package/dist/ui-core/rendering/file-diff-view.js.map +1 -0
- package/dist/ui-core/rendering/format-help.js.map +1 -0
- package/dist/ui-core/rendering/format-keys.d.ts +14 -0
- package/dist/ui-core/rendering/format-keys.js +78 -0
- package/dist/ui-core/rendering/format-keys.js.map +1 -0
- package/dist/ui-core/rendering/incremental-strip.js.map +1 -0
- package/dist/ui-core/rendering/intro-header.js.map +1 -0
- package/dist/ui-core/rendering/job-tail-source.js.map +1 -0
- package/dist/ui-core/rendering/link-detector.js.map +1 -0
- package/dist/ui-core/rendering/markdown.js.map +1 -0
- package/dist/ui-core/rendering/open-tool-output.js +346 -0
- package/dist/ui-core/rendering/open-tool-output.js.map +1 -0
- package/dist/ui-core/rendering/pager-chrome.js +119 -0
- package/dist/ui-core/rendering/pager-chrome.js.map +1 -0
- package/dist/ui-core/rendering/pager-source.d.ts +20 -0
- package/dist/ui-core/rendering/pager-source.js +101 -0
- package/dist/ui-core/rendering/pager-source.js.map +1 -0
- package/dist/ui-core/rendering/pager-text.d.ts +24 -0
- package/dist/ui-core/rendering/pager-text.js +105 -0
- package/dist/ui-core/rendering/pager-text.js.map +1 -0
- package/dist/ui-core/rendering/pager-view-policy.js +98 -0
- package/dist/ui-core/rendering/pager-view-policy.js.map +1 -0
- package/dist/ui-core/rendering/picker-filter.js.map +1 -0
- package/dist/ui-core/rendering/plan-view.js.map +1 -0
- package/dist/ui-core/rendering/prompt-preview.js.map +1 -0
- package/dist/ui-core/rendering/render-markdown-lines.d.ts +7 -0
- package/dist/ui-core/rendering/render-markdown-lines.js +26 -0
- package/dist/ui-core/rendering/render-markdown-lines.js.map +1 -0
- package/dist/ui-core/rendering/sanitize-display.js.map +1 -0
- package/dist/ui-core/rendering/status-segments.d.ts +25 -0
- package/dist/ui-core/rendering/status-segments.js +88 -0
- package/dist/ui-core/rendering/status-segments.js.map +1 -0
- package/dist/ui-core/rendering/streaming-markdown.d.ts +23 -0
- package/dist/ui-core/rendering/streaming-markdown.js +118 -0
- package/dist/ui-core/rendering/streaming-markdown.js.map +1 -0
- package/dist/ui-core/rendering/strip-tool-surfaces.js.map +1 -0
- package/dist/ui-core/rendering/syntax-highlight.js.map +1 -0
- package/dist/ui-core/rendering/text-format.js.map +1 -0
- package/dist/ui-core/rendering/text-width.js.map +1 -0
- package/dist/ui-core/rendering/theme.js.map +1 -0
- package/dist/ui-core/rendering/thinking-tail.js.map +1 -0
- package/dist/ui-core/rendering/tool-presenter.d.ts +68 -0
- package/dist/ui-core/rendering/tool-presenter.js +371 -0
- package/dist/ui-core/rendering/tool-presenter.js.map +1 -0
- package/dist/ui-core/rendering/transcript-export.d.ts +11 -0
- package/dist/ui-core/rendering/transcript-export.js +18 -0
- package/dist/ui-core/rendering/transcript-export.js.map +1 -0
- package/dist/ui-core/rendering/transcript-semantic.js.map +1 -0
- package/dist/ui-core/rendering/user-message-wrap.d.ts +18 -0
- package/dist/ui-core/rendering/user-message-wrap.js +23 -0
- package/dist/ui-core/rendering/user-message-wrap.js.map +1 -0
- package/dist/ui-core/rendering/wordmark.js.map +1 -0
- package/dist/ui-core/state/pager-search.js.map +1 -0
- package/dist/ui-core/state/semantic-document.js.map +1 -0
- package/dist/ui-core/state/transcript-compaction.js.map +1 -0
- package/dist/ui-core/state/transcript-hydrate.d.ts +67 -0
- package/dist/ui-core/state/transcript-hydrate.js +665 -0
- package/dist/ui-core/state/transcript-hydrate.js.map +1 -0
- package/dist/ui-core/state/transcript-reducer.js +484 -0
- package/dist/ui-core/state/transcript-reducer.js.map +1 -0
- package/dist/ui-core/state/transcript-search.js.map +1 -0
- package/dist/ui-core/state/transcript-store.js.map +1 -0
- package/dist/ui-core/state/transcript-struct.js.map +1 -0
- package/dist/ui-core/state/transcript-types.d.ts +103 -0
- package/dist/ui-core/state/transcript-types.js.map +1 -0
- package/dist/version.generated.d.ts +2 -2
- package/dist/version.generated.js +2 -2
- package/dist/version.generated.js.map +1 -1
- package/package.json +18 -12
- package/dist/agent/classic-renderer.d.ts +0 -5
- package/dist/agent/classic-renderer.js +0 -136
- package/dist/agent/classic-renderer.js.map +0 -1
- package/dist/app/adapters/current-terminal-adapter.d.ts +0 -2
- package/dist/app/adapters/current-terminal-adapter.js +0 -24
- package/dist/app/adapters/current-terminal-adapter.js.map +0 -1
- package/dist/app/controllers/job-controller.d.ts +0 -28
- package/dist/app/controllers/job-controller.js +0 -70
- package/dist/app/controllers/job-controller.js.map +0 -1
- package/dist/repl/prompt-line.d.ts +0 -24
- package/dist/repl/prompt-line.js +0 -558
- package/dist/repl/prompt-line.js.map +0 -1
- package/dist/repl/slash-commands.js +0 -392
- package/dist/repl/slash-commands.js.map +0 -1
- package/dist/repl.d.ts +0 -18
- package/dist/repl.js +0 -1868
- package/dist/repl.js.map +0 -1
- package/dist/safety/path-permissions.d.ts +0 -14
- package/dist/safety/path-permissions.js +0 -43
- package/dist/safety/path-permissions.js.map +0 -1
- package/dist/tools/reducers/generic.d.ts +0 -14
- package/dist/tools/reducers/generic.js +0 -5
- package/dist/tools/reducers/generic.js.map +0 -1
- package/dist/tui/can-use-tui.js.map +0 -1
- package/dist/tui/format-keys.d.ts +0 -13
- package/dist/tui/format-keys.js +0 -78
- package/dist/tui/format-keys.js.map +0 -1
- package/dist/tui/input-history.js +0 -9
- package/dist/tui/input-history.js.map +0 -1
- package/dist/tui/runtime.js +0 -207
- package/dist/tui/runtime.js.map +0 -1
- package/dist/tui/state.d.ts +0 -124
- package/dist/tui/state.js +0 -496
- package/dist/tui/state.js.map +0 -1
- package/dist/tui/text-format.js.map +0 -1
- package/dist/tui-v2/actions/action-id.d.ts +0 -14
- package/dist/tui-v2/actions/action-id.js +0 -117
- package/dist/tui-v2/actions/action-id.js.map +0 -1
- package/dist/tui-v2/actions/action-router.js.map +0 -1
- package/dist/tui-v2/actions/chord-from-key.d.ts +0 -10
- package/dist/tui-v2/actions/chord-from-key.js +0 -34
- package/dist/tui-v2/actions/chord-from-key.js.map +0 -1
- package/dist/tui-v2/actions/format-shortcuts.js +0 -267
- package/dist/tui-v2/actions/format-shortcuts.js.map +0 -1
- package/dist/tui-v2/actions/keymap.d.ts +0 -24
- package/dist/tui-v2/actions/keymap.js +0 -151
- package/dist/tui-v2/actions/keymap.js.map +0 -1
- package/dist/tui-v2/app/command-handlers.js +0 -86
- package/dist/tui-v2/app/command-handlers.js.map +0 -1
- package/dist/tui-v2/app/commands/config-commands.d.ts +0 -14
- package/dist/tui-v2/app/commands/config-commands.js +0 -315
- package/dist/tui-v2/app/commands/config-commands.js.map +0 -1
- package/dist/tui-v2/app/commands/key-commands.d.ts +0 -9
- package/dist/tui-v2/app/commands/key-commands.js +0 -496
- package/dist/tui-v2/app/commands/key-commands.js.map +0 -1
- package/dist/tui-v2/app/commands/picker-commands.d.ts +0 -25
- package/dist/tui-v2/app/commands/picker-commands.js +0 -1045
- package/dist/tui-v2/app/commands/picker-commands.js.map +0 -1
- package/dist/tui-v2/app/commands/session-commands.d.ts +0 -19
- package/dist/tui-v2/app/commands/session-commands.js +0 -183
- package/dist/tui-v2/app/commands/session-commands.js.map +0 -1
- package/dist/tui-v2/app/mode-cycle.js.map +0 -1
- package/dist/tui-v2/app/plan-lifecycle.js.map +0 -1
- package/dist/tui-v2/app/providers.d.ts +0 -17
- package/dist/tui-v2/app/providers.js +0 -32
- package/dist/tui-v2/app/providers.js.map +0 -1
- package/dist/tui-v2/app/startup-update.js.map +0 -1
- package/dist/tui-v2/bootstrap/capabilities.d.ts +0 -36
- package/dist/tui-v2/bootstrap/capabilities.js +0 -93
- package/dist/tui-v2/bootstrap/capabilities.js.map +0 -1
- package/dist/tui-v2/bootstrap/composition-root.d.ts +0 -92
- package/dist/tui-v2/bootstrap/composition-root.js.map +0 -1
- package/dist/tui-v2/bootstrap/console-guard.js.map +0 -1
- package/dist/tui-v2/bootstrap/console-suppress.js.map +0 -1
- package/dist/tui-v2/bootstrap/disable-native-selection.d.ts +0 -11
- package/dist/tui-v2/bootstrap/disable-native-selection.js +0 -13
- package/dist/tui-v2/bootstrap/disable-native-selection.js.map +0 -1
- package/dist/tui-v2/bootstrap/lifecycle.js.map +0 -1
- package/dist/tui-v2/bootstrap/osc52-clipboard.js +0 -44
- package/dist/tui-v2/bootstrap/osc52-clipboard.js.map +0 -1
- package/dist/tui-v2/bootstrap/overlay-ports.js +0 -114
- package/dist/tui-v2/bootstrap/overlay-ports.js.map +0 -1
- package/dist/tui-v2/bootstrap/ui-selection.d.ts +0 -30
- package/dist/tui-v2/bootstrap/ui-selection.js +0 -59
- package/dist/tui-v2/bootstrap/ui-selection.js.map +0 -1
- package/dist/tui-v2/composer/arrow-intent.js.map +0 -1
- package/dist/tui-v2/composer/completion.js.map +0 -1
- package/dist/tui-v2/composer/composer-action-port.js.map +0 -1
- package/dist/tui-v2/composer/composer-height.js +0 -29
- package/dist/tui-v2/composer/composer-height.js.map +0 -1
- package/dist/tui-v2/composer/composer-meta.js.map +0 -1
- package/dist/tui-v2/composer/draft-actions.d.ts +0 -31
- package/dist/tui-v2/composer/draft-actions.js +0 -45
- package/dist/tui-v2/composer/draft-actions.js.map +0 -1
- package/dist/tui-v2/composer/history-nav.js.map +0 -1
- package/dist/tui-v2/composer/newline-hint.d.ts +0 -13
- package/dist/tui-v2/composer/newline-hint.js.map +0 -1
- package/dist/tui-v2/composer/paste-placeholder.js.map +0 -1
- package/dist/tui-v2/composer/prompt-history.js.map +0 -1
- package/dist/tui-v2/composer/secret-buffer.js.map +0 -1
- package/dist/tui-v2/controllers/focus-controller.js.map +0 -1
- package/dist/tui-v2/controllers/interruptible-controller.js.map +0 -1
- package/dist/tui-v2/controllers/overlay-controller.d.ts +0 -209
- package/dist/tui-v2/controllers/overlay-controller.js.map +0 -1
- package/dist/tui-v2/controllers/selection-controller.js.map +0 -1
- package/dist/tui-v2/controllers/toast-controller.js.map +0 -1
- package/dist/tui-v2/layout/compute-layout.js.map +0 -1
- package/dist/tui-v2/motion/ease.js.map +0 -1
- package/dist/tui-v2/notify.js.map +0 -1
- package/dist/tui-v2/rendering/artifact-pager-source.js.map +0 -1
- package/dist/tui-v2/rendering/batch-sections.js.map +0 -1
- package/dist/tui-v2/rendering/file-diff-view.js.map +0 -1
- package/dist/tui-v2/rendering/format-help.js.map +0 -1
- package/dist/tui-v2/rendering/incremental-strip.js.map +0 -1
- package/dist/tui-v2/rendering/job-tail-source.js.map +0 -1
- package/dist/tui-v2/rendering/link-detector.js.map +0 -1
- package/dist/tui-v2/rendering/open-tool-output.js +0 -346
- package/dist/tui-v2/rendering/open-tool-output.js.map +0 -1
- package/dist/tui-v2/rendering/pager-chrome.js +0 -119
- package/dist/tui-v2/rendering/pager-chrome.js.map +0 -1
- package/dist/tui-v2/rendering/pager-view-policy.js +0 -98
- package/dist/tui-v2/rendering/pager-view-policy.js.map +0 -1
- package/dist/tui-v2/rendering/picker-filter.js.map +0 -1
- package/dist/tui-v2/rendering/plan-view.js.map +0 -1
- package/dist/tui-v2/rendering/prompt-preview.js.map +0 -1
- package/dist/tui-v2/rendering/render-markdown-lines.d.ts +0 -29
- package/dist/tui-v2/rendering/render-markdown-lines.js +0 -46
- package/dist/tui-v2/rendering/render-markdown-lines.js.map +0 -1
- package/dist/tui-v2/rendering/sanitize-display.js.map +0 -1
- package/dist/tui-v2/rendering/streaming-markdown.d.ts +0 -25
- package/dist/tui-v2/rendering/streaming-markdown.js +0 -117
- package/dist/tui-v2/rendering/streaming-markdown.js.map +0 -1
- package/dist/tui-v2/rendering/strip-tool-surfaces.js.map +0 -1
- package/dist/tui-v2/rendering/syntax-highlight.js.map +0 -1
- package/dist/tui-v2/rendering/theme.js.map +0 -1
- package/dist/tui-v2/rendering/thinking-tail.js.map +0 -1
- package/dist/tui-v2/rendering/tool-presenter.d.ts +0 -63
- package/dist/tui-v2/rendering/tool-presenter.js +0 -376
- package/dist/tui-v2/rendering/tool-presenter.js.map +0 -1
- package/dist/tui-v2/rendering/transcript-export.d.ts +0 -11
- package/dist/tui-v2/rendering/transcript-export.js +0 -18
- package/dist/tui-v2/rendering/transcript-export.js.map +0 -1
- package/dist/tui-v2/rendering/transcript-semantic.js.map +0 -1
- package/dist/tui-v2/rendering/user-message-wrap.d.ts +0 -16
- package/dist/tui-v2/rendering/user-message-wrap.js +0 -21
- package/dist/tui-v2/rendering/user-message-wrap.js.map +0 -1
- package/dist/tui-v2/state/pager-search.js.map +0 -1
- package/dist/tui-v2/state/semantic-document.js.map +0 -1
- package/dist/tui-v2/state/transcript-compaction.js.map +0 -1
- package/dist/tui-v2/state/transcript-hydrate.d.ts +0 -67
- package/dist/tui-v2/state/transcript-hydrate.js +0 -648
- package/dist/tui-v2/state/transcript-hydrate.js.map +0 -1
- package/dist/tui-v2/state/transcript-reducer.js +0 -482
- package/dist/tui-v2/state/transcript-reducer.js.map +0 -1
- package/dist/tui-v2/state/transcript-search.js.map +0 -1
- package/dist/tui-v2/state/transcript-store.js.map +0 -1
- package/dist/tui-v2/state/transcript-struct.js.map +0 -1
- package/dist/tui-v2/state/transcript-types.d.ts +0 -101
- package/dist/tui-v2/state/transcript-types.js.map +0 -1
- package/dist/tui-v2/state/use-has-draft.js.map +0 -1
- package/dist/tui-v2/state/use-overlay.js.map +0 -1
- package/dist/tui-v2/state/use-plan.js.map +0 -1
- package/dist/tui-v2/state/use-session-state.js.map +0 -1
- package/dist/tui-v2/state/use-toast.js.map +0 -1
- package/dist/tui-v2/state/use-transcript-store.d.ts +0 -10
- package/dist/tui-v2/state/use-transcript-store.js.map +0 -1
- package/dist/ui/ansi-box.d.ts +0 -9
- package/dist/ui/ansi-box.js +0 -25
- package/dist/ui/ansi-box.js.map +0 -1
- package/dist/ui/banner.d.ts +0 -3
- package/dist/ui/banner.js +0 -13
- package/dist/ui/banner.js.map +0 -1
- package/dist/ui/code-block.d.ts +0 -48
- package/dist/ui/code-block.js +0 -407
- package/dist/ui/code-block.js.map +0 -1
- package/dist/ui/intro-card.d.ts +0 -10
- package/dist/ui/intro-card.js +0 -67
- package/dist/ui/intro-card.js.map +0 -1
- package/dist/ui/intro-header.js.map +0 -1
- package/dist/ui/keys.d.ts +0 -23
- package/dist/ui/keys.js +0 -23
- package/dist/ui/keys.js.map +0 -1
- package/dist/ui/markdown.js.map +0 -1
- package/dist/ui/output-pane.d.ts +0 -59
- package/dist/ui/output-pane.js +0 -398
- package/dist/ui/output-pane.js.map +0 -1
- package/dist/ui/spinner.d.ts +0 -8
- package/dist/ui/spinner.js +0 -185
- package/dist/ui/spinner.js.map +0 -1
- package/dist/ui/task-pane.d.ts +0 -17
- package/dist/ui/task-pane.js +0 -80
- package/dist/ui/task-pane.js.map +0 -1
- package/dist/ui/text-width.js.map +0 -1
- package/dist/ui/wordmark.js.map +0 -1
- /package/dist/{repl/slash-commands.d.ts → app/commands/catalog.d.ts} +0 -0
- /package/dist/{tui/runtime.d.ts → os/bun-runtime.d.ts} +0 -0
- /package/dist/{tui-v2 → ui-core}/actions/action-router.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/actions/action-router.js +0 -0
- /package/dist/{tui-v2 → ui-core}/actions/format-shortcuts.d.ts +0 -0
- /package/dist/{tui-v2/app → ui-core/actions}/mode-cycle.d.ts +0 -0
- /package/dist/{tui-v2/app → ui-core/actions}/mode-cycle.js +0 -0
- /package/dist/{tui → ui-core/bootstrap}/can-use-tui.d.ts +0 -0
- /package/dist/{tui → ui-core/bootstrap}/can-use-tui.js +0 -0
- /package/dist/{tui-v2 → ui-core}/bootstrap/composition-root.js +0 -0
- /package/dist/{tui-v2 → ui-core}/bootstrap/console-guard.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/bootstrap/console-guard.js +0 -0
- /package/dist/{tui-v2 → ui-core}/bootstrap/console-suppress.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/bootstrap/console-suppress.js +0 -0
- /package/dist/{tui-v2 → ui-core}/bootstrap/lifecycle.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/bootstrap/lifecycle.js +0 -0
- /package/dist/{tui-v2 → ui-core}/bootstrap/overlay-ports.d.ts +0 -0
- /package/dist/{tui-v2/app → ui-core/commands}/command-handlers.d.ts +0 -0
- /package/dist/{tui-v2/app → ui-core/commands}/startup-update.d.ts +0 -0
- /package/dist/{tui-v2/app → ui-core/commands}/startup-update.js +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/arrow-intent.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/arrow-intent.js +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/completion.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/completion.js +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/composer-action-port.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/composer-action-port.js +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/composer-height.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/composer-meta.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/composer-meta.js +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/history-nav.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/history-nav.js +0 -0
- /package/dist/{tui → ui-core/composer}/input-history.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/newline-hint.js +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/paste-placeholder.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/paste-placeholder.js +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/prompt-history.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/prompt-history.js +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/secret-buffer.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/composer/secret-buffer.js +0 -0
- /package/dist/{tui-v2 → ui-core}/controllers/focus-controller.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/controllers/focus-controller.js +0 -0
- /package/dist/{tui-v2 → ui-core}/controllers/interruptible-controller.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/controllers/interruptible-controller.js +0 -0
- /package/dist/{tui-v2 → ui-core}/controllers/overlay-controller.js +0 -0
- /package/dist/{tui-v2 → ui-core}/controllers/selection-controller.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/controllers/selection-controller.js +0 -0
- /package/dist/{tui-v2 → ui-core}/controllers/toast-controller.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/controllers/toast-controller.js +0 -0
- /package/dist/{tui-v2 → ui-core}/layout/compute-layout.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/layout/compute-layout.js +0 -0
- /package/dist/{tui-v2 → ui-core}/motion/ease.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/motion/ease.js +0 -0
- /package/dist/{tui-v2 → ui-core}/notify.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/notify.js +0 -0
- /package/dist/{tui-v2/app → ui-core/plan}/plan-lifecycle.d.ts +0 -0
- /package/dist/{tui-v2/app → ui-core/plan}/plan-lifecycle.js +0 -0
- /package/dist/{tui-v2/bootstrap/osc52-clipboard.d.ts → ui-core/ports/clipboard-osc52.d.ts} +0 -0
- /package/dist/{tui-v2/state → ui-core/react}/use-has-draft.d.ts +0 -0
- /package/dist/{tui-v2/state → ui-core/react}/use-has-draft.js +0 -0
- /package/dist/{tui-v2/state → ui-core/react}/use-overlay.d.ts +0 -0
- /package/dist/{tui-v2/state → ui-core/react}/use-overlay.js +0 -0
- /package/dist/{tui-v2/state → ui-core/react}/use-plan.d.ts +0 -0
- /package/dist/{tui-v2/state → ui-core/react}/use-plan.js +0 -0
- /package/dist/{tui-v2/state → ui-core/react}/use-session-state.d.ts +0 -0
- /package/dist/{tui-v2/state → ui-core/react}/use-session-state.js +0 -0
- /package/dist/{tui-v2/state → ui-core/react}/use-toast.d.ts +0 -0
- /package/dist/{tui-v2/state → ui-core/react}/use-toast.js +0 -0
- /package/dist/{tui-v2/state → ui-core/react}/use-transcript-store.js +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/artifact-pager-source.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/artifact-pager-source.js +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/batch-sections.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/batch-sections.js +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/file-diff-view.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/file-diff-view.js +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/format-help.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/format-help.js +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/incremental-strip.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/incremental-strip.js +0 -0
- /package/dist/{ui → ui-core/rendering}/intro-header.d.ts +0 -0
- /package/dist/{ui → ui-core/rendering}/intro-header.js +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/job-tail-source.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/job-tail-source.js +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/link-detector.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/link-detector.js +0 -0
- /package/dist/{ui → ui-core/rendering}/markdown.d.ts +0 -0
- /package/dist/{ui → ui-core/rendering}/markdown.js +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/open-tool-output.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/pager-chrome.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/pager-view-policy.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/picker-filter.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/picker-filter.js +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/plan-view.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/plan-view.js +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/prompt-preview.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/prompt-preview.js +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/sanitize-display.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/sanitize-display.js +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/strip-tool-surfaces.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/strip-tool-surfaces.js +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/syntax-highlight.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/syntax-highlight.js +0 -0
- /package/dist/{tui → ui-core/rendering}/text-format.d.ts +0 -0
- /package/dist/{tui → ui-core/rendering}/text-format.js +0 -0
- /package/dist/{ui → ui-core/rendering}/text-width.d.ts +0 -0
- /package/dist/{ui → ui-core/rendering}/text-width.js +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/theme.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/theme.js +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/thinking-tail.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/thinking-tail.js +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/transcript-semantic.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/rendering/transcript-semantic.js +0 -0
- /package/dist/{ui → ui-core/rendering}/wordmark.d.ts +0 -0
- /package/dist/{ui → ui-core/rendering}/wordmark.js +0 -0
- /package/dist/{tui-v2 → ui-core}/state/pager-search.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/state/pager-search.js +0 -0
- /package/dist/{tui-v2 → ui-core}/state/semantic-document.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/state/semantic-document.js +0 -0
- /package/dist/{tui-v2 → ui-core}/state/transcript-compaction.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/state/transcript-compaction.js +0 -0
- /package/dist/{tui-v2 → ui-core}/state/transcript-reducer.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/state/transcript-search.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/state/transcript-search.js +0 -0
- /package/dist/{tui-v2 → ui-core}/state/transcript-store.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/state/transcript-store.js +0 -0
- /package/dist/{tui-v2 → ui-core}/state/transcript-struct.d.ts +0 -0
- /package/dist/{tui-v2 → ui-core}/state/transcript-struct.js +0 -0
- /package/dist/{tui-v2 → ui-core}/state/transcript-types.js +0 -0
|
@@ -1,1045 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Picker-backed slash commands: model/provider/search/reasoning/history/
|
|
3
|
-
* permissions/output/plan (V2-072, V2-080).
|
|
4
|
-
*/
|
|
5
|
-
import { getProvider, providerAuth } from "../../../llm/router.js";
|
|
6
|
-
import { defaultModels, normalizeEndpointUrl } from "../../../llm/provider.js";
|
|
7
|
-
import { modelSupportsThinking } from "../../../llm/capabilities.js";
|
|
8
|
-
import { assertProvider } from "../../../llm/provider.js";
|
|
9
|
-
import { assertSearchProvider } from "../../../tools/web/providers/provider.js";
|
|
10
|
-
import { searchProviders } from "../../../tools/web/providers/provider.js";
|
|
11
|
-
import { asExaSearchType, exaSearchTypeDescriptions, exaSearchTypes, searchProviderIds, } from "../../../tools/web/types.js";
|
|
12
|
-
import { providerIds } from "../../../types.js";
|
|
13
|
-
import { getKnownModels } from "../../../repl/slash-commands.js";
|
|
14
|
-
import { clearActiveProjectRoot } from "../../../agent/project-root.js";
|
|
15
|
-
import { appendProviderEndpoint, getActiveProviderEndpoint, addCustomProvider, getCustomProviders, removeCustomProvider, getConfig, getExaSearchType, getProviderModel, setActiveSearchProvider, setDefaultProvider, setExaSearchType, setProviderModel, setThinking, updateConfig, } from "../../../store/config.js";
|
|
16
|
-
import { envValue, getProviderSecret, getSearchProviderKey, setProviderSecret, setSecret, unsetProviderSecret, } from "../../../store/keys.js";
|
|
17
|
-
import { invalidateCustomProviderCache, materializeCustomProvider, normalizeCustomBaseUrl, normalizeCustomProviderId, } from "../../../llm/custom-providers.js";
|
|
18
|
-
import { deleteSession, getSession, listSessionSummaries, purgeSession, } from "../../../store/history.js";
|
|
19
|
-
import { relativeTime, shortCwd } from "../../../tui/text-format.js";
|
|
20
|
-
import { conversationItemCount } from "../../state/transcript-types.js";
|
|
21
|
-
import { boundSessionVisualInput, hydrateSessionVisual, transcriptLooksIncomplete, } from "../../state/transcript-hydrate.js";
|
|
22
|
-
import { openToolOutputPager } from "../../rendering/open-tool-output.js";
|
|
23
|
-
const REASONING_DESCRIPTIONS = {
|
|
24
|
-
off: "disable reasoning",
|
|
25
|
-
minimal: "lowest latency",
|
|
26
|
-
low: "light reasoning",
|
|
27
|
-
medium: "balanced",
|
|
28
|
-
high: "deep reasoning",
|
|
29
|
-
xhigh: "maximum depth",
|
|
30
|
-
max: "highest supported depth",
|
|
31
|
-
};
|
|
32
|
-
/**
|
|
33
|
-
* Live provider model catalogue (matches classic TUI `/model`).
|
|
34
|
-
* Prefers `provider.listModels`; falls back to the static known list.
|
|
35
|
-
*/
|
|
36
|
-
export async function resolveModelsForProvider(provider, currentModel) {
|
|
37
|
-
const providerImpl = getProvider(provider);
|
|
38
|
-
let models = [];
|
|
39
|
-
let error;
|
|
40
|
-
if (providerImpl.listModels) {
|
|
41
|
-
try {
|
|
42
|
-
const auth = await providerAuth(provider);
|
|
43
|
-
models = await providerImpl.listModels(auth);
|
|
44
|
-
}
|
|
45
|
-
catch (err) {
|
|
46
|
-
error = err instanceof Error ? err.message : String(err);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
let source = "live";
|
|
50
|
-
if (models.length === 0) {
|
|
51
|
-
models = getKnownModels(provider);
|
|
52
|
-
source = "known";
|
|
53
|
-
}
|
|
54
|
-
if (currentModel && !models.includes(currentModel) && currentModel === getProviderModel(provider)) {
|
|
55
|
-
const isFreeModel = currentModel.startsWith("free-1/") || currentModel.startsWith("free-2/");
|
|
56
|
-
if (!(isFreeModel && provider !== "free")) {
|
|
57
|
-
models = [currentModel, ...models];
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return error ? { models, source, error } : { models, source };
|
|
61
|
-
}
|
|
62
|
-
export async function handleModel(services, invocation) {
|
|
63
|
-
const state = services.session.getState();
|
|
64
|
-
const provider = state.provider ?? getConfig().defaultProvider;
|
|
65
|
-
const arg = invocation.args.trim();
|
|
66
|
-
if (arg && arg !== "list" && arg !== "ls") {
|
|
67
|
-
applyModel(services, provider, arg, getKnownModels(provider));
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const currentModel = getProviderModel(provider);
|
|
71
|
-
const fetchingToastId = services.toast.info(`fetching ${provider} models…`, {
|
|
72
|
-
key: "model-fetch",
|
|
73
|
-
sticky: true,
|
|
74
|
-
});
|
|
75
|
-
const { models, source, error } = await resolveModelsForProvider(provider, currentModel);
|
|
76
|
-
services.toast.dismiss(fetchingToastId);
|
|
77
|
-
if (error) {
|
|
78
|
-
services.session.notice("warn", `could not refresh ${provider} models: ${error} · showing known models`);
|
|
79
|
-
}
|
|
80
|
-
else if (source === "known" && getProvider(provider).listModels) {
|
|
81
|
-
services.session.notice("warn", `${provider} model list empty from API · showing known models`);
|
|
82
|
-
}
|
|
83
|
-
else if (source === "live") {
|
|
84
|
-
services.session.notice("info", `${provider} · ${models.length} models (live)`);
|
|
85
|
-
}
|
|
86
|
-
if (models.length === 0) {
|
|
87
|
-
services.session.notice("info", `no models for ${provider} — type /model <name> to set one manually`);
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
services.overlay.openPicker({
|
|
91
|
-
title: `Models · ${provider}${source === "live" ? " · live" : ""}`,
|
|
92
|
-
options: models.map((value) => ({
|
|
93
|
-
value,
|
|
94
|
-
label: value,
|
|
95
|
-
active: value === currentModel,
|
|
96
|
-
})),
|
|
97
|
-
}, (value) => {
|
|
98
|
-
applyModel(services, provider, value, models);
|
|
99
|
-
services.overlay.close();
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
const CATALOG_SEPARATOR = "\u001f";
|
|
103
|
-
async function configuredProviderIds() {
|
|
104
|
-
const custom = getCustomProviders().map((def) => def.id);
|
|
105
|
-
const candidates = [...providerIds, ...custom];
|
|
106
|
-
const configured = await Promise.all(candidates.map(async (provider) => {
|
|
107
|
-
if (provider === "ollama" || provider === "free")
|
|
108
|
-
return provider;
|
|
109
|
-
const hasKey = Boolean(envValue(provider)) ||
|
|
110
|
-
Boolean((await getProviderSecret(provider)).value);
|
|
111
|
-
if (!hasKey)
|
|
112
|
-
return undefined;
|
|
113
|
-
if (provider === "modal" && !getActiveProviderEndpoint("modal")) {
|
|
114
|
-
return undefined;
|
|
115
|
-
}
|
|
116
|
-
return provider;
|
|
117
|
-
}));
|
|
118
|
-
return configured.filter((provider) => Boolean(provider));
|
|
119
|
-
}
|
|
120
|
-
async function collectAllModels() {
|
|
121
|
-
const providers = await configuredProviderIds();
|
|
122
|
-
const results = await Promise.all(providers.map(async (provider) => {
|
|
123
|
-
try {
|
|
124
|
-
const resolved = await resolveModelsForProvider(provider);
|
|
125
|
-
return { provider, ...resolved };
|
|
126
|
-
}
|
|
127
|
-
catch (error) {
|
|
128
|
-
return {
|
|
129
|
-
provider,
|
|
130
|
-
models: getKnownModels(provider),
|
|
131
|
-
source: "known",
|
|
132
|
-
error: error instanceof Error ? error.message : String(error),
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
}));
|
|
136
|
-
const entries = [];
|
|
137
|
-
const failed = [];
|
|
138
|
-
let liveProviders = 0;
|
|
139
|
-
for (const result of results) {
|
|
140
|
-
if (result.error)
|
|
141
|
-
failed.push(result.provider);
|
|
142
|
-
if (result.source === "live")
|
|
143
|
-
liveProviders += 1;
|
|
144
|
-
const seen = new Set();
|
|
145
|
-
for (const model of result.models) {
|
|
146
|
-
const id = model.trim();
|
|
147
|
-
if (!id || seen.has(id))
|
|
148
|
-
continue;
|
|
149
|
-
seen.add(id);
|
|
150
|
-
entries.push({
|
|
151
|
-
provider: result.provider,
|
|
152
|
-
model: id,
|
|
153
|
-
live: result.source === "live",
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
entries.sort((a, b) => a.provider.localeCompare(b.provider) || a.model.localeCompare(b.model));
|
|
158
|
-
return { entries, providers: providers.length, liveProviders, failed };
|
|
159
|
-
}
|
|
160
|
-
async function switchToCatalogEntry(services, entry) {
|
|
161
|
-
const state = services.session.getState();
|
|
162
|
-
const current = state.provider ?? getConfig().defaultProvider;
|
|
163
|
-
if (entry.provider !== current) {
|
|
164
|
-
setDefaultProvider(entry.provider);
|
|
165
|
-
services.session.setProvider(entry.provider);
|
|
166
|
-
clearActiveProjectRoot();
|
|
167
|
-
}
|
|
168
|
-
services.session.setModel(entry.model);
|
|
169
|
-
setProviderModel(entry.provider, entry.model);
|
|
170
|
-
services.session.notice("info", `provider → ${entry.provider} · model → ${entry.model}`);
|
|
171
|
-
}
|
|
172
|
-
export async function handleModels(services, invocation) {
|
|
173
|
-
const fetching = services.toast.info("collecting models from all providers…", {
|
|
174
|
-
key: "models-fetch",
|
|
175
|
-
sticky: true,
|
|
176
|
-
});
|
|
177
|
-
const { entries, providers, liveProviders, failed } = await collectAllModels();
|
|
178
|
-
services.toast.dismiss(fetching);
|
|
179
|
-
if (entries.length === 0) {
|
|
180
|
-
services.session.notice("warn", "no models found — configure a provider key with /set first");
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
const filter = invocation.args.trim().toLowerCase();
|
|
184
|
-
if (filter) {
|
|
185
|
-
const normalized = filter.replace(/\s+/g, "/");
|
|
186
|
-
const matches = entries.filter((entry) => {
|
|
187
|
-
const combined = `${entry.provider}/${entry.model}`.toLowerCase();
|
|
188
|
-
return combined === normalized || combined.includes(normalized);
|
|
189
|
-
});
|
|
190
|
-
const exact = matches.find((entry) => `${entry.provider}/${entry.model}`.toLowerCase() === normalized);
|
|
191
|
-
if (exact) {
|
|
192
|
-
await switchToCatalogEntry(services, exact);
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
if (matches.length === 1) {
|
|
196
|
-
await switchToCatalogEntry(services, matches[0]);
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
if (matches.length === 0) {
|
|
200
|
-
services.session.notice("warn", `no model matches "${invocation.args.trim()}"`);
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
const state = services.session.getState();
|
|
205
|
-
const activeProvider = state.provider ?? getConfig().defaultProvider;
|
|
206
|
-
if (failed.length > 0) {
|
|
207
|
-
services.session.notice("warn", `could not refresh ${failed.join(", ")} · showing known models for those`);
|
|
208
|
-
}
|
|
209
|
-
services.session.notice("info", `${entries.length} models · ${providers} provider${providers === 1 ? "" : "s"} configured · ${liveProviders} live`);
|
|
210
|
-
services.overlay.openPicker({
|
|
211
|
-
title: `All models · ${providers} providers`,
|
|
212
|
-
searchDescription: true,
|
|
213
|
-
twoLine: true,
|
|
214
|
-
options: entries.map((entry) => ({
|
|
215
|
-
value: `${entry.provider}${CATALOG_SEPARATOR}${entry.model}`,
|
|
216
|
-
label: `${entry.provider} / ${entry.model}`,
|
|
217
|
-
description: entry.live ? "live catalogue" : "known models",
|
|
218
|
-
active: entry.provider === activeProvider && entry.model === state.model,
|
|
219
|
-
})),
|
|
220
|
-
}, (value) => {
|
|
221
|
-
services.overlay.close();
|
|
222
|
-
const separator = value.indexOf(CATALOG_SEPARATOR);
|
|
223
|
-
if (separator <= 0)
|
|
224
|
-
return;
|
|
225
|
-
const provider = value.slice(0, separator);
|
|
226
|
-
const model = value.slice(separator + 1);
|
|
227
|
-
const entry = entries.find((candidate) => candidate.provider === provider && candidate.model === model);
|
|
228
|
-
if (!entry)
|
|
229
|
-
return;
|
|
230
|
-
void switchToCatalogEntry(services, entry);
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
function applyModel(services, provider, model, options = getKnownModels(provider)) {
|
|
234
|
-
const index = Number.parseInt(model, 10);
|
|
235
|
-
const next = Number.isInteger(index) && index >= 1 && index <= options.length
|
|
236
|
-
? options[index - 1]
|
|
237
|
-
: model;
|
|
238
|
-
services.session.setModel(next);
|
|
239
|
-
setProviderModel(provider, next);
|
|
240
|
-
services.session.notice("info", `model → ${next}`);
|
|
241
|
-
}
|
|
242
|
-
/** Sentinel value returned by the /provider picker for "add a custom provider". */
|
|
243
|
-
const ADD_CUSTOM_PROVIDER = "__add_custom_provider__";
|
|
244
|
-
/** Sentinel for the "remove a custom provider" picker row. */
|
|
245
|
-
const REMOVE_CUSTOM_PROVIDER = "__remove_custom_provider__";
|
|
246
|
-
export function handleProvider(services, invocation) {
|
|
247
|
-
if (invocation.args) {
|
|
248
|
-
try {
|
|
249
|
-
void activateProvider(services, assertProvider(invocation.args.trim()));
|
|
250
|
-
}
|
|
251
|
-
catch {
|
|
252
|
-
services.session.notice("warn", `unknown provider: ${invocation.args.trim()}`);
|
|
253
|
-
}
|
|
254
|
-
return;
|
|
255
|
-
}
|
|
256
|
-
void (async () => {
|
|
257
|
-
const current = services.session.getState().provider ?? getConfig().defaultProvider;
|
|
258
|
-
// Custom (user-defined) providers appear after the built-ins, plus
|
|
259
|
-
// dedicated rows at the top to launch the add / remove flows.
|
|
260
|
-
const { getCustomProviders } = await import("../../../store/config.js");
|
|
261
|
-
const custom = getCustomProviders();
|
|
262
|
-
const options = [
|
|
263
|
-
{
|
|
264
|
-
value: ADD_CUSTOM_PROVIDER,
|
|
265
|
-
label: "+ Add custom provider",
|
|
266
|
-
description: "connect an OpenAI-compatible endpoint not listed above",
|
|
267
|
-
},
|
|
268
|
-
// Only offer removal when at least one custom provider exists.
|
|
269
|
-
...(custom.length > 0
|
|
270
|
-
? [
|
|
271
|
-
{
|
|
272
|
-
value: REMOVE_CUSTOM_PROVIDER,
|
|
273
|
-
label: "− Remove custom provider",
|
|
274
|
-
description: `${custom.length} custom provider${custom.length === 1 ? "" : "s"} · delete a definition + its keys`,
|
|
275
|
-
},
|
|
276
|
-
]
|
|
277
|
-
: []),
|
|
278
|
-
...providerIds.map((value) => ({
|
|
279
|
-
value,
|
|
280
|
-
label: value,
|
|
281
|
-
description: getProviderModel(value),
|
|
282
|
-
active: value === current,
|
|
283
|
-
})),
|
|
284
|
-
...custom.map((def) => ({
|
|
285
|
-
value: def.id,
|
|
286
|
-
label: def.id,
|
|
287
|
-
description: getProviderModel(def.id),
|
|
288
|
-
active: def.id === current,
|
|
289
|
-
})),
|
|
290
|
-
];
|
|
291
|
-
services.overlay.openPicker({
|
|
292
|
-
title: "Providers",
|
|
293
|
-
// Search provider name + model name.
|
|
294
|
-
searchDescription: true,
|
|
295
|
-
options,
|
|
296
|
-
}, (value) => {
|
|
297
|
-
if (value === ADD_CUSTOM_PROVIDER) {
|
|
298
|
-
void addCustomProviderFlow(services);
|
|
299
|
-
return;
|
|
300
|
-
}
|
|
301
|
-
if (value === REMOVE_CUSTOM_PROVIDER) {
|
|
302
|
-
void removeCustomProviderFlow(services);
|
|
303
|
-
return;
|
|
304
|
-
}
|
|
305
|
-
void activateProvider(services, assertProvider(value));
|
|
306
|
-
});
|
|
307
|
-
})();
|
|
308
|
-
}
|
|
309
|
-
async function activateProvider(services, next) {
|
|
310
|
-
// Modal needs two separate things, so it gets its own onboarding.
|
|
311
|
-
if (next === "modal") {
|
|
312
|
-
if (!(await ensureModalCredentials(services)))
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
else {
|
|
316
|
-
const configured = next === "ollama" || next === "free" || Boolean(envValue(next)) || Boolean((await getProviderSecret(next)).value);
|
|
317
|
-
if (!configured) {
|
|
318
|
-
services.overlay.close();
|
|
319
|
-
const key = await services.overlay.openSecret({
|
|
320
|
-
title: `${next} API key`,
|
|
321
|
-
prompt: `No API key is configured for ${next}. Enter it now to activate this provider.`,
|
|
322
|
-
});
|
|
323
|
-
const value = key?.trim();
|
|
324
|
-
if (!value) {
|
|
325
|
-
services.session.notice("info", `cancelled · provider unchanged`);
|
|
326
|
-
return;
|
|
327
|
-
}
|
|
328
|
-
// Silence here used to look like the picker had simply ignored the input.
|
|
329
|
-
if (!getProvider(next).validateKey(value)) {
|
|
330
|
-
services.session.notice("warn", `invalid API key format for ${next} · provider unchanged`);
|
|
331
|
-
return;
|
|
332
|
-
}
|
|
333
|
-
await setProviderSecret(next, value);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
let model = getProviderModel(next);
|
|
337
|
-
const isFreeModel = model.startsWith("free-1/") || model.startsWith("free-2/");
|
|
338
|
-
if (isFreeModel && next !== "free") {
|
|
339
|
-
model = defaultModels[next];
|
|
340
|
-
setProviderModel(next, model);
|
|
341
|
-
}
|
|
342
|
-
setDefaultProvider(next);
|
|
343
|
-
services.session.setProvider(next);
|
|
344
|
-
services.session.setModel(model);
|
|
345
|
-
services.overlay.close();
|
|
346
|
-
services.session.notice("info", `provider → ${next} · model → ${model}`);
|
|
347
|
-
const fetchingToastId = services.toast.info(`fetching ${next} models…`, {
|
|
348
|
-
key: "model-fetch",
|
|
349
|
-
sticky: true,
|
|
350
|
-
});
|
|
351
|
-
const { models, source, error } = await resolveModelsForProvider(next, model);
|
|
352
|
-
services.toast.dismiss(fetchingToastId);
|
|
353
|
-
if (error) {
|
|
354
|
-
services.session.notice("warn", `could not refresh ${next} models: ${error} · showing known models`);
|
|
355
|
-
}
|
|
356
|
-
else if (source === "known" && getProvider(next).listModels) {
|
|
357
|
-
services.session.notice("warn", `${next} model list empty from API · showing known models`);
|
|
358
|
-
}
|
|
359
|
-
else if (source === "live") {
|
|
360
|
-
services.session.notice("info", `${next} · ${models.length} models (live)`);
|
|
361
|
-
}
|
|
362
|
-
if (models.length === 0) {
|
|
363
|
-
services.session.notice("info", `no models for ${next} — type /model <name> to set one manually`);
|
|
364
|
-
return;
|
|
365
|
-
}
|
|
366
|
-
services.overlay.openPicker({
|
|
367
|
-
title: `Models · ${next}${source === "live" ? " · live" : ""}`,
|
|
368
|
-
options: models.map((value) => ({
|
|
369
|
-
value,
|
|
370
|
-
label: value,
|
|
371
|
-
active: value === model,
|
|
372
|
-
})),
|
|
373
|
-
}, (value) => {
|
|
374
|
-
applyModel(services, next, value, models);
|
|
375
|
-
services.overlay.close();
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
/**
|
|
379
|
-
* Modal is the only provider that needs two things before it can serve a
|
|
380
|
-
* request: the workspace endpoint URL (config) and a proxy token pair
|
|
381
|
-
* (secret). Ask for whichever is missing, endpoint first — that is the value
|
|
382
|
-
* people reach for, and a URL typed into a token prompt used to fail
|
|
383
|
-
* `validateKey` and silently abandon the switch.
|
|
384
|
-
*
|
|
385
|
-
* Returns false when the user cancelled or entered something unusable, in
|
|
386
|
-
* which case the active provider is left alone.
|
|
387
|
-
*/
|
|
388
|
-
async function ensureModalCredentials(services) {
|
|
389
|
-
const hasToken = Boolean(envValue("modal")) || Boolean((await getProviderSecret("modal")).value);
|
|
390
|
-
if (!getActiveProviderEndpoint("modal")) {
|
|
391
|
-
services.overlay.close();
|
|
392
|
-
const answer = await services.overlay.openSecret({
|
|
393
|
-
title: hasToken ? "Modal endpoint URL" : "Modal endpoint URL (1 of 2)",
|
|
394
|
-
prompt: "Paste your Modal endpoint URL, e.g. https://<workspace>--ep-<endpoint>.<region>.modal.direct",
|
|
395
|
-
reveal: true,
|
|
396
|
-
});
|
|
397
|
-
const url = answer?.trim();
|
|
398
|
-
if (!url) {
|
|
399
|
-
services.session.notice("info", "cancelled · provider unchanged");
|
|
400
|
-
return false;
|
|
401
|
-
}
|
|
402
|
-
const endpoint = normalizeEndpointUrl(url);
|
|
403
|
-
appendProviderEndpoint("modal", endpoint);
|
|
404
|
-
services.session.notice("info", `modal endpoint → ${endpoint}`);
|
|
405
|
-
}
|
|
406
|
-
if (!hasToken) {
|
|
407
|
-
services.overlay.close();
|
|
408
|
-
const answer = await services.overlay.openSecret({
|
|
409
|
-
title: "Modal proxy token (2 of 2)",
|
|
410
|
-
prompt: "Enter the proxy token pair as <token-id>:<token-secret> — create one with: modal workspace proxy-tokens create",
|
|
411
|
-
});
|
|
412
|
-
const token = answer?.trim();
|
|
413
|
-
if (!token) {
|
|
414
|
-
services.session.notice("info", "cancelled · provider unchanged");
|
|
415
|
-
return false;
|
|
416
|
-
}
|
|
417
|
-
// Another URL means the user is still answering the previous question.
|
|
418
|
-
if (/^https?:\/\//i.test(token)) {
|
|
419
|
-
const endpoint = normalizeEndpointUrl(token);
|
|
420
|
-
appendProviderEndpoint("modal", endpoint);
|
|
421
|
-
services.session.notice("warn", `saved that as the endpoint (${endpoint}) · modal still needs a wk-…:ws-… token pair — run /provider modal again`);
|
|
422
|
-
return false;
|
|
423
|
-
}
|
|
424
|
-
if (!getProvider("modal").validateKey(token)) {
|
|
425
|
-
services.session.notice("warn", "expected a proxy token pair like wk-tokenId:ws-tokenSecret · provider unchanged");
|
|
426
|
-
return false;
|
|
427
|
-
}
|
|
428
|
-
await setProviderSecret("modal", token);
|
|
429
|
-
}
|
|
430
|
-
return true;
|
|
431
|
-
}
|
|
432
|
-
/**
|
|
433
|
-
* Add a user-defined (custom) provider. Walks the operator through every
|
|
434
|
-
* required field, then fetches the live model catalogue from the endpoint and
|
|
435
|
-
* lets them pick a default model before activating the new provider.
|
|
436
|
-
*
|
|
437
|
-
* Every prompt is a single `openSecret` modal (re-used for non-secret values
|
|
438
|
-
* with `reveal: true`), so the flow works in both the OpenTUI and classic TUI.
|
|
439
|
-
* Cancelling any step leaves the active provider untouched.
|
|
440
|
-
*/
|
|
441
|
-
async function addCustomProviderFlow(services) {
|
|
442
|
-
services.overlay.close();
|
|
443
|
-
// Existing ids (built-in + custom) so we can reject collisions up front.
|
|
444
|
-
const existingBuiltins = providerIds;
|
|
445
|
-
const existingCustom = getCustomProviders().map((d) => d.id);
|
|
446
|
-
const existing = [...existingBuiltins, ...existingCustom];
|
|
447
|
-
// 1. Provider id — a URL-safe slug used as the key namespace and config key.
|
|
448
|
-
const idAnswer = await services.overlay.openSecret({
|
|
449
|
-
title: "New custom provider · 1 of 5 · id",
|
|
450
|
-
prompt: "Enter a short id (lowercase, a-z 0-9 and hyphens, e.g. myllm). This is how clai names the provider internally.",
|
|
451
|
-
reveal: true,
|
|
452
|
-
});
|
|
453
|
-
const id = normalizeCustomProviderId(idAnswer?.trim() ?? "", existing);
|
|
454
|
-
if (!id) {
|
|
455
|
-
services.session.notice("info", idAnswer?.trim()
|
|
456
|
-
? `"${idAnswer.trim()}" is not a unique provider id (use lowercase a-z 0-9 hyphens)`
|
|
457
|
-
: "cancelled · provider unchanged");
|
|
458
|
-
return;
|
|
459
|
-
}
|
|
460
|
-
// 2. Display name — shown in pickers and toasts.
|
|
461
|
-
const nameAnswer = await services.overlay.openSecret({
|
|
462
|
-
title: `New custom provider · 2 of 5 · name`,
|
|
463
|
-
prompt: `Enter a display name for "${id}" (shown in pickers), e.g. My LLM Gateway:`,
|
|
464
|
-
reveal: true,
|
|
465
|
-
});
|
|
466
|
-
const displayName = nameAnswer?.trim() || id;
|
|
467
|
-
// 3. Base URL — the OpenAI-compatible endpoint root (clai appends /v1).
|
|
468
|
-
const urlAnswer = await services.overlay.openSecret({
|
|
469
|
-
title: `New custom provider · 3 of 5 · base URL`,
|
|
470
|
-
prompt: `Paste the base URL for ${displayName} (OpenAI-compatible). e.g. https://api.example.com/v1`,
|
|
471
|
-
reveal: true,
|
|
472
|
-
});
|
|
473
|
-
const baseUrl = normalizeCustomBaseUrl(urlAnswer?.trim() ?? "");
|
|
474
|
-
if (!baseUrl) {
|
|
475
|
-
services.session.notice("info", "cancelled · provider unchanged");
|
|
476
|
-
return;
|
|
477
|
-
}
|
|
478
|
-
// 4. API key — masked; stored under the multi-key envelope so /set can add
|
|
479
|
-
// more later and the rotation logic treats it like any other provider.
|
|
480
|
-
const keyAnswer = await services.overlay.openSecret({
|
|
481
|
-
title: `New custom provider · 4 of 5 · API key`,
|
|
482
|
-
prompt: `Enter the API key / bearer token for ${displayName} (input hidden). Leave blank to skip and set it later with /set ${id}.`,
|
|
483
|
-
});
|
|
484
|
-
const apiKey = keyAnswer?.trim() ?? "";
|
|
485
|
-
// 5. Default model — fetch the live /models list and let the user pick.
|
|
486
|
-
// We materialise the provider in memory (before persisting) so the
|
|
487
|
-
// listModels call works without a config round-trip.
|
|
488
|
-
const tempDef = {
|
|
489
|
-
id,
|
|
490
|
-
displayName,
|
|
491
|
-
baseUrl,
|
|
492
|
-
defaultModel: "", // filled after the model pick
|
|
493
|
-
};
|
|
494
|
-
const tempProvider = materializeCustomProvider(tempDef);
|
|
495
|
-
const fetchingToastId = services.toast.info(`fetching ${displayName} models…`, {
|
|
496
|
-
key: "model-fetch",
|
|
497
|
-
sticky: true,
|
|
498
|
-
});
|
|
499
|
-
let models = [];
|
|
500
|
-
try {
|
|
501
|
-
const list = tempProvider.listModels;
|
|
502
|
-
if (list)
|
|
503
|
-
models = await list({ apiKey: apiKey || undefined });
|
|
504
|
-
}
|
|
505
|
-
catch (err) {
|
|
506
|
-
services.session.notice("warn", `could not fetch models from ${displayName}: ${err instanceof Error ? err.message : String(err)} · you can set one manually with /model <name>`);
|
|
507
|
-
}
|
|
508
|
-
finally {
|
|
509
|
-
services.toast.dismiss(fetchingToastId);
|
|
510
|
-
}
|
|
511
|
-
let defaultModel = "";
|
|
512
|
-
if (models.length > 0) {
|
|
513
|
-
services.overlay.close();
|
|
514
|
-
const picked = await new Promise((resolve) => {
|
|
515
|
-
const opened = services.overlay.openPicker({
|
|
516
|
-
title: `Models · ${displayName} · live`,
|
|
517
|
-
options: models.map((value) => ({ value, label: value })),
|
|
518
|
-
}, (value) => resolve(value));
|
|
519
|
-
if (!opened)
|
|
520
|
-
resolve(undefined);
|
|
521
|
-
});
|
|
522
|
-
services.overlay.close();
|
|
523
|
-
defaultModel = picked?.trim() ?? "";
|
|
524
|
-
if (!defaultModel) {
|
|
525
|
-
services.session.notice("info", "cancelled · provider unchanged");
|
|
526
|
-
return;
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
else {
|
|
530
|
-
// No live list (key skipped or fetch failed): ask for a model name to use
|
|
531
|
-
// as the default so the provider is usable immediately.
|
|
532
|
-
const modelAnswer = await services.overlay.openSecret({
|
|
533
|
-
title: `New custom provider · 5 of 5 · default model`,
|
|
534
|
-
prompt: `Enter the default model id for ${displayName} (you can change it later with /model <name>):`,
|
|
535
|
-
reveal: true,
|
|
536
|
-
});
|
|
537
|
-
defaultModel = modelAnswer?.trim() ?? "";
|
|
538
|
-
if (!defaultModel) {
|
|
539
|
-
services.session.notice("info", "cancelled · provider unchanged");
|
|
540
|
-
return;
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
// Persist the definition + the key + the chosen model, then activate.
|
|
544
|
-
const def = { id, displayName, baseUrl, defaultModel };
|
|
545
|
-
addCustomProvider(def);
|
|
546
|
-
invalidateCustomProviderCache(id);
|
|
547
|
-
if (apiKey) {
|
|
548
|
-
await setProviderSecret(id, apiKey);
|
|
549
|
-
}
|
|
550
|
-
setProviderModel(id, defaultModel);
|
|
551
|
-
setDefaultProvider(id);
|
|
552
|
-
services.session.setProvider(id);
|
|
553
|
-
services.session.setModel(defaultModel);
|
|
554
|
-
services.overlay.close();
|
|
555
|
-
services.session.notice("info", `added custom provider ${displayName} (${id}) · model → ${defaultModel}${apiKey ? "" : " · no key set (use /set " + id + " <key>)"}`);
|
|
556
|
-
}
|
|
557
|
-
/**
|
|
558
|
-
* Remove a user-defined (custom) provider. Lists only custom providers in a
|
|
559
|
-
* picker, asks for confirmation, then tears down everything clai stored for
|
|
560
|
-
* it: the definition, the multi-key envelope, the per-provider model and
|
|
561
|
-
* endpoint overrides, and the in-memory provider cache. If the removed
|
|
562
|
-
* provider was the active/default one, switches back to the nvidia default so
|
|
563
|
-
* the session never points at a now-unknown id.
|
|
564
|
-
*/
|
|
565
|
-
async function removeCustomProviderFlow(services) {
|
|
566
|
-
services.overlay.close();
|
|
567
|
-
const custom = getCustomProviders();
|
|
568
|
-
if (custom.length === 0) {
|
|
569
|
-
services.session.notice("info", "no custom providers to remove");
|
|
570
|
-
return;
|
|
571
|
-
}
|
|
572
|
-
const config = getConfig();
|
|
573
|
-
const activeProvider = services.session.getState().provider ?? config.defaultProvider;
|
|
574
|
-
// 1. Pick which custom provider to delete.
|
|
575
|
-
const picked = await new Promise((resolve) => {
|
|
576
|
-
const opened = services.overlay.openPicker({
|
|
577
|
-
title: "Remove custom provider",
|
|
578
|
-
options: custom.map((def) => ({
|
|
579
|
-
value: def.id,
|
|
580
|
-
label: def.id,
|
|
581
|
-
description: `${def.displayName} · ${def.baseUrl}`,
|
|
582
|
-
active: def.id === activeProvider,
|
|
583
|
-
})),
|
|
584
|
-
}, (value) => resolve(value));
|
|
585
|
-
if (!opened)
|
|
586
|
-
resolve(undefined);
|
|
587
|
-
});
|
|
588
|
-
services.overlay.close();
|
|
589
|
-
if (!picked) {
|
|
590
|
-
services.session.notice("info", "cancelled · nothing removed");
|
|
591
|
-
return;
|
|
592
|
-
}
|
|
593
|
-
const def = custom.find((d) => d.id === picked);
|
|
594
|
-
const displayName = def?.displayName ?? picked;
|
|
595
|
-
// 2. Confirm — deletion is irreversible (clears keys + model + endpoints).
|
|
596
|
-
const confirmed = await services.overlay.openConfirm({
|
|
597
|
-
kind: "reset",
|
|
598
|
-
prompt: `Remove custom provider "${displayName}" (${picked})?\n\nThis deletes its definition, all stored API keys, and the per-provider model + endpoint overrides. This cannot be undone.`,
|
|
599
|
-
});
|
|
600
|
-
services.overlay.close();
|
|
601
|
-
if (!confirmed) {
|
|
602
|
-
services.session.notice("info", "cancelled · nothing removed");
|
|
603
|
-
return;
|
|
604
|
-
}
|
|
605
|
-
// 3. Tear down: definition, keys, model override, endpoint list, cache.
|
|
606
|
-
removeCustomProvider(picked);
|
|
607
|
-
try {
|
|
608
|
-
await unsetProviderSecret(picked);
|
|
609
|
-
}
|
|
610
|
-
catch {
|
|
611
|
-
// No key stored (or env-only) — nothing to delete; not an error.
|
|
612
|
-
}
|
|
613
|
-
// Clear the per-provider model + endpoint overrides so they don't linger.
|
|
614
|
-
const providerModels = { ...getConfig().providerModels };
|
|
615
|
-
delete providerModels[picked];
|
|
616
|
-
const providerEndpoints = { ...getConfig().providerEndpoints };
|
|
617
|
-
delete providerEndpoints[picked];
|
|
618
|
-
updateConfig({ providerModels, providerEndpoints });
|
|
619
|
-
invalidateCustomProviderCache(picked);
|
|
620
|
-
// 4. If we just deleted the active/default provider, switch to a safe
|
|
621
|
-
// built-in so the next request doesn't target a now-unknown id.
|
|
622
|
-
if (picked === activeProvider || picked === config.defaultProvider) {
|
|
623
|
-
const fallback = "nvidia";
|
|
624
|
-
setDefaultProvider(fallback);
|
|
625
|
-
services.session.setProvider(fallback);
|
|
626
|
-
services.session.setModel(getProviderModel(fallback));
|
|
627
|
-
services.session.notice("info", `removed custom provider ${displayName} (${picked}) · switched to ${fallback}`);
|
|
628
|
-
}
|
|
629
|
-
else {
|
|
630
|
-
services.session.notice("info", `removed custom provider ${displayName} (${picked})`);
|
|
631
|
-
}
|
|
632
|
-
}
|
|
633
|
-
export function handleSearch(services, invocation) {
|
|
634
|
-
const args = invocation.args.trim();
|
|
635
|
-
if (args) {
|
|
636
|
-
const parts = args.split(/\s+/);
|
|
637
|
-
const providerArg = parts[0];
|
|
638
|
-
// `/search exa <type>` sets Exa's retrieval strategy directly.
|
|
639
|
-
if (providerArg.toLowerCase() === "exa" && parts.length > 1) {
|
|
640
|
-
const type = asExaSearchType(parts.slice(1).join(" "));
|
|
641
|
-
if (!type) {
|
|
642
|
-
services.session.notice("warn", `unknown exa search type: ${parts.slice(1).join(" ")} · options: ${exaSearchTypes.join(", ")}`);
|
|
643
|
-
return;
|
|
644
|
-
}
|
|
645
|
-
void activateExaWithType(services, type);
|
|
646
|
-
return;
|
|
647
|
-
}
|
|
648
|
-
try {
|
|
649
|
-
void activateSearchProvider(services, assertSearchProvider(providerArg));
|
|
650
|
-
}
|
|
651
|
-
catch {
|
|
652
|
-
services.session.notice("warn", `unknown search provider: ${providerArg}`);
|
|
653
|
-
}
|
|
654
|
-
return;
|
|
655
|
-
}
|
|
656
|
-
const active = getConfig().activeSearchProvider;
|
|
657
|
-
const exaType = getExaSearchType();
|
|
658
|
-
const options = searchProviderIds.map((id) => {
|
|
659
|
-
const adapter = searchProviders[id];
|
|
660
|
-
const keyNote = adapter?.needsApiKey
|
|
661
|
-
? `${adapter.displayName} · API key required`
|
|
662
|
-
: `${adapter?.displayName ?? id} · keyless`;
|
|
663
|
-
return {
|
|
664
|
-
value: id,
|
|
665
|
-
label: id === active ? `${id} · active` : id,
|
|
666
|
-
description: id === "exa" ? `${keyNote} · type: ${exaType}` : keyNote,
|
|
667
|
-
};
|
|
668
|
-
});
|
|
669
|
-
services.overlay.openPicker({ title: "Search providers", options }, (value) => {
|
|
670
|
-
void activateSearchProvider(services, assertSearchProvider(value));
|
|
671
|
-
});
|
|
672
|
-
}
|
|
673
|
-
async function activateSearchProvider(services, next) {
|
|
674
|
-
const adapter = searchProviders[next];
|
|
675
|
-
if (adapter?.needsApiKey) {
|
|
676
|
-
const current = await getSearchProviderKey(next);
|
|
677
|
-
if (!current.value) {
|
|
678
|
-
services.overlay.close();
|
|
679
|
-
const key = await services.overlay.openSecret({
|
|
680
|
-
title: `${next} search API key`,
|
|
681
|
-
prompt: `No API key is configured for ${adapter.displayName}. Enter it now to use this search provider.`,
|
|
682
|
-
});
|
|
683
|
-
if (!key)
|
|
684
|
-
return;
|
|
685
|
-
await setSecret("search", next, key);
|
|
686
|
-
}
|
|
687
|
-
}
|
|
688
|
-
setActiveSearchProvider(next);
|
|
689
|
-
services.overlay.close();
|
|
690
|
-
services.session.notice("info", `search provider → ${next}`);
|
|
691
|
-
// Exa is the only provider with a tunable retrieval strategy — offer the
|
|
692
|
-
// type picker right after activation so users land on the right latency
|
|
693
|
-
// and depth without a second command.
|
|
694
|
-
if (next === "exa")
|
|
695
|
-
openExaSearchTypePicker(services);
|
|
696
|
-
}
|
|
697
|
-
/** Open the picker that customises Exa's retrieval strategy (`type`). */
|
|
698
|
-
function openExaSearchTypePicker(services) {
|
|
699
|
-
const current = getExaSearchType();
|
|
700
|
-
const options = exaSearchTypes.map((type) => ({
|
|
701
|
-
value: type,
|
|
702
|
-
label: type === current ? `${type} · active` : type,
|
|
703
|
-
description: exaSearchTypeDescriptions[type],
|
|
704
|
-
active: type === current,
|
|
705
|
-
}));
|
|
706
|
-
services.overlay.openPicker({ title: "Exa search type", options }, (value) => {
|
|
707
|
-
const type = asExaSearchType(value);
|
|
708
|
-
if (type)
|
|
709
|
-
applyExaSearchType(services, type);
|
|
710
|
-
services.overlay.close();
|
|
711
|
-
});
|
|
712
|
-
}
|
|
713
|
-
/**
|
|
714
|
-
* Persist the chosen Exa search type. When Exa is not already the active
|
|
715
|
-
* search provider, selecting a type also activates Exa so the setting takes
|
|
716
|
-
* effect on the next search.
|
|
717
|
-
*/
|
|
718
|
-
async function activateExaWithType(services, type) {
|
|
719
|
-
if (getConfig().activeSearchProvider !== "exa") {
|
|
720
|
-
await activateSearchProvider(services, "exa");
|
|
721
|
-
}
|
|
722
|
-
applyExaSearchType(services, type);
|
|
723
|
-
}
|
|
724
|
-
function applyExaSearchType(services, type) {
|
|
725
|
-
setExaSearchType(type);
|
|
726
|
-
services.session.notice("info", `exa search type → ${type}`);
|
|
727
|
-
}
|
|
728
|
-
export function handleReasoning(services, invocation) {
|
|
729
|
-
if (invocation.args) {
|
|
730
|
-
applyReasoning(services, invocation.args.trim());
|
|
731
|
-
return;
|
|
732
|
-
}
|
|
733
|
-
const current = getConfig().thinking;
|
|
734
|
-
const provider = services.session.getState().provider ?? getConfig().defaultProvider;
|
|
735
|
-
const model = services.session.getState().model ?? "";
|
|
736
|
-
const supported = modelSupportsThinking(provider, model) ? "supported" : "model may ignore it";
|
|
737
|
-
const options = Object.entries(REASONING_DESCRIPTIONS).map(([value, description]) => ({
|
|
738
|
-
value,
|
|
739
|
-
label: value,
|
|
740
|
-
description,
|
|
741
|
-
active: value === (current.enabled ? current.effort : "off"),
|
|
742
|
-
}));
|
|
743
|
-
services.overlay.openPicker({ title: `Reasoning · ${supported}`, options }, (value) => {
|
|
744
|
-
applyReasoning(services, value);
|
|
745
|
-
services.overlay.close();
|
|
746
|
-
});
|
|
747
|
-
}
|
|
748
|
-
function applyReasoning(services, value) {
|
|
749
|
-
const lower = value.toLowerCase();
|
|
750
|
-
if (/^(on|enable|true)$/.test(lower)) {
|
|
751
|
-
setThinking({ enabled: true });
|
|
752
|
-
services.session.notice("info", `thinking → ${getConfig().thinking.effort}`);
|
|
753
|
-
return;
|
|
754
|
-
}
|
|
755
|
-
if (["off", "none", "disable", "false"].includes(lower)) {
|
|
756
|
-
setThinking({ enabled: false });
|
|
757
|
-
services.session.notice("info", "thinking → off");
|
|
758
|
-
return;
|
|
759
|
-
}
|
|
760
|
-
if (["minimal", "low", "medium", "high", "xhigh", "max"].includes(lower)) {
|
|
761
|
-
setThinking({ enabled: true, effort: lower });
|
|
762
|
-
services.session.notice("info", `thinking → ${lower}`);
|
|
763
|
-
return;
|
|
764
|
-
}
|
|
765
|
-
services.session.notice("warn", "usage: /effort [on|off|minimal|low|medium|high|xhigh|max]");
|
|
766
|
-
}
|
|
767
|
-
export async function handleHistory(services, invocation) {
|
|
768
|
-
const rawArgs = invocation?.args?.trim() ?? "";
|
|
769
|
-
if (rawArgs) {
|
|
770
|
-
const [sub, ...rest] = rawArgs.split(/\s+/);
|
|
771
|
-
const subLower = sub?.toLowerCase() ?? "";
|
|
772
|
-
if (["delete", "remove", "rm", "del"].includes(subLower)) {
|
|
773
|
-
const finalId = rest.join(" ").trim();
|
|
774
|
-
if (!finalId) {
|
|
775
|
-
services.session.notice("warn", "usage: /history delete <session-id>");
|
|
776
|
-
return;
|
|
777
|
-
}
|
|
778
|
-
const result = await deleteSession(finalId);
|
|
779
|
-
services.session.notice(result.deleted ? "info" : "warn", result.deleted ? `deleted ${finalId}` : result.detail);
|
|
780
|
-
return;
|
|
781
|
-
}
|
|
782
|
-
}
|
|
783
|
-
const sessions = await listSessionSummaries(200, { recovery: "background" });
|
|
784
|
-
const currentMessages = services.session.messages;
|
|
785
|
-
const currentId = services.session.sessionId;
|
|
786
|
-
const currentTitle = services.session.getState().title;
|
|
787
|
-
if (sessions.length === 0 && currentMessages.length === 0) {
|
|
788
|
-
services.session.notice("info", "no session history yet — chat once and it will appear here with an AI title");
|
|
789
|
-
return;
|
|
790
|
-
}
|
|
791
|
-
// Live session once at the top — never also list the same id below
|
|
792
|
-
// (that looked like two copies of one chat with different item counts).
|
|
793
|
-
const otherSessions = sessions.filter((s) => s.id !== currentId);
|
|
794
|
-
const liveVisualCount = conversationItemCount(services.transcript.getState());
|
|
795
|
-
const options = [
|
|
796
|
-
{
|
|
797
|
-
value: "__current__",
|
|
798
|
-
label: currentTitle?.trim() || "Current session",
|
|
799
|
-
description: currentMessages.length
|
|
800
|
-
? `id ${currentId} · now · ${liveVisualCount} items · ${currentMessages.length} model msgs · this window`
|
|
801
|
-
: `id ${currentId} · now · empty session · this window`,
|
|
802
|
-
active: true,
|
|
803
|
-
},
|
|
804
|
-
...otherSessions.map((session) => {
|
|
805
|
-
const count = session.itemCount;
|
|
806
|
-
const date = session.updatedAt ?? session.createdAt;
|
|
807
|
-
const when = relativeTime(date) || "some time ago";
|
|
808
|
-
const stamp = date.slice(0, 16).replace("T", " ");
|
|
809
|
-
const where = shortCwd(session.cwd);
|
|
810
|
-
const title = (session.name && session.name.trim()) || "Untitled chat";
|
|
811
|
-
// Two-line card: title on top; meta chips underneath (full session id).
|
|
812
|
-
const meta = [
|
|
813
|
-
`id ${session.id}`,
|
|
814
|
-
when,
|
|
815
|
-
stamp,
|
|
816
|
-
`${count} item${count === 1 ? "" : "s"}`,
|
|
817
|
-
where ? `in ${where}` : "",
|
|
818
|
-
]
|
|
819
|
-
.filter(Boolean)
|
|
820
|
-
.join(" · ");
|
|
821
|
-
return {
|
|
822
|
-
value: session.id,
|
|
823
|
-
label: title,
|
|
824
|
-
description: meta,
|
|
825
|
-
active: false,
|
|
826
|
-
};
|
|
827
|
-
}),
|
|
828
|
-
];
|
|
829
|
-
const liveOptions = [...options];
|
|
830
|
-
const deleteRow = (value) => {
|
|
831
|
-
if (value === "__current__") {
|
|
832
|
-
services.toast.warn("cannot delete the session you are in", {
|
|
833
|
-
key: "history-delete",
|
|
834
|
-
});
|
|
835
|
-
return;
|
|
836
|
-
}
|
|
837
|
-
const index = liveOptions.findIndex((option) => option.value === value);
|
|
838
|
-
if (index === -1)
|
|
839
|
-
return;
|
|
840
|
-
const label = liveOptions[index].label;
|
|
841
|
-
liveOptions.splice(index, 1);
|
|
842
|
-
services.overlay.replacePickerOptions([...liveOptions]);
|
|
843
|
-
services.toast.info(`deleting ${label}…`, { key: "history-delete" });
|
|
844
|
-
void (async () => {
|
|
845
|
-
const result = await purgeSession(value);
|
|
846
|
-
if (result.deleted) {
|
|
847
|
-
services.toast.success(`deleted ${label} · ${result.detail}`, {
|
|
848
|
-
key: "history-delete",
|
|
849
|
-
});
|
|
850
|
-
}
|
|
851
|
-
else {
|
|
852
|
-
services.toast.error(`could not delete ${label} · ${result.detail}`, {
|
|
853
|
-
key: "history-delete",
|
|
854
|
-
});
|
|
855
|
-
}
|
|
856
|
-
})();
|
|
857
|
-
};
|
|
858
|
-
services.overlay.openPicker({
|
|
859
|
-
title: "History",
|
|
860
|
-
twoLine: true,
|
|
861
|
-
historyStyle: true,
|
|
862
|
-
searchDescription: true,
|
|
863
|
-
rowAction: { chord: "ctrl+x", hint: "^x:delete" },
|
|
864
|
-
options,
|
|
865
|
-
}, (value) => {
|
|
866
|
-
void (async () => {
|
|
867
|
-
if (value === "__current__") {
|
|
868
|
-
services.session.notice("info", "showing current session");
|
|
869
|
-
services.overlay.close();
|
|
870
|
-
return;
|
|
871
|
-
}
|
|
872
|
-
// Refresh only the selected record so a session changed by another
|
|
873
|
-
// process while the picker was open cannot be resumed stale. This work
|
|
874
|
-
// happens after selection and does not delay opening /history.
|
|
875
|
-
const session = await getSession(value);
|
|
876
|
-
if (!session) {
|
|
877
|
-
services.session.notice("warn", "session not found");
|
|
878
|
-
services.overlay.close();
|
|
879
|
-
return;
|
|
880
|
-
}
|
|
881
|
-
if (session.id === currentId) {
|
|
882
|
-
services.session.notice("info", "already on this session");
|
|
883
|
-
services.overlay.close();
|
|
884
|
-
return;
|
|
885
|
-
}
|
|
886
|
-
// Persist the outgoing live session before rebinding id, so work is not
|
|
887
|
-
// lost and we don't orphan a half-saved row under the old id.
|
|
888
|
-
if (currentMessages.length > 0) {
|
|
889
|
-
try {
|
|
890
|
-
await services.session.persistNow();
|
|
891
|
-
}
|
|
892
|
-
catch {
|
|
893
|
-
/* best-effort */
|
|
894
|
-
}
|
|
895
|
-
}
|
|
896
|
-
clearActiveProjectRoot();
|
|
897
|
-
services.plan.clear();
|
|
898
|
-
services.session.loadHistory(session.messages, {
|
|
899
|
-
sessionId: session.id,
|
|
900
|
-
title: session.name,
|
|
901
|
-
persistenceRevision: session.revision,
|
|
902
|
-
...(session.previousTurn
|
|
903
|
-
? { previousTurn: session.previousTurn }
|
|
904
|
-
: {}),
|
|
905
|
-
...(session.contextUsage
|
|
906
|
-
? { contextUsage: session.contextUsage }
|
|
907
|
-
: {}),
|
|
908
|
-
...(session.workspaceFolder
|
|
909
|
-
? {
|
|
910
|
-
workspaceFolder: session.workspaceFolder,
|
|
911
|
-
workspaceCode: session.workspaceCode,
|
|
912
|
-
}
|
|
913
|
-
: {}),
|
|
914
|
-
});
|
|
915
|
-
// Prefer the richer of visual transcript vs model messages (tools often
|
|
916
|
-
// survive only in messages after abort-before-save of the UI snapshot).
|
|
917
|
-
const visual = boundSessionVisualInput(session.transcript, session.messages);
|
|
918
|
-
const hydrated = hydrateSessionVisual(visual.transcript, visual.messages);
|
|
919
|
-
services.transcript.hydrate(hydrated.state);
|
|
920
|
-
if (visual.omittedItems > 0 || visual.omittedMessages > 0) {
|
|
921
|
-
services.session.notice("info", `Loaded recent history view; ${Math.max(visual.omittedItems, visual.omittedMessages)} older item(s) remain available to the model on continue.`);
|
|
922
|
-
}
|
|
923
|
-
// Seed tool output spools so click-to-pager still has bodies.
|
|
924
|
-
for (const [toolCallId, output] of hydrated.toolOutputs) {
|
|
925
|
-
services.session.spool.replace(toolCallId, output);
|
|
926
|
-
}
|
|
927
|
-
// Plans are stored per sessionId (plans.jsonl / sqlite), separate from
|
|
928
|
-
// the chat transcript. Reload them so Ctrl+H / Ctrl+P show the plan
|
|
929
|
-
// that belonged to this resumed session (classic clai parity).
|
|
930
|
-
const plan = await services.plan.load(session.id).catch(() => undefined);
|
|
931
|
-
// Clear approval gate for a resumed plan — user must /implement again
|
|
932
|
-
// if the plan was still draft/approved but execution should not resume
|
|
933
|
-
// silently.
|
|
934
|
-
services.session.setPlanApproved(plan?.status === "approved" || plan?.status === "in_progress");
|
|
935
|
-
// Notices are UI-only — exclude from item counts (and they are never
|
|
936
|
-
// model messages; session.messages is already the real LLM history).
|
|
937
|
-
const itemCount = conversationItemCount(hydrated.state);
|
|
938
|
-
const titleBit = session.name
|
|
939
|
-
? ` · ${session.name.length > 28 ? `${session.name.slice(0, 27)}…` : session.name}`
|
|
940
|
-
: "";
|
|
941
|
-
const planBit = plan ? " · plan" : "";
|
|
942
|
-
const toolCards = [...hydrated.state.byId.values()].filter((i) => i.kind === "tool").length;
|
|
943
|
-
const incomplete = transcriptLooksIncomplete(session.transcript?.length ?? 0, session.messages) ||
|
|
944
|
-
(Boolean(plan?.tasks?.length) &&
|
|
945
|
-
toolCards === 0 &&
|
|
946
|
-
(session.transcript?.length ?? 0) < 8);
|
|
947
|
-
// Short toast — full counts were too wide for the chip.
|
|
948
|
-
services.session.notice("info", `resumed${titleBit}${planBit} · ${itemCount} items`);
|
|
949
|
-
if (incomplete) {
|
|
950
|
-
services.session.notice("warn", plan?.tasks?.length
|
|
951
|
-
? "thin history · plan OK · /implement to continue"
|
|
952
|
-
: "thin history · some tools may be missing");
|
|
953
|
-
}
|
|
954
|
-
services.overlay.close();
|
|
955
|
-
})();
|
|
956
|
-
}, deleteRow);
|
|
957
|
-
}
|
|
958
|
-
export function handlePermissions(services, invocation) {
|
|
959
|
-
const apply = (value) => {
|
|
960
|
-
updateConfig({ permissions: value });
|
|
961
|
-
services.session.notice("info", `permissions → ${value}`);
|
|
962
|
-
};
|
|
963
|
-
if (invocation.args) {
|
|
964
|
-
const value = invocation.args.trim().toLowerCase();
|
|
965
|
-
if (value === "default" || value === "allow-all")
|
|
966
|
-
apply(value);
|
|
967
|
-
return;
|
|
968
|
-
}
|
|
969
|
-
const current = getConfig().permissions ?? "default";
|
|
970
|
-
services.overlay.openPicker({
|
|
971
|
-
title: "Permissions",
|
|
972
|
-
options: [
|
|
973
|
-
{
|
|
974
|
-
value: "default",
|
|
975
|
-
label: "default",
|
|
976
|
-
description: "confirm risky tool calls",
|
|
977
|
-
active: current === "default",
|
|
978
|
-
},
|
|
979
|
-
{
|
|
980
|
-
value: "allow-all",
|
|
981
|
-
label: "allow-all",
|
|
982
|
-
description: "skip confirmation prompts",
|
|
983
|
-
active: current === "allow-all",
|
|
984
|
-
},
|
|
985
|
-
],
|
|
986
|
-
}, (value) => {
|
|
987
|
-
apply(value);
|
|
988
|
-
services.overlay.close();
|
|
989
|
-
});
|
|
990
|
-
}
|
|
991
|
-
export function handleOutput(services, invocation) {
|
|
992
|
-
const state = services.transcript.getState();
|
|
993
|
-
const toolItems = [...state.byId.values()].filter((item) => item.kind === "tool");
|
|
994
|
-
if (toolItems.length === 0) {
|
|
995
|
-
services.session.notice("info", "no tool output yet");
|
|
996
|
-
return;
|
|
997
|
-
}
|
|
998
|
-
const arg = invocation.args.trim().toLowerCase();
|
|
999
|
-
if (!arg) {
|
|
1000
|
-
services.transcript.toggleOutputGlobal();
|
|
1001
|
-
const on = services.transcript.getState().expandOutputGlobal;
|
|
1002
|
-
services.toast.show(on ? "Tool output expanded · ^O" : "Tool output collapsed · ^O", { key: "output", durationMs: 1500 });
|
|
1003
|
-
return;
|
|
1004
|
-
}
|
|
1005
|
-
if (arg === "list" || arg === "ls") {
|
|
1006
|
-
services.overlay.openPicker({
|
|
1007
|
-
title: "Tool output",
|
|
1008
|
-
options: toolItems.map((item) => ({
|
|
1009
|
-
value: item.id,
|
|
1010
|
-
label: item.name,
|
|
1011
|
-
description: item.argsDisplay,
|
|
1012
|
-
})),
|
|
1013
|
-
}, (value) => {
|
|
1014
|
-
services.overlay.close();
|
|
1015
|
-
const item = toolItems.find((t) => t.id === value);
|
|
1016
|
-
if (item)
|
|
1017
|
-
void openToolOutputPager(services, item);
|
|
1018
|
-
});
|
|
1019
|
-
return;
|
|
1020
|
-
}
|
|
1021
|
-
const target = arg !== "last"
|
|
1022
|
-
? toolItems.find((t) => t.toolCallId === arg || t.id === arg)
|
|
1023
|
-
: toolItems.at(-1);
|
|
1024
|
-
if (target)
|
|
1025
|
-
void openToolOutputPager(services, target);
|
|
1026
|
-
else
|
|
1027
|
-
services.session.notice("info", arg ? `no tool output: ${arg}` : "no tool output yet");
|
|
1028
|
-
}
|
|
1029
|
-
export function handlePlanPager(services) {
|
|
1030
|
-
void (async () => {
|
|
1031
|
-
let plan = services.plan.current();
|
|
1032
|
-
if (!plan) {
|
|
1033
|
-
plan = await services.plan
|
|
1034
|
-
.load(services.session.sessionId)
|
|
1035
|
-
.catch(() => undefined);
|
|
1036
|
-
}
|
|
1037
|
-
if (!plan) {
|
|
1038
|
-
services.session.notice("info", "no active plan yet");
|
|
1039
|
-
return;
|
|
1040
|
-
}
|
|
1041
|
-
const { formatPlanPagerDocument } = await import("../../rendering/plan-view.js");
|
|
1042
|
-
services.overlay.openPager(`Plan · ${plan.goal}`, formatPlanPagerDocument(plan), undefined, undefined, "force");
|
|
1043
|
-
})();
|
|
1044
|
-
}
|
|
1045
|
-
//# sourceMappingURL=picker-commands.js.map
|