@pellux/goodvibes-tui 2.0.13 → 2.0.15
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/.goodvibes/GOODVIBES.md +1 -1
- package/.goodvibes/agents/reviewer.md +8 -8
- package/.goodvibes/skills/add-provider/SKILL.md +22 -22
- package/CHANGELOG.md +61 -0
- package/README.md +40 -29
- package/docs/README.md +1 -1
- package/docs/foundation-artifacts/README.md +5 -5
- package/docs/foundation-artifacts/operator-contract.json +123 -123
- package/package.json +12 -10
- package/scripts/postinstall.js +3 -3
- package/src/audio/activation-sound.ts +7 -7
- package/src/audio/capture.ts +7 -7
- package/src/audio/onnxruntime-assets.d.ts +1 -1
- package/src/audio/player.ts +4 -4
- package/src/audio/spoken-turn-wiring.ts +4 -4
- package/src/audio/voice-capture-wiring.ts +5 -5
- package/src/audio/voice-input-session.ts +3 -3
- package/src/audio/wake-inference.ts +13 -8
- package/src/audio/wake-runtime.ts +10 -10
- package/src/cli/completions/generate.ts +2 -2
- package/src/cli/doctor.ts +13 -13
- package/src/cli/ensure-goodvibes-gitignore.ts +3 -3
- package/src/cli/entrypoint.ts +3 -3
- package/src/cli/help.ts +6 -6
- package/src/cli/hooks-command.ts +4 -4
- package/src/cli/hooks-report.ts +4 -4
- package/src/cli/launch-auto-update.ts +17 -17
- package/src/cli/management-commands.ts +8 -8
- package/src/cli/management-utils.ts +3 -3
- package/src/cli/management.ts +1 -1
- package/src/cli/plugin-bundles-command.ts +10 -10
- package/src/cli/plugin-command.ts +9 -9
- package/src/cli/service-posture.ts +1 -1
- package/src/cli/status.ts +10 -10
- package/src/cli/surface-command.ts +4 -4
- package/src/cli/tui-startup.ts +23 -23
- package/src/config/run-daemon-config-migration.ts +3 -3
- package/src/config/secret-config.ts +10 -10
- package/src/config/surface.ts +1 -1
- package/src/config/tui-extension-settings.ts +8 -8
- package/src/core/active-model-identity.ts +7 -7
- package/src/core/approval-alert.ts +5 -5
- package/src/core/bookmark-navigation.ts +3 -3
- package/src/core/budget-breach-notifier.ts +6 -6
- package/src/core/compaction-receipt.ts +8 -8
- package/src/core/composer-state.ts +2 -2
- package/src/core/context-usage.ts +1 -1
- package/src/core/conversation-compaction-render.ts +3 -3
- package/src/core/conversation-event-navigation.ts +2 -2
- package/src/core/conversation-fold.ts +9 -9
- package/src/core/conversation-line-cache.ts +14 -14
- package/src/core/conversation-render-context.ts +6 -6
- package/src/core/conversation-rendering.ts +27 -30
- package/src/core/conversation-search-expansion.ts +6 -6
- package/src/core/conversation-splash-state.ts +3 -3
- package/src/core/conversation-turn-structure.ts +13 -13
- package/src/core/conversation-types.ts +3 -3
- package/src/core/conversation-user-receipts.ts +5 -5
- package/src/core/conversation.ts +17 -17
- package/src/core/format-user-error.ts +5 -5
- package/src/core/long-task-notifier.ts +9 -9
- package/src/core/memory-diagnostics-gateway.ts +8 -8
- package/src/core/memory-provenance.ts +5 -5
- package/src/core/model-routing-chip.ts +3 -3
- package/src/core/pairing-tailscale-gateway.ts +3 -3
- package/src/core/permission-mode.ts +5 -5
- package/src/core/power-chip-source.ts +3 -3
- package/src/core/power-status.ts +8 -8
- package/src/core/rewind-receipt.ts +6 -6
- package/src/core/session-resume-core.ts +8 -8
- package/src/core/stream-event-wiring.ts +36 -36
- package/src/core/stream-stall-watchdog.ts +4 -4
- package/src/core/system-message-noise.ts +7 -7
- package/src/core/system-message-router.ts +10 -10
- package/src/core/terminal-notifier.ts +5 -5
- package/src/core/turn-budget-outcome.ts +5 -5
- package/src/core/turn-cancellation.ts +3 -3
- package/src/core/turn-event-wiring.ts +16 -16
- package/src/core/voice-capture-status.ts +2 -2
- package/src/core/voice-provision-gateway.ts +12 -12
- package/src/core/voice-provision-status.ts +19 -19
- package/src/core/voice-stt-gateway.ts +6 -6
- package/src/core/wake-provision-runner.ts +7 -7
- package/src/core/wake-provision-status.ts +17 -17
- package/src/core/workstream-notification.ts +8 -8
- package/src/export/gist-uploader.ts +7 -7
- package/src/input/autocomplete.ts +3 -3
- package/src/input/bookmark-modal.ts +1 -1
- package/src/input/command-args-hint.ts +2 -2
- package/src/input/command-reference.ts +9 -9
- package/src/input/command-registry.ts +32 -32
- package/src/input/commands/acp-runtime.ts +6 -6
- package/src/input/commands/calendar-runtime.ts +9 -9
- package/src/input/commands/channel-pairing.ts +11 -11
- package/src/input/commands/channel-runtime.ts +1 -1
- package/src/input/commands/checkin-runtime.ts +4 -4
- package/src/input/commands/checkpoint-runtime.ts +4 -4
- package/src/input/commands/ci-runtime.ts +4 -4
- package/src/input/commands/cluster-runtime.ts +3 -3
- package/src/input/commands/codebase-runtime.ts +16 -16
- package/src/input/commands/config.ts +6 -6
- package/src/input/commands/connection-status.ts +12 -12
- package/src/input/commands/context-window.ts +2 -2
- package/src/input/commands/cost-attribution-format.ts +4 -4
- package/src/input/commands/cost-runtime.ts +2 -2
- package/src/input/commands/devices-runtime.ts +7 -7
- package/src/input/commands/diff-runtime.ts +2 -2
- package/src/input/commands/editor-runtime.ts +1 -1
- package/src/input/commands/eval.ts +4 -4
- package/src/input/commands/experience-runtime.ts +1 -1
- package/src/input/commands/git-runtime.ts +3 -3
- package/src/input/commands/graph-runtime.ts +3 -3
- package/src/input/commands/guidance-runtime.ts +1 -1
- package/src/input/commands/health-metrics-format.ts +2 -2
- package/src/input/commands/health-runtime.ts +8 -8
- package/src/input/commands/hosted-runtime.ts +13 -13
- package/src/input/commands/image-runtime.ts +6 -6
- package/src/input/commands/intelligence-runtime.ts +2 -2
- package/src/input/commands/local-auth-runtime.ts +3 -3
- package/src/input/commands/local-provider-runtime.ts +3 -3
- package/src/input/commands/local-runtime.ts +7 -7
- package/src/input/commands/mail-runtime.ts +9 -9
- package/src/input/commands/mcp-runtime.ts +1 -1
- package/src/input/commands/memory.ts +13 -13
- package/src/input/commands/notify-runtime.ts +1 -1
- package/src/input/commands/operator-panel-runtime.ts +8 -8
- package/src/input/commands/operator-rpc.ts +3 -3
- package/src/input/commands/operator-runtime.ts +3 -3
- package/src/input/commands/palette-runtime.ts +1 -1
- package/src/input/commands/payment-card-intake.ts +17 -17
- package/src/input/commands/permissions-provenance.ts +7 -7
- package/src/input/commands/permissions-runtime.ts +1 -1
- package/src/input/commands/planning-runtime.ts +9 -9
- package/src/input/commands/platform-services-runtime.ts +2 -2
- package/src/input/commands/policy-dispatch.ts +6 -6
- package/src/input/commands/power-runtime.ts +6 -6
- package/src/input/commands/principals-runtime.ts +3 -3
- package/src/input/commands/product-runtime.ts +3 -3
- package/src/input/commands/profile-render.ts +13 -13
- package/src/input/commands/profile-runtime.ts +13 -13
- package/src/input/commands/profile-types.ts +13 -13
- package/src/input/commands/provider-accounts-runtime.ts +5 -5
- package/src/input/commands/provider.ts +10 -10
- package/src/input/commands/qrcode-runtime.ts +3 -3
- package/src/input/commands/queue-runtime.ts +6 -6
- package/src/input/commands/recall-files-config.ts +4 -4
- package/src/input/commands/recall-files-git.ts +3 -3
- package/src/input/commands/recall-files.ts +12 -12
- package/src/input/commands/recall-query.ts +3 -3
- package/src/input/commands/recall-review.ts +3 -3
- package/src/input/commands/recall-shared.ts +1 -1
- package/src/input/commands/relay-runtime.ts +5 -5
- package/src/input/commands/remote-runtime.ts +3 -3
- package/src/input/commands/review-runtime.ts +8 -8
- package/src/input/commands/rewind-runtime.ts +21 -21
- package/src/input/commands/runtime-services.ts +1 -2
- package/src/input/commands/schedule-nl.ts +2 -2
- package/src/input/commands/schedule-runtime.ts +2 -2
- package/src/input/commands/secret-runtime.ts +3 -3
- package/src/input/commands/session-content.ts +7 -7
- package/src/input/commands/session-picker-filter.ts +3 -3
- package/src/input/commands/session-workflow.ts +10 -10
- package/src/input/commands/session.ts +15 -15
- package/src/input/commands/settings-sync-runtime.ts +2 -2
- package/src/input/commands/share-runtime.ts +4 -4
- package/src/input/commands/shell-core.ts +11 -11
- package/src/input/commands/tasks-runtime.ts +4 -4
- package/src/input/commands/test-runtime.ts +6 -6
- package/src/input/commands/tts-runtime.ts +4 -4
- package/src/input/commands/update-runtime.ts +27 -27
- package/src/input/commands/websearch-runtime.ts +2 -2
- package/src/input/commands/work-plan-runtime.ts +2 -2
- package/src/input/commands/workstream-attempt-dependents.ts +4 -4
- package/src/input/commands/workstream-attempts.ts +16 -16
- package/src/input/commands/workstream-runtime.ts +36 -36
- package/src/input/commands/worktree-runtime.ts +6 -6
- package/src/input/composer-capture.ts +5 -5
- package/src/input/concealed-input.ts +2 -2
- package/src/input/config-modal-types.ts +16 -16
- package/src/input/config-modal.ts +30 -30
- package/src/input/daemon-owned-settings-descriptions.ts +4 -4
- package/src/input/delete-key-policy.ts +1 -1
- package/src/input/exec-env-scrub-config.ts +7 -7
- package/src/input/feature-unit-layout.ts +5 -5
- package/src/input/feed-context-factory.ts +38 -38
- package/src/input/file-picker.ts +1 -1
- package/src/input/handler-command-route.ts +2 -2
- package/src/input/handler-content-actions.ts +8 -8
- package/src/input/handler-feed-routes.ts +13 -13
- package/src/input/handler-feed.ts +31 -31
- package/src/input/handler-interactions.ts +2 -2
- package/src/input/handler-modal-routes.ts +13 -13
- package/src/input/handler-modal-stack.ts +1 -1
- package/src/input/handler-modal-token-routes.ts +1 -1
- package/src/input/handler-onboarding-daemon-adopt.ts +6 -6
- package/src/input/handler-picker-routes.ts +7 -7
- package/src/input/handler-prompt-buffer.ts +1 -1
- package/src/input/handler-shortcuts.ts +12 -12
- package/src/input/handler-types.ts +3 -3
- package/src/input/handler-ui-state.ts +1 -1
- package/src/input/handler.ts +9 -9
- package/src/input/input-history.ts +1 -1
- package/src/input/keybindings.ts +13 -13
- package/src/input/kill-ring.ts +7 -11
- package/src/input/model-picker-filter.ts +3 -3
- package/src/input/model-picker-items.ts +5 -5
- package/src/input/model-picker-types.ts +2 -2
- package/src/input/model-picker.ts +18 -18
- package/src/input/onboarding/onboarding-feature-units.ts +9 -13
- package/src/input/onboarding/onboarding-provider-key-fields.ts +3 -3
- package/src/input/onboarding/onboarding-runtime-status.ts +3 -3
- package/src/input/onboarding/onboarding-wizard-apply.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-cloudflare-step.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-constants.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +4 -4
- package/src/input/onboarding/onboarding-wizard-network-adopt.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-steps.ts +2 -2
- package/src/input/panel-integration-actions.ts +3 -3
- package/src/input/panel-mouse-geometry.ts +1 -1
- package/src/input/panel-paste-flood-guard.ts +9 -9
- package/src/input/payments-config.ts +15 -15
- package/src/input/profile-picker-modal.ts +1 -1
- package/src/input/provider-key-intake.ts +9 -9
- package/src/input/relay-settings-descriptions.ts +3 -3
- package/src/input/sandbox-exec-config.ts +9 -9
- package/src/input/search.ts +18 -18
- package/src/input/selection-modal-queue.ts +10 -10
- package/src/input/selection-modal.ts +2 -2
- package/src/input/session-picker-modal.ts +7 -7
- package/src/input/settings-modal-activation.ts +1 -1
- package/src/input/settings-modal-adjustment.ts +2 -2
- package/src/input/settings-modal-commit.ts +6 -6
- package/src/input/settings-modal-connections.ts +2 -2
- package/src/input/settings-modal-data.ts +29 -29
- package/src/input/settings-modal-mutations.ts +7 -7
- package/src/input/settings-modal-reset.ts +3 -3
- package/src/input/settings-modal-search.ts +6 -6
- package/src/input/settings-modal-secrets.ts +3 -3
- package/src/input/settings-modal-types.ts +16 -16
- package/src/input/settings-modal.ts +4 -4
- package/src/input/voice-local-settings.ts +3 -3
- package/src/input/worktree-setup-config.ts +8 -8
- package/src/main.ts +15 -15
- package/src/panels/agent-inspector-shared.ts +5 -5
- package/src/panels/base-panel.ts +3 -3
- package/src/panels/builtin/agent.ts +3 -3
- package/src/panels/builtin/development.ts +4 -4
- package/src/panels/builtin/knowledge.ts +1 -1
- package/src/panels/builtin/operations.ts +12 -12
- package/src/panels/builtin/session.ts +8 -8
- package/src/panels/builtin/shared.ts +6 -6
- package/src/panels/builtin-modals.ts +8 -8
- package/src/panels/confirm-state.ts +5 -5
- package/src/panels/cost-tracker-panel.ts +22 -22
- package/src/panels/diff-panel.ts +20 -20
- package/src/panels/diff-review-model.ts +5 -5
- package/src/panels/diff-review-panel.ts +5 -5
- package/src/panels/eval-registry.ts +2 -2
- package/src/panels/expandable-list-panel.ts +5 -5
- package/src/panels/fleet-acts.ts +20 -20
- package/src/panels/fleet-deep-link.ts +5 -5
- package/src/panels/fleet-gateway.ts +12 -12
- package/src/panels/fleet-observed-render.ts +11 -11
- package/src/panels/fleet-panel-format.ts +14 -14
- package/src/panels/fleet-panel-worktree-detail.ts +8 -8
- package/src/panels/fleet-panel.ts +34 -34
- package/src/panels/fleet-read-model.ts +49 -49
- package/src/panels/fleet-spawn.ts +15 -15
- package/src/panels/fleet-steer.ts +7 -7
- package/src/panels/fleet-stop.ts +5 -5
- package/src/panels/fleet-tabs.ts +14 -14
- package/src/panels/fleet-transcript.ts +26 -26
- package/src/panels/git-panel.ts +8 -8
- package/src/panels/hosted-session-feed.ts +13 -13
- package/src/panels/hosted-session-panel.ts +7 -7
- package/src/panels/index.ts +1 -1
- package/src/panels/local-auth-panel.ts +15 -15
- package/src/panels/memory-consolidation-gateway.ts +8 -8
- package/src/panels/modals/devices-modal.ts +8 -8
- package/src/panels/modals/hooks-modal.ts +1 -1
- package/src/panels/modals/keybindings-modal.ts +5 -5
- package/src/panels/modals/knowledge-modal.ts +2 -2
- package/src/panels/modals/local-auth-modal.ts +4 -4
- package/src/panels/modals/marketplace-modal.ts +3 -3
- package/src/panels/modals/memory-modal.ts +19 -19
- package/src/panels/modals/modal-surface-helpers.ts +1 -1
- package/src/panels/modals/modal-theme.ts +3 -3
- package/src/panels/modals/pairing-modal.ts +19 -19
- package/src/panels/modals/planning-modal.ts +4 -4
- package/src/panels/modals/plugins-modal.ts +1 -1
- package/src/panels/modals/policy-modal.ts +4 -4
- package/src/panels/modals/provider-health-modal.ts +1 -1
- package/src/panels/modals/remote-modal.ts +1 -1
- package/src/panels/modals/sandbox-modal.ts +2 -2
- package/src/panels/modals/security-modal.ts +4 -4
- package/src/panels/modals/services-modal.ts +1 -1
- package/src/panels/modals/work-plan-modal.ts +4 -4
- package/src/panels/notifications-feed.ts +6 -6
- package/src/panels/notifications-panel.ts +6 -6
- package/src/panels/panel-confirm-overlay.ts +4 -4
- package/src/panels/panel-manager.ts +13 -13
- package/src/panels/plugins-panel.ts +6 -6
- package/src/panels/polish-core.ts +2 -2
- package/src/panels/polish-tables.ts +2 -2
- package/src/panels/polish.ts +1 -1
- package/src/panels/project-planning-answer-actions.ts +3 -3
- package/src/panels/scrollable-list-panel.ts +15 -15
- package/src/panels/search-focus.ts +1 -1
- package/src/panels/session-maintenance.ts +1 -1
- package/src/panels/skills-panel.ts +3 -3
- package/src/panels/token-budget-panel.ts +11 -11
- package/src/panels/types.ts +14 -14
- package/src/panels/workstream-graph-render.ts +5 -5
- package/src/panels/wrfc-panel-format.ts +1 -1
- package/src/permissions/broker-approval-card.ts +13 -13
- package/src/permissions/hunk-selection.ts +13 -13
- package/src/permissions/prompt.ts +22 -22
- package/src/permissions/sandbox-exec-gate.ts +5 -5
- package/src/providers/provider-classification.ts +1 -1
- package/src/providers/reasoning-effort-surface.ts +12 -12
- package/src/renderer/ansi-sanitize.ts +5 -6
- package/src/renderer/autocomplete-overlay.ts +5 -5
- package/src/renderer/block-actions-overlay.ts +1 -1
- package/src/renderer/bookmark-modal.ts +1 -1
- package/src/renderer/code-block.ts +2 -2
- package/src/renderer/compaction-history-modal.ts +4 -4
- package/src/renderer/compaction-preview.ts +5 -5
- package/src/renderer/compaction-quality.ts +5 -5
- package/src/renderer/composer-fragments.ts +6 -6
- package/src/renderer/compositor.ts +9 -9
- package/src/renderer/config-modal.ts +3 -3
- package/src/renderer/context-inspector.ts +1 -1
- package/src/renderer/context-status-hint.ts +10 -10
- package/src/renderer/conversation-layout.ts +2 -2
- package/src/renderer/conversation-overlays.ts +2 -2
- package/src/renderer/conversation-surface.ts +6 -6
- package/src/renderer/diff.ts +4 -4
- package/src/renderer/fleet-tab-strip.ts +2 -2
- package/src/renderer/footer-tips.ts +4 -4
- package/src/renderer/fullscreen-primitives.ts +1 -1
- package/src/renderer/git-status.ts +5 -5
- package/src/renderer/header-line.ts +5 -5
- package/src/renderer/help-overlay.ts +5 -5
- package/src/renderer/hint-grammar.ts +2 -2
- package/src/renderer/layout.ts +1 -1
- package/src/renderer/markdown-inline.ts +3 -3
- package/src/renderer/markdown-table.ts +7 -7
- package/src/renderer/modal-factory.ts +3 -3
- package/src/renderer/model-picker-overlay.ts +2 -2
- package/src/renderer/model-workspace.ts +7 -7
- package/src/renderer/onboarding/onboarding-wizard.ts +1 -1
- package/src/renderer/overlay-box.ts +1 -1
- package/src/renderer/panel-composite.ts +5 -5
- package/src/renderer/panel-workspace-bar.ts +1 -1
- package/src/renderer/process-indicator.ts +8 -8
- package/src/renderer/profile-picker-modal.ts +3 -3
- package/src/renderer/prompt-content-width.ts +1 -1
- package/src/renderer/search-overlay.ts +3 -3
- package/src/renderer/selection-modal-overlay.ts +6 -6
- package/src/renderer/semantic-diff.ts +6 -7
- package/src/renderer/session-picker-modal.ts +24 -24
- package/src/renderer/settings-modal-connections.ts +3 -3
- package/src/renderer/settings-modal-helpers.ts +16 -16
- package/src/renderer/settings-modal.ts +10 -10
- package/src/renderer/shell-surface.ts +8 -8
- package/src/renderer/status-glyphs.ts +6 -6
- package/src/renderer/syntax-highlighter.ts +2 -3
- package/src/renderer/system-message.ts +3 -3
- package/src/renderer/tab-strip.ts +2 -2
- package/src/renderer/term-caps.ts +12 -12
- package/src/renderer/terminal-bg-probe.ts +10 -10
- package/src/renderer/terminal-escapes.ts +1 -1
- package/src/renderer/theme-mode-config.ts +3 -3
- package/src/renderer/theme.ts +34 -34
- package/src/renderer/thinking.ts +1 -1
- package/src/renderer/tool-call.ts +5 -5
- package/src/renderer/tool-result-expanded-lines.ts +3 -3
- package/src/renderer/tool-result-summary.ts +6 -6
- package/src/renderer/turn-injection.ts +9 -9
- package/src/renderer/ui-factory.ts +33 -33
- package/src/renderer/ui-primitives.ts +4 -4
- package/src/runtime/bootstrap-command-parts.ts +3 -3
- package/src/runtime/bootstrap-core.ts +21 -21
- package/src/runtime/bootstrap-hook-bridge.ts +8 -8
- package/src/runtime/bootstrap-shell.ts +9 -9
- package/src/runtime/bootstrap.ts +16 -16
- package/src/runtime/client/approval-updates.ts +3 -3
- package/src/runtime/client/build-floors.ts +7 -7
- package/src/runtime/client/daemon-attach-handshake.ts +5 -5
- package/src/runtime/client/fleet-union.ts +7 -7
- package/src/runtime/client/host-service-status.ts +2 -2
- package/src/runtime/client/hosted-exit.ts +4 -4
- package/src/runtime/client/hosted-roster.ts +4 -4
- package/src/runtime/client/hosted-session-stream.ts +5 -5
- package/src/runtime/client/hosted-sessions.ts +8 -8
- package/src/runtime/client/operator-endpoint.ts +14 -14
- package/src/runtime/client/spine-adoption.ts +8 -8
- package/src/runtime/context-accounting-source.ts +4 -4
- package/src/runtime/context.ts +2 -2
- package/src/runtime/conversation-rewind-port.ts +6 -6
- package/src/runtime/credential-composition.ts +2 -2
- package/src/runtime/daemon-attach-notices.ts +6 -6
- package/src/runtime/diagnostics/panels/index.ts +1 -1
- package/src/runtime/diagnostics/panels/ops.ts +2 -2
- package/src/runtime/disposal-wiring.ts +6 -6
- package/src/runtime/index.ts +11 -11
- package/src/runtime/install-self-check-startup.ts +4 -4
- package/src/runtime/install-self-check.ts +6 -6
- package/src/runtime/interaction-seams.ts +4 -4
- package/src/runtime/knowledge-services.ts +2 -2
- package/src/runtime/legacy-daemon-migration.ts +37 -37
- package/src/runtime/legacy-daemon-reconcile.ts +30 -30
- package/src/runtime/memory-governance-services.ts +3 -3
- package/src/runtime/memory-spine-transport.ts +3 -3
- package/src/runtime/notification-dispatch.ts +4 -4
- package/src/runtime/onboarding/apply.ts +1 -1
- package/src/runtime/onboarding/derivation.ts +1 -1
- package/src/runtime/onboarding/fast-path.ts +7 -7
- package/src/runtime/onboarding/progress.ts +2 -2
- package/src/runtime/onboarding/provider-key-capture.ts +4 -4
- package/src/runtime/onboarding/snapshot.ts +2 -2
- package/src/runtime/onboarding/state.ts +4 -4
- package/src/runtime/onboarding/types.ts +4 -4
- package/src/runtime/orchestrator-core-services.ts +5 -5
- package/src/runtime/path-shadow-startup.ts +3 -3
- package/src/runtime/perf/panel-contracts.ts +1 -1
- package/src/runtime/power-keepawake-remote.ts +6 -6
- package/src/runtime/process-lifecycle.ts +14 -14
- package/src/runtime/provider-fallback.ts +3 -3
- package/src/runtime/recovery-autosave.ts +3 -3
- package/src/runtime/recovery-decisions.ts +19 -19
- package/src/runtime/recovery-offer-wiring.ts +4 -4
- package/src/runtime/recovery-prompt.ts +20 -20
- package/src/runtime/relay-reachability-bridge.ts +3 -3
- package/src/runtime/release-artifacts.ts +1 -1
- package/src/runtime/resume-notice.ts +20 -20
- package/src/runtime/runtime-services-types.ts +20 -20
- package/src/runtime/services.ts +20 -20
- package/src/runtime/session-continuity-hints.ts +1 -1
- package/src/runtime/session-inbound-inputs.ts +12 -12
- package/src/runtime/session-resume-liveness-confirm.ts +4 -4
- package/src/runtime/session-spine-transport.ts +3 -3
- package/src/runtime/store/domains/panels.ts +2 -2
- package/src/runtime/store/domains/ui-perf.ts +2 -2
- package/src/runtime/store/index.ts +1 -1
- package/src/runtime/store/selectors/index.ts +1 -1
- package/src/runtime/store/state.ts +2 -2
- package/src/runtime/ui-services.ts +3 -3
- package/src/runtime/workspace-checkpointing.ts +3 -3
- package/src/runtime/wrfc-persistence.ts +15 -15
- package/src/scripts/process-messages.ts +1 -1
- package/src/shell/blocking-input.ts +9 -9
- package/src/shell/recovery-input-helpers.ts +2 -2
- package/src/shell/retry-affordance.ts +9 -9
- package/src/shell/ui-openers.ts +14 -14
- package/src/shell/voice-capture-shell.ts +3 -3
- package/src/tools/wrfc-agent-guard.ts +4 -4
- package/src/utils/browser.ts +2 -2
- package/src/utils/format-duration.ts +3 -3
- package/src/utils/format-number.ts +2 -2
- package/src/utils/splash-lines.ts +4 -4
- package/src/utils/terminal-width.ts +6 -6
- package/src/verification/verification-ledger.ts +25 -25
- package/src/version.ts +3 -3
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// PanelConfirmOverlay
|
|
2
|
+
// PanelConfirmOverlay, arm a confirm from outside, resolve it inside
|
|
3
3
|
// handleInput().
|
|
4
4
|
//
|
|
5
|
-
// Why this exists: SlashCommand.handler(args, ctx) is a single-shot call
|
|
5
|
+
// Why this exists: SlashCommand.handler(args, ctx) is a single-shot call,
|
|
6
6
|
// there is no "await next keypress" primitive in the command layer. A command
|
|
7
|
-
// that needs a destructive confirm (e.g. /rewind
|
|
7
|
+
// that needs a destructive confirm (e.g. /rewind, checkpoint-runtime.ts) can
|
|
8
8
|
// only resolve its target, open+focus a panel, and arm a pending confirm;
|
|
9
9
|
// the actual y/n/Enter/Esc handling has to live in that panel's
|
|
10
10
|
// handleInput() loop. This wraps the project's canonical ConfirmState<T>
|
|
@@ -24,7 +24,7 @@ export class PanelConfirmOverlay {
|
|
|
24
24
|
private state: ConfirmState<{ id: string }> | null = null;
|
|
25
25
|
private handlers: PanelConfirmOverlayHandlers | null = null;
|
|
26
26
|
|
|
27
|
-
/** @param onChange Called after arm() and after a confirmed/cancelled resolution (not on an absorbed keypress)
|
|
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
28
|
constructor(private readonly onChange: () => void = () => {}) {}
|
|
29
29
|
|
|
30
30
|
/** Arm a confirm/cancel prompt. Caller's handlers run only from handleInput(), never eagerly. */
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// PanelManager
|
|
2
|
+
// PanelManager, central manager for panel lifecycle, navigation, and split
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
|
|
5
5
|
import type { Panel, PanelRegistration, PanelCategory, PanelDeepLinkTarget } from './types.ts';
|
|
6
6
|
export type { PanelDeepLinkTarget } from './types.ts';
|
|
7
7
|
// Type-only, erased at runtime, routed through the `@/` alias (not a relative
|
|
8
8
|
// path) so it stays out of the relative-import graph the architecture
|
|
9
|
-
// cycle-checker walks
|
|
9
|
+
// cycle-checker walks, same discipline as the PanelManager import in types.ts.
|
|
10
10
|
import type { ConfigModalSurface } from '@/input/config-modal-types.ts';
|
|
11
11
|
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
@@ -39,7 +39,7 @@ export class PanelManager {
|
|
|
39
39
|
/**
|
|
40
40
|
* Retired panel id -> modal name (panels migrated to config-modal surfaces).
|
|
41
41
|
* Unlike `aliases` (panel -> panel), a hit here means no panel is ever
|
|
42
|
-
* constructed for this id
|
|
42
|
+
* constructed for this id, `open()` invokes `openModalCallback` instead
|
|
43
43
|
* and returns a sentinel. This map and the open()-time check are the
|
|
44
44
|
* sole mechanism for that redirect.
|
|
45
45
|
*/
|
|
@@ -75,7 +75,7 @@ export class PanelManager {
|
|
|
75
75
|
// panel focus to disagree with workspace visibility (see getFocusTarget).
|
|
76
76
|
private _focusTarget: 'prompt' | 'panel' = 'prompt';
|
|
77
77
|
|
|
78
|
-
// Cache for getWorkspaceTabs()
|
|
78
|
+
// Cache for getWorkspaceTabs(), invalidated on every panel lifecycle event
|
|
79
79
|
private _cachedWorkspaceTabs: readonly WorkspaceTab[] | null = null;
|
|
80
80
|
|
|
81
81
|
// Most-recently-opened panel ids (front = newest), for the picker's "Recent"
|
|
@@ -146,7 +146,7 @@ export class PanelManager {
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
/**
|
|
149
|
-
* The modal name `panelIdOrAlias` redirects to, if any
|
|
149
|
+
* The modal name `panelIdOrAlias` redirects to, if any, lets callers
|
|
150
150
|
* (e.g. the `/panel` command) print "moved to the <name> modal" before or
|
|
151
151
|
* instead of calling open().
|
|
152
152
|
*/
|
|
@@ -173,7 +173,7 @@ export class PanelManager {
|
|
|
173
173
|
|
|
174
174
|
/**
|
|
175
175
|
* Placeholder returned by open() for a modal-redirected id. Never pushed
|
|
176
|
-
* into a pane, never retained, never rendered
|
|
176
|
+
* into a pane, never retained, never rendered, it exists only so open()
|
|
177
177
|
* can keep its non-null `Panel` return type without constructing the real
|
|
178
178
|
* (deleted) panel view. `name` carries the modal name so a caller that
|
|
179
179
|
* inspects the returned panel's `name` (rather than calling
|
|
@@ -221,7 +221,7 @@ export class PanelManager {
|
|
|
221
221
|
}
|
|
222
222
|
|
|
223
223
|
// -------------------------------------------------------------------------
|
|
224
|
-
// Panel lifecycle
|
|
224
|
+
// Panel lifecycle, operates on a specific pane (defaults to focused)
|
|
225
225
|
// -------------------------------------------------------------------------
|
|
226
226
|
|
|
227
227
|
/** Invalidate the workspace tab cache. Call on every panel lifecycle mutation. */
|
|
@@ -278,7 +278,7 @@ export class PanelManager {
|
|
|
278
278
|
/**
|
|
279
279
|
* Hand an optional deep-link target (item 4) to a panel that just
|
|
280
280
|
* resolved from open(). Panels without a "node" concept simply don't
|
|
281
|
-
* implement `receiveDeepLink
|
|
281
|
+
* implement `receiveDeepLink`, the call is a no-op via optional chaining.
|
|
282
282
|
*/
|
|
283
283
|
private _deliverDeepLink(panel: Panel, target: PanelDeepLinkTarget | undefined): Panel {
|
|
284
284
|
if (target) panel.receiveDeepLink?.(target);
|
|
@@ -353,7 +353,7 @@ export class PanelManager {
|
|
|
353
353
|
}
|
|
354
354
|
|
|
355
355
|
// -------------------------------------------------------------------------
|
|
356
|
-
// Navigation
|
|
356
|
+
// Navigation, operates on focused pane
|
|
357
357
|
// -------------------------------------------------------------------------
|
|
358
358
|
|
|
359
359
|
nextPanel(): void {
|
|
@@ -456,7 +456,7 @@ export class PanelManager {
|
|
|
456
456
|
|
|
457
457
|
/**
|
|
458
458
|
* Give keyboard focus to the panel workspace. No-op when there is nothing
|
|
459
|
-
* focusable (no visible, non-empty pane with an active panel)
|
|
459
|
+
* focusable (no visible, non-empty pane with an active panel), this is the
|
|
460
460
|
* guard that upholds the focus/visibility invariant on the write path.
|
|
461
461
|
*/
|
|
462
462
|
focusPanels(): void {
|
|
@@ -497,10 +497,10 @@ export class PanelManager {
|
|
|
497
497
|
this.bottomPane.activeIndex = 0;
|
|
498
498
|
} else {
|
|
499
499
|
// Open a predictable default panel in the bottom pane. purge:
|
|
500
|
-
// 'panel-list' was deleted (dead weight over a 5-panel registry
|
|
500
|
+
// 'panel-list' was deleted (dead weight over a 5-panel registry,
|
|
501
501
|
// see the DELETE disposition), so the default is explicitly
|
|
502
502
|
// 'fleet' rather than falling back to registry[0] (whatever
|
|
503
|
-
// registers first, currently 'git'
|
|
503
|
+
// registers first, currently 'git', see risk 5 in the brief).
|
|
504
504
|
const defaultPanel = this._getRegistration('fleet') ?? this.registry[0];
|
|
505
505
|
if (defaultPanel) {
|
|
506
506
|
this.open(defaultPanel.id, 'bottom');
|
|
@@ -606,7 +606,7 @@ export class PanelManager {
|
|
|
606
606
|
toggle(): void {
|
|
607
607
|
this._visible = !this._visible;
|
|
608
608
|
// Auto-open a default panel if toggling visible with nothing open.
|
|
609
|
-
// purge: explicitly 'fleet' rather than registry[0]
|
|
609
|
+
// purge: explicitly 'fleet' rather than registry[0], see the
|
|
610
610
|
// matching comment in toggleBottomPane() above.
|
|
611
611
|
if (this._visible && this.topPane.panels.length === 0 && this.bottomPane.panels.length === 0) {
|
|
612
612
|
const defaultPanel = this._getRegistration('fleet') ?? this.registry[0];
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
type PanelPalette,
|
|
21
21
|
} from './polish.ts';
|
|
22
22
|
|
|
23
|
-
// Base chrome only
|
|
23
|
+
// Base chrome only, title band, state colors, and text tokens all come
|
|
24
24
|
// straight from DEFAULT_PANEL_PALETTE.
|
|
25
25
|
const C = DEFAULT_PANEL_PALETTE;
|
|
26
26
|
|
|
@@ -31,7 +31,7 @@ const C = DEFAULT_PANEL_PALETTE;
|
|
|
31
31
|
* no mutation methods, so the constructor param is widened to also require
|
|
32
32
|
* the handful of `PluginManager` methods this panel actually calls. The real
|
|
33
33
|
* runtime object passed at bootstrap (`services.pluginManager`, a full
|
|
34
|
-
* `PluginManager` instance
|
|
34
|
+
* `PluginManager` instance, see src/runtime/services.ts) already satisfies
|
|
35
35
|
* this widened shape.
|
|
36
36
|
*/
|
|
37
37
|
export type PluginManagerControls = PluginManagerObserver
|
|
@@ -87,7 +87,7 @@ export class PluginsPanel extends ScrollableListPanel<PluginStatus> {
|
|
|
87
87
|
|| plugin.version.toLowerCase().includes(q);
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
// selection is preserved across onActivate
|
|
90
|
+
// selection is preserved across onActivate, BasePanel's default
|
|
91
91
|
// (mark dirty, no index reset) is exactly what we want, so no override.
|
|
92
92
|
|
|
93
93
|
public override onDestroy(): void {
|
|
@@ -95,7 +95,7 @@ export class PluginsPanel extends ScrollableListPanel<PluginStatus> {
|
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
// -------------------------------------------------------------------------
|
|
98
|
-
// Input
|
|
98
|
+
// Input, e=enable, d=disable (confirm), v=verify, q=lift quarantine (confirm)
|
|
99
99
|
// -------------------------------------------------------------------------
|
|
100
100
|
|
|
101
101
|
public handleInput(key: string): boolean {
|
|
@@ -149,7 +149,7 @@ export class PluginsPanel extends ScrollableListPanel<PluginStatus> {
|
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
/**
|
|
152
|
-
* optional one-key capture-to-memory for a quarantined plugin
|
|
152
|
+
* optional one-key capture-to-memory for a quarantined plugin, 'm'
|
|
153
153
|
* dispatches `/recall capture plugin <name>` (recall-capture.ts:146 pattern)
|
|
154
154
|
* instead of requiring the operator to type the command by hand.
|
|
155
155
|
*/
|
|
@@ -273,7 +273,7 @@ export class PluginsPanel extends ScrollableListPanel<PluginStatus> {
|
|
|
273
273
|
return workspace;
|
|
274
274
|
}
|
|
275
275
|
|
|
276
|
-
// Provenance/error posture header
|
|
276
|
+
// Provenance/error posture header, surface trust + quarantine pressure first.
|
|
277
277
|
const quarantined = plugins.filter((p) => p.quarantined).length;
|
|
278
278
|
const untrusted = plugins.filter((p) => p.trustTier === 'untrusted').length;
|
|
279
279
|
const active = plugins.filter((p) => p.active).length;
|
|
@@ -9,7 +9,7 @@ import { activeUiTones, registerThemeRefresh } from '../renderer/theme.ts';
|
|
|
9
9
|
// The leaf foundation of the panel formatting toolkit: both `polish.ts` and
|
|
10
10
|
// `polish-tables.ts` build on these. Kept dependency-free (only grid /
|
|
11
11
|
// terminal-width / ui-primitives) so it never participates in an import cycle.
|
|
12
|
-
// All symbols are re-exported from `polish.ts
|
|
12
|
+
// All symbols are re-exported from `polish.ts`, panels import from there.
|
|
13
13
|
// ---------------------------------------------------------------------------
|
|
14
14
|
|
|
15
15
|
export interface PanelPalette {
|
|
@@ -33,7 +33,7 @@ export interface PanelPalette {
|
|
|
33
33
|
|
|
34
34
|
// Built from the mode-resolved chrome tones (activeUiTones). Because 100+ call
|
|
35
35
|
// sites read this object by reference, mode changes rebuild it IN PLACE via the
|
|
36
|
-
// registered refresher below rather than re-resolving per call
|
|
36
|
+
// registered refresher below rather than re-resolving per call, see theme.ts's
|
|
37
37
|
// active-mode runtime note. This refresher is registered before any panel's
|
|
38
38
|
// extendPalette() runs (panels import polish → polish-core first), so on a mode
|
|
39
39
|
// flip the base is rebuilt before the extended palettes re-merge from it.
|
|
@@ -10,7 +10,7 @@ import type { PanelPalette, StyledPanelSegment } from './polish-core.ts';
|
|
|
10
10
|
// Shared formatting primitives (the toolkit panels standardize on).
|
|
11
11
|
//
|
|
12
12
|
// All are display-width aware (via getDisplayWidth / truncateDisplay) so they
|
|
13
|
-
// stay aligned across emoji, CJK, and other wide characters
|
|
13
|
+
// stay aligned across emoji, CJK, and other wide characters, never hand-roll
|
|
14
14
|
// .slice()/.padEnd() truncation or alignment in panels.
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
16
16
|
|
|
@@ -113,7 +113,7 @@ const STATUS_BADGES: Record<StatusBadgeKind, BadgeSpec> = {
|
|
|
113
113
|
|
|
114
114
|
/**
|
|
115
115
|
* Canonical status badge (glyph + label) with a consistent color per lifecycle
|
|
116
|
-
* state. Returns StyledPanelSegment[]
|
|
116
|
+
* state. Returns StyledPanelSegment[], spread into a buildPanelLine call:
|
|
117
117
|
* buildPanelLine(width, [[' ', C.label], ...buildStatusBadge('running')])
|
|
118
118
|
* Supersedes ad-hoc per-panel status→color maps.
|
|
119
119
|
*/
|
package/src/panels/polish.ts
CHANGED
|
@@ -162,7 +162,7 @@ export function buildSearchInputLine(
|
|
|
162
162
|
/**
|
|
163
163
|
* Build a status pill segment (glyph + label) for use in buildPanelLine.
|
|
164
164
|
*
|
|
165
|
-
* Returns StyledPanelSegment[]
|
|
165
|
+
* Returns StyledPanelSegment[], spread directly into a buildPanelLine segments
|
|
166
166
|
* array:
|
|
167
167
|
* buildPanelLine(width, [[' count ', C.label], ...buildStatusPill('bad', '3')])
|
|
168
168
|
*
|
|
@@ -17,7 +17,7 @@ export interface PlanningAnswerAction {
|
|
|
17
17
|
readonly disabled?: boolean;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
/** SDK placeholder recommendations that carry no real signal
|
|
20
|
+
/** SDK placeholder recommendations that carry no real signal, never surfaced as an answer action. */
|
|
21
21
|
export function isGenericRecommendation(value: string): boolean {
|
|
22
22
|
return /\bdefine the first-pass scope\b/i.test(value)
|
|
23
23
|
|| /\bcreate task records\b/i.test(value)
|
|
@@ -32,12 +32,12 @@ function compactAnswerDetail(text: string): string {
|
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
34
|
* Builds the answer-action list for the current question: keyword-matched
|
|
35
|
-
* canned suggestions first (de-duplicated by normalized answer text
|
|
35
|
+
* canned suggestions first (de-duplicated by normalized answer text, a
|
|
36
36
|
* question that matches more than one keyword category, e.g. scope +
|
|
37
37
|
* recommendedAnswer echoing one of the scope answers verbatim, must not show
|
|
38
38
|
* the same suggested answer twice), then the fixed ask-narrower/custom actions.
|
|
39
39
|
*
|
|
40
|
-
* dismissing planning is no longer a pseudo answer-row
|
|
40
|
+
* dismissing planning is no longer a pseudo answer-row, it is a
|
|
41
41
|
* first-class confirmed modal action (the `d` key), so no dismiss row is
|
|
42
42
|
* produced here. A canned answer records against the current open question via
|
|
43
43
|
* /plan answer; the custom row's free-form text is submitted to chat.
|
|
@@ -22,15 +22,15 @@ import { GLYPHS } from '../renderer/ui-primitives.ts';
|
|
|
22
22
|
* Base class for all list-based panels that require scroll/cursor navigation.
|
|
23
23
|
*
|
|
24
24
|
* Subclasses implement:
|
|
25
|
-
* - `getItems()
|
|
26
|
-
* - `renderItem(item, index, selected, width)
|
|
25
|
+
* - `getItems()`, the ordered list of items to display
|
|
26
|
+
* - `renderItem(item, index, selected, width)`, one `Line` per item
|
|
27
27
|
*
|
|
28
28
|
* Optionally override:
|
|
29
|
-
* - `getEmptyStateMessage()` / `getEmptyStateActions()
|
|
30
|
-
* - `onSelect(item)
|
|
31
|
-
* - `onAction(item, action)
|
|
32
|
-
* - `getPalette()
|
|
33
|
-
* - `getPageSize()
|
|
29
|
+
* - `getEmptyStateMessage()` / `getEmptyStateActions()`, empty-state copy
|
|
30
|
+
* - `onSelect(item)`, called when the user presses Enter
|
|
31
|
+
* - `onAction(item, action)`, for secondary key bindings
|
|
32
|
+
* - `getPalette()`, colour palette (defaults to `DEFAULT_PANEL_PALETTE`)
|
|
33
|
+
* - `getPageSize()`, rows per page-up/page-down (default 10)
|
|
34
34
|
*
|
|
35
35
|
* `renderList()` produces the full `Line[]` output that a trivial panel's
|
|
36
36
|
* `render()` can return directly:
|
|
@@ -71,7 +71,7 @@ export abstract class ScrollableListPanel<T> extends BasePanel {
|
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
/**
|
|
74
|
-
* The list after applying the active filter
|
|
74
|
+
* The list after applying the active filter, used for both display and
|
|
75
75
|
* navigation. Identical to `getItems()` unless a filter is enabled and a
|
|
76
76
|
* non-empty query is set, so existing panels are unaffected.
|
|
77
77
|
*/
|
|
@@ -84,12 +84,12 @@ export abstract class ScrollableListPanel<T> extends BasePanel {
|
|
|
84
84
|
|
|
85
85
|
/**
|
|
86
86
|
* The item currently under the cursor, resolved against the FILTERED list
|
|
87
|
-
* that navigation actually moves over (`getVisibleItems()`)
|
|
87
|
+
* that navigation actually moves over (`getVisibleItems()`), never the raw
|
|
88
88
|
* `getItems()` source.
|
|
89
89
|
*
|
|
90
90
|
* Subclasses MUST read the selected row through this method (or, when a
|
|
91
91
|
* function also needs the list for counts/windows, through a function-scope
|
|
92
|
-
* `const visible = this.getVisibleItems()` local
|
|
92
|
+
* `const visible = this.getVisibleItems()` local, indexing that local, never
|
|
93
93
|
* the raw source). Indexing a raw item array (`this.rows`, `this.entries`,
|
|
94
94
|
* `getItems()`, …) with `this.selectedIndex` silently returns the wrong row
|
|
95
95
|
* whenever a filter is active, because `selectedIndex` is an offset into the
|
|
@@ -126,7 +126,7 @@ export abstract class ScrollableListPanel<T> extends BasePanel {
|
|
|
126
126
|
this.needsRender = true;
|
|
127
127
|
return true;
|
|
128
128
|
}
|
|
129
|
-
// Arrow/paging keys navigate the filtered list
|
|
129
|
+
// Arrow/paging keys navigate the filtered list, fall through.
|
|
130
130
|
if (key === 'up' || key === 'down' || key === 'pageup' || key === 'pagedown' || key === 'home' || key === 'end') {
|
|
131
131
|
return null;
|
|
132
132
|
}
|
|
@@ -172,7 +172,7 @@ export abstract class ScrollableListPanel<T> extends BasePanel {
|
|
|
172
172
|
}
|
|
173
173
|
|
|
174
174
|
// -------------------------------------------------------------------------
|
|
175
|
-
// Abstract
|
|
175
|
+
// Abstract, subclasses must implement
|
|
176
176
|
// -------------------------------------------------------------------------
|
|
177
177
|
|
|
178
178
|
/** Return the full ordered list of items to display. */
|
|
@@ -224,7 +224,7 @@ export abstract class ScrollableListPanel<T> extends BasePanel {
|
|
|
224
224
|
}
|
|
225
225
|
|
|
226
226
|
// -------------------------------------------------------------------------
|
|
227
|
-
// Navigation
|
|
227
|
+
// Navigation, consistent across ALL panels
|
|
228
228
|
// -------------------------------------------------------------------------
|
|
229
229
|
|
|
230
230
|
/**
|
|
@@ -245,7 +245,7 @@ export abstract class ScrollableListPanel<T> extends BasePanel {
|
|
|
245
245
|
/**
|
|
246
246
|
* The `/`-to-filter buffer wants every character of a burst (paste, or a
|
|
247
247
|
* fast-typed query landing in one input.feed() call), same as it always
|
|
248
|
-
* has
|
|
248
|
+
* has, see the interface doc on `Panel.isCapturingTextBurst`.
|
|
249
249
|
*/
|
|
250
250
|
isCapturingTextBurst(): boolean {
|
|
251
251
|
return this.filterEnabled && this.filterActive;
|
|
@@ -348,7 +348,7 @@ export abstract class ScrollableListPanel<T> extends BasePanel {
|
|
|
348
348
|
}
|
|
349
349
|
|
|
350
350
|
// -------------------------------------------------------------------------
|
|
351
|
-
// Render helper
|
|
351
|
+
// Render helper, the main convenience entry point
|
|
352
352
|
// -------------------------------------------------------------------------
|
|
353
353
|
|
|
354
354
|
/**
|
|
@@ -20,7 +20,7 @@ export function getPanelSearchFocusTransition(
|
|
|
20
20
|
// Panel search filters are end-anchored (no moveable cursor).
|
|
21
21
|
// Per the delete-key policy (src/input/delete-key-policy.ts):
|
|
22
22
|
// 'backspace' removes the last character.
|
|
23
|
-
// 'delete' is a no-op
|
|
23
|
+
// 'delete' is a no-op, there is no cursor, so forward-delete is meaningless.
|
|
24
24
|
export function isPanelSearchBackspace(key: string): boolean {
|
|
25
25
|
return isTextBackspace(key);
|
|
26
26
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* The canonical evaluator is the SDK version exported from @/runtime/index.ts
|
|
5
5
|
* (via operations.evaluateSessionMaintenance), which reads from configManager.
|
|
6
|
-
* Import the evaluator from there
|
|
6
|
+
* Import the evaluator from there, this module provides only the shared
|
|
7
7
|
* Panel* type surface used across TUI panels and tests; it intentionally does
|
|
8
8
|
* not re-implement the evaluator.
|
|
9
9
|
*/
|
|
@@ -34,7 +34,7 @@ export interface SkillRecord {
|
|
|
34
34
|
frontmatter: Record<string, string>;
|
|
35
35
|
/**
|
|
36
36
|
* Set when this skill's file lives under an installed ecosystem-marketplace
|
|
37
|
-
* receipt's targetPath
|
|
37
|
+
* receipt's targetPath, the receipt's provenance summary (e.g. curated
|
|
38
38
|
* source / signature info), so marketplace-installed skills read as such
|
|
39
39
|
* instead of looking identical to hand-authored ones.
|
|
40
40
|
*/
|
|
@@ -370,7 +370,7 @@ export class SkillsPanel extends ScrollableListPanel<SkillRecord> {
|
|
|
370
370
|
// (the purge): Enter used to open the skill's markdown source in the
|
|
371
371
|
// preview panel via a staged pendingOpenPreview flag + handlePanelIntegrationAction
|
|
372
372
|
// (same pattern diff-panel.ts used). 'preview' is DELETE-disposition with no
|
|
373
|
-
// successor surface (no file-picker-overlay preview to repoint to either
|
|
373
|
+
// successor surface (no file-picker-overlay preview to repoint to either,
|
|
374
374
|
// verified), so that cross-panel jump was removed rather than repointed;
|
|
375
375
|
// Enter is currently a no-op on this list (browse-only until migrates
|
|
376
376
|
// Skills to a modal).
|
|
@@ -392,7 +392,7 @@ export class SkillsPanel extends ScrollableListPanel<SkillRecord> {
|
|
|
392
392
|
}
|
|
393
393
|
if (confirmResult === 'absorbed') return true;
|
|
394
394
|
|
|
395
|
-
// I1: 'd' prompts delete confirmation
|
|
395
|
+
// I1: 'd' prompts delete confirmation, only outside filter mode, so 'd'
|
|
396
396
|
// remains typeable into the filter query while it is active (// converged modal '/' filter coexists with single-letter action keys).
|
|
397
397
|
if (!this.filterActive && key === 'd') {
|
|
398
398
|
const skill = this.getSelectedItem();
|
|
@@ -43,7 +43,7 @@ interface TurnUsage {
|
|
|
43
43
|
// ---------------------------------------------------------------------------
|
|
44
44
|
|
|
45
45
|
const C = extendPalette(DEFAULT_PANEL_PALETTE, {
|
|
46
|
-
// Token data-series colors (input/output/cache)
|
|
46
|
+
// Token data-series colors (input/output/cache), categorical, no shared equivalent
|
|
47
47
|
input: '#00ffff',
|
|
48
48
|
output: '#d000ff',
|
|
49
49
|
cacheRead: '#00d700',
|
|
@@ -96,11 +96,11 @@ function fmtTok(n: number): string {
|
|
|
96
96
|
export class TokenBudgetPanel extends BasePanel {
|
|
97
97
|
/** Snapshot of cumulative usage from the Orchestrator after each turn. */
|
|
98
98
|
private sessionUsage = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
|
|
99
|
-
/** lastInputTokens from the Orchestrator
|
|
99
|
+
/** lastInputTokens from the Orchestrator, current context window occupancy. */
|
|
100
100
|
private lastInputTokens = 0;
|
|
101
101
|
/** Context window size from the model config (0 = unknown). */
|
|
102
102
|
private contextWindow = 0;
|
|
103
|
-
/** Per-turn snapshots
|
|
103
|
+
/** Per-turn snapshots, at most MAX_TURN_HISTORY entries. */
|
|
104
104
|
private turnHistory: TurnUsage[] = [];
|
|
105
105
|
/** Previous cumulative snapshot to compute per-turn delta. */
|
|
106
106
|
private prevCumulative = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
|
|
@@ -115,7 +115,7 @@ export class TokenBudgetPanel extends BasePanel {
|
|
|
115
115
|
private readonly configManager: Pick<ConfigManager, 'get'>;
|
|
116
116
|
private readonly requestRender: () => void;
|
|
117
117
|
|
|
118
|
-
/** Turn-event bus subscriptions
|
|
118
|
+
/** Turn-event bus subscriptions, absorbed from ContextVisualizerPanel. */
|
|
119
119
|
private unsubs: Array<() => void> = [];
|
|
120
120
|
|
|
121
121
|
/** Manual scroll cursor into turnHistory; -1 = auto-follow the latest turn. */
|
|
@@ -261,7 +261,7 @@ export class TokenBudgetPanel extends BasePanel {
|
|
|
261
261
|
}
|
|
262
262
|
|
|
263
263
|
handleInput(key: string): boolean {
|
|
264
|
-
// Confirmation dialog
|
|
264
|
+
// Confirmation dialog, use the shared handleConfirmInput for y/n/Esc UX
|
|
265
265
|
const confirmResult = handleConfirmInput(this.confirm, key);
|
|
266
266
|
if (confirmResult === 'confirmed') {
|
|
267
267
|
this.confirm = null;
|
|
@@ -462,11 +462,11 @@ export class TokenBudgetPanel extends BasePanel {
|
|
|
462
462
|
const nextStep = status.nextSteps[0]!;
|
|
463
463
|
// when the recommended next step is /compact and C is armed
|
|
464
464
|
// (see handleInput's elevated-only C branch and the footer hint),
|
|
465
|
-
// advertise the key instead of the command
|
|
465
|
+
// advertise the key instead of the command, pressing C already
|
|
466
466
|
// dispatches it for real, so printing '/compact' here was a redundant
|
|
467
467
|
// action substitute.
|
|
468
468
|
if (nextStep === '/compact' && this._pressureElevated()) {
|
|
469
|
-
lines.push(buildGuidanceLine(width, 'C', 'compact context now
|
|
469
|
+
lines.push(buildGuidanceLine(width, 'C', 'compact context now: the recommended next maintenance action', DEFAULT_PANEL_PALETTE));
|
|
470
470
|
} else {
|
|
471
471
|
lines.push(buildGuidanceLine(width, nextStep, 'open the next maintenance action directly', DEFAULT_PANEL_PALETTE));
|
|
472
472
|
}
|
|
@@ -569,14 +569,14 @@ export class TokenBudgetPanel extends BasePanel {
|
|
|
569
569
|
const suffix = ` ${fmtTok(this.lastInputTokens)}/${fmtTok(this.contextWindow)} (${pctInt}%)${warnSuffix}`;
|
|
570
570
|
const BAR_W = Math.max(8, width - label.length - suffix.length - 2);
|
|
571
571
|
const filled = Math.round(pct * BAR_W);
|
|
572
|
-
// Context fill is the headline metric
|
|
572
|
+
// Context fill is the headline metric, render it with the shared meter
|
|
573
573
|
// primitive so the bar glyphs and width handling match every other panel.
|
|
574
574
|
lines.push(buildMeterLine(width, filled, BAR_W,
|
|
575
575
|
{ filled: barColor, empty: C.barBg, label: C.label },
|
|
576
576
|
{ prefix: label, suffix },
|
|
577
577
|
));
|
|
578
578
|
|
|
579
|
-
// Pressure pill
|
|
579
|
+
// Pressure pill, absorbed from ContextVisualizerPanel's headline indicator.
|
|
580
580
|
const overLimit = this.contextWindow > 0 && this.lastInputTokens > this.contextWindow;
|
|
581
581
|
const pressureState = overLimit || pct >= WARN_RED ? 'bad' : pct >= WARN_YELLOW ? 'warn' : 'good';
|
|
582
582
|
const pressureLabel = overLimit ? 'over limit' : pct >= WARN_RED ? 'critical' : pct >= WARN_YELLOW ? 'elevated' : 'healthy';
|
|
@@ -612,7 +612,7 @@ export class TokenBudgetPanel extends BasePanel {
|
|
|
612
612
|
]));
|
|
613
613
|
}
|
|
614
614
|
|
|
615
|
-
// Inline cost estimate
|
|
615
|
+
// Inline cost estimate, absorbed pricing wiring (cost-utils.ts), shown
|
|
616
616
|
// whenever the active model id is known.
|
|
617
617
|
if (this.getCurrentModelId) {
|
|
618
618
|
const modelId = this.getCurrentModelId();
|
|
@@ -628,7 +628,7 @@ export class TokenBudgetPanel extends BasePanel {
|
|
|
628
628
|
? [{ text: ` (${source})`, fg: C.dim }]
|
|
629
629
|
: priced
|
|
630
630
|
? []
|
|
631
|
-
: [{ text: '
|
|
631
|
+
: [{ text: ': set it with p on the cost panel', fg: C.dim }]),
|
|
632
632
|
]));
|
|
633
633
|
}
|
|
634
634
|
|
package/src/panels/types.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { StatusState } from '../renderer/status-glyphs.ts';
|
|
|
3
3
|
import type { ComponentResourceContract, ComponentHealthState } from '../runtime/perf/panel-contracts.ts';
|
|
4
4
|
// Routed through the `@/` alias (not `./panel-manager.ts`) so this foundational
|
|
5
5
|
// types module stays a leaf in the relative-import graph the architecture
|
|
6
|
-
// cycle-checker walks. Type-only, erased at runtime
|
|
6
|
+
// cycle-checker walks. Type-only, erased at runtime, no real dependency edge.
|
|
7
7
|
import type { PanelManager } from '@/panels/panel-manager.ts';
|
|
8
8
|
|
|
9
9
|
/**
|
|
@@ -20,7 +20,7 @@ export interface PanelIntegrationContext {
|
|
|
20
20
|
* A cross-panel deep-link target (item 4): a specific node a panel
|
|
21
21
|
* should select + reveal when opened via `PanelManager.open(id, pane, target)`,
|
|
22
22
|
* e.g. a Fleet tree node keyed by its process id and (optionally) its
|
|
23
|
-
* ProcessKind for disambiguation. Panel-agnostic on purpose
|
|
23
|
+
* ProcessKind for disambiguation. Panel-agnostic on purpose, only panels that
|
|
24
24
|
* have a "node" concept implement `Panel.receiveDeepLink`.
|
|
25
25
|
*/
|
|
26
26
|
export interface PanelDeepLinkTarget {
|
|
@@ -56,7 +56,7 @@ export type NamedKey =
|
|
|
56
56
|
export type KeyName = NamedKey | (string & {});
|
|
57
57
|
|
|
58
58
|
/**
|
|
59
|
-
* the former single 'monitoring' bucket held 33 panels pre-merge
|
|
59
|
+
* the former single 'monitoring' bucket held 33 panels pre-merge,
|
|
60
60
|
* too coarse for the picker to be useful and too large for any one operator
|
|
61
61
|
* mental model. Split into named operator domains so each category holds a
|
|
62
62
|
* bounded, coherent set (no category may exceed 10 registrations):
|
|
@@ -102,10 +102,10 @@ export interface Panel {
|
|
|
102
102
|
/** Called by the compositor after a successful render to clear the dirty flag. */
|
|
103
103
|
markRendered(): void;
|
|
104
104
|
|
|
105
|
-
// Resource contract (optional
|
|
105
|
+
// Resource contract (optional, panels may declare resource requirements)
|
|
106
106
|
resourceContract?: Readonly<ComponentResourceContract>;
|
|
107
107
|
|
|
108
|
-
// Health state (optional
|
|
108
|
+
// Health state (optional, set by ComponentHealthMonitor when panel is registered)
|
|
109
109
|
healthState?: Readonly<ComponentHealthState>;
|
|
110
110
|
|
|
111
111
|
// Input (optional)
|
|
@@ -114,8 +114,8 @@ export interface Panel {
|
|
|
114
114
|
/**
|
|
115
115
|
* Optional: report `true` while this panel has an active inline text
|
|
116
116
|
* capture (e.g. a `/`-to-filter or search buffer) that deliberately wants
|
|
117
|
-
* every character of a burst
|
|
118
|
-
* enough to land in one `input.feed()` call
|
|
117
|
+
* every character of a burst, paste, or several keystrokes typed fast
|
|
118
|
+
* enough to land in one `input.feed()` call, delivered to `handleInput`
|
|
119
119
|
* one at a time, same as it always has. When this returns `false` or is
|
|
120
120
|
* not implemented, the input router treats a printable burst as never a
|
|
121
121
|
* deliberate single-key panel hotkey and routes it to the composer
|
|
@@ -141,11 +141,11 @@ export interface Panel {
|
|
|
141
141
|
/**
|
|
142
142
|
* Optional: called by the global Ctrl+X (`panel-close`) shortcut BEFORE it
|
|
143
143
|
* closes this panel (handler-shortcuts.ts). Return `true` to consume
|
|
144
|
-
* Ctrl+X for an in-panel action instead
|
|
144
|
+
* Ctrl+X for an in-panel action instead, e.g. FleetPanel (session
|
|
145
145
|
* tabs) detaches its active tab and leaves the panel open. Return `false`
|
|
146
146
|
* (or omit this hook) to fall through to the ordinary close behavior.
|
|
147
147
|
* Ctrl+X never reaches a panel's own `handleInput` (ctrl/meta combos are
|
|
148
|
-
* intercepted earlier
|
|
148
|
+
* intercepted earlier, see handlePanelFocusToken in
|
|
149
149
|
* src/input/handler-feed-routes.ts), so this is the one seam a panel has
|
|
150
150
|
* to intervene before the global shortcut acts.
|
|
151
151
|
*/
|
|
@@ -153,12 +153,12 @@ export interface Panel {
|
|
|
153
153
|
|
|
154
154
|
/**
|
|
155
155
|
* Optional: consume a deep-link target handed in by `PanelManager.open(id,
|
|
156
|
-
* pane, target)` (item 4)
|
|
156
|
+
* pane, target)` (item 4), select + reveal the matching node on the
|
|
157
157
|
* panel's next snapshot. A panel without a "node" concept simply doesn't
|
|
158
158
|
* implement this (the call is a no-op via optional chaining in
|
|
159
159
|
* PanelManager). A panel that DOES implement it owns its own honest
|
|
160
160
|
* "not found" surface (e.g. FleetPanel.setError) when the target no longer
|
|
161
|
-
* resolves
|
|
161
|
+
* resolves, PanelManager has no transcript/print seam to report on its
|
|
162
162
|
* behalf.
|
|
163
163
|
*/
|
|
164
164
|
receiveDeepLink?(target: PanelDeepLinkTarget): void;
|
|
@@ -168,19 +168,19 @@ export interface PanelRegistration extends Pick<Panel, 'id' | 'name' | 'icon' |
|
|
|
168
168
|
factory: () => Panel;
|
|
169
169
|
description: string;
|
|
170
170
|
/**
|
|
171
|
-
* lifecycle flags. `preload` and `retainOnClose` are independent
|
|
171
|
+
* lifecycle flags. `preload` and `retainOnClose` are independent,
|
|
172
172
|
* a panel can eagerly instantiate without being kept alive on close, or be
|
|
173
173
|
* kept alive on close without eager bootstrap instantiation. They happened
|
|
174
174
|
* to be identical for all builtin panels before this split (both driven by
|
|
175
175
|
* a single `preload: true`); that existing 10-panel retained set is
|
|
176
176
|
* preserved unchanged by giving each of those 10 registrations both flags.
|
|
177
177
|
*
|
|
178
|
-
* - `preload
|
|
178
|
+
* - `preload`, instantiate this panel during `PanelManager.prewarmRegistered()`
|
|
179
179
|
* (called once at bootstrap) so its factory runs and it starts
|
|
180
180
|
* accumulating background data (subscriptions, timers) before the user
|
|
181
181
|
* ever opens the workspace. Panels without `preload` are instantiated
|
|
182
182
|
* lazily on first `open()`.
|
|
183
|
-
* - `retainOnClose
|
|
183
|
+
* - `retainOnClose`, when this panel is closed, keep the live instance in
|
|
184
184
|
* `PanelManager`'s retained-panel map (background subscriptions/timers
|
|
185
185
|
* keep running) instead of calling `onDestroy()`. Reopening returns the
|
|
186
186
|
* same instance with its accumulated state intact. Panels without
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// workstream-graph-render.ts
|
|
2
|
+
// workstream-graph-render.ts, render a workstream's task graph (fleet.graph.get)
|
|
3
3
|
// legibly, so the observability layer shows the dependency graph's shape,
|
|
4
4
|
// states, and pool posture WITHOUT opening any transcript.
|
|
5
5
|
//
|
|
@@ -23,7 +23,7 @@ export function renderPoolSummary(pool: WorkstreamGraphSnapshot['pool']): string
|
|
|
23
23
|
return pool.atCap ? `${base}, at cap (fleet.maxSize=${pool.maxSize})` : base;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
/** The leading glyph for a node
|
|
26
|
+
/** The leading glyph for a node, orphaned/blocked/stalled tells win over the base state. */
|
|
27
27
|
function nodeGlyph(node: WorkstreamGraphNode): string {
|
|
28
28
|
if (node.orphaned) return '⊘';
|
|
29
29
|
if (node.blockedReason) return '⊘';
|
|
@@ -41,7 +41,7 @@ function nodeGlyph(node: WorkstreamGraphNode): string {
|
|
|
41
41
|
function nodeTell(node: WorkstreamGraphNode, needs: readonly string[]): string {
|
|
42
42
|
const parts: string[] = [];
|
|
43
43
|
if (node.blockedReason) {
|
|
44
|
-
parts.push(`blocked
|
|
44
|
+
parts.push(`blocked: waiting on: ${node.blockedReason}`);
|
|
45
45
|
} else if (node.state === 'running') {
|
|
46
46
|
parts.push(node.agentId ? `running (${node.agentId})` : 'running');
|
|
47
47
|
} else if (node.state === 'ready') {
|
|
@@ -61,7 +61,7 @@ function fit(line: string, width: number): string {
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
/**
|
|
64
|
-
* Wrap content to the width on word boundaries
|
|
64
|
+
* Wrap content to the width on word boundaries, NO clipping: the whole tell
|
|
65
65
|
* (including a long "waiting on: …" reason) survives onto indented continuation
|
|
66
66
|
* lines rather than being cut off. `firstIndent` leads the first line;
|
|
67
67
|
* `contIndent` leads each continuation. A single word longer than the width is
|
|
@@ -96,7 +96,7 @@ function wrapContent(content: string, width: number, firstIndent: string, contIn
|
|
|
96
96
|
export function renderWorkstreamGraphLines(snapshot: WorkstreamGraphSnapshot, width: number): string[] {
|
|
97
97
|
const lines: string[] = [];
|
|
98
98
|
// Title and pool posture on their own lines so neither clips the other at a
|
|
99
|
-
// narrow width
|
|
99
|
+
// narrow width, the pool summary ("… at cap (fleet.maxSize=N)") is load-bearing.
|
|
100
100
|
lines.push(fit(snapshot.title, width));
|
|
101
101
|
lines.push(fit(` ${renderPoolSummary(snapshot.pool)}`, width));
|
|
102
102
|
|
|
@@ -120,7 +120,7 @@ export function constraintStatusMarker(
|
|
|
120
120
|
if (finding.satisfied) {
|
|
121
121
|
return { tag: '[SAT]', fg: C.good, dim: false };
|
|
122
122
|
}
|
|
123
|
-
// Unsatisfied
|
|
123
|
+
// Unsatisfied, use severity to pick colour and tag text
|
|
124
124
|
const sev = finding.severity ?? 'major';
|
|
125
125
|
let sevTag: string;
|
|
126
126
|
let fg: string;
|