@pellux/goodvibes-tui 2.0.13 → 2.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.goodvibes/GOODVIBES.md +1 -1
- package/.goodvibes/agents/reviewer.md +8 -8
- package/.goodvibes/skills/add-provider/SKILL.md +22 -22
- package/CHANGELOG.md +61 -0
- package/README.md +40 -29
- package/docs/README.md +1 -1
- package/docs/foundation-artifacts/README.md +5 -5
- package/docs/foundation-artifacts/operator-contract.json +123 -123
- package/package.json +12 -10
- package/scripts/postinstall.js +3 -3
- package/src/audio/activation-sound.ts +7 -7
- package/src/audio/capture.ts +7 -7
- package/src/audio/onnxruntime-assets.d.ts +1 -1
- package/src/audio/player.ts +4 -4
- package/src/audio/spoken-turn-wiring.ts +4 -4
- package/src/audio/voice-capture-wiring.ts +5 -5
- package/src/audio/voice-input-session.ts +3 -3
- package/src/audio/wake-inference.ts +13 -8
- package/src/audio/wake-runtime.ts +10 -10
- package/src/cli/completions/generate.ts +2 -2
- package/src/cli/doctor.ts +13 -13
- package/src/cli/ensure-goodvibes-gitignore.ts +3 -3
- package/src/cli/entrypoint.ts +3 -3
- package/src/cli/help.ts +6 -6
- package/src/cli/hooks-command.ts +4 -4
- package/src/cli/hooks-report.ts +4 -4
- package/src/cli/launch-auto-update.ts +17 -17
- package/src/cli/management-commands.ts +8 -8
- package/src/cli/management-utils.ts +3 -3
- package/src/cli/management.ts +1 -1
- package/src/cli/plugin-bundles-command.ts +10 -10
- package/src/cli/plugin-command.ts +9 -9
- package/src/cli/service-posture.ts +1 -1
- package/src/cli/status.ts +10 -10
- package/src/cli/surface-command.ts +4 -4
- package/src/cli/tui-startup.ts +23 -23
- package/src/config/run-daemon-config-migration.ts +3 -3
- package/src/config/secret-config.ts +10 -10
- package/src/config/surface.ts +1 -1
- package/src/config/tui-extension-settings.ts +8 -8
- package/src/core/active-model-identity.ts +7 -7
- package/src/core/approval-alert.ts +5 -5
- package/src/core/bookmark-navigation.ts +3 -3
- package/src/core/budget-breach-notifier.ts +6 -6
- package/src/core/compaction-receipt.ts +8 -8
- package/src/core/composer-state.ts +2 -2
- package/src/core/context-usage.ts +1 -1
- package/src/core/conversation-compaction-render.ts +3 -3
- package/src/core/conversation-event-navigation.ts +2 -2
- package/src/core/conversation-fold.ts +9 -9
- package/src/core/conversation-line-cache.ts +14 -14
- package/src/core/conversation-render-context.ts +6 -6
- package/src/core/conversation-rendering.ts +27 -30
- package/src/core/conversation-search-expansion.ts +6 -6
- package/src/core/conversation-splash-state.ts +3 -3
- package/src/core/conversation-turn-structure.ts +13 -13
- package/src/core/conversation-types.ts +3 -3
- package/src/core/conversation-user-receipts.ts +5 -5
- package/src/core/conversation.ts +17 -17
- package/src/core/format-user-error.ts +5 -5
- package/src/core/long-task-notifier.ts +9 -9
- package/src/core/memory-diagnostics-gateway.ts +8 -8
- package/src/core/memory-provenance.ts +5 -5
- package/src/core/model-routing-chip.ts +3 -3
- package/src/core/pairing-tailscale-gateway.ts +3 -3
- package/src/core/permission-mode.ts +5 -5
- package/src/core/power-chip-source.ts +3 -3
- package/src/core/power-status.ts +8 -8
- package/src/core/rewind-receipt.ts +6 -6
- package/src/core/session-resume-core.ts +8 -8
- package/src/core/stream-event-wiring.ts +36 -36
- package/src/core/stream-stall-watchdog.ts +4 -4
- package/src/core/system-message-noise.ts +7 -7
- package/src/core/system-message-router.ts +10 -10
- package/src/core/terminal-notifier.ts +5 -5
- package/src/core/turn-budget-outcome.ts +5 -5
- package/src/core/turn-cancellation.ts +3 -3
- package/src/core/turn-event-wiring.ts +16 -16
- package/src/core/voice-capture-status.ts +2 -2
- package/src/core/voice-provision-gateway.ts +12 -12
- package/src/core/voice-provision-status.ts +19 -19
- package/src/core/voice-stt-gateway.ts +6 -6
- package/src/core/wake-provision-runner.ts +7 -7
- package/src/core/wake-provision-status.ts +17 -17
- package/src/core/workstream-notification.ts +8 -8
- package/src/export/gist-uploader.ts +7 -7
- package/src/input/autocomplete.ts +3 -3
- package/src/input/bookmark-modal.ts +1 -1
- package/src/input/command-args-hint.ts +2 -2
- package/src/input/command-reference.ts +9 -9
- package/src/input/command-registry.ts +32 -32
- package/src/input/commands/acp-runtime.ts +6 -6
- package/src/input/commands/calendar-runtime.ts +9 -9
- package/src/input/commands/channel-pairing.ts +11 -11
- package/src/input/commands/channel-runtime.ts +1 -1
- package/src/input/commands/checkin-runtime.ts +4 -4
- package/src/input/commands/checkpoint-runtime.ts +4 -4
- package/src/input/commands/ci-runtime.ts +4 -4
- package/src/input/commands/cluster-runtime.ts +3 -3
- package/src/input/commands/codebase-runtime.ts +16 -16
- package/src/input/commands/config.ts +6 -6
- package/src/input/commands/connection-status.ts +12 -12
- package/src/input/commands/context-window.ts +2 -2
- package/src/input/commands/cost-attribution-format.ts +4 -4
- package/src/input/commands/cost-runtime.ts +2 -2
- package/src/input/commands/devices-runtime.ts +7 -7
- package/src/input/commands/diff-runtime.ts +2 -2
- package/src/input/commands/editor-runtime.ts +1 -1
- package/src/input/commands/eval.ts +4 -4
- package/src/input/commands/experience-runtime.ts +1 -1
- package/src/input/commands/git-runtime.ts +3 -3
- package/src/input/commands/graph-runtime.ts +3 -3
- package/src/input/commands/guidance-runtime.ts +1 -1
- package/src/input/commands/health-metrics-format.ts +2 -2
- package/src/input/commands/health-runtime.ts +8 -8
- package/src/input/commands/hosted-runtime.ts +13 -13
- package/src/input/commands/image-runtime.ts +6 -6
- package/src/input/commands/intelligence-runtime.ts +2 -2
- package/src/input/commands/local-auth-runtime.ts +3 -3
- package/src/input/commands/local-provider-runtime.ts +3 -3
- package/src/input/commands/local-runtime.ts +7 -7
- package/src/input/commands/mail-runtime.ts +9 -9
- package/src/input/commands/mcp-runtime.ts +1 -1
- package/src/input/commands/memory.ts +13 -13
- package/src/input/commands/notify-runtime.ts +1 -1
- package/src/input/commands/operator-panel-runtime.ts +8 -8
- package/src/input/commands/operator-rpc.ts +3 -3
- package/src/input/commands/operator-runtime.ts +3 -3
- package/src/input/commands/palette-runtime.ts +1 -1
- package/src/input/commands/payment-card-intake.ts +17 -17
- package/src/input/commands/permissions-provenance.ts +7 -7
- package/src/input/commands/permissions-runtime.ts +1 -1
- package/src/input/commands/planning-runtime.ts +9 -9
- package/src/input/commands/platform-services-runtime.ts +2 -2
- package/src/input/commands/policy-dispatch.ts +6 -6
- package/src/input/commands/power-runtime.ts +6 -6
- package/src/input/commands/principals-runtime.ts +3 -3
- package/src/input/commands/product-runtime.ts +3 -3
- package/src/input/commands/profile-render.ts +13 -13
- package/src/input/commands/profile-runtime.ts +13 -13
- package/src/input/commands/profile-types.ts +13 -13
- package/src/input/commands/provider-accounts-runtime.ts +5 -5
- package/src/input/commands/provider.ts +10 -10
- package/src/input/commands/qrcode-runtime.ts +3 -3
- package/src/input/commands/queue-runtime.ts +6 -6
- package/src/input/commands/recall-files-config.ts +4 -4
- package/src/input/commands/recall-files-git.ts +3 -3
- package/src/input/commands/recall-files.ts +12 -12
- package/src/input/commands/recall-query.ts +3 -3
- package/src/input/commands/recall-review.ts +3 -3
- package/src/input/commands/recall-shared.ts +1 -1
- package/src/input/commands/relay-runtime.ts +5 -5
- package/src/input/commands/remote-runtime.ts +3 -3
- package/src/input/commands/review-runtime.ts +8 -8
- package/src/input/commands/rewind-runtime.ts +21 -21
- package/src/input/commands/runtime-services.ts +1 -2
- package/src/input/commands/schedule-nl.ts +2 -2
- package/src/input/commands/schedule-runtime.ts +2 -2
- package/src/input/commands/secret-runtime.ts +3 -3
- package/src/input/commands/session-content.ts +7 -7
- package/src/input/commands/session-picker-filter.ts +3 -3
- package/src/input/commands/session-workflow.ts +10 -10
- package/src/input/commands/session.ts +15 -15
- package/src/input/commands/settings-sync-runtime.ts +2 -2
- package/src/input/commands/share-runtime.ts +4 -4
- package/src/input/commands/shell-core.ts +11 -11
- package/src/input/commands/tasks-runtime.ts +4 -4
- package/src/input/commands/test-runtime.ts +6 -6
- package/src/input/commands/tts-runtime.ts +4 -4
- package/src/input/commands/update-runtime.ts +27 -27
- package/src/input/commands/websearch-runtime.ts +2 -2
- package/src/input/commands/work-plan-runtime.ts +2 -2
- package/src/input/commands/workstream-attempt-dependents.ts +4 -4
- package/src/input/commands/workstream-attempts.ts +16 -16
- package/src/input/commands/workstream-runtime.ts +36 -36
- package/src/input/commands/worktree-runtime.ts +6 -6
- package/src/input/composer-capture.ts +5 -5
- package/src/input/concealed-input.ts +2 -2
- package/src/input/config-modal-types.ts +16 -16
- package/src/input/config-modal.ts +30 -30
- package/src/input/daemon-owned-settings-descriptions.ts +4 -4
- package/src/input/delete-key-policy.ts +1 -1
- package/src/input/exec-env-scrub-config.ts +7 -7
- package/src/input/feature-unit-layout.ts +5 -5
- package/src/input/feed-context-factory.ts +38 -38
- package/src/input/file-picker.ts +1 -1
- package/src/input/handler-command-route.ts +2 -2
- package/src/input/handler-content-actions.ts +8 -8
- package/src/input/handler-feed-routes.ts +13 -13
- package/src/input/handler-feed.ts +31 -31
- package/src/input/handler-interactions.ts +2 -2
- package/src/input/handler-modal-routes.ts +13 -13
- package/src/input/handler-modal-stack.ts +1 -1
- package/src/input/handler-modal-token-routes.ts +1 -1
- package/src/input/handler-onboarding-daemon-adopt.ts +6 -6
- package/src/input/handler-picker-routes.ts +7 -7
- package/src/input/handler-prompt-buffer.ts +1 -1
- package/src/input/handler-shortcuts.ts +12 -12
- package/src/input/handler-types.ts +3 -3
- package/src/input/handler-ui-state.ts +1 -1
- package/src/input/handler.ts +9 -9
- package/src/input/input-history.ts +1 -1
- package/src/input/keybindings.ts +13 -13
- package/src/input/kill-ring.ts +7 -11
- package/src/input/model-picker-filter.ts +3 -3
- package/src/input/model-picker-items.ts +5 -5
- package/src/input/model-picker-types.ts +2 -2
- package/src/input/model-picker.ts +18 -18
- package/src/input/onboarding/onboarding-feature-units.ts +9 -13
- package/src/input/onboarding/onboarding-provider-key-fields.ts +3 -3
- package/src/input/onboarding/onboarding-runtime-status.ts +3 -3
- package/src/input/onboarding/onboarding-wizard-apply.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-cloudflare-step.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-constants.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +4 -4
- package/src/input/onboarding/onboarding-wizard-network-adopt.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-steps.ts +2 -2
- package/src/input/panel-integration-actions.ts +3 -3
- package/src/input/panel-mouse-geometry.ts +1 -1
- package/src/input/panel-paste-flood-guard.ts +9 -9
- package/src/input/payments-config.ts +15 -15
- package/src/input/profile-picker-modal.ts +1 -1
- package/src/input/provider-key-intake.ts +9 -9
- package/src/input/relay-settings-descriptions.ts +3 -3
- package/src/input/sandbox-exec-config.ts +9 -9
- package/src/input/search.ts +18 -18
- package/src/input/selection-modal-queue.ts +10 -10
- package/src/input/selection-modal.ts +2 -2
- package/src/input/session-picker-modal.ts +7 -7
- package/src/input/settings-modal-activation.ts +1 -1
- package/src/input/settings-modal-adjustment.ts +2 -2
- package/src/input/settings-modal-commit.ts +6 -6
- package/src/input/settings-modal-connections.ts +2 -2
- package/src/input/settings-modal-data.ts +29 -29
- package/src/input/settings-modal-mutations.ts +7 -7
- package/src/input/settings-modal-reset.ts +3 -3
- package/src/input/settings-modal-search.ts +6 -6
- package/src/input/settings-modal-secrets.ts +3 -3
- package/src/input/settings-modal-types.ts +16 -16
- package/src/input/settings-modal.ts +4 -4
- package/src/input/voice-local-settings.ts +3 -3
- package/src/input/worktree-setup-config.ts +8 -8
- package/src/main.ts +15 -15
- package/src/panels/agent-inspector-shared.ts +5 -5
- package/src/panels/base-panel.ts +3 -3
- package/src/panels/builtin/agent.ts +3 -3
- package/src/panels/builtin/development.ts +4 -4
- package/src/panels/builtin/knowledge.ts +1 -1
- package/src/panels/builtin/operations.ts +12 -12
- package/src/panels/builtin/session.ts +8 -8
- package/src/panels/builtin/shared.ts +6 -6
- package/src/panels/builtin-modals.ts +8 -8
- package/src/panels/confirm-state.ts +5 -5
- package/src/panels/cost-tracker-panel.ts +22 -22
- package/src/panels/diff-panel.ts +20 -20
- package/src/panels/diff-review-model.ts +5 -5
- package/src/panels/diff-review-panel.ts +5 -5
- package/src/panels/eval-registry.ts +2 -2
- package/src/panels/expandable-list-panel.ts +5 -5
- package/src/panels/fleet-acts.ts +20 -20
- package/src/panels/fleet-deep-link.ts +5 -5
- package/src/panels/fleet-gateway.ts +12 -12
- package/src/panels/fleet-observed-render.ts +11 -11
- package/src/panels/fleet-panel-format.ts +14 -14
- package/src/panels/fleet-panel-worktree-detail.ts +8 -8
- package/src/panels/fleet-panel.ts +34 -34
- package/src/panels/fleet-read-model.ts +49 -49
- package/src/panels/fleet-spawn.ts +15 -15
- package/src/panels/fleet-steer.ts +7 -7
- package/src/panels/fleet-stop.ts +5 -5
- package/src/panels/fleet-tabs.ts +14 -14
- package/src/panels/fleet-transcript.ts +26 -26
- package/src/panels/git-panel.ts +8 -8
- package/src/panels/hosted-session-feed.ts +13 -13
- package/src/panels/hosted-session-panel.ts +7 -7
- package/src/panels/index.ts +1 -1
- package/src/panels/local-auth-panel.ts +15 -15
- package/src/panels/memory-consolidation-gateway.ts +8 -8
- package/src/panels/modals/devices-modal.ts +8 -8
- package/src/panels/modals/hooks-modal.ts +1 -1
- package/src/panels/modals/keybindings-modal.ts +5 -5
- package/src/panels/modals/knowledge-modal.ts +2 -2
- package/src/panels/modals/local-auth-modal.ts +4 -4
- package/src/panels/modals/marketplace-modal.ts +3 -3
- package/src/panels/modals/memory-modal.ts +19 -19
- package/src/panels/modals/modal-surface-helpers.ts +1 -1
- package/src/panels/modals/modal-theme.ts +3 -3
- package/src/panels/modals/pairing-modal.ts +19 -19
- package/src/panels/modals/planning-modal.ts +4 -4
- package/src/panels/modals/plugins-modal.ts +1 -1
- package/src/panels/modals/policy-modal.ts +4 -4
- package/src/panels/modals/provider-health-modal.ts +1 -1
- package/src/panels/modals/remote-modal.ts +1 -1
- package/src/panels/modals/sandbox-modal.ts +2 -2
- package/src/panels/modals/security-modal.ts +4 -4
- package/src/panels/modals/services-modal.ts +1 -1
- package/src/panels/modals/work-plan-modal.ts +4 -4
- package/src/panels/notifications-feed.ts +6 -6
- package/src/panels/notifications-panel.ts +6 -6
- package/src/panels/panel-confirm-overlay.ts +4 -4
- package/src/panels/panel-manager.ts +13 -13
- package/src/panels/plugins-panel.ts +6 -6
- package/src/panels/polish-core.ts +2 -2
- package/src/panels/polish-tables.ts +2 -2
- package/src/panels/polish.ts +1 -1
- package/src/panels/project-planning-answer-actions.ts +3 -3
- package/src/panels/scrollable-list-panel.ts +15 -15
- package/src/panels/search-focus.ts +1 -1
- package/src/panels/session-maintenance.ts +1 -1
- package/src/panels/skills-panel.ts +3 -3
- package/src/panels/token-budget-panel.ts +11 -11
- package/src/panels/types.ts +14 -14
- package/src/panels/workstream-graph-render.ts +5 -5
- package/src/panels/wrfc-panel-format.ts +1 -1
- package/src/permissions/broker-approval-card.ts +13 -13
- package/src/permissions/hunk-selection.ts +13 -13
- package/src/permissions/prompt.ts +22 -22
- package/src/permissions/sandbox-exec-gate.ts +5 -5
- package/src/providers/provider-classification.ts +1 -1
- package/src/providers/reasoning-effort-surface.ts +12 -12
- package/src/renderer/ansi-sanitize.ts +5 -6
- package/src/renderer/autocomplete-overlay.ts +5 -5
- package/src/renderer/block-actions-overlay.ts +1 -1
- package/src/renderer/bookmark-modal.ts +1 -1
- package/src/renderer/code-block.ts +2 -2
- package/src/renderer/compaction-history-modal.ts +4 -4
- package/src/renderer/compaction-preview.ts +5 -5
- package/src/renderer/compaction-quality.ts +5 -5
- package/src/renderer/composer-fragments.ts +6 -6
- package/src/renderer/compositor.ts +9 -9
- package/src/renderer/config-modal.ts +3 -3
- package/src/renderer/context-inspector.ts +1 -1
- package/src/renderer/context-status-hint.ts +10 -10
- package/src/renderer/conversation-layout.ts +2 -2
- package/src/renderer/conversation-overlays.ts +2 -2
- package/src/renderer/conversation-surface.ts +6 -6
- package/src/renderer/diff.ts +4 -4
- package/src/renderer/fleet-tab-strip.ts +2 -2
- package/src/renderer/footer-tips.ts +4 -4
- package/src/renderer/fullscreen-primitives.ts +1 -1
- package/src/renderer/git-status.ts +5 -5
- package/src/renderer/header-line.ts +5 -5
- package/src/renderer/help-overlay.ts +5 -5
- package/src/renderer/hint-grammar.ts +2 -2
- package/src/renderer/layout.ts +1 -1
- package/src/renderer/markdown-inline.ts +3 -3
- package/src/renderer/markdown-table.ts +7 -7
- package/src/renderer/modal-factory.ts +3 -3
- package/src/renderer/model-picker-overlay.ts +2 -2
- package/src/renderer/model-workspace.ts +7 -7
- package/src/renderer/onboarding/onboarding-wizard.ts +1 -1
- package/src/renderer/overlay-box.ts +1 -1
- package/src/renderer/panel-composite.ts +5 -5
- package/src/renderer/panel-workspace-bar.ts +1 -1
- package/src/renderer/process-indicator.ts +8 -8
- package/src/renderer/profile-picker-modal.ts +3 -3
- package/src/renderer/prompt-content-width.ts +1 -1
- package/src/renderer/search-overlay.ts +3 -3
- package/src/renderer/selection-modal-overlay.ts +6 -6
- package/src/renderer/semantic-diff.ts +6 -7
- package/src/renderer/session-picker-modal.ts +24 -24
- package/src/renderer/settings-modal-connections.ts +3 -3
- package/src/renderer/settings-modal-helpers.ts +16 -16
- package/src/renderer/settings-modal.ts +10 -10
- package/src/renderer/shell-surface.ts +8 -8
- package/src/renderer/status-glyphs.ts +6 -6
- package/src/renderer/syntax-highlighter.ts +2 -3
- package/src/renderer/system-message.ts +3 -3
- package/src/renderer/tab-strip.ts +2 -2
- package/src/renderer/term-caps.ts +12 -12
- package/src/renderer/terminal-bg-probe.ts +10 -10
- package/src/renderer/terminal-escapes.ts +1 -1
- package/src/renderer/theme-mode-config.ts +3 -3
- package/src/renderer/theme.ts +34 -34
- package/src/renderer/thinking.ts +1 -1
- package/src/renderer/tool-call.ts +5 -5
- package/src/renderer/tool-result-expanded-lines.ts +3 -3
- package/src/renderer/tool-result-summary.ts +6 -6
- package/src/renderer/turn-injection.ts +9 -9
- package/src/renderer/ui-factory.ts +33 -33
- package/src/renderer/ui-primitives.ts +4 -4
- package/src/runtime/bootstrap-command-parts.ts +3 -3
- package/src/runtime/bootstrap-core.ts +21 -21
- package/src/runtime/bootstrap-hook-bridge.ts +8 -8
- package/src/runtime/bootstrap-shell.ts +9 -9
- package/src/runtime/bootstrap.ts +16 -16
- package/src/runtime/client/approval-updates.ts +3 -3
- package/src/runtime/client/build-floors.ts +7 -7
- package/src/runtime/client/daemon-attach-handshake.ts +5 -5
- package/src/runtime/client/fleet-union.ts +7 -7
- package/src/runtime/client/host-service-status.ts +2 -2
- package/src/runtime/client/hosted-exit.ts +4 -4
- package/src/runtime/client/hosted-roster.ts +4 -4
- package/src/runtime/client/hosted-session-stream.ts +5 -5
- package/src/runtime/client/hosted-sessions.ts +8 -8
- package/src/runtime/client/operator-endpoint.ts +14 -14
- package/src/runtime/client/spine-adoption.ts +8 -8
- package/src/runtime/context-accounting-source.ts +4 -4
- package/src/runtime/context.ts +2 -2
- package/src/runtime/conversation-rewind-port.ts +6 -6
- package/src/runtime/credential-composition.ts +2 -2
- package/src/runtime/daemon-attach-notices.ts +6 -6
- package/src/runtime/diagnostics/panels/index.ts +1 -1
- package/src/runtime/diagnostics/panels/ops.ts +2 -2
- package/src/runtime/disposal-wiring.ts +6 -6
- package/src/runtime/index.ts +11 -11
- package/src/runtime/install-self-check-startup.ts +4 -4
- package/src/runtime/install-self-check.ts +6 -6
- package/src/runtime/interaction-seams.ts +4 -4
- package/src/runtime/knowledge-services.ts +2 -2
- package/src/runtime/legacy-daemon-migration.ts +37 -37
- package/src/runtime/legacy-daemon-reconcile.ts +30 -30
- package/src/runtime/memory-governance-services.ts +3 -3
- package/src/runtime/memory-spine-transport.ts +3 -3
- package/src/runtime/notification-dispatch.ts +4 -4
- package/src/runtime/onboarding/apply.ts +1 -1
- package/src/runtime/onboarding/derivation.ts +1 -1
- package/src/runtime/onboarding/fast-path.ts +7 -7
- package/src/runtime/onboarding/progress.ts +2 -2
- package/src/runtime/onboarding/provider-key-capture.ts +4 -4
- package/src/runtime/onboarding/snapshot.ts +2 -2
- package/src/runtime/onboarding/state.ts +4 -4
- package/src/runtime/onboarding/types.ts +4 -4
- package/src/runtime/orchestrator-core-services.ts +5 -5
- package/src/runtime/path-shadow-startup.ts +3 -3
- package/src/runtime/perf/panel-contracts.ts +1 -1
- package/src/runtime/power-keepawake-remote.ts +6 -6
- package/src/runtime/process-lifecycle.ts +14 -14
- package/src/runtime/provider-fallback.ts +3 -3
- package/src/runtime/recovery-autosave.ts +3 -3
- package/src/runtime/recovery-decisions.ts +19 -19
- package/src/runtime/recovery-offer-wiring.ts +4 -4
- package/src/runtime/recovery-prompt.ts +20 -20
- package/src/runtime/relay-reachability-bridge.ts +3 -3
- package/src/runtime/release-artifacts.ts +1 -1
- package/src/runtime/resume-notice.ts +20 -20
- package/src/runtime/runtime-services-types.ts +20 -20
- package/src/runtime/services.ts +20 -20
- package/src/runtime/session-continuity-hints.ts +1 -1
- package/src/runtime/session-inbound-inputs.ts +12 -12
- package/src/runtime/session-resume-liveness-confirm.ts +4 -4
- package/src/runtime/session-spine-transport.ts +3 -3
- package/src/runtime/store/domains/panels.ts +2 -2
- package/src/runtime/store/domains/ui-perf.ts +2 -2
- package/src/runtime/store/index.ts +1 -1
- package/src/runtime/store/selectors/index.ts +1 -1
- package/src/runtime/store/state.ts +2 -2
- package/src/runtime/ui-services.ts +3 -3
- package/src/runtime/workspace-checkpointing.ts +3 -3
- package/src/runtime/wrfc-persistence.ts +15 -15
- package/src/scripts/process-messages.ts +1 -1
- package/src/shell/blocking-input.ts +9 -9
- package/src/shell/recovery-input-helpers.ts +2 -2
- package/src/shell/retry-affordance.ts +9 -9
- package/src/shell/ui-openers.ts +14 -14
- package/src/shell/voice-capture-shell.ts +3 -3
- package/src/tools/wrfc-agent-guard.ts +4 -4
- package/src/utils/browser.ts +2 -2
- package/src/utils/format-duration.ts +3 -3
- package/src/utils/format-number.ts +2 -2
- package/src/utils/splash-lines.ts +4 -4
- package/src/utils/terminal-width.ts +6 -6
- package/src/verification/verification-ledger.ts +25 -25
- package/src/version.ts +3 -3
package/src/input/search.ts
CHANGED
|
@@ -6,7 +6,7 @@ export interface SearchMatch {
|
|
|
6
6
|
col: number;
|
|
7
7
|
length: number;
|
|
8
8
|
/**
|
|
9
|
-
* Present when this match lives inside content that is still collapsed
|
|
9
|
+
* Present when this match lives inside content that is still collapsed,
|
|
10
10
|
* `line`/`col` are placeholders (the containing block's own header line,
|
|
11
11
|
* col 0) rather than a real navigable position. `collapseKeys` names every
|
|
12
12
|
* collapse key that must be expanded to make the hit a real rendered
|
|
@@ -18,7 +18,7 @@ export interface SearchMatch {
|
|
|
18
18
|
primaryKey?: string;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
/** Count non-overlapping occurrences of `needle` in `haystack
|
|
21
|
+
/** Count non-overlapping occurrences of `needle` in `haystack`, used for
|
|
22
22
|
* the collapsed-content scan below, mirroring the per-line indexOf loop
|
|
23
23
|
* search() already runs over the rendered buffer, so a hidden hit counts
|
|
24
24
|
* the same way a visible one would once revealed. */
|
|
@@ -63,19 +63,19 @@ export class SearchManager {
|
|
|
63
63
|
this.wrapAround = false;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
/** Lock the query
|
|
66
|
+
/** Lock the query, switches from typing mode to navigation mode. */
|
|
67
67
|
lock(): void {
|
|
68
68
|
this.locked = true;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
/** Unlock
|
|
71
|
+
/** Unlock, return to typing mode. */
|
|
72
72
|
unlock(): void {
|
|
73
73
|
this.locked = false;
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
/**
|
|
77
77
|
* Close search mode. Re-collapses every block/group search auto-expanded
|
|
78
|
-
* while it was open
|
|
78
|
+
* while it was open, except ones the user explicitly acted on (toggled,
|
|
79
79
|
* copied, bookmarked, saved) while they were expanded, which stay exactly
|
|
80
80
|
* as the user left them (see SearchExpansionTracker.restoreOnto).
|
|
81
81
|
* `conversationManager` is optional so existing call sites that never had
|
|
@@ -88,19 +88,19 @@ export class SearchManager {
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
/**
|
|
91
|
-
* Update query and find matches
|
|
91
|
+
* Update query and find matches, honestly counting hits inside collapsed
|
|
92
92
|
* blocks and folded tool-result groups WITHOUT expanding them. Expansion
|
|
93
93
|
* only happens on navigation (see revealCurrentMatch): typing a query must
|
|
94
94
|
* never collapse-destroy the transcript the user folded on purpose, but a
|
|
95
95
|
* "no matches" while text the user watched stream by sits collapsed
|
|
96
|
-
* somewhere would be a lie too
|
|
96
|
+
* somewhere would be a lie too, so the count includes it, tagged as
|
|
97
97
|
* hidden until the user actually navigates there.
|
|
98
98
|
*
|
|
99
|
-
* That collapsed corpus is the block's own RAW content, plus
|
|
100
|
-
* folded tool-result group
|
|
99
|
+
* That collapsed corpus is the block's own RAW content, plus, for a
|
|
100
|
+
* folded tool-result group, the raw content of every one of its member
|
|
101
101
|
* messages (a group's own rawContent is only its summary header line, and
|
|
102
|
-
* its members push no BlockMeta of their own while folded
|
|
103
|
-
* conversation-tool-groups.ts
|
|
102
|
+
* its members push no BlockMeta of their own while folded, see
|
|
103
|
+
* conversation-tool-groups.ts, so without the member corpus a needle
|
|
104
104
|
* living inside a member would count as zero hits for text the user
|
|
105
105
|
* watched stream by).
|
|
106
106
|
*
|
|
@@ -124,7 +124,7 @@ export class SearchManager {
|
|
|
124
124
|
}
|
|
125
125
|
|
|
126
126
|
/**
|
|
127
|
-
* Shared match builder for search() and revealCurrentMatch()
|
|
127
|
+
* Shared match builder for search() and revealCurrentMatch(), scans the
|
|
128
128
|
* currently-rendered buffer for visible matches and every collapsed
|
|
129
129
|
* block/folded group for hidden ones, without mutating any collapse
|
|
130
130
|
* state. Kept separate from search() so revealCurrentMatch can rebuild the
|
|
@@ -142,7 +142,7 @@ export class SearchManager {
|
|
|
142
142
|
|
|
143
143
|
if (block.type === 'assistant_turn' && block.groupMemberIndexes) {
|
|
144
144
|
// The header's own synthetic summary rarely matches, but count it
|
|
145
|
-
// honestly too
|
|
145
|
+
// honestly too, expanding the whole group is the only way to even
|
|
146
146
|
// attempt to reveal a header-corpus hit, since there is no single
|
|
147
147
|
// member to isolate it to.
|
|
148
148
|
const headerHits = countOccurrences(block.rawContent.toLowerCase(), lowerQuery);
|
|
@@ -169,7 +169,7 @@ export class SearchManager {
|
|
|
169
169
|
line: block.startLine, col: 0, length: query.length,
|
|
170
170
|
// Revealing a member-specific hit only needs the group
|
|
171
171
|
// header (to unfold the group at all) and that member's own
|
|
172
|
-
// key
|
|
172
|
+
// key, not its siblings, which stay exactly as they were.
|
|
173
173
|
collapseKeys: [block.collapseKey, memberKey], primaryKey: memberKey,
|
|
174
174
|
});
|
|
175
175
|
}
|
|
@@ -203,7 +203,7 @@ export class SearchManager {
|
|
|
203
203
|
|
|
204
204
|
// Stable sort (V8/JSC have guaranteed stable Array#sort) puts each
|
|
205
205
|
// block's hidden hits in the same relative order they were generated
|
|
206
|
-
// in
|
|
206
|
+
// in, self-corpus first, then members in order, right where that
|
|
207
207
|
// block's header line falls among the visible matches.
|
|
208
208
|
return [...visibleMatches, ...hiddenMatches].sort((a, b) => a.line - b.line || a.col - b.col);
|
|
209
209
|
}
|
|
@@ -216,7 +216,7 @@ export class SearchManager {
|
|
|
216
216
|
* the match list against the now-expanded buffer.
|
|
217
217
|
*
|
|
218
218
|
* `currentMatch` is repointed at the first now-visible match inside the
|
|
219
|
-
* revealed block's new line range, rather than reset to 0
|
|
219
|
+
* revealed block's new line range, rather than reset to 0, expansion
|
|
220
220
|
* only changes how many lines that ONE block renders as, so every match
|
|
221
221
|
* belonging to earlier blocks keeps its relative position.
|
|
222
222
|
*
|
|
@@ -273,7 +273,7 @@ export class SearchManager {
|
|
|
273
273
|
}
|
|
274
274
|
|
|
275
275
|
/** Get the line number of the current match (for scroll). Returns -1 for a
|
|
276
|
-
* match that's still hidden inside collapsed content
|
|
276
|
+
* match that's still hidden inside collapsed content, revealCurrentMatch
|
|
277
277
|
* must run first to give it a real line. */
|
|
278
278
|
getCurrentMatchLine(): number {
|
|
279
279
|
if (this.matches.length === 0) return -1;
|
|
@@ -284,7 +284,7 @@ export class SearchManager {
|
|
|
284
284
|
}
|
|
285
285
|
|
|
286
286
|
/** Get matches on a given line. Hidden (still-collapsed) matches are
|
|
287
|
-
* excluded
|
|
287
|
+
* excluded, they have no real line to render a highlight on yet. */
|
|
288
288
|
getMatchesOnLine(lineIdx: number): SearchMatch[] {
|
|
289
289
|
return this.matches.filter(m => m.line === lineIdx && !m.collapseKeys);
|
|
290
290
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* selection-modal-queue.ts
|
|
2
|
+
* selection-modal-queue.ts, Serializes overlapping InputHandler.openSelection() calls.
|
|
3
3
|
*
|
|
4
4
|
* openSelection (handler.ts) writes into a singleton SelectionModal plus a
|
|
5
5
|
* single callback slot. A second openSelection call while one is already
|
|
6
|
-
* showing used to silently overwrite both
|
|
6
|
+
* showing used to silently overwrite both, the pre-empted caller's callback
|
|
7
7
|
* was never invoked, not even with null, so any caller that awaits it (see
|
|
8
8
|
* the `ask()` helper in runtime/recovery-prompt.ts, which wraps the callback
|
|
9
9
|
* in a Promise) hung forever. This is reachable in production: the
|
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
*
|
|
14
14
|
* Fix: queue overlapping requests FIFO and open each automatically once the
|
|
15
15
|
* previous one resolves, through the SAME callback the caller already
|
|
16
|
-
* supplied
|
|
16
|
+
* supplied, openSelection's public signature never changes.
|
|
17
17
|
*
|
|
18
18
|
* Why the drain is deferred to a microtask instead of running inline inside
|
|
19
|
-
* the resolving callback: both resolution paths
|
|
19
|
+
* the resolving callback: both resolution paths, the select/enter path in
|
|
20
20
|
* handler-modal-routes.ts's dispatchSelectionAction, and the Escape path in
|
|
21
|
-
* handler-modal-stack.ts's handleEscape/closeSelection
|
|
21
|
+
* handler-modal-stack.ts's handleEscape/closeSelection, take a snapshot of
|
|
22
22
|
* the current selectionCallback before dispatch and write some form of that
|
|
23
23
|
* snapshot back into handler/context state AFTER invoking the callback (the
|
|
24
24
|
* select path re-reads via getSelectionCallback; the Escape path threads a
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
* write-backs would immediately clobber the freshly-set callback for the
|
|
29
29
|
* newly-opened modal. Deferring past the end of the synchronous resolution
|
|
30
30
|
* (queueMicrotask) lets all of that settle first, then opens the next
|
|
31
|
-
* request cleanly
|
|
31
|
+
* request cleanly, the same shape as the production race this fixes, which
|
|
32
32
|
* itself resolves via a deferred (macrotask) call.
|
|
33
33
|
*/
|
|
34
34
|
import type { SelectionItem, SelectionAction, SelectionResult, SelectionModal } from './selection-modal.ts';
|
|
@@ -55,7 +55,7 @@ export interface PendingSelectionRequest {
|
|
|
55
55
|
* modal vs. the recovery offer's 0ms macrotask), so 8 is generous headroom
|
|
56
56
|
* for any future chained-picker sequence without letting a misbehaving
|
|
57
57
|
* caller queue without bound. Once full, the overflowing call is resolved
|
|
58
|
-
* with `null` immediately
|
|
58
|
+
* with `null` immediately, a bounded queue must still give every caller a
|
|
59
59
|
* definite answer, never silently drop one.
|
|
60
60
|
*/
|
|
61
61
|
export const MAX_QUEUED_SELECTIONS = 8;
|
|
@@ -115,7 +115,7 @@ export class SelectionModalQueue {
|
|
|
115
115
|
const wrapped: SelectionModalCallback = (result) => {
|
|
116
116
|
request.callback(result);
|
|
117
117
|
// Only a terminal resolution (select/cancel/escape) actually closes
|
|
118
|
-
// the modal
|
|
118
|
+
// the modal, dispatchSelectionAction's toggle/increment/decrement
|
|
119
119
|
// branch invokes the callback but leaves the modal open for further
|
|
120
120
|
// interaction, so only drain the queue once the modal has gone
|
|
121
121
|
// inactive, never on every callback invocation.
|
|
@@ -133,7 +133,7 @@ export class SelectionModalQueue {
|
|
|
133
133
|
private drain(): void {
|
|
134
134
|
// Something else already opened a modal in the meantime (e.g. a
|
|
135
135
|
// synchronously chained openSelection call from inside the resolving
|
|
136
|
-
// callback)
|
|
136
|
+
// callback), leave the queue alone; that modal's own resolution will
|
|
137
137
|
// drain it in turn.
|
|
138
138
|
if (this.host.selectionModal.active) return;
|
|
139
139
|
const next = this.pending.shift();
|
|
@@ -142,7 +142,7 @@ export class SelectionModalQueue {
|
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
-
/** InputHandler's actual field/method shape
|
|
145
|
+
/** InputHandler's actual field/method shape, satisfies this structurally, no import needed. */
|
|
146
146
|
export interface SelectionQueueOwner {
|
|
147
147
|
readonly selectionModal: Pick<SelectionModal, 'active' | 'open'>;
|
|
148
148
|
selectionCallback: SelectionModalCallback | null;
|
|
@@ -88,7 +88,7 @@ export class SelectionModal {
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
moveUp(): void {
|
|
91
|
-
// Skip category headers (items with no id-based content
|
|
91
|
+
// Skip category headers (items with no id-based content, filtered items include only selectable ones)
|
|
92
92
|
if (this.filteredItems.length === 0) return;
|
|
93
93
|
this.selectedIndex = this.selectedIndex > 0
|
|
94
94
|
? this.selectedIndex - 1
|
|
@@ -127,7 +127,7 @@ export class SelectionModal {
|
|
|
127
127
|
return this.filteredItems[this.selectedIndex] ?? null;
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
/** Fuzzy match items against query
|
|
130
|
+
/** Fuzzy match items against query, resets filteredItems */
|
|
131
131
|
private filterItems(): void {
|
|
132
132
|
if (this.query.length === 0) {
|
|
133
133
|
this.filteredItems = this.items.slice();
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SessionPickerModal
|
|
2
|
+
* SessionPickerModal, state management for the /sessions picker modal.
|
|
3
3
|
*
|
|
4
4
|
* Lists LOCAL saved transcript files from SessionManager.list() (load/delete
|
|
5
|
-
* operate on these
|
|
5
|
+
* operate on these, a saved JSONL session is a different thing from a live
|
|
6
6
|
* control-plane session, see below), tracks selected index, and handles
|
|
7
7
|
* load/delete actions.
|
|
8
8
|
*
|
|
9
9
|
* Union-sessions surface: additionally surfaces the cross-surface
|
|
10
|
-
* session union from `sessionBroker` (a SessionReadFacade
|
|
10
|
+
* session union from `sessionBroker` (a SessionReadFacade, normally
|
|
11
11
|
* `uiServices.sessions.sessionBroker`, the SessionUnionCache) so a user can
|
|
12
12
|
* SEE what sessions are live/closed across every surface sharing this
|
|
13
13
|
* daemon (TUI, webui, companion, automation), not just this process's own
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* Hosted sessions: a third, also read-only section lists the conversations
|
|
22
22
|
* running INSIDE the daemon (`sessions.hosted.list`, held by the shared roster
|
|
23
23
|
* in runtime/client/hosted-roster.ts). They belong in the place a person
|
|
24
|
-
* already goes to ask "what sessions are there"
|
|
24
|
+
* already goes to ask "what sessions are there", a hosted session is exactly
|
|
25
25
|
* that, one whose loop happens to live elsewhere. Joining one is `/hosted
|
|
26
26
|
* attach <id>` rather than an Enter here, for the same reason cross-surface
|
|
27
27
|
* rows are not loadable: there is no on-disk transcript this process can
|
|
@@ -38,7 +38,7 @@ import type { ConversationManager } from '../core/conversation';
|
|
|
38
38
|
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
|
|
39
39
|
import type { HostedRosterSnapshot } from '../runtime/client/hosted-roster.ts';
|
|
40
40
|
// Re-exported so the composition site (input/handler.ts) reaches the picker and
|
|
41
|
-
// its hosted roster through ONE import
|
|
41
|
+
// its hosted roster through ONE import, that file sits on this repo's 800-line
|
|
42
42
|
// per-file gate and a second import line there is a real cost.
|
|
43
43
|
export { getSharedHostedSessionRoster } from '../runtime/client/hosted-roster.ts';
|
|
44
44
|
|
|
@@ -67,7 +67,7 @@ const DORMANT_CROSS_SURFACE_VIEW: CrossSurfaceView = {
|
|
|
67
67
|
export class SessionPickerModal {
|
|
68
68
|
public active = false;
|
|
69
69
|
public sessions: SessionInfo[] = [];
|
|
70
|
-
/** Cross-surface session union (view-only)
|
|
70
|
+
/** Cross-surface session union (view-only), see class doc. Empty until open(). */
|
|
71
71
|
public crossSurfaceSessions: readonly SharedSessionRecord[] = [];
|
|
72
72
|
/** Honest posture for crossSurfaceSessions: mode/online/stale/offlineNote. */
|
|
73
73
|
public crossSurfaceView: CrossSurfaceView = DORMANT_CROSS_SURFACE_VIEW;
|
|
@@ -76,7 +76,7 @@ export class SessionPickerModal {
|
|
|
76
76
|
public visibleRows = 8;
|
|
77
77
|
public deleteConfirmationTarget: string | null = null;
|
|
78
78
|
|
|
79
|
-
/** Daemon-hosted sessions (view-only)
|
|
79
|
+
/** Daemon-hosted sessions (view-only), see class doc. Never a fabricated empty list. */
|
|
80
80
|
public hostedRoster: HostedRosterSnapshot = UNREAD_HOSTED_ROSTER;
|
|
81
81
|
|
|
82
82
|
/** Last status message to show in the modal (e.g. error or success). */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* settings-modal-activation
|
|
2
|
+
* settings-modal-activation, pure action helpers for SettingsModal.
|
|
3
3
|
*
|
|
4
4
|
* These functions encapsulate the two activation/interaction operations:
|
|
5
5
|
* - activateSelected: toggle boolean, cycle enum, enter edit mode, launch pickers
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* settings-modal-adjustment
|
|
2
|
+
* settings-modal-adjustment, pure adjustment helpers for SettingsModal.
|
|
3
3
|
*
|
|
4
4
|
* These functions encapsulate the directional-adjustment operation:
|
|
5
5
|
* - adjustSelected: cycle enum/boolean/number values via left/right arrow keys
|
|
@@ -43,7 +43,7 @@ export function adjustSelected(
|
|
|
43
43
|
if (ctx.editingMode) return;
|
|
44
44
|
|
|
45
45
|
// Feature-unit headers are the real config rows for their enablement keys
|
|
46
|
-
// (boolean or enum), so they fall through to the ordinary branches below
|
|
46
|
+
// (boolean or enum), so they fall through to the ordinary branches below,
|
|
47
47
|
// a plain config write the settings bridge forwards to the gate manager.
|
|
48
48
|
|
|
49
49
|
if (ctx.currentCategory === 'mcp') {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* settings-modal-commit.ts
|
|
2
|
+
* settings-modal-commit.ts, commitEdit(), extracted out of the SettingsModal
|
|
3
3
|
* class body so the class file can stay under the repo's architecture
|
|
4
4
|
* line-count gate without trimming arbitrary lines to clear the number.
|
|
5
5
|
*
|
|
@@ -31,7 +31,7 @@ export interface CommitEditContext {
|
|
|
31
31
|
/**
|
|
32
32
|
* The daemon's credential write, when a daemon is adopted. A daemon-scoped
|
|
33
33
|
* credential must land where the daemon reads it, not in this surface's own
|
|
34
|
-
* tree
|
|
34
|
+
* tree, see settings-modal-secrets.ts.
|
|
35
35
|
*/
|
|
36
36
|
readonly daemonCredentials?: SettingsDaemonCredentialWriter | null;
|
|
37
37
|
/** Renders a refused credential write; without it a failure would be silent. */
|
|
@@ -50,7 +50,7 @@ export interface CommitEditContext {
|
|
|
50
50
|
/**
|
|
51
51
|
* Commit the current editBuffer to the config. Returns true on success,
|
|
52
52
|
* false if validation failed (the caller always clears editingMode/editBuffer
|
|
53
|
-
* regardless
|
|
53
|
+
* regardless, a failed commit never leaves stale edit state behind).
|
|
54
54
|
*/
|
|
55
55
|
export function commitEditValue(ctx: CommitEditContext): boolean {
|
|
56
56
|
if (!ctx.editingMode) return false;
|
|
@@ -127,16 +127,16 @@ export function commitEditValue(ctx: CommitEditContext): boolean {
|
|
|
127
127
|
|
|
128
128
|
if (isWorktreeSetupListConfigKey(setting.key)) {
|
|
129
129
|
// Comma-separated display/edit convention for the array-backed
|
|
130
|
-
// worktree.setup.* keys
|
|
130
|
+
// worktree.setup.* keys, see worktree-setup-config.ts.
|
|
131
131
|
ctx.setValue(setting.key, parseWorktreeSetupListInput(ctx.editBuffer));
|
|
132
132
|
} else if (isSandboxExecListConfigKey(setting.key)) {
|
|
133
133
|
// Same comma-separated convention for the array-backed
|
|
134
|
-
// sandbox.egressAllowlist / sandbox.workspaceWritable keys
|
|
134
|
+
// sandbox.egressAllowlist / sandbox.workspaceWritable keys, see
|
|
135
135
|
// sandbox-exec-config.ts.
|
|
136
136
|
ctx.setValue(setting.key, parseSandboxExecListInput(ctx.editBuffer));
|
|
137
137
|
} else if (isExecEnvScrubAllowlistConfigKey(setting.key)) {
|
|
138
138
|
// Same comma-separated convention for permissions.execEnvScrubAllowlist
|
|
139
|
-
|
|
139
|
+
//, see exec-env-scrub-config.ts.
|
|
140
140
|
ctx.setValue(setting.key, parseExecEnvScrubAllowlistInput(ctx.editBuffer));
|
|
141
141
|
} else if (setting.type === 'string' && isSecretConfigKey(setting.key)) {
|
|
142
142
|
setSecretBackedSettingValue({
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* settings-modal-connections.ts
|
|
2
|
+
* settings-modal-connections.ts, the Connections category of the settings
|
|
3
3
|
* workspace: whether mail and calendar are actually usable, and if not, the
|
|
4
4
|
* exact next step.
|
|
5
5
|
*
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* Every other settings category reads a value out of config and renders it.
|
|
15
15
|
* This one cannot: "is mail connected?" is only answerable by asking the
|
|
16
16
|
* daemon's handler, which is real I/O. The workspace renders synchronously, so
|
|
17
|
-
* the rows start in `checking
|
|
17
|
+
* the rows start in `checking`, which is true, and the refresh replaces them
|
|
18
18
|
* and asks for a re-render, the same contract the Services surface uses for its
|
|
19
19
|
* inspections. Nothing is ever shown as "not configured" merely because an
|
|
20
20
|
* answer has not arrived yet; that would be a guess rendered as a fact.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* settings-modal-data
|
|
2
|
+
* settings-modal-data, pure data-assembly helpers for SettingsModal.
|
|
3
3
|
*
|
|
4
4
|
* All functions are stateless: they take dependencies as arguments and return
|
|
5
5
|
* derived data without mutating state. The class in settings-modal.ts delegates
|
|
@@ -55,7 +55,7 @@ import {
|
|
|
55
55
|
} from './payments-config.ts';
|
|
56
56
|
|
|
57
57
|
// ---------------------------------------------------------------------------
|
|
58
|
-
// deepEqual
|
|
58
|
+
// deepEqual, structural equality for isDefault comparisons
|
|
59
59
|
// ---------------------------------------------------------------------------
|
|
60
60
|
|
|
61
61
|
/**
|
|
@@ -89,7 +89,7 @@ export function deepEqual(a: unknown, b: unknown): boolean {
|
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
// ---------------------------------------------------------------------------
|
|
92
|
-
// buildSettingGroups
|
|
92
|
+
// buildSettingGroups, loads CONFIG_SCHEMA into per-category SettingEntry maps
|
|
93
93
|
// ---------------------------------------------------------------------------
|
|
94
94
|
|
|
95
95
|
export function buildSettingGroups(
|
|
@@ -127,13 +127,13 @@ export function buildSettingGroups(
|
|
|
127
127
|
// pushCompletion), so the contact address and the subscription
|
|
128
128
|
// housekeeping bounds belong in that same category rather than in one of
|
|
129
129
|
// their own. Without this they match no category at all and would be
|
|
130
|
-
// dropped from the workspace entirely
|
|
130
|
+
// dropped from the workspace entirely, reachable only by editing the
|
|
131
131
|
// config file by hand.
|
|
132
132
|
if (rawCat === 'push' && groups.has('notifications')) groups.get('notifications')!.push(entry);
|
|
133
133
|
// cluster.* decides which node on this network reads the inbox, and it is
|
|
134
134
|
// configured in the same terms the network category already speaks: a
|
|
135
135
|
// group address, a port, a shared phrase, a peer list. Given no category of
|
|
136
|
-
// its own it would match nothing and drop out of the workspace entirely
|
|
136
|
+
// its own it would match nothing and drop out of the workspace entirely,
|
|
137
137
|
// reachable only by hand-editing a settings file.
|
|
138
138
|
if (rawCat === 'cluster' && groups.has('network')) groups.get('network')!.push(entry);
|
|
139
139
|
}
|
|
@@ -183,7 +183,7 @@ export function buildSettingGroups(
|
|
|
183
183
|
behaviorEntries.push(entry);
|
|
184
184
|
}
|
|
185
185
|
}
|
|
186
|
-
// In-terminal (OSC 9) notification toggles + audible bell
|
|
186
|
+
// In-terminal (OSC 9) notification toggles + audible bell, same category,
|
|
187
187
|
// per-key defaults (see terminal-notifier.ts).
|
|
188
188
|
for (const entry of buildTerminalNotifySyntheticEntries(configManager)) {
|
|
189
189
|
if (!behaviorEntries.some((e) => e.setting.key === entry.setting.key)) {
|
|
@@ -194,7 +194,7 @@ export function buildSettingGroups(
|
|
|
194
194
|
|
|
195
195
|
// Inject the storage.codeIndexEnabled toggle into the
|
|
196
196
|
// storage category. TUI-local synthetic setting (not in the SDK ConfigKey
|
|
197
|
-
// union
|
|
197
|
+
// union, see code-index-services.ts), same rationale as
|
|
198
198
|
// notifyAfterSeconds above: opt-in, default off, states its own bounds.
|
|
199
199
|
const storageEntries = groups.get('storage');
|
|
200
200
|
if (storageEntries && !storageEntries.some((e) => e.setting.key === (CODE_INDEX_ENABLED_CONFIG_KEY as ConfigKey))) {
|
|
@@ -202,13 +202,13 @@ export function buildSettingGroups(
|
|
|
202
202
|
}
|
|
203
203
|
|
|
204
204
|
// Inject the memory.projection.dir synthetic entry into the storage
|
|
205
|
-
// category (alongside codeIndexEnabled
|
|
205
|
+
// category (alongside codeIndexEnabled, both are local-storage posture
|
|
206
206
|
// settings). Not in the SDK ConfigKey union, same rationale as above.
|
|
207
207
|
if (storageEntries && !storageEntries.some((e) => e.setting.key === MEMORY_PROJECTION_DIR_CONFIG_KEY)) {
|
|
208
208
|
storageEntries.push(buildMemoryProjectionDirSyntheticEntry(configManager));
|
|
209
209
|
}
|
|
210
210
|
|
|
211
|
-
// Synthetic memory.showProvenance (TUI-local, default OFF
|
|
211
|
+
// Synthetic memory.showProvenance (TUI-local, default OFF, see memory-provenance.ts).
|
|
212
212
|
const memoryEntries = groups.get('memory');
|
|
213
213
|
if (memoryEntries && !memoryEntries.some((e) => e.setting.key === (MEMORY_SHOW_PROVENANCE_CONFIG_KEY as ConfigKey))) {
|
|
214
214
|
memoryEntries.push(buildMemoryProvenanceSyntheticEntry(configManager) as unknown as SettingEntry);
|
|
@@ -216,7 +216,7 @@ export function buildSettingGroups(
|
|
|
216
216
|
|
|
217
217
|
// Inject the worktree.setup.commands / worktree.setup.carryOverGlobs
|
|
218
218
|
// synthetic entries into the orchestration category (worktree isolation is
|
|
219
|
-
// an orchestration-engine concern
|
|
219
|
+
// an orchestration-engine concern, see WorkstreamIsolation 'worktree').
|
|
220
220
|
// Neither key is in the SDK ConfigKey union (see worktree-setup-config.ts),
|
|
221
221
|
// same rationale as the other synthetic settings above.
|
|
222
222
|
const orchestrationEntries = groups.get('orchestration');
|
|
@@ -230,7 +230,7 @@ export function buildSettingGroups(
|
|
|
230
230
|
}
|
|
231
231
|
|
|
232
232
|
// Inject the sandbox.egressAllowlist / sandbox.workspaceWritable and
|
|
233
|
-
// permissions.execEnvScrubAllowlist synthetic entries
|
|
233
|
+
// permissions.execEnvScrubAllowlist synthetic entries, see
|
|
234
234
|
// sandbox-exec-config.ts / exec-env-scrub-config.ts for why they are not in
|
|
235
235
|
// CONFIG_SCHEMA, same rationale as the other synthetic settings above.
|
|
236
236
|
injectSandboxExecSyntheticEntries(groups, configManager);
|
|
@@ -242,7 +242,7 @@ export function buildSettingGroups(
|
|
|
242
242
|
// windows, notifyChannels). What's injected here are the four secret-tier
|
|
243
243
|
// card-material fields and the two ordinary address fields, which are
|
|
244
244
|
// TUI-local synthetic sub-keys under that real section (not yet SDK
|
|
245
|
-
// CONFIG_SCHEMA entries
|
|
245
|
+
// CONFIG_SCHEMA entries, see payments-config.ts's header comment), backed
|
|
246
246
|
// by the same real configManager as everything else in this group.
|
|
247
247
|
const paymentsEntries = groups.get('payments');
|
|
248
248
|
if (paymentsEntries && !paymentsEntries.some((e) => isPaymentsSyntheticConfigKey(e.setting.key))) {
|
|
@@ -254,7 +254,7 @@ export function buildSettingGroups(
|
|
|
254
254
|
enrichRelaySettingDescriptions(groups);
|
|
255
255
|
|
|
256
256
|
// Daemon-owned keys (e.g. surfaces.telegram.*) live only in the daemon's
|
|
257
|
-
// own config store
|
|
257
|
+
// own config store, say so in the detail text (daemon-owned-settings-descriptions.ts).
|
|
258
258
|
enrichDaemonOwnedSettingDescriptions(groups, configManager);
|
|
259
259
|
|
|
260
260
|
// Feature-unit presentation: each capability becomes ONE unit (its real
|
|
@@ -322,7 +322,7 @@ export function buildNotifyAfterSecondsSyntheticEntry(configManager: Pick<Config
|
|
|
322
322
|
/**
|
|
323
323
|
* The synthetic ConfigSetting descriptor for behavior.budgetAlertUsd.
|
|
324
324
|
*
|
|
325
|
-
* This key is TUI-local and is not yet in the SDK ConfigKey union
|
|
325
|
+
* This key is TUI-local and is not yet in the SDK ConfigKey union, it never
|
|
326
326
|
* appeared in CONFIG_SCHEMA, so it was invisible to every schema-driven
|
|
327
327
|
* inspection surface (/config, /settings-sync show <key>) even though the
|
|
328
328
|
* value round-trips correctly through configManager.get/set. The descriptor
|
|
@@ -357,7 +357,7 @@ export function buildBudgetAlertUsdSyntheticEntry(configManager: Pick<ConfigMana
|
|
|
357
357
|
}
|
|
358
358
|
|
|
359
359
|
// ---------------------------------------------------------------------------
|
|
360
|
-
// alert-class synthetic settings
|
|
360
|
+
// alert-class synthetic settings, behavior.notifyOn* + notifyOnlyWhenUnfocused
|
|
361
361
|
// ---------------------------------------------------------------------------
|
|
362
362
|
|
|
363
363
|
/**
|
|
@@ -365,7 +365,7 @@ export function buildBudgetAlertUsdSyntheticEntry(configManager: Pick<ConfigMana
|
|
|
365
365
|
* ConfigKey union), all defaulting to on. Read/written generically by
|
|
366
366
|
* core/alert-gating.ts (readBooleanConfig) and the per-alert-class modules
|
|
367
367
|
* (budget-breach-notifier.ts, approval-alert.ts, turn-event-wiring.ts,
|
|
368
|
-
* long-task-notifier.ts)
|
|
368
|
+
* long-task-notifier.ts), this is only the settings-modal-visible surface.
|
|
369
369
|
*/
|
|
370
370
|
const NOTIFY_ALERT_SYNTHETIC_SETTINGS: ReadonlyArray<{ readonly key: string; readonly description: string }> = [
|
|
371
371
|
{
|
|
@@ -411,7 +411,7 @@ export function buildNotifyAlertSyntheticEntries(configManager: Pick<ConfigManag
|
|
|
411
411
|
}
|
|
412
412
|
|
|
413
413
|
// ---------------------------------------------------------------------------
|
|
414
|
-
// In-terminal (OSC 9) notification settings
|
|
414
|
+
// In-terminal (OSC 9) notification settings, see core/terminal-notifier.ts
|
|
415
415
|
// ---------------------------------------------------------------------------
|
|
416
416
|
|
|
417
417
|
/**
|
|
@@ -421,7 +421,7 @@ export function buildNotifyAlertSyntheticEntries(configManager: Pick<ConfigManag
|
|
|
421
421
|
* on, turn-end/agent-blocked off, bell off. Read generically by
|
|
422
422
|
* core/terminal-notifier.ts (readBooleanConfig); this is only the
|
|
423
423
|
* settings-modal-visible surface. These are independent of the master
|
|
424
|
-
* `notifyOnlyWhenUnfocused` gate
|
|
424
|
+
* `notifyOnlyWhenUnfocused` gate, an in-terminal notification is always
|
|
425
425
|
* focus-gated on its own (only fires for an unfocused/unknown terminal).
|
|
426
426
|
*/
|
|
427
427
|
const TERMINAL_NOTIFY_SYNTHETIC_SETTINGS: ReadonlyArray<{ readonly key: string; readonly description: string; readonly defaultOn: boolean }> = [
|
|
@@ -460,7 +460,7 @@ export function buildTerminalNotifySyntheticEntries(configManager: Pick<ConfigMa
|
|
|
460
460
|
* The repo source-tree code index's auto-build-on-startup toggle
|
|
461
461
|
* (code-index-services.ts). TUI-local, default OFF: /codebase build is the
|
|
462
462
|
* explicit trigger unless a user opts in here. Honest bounds stated inline
|
|
463
|
-
* so enabling this isn't a surprise
|
|
463
|
+
* so enabling this isn't a surprise, see code-index-services.ts's
|
|
464
464
|
* CODE_INDEX_MAX_FILES/CODE_INDEX_MAX_FILE_BYTES for the numbers this
|
|
465
465
|
* description would otherwise duplicate as magic numbers.
|
|
466
466
|
*/
|
|
@@ -468,13 +468,13 @@ export function buildCodeIndexEnabledSyntheticEntry(configManager: Pick<ConfigMa
|
|
|
468
468
|
return buildBooleanSyntheticEntry(
|
|
469
469
|
configManager,
|
|
470
470
|
CODE_INDEX_ENABLED_CONFIG_KEY,
|
|
471
|
-
'Auto-build the repo source-tree code index on startup (bounded file/size scan; see /codebase status for bounds). Off by default
|
|
471
|
+
'Auto-build the repo source-tree code index on startup (bounded file/size scan; see /codebase status for bounds). Off by default: /codebase build indexes on demand.',
|
|
472
472
|
false,
|
|
473
473
|
);
|
|
474
474
|
}
|
|
475
475
|
|
|
476
476
|
// ---------------------------------------------------------------------------
|
|
477
|
-
// buildFlagEntries
|
|
477
|
+
// buildFlagEntries, snapshot of current feature flag states
|
|
478
478
|
// ---------------------------------------------------------------------------
|
|
479
479
|
|
|
480
480
|
export function buildFlagEntries(featureFlagManager: FeatureFlagManager | null): FlagEntry[] {
|
|
@@ -489,7 +489,7 @@ export function buildFlagEntries(featureFlagManager: FeatureFlagManager | null):
|
|
|
489
489
|
}
|
|
490
490
|
|
|
491
491
|
// ---------------------------------------------------------------------------
|
|
492
|
-
// buildMcpEntries
|
|
492
|
+
// buildMcpEntries, snapshot of current MCP server security entries
|
|
493
493
|
// ---------------------------------------------------------------------------
|
|
494
494
|
|
|
495
495
|
export function buildMcpEntries(mcpRegistry: McpRegistry | null): McpEntry[] {
|
|
@@ -505,13 +505,13 @@ export function buildMcpEntries(mcpRegistry: McpRegistry | null): McpEntry[] {
|
|
|
505
505
|
}
|
|
506
506
|
|
|
507
507
|
// ---------------------------------------------------------------------------
|
|
508
|
-
// buildSubscriptionEntries
|
|
508
|
+
// buildSubscriptionEntries, re-export for use by SettingsModal
|
|
509
509
|
// ---------------------------------------------------------------------------
|
|
510
510
|
|
|
511
511
|
export { buildSubscriptionEntries };
|
|
512
512
|
|
|
513
513
|
// ---------------------------------------------------------------------------
|
|
514
|
-
// buildNetworkFilteredItems
|
|
514
|
+
// buildNetworkFilteredItems, applies host-mode visibility rules for 'network' tab
|
|
515
515
|
// ---------------------------------------------------------------------------
|
|
516
516
|
|
|
517
517
|
export function buildNetworkFilteredItems(
|
|
@@ -533,7 +533,7 @@ export function buildNetworkFilteredItems(
|
|
|
533
533
|
}
|
|
534
534
|
|
|
535
535
|
// ---------------------------------------------------------------------------
|
|
536
|
-
// refreshEntryValues
|
|
536
|
+
// refreshEntryValues, re-reads currentValue/isDefault for all loaded entries
|
|
537
537
|
// ---------------------------------------------------------------------------
|
|
538
538
|
|
|
539
539
|
export function refreshEntryValues(
|
|
@@ -560,19 +560,19 @@ export function refreshEntryValues(
|
|
|
560
560
|
entry.isDefault = (entry.currentValue as string[]).length === 0;
|
|
561
561
|
continue;
|
|
562
562
|
}
|
|
563
|
-
// 'memory' has no DEFAULT_CONFIG entry
|
|
563
|
+
// 'memory' has no DEFAULT_CONFIG entry, its synthetic leaves read defensively below.
|
|
564
564
|
if (entry.setting.key === MEMORY_PROJECTION_DIR_CONFIG_KEY) {
|
|
565
565
|
const refreshed = buildMemoryProjectionDirSyntheticEntry(configManager);
|
|
566
566
|
entry.currentValue = refreshed.currentValue; entry.isDefault = refreshed.isDefault;
|
|
567
567
|
continue;
|
|
568
568
|
}
|
|
569
|
-
// memory.showProvenance: same 'memory'-has-no-DEFAULT_CONFIG trap
|
|
569
|
+
// memory.showProvenance: same 'memory'-has-no-DEFAULT_CONFIG trap, read defensively.
|
|
570
570
|
if (entry.setting.key === (MEMORY_SHOW_PROVENANCE_CONFIG_KEY as ConfigKey)) {
|
|
571
571
|
const refreshed = buildMemoryProvenanceSyntheticEntry(configManager);
|
|
572
572
|
entry.currentValue = refreshed.currentValue; entry.isDefault = refreshed.isDefault;
|
|
573
573
|
continue;
|
|
574
574
|
}
|
|
575
|
-
// payments.* synthetic sub-keys (card material + addresses
|
|
575
|
+
// payments.* synthetic sub-keys (card material + addresses, see
|
|
576
576
|
// payments-config.ts): real configManager-backed now, but still
|
|
577
577
|
// defensively normalized (undefined -> '') the same way the initial
|
|
578
578
|
// build does, so isDefault stays consistent between build and refresh.
|
|
@@ -591,7 +591,7 @@ export function refreshEntryValues(
|
|
|
591
591
|
}
|
|
592
592
|
|
|
593
593
|
// ---------------------------------------------------------------------------
|
|
594
|
-
// updateEntryForKey
|
|
594
|
+
// updateEntryForKey, updates a single setting entry after a value change
|
|
595
595
|
// ---------------------------------------------------------------------------
|
|
596
596
|
|
|
597
597
|
export function updateEntryForKey(
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* settings-modal-mutations
|
|
2
|
+
* settings-modal-mutations, pure mutation helpers for SettingsModal.
|
|
3
3
|
*
|
|
4
4
|
* These functions encapsulate the side-effectful write operations. Every
|
|
5
|
-
* write
|
|
5
|
+
* write, feature-unit headers included, is a plain domain-settings config
|
|
6
6
|
* write; the SDK's settings bridge keeps the runtime gate manager in sync
|
|
7
7
|
* (flipping runtime-toggleable gates live and recording honest
|
|
8
8
|
* pending-restart markers for startup-gated ones). Each function takes its
|
|
@@ -17,7 +17,7 @@ import type { FlagEntry, SettingEntry } from './settings-modal-types.ts';
|
|
|
17
17
|
import { deepEqual } from './settings-modal-data.ts';
|
|
18
18
|
|
|
19
19
|
// ---------------------------------------------------------------------------
|
|
20
|
-
// ApplyValueResult
|
|
20
|
+
// ApplyValueResult, returned by applySettingValue so the caller can react
|
|
21
21
|
// ---------------------------------------------------------------------------
|
|
22
22
|
|
|
23
23
|
export interface ApplyValueResult {
|
|
@@ -45,7 +45,7 @@ export type SettingAppliedCallback = (change: {
|
|
|
45
45
|
* `surfaces.*`, `controlPlane.*`, `watchers.*`, `device.*`, `automation.*` and
|
|
46
46
|
* the rest are executed by the daemon, unattended, with every surface closed.
|
|
47
47
|
* Writing one into this surface's own settings file reports success and
|
|
48
|
-
* configures nothing
|
|
48
|
+
* configures nothing, the daemon reads a different file and never sees it.
|
|
49
49
|
* So a daemon-owned write goes over `config.set`, and a write with no reachable
|
|
50
50
|
* daemon FAILS rather than landing somewhere harmless-looking.
|
|
51
51
|
*/
|
|
@@ -80,8 +80,8 @@ export function applySettingValue({
|
|
|
80
80
|
// live under a config section CONFIG_SCHEMA/DEFAULT_CONFIG has never populated
|
|
81
81
|
// (e.g. 'worktree' as of the SDK 1.6.1 repack), so configManager.get can throw
|
|
82
82
|
// "Invalid config path" here even though the write attempt below is already
|
|
83
|
-
// guarded. Without this, that read
|
|
84
|
-
// write's own try/catch
|
|
83
|
+
// guarded. Without this, that read, which runs unconditionally, before the
|
|
84
|
+
// write's own try/catch, would crash the whole settings modal on save instead
|
|
85
85
|
// of surfacing the honest "Save failed" message the write path below produces.
|
|
86
86
|
let previousValue: unknown;
|
|
87
87
|
try {
|
|
@@ -101,7 +101,7 @@ export function applySettingValue({
|
|
|
101
101
|
// manager is still written so this session's own reads and the rows
|
|
102
102
|
// below reflect the edit immediately; the daemon's copy is what the
|
|
103
103
|
// daemon acts on, and a refusal from it is surfaced rather than
|
|
104
|
-
// swallowed
|
|
104
|
+
// swallowed, the local value would then be the lie.
|
|
105
105
|
void daemonConfig.set(key, value).catch((error) => {
|
|
106
106
|
logger.error('SettingsModal: the daemon refused a daemon-owned config write', { key, error: summarizeError(error) });
|
|
107
107
|
onAsyncError?.(`That setting is applied by the daemon and saving it there failed: ${summarizeError(error)}`);
|