@pellux/goodvibes-tui 2.0.20 → 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 +70 -0
- package/README.md +16 -16
- package/docs/README.md +4 -4
- package/docs/foundation-artifacts/operator-contract.json +59 -4
- 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,160 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* NotificationsPanel, the visible home for notifications routed to the
|
|
3
|
-
* `panel_only` target (see notifications-feed.ts for why this exists).
|
|
4
|
-
*
|
|
5
|
-
* Renders every entry the feed has accumulated: standalone panel-routed
|
|
6
|
-
* notifications, and collapsed burst/batch groups shown honestly with their
|
|
7
|
-
* real running count and the plain-language reason they were held back from
|
|
8
|
-
* the conversation. Descriptive text (titles, bodies, reason descriptions)
|
|
9
|
-
* is always wrapped in full, never clipped to a column width.
|
|
10
|
-
*/
|
|
11
|
-
import type { Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
12
|
-
import type { RoutingDecision } from '@/runtime/index.ts';
|
|
13
|
-
import { BasePanel } from './base-panel.ts';
|
|
14
|
-
import {
|
|
15
|
-
buildEmptyState,
|
|
16
|
-
buildKeyboardHints,
|
|
17
|
-
buildPanelWorkspace,
|
|
18
|
-
buildStyledPanelLine,
|
|
19
|
-
DEFAULT_PANEL_PALETTE,
|
|
20
|
-
resolveScrollablePanelSection,
|
|
21
|
-
} from './polish.ts';
|
|
22
|
-
import { wrapText } from '../utils/terminal-width.ts';
|
|
23
|
-
import { getSharedNotificationFeed, type PanelFeedEntry, type PanelNotificationFeed } from './notifications-feed.ts';
|
|
24
|
-
|
|
25
|
-
// Reuses the shared, mode-aware (dark/light) panel palette's existing
|
|
26
|
-
// bad/warn/info/dim tokens rather than minting new hex literals, this
|
|
27
|
-
// panel has no color needs the shared palette doesn't already name.
|
|
28
|
-
const C = DEFAULT_PANEL_PALETTE;
|
|
29
|
-
|
|
30
|
-
/** Plain-language description of why a notification never reached the conversation or status bar. Every reason code is covered so a new one fails visibly (a TypeScript error on this object) rather than silently. */
|
|
31
|
-
const REASON_DESCRIPTIONS: Record<RoutingDecision['reasonCode'], string> = {
|
|
32
|
-
allowed: 'routed here by domain verbosity',
|
|
33
|
-
quiet_while_typing: 'held while you were typing',
|
|
34
|
-
mode_context_minimal: 'held back by quiet mode',
|
|
35
|
-
mode_context_normal: 'held back by balanced mode',
|
|
36
|
-
burst_collapsed: 'rapid repeats collapsed',
|
|
37
|
-
batch_window_collapsed: 'repeated within a few seconds, collapsed',
|
|
38
|
-
domain_verbosity_low: "below this domain's verbosity setting",
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
function levelColor(level: PanelFeedEntry['level']): string {
|
|
42
|
-
switch (level) {
|
|
43
|
-
case 'critical': return C.bad;
|
|
44
|
-
case 'warning': return C.warn;
|
|
45
|
-
case 'debug': return C.dim;
|
|
46
|
-
default: return C.info;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function levelTag(level: PanelFeedEntry['level']): string {
|
|
51
|
-
return `[${level}]`;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/** Build every Line an entry needs, title/meta row, then the full body and reason text wrapped with no line cap (descriptive text is never clipped). */
|
|
55
|
-
function renderEntry(entry: PanelFeedEntry, width: number): Line[] {
|
|
56
|
-
const lines: Line[] = [];
|
|
57
|
-
const fg = levelColor(entry.level);
|
|
58
|
-
const countSuffix = entry.collapsedCount > 1 ? ` ×${entry.collapsedCount}` : '';
|
|
59
|
-
const headerText = `${levelTag(entry.level)} ${entry.domain}: ${entry.title}${countSuffix}`;
|
|
60
|
-
for (const wrapped of wrapText(headerText, Math.max(1, width - 1))) {
|
|
61
|
-
lines.push(buildStyledPanelLine(width, [{ text: ` ${wrapped}`, fg, bold: true }]));
|
|
62
|
-
}
|
|
63
|
-
const reasonText = entry.collapsedCount > 1
|
|
64
|
-
? ` ${entry.collapsedCount} notifications collapsed: ${REASON_DESCRIPTIONS[entry.reasonCode]}`
|
|
65
|
-
: ` ${REASON_DESCRIPTIONS[entry.reasonCode]}`;
|
|
66
|
-
for (const wrapped of wrapText(reasonText, Math.max(1, width - 1))) {
|
|
67
|
-
lines.push(buildStyledPanelLine(width, [{ text: ` ${wrapped}`, fg: C.dim }]));
|
|
68
|
-
}
|
|
69
|
-
if (entry.body) {
|
|
70
|
-
for (const wrapped of wrapText(` ${entry.body}`, Math.max(1, width - 1))) {
|
|
71
|
-
lines.push(buildStyledPanelLine(width, [{ text: ` ${wrapped}`, fg: C.value }]));
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return lines;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export class NotificationsPanel extends BasePanel {
|
|
78
|
-
private readonly unsubscribe: () => void;
|
|
79
|
-
private scrollOffset = 0;
|
|
80
|
-
|
|
81
|
-
constructor(private readonly feed: PanelNotificationFeed = getSharedNotificationFeed()) {
|
|
82
|
-
super('notifications', 'Notifications', 'N', 'runtime-ops');
|
|
83
|
-
this.unsubscribe = this.feed.subscribe(() => this.markDirty());
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
override onDestroy(): void {
|
|
87
|
-
this.unsubscribe();
|
|
88
|
-
super.onDestroy();
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
handleInput(key: string): boolean {
|
|
92
|
-
switch (key) {
|
|
93
|
-
case 'up': return this.scroll(-1);
|
|
94
|
-
case 'down': return this.scroll(1);
|
|
95
|
-
case 'pageup': return this.scroll(-10);
|
|
96
|
-
case 'pagedown': return this.scroll(10);
|
|
97
|
-
default: return false;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
private scroll(delta: number): boolean {
|
|
102
|
-
const entries = this.feed.list();
|
|
103
|
-
if (entries.length <= 1) return false;
|
|
104
|
-
const maxOffset = Math.max(0, entries.length - 1);
|
|
105
|
-
const prev = this.scrollOffset;
|
|
106
|
-
this.scrollOffset = Math.max(0, Math.min(maxOffset, this.scrollOffset + delta));
|
|
107
|
-
if (this.scrollOffset !== prev) this.markDirty();
|
|
108
|
-
return true;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
render(width: number, height: number): Line[] {
|
|
112
|
-
if (width <= 0 || height <= 0) return [];
|
|
113
|
-
const entries = this.feed.list();
|
|
114
|
-
const hintRow = buildKeyboardHints(width, [
|
|
115
|
-
{ keys: 'Up/Down', label: 'scroll' },
|
|
116
|
-
{ keys: 'PgUp/PgDn', label: 'page' },
|
|
117
|
-
], DEFAULT_PANEL_PALETTE);
|
|
118
|
-
|
|
119
|
-
if (entries.length === 0) {
|
|
120
|
-
return buildPanelWorkspace(width, height, {
|
|
121
|
-
title: ' Notifications',
|
|
122
|
-
intro: 'Notifications held back from the conversation or status bar (panel_only) land here, including their real collapsed counts.',
|
|
123
|
-
sections: [{
|
|
124
|
-
lines: buildEmptyState(
|
|
125
|
-
width,
|
|
126
|
-
' No panel-routed notifications yet',
|
|
127
|
-
'Nothing has been routed here this session. Quiet/balanced-mode operational chatter and collapsed bursts will appear here honestly, with their real counts, once something routes to this target.',
|
|
128
|
-
[],
|
|
129
|
-
DEFAULT_PANEL_PALETTE,
|
|
130
|
-
),
|
|
131
|
-
}],
|
|
132
|
-
footerLines: [hintRow],
|
|
133
|
-
palette: DEFAULT_PANEL_PALETTE,
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
const scrollableLines = entries.flatMap((entry) => renderEntry(entry, width - 2));
|
|
138
|
-
const section = resolveScrollablePanelSection(width, height, {
|
|
139
|
-
intro: 'Notifications held back from the conversation or status bar (panel_only) land here, including their real collapsed counts.',
|
|
140
|
-
footerLines: [hintRow],
|
|
141
|
-
palette: DEFAULT_PANEL_PALETTE,
|
|
142
|
-
section: {
|
|
143
|
-
title: `Notifications (${entries.length})`,
|
|
144
|
-
scrollableLines,
|
|
145
|
-
scrollOffset: this.scrollOffset,
|
|
146
|
-
minRows: 4,
|
|
147
|
-
appendWindowSummary: scrollableLines.length > 0 ? { dimColor: DEFAULT_PANEL_PALETTE.dim } : undefined,
|
|
148
|
-
},
|
|
149
|
-
});
|
|
150
|
-
this.scrollOffset = section.scrollOffset;
|
|
151
|
-
|
|
152
|
-
return buildPanelWorkspace(width, height, {
|
|
153
|
-
title: ' Notifications',
|
|
154
|
-
intro: 'Notifications held back from the conversation or status bar (panel_only) land here, including their real collapsed counts.',
|
|
155
|
-
sections: [section.section],
|
|
156
|
-
footerLines: [hintRow],
|
|
157
|
-
palette: DEFAULT_PANEL_PALETTE,
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
// ---------------------------------------------------------------------------
|
|
2
|
-
// PanelConfirmOverlay, arm a confirm from outside, resolve it inside
|
|
3
|
-
// handleInput().
|
|
4
|
-
//
|
|
5
|
-
// Why this exists: SlashCommand.handler(args, ctx) is a single-shot call,
|
|
6
|
-
// there is no "await next keypress" primitive in the command layer. A command
|
|
7
|
-
// that needs a destructive confirm (e.g. /rewind, checkpoint-runtime.ts) can
|
|
8
|
-
// only resolve its target, open+focus a panel, and arm a pending confirm;
|
|
9
|
-
// the actual y/n/Enter/Esc handling has to live in that panel's
|
|
10
|
-
// handleInput() loop. This wraps the project's canonical ConfirmState<T>
|
|
11
|
-
// contract (confirm-state.ts, used inline by GitPanel) so panels opened this
|
|
12
|
-
// way don't each hand-roll the same field + dispatch + render wiring.
|
|
13
|
-
// ---------------------------------------------------------------------------
|
|
14
|
-
|
|
15
|
-
import type { Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
16
|
-
import { type ConfirmState, handleConfirmInput, renderConfirmLines } from './confirm-state.ts';
|
|
17
|
-
|
|
18
|
-
export interface PanelConfirmOverlayHandlers {
|
|
19
|
-
readonly onConfirm: () => void | Promise<void>;
|
|
20
|
-
readonly onCancel?: () => void;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export class PanelConfirmOverlay {
|
|
24
|
-
private state: ConfirmState<{ id: string }> | null = null;
|
|
25
|
-
private handlers: PanelConfirmOverlayHandlers | null = null;
|
|
26
|
-
|
|
27
|
-
/** @param onChange Called after arm() and after a confirmed/cancelled resolution (not on an absorbed keypress), wire to the host panel's protected markDirty(). */
|
|
28
|
-
constructor(private readonly onChange: () => void = () => {}) {}
|
|
29
|
-
|
|
30
|
-
/** Arm a confirm/cancel prompt. Caller's handlers run only from handleInput(), never eagerly. */
|
|
31
|
-
arm(opts: { id: string; label: string; verb?: string } & PanelConfirmOverlayHandlers): void {
|
|
32
|
-
this.state = { subject: { id: opts.id }, label: opts.label, verb: opts.verb };
|
|
33
|
-
this.handlers = { onConfirm: opts.onConfirm, onCancel: opts.onCancel };
|
|
34
|
-
this.onChange();
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
get pending(): boolean {
|
|
38
|
-
return this.state !== null;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Call FIRST, before any other key dispatch. Returns true if the key was
|
|
43
|
-
* consumed by the overlay (confirmed/cancelled/absorbed); false if no
|
|
44
|
-
* confirm is pending (caller should continue normal dispatch).
|
|
45
|
-
*/
|
|
46
|
-
handleInput(key: string): boolean {
|
|
47
|
-
const result = handleConfirmInput(this.state, key);
|
|
48
|
-
if (result === 'inactive') return false;
|
|
49
|
-
if (result === 'confirmed') {
|
|
50
|
-
const handlers = this.handlers;
|
|
51
|
-
this.state = null;
|
|
52
|
-
this.handlers = null;
|
|
53
|
-
this.onChange();
|
|
54
|
-
if (handlers) void handlers.onConfirm();
|
|
55
|
-
return true;
|
|
56
|
-
}
|
|
57
|
-
if (result === 'cancelled') {
|
|
58
|
-
const handlers = this.handlers;
|
|
59
|
-
this.state = null;
|
|
60
|
-
this.handlers = null;
|
|
61
|
-
this.onChange();
|
|
62
|
-
handlers?.onCancel?.();
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
return true; // absorbed
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/** The two-line confirm overlay, or null when nothing is pending. */
|
|
69
|
-
renderLines(width: number): Line[] | null {
|
|
70
|
-
return this.state ? renderConfirmLines(width, this.state) : null;
|
|
71
|
-
}
|
|
72
|
-
}
|