@pellux/goodvibes-tui 2.0.13 → 2.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.goodvibes/GOODVIBES.md +1 -1
- package/.goodvibes/agents/reviewer.md +8 -8
- package/.goodvibes/skills/add-provider/SKILL.md +22 -22
- package/CHANGELOG.md +61 -0
- package/README.md +40 -29
- package/docs/README.md +1 -1
- package/docs/foundation-artifacts/README.md +5 -5
- package/docs/foundation-artifacts/operator-contract.json +123 -123
- package/package.json +12 -10
- package/scripts/postinstall.js +3 -3
- package/src/audio/activation-sound.ts +7 -7
- package/src/audio/capture.ts +7 -7
- package/src/audio/onnxruntime-assets.d.ts +1 -1
- package/src/audio/player.ts +4 -4
- package/src/audio/spoken-turn-wiring.ts +4 -4
- package/src/audio/voice-capture-wiring.ts +5 -5
- package/src/audio/voice-input-session.ts +3 -3
- package/src/audio/wake-inference.ts +13 -8
- package/src/audio/wake-runtime.ts +10 -10
- package/src/cli/completions/generate.ts +2 -2
- package/src/cli/doctor.ts +13 -13
- package/src/cli/ensure-goodvibes-gitignore.ts +3 -3
- package/src/cli/entrypoint.ts +3 -3
- package/src/cli/help.ts +6 -6
- package/src/cli/hooks-command.ts +4 -4
- package/src/cli/hooks-report.ts +4 -4
- package/src/cli/launch-auto-update.ts +17 -17
- package/src/cli/management-commands.ts +8 -8
- package/src/cli/management-utils.ts +3 -3
- package/src/cli/management.ts +1 -1
- package/src/cli/plugin-bundles-command.ts +10 -10
- package/src/cli/plugin-command.ts +9 -9
- package/src/cli/service-posture.ts +1 -1
- package/src/cli/status.ts +10 -10
- package/src/cli/surface-command.ts +4 -4
- package/src/cli/tui-startup.ts +23 -23
- package/src/config/run-daemon-config-migration.ts +3 -3
- package/src/config/secret-config.ts +10 -10
- package/src/config/surface.ts +1 -1
- package/src/config/tui-extension-settings.ts +8 -8
- package/src/core/active-model-identity.ts +7 -7
- package/src/core/approval-alert.ts +5 -5
- package/src/core/bookmark-navigation.ts +3 -3
- package/src/core/budget-breach-notifier.ts +6 -6
- package/src/core/compaction-receipt.ts +8 -8
- package/src/core/composer-state.ts +2 -2
- package/src/core/context-usage.ts +1 -1
- package/src/core/conversation-compaction-render.ts +3 -3
- package/src/core/conversation-event-navigation.ts +2 -2
- package/src/core/conversation-fold.ts +9 -9
- package/src/core/conversation-line-cache.ts +14 -14
- package/src/core/conversation-render-context.ts +6 -6
- package/src/core/conversation-rendering.ts +27 -30
- package/src/core/conversation-search-expansion.ts +6 -6
- package/src/core/conversation-splash-state.ts +3 -3
- package/src/core/conversation-turn-structure.ts +13 -13
- package/src/core/conversation-types.ts +3 -3
- package/src/core/conversation-user-receipts.ts +5 -5
- package/src/core/conversation.ts +17 -17
- package/src/core/format-user-error.ts +5 -5
- package/src/core/long-task-notifier.ts +9 -9
- package/src/core/memory-diagnostics-gateway.ts +8 -8
- package/src/core/memory-provenance.ts +5 -5
- package/src/core/model-routing-chip.ts +3 -3
- package/src/core/pairing-tailscale-gateway.ts +3 -3
- package/src/core/permission-mode.ts +5 -5
- package/src/core/power-chip-source.ts +3 -3
- package/src/core/power-status.ts +8 -8
- package/src/core/rewind-receipt.ts +6 -6
- package/src/core/session-resume-core.ts +8 -8
- package/src/core/stream-event-wiring.ts +36 -36
- package/src/core/stream-stall-watchdog.ts +4 -4
- package/src/core/system-message-noise.ts +7 -7
- package/src/core/system-message-router.ts +10 -10
- package/src/core/terminal-notifier.ts +5 -5
- package/src/core/turn-budget-outcome.ts +5 -5
- package/src/core/turn-cancellation.ts +3 -3
- package/src/core/turn-event-wiring.ts +16 -16
- package/src/core/voice-capture-status.ts +2 -2
- package/src/core/voice-provision-gateway.ts +12 -12
- package/src/core/voice-provision-status.ts +19 -19
- package/src/core/voice-stt-gateway.ts +6 -6
- package/src/core/wake-provision-runner.ts +7 -7
- package/src/core/wake-provision-status.ts +17 -17
- package/src/core/workstream-notification.ts +8 -8
- package/src/export/gist-uploader.ts +7 -7
- package/src/input/autocomplete.ts +3 -3
- package/src/input/bookmark-modal.ts +1 -1
- package/src/input/command-args-hint.ts +2 -2
- package/src/input/command-reference.ts +9 -9
- package/src/input/command-registry.ts +32 -32
- package/src/input/commands/acp-runtime.ts +6 -6
- package/src/input/commands/calendar-runtime.ts +9 -9
- package/src/input/commands/channel-pairing.ts +11 -11
- package/src/input/commands/channel-runtime.ts +1 -1
- package/src/input/commands/checkin-runtime.ts +4 -4
- package/src/input/commands/checkpoint-runtime.ts +4 -4
- package/src/input/commands/ci-runtime.ts +4 -4
- package/src/input/commands/cluster-runtime.ts +3 -3
- package/src/input/commands/codebase-runtime.ts +16 -16
- package/src/input/commands/config.ts +6 -6
- package/src/input/commands/connection-status.ts +12 -12
- package/src/input/commands/context-window.ts +2 -2
- package/src/input/commands/cost-attribution-format.ts +4 -4
- package/src/input/commands/cost-runtime.ts +2 -2
- package/src/input/commands/devices-runtime.ts +7 -7
- package/src/input/commands/diff-runtime.ts +2 -2
- package/src/input/commands/editor-runtime.ts +1 -1
- package/src/input/commands/eval.ts +4 -4
- package/src/input/commands/experience-runtime.ts +1 -1
- package/src/input/commands/git-runtime.ts +3 -3
- package/src/input/commands/graph-runtime.ts +3 -3
- package/src/input/commands/guidance-runtime.ts +1 -1
- package/src/input/commands/health-metrics-format.ts +2 -2
- package/src/input/commands/health-runtime.ts +8 -8
- package/src/input/commands/hosted-runtime.ts +13 -13
- package/src/input/commands/image-runtime.ts +6 -6
- package/src/input/commands/intelligence-runtime.ts +2 -2
- package/src/input/commands/local-auth-runtime.ts +3 -3
- package/src/input/commands/local-provider-runtime.ts +3 -3
- package/src/input/commands/local-runtime.ts +7 -7
- package/src/input/commands/mail-runtime.ts +9 -9
- package/src/input/commands/mcp-runtime.ts +1 -1
- package/src/input/commands/memory.ts +13 -13
- package/src/input/commands/notify-runtime.ts +1 -1
- package/src/input/commands/operator-panel-runtime.ts +8 -8
- package/src/input/commands/operator-rpc.ts +3 -3
- package/src/input/commands/operator-runtime.ts +3 -3
- package/src/input/commands/palette-runtime.ts +1 -1
- package/src/input/commands/payment-card-intake.ts +17 -17
- package/src/input/commands/permissions-provenance.ts +7 -7
- package/src/input/commands/permissions-runtime.ts +1 -1
- package/src/input/commands/planning-runtime.ts +9 -9
- package/src/input/commands/platform-services-runtime.ts +2 -2
- package/src/input/commands/policy-dispatch.ts +6 -6
- package/src/input/commands/power-runtime.ts +6 -6
- package/src/input/commands/principals-runtime.ts +3 -3
- package/src/input/commands/product-runtime.ts +3 -3
- package/src/input/commands/profile-render.ts +13 -13
- package/src/input/commands/profile-runtime.ts +13 -13
- package/src/input/commands/profile-types.ts +13 -13
- package/src/input/commands/provider-accounts-runtime.ts +5 -5
- package/src/input/commands/provider.ts +10 -10
- package/src/input/commands/qrcode-runtime.ts +3 -3
- package/src/input/commands/queue-runtime.ts +6 -6
- package/src/input/commands/recall-files-config.ts +4 -4
- package/src/input/commands/recall-files-git.ts +3 -3
- package/src/input/commands/recall-files.ts +12 -12
- package/src/input/commands/recall-query.ts +3 -3
- package/src/input/commands/recall-review.ts +3 -3
- package/src/input/commands/recall-shared.ts +1 -1
- package/src/input/commands/relay-runtime.ts +5 -5
- package/src/input/commands/remote-runtime.ts +3 -3
- package/src/input/commands/review-runtime.ts +8 -8
- package/src/input/commands/rewind-runtime.ts +21 -21
- package/src/input/commands/runtime-services.ts +1 -2
- package/src/input/commands/schedule-nl.ts +2 -2
- package/src/input/commands/schedule-runtime.ts +2 -2
- package/src/input/commands/secret-runtime.ts +3 -3
- package/src/input/commands/session-content.ts +7 -7
- package/src/input/commands/session-picker-filter.ts +3 -3
- package/src/input/commands/session-workflow.ts +10 -10
- package/src/input/commands/session.ts +15 -15
- package/src/input/commands/settings-sync-runtime.ts +2 -2
- package/src/input/commands/share-runtime.ts +4 -4
- package/src/input/commands/shell-core.ts +11 -11
- package/src/input/commands/tasks-runtime.ts +4 -4
- package/src/input/commands/test-runtime.ts +6 -6
- package/src/input/commands/tts-runtime.ts +4 -4
- package/src/input/commands/update-runtime.ts +27 -27
- package/src/input/commands/websearch-runtime.ts +2 -2
- package/src/input/commands/work-plan-runtime.ts +2 -2
- package/src/input/commands/workstream-attempt-dependents.ts +4 -4
- package/src/input/commands/workstream-attempts.ts +16 -16
- package/src/input/commands/workstream-runtime.ts +36 -36
- package/src/input/commands/worktree-runtime.ts +6 -6
- package/src/input/composer-capture.ts +5 -5
- package/src/input/concealed-input.ts +2 -2
- package/src/input/config-modal-types.ts +16 -16
- package/src/input/config-modal.ts +30 -30
- package/src/input/daemon-owned-settings-descriptions.ts +4 -4
- package/src/input/delete-key-policy.ts +1 -1
- package/src/input/exec-env-scrub-config.ts +7 -7
- package/src/input/feature-unit-layout.ts +5 -5
- package/src/input/feed-context-factory.ts +38 -38
- package/src/input/file-picker.ts +1 -1
- package/src/input/handler-command-route.ts +2 -2
- package/src/input/handler-content-actions.ts +8 -8
- package/src/input/handler-feed-routes.ts +13 -13
- package/src/input/handler-feed.ts +31 -31
- package/src/input/handler-interactions.ts +2 -2
- package/src/input/handler-modal-routes.ts +13 -13
- package/src/input/handler-modal-stack.ts +1 -1
- package/src/input/handler-modal-token-routes.ts +1 -1
- package/src/input/handler-onboarding-daemon-adopt.ts +6 -6
- package/src/input/handler-picker-routes.ts +7 -7
- package/src/input/handler-prompt-buffer.ts +1 -1
- package/src/input/handler-shortcuts.ts +12 -12
- package/src/input/handler-types.ts +3 -3
- package/src/input/handler-ui-state.ts +1 -1
- package/src/input/handler.ts +9 -9
- package/src/input/input-history.ts +1 -1
- package/src/input/keybindings.ts +13 -13
- package/src/input/kill-ring.ts +7 -11
- package/src/input/model-picker-filter.ts +3 -3
- package/src/input/model-picker-items.ts +5 -5
- package/src/input/model-picker-types.ts +2 -2
- package/src/input/model-picker.ts +18 -18
- package/src/input/onboarding/onboarding-feature-units.ts +9 -13
- package/src/input/onboarding/onboarding-provider-key-fields.ts +3 -3
- package/src/input/onboarding/onboarding-runtime-status.ts +3 -3
- package/src/input/onboarding/onboarding-wizard-apply.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-cloudflare-step.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-constants.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +4 -4
- package/src/input/onboarding/onboarding-wizard-network-adopt.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-steps.ts +2 -2
- package/src/input/panel-integration-actions.ts +3 -3
- package/src/input/panel-mouse-geometry.ts +1 -1
- package/src/input/panel-paste-flood-guard.ts +9 -9
- package/src/input/payments-config.ts +15 -15
- package/src/input/profile-picker-modal.ts +1 -1
- package/src/input/provider-key-intake.ts +9 -9
- package/src/input/relay-settings-descriptions.ts +3 -3
- package/src/input/sandbox-exec-config.ts +9 -9
- package/src/input/search.ts +18 -18
- package/src/input/selection-modal-queue.ts +10 -10
- package/src/input/selection-modal.ts +2 -2
- package/src/input/session-picker-modal.ts +7 -7
- package/src/input/settings-modal-activation.ts +1 -1
- package/src/input/settings-modal-adjustment.ts +2 -2
- package/src/input/settings-modal-commit.ts +6 -6
- package/src/input/settings-modal-connections.ts +2 -2
- package/src/input/settings-modal-data.ts +29 -29
- package/src/input/settings-modal-mutations.ts +7 -7
- package/src/input/settings-modal-reset.ts +3 -3
- package/src/input/settings-modal-search.ts +6 -6
- package/src/input/settings-modal-secrets.ts +3 -3
- package/src/input/settings-modal-types.ts +16 -16
- package/src/input/settings-modal.ts +4 -4
- package/src/input/voice-local-settings.ts +3 -3
- package/src/input/worktree-setup-config.ts +8 -8
- package/src/main.ts +15 -15
- package/src/panels/agent-inspector-shared.ts +5 -5
- package/src/panels/base-panel.ts +3 -3
- package/src/panels/builtin/agent.ts +3 -3
- package/src/panels/builtin/development.ts +4 -4
- package/src/panels/builtin/knowledge.ts +1 -1
- package/src/panels/builtin/operations.ts +12 -12
- package/src/panels/builtin/session.ts +8 -8
- package/src/panels/builtin/shared.ts +6 -6
- package/src/panels/builtin-modals.ts +8 -8
- package/src/panels/confirm-state.ts +5 -5
- package/src/panels/cost-tracker-panel.ts +22 -22
- package/src/panels/diff-panel.ts +20 -20
- package/src/panels/diff-review-model.ts +5 -5
- package/src/panels/diff-review-panel.ts +5 -5
- package/src/panels/eval-registry.ts +2 -2
- package/src/panels/expandable-list-panel.ts +5 -5
- package/src/panels/fleet-acts.ts +20 -20
- package/src/panels/fleet-deep-link.ts +5 -5
- package/src/panels/fleet-gateway.ts +12 -12
- package/src/panels/fleet-observed-render.ts +11 -11
- package/src/panels/fleet-panel-format.ts +14 -14
- package/src/panels/fleet-panel-worktree-detail.ts +8 -8
- package/src/panels/fleet-panel.ts +34 -34
- package/src/panels/fleet-read-model.ts +49 -49
- package/src/panels/fleet-spawn.ts +15 -15
- package/src/panels/fleet-steer.ts +7 -7
- package/src/panels/fleet-stop.ts +5 -5
- package/src/panels/fleet-tabs.ts +14 -14
- package/src/panels/fleet-transcript.ts +26 -26
- package/src/panels/git-panel.ts +8 -8
- package/src/panels/hosted-session-feed.ts +13 -13
- package/src/panels/hosted-session-panel.ts +7 -7
- package/src/panels/index.ts +1 -1
- package/src/panels/local-auth-panel.ts +15 -15
- package/src/panels/memory-consolidation-gateway.ts +8 -8
- package/src/panels/modals/devices-modal.ts +8 -8
- package/src/panels/modals/hooks-modal.ts +1 -1
- package/src/panels/modals/keybindings-modal.ts +5 -5
- package/src/panels/modals/knowledge-modal.ts +2 -2
- package/src/panels/modals/local-auth-modal.ts +4 -4
- package/src/panels/modals/marketplace-modal.ts +3 -3
- package/src/panels/modals/memory-modal.ts +19 -19
- package/src/panels/modals/modal-surface-helpers.ts +1 -1
- package/src/panels/modals/modal-theme.ts +3 -3
- package/src/panels/modals/pairing-modal.ts +19 -19
- package/src/panels/modals/planning-modal.ts +4 -4
- package/src/panels/modals/plugins-modal.ts +1 -1
- package/src/panels/modals/policy-modal.ts +4 -4
- package/src/panels/modals/provider-health-modal.ts +1 -1
- package/src/panels/modals/remote-modal.ts +1 -1
- package/src/panels/modals/sandbox-modal.ts +2 -2
- package/src/panels/modals/security-modal.ts +4 -4
- package/src/panels/modals/services-modal.ts +1 -1
- package/src/panels/modals/work-plan-modal.ts +4 -4
- package/src/panels/notifications-feed.ts +6 -6
- package/src/panels/notifications-panel.ts +6 -6
- package/src/panels/panel-confirm-overlay.ts +4 -4
- package/src/panels/panel-manager.ts +13 -13
- package/src/panels/plugins-panel.ts +6 -6
- package/src/panels/polish-core.ts +2 -2
- package/src/panels/polish-tables.ts +2 -2
- package/src/panels/polish.ts +1 -1
- package/src/panels/project-planning-answer-actions.ts +3 -3
- package/src/panels/scrollable-list-panel.ts +15 -15
- package/src/panels/search-focus.ts +1 -1
- package/src/panels/session-maintenance.ts +1 -1
- package/src/panels/skills-panel.ts +3 -3
- package/src/panels/token-budget-panel.ts +11 -11
- package/src/panels/types.ts +14 -14
- package/src/panels/workstream-graph-render.ts +5 -5
- package/src/panels/wrfc-panel-format.ts +1 -1
- package/src/permissions/broker-approval-card.ts +13 -13
- package/src/permissions/hunk-selection.ts +13 -13
- package/src/permissions/prompt.ts +22 -22
- package/src/permissions/sandbox-exec-gate.ts +5 -5
- package/src/providers/provider-classification.ts +1 -1
- package/src/providers/reasoning-effort-surface.ts +12 -12
- package/src/renderer/ansi-sanitize.ts +5 -6
- package/src/renderer/autocomplete-overlay.ts +5 -5
- package/src/renderer/block-actions-overlay.ts +1 -1
- package/src/renderer/bookmark-modal.ts +1 -1
- package/src/renderer/code-block.ts +2 -2
- package/src/renderer/compaction-history-modal.ts +4 -4
- package/src/renderer/compaction-preview.ts +5 -5
- package/src/renderer/compaction-quality.ts +5 -5
- package/src/renderer/composer-fragments.ts +6 -6
- package/src/renderer/compositor.ts +9 -9
- package/src/renderer/config-modal.ts +3 -3
- package/src/renderer/context-inspector.ts +1 -1
- package/src/renderer/context-status-hint.ts +10 -10
- package/src/renderer/conversation-layout.ts +2 -2
- package/src/renderer/conversation-overlays.ts +2 -2
- package/src/renderer/conversation-surface.ts +6 -6
- package/src/renderer/diff.ts +4 -4
- package/src/renderer/fleet-tab-strip.ts +2 -2
- package/src/renderer/footer-tips.ts +4 -4
- package/src/renderer/fullscreen-primitives.ts +1 -1
- package/src/renderer/git-status.ts +5 -5
- package/src/renderer/header-line.ts +5 -5
- package/src/renderer/help-overlay.ts +5 -5
- package/src/renderer/hint-grammar.ts +2 -2
- package/src/renderer/layout.ts +1 -1
- package/src/renderer/markdown-inline.ts +3 -3
- package/src/renderer/markdown-table.ts +7 -7
- package/src/renderer/modal-factory.ts +3 -3
- package/src/renderer/model-picker-overlay.ts +2 -2
- package/src/renderer/model-workspace.ts +7 -7
- package/src/renderer/onboarding/onboarding-wizard.ts +1 -1
- package/src/renderer/overlay-box.ts +1 -1
- package/src/renderer/panel-composite.ts +5 -5
- package/src/renderer/panel-workspace-bar.ts +1 -1
- package/src/renderer/process-indicator.ts +8 -8
- package/src/renderer/profile-picker-modal.ts +3 -3
- package/src/renderer/prompt-content-width.ts +1 -1
- package/src/renderer/search-overlay.ts +3 -3
- package/src/renderer/selection-modal-overlay.ts +6 -6
- package/src/renderer/semantic-diff.ts +6 -7
- package/src/renderer/session-picker-modal.ts +24 -24
- package/src/renderer/settings-modal-connections.ts +3 -3
- package/src/renderer/settings-modal-helpers.ts +16 -16
- package/src/renderer/settings-modal.ts +10 -10
- package/src/renderer/shell-surface.ts +8 -8
- package/src/renderer/status-glyphs.ts +6 -6
- package/src/renderer/syntax-highlighter.ts +2 -3
- package/src/renderer/system-message.ts +3 -3
- package/src/renderer/tab-strip.ts +2 -2
- package/src/renderer/term-caps.ts +12 -12
- package/src/renderer/terminal-bg-probe.ts +10 -10
- package/src/renderer/terminal-escapes.ts +1 -1
- package/src/renderer/theme-mode-config.ts +3 -3
- package/src/renderer/theme.ts +34 -34
- package/src/renderer/thinking.ts +1 -1
- package/src/renderer/tool-call.ts +5 -5
- package/src/renderer/tool-result-expanded-lines.ts +3 -3
- package/src/renderer/tool-result-summary.ts +6 -6
- package/src/renderer/turn-injection.ts +9 -9
- package/src/renderer/ui-factory.ts +33 -33
- package/src/renderer/ui-primitives.ts +4 -4
- package/src/runtime/bootstrap-command-parts.ts +3 -3
- package/src/runtime/bootstrap-core.ts +21 -21
- package/src/runtime/bootstrap-hook-bridge.ts +8 -8
- package/src/runtime/bootstrap-shell.ts +9 -9
- package/src/runtime/bootstrap.ts +16 -16
- package/src/runtime/client/approval-updates.ts +3 -3
- package/src/runtime/client/build-floors.ts +7 -7
- package/src/runtime/client/daemon-attach-handshake.ts +5 -5
- package/src/runtime/client/fleet-union.ts +7 -7
- package/src/runtime/client/host-service-status.ts +2 -2
- package/src/runtime/client/hosted-exit.ts +4 -4
- package/src/runtime/client/hosted-roster.ts +4 -4
- package/src/runtime/client/hosted-session-stream.ts +5 -5
- package/src/runtime/client/hosted-sessions.ts +8 -8
- package/src/runtime/client/operator-endpoint.ts +14 -14
- package/src/runtime/client/spine-adoption.ts +8 -8
- package/src/runtime/context-accounting-source.ts +4 -4
- package/src/runtime/context.ts +2 -2
- package/src/runtime/conversation-rewind-port.ts +6 -6
- package/src/runtime/credential-composition.ts +2 -2
- package/src/runtime/daemon-attach-notices.ts +6 -6
- package/src/runtime/diagnostics/panels/index.ts +1 -1
- package/src/runtime/diagnostics/panels/ops.ts +2 -2
- package/src/runtime/disposal-wiring.ts +6 -6
- package/src/runtime/index.ts +11 -11
- package/src/runtime/install-self-check-startup.ts +4 -4
- package/src/runtime/install-self-check.ts +6 -6
- package/src/runtime/interaction-seams.ts +4 -4
- package/src/runtime/knowledge-services.ts +2 -2
- package/src/runtime/legacy-daemon-migration.ts +37 -37
- package/src/runtime/legacy-daemon-reconcile.ts +30 -30
- package/src/runtime/memory-governance-services.ts +3 -3
- package/src/runtime/memory-spine-transport.ts +3 -3
- package/src/runtime/notification-dispatch.ts +4 -4
- package/src/runtime/onboarding/apply.ts +1 -1
- package/src/runtime/onboarding/derivation.ts +1 -1
- package/src/runtime/onboarding/fast-path.ts +7 -7
- package/src/runtime/onboarding/progress.ts +2 -2
- package/src/runtime/onboarding/provider-key-capture.ts +4 -4
- package/src/runtime/onboarding/snapshot.ts +2 -2
- package/src/runtime/onboarding/state.ts +4 -4
- package/src/runtime/onboarding/types.ts +4 -4
- package/src/runtime/orchestrator-core-services.ts +5 -5
- package/src/runtime/path-shadow-startup.ts +3 -3
- package/src/runtime/perf/panel-contracts.ts +1 -1
- package/src/runtime/power-keepawake-remote.ts +6 -6
- package/src/runtime/process-lifecycle.ts +14 -14
- package/src/runtime/provider-fallback.ts +3 -3
- package/src/runtime/recovery-autosave.ts +3 -3
- package/src/runtime/recovery-decisions.ts +19 -19
- package/src/runtime/recovery-offer-wiring.ts +4 -4
- package/src/runtime/recovery-prompt.ts +20 -20
- package/src/runtime/relay-reachability-bridge.ts +3 -3
- package/src/runtime/release-artifacts.ts +1 -1
- package/src/runtime/resume-notice.ts +20 -20
- package/src/runtime/runtime-services-types.ts +20 -20
- package/src/runtime/services.ts +20 -20
- package/src/runtime/session-continuity-hints.ts +1 -1
- package/src/runtime/session-inbound-inputs.ts +12 -12
- package/src/runtime/session-resume-liveness-confirm.ts +4 -4
- package/src/runtime/session-spine-transport.ts +3 -3
- package/src/runtime/store/domains/panels.ts +2 -2
- package/src/runtime/store/domains/ui-perf.ts +2 -2
- package/src/runtime/store/index.ts +1 -1
- package/src/runtime/store/selectors/index.ts +1 -1
- package/src/runtime/store/state.ts +2 -2
- package/src/runtime/ui-services.ts +3 -3
- package/src/runtime/workspace-checkpointing.ts +3 -3
- package/src/runtime/wrfc-persistence.ts +15 -15
- package/src/scripts/process-messages.ts +1 -1
- package/src/shell/blocking-input.ts +9 -9
- package/src/shell/recovery-input-helpers.ts +2 -2
- package/src/shell/retry-affordance.ts +9 -9
- package/src/shell/ui-openers.ts +14 -14
- package/src/shell/voice-capture-shell.ts +3 -3
- package/src/tools/wrfc-agent-guard.ts +4 -4
- package/src/utils/browser.ts +2 -2
- package/src/utils/format-duration.ts +3 -3
- package/src/utils/format-number.ts +2 -2
- package/src/utils/splash-lines.ts +4 -4
- package/src/utils/terminal-width.ts +6 -6
- package/src/verification/verification-ledger.ts +25 -25
- package/src/version.ts +3 -3
package/src/shell/ui-openers.ts
CHANGED
|
@@ -56,7 +56,7 @@ type WireShellUiOpenersOptions = {
|
|
|
56
56
|
getConfiguredProviderIds: () => string[];
|
|
57
57
|
getPinned: () => Promise<string[]>;
|
|
58
58
|
render: () => void;
|
|
59
|
-
/** Trust-at-consequence-time bridge
|
|
59
|
+
/** Trust-at-consequence-time bridge, patched here with the real modal-driving implementation. */
|
|
60
60
|
trustPromptRef: { requestTrustDecision: () => Promise<WorkspaceTrustLevel> };
|
|
61
61
|
};
|
|
62
62
|
|
|
@@ -90,7 +90,7 @@ function deriveConfiguredVia(
|
|
|
90
90
|
): 'env' | 'secrets' | 'subscription' | 'anonymous' | undefined {
|
|
91
91
|
if (!configuredIds.has(providerId)) return undefined;
|
|
92
92
|
|
|
93
|
-
// Tier 1: subscription check (most specific
|
|
93
|
+
// Tier 1: subscription check (most specific, subscription overrides env for this provider)
|
|
94
94
|
const subs = subscriptionManager.list();
|
|
95
95
|
if (subs.some((s) => s.provider === providerId)) return 'subscription';
|
|
96
96
|
|
|
@@ -148,7 +148,7 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
|
|
|
148
148
|
|
|
149
149
|
// Trust-at-consequence-time: raised by trustGatedAsk on the first non-read
|
|
150
150
|
// request in an undecided workspace; the answer persists via setLevel().
|
|
151
|
-
// Registration self-records here too when trusted (never for restricted
|
|
151
|
+
// Registration self-records here too when trusted (never for restricted,
|
|
152
152
|
// see selfRecordWorkspaceRegistration's doc).
|
|
153
153
|
trustPromptRef.requestTrustDecision = () =>
|
|
154
154
|
new Promise((resolve) => {
|
|
@@ -205,7 +205,7 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
|
|
|
205
205
|
* Fetch the embedding-provider status list once per picker-open and shape
|
|
206
206
|
* it into the picker's own tiny item type. Uses the registry's async
|
|
207
207
|
* `.status()` (not the sync `.list()`) specifically because `.list()` does
|
|
208
|
-
* not carry `configured
|
|
208
|
+
* not carry `configured`, and unconfigured providers must be shown
|
|
209
209
|
* honestly, not hidden.
|
|
210
210
|
*/
|
|
211
211
|
async function resolveEmbeddingProviderEntries(): Promise<EmbeddingProviderPickerEntry[]> {
|
|
@@ -274,7 +274,7 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
|
|
|
274
274
|
{
|
|
275
275
|
target: 'embeddings',
|
|
276
276
|
label: 'Embeddings',
|
|
277
|
-
description: 'Embedding provider used for memory search and the code index. Not an LLM route
|
|
277
|
+
description: 'Embedding provider used for memory search and the code index. Not an LLM route: no model concept.',
|
|
278
278
|
provider: embeddingProviderId,
|
|
279
279
|
model: '',
|
|
280
280
|
enabled: true,
|
|
@@ -386,7 +386,7 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
|
|
|
386
386
|
};
|
|
387
387
|
|
|
388
388
|
// Mirrors the Ctrl+F chord's own toggle exactly (handler-shortcuts.ts's
|
|
389
|
-
// 'search' case)
|
|
389
|
+
// 'search' case), the transcript search overlay isn't tracked on the
|
|
390
390
|
// modal stack, so this doesn't call modalOpened either.
|
|
391
391
|
commandContext.openTranscriptSearch = () => {
|
|
392
392
|
if (input.searchManager.active) input.searchManager.close(input.conversationManager);
|
|
@@ -411,7 +411,7 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
|
|
|
411
411
|
input.modalOpened('settings');
|
|
412
412
|
input.settingsModal.open(configManager, featureFlags, subscriptionManager, serviceRegistry, mcpRegistry, secretsManager, {
|
|
413
413
|
// The Connections category probes through this app's catalog, which is
|
|
414
|
-
// empty by construction
|
|
414
|
+
// empty by construction, so those rows read 'unreachable' rather than
|
|
415
415
|
// inventing a settled state nothing established. Retargeting that probe
|
|
416
416
|
// at the daemon is the remaining half of this seam.
|
|
417
417
|
...(commandContext.workspace?.gatewayMethods
|
|
@@ -451,11 +451,11 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
|
|
|
451
451
|
// open()-time modal-redirect callback (a legacy panel id resolving to a modal
|
|
452
452
|
// name). Surfaces are registered in builtin-modals.ts; a name with no
|
|
453
453
|
// registered surface degrades honestly to a print rather than a blank modal.
|
|
454
|
-
// The stack name is the stable 'config' slot (one config modal at a time
|
|
454
|
+
// The stack name is the stable 'config' slot (one config modal at a time,
|
|
455
455
|
// opening another swaps the surface), so Esc close/return and the modal-stack
|
|
456
456
|
// machinery need only the single 'config' case (handler-ui-state.ts).
|
|
457
457
|
// Some panel-id redirects (and migrated front-doors) resolve to a NATIVE
|
|
458
|
-
// modal that is not a ConfigModalSurface
|
|
458
|
+
// modal that is not a ConfigModalSurface, e.g. `sessions` -> `sessionPicker`,
|
|
459
459
|
// where 'sessionPicker' is the real session-picker modal opened by
|
|
460
460
|
// commandContext.openSessionPicker below, NOT a registered config surface.
|
|
461
461
|
// getModalSurface can never find these, so consult this small name->opener
|
|
@@ -513,7 +513,7 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
|
|
|
513
513
|
}
|
|
514
514
|
if (panelManager.getAllOpen().length === 0) {
|
|
515
515
|
// (the purge): 'panel-list' (a browse-all-panels picker PANEL)
|
|
516
|
-
// was DELETE-disposition
|
|
516
|
+
// was DELETE-disposition, a picker over a handful of panels is dead
|
|
517
517
|
// weight now. Its replacement is this selection MODAL, built from the
|
|
518
518
|
// live registry (PanelManager.getRegisteredTypes()) rather than a
|
|
519
519
|
// hardcoded list, so it can never list a retired/deleted id.
|
|
@@ -547,8 +547,8 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
|
|
|
547
547
|
commandContext.getCommandCategories = () => getCommandCategoryMap();
|
|
548
548
|
|
|
549
549
|
commandContext.openCommandPalette = () => {
|
|
550
|
-
// The palette is built live from the command registry
|
|
551
|
-
// list
|
|
550
|
+
// The palette is built live from the command registry, never a hardcoded
|
|
551
|
+
// list, so it can never drift from the real command set. Category labels
|
|
552
552
|
// come from the same source the generated docs use (getCommandCategoryMap).
|
|
553
553
|
const registry = input.commandRegistry;
|
|
554
554
|
if (!registry) return;
|
|
@@ -582,7 +582,7 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
|
|
|
582
582
|
// Pre-fill the composer with the command (and a trailing space so the
|
|
583
583
|
// inline args hint shows what the command wants). Keyboard-first: focus
|
|
584
584
|
// returns to the composer with command mode armed so the user fills any
|
|
585
|
-
// args and presses Enter
|
|
585
|
+
// args and presses Enter, matching tab-completion's fill behavior.
|
|
586
586
|
input.prompt = `/${cmd.name} `;
|
|
587
587
|
input.cursorPos = input.prompt.length;
|
|
588
588
|
input.commandMode = true;
|
|
@@ -610,7 +610,7 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
|
|
|
610
610
|
panelManager.open(panelId, pane, target);
|
|
611
611
|
panelManager.show();
|
|
612
612
|
// focus rule 1a: every registered caller of showPanel is a slash
|
|
613
|
-
// command (/panel open, /routes, /approval, /tasks, /ops-control, ...)
|
|
613
|
+
// command (/panel open, /routes, /approval, /tasks, /ops-control, ...),
|
|
614
614
|
// the command path leaves focus in the composer ("the user is
|
|
615
615
|
// mid-command-flow") unless the caller explicitly asks to grab it.
|
|
616
616
|
if (opts?.focus) panelManager.focusPanels();
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* voice-capture-shell.ts
|
|
2
|
+
* voice-capture-shell.ts, the shell's side of microphone capture.
|
|
3
3
|
*
|
|
4
4
|
* Extracted from main() for the same reason the process-lifecycle wiring was:
|
|
5
5
|
* the entrypoint is a wiring file held under a source-line gate, and new shell
|
|
6
6
|
* composition gets its own module and a single call there.
|
|
7
7
|
*
|
|
8
|
-
* What this owns is only the shell-facing half
|
|
8
|
+
* What this owns is only the shell-facing half, where a transcript lands (the
|
|
9
9
|
* composer draft, through the same public `prompt`/`cursorPos` fields the
|
|
10
10
|
* external-editor path writes), how a turn is submitted, which keybinding seam
|
|
11
11
|
* the Alt+V action hangs off, and the teardown registration that guarantees a
|
|
@@ -30,7 +30,7 @@ export interface VoiceCaptureShellDeps {
|
|
|
30
30
|
readonly commandContext: CommandContext;
|
|
31
31
|
/** The shell's teardown registry; the device release is appended to it. */
|
|
32
32
|
readonly unsubs: Array<() => void>;
|
|
33
|
-
/** The live composer buffer
|
|
33
|
+
/** The live composer buffer, InputHandler exposes public `prompt`/`cursorPos`. */
|
|
34
34
|
readonly buffer: { prompt: string; cursorPos: number };
|
|
35
35
|
readonly submitInput: (text: string) => void;
|
|
36
36
|
readonly notify: (message: string) => void;
|
|
@@ -46,8 +46,8 @@ type AgentTaskArgs = {
|
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
48
|
* Emitted whenever the guard changes the effective routing decision:
|
|
49
|
-
* - 'spawn-forced-wrfc'
|
|
50
|
-
* - 'spawn-suppressed-wrfc'
|
|
49
|
+
* - 'spawn-forced-wrfc' , implementation-like spawn promoted to WRFC
|
|
50
|
+
* - 'spawn-suppressed-wrfc' , spawn judged read-only; WRFC suppressed
|
|
51
51
|
* - 'batch-collapsed-to-wrfc'— batch-spawn collapsed into a single WRFC owner chain
|
|
52
52
|
*/
|
|
53
53
|
export type WrfcGuardTraceKind =
|
|
@@ -248,7 +248,7 @@ function isImplementationLikeTask(task: AgentTaskArgs): boolean {
|
|
|
248
248
|
function isReadOnlyTask(text: string): boolean {
|
|
249
249
|
// Branch A: explicit do-not-write guards
|
|
250
250
|
if (/\bdo\s+not\s+(?:write|edit|modify|change|create)\b|\bread[-\s]*only\b|\bwithout\s+(?:writing|editing|modifying|changing|creating)\b/i.test(text)) return true;
|
|
251
|
-
// Branch B: task leads with an analysis/reporting verb
|
|
251
|
+
// Branch B: task leads with an analysis/reporting verb, treat it as read-only regardless
|
|
252
252
|
// of any action verbs that appear later in the sentence. A task that LEADS with
|
|
253
253
|
// "report", "investigate", "describe", "audit", etc. is describing or evaluating an
|
|
254
254
|
// action, not performing it. Examples that must NOT reach WRFC:
|
|
@@ -259,7 +259,7 @@ function isReadOnlyTask(text: string): boolean {
|
|
|
259
259
|
// "audit which modules to delete"
|
|
260
260
|
// "evaluate whether to migrate"
|
|
261
261
|
// The negative-lookahead is intentionally absent: the leading verb is authoritative.
|
|
262
|
-
// Note: 'review' is intentionally excluded
|
|
262
|
+
// Note: 'review' is intentionally excluded, tasks leading with 'review' are caught
|
|
263
263
|
// by isRootReviewRoleTask() and routed to a WRFC chain as a reviewer role.
|
|
264
264
|
return /^\s*(?:inspect|research|read|find|list|summarize|analy[sz]e|explain|report|investigate|document|describe|audit|evaluate|assess|check|compare|tell|show)\b/i.test(text);
|
|
265
265
|
}
|
package/src/utils/browser.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* browser.ts
|
|
2
|
+
* browser.ts, cross-platform browser launcher utility.
|
|
3
3
|
*
|
|
4
4
|
* Extracted from cli/management.ts so it can be used by input-layer commands
|
|
5
5
|
* without creating an upward cli→input dependency. Lives in utils (Layer 0)
|
|
@@ -12,7 +12,7 @@ import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
|
|
|
12
12
|
/**
|
|
13
13
|
* Open the given URL in the user's default browser.
|
|
14
14
|
* Returns a status string (success or error description).
|
|
15
|
-
* Does not throw
|
|
15
|
+
* Does not throw, errors are returned as a descriptive string.
|
|
16
16
|
*/
|
|
17
17
|
export function openBrowser(url: string): string {
|
|
18
18
|
const platform = process.platform;
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
* Shared ms-duration formatters for the panel layer.
|
|
3
3
|
*
|
|
4
4
|
* Two families are exported, each matching a distinct behavior cluster.
|
|
5
|
-
* DO NOT replace these with formatElapsed from utils/format-elapsed.ts
|
|
5
|
+
* DO NOT replace these with formatElapsed from utils/format-elapsed.ts,
|
|
6
6
|
* formatElapsed floors to integer seconds and lacks the null/'?ms' guards
|
|
7
7
|
* that the latency panels require.
|
|
8
8
|
*
|
|
9
9
|
* (the purge): formatShortDuration (used only by incident-review-panel
|
|
10
|
-
* and eval-panel, both removed
|
|
11
|
-
* was removed as a genuinely orphaned export
|
|
10
|
+
* and eval-panel, both removed, RETIRE-INTO-FLEET and DELETE respectively)
|
|
11
|
+
* was removed as a genuinely orphaned export, no remaining caller anywhere
|
|
12
12
|
* in src/.
|
|
13
13
|
*/
|
|
14
14
|
|
|
@@ -30,7 +30,7 @@ export interface AbbreviateCountOpts {
|
|
|
30
30
|
mDecimals?: number;
|
|
31
31
|
/**
|
|
32
32
|
* 'fixed' → value.toFixed(decimals) (default)
|
|
33
|
-
* 'round' → String(Math.round(value))
|
|
33
|
+
* 'round' → String(Math.round(value)), always integer, decimals ignored
|
|
34
34
|
*/
|
|
35
35
|
rounding?: 'fixed' | 'round';
|
|
36
36
|
/**
|
|
@@ -39,7 +39,7 @@ export interface AbbreviateCountOpts {
|
|
|
39
39
|
*/
|
|
40
40
|
bSuffix?: boolean;
|
|
41
41
|
/**
|
|
42
|
-
* When true, never produce M/B/T
|
|
42
|
+
* When true, never produce M/B/T, format as k even for millions.
|
|
43
43
|
* Default: false
|
|
44
44
|
*/
|
|
45
45
|
noM?: boolean;
|
|
@@ -23,7 +23,7 @@ const TAGLINE = '[ good vibes ・ A I ・ いい雰囲気
|
|
|
23
23
|
const versionLine = (version: string) =>
|
|
24
24
|
` ✦ v${version} █ terminal AI assistant █ 自動コード ✦`;
|
|
25
25
|
|
|
26
|
-
/** Fixed hint line
|
|
26
|
+
/** Fixed hint line, the three primary shell entry points. */
|
|
27
27
|
const HINT_LINE = 'Ctrl+P panels / ? help / F2 fleet';
|
|
28
28
|
|
|
29
29
|
export interface SplashOptions {
|
|
@@ -38,7 +38,7 @@ export interface SplashOptions {
|
|
|
38
38
|
lastSessionId?: string;
|
|
39
39
|
/**
|
|
40
40
|
* Version string rendered on the splash's version line. Defaults to the
|
|
41
|
-
* build VERSION; injectable so the golden-frame tests can pin a fixture
|
|
41
|
+
* build VERSION; injectable so the golden-frame tests can pin a fixture,
|
|
42
42
|
* the version's display width shifts the line's centering, so goldens tied
|
|
43
43
|
* to the live VERSION break on every release bump (v1.0.0 release failure).
|
|
44
44
|
*/
|
|
@@ -66,7 +66,7 @@ export function getSplashLines(columns: number, opts: SplashOptions = {}): strin
|
|
|
66
66
|
'',
|
|
67
67
|
];
|
|
68
68
|
|
|
69
|
-
// Live session context
|
|
69
|
+
// Live session context, real state pulled from SplashOptions rather than a
|
|
70
70
|
// static "/help" signpost: model (provider) and tool count on one line, cwd
|
|
71
71
|
// on the next.
|
|
72
72
|
const contextBits: string[] = [];
|
|
@@ -85,7 +85,7 @@ export function getSplashLines(columns: number, opts: SplashOptions = {}): strin
|
|
|
85
85
|
|
|
86
86
|
// Last-session resume pointer (readLastSessionPointer result), when recorded.
|
|
87
87
|
if (opts.lastSessionId) {
|
|
88
|
-
lines.push(metaLine(`↩ resume last session
|
|
88
|
+
lines.push(metaLine(`↩ resume last session: /resume ${opts.lastSessionId}`, columns));
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
lines.push('');
|
|
@@ -52,7 +52,7 @@ function stripAnsi(text: string): string {
|
|
|
52
52
|
* each component's width is summed and ZWJ/VS chars contribute zero width,
|
|
53
53
|
* so the total is accurate. However, truncation (truncateDisplay) may split
|
|
54
54
|
* a ZWJ family mid-sequence, leaving dangling ZWJ/VS characters. This is a
|
|
55
|
-
* cosmetic degradation only
|
|
55
|
+
* cosmetic degradation only, line widths remain correct.
|
|
56
56
|
*/
|
|
57
57
|
export function getDisplayWidth(text: string): number {
|
|
58
58
|
text = stripAnsi(text);
|
|
@@ -86,7 +86,7 @@ export function getDisplayWidth(text: string): number {
|
|
|
86
86
|
code === 0x2717 ||
|
|
87
87
|
code === 0x2714 ||
|
|
88
88
|
code === 0x2718 ||
|
|
89
|
-
// ✕ (0x2715) and ✖ (0x2716)
|
|
89
|
+
// ✕ (0x2715) and ✖ (0x2716), the multiplication-X cross family used for
|
|
90
90
|
// the error-line prefix. Terminals draw them one cell wide, but they sit
|
|
91
91
|
// inside the 0x2600–0x27bf emoji block below and would otherwise be counted
|
|
92
92
|
// as width 2, desyncing the styled cell grid from the physical glyph and
|
|
@@ -176,12 +176,12 @@ export interface PrioritizedSegment {
|
|
|
176
176
|
/**
|
|
177
177
|
* Join segments left-to-right with `separator`, but when the joined line
|
|
178
178
|
* would exceed `width`, drop whole low-priority segments (highest `priority`
|
|
179
|
-
* number first) one at a time until it fits
|
|
179
|
+
* number first) one at a time until it fits, rather than character-truncating
|
|
180
180
|
* the joined string, which can mangle a high-value segment mid-word (e.g. a
|
|
181
181
|
* `spine:online` daemon-liveness marker clipped to `spi…`).
|
|
182
182
|
*
|
|
183
183
|
* Only falls back to character truncation (via truncateDisplay) if the
|
|
184
|
-
* remaining highest-priority segments still don't fit at width
|
|
184
|
+
* remaining highest-priority segments still don't fit at width, a rare,
|
|
185
185
|
* very-narrow-terminal case.
|
|
186
186
|
*/
|
|
187
187
|
export function joinPrioritizedSegments(
|
|
@@ -192,11 +192,11 @@ export function joinPrioritizedSegments(
|
|
|
192
192
|
const join = (list: readonly PrioritizedSegment[]) => list.map(s => s.text).join(separator);
|
|
193
193
|
let kept = segments;
|
|
194
194
|
// Keep dropping whole segments while more than one remains; once a single
|
|
195
|
-
// segment is left, stop
|
|
195
|
+
// segment is left, stop, an empty result would be a worse outcome than
|
|
196
196
|
// falling through to character truncation on that last segment below.
|
|
197
197
|
while (kept.length > 1 && getDisplayWidth(join(kept)) > width) {
|
|
198
198
|
// Drop the single lowest-priority (highest `priority` number) segment;
|
|
199
|
-
// ties broken toward the leftmost (earlier-declared) segment surviving
|
|
199
|
+
// ties broken toward the leftmost (earlier-declared) segment surviving,
|
|
200
200
|
// `>=` (not `>`) so that on equal priority the LATER index keeps winning
|
|
201
201
|
// as the drop candidate, leaving the earliest-declared segment of that
|
|
202
202
|
// priority tier intact (e.g. cwd survives over model when both are
|
|
@@ -43,21 +43,21 @@ const SETTINGS_BEHAVIOR_BASELINE = 184;
|
|
|
43
43
|
* knobs"). Adding these 28 keys raised the settings inventory `total` without a
|
|
44
44
|
* matching rise in behavior-verified coverage, which dropped
|
|
45
45
|
* `localBehaviorPercent` below its floor. Each key is a local, non-external
|
|
46
|
-
* setting whose full persistence behavior
|
|
47
|
-
* reload round-trip, and reset-to-default
|
|
46
|
+
* setting whose full persistence behavior, schema default, set → write →
|
|
47
|
+
* reload round-trip, and reset-to-default, is exercised by
|
|
48
48
|
* `src/test/verification/feature-knob-settings-persistence.test.ts`. They are
|
|
49
49
|
* therefore genuinely behavior-verified locally and counted as such here.
|
|
50
50
|
*/
|
|
51
51
|
/**
|
|
52
52
|
* The daemon's own mailbox and calendar keys (`surfaces.email.*`,
|
|
53
|
-
* `surfaces.calendar.*`), promoted into CONFIG_SCHEMA so the settings modal
|
|
54
|
-
* which renders from that schema
|
|
53
|
+
* `surfaces.calendar.*`), promoted into CONFIG_SCHEMA so the settings modal,
|
|
54
|
+
* which renders from that schema, can actually show them. Before, the
|
|
55
55
|
* daemon's handlers named these keys in their own error messages
|
|
56
56
|
* ("Set surfaces.calendar.caldavUrl and surfaces.calendar.caldavUser") while
|
|
57
57
|
* the UI that told an operator to set them could not display one of them.
|
|
58
58
|
*
|
|
59
59
|
* Declaring 25 keys raised the settings inventory `total` with no matching
|
|
60
|
-
* behavior coverage, which dropped `localBehaviorPercent` below its floor
|
|
60
|
+
* behavior coverage, which dropped `localBehaviorPercent` below its floor,
|
|
61
61
|
* the same arrival shape as the two lists above.
|
|
62
62
|
*
|
|
63
63
|
* THIS CONSTANT IS NOT A DIAL. Every key below is counted because
|
|
@@ -75,7 +75,7 @@ const SETTINGS_BEHAVIOR_BASELINE = 184;
|
|
|
75
75
|
* (platform/email/surface-config.ts and platform/calendar/caldav-gateway-config.ts)
|
|
76
76
|
* resolve every one of them when the daemon serves `email.*` and `calendar.*`,
|
|
77
77
|
* and the `surfaces.email.inbound.*` block is read by the daemon's inbound mail
|
|
78
|
-
* reader
|
|
78
|
+
* reader, the poller/IDLE path that makes incoming mail visible at all.
|
|
79
79
|
* The five password keys (email.password, email.imapPassword,
|
|
80
80
|
* email.imap.password, email.smtp.password, calendar.caldavPassword)
|
|
81
81
|
* additionally resolve through the daemon secret tier rather than from config,
|
|
@@ -106,7 +106,7 @@ export const DAEMON_MAILBOX_LOCAL_SETTINGS = [
|
|
|
106
106
|
'surfaces.email.smtp.port',
|
|
107
107
|
'surfaces.email.smtp.password',
|
|
108
108
|
'surfaces.email.smtp.secure',
|
|
109
|
-
// Inbound mail
|
|
109
|
+
// Inbound mail, the poller/IDLE reader the daemon runs to actually READ mail,
|
|
110
110
|
// which arrived with the platform runtime. These are counted for exactly the
|
|
111
111
|
// reason the keys above are: the same four-part persistence contract runs over
|
|
112
112
|
// every one of them in
|
|
@@ -179,14 +179,14 @@ export const FEATURE_KNOB_LOCAL_SETTINGS = [
|
|
|
179
179
|
* exercises it was actually written:
|
|
180
180
|
* `src/test/verification/device-and-trigger-settings-persistence.test.ts` runs,
|
|
181
181
|
* for every key in this list, the same four-part persistence contract the
|
|
182
|
-
* feature-knob keys are counted for
|
|
182
|
+
* feature-knob keys are counted for, schema default exposure, `set()` through
|
|
183
183
|
* the key's own validator to disk, reload into a fresh ConfigManager with
|
|
184
184
|
* read-back equality, and reset-to-default that also survives reload. That test
|
|
185
185
|
* additionally asserts this list is exactly the non-enablement key set of both
|
|
186
186
|
* domains and overlaps neither of the other counted sets, so nothing here is
|
|
187
187
|
* double-counted and nothing drifts in uncounted.
|
|
188
188
|
*
|
|
189
|
-
* PER-KEY EVIDENCE
|
|
189
|
+
* PER-KEY EVIDENCE, what is verified, and how live the key is TODAY.
|
|
190
190
|
* "persistence" below means the four-part contract above; the second column
|
|
191
191
|
* records whether anything in this tree (TUI or the pinned SDK) reads the key,
|
|
192
192
|
* audited by tracing each key to its consumers.
|
|
@@ -221,7 +221,7 @@ export const FEATURE_KNOB_LOCAL_SETTINGS = [
|
|
|
221
221
|
* device.grants.auditRetentionDays persistence · behavior (grant ledger retention)
|
|
222
222
|
* device.nodes.maxPaired persistence · live (enforced at the pairing path)
|
|
223
223
|
*
|
|
224
|
-
* On `device.nodes.maxPaired`: the SDK enforces it where a device pairs
|
|
224
|
+
* On `device.nodes.maxPaired`: the SDK enforces it where a device pairs,
|
|
225
225
|
* PairingTokenManager.mint refuses a NEW node at the cap with
|
|
226
226
|
* PairingLimitReachedError (code DEVICE_NODES_MAX_PAIRED, carrying the setting
|
|
227
227
|
* name, the cap and the live count), mapped to HTTP 409 by the pairing and
|
|
@@ -231,7 +231,7 @@ export const FEATURE_KNOB_LOCAL_SETTINGS = [
|
|
|
231
231
|
* non-finite value reads as no cap so a broken setting cannot lock the owner
|
|
232
232
|
* out. The cap is read per mint, so a change applies without a restart. What is
|
|
233
233
|
* counted HERE is still only the persistence contract this repo's test
|
|
234
|
-
* exercises
|
|
234
|
+
* exercises, the enforcement itself is SDK-side and SDK-tested, and is recorded
|
|
235
235
|
* in this column so the "how live is it" audit stays accurate, not to claim
|
|
236
236
|
* coverage this repo did not write.
|
|
237
237
|
*
|
|
@@ -239,7 +239,7 @@ export const FEATURE_KNOB_LOCAL_SETTINGS = [
|
|
|
239
239
|
* platform's device posture runtime (src/runtime/device-posture-composition.ts)
|
|
240
240
|
* on the same distributed runtime phones pair onto and the same approval broker
|
|
241
241
|
* every other confirmation rides, registers the `phone` tool on it, and binds the
|
|
242
|
-
* devices.* verbs to it
|
|
242
|
+
* devices.* verbs to it, so each of these keys is read, per request and per
|
|
243
243
|
* sweep, by the DeviceCapabilityService / DeviceGrantStore /
|
|
244
244
|
* DeviceCaptureArtifactStore / DeviceHousekeeper that serve them. They were dark
|
|
245
245
|
* before that: the policy struct carried matching defaults and named the keys in
|
|
@@ -251,7 +251,7 @@ export const FEATURE_KNOB_LOCAL_SETTINGS = [
|
|
|
251
251
|
* `src/test/verification/device-posture-behavior.test.ts`, which drives THIS
|
|
252
252
|
* app's composition with a real ConfigManager over a temp home and the platform's
|
|
253
253
|
* real stores, stubs only the peer transport and the approval bridge, and asserts
|
|
254
|
-
* per key at two values that the observable outcome differs
|
|
254
|
+
* per key at two values that the observable outcome differs, refusal code, how
|
|
255
255
|
* authority was established, what reached the transport, what the prompt was
|
|
256
256
|
* given, and what survives on disk after a sweep. It also invokes the `phone`
|
|
257
257
|
* tool and the devices.* verbs off the composed runtime graph, because a mapping
|
|
@@ -259,7 +259,7 @@ export const FEATURE_KNOB_LOCAL_SETTINGS = [
|
|
|
259
259
|
*
|
|
260
260
|
* STILL NOT COUNTED, FOR A DIFFERENT REASON NOW: the 24 non-enablement
|
|
261
261
|
* `voice.wake.*` keys from the same release. When this list was written they were
|
|
262
|
-
* excluded because nothing captured audio at all. That is no longer true
|
|
262
|
+
* excluded because nothing captured audio at all. That is no longer true, this
|
|
263
263
|
* terminal opens a recorder subprocess (src/audio/capture.ts), runs the SDK
|
|
264
264
|
* detector over it through onnxruntime-web (src/audio/wake-inference.ts), and
|
|
265
265
|
* hands both a confirmed wake's utterance and a push-to-talk recording to the
|
|
@@ -267,8 +267,8 @@ export const FEATURE_KNOB_LOCAL_SETTINGS = [
|
|
|
267
267
|
* resolveWakeRuntimeSettings and reaches this surface's runtime.
|
|
268
268
|
*
|
|
269
269
|
* They stay out of the NUMERATOR here because this constant counts exactly one
|
|
270
|
-
* thing
|
|
271
|
-
* device-and-trigger-settings-persistence.test.ts
|
|
270
|
+
* thing, keys whose four-part PERSISTENCE contract is exercised by
|
|
271
|
+
* device-and-trigger-settings-persistence.test.ts, and that test does not cover
|
|
272
272
|
* them. The behaviour they now drive is covered instead by the capture and wake
|
|
273
273
|
* tests under src/test/audio/, which assert the frame path, the detection
|
|
274
274
|
* chain, the disabled-means-no-capture rule, the supervisor's restart and latch,
|
|
@@ -343,24 +343,24 @@ const ENABLEMENT_KEYS_BEHAVIOR_VERIFIED = new Set(
|
|
|
343
343
|
* THIS CONSTANT IS NOT A DIAL, for the same reason as the two above. Each key
|
|
344
344
|
* is counted because a test that exercises it was actually written:
|
|
345
345
|
* `src/test/verification/cluster-group-settings-persistence.test.ts` runs the
|
|
346
|
-
* same four-part persistence contract
|
|
346
|
+
* same four-part persistence contract, schema default exposure, `set()`
|
|
347
347
|
* through the key's own validator to disk, reload into a fresh ConfigManager
|
|
348
348
|
* with read-back equality, and reset-to-default that survives reload.
|
|
349
349
|
*
|
|
350
350
|
* PER-KEY EVIDENCE. All four have a LIVE consumer in this build, which is more
|
|
351
351
|
* than several of the keys counted above can claim:
|
|
352
|
-
* cluster.keyRotationHours
|
|
352
|
+
* cluster.keyRotationHours , read by resolveClusterGroupSettings and
|
|
353
353
|
* compared against the current key's age in
|
|
354
354
|
* the group runtime's rotation check.
|
|
355
|
-
* cluster.keyRotationGraceMinutes
|
|
355
|
+
* cluster.keyRotationGraceMinutes, sets how long the previous generation
|
|
356
356
|
* stays accepted after a scheduled
|
|
357
357
|
* rotation; drives the keyring's accepted
|
|
358
358
|
* generation set.
|
|
359
|
-
* cluster.beaconSeconds
|
|
359
|
+
* cluster.beaconSeconds , the discovery beacon timer interval, and
|
|
360
360
|
* the basis of the "recently heard from"
|
|
361
361
|
* window that decides which member mints a
|
|
362
362
|
* rotation.
|
|
363
|
-
* cluster.rosterGossipSeconds
|
|
363
|
+
* cluster.rosterGossipSeconds , how often the member list is shared.
|
|
364
364
|
*
|
|
365
365
|
* `cluster.enabled` is NOT here: it is a feature enablement key and the ledger
|
|
366
366
|
* counts those in its own set.
|
|
@@ -378,7 +378,7 @@ export const CLUSTER_GROUP_LOCAL_SETTINGS = [
|
|
|
378
378
|
* budget knobs, the shipping-tier preference, the fourteen billing/shipping
|
|
379
379
|
* address sub-fields, the two approval/veto windows, and the notify-channel
|
|
380
380
|
* list. Card MATERIAL (number, expiry, CVV, cardholder name) is intentionally
|
|
381
|
-
* NOT here
|
|
381
|
+
* NOT here, see the SDK's schema-domain-payments.ts header and this repo's
|
|
382
382
|
* own input/payments-config.ts: that material lives write-only in the daemon
|
|
383
383
|
* secret store, never in CONFIG_SCHEMA, so there is nothing for a persistence
|
|
384
384
|
* contract to count.
|
|
@@ -439,7 +439,7 @@ export const PAYMENTS_LOCAL_SETTINGS = [
|
|
|
439
439
|
] as const;
|
|
440
440
|
|
|
441
441
|
/**
|
|
442
|
-
* Connector settings
|
|
442
|
+
* Connector settings, the daemon's Google-backed mail/calendar keys plus the
|
|
443
443
|
* connected-host dial switch and the hosted-turn routing switch, declared as
|
|
444
444
|
* described schema rows by platform runtime 2.0.8 (before that the connector
|
|
445
445
|
* keys were cast onto the live config invisibly and the settings surface
|
|
@@ -451,7 +451,7 @@ export const PAYMENTS_LOCAL_SETTINGS = [
|
|
|
451
451
|
* google prefixes
|
|
452
452
|
* plus the two switches. Arriving uncounted is what dropped
|
|
453
453
|
* localBehaviorPercent through its floor when the schema grew. The three
|
|
454
|
-
* secret-valued keys hold goodvibes://secrets/ references, never values
|
|
454
|
+
* secret-valued keys hold goodvibes://secrets/ references, never values,
|
|
455
455
|
* same note as the mailbox passwords above.
|
|
456
456
|
*/
|
|
457
457
|
export const CONNECTOR_LOCAL_SETTINGS = [
|
|
@@ -577,7 +577,7 @@ function countBuiltinPanels(root: string): number {
|
|
|
577
577
|
|
|
578
578
|
/**
|
|
579
579
|
* The CLI command words this terminal actually accepts, read off the catalog
|
|
580
|
-
* the parser is driven by rather than scraped out of a source file
|
|
580
|
+
* the parser is driven by rather than scraped out of a source file, the
|
|
581
581
|
* ledger counts what ships, and a catalog entry IS what ships.
|
|
582
582
|
*/
|
|
583
583
|
function listCliCommands(): string[] {
|
package/src/version.ts
CHANGED
|
@@ -6,21 +6,21 @@ import { join } from 'node:path';
|
|
|
6
6
|
// The prebuild script updates the fallback value before compilation.
|
|
7
7
|
// Uses import.meta.dir (Bun) to locate package.json relative to this file,
|
|
8
8
|
// which is correct regardless of the process working directory.
|
|
9
|
-
let _version = '2.0.
|
|
9
|
+
let _version = '2.0.15';
|
|
10
10
|
try {
|
|
11
11
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8'));
|
|
12
12
|
// Only trust a version read from OUR OWN package.json. A Bun single-file
|
|
13
13
|
// compiled binary resolves import.meta.dir to a virtual root where the
|
|
14
14
|
// `../package.json` path can land on a DIFFERENT package.json (a bundled
|
|
15
15
|
// dependency's, or the embedded runtime's) that reports a placeholder like
|
|
16
|
-
// "0.0.0"
|
|
16
|
+
// "0.0.0", exactly the wrong-version banner a bare daemon launch showed in
|
|
17
17
|
// the field. Guarding on the package name means the prebuild-baked fallback
|
|
18
18
|
// above wins in that case instead of a stray version.
|
|
19
19
|
if (pkg?.name === '@pellux/goodvibes-tui' && typeof pkg.version === 'string' && pkg.version.length > 0) {
|
|
20
20
|
_version = pkg.version;
|
|
21
21
|
}
|
|
22
22
|
} catch {
|
|
23
|
-
// Compiled binary or missing package.json
|
|
23
|
+
// Compiled binary or missing package.json, use fallback
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
export const VERSION = _version;
|