@pellux/goodvibes-tui 2.0.14 → 2.0.16
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 +49 -0
- package/README.md +64 -44
- package/docs/README.md +6 -6
- 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 +19 -19
- 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 +11 -11
- 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,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* renderHelpOverlay
|
|
2
|
+
* renderHelpOverlay, renders the help overlay with keyboard shortcuts and slash commands.
|
|
3
3
|
*
|
|
4
4
|
* Opened via `/commands`. `?` and `/help` open the searchable command
|
|
5
|
-
* browser (a selection modal that runs the picked command) instead
|
|
5
|
+
* browser (a selection modal that runs the picked command) instead, they
|
|
6
6
|
* are a different, complementary surface, not this one.
|
|
7
7
|
*/
|
|
8
8
|
|
|
@@ -80,7 +80,7 @@ export function renderHelpOverlay(
|
|
|
80
80
|
` ${'Shift+Enter'.padEnd(20)} Insert newline`,
|
|
81
81
|
` ${kb('paste').padEnd(20)} Paste (image priority)`,
|
|
82
82
|
` ${(kb('undo') + ' / ' + kb('redo')).padEnd(20)} Undo / redo`,
|
|
83
|
-
shortcutLine('(paste >8 lines)', 'Folds to [TEXT: pN, M lines]
|
|
83
|
+
shortcutLine('(paste >8 lines)', 'Folds to [TEXT: pN, M lines]; /pastes previews it before you submit'),
|
|
84
84
|
'',
|
|
85
85
|
' Overlays And Panels',
|
|
86
86
|
' ' + '\u2500'.repeat(40),
|
|
@@ -213,7 +213,7 @@ export function renderHelpOverlay(
|
|
|
213
213
|
|
|
214
214
|
const allRows = [...shortcutRows, ...commandRows];
|
|
215
215
|
|
|
216
|
-
// Apply scroll offset
|
|
216
|
+
// Apply scroll offset, show a window of rows
|
|
217
217
|
const metrics = getOverlaySurfaceMetrics(width, viewportHeight, {
|
|
218
218
|
chromeRows: 4,
|
|
219
219
|
minContentRows: 8,
|
|
@@ -249,7 +249,7 @@ export function renderHelpOverlay(
|
|
|
249
249
|
}
|
|
250
250
|
|
|
251
251
|
/**
|
|
252
|
-
* renderShortcutsOverlay
|
|
252
|
+
* renderShortcutsOverlay, renders keyboard shortcuts as Line[].
|
|
253
253
|
* Accessed via /shortcuts command. Reflects live keybindings (user overrides included).
|
|
254
254
|
*/
|
|
255
255
|
export function renderShortcutsOverlay(
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* hint-grammar.ts
|
|
2
|
+
* hint-grammar.ts, the single hint-bar grammar for every overlay footer.
|
|
3
3
|
*
|
|
4
4
|
* one grammar across the model picker, settings modal, help/shortcuts
|
|
5
5
|
* overlays, and ModalFactory variants so footers stop drifting into three
|
|
@@ -44,7 +44,7 @@ export function formatHints(specs: readonly HintSpec[]): string {
|
|
|
44
44
|
|
|
45
45
|
/**
|
|
46
46
|
* Join already-rendered segments (hint bars, state tags) with the shared
|
|
47
|
-
* separator, dropping empties. Order is preserved
|
|
47
|
+
* separator, dropping empties. Order is preserved, use this to append state
|
|
48
48
|
* indicators after a {@link formatHints} bar.
|
|
49
49
|
*/
|
|
50
50
|
export function joinHints(...segments: Array<string | null | undefined>): string {
|
package/src/renderer/layout.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { GLYPHS, SPINNER_FRAMES, UI_TONES } from './ui-primitives.ts';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Layout constants
|
|
4
|
+
* Layout constants, single source of truth for margins and content width.
|
|
5
5
|
* All renderers import these instead of hardcoding indent values. The object
|
|
6
6
|
* itself lives in @pellux/goodvibes-terminal-shell alongside the transcript
|
|
7
7
|
* tree geometry that reads LEFT_MARGIN/RIGHT_MARGIN out of it, so the margins
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* markdown-inline.ts
|
|
2
|
+
* markdown-inline.ts, inline markdown tokenizer (bold, italic, inline code,
|
|
3
3
|
* links, bare URLs, absolute file paths).
|
|
4
4
|
*
|
|
5
5
|
* Extracted from markdown.ts so both the block renderer (markdown.ts) and the
|
|
@@ -63,7 +63,7 @@ export function renderInlineMarkdown(text: string): InlineToken[] {
|
|
|
63
63
|
i = end + 3;
|
|
64
64
|
continue;
|
|
65
65
|
}
|
|
66
|
-
// No closing *** found
|
|
66
|
+
// No closing *** found, emit the leading * as plain text so the ** bold
|
|
67
67
|
// check can handle the remaining ** on the next iteration.
|
|
68
68
|
tokens.push({ type: 'text', text: '*', style: {} });
|
|
69
69
|
i += 1;
|
|
@@ -108,7 +108,7 @@ export function renderInlineMarkdown(text: string): InlineToken[] {
|
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
-
// Plain text
|
|
111
|
+
// Plain text, accumulate until next special char, detect bare URLs and file paths
|
|
112
112
|
let end = i + 1;
|
|
113
113
|
while (end < text.length && !INLINE_SPECIAL_CHARS.has(text[end])) {
|
|
114
114
|
const code = text.charCodeAt(end);
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* markdown-table.ts
|
|
2
|
+
* markdown-table.ts, box-drawn markdown tables whose cells WRAP.
|
|
3
3
|
*
|
|
4
4
|
* The previous implementation (inside markdown.ts) allocated each column a
|
|
5
5
|
* proportional slice of the terminal width and then ellipsized any cell that
|
|
6
6
|
* did not fit: a comparison table rendered "Files, code, and…" in its label
|
|
7
7
|
* column and "citation coverage, checkpoin…" in its content columns, and the
|
|
8
|
-
* cut text was unrecoverable
|
|
8
|
+
* cut text was unrecoverable, it was never written to the buffer at all, so
|
|
9
9
|
* no scroll, copy, or expand could bring it back.
|
|
10
10
|
*
|
|
11
11
|
* This renderer never ellipsizes. A cell that exceeds its column width wraps
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* gets its full natural width, so a narrow label column is never starved down
|
|
18
18
|
* to one word plus an ellipsis while a wide prose column takes the rest:
|
|
19
19
|
*
|
|
20
|
-
* 1. Each column asks for `desiredMin
|
|
20
|
+
* 1. Each column asks for `desiredMin`, enough to hold its longest single
|
|
21
21
|
* word (capped at WORD_MIN_CAP so one long URL cannot starve the table),
|
|
22
22
|
* but never more than the column's natural width and never less than
|
|
23
23
|
* MIN_COL when the budget allows it.
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
* When even HARD_MIN_COL per column plus the borders exceeds the terminal
|
|
32
32
|
* width, no allocation helps: the box drawing itself does not fit. That case
|
|
33
33
|
* used to write the overflowing columns past the end of the line buffer, where
|
|
34
|
-
* they were discarded
|
|
34
|
+
* they were discarded, an eight-column table at width 40 lost its last
|
|
35
35
|
* columns, headers included, with nothing on screen to say so. The renderer now
|
|
36
36
|
* abandons the box at that point and stacks each row as `Header: value` records
|
|
37
37
|
* wrapped to the available width, so every column header and every cell is
|
|
@@ -131,7 +131,7 @@ function flattenCellChars(raw: string, isHdr: boolean): StyledChar[] {
|
|
|
131
131
|
/**
|
|
132
132
|
* Word-aware wrap of a styled character run into lines no wider than `maxW`
|
|
133
133
|
* display columns. A word wider than `maxW` is broken across lines character
|
|
134
|
-
* by character
|
|
134
|
+
* by character, the text is always emitted in full, never cut.
|
|
135
135
|
*/
|
|
136
136
|
function wrapStyledChars(chars: readonly StyledChar[], maxW: number): StyledChar[][] {
|
|
137
137
|
if (maxW <= 0) return [[]];
|
|
@@ -306,7 +306,7 @@ function emitStyledLines(
|
|
|
306
306
|
* Each data row becomes a block of `Header: value` lines wrapped to the
|
|
307
307
|
* available width, separated by a rule. Header text is styled as a header and
|
|
308
308
|
* force-broken rather than cut if it is somehow wider than the terminal, so the
|
|
309
|
-
* guarantee the box layout makes
|
|
309
|
+
* guarantee the box layout makes, every column present, nothing truncated,
|
|
310
310
|
* holds at any width.
|
|
311
311
|
*/
|
|
312
312
|
function renderStackedTable(
|
|
@@ -370,7 +370,7 @@ export function renderTable(rows: string[], width: number, indent: number): Line
|
|
|
370
370
|
const availW = width - indent;
|
|
371
371
|
|
|
372
372
|
// Measure using stripped text (no markdown markers), both the natural width
|
|
373
|
-
// and the widest single word
|
|
373
|
+
// and the widest single word, the latter is what a column needs before it
|
|
374
374
|
// has to start breaking words apart.
|
|
375
375
|
const naturalWidths: number[] = new Array(colCount).fill(0);
|
|
376
376
|
const minWordWidths: number[] = new Array(colCount).fill(0);
|
|
@@ -95,7 +95,7 @@ export interface ModalConfig {
|
|
|
95
95
|
// DEFAULT_STYLE is built from the mode-resolved chrome tones (activeUiTones) and
|
|
96
96
|
// rebuilt IN PLACE on a mode flip via the registered refresher. createModal reads
|
|
97
97
|
// it per call via `{ ...DEFAULT_STYLE, ...config.style }`, so the in-place rebuild
|
|
98
|
-
// reaches every modal
|
|
98
|
+
// reaches every modal, see theme.ts's active-mode runtime note.
|
|
99
99
|
function buildDefaultModalStyle(): Required<ModalStyle> {
|
|
100
100
|
const t = activeUiTones();
|
|
101
101
|
return {
|
|
@@ -120,7 +120,7 @@ registerThemeRefresh(() => Object.assign(DEFAULT_STYLE, buildDefaultModalStyle()
|
|
|
120
120
|
// ── ModalFactory ─────────────────────────────────────────────────────────────
|
|
121
121
|
|
|
122
122
|
/**
|
|
123
|
-
* ModalFactory
|
|
123
|
+
* ModalFactory, unified modal rendering for goodvibes-tui.
|
|
124
124
|
*
|
|
125
125
|
* Renders modals as Line[] (Cell arrays) consistent with the compositor
|
|
126
126
|
* overlay pipeline. All existing modals (file-picker, model-picker,
|
|
@@ -271,7 +271,7 @@ export class ModalFactory {
|
|
|
271
271
|
|
|
272
272
|
/**
|
|
273
273
|
* Render a single selectable list item row.
|
|
274
|
-
* ┤ text ├
|
|
274
|
+
* ┤ text ├ , bordered left/right, with optional selection highlight.
|
|
275
275
|
*/
|
|
276
276
|
static renderListItem(
|
|
277
277
|
boxW: number,
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
*
|
|
5
5
|
* this file used to also hold `renderModelPickerOverlay`, the
|
|
6
6
|
* overlay-style model-picker renderer. It was superseded by
|
|
7
|
-
* `renderModelWorkspace` (model-workspace.ts)
|
|
8
|
-
* routes `input.modelPicker.active` there, not here
|
|
7
|
+
* `renderModelWorkspace` (model-workspace.ts), conversation-overlays.ts
|
|
8
|
+
* routes `input.modelPicker.active` there, not here, and had no remaining
|
|
9
9
|
* non-test import site, so it (and its dedicated unit/golden tests) were
|
|
10
10
|
* removed. This constant is still live: handler-picker-routes.ts uses it to
|
|
11
11
|
* size the current workspace's visible-row window.
|
|
@@ -124,7 +124,7 @@ function modelKey(model: ModelDefinition): string {
|
|
|
124
124
|
|
|
125
125
|
function targetSummary(info: ModelPickerTargetInfo): string {
|
|
126
126
|
if (!info.enabled) return 'disabled';
|
|
127
|
-
// 'embeddings' has no model concept
|
|
127
|
+
// 'embeddings' has no model concept, configuredNote carries the honest
|
|
128
128
|
// provider id + dimensions + configured-state summary instead of a
|
|
129
129
|
// computed provider:model route (which would print a phantom "model:").
|
|
130
130
|
if (info.configuredNote) return info.configuredNote;
|
|
@@ -189,7 +189,7 @@ function detailLines(picker: ModelPickerModal, width: number): string[] {
|
|
|
189
189
|
} else {
|
|
190
190
|
lines.push(`Context cap overrides the detected local-model context window for this selection.`);
|
|
191
191
|
}
|
|
192
|
-
// A visible cursor glyph on the query itself when search is focused
|
|
192
|
+
// A visible cursor glyph on the query itself when search is focused,
|
|
193
193
|
// the only prior affordance was a footer-hint text swap ('/ search' vs.
|
|
194
194
|
// 'Typing filters search...'), buried at the end of a long hint line and
|
|
195
195
|
// easy to miss (confirmed via live tmux repro). This puts the "you are
|
|
@@ -283,8 +283,8 @@ function renderModelRows(picker: ModelPickerModal, lines: Line[], rows: number,
|
|
|
283
283
|
/**
|
|
284
284
|
* The effort step of the model picker.
|
|
285
285
|
*
|
|
286
|
-
* The list is exactly the levels the chosen model resolved to
|
|
287
|
-
* four
|
|
286
|
+
* The list is exactly the levels the chosen model resolved to, not a fixed
|
|
287
|
+
* four, and it is introduced by a headline naming what this model does with
|
|
288
288
|
* the setting (named levels, a thinking-token budget, an on/off toggle, or
|
|
289
289
|
* nothing at all). A best-guess spec prints its caveat under the list rather
|
|
290
290
|
* than presenting unverified levels as if the provider had confirmed them.
|
|
@@ -433,8 +433,8 @@ export function renderModelWorkspace(picker: ModelPickerModal, width: number, vi
|
|
|
433
433
|
const details = detailLines(picker, contentW - 2);
|
|
434
434
|
// Never drop detail lines (the modal rule: UI-authored descriptive text is
|
|
435
435
|
// always shown in full). Size the detail band to the ACTUAL content,
|
|
436
|
-
// growing past the old fixed proportional default up to maxDetailRows
|
|
437
|
-
// the ceiling that keeps at least a header row and one list row available
|
|
436
|
+
// growing past the old fixed proportional default up to maxDetailRows,
|
|
437
|
+
// the ceiling that keeps at least a header row and one list row available,
|
|
438
438
|
// rather than silently slicing off whatever didn't fit a 32% guess.
|
|
439
439
|
const detailRows = clamp(Math.max(details.length, Math.round(bodyRows * 0.32)), minDetailRows, maxDetailRows);
|
|
440
440
|
const listRows = Math.max(1, bodyRows - detailRows - 1);
|
|
@@ -475,7 +475,7 @@ export function renderModelWorkspace(picker: ModelPickerModal, width: number, vi
|
|
|
475
475
|
const footer = contentLine(safeWidth, PALETTE.footerBg);
|
|
476
476
|
const targetHint = picker.focusPane === 'targets' ? 'Focus targets' : 'Focus list';
|
|
477
477
|
// W3 Finding 2: while search is focused, every printable key (including
|
|
478
|
-
// c/a/b/g) types into the query
|
|
478
|
+
// c/a/b/g) types into the query, handler-picker-routes.ts guards those
|
|
479
479
|
// single-key shortcuts with `!searchFocused` (Up/Down blur search first).
|
|
480
480
|
// Advertising them here regardless of focus state was a footer that lied
|
|
481
481
|
// about what the keys currently do. Tab still cycles price in both states
|
|
@@ -306,7 +306,7 @@ function renderWideLayout(
|
|
|
306
306
|
const selectedText = selectedFieldText(wizard);
|
|
307
307
|
// The selected field's own hint is the direct analog of the reported
|
|
308
308
|
// defect (descriptive text explaining what the currently-focused option
|
|
309
|
-
// does)
|
|
309
|
+
// does), some hints run past 400 characters, e.g. security-caveat text.
|
|
310
310
|
// It is never clipped to a single row: it wraps onto as many lines as it
|
|
311
311
|
// needs, and the field list below starts after it, growing/shrinking the
|
|
312
312
|
// field-list area rather than losing hint text. Title/description/controls
|
|
@@ -18,7 +18,7 @@ export interface OverlayBoxPalette {
|
|
|
18
18
|
|
|
19
19
|
// Built from the mode-resolved chrome tones (activeUiTones) and rebuilt IN PLACE
|
|
20
20
|
// on a mode flip via the registered refresher (60+ call sites read it by
|
|
21
|
-
// reference
|
|
21
|
+
// reference, see theme.ts's active-mode runtime note).
|
|
22
22
|
function buildOverlayPalette(): OverlayBoxPalette {
|
|
23
23
|
const t = activeUiTones();
|
|
24
24
|
return {
|
|
@@ -9,7 +9,7 @@ import { renderPanelWorkspaceBar } from './panel-workspace-bar.ts';
|
|
|
9
9
|
/**
|
|
10
10
|
* Per-panel render cache for dirty-flag skipping.
|
|
11
11
|
*
|
|
12
|
-
* Maintainability hazard
|
|
12
|
+
* Maintainability hazard, mid-render invalidation race:
|
|
13
13
|
*
|
|
14
14
|
* If an event listener (e.g. a runtime-bus subscriber) fires DURING a panel's
|
|
15
15
|
* `render()` call and mutates state such that `needsRender = true`, the
|
|
@@ -25,7 +25,7 @@ import { renderPanelWorkspaceBar } from './panel-workspace-bar.ts';
|
|
|
25
25
|
*
|
|
26
26
|
* The fix (now applied): snapshot `needsRender` before calling `render()` and
|
|
27
27
|
* only call `markRendered()` when no concurrent invalidation occurred during
|
|
28
|
-
* the render pass
|
|
28
|
+
* the render pass, preserving any mid-render invalidation.
|
|
29
29
|
*/
|
|
30
30
|
interface PanelRenderCache {
|
|
31
31
|
lines: Line[];
|
|
@@ -40,7 +40,7 @@ const panelRenderCache = new WeakMap<Panel, PanelRenderCache>();
|
|
|
40
40
|
* its invalidate() to bump the counter stored in this map.
|
|
41
41
|
*
|
|
42
42
|
* Race-guard: snapshot the generation before render(), compare after. If it
|
|
43
|
-
* changed, a mid-render invalidation occurred
|
|
43
|
+
* changed, a mid-render invalidation occurred, leave needsRender=true.
|
|
44
44
|
*/
|
|
45
45
|
const panelRenderGen = new WeakMap<Panel, { gen: number }>();
|
|
46
46
|
|
|
@@ -72,13 +72,13 @@ export function renderPanel(panel: Panel, width: number, height: number): Line[]
|
|
|
72
72
|
const genBefore = genState.gen;
|
|
73
73
|
const lines = panel.render(width, height);
|
|
74
74
|
// Only call markRendered() when no mid-render invalidation occurred.
|
|
75
|
-
// If the generation changed during render(), a concurrent invalidate() fired
|
|
75
|
+
// If the generation changed during render(), a concurrent invalidate() fired,
|
|
76
76
|
// leave needsRender=true so the next frame re-renders with the new state.
|
|
77
77
|
if (genState.gen === genBefore) {
|
|
78
78
|
panel.markRendered();
|
|
79
79
|
}
|
|
80
80
|
// If gen changed, needsRender is already true (invalidate() set it); do not
|
|
81
|
-
// call markRendered()
|
|
81
|
+
// call markRendered(), the next frame will pick it up.
|
|
82
82
|
panelRenderCache.set(panel, { lines, width, height });
|
|
83
83
|
return lines;
|
|
84
84
|
}
|
|
@@ -3,7 +3,7 @@ import type { WorkspaceTab } from '../panels/panel-manager.ts';
|
|
|
3
3
|
import { renderTabStrip, type TabHitRegion } from './tab-strip.ts';
|
|
4
4
|
import { UI_TONES } from './ui-primitives.ts';
|
|
5
5
|
|
|
6
|
-
// Theme tokens (no raw hex)
|
|
6
|
+
// Theme tokens (no raw hex), keeps the bar in sync with the shared palette.
|
|
7
7
|
const ACTIVE_FG = UI_TONES.fg.primary; // selected tab text
|
|
8
8
|
const ACTIVE_BG = UI_TONES.bg.selected; // selected tab fill (stronger contrast)
|
|
9
9
|
const INACTIVE_FG = UI_TONES.fg.muted; // unselected tabs
|
|
@@ -7,7 +7,7 @@ import { formatHints } from './hint-grammar.ts';
|
|
|
7
7
|
import { voiceCaptureRowVisible, type VoiceCaptureIndicatorState } from '../core/voice-capture-status.ts';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
* renderProcessIndicator
|
|
10
|
+
* renderProcessIndicator, shows a one-line summary of active background
|
|
11
11
|
* processes below the input area.
|
|
12
12
|
*
|
|
13
13
|
* Dimmed when no processes are active, highlighted (cyan) when agents or
|
|
@@ -17,7 +17,7 @@ import { voiceCaptureRowVisible, type VoiceCaptureIndicatorState } from '../core
|
|
|
17
17
|
/**
|
|
18
18
|
* Agent-count label. The footer counts only ACTIVE agents, while the fleet
|
|
19
19
|
* lists every node (running, terminal, chains, watchers). Label the count
|
|
20
|
-
* "active" so it is never misread as a grand total
|
|
20
|
+
* "active" so it is never misread as a grand total, the [Enter] View hint
|
|
21
21
|
* opens the fleet for the full picture. (item 5d.)
|
|
22
22
|
*/
|
|
23
23
|
function agentCountLabel(agentCount: number): string {
|
|
@@ -100,21 +100,21 @@ export function renderProcessIndicator(
|
|
|
100
100
|
/**
|
|
101
101
|
* Sentence each capture state renders as. Written out per state rather than
|
|
102
102
|
* assembled from fragments because these are the words that tell a user whether
|
|
103
|
-
* their microphone is open
|
|
103
|
+
* their microphone is open, "listening" and "recording" mean different things
|
|
104
104
|
* and a row that blurred them would be worse than no row.
|
|
105
105
|
*/
|
|
106
106
|
const VOICE_CAPTURE_LABELS: Record<VoiceCaptureIndicatorState['kind'], string> = {
|
|
107
107
|
requesting: 'opening the microphone',
|
|
108
|
-
recording: 'recording
|
|
108
|
+
recording: 'recording: press the voice-input key again to stop',
|
|
109
109
|
transcribing: 'transcribing what you said',
|
|
110
110
|
'wake-listening': 'listening for the wake phrase',
|
|
111
|
-
'wake-capturing': 'wake heard
|
|
112
|
-
'wake-restarting': 'capture stream ended
|
|
111
|
+
'wake-capturing': 'wake heard: recording what follows',
|
|
112
|
+
'wake-restarting': 'capture stream ended: restarting',
|
|
113
113
|
'wake-latched': 'wake detection stopped',
|
|
114
114
|
};
|
|
115
115
|
|
|
116
116
|
/**
|
|
117
|
-
* renderVoiceCaptureIndicator
|
|
117
|
+
* renderVoiceCaptureIndicator, the persistent row shown while a microphone is
|
|
118
118
|
* open, below the input area beside the process indicator.
|
|
119
119
|
*
|
|
120
120
|
* It exists because a held-open capture device is otherwise invisible: wake
|
|
@@ -125,7 +125,7 @@ const VOICE_CAPTURE_LABELS: Record<VoiceCaptureIndicatorState['kind'], string> =
|
|
|
125
125
|
* moment ago and is waiting on it.
|
|
126
126
|
*
|
|
127
127
|
* Returns no lines when nothing is captured, or when the wake rows are turned
|
|
128
|
-
* off
|
|
128
|
+
* off, the caller splices whatever comes back, so an empty array is "no row".
|
|
129
129
|
*/
|
|
130
130
|
export function renderVoiceCaptureIndicator(
|
|
131
131
|
width: number,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* renderProfilePickerModal
|
|
2
|
+
* renderProfilePickerModal, renders the /profiles picker modal as Line[]
|
|
3
3
|
* using ModalFactory.
|
|
4
4
|
*
|
|
5
5
|
* Shows a list of saved profiles with:
|
|
@@ -57,9 +57,9 @@ export function renderProfilePickerModal(
|
|
|
57
57
|
} else {
|
|
58
58
|
// Proportional column widths that adapt to the modal's content width:
|
|
59
59
|
// timestamp ~22% (clamped 10..16); the name column absorbs the remainder
|
|
60
|
-
// (ported from session-picker-modal.ts). Reserves 4 cols
|
|
60
|
+
// (ported from session-picker-modal.ts). Reserves 4 cols, 2 for the
|
|
61
61
|
// name/timestamp separator and 2 for the list row's selection indicator
|
|
62
|
-
// ("▸ ") that ModalFactory prepends outside the wrapped label
|
|
62
|
+
// ("▸ ") that ModalFactory prepends outside the wrapped label, so the
|
|
63
63
|
// row never spills the timestamp's embedded space onto a wrapped line.
|
|
64
64
|
const tsW = Math.min(16, Math.max(10, Math.floor(contentW * 0.22)));
|
|
65
65
|
const nameW = Math.max(8, contentW - tsW - 4);
|
|
@@ -14,7 +14,7 @@ export function renderSearchOverlay(
|
|
|
14
14
|
manager: SearchManager,
|
|
15
15
|
width: number
|
|
16
16
|
): Line[] {
|
|
17
|
-
// Match count / status text
|
|
17
|
+
// Match count / status text, displayed in dim grey, right of query
|
|
18
18
|
const hasMatches = manager.matches.length > 0;
|
|
19
19
|
const matchCount = hasMatches
|
|
20
20
|
? `${manager.currentMatch + 1}/${manager.matches.length}${manager.wrapAround ? ' (wrap)' : ''}`
|
|
@@ -31,11 +31,11 @@ export function renderSearchOverlay(
|
|
|
31
31
|
: ' [Enter/Tab] lock [Esc] close';
|
|
32
32
|
const shortHints = locked ? ' [n/N] [Esc]' : ' [Esc]';
|
|
33
33
|
|
|
34
|
-
// Build left portion: label + query (no match count
|
|
34
|
+
// Build left portion: label + query (no match count, that gets separate styling)
|
|
35
35
|
const leftPart = label + queryDisplay;
|
|
36
36
|
|
|
37
37
|
// Tiered degradation: as the terminal narrows, first shorten the hints, then
|
|
38
|
-
// drop them, then drop the match-count segment
|
|
38
|
+
// drop them, then drop the match-count segment, so the query area (leftWidth)
|
|
39
39
|
// never collapses to zero or negative and the overlay never renders garbage.
|
|
40
40
|
const minLeft = getDisplayWidth(label) + 4; // label + a few query cells
|
|
41
41
|
let hints = fullHints;
|
|
@@ -88,7 +88,7 @@ function frameRowsFor(modal: SelectionModal): number {
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
/**
|
|
91
|
-
* Physical rows every row of the list needs, category headers included
|
|
91
|
+
* Physical rows every row of the list needs, category headers included, the
|
|
92
92
|
* height the box would have to give the list for nothing to be scrolled away.
|
|
93
93
|
*/
|
|
94
94
|
function totalContentRowsFor(modal: SelectionModal, remaining: number): number {
|
|
@@ -124,7 +124,7 @@ export function renderSelectionModalOverlay(
|
|
|
124
124
|
// Size to content before falling back to the viewport's height ratio. When
|
|
125
125
|
// every row (and its wrapped detail) fits in the space the terminal
|
|
126
126
|
// actually has, ask for exactly that many rows, so a short list is never
|
|
127
|
-
// split behind a "(n below)" hint with screen still empty below the box
|
|
127
|
+
// split behind a "(n below)" hint with screen still empty below the box,
|
|
128
128
|
// a two-item question in particular must always show both its answers. A
|
|
129
129
|
// list genuinely taller than the terminal keeps the ratio-derived budget
|
|
130
130
|
// and scrolls as before.
|
|
@@ -142,7 +142,7 @@ export function renderSelectionModalOverlay(
|
|
|
142
142
|
// Modals size to content: items whose detail wraps onto extra lines can
|
|
143
143
|
// need more physical rows than a plain one-row-per-item modal, so this
|
|
144
144
|
// ceiling grows with the viewport rather than staying pinned at a small
|
|
145
|
-
// constant (still bounded
|
|
145
|
+
// constant (still bounded, never larger than the terminal can show).
|
|
146
146
|
maxContentRows: Math.max(10, viewportHeight - chromeRows - 4),
|
|
147
147
|
// A floor only. The shared budget keeps its own target and ceiling, so a
|
|
148
148
|
// modal whose content is shorter than that target is unaffected: this can
|
|
@@ -208,7 +208,7 @@ export function renderSelectionModalOverlay(
|
|
|
208
208
|
// visible window never silently shows fewer full items than the budget
|
|
209
209
|
// allows just because a fixed item-count cap ran out. Always shows the
|
|
210
210
|
// selected item (even alone, if its wrapped detail is taller than the
|
|
211
|
-
// whole budget
|
|
211
|
+
// whole budget, descriptive text is never clipped to make it fit),
|
|
212
212
|
// then grows outward, roughly centered, until the budget is spent.
|
|
213
213
|
const selected = Math.max(0, Math.min(modal.selectedIndex, items.length - 1));
|
|
214
214
|
let startIdx = selected;
|
|
@@ -278,7 +278,7 @@ export function renderSelectionModalOverlay(
|
|
|
278
278
|
});
|
|
279
279
|
if (item.detail) {
|
|
280
280
|
if (detailLayout.wrappedDetail === null) {
|
|
281
|
-
// Fits beside the label at a readable width
|
|
281
|
+
// Fits beside the label at a readable width, no truncation needed.
|
|
282
282
|
putText(labelLine, layout.margin + 2 + INDICATOR_WIDTH + labelWidth, 2, ' ', {
|
|
283
283
|
fg: BODY_FG,
|
|
284
284
|
bg: isSelected ? SELECTED_BG : DEFAULT_OVERLAY_PALETTE.bodyBg,
|
|
@@ -289,7 +289,7 @@ export function renderSelectionModalOverlay(
|
|
|
289
289
|
});
|
|
290
290
|
lines.push(labelLine);
|
|
291
291
|
} else {
|
|
292
|
-
// Doesn't fit beside the label
|
|
292
|
+
// Doesn't fit beside the label, wrap the FULL detail text onto as
|
|
293
293
|
// many lines as it needs below the label, rather than clipping it.
|
|
294
294
|
lines.push(labelLine);
|
|
295
295
|
for (const detailLineText of detailLayout.wrappedDetail) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* semantic-diff.ts
|
|
2
|
+
* semantic-diff.ts, Functional change summary after file edits.
|
|
3
3
|
*
|
|
4
4
|
* Compares AST before/after an edit and extracts:
|
|
5
5
|
* - Added / removed / modified functions, methods, classes, etc.
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Returns a compact SemanticDiff that can be rendered alongside a regular diff.
|
|
10
10
|
* Gracefully returns null when tree-sitter is unavailable or the language is
|
|
11
|
-
* unsupported
|
|
11
|
+
* unsupported, callers should treat null as "no semantic info available".
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import { TreeSitterService } from '@pellux/goodvibes-sdk/platform/intelligence';
|
|
@@ -28,9 +28,9 @@ export interface SymbolChange {
|
|
|
28
28
|
kind: ChangeKind;
|
|
29
29
|
symbolKind: SymbolInfo['kind'];
|
|
30
30
|
name: string;
|
|
31
|
-
/** Present for 'modified'
|
|
31
|
+
/** Present for 'modified', the old signature. */
|
|
32
32
|
oldSignature?: string;
|
|
33
|
-
/** Present for 'added' or 'modified'
|
|
33
|
+
/** Present for 'added' or 'modified', the new signature. */
|
|
34
34
|
newSignature?: string;
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -49,7 +49,7 @@ export interface SemanticDiff {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
// ---------------------------------------------------------------------------
|
|
52
|
-
// Import extraction (regex-based
|
|
52
|
+
// Import extraction (regex-based, fast, no grammar needed)
|
|
53
53
|
// ---------------------------------------------------------------------------
|
|
54
54
|
|
|
55
55
|
interface ParsedImport {
|
|
@@ -179,7 +179,6 @@ function diffImports(
|
|
|
179
179
|
if (!aImp) {
|
|
180
180
|
changes.push({ kind: 'removed', specifier: spec, names: bImp.names });
|
|
181
181
|
} else {
|
|
182
|
-
// Check if named imports changed
|
|
183
182
|
const bSet = new Set(bImp.names);
|
|
184
183
|
const aSet = new Set(aImp.names);
|
|
185
184
|
const added = aImp.names.filter(n => !bSet.has(n));
|
|
@@ -231,7 +230,7 @@ export async function computeSemanticDiff(
|
|
|
231
230
|
|
|
232
231
|
const langId = detectLanguage(filePath);
|
|
233
232
|
if (!langId) {
|
|
234
|
-
// No language support
|
|
233
|
+
// No language support, return import changes only if any
|
|
235
234
|
if (imports.length === 0) return null;
|
|
236
235
|
return { symbols: [], imports, totalChanges: imports.length };
|
|
237
236
|
}
|