@pellux/goodvibes-tui 2.0.21 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -0
- package/README.md +16 -16
- package/docs/README.md +4 -4
- package/docs/foundation-artifacts/operator-contract.json +1 -1
- package/package.json +16 -6
- package/src/cli/management.ts +5 -2
- package/src/cli/tui-startup.ts +34 -39
- package/src/core/agent-view-render.ts +157 -0
- package/src/core/approval-alert.ts +49 -11
- package/src/core/bookmark-navigation.ts +7 -1
- package/src/core/budget-breach-notifier.ts +27 -8
- package/src/core/compaction-receipt.ts +1 -1
- package/src/core/context-usage.ts +1 -1
- package/src/core/conversation-compaction-render.ts +3 -3
- package/src/core/conversation-display-only.ts +86 -0
- package/src/core/conversation-event-navigation.ts +27 -0
- package/src/core/conversation-line-cache.ts +216 -447
- package/src/core/conversation-render-context.ts +20 -27
- package/src/core/conversation-rendering.ts +157 -575
- package/src/core/conversation-splash-state.ts +6 -1
- package/src/core/conversation-types.ts +35 -0
- package/src/core/conversation-usage.ts +12 -0
- package/src/core/conversation.ts +130 -131
- package/src/core/long-task-notifier.ts +100 -31
- package/src/core/notices.ts +75 -0
- package/src/core/pairing-tailscale-gateway.ts +1 -1
- package/src/core/process-output-log.ts +143 -0
- package/src/core/rewind-receipt.ts +1 -1
- package/src/core/session-focus.ts +190 -0
- package/src/core/session-resume-core.ts +23 -81
- package/src/core/stream-event-wiring.ts +31 -5
- package/src/core/system-message-noise.ts +2 -2
- package/src/core/system-message-router.ts +16 -18
- package/src/core/turn-event-wiring.ts +272 -33
- package/src/core/work-tree-focus.ts +290 -0
- package/src/core/work-tree-fold-store.ts +143 -0
- package/src/core/work-tree-model.ts +799 -0
- package/src/core/work-tree-render.ts +384 -0
- package/src/core/work-tree-sources.ts +184 -0
- package/src/core/work-tree-wiring.ts +176 -0
- package/src/core/workstream-notification.ts +36 -6
- package/src/core/wrfc-notice-titles.ts +37 -0
- package/src/input/agents-modal-text.ts +119 -0
- package/src/input/agents-modal.ts +699 -0
- package/src/input/bookmark-modal.ts +33 -9
- package/src/input/changes-git.ts +251 -0
- package/src/input/changes-modal.ts +629 -0
- package/src/input/changes-model.ts +125 -0
- package/src/input/command-palette-types.ts +41 -0
- package/src/input/command-palette.ts +272 -0
- package/src/input/command-registry.ts +77 -35
- package/src/input/commands/acp-runtime.ts +19 -9
- package/src/input/commands/channel-runtime.ts +2 -2
- package/src/input/commands/ci-runtime.ts +1 -1
- package/src/input/commands/codebase-runtime.ts +1 -1
- package/src/input/commands/config.ts +7 -1
- package/src/input/commands/context-window.ts +25 -19
- package/src/input/commands/control-room-runtime.ts +18 -18
- package/src/input/commands/conversation-runtime.ts +0 -1
- package/src/input/commands/cost-runtime.ts +29 -20
- package/src/input/commands/diff-runtime.ts +35 -181
- package/src/input/commands/eval.ts +1 -1
- package/src/input/commands/experience-runtime.ts +3 -7
- package/src/input/commands/fresh-conversation.ts +86 -0
- package/src/input/commands/git-runtime.ts +5 -22
- package/src/input/commands/graph-runtime.ts +1 -1
- package/src/input/commands/guidance-runtime.ts +1 -1
- package/src/input/commands/health-runtime.ts +8 -9
- package/src/input/commands/hooks-runtime.ts +2 -2
- package/src/input/commands/hosted-runtime.ts +3 -3
- package/src/input/commands/incident-runtime.ts +3 -3
- package/src/input/commands/intelligence-runtime.ts +6 -9
- package/src/input/commands/knowledge.ts +2 -2
- package/src/input/commands/legacy-panel-command.ts +57 -0
- package/src/input/commands/local-auth-runtime.ts +8 -9
- package/src/input/commands/local-provider-runtime.ts +7 -4
- package/src/input/commands/local-runtime.ts +12 -15
- package/src/input/commands/local-setup-review.ts +1 -1
- package/src/input/commands/local-setup.ts +13 -19
- package/src/input/commands/memory.ts +1 -1
- package/src/input/commands/notify-runtime.ts +9 -0
- package/src/input/commands/operator-runtime.ts +10 -12
- package/src/input/commands/permissions-provenance.ts +3 -3
- package/src/input/commands/planning-runtime.ts +7 -7
- package/src/input/commands/platform-sandbox-runtime.ts +2 -2
- package/src/input/commands/platform-services-runtime.ts +1 -1
- package/src/input/commands/policy-dispatch.ts +2 -2
- package/src/input/commands/policy.ts +3 -3
- package/src/input/commands/provider.ts +1 -1
- package/src/input/commands/remote-runtime.ts +1 -1
- package/src/input/commands/review-runtime.ts +39 -94
- package/src/input/commands/rewind-runtime.ts +81 -108
- package/src/input/commands/runtime-services.ts +15 -17
- package/src/input/commands/services-runtime.ts +2 -2
- package/src/input/commands/session-content.ts +21 -5
- package/src/input/commands/session-workflow.ts +13 -38
- package/src/input/commands/settings-sync-runtime.ts +2 -2
- package/src/input/commands/shell-core.ts +19 -4
- package/src/input/commands/skills-runtime.ts +2 -2
- package/src/input/commands/status-runtime.ts +13 -0
- package/src/input/commands/subscription-runtime.ts +1 -1
- package/src/input/commands/tasks-runtime.ts +2 -8
- package/src/input/commands/work-plan-runtime.ts +4 -4
- package/src/input/commands/workstream-attempts.ts +24 -47
- package/src/input/commands/workstream-runtime.ts +2 -2
- package/src/input/commands/worktree-runtime.ts +3 -3
- package/src/input/commands.ts +3 -1
- package/src/input/composer-editor.ts +44 -0
- package/src/input/concealed-input.ts +1 -1
- package/src/input/config-modal-types.ts +20 -8
- package/src/input/config-modal.ts +106 -105
- package/src/input/confirm-dialog-types.ts +28 -0
- package/src/input/confirm-dialog.ts +70 -0
- package/src/input/delete-key-policy.ts +3 -3
- package/src/input/feed-context-factory.ts +15 -16
- package/src/input/handler-command-route.ts +7 -42
- package/src/input/handler-content-actions.ts +16 -15
- package/src/input/handler-feed-routes.ts +26 -211
- package/src/input/handler-feed.ts +68 -95
- package/src/input/handler-interactions.ts +5 -3
- package/src/input/handler-modal-routes.ts +215 -216
- package/src/input/handler-modal-stack.ts +81 -11
- package/src/input/handler-modal-token-routes.ts +4 -0
- package/src/input/handler-onboarding.ts +0 -1
- package/src/input/handler-picker-routes.ts +65 -107
- package/src/input/handler-session-view-route.ts +149 -0
- package/src/input/handler-shortcuts.ts +16 -154
- package/src/input/handler-types.ts +4 -2
- package/src/input/handler-ui-state.ts +45 -15
- package/src/input/handler-work-tree-route.ts +123 -0
- package/src/input/handler.ts +25 -70
- package/src/input/keybindings.ts +16 -71
- package/src/input/masked-entry-modal.ts +117 -0
- package/src/input/mcp-workspace.ts +48 -17
- package/src/input/model-picker-filter.ts +8 -0
- package/src/input/model-picker-open.ts +99 -0
- package/src/input/model-picker-types.ts +1 -1
- package/src/input/model-picker.ts +92 -9
- package/src/input/notifications-modal.ts +123 -0
- package/src/input/overlay-filter.ts +26 -0
- package/src/input/profile-picker-modal.ts +37 -8
- package/src/input/search.ts +3 -3
- package/src/input/selection-modal-queue.ts +2 -0
- package/src/input/selection-modal.ts +28 -16
- package/src/input/session-picker-modal.ts +33 -8
- package/src/input/settings-modal-activation.ts +7 -2
- package/src/input/settings-modal-data.ts +11 -6
- package/src/input/settings-modal-types.ts +1 -1
- package/src/input/settings-modal.ts +20 -20
- package/src/input/submission-intent.ts +1 -1
- package/src/input/submission-router.ts +4 -9
- package/src/input/surface-modal-host.ts +110 -0
- package/src/input/theme-settings-actions.ts +82 -0
- package/src/input/usage-modal.ts +183 -0
- package/src/input/views.ts +97 -0
- package/src/main.ts +175 -165
- package/src/permissions/hunk-selection.ts +1 -1
- package/src/permissions/prompt-card.ts +511 -0
- package/src/permissions/prompt.ts +59 -622
- package/src/renderer/agents-modal.ts +310 -0
- package/src/renderer/autocomplete-overlay.ts +42 -220
- package/src/renderer/back-to-bottom.ts +80 -0
- package/src/renderer/block-actions-overlay.ts +30 -48
- package/src/renderer/bookmark-modal.ts +48 -79
- package/src/renderer/changes-modal.ts +325 -0
- package/src/renderer/code-block.ts +184 -106
- package/src/renderer/command-palette.ts +93 -0
- package/src/renderer/composer-fragments.ts +4 -4
- package/src/renderer/composer.ts +146 -0
- package/src/renderer/compositor.ts +26 -160
- package/src/renderer/config-modal.ts +185 -81
- package/src/renderer/confirm-dialog.ts +50 -0
- package/src/renderer/context-inspector.ts +116 -154
- package/src/renderer/context-status-hint.ts +4 -4
- package/src/renderer/conversation-layout.ts +20 -0
- package/src/renderer/conversation-overlays.ts +94 -84
- package/src/renderer/conversation-surface.ts +19 -38
- package/src/renderer/diff-tint.ts +98 -0
- package/src/renderer/file-picker-overlay.ts +63 -90
- package/src/renderer/footer-targets.ts +38 -0
- package/src/renderer/git-status.ts +3 -4
- package/src/renderer/header-line.ts +140 -117
- package/src/renderer/help-overlay.ts +133 -219
- package/src/renderer/history-search-overlay.ts +15 -12
- package/src/renderer/lane-graph/bead.ts +800 -0
- package/src/renderer/lane-graph/glyphs.ts +134 -0
- package/src/renderer/lane-graph/layout.ts +248 -0
- package/src/renderer/lane-graph/paint.ts +537 -0
- package/src/renderer/lane-graph/semantic-memo.ts +77 -0
- package/src/renderer/layout-engine.ts +2 -57
- package/src/renderer/layout.ts +7 -13
- package/src/renderer/markdown-inline.ts +2 -1
- package/src/renderer/markdown-table.ts +17 -12
- package/src/renderer/markdown.ts +92 -34
- package/src/renderer/masked-entry-modal.ts +78 -0
- package/src/renderer/mcp-workspace.ts +166 -203
- package/src/renderer/model-workspace.ts +381 -436
- package/src/renderer/notifications-modal.ts +116 -0
- package/src/renderer/onboarding/onboarding-wizard.ts +178 -588
- package/src/renderer/process-view.ts +192 -0
- package/src/renderer/profile-picker-modal.ts +58 -110
- package/src/renderer/search-overlay.ts +6 -3
- package/src/renderer/selection-modal-overlay.ts +87 -327
- package/src/renderer/semantic-diff.ts +2 -2
- package/src/renderer/session-chips.ts +102 -0
- package/src/renderer/session-picker-modal.ts +177 -297
- package/src/renderer/settings-modal-connections.ts +14 -23
- package/src/renderer/settings-modal-context.ts +367 -0
- package/src/renderer/settings-modal-helpers.ts +6 -11
- package/src/renderer/settings-modal.ts +322 -726
- package/src/renderer/shell-surface.ts +277 -175
- package/src/renderer/shortcuts-overlay.ts +217 -0
- package/src/renderer/status-line.ts +475 -0
- package/src/renderer/surface-compose.ts +174 -0
- package/src/renderer/surface-kit-extra.ts +303 -0
- package/src/renderer/surface-kit-list.ts +366 -0
- package/src/renderer/surface-kit-parts.ts +360 -0
- package/src/renderer/surface-kit.ts +568 -0
- package/src/renderer/syntax-highlighter.ts +280 -197
- package/src/renderer/syntax-theme.ts +51 -0
- package/src/renderer/system-message.ts +0 -1
- package/src/renderer/term-caps.ts +42 -1
- package/src/renderer/terminal-bg-probe.ts +116 -19
- package/src/renderer/terminal-palette-probe.ts +322 -0
- package/src/renderer/terminal-palette-reader.ts +183 -0
- package/src/renderer/terminal-palette.ts +58 -0
- package/src/renderer/theme-mode-config.ts +16 -1
- package/src/renderer/theme.ts +234 -207
- package/src/renderer/thinking.ts +0 -1
- package/src/renderer/throbber.ts +188 -0
- package/src/renderer/toast-center.ts +119 -0
- package/src/renderer/ui-factory.ts +39 -602
- package/src/renderer/ui-primitives.ts +8 -25
- package/src/renderer/usage-modal.ts +353 -0
- package/src/renderer/user-message.ts +58 -0
- package/src/renderer/voice-capture-chip.ts +53 -0
- package/src/runtime/bootstrap-command-context.ts +0 -5
- package/src/runtime/bootstrap-command-parts.ts +38 -89
- package/src/runtime/bootstrap-core.ts +13 -15
- package/src/runtime/bootstrap-hook-bridge.ts +12 -21
- package/src/runtime/bootstrap-notifier-sync.ts +17 -1
- package/src/runtime/bootstrap-shell.ts +16 -50
- package/src/runtime/bootstrap.ts +14 -14
- package/src/runtime/client/fleet-union.ts +5 -5
- package/src/runtime/client/hosted-exit.ts +2 -2
- package/src/runtime/client/hosted-sessions.ts +1 -1
- package/src/runtime/client/spine-adoption.ts +1 -1
- package/src/runtime/context-accounting-source.ts +5 -4
- package/src/runtime/index.ts +1 -0
- package/src/runtime/notification-dispatch.ts +102 -29
- package/src/runtime/recovery-offer-wiring.ts +4 -1
- package/src/runtime/recovery-prompt.ts +31 -15
- package/src/runtime/runtime-services-types.ts +10 -6
- package/src/runtime/services.ts +17 -12
- package/src/runtime/session-continuity-hints.ts +2 -5
- package/src/runtime/session-inbound-inputs.ts +1 -1
- package/src/runtime/session-resume-liveness-confirm.ts +14 -2
- package/src/runtime/startup-typeahead-gate.ts +103 -0
- package/src/runtime/store/domains/domain-read-matrix.ts +0 -1
- package/src/runtime/store/domains/index.ts +0 -8
- package/src/runtime/store/selectors/index.ts +0 -28
- package/src/runtime/store/state.ts +0 -8
- package/src/runtime/ui-services.ts +4 -6
- package/src/runtime/usage-tracker.ts +348 -0
- package/src/runtime/wrfc-persistence.ts +4 -4
- package/src/shell/blocking-input.ts +92 -2
- package/src/shell/recovery-input-helpers.ts +1 -1
- package/src/shell/session-views.ts +539 -0
- package/src/shell/status-report.ts +86 -0
- package/src/shell/transcript-scroll.ts +68 -0
- package/src/shell/ui-openers.ts +84 -172
- package/src/shell/view-openers.ts +205 -0
- package/src/tools/wrfc-agent-guard.ts +22 -2
- package/src/utils/format-duration.ts +4 -8
- package/src/utils/splash-lines.ts +9 -1
- package/src/utils/terminal-width.ts +56 -0
- package/src/verification/verification-ledger.ts +18 -16
- package/src/{panels → views}/agent-inspector-shared.ts +2 -2
- package/src/{panels → views}/builtin-modals.ts +22 -21
- package/src/views/builtin-views.ts +135 -0
- package/src/{panels → views}/confirm-state.ts +9 -9
- package/src/{panels → views}/diff-review-model.ts +10 -3
- package/src/{panels → views}/eval-registry.ts +1 -1
- package/src/{panels → views}/fleet-acts.ts +49 -85
- package/src/{panels/fleet-panel-format.ts → views/fleet-format.ts} +40 -40
- package/src/{panels → views}/fleet-gateway.ts +5 -5
- package/src/{panels → views}/fleet-observed-render.ts +16 -16
- package/src/{panels → views}/fleet-read-model.ts +9 -9
- package/src/{panels/fleet-tabs.ts → views/fleet-session-tabs.ts} +13 -13
- package/src/{panels → views}/fleet-spawn.ts +33 -49
- package/src/{panels → views}/fleet-steer.ts +12 -12
- package/src/{panels → views}/fleet-stop.ts +4 -4
- package/src/{panels → views}/fleet-transcript.ts +26 -27
- package/src/{panels/fleet-panel-worktree-detail.ts → views/fleet-worktree-detail.ts} +7 -7
- package/src/{panels → views}/hosted-session-feed.ts +6 -6
- package/src/views/modal-surface-registry.ts +41 -0
- package/src/{panels → views}/modals/devices-modal.ts +2 -2
- package/src/{panels → views}/modals/hooks-modal.ts +13 -13
- package/src/{panels → views}/modals/keybindings-modal.ts +19 -27
- package/src/{panels → views}/modals/knowledge-modal.ts +6 -5
- package/src/{panels → views}/modals/local-auth-modal.ts +22 -21
- package/src/{panels → views}/modals/marketplace-modal.ts +11 -11
- package/src/{panels → views}/modals/memory-modal.ts +8 -8
- package/src/{panels → views}/modals/modal-surface-helpers.ts +15 -5
- package/src/{panels → views}/modals/pairing-modal.ts +9 -9
- package/src/{panels → views}/modals/planning-modal.ts +15 -20
- package/src/{panels → views}/modals/plugins-modal.ts +6 -6
- package/src/{panels → views}/modals/policy-modal.ts +13 -5
- package/src/{panels → views}/modals/provider-health-modal.ts +4 -4
- package/src/{panels → views}/modals/remote-modal.ts +3 -3
- package/src/{panels → views}/modals/sandbox-modal.ts +4 -4
- package/src/{panels → views}/modals/security-modal.ts +22 -16
- package/src/{panels → views}/modals/services-modal.ts +3 -3
- package/src/{panels → views}/modals/settings-sync-modal.ts +4 -4
- package/src/{panels → views}/modals/skills-modal.ts +9 -9
- package/src/{panels → views}/modals/subscription-modal.ts +3 -3
- package/src/{panels → views}/modals/work-plan-modal.ts +10 -13
- package/src/views/notifications-feed.ts +314 -0
- package/src/{panels → views}/polish-core.ts +38 -36
- package/src/{panels → views}/polish-tables.ts +35 -26
- package/src/{panels → views}/polish.ts +101 -95
- package/src/{panels → views}/project-planning-answer-actions.ts +3 -3
- package/src/{panels → views}/provider-health-routes.ts +14 -14
- package/src/{panels → views}/search-focus.ts +8 -8
- package/src/{panels → views}/session-maintenance.ts +11 -11
- package/src/views/skills-discovery.ts +159 -0
- package/src/views/view-deps.ts +80 -0
- package/src/views/view-panel-adapter.ts +53 -0
- package/src/{panels → views}/workstream-graph-render.ts +1 -1
- package/src/core/conversation-fold.ts +0 -101
- package/src/core/conversation-turn-structure.ts +0 -464
- package/src/core/conversation-user-receipts.ts +0 -42
- package/src/input/commands/operator-panel-runtime.ts +0 -186
- package/src/input/panel-integration-actions.ts +0 -33
- package/src/input/panel-mouse-geometry.ts +0 -97
- package/src/input/panel-paste-flood-guard.ts +0 -86
- package/src/panels/base-panel.ts +0 -301
- package/src/panels/builtin/agent.ts +0 -27
- package/src/panels/builtin/development.ts +0 -92
- package/src/panels/builtin/knowledge.ts +0 -12
- package/src/panels/builtin/operations.ts +0 -177
- package/src/panels/builtin/session.ts +0 -81
- package/src/panels/builtin/shared.ts +0 -357
- package/src/panels/builtin-panels.ts +0 -28
- package/src/panels/cost-tracker-panel.ts +0 -746
- package/src/panels/diff-panel.ts +0 -797
- package/src/panels/diff-review-panel.ts +0 -395
- package/src/panels/expandable-list-panel.ts +0 -189
- package/src/panels/fleet-deep-link.ts +0 -31
- package/src/panels/fleet-panel.ts +0 -799
- package/src/panels/git-panel.ts +0 -800
- package/src/panels/hosted-session-panel.ts +0 -221
- package/src/panels/index.ts +0 -21
- package/src/panels/local-auth-panel.ts +0 -478
- package/src/panels/notifications-feed.ts +0 -127
- package/src/panels/notifications-panel.ts +0 -160
- package/src/panels/panel-confirm-overlay.ts +0 -72
- package/src/panels/panel-manager.ts +0 -791
- package/src/panels/plugins-panel.ts +0 -371
- package/src/panels/scrollable-list-panel.ts +0 -498
- package/src/panels/skills-panel.ts +0 -454
- package/src/panels/token-budget-panel.ts +0 -688
- package/src/panels/types.ts +0 -191
- package/src/panels/wrfc-panel-format.ts +0 -133
- package/src/renderer/diff-view.ts +0 -134
- package/src/renderer/fleet-tab-strip.ts +0 -56
- package/src/renderer/footer-tips.ts +0 -53
- package/src/renderer/fullscreen-primitives.ts +0 -146
- package/src/renderer/fullscreen-workspace.ts +0 -194
- package/src/renderer/hint-grammar.ts +0 -52
- package/src/renderer/modal-factory.ts +0 -480
- package/src/renderer/overlay-box.ts +0 -154
- package/src/renderer/overlay-viewport.ts +0 -104
- package/src/renderer/panel-composite.ts +0 -145
- package/src/renderer/panel-workspace-bar.ts +0 -54
- package/src/renderer/process-indicator.ts +0 -163
- package/src/renderer/tab-strip.ts +0 -222
- package/src/renderer/text-layout.ts +0 -31
- package/src/renderer/tool-call.ts +0 -276
- package/src/renderer/tool-result-expanded-lines.ts +0 -48
- package/src/renderer/tool-result-summary.ts +0 -219
- package/src/runtime/diagnostics/panels/index.ts +0 -21
- package/src/runtime/diagnostics/panels/ops.ts +0 -156
- package/src/runtime/perf/panel-contracts.ts +0 -32
- package/src/runtime/store/domains/panels.ts +0 -117
- /package/src/{panels → views}/memory-consolidation-gateway.ts +0 -0
- /package/src/{panels → views}/modals/modal-theme.ts +0 -0
- /package/src/{panels → views}/provider-health-domains.ts +0 -0
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HostedSessionPanel, the conversation the daemon is running, rendered here.
|
|
3
|
-
*
|
|
4
|
-
* A hosted session's turn arrives on the same `turn` and `tools` event domains
|
|
5
|
-
* a local turn does, so what this panel shows is the same thing the transcript
|
|
6
|
-
* shows for a local conversation: what was said, what tool is running, and
|
|
7
|
-
* whether text is still streaming. The difference is where the loop lives, and
|
|
8
|
-
* the header says so plainly, including `effectiveDetachPolicy`, so a person
|
|
9
|
-
* about to quit knows whether that ends the work.
|
|
10
|
-
*
|
|
11
|
-
* The panel renders; it decides nothing. Every fact in the header is a field of
|
|
12
|
-
* the daemon's own record (hosted-session-feed.ts), and the rows are the
|
|
13
|
-
* backfilled history plus the live frames. When there is no stream open the
|
|
14
|
-
* panel says why rather than showing a still conversation that looks finished.
|
|
15
|
-
*/
|
|
16
|
-
import type { Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
17
|
-
import { BasePanel } from './base-panel.ts';
|
|
18
|
-
import {
|
|
19
|
-
buildEmptyState,
|
|
20
|
-
buildKeyboardHints,
|
|
21
|
-
buildPanelWorkspace,
|
|
22
|
-
buildStyledPanelLine,
|
|
23
|
-
DEFAULT_PANEL_PALETTE,
|
|
24
|
-
resolveScrollablePanelSection,
|
|
25
|
-
} from './polish.ts';
|
|
26
|
-
import { wrapText } from '../utils/terminal-width.ts';
|
|
27
|
-
import {
|
|
28
|
-
getSharedHostedSessionFeed,
|
|
29
|
-
type HostedSessionFeed,
|
|
30
|
-
type HostedSessionFeedState,
|
|
31
|
-
type HostedSessionRow,
|
|
32
|
-
} from './hosted-session-feed.ts';
|
|
33
|
-
|
|
34
|
-
const C = DEFAULT_PANEL_PALETTE;
|
|
35
|
-
|
|
36
|
-
const INTRO = 'A conversation whose loop runs inside the daemon. Steer it with /hosted say, leave it with /hosted detach; the header says what leaving would do.';
|
|
37
|
-
|
|
38
|
-
function rowColor(kind: HostedSessionRow['kind']): string {
|
|
39
|
-
switch (kind) {
|
|
40
|
-
case 'user': return C.accent;
|
|
41
|
-
case 'assistant': return C.value;
|
|
42
|
-
case 'tool': return C.info;
|
|
43
|
-
case 'error': return C.bad;
|
|
44
|
-
default: return C.dim;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function rowPrefix(kind: HostedSessionRow['kind']): string {
|
|
49
|
-
switch (kind) {
|
|
50
|
-
case 'user': return 'you';
|
|
51
|
-
case 'assistant': return 'hosted';
|
|
52
|
-
case 'tool': return 'tool';
|
|
53
|
-
case 'error': return 'error';
|
|
54
|
-
default: return '·';
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/** Every line one transcript row needs. Text is wrapped in full, never clipped. */
|
|
59
|
-
export function renderHostedRow(row: HostedSessionRow, width: number): Line[] {
|
|
60
|
-
const lines: Line[] = [];
|
|
61
|
-
const fg = rowColor(row.kind);
|
|
62
|
-
const marker = row.streaming ? ' …' : '';
|
|
63
|
-
const body = `${rowPrefix(row.kind)}: ${row.text}${marker}`;
|
|
64
|
-
const wrapWidth = Math.max(1, width - 1);
|
|
65
|
-
for (const [index, wrapped] of wrapText(body, wrapWidth).entries()) {
|
|
66
|
-
lines.push(buildStyledPanelLine(width, [{ text: ` ${wrapped}`, fg, bold: index === 0 && row.kind === 'user' }]));
|
|
67
|
-
}
|
|
68
|
-
return lines;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* The header block: who this session is, what it is doing, and what leaving it
|
|
73
|
-
* would do. Every value comes from the record; nothing is derived locally.
|
|
74
|
-
*/
|
|
75
|
-
export function buildHostedHeaderLines(state: HostedSessionFeedState, width: number): Line[] {
|
|
76
|
-
const record = state.record;
|
|
77
|
-
if (!record) return [];
|
|
78
|
-
const policyText = record.effectiveDetachPolicy === 'survive'
|
|
79
|
-
? 'detaching keeps it running (survive)'
|
|
80
|
-
: 'detaching ends it (kill)';
|
|
81
|
-
const policySource = record.detachPolicy === null ? 'from the setting' : 'per-session override';
|
|
82
|
-
const rows: { text: string; fg: string }[] = [
|
|
83
|
-
{ text: `${record.title.trim() || record.id}: ${record.status}`, fg: C.header },
|
|
84
|
-
{ text: `id ${record.id}`, fg: C.dim },
|
|
85
|
-
{ text: `workspace ${record.workspaceRoot}`, fg: C.dim },
|
|
86
|
-
{
|
|
87
|
-
text: `${policyText}, ${policySource}`,
|
|
88
|
-
fg: record.effectiveDetachPolicy === 'survive' ? C.good : C.warn,
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
text: `${record.turnCount} turn(s), ${record.messageCount} message(s); attached: ${record.attachedClients.length > 0 ? record.attachedClients.join(', ') : 'nobody'}`,
|
|
92
|
-
fg: C.label,
|
|
93
|
-
},
|
|
94
|
-
];
|
|
95
|
-
if (record.status === 'terminated') {
|
|
96
|
-
rows.push({ text: `ended: ${record.terminatedReason ?? 'no reason recorded'}`, fg: C.bad });
|
|
97
|
-
}
|
|
98
|
-
if (record.restoredFromDisk) {
|
|
99
|
-
rows.push({ text: 'restored from disk after a daemon restart', fg: C.warn });
|
|
100
|
-
}
|
|
101
|
-
rows.push(state.streaming
|
|
102
|
-
? { text: 'live event stream open', fg: C.good }
|
|
103
|
-
: { text: `no live stream: ${state.streamNote ?? 'not subscribed'}`, fg: C.warn });
|
|
104
|
-
if (state.runningToolCalls.length > 0) {
|
|
105
|
-
rows.push({
|
|
106
|
-
text: `running: ${state.runningToolCalls.map((call) => `${call.tool} (${call.callId})`).join(', ')}`,
|
|
107
|
-
fg: C.info,
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
if (state.droppedRows > 0) {
|
|
111
|
-
rows.push({ text: `${state.droppedRows} earlier row(s) dropped by this panel's buffer; reattach to backfill`, fg: C.dim });
|
|
112
|
-
}
|
|
113
|
-
const lines: Line[] = [];
|
|
114
|
-
for (const row of rows) {
|
|
115
|
-
for (const wrapped of wrapText(row.text, Math.max(1, width - 1))) {
|
|
116
|
-
lines.push(buildStyledPanelLine(width, [{ text: ` ${wrapped}`, fg: row.fg }]));
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
return lines;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export class HostedSessionPanel extends BasePanel {
|
|
123
|
-
private readonly unsubscribe: () => void;
|
|
124
|
-
private scrollOffset = 0;
|
|
125
|
-
/** Off until the user scrolls: a live conversation should follow its own tail. */
|
|
126
|
-
private pinnedToTail = true;
|
|
127
|
-
|
|
128
|
-
constructor(private readonly feed: HostedSessionFeed = getSharedHostedSessionFeed()) {
|
|
129
|
-
// '◈' verified free against the registered builtin panel icons.
|
|
130
|
-
super('hosted', 'Hosted Session', '◈', 'session');
|
|
131
|
-
this.unsubscribe = this.feed.subscribe(() => {
|
|
132
|
-
if (this.pinnedToTail) this.scrollOffset = Number.MAX_SAFE_INTEGER;
|
|
133
|
-
this.markDirty();
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
override onDestroy(): void {
|
|
138
|
-
this.unsubscribe();
|
|
139
|
-
super.onDestroy();
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
handleInput(key: string): boolean {
|
|
143
|
-
switch (key) {
|
|
144
|
-
case 'up': return this.scroll(-1);
|
|
145
|
-
case 'down': return this.scroll(1);
|
|
146
|
-
case 'pageup': return this.scroll(-10);
|
|
147
|
-
case 'pagedown': return this.scroll(10);
|
|
148
|
-
case 'end': {
|
|
149
|
-
this.pinnedToTail = true;
|
|
150
|
-
this.scrollOffset = Number.MAX_SAFE_INTEGER;
|
|
151
|
-
this.markDirty();
|
|
152
|
-
return true;
|
|
153
|
-
}
|
|
154
|
-
default: return false;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
private scroll(delta: number): boolean {
|
|
159
|
-
const rows = this.feed.getState().rows;
|
|
160
|
-
if (rows.length === 0) return false;
|
|
161
|
-
// Scrolling up unpins; reaching the bottom re-pins, so a reader who catches
|
|
162
|
-
// up starts following again without a second key.
|
|
163
|
-
this.pinnedToTail = false;
|
|
164
|
-
this.scrollOffset = Math.max(0, this.scrollOffset + delta);
|
|
165
|
-
this.markDirty();
|
|
166
|
-
return true;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
render(width: number, height: number): Line[] {
|
|
170
|
-
if (width <= 0 || height <= 0) return [];
|
|
171
|
-
const state = this.feed.getState();
|
|
172
|
-
const hintRow = buildKeyboardHints(width, [
|
|
173
|
-
{ keys: 'Up/Down', label: 'scroll' },
|
|
174
|
-
{ keys: 'PgUp/PgDn', label: 'page' },
|
|
175
|
-
{ keys: 'End', label: 'follow' },
|
|
176
|
-
], DEFAULT_PANEL_PALETTE);
|
|
177
|
-
|
|
178
|
-
if (!state.record) {
|
|
179
|
-
return buildPanelWorkspace(width, height, {
|
|
180
|
-
title: ' Hosted Session',
|
|
181
|
-
intro: INTRO,
|
|
182
|
-
sections: [{
|
|
183
|
-
lines: buildEmptyState(
|
|
184
|
-
width,
|
|
185
|
-
' Not attached to a hosted session',
|
|
186
|
-
'A hosted session runs inside the daemon instead of this terminal, so it can outlive the window it was started from. Start one with /hosted new, or join one that already exists with /hosted list and /hosted attach <id>. Local sessions are unchanged and remain the default.',
|
|
187
|
-
[],
|
|
188
|
-
DEFAULT_PANEL_PALETTE,
|
|
189
|
-
),
|
|
190
|
-
}],
|
|
191
|
-
footerLines: [hintRow],
|
|
192
|
-
palette: DEFAULT_PANEL_PALETTE,
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
const headerSection = { lines: buildHostedHeaderLines(state, width - 2) };
|
|
197
|
-
const scrollableLines = state.rows.flatMap((row) => renderHostedRow(row, width - 2));
|
|
198
|
-
const section = resolveScrollablePanelSection(width, height, {
|
|
199
|
-
intro: INTRO,
|
|
200
|
-
footerLines: [hintRow],
|
|
201
|
-
palette: DEFAULT_PANEL_PALETTE,
|
|
202
|
-
beforeSections: [headerSection],
|
|
203
|
-
section: {
|
|
204
|
-
title: `Transcript (${state.rows.length})`,
|
|
205
|
-
scrollableLines,
|
|
206
|
-
scrollOffset: this.scrollOffset,
|
|
207
|
-
minRows: 4,
|
|
208
|
-
appendWindowSummary: scrollableLines.length > 0 ? { dimColor: DEFAULT_PANEL_PALETTE.dim } : undefined,
|
|
209
|
-
},
|
|
210
|
-
});
|
|
211
|
-
this.scrollOffset = section.scrollOffset;
|
|
212
|
-
|
|
213
|
-
return buildPanelWorkspace(width, height, {
|
|
214
|
-
title: ' Hosted Session',
|
|
215
|
-
intro: INTRO,
|
|
216
|
-
sections: [headerSection, section.section],
|
|
217
|
-
footerLines: [hintRow],
|
|
218
|
-
palette: DEFAULT_PANEL_PALETTE,
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
}
|
package/src/panels/index.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export type { Panel, PanelCategory, PanelRegistration } from './types.ts';
|
|
2
|
-
export type { Pane } from './panel-manager.ts';
|
|
3
|
-
export { BasePanel } from './base-panel.ts';
|
|
4
|
-
export { PanelManager } from './panel-manager.ts';
|
|
5
|
-
export { TokenBudgetPanel } from './token-budget-panel.ts';
|
|
6
|
-
export { CostTrackerPanel } from './cost-tracker-panel.ts';
|
|
7
|
-
export { GitPanel } from './git-panel.ts';
|
|
8
|
-
export { registerBuiltinPanels } from './builtin-panels.ts';
|
|
9
|
-
export type { BuiltinPanelDeps } from './builtin-panels.ts';
|
|
10
|
-
// (the purge), group B: plugins/skills panels are register-retired but
|
|
11
|
-
// their modules are retained for shared non-class exports (PluginManagerControls;
|
|
12
|
-
// discoverSkills + SkillRecord/SkillOrigin, consumed by command runtimes and the
|
|
13
|
-
// skills modal). The other group-A and group-B panel classes are deleted outright
|
|
14
|
-
// (their views migrated to config-modal surfaces in src/panels/modals/).
|
|
15
|
-
export { PluginsPanel } from './plugins-panel.ts';
|
|
16
|
-
export { SkillsPanel } from './skills-panel.ts';
|
|
17
|
-
export { FleetPanel } from './fleet-panel.ts';
|
|
18
|
-
export type { FleetActionCallbacks } from './fleet-panel.ts';
|
|
19
|
-
export { NotificationsPanel } from './notifications-panel.ts';
|
|
20
|
-
export { PanelNotificationFeed, getSharedNotificationFeed } from './notifications-feed.ts';
|
|
21
|
-
export type { PanelFeedEntry } from './notifications-feed.ts';
|