@aragon-agent/tui 0.0.0-stage → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/LICENSE +21 -0
- package/README.md +81 -2
- package/dist/index.d.ts +11 -0
- package/dist/index.js +11 -0
- package/dist/input/control-sequences.d.ts +71 -0
- package/dist/input/control-sequences.js +222 -0
- package/dist/input/csiu-keys.d.ts +66 -0
- package/dist/input/csiu-keys.js +181 -0
- package/dist/input/cursor-report.d.ts +61 -0
- package/dist/input/cursor-report.js +97 -0
- package/dist/input/enter-sequences.d.ts +64 -0
- package/dist/input/enter-sequences.js +153 -0
- package/dist/input/interrupt-gesture.d.ts +18 -0
- package/dist/input/interrupt-gesture.js +19 -0
- package/dist/input/keyboard-enhancement.d.ts +42 -0
- package/dist/input/keyboard-enhancement.js +65 -0
- package/dist/input/keymap.d.ts +20 -0
- package/dist/input/keymap.js +99 -0
- package/dist/input/limits.d.ts +118 -0
- package/dist/input/limits.js +109 -0
- package/dist/input/mouse-events.d.ts +87 -0
- package/dist/input/mouse-events.js +212 -0
- package/dist/input/paste-parse.d.ts +83 -0
- package/dist/input/paste-parse.js +107 -0
- package/dist/input/pointer-router.d.ts +11 -0
- package/dist/input/pointer-router.js +14 -0
- package/dist/input/stdin-filter.d.ts +112 -0
- package/dist/input/stdin-filter.js +657 -0
- package/dist/input/win32-input-mode.d.ts +61 -0
- package/dist/input/win32-input-mode.js +269 -0
- package/dist/model/agent/agent-mode.d.ts +108 -0
- package/dist/model/agent/agent-mode.js +121 -0
- package/dist/model/agent/entry-limits.d.ts +65 -0
- package/dist/model/agent/entry-limits.js +133 -0
- package/dist/model/agent/governance-view.d.ts +40 -0
- package/dist/model/agent/governance-view.js +40 -0
- package/dist/model/agent/invocation-card.d.ts +77 -0
- package/dist/model/agent/invocation-card.js +169 -0
- package/dist/model/agent/model-probe-limits.d.ts +39 -0
- package/dist/model/agent/model-probe-limits.js +25 -0
- package/dist/model/agent/model-probe.d.ts +104 -0
- package/dist/model/agent/model-probe.js +391 -0
- package/dist/model/agent/queued-messages.d.ts +23 -0
- package/dist/model/agent/queued-messages.js +49 -0
- package/dist/model/agent/reducer.d.ts +857 -0
- package/dist/model/agent/reducer.js +1646 -0
- package/dist/model/agent/retry-view.d.ts +68 -0
- package/dist/model/agent/retry-view.js +95 -0
- package/dist/model/agent/usage.d.ts +47 -0
- package/dist/model/agent/usage.js +84 -0
- package/dist/model/compaction/limits.d.ts +61 -0
- package/dist/model/compaction/limits.js +64 -0
- package/dist/model/compaction/meter.d.ts +276 -0
- package/dist/model/compaction/meter.js +512 -0
- package/dist/model/compaction/pressure.d.ts +163 -0
- package/dist/model/compaction/pressure.js +199 -0
- package/dist/model/compaction/reason-text.d.ts +36 -0
- package/dist/model/compaction/reason-text.js +78 -0
- package/dist/model/compaction/types.d.ts +360 -0
- package/dist/model/compaction/types.js +22 -0
- package/dist/model/config/governance-config.d.ts +125 -0
- package/dist/model/config/governance-config.js +164 -0
- package/dist/model/config/kit-resolution.d.ts +93 -0
- package/dist/model/config/kit-resolution.js +226 -0
- package/dist/model/config/model-kits.d.ts +225 -0
- package/dist/model/config/model-kits.js +302 -0
- package/dist/model/config/model-profile-resolution.d.ts +28 -0
- package/dist/model/config/model-profile-resolution.js +88 -0
- package/dist/model/config/model-profiles.d.ts +103 -0
- package/dist/model/config/model-profiles.js +188 -0
- package/dist/model/config/model-settings-types.d.ts +71 -0
- package/dist/model/config/model-settings-types.js +18 -0
- package/dist/model/config/schema.d.ts +1645 -0
- package/dist/model/config/schema.js +1383 -0
- package/dist/model/fast/limits.d.ts +152 -0
- package/dist/model/fast/limits.js +152 -0
- package/dist/model/fast/resolve.d.ts +44 -0
- package/dist/model/fast/resolve.js +107 -0
- package/dist/model/fast/task-summary-types.d.ts +66 -0
- package/dist/model/fast/task-summary-types.js +17 -0
- package/dist/model/fast/types.d.ts +141 -0
- package/dist/model/fast/types.js +14 -0
- package/dist/model/governance/governed-dispatch.d.ts +19 -0
- package/dist/model/governance/governed-dispatch.js +17 -0
- package/dist/model/governance/limits.d.ts +107 -0
- package/dist/model/governance/limits.js +131 -0
- package/dist/model/governance/posture.d.ts +35 -0
- package/dist/model/governance/posture.js +59 -0
- package/dist/model/governance/rules/events-table.d.ts +46 -0
- package/dist/model/governance/rules/events-table.js +94 -0
- package/dist/model/governance/types.d.ts +661 -0
- package/dist/model/governance/types.js +27 -0
- package/dist/model/logging/levels.d.ts +40 -0
- package/dist/model/logging/levels.js +59 -0
- package/dist/model/logging/log-port.d.ts +38 -0
- package/dist/model/logging/log-port.js +41 -0
- package/dist/model/logging/secret-registry.d.ts +32 -0
- package/dist/model/logging/secret-registry.js +73 -0
- package/dist/model/proc/limits.d.ts +214 -0
- package/dist/model/proc/limits.js +221 -0
- package/dist/model/proc/progress.d.ts +47 -0
- package/dist/model/proc/progress.js +163 -0
- package/dist/model/proc/types.d.ts +269 -0
- package/dist/model/proc/types.js +15 -0
- package/dist/model/proc/wait-view.d.ts +65 -0
- package/dist/model/proc/wait-view.js +66 -0
- package/dist/model/prompts/copy.d.ts +89 -0
- package/dist/model/prompts/copy.js +131 -0
- package/dist/model/prompts/fill.d.ts +51 -0
- package/dist/model/prompts/fill.js +46 -0
- package/dist/model/prompts/limits.d.ts +53 -0
- package/dist/model/prompts/limits.js +53 -0
- package/dist/model/prompts/search.d.ts +58 -0
- package/dist/model/prompts/search.js +146 -0
- package/dist/model/prompts/types.d.ts +204 -0
- package/dist/model/prompts/types.js +13 -0
- package/dist/model/prompts/validate.d.ts +22 -0
- package/dist/model/prompts/validate.js +69 -0
- package/dist/model/team/activity.d.ts +67 -0
- package/dist/model/team/activity.js +130 -0
- package/dist/model/team/limits.d.ts +308 -0
- package/dist/model/team/limits.js +330 -0
- package/dist/model/team/model.d.ts +104 -0
- package/dist/model/team/model.js +150 -0
- package/dist/model/team/panel-rows.d.ts +48 -0
- package/dist/model/team/panel-rows.js +75 -0
- package/dist/model/team/timeline.d.ts +74 -0
- package/dist/model/team/timeline.js +101 -0
- package/dist/model/team/types.d.ts +354 -0
- package/dist/model/team/types.js +13 -0
- package/dist/model/todo/acceptance.d.ts +120 -0
- package/dist/model/todo/acceptance.js +399 -0
- package/dist/model/todo/follow-through.d.ts +138 -0
- package/dist/model/todo/follow-through.js +248 -0
- package/dist/model/todo/limits.d.ts +152 -0
- package/dist/model/todo/limits.js +152 -0
- package/dist/model/todo/panel-rows.d.ts +45 -0
- package/dist/model/todo/panel-rows.js +70 -0
- package/dist/model/todo/plan-sections.d.ts +60 -0
- package/dist/model/todo/plan-sections.js +108 -0
- package/dist/model/todo/row-window.d.ts +51 -0
- package/dist/model/todo/row-window.js +107 -0
- package/dist/model/todo/types.d.ts +124 -0
- package/dist/model/todo/types.js +12 -0
- package/dist/model/tools/human-input.d.ts +212 -0
- package/dist/model/tools/human-input.js +265 -0
- package/dist/model/tools/patch.d.ts +115 -0
- package/dist/model/tools/patch.js +453 -0
- package/dist/model/tools/terminal-output.d.ts +115 -0
- package/dist/model/tools/terminal-output.js +201 -0
- package/dist/model/tools/tool-output-store.d.ts +68 -0
- package/dist/model/tools/tool-output-store.js +102 -0
- package/dist/model/update/limits.d.ts +111 -0
- package/dist/model/update/limits.js +111 -0
- package/dist/model/update/semver.d.ts +89 -0
- package/dist/model/update/semver.js +295 -0
- package/dist/model/update/types.d.ts +169 -0
- package/dist/model/update/types.js +68 -0
- package/dist/testing/governance-fixtures.d.ts +13 -0
- package/dist/testing/governance-fixtures.js +98 -0
- package/dist/testing/mini-vt.d.ts +28 -0
- package/dist/testing/mini-vt.js +158 -0
- package/dist/testing/render-at-width.d.ts +16 -0
- package/dist/testing/render-at-width.js +57 -0
- package/dist/testing/terminal-harness.d.ts +15 -0
- package/dist/testing/terminal-harness.js +40 -0
- package/dist/testing/vt-screen.d.ts +28 -0
- package/dist/testing/vt-screen.js +139 -0
- package/dist/ui/ActivityLine.d.ts +26 -0
- package/dist/ui/ActivityLine.js +51 -0
- package/dist/ui/AutocompletePopup.d.ts +23 -0
- package/dist/ui/AutocompletePopup.js +17 -0
- package/dist/ui/BottomStatusRow.d.ts +10 -0
- package/dist/ui/BottomStatusRow.js +9 -0
- package/dist/ui/Composer.d.ts +115 -0
- package/dist/ui/Composer.js +64 -0
- package/dist/ui/GovernancePanel.d.ts +50 -0
- package/dist/ui/GovernancePanel.js +77 -0
- package/dist/ui/GovernanceRun.d.ts +18 -0
- package/dist/ui/GovernanceRun.js +11 -0
- package/dist/ui/Header.d.ts +48 -0
- package/dist/ui/Header.js +27 -0
- package/dist/ui/Logo.d.ts +32 -0
- package/dist/ui/Logo.js +65 -0
- package/dist/ui/Markdown.d.ts +29 -0
- package/dist/ui/Markdown.js +116 -0
- package/dist/ui/PromptCaret.d.ts +11 -0
- package/dist/ui/PromptCaret.js +31 -0
- package/dist/ui/PromptInput.d.ts +192 -0
- package/dist/ui/PromptInput.js +689 -0
- package/dist/ui/QueuePanel.d.ts +8 -0
- package/dist/ui/QueuePanel.js +9 -0
- package/dist/ui/QueueStatusRow.d.ts +24 -0
- package/dist/ui/QueueStatusRow.js +51 -0
- package/dist/ui/ScrollbackShell.d.ts +132 -0
- package/dist/ui/ScrollbackShell.js +26 -0
- package/dist/ui/SessionOpener.d.ts +30 -0
- package/dist/ui/SessionOpener.js +12 -0
- package/dist/ui/StatusBar.d.ts +130 -0
- package/dist/ui/StatusBar.js +61 -0
- package/dist/ui/TeamPanel.d.ts +76 -0
- package/dist/ui/TeamPanel.js +103 -0
- package/dist/ui/ToastStack.d.ts +8 -0
- package/dist/ui/ToastStack.js +31 -0
- package/dist/ui/TodoPanel.d.ts +52 -0
- package/dist/ui/TodoPanel.js +214 -0
- package/dist/ui/Transcript.d.ts +105 -0
- package/dist/ui/Transcript.js +258 -0
- package/dist/ui/UpdateLine.d.ts +44 -0
- package/dist/ui/UpdateLine.js +129 -0
- package/dist/ui/activity-phrases.d.ts +33 -0
- package/dist/ui/activity-phrases.js +50 -0
- package/dist/ui/capabilities.d.ts +27 -0
- package/dist/ui/capabilities.js +65 -0
- package/dist/ui/clipboard-task.d.ts +29 -0
- package/dist/ui/clipboard-task.js +66 -0
- package/dist/ui/clipboard.d.ts +31 -0
- package/dist/ui/clipboard.js +157 -0
- package/dist/ui/color-runtime.d.ts +5 -0
- package/dist/ui/color-runtime.js +29 -0
- package/dist/ui/composer-input.d.ts +38 -0
- package/dist/ui/composer-input.js +79 -0
- package/dist/ui/composer-limits.d.ts +30 -0
- package/dist/ui/composer-limits.js +45 -0
- package/dist/ui/composer-rows.d.ts +73 -0
- package/dist/ui/composer-rows.js +129 -0
- package/dist/ui/console-bridge.d.ts +19 -0
- package/dist/ui/console-bridge.js +52 -0
- package/dist/ui/density.d.ts +26 -0
- package/dist/ui/density.js +34 -0
- package/dist/ui/display-tab.d.ts +51 -0
- package/dist/ui/display-tab.js +82 -0
- package/dist/ui/editor-navigation.d.ts +55 -0
- package/dist/ui/editor-navigation.js +96 -0
- package/dist/ui/editor-reducer.d.ts +108 -0
- package/dist/ui/editor-reducer.js +187 -0
- package/dist/ui/enter-frames.d.ts +47 -0
- package/dist/ui/enter-frames.js +117 -0
- package/dist/ui/entries/AssistantEntry.d.ts +37 -0
- package/dist/ui/entries/AssistantEntry.js +43 -0
- package/dist/ui/entries/CompactionCard.d.ts +88 -0
- package/dist/ui/entries/CompactionCard.js +222 -0
- package/dist/ui/entries/DiffView.d.ts +61 -0
- package/dist/ui/entries/DiffView.js +103 -0
- package/dist/ui/entries/EntryFrame.d.ts +23 -0
- package/dist/ui/entries/EntryFrame.js +6 -0
- package/dist/ui/entries/FastCard.d.ts +53 -0
- package/dist/ui/entries/FastCard.js +105 -0
- package/dist/ui/entries/GovernanceCard.d.ts +30 -0
- package/dist/ui/entries/GovernanceCard.js +32 -0
- package/dist/ui/entries/InvocationCard.d.ts +20 -0
- package/dist/ui/entries/InvocationCard.js +32 -0
- package/dist/ui/entries/QueuedEntry.d.ts +27 -0
- package/dist/ui/entries/QueuedEntry.js +33 -0
- package/dist/ui/entries/RetryCard.d.ts +56 -0
- package/dist/ui/entries/RetryCard.js +60 -0
- package/dist/ui/entries/ServiceCard.d.ts +82 -0
- package/dist/ui/entries/ServiceCard.js +151 -0
- package/dist/ui/entries/TeamCard.d.ts +55 -0
- package/dist/ui/entries/TeamCard.js +94 -0
- package/dist/ui/entries/TodoCard.d.ts +54 -0
- package/dist/ui/entries/TodoCard.js +98 -0
- package/dist/ui/entries/ToolCard.d.ts +81 -0
- package/dist/ui/entries/ToolCard.js +169 -0
- package/dist/ui/entries/ToolPreview.d.ts +59 -0
- package/dist/ui/entries/ToolPreview.js +208 -0
- package/dist/ui/entries/UserEntry.d.ts +36 -0
- package/dist/ui/entries/UserEntry.js +57 -0
- package/dist/ui/entries/WaitCard.d.ts +37 -0
- package/dist/ui/entries/WaitCard.js +92 -0
- package/dist/ui/exit-snapshot.d.ts +43 -0
- package/dist/ui/exit-snapshot.js +26 -0
- package/dist/ui/frame-differ.d.ts +166 -0
- package/dist/ui/frame-differ.js +354 -0
- package/dist/ui/frame-observer.d.ts +17 -0
- package/dist/ui/frame-observer.js +94 -0
- package/dist/ui/frame-parser.d.ts +7 -0
- package/dist/ui/frame-parser.js +18 -0
- package/dist/ui/gauge.d.ts +39 -0
- package/dist/ui/gauge.js +55 -0
- package/dist/ui/glyphs.d.ts +178 -0
- package/dist/ui/glyphs.js +165 -0
- package/dist/ui/governance-copy.d.ts +69 -0
- package/dist/ui/governance-copy.js +104 -0
- package/dist/ui/governance-status.d.ts +145 -0
- package/dist/ui/governance-status.js +326 -0
- package/dist/ui/gradient.d.ts +11 -0
- package/dist/ui/gradient.js +50 -0
- package/dist/ui/ink-runtime.d.ts +4 -0
- package/dist/ui/ink-runtime.js +51 -0
- package/dist/ui/interaction-copy.d.ts +84 -0
- package/dist/ui/interaction-copy.js +41 -0
- package/dist/ui/interaction-hints.d.ts +44 -0
- package/dist/ui/interaction-hints.js +97 -0
- package/dist/ui/layout/AppShell.d.ts +17 -0
- package/dist/ui/layout/AppShell.js +6 -0
- package/dist/ui/layout/Gutter.d.ts +67 -0
- package/dist/ui/layout/Gutter.js +42 -0
- package/dist/ui/layout/MeasuredEntry.d.ts +21 -0
- package/dist/ui/layout/MeasuredEntry.js +30 -0
- package/dist/ui/layout/OverlayFrame.d.ts +73 -0
- package/dist/ui/layout/OverlayFrame.js +110 -0
- package/dist/ui/layout/ScrollIndicator.d.ts +32 -0
- package/dist/ui/layout/ScrollIndicator.js +22 -0
- package/dist/ui/layout/ScrollViewport.d.ts +40 -0
- package/dist/ui/layout/ScrollViewport.js +222 -0
- package/dist/ui/layout/agents-board.d.ts +102 -0
- package/dist/ui/layout/agents-board.js +389 -0
- package/dist/ui/layout/autocomplete.d.ts +18 -0
- package/dist/ui/layout/autocomplete.js +26 -0
- package/dist/ui/layout/budget.d.ts +43 -0
- package/dist/ui/layout/budget.js +52 -0
- package/dist/ui/layout/cells.d.ts +61 -0
- package/dist/ui/layout/cells.js +156 -0
- package/dist/ui/layout/document-layout.d.ts +13 -0
- package/dist/ui/layout/document-layout.js +10 -0
- package/dist/ui/layout/follow-state.d.ts +138 -0
- package/dist/ui/layout/follow-state.js +148 -0
- package/dist/ui/layout/frame.d.ts +36 -0
- package/dist/ui/layout/frame.js +39 -0
- package/dist/ui/layout/governance-board.d.ts +121 -0
- package/dist/ui/layout/governance-board.js +382 -0
- package/dist/ui/layout/governance-card.d.ts +53 -0
- package/dist/ui/layout/governance-card.js +134 -0
- package/dist/ui/layout/governance-chip.d.ts +38 -0
- package/dist/ui/layout/governance-chip.js +64 -0
- package/dist/ui/layout/governance-panel.d.ts +85 -0
- package/dist/ui/layout/governance-panel.js +358 -0
- package/dist/ui/layout/governance-roster.d.ts +65 -0
- package/dist/ui/layout/governance-roster.js +275 -0
- package/dist/ui/layout/header-hints.d.ts +90 -0
- package/dist/ui/layout/header-hints.js +110 -0
- package/dist/ui/layout/header-left.d.ts +115 -0
- package/dist/ui/layout/header-left.js +206 -0
- package/dist/ui/layout/invocation-card.d.ts +41 -0
- package/dist/ui/layout/invocation-card.js +91 -0
- package/dist/ui/layout/kit-chip.d.ts +50 -0
- package/dist/ui/layout/kit-chip.js +81 -0
- package/dist/ui/layout/overlay-window.d.ts +43 -0
- package/dist/ui/layout/overlay-window.js +51 -0
- package/dist/ui/layout/queue-layout.d.ts +19 -0
- package/dist/ui/layout/queue-layout.js +26 -0
- package/dist/ui/layout/rail.d.ts +7 -0
- package/dist/ui/layout/rail.js +16 -0
- package/dist/ui/layout/scroll-indicator.d.ts +27 -0
- package/dist/ui/layout/scroll-indicator.js +36 -0
- package/dist/ui/layout/scroll.d.ts +37 -0
- package/dist/ui/layout/scroll.js +99 -0
- package/dist/ui/layout/scrollbar-geometry.d.ts +17 -0
- package/dist/ui/layout/scrollbar-geometry.js +13 -0
- package/dist/ui/layout/session-chip.d.ts +52 -0
- package/dist/ui/layout/session-chip.js +64 -0
- package/dist/ui/layout/shortcut-panel-layout.d.ts +191 -0
- package/dist/ui/layout/shortcut-panel-layout.js +321 -0
- package/dist/ui/layout/status-detail-layout.d.ts +9 -0
- package/dist/ui/layout/status-detail-layout.js +79 -0
- package/dist/ui/layout/status-layout.d.ts +140 -0
- package/dist/ui/layout/status-layout.js +262 -0
- package/dist/ui/layout/task-summary-cell.d.ts +61 -0
- package/dist/ui/layout/task-summary-cell.js +65 -0
- package/dist/ui/layout/team-panel.d.ts +18 -0
- package/dist/ui/layout/team-panel.js +25 -0
- package/dist/ui/layout/team-row.d.ts +139 -0
- package/dist/ui/layout/team-row.js +246 -0
- package/dist/ui/layout/todo-layout.d.ts +62 -0
- package/dist/ui/layout/todo-layout.js +102 -0
- package/dist/ui/layout/useTerminalSize.d.ts +13 -0
- package/dist/ui/layout/useTerminalSize.js +50 -0
- package/dist/ui/layout/viewport-geometry.d.ts +29 -0
- package/dist/ui/layout/viewport-geometry.js +28 -0
- package/dist/ui/layout/virtual-window.d.ts +112 -0
- package/dist/ui/layout/virtual-window.js +494 -0
- package/dist/ui/layout/wait-bar.d.ts +34 -0
- package/dist/ui/layout/wait-bar.js +48 -0
- package/dist/ui/layout/wrap-rows.d.ts +26 -0
- package/dist/ui/layout/wrap-rows.js +88 -0
- package/dist/ui/live-clamp.d.ts +14 -0
- package/dist/ui/live-clamp.js +46 -0
- package/dist/ui/markdown-blocks.d.ts +107 -0
- package/dist/ui/markdown-blocks.js +240 -0
- package/dist/ui/overlays/AgentsBoardOverlay.d.ts +57 -0
- package/dist/ui/overlays/AgentsBoardOverlay.js +183 -0
- package/dist/ui/overlays/ConfirmDialog.d.ts +31 -0
- package/dist/ui/overlays/ConfirmDialog.js +44 -0
- package/dist/ui/overlays/GovernanceBoardOverlay.d.ts +41 -0
- package/dist/ui/overlays/GovernanceBoardOverlay.js +76 -0
- package/dist/ui/overlays/GovernanceSettingsPage.d.ts +48 -0
- package/dist/ui/overlays/GovernanceSettingsPage.js +93 -0
- package/dist/ui/overlays/HelpOverlay.d.ts +29 -0
- package/dist/ui/overlays/HelpOverlay.js +232 -0
- package/dist/ui/overlays/KitEditor.d.ts +23 -0
- package/dist/ui/overlays/KitEditor.js +101 -0
- package/dist/ui/overlays/KitManager.d.ts +23 -0
- package/dist/ui/overlays/KitManager.js +104 -0
- package/dist/ui/overlays/KitPicker.d.ts +49 -0
- package/dist/ui/overlays/KitPicker.js +58 -0
- package/dist/ui/overlays/ModelDiscoveryList.d.ts +23 -0
- package/dist/ui/overlays/ModelDiscoveryList.js +161 -0
- package/dist/ui/overlays/ModelPicker.d.ts +26 -0
- package/dist/ui/overlays/ModelPicker.js +63 -0
- package/dist/ui/overlays/ModelProfileEditor.d.ts +29 -0
- package/dist/ui/overlays/ModelProfileEditor.js +168 -0
- package/dist/ui/overlays/ModelProfilePicker.d.ts +48 -0
- package/dist/ui/overlays/ModelProfilePicker.js +231 -0
- package/dist/ui/overlays/PlanReviewOverlay.d.ts +51 -0
- package/dist/ui/overlays/PlanReviewOverlay.js +132 -0
- package/dist/ui/overlays/PromptEditorPage.d.ts +48 -0
- package/dist/ui/overlays/PromptEditorPage.js +227 -0
- package/dist/ui/overlays/PromptLibraryOverlay.d.ts +37 -0
- package/dist/ui/overlays/PromptLibraryOverlay.js +191 -0
- package/dist/ui/overlays/PromptPicker.d.ts +36 -0
- package/dist/ui/overlays/PromptPicker.js +129 -0
- package/dist/ui/overlays/PromptTextArea.d.ts +86 -0
- package/dist/ui/overlays/PromptTextArea.js +141 -0
- package/dist/ui/overlays/QuestionOverlay.d.ts +39 -0
- package/dist/ui/overlays/QuestionOverlay.js +258 -0
- package/dist/ui/overlays/QueueOverlay.d.ts +22 -0
- package/dist/ui/overlays/QueueOverlay.js +79 -0
- package/dist/ui/overlays/SettingsScreen.d.ts +228 -0
- package/dist/ui/overlays/SettingsScreen.js +1037 -0
- package/dist/ui/overlays/ShortcutPanel.d.ts +39 -0
- package/dist/ui/overlays/ShortcutPanel.js +106 -0
- package/dist/ui/overlays/TeamFanoutPage.d.ts +51 -0
- package/dist/ui/overlays/TeamFanoutPage.js +90 -0
- package/dist/ui/overlays/governance-settings.d.ts +79 -0
- package/dist/ui/overlays/governance-settings.js +140 -0
- package/dist/ui/overlays/kit-picker-state.d.ts +87 -0
- package/dist/ui/overlays/kit-picker-state.js +136 -0
- package/dist/ui/overlays/kit-settings-state.d.ts +129 -0
- package/dist/ui/overlays/kit-settings-state.js +268 -0
- package/dist/ui/overlays/model-probe-view.d.ts +128 -0
- package/dist/ui/overlays/model-probe-view.js +225 -0
- package/dist/ui/overlays/model-profile-state.d.ts +177 -0
- package/dist/ui/overlays/model-profile-state.js +301 -0
- package/dist/ui/overlays/prompt-library-state.d.ts +162 -0
- package/dist/ui/overlays/prompt-library-state.js +335 -0
- package/dist/ui/overlays/prompt-picker-state.d.ts +71 -0
- package/dist/ui/overlays/prompt-picker-state.js +98 -0
- package/dist/ui/overlays/team-fanout-state.d.ts +106 -0
- package/dist/ui/overlays/team-fanout-state.js +155 -0
- package/dist/ui/overlays/use-model-probe.d.ts +30 -0
- package/dist/ui/overlays/use-model-probe.js +109 -0
- package/dist/ui/palettes.d.ts +112 -0
- package/dist/ui/palettes.js +130 -0
- package/dist/ui/paste-frames.d.ts +91 -0
- package/dist/ui/paste-frames.js +117 -0
- package/dist/ui/paste-tokens.d.ts +90 -0
- package/dist/ui/paste-tokens.js +147 -0
- package/dist/ui/render-cache.d.ts +81 -0
- package/dist/ui/render-cache.js +196 -0
- package/dist/ui/render-governor.d.ts +54 -0
- package/dist/ui/render-governor.js +78 -0
- package/dist/ui/run-metrics.d.ts +23 -0
- package/dist/ui/run-metrics.js +27 -0
- package/dist/ui/run-status-row.d.ts +63 -0
- package/dist/ui/run-status-row.js +54 -0
- package/dist/ui/screen.d.ts +107 -0
- package/dist/ui/screen.js +234 -0
- package/dist/ui/scrollback/LiveTail.d.ts +115 -0
- package/dist/ui/scrollback/LiveTail.js +48 -0
- package/dist/ui/scrollback/band.d.ts +114 -0
- package/dist/ui/scrollback/band.js +143 -0
- package/dist/ui/scrollback/budget.d.ts +90 -0
- package/dist/ui/scrollback/budget.js +100 -0
- package/dist/ui/scrollback/canvas.d.ts +100 -0
- package/dist/ui/scrollback/canvas.js +114 -0
- package/dist/ui/scrollback/cursor-probe.d.ts +71 -0
- package/dist/ui/scrollback/cursor-probe.js +133 -0
- package/dist/ui/scrollback/drain.d.ts +32 -0
- package/dist/ui/scrollback/drain.js +64 -0
- package/dist/ui/scrollback/exit-summary.d.ts +23 -0
- package/dist/ui/scrollback/exit-summary.js +25 -0
- package/dist/ui/scrollback/limits.d.ts +98 -0
- package/dist/ui/scrollback/limits.js +98 -0
- package/dist/ui/scrollback/live-preview.d.ts +34 -0
- package/dist/ui/scrollback/live-preview.js +130 -0
- package/dist/ui/scrollback/overflow-print.d.ts +108 -0
- package/dist/ui/scrollback/overflow-print.js +120 -0
- package/dist/ui/scrollback/renderer.d.ts +48 -0
- package/dist/ui/scrollback/renderer.js +186 -0
- package/dist/ui/scrollback/scrollback-writer.d.ts +174 -0
- package/dist/ui/scrollback/scrollback-writer.js +648 -0
- package/dist/ui/scrollback/settled-boundary.d.ts +42 -0
- package/dist/ui/scrollback/settled-boundary.js +109 -0
- package/dist/ui/scrollback/tail-anchor.d.ts +71 -0
- package/dist/ui/scrollback/tail-anchor.js +79 -0
- package/dist/ui/scrollback/tail-window.d.ts +73 -0
- package/dist/ui/scrollback/tail-window.js +89 -0
- package/dist/ui/scrollback/use-scrollback-view.d.ts +139 -0
- package/dist/ui/scrollback/use-scrollback-view.js +601 -0
- package/dist/ui/scrollback/writer-shapes.d.ts +127 -0
- package/dist/ui/scrollback/writer-shapes.js +159 -0
- package/dist/ui/scrollbar-controller.d.ts +30 -0
- package/dist/ui/scrollbar-controller.js +124 -0
- package/dist/ui/selection/highlight.d.ts +39 -0
- package/dist/ui/selection/highlight.js +64 -0
- package/dist/ui/selection/screen-mirror.d.ts +24 -0
- package/dist/ui/selection/screen-mirror.js +35 -0
- package/dist/ui/selection/selection-controller.d.ts +104 -0
- package/dist/ui/selection/selection-controller.js +372 -0
- package/dist/ui/selection/selection.d.ts +90 -0
- package/dist/ui/selection/selection.js +223 -0
- package/dist/ui/shortcuts.d.ts +81 -0
- package/dist/ui/shortcuts.js +221 -0
- package/dist/ui/status-feedback.d.ts +35 -0
- package/dist/ui/status-feedback.js +38 -0
- package/dist/ui/stdout-frame-writer.d.ts +74 -0
- package/dist/ui/stdout-frame-writer.js +155 -0
- package/dist/ui/team-status.d.ts +166 -0
- package/dist/ui/team-status.js +252 -0
- package/dist/ui/terminal-plan.d.ts +52 -0
- package/dist/ui/terminal-plan.js +49 -0
- package/dist/ui/theme.d.ts +96 -0
- package/dist/ui/theme.js +130 -0
- package/dist/ui/transcript-text.d.ts +41 -0
- package/dist/ui/transcript-text.js +282 -0
- package/dist/ui/use-height-store.d.ts +31 -0
- package/dist/ui/use-height-store.js +76 -0
- package/dist/ui/use-render-governor.d.ts +39 -0
- package/dist/ui/use-render-governor.js +57 -0
- package/dist/ui/use-wheel-routing.d.ts +57 -0
- package/dist/ui/use-wheel-routing.js +152 -0
- package/dist/ui/win-vt-force.d.ts +136 -0
- package/dist/ui/win-vt-force.js +237 -0
- package/dist/ui/win-vt-input.d.ts +57 -0
- package/dist/ui/win-vt-input.js +62 -0
- package/package.json +86 -4
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw child-process output to terminal-safe rows (agent-activity-presentation-live
|
|
3
|
+
* L2 / §3.2).
|
|
4
|
+
*
|
|
5
|
+
* NOTHING ELSE IN THIS TREE STRIPS ANSI (E-13). `renderBash` hands each line to
|
|
6
|
+
* `<Text>` unmodified (`ui/entries/ToolPreview.tsx:180`), and that survives only
|
|
7
|
+
* because the settled preview is printed ONCE, after the command has stopped
|
|
8
|
+
* writing. Redraw the same text every frame while the child is still emitting
|
|
9
|
+
* `\r`-rewritten progress bars and `\x1b[A` cursor moves and it stops being
|
|
10
|
+
* survivable: the terminal honours cursor motion Ink does not know it emitted,
|
|
11
|
+
* and `wrappedRows` measures escape bytes as if they were columns.
|
|
12
|
+
*
|
|
13
|
+
* So this module is the boundary. It runs ONCE, inside the store's `append`
|
|
14
|
+
* (§3.1.1), and every reader downstream is already safe.
|
|
15
|
+
*
|
|
16
|
+
* Pure, ASCII-only, React-free, Ink-free, and TOTAL: `sanitizeChunk` never
|
|
17
|
+
* throws, for any input including lone surrogates, NUL bytes, a chunk consisting
|
|
18
|
+
* solely of `\x1b`, and a 4 MB chunk containing no `\n` at all.
|
|
19
|
+
*
|
|
20
|
+
* D-27 — IT STRIPS, IT DOES NOT INTERPRET. Keeping colour would mean validating
|
|
21
|
+
* it (an unterminated SGR leaks its attribute into the rest of the frame), and
|
|
22
|
+
* interpreting cursor motion would mean owning a screen buffer. Neither is a
|
|
23
|
+
* presentation round's job.
|
|
24
|
+
*/
|
|
25
|
+
import { stripControlSequences } from '../../input/control-sequences.js';
|
|
26
|
+
/** Columns a live row may occupy before it is clipped. */
|
|
27
|
+
export const LIVE_ROW_MAX_CHARS = 200;
|
|
28
|
+
/** Tab stop width, matching every terminal's default. */
|
|
29
|
+
export const TAB_WIDTH = 8;
|
|
30
|
+
/**
|
|
31
|
+
* The in-progress line's ceiling before it is flushed as a row (§3.2 step 7).
|
|
32
|
+
*
|
|
33
|
+
* AFTER STEP 4 THIS IS A RARE PATH RATHER THAN THE PROGRESS-BAR PATH (D-33). A
|
|
34
|
+
* `\r`-rewritten bar collapses to one row however many times it is redrawn, so
|
|
35
|
+
* reaching 400 characters with no `\n` requires a line that is genuinely that
|
|
36
|
+
* long -- `cat` on a minified bundle. Without the bound the carry is an
|
|
37
|
+
* unbounded accumulator.
|
|
38
|
+
*/
|
|
39
|
+
export const CARRY_MAX_CHARS = LIVE_ROW_MAX_CHARS * 2;
|
|
40
|
+
/**
|
|
41
|
+
* Appended to a row clipped at `LIVE_ROW_MAX_CHARS`.
|
|
42
|
+
*
|
|
43
|
+
* SPELLED HERE RATHER THAN IMPORTED from `agent/reducer.ts`, the rule
|
|
44
|
+
* `patch.ts:95-103` already states for the identical string: `tools/` keeps no
|
|
45
|
+
* runtime dependency on the view model for three characters, and
|
|
46
|
+
* `terminal-output.test.ts` asserts the spellings are equal so the pair cannot
|
|
47
|
+
* drift silently.
|
|
48
|
+
*/
|
|
49
|
+
export const TRUNCATION_MARK = '...';
|
|
50
|
+
/**
|
|
51
|
+
* How far back a trailing incomplete escape may start.
|
|
52
|
+
*
|
|
53
|
+
* A chunk can split mid-escape, and the next chunk completes it -- so the tail
|
|
54
|
+
* of an unfinished sequence must survive in the carry rather than being stripped
|
|
55
|
+
* down to its visible remainder (`\x1b[` would otherwise render as a bare `[`).
|
|
56
|
+
* The lookback is bounded because an "escape" that has run for 64 characters
|
|
57
|
+
* without a final byte is not an escape, it is a byte that happened to be 0x1b,
|
|
58
|
+
* and holding it forever would pin the carry.
|
|
59
|
+
*/
|
|
60
|
+
const MAX_PARTIAL_ESCAPE = 64;
|
|
61
|
+
/** C1, plus every C0 control except `\t` `\n` `\r`. */
|
|
62
|
+
const CONTROLS = /[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/g;
|
|
63
|
+
/**
|
|
64
|
+
* Remove every escape sequence and control byte except `\t` `\n` `\r`.
|
|
65
|
+
*
|
|
66
|
+
* SEQUENCE SYNTAX HAS ONE OWNER (`input/control-sequences.ts`); this function
|
|
67
|
+
* adds only the control-byte sweep a DISPLAY row wants. Both call sites in this
|
|
68
|
+
* module already cut an unfinished escape off into the carry before calling it
|
|
69
|
+
* (`partialEscapeStart`), so the shared one-shot rule for a truncated sequence
|
|
70
|
+
* is exactly what they need -- and it fixes AC-24's failure in place: the old
|
|
71
|
+
* two-byte rule consumed the `\x1b[` of an unfinished CSI and left the
|
|
72
|
+
* PARAMETERS behind, so `\x1b[31m` split across chunks rendered as `red 3`.
|
|
73
|
+
*
|
|
74
|
+
* Exported for the tests, and used by `toDisplayRow` as the second line of
|
|
75
|
+
* defence over a carry that ends mid-escape.
|
|
76
|
+
*/
|
|
77
|
+
export function stripAnsi(text) {
|
|
78
|
+
return stripControlSequences(text).replace(CONTROLS, '');
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Index at which a trailing INCOMPLETE escape begins, or `-1`.
|
|
82
|
+
*
|
|
83
|
+
* Only the last `\x1b` can be incomplete: anything before it is either a
|
|
84
|
+
* complete sequence (the regexes above consume it) or a stray byte the control
|
|
85
|
+
* strip removes.
|
|
86
|
+
*/
|
|
87
|
+
function partialEscapeStart(text) {
|
|
88
|
+
const at = text.lastIndexOf('\x1b');
|
|
89
|
+
if (at === -1 || text.length - at > MAX_PARTIAL_ESCAPE)
|
|
90
|
+
return -1;
|
|
91
|
+
const rest = text.slice(at);
|
|
92
|
+
// A lone ESC at the very end: the next chunk decides what it is.
|
|
93
|
+
if (rest.length === 1)
|
|
94
|
+
return at;
|
|
95
|
+
// An opened CSI/OSC is incomplete exactly when its own regex does not match
|
|
96
|
+
// from here -- `\x1b[1;3` has no final byte yet, `\x1b]0;title` no terminator.
|
|
97
|
+
if (rest[1] === '[')
|
|
98
|
+
return /^\x1b\[[0-?]*[ -/]*[@-~]/.test(rest) ? -1 : at;
|
|
99
|
+
if (rest[1] === ']')
|
|
100
|
+
return /^\x1b\][\s\S]*?(?:\x07|\x1b\\)/.test(rest) ? -1 : at;
|
|
101
|
+
// Any other two-byte form is already complete.
|
|
102
|
+
return -1;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Apply `\r` as the LINE REWRITE it is (§3.2 step 4 / D-33).
|
|
106
|
+
*
|
|
107
|
+
* A piece containing `\r` is a sequence of overwrites, so the later segment
|
|
108
|
+
* replaces the earlier one's PREFIX and anything the earlier one had beyond it
|
|
109
|
+
* survives -- which is what a real terminal shows, and what keeps R-6's classic
|
|
110
|
+
* `\r`-only tooling from losing content. A thousand progress-bar rewrites
|
|
111
|
+
* collapse to one row holding the final state.
|
|
112
|
+
*/
|
|
113
|
+
export function applyCarriageReturns(piece) {
|
|
114
|
+
if (piece.indexOf('\r') === -1)
|
|
115
|
+
return piece;
|
|
116
|
+
return piece.split('\r').reduce((acc, s) => s + acc.slice(s.length), '');
|
|
117
|
+
}
|
|
118
|
+
/** Expand tabs to the next multiple of `TAB_WIDTH`. */
|
|
119
|
+
export function expandTabs(row) {
|
|
120
|
+
if (row.indexOf('\t') === -1)
|
|
121
|
+
return row;
|
|
122
|
+
let out = '';
|
|
123
|
+
for (let i = 0; i < row.length; i += 1) {
|
|
124
|
+
const ch = row[i];
|
|
125
|
+
if (ch === '\t')
|
|
126
|
+
out += ' '.repeat(TAB_WIDTH - (out.length % TAB_WIDTH));
|
|
127
|
+
else
|
|
128
|
+
out += ch;
|
|
129
|
+
}
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
132
|
+
/** Clip a row at `LIVE_ROW_MAX_CHARS`, marking the cut. */
|
|
133
|
+
export function clipRow(row) {
|
|
134
|
+
return row.length <= LIVE_ROW_MAX_CHARS
|
|
135
|
+
? row
|
|
136
|
+
: `${row.slice(0, LIVE_ROW_MAX_CHARS)}${TRUNCATION_MARK}`;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* The carry as a RENDERED row: the held-back incomplete escape removed, then
|
|
140
|
+
* stripped and clipped.
|
|
141
|
+
*
|
|
142
|
+
* THE PARTIAL MUST BE CUT OFF, NOT STRIPPED (AC-24). `stripAnsi` alone is not
|
|
143
|
+
* enough and fails in the visible direction: its two-byte rule consumes the
|
|
144
|
+
* `\x1b[` of an unfinished CSI and leaves the PARAMETERS behind, so a chunk that
|
|
145
|
+
* split inside `\x1b[31m` renders as `red 3`. The bytes are held for the next
|
|
146
|
+
* chunk to complete; until then they are not text.
|
|
147
|
+
*/
|
|
148
|
+
export function toDisplayRow(carry) {
|
|
149
|
+
const at = partialEscapeStart(carry);
|
|
150
|
+
return clipRow(stripAnsi(at === -1 ? carry : carry.slice(0, at)));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Tab expansion is column arithmetic, so it cannot be done after the clip -- but
|
|
154
|
+
* it also need not run over four megabytes to decide the first 200 columns.
|
|
155
|
+
* Every character occupies at least one column, so a `CARRY_MAX_CHARS` prefix
|
|
156
|
+
* covers every column the clip can keep.
|
|
157
|
+
*/
|
|
158
|
+
function expandTabsForDisplay(piece) {
|
|
159
|
+
return piece.length <= CARRY_MAX_CHARS
|
|
160
|
+
? expandTabs(piece)
|
|
161
|
+
: expandTabs(piece.slice(0, CARRY_MAX_CHARS));
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Turn a raw chunk into complete rows plus the in-progress line.
|
|
165
|
+
*
|
|
166
|
+
* The order of the steps IS the specification (§3.2), and step 4's "every piece,
|
|
167
|
+
* THE INCOMPLETE TAIL INCLUDED" is the whole of P0-1: a progress bar emits no
|
|
168
|
+
* `\n` for its entire run, so a rule that collapsed only completed lines would
|
|
169
|
+
* never run for npm, pip, curl, docker or any other `\r` writer -- the tail
|
|
170
|
+
* would stay empty, `showLive` false, and the card the single `running` row this
|
|
171
|
+
* round exists to replace.
|
|
172
|
+
*/
|
|
173
|
+
export function sanitizeChunk(carry, chunk) {
|
|
174
|
+
const text = (typeof carry === 'string' ? carry : '') + (typeof chunk === 'string' ? chunk : '');
|
|
175
|
+
if (text.length === 0)
|
|
176
|
+
return { rows: [], carry: '' };
|
|
177
|
+
// 1-2. Concatenate and strip, holding back an escape the next chunk finishes.
|
|
178
|
+
const partialAt = partialEscapeStart(text);
|
|
179
|
+
const held = partialAt === -1 ? '' : text.slice(partialAt);
|
|
180
|
+
const clean = stripAnsi(partialAt === -1 ? text : text.slice(0, partialAt));
|
|
181
|
+
// 3. Split: the first n-1 pieces are complete rows, the last is the tail.
|
|
182
|
+
const pieces = clean.split('\n');
|
|
183
|
+
const rows = [];
|
|
184
|
+
for (let i = 0; i < pieces.length - 1; i += 1) {
|
|
185
|
+
// 4-6. Collapse, expand, clip.
|
|
186
|
+
rows.push(clipRow(expandTabsForDisplay(applyCarriageReturns(pieces[i]))));
|
|
187
|
+
}
|
|
188
|
+
const rawTail = applyCarriageReturns(pieces[pieces.length - 1]);
|
|
189
|
+
const tail = expandTabsForDisplay(rawTail);
|
|
190
|
+
// 7. Bound the carry. The held escape survives the flush: it belongs to the
|
|
191
|
+
// NEXT row, and dropping it here would corrupt the sequence it opened.
|
|
192
|
+
//
|
|
193
|
+
// BOTH LENGTHS ARE TESTED, and testing only the expanded one is the bug:
|
|
194
|
+
// `expandTabsForDisplay` truncates its input at `CARRY_MAX_CHARS`, so a
|
|
195
|
+
// megabyte-long line would sit at exactly the bound forever and never flush.
|
|
196
|
+
if (rawTail.length > CARRY_MAX_CHARS || tail.length > CARRY_MAX_CHARS) {
|
|
197
|
+
rows.push(clipRow(tail));
|
|
198
|
+
return { rows, carry: held };
|
|
199
|
+
}
|
|
200
|
+
return { rows, carry: tail + held };
|
|
201
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The CLI-local side channel a running tool's output travels on
|
|
3
|
+
* (agent-activity-presentation-live L1 / §3.1.1).
|
|
4
|
+
*
|
|
5
|
+
* It mirrors `file-change-store.ts` in shape and in its documented reasoning,
|
|
6
|
+
* with ONE deliberate difference: it is PEEK-AND-CLEAR, not take-once, because a
|
|
7
|
+
* running command is read many times and consumed once.
|
|
8
|
+
*
|
|
9
|
+
* Four properties, each load-bearing, each with the failure it prevents:
|
|
10
|
+
*
|
|
11
|
+
* - **Owner-scoped.** The key is `${owner}:${toolCallId}`, for D-13's reason
|
|
12
|
+
* unchanged: only `'lead'` is written this round, but subagents build their
|
|
13
|
+
* tools from the same factory, and a child's tool-call id must never be able
|
|
14
|
+
* to paint a lead's card.
|
|
15
|
+
* - **Sanitised on write.** `append` calls `sanitizeChunk` BEFORE storing, so
|
|
16
|
+
* the store's contract is "terminal-safe rows" and no consumer can forget.
|
|
17
|
+
* - **Bounded twice.** `LIVE_TAIL_ROWS` per call and `TOOL_OUTPUT_STORE_CAP`
|
|
18
|
+
* calls. A command emitting 400 MB to stdout costs a fixed number of retained
|
|
19
|
+
* rows: the per-call bound is what makes the DISPLAY bounded, the cap is what
|
|
20
|
+
* makes a session that never settles a call bounded.
|
|
21
|
+
* - **Cleared at settle, not at read.** The authoritative result arrives with
|
|
22
|
+
* `tool_execution_end`; from that instant the tail is superseded and must be
|
|
23
|
+
* released. Clearing there keeps the store's size a function of CONCURRENT
|
|
24
|
+
* calls rather than of total calls.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* ROWS retained per tool call.
|
|
28
|
+
*
|
|
29
|
+
* THIS AND THE CAP BELOW ARE DELIBERATELY DIFFERENT NUMBERS (P2-8). They bound
|
|
30
|
+
* unrelated things -- rows inside one call, and calls inside one session -- and
|
|
31
|
+
* a shared literal is how a later edit collapses two bounds into one.
|
|
32
|
+
*/
|
|
33
|
+
export declare const LIVE_TAIL_ROWS = 8;
|
|
34
|
+
/** CONCURRENT CALLS retained before the oldest is evicted. */
|
|
35
|
+
export declare const TOOL_OUTPUT_STORE_CAP = 16;
|
|
36
|
+
/**
|
|
37
|
+
* Silence after which the card stops claiming progress and says so (§3.3.4).
|
|
38
|
+
*
|
|
39
|
+
* It lives here rather than in `ToolCard` because it is the STORE's notion of
|
|
40
|
+
* "quiet": the card reads it so there is no second copy to drift.
|
|
41
|
+
*/
|
|
42
|
+
export declare const STALL_AFTER_MS = 10000;
|
|
43
|
+
export interface ToolOutputStore {
|
|
44
|
+
/**
|
|
45
|
+
* Append a raw chunk. Sanitises (§3.2), then returns the display tail: the
|
|
46
|
+
* last `LIVE_TAIL_ROWS` of `[...completedRows, carry]`, `carry` last and
|
|
47
|
+
* included only when non-empty.
|
|
48
|
+
*/
|
|
49
|
+
append(owner: string, toolCallId: string, chunk: string): readonly string[];
|
|
50
|
+
/** Current tail, or `undefined`. Does NOT remove. Test-facing (P2-2). */
|
|
51
|
+
peek(owner: string, toolCallId: string): readonly string[] | undefined;
|
|
52
|
+
/** Drop the entry -- called at `tool_execution_end`. */
|
|
53
|
+
clear(owner: string, toolCallId: string): void;
|
|
54
|
+
size(): number;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* What the controller's fourth CLI-local emitter carries (§3.1.3).
|
|
58
|
+
*
|
|
59
|
+
* `rows` IS THE WHOLE TAIL, not an increment, and that is what lets
|
|
60
|
+
* `mergeDeltas` keep only the last one per `toolCallId` (D-30). It is frozen, so
|
|
61
|
+
* a listener cannot mutate the array a later listener will see.
|
|
62
|
+
*/
|
|
63
|
+
export interface ToolOutputEvent {
|
|
64
|
+
toolCallId: string;
|
|
65
|
+
rows: readonly string[];
|
|
66
|
+
}
|
|
67
|
+
export type ToolOutputListener = (event: ToolOutputEvent) => void;
|
|
68
|
+
export declare function createToolOutputStore(cap?: number): ToolOutputStore;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The CLI-local side channel a running tool's output travels on
|
|
3
|
+
* (agent-activity-presentation-live L1 / §3.1.1).
|
|
4
|
+
*
|
|
5
|
+
* It mirrors `file-change-store.ts` in shape and in its documented reasoning,
|
|
6
|
+
* with ONE deliberate difference: it is PEEK-AND-CLEAR, not take-once, because a
|
|
7
|
+
* running command is read many times and consumed once.
|
|
8
|
+
*
|
|
9
|
+
* Four properties, each load-bearing, each with the failure it prevents:
|
|
10
|
+
*
|
|
11
|
+
* - **Owner-scoped.** The key is `${owner}:${toolCallId}`, for D-13's reason
|
|
12
|
+
* unchanged: only `'lead'` is written this round, but subagents build their
|
|
13
|
+
* tools from the same factory, and a child's tool-call id must never be able
|
|
14
|
+
* to paint a lead's card.
|
|
15
|
+
* - **Sanitised on write.** `append` calls `sanitizeChunk` BEFORE storing, so
|
|
16
|
+
* the store's contract is "terminal-safe rows" and no consumer can forget.
|
|
17
|
+
* - **Bounded twice.** `LIVE_TAIL_ROWS` per call and `TOOL_OUTPUT_STORE_CAP`
|
|
18
|
+
* calls. A command emitting 400 MB to stdout costs a fixed number of retained
|
|
19
|
+
* rows: the per-call bound is what makes the DISPLAY bounded, the cap is what
|
|
20
|
+
* makes a session that never settles a call bounded.
|
|
21
|
+
* - **Cleared at settle, not at read.** The authoritative result arrives with
|
|
22
|
+
* `tool_execution_end`; from that instant the tail is superseded and must be
|
|
23
|
+
* released. Clearing there keeps the store's size a function of CONCURRENT
|
|
24
|
+
* calls rather than of total calls.
|
|
25
|
+
*/
|
|
26
|
+
import { sanitizeChunk, toDisplayRow } from './terminal-output.js';
|
|
27
|
+
/**
|
|
28
|
+
* ROWS retained per tool call.
|
|
29
|
+
*
|
|
30
|
+
* THIS AND THE CAP BELOW ARE DELIBERATELY DIFFERENT NUMBERS (P2-8). They bound
|
|
31
|
+
* unrelated things -- rows inside one call, and calls inside one session -- and
|
|
32
|
+
* a shared literal is how a later edit collapses two bounds into one.
|
|
33
|
+
*/
|
|
34
|
+
export const LIVE_TAIL_ROWS = 8;
|
|
35
|
+
/** CONCURRENT CALLS retained before the oldest is evicted. */
|
|
36
|
+
export const TOOL_OUTPUT_STORE_CAP = 16;
|
|
37
|
+
/**
|
|
38
|
+
* Silence after which the card stops claiming progress and says so (§3.3.4).
|
|
39
|
+
*
|
|
40
|
+
* It lives here rather than in `ToolCard` because it is the STORE's notion of
|
|
41
|
+
* "quiet": the card reads it so there is no second copy to drift.
|
|
42
|
+
*/
|
|
43
|
+
export const STALL_AFTER_MS = 10_000;
|
|
44
|
+
const EMPTY = Object.freeze([]);
|
|
45
|
+
export function createToolOutputStore(cap = TOOL_OUTPUT_STORE_CAP) {
|
|
46
|
+
// A `Map` iterates in insertion order, so the first key IS the oldest.
|
|
47
|
+
const entries = new Map();
|
|
48
|
+
const limit = Math.max(1, Math.floor(cap));
|
|
49
|
+
const keyOf = (owner, toolCallId) => `${owner}:${toolCallId}`;
|
|
50
|
+
/**
|
|
51
|
+
* The tail a consumer sees.
|
|
52
|
+
*
|
|
53
|
+
* THE IN-PROGRESS LINE IS PART OF IT, and that is the display half of P0-1: a
|
|
54
|
+
* command whose output is one continuously-rewritten line -- every progress
|
|
55
|
+
* bar there is -- has NO completed rows until it exits, and a tail built from
|
|
56
|
+
* completed rows alone would be empty for its entire run.
|
|
57
|
+
*/
|
|
58
|
+
const tailOf = (slot) => {
|
|
59
|
+
const live = toDisplayRow(slot.carry);
|
|
60
|
+
const rows = live.length > 0 ? [...slot.rows, live] : [...slot.rows];
|
|
61
|
+
return Object.freeze(rows.length > LIVE_TAIL_ROWS ? rows.slice(-LIVE_TAIL_ROWS) : rows);
|
|
62
|
+
};
|
|
63
|
+
return {
|
|
64
|
+
append(owner, toolCallId, chunk) {
|
|
65
|
+
const key = keyOf(owner, toolCallId);
|
|
66
|
+
const slot = entries.get(key) ?? { rows: [], carry: '' };
|
|
67
|
+
// Delete first so an append moves the key to the END of the ring rather
|
|
68
|
+
// than leaving it at its original age: the cap must evict the least
|
|
69
|
+
// recently WRITTEN call, not the one that started first.
|
|
70
|
+
entries.delete(key);
|
|
71
|
+
entries.set(key, slot);
|
|
72
|
+
const { rows, carry } = sanitizeChunk(slot.carry, chunk);
|
|
73
|
+
if (rows.length > 0) {
|
|
74
|
+
slot.rows.push(...rows);
|
|
75
|
+
if (slot.rows.length > LIVE_TAIL_ROWS) {
|
|
76
|
+
slot.rows.splice(0, slot.rows.length - LIVE_TAIL_ROWS);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
slot.carry = carry;
|
|
80
|
+
while (entries.size > limit) {
|
|
81
|
+
const oldest = entries.keys().next();
|
|
82
|
+
if (oldest.done)
|
|
83
|
+
break;
|
|
84
|
+
entries.delete(oldest.value);
|
|
85
|
+
}
|
|
86
|
+
return tailOf(slot);
|
|
87
|
+
},
|
|
88
|
+
peek(owner, toolCallId) {
|
|
89
|
+
const slot = entries.get(keyOf(owner, toolCallId));
|
|
90
|
+
if (!slot)
|
|
91
|
+
return undefined;
|
|
92
|
+
const tail = tailOf(slot);
|
|
93
|
+
return tail.length > 0 ? tail : EMPTY;
|
|
94
|
+
},
|
|
95
|
+
clear(owner, toolCallId) {
|
|
96
|
+
entries.delete(keyOf(owner, toolCallId));
|
|
97
|
+
},
|
|
98
|
+
size() {
|
|
99
|
+
return entries.size;
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UPDATE_LIMITS - the single authority on every structural bound the updater
|
|
3
|
+
* enforces (cli-auto-update section 5.4).
|
|
4
|
+
*
|
|
5
|
+
* ASCII ONLY: `src/update/**` is inside the glyph scanner's scope
|
|
6
|
+
* (`glyphs.test.ts`), so no literal in this tree may hold a non-ASCII byte. The
|
|
7
|
+
* regex there is a hardcoded directory list, which is why adding this tree and
|
|
8
|
+
* adding `update` to that list are the SAME change (C-2 / AC-18) - a scanner
|
|
9
|
+
* that silently stops scanning is worse than no scanner.
|
|
10
|
+
*
|
|
11
|
+
* TWO KINDS OF NUMBER, AND THEY ARE NOT INTERCHANGEABLE - the distinction
|
|
12
|
+
* `TEAM_LIMITS`, `TODO_LIMITS` and `FAST_LIMITS` all state:
|
|
13
|
+
*
|
|
14
|
+
* - The entries below are STRUCTURAL. They describe what a background check, a
|
|
15
|
+
* detached install and a one-row readout can physically carry. A user has no
|
|
16
|
+
* business tuning them.
|
|
17
|
+
* - The four `update.*` keys in `config/schema.ts` are POLICY: whether to
|
|
18
|
+
* install at all, how often to ask, which registry, which dist-tag. Those are
|
|
19
|
+
* clamped, persisted and user-facing.
|
|
20
|
+
*
|
|
21
|
+
* NOTHING HERE IS IMPORTED AT RUNTIME BY `cli.tsx` (AC-1). This module and
|
|
22
|
+
* `types.ts` are pure, dependency-free and side-effect-free; every other module
|
|
23
|
+
* in this tree is reached only through the dynamic `import()` in section 3.8.
|
|
24
|
+
*/
|
|
25
|
+
export declare const UPDATE_LIMITS: {
|
|
26
|
+
/** Never contend with first paint. */
|
|
27
|
+
readonly startupDelayMs: 3000;
|
|
28
|
+
/**
|
|
29
|
+
* A background check has nobody waiting on it.
|
|
30
|
+
*
|
|
31
|
+
* Below `fetch-source.ts`'s `HTTP_TIMEOUT_MS` (15 s) ON PURPOSE: that one
|
|
32
|
+
* bounds a download a human typed a command for, this one bounds a request the
|
|
33
|
+
* user never asked for and must never notice.
|
|
34
|
+
*/
|
|
35
|
+
readonly checkTimeoutMs: 8000;
|
|
36
|
+
/**
|
|
37
|
+
* Wall-clock budget for the `installing` PHASE and the lock's staleness
|
|
38
|
+
* refresh - NEVER FOR THE CHILD (U-5 / P1-5).
|
|
39
|
+
*
|
|
40
|
+
* It decides when the UI stops saying "updating" and when a lock is treated as
|
|
41
|
+
* abandoned. It is deliberately NOT `execFile`'s `timeout`, which stays `0`:
|
|
42
|
+
* wiring it there makes Node `SIGTERM` npm mid-write - the broken global
|
|
43
|
+
* installation U-3 and D-10 exist to prevent - and it would fire on exactly
|
|
44
|
+
* the slow links where a five-minute install is the correct outcome.
|
|
45
|
+
*/
|
|
46
|
+
readonly installTimeoutMs: 300000;
|
|
47
|
+
/** The `/latest` document is ~2 KB; this is the C-8 ceiling, not a target. */
|
|
48
|
+
readonly manifestMaxBytes: number;
|
|
49
|
+
/** Matches `fetch-source.ts`'s `MAX_REDIRECTS`. */
|
|
50
|
+
readonly maxRedirects: 3;
|
|
51
|
+
/**
|
|
52
|
+
* Longer than `skills`' 60 s, and the difference is the point: the holder here
|
|
53
|
+
* is an npm install on a cold cache, not a file rename.
|
|
54
|
+
*/
|
|
55
|
+
readonly lockTtlMs: 600000;
|
|
56
|
+
/** First retry after a failed check or install. */
|
|
57
|
+
readonly backoffBaseMs: 1800000;
|
|
58
|
+
/** Ceiling of the exponential. */
|
|
59
|
+
readonly backoffMaxMs: 86400000;
|
|
60
|
+
/**
|
|
61
|
+
* Consecutive failures before the row says anything at all (D-7).
|
|
62
|
+
*
|
|
63
|
+
* Below this the failure is silent, because silence is the requirement and an
|
|
64
|
+
* unactionable recurring warning is the standard way updaters become hated.
|
|
65
|
+
*/
|
|
66
|
+
readonly failuresBeforeNotice: 3;
|
|
67
|
+
/** Thundering-herd spread on the check interval (D-12). */
|
|
68
|
+
readonly jitterRatio: 0.15;
|
|
69
|
+
/**
|
|
70
|
+
* Bounded, redacted npm error tail, read from the install LOG FILE (U-5).
|
|
71
|
+
*
|
|
72
|
+
* There is a tail to read at all only because the child writes to a real file
|
|
73
|
+
* descriptor rather than to `'ignore'`; a pipe would have died with the parent
|
|
74
|
+
* and broken D-10.
|
|
75
|
+
*/
|
|
76
|
+
readonly stderrTailChars: 500;
|
|
77
|
+
/**
|
|
78
|
+
* Below this many columns the update line renders its short form (section 6.2).
|
|
79
|
+
*
|
|
80
|
+
* DELIBERATELY NOT `FAST_LIMITS.statusCompactCols`' 100 (`fast/limits.ts`).
|
|
81
|
+
* That number governs a multi-part status chip competing with the context
|
|
82
|
+
* gauge for the same row; this one governs a single short clause that owns its
|
|
83
|
+
* row outright. Two numbers about two different things - do not unify them.
|
|
84
|
+
*/
|
|
85
|
+
readonly statusCompactCols: 60;
|
|
86
|
+
/**
|
|
87
|
+
* Non-zero exits of a version WE installed before it is rolled back
|
|
88
|
+
* (cli-auto-update-hardening section 7.2 / D-30).
|
|
89
|
+
*
|
|
90
|
+
* Tested against the count of PREVIOUS launches, so `2` means "the third
|
|
91
|
+
* launch rolls back". One crash can be transient - a machine that ran out of
|
|
92
|
+
* memory once, or whose session file was corrupt, gets a second chance at the
|
|
93
|
+
* release it just installed. Two is a pattern.
|
|
94
|
+
*
|
|
95
|
+
* NOTHING ELSE IN THIS TABLE BOUNDS THE ROLLBACK. There is deliberately no
|
|
96
|
+
* `bootGuardMaxAgeMs`: the guard is armed only while `autoInstalledVersion`
|
|
97
|
+
* equals the RUNNING version, so "a machine offline for a year" is a machine
|
|
98
|
+
* still running the version we installed, and rolling it back to
|
|
99
|
+
* `lastGoodVersion` is exactly as correct on day 400 as on day 1 (P1-3).
|
|
100
|
+
*/
|
|
101
|
+
readonly crashesBeforeRollback: 2;
|
|
102
|
+
/**
|
|
103
|
+
* Bound on the `npm view` fallback probe (H3).
|
|
104
|
+
*
|
|
105
|
+
* SAFE HERE AND FORBIDDEN FOR THE INSTALLER (C-20). A killed `npm view` has
|
|
106
|
+
* written nothing; a killed `npm install -g` leaves a broken global
|
|
107
|
+
* installation, which is why `installTimeoutMs` above bounds the PHASE and
|
|
108
|
+
* never the child.
|
|
109
|
+
*/
|
|
110
|
+
readonly npmViewTimeoutMs: 10000;
|
|
111
|
+
};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UPDATE_LIMITS - the single authority on every structural bound the updater
|
|
3
|
+
* enforces (cli-auto-update section 5.4).
|
|
4
|
+
*
|
|
5
|
+
* ASCII ONLY: `src/update/**` is inside the glyph scanner's scope
|
|
6
|
+
* (`glyphs.test.ts`), so no literal in this tree may hold a non-ASCII byte. The
|
|
7
|
+
* regex there is a hardcoded directory list, which is why adding this tree and
|
|
8
|
+
* adding `update` to that list are the SAME change (C-2 / AC-18) - a scanner
|
|
9
|
+
* that silently stops scanning is worse than no scanner.
|
|
10
|
+
*
|
|
11
|
+
* TWO KINDS OF NUMBER, AND THEY ARE NOT INTERCHANGEABLE - the distinction
|
|
12
|
+
* `TEAM_LIMITS`, `TODO_LIMITS` and `FAST_LIMITS` all state:
|
|
13
|
+
*
|
|
14
|
+
* - The entries below are STRUCTURAL. They describe what a background check, a
|
|
15
|
+
* detached install and a one-row readout can physically carry. A user has no
|
|
16
|
+
* business tuning them.
|
|
17
|
+
* - The four `update.*` keys in `config/schema.ts` are POLICY: whether to
|
|
18
|
+
* install at all, how often to ask, which registry, which dist-tag. Those are
|
|
19
|
+
* clamped, persisted and user-facing.
|
|
20
|
+
*
|
|
21
|
+
* NOTHING HERE IS IMPORTED AT RUNTIME BY `cli.tsx` (AC-1). This module and
|
|
22
|
+
* `types.ts` are pure, dependency-free and side-effect-free; every other module
|
|
23
|
+
* in this tree is reached only through the dynamic `import()` in section 3.8.
|
|
24
|
+
*/
|
|
25
|
+
export const UPDATE_LIMITS = {
|
|
26
|
+
/** Never contend with first paint. */
|
|
27
|
+
startupDelayMs: 3_000,
|
|
28
|
+
/**
|
|
29
|
+
* A background check has nobody waiting on it.
|
|
30
|
+
*
|
|
31
|
+
* Below `fetch-source.ts`'s `HTTP_TIMEOUT_MS` (15 s) ON PURPOSE: that one
|
|
32
|
+
* bounds a download a human typed a command for, this one bounds a request the
|
|
33
|
+
* user never asked for and must never notice.
|
|
34
|
+
*/
|
|
35
|
+
checkTimeoutMs: 8_000,
|
|
36
|
+
/**
|
|
37
|
+
* Wall-clock budget for the `installing` PHASE and the lock's staleness
|
|
38
|
+
* refresh - NEVER FOR THE CHILD (U-5 / P1-5).
|
|
39
|
+
*
|
|
40
|
+
* It decides when the UI stops saying "updating" and when a lock is treated as
|
|
41
|
+
* abandoned. It is deliberately NOT `execFile`'s `timeout`, which stays `0`:
|
|
42
|
+
* wiring it there makes Node `SIGTERM` npm mid-write - the broken global
|
|
43
|
+
* installation U-3 and D-10 exist to prevent - and it would fire on exactly
|
|
44
|
+
* the slow links where a five-minute install is the correct outcome.
|
|
45
|
+
*/
|
|
46
|
+
installTimeoutMs: 300_000,
|
|
47
|
+
/** The `/latest` document is ~2 KB; this is the C-8 ceiling, not a target. */
|
|
48
|
+
manifestMaxBytes: 256 * 1024,
|
|
49
|
+
/** Matches `fetch-source.ts`'s `MAX_REDIRECTS`. */
|
|
50
|
+
maxRedirects: 3,
|
|
51
|
+
/**
|
|
52
|
+
* Longer than `skills`' 60 s, and the difference is the point: the holder here
|
|
53
|
+
* is an npm install on a cold cache, not a file rename.
|
|
54
|
+
*/
|
|
55
|
+
lockTtlMs: 600_000,
|
|
56
|
+
/** First retry after a failed check or install. */
|
|
57
|
+
backoffBaseMs: 1_800_000,
|
|
58
|
+
/** Ceiling of the exponential. */
|
|
59
|
+
backoffMaxMs: 86_400_000,
|
|
60
|
+
/**
|
|
61
|
+
* Consecutive failures before the row says anything at all (D-7).
|
|
62
|
+
*
|
|
63
|
+
* Below this the failure is silent, because silence is the requirement and an
|
|
64
|
+
* unactionable recurring warning is the standard way updaters become hated.
|
|
65
|
+
*/
|
|
66
|
+
failuresBeforeNotice: 3,
|
|
67
|
+
/** Thundering-herd spread on the check interval (D-12). */
|
|
68
|
+
jitterRatio: 0.15,
|
|
69
|
+
/**
|
|
70
|
+
* Bounded, redacted npm error tail, read from the install LOG FILE (U-5).
|
|
71
|
+
*
|
|
72
|
+
* There is a tail to read at all only because the child writes to a real file
|
|
73
|
+
* descriptor rather than to `'ignore'`; a pipe would have died with the parent
|
|
74
|
+
* and broken D-10.
|
|
75
|
+
*/
|
|
76
|
+
stderrTailChars: 500,
|
|
77
|
+
/**
|
|
78
|
+
* Below this many columns the update line renders its short form (section 6.2).
|
|
79
|
+
*
|
|
80
|
+
* DELIBERATELY NOT `FAST_LIMITS.statusCompactCols`' 100 (`fast/limits.ts`).
|
|
81
|
+
* That number governs a multi-part status chip competing with the context
|
|
82
|
+
* gauge for the same row; this one governs a single short clause that owns its
|
|
83
|
+
* row outright. Two numbers about two different things - do not unify them.
|
|
84
|
+
*/
|
|
85
|
+
statusCompactCols: 60,
|
|
86
|
+
/**
|
|
87
|
+
* Non-zero exits of a version WE installed before it is rolled back
|
|
88
|
+
* (cli-auto-update-hardening section 7.2 / D-30).
|
|
89
|
+
*
|
|
90
|
+
* Tested against the count of PREVIOUS launches, so `2` means "the third
|
|
91
|
+
* launch rolls back". One crash can be transient - a machine that ran out of
|
|
92
|
+
* memory once, or whose session file was corrupt, gets a second chance at the
|
|
93
|
+
* release it just installed. Two is a pattern.
|
|
94
|
+
*
|
|
95
|
+
* NOTHING ELSE IN THIS TABLE BOUNDS THE ROLLBACK. There is deliberately no
|
|
96
|
+
* `bootGuardMaxAgeMs`: the guard is armed only while `autoInstalledVersion`
|
|
97
|
+
* equals the RUNNING version, so "a machine offline for a year" is a machine
|
|
98
|
+
* still running the version we installed, and rolling it back to
|
|
99
|
+
* `lastGoodVersion` is exactly as correct on day 400 as on day 1 (P1-3).
|
|
100
|
+
*/
|
|
101
|
+
crashesBeforeRollback: 2,
|
|
102
|
+
/**
|
|
103
|
+
* Bound on the `npm view` fallback probe (H3).
|
|
104
|
+
*
|
|
105
|
+
* SAFE HERE AND FORBIDDEN FOR THE INSTALLER (C-20). A killed `npm view` has
|
|
106
|
+
* written nothing; a killed `npm install -g` leaves a broken global
|
|
107
|
+
* installation, which is why `installTimeoutMs` above bounds the PHASE and
|
|
108
|
+
* never the child.
|
|
109
|
+
*/
|
|
110
|
+
npmViewTimeoutMs: 10_000,
|
|
111
|
+
};
|