@pellux/goodvibes-tui 2.0.14 → 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 +35 -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
|
@@ -54,11 +54,11 @@ export function buildOnboardingApplyRequest(controller: OnboardingWizardControll
|
|
|
54
54
|
};
|
|
55
55
|
// Every credential the first-run wizard captures is one the DAEMON executes
|
|
56
56
|
// with: model provider API keys (the daemon runs the model), the Cloudflare
|
|
57
|
-
// API token, and the masked fields of the external surfaces
|
|
57
|
+
// API token, and the masked fields of the external surfaces, all of which
|
|
58
58
|
// live under daemon-owned `surfaces.*` config paths. So they all go to the
|
|
59
59
|
// daemon tier, which is the one tier every surface AND the daemon read.
|
|
60
60
|
//
|
|
61
|
-
// 'project'
|
|
61
|
+
// 'project', what this used to pass, filed them under whatever directory
|
|
62
62
|
// the wizard happened to be run from. Run the wizard in ~/code/foo and the
|
|
63
63
|
// daemon, which has no idea that directory exists, found nothing; run it
|
|
64
64
|
// again elsewhere and the first setup silently stopped applying. First-run
|
|
@@ -108,7 +108,7 @@ export function buildOnboardingApplyRequest(controller: OnboardingWizardControll
|
|
|
108
108
|
// One-Platform daemon-by-default (SDK docs/decisions/2026-07-05-daemon-by-default.md):
|
|
109
109
|
// the loopback-only cross-surface session daemon is safe-by-design
|
|
110
110
|
// (loopback bind, auth-gated, rate-limited) and runs regardless of whether
|
|
111
|
-
// browser/LAN/webhook/external-app capabilities are selected here
|
|
111
|
+
// browser/LAN/webhook/external-app capabilities are selected here, it is no
|
|
112
112
|
// longer bundled with those network-exposing surfaces, so onboarding leaves
|
|
113
113
|
// daemon.enabled untouched and lets the SDK's own default-true (or an existing
|
|
114
114
|
// explicit user override) govern. (The deprecated danger.daemon alias this
|
|
@@ -143,7 +143,7 @@ export function buildOnboardingApplyRequest(controller: OnboardingWizardControll
|
|
|
143
143
|
setConfig('behavior.hitlMode', hitlMode);
|
|
144
144
|
// behavior.hitlMode IS the enablement key of the hitl-ux-modes capability
|
|
145
145
|
// (active for quiet/balanced/operator, off only at 'off'), so the write
|
|
146
|
-
// above already carries the enablement
|
|
146
|
+
// above already carries the enablement, no separate gating write exists,
|
|
147
147
|
// and adding one here would clobber a non-default choice with the stock
|
|
148
148
|
// mode when the batch flushes.
|
|
149
149
|
setConfig('behavior.guidanceMode', controller.getStringFieldValue('experience.guidance', controller.runtimeSnapshot?.runtimeDefaults.behavior.guidanceMode ?? 'minimal'));
|
|
@@ -204,7 +204,7 @@ export function buildOnboardingApplyRequest(controller: OnboardingWizardControll
|
|
|
204
204
|
applyFeatureUnitOperations(controller, setConfig, featureFlagOverrides);
|
|
205
205
|
|
|
206
206
|
// Surface/server capabilities are authoritative for the network-exposing
|
|
207
|
-
// features they own
|
|
207
|
+
// features they own, apply them last so they win over any feature-step
|
|
208
208
|
// override.
|
|
209
209
|
for (const surfaceFlag of getServerSurfaceFeatureFlags({
|
|
210
210
|
serverBacked: hasServers,
|
|
@@ -306,7 +306,7 @@ function addCloudflareOperations(
|
|
|
306
306
|
// login-rate-limiter keys on the client address the tunnel forwards rather
|
|
307
307
|
// than the tunnel's own egress address. On its own, that address is read
|
|
308
308
|
// from X-Forwarded-For, which a client reaching the listener directly can
|
|
309
|
-
// set for itself
|
|
309
|
+
// set for itself, so it could still choose which address the rate limiter
|
|
310
310
|
// and the audit log recorded.
|
|
311
311
|
//
|
|
312
312
|
// httpListener.trustCloudflare is what closes that: the listener reads
|
|
@@ -257,7 +257,7 @@ export function buildCloudflareStep(controller: OnboardingWizardControllerLike):
|
|
|
257
257
|
);
|
|
258
258
|
}
|
|
259
259
|
|
|
260
|
-
// Trust-proxy notice
|
|
260
|
+
// Trust-proxy notice, shown when Tunnel is selected so the
|
|
261
261
|
// operator sees the security implication before applying.
|
|
262
262
|
const tunnelSelected = enabled && components.zeroTrustTunnel;
|
|
263
263
|
if (tunnelSelected) {
|
|
@@ -21,7 +21,7 @@ export const DEFAULT_CAPABILITIES: readonly OnboardingStep1CapabilityItem[] = [
|
|
|
21
21
|
// Honest wording (One-Platform daemon-by-default): this avoids browser/LAN/
|
|
22
22
|
// webhook/external-app exposure, but the loopback-only GoodVibes daemon
|
|
23
23
|
// still runs by default for cross-surface visibility on this machine.
|
|
24
|
-
detail: 'Use GoodVibes only in this terminal. No browser access, HTTP listener, external app surface, or network setup. A loopback-only background daemon still runs by default so sessions here stay visible to other GoodVibes surfaces on this machine
|
|
24
|
+
detail: 'Use GoodVibes only in this terminal. No browser access, HTTP listener, external app surface, or network setup. A loopback-only background daemon still runs by default so sessions here stay visible to other GoodVibes surfaces on this machine; turn it off in Settings > daemon if you want none at all.',
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
id: 'browser-access',
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
// • the per-surface auto-start enablement model (see the auto-start helpers),
|
|
12
12
|
// • numeric UI bounds (min/max) the SDK schema does not carry,
|
|
13
13
|
// • radio option copy (with hints) for select fields.
|
|
14
|
-
// Everything else
|
|
15
|
-
// default value
|
|
14
|
+
// Everything else, a field's existence, its config key, its input kind, and its
|
|
15
|
+
// default value, is derived from the SDK schema + DEFAULT_CONFIG, so the two can
|
|
16
16
|
// never silently drift. A field the overlay names that the SDK no longer defines
|
|
17
17
|
// is a loud build error; a field the SDK adds that the overlay has not curated is
|
|
18
18
|
// appended automatically with SDK-derived presentation.
|
|
@@ -65,7 +65,7 @@ function kebab(value: string): string {
|
|
|
65
65
|
|
|
66
66
|
/**
|
|
67
67
|
* The default value shown for a field. Derived, not hand-authored: the current
|
|
68
|
-
* snapshot value if present, otherwise the config default (DEFAULT_CONFIG)
|
|
68
|
+
* snapshot value if present, otherwise the config default (DEFAULT_CONFIG), which
|
|
69
69
|
* is exactly what the previous per-field literals returned. Numbers stringify.
|
|
70
70
|
*/
|
|
71
71
|
function readFieldDefault(configKey: ConfigKey, snapshot: OnboardingSnapshotState | null): string {
|
|
@@ -286,7 +286,7 @@ const SURFACE_OVERLAYS: readonly SurfaceOverlay[] = [
|
|
|
286
286
|
onboardingId: 'telephony',
|
|
287
287
|
sdkSurface: 'telephony',
|
|
288
288
|
label: 'Telephony surface',
|
|
289
|
-
hint: 'Enable SMS/voice notification delivery
|
|
289
|
+
hint: 'Enable SMS/voice notification delivery: direct Twilio, or a self-hosted bridge.',
|
|
290
290
|
fields: [
|
|
291
291
|
{ configKey: 'surfaces.telephony.provider', label: 'Telephony provider', hint: 'twilio for direct Twilio delivery, bridge for a self-hosted telephony bridge.', placeholder: 'twilio' },
|
|
292
292
|
{ configKey: 'surfaces.telephony.mode', label: 'Telephony mode', hint: 'sms, voice (call with spoken text), or bridge.', placeholder: 'sms' },
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Friction fix: the Network step's daemon-source choice
|
|
3
|
-
|
|
3
|
+
*, start a new daemon owned by this TUI (default) vs connect to one that is
|
|
4
4
|
* already running elsewhere with a known token. Extracted from
|
|
5
5
|
* onboarding-wizard-steps.ts to keep that file under the architecture line cap.
|
|
6
6
|
*/
|
|
@@ -19,7 +19,7 @@ export function getDaemonSource(controller: OnboardingWizardControllerLike): str
|
|
|
19
19
|
/**
|
|
20
20
|
* Push the daemon-source radio, plus the host/port/token/connect fields when
|
|
21
21
|
* 'adopt' is selected, onto the Network step's field list. Independent of the
|
|
22
|
-
* local/custom network mode
|
|
22
|
+
* local/custom network mode, adopting someone else's daemon is a client-side
|
|
23
23
|
* choice about which daemon THIS TUI talks to, not about how THIS TUI's own
|
|
24
24
|
* daemon binds to the network.
|
|
25
25
|
*/
|
|
@@ -79,7 +79,7 @@ export function pushDaemonAdoptionFields(
|
|
|
79
79
|
|
|
80
80
|
/**
|
|
81
81
|
* The guided, visible entry point for migrating a detected legacy
|
|
82
|
-
* `goodvibes-daemon.service` unit
|
|
82
|
+
* `goodvibes-daemon.service` unit, closes the fast-follow-up flagged when
|
|
83
83
|
* `handleMigrateLegacyDaemonServiceForHandler` (handler-onboarding-daemon-adopt.ts)
|
|
84
84
|
* shipped fully built but not wired to any onboarding control. Independent of
|
|
85
85
|
* the daemon-source radio above: this offers to retire an old unmanaged unit
|
|
@@ -88,11 +88,11 @@ export function pushDaemonAdoptionFields(
|
|
|
88
88
|
*
|
|
89
89
|
* Visible ONLY when the runtime snapshot's read-only `legacyDaemon` detection
|
|
90
90
|
* (collected via `detectLegacyUnit`, see `../../runtime/legacy-daemon-migration.ts`)
|
|
91
|
-
* found a unit file present
|
|
91
|
+
* found a unit file present, never rendered speculatively. Confirm-gated on
|
|
92
92
|
* top of the engine's own consent requirement: a checklist toggle must be
|
|
93
93
|
* checked before the action executes the real migration (`confirmMigration:
|
|
94
94
|
* true`); left unchecked, pressing the action still works but only prints the
|
|
95
|
-
* engine's dry-run plan (`confirmMigration: false`)
|
|
95
|
+
* engine's dry-run plan (`confirmMigration: false`), see
|
|
96
96
|
* `runLegacyDaemonMigration`'s honest dry-run branch. The action label and
|
|
97
97
|
* hint change to make which mode is armed unambiguous before it is pressed.
|
|
98
98
|
*/
|
|
@@ -108,7 +108,7 @@ export function pushLegacyDaemonMigrationFields(
|
|
|
108
108
|
id: 'network.migrate-legacy-daemon-detected',
|
|
109
109
|
label: 'Separate install-script daemon service detected',
|
|
110
110
|
// Follow-up: name the unit this host actually resolves (carried on the
|
|
111
|
-
// snapshot from `resolveConfiguredServiceName` at collection time)
|
|
111
|
+
// snapshot from `resolveConfiguredServiceName` at collection time), the
|
|
112
112
|
// MANAGED_SERVICE_NAME fallback only covers snapshots built without it.
|
|
113
113
|
hint: legacyUnitNote(legacy, legacy.trackedServiceName ?? MANAGED_SERVICE_NAME),
|
|
114
114
|
defaultValue: legacy.active ? 'Installed and running' : 'Installed (not active)',
|
|
@@ -162,7 +162,7 @@ export function buildProvidersStep(controller: OnboardingWizardControllerLike):
|
|
|
162
162
|
);
|
|
163
163
|
const signInPending = subscription.signInPending;
|
|
164
164
|
// Provider-agnostic key capture: one field per provider the registry knows
|
|
165
|
-
// accepts an API key (derived from registration truth
|
|
165
|
+
// accepts an API key (derived from registration truth, never a hardcoded
|
|
166
166
|
// vendor list). No provider is named as the only option.
|
|
167
167
|
const keyTargets = deriveProviderKeyCaptureTargets(controller.runtimeSnapshot?.providerAccounts?.providers);
|
|
168
168
|
const configuredKeyCount = keyTargets.filter((target) => target.configured).length;
|
|
@@ -614,7 +614,7 @@ export function buildNetworkStep(controller: OnboardingWizardControllerLike): On
|
|
|
614
614
|
if (controlPlaneRemote || listenerEnabled || browserEnabled) { // TLS warn + CORS notice.
|
|
615
615
|
const cpOff = controlPlaneRemote && String(controller.runtimeSnapshot?.config.controlPlane?.tls?.mode ?? 'off') === 'off';
|
|
616
616
|
const hlOff = listenerEnabled && String(controller.runtimeSnapshot?.config.httpListener?.tls?.mode ?? 'off') === 'off';
|
|
617
|
-
if (cpOff || hlOff) { const a = [cpOff ? 'control plane' : '', hlOff ? 'HTTP listener' : ''].filter(Boolean).join(' and '); fields.push({ kind: 'status', id: 'network.tls-warn', label: `TLS off
|
|
617
|
+
if (cpOff || hlOff) { const a = [cpOff ? 'control plane' : '', hlOff ? 'HTTP listener' : ''].filter(Boolean).join(' and '); fields.push({ kind: 'status', id: 'network.tls-warn', label: `TLS off: ${a} transmits plaintext`, defaultValue: 'Warning', hint: `The ${a} is network-reachable but TLS is off. Traffic travels in plaintext. Enable TLS or use a terminating reverse proxy.` }); }
|
|
618
618
|
if (listenerEnabled) { fields.push({ kind: 'status', id: 'network.cors-note', label: 'Browser CORS is off by default', defaultValue: 'Info', hint: 'The webhook/control-plane HTTP listener honors controlPlane.cors.enabled and controlPlane.cors.allowedOrigins. Set both from Settings > Control Plane (or /config controlPlane) to allow browser origins, then restart the daemon. CORS stays off until you enable it.' }); }
|
|
619
619
|
}
|
|
620
620
|
return {
|
|
@@ -3,11 +3,11 @@ import type { Panel } from '../panels/types.ts';
|
|
|
3
3
|
import type { PanelManager } from '../panels/panel-manager.ts';
|
|
4
4
|
|
|
5
5
|
// (the purge): every instanceof-routed branch this file used to carry
|
|
6
|
-
// (FileExplorerPanel/FilePreviewPanel/SymbolOutlinePanel
|
|
7
|
-
// ApprovalPanel/TasksPanel/OrchestrationPanel/AgentInspectorPanel
|
|
6
|
+
// (FileExplorerPanel/FilePreviewPanel/SymbolOutlinePanel, DELETE;
|
|
7
|
+
// ApprovalPanel/TasksPanel/OrchestrationPanel/AgentInspectorPanel,
|
|
8
8
|
// RETIRE-INTO-FLEET) targeted a panel class that no longer exists. Panels
|
|
9
9
|
// migrated onto the formal `Panel.handlePanelIntegrationAction` hook (the
|
|
10
|
-
// preferred seam
|
|
10
|
+
// preferred seam, see the comment below) are unaffected; this function now
|
|
11
11
|
// only provides that passthrough. See
|
|
12
12
|
// .goodvibes/audit/2026-07-04-wave6-briefs.json for the disposition
|
|
13
13
|
// map.
|
|
@@ -70,7 +70,7 @@ export function getPanelUnderMouse(
|
|
|
70
70
|
/**
|
|
71
71
|
* If the mouse is over the consolidated workspace tab bar (the first panel
|
|
72
72
|
* row), return the index of the tab under the cursor, else null. Recomputes the
|
|
73
|
-
* tab hit regions by rendering the bar with a layout callback
|
|
73
|
+
* tab hit regions by rendering the bar with a layout callback, cheap and keeps
|
|
74
74
|
* the click geometry in lockstep with what was drawn.
|
|
75
75
|
*/
|
|
76
76
|
export function workspaceTabAtMouse(
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// panel-paste-flood-guard.ts
|
|
2
|
+
// panel-paste-flood-guard.ts, item 5.
|
|
3
3
|
//
|
|
4
4
|
// A terminal WITHOUT bracketed paste delivers a pasted block as a burst of
|
|
5
5
|
// discrete 1-char 'text' tokens (isPasteToken stays false for every one of
|
|
6
6
|
// them, since that flag only fires for a single token whose value.length > 1
|
|
7
|
-
|
|
7
|
+
//, see handler-feed-routes.ts's own Invariant B doc). Before this guard,
|
|
8
8
|
// each such character became a real panel hotkey on a focused non-capturing
|
|
9
9
|
// panel (K arms kill, etc.) once it reached handlePanelFocusToken's per-char
|
|
10
10
|
// dispatch loop.
|
|
@@ -16,15 +16,15 @@
|
|
|
16
16
|
// same input layer already tore out once (see panel-focus-burst.test.ts's
|
|
17
17
|
// header doc): that old guard summed one feed()'s character count with no
|
|
18
18
|
// timing signal at all, so two ordinary nav keystrokes landing in a single
|
|
19
|
-
// feed()
|
|
19
|
+
// feed(), a real, common case, not an edge case, were misread as a burst
|
|
20
20
|
// and focus was silently flipped to the composer. This guard:
|
|
21
21
|
// - never touches focus (panelFocused is untouched by trackPanelPasteFloodGuard
|
|
22
22
|
// and by its caller);
|
|
23
23
|
// - is keyed on WALL-CLOCK TIMING, not a per-feed token count, so it
|
|
24
24
|
// doesn't care how many tokens land in one feed() call, only how fast
|
|
25
25
|
// they arrive relative to each other;
|
|
26
|
-
// - is sticky once tripped (only a quiet gap
|
|
27
|
-
// full window
|
|
26
|
+
// - is sticky once tripped (only a quiet gap, no qualifying token for a
|
|
27
|
+
// full window, clears it) so it doesn't flap dispatch on/off as the
|
|
28
28
|
// count oscillates near the threshold mid-flood.
|
|
29
29
|
//
|
|
30
30
|
// ~8 keys/120ms is far beyond sustained human typing (a fast typist peaks
|
|
@@ -39,10 +39,10 @@ export const PANEL_PASTE_FLOOD_WINDOW_MS = 120;
|
|
|
39
39
|
export const PANEL_PASTE_FLOOD_THRESHOLD = 8;
|
|
40
40
|
|
|
41
41
|
/**
|
|
42
|
-
* Guard state
|
|
42
|
+
* Guard state, a single persistent instance lives on the caller's
|
|
43
43
|
* long-lived context (handler-feed.ts's InputFeedContext, mirroring how that
|
|
44
44
|
* object already owns `nextPasteId`/`mouseDownRow`/etc.) and is MUTATED IN
|
|
45
|
-
* PLACE by trackPanelPasteFloodGuard below, never replaced
|
|
45
|
+
* PLACE by trackPanelPasteFloodGuard below, never replaced, so callers never
|
|
46
46
|
* need to thread a return value back into their own state (unlike
|
|
47
47
|
* `panelFocused`, which handlePanelFocusToken returns because it is NOT a
|
|
48
48
|
* mutable outparam).
|
|
@@ -54,7 +54,7 @@ export interface PanelBurstGuardState {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
export interface PanelBurstGuardResult {
|
|
57
|
-
/** False while suspended
|
|
57
|
+
/** False while suspended, the caller must drop this token, not dispatch it. */
|
|
58
58
|
readonly dispatch: boolean;
|
|
59
59
|
/** True exactly once per burst: the call that just tripped suspension. */
|
|
60
60
|
readonly showHintNow: boolean;
|
|
@@ -66,7 +66,7 @@ export function trackPanelPasteFloodGuard(guard: PanelBurstGuardState, now: numb
|
|
|
66
66
|
const isQuietGap = now - lastAt > PANEL_PASTE_FLOOD_WINDOW_MS;
|
|
67
67
|
if (isQuietGap && guard.suspended) {
|
|
68
68
|
// A silence at least as long as the window means whatever burst was
|
|
69
|
-
// happening has ended
|
|
69
|
+
// happening has ended, un-suspend so a LATER burst gets its own fresh
|
|
70
70
|
// count and its own one-shot hint.
|
|
71
71
|
guard.suspended = false;
|
|
72
72
|
guard.hintShown = false;
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* payments-config.ts
|
|
2
|
+
* payments-config.ts, TUI-local synthetic settings for the payment card
|
|
3
3
|
* capability's card MATERIAL fields.
|
|
4
4
|
*
|
|
5
5
|
* The SDK's CONFIG_SCHEMA now has a full real `payments` section (28 keys:
|
|
6
6
|
* enabled, defaultCardId, currency, cvvHandling, the six budget keys,
|
|
7
7
|
* shipping.preferredTier, the fourteen billing/shipping address sub-fields
|
|
8
|
-
* (name, line1, line2, city, region, postalCode, country
|
|
8
|
+
* (name, line1, line2, city, region, postalCode, country, each repeated for
|
|
9
9
|
* billingAddress and shippingAddress), the two window keys, and
|
|
10
|
-
* notifyChannels
|
|
10
|
+
* notifyChannels, see `@pellux/goodvibes-sdk/platform/config`). Every one of
|
|
11
11
|
* those keys reads and writes through the ordinary CONFIG_SCHEMA-driven path
|
|
12
12
|
* in settings-modal-data.ts's buildSettingGroups, exactly like `relay.*` or
|
|
13
|
-
* any other real SDK domain
|
|
13
|
+
* any other real SDK domain, no synthetic entry or dedicated store is needed
|
|
14
14
|
* for them, and this module builds none. (An earlier round of this module
|
|
15
15
|
* modeled billing/shipping address as two flat TUI-local strings; the SDK's
|
|
16
16
|
* own structured per-field keys superseded that the moment they shipped, so
|
|
@@ -25,39 +25,39 @@
|
|
|
25
25
|
* SDK does not yet expose an equivalent config-level path for a single
|
|
26
26
|
* implicit card the way this app's `/payments card` flow models it, so these
|
|
27
27
|
* four fields are synthetic sub-keys under the SDK's real `payments`
|
|
28
|
-
* section
|
|
28
|
+
* section, the same established pattern this codebase already uses for
|
|
29
29
|
* `behavior.notifyAfterSeconds`, `storage.codeIndexEnabled`, etc.: a key one
|
|
30
30
|
* level under an EXISTING section that CONFIG_SCHEMA has no scalar entry for.
|
|
31
31
|
*
|
|
32
32
|
* That one-level-under-an-existing-section shape matters mechanically: the
|
|
33
33
|
* real ConfigManager's dotted-path resolver only throws "Invalid config path"
|
|
34
34
|
* when an INTERMEDIATE segment is missing (e.g. `payments.card.number`, where
|
|
35
|
-
* `card` is not itself a section)
|
|
35
|
+
* `card` is not itself a section), it does not throw for a final leaf that
|
|
36
36
|
* the schema has not declared (`payments.cardNumber`), the same tolerance
|
|
37
37
|
* `storage.codeIndexEnabled` relies on under `storage`. So these four keys are named
|
|
38
38
|
* FLAT (`payments.cardNumber`, not `payments.card.number`) specifically so
|
|
39
|
-
* `ConfigManager.get/setDynamic` accepts them
|
|
39
|
+
* `ConfigManager.get/setDynamic` accepts them, verified against the real
|
|
40
40
|
* ConfigManager (not the fake store this module used before this round): a
|
|
41
41
|
* flat sub-key persists to the real daemon-owned settings file precisely
|
|
42
42
|
* because `payments.` is a `DAEMON_OWNED_CONFIG_PREFIXES` entry, which is
|
|
43
43
|
* exactly what makes the daemon (and every other surface) able to see it
|
|
44
|
-
* after this TUI closes
|
|
44
|
+
* after this TUI closes, the thing the local JSON store this module used to
|
|
45
45
|
* use never gave them.
|
|
46
46
|
*
|
|
47
47
|
* All four keys are secret-tier (see config/secret-config.ts's
|
|
48
48
|
* SECRET_CONFIG_KEYS). Primary entry for those is the concealed-input flow in
|
|
49
49
|
* commands/payment-card-intake.ts, itself gated on the SDK's
|
|
50
50
|
* `mayOfferCardEntryFlow` (card details may only be typed at a local
|
|
51
|
-
* terminal or the webui, never over a remote messaging surface
|
|
51
|
+
* terminal or the webui, never over a remote messaging surface, see that
|
|
52
52
|
* file's header); they are also reachable as ordinary secret-backed settings
|
|
53
|
-
* rows here, which is what makes them masked mid-edit
|
|
53
|
+
* rows here, which is what makes them masked mid-edit, see
|
|
54
54
|
* renderer/settings-modal.ts's currentSettingValue().
|
|
55
55
|
*
|
|
56
|
-
* cvvHandling
|
|
56
|
+
* cvvHandling, real now, not built here, selects whether the CVV is stored
|
|
57
57
|
* (the default, per the 2026-07-27 payment-capability ruling) or requested at
|
|
58
58
|
* purchase time; see `CVV_PROMPT_TRADEOFF_WARNING`, imported directly from
|
|
59
59
|
* `@pellux/goodvibes-sdk/platform/payments` by every caller that needs it
|
|
60
|
-
* (renderer/settings-modal.ts, settings-modal.ts)
|
|
60
|
+
* (renderer/settings-modal.ts, settings-modal.ts), no local copy lives here
|
|
61
61
|
* or anywhere else in this app.
|
|
62
62
|
*/
|
|
63
63
|
|
|
@@ -65,7 +65,7 @@ import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config';
|
|
|
65
65
|
import type { ConfigKey } from '@pellux/goodvibes-sdk/platform/config';
|
|
66
66
|
import type { SettingEntry } from './settings-modal-types.ts';
|
|
67
67
|
|
|
68
|
-
/** Real ConfigManager's read surface
|
|
68
|
+
/** Real ConfigManager's read surface, these four keys are defensive reads (see header comment). */
|
|
69
69
|
export type PaymentsConfigReader = Pick<ConfigManager, 'get'>;
|
|
70
70
|
|
|
71
71
|
export const PAYMENTS_CARD_NUMBER_CONFIG_KEY = 'payments.cardNumber' as ConfigKey;
|
|
@@ -73,14 +73,14 @@ export const PAYMENTS_CARD_EXPIRY_CONFIG_KEY = 'payments.cardExpiry' as ConfigKe
|
|
|
73
73
|
export const PAYMENTS_CARD_CVV_CONFIG_KEY = 'payments.cardCvv' as ConfigKey;
|
|
74
74
|
export const PAYMENTS_CARD_CARDHOLDER_NAME_CONFIG_KEY = 'payments.cardholderName' as ConfigKey;
|
|
75
75
|
|
|
76
|
-
/** The real SDK schema key for the CVV-handling selector
|
|
76
|
+
/** The real SDK schema key for the CVV-handling selector, no longer synthetic. */
|
|
77
77
|
export const PAYMENTS_CVV_HANDLING_CONFIG_KEY = 'payments.cvvHandling' as ConfigKey;
|
|
78
78
|
|
|
79
79
|
function readStringField(configManager: PaymentsConfigReader, key: ConfigKey): string {
|
|
80
80
|
// Defensive try/catch, same rationale as worktree-setup-config.ts's
|
|
81
81
|
// readWorktreeSetupList and this codebase's other one-level-under-a-real-
|
|
82
82
|
// section synthetic reads (behavior.notifyAfterSeconds, storage.codeIndexEnabled): the real
|
|
83
|
-
// ConfigManager never throws for these particular keys (verified
|
|
83
|
+
// ConfigManager never throws for these particular keys (verified, see
|
|
84
84
|
// header comment), but degrading to empty rather than crashing the whole
|
|
85
85
|
// settings modal is the same posture every synthetic setting here takes
|
|
86
86
|
// toward an unexpected value.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Provider key intake
|
|
2
|
+
* Provider key intake, capture a provider's API key at the moment the user
|
|
3
3
|
* selects an unconfigured provider or model, store it through the secrets
|
|
4
4
|
* manager (never env-only, never cleartext into config or provider JSON), let
|
|
5
5
|
* the provider re-register live, then complete the user's original selection.
|
|
6
6
|
*
|
|
7
7
|
* The decision of whether a key is needed is read from the provider's own
|
|
8
|
-
* registration-time auth state (describeAuthState / isConfigured)
|
|
9
|
-
* hardcoded vendor list
|
|
8
|
+
* registration-time auth state (describeAuthState / isConfigured), never a
|
|
9
|
+
* hardcoded vendor list, so this works for any provider the registry knows
|
|
10
10
|
* accepts a key. The secrets-store key name is the provider's declared auth env
|
|
11
11
|
* var; it is used only as the storage key and is never shown to the user.
|
|
12
12
|
*/
|
|
@@ -48,7 +48,7 @@ export function decideProviderKeyIntake(provider: LLMProvider | undefined): Prov
|
|
|
48
48
|
return { needsKey: false, alreadyConfigured: configured };
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
/** Human-facing name for a provider
|
|
51
|
+
/** Human-facing name for a provider, plain, vendor-neutral, never an env var. */
|
|
52
52
|
export function providerIntakeLabel(providerId: string): string {
|
|
53
53
|
return `the ${providerId} provider`;
|
|
54
54
|
}
|
|
@@ -57,7 +57,7 @@ export function providerIntakeLabel(providerId: string): string {
|
|
|
57
57
|
export interface ProviderKeyIntakeDeps {
|
|
58
58
|
/** The provider instance whose registration-time auth state drives the decision. */
|
|
59
59
|
readonly provider: LLMProvider | undefined;
|
|
60
|
-
/** Canonical secret store
|
|
60
|
+
/** Canonical secret store, the same path /secrets set writes through. */
|
|
61
61
|
readonly secretsManager?: {
|
|
62
62
|
set(key: string, value: string, options?: { scope?: SecretScope; medium?: 'secure' | 'plaintext' }): Promise<void>;
|
|
63
63
|
} | undefined;
|
|
@@ -72,8 +72,8 @@ export interface ProviderKeyIntakeDeps {
|
|
|
72
72
|
/**
|
|
73
73
|
* If the selected provider needs a key, open the concealed prompt, store the
|
|
74
74
|
* pasted value through the secrets manager, re-register the provider live, then
|
|
75
|
-
* run `proceed` (the user's original selection). If no key is needed
|
|
76
|
-
* concealed surface is unavailable
|
|
75
|
+
* run `proceed` (the user's original selection). If no key is needed, or the
|
|
76
|
+
* concealed surface is unavailable, `proceed` runs immediately. `proceed`
|
|
77
77
|
* always runs exactly once, including when the user skips (empty/Escape), so a
|
|
78
78
|
* selection is never stranded.
|
|
79
79
|
*/
|
|
@@ -89,7 +89,7 @@ export function runProviderKeyIntake(
|
|
|
89
89
|
}
|
|
90
90
|
const { secretsManager, beginConcealedInput } = deps;
|
|
91
91
|
if (!secretsManager || !beginConcealedInput) {
|
|
92
|
-
// No canonical store or no concealed surface here
|
|
92
|
+
// No canonical store or no concealed surface here, keep the selection
|
|
93
93
|
// rather than blocking it; the user can add the key via /secrets set later.
|
|
94
94
|
proceed();
|
|
95
95
|
return;
|
|
@@ -114,7 +114,7 @@ export function runProviderKeyIntake(
|
|
|
114
114
|
void (async () => {
|
|
115
115
|
try {
|
|
116
116
|
// Daemon scope, not user scope. The DAEMON is the process that runs
|
|
117
|
-
// the model
|
|
117
|
+
// the model, it answers Telegram, ntfy, mail and every scheduled
|
|
118
118
|
// run with this TUI closed. A model key filed in this surface's own
|
|
119
119
|
// tier is readable only while the TUI is open, so the daemon has no
|
|
120
120
|
// provider to call and cannot answer at all. Daemon tier is the one
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* relay-settings-descriptions.ts
|
|
2
|
+
* relay-settings-descriptions.ts, appends the relay threat-model one-liner to
|
|
3
3
|
* the `relay.*` CONFIG_SCHEMA descriptions shown in /config and the settings
|
|
4
4
|
* modal.
|
|
5
5
|
*
|
|
6
|
-
* `relay.*` is a real SDK CONFIG_SCHEMA domain (schema-domain-runtime.ts)
|
|
6
|
+
* `relay.*` is a real SDK CONFIG_SCHEMA domain (schema-domain-runtime.ts),
|
|
7
7
|
* the settings-modal-data.ts CONFIG_SCHEMA loop already surfaces it once
|
|
8
8
|
* `relay` is listed in SETTINGS_CATEGORIES (see settings-modal-types.ts). The
|
|
9
9
|
* SDK's own descriptions explain WHAT each key does but not the trust
|
|
@@ -18,7 +18,7 @@ import type { SettingEntry, SettingsCategory } from './settings-modal-types.ts';
|
|
|
18
18
|
|
|
19
19
|
/** The threat-model note every relay.* setting description gets appended with. */
|
|
20
20
|
export const RELAY_THREAT_MODEL_NOTE =
|
|
21
|
-
'The relay operator sees only ciphertext and connection metadata
|
|
21
|
+
'The relay operator sees only ciphertext and connection metadata; it cannot read message contents. Self-host your own relay for full control.';
|
|
22
22
|
|
|
23
23
|
/** Append the threat-model note to every relay.* entry's description, in place. */
|
|
24
24
|
export function enrichRelaySettingDescriptions(groups: Map<SettingsCategory, SettingEntry[]>): void {
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* sandbox-exec-config.ts
|
|
2
|
+
* sandbox-exec-config.ts, TUI-local synthetic settings entries for
|
|
3
3
|
* sandbox.egressAllowlist / sandbox.workspaceWritable.
|
|
4
4
|
*
|
|
5
5
|
* The SDK's per-command exec sandbox (bubblewrap on Linux, gated by the
|
|
6
6
|
* graduation-tracked `exec-sandbox` feature flag) reads its full configuration
|
|
7
7
|
* straight off `configManager.getCategory('sandbox')` inside
|
|
8
|
-
* `registerAllTools` (platform/tools/index.ts)
|
|
8
|
+
* `registerAllTools` (platform/tools/index.ts), `sandbox.enabled`,
|
|
9
9
|
* `sandbox.egressAllowlist`, `sandbox.workspaceWritable`. `sandbox.enabled` is
|
|
10
10
|
* already a real CONFIG_SCHEMA key (with its own honest "requires bubblewrap
|
|
11
11
|
* on Linux, reports unavailable elsewhere" description) and needs no synthetic
|
|
12
|
-
* entry
|
|
12
|
+
* entry, the CONFIG_SCHEMA loop in settings-modal-data.ts already surfaces it.
|
|
13
13
|
* `egressAllowlist`/`workspaceWritable` are NOT in CONFIG_SCHEMA, so this file
|
|
14
14
|
* mirrors worktree-setup-config.ts's synthetic-entry pattern for them.
|
|
15
15
|
*
|
|
16
16
|
* UNLIKE worktree.setup.* / learning.consolidation.*, no defensive try/catch is
|
|
17
17
|
* needed here: DEFAULT_CONFIG.sandbox already carries both fields (as empty
|
|
18
18
|
* arrays), so ConfigManager.resolvePath finds the `sandbox` section on a plain
|
|
19
|
-
* get()/set() without throwing
|
|
19
|
+
* get()/set() without throwing, only a missing SECTION throws, and `sandbox`
|
|
20
20
|
* has existed since before this repack (it backs the older VM/REPL isolation
|
|
21
21
|
* settings). Writing through these entries takes effect for real: the exec
|
|
22
22
|
* sandbox reads the same `sandbox` config category at tool-registration time.
|
|
23
23
|
*
|
|
24
24
|
* Both keys hold a JSON array of strings on disk. The settings modal's inline
|
|
25
|
-
* editor is a single-line text field, so
|
|
26
|
-
* controlPlane.cors.allowedOrigins
|
|
25
|
+
* editor is a single-line text field, so, matching worktree.setup.* and
|
|
26
|
+
* controlPlane.cors.allowedOrigins, they are displayed and edited as a
|
|
27
27
|
* comma-separated list and parsed back into an array on commit (see
|
|
28
28
|
* isSandboxExecListConfigKey's use in settings-modal.ts#commitEdit).
|
|
29
29
|
*/
|
|
@@ -50,7 +50,7 @@ export function readSandboxExecList(configManager: Pick<ConfigManager, 'get'>, k
|
|
|
50
50
|
return raw.filter((entry): entry is string => typeof entry === 'string' && entry.length > 0);
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
/** Parse a comma-separated edit-buffer submission back into a string array (trimmed, empties dropped). Shared with worktree.setup
|
|
53
|
+
/** Parse a comma-separated edit-buffer submission back into a string array (trimmed, empties dropped). Shared with worktree.setup.*, same convention. */
|
|
54
54
|
export function parseSandboxExecListInput(text: string): string[] {
|
|
55
55
|
return text.split(',').map((part) => part.trim()).filter((part) => part.length > 0);
|
|
56
56
|
}
|
|
@@ -59,14 +59,14 @@ export const SANDBOX_EGRESS_ALLOWLIST_SYNTHETIC_SETTING: ConfigSetting = {
|
|
|
59
59
|
key: SANDBOX_EGRESS_ALLOWLIST_CONFIG_KEY,
|
|
60
60
|
type: 'string',
|
|
61
61
|
default: [],
|
|
62
|
-
description: 'Comma-separated command base names (or "*" for all) whose network access is re-enabled inside the per-command exec sandbox boundary, as a named escalation the approval flow surfaces ("wants network"). Empty = the sandbox disables network for every command. Only takes effect when sandbox.enabled is on, the exec-sandbox setting is on, and bubblewrap is available (Linux only
|
|
62
|
+
description: 'Comma-separated command base names (or "*" for all) whose network access is re-enabled inside the per-command exec sandbox boundary, as a named escalation the approval flow surfaces ("wants network"). Empty = the sandbox disables network for every command. Only takes effect when sandbox.enabled is on, the exec-sandbox setting is on, and bubblewrap is available (Linux only; reports unavailable elsewhere).',
|
|
63
63
|
};
|
|
64
64
|
|
|
65
65
|
export const SANDBOX_WORKSPACE_WRITABLE_SYNTHETIC_SETTING: ConfigSetting = {
|
|
66
66
|
key: SANDBOX_WORKSPACE_WRITABLE_CONFIG_KEY,
|
|
67
67
|
type: 'string',
|
|
68
68
|
default: [],
|
|
69
|
-
description: 'Comma-separated absolute paths outside the workspace bound writable into the per-command exec sandbox boundary, as a named escalation the approval flow surfaces ("wants path outside workspace"). Empty = only the workspace (and an isolated /tmp) is writable. Only takes effect when sandbox.enabled is on, the exec-sandbox setting is on, and bubblewrap is available (Linux only
|
|
69
|
+
description: 'Comma-separated absolute paths outside the workspace bound writable into the per-command exec sandbox boundary, as a named escalation the approval flow surfaces ("wants path outside workspace"). Empty = only the workspace (and an isolated /tmp) is writable. Only takes effect when sandbox.enabled is on, the exec-sandbox setting is on, and bubblewrap is available (Linux only; reports unavailable elsewhere).',
|
|
70
70
|
};
|
|
71
71
|
|
|
72
72
|
function buildSandboxExecListEntry(configManager: Pick<ConfigManager, 'get'>, setting: ConfigSetting): SettingEntry {
|