@pellux/goodvibes-tui 2.0.13 → 2.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.goodvibes/GOODVIBES.md +1 -1
- package/.goodvibes/agents/reviewer.md +8 -8
- package/.goodvibes/skills/add-provider/SKILL.md +22 -22
- package/CHANGELOG.md +61 -0
- package/README.md +40 -29
- package/docs/README.md +1 -1
- package/docs/foundation-artifacts/README.md +5 -5
- package/docs/foundation-artifacts/operator-contract.json +123 -123
- package/package.json +12 -10
- package/scripts/postinstall.js +3 -3
- package/src/audio/activation-sound.ts +7 -7
- package/src/audio/capture.ts +7 -7
- package/src/audio/onnxruntime-assets.d.ts +1 -1
- package/src/audio/player.ts +4 -4
- package/src/audio/spoken-turn-wiring.ts +4 -4
- package/src/audio/voice-capture-wiring.ts +5 -5
- package/src/audio/voice-input-session.ts +3 -3
- package/src/audio/wake-inference.ts +13 -8
- package/src/audio/wake-runtime.ts +10 -10
- package/src/cli/completions/generate.ts +2 -2
- package/src/cli/doctor.ts +13 -13
- package/src/cli/ensure-goodvibes-gitignore.ts +3 -3
- package/src/cli/entrypoint.ts +3 -3
- package/src/cli/help.ts +6 -6
- package/src/cli/hooks-command.ts +4 -4
- package/src/cli/hooks-report.ts +4 -4
- package/src/cli/launch-auto-update.ts +17 -17
- package/src/cli/management-commands.ts +8 -8
- package/src/cli/management-utils.ts +3 -3
- package/src/cli/management.ts +1 -1
- package/src/cli/plugin-bundles-command.ts +10 -10
- package/src/cli/plugin-command.ts +9 -9
- package/src/cli/service-posture.ts +1 -1
- package/src/cli/status.ts +10 -10
- package/src/cli/surface-command.ts +4 -4
- package/src/cli/tui-startup.ts +23 -23
- package/src/config/run-daemon-config-migration.ts +3 -3
- package/src/config/secret-config.ts +10 -10
- package/src/config/surface.ts +1 -1
- package/src/config/tui-extension-settings.ts +8 -8
- package/src/core/active-model-identity.ts +7 -7
- package/src/core/approval-alert.ts +5 -5
- package/src/core/bookmark-navigation.ts +3 -3
- package/src/core/budget-breach-notifier.ts +6 -6
- package/src/core/compaction-receipt.ts +8 -8
- package/src/core/composer-state.ts +2 -2
- package/src/core/context-usage.ts +1 -1
- package/src/core/conversation-compaction-render.ts +3 -3
- package/src/core/conversation-event-navigation.ts +2 -2
- package/src/core/conversation-fold.ts +9 -9
- package/src/core/conversation-line-cache.ts +14 -14
- package/src/core/conversation-render-context.ts +6 -6
- package/src/core/conversation-rendering.ts +27 -30
- package/src/core/conversation-search-expansion.ts +6 -6
- package/src/core/conversation-splash-state.ts +3 -3
- package/src/core/conversation-turn-structure.ts +13 -13
- package/src/core/conversation-types.ts +3 -3
- package/src/core/conversation-user-receipts.ts +5 -5
- package/src/core/conversation.ts +17 -17
- package/src/core/format-user-error.ts +5 -5
- package/src/core/long-task-notifier.ts +9 -9
- package/src/core/memory-diagnostics-gateway.ts +8 -8
- package/src/core/memory-provenance.ts +5 -5
- package/src/core/model-routing-chip.ts +3 -3
- package/src/core/pairing-tailscale-gateway.ts +3 -3
- package/src/core/permission-mode.ts +5 -5
- package/src/core/power-chip-source.ts +3 -3
- package/src/core/power-status.ts +8 -8
- package/src/core/rewind-receipt.ts +6 -6
- package/src/core/session-resume-core.ts +8 -8
- package/src/core/stream-event-wiring.ts +36 -36
- package/src/core/stream-stall-watchdog.ts +4 -4
- package/src/core/system-message-noise.ts +7 -7
- package/src/core/system-message-router.ts +10 -10
- package/src/core/terminal-notifier.ts +5 -5
- package/src/core/turn-budget-outcome.ts +5 -5
- package/src/core/turn-cancellation.ts +3 -3
- package/src/core/turn-event-wiring.ts +16 -16
- package/src/core/voice-capture-status.ts +2 -2
- package/src/core/voice-provision-gateway.ts +12 -12
- package/src/core/voice-provision-status.ts +19 -19
- package/src/core/voice-stt-gateway.ts +6 -6
- package/src/core/wake-provision-runner.ts +7 -7
- package/src/core/wake-provision-status.ts +17 -17
- package/src/core/workstream-notification.ts +8 -8
- package/src/export/gist-uploader.ts +7 -7
- package/src/input/autocomplete.ts +3 -3
- package/src/input/bookmark-modal.ts +1 -1
- package/src/input/command-args-hint.ts +2 -2
- package/src/input/command-reference.ts +9 -9
- package/src/input/command-registry.ts +32 -32
- package/src/input/commands/acp-runtime.ts +6 -6
- package/src/input/commands/calendar-runtime.ts +9 -9
- package/src/input/commands/channel-pairing.ts +11 -11
- package/src/input/commands/channel-runtime.ts +1 -1
- package/src/input/commands/checkin-runtime.ts +4 -4
- package/src/input/commands/checkpoint-runtime.ts +4 -4
- package/src/input/commands/ci-runtime.ts +4 -4
- package/src/input/commands/cluster-runtime.ts +3 -3
- package/src/input/commands/codebase-runtime.ts +16 -16
- package/src/input/commands/config.ts +6 -6
- package/src/input/commands/connection-status.ts +12 -12
- package/src/input/commands/context-window.ts +2 -2
- package/src/input/commands/cost-attribution-format.ts +4 -4
- package/src/input/commands/cost-runtime.ts +2 -2
- package/src/input/commands/devices-runtime.ts +7 -7
- package/src/input/commands/diff-runtime.ts +2 -2
- package/src/input/commands/editor-runtime.ts +1 -1
- package/src/input/commands/eval.ts +4 -4
- package/src/input/commands/experience-runtime.ts +1 -1
- package/src/input/commands/git-runtime.ts +3 -3
- package/src/input/commands/graph-runtime.ts +3 -3
- package/src/input/commands/guidance-runtime.ts +1 -1
- package/src/input/commands/health-metrics-format.ts +2 -2
- package/src/input/commands/health-runtime.ts +8 -8
- package/src/input/commands/hosted-runtime.ts +13 -13
- package/src/input/commands/image-runtime.ts +6 -6
- package/src/input/commands/intelligence-runtime.ts +2 -2
- package/src/input/commands/local-auth-runtime.ts +3 -3
- package/src/input/commands/local-provider-runtime.ts +3 -3
- package/src/input/commands/local-runtime.ts +7 -7
- package/src/input/commands/mail-runtime.ts +9 -9
- package/src/input/commands/mcp-runtime.ts +1 -1
- package/src/input/commands/memory.ts +13 -13
- package/src/input/commands/notify-runtime.ts +1 -1
- package/src/input/commands/operator-panel-runtime.ts +8 -8
- package/src/input/commands/operator-rpc.ts +3 -3
- package/src/input/commands/operator-runtime.ts +3 -3
- package/src/input/commands/palette-runtime.ts +1 -1
- package/src/input/commands/payment-card-intake.ts +17 -17
- package/src/input/commands/permissions-provenance.ts +7 -7
- package/src/input/commands/permissions-runtime.ts +1 -1
- package/src/input/commands/planning-runtime.ts +9 -9
- package/src/input/commands/platform-services-runtime.ts +2 -2
- package/src/input/commands/policy-dispatch.ts +6 -6
- package/src/input/commands/power-runtime.ts +6 -6
- package/src/input/commands/principals-runtime.ts +3 -3
- package/src/input/commands/product-runtime.ts +3 -3
- package/src/input/commands/profile-render.ts +13 -13
- package/src/input/commands/profile-runtime.ts +13 -13
- package/src/input/commands/profile-types.ts +13 -13
- package/src/input/commands/provider-accounts-runtime.ts +5 -5
- package/src/input/commands/provider.ts +10 -10
- package/src/input/commands/qrcode-runtime.ts +3 -3
- package/src/input/commands/queue-runtime.ts +6 -6
- package/src/input/commands/recall-files-config.ts +4 -4
- package/src/input/commands/recall-files-git.ts +3 -3
- package/src/input/commands/recall-files.ts +12 -12
- package/src/input/commands/recall-query.ts +3 -3
- package/src/input/commands/recall-review.ts +3 -3
- package/src/input/commands/recall-shared.ts +1 -1
- package/src/input/commands/relay-runtime.ts +5 -5
- package/src/input/commands/remote-runtime.ts +3 -3
- package/src/input/commands/review-runtime.ts +8 -8
- package/src/input/commands/rewind-runtime.ts +21 -21
- package/src/input/commands/runtime-services.ts +1 -2
- package/src/input/commands/schedule-nl.ts +2 -2
- package/src/input/commands/schedule-runtime.ts +2 -2
- package/src/input/commands/secret-runtime.ts +3 -3
- package/src/input/commands/session-content.ts +7 -7
- package/src/input/commands/session-picker-filter.ts +3 -3
- package/src/input/commands/session-workflow.ts +10 -10
- package/src/input/commands/session.ts +15 -15
- package/src/input/commands/settings-sync-runtime.ts +2 -2
- package/src/input/commands/share-runtime.ts +4 -4
- package/src/input/commands/shell-core.ts +11 -11
- package/src/input/commands/tasks-runtime.ts +4 -4
- package/src/input/commands/test-runtime.ts +6 -6
- package/src/input/commands/tts-runtime.ts +4 -4
- package/src/input/commands/update-runtime.ts +27 -27
- package/src/input/commands/websearch-runtime.ts +2 -2
- package/src/input/commands/work-plan-runtime.ts +2 -2
- package/src/input/commands/workstream-attempt-dependents.ts +4 -4
- package/src/input/commands/workstream-attempts.ts +16 -16
- package/src/input/commands/workstream-runtime.ts +36 -36
- package/src/input/commands/worktree-runtime.ts +6 -6
- package/src/input/composer-capture.ts +5 -5
- package/src/input/concealed-input.ts +2 -2
- package/src/input/config-modal-types.ts +16 -16
- package/src/input/config-modal.ts +30 -30
- package/src/input/daemon-owned-settings-descriptions.ts +4 -4
- package/src/input/delete-key-policy.ts +1 -1
- package/src/input/exec-env-scrub-config.ts +7 -7
- package/src/input/feature-unit-layout.ts +5 -5
- package/src/input/feed-context-factory.ts +38 -38
- package/src/input/file-picker.ts +1 -1
- package/src/input/handler-command-route.ts +2 -2
- package/src/input/handler-content-actions.ts +8 -8
- package/src/input/handler-feed-routes.ts +13 -13
- package/src/input/handler-feed.ts +31 -31
- package/src/input/handler-interactions.ts +2 -2
- package/src/input/handler-modal-routes.ts +13 -13
- package/src/input/handler-modal-stack.ts +1 -1
- package/src/input/handler-modal-token-routes.ts +1 -1
- package/src/input/handler-onboarding-daemon-adopt.ts +6 -6
- package/src/input/handler-picker-routes.ts +7 -7
- package/src/input/handler-prompt-buffer.ts +1 -1
- package/src/input/handler-shortcuts.ts +12 -12
- package/src/input/handler-types.ts +3 -3
- package/src/input/handler-ui-state.ts +1 -1
- package/src/input/handler.ts +9 -9
- package/src/input/input-history.ts +1 -1
- package/src/input/keybindings.ts +13 -13
- package/src/input/kill-ring.ts +7 -11
- package/src/input/model-picker-filter.ts +3 -3
- package/src/input/model-picker-items.ts +5 -5
- package/src/input/model-picker-types.ts +2 -2
- package/src/input/model-picker.ts +18 -18
- package/src/input/onboarding/onboarding-feature-units.ts +9 -13
- package/src/input/onboarding/onboarding-provider-key-fields.ts +3 -3
- package/src/input/onboarding/onboarding-runtime-status.ts +3 -3
- package/src/input/onboarding/onboarding-wizard-apply.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-cloudflare-step.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-constants.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +4 -4
- package/src/input/onboarding/onboarding-wizard-network-adopt.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-steps.ts +2 -2
- package/src/input/panel-integration-actions.ts +3 -3
- package/src/input/panel-mouse-geometry.ts +1 -1
- package/src/input/panel-paste-flood-guard.ts +9 -9
- package/src/input/payments-config.ts +15 -15
- package/src/input/profile-picker-modal.ts +1 -1
- package/src/input/provider-key-intake.ts +9 -9
- package/src/input/relay-settings-descriptions.ts +3 -3
- package/src/input/sandbox-exec-config.ts +9 -9
- package/src/input/search.ts +18 -18
- package/src/input/selection-modal-queue.ts +10 -10
- package/src/input/selection-modal.ts +2 -2
- package/src/input/session-picker-modal.ts +7 -7
- package/src/input/settings-modal-activation.ts +1 -1
- package/src/input/settings-modal-adjustment.ts +2 -2
- package/src/input/settings-modal-commit.ts +6 -6
- package/src/input/settings-modal-connections.ts +2 -2
- package/src/input/settings-modal-data.ts +29 -29
- package/src/input/settings-modal-mutations.ts +7 -7
- package/src/input/settings-modal-reset.ts +3 -3
- package/src/input/settings-modal-search.ts +6 -6
- package/src/input/settings-modal-secrets.ts +3 -3
- package/src/input/settings-modal-types.ts +16 -16
- package/src/input/settings-modal.ts +4 -4
- package/src/input/voice-local-settings.ts +3 -3
- package/src/input/worktree-setup-config.ts +8 -8
- package/src/main.ts +15 -15
- package/src/panels/agent-inspector-shared.ts +5 -5
- package/src/panels/base-panel.ts +3 -3
- package/src/panels/builtin/agent.ts +3 -3
- package/src/panels/builtin/development.ts +4 -4
- package/src/panels/builtin/knowledge.ts +1 -1
- package/src/panels/builtin/operations.ts +12 -12
- package/src/panels/builtin/session.ts +8 -8
- package/src/panels/builtin/shared.ts +6 -6
- package/src/panels/builtin-modals.ts +8 -8
- package/src/panels/confirm-state.ts +5 -5
- package/src/panels/cost-tracker-panel.ts +22 -22
- package/src/panels/diff-panel.ts +20 -20
- package/src/panels/diff-review-model.ts +5 -5
- package/src/panels/diff-review-panel.ts +5 -5
- package/src/panels/eval-registry.ts +2 -2
- package/src/panels/expandable-list-panel.ts +5 -5
- package/src/panels/fleet-acts.ts +20 -20
- package/src/panels/fleet-deep-link.ts +5 -5
- package/src/panels/fleet-gateway.ts +12 -12
- package/src/panels/fleet-observed-render.ts +11 -11
- package/src/panels/fleet-panel-format.ts +14 -14
- package/src/panels/fleet-panel-worktree-detail.ts +8 -8
- package/src/panels/fleet-panel.ts +34 -34
- package/src/panels/fleet-read-model.ts +49 -49
- package/src/panels/fleet-spawn.ts +15 -15
- package/src/panels/fleet-steer.ts +7 -7
- package/src/panels/fleet-stop.ts +5 -5
- package/src/panels/fleet-tabs.ts +14 -14
- package/src/panels/fleet-transcript.ts +26 -26
- package/src/panels/git-panel.ts +8 -8
- package/src/panels/hosted-session-feed.ts +13 -13
- package/src/panels/hosted-session-panel.ts +7 -7
- package/src/panels/index.ts +1 -1
- package/src/panels/local-auth-panel.ts +15 -15
- package/src/panels/memory-consolidation-gateway.ts +8 -8
- package/src/panels/modals/devices-modal.ts +8 -8
- package/src/panels/modals/hooks-modal.ts +1 -1
- package/src/panels/modals/keybindings-modal.ts +5 -5
- package/src/panels/modals/knowledge-modal.ts +2 -2
- package/src/panels/modals/local-auth-modal.ts +4 -4
- package/src/panels/modals/marketplace-modal.ts +3 -3
- package/src/panels/modals/memory-modal.ts +19 -19
- package/src/panels/modals/modal-surface-helpers.ts +1 -1
- package/src/panels/modals/modal-theme.ts +3 -3
- package/src/panels/modals/pairing-modal.ts +19 -19
- package/src/panels/modals/planning-modal.ts +4 -4
- package/src/panels/modals/plugins-modal.ts +1 -1
- package/src/panels/modals/policy-modal.ts +4 -4
- package/src/panels/modals/provider-health-modal.ts +1 -1
- package/src/panels/modals/remote-modal.ts +1 -1
- package/src/panels/modals/sandbox-modal.ts +2 -2
- package/src/panels/modals/security-modal.ts +4 -4
- package/src/panels/modals/services-modal.ts +1 -1
- package/src/panels/modals/work-plan-modal.ts +4 -4
- package/src/panels/notifications-feed.ts +6 -6
- package/src/panels/notifications-panel.ts +6 -6
- package/src/panels/panel-confirm-overlay.ts +4 -4
- package/src/panels/panel-manager.ts +13 -13
- package/src/panels/plugins-panel.ts +6 -6
- package/src/panels/polish-core.ts +2 -2
- package/src/panels/polish-tables.ts +2 -2
- package/src/panels/polish.ts +1 -1
- package/src/panels/project-planning-answer-actions.ts +3 -3
- package/src/panels/scrollable-list-panel.ts +15 -15
- package/src/panels/search-focus.ts +1 -1
- package/src/panels/session-maintenance.ts +1 -1
- package/src/panels/skills-panel.ts +3 -3
- package/src/panels/token-budget-panel.ts +11 -11
- package/src/panels/types.ts +14 -14
- package/src/panels/workstream-graph-render.ts +5 -5
- package/src/panels/wrfc-panel-format.ts +1 -1
- package/src/permissions/broker-approval-card.ts +13 -13
- package/src/permissions/hunk-selection.ts +13 -13
- package/src/permissions/prompt.ts +22 -22
- package/src/permissions/sandbox-exec-gate.ts +5 -5
- package/src/providers/provider-classification.ts +1 -1
- package/src/providers/reasoning-effort-surface.ts +12 -12
- package/src/renderer/ansi-sanitize.ts +5 -6
- package/src/renderer/autocomplete-overlay.ts +5 -5
- package/src/renderer/block-actions-overlay.ts +1 -1
- package/src/renderer/bookmark-modal.ts +1 -1
- package/src/renderer/code-block.ts +2 -2
- package/src/renderer/compaction-history-modal.ts +4 -4
- package/src/renderer/compaction-preview.ts +5 -5
- package/src/renderer/compaction-quality.ts +5 -5
- package/src/renderer/composer-fragments.ts +6 -6
- package/src/renderer/compositor.ts +9 -9
- package/src/renderer/config-modal.ts +3 -3
- package/src/renderer/context-inspector.ts +1 -1
- package/src/renderer/context-status-hint.ts +10 -10
- package/src/renderer/conversation-layout.ts +2 -2
- package/src/renderer/conversation-overlays.ts +2 -2
- package/src/renderer/conversation-surface.ts +6 -6
- package/src/renderer/diff.ts +4 -4
- package/src/renderer/fleet-tab-strip.ts +2 -2
- package/src/renderer/footer-tips.ts +4 -4
- package/src/renderer/fullscreen-primitives.ts +1 -1
- package/src/renderer/git-status.ts +5 -5
- package/src/renderer/header-line.ts +5 -5
- package/src/renderer/help-overlay.ts +5 -5
- package/src/renderer/hint-grammar.ts +2 -2
- package/src/renderer/layout.ts +1 -1
- package/src/renderer/markdown-inline.ts +3 -3
- package/src/renderer/markdown-table.ts +7 -7
- package/src/renderer/modal-factory.ts +3 -3
- package/src/renderer/model-picker-overlay.ts +2 -2
- package/src/renderer/model-workspace.ts +7 -7
- package/src/renderer/onboarding/onboarding-wizard.ts +1 -1
- package/src/renderer/overlay-box.ts +1 -1
- package/src/renderer/panel-composite.ts +5 -5
- package/src/renderer/panel-workspace-bar.ts +1 -1
- package/src/renderer/process-indicator.ts +8 -8
- package/src/renderer/profile-picker-modal.ts +3 -3
- package/src/renderer/prompt-content-width.ts +1 -1
- package/src/renderer/search-overlay.ts +3 -3
- package/src/renderer/selection-modal-overlay.ts +6 -6
- package/src/renderer/semantic-diff.ts +6 -7
- package/src/renderer/session-picker-modal.ts +24 -24
- package/src/renderer/settings-modal-connections.ts +3 -3
- package/src/renderer/settings-modal-helpers.ts +16 -16
- package/src/renderer/settings-modal.ts +10 -10
- package/src/renderer/shell-surface.ts +8 -8
- package/src/renderer/status-glyphs.ts +6 -6
- package/src/renderer/syntax-highlighter.ts +2 -3
- package/src/renderer/system-message.ts +3 -3
- package/src/renderer/tab-strip.ts +2 -2
- package/src/renderer/term-caps.ts +12 -12
- package/src/renderer/terminal-bg-probe.ts +10 -10
- package/src/renderer/terminal-escapes.ts +1 -1
- package/src/renderer/theme-mode-config.ts +3 -3
- package/src/renderer/theme.ts +34 -34
- package/src/renderer/thinking.ts +1 -1
- package/src/renderer/tool-call.ts +5 -5
- package/src/renderer/tool-result-expanded-lines.ts +3 -3
- package/src/renderer/tool-result-summary.ts +6 -6
- package/src/renderer/turn-injection.ts +9 -9
- package/src/renderer/ui-factory.ts +33 -33
- package/src/renderer/ui-primitives.ts +4 -4
- package/src/runtime/bootstrap-command-parts.ts +3 -3
- package/src/runtime/bootstrap-core.ts +21 -21
- package/src/runtime/bootstrap-hook-bridge.ts +8 -8
- package/src/runtime/bootstrap-shell.ts +9 -9
- package/src/runtime/bootstrap.ts +16 -16
- package/src/runtime/client/approval-updates.ts +3 -3
- package/src/runtime/client/build-floors.ts +7 -7
- package/src/runtime/client/daemon-attach-handshake.ts +5 -5
- package/src/runtime/client/fleet-union.ts +7 -7
- package/src/runtime/client/host-service-status.ts +2 -2
- package/src/runtime/client/hosted-exit.ts +4 -4
- package/src/runtime/client/hosted-roster.ts +4 -4
- package/src/runtime/client/hosted-session-stream.ts +5 -5
- package/src/runtime/client/hosted-sessions.ts +8 -8
- package/src/runtime/client/operator-endpoint.ts +14 -14
- package/src/runtime/client/spine-adoption.ts +8 -8
- package/src/runtime/context-accounting-source.ts +4 -4
- package/src/runtime/context.ts +2 -2
- package/src/runtime/conversation-rewind-port.ts +6 -6
- package/src/runtime/credential-composition.ts +2 -2
- package/src/runtime/daemon-attach-notices.ts +6 -6
- package/src/runtime/diagnostics/panels/index.ts +1 -1
- package/src/runtime/diagnostics/panels/ops.ts +2 -2
- package/src/runtime/disposal-wiring.ts +6 -6
- package/src/runtime/index.ts +11 -11
- package/src/runtime/install-self-check-startup.ts +4 -4
- package/src/runtime/install-self-check.ts +6 -6
- package/src/runtime/interaction-seams.ts +4 -4
- package/src/runtime/knowledge-services.ts +2 -2
- package/src/runtime/legacy-daemon-migration.ts +37 -37
- package/src/runtime/legacy-daemon-reconcile.ts +30 -30
- package/src/runtime/memory-governance-services.ts +3 -3
- package/src/runtime/memory-spine-transport.ts +3 -3
- package/src/runtime/notification-dispatch.ts +4 -4
- package/src/runtime/onboarding/apply.ts +1 -1
- package/src/runtime/onboarding/derivation.ts +1 -1
- package/src/runtime/onboarding/fast-path.ts +7 -7
- package/src/runtime/onboarding/progress.ts +2 -2
- package/src/runtime/onboarding/provider-key-capture.ts +4 -4
- package/src/runtime/onboarding/snapshot.ts +2 -2
- package/src/runtime/onboarding/state.ts +4 -4
- package/src/runtime/onboarding/types.ts +4 -4
- package/src/runtime/orchestrator-core-services.ts +5 -5
- package/src/runtime/path-shadow-startup.ts +3 -3
- package/src/runtime/perf/panel-contracts.ts +1 -1
- package/src/runtime/power-keepawake-remote.ts +6 -6
- package/src/runtime/process-lifecycle.ts +14 -14
- package/src/runtime/provider-fallback.ts +3 -3
- package/src/runtime/recovery-autosave.ts +3 -3
- package/src/runtime/recovery-decisions.ts +19 -19
- package/src/runtime/recovery-offer-wiring.ts +4 -4
- package/src/runtime/recovery-prompt.ts +20 -20
- package/src/runtime/relay-reachability-bridge.ts +3 -3
- package/src/runtime/release-artifacts.ts +1 -1
- package/src/runtime/resume-notice.ts +20 -20
- package/src/runtime/runtime-services-types.ts +20 -20
- package/src/runtime/services.ts +20 -20
- package/src/runtime/session-continuity-hints.ts +1 -1
- package/src/runtime/session-inbound-inputs.ts +12 -12
- package/src/runtime/session-resume-liveness-confirm.ts +4 -4
- package/src/runtime/session-spine-transport.ts +3 -3
- package/src/runtime/store/domains/panels.ts +2 -2
- package/src/runtime/store/domains/ui-perf.ts +2 -2
- package/src/runtime/store/index.ts +1 -1
- package/src/runtime/store/selectors/index.ts +1 -1
- package/src/runtime/store/state.ts +2 -2
- package/src/runtime/ui-services.ts +3 -3
- package/src/runtime/workspace-checkpointing.ts +3 -3
- package/src/runtime/wrfc-persistence.ts +15 -15
- package/src/scripts/process-messages.ts +1 -1
- package/src/shell/blocking-input.ts +9 -9
- package/src/shell/recovery-input-helpers.ts +2 -2
- package/src/shell/retry-affordance.ts +9 -9
- package/src/shell/ui-openers.ts +14 -14
- package/src/shell/voice-capture-shell.ts +3 -3
- package/src/tools/wrfc-agent-guard.ts +4 -4
- package/src/utils/browser.ts +2 -2
- package/src/utils/format-duration.ts +3 -3
- package/src/utils/format-number.ts +2 -2
- package/src/utils/splash-lines.ts +4 -4
- package/src/utils/terminal-width.ts +6 -6
- package/src/verification/verification-ledger.ts +25 -25
- package/src/version.ts +3 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* settings-modal-reset
|
|
2
|
+
* settings-modal-reset, pure reset helpers for SettingsModal.
|
|
3
3
|
*
|
|
4
4
|
* These functions encapsulate the three reset operations:
|
|
5
5
|
* - resetSelected: reset the currently selected setting to its schema default
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Each function takes its dependencies as explicit arguments rather than
|
|
11
11
|
* accessing class-level state. resetCategoryConfirm and resetAllConfirm
|
|
12
|
-
* remain public class fields on SettingsModal
|
|
12
|
+
* remain public class fields on SettingsModal, the renderer reads them
|
|
13
13
|
* directly to decide the footer state.
|
|
14
14
|
*/
|
|
15
15
|
|
|
@@ -44,7 +44,7 @@ export function resetSelected({
|
|
|
44
44
|
// Delete from the tier the write went to. A daemon-owned key was stored in
|
|
45
45
|
// the daemon tier (defaultSecretBackedScope), so a delete narrowed to 'user'
|
|
46
46
|
// would report a cleared setting while the daemon kept using the live
|
|
47
|
-
// credential
|
|
47
|
+
// credential, the reset that isn't one.
|
|
48
48
|
void secretsManager.delete(buildGoodVibesSecretKey(key), { scope: defaultSecretBackedScope(key) }).catch((error) => {
|
|
49
49
|
logger.error('SettingsModal: failed to clear secret while resetting setting', { key, error: summarizeError(error) });
|
|
50
50
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* settings-modal-search
|
|
2
|
+
* settings-modal-search, ranked search over the settings workspace.
|
|
3
3
|
*
|
|
4
4
|
* Split out of settings-modal-data.ts, which had reached its 800-line ceiling.
|
|
5
5
|
* Scoring and search are a self-contained unit: they read a SettingEntry and a
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
import type { SettingEntry, SettingsCategory } from './settings-modal-types.ts';
|
|
12
12
|
|
|
13
13
|
// ---------------------------------------------------------------------------
|
|
14
|
-
// fuzzyScoreSettingEntry
|
|
14
|
+
// fuzzyScoreSettingEntry, score an entry against a query for ranked search
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
16
16
|
|
|
17
17
|
/**
|
|
@@ -40,20 +40,20 @@ export function fuzzyScoreSettingEntry(
|
|
|
40
40
|
const label = getLabel(entry).toLowerCase();
|
|
41
41
|
const description = (entry.setting.description ?? '').toLowerCase();
|
|
42
42
|
|
|
43
|
-
// Tier 1: key substring
|
|
43
|
+
// Tier 1: key substring, base 3000, position bonus up to 999
|
|
44
44
|
// A key match at position 0 scores 3999; at position 999 scores 3000.
|
|
45
45
|
const keyIdx = key.indexOf(lq);
|
|
46
46
|
if (keyIdx !== -1) return 3000 + Math.max(0, 999 - keyIdx);
|
|
47
47
|
|
|
48
|
-
// Tier 2: label substring
|
|
48
|
+
// Tier 2: label substring, base 2000, position bonus up to 999
|
|
49
49
|
const labelIdx = label.indexOf(lq);
|
|
50
50
|
if (labelIdx !== -1) return 2000 + Math.max(0, 999 - labelIdx);
|
|
51
51
|
|
|
52
|
-
// Tier 3: description substring
|
|
52
|
+
// Tier 3: description substring, base 1000, position bonus up to 999
|
|
53
53
|
const descIdx = description.indexOf(lq);
|
|
54
54
|
if (descIdx !== -1) return 1000 + Math.max(0, 999 - descIdx);
|
|
55
55
|
|
|
56
|
-
// Tier 4: subsequence across concatenated key + label + description
|
|
56
|
+
// Tier 4: subsequence across concatenated key + label + description, 1..99
|
|
57
57
|
const haystack = `${key} ${label} ${description}`;
|
|
58
58
|
let qi = 0;
|
|
59
59
|
let score = 0;
|
|
@@ -14,8 +14,8 @@ export type SettingsSecretsManager = Pick<SecretsManager, 'delete' | 'set'>;
|
|
|
14
14
|
/**
|
|
15
15
|
* The daemon's own credential write, when this app has a daemon to write to.
|
|
16
16
|
*
|
|
17
|
-
* A daemon-scoped credential is two writes that only work together
|
|
18
|
-
* value and the config reference that points at it
|
|
17
|
+
* A daemon-scoped credential is two writes that only work together, the secret
|
|
18
|
+
* value and the config reference that points at it, and `credentials.set` does
|
|
19
19
|
* both, verifying the value reads back before it touches the config. Splitting
|
|
20
20
|
* them across a process boundary leaves a window where the config names a
|
|
21
21
|
* reference resolving to nothing, which every reader treats as a
|
|
@@ -61,7 +61,7 @@ export function setSecretBackedSettingValue(args: {
|
|
|
61
61
|
const update = buildSecretBackedConfigUpdate(key, value);
|
|
62
62
|
// A daemon-owned key (surfaces.*, payments.*, controlPlane.*, ...) names a
|
|
63
63
|
// credential the daemon itself executes with, so its secret material lands in
|
|
64
|
-
// the daemon tier
|
|
64
|
+
// the daemon tier, the one the daemon reads with every surface closed,
|
|
65
65
|
// regardless of which client edited it. Everything else stays at user scope.
|
|
66
66
|
// See secret-config.ts's defaultSecretBackedScope.
|
|
67
67
|
const scope = defaultSecretBackedScope(key);
|
|
@@ -52,40 +52,40 @@ export type SettingsCategory =
|
|
|
52
52
|
| 'update'
|
|
53
53
|
| 'power'
|
|
54
54
|
| 'memory'
|
|
55
|
-
// payments
|
|
55
|
+
// payments.*, the card on file for daemon-initiated purchases. Like
|
|
56
56
|
// 'profile' below, this entry and its SETTINGS_CATEGORY_GROUPS membership are
|
|
57
57
|
// both mandatory or the whole prefix is dropped from the workspace.
|
|
58
58
|
| 'payments'
|
|
59
|
-
// profile
|
|
59
|
+
// profile.*, the owner profile (docs/owner-profile.md §12.1). This entry and
|
|
60
60
|
// its SETTINGS_CATEGORY_GROUPS membership below are both mandatory:
|
|
61
61
|
// buildSettingGroups guards every push with `if (groups.has(cat))`, so a
|
|
62
62
|
// config prefix with no category here is dropped from the workspace entirely
|
|
63
|
-
// and reachable only by hand-editing a settings file
|
|
63
|
+
// and reachable only by hand-editing a settings file, see the push.* and
|
|
64
64
|
// cluster.* comments in settings-modal-data.ts for the two times that happened.
|
|
65
65
|
| 'profile'
|
|
66
|
-
// occasions
|
|
66
|
+
// occasions.*, the proactive occasions/plans loop (docs/occasions.md §8):
|
|
67
67
|
// lead time, active hours, nudge channel and cadence, away-date adjustment,
|
|
68
68
|
// calendar mirroring, interview length, gift-history retention, and the
|
|
69
69
|
// sweep interval. Same mandatory-dual-membership rule as profile above, or
|
|
70
70
|
// all twelve keys are dropped from the workspace and reachable only by
|
|
71
|
-
// hand-editing a settings file
|
|
71
|
+
// hand-editing a settings file, a third occurrence of the push.*/cluster.*
|
|
72
72
|
// class the profile comment already names two of.
|
|
73
73
|
| 'occasions'
|
|
74
|
-
// hostedSessions
|
|
74
|
+
// hostedSessions.*, sessions whose conversation loop runs inside the daemon
|
|
75
75
|
// instead of this terminal: what detaching does to one (the owner-confirmed
|
|
76
76
|
// default is `kill`, the behavior closing a client has always had), how many
|
|
77
77
|
// may run at once, how much of a conversation is kept, and how long a
|
|
78
78
|
// terminated one's record is retained. Same mandatory-dual-membership rule as
|
|
79
|
-
// profile and occasions above
|
|
79
|
+
// profile and occasions above, without BOTH this entry and the
|
|
80
80
|
// SETTINGS_CATEGORY_GROUPS membership below, buildSettingGroups drops every
|
|
81
81
|
// hostedSessions.* key from the workspace, which is exactly what happened to
|
|
82
82
|
// push.* and cluster.* before them.
|
|
83
83
|
| 'hostedSessions'
|
|
84
|
-
// email.* / calendar.* / google
|
|
84
|
+
// email.* / calendar.* / google.*, the connector keys the daemon really
|
|
85
85
|
// reads for its Google-backed mail and calendar services (platform runtime
|
|
86
86
|
// 2.0.8 registered them as described schema rows; before that they were
|
|
87
87
|
// cast onto the live config invisibly and answered "Unknown setting").
|
|
88
|
-
// Same mandatory-dual-membership rule as profile and hostedSessions above
|
|
88
|
+
// Same mandatory-dual-membership rule as profile and hostedSessions above,
|
|
89
89
|
// without BOTH these entries and the SETTINGS_CATEGORY_GROUPS membership
|
|
90
90
|
// below, every one of the 22 connector keys is dropped from the workspace.
|
|
91
91
|
| 'email'
|
|
@@ -103,22 +103,22 @@ export const SETTINGS_CATEGORY_GROUPS: ReadonlyArray<{
|
|
|
103
103
|
{ label: 'AI Routing', categories: ['provider', 'pricing', 'subscriptions', 'helper', 'tools', 'tts', 'voice'] },
|
|
104
104
|
{ label: 'Service & Network', categories: ['service', 'daemon', 'network', 'controlPlane', 'httpListener', 'web', 'relay'] },
|
|
105
105
|
// 'hostedSessions' sits beside 'surfaces' and 'conversationGate': all three
|
|
106
|
-
// answer "where does this conversation actually run, and who can reach it"
|
|
106
|
+
// answer "where does this conversation actually run, and who can reach it",
|
|
107
107
|
// the detach policy is a fact about the daemon holding a session open, not
|
|
108
108
|
// about this terminal's presentation of it.
|
|
109
109
|
// 'email', 'calendar' and 'google' sit beside 'surfaces': they configure
|
|
110
|
-
// the daemon's connections to the owner's mail and calendar
|
|
110
|
+
// the daemon's connections to the owner's mail and calendar, where those
|
|
111
111
|
// services reach the world, not how this terminal presents anything.
|
|
112
112
|
{ label: 'Surfaces & Cloud', categories: ['surfaces', 'hostedSessions', 'device', 'conversationGate', 'integrations', 'connections', 'email', 'calendar', 'google', 'mcp', 'cloudflare'] },
|
|
113
113
|
// 'occasions' sits beside 'checkin': both are proactive background loops
|
|
114
114
|
// (a cadence, a judgment pass, a conditional channel delivery) rather than
|
|
115
|
-
// facts held about the owner
|
|
115
|
+
// facts held about the owner, the data occasions/plans declare lives in
|
|
116
116
|
// the owner profile file itself (docs/occasions.md §3), but these SETTINGS
|
|
117
117
|
// rows tune the loop, exactly like checkin's.
|
|
118
118
|
{ label: 'Automation', categories: ['batch', 'automation', 'checkin', 'occasions', 'watchers', 'orchestration', 'planner', 'wrfc', 'payments'] },
|
|
119
119
|
// 'profile' sits beside 'memory' and 'learning': all three are what the
|
|
120
120
|
// platform retains about the person using it, and this is the group a reader
|
|
121
|
-
// looking for "what does it know about me" already scans
|
|
121
|
+
// looking for "what does it know about me" already scans, Interface is
|
|
122
122
|
// presentation and permission posture, and nothing there is a store of facts.
|
|
123
123
|
{ label: 'Runtime & Data', categories: ['storage', 'atRest', 'sandbox', 'fetch', 'agents', 'runtime', 'power', 'profile', 'memory', 'cache', 'telemetry', 'diagnostics', 'learning'] },
|
|
124
124
|
{ label: 'Advanced', categories: ['release', 'update', 'danger'] },
|
|
@@ -138,14 +138,14 @@ export interface SettingEntry {
|
|
|
138
138
|
/**
|
|
139
139
|
* Present when this row is a feature-unit header (a platform capability
|
|
140
140
|
* rendered as one unit with the settings that tune it beneath). The row IS
|
|
141
|
-
* the real config row for the feature's enablement key
|
|
141
|
+
* the real config row for the feature's enablement key, boolean headers
|
|
142
142
|
* toggle and enum headers cycle their mode choices through the ordinary
|
|
143
143
|
* settings write path (a plain config write; the settings bridge keeps the
|
|
144
144
|
* runtime gate in sync).
|
|
145
145
|
*/
|
|
146
146
|
flag?: FlagEntry;
|
|
147
147
|
/**
|
|
148
|
-
* Present when this row is a settings sub-option OWNED by a feature unit
|
|
148
|
+
* Present when this row is a settings sub-option OWNED by a feature unit,
|
|
149
149
|
* the id of the owning feature. Drives the indented rendering beneath its
|
|
150
150
|
* header and marks the row as claimed so it does not double-list as an
|
|
151
151
|
* orphan.
|
|
@@ -162,7 +162,7 @@ export interface FlagEntry {
|
|
|
162
162
|
state: FlagState;
|
|
163
163
|
/**
|
|
164
164
|
* Last known config-layer (persisted) value. Equals `state` unless a
|
|
165
|
-
* startup-gated feature was changed this session
|
|
165
|
+
* startup-gated feature was changed this session, then it holds the value
|
|
166
166
|
* that will take effect on the next launch.
|
|
167
167
|
*/
|
|
168
168
|
persistedState: FlagState;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SettingsModal
|
|
2
|
+
* SettingsModal, state management for the /settings and /config fullscreen workspace.
|
|
3
3
|
*
|
|
4
4
|
* Loads CONFIG_SCHEMA, groups settings by category, and tracks UI state:
|
|
5
5
|
* - Active category (Tab to cycle)
|
|
@@ -88,7 +88,7 @@ export interface SettingsModalOpenOptions {
|
|
|
88
88
|
readonly onSettingApplied?: SettingsModalChangeHandler;
|
|
89
89
|
/**
|
|
90
90
|
* The daemon's credential write. A daemon-scoped credential (a mailbox
|
|
91
|
-
* password, a bot token, a card) must land where the daemon reads it
|
|
91
|
+
* password, a bot token, a card) must land where the daemon reads it, this
|
|
92
92
|
* surface storing a copy is a credential in a place nothing consults.
|
|
93
93
|
*/
|
|
94
94
|
readonly daemonCredentials?: SettingsDaemonCredentialWriter | null;
|
|
@@ -141,7 +141,7 @@ export class SettingsModal {
|
|
|
141
141
|
/**
|
|
142
142
|
* Scroll offset (in wrapped lines) of the documentation pane for the
|
|
143
143
|
* selected row. The renderer clamps it to the pane's real content height
|
|
144
|
-
* and shows honest more-above/below markers
|
|
144
|
+
* and shows honest more-above/below markers, long feature documentation
|
|
145
145
|
* scrolls, it never clips. Reset whenever the selection changes.
|
|
146
146
|
*/
|
|
147
147
|
public contextScroll = 0;
|
|
@@ -721,7 +721,7 @@ export class SettingsModal {
|
|
|
721
721
|
// No-op (result.changed === false, effectMessage === null): leave lastSettingEffectMessage untouched.
|
|
722
722
|
|
|
723
723
|
// Selecting 'prompt' for payments.cvvHandling states the tradeoff at the
|
|
724
|
-
// moment of selection, not just in the documentation pane
|
|
724
|
+
// moment of selection, not just in the documentation pane, see the
|
|
725
725
|
// SDK's own CVV_PROMPT_TRADEOFF_WARNING (platform/payments).
|
|
726
726
|
if (key === PAYMENTS_CVV_HANDLING_CONFIG_KEY && value === 'prompt') {
|
|
727
727
|
this.lastSettingEffectMessage = CVV_PROMPT_TRADEOFF_WARNING;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// voice-local-settings.ts
|
|
2
|
+
// voice-local-settings.ts, the managed local-voice setup affordance the voice
|
|
3
3
|
// settings surfaces render beside ElevenLabs.
|
|
4
4
|
//
|
|
5
5
|
// The local engine registers in the voice provider registry regardless of
|
|
6
6
|
// whether it is provisioned yet (its status is honestly "unconfigured", never
|
|
7
7
|
// an error). When it is NOT provisioned, the settings/provider-picker surface
|
|
8
|
-
// offers the one-act install with its download size declared up front
|
|
8
|
+
// offers the one-act install with its download size declared up front, the
|
|
9
9
|
// size is computed synchronously from the pinned piper manifest
|
|
10
10
|
// (piperProvisionBytes) so no daemon round-trip is needed just to label the
|
|
11
11
|
// offer. Platforms with no pinned managed build say so honestly.
|
|
@@ -45,7 +45,7 @@ export function localVoiceSetupOffer(configGet: (key: string) => unknown): Local
|
|
|
45
45
|
let detail: string;
|
|
46
46
|
if (!supported) detail = 'local voice: no managed build for this platform (set voice.local.* by hand to use it)';
|
|
47
47
|
else if (provisioned) detail = 'local voice: configured (managed engine set)';
|
|
48
|
-
else detail = `local voice: not set up
|
|
48
|
+
else detail = `local voice: not set up; run /voice setup (${sizeLabel})`;
|
|
49
49
|
|
|
50
50
|
const actions = supported && !provisioned ? '[Enter] select · /voice setup to provision' : '[Enter] set provider';
|
|
51
51
|
return { supported, provisioned, sizeLabel, detail, actions };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* worktree-setup-config.ts
|
|
2
|
+
* worktree-setup-config.ts, TUI-local synthetic settings entries for
|
|
3
3
|
* worktree.setup.commands / worktree.setup.carryOverGlobs.
|
|
4
4
|
*
|
|
5
5
|
* Neither key is in the SDK's ConfigKey union: the SDK's cold-start worktree
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
* settings-modal-data.ts (behavior.notifyAfterSeconds, storage.codeIndexEnabled, etc).
|
|
13
13
|
*
|
|
14
14
|
* Both keys hold a JSON array of strings on disk. The settings modal's
|
|
15
|
-
* inline editor is a single-line text field, so
|
|
16
|
-
* convention for controlPlane.cors.allowedOrigins
|
|
15
|
+
* inline editor is a single-line text field, so, matching the SDK's own
|
|
16
|
+
* convention for controlPlane.cors.allowedOrigins, they are displayed and
|
|
17
17
|
* edited as a comma-separated list and parsed back into an array on commit
|
|
18
18
|
* (see isWorktreeSetupListConfigKey's use in settings-modal.ts#commitEdit).
|
|
19
19
|
*/
|
|
@@ -34,14 +34,14 @@ export function isWorktreeSetupListConfigKey(key: ConfigKey): boolean {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
|
-
* Read a config value as a string array
|
|
37
|
+
* Read a config value as a string array, mirrors the SDK's own tolerant
|
|
38
38
|
* readStringArray (non-array/malformed degrades to empty).
|
|
39
39
|
*
|
|
40
40
|
* Defensive try/catch (now belt-and-suspenders): the SDK registers the
|
|
41
41
|
* `worktree` section in DEFAULT_CONFIG (setup.commands / setup.carryOverGlobs,
|
|
42
42
|
* both empty lists) as of this repack, so ConfigManager.get no longer throws
|
|
43
|
-
* for these keys on a fresh store. The guard is retained so an older SDK
|
|
44
|
-
* a config store whose section was pruned
|
|
43
|
+
* for these keys on a fresh store. The guard is retained so an older SDK, or
|
|
44
|
+
* a config store whose section was pruned, degrades to an empty list here
|
|
45
45
|
* (this read runs on every settings-modal build) rather than crashing /config
|
|
46
46
|
* or /settings.
|
|
47
47
|
*/
|
|
@@ -65,14 +65,14 @@ export const WORKTREE_SETUP_COMMANDS_SYNTHETIC_SETTING: ConfigSetting = {
|
|
|
65
65
|
key: WORKTREE_SETUP_COMMANDS_CONFIG_KEY,
|
|
66
66
|
type: 'string',
|
|
67
67
|
default: [],
|
|
68
|
-
description: 'Comma-separated shell command lines run in order in a freshly-created isolated worktree before it is handed to an agent (e.g. "bun install, bun run codegen"). A command that exits non-zero stops setup there and marks the worktree failed
|
|
68
|
+
description: 'Comma-separated shell command lines run in order in a freshly-created isolated worktree before it is handed to an agent (e.g. "bun install, bun run codegen"). A command that exits non-zero stops setup there and marks the worktree failed; visible on /worktree review and the worktree record, never silent. Empty = no setup commands run.',
|
|
69
69
|
};
|
|
70
70
|
|
|
71
71
|
export const WORKTREE_SETUP_CARRY_OVER_GLOBS_SYNTHETIC_SETTING: ConfigSetting = {
|
|
72
72
|
key: WORKTREE_SETUP_CARRY_OVER_GLOBS_CONFIG_KEY,
|
|
73
73
|
type: 'string',
|
|
74
74
|
default: [],
|
|
75
|
-
description: 'Comma-separated glob patterns (e.g. ".env, .env.*, config/local.json") of UNTRACKED files copied from the source working tree into a freshly-created isolated worktree, after setup commands run. Only files git reports as untracked are eligible
|
|
75
|
+
description: 'Comma-separated glob patterns (e.g. ".env, .env.*, config/local.json") of UNTRACKED files copied from the source working tree into a freshly-created isolated worktree, after setup commands run. Only files git reports as untracked are eligible; committed files already carry over through the worktree checkout itself. Empty = nothing carried over.',
|
|
76
76
|
};
|
|
77
77
|
|
|
78
78
|
function buildWorktreeSetupListEntry(configManager: Pick<ConfigManager, 'get'>, setting: ConfigSetting): SettingEntry {
|
package/src/main.ts
CHANGED
|
@@ -90,7 +90,7 @@ async function main() {
|
|
|
90
90
|
const stdin = process.stdin;
|
|
91
91
|
// Both roots come from the one resolver the daemon CLI also uses. This line
|
|
92
92
|
// called homedir() unconditionally, so a harness that redirected the tree got
|
|
93
|
-
// a client that wrote the real one
|
|
93
|
+
// a client that wrote the real one, secret store included.
|
|
94
94
|
const { cli, configManager, bootstrapWorkingDir, bootstrapHomeDirectory } = await prepareShellCliRuntime(process.argv.slice(2), {
|
|
95
95
|
defaultWorkingDirectory: process.env['GOODVIBES_WORKING_DIR'] ?? process.cwd(),
|
|
96
96
|
homeDirectory: resolveGoodVibesHome(),
|
|
@@ -140,7 +140,7 @@ async function main() {
|
|
|
140
140
|
const { approvalBroker, agentManager, modeManager, processManager, providerRegistry, secretsManager, subscriptionManager } = ctx.services;
|
|
141
141
|
conversation.setSessionMemoryStore(ctx.services.sessionMemoryStore);
|
|
142
142
|
conversation.setSessionLineageTracker(ctx.services.sessionLineageTracker);
|
|
143
|
-
// Shared payload (single source of truth, includes the memoryRegistry
|
|
143
|
+
// Shared payload (single source of truth, includes the memoryRegistry,
|
|
144
144
|
// see orchestrator-core-services.ts) plus this site's favoritesStore.
|
|
145
145
|
orchestrator.setCoreServices({
|
|
146
146
|
...buildSharedOrchestratorCoreServices({ services: ctx.services, configManager, providerRegistry }),
|
|
@@ -154,7 +154,7 @@ async function main() {
|
|
|
154
154
|
applyTerminalRuntimeConfigDefaults(configManager);
|
|
155
155
|
|
|
156
156
|
// Re-surface pre-TUI launch-update lines in-session (the alt screen wipes
|
|
157
|
-
// stdout). Launch-time update mechanics are routine, not urgent
|
|
157
|
+
// stdout). Launch-time update mechanics are routine, not urgent, low
|
|
158
158
|
// priority, not high (a skipped/deferred check is not the kind of thing
|
|
159
159
|
// that should compete with real session alerts for attention).
|
|
160
160
|
for (const line of launchUpdateLines) systemMessageRouter.low(`[Update] ${line}`);
|
|
@@ -186,7 +186,7 @@ async function main() {
|
|
|
186
186
|
let lastMaxScroll: number | null = null;
|
|
187
187
|
// Stream and tool-timer state; mutated by wireStreamEventMetrics handlers, read during render.
|
|
188
188
|
const streamMetrics: StreamMetrics = createStreamMetrics();
|
|
189
|
-
// Live failover record
|
|
189
|
+
// Live failover record, written by the failover path, read every frame so the header and footer agree.
|
|
190
190
|
const failoverState = createFailoverTurnState();
|
|
191
191
|
|
|
192
192
|
const getPromptContentWidth = () => computePromptContentWidth(stdout.columns);
|
|
@@ -222,7 +222,7 @@ async function main() {
|
|
|
222
222
|
const unsubs: Array<() => void> = [];
|
|
223
223
|
let recoveryInterval: ReturnType<typeof setInterval> | null = null;
|
|
224
224
|
let stopSpokenOutputForExit: (() => Promise<void>) | null = null;
|
|
225
|
-
// The optional "used N memories" provenance chip (default OFF)
|
|
225
|
+
// The optional "used N memories" provenance chip (default OFF), see interaction-seams.ts.
|
|
226
226
|
const memoryProvenanceUi = createMemoryProvenanceUi({ render: () => render(), memorySpine: ctx.services.memorySpine });
|
|
227
227
|
// Topology-aware keep-awake: the chip renders the DAEMON's state in adopted-external mode (power-chip-source.ts) and every toggle is forwarded to that daemon (power-keepawake-remote.ts) so keep-awake survives the TUI closing in BOTH topologies.
|
|
228
228
|
const isExternalDaemon = () => uiServices.platform.externalServices?.inspect()?.daemonStatus?.mode === 'external';
|
|
@@ -426,10 +426,10 @@ async function main() {
|
|
|
426
426
|
commandContext.openComposerEditor = makeComposerEditorOpener({ buffer: input, stdin, stdout, writeGuard: allowTerminalWrite, repaint: () => { compositor.resetDiff(); render(); }, cwd: workingDir, env: process.env, notify: (m) => systemMessageRouter.high(m) });
|
|
427
427
|
input.setConversationManager(conversation);
|
|
428
428
|
input.setContentWidth(getPromptContentWidth()); input.filePicker.setOnUpdate(() => render());
|
|
429
|
-
// retirement: agentDetailModal/processModal setOnRefresh wiring removed
|
|
429
|
+
// retirement: agentDetailModal/processModal setOnRefresh wiring removed,
|
|
430
430
|
// those modals were deleted (Fleet subsumes the live process tree via F2).
|
|
431
431
|
|
|
432
|
-
// Model picker callback is handled in bootstrap.ts
|
|
432
|
+
// Model picker callback is handled in bootstrap.ts, do not duplicate here.
|
|
433
433
|
input.setHistory(inputHistory);
|
|
434
434
|
// ONE microphone path, shared by push-to-talk voice input (Alt+V) and wake-word detection; opens no device by itself (shell/voice-capture-shell.ts).
|
|
435
435
|
voiceCaptureStatus = installVoiceCapture({ configManager, shellPaths: ctx.services.shellPaths, homeDirectory, sessionId: ctx.runtime.sessionId, commandContext, unsubs, buffer: input, submitInput, notify: (m) => { systemMessageRouter.high(m); render(); }, render: () => render() });
|
|
@@ -504,7 +504,7 @@ async function main() {
|
|
|
504
504
|
// Cross-surface spine posture segment (adopted-daemon mode only).
|
|
505
505
|
sessionSpineStatus: (() => { const s = uiServices.platform.externalServices?.inspect(); return s?.sessionSpineActive && s.sessionSpineStatus && s.sessionSpineStatus !== 'unknown' ? s.sessionSpineStatus : undefined; })(), runningAgentCount, runningProcessCount,
|
|
506
506
|
webSurfaceUrl: configManager.get('web.enabled') ? resolveWebSurfaceUrl(configManager) : undefined,
|
|
507
|
-
// Always-visible "sleep disabled" chip
|
|
507
|
+
// Always-visible "sleep disabled" chip, topology-aware: the DAEMON's state in adopted-external mode, the in-process manager otherwise (power-chip-source.ts).
|
|
508
508
|
powerKeepAwake: powerChipSource.get().keepAwake,
|
|
509
509
|
// Composer must not read as focused while the panel/process indicator owns keyboard focus.
|
|
510
510
|
promptFocused: !input.panelFocused && !input.indicatorFocused,
|
|
@@ -579,7 +579,7 @@ async function main() {
|
|
|
579
579
|
const partialToolPreview = showPreview ? sessionSnapshot.streamToolPreview : undefined;
|
|
580
580
|
// Elapsed from turn start (stream or tool execution), used for the thinking indicator timer.
|
|
581
581
|
const turnElapsedMs = streamMetrics.startTime > 0 ? Date.now() - streamMetrics.startTime : undefined;
|
|
582
|
-
// Suppressed while a tool executes
|
|
582
|
+
// Suppressed while a tool executes, its ticking timer is the honest indicator then.
|
|
583
583
|
const stallInfo = UIFactory.computeRenderStallInfo(streamMetrics, Date.now());
|
|
584
584
|
const thinking = UIFactory.createThinkingFragment(
|
|
585
585
|
conversationWidth,
|
|
@@ -698,19 +698,19 @@ async function main() {
|
|
|
698
698
|
|
|
699
699
|
unsubs.push(uiServices.events.turns.on('TURN_COMPLETED', (evt) => memoryProvenanceUi.onTurnCompleted(evt)));
|
|
700
700
|
|
|
701
|
-
// Stable turn context for failover retry
|
|
701
|
+
// Stable turn context for failover retry, set in submitInput, read by retryTurn.
|
|
702
702
|
let retryCtx: { count: number; text: string; content?: ContentPart[]; opts?: Parameters<typeof orchestrator.handleUserInput>[2] } | null = null;
|
|
703
703
|
// One-key retry affordance, active right after a user-visible TURN_ERROR: 'r' re-submits on the
|
|
704
704
|
// current provider, 'm' opens the model picker, any other character clears it and routes normally.
|
|
705
705
|
// Surfaced as a transient FOOTER hint (see retryAffordanceHint below), not a transcript message.
|
|
706
706
|
// Time-bounded: onExpire repaints once the 60s disarm timer fires, so a stray keypress hours
|
|
707
|
-
// later can never trigger a real retry
|
|
707
|
+
// later can never trigger a real retry, see retry-affordance.ts.
|
|
708
708
|
const retryAffordance = createRetryAffordanceState({ onExpire: render });
|
|
709
709
|
const retryTurn = (notice?: string): boolean => {
|
|
710
710
|
if (!retryCtx) return false; // nothing to roll back to; the caller narrates instead
|
|
711
711
|
const { count, text, content: rContent, opts: rOpts } = retryCtx;
|
|
712
|
-
// Roll back to pre-submission count, then re-submit. SDK gap
|
|
713
|
-
// The rollback erases the failed turn's transcript
|
|
712
|
+
// Roll back to pre-submission count, then re-submit. SDK gap, no retry-in-place (see handoff).
|
|
713
|
+
// The rollback erases the failed turn's transcript, the failover notice included, which is how
|
|
714
714
|
// that notice used to vanish before anyone could read it. The caller hands it over instead, and
|
|
715
715
|
// it is posted here: after the rollback, above the prompt it explains.
|
|
716
716
|
conversation.removeMessagesAfter(count);
|
|
@@ -775,7 +775,7 @@ async function main() {
|
|
|
775
775
|
});
|
|
776
776
|
process.on('SIGINT', sigintHandler); process.on('unhandledRejection', unhandledRejectionHandler); stdout.on('resize', resizeHandler);
|
|
777
777
|
|
|
778
|
-
// State restores happen ONLY when the user explicitly asks
|
|
778
|
+
// State restores happen ONLY when the user explicitly asks, a CLI flag
|
|
779
779
|
// (--continue/--resume/--fork), a slash command (/session resume,
|
|
780
780
|
// /checkpoints, /rewind), or the startup recovery offer's modal. There is
|
|
781
781
|
// deliberately no unconditional auto-restore here: a bare launch never
|
|
@@ -793,7 +793,7 @@ async function main() {
|
|
|
793
793
|
}));
|
|
794
794
|
|
|
795
795
|
// Auto-save to recovery file every 60s + multi-instance liveness-marker
|
|
796
|
-
// refresh
|
|
796
|
+
// refresh, see runtime/recovery-autosave.ts.
|
|
797
797
|
recoveryInterval = startRecoveryAutosave({ conversation, runtime, surface: ctx.services.surface, buildSessionContinuityHints });
|
|
798
798
|
}
|
|
799
799
|
|
|
@@ -11,7 +11,7 @@ export type AgentInspectorEntryKind = 'user' | 'assistant' | 'tool_call' | 'tool
|
|
|
11
11
|
// AgentDetailModal, which was retired in).
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
13
13
|
|
|
14
|
-
/** Terminal statuses
|
|
14
|
+
/** Terminal statuses, cancel not offered; stall check skipped. */
|
|
15
15
|
export const AGENT_TERMINAL_STATUSES = new Set(['completed', 'failed', 'cancelled']);
|
|
16
16
|
|
|
17
17
|
/** Agents in a non-terminal state for longer than this are considered STALLED. */
|
|
@@ -172,7 +172,7 @@ export function formatAgentCost(usd: number): string {
|
|
|
172
172
|
export interface AgentUsageSummary {
|
|
173
173
|
readonly tokens: number;
|
|
174
174
|
readonly cost: number;
|
|
175
|
-
/** False when the model never resolved to a real price
|
|
175
|
+
/** False when the model never resolved to a real price, `cost` is a zero placeholder, not a real reading. */
|
|
176
176
|
readonly priced: boolean;
|
|
177
177
|
}
|
|
178
178
|
|
|
@@ -190,12 +190,12 @@ interface AgentUsageLike {
|
|
|
190
190
|
* True when a usage object carries actual reported token data rather than
|
|
191
191
|
* being present-but-empty.: the SDK's AgentRecord.usage is initialised
|
|
192
192
|
* to an all-zero object at agent spawn (platform/tools/agent/manager.ts) and
|
|
193
|
-
|
|
193
|
+
*, in the currently pinned SDK version, is never updated past that, so a
|
|
194
194
|
* plain truthiness check on `rec.usage` treats every agent, including ones
|
|
195
195
|
* that did real work, as "has data" and renders a fabricated $0.00/0-token
|
|
196
196
|
* reading. Guarding on real (nonzero) counts instead keeps today's "n/a"
|
|
197
197
|
* honest and lights up automatically once a future SDK actually populates
|
|
198
|
-
* usage
|
|
198
|
+
* usage, no further TUI change needed.
|
|
199
199
|
*/
|
|
200
200
|
export function hasReportedUsage(
|
|
201
201
|
usage: AgentUsageLike['usage'],
|
|
@@ -262,7 +262,7 @@ export function buildWrfcCostSegments(
|
|
|
262
262
|
export interface AgentActivityHooks {
|
|
263
263
|
/** Any AGENT_* activity event for this agent (running/progress/stream/awaiting/finalizing/spawning). */
|
|
264
264
|
readonly onActivity: (agentId: string) => void;
|
|
265
|
-
/** AGENT_SPAWNING only
|
|
265
|
+
/** AGENT_SPAWNING only, used for auto-select-newest-agent. */
|
|
266
266
|
readonly onSpawn: (agentId: string) => void;
|
|
267
267
|
/** AGENT_COMPLETED/FAILED/CANCELLED. */
|
|
268
268
|
readonly onTerminal: (agentId: string) => void;
|
package/src/panels/base-panel.ts
CHANGED
|
@@ -12,7 +12,7 @@ const ERROR_FG = '#ef4444';
|
|
|
12
12
|
/**
|
|
13
13
|
* Frame requester wired by main.ts to the render scheduler. Without it,
|
|
14
14
|
* markDirty() only sets a flag the compositor reads when a frame is ALREADY
|
|
15
|
-
* being composed for another reason (input, streaming)
|
|
15
|
+
* being composed for another reason (input, streaming), so a live panel
|
|
16
16
|
* (fleet ticks, registry subscriptions) sat visibly stale while the app was
|
|
17
17
|
* idle until the next keypress (a replay finding). The scheduler
|
|
18
18
|
* coalesces same-tick requests, so this stays cheap.
|
|
@@ -67,7 +67,7 @@ export abstract class BasePanel implements Panel {
|
|
|
67
67
|
* Last error message to surface in the panel footer.
|
|
68
68
|
* Auto-cleared on the next keystroke by `ScrollableListPanel.handleInput()` (and any
|
|
69
69
|
* subclass that calls `super.handleInput()` or manually calls `this.clearError()` at
|
|
70
|
-
* the start of its handler). BasePanel itself does NOT auto-clear
|
|
70
|
+
* the start of its handler). BasePanel itself does NOT auto-clear, only subclasses
|
|
71
71
|
* that opt into the contract do.
|
|
72
72
|
*/
|
|
73
73
|
protected lastError: string | null = null;
|
|
@@ -227,7 +227,7 @@ export abstract class BasePanel implements Panel {
|
|
|
227
227
|
return consumed;
|
|
228
228
|
}
|
|
229
229
|
|
|
230
|
-
/** Mark this panel dirty
|
|
230
|
+
/** Mark this panel dirty, it will be re-rendered on the next compositor frame. */
|
|
231
231
|
public invalidate(): void { this.needsRender = true; }
|
|
232
232
|
|
|
233
233
|
/** Called by the compositor after a successful render to clear the dirty flag. */
|
|
@@ -3,7 +3,7 @@ import type { ResolvedBuiltinPanelDeps } from './shared.ts';
|
|
|
3
3
|
|
|
4
4
|
// (the purge): thinking, tools, inspector, and wrfc were registered here
|
|
5
5
|
// before the purge. thinking/tools were DELETE-disposition (no surviving
|
|
6
|
-
// human surface
|
|
6
|
+
// human surface, thinking already renders inline in the transcript, tool
|
|
7
7
|
// results render inline plus per-node in Fleet); inspector/wrfc were
|
|
8
8
|
// RETIRE-INTO-FLEET (their live console is subsumed by the Fleet panel,
|
|
9
9
|
// operations.ts:84). See registerOperationsPanels for the fleet
|
|
@@ -11,7 +11,7 @@ import type { ResolvedBuiltinPanelDeps } from './shared.ts';
|
|
|
11
11
|
// the full disposition map.
|
|
12
12
|
export function registerAgentPanels(manager: PanelManager, deps: ResolvedBuiltinPanelDeps): void {
|
|
13
13
|
// Compat: '/panel open agent-logs' and 'inspector' (and any saved
|
|
14
|
-
// layout/muscle memory) still resolve
|
|
14
|
+
// layout/muscle memory) still resolve, redirected straight to fleet.
|
|
15
15
|
// Repointed from agent-logs->inspector now that inspector itself
|
|
16
16
|
// is retired; alias resolution is a single hop (PanelManager._resolveId),
|
|
17
17
|
// so this must point at the real surviving id, not at another alias.
|
|
@@ -19,7 +19,7 @@ export function registerAgentPanels(manager: PanelManager, deps: ResolvedBuiltin
|
|
|
19
19
|
manager.registerAlias('inspector', 'fleet');
|
|
20
20
|
manager.registerAlias('wrfc', 'fleet');
|
|
21
21
|
|
|
22
|
-
// (the purge)
|
|
22
|
+
// (the purge), group B: 'work-plan' and 'project-planning'
|
|
23
23
|
// migrated to the 'work-plan-modal' / 'planning-modal' config-modal surfaces.
|
|
24
24
|
// Their surfaces AND panel→modal redirects are registered centrally in
|
|
25
25
|
// registerBuiltinModals (builtin-modals.ts). Panel registrations retired here.
|
|
@@ -8,8 +8,8 @@ import { requireUiServices, withUnconfiguredFallback } from './shared.ts';
|
|
|
8
8
|
|
|
9
9
|
// (the purge): plan, intelligence, explorer, preview, and symbols were
|
|
10
10
|
// registered here before the purge. plan was RETIRE-INTO-FLEET (its
|
|
11
|
-
// execution-plan view is subsumed by Fleet
|
|
12
|
-
// four were DELETE-disposition (no surviving human surface
|
|
11
|
+
// execution-plan view is subsumed by Fleet, operations.ts:84); the other
|
|
12
|
+
// four were DELETE-disposition (no surviving human surface, intelligence's
|
|
13
13
|
// read-model still backs the surviving `/intelligence` CLI subcommands, see
|
|
14
14
|
// intelligence-runtime.ts; explorer/preview/symbols had no dedicated
|
|
15
15
|
// read-model to preserve). See .goodvibes/audit/2026-07-04-wave6-briefs.json
|
|
@@ -31,7 +31,7 @@ export function registerDevelopmentPanels(manager: PanelManager, deps: ResolvedB
|
|
|
31
31
|
});
|
|
32
32
|
|
|
33
33
|
// Compat: '/panel open plan' (and any saved layout/muscle memory) still
|
|
34
|
-
// resolves
|
|
34
|
+
// resolves, redirected to fleet, which absorbs the execution-plan view.
|
|
35
35
|
manager.registerAlias('plan', 'fleet');
|
|
36
36
|
|
|
37
37
|
manager.registerType({
|
|
@@ -57,7 +57,7 @@ export function registerDevelopmentPanels(manager: PanelManager, deps: ResolvedB
|
|
|
57
57
|
});
|
|
58
58
|
|
|
59
59
|
// 'inspector' registration moved to builtin/agent.ts (category
|
|
60
|
-
// 'agent')
|
|
60
|
+
// 'agent'), it now absorbs the merged agent-logs capabilities.
|
|
61
61
|
|
|
62
62
|
// always registered (was gated behind `if (deps.getOrchestratorUsage)`,
|
|
63
63
|
// so `/panel open cost` reported "Unknown panel" on builds without usage
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { PanelManager } from '../panel-manager.ts';
|
|
2
2
|
import type { ResolvedBuiltinPanelDeps } from './shared.ts';
|
|
3
3
|
|
|
4
|
-
// (the purge)
|
|
4
|
+
// (the purge), group B: 'knowledge' and 'memory' migrated to the
|
|
5
5
|
// 'knowledge-modal' / 'memory-modal' config-modal surfaces. Both surfaces and
|
|
6
6
|
// their panel→modal redirects are registered centrally in registerBuiltinModals
|
|
7
7
|
// (src/panels/builtin-modals.ts). This registrar is intentionally empty
|