@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
|
@@ -33,11 +33,11 @@ export interface ConfigModalRenderRow {
|
|
|
33
33
|
readonly selected: boolean;
|
|
34
34
|
readonly selectable: boolean;
|
|
35
35
|
/** True when this frozen row has no live counterpart this tick (value went
|
|
36
|
-
* stale
|
|
36
|
+
* stale, kept in place, dimmed, until the next interaction boundary). */
|
|
37
37
|
readonly stale: boolean;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
/** Everything renderConfigModal needs
|
|
40
|
+
/** Everything renderConfigModal needs, computed by overlaying live values onto
|
|
41
41
|
* the frozen structure so layout stays stable between key presses. */
|
|
42
42
|
export interface ConfigModalRenderModel {
|
|
43
43
|
readonly title: string;
|
|
@@ -60,7 +60,7 @@ const DEFAULT_VISIBLE_ROWS = 10;
|
|
|
60
60
|
* minus the 4-column text margin and 2-column selection indicator (see
|
|
61
61
|
* ModalFactory._renderListSection's `contentW - 2`). renderConfigModal()
|
|
62
62
|
* itself always computes and passes the ACTUAL width for the current
|
|
63
|
-
* terminal size
|
|
63
|
+
* terminal size, this constant only matters when getRenderModel() is
|
|
64
64
|
* called directly without going through the renderer.
|
|
65
65
|
*/
|
|
66
66
|
const DEFAULT_LABEL_WRAP_WIDTH = 70;
|
|
@@ -68,16 +68,16 @@ const DEFAULT_LABEL_WRAP_WIDTH = 70;
|
|
|
68
68
|
/**
|
|
69
69
|
* Stable id for the synthesized "no matches" row item 1 injects when a
|
|
70
70
|
* filter query excludes every selectable row in a tab. Non-selectable (info
|
|
71
|
-
* rows are never filtered
|
|
71
|
+
* rows are never filtered, see ConfigModal's filter doc) so this id can
|
|
72
72
|
* never collide with a real surface row id.
|
|
73
73
|
*/
|
|
74
74
|
const FILTER_NO_MATCH_ROW_ID = '__config_modal_filter_no_match__';
|
|
75
75
|
|
|
76
76
|
/**
|
|
77
|
-
* ConfigModal
|
|
77
|
+
* ConfigModal, the single, generic, named config-modal host. One instance
|
|
78
78
|
* lives on the InputHandler (like `settingsModal`); it renders whatever
|
|
79
79
|
* `ConfigModalSurface` is currently open. Key routing is a single
|
|
80
|
-
* `handleConfigModalToken` path (handler-modal-routes.ts)
|
|
80
|
+
* `handleConfigModalToken` path (handler-modal-routes.ts), no parallel input
|
|
81
81
|
* system. See config-modal-types.ts for the surface contract and the liveness
|
|
82
82
|
* doctrine this class enforces.
|
|
83
83
|
*/
|
|
@@ -97,28 +97,28 @@ export class ConfigModal {
|
|
|
97
97
|
private pendingConfirmKey: string | null = null;
|
|
98
98
|
|
|
99
99
|
/**
|
|
100
|
-
* item 1
|
|
100
|
+
* item 1, the host's own type-to-filter, armed with '/' (matching
|
|
101
101
|
* the pre-existing "'/' to filter" convention: scrollable-list-panel.ts's
|
|
102
102
|
* opt-in filter, and SettingsModal's own '/'-armed search). `filterActive`
|
|
103
103
|
* gates whether printable keys go to the query instead of nav/actions;
|
|
104
104
|
* `filterQuery` is the TEXT-CAPTURE buffer itself (a multi-char paste token
|
|
105
|
-
* appends in one shot
|
|
105
|
+
* appends in one shot, see handleConfigModalToken). Filtering only ever
|
|
106
106
|
* narrows the ACTIVE tab's rows and is reset on tab switch (a query typed
|
|
107
107
|
* against one tab's rows has no defined meaning against another's).
|
|
108
108
|
*
|
|
109
|
-
* FILTER-CONVENTION RULING (batch integration
|
|
109
|
+
* FILTER-CONVENTION RULING (batch integration, where '/'-armed vs instant
|
|
110
110
|
* filtering is decided across the TUI's list UIs):
|
|
111
111
|
* - '/'-ARMED here (config-modal host surfaces): these surfaces bind PLAIN
|
|
112
112
|
* single keys to ACTION HOTKEYS (e.g. 'r' refresh, 'd' delete). A key
|
|
113
113
|
* can't be both an action and a filter character, so filtering must be
|
|
114
114
|
* explicitly armed with '/' first. This is a deliberate design choice.
|
|
115
|
-
* - INSTANT filtering (pure pickers
|
|
115
|
+
* - INSTANT filtering (pure pickers, help overlay, command palette,
|
|
116
116
|
* selection-modal): these have no single-key actions, so every printable
|
|
117
117
|
* key is unambiguously a filter character and narrows the list on the
|
|
118
118
|
* first keystroke. This is a deliberate design choice (selection-modal-overlay.ts).
|
|
119
119
|
* - Both keep single-Esc-close semantics. The only extra step is here: a
|
|
120
120
|
* two-stage Esc (first Esc clears a NON-EMPTY query, second Esc closes)
|
|
121
|
-
*
|
|
121
|
+
* , see the Esc branch in handleConfigModalToken. With an empty query,
|
|
122
122
|
* one Esc closes, exactly like the instant pickers.
|
|
123
123
|
*/
|
|
124
124
|
private filterActive = false;
|
|
@@ -201,8 +201,8 @@ export class ConfigModal {
|
|
|
201
201
|
|
|
202
202
|
/**
|
|
203
203
|
* Re-capture the structure from the current live view. Called on every key
|
|
204
|
-
* press (never during a pure render tick
|
|
205
|
-
* FIRST interaction, getRenderModel syncs so async loads paint)
|
|
204
|
+
* press (never during a pure render tick, with one exception: before the
|
|
205
|
+
* FIRST interaction, getRenderModel syncs so async loads paint), this is
|
|
206
206
|
* what makes structural changes appear only at an interaction boundary.
|
|
207
207
|
* Selection + active tab are preserved by id and clamped if their target
|
|
208
208
|
* vanished.
|
|
@@ -221,7 +221,7 @@ export class ConfigModal {
|
|
|
221
221
|
this._clampScroll();
|
|
222
222
|
}
|
|
223
223
|
|
|
224
|
-
// ── Filter (item 1
|
|
224
|
+
// ── Filter (item 1, each mutation is an interaction boundary) ──────
|
|
225
225
|
|
|
226
226
|
isFilterActive(): boolean {
|
|
227
227
|
return this.filterActive;
|
|
@@ -240,7 +240,7 @@ export class ConfigModal {
|
|
|
240
240
|
}
|
|
241
241
|
|
|
242
242
|
/**
|
|
243
|
-
* Append text to the query
|
|
243
|
+
* Append text to the query, the WHOLE token value in one call, so a
|
|
244
244
|
* multi-char paste token lands in the filter atomically rather than being
|
|
245
245
|
* split into per-char nav/action dispatch (the text-capture invariant this
|
|
246
246
|
* item's brief calls out). A no-op when the filter isn't armed.
|
|
@@ -261,7 +261,7 @@ export class ConfigModal {
|
|
|
261
261
|
* Esc while filtering: a non-empty query is CLEARED (stays armed, ready to
|
|
262
262
|
* retype without pressing '/' again) and this returns true so the caller
|
|
263
263
|
* (handleConfigModalToken) stops here instead of closing the modal. An
|
|
264
|
-
* empty query returns false
|
|
264
|
+
* empty query returns false, the caller falls through to the ordinary
|
|
265
265
|
* close path, preserving single-Esc-close for the no-filter case (the one
|
|
266
266
|
* documented exception: two-stage Esc only when there is something to
|
|
267
267
|
* clear).
|
|
@@ -305,7 +305,7 @@ export class ConfigModal {
|
|
|
305
305
|
|
|
306
306
|
private _switchTab(dir: 1 | -1): void {
|
|
307
307
|
this._clearConfirm();
|
|
308
|
-
// A filter query is scoped to the tab it was typed against
|
|
308
|
+
// A filter query is scoped to the tab it was typed against, switching
|
|
309
309
|
// tabs resets it (item 1), same as statusMessage below.
|
|
310
310
|
this.filterActive = false;
|
|
311
311
|
this.filterQuery = '';
|
|
@@ -367,7 +367,7 @@ export class ConfigModal {
|
|
|
367
367
|
|
|
368
368
|
/**
|
|
369
369
|
* In-surface "jump": switch the active tab (by id) and select a specific
|
|
370
|
-
* row (by id) within it
|
|
370
|
+
* row (by id) within it, the mechanism a surface's own action handler
|
|
371
371
|
* uses to move the user from one tab to a specific row in another (e.g.
|
|
372
372
|
* the Memory modal's Proposals tab jumping to an affected record in the
|
|
373
373
|
* Review Queue tab). An interaction boundary (re-syncs structure first,
|
|
@@ -414,20 +414,20 @@ export class ConfigModal {
|
|
|
414
414
|
}
|
|
415
415
|
|
|
416
416
|
/**
|
|
417
|
-
* Compute the render model: frozen structure + live value overlay. Pure
|
|
417
|
+
* Compute the render model: frozen structure + live value overlay. Pure,
|
|
418
418
|
* does NOT sync structure, so calling it repeatedly with only value mutations
|
|
419
419
|
* yields byte-identical layout (the liveness contract).
|
|
420
420
|
*
|
|
421
421
|
* `labelWrapWidth` is the wrap column ModalFactory's list section will use
|
|
422
422
|
* for row labels (renderConfigModal computes and passes the real one for
|
|
423
423
|
* the current terminal size). It exists so the wrap-clamp below (* item 2) can pre-empt a live label growing past ModalFactory's wrap width
|
|
424
|
-
* mid-tick
|
|
425
|
-
* interaction
|
|
424
|
+
* mid-tick, a structural change (an extra visible line) without an
|
|
425
|
+
* interaction, by measuring wrapped line counts here, before the label
|
|
426
426
|
* ever reaches the renderer.
|
|
427
427
|
*/
|
|
428
428
|
getRenderModel(labelWrapWidth: number = DEFAULT_LABEL_WRAP_WIDTH): ConfigModalRenderModel {
|
|
429
429
|
// Pre-first-interaction: async onOpen loads may restructure freely (the
|
|
430
|
-
// user hasn't engaged a cursor yet)
|
|
430
|
+
// user hasn't engaged a cursor yet), sync so "Loading…" is replaced by
|
|
431
431
|
// real content on the load's own requestRender, not the next keypress.
|
|
432
432
|
if (this.active && !this.interactedSinceOpen) this.syncStructure();
|
|
433
433
|
const live = this.surface?.buildView() ?? null;
|
|
@@ -471,7 +471,7 @@ export class ConfigModal {
|
|
|
471
471
|
|
|
472
472
|
// item 1: while filtering, the surface's own action/tab hints are
|
|
473
473
|
// unreliable (their printable-letter keys are captured by the filter
|
|
474
|
-
// instead of firing
|
|
474
|
+
// instead of firing, see handleConfigModalToken), so the footer swaps
|
|
475
475
|
// to just the filter status (query + a truthful match count) and the
|
|
476
476
|
// Esc contract for this mode. See getFilterQuery/isFilterActive callers.
|
|
477
477
|
const filtering = this.filterActive;
|
|
@@ -512,7 +512,7 @@ export class ConfigModal {
|
|
|
512
512
|
* `frozenLabel` is what the row wrapped to when the structure was captured
|
|
513
513
|
* (open/nav/filter keystroke); `liveLabel` is this tick's value. If the
|
|
514
514
|
* live label would wrap into MORE lines than the frozen one, that is a
|
|
515
|
-
* structural change (an extra visible row) happening without a keypress
|
|
515
|
+
* structural change (an extra visible row) happening without a keypress,
|
|
516
516
|
* exactly the hazard this closes. Clamp to the frozen line count, ellipsis
|
|
517
517
|
* on the last line to signal truncation; a live label that wraps to the
|
|
518
518
|
* SAME or FEWER lines passes through untouched (not the documented hazard).
|
|
@@ -532,20 +532,20 @@ export class ConfigModal {
|
|
|
532
532
|
|
|
533
533
|
/**
|
|
534
534
|
* Modal sizing rule (owner, zero tolerance: a modal/list must never clip
|
|
535
|
-
* its full descriptive text
|
|
535
|
+
* its full descriptive text, size to content or scroll, never clip).
|
|
536
536
|
* `scrollOffset`/`visible` are ROW-count based, which is exactly right when
|
|
537
|
-
* every row wraps to one line
|
|
537
|
+
* every row wraps to one line, but ModalFactory renders each row's WRAPPED
|
|
538
538
|
* lines and then bounds the whole section to a fixed content-row budget
|
|
539
539
|
* computed from `visible` (see renderConfigModal's targetContentRows). A
|
|
540
540
|
* row whose label wraps to MULTIPLE lines can therefore push the total past
|
|
541
541
|
* that budget, and the LAST row handed to the renderer gets cut off
|
|
542
|
-
* mid-line instead of being deferred to the next scroll page
|
|
542
|
+
* mid-line instead of being deferred to the next scroll page, the
|
|
543
543
|
* clipping hazard this closes.
|
|
544
544
|
*
|
|
545
545
|
* Windows `rows` starting at `scrollOffset`, greedily including whole rows
|
|
546
546
|
* while their CUMULATIVE wrapped-line count (at `wrapWidth`) stays within
|
|
547
547
|
* the `visible` line budget. Always includes at least the first candidate
|
|
548
|
-
* row so the view is never empty
|
|
548
|
+
* row so the view is never empty, a single row that alone exceeds the
|
|
549
549
|
* budget is shown in full rather than replaced with nothing; only a
|
|
550
550
|
* SUBSEQUENT row that would overflow is deferred to scrolling instead of
|
|
551
551
|
* being rendered partially.
|
|
@@ -572,7 +572,7 @@ export class ConfigModal {
|
|
|
572
572
|
private _filterStatusHint(matched: number, total: number): string {
|
|
573
573
|
const q = this.filterQuery;
|
|
574
574
|
if (q.length === 0) return `/ type to filter (${total} row${total === 1 ? '' : 's'})`;
|
|
575
|
-
return `/${q}
|
|
575
|
+
return `/${q}: ${matched} of ${total} match${matched === 1 ? '' : 'es'}`;
|
|
576
576
|
}
|
|
577
577
|
|
|
578
578
|
/** Apply the active filter query to every tab's rows. A no-op passthrough when not filtering. */
|
|
@@ -585,7 +585,7 @@ export class ConfigModal {
|
|
|
585
585
|
/**
|
|
586
586
|
* Narrow one tab's rows to those matching `query` (case-insensitive
|
|
587
587
|
* substring on the label). Non-selectable rows (section titles, honest
|
|
588
|
-
* empty-state copy, warning banners) always pass through unfiltered
|
|
588
|
+
* empty-state copy, warning banners) always pass through unfiltered,
|
|
589
589
|
* they're context, not data. When the query excludes every selectable row
|
|
590
590
|
* but the tab genuinely had some, append the honest "no rows match" line
|
|
591
591
|
* (item 1's empty-result case) instead of silently showing nothing
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* daemon-owned-settings-descriptions.ts
|
|
2
|
+
* daemon-owned-settings-descriptions.ts, appends an honest storage-location
|
|
3
3
|
* note to any settings-modal entry whose config key is daemon-owned (see
|
|
4
4
|
* `@pellux/goodvibes-sdk/platform/config`'s `isDaemonOwnedConfigKey`).
|
|
5
5
|
*
|
|
6
6
|
* Before the daemon-owned-config migration, every product wrote every key
|
|
7
7
|
* into its own per-surface silo, and a value like `surfaces.telegram.token`
|
|
8
|
-
* looked
|
|
8
|
+
* looked, from the settings modal, exactly like any other TUI-local
|
|
9
9
|
* setting. It never was: the daemon is the only process that reads it, so a
|
|
10
10
|
* value the TUI wrote to its own surface file could silently do nothing.
|
|
11
11
|
* This enrichment tells the truth in the one place a user checks: the
|
|
@@ -25,8 +25,8 @@ import type { SettingEntry, SettingsCategory } from './settings-modal-types.ts';
|
|
|
25
25
|
/** Build the daemon-owned disclosure note for a given daemon store path. */
|
|
26
26
|
export function daemonOwnedSettingNote(daemonTierPath: string | null): string {
|
|
27
27
|
return daemonTierPath
|
|
28
|
-
? `This value is stored in the daemon's own configuration (${daemonTierPath}) and applies to every client
|
|
29
|
-
: "This value is stored in the daemon's own configuration and applies to every client
|
|
28
|
+
? `This value is stored in the daemon's own configuration (${daemonTierPath}) and applies to every client; not just this one.`
|
|
29
|
+
: "This value is stored in the daemon's own configuration and applies to every client; not just this one.";
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// Delete-key policy
|
|
2
|
+
// Delete-key policy, single source of truth for text-editing key semantics
|
|
3
3
|
//
|
|
4
4
|
// In text-editing contexts:
|
|
5
5
|
// 'backspace' → delete one character backward (the character before cursor /
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* exec-env-scrub-config.ts
|
|
2
|
+
* exec-env-scrub-config.ts, TUI-local synthetic settings entry for
|
|
3
3
|
* permissions.execEnvScrubAllowlist.
|
|
4
4
|
*
|
|
5
5
|
* The SDK's credential-bearing env-var scrub (platform/tools/exec/credential-env.ts)
|
|
@@ -8,24 +8,24 @@
|
|
|
8
8
|
* exec command, and is threaded into `registerAllTools`'s `credentialEnvScrub`
|
|
9
9
|
* option (bootstrap-core.ts) so a consumer can wire an operator-configured
|
|
10
10
|
* allowlist instead of the scrub always resolving to its built-in default. The
|
|
11
|
-
* scrub's master switch stays on: this entry configures ONLY the allowlist
|
|
11
|
+
* scrub's master switch stays on: this entry configures ONLY the allowlist,
|
|
12
12
|
* variable NAMES always kept even though their name looks credential-bearing
|
|
13
13
|
* (case-insensitive), for a command that genuinely needs one (e.g. a CI runner
|
|
14
14
|
* re-reading its own signing key). NEVER a value; the scrub only ever inspects
|
|
15
15
|
* and reports NAMES.
|
|
16
16
|
*
|
|
17
|
-
* `permissions.execEnvScrubAllowlist` is not in CONFIG_SCHEMA
|
|
17
|
+
* `permissions.execEnvScrubAllowlist` is not in CONFIG_SCHEMA, there is no SDK
|
|
18
18
|
* config domain for the exec env scrub at all (it is consumer-wired, not
|
|
19
19
|
* schema-registered), so this mirrors the other TUI-local synthetic settings
|
|
20
20
|
* (worktree.setup.*, sandbox.egressAllowlist, …). No defensive try/catch is
|
|
21
21
|
* needed: 'permissions' already exists as a DEFAULT_CONFIG section (it backs
|
|
22
22
|
* permissions.mode/tools.*), so a plain get()/set() resolves the path without
|
|
23
|
-
* throwing
|
|
23
|
+
* throwing, only the LEAF field is new, and ConfigManager.resolvePath never
|
|
24
24
|
* validates leaf existence.
|
|
25
25
|
*
|
|
26
26
|
* Stored as a JSON array of strings on disk; the settings modal's inline
|
|
27
|
-
* editor is a single-line text field, so
|
|
28
|
-
* sandbox.egressAllowlist/workspaceWritable
|
|
27
|
+
* editor is a single-line text field, so, matching worktree.setup.* and
|
|
28
|
+
* sandbox.egressAllowlist/workspaceWritable, it is displayed and edited as a
|
|
29
29
|
* comma-separated list and parsed back into an array on commit (see
|
|
30
30
|
* isExecEnvScrubAllowlistConfigKey's use in settings-modal.ts#commitEdit).
|
|
31
31
|
*/
|
|
@@ -55,7 +55,7 @@ export const EXEC_ENV_SCRUB_ALLOWLIST_SYNTHETIC_SETTING: ConfigSetting = {
|
|
|
55
55
|
key: EXEC_ENV_SCRUB_ALLOWLIST_CONFIG_KEY,
|
|
56
56
|
type: 'string',
|
|
57
57
|
default: [],
|
|
58
|
-
description: 'Comma-separated environment variable NAMES always kept in a spawned exec command\'s environment even when the name looks credential-bearing (case-insensitive). Names only
|
|
58
|
+
description: 'Comma-separated environment variable NAMES always kept in a spawned exec command\'s environment even when the name looks credential-bearing (case-insensitive). Names only: this never inspects or reports values. The scrub itself stays on; this only widens what it lets through. Empty = the built-in credential-name scrub applies with no extra exceptions.',
|
|
59
59
|
};
|
|
60
60
|
|
|
61
61
|
/** Build the synthetic SettingEntry for permissions.execEnvScrubAllowlist. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* feature-unit-layout
|
|
2
|
+
* feature-unit-layout, every platform capability renders as a feature UNIT in
|
|
3
3
|
* its settings DOMAIN: the feature's real enablement row (its domain settings
|
|
4
4
|
* key, with the feature's name and full description attached) immediately
|
|
5
5
|
* followed by the settings keys that tune it.
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* configures the feature.
|
|
13
13
|
*
|
|
14
14
|
* A feature-unit header is the REAL config row for the feature's enablement
|
|
15
|
-
* key
|
|
15
|
+
* key, boolean headers toggle, enum headers cycle their mode choices through
|
|
16
16
|
* the ordinary settings interactions. Two features can share one enablement
|
|
17
17
|
* key (e.g. behavior.compactionStrategy drives both compaction features);
|
|
18
18
|
* each still gets its own header row so every capability keeps its own name,
|
|
@@ -25,7 +25,7 @@ import type { ConfigSetting } from '@pellux/goodvibes-sdk/platform/config';
|
|
|
25
25
|
import { getConfigSchemaSetting } from '@pellux/goodvibes-terminal-shell';
|
|
26
26
|
import type { FlagEntry, SettingEntry, SettingsCategory } from './settings-modal-types.ts';
|
|
27
27
|
|
|
28
|
-
/** Every enablement key
|
|
28
|
+
/** Every enablement key, these rows render as feature headers, never as plain sub-rows. */
|
|
29
29
|
const ENABLEMENT_KEYS: ReadonlySet<string> = new Set(
|
|
30
30
|
FEATURE_SETTINGS.map((feature) => feature.enablement.key),
|
|
31
31
|
);
|
|
@@ -41,7 +41,7 @@ export function getFeatureUnitHostCategory(featureId: string): SettingsCategory
|
|
|
41
41
|
|
|
42
42
|
/**
|
|
43
43
|
* Map every non-enablement settings key claimed by any feature to the feature
|
|
44
|
-
* that OWNS it
|
|
44
|
+
* that OWNS it, the first feature (in FEATURE_SETTINGS declaration order)
|
|
45
45
|
* whose settings list contains it. A key claimed by two features is listed
|
|
46
46
|
* once, under its owner, so no settings key double-lists across feature units.
|
|
47
47
|
*/
|
|
@@ -60,7 +60,7 @@ export function buildConfigKeyOwnership(): Map<string, string> {
|
|
|
60
60
|
* Build a feature unit's header row: the REAL config row for the feature's
|
|
61
61
|
* enablement key (so booleans toggle and enums cycle their mode choices
|
|
62
62
|
* through the ordinary settings paths), cloned with the feature attached.
|
|
63
|
-
* When the category has no row for the key (it should always have one
|
|
63
|
+
* When the category has no row for the key (it should always have one, every
|
|
64
64
|
* binding key is CONFIG_SCHEMA-registered), the schema descriptor is used
|
|
65
65
|
* directly so the header still renders honestly.
|
|
66
66
|
*/
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* feed-context-factory.ts
|
|
2
|
+
* feed-context-factory.ts, Construction and mutable-field sync for InputFeedContext.
|
|
3
3
|
*
|
|
4
4
|
* Extracted from handler.ts (review follow-up, 0.18.23) to keep handler.ts under the
|
|
5
5
|
* 800-line architecture cap.
|
|
6
6
|
*
|
|
7
7
|
* Two exported functions:
|
|
8
|
-
* - `buildInitialFeedContext
|
|
8
|
+
* - `buildInitialFeedContext`, assembles the long-lived InputFeedContext from
|
|
9
9
|
* pre-built field groups. Called once at InputHandler construction time.
|
|
10
|
-
* - `syncFeedContextMutableFields
|
|
10
|
+
* - `syncFeedContextMutableFields`, copies mutable scalar fields into the
|
|
11
11
|
* already-allocated context before each feed() dispatch.
|
|
12
12
|
*/
|
|
13
13
|
import type { InputFeedContext } from './handler-feed.ts';
|
|
@@ -46,14 +46,14 @@ import type { PanelBurstGuardState } from './panel-paste-flood-guard.ts';
|
|
|
46
46
|
*
|
|
47
47
|
* **Mutable fields** (synced per-feed via syncFeedContextMutableFields or inside
|
|
48
48
|
* action closures that call syncFeedContextMutableFields):
|
|
49
|
-
* - `prompt`, `cursorPos
|
|
50
|
-
* - `commandMode`, `panelFocused`, `indicatorFocused
|
|
51
|
-
* - `helpOverlayActive`, `helpScrollOffset
|
|
52
|
-
* - `shortcutsOverlayActive`, `shortcutsScrollOffset
|
|
53
|
-
* - `nextPasteId`, `nextImageId
|
|
54
|
-
* - `mouseDownRow`, `mouseDownCol
|
|
55
|
-
* - `contentWidth
|
|
56
|
-
* - `selectionCallback
|
|
49
|
+
* - `prompt`, `cursorPos`, current text buffer state
|
|
50
|
+
* - `commandMode`, `panelFocused`, `indicatorFocused`, focus-mode flags
|
|
51
|
+
* - `helpOverlayActive`, `helpScrollOffset`, help overlay state
|
|
52
|
+
* - `shortcutsOverlayActive`, `shortcutsScrollOffset`, shortcuts overlay state
|
|
53
|
+
* - `nextPasteId`, `nextImageId`, monotonically increasing ID counters
|
|
54
|
+
* - `mouseDownRow`, `mouseDownCol`, drag-tracking coordinates
|
|
55
|
+
* - `contentWidth`, reflow width, updated by setContentWidth()
|
|
56
|
+
* - `selectionCallback`, current selection modal callback (nullable)
|
|
57
57
|
*/
|
|
58
58
|
export interface FeedContextMutableInit {
|
|
59
59
|
prompt: string;
|
|
@@ -79,18 +79,18 @@ export interface FeedContextMutableInit {
|
|
|
79
79
|
* Stable (readonly) service references for InputFeedContext.
|
|
80
80
|
*
|
|
81
81
|
* **Stable references** (set once at construction, never reallocated):
|
|
82
|
-
* - `pasteRegistry`, `imageRegistry
|
|
82
|
+
* - `pasteRegistry`, `imageRegistry`, owned Maps, never replaced
|
|
83
83
|
* - `selectionModal`, `bookmarkModal`, `settingsModal`, `sessionPickerModal`,
|
|
84
|
-
* `profilePickerModal
|
|
84
|
+
* `profilePickerModal`, modal objects constructed once
|
|
85
85
|
* - `filePicker`, `modelPicker`, `contextInspectorModal`, `blockActionsMenu`,
|
|
86
|
-
* `searchManager`, `historySearch`, `onboardingWizard
|
|
87
|
-
* - `panelManager`, `keybindingsManager
|
|
88
|
-
* - `modalStack
|
|
89
|
-
* - `getHistory`, `getViewportHeight`, `getScrollTop`, `scroll`, `exitApp
|
|
86
|
+
* `searchManager`, `historySearch`, `onboardingWizard`, service objects constructed once
|
|
87
|
+
* - `panelManager`, `keybindingsManager`, from uiServices, stable
|
|
88
|
+
* - `modalStack`, reference to the handler's shared array
|
|
89
|
+
* - `getHistory`, `getViewportHeight`, `getScrollTop`, `scroll`, `exitApp`, callbacks
|
|
90
90
|
* - `commandRegistry`, `commandContext`, `autocomplete`, `inputHistory`,
|
|
91
|
-
* `conversationManager
|
|
91
|
+
* `conversationManager`, wired after construction; synced at feed() entry only
|
|
92
92
|
* (not per-action) since no in-feed action changes them
|
|
93
|
-
* - `focusTracker
|
|
93
|
+
* - `focusTracker`, shared instance from uiServices.platform, mutated
|
|
94
94
|
* directly by feedInputTokens() on 'focus' tokens; never reallocated
|
|
95
95
|
*
|
|
96
96
|
* **Rationale:** per-feed mutation on a single object avoids per-keystroke GC pressure
|
|
@@ -126,7 +126,7 @@ export interface FeedContextStableRefs {
|
|
|
126
126
|
keybindingsManager: KeybindingsManager;
|
|
127
127
|
killRing: KillRing;
|
|
128
128
|
focusTracker: FocusTracker;
|
|
129
|
-
/** item 5
|
|
129
|
+
/** item 5, paste-flood guard state, mutated in place (never reallocated). */
|
|
130
130
|
panelBurstGuard: PanelBurstGuardState;
|
|
131
131
|
getHistory: () => InfiniteBuffer;
|
|
132
132
|
getViewportHeight: () => number;
|
|
@@ -176,12 +176,12 @@ export interface FeedContextClosures {
|
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
/**
|
|
179
|
-
* buildInitialFeedContext
|
|
179
|
+
* buildInitialFeedContext, Allocate the single InputFeedContext that lives for the
|
|
180
180
|
* lifetime of the InputHandler.
|
|
181
181
|
*
|
|
182
182
|
* Accepts pre-built field groups from handler.ts where private access is available.
|
|
183
183
|
* The resulting context object is mutated in place on every feed() call via
|
|
184
|
-
* syncFeedContextMutableFields
|
|
184
|
+
* syncFeedContextMutableFields, no re-allocation occurs per keystroke.
|
|
185
185
|
*
|
|
186
186
|
* @param mutable Initial mutable scalar values (synced per-feed).
|
|
187
187
|
* @param stable Stable service references (set once, never replaced).
|
|
@@ -206,31 +206,31 @@ export function buildInitialFeedContext(
|
|
|
206
206
|
}
|
|
207
207
|
|
|
208
208
|
/**
|
|
209
|
-
* syncFeedContextMutableFields
|
|
209
|
+
* syncFeedContextMutableFields, Copy mutable scalar fields into the reused
|
|
210
210
|
* InputFeedContext object.
|
|
211
211
|
*
|
|
212
212
|
* **Fields synced (updated on every call):**
|
|
213
|
-
* - `prompt
|
|
214
|
-
* - `cursorPos
|
|
215
|
-
* - `commandMode
|
|
216
|
-
* - `panelFocused
|
|
217
|
-
* - `indicatorFocused
|
|
218
|
-
* - `helpOverlayActive` / `helpScrollOffset
|
|
219
|
-
* - `shortcutsOverlayActive` / `shortcutsScrollOffset
|
|
220
|
-
* - `selectionCallback
|
|
221
|
-
* - `nextPasteId` / `nextImageId
|
|
222
|
-
* - `mouseDownRow` / `mouseDownCol
|
|
213
|
+
* - `prompt`, current prompt text buffer
|
|
214
|
+
* - `cursorPos`, caret position within prompt
|
|
215
|
+
* - `commandMode`, whether command-mode prefix is active
|
|
216
|
+
* - `panelFocused`, whether the active panel owns keyboard focus
|
|
217
|
+
* - `indicatorFocused`, whether the status indicator owns focus
|
|
218
|
+
* - `helpOverlayActive` / `helpScrollOffset`, help overlay visibility and scroll
|
|
219
|
+
* - `shortcutsOverlayActive` / `shortcutsScrollOffset`, shortcuts overlay state
|
|
220
|
+
* - `selectionCallback`, the current in-flight selection modal callback
|
|
221
|
+
* - `nextPasteId` / `nextImageId`, monotonically increasing allocation counters
|
|
222
|
+
* - `mouseDownRow` / `mouseDownCol`, drag-start coordinates
|
|
223
223
|
*
|
|
224
224
|
* **Fields intentionally excluded (synced only at feed() entry, not here):**
|
|
225
|
-
* - `contentWidth
|
|
225
|
+
* - `contentWidth`, semi-stable; only changes on terminal resize via setContentWidth().
|
|
226
226
|
* Synced at feed() entry because it is only relevant for layout, not action-reaction
|
|
227
227
|
* sequences within a single feed.
|
|
228
|
-
* - `commandRegistry`, `commandContext
|
|
228
|
+
* - `commandRegistry`, `commandContext`, wired after construction via
|
|
229
229
|
* setCommandRegistry(); synced at feed() entry since no in-feed action changes them.
|
|
230
|
-
* - `autocomplete
|
|
231
|
-
* - `inputHistory`, `conversationManager
|
|
230
|
+
* - `autocomplete`, wired after construction; synced at feed() entry.
|
|
231
|
+
* - `inputHistory`, `conversationManager`, late-wired service handles; stable within
|
|
232
232
|
* a feed. Synced at feed() entry only.
|
|
233
|
-
* - `requestRender
|
|
233
|
+
* - `requestRender`, swapped to a buffered version at feed() entry and restored in
|
|
234
234
|
* the finally block; not managed by this function.
|
|
235
235
|
*
|
|
236
236
|
* Called from within action closures (`handleEscape`, `handleCtrlC`, `handleUndo`,
|
package/src/input/file-picker.ts
CHANGED
|
@@ -15,7 +15,7 @@ export class FilePickerModal {
|
|
|
15
15
|
public searchFocused = true;
|
|
16
16
|
public results: string[] = [];
|
|
17
17
|
public selectedIndex = 0;
|
|
18
|
-
/** Position in the prompt where @ was typed
|
|
18
|
+
/** Position in the prompt where @ was typed, used to replace @query with the selected path */
|
|
19
19
|
public insertPos = 0;
|
|
20
20
|
/** When true, selected file inserts as !@path (inject mode) instead of @path */
|
|
21
21
|
public injectMode = false;
|
|
@@ -121,7 +121,7 @@ export function handleCommandModeToken(state: CommandModeRouteState, token: Inpu
|
|
|
121
121
|
// Defense in depth for EVERY command, not just the ones that
|
|
122
122
|
// already guard their own internals: a handler that throws or
|
|
123
123
|
// awaits a rejected promise must never become a silent unhandled
|
|
124
|
-
// rejection
|
|
124
|
+
// rejection, it renders the same way an unknown command does.
|
|
125
125
|
state.conversationManager?.log(`Command /${name} failed: ${summarizeError(err)}`, { fg: '#ef4444' });
|
|
126
126
|
state.requestRender();
|
|
127
127
|
});
|
|
@@ -149,7 +149,7 @@ function withPanelFocusSync(context: CommandContext, state: CommandModeRouteStat
|
|
|
149
149
|
showPanel: context.showPanel
|
|
150
150
|
? (panelId, pane, target, opts) => {
|
|
151
151
|
context.showPanel?.(panelId, pane, target, opts);
|
|
152
|
-
// showPanel no longer transfers focus by default
|
|
152
|
+
// showPanel no longer transfers focus by default, the command
|
|
153
153
|
// path leaves the composer focused (ui-openers.ts's showPanel only
|
|
154
154
|
// calls focusPanels() when opts.focus is set). Only flip the local
|
|
155
155
|
// panelFocused mirror when the caller explicitly asked for focus;
|
|
@@ -123,7 +123,7 @@ export function registerPaste(
|
|
|
123
123
|
|
|
124
124
|
// Terminals transmit the line breaks inside a bracketed paste as \r (the
|
|
125
125
|
// byte Enter sends), and external clipboards can carry \r\n. Normalize to
|
|
126
|
-
// \n only here in the text branch
|
|
126
|
+
// \n only here in the text branch, the image sniffing above must see the
|
|
127
127
|
// raw bytes (PNG's magic sequence itself contains \r\n).
|
|
128
128
|
const text = content.replace(/\r\n?/g, '\n');
|
|
129
129
|
const lines = text.split('\n');
|
|
@@ -246,7 +246,7 @@ export function findMarkerAtPos(prompt: string, pos: number): { start: number; e
|
|
|
246
246
|
/**
|
|
247
247
|
* describeBlockForReceipt - Honest, human-readable name for a block, used by
|
|
248
248
|
* every anchor-based action's receipt (Ctrl+Y/B/S/A, Tab, block-actions menu)
|
|
249
|
-
* so the transcript always says exactly what was acted on
|
|
249
|
+
* so the transcript always says exactly what was acted on, never just an
|
|
250
250
|
* internal collapseKey or a bare "done".
|
|
251
251
|
*/
|
|
252
252
|
export function describeBlockForReceipt(block: BlockMeta): string {
|
|
@@ -286,7 +286,7 @@ export function handleCopy(
|
|
|
286
286
|
* handleBlockCopy - Ctrl+Y: copy the content of the block the user is
|
|
287
287
|
* actually looking at. `getAnchorLine` resolves to the viewport's
|
|
288
288
|
* bottom-most visible line (see getViewportBottomLine in
|
|
289
|
-
* conversation-layout.ts), not the raw scroll position
|
|
289
|
+
* conversation-layout.ts), not the raw scroll position, the top of the
|
|
290
290
|
* viewport is off-screen-above once the transcript is longer than one page.
|
|
291
291
|
*/
|
|
292
292
|
export function handleBlockCopy(
|
|
@@ -306,7 +306,7 @@ export function handleBlockCopy(
|
|
|
306
306
|
copyToClipboard(nearest.rawContent);
|
|
307
307
|
onCopied();
|
|
308
308
|
// An explicit action on this block permanently exempts it from the
|
|
309
|
-
// search-close auto-re-collapse (see ConversationManager.noteUserTouch)
|
|
309
|
+
// search-close auto-re-collapse (see ConversationManager.noteUserTouch),
|
|
310
310
|
// copying content the user just had search reveal is a deliberate choice
|
|
311
311
|
// to keep it visible, not an accident of typing a query.
|
|
312
312
|
conversationManager.searchExpansion.noteUserTouch(nearest.collapseKey);
|
|
@@ -331,7 +331,7 @@ export function handleBookmark(
|
|
|
331
331
|
}
|
|
332
332
|
const label = `${nearest.type}: ${nearest.rawContent.slice(0, 40).replace(/\n/g, ' ')}`;
|
|
333
333
|
const added = bookmarkManager.toggle(nearest.collapseKey, label);
|
|
334
|
-
// See handleBlockCopy's note
|
|
334
|
+
// See handleBlockCopy's note, bookmarking is an explicit block action too.
|
|
335
335
|
conversationManager.searchExpansion.noteUserTouch(nearest.collapseKey);
|
|
336
336
|
const target = describeBlockForReceipt(nearest);
|
|
337
337
|
const msg = added
|
|
@@ -355,7 +355,7 @@ export function handleBlockSave(
|
|
|
355
355
|
requestRender();
|
|
356
356
|
return;
|
|
357
357
|
}
|
|
358
|
-
// See handleBlockCopy's note
|
|
358
|
+
// See handleBlockCopy's note, saving to a file is an explicit block action too.
|
|
359
359
|
conversationManager.searchExpansion.noteUserTouch(nearest.collapseKey);
|
|
360
360
|
const target = describeBlockForReceipt(nearest);
|
|
361
361
|
try {
|
|
@@ -483,7 +483,7 @@ export function handleCtrlC(
|
|
|
483
483
|
// Non-fatal to the exit chord; the quit-window bookkeeping still runs.
|
|
484
484
|
}
|
|
485
485
|
// A press that silenced LIVE speech is consumed by that job (an earlier replay
|
|
486
|
-
// fix)
|
|
486
|
+
// fix), symmetric with the prompt-clearing press above. The quit chord
|
|
487
487
|
// ("Ctrl+C x2") starts from a quiet state; turn-aborts still count toward
|
|
488
488
|
// the double-press.
|
|
489
489
|
if (stoppedSpeech) return;
|
|
@@ -492,7 +492,7 @@ export function handleCtrlC(
|
|
|
492
492
|
// one's outcome, whichever branch below runs. Without this, a hide-timer
|
|
493
493
|
// scheduled by an earlier press could still fire after a newer notice
|
|
494
494
|
// window opened, or after exitApp() was just called (if exitApp isn't
|
|
495
|
-
// synchronous)
|
|
495
|
+
// synchronous), flipping showExitNotice/requestRender during a shutdown
|
|
496
496
|
// the user already believes is in progress.
|
|
497
497
|
if (lastCtrlCTimeoutId !== null) {
|
|
498
498
|
clearTimeout(lastCtrlCTimeoutId);
|