@pellux/goodvibes-tui 2.0.14 → 2.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.goodvibes/GOODVIBES.md +1 -1
- package/.goodvibes/agents/reviewer.md +8 -8
- package/.goodvibes/skills/add-provider/SKILL.md +22 -22
- package/CHANGELOG.md +49 -0
- package/README.md +64 -44
- package/docs/README.md +6 -6
- package/docs/foundation-artifacts/README.md +5 -5
- package/docs/foundation-artifacts/operator-contract.json +123 -123
- package/package.json +12 -10
- package/scripts/postinstall.js +3 -3
- package/src/audio/activation-sound.ts +7 -7
- package/src/audio/capture.ts +7 -7
- package/src/audio/onnxruntime-assets.d.ts +1 -1
- package/src/audio/player.ts +4 -4
- package/src/audio/spoken-turn-wiring.ts +4 -4
- package/src/audio/voice-capture-wiring.ts +5 -5
- package/src/audio/voice-input-session.ts +3 -3
- package/src/audio/wake-inference.ts +13 -8
- package/src/audio/wake-runtime.ts +10 -10
- package/src/cli/completions/generate.ts +2 -2
- package/src/cli/doctor.ts +13 -13
- package/src/cli/ensure-goodvibes-gitignore.ts +3 -3
- package/src/cli/entrypoint.ts +3 -3
- package/src/cli/help.ts +6 -6
- package/src/cli/hooks-command.ts +4 -4
- package/src/cli/hooks-report.ts +4 -4
- package/src/cli/launch-auto-update.ts +17 -17
- package/src/cli/management-commands.ts +8 -8
- package/src/cli/management-utils.ts +3 -3
- package/src/cli/management.ts +1 -1
- package/src/cli/plugin-bundles-command.ts +10 -10
- package/src/cli/plugin-command.ts +9 -9
- package/src/cli/service-posture.ts +1 -1
- package/src/cli/status.ts +10 -10
- package/src/cli/surface-command.ts +4 -4
- package/src/cli/tui-startup.ts +23 -23
- package/src/config/run-daemon-config-migration.ts +3 -3
- package/src/config/secret-config.ts +10 -10
- package/src/config/surface.ts +1 -1
- package/src/config/tui-extension-settings.ts +8 -8
- package/src/core/active-model-identity.ts +7 -7
- package/src/core/approval-alert.ts +5 -5
- package/src/core/bookmark-navigation.ts +3 -3
- package/src/core/budget-breach-notifier.ts +6 -6
- package/src/core/compaction-receipt.ts +8 -8
- package/src/core/composer-state.ts +2 -2
- package/src/core/context-usage.ts +1 -1
- package/src/core/conversation-compaction-render.ts +3 -3
- package/src/core/conversation-event-navigation.ts +2 -2
- package/src/core/conversation-fold.ts +9 -9
- package/src/core/conversation-line-cache.ts +14 -14
- package/src/core/conversation-render-context.ts +6 -6
- package/src/core/conversation-rendering.ts +27 -30
- package/src/core/conversation-search-expansion.ts +6 -6
- package/src/core/conversation-splash-state.ts +3 -3
- package/src/core/conversation-turn-structure.ts +13 -13
- package/src/core/conversation-types.ts +3 -3
- package/src/core/conversation-user-receipts.ts +5 -5
- package/src/core/conversation.ts +17 -17
- package/src/core/format-user-error.ts +5 -5
- package/src/core/long-task-notifier.ts +9 -9
- package/src/core/memory-diagnostics-gateway.ts +8 -8
- package/src/core/memory-provenance.ts +5 -5
- package/src/core/model-routing-chip.ts +3 -3
- package/src/core/pairing-tailscale-gateway.ts +3 -3
- package/src/core/permission-mode.ts +5 -5
- package/src/core/power-chip-source.ts +3 -3
- package/src/core/power-status.ts +8 -8
- package/src/core/rewind-receipt.ts +6 -6
- package/src/core/session-resume-core.ts +8 -8
- package/src/core/stream-event-wiring.ts +36 -36
- package/src/core/stream-stall-watchdog.ts +4 -4
- package/src/core/system-message-noise.ts +7 -7
- package/src/core/system-message-router.ts +10 -10
- package/src/core/terminal-notifier.ts +5 -5
- package/src/core/turn-budget-outcome.ts +5 -5
- package/src/core/turn-cancellation.ts +3 -3
- package/src/core/turn-event-wiring.ts +16 -16
- package/src/core/voice-capture-status.ts +2 -2
- package/src/core/voice-provision-gateway.ts +12 -12
- package/src/core/voice-provision-status.ts +19 -19
- package/src/core/voice-stt-gateway.ts +6 -6
- package/src/core/wake-provision-runner.ts +7 -7
- package/src/core/wake-provision-status.ts +17 -17
- package/src/core/workstream-notification.ts +8 -8
- package/src/export/gist-uploader.ts +7 -7
- package/src/input/autocomplete.ts +3 -3
- package/src/input/bookmark-modal.ts +1 -1
- package/src/input/command-args-hint.ts +2 -2
- package/src/input/command-reference.ts +9 -9
- package/src/input/command-registry.ts +32 -32
- package/src/input/commands/acp-runtime.ts +6 -6
- package/src/input/commands/calendar-runtime.ts +9 -9
- package/src/input/commands/channel-pairing.ts +11 -11
- package/src/input/commands/channel-runtime.ts +1 -1
- package/src/input/commands/checkin-runtime.ts +4 -4
- package/src/input/commands/checkpoint-runtime.ts +4 -4
- package/src/input/commands/ci-runtime.ts +4 -4
- package/src/input/commands/cluster-runtime.ts +3 -3
- package/src/input/commands/codebase-runtime.ts +16 -16
- package/src/input/commands/config.ts +6 -6
- package/src/input/commands/connection-status.ts +12 -12
- package/src/input/commands/context-window.ts +2 -2
- package/src/input/commands/cost-attribution-format.ts +4 -4
- package/src/input/commands/cost-runtime.ts +2 -2
- package/src/input/commands/devices-runtime.ts +7 -7
- package/src/input/commands/diff-runtime.ts +2 -2
- package/src/input/commands/editor-runtime.ts +1 -1
- package/src/input/commands/eval.ts +4 -4
- package/src/input/commands/experience-runtime.ts +1 -1
- package/src/input/commands/git-runtime.ts +3 -3
- package/src/input/commands/graph-runtime.ts +3 -3
- package/src/input/commands/guidance-runtime.ts +1 -1
- package/src/input/commands/health-metrics-format.ts +2 -2
- package/src/input/commands/health-runtime.ts +8 -8
- package/src/input/commands/hosted-runtime.ts +13 -13
- package/src/input/commands/image-runtime.ts +6 -6
- package/src/input/commands/intelligence-runtime.ts +2 -2
- package/src/input/commands/local-auth-runtime.ts +3 -3
- package/src/input/commands/local-provider-runtime.ts +3 -3
- package/src/input/commands/local-runtime.ts +7 -7
- package/src/input/commands/mail-runtime.ts +9 -9
- package/src/input/commands/mcp-runtime.ts +1 -1
- package/src/input/commands/memory.ts +13 -13
- package/src/input/commands/notify-runtime.ts +1 -1
- package/src/input/commands/operator-panel-runtime.ts +8 -8
- package/src/input/commands/operator-rpc.ts +3 -3
- package/src/input/commands/operator-runtime.ts +3 -3
- package/src/input/commands/palette-runtime.ts +1 -1
- package/src/input/commands/payment-card-intake.ts +17 -17
- package/src/input/commands/permissions-provenance.ts +7 -7
- package/src/input/commands/permissions-runtime.ts +1 -1
- package/src/input/commands/planning-runtime.ts +19 -19
- package/src/input/commands/platform-services-runtime.ts +2 -2
- package/src/input/commands/policy-dispatch.ts +6 -6
- package/src/input/commands/power-runtime.ts +6 -6
- package/src/input/commands/principals-runtime.ts +3 -3
- package/src/input/commands/product-runtime.ts +3 -3
- package/src/input/commands/profile-render.ts +13 -13
- package/src/input/commands/profile-runtime.ts +13 -13
- package/src/input/commands/profile-types.ts +13 -13
- package/src/input/commands/provider-accounts-runtime.ts +5 -5
- package/src/input/commands/provider.ts +10 -10
- package/src/input/commands/qrcode-runtime.ts +3 -3
- package/src/input/commands/queue-runtime.ts +6 -6
- package/src/input/commands/recall-files-config.ts +4 -4
- package/src/input/commands/recall-files-git.ts +3 -3
- package/src/input/commands/recall-files.ts +12 -12
- package/src/input/commands/recall-query.ts +3 -3
- package/src/input/commands/recall-review.ts +3 -3
- package/src/input/commands/recall-shared.ts +1 -1
- package/src/input/commands/relay-runtime.ts +5 -5
- package/src/input/commands/remote-runtime.ts +3 -3
- package/src/input/commands/review-runtime.ts +8 -8
- package/src/input/commands/rewind-runtime.ts +21 -21
- package/src/input/commands/runtime-services.ts +1 -2
- package/src/input/commands/schedule-nl.ts +2 -2
- package/src/input/commands/schedule-runtime.ts +2 -2
- package/src/input/commands/secret-runtime.ts +3 -3
- package/src/input/commands/session-content.ts +7 -7
- package/src/input/commands/session-picker-filter.ts +3 -3
- package/src/input/commands/session-workflow.ts +10 -10
- package/src/input/commands/session.ts +15 -15
- package/src/input/commands/settings-sync-runtime.ts +2 -2
- package/src/input/commands/share-runtime.ts +4 -4
- package/src/input/commands/shell-core.ts +11 -11
- package/src/input/commands/tasks-runtime.ts +4 -4
- package/src/input/commands/test-runtime.ts +6 -6
- package/src/input/commands/tts-runtime.ts +4 -4
- package/src/input/commands/update-runtime.ts +27 -27
- package/src/input/commands/websearch-runtime.ts +2 -2
- package/src/input/commands/work-plan-runtime.ts +2 -2
- package/src/input/commands/workstream-attempt-dependents.ts +4 -4
- package/src/input/commands/workstream-attempts.ts +16 -16
- package/src/input/commands/workstream-runtime.ts +36 -36
- package/src/input/commands/worktree-runtime.ts +6 -6
- package/src/input/composer-capture.ts +5 -5
- package/src/input/concealed-input.ts +2 -2
- package/src/input/config-modal-types.ts +16 -16
- package/src/input/config-modal.ts +30 -30
- package/src/input/daemon-owned-settings-descriptions.ts +4 -4
- package/src/input/delete-key-policy.ts +1 -1
- package/src/input/exec-env-scrub-config.ts +7 -7
- package/src/input/feature-unit-layout.ts +5 -5
- package/src/input/feed-context-factory.ts +38 -38
- package/src/input/file-picker.ts +1 -1
- package/src/input/handler-command-route.ts +2 -2
- package/src/input/handler-content-actions.ts +8 -8
- package/src/input/handler-feed-routes.ts +13 -13
- package/src/input/handler-feed.ts +31 -31
- package/src/input/handler-interactions.ts +2 -2
- package/src/input/handler-modal-routes.ts +13 -13
- package/src/input/handler-modal-stack.ts +1 -1
- package/src/input/handler-modal-token-routes.ts +1 -1
- package/src/input/handler-onboarding-daemon-adopt.ts +6 -6
- package/src/input/handler-picker-routes.ts +7 -7
- package/src/input/handler-prompt-buffer.ts +1 -1
- package/src/input/handler-shortcuts.ts +12 -12
- package/src/input/handler-types.ts +3 -3
- package/src/input/handler-ui-state.ts +1 -1
- package/src/input/handler.ts +9 -9
- package/src/input/input-history.ts +1 -1
- package/src/input/keybindings.ts +13 -13
- package/src/input/kill-ring.ts +7 -11
- package/src/input/model-picker-filter.ts +3 -3
- package/src/input/model-picker-items.ts +5 -5
- package/src/input/model-picker-types.ts +2 -2
- package/src/input/model-picker.ts +18 -18
- package/src/input/onboarding/onboarding-feature-units.ts +9 -13
- package/src/input/onboarding/onboarding-provider-key-fields.ts +3 -3
- package/src/input/onboarding/onboarding-runtime-status.ts +3 -3
- package/src/input/onboarding/onboarding-wizard-apply.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-cloudflare-step.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-constants.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +4 -4
- package/src/input/onboarding/onboarding-wizard-network-adopt.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-steps.ts +2 -2
- package/src/input/panel-integration-actions.ts +3 -3
- package/src/input/panel-mouse-geometry.ts +1 -1
- package/src/input/panel-paste-flood-guard.ts +9 -9
- package/src/input/payments-config.ts +15 -15
- package/src/input/profile-picker-modal.ts +1 -1
- package/src/input/provider-key-intake.ts +9 -9
- package/src/input/relay-settings-descriptions.ts +3 -3
- package/src/input/sandbox-exec-config.ts +9 -9
- package/src/input/search.ts +18 -18
- package/src/input/selection-modal-queue.ts +10 -10
- package/src/input/selection-modal.ts +2 -2
- package/src/input/session-picker-modal.ts +7 -7
- package/src/input/settings-modal-activation.ts +1 -1
- package/src/input/settings-modal-adjustment.ts +2 -2
- package/src/input/settings-modal-commit.ts +6 -6
- package/src/input/settings-modal-connections.ts +2 -2
- package/src/input/settings-modal-data.ts +29 -29
- package/src/input/settings-modal-mutations.ts +7 -7
- package/src/input/settings-modal-reset.ts +3 -3
- package/src/input/settings-modal-search.ts +6 -6
- package/src/input/settings-modal-secrets.ts +3 -3
- package/src/input/settings-modal-types.ts +16 -16
- package/src/input/settings-modal.ts +4 -4
- package/src/input/voice-local-settings.ts +3 -3
- package/src/input/worktree-setup-config.ts +8 -8
- package/src/main.ts +15 -15
- package/src/panels/agent-inspector-shared.ts +5 -5
- package/src/panels/base-panel.ts +3 -3
- package/src/panels/builtin/agent.ts +3 -3
- package/src/panels/builtin/development.ts +4 -4
- package/src/panels/builtin/knowledge.ts +1 -1
- package/src/panels/builtin/operations.ts +12 -12
- package/src/panels/builtin/session.ts +8 -8
- package/src/panels/builtin/shared.ts +6 -6
- package/src/panels/builtin-modals.ts +8 -8
- package/src/panels/confirm-state.ts +5 -5
- package/src/panels/cost-tracker-panel.ts +22 -22
- package/src/panels/diff-panel.ts +20 -20
- package/src/panels/diff-review-model.ts +5 -5
- package/src/panels/diff-review-panel.ts +5 -5
- package/src/panels/eval-registry.ts +2 -2
- package/src/panels/expandable-list-panel.ts +5 -5
- package/src/panels/fleet-acts.ts +20 -20
- package/src/panels/fleet-deep-link.ts +5 -5
- package/src/panels/fleet-gateway.ts +12 -12
- package/src/panels/fleet-observed-render.ts +11 -11
- package/src/panels/fleet-panel-format.ts +14 -14
- package/src/panels/fleet-panel-worktree-detail.ts +8 -8
- package/src/panels/fleet-panel.ts +34 -34
- package/src/panels/fleet-read-model.ts +49 -49
- package/src/panels/fleet-spawn.ts +15 -15
- package/src/panels/fleet-steer.ts +7 -7
- package/src/panels/fleet-stop.ts +5 -5
- package/src/panels/fleet-tabs.ts +14 -14
- package/src/panels/fleet-transcript.ts +26 -26
- package/src/panels/git-panel.ts +8 -8
- package/src/panels/hosted-session-feed.ts +13 -13
- package/src/panels/hosted-session-panel.ts +7 -7
- package/src/panels/index.ts +1 -1
- package/src/panels/local-auth-panel.ts +15 -15
- package/src/panels/memory-consolidation-gateway.ts +8 -8
- package/src/panels/modals/devices-modal.ts +8 -8
- package/src/panels/modals/hooks-modal.ts +1 -1
- package/src/panels/modals/keybindings-modal.ts +5 -5
- package/src/panels/modals/knowledge-modal.ts +2 -2
- package/src/panels/modals/local-auth-modal.ts +4 -4
- package/src/panels/modals/marketplace-modal.ts +3 -3
- package/src/panels/modals/memory-modal.ts +19 -19
- package/src/panels/modals/modal-surface-helpers.ts +1 -1
- package/src/panels/modals/modal-theme.ts +3 -3
- package/src/panels/modals/pairing-modal.ts +19 -19
- package/src/panels/modals/planning-modal.ts +11 -11
- package/src/panels/modals/plugins-modal.ts +1 -1
- package/src/panels/modals/policy-modal.ts +4 -4
- package/src/panels/modals/provider-health-modal.ts +1 -1
- package/src/panels/modals/remote-modal.ts +1 -1
- package/src/panels/modals/sandbox-modal.ts +2 -2
- package/src/panels/modals/security-modal.ts +4 -4
- package/src/panels/modals/services-modal.ts +1 -1
- package/src/panels/modals/work-plan-modal.ts +4 -4
- package/src/panels/notifications-feed.ts +6 -6
- package/src/panels/notifications-panel.ts +6 -6
- package/src/panels/panel-confirm-overlay.ts +4 -4
- package/src/panels/panel-manager.ts +13 -13
- package/src/panels/plugins-panel.ts +6 -6
- package/src/panels/polish-core.ts +2 -2
- package/src/panels/polish-tables.ts +2 -2
- package/src/panels/polish.ts +1 -1
- package/src/panels/project-planning-answer-actions.ts +3 -3
- package/src/panels/scrollable-list-panel.ts +15 -15
- package/src/panels/search-focus.ts +1 -1
- package/src/panels/session-maintenance.ts +1 -1
- package/src/panels/skills-panel.ts +3 -3
- package/src/panels/token-budget-panel.ts +11 -11
- package/src/panels/types.ts +14 -14
- package/src/panels/workstream-graph-render.ts +5 -5
- package/src/panels/wrfc-panel-format.ts +1 -1
- package/src/permissions/broker-approval-card.ts +13 -13
- package/src/permissions/hunk-selection.ts +13 -13
- package/src/permissions/prompt.ts +22 -22
- package/src/permissions/sandbox-exec-gate.ts +5 -5
- package/src/providers/provider-classification.ts +1 -1
- package/src/providers/reasoning-effort-surface.ts +12 -12
- package/src/renderer/ansi-sanitize.ts +5 -6
- package/src/renderer/autocomplete-overlay.ts +5 -5
- package/src/renderer/block-actions-overlay.ts +1 -1
- package/src/renderer/bookmark-modal.ts +1 -1
- package/src/renderer/code-block.ts +2 -2
- package/src/renderer/compaction-history-modal.ts +4 -4
- package/src/renderer/compaction-preview.ts +5 -5
- package/src/renderer/compaction-quality.ts +5 -5
- package/src/renderer/composer-fragments.ts +6 -6
- package/src/renderer/compositor.ts +9 -9
- package/src/renderer/config-modal.ts +3 -3
- package/src/renderer/context-inspector.ts +1 -1
- package/src/renderer/context-status-hint.ts +10 -10
- package/src/renderer/conversation-layout.ts +2 -2
- package/src/renderer/conversation-overlays.ts +2 -2
- package/src/renderer/conversation-surface.ts +6 -6
- package/src/renderer/diff.ts +4 -4
- package/src/renderer/fleet-tab-strip.ts +2 -2
- package/src/renderer/footer-tips.ts +4 -4
- package/src/renderer/fullscreen-primitives.ts +1 -1
- package/src/renderer/git-status.ts +5 -5
- package/src/renderer/header-line.ts +5 -5
- package/src/renderer/help-overlay.ts +5 -5
- package/src/renderer/hint-grammar.ts +2 -2
- package/src/renderer/layout.ts +1 -1
- package/src/renderer/markdown-inline.ts +3 -3
- package/src/renderer/markdown-table.ts +7 -7
- package/src/renderer/modal-factory.ts +3 -3
- package/src/renderer/model-picker-overlay.ts +2 -2
- package/src/renderer/model-workspace.ts +7 -7
- package/src/renderer/onboarding/onboarding-wizard.ts +1 -1
- package/src/renderer/overlay-box.ts +1 -1
- package/src/renderer/panel-composite.ts +5 -5
- package/src/renderer/panel-workspace-bar.ts +1 -1
- package/src/renderer/process-indicator.ts +8 -8
- package/src/renderer/profile-picker-modal.ts +3 -3
- package/src/renderer/prompt-content-width.ts +1 -1
- package/src/renderer/search-overlay.ts +3 -3
- package/src/renderer/selection-modal-overlay.ts +6 -6
- package/src/renderer/semantic-diff.ts +6 -7
- package/src/renderer/session-picker-modal.ts +24 -24
- package/src/renderer/settings-modal-connections.ts +3 -3
- package/src/renderer/settings-modal-helpers.ts +16 -16
- package/src/renderer/settings-modal.ts +10 -10
- package/src/renderer/shell-surface.ts +8 -8
- package/src/renderer/status-glyphs.ts +6 -6
- package/src/renderer/syntax-highlighter.ts +2 -3
- package/src/renderer/system-message.ts +3 -3
- package/src/renderer/tab-strip.ts +2 -2
- package/src/renderer/term-caps.ts +12 -12
- package/src/renderer/terminal-bg-probe.ts +10 -10
- package/src/renderer/terminal-escapes.ts +1 -1
- package/src/renderer/theme-mode-config.ts +3 -3
- package/src/renderer/theme.ts +34 -34
- package/src/renderer/thinking.ts +1 -1
- package/src/renderer/tool-call.ts +5 -5
- package/src/renderer/tool-result-expanded-lines.ts +3 -3
- package/src/renderer/tool-result-summary.ts +6 -6
- package/src/renderer/turn-injection.ts +9 -9
- package/src/renderer/ui-factory.ts +33 -33
- package/src/renderer/ui-primitives.ts +4 -4
- package/src/runtime/bootstrap-command-parts.ts +3 -3
- package/src/runtime/bootstrap-core.ts +21 -21
- package/src/runtime/bootstrap-hook-bridge.ts +8 -8
- package/src/runtime/bootstrap-shell.ts +9 -9
- package/src/runtime/bootstrap.ts +16 -16
- package/src/runtime/client/approval-updates.ts +3 -3
- package/src/runtime/client/build-floors.ts +7 -7
- package/src/runtime/client/daemon-attach-handshake.ts +5 -5
- package/src/runtime/client/fleet-union.ts +7 -7
- package/src/runtime/client/host-service-status.ts +2 -2
- package/src/runtime/client/hosted-exit.ts +4 -4
- package/src/runtime/client/hosted-roster.ts +4 -4
- package/src/runtime/client/hosted-session-stream.ts +5 -5
- package/src/runtime/client/hosted-sessions.ts +8 -8
- package/src/runtime/client/operator-endpoint.ts +14 -14
- package/src/runtime/client/spine-adoption.ts +8 -8
- package/src/runtime/context-accounting-source.ts +4 -4
- package/src/runtime/context.ts +2 -2
- package/src/runtime/conversation-rewind-port.ts +6 -6
- package/src/runtime/credential-composition.ts +2 -2
- package/src/runtime/daemon-attach-notices.ts +6 -6
- package/src/runtime/diagnostics/panels/index.ts +1 -1
- package/src/runtime/diagnostics/panels/ops.ts +2 -2
- package/src/runtime/disposal-wiring.ts +6 -6
- package/src/runtime/index.ts +11 -11
- package/src/runtime/install-self-check-startup.ts +4 -4
- package/src/runtime/install-self-check.ts +6 -6
- package/src/runtime/interaction-seams.ts +4 -4
- package/src/runtime/knowledge-services.ts +2 -2
- package/src/runtime/legacy-daemon-migration.ts +37 -37
- package/src/runtime/legacy-daemon-reconcile.ts +30 -30
- package/src/runtime/memory-governance-services.ts +3 -3
- package/src/runtime/memory-spine-transport.ts +3 -3
- package/src/runtime/notification-dispatch.ts +4 -4
- package/src/runtime/onboarding/apply.ts +1 -1
- package/src/runtime/onboarding/derivation.ts +1 -1
- package/src/runtime/onboarding/fast-path.ts +7 -7
- package/src/runtime/onboarding/progress.ts +2 -2
- package/src/runtime/onboarding/provider-key-capture.ts +4 -4
- package/src/runtime/onboarding/snapshot.ts +2 -2
- package/src/runtime/onboarding/state.ts +4 -4
- package/src/runtime/onboarding/types.ts +4 -4
- package/src/runtime/orchestrator-core-services.ts +5 -5
- package/src/runtime/path-shadow-startup.ts +3 -3
- package/src/runtime/perf/panel-contracts.ts +1 -1
- package/src/runtime/power-keepawake-remote.ts +6 -6
- package/src/runtime/process-lifecycle.ts +14 -14
- package/src/runtime/provider-fallback.ts +3 -3
- package/src/runtime/recovery-autosave.ts +3 -3
- package/src/runtime/recovery-decisions.ts +19 -19
- package/src/runtime/recovery-offer-wiring.ts +4 -4
- package/src/runtime/recovery-prompt.ts +20 -20
- package/src/runtime/relay-reachability-bridge.ts +3 -3
- package/src/runtime/release-artifacts.ts +1 -1
- package/src/runtime/resume-notice.ts +20 -20
- package/src/runtime/runtime-services-types.ts +20 -20
- package/src/runtime/services.ts +20 -20
- package/src/runtime/session-continuity-hints.ts +1 -1
- package/src/runtime/session-inbound-inputs.ts +12 -12
- package/src/runtime/session-resume-liveness-confirm.ts +4 -4
- package/src/runtime/session-spine-transport.ts +3 -3
- package/src/runtime/store/domains/panels.ts +2 -2
- package/src/runtime/store/domains/ui-perf.ts +2 -2
- package/src/runtime/store/index.ts +1 -1
- package/src/runtime/store/selectors/index.ts +1 -1
- package/src/runtime/store/state.ts +2 -2
- package/src/runtime/ui-services.ts +3 -3
- package/src/runtime/workspace-checkpointing.ts +3 -3
- package/src/runtime/wrfc-persistence.ts +15 -15
- package/src/scripts/process-messages.ts +1 -1
- package/src/shell/blocking-input.ts +9 -9
- package/src/shell/recovery-input-helpers.ts +2 -2
- package/src/shell/retry-affordance.ts +9 -9
- package/src/shell/ui-openers.ts +14 -14
- package/src/shell/voice-capture-shell.ts +3 -3
- package/src/tools/wrfc-agent-guard.ts +4 -4
- package/src/utils/browser.ts +2 -2
- package/src/utils/format-duration.ts +3 -3
- package/src/utils/format-number.ts +2 -2
- package/src/utils/splash-lines.ts +4 -4
- package/src/utils/terminal-width.ts +6 -6
- package/src/verification/verification-ledger.ts +25 -25
- package/src/version.ts +3 -3
package/src/input/handler.ts
CHANGED
|
@@ -181,10 +181,10 @@ export class InputHandler implements InputHandlerLike {
|
|
|
181
181
|
public nextPasteId = 1;
|
|
182
182
|
public lastCtrlCTime = 0;
|
|
183
183
|
/** Pending "hide the exit notice" timer from the last empty-prompt Ctrl+C
|
|
184
|
-
* press, if any
|
|
184
|
+
* press, if any, cleared before every subsequent press decides its own
|
|
185
185
|
* outcome (see handleCtrlC in handler-content-actions.ts). */
|
|
186
186
|
public lastCtrlCTimeoutId: ReturnType<typeof setTimeout> | null = null;
|
|
187
|
-
/** Long-lived feed context
|
|
187
|
+
/** Long-lived feed context, reused across every feed() call to avoid per-keystroke allocation. */
|
|
188
188
|
public feedContext!: import('./handler-feed.ts').InputFeedContext;
|
|
189
189
|
public commandRegistry: CommandRegistry | null = null;
|
|
190
190
|
public commandContext: CommandContext | undefined = undefined;
|
|
@@ -197,7 +197,7 @@ export class InputHandler implements InputHandlerLike {
|
|
|
197
197
|
public blockActionsMenu = new BlockActionsMenu();
|
|
198
198
|
public settingsModal = new SettingsModal();
|
|
199
199
|
public configModal = new ConfigModal();
|
|
200
|
-
/** item 5
|
|
200
|
+
/** item 5, paste-flood guard state, mutated in place across tokens (never reallocated). */
|
|
201
201
|
private panelBurstGuard: PanelBurstGuardState = { timestamps: [], suspended: false, hintShown: false };
|
|
202
202
|
public mcpWorkspace = new McpWorkspace();
|
|
203
203
|
public onboardingWizard = new OnboardingWizardController();
|
|
@@ -225,7 +225,7 @@ export class InputHandler implements InputHandlerLike {
|
|
|
225
225
|
public conversationManager: ConversationManager | null = null;
|
|
226
226
|
public selectionCallback: SelectionModalCallback | null = null;
|
|
227
227
|
public syncFeedSelectionCallback: ((callback: SelectionModalCallback | null) => void) | null = null;
|
|
228
|
-
/** FIFO queue for overlapping openSelection() calls
|
|
228
|
+
/** FIFO queue for overlapping openSelection() calls, see selection-modal-queue.ts. */
|
|
229
229
|
private selectionQueue!: SelectionModalQueue;
|
|
230
230
|
/** Time of last [COPIED] block feedback, for brief display. */
|
|
231
231
|
public lastBlockCopyTime = 0;
|
|
@@ -283,7 +283,7 @@ export class InputHandler implements InputHandlerLike {
|
|
|
283
283
|
uiServices.providers.providerRegistry,
|
|
284
284
|
);
|
|
285
285
|
// retirement: ProcessModal/LiveTailModal/AgentDetailModal were removed
|
|
286
|
-
|
|
286
|
+
//, F2 now opens the Fleet panel, which subsumes the live process tree.
|
|
287
287
|
this.bookmarkModal = new BookmarkModal(uiServices.shell.bookmarkManager);
|
|
288
288
|
this.sessionPickerModal = new SessionPickerModal(uiServices.sessions.sessionManager, uiServices.sessions.sessionBroker, getSharedHostedSessionRoster(), () => this.requestRender()); // third source: the daemon-hosted roster
|
|
289
289
|
this.profilePickerModal = new ProfilePickerModal(uiServices.shell.profileManager);
|
|
@@ -292,7 +292,7 @@ export class InputHandler implements InputHandlerLike {
|
|
|
292
292
|
}
|
|
293
293
|
|
|
294
294
|
/**
|
|
295
|
-
* initFeedContext
|
|
295
|
+
* initFeedContext, Build the long-lived InputFeedContext once via factory.
|
|
296
296
|
* See feed-context-factory.ts for full field documentation.
|
|
297
297
|
*/
|
|
298
298
|
public initFeedContext(): void {
|
|
@@ -411,7 +411,7 @@ export class InputHandler implements InputHandlerLike {
|
|
|
411
411
|
* openSelection - Open the generic selection modal with a callback.
|
|
412
412
|
* The callback receives SelectionResult on selection, or null on cancel/escape.
|
|
413
413
|
* A second call while one is already showing queues FIFO instead of
|
|
414
|
-
* overwriting it
|
|
414
|
+
* overwriting it, see selection-modal-queue.ts.
|
|
415
415
|
*/
|
|
416
416
|
public openSelection(
|
|
417
417
|
title: string,
|
|
@@ -443,7 +443,7 @@ export class InputHandler implements InputHandlerLike {
|
|
|
443
443
|
public handleBlockSave(): void { handleBlockSaveForHandler(this); }
|
|
444
444
|
public executeBlockAction(actionId: string): void { executeBlockActionForHandler(this, actionId); }
|
|
445
445
|
/** The block the user is actually looking at: the viewport's bottom-most
|
|
446
|
-
* visible line (see getViewportBottomLine's doc)
|
|
446
|
+
* visible line (see getViewportBottomLine's doc), not the raw scrollTop,
|
|
447
447
|
* which is off-screen-above once the transcript exceeds one page. Every
|
|
448
448
|
* anchor-based block action (Ctrl+Y/B/S/A, Tab, the block-actions menu)
|
|
449
449
|
* resolves its target through this, so they all agree on what "nearest
|
|
@@ -585,7 +585,7 @@ export class InputHandler implements InputHandlerLike {
|
|
|
585
585
|
*/
|
|
586
586
|
public clipboardSource: ClipboardPasteSource = { pasteImageFromClipboard, pasteFromClipboard };
|
|
587
587
|
|
|
588
|
-
/** Content width for wrapping
|
|
588
|
+
/** Content width for wrapping, set by main.ts via setContentWidth(). */
|
|
589
589
|
public contentWidth = 76;
|
|
590
590
|
public panelMouseLayout: PanelMouseLayout | null = null;
|
|
591
591
|
|
|
@@ -5,7 +5,7 @@ import { logger } from '@pellux/goodvibes-sdk/platform/utils';
|
|
|
5
5
|
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* InputHistory
|
|
8
|
+
* InputHistory, Persisted command history with arrow-key navigation.
|
|
9
9
|
*
|
|
10
10
|
* Navigation model:
|
|
11
11
|
* position = -1 : not browsing (at the live draft)
|
package/src/input/keybindings.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* KeybindingsManager
|
|
2
|
+
* KeybindingsManager, loads and merges keyboard shortcut configuration.
|
|
3
3
|
*
|
|
4
4
|
* Default bindings are hardcoded here. Users can override any binding by
|
|
5
5
|
* creating ~/.goodvibes/tui/keybindings.json.
|
|
@@ -119,7 +119,7 @@ export const ACTION_DESCRIPTIONS: Record<KeyAction, string> = {
|
|
|
119
119
|
'toggle-keep-awake': 'Toggle keep-awake (the "sleep disabled" chip)',
|
|
120
120
|
'toggle-memory-provenance': 'List/hide the memories a turn used (provenance chip drill-in)',
|
|
121
121
|
// Named for what it actually does. A terminal delivers key EVENTS, not held-key
|
|
122
|
-
// state
|
|
122
|
+
// state, there is no release event to watch, so this is two discrete presses,
|
|
123
123
|
// and the description says so instead of implying a hold that cannot exist.
|
|
124
124
|
'voice-input': 'Voice input: press to start recording, press again to stop and transcribe into the composer',
|
|
125
125
|
};
|
|
@@ -138,7 +138,7 @@ export const DEFAULT_KEYBINDINGS: Record<KeyAction, KeyCombo[]> = {
|
|
|
138
138
|
'panel-close-all': [{ key: 'x', ctrl: true, shift: true }],
|
|
139
139
|
// Ctrl+] stays the primary next-tab chord; Ctrl+PageDown is added as a second
|
|
140
140
|
// binding. Ctrl+[ was REMOVED as prev-tab: it is byte 0x1B (ESC), so the
|
|
141
|
-
// legacy tokenizer path emits it as 'escape'
|
|
141
|
+
// legacy tokenizer path emits it as 'escape', the binding never matched on
|
|
142
142
|
// most terminals AND the key fired Escape (a split-brain chord). Ctrl+PageUp
|
|
143
143
|
// replaces it: Ctrl+PageUp/PageDown tokenize consistently (\x1b[5;5~ /
|
|
144
144
|
// \x1b[6;5~ -> pageup/pagedown ctrl:true) in both the legacy and CSI-u paths.
|
|
@@ -158,7 +158,7 @@ export const DEFAULT_KEYBINDINGS: Record<KeyAction, KeyCombo[]> = {
|
|
|
158
158
|
'panel-tab-8': [{ key: '8', alt: true }],
|
|
159
159
|
'panel-tab-9': [{ key: '9', alt: true }],
|
|
160
160
|
// Ctrl+O: TOGGLE the Fleet panel (open+focus / bring-to-front+focus / close
|
|
161
|
-
|
|
161
|
+
//, see toggleFleetPanel in handler-shortcuts.ts). The former Ops
|
|
162
162
|
// Control panel was retired to an 'ops-control' -> 'fleet' alias; the
|
|
163
163
|
// binding is KEPT (repointed, not removed) so the Ctrl+O muscle memory still
|
|
164
164
|
// lands somewhere useful. Routed globally in handleGlobalShortcutToken.
|
|
@@ -185,7 +185,7 @@ export const DEFAULT_KEYBINDINGS: Record<KeyAction, KeyCombo[]> = {
|
|
|
185
185
|
'undo': [{ key: 'z', ctrl: true }],
|
|
186
186
|
'redo': [{ key: 'z', ctrl: true, shift: true }],
|
|
187
187
|
'paste': [{ key: 'v', ctrl: true }],
|
|
188
|
-
// Word navigation (Alt+B / Alt+F
|
|
188
|
+
// Word navigation (Alt+B / Alt+F, emacs readline standard)
|
|
189
189
|
'word-back': [{ key: 'b', alt: true }],
|
|
190
190
|
'word-forward': [{ key: 'f', alt: true }],
|
|
191
191
|
// Kill-ring operations.
|
|
@@ -214,7 +214,7 @@ export const DEFAULT_KEYBINDINGS: Record<KeyAction, KeyCombo[]> = {
|
|
|
214
214
|
'toggle-memory-provenance': [{ key: 'm', alt: true }],
|
|
215
215
|
// Alt+V: start/stop voice input. Alt+V is unused by any other default (Ctrl+V
|
|
216
216
|
// is paste and stays paste). Two presses rather than a hold: see the action's
|
|
217
|
-
// description
|
|
217
|
+
// description, a terminal has no key-release event to hold against.
|
|
218
218
|
'voice-input': [{ key: 'v', alt: true }],
|
|
219
219
|
};
|
|
220
220
|
|
|
@@ -243,7 +243,7 @@ function resolveKeybindingsPath(options?: KeybindingsManagerOptions): string {
|
|
|
243
243
|
}
|
|
244
244
|
|
|
245
245
|
/**
|
|
246
|
-
* KeybindingsManager
|
|
246
|
+
* KeybindingsManager, owns the resolved keybinding table.
|
|
247
247
|
*
|
|
248
248
|
* Call loadFromDisk() once at startup (in main.ts) to merge user config.
|
|
249
249
|
* Then use matches() anywhere a key token is being evaluated.
|
|
@@ -304,7 +304,7 @@ export class KeybindingsManager {
|
|
|
304
304
|
}
|
|
305
305
|
|
|
306
306
|
/**
|
|
307
|
-
* buildLookupMap
|
|
307
|
+
* buildLookupMap, Rebuild the inverted lookup map from the current bindings table.
|
|
308
308
|
* Called after constructor init and after loadFromDisk().
|
|
309
309
|
* Map key format: "logicalName:ctrl:shift:alt" (booleans as 0/1).
|
|
310
310
|
* Last writer wins for duplicate combos (deterministic: iterate actions in order).
|
|
@@ -320,7 +320,7 @@ export class KeybindingsManager {
|
|
|
320
320
|
}
|
|
321
321
|
|
|
322
322
|
/**
|
|
323
|
-
* lookup
|
|
323
|
+
* lookup, O(1) keybinding lookup by token.
|
|
324
324
|
* Returns the matching KeyAction, or null if no binding matches.
|
|
325
325
|
*/
|
|
326
326
|
lookup(token: { logicalName?: string; ctrl?: boolean; shift?: boolean; alt?: boolean; meta?: boolean }): KeyAction | null {
|
|
@@ -342,7 +342,7 @@ export class KeybindingsManager {
|
|
|
342
342
|
}
|
|
343
343
|
|
|
344
344
|
/**
|
|
345
|
-
* matches
|
|
345
|
+
* matches, Check whether a keyboard token matches the given action.
|
|
346
346
|
*
|
|
347
347
|
* @param action The action to test.
|
|
348
348
|
* @param token The parsed keyboard token from InputTokenizer.
|
|
@@ -370,7 +370,7 @@ export class KeybindingsManager {
|
|
|
370
370
|
}
|
|
371
371
|
|
|
372
372
|
/**
|
|
373
|
-
* getAll
|
|
373
|
+
* getAll, Return the full resolved binding table for display purposes.
|
|
374
374
|
*/
|
|
375
375
|
getAll(): Array<{ action: KeyAction; combos: KeyCombo[]; description: string }> {
|
|
376
376
|
return (Object.keys(this.bindings) as KeyAction[]).map((action) => ({
|
|
@@ -381,7 +381,7 @@ export class KeybindingsManager {
|
|
|
381
381
|
}
|
|
382
382
|
|
|
383
383
|
/**
|
|
384
|
-
* getComboLabel
|
|
384
|
+
* getComboLabel, Return a human-readable label for the first combo of an action.
|
|
385
385
|
* Example: { key: 'f', ctrl: true } → "Ctrl+F"
|
|
386
386
|
*/
|
|
387
387
|
getComboLabel(action: KeyAction): string {
|
|
@@ -391,7 +391,7 @@ export class KeybindingsManager {
|
|
|
391
391
|
}
|
|
392
392
|
|
|
393
393
|
/**
|
|
394
|
-
* formatCombo
|
|
394
|
+
* formatCombo, Format a KeyCombo as a human-readable string.
|
|
395
395
|
*/
|
|
396
396
|
formatCombo(combo: KeyCombo): string {
|
|
397
397
|
const parts: string[] = [];
|
package/src/input/kill-ring.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// KillRing
|
|
2
|
+
// KillRing, emacs/readline-compatible kill ring implementation.
|
|
3
3
|
//
|
|
4
4
|
// The ring holds up to MAX_ENTRIES text strings. Kill commands push to the
|
|
5
5
|
// head. Yank pastes from the current yank pointer (default: head). Yank-pop
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
export const KILL_RING_MAX = 32;
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
|
-
* KillRing
|
|
16
|
+
* KillRing, bounded circular ring of killed text segments.
|
|
17
17
|
*
|
|
18
18
|
* All public mutation methods are pure-functional helpers at module level;
|
|
19
19
|
* this class owns the mutable state so the handler can hold a single ref.
|
|
@@ -41,7 +41,7 @@ export class KillRing {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
|
-
* Yank
|
|
44
|
+
* Yank, return the entry at the current yank pointer.
|
|
45
45
|
* Returns '' if the ring is empty.
|
|
46
46
|
* Sets lastActionWasYank so a subsequent yank-pop is valid.
|
|
47
47
|
*/
|
|
@@ -53,7 +53,7 @@ export class KillRing {
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
|
-
* YankPop
|
|
56
|
+
* YankPop, advance the yank pointer by one step (wrapping) and return the
|
|
57
57
|
* new entry. Only valid after a yank; if the ring has <=1 entry, returns the
|
|
58
58
|
* same string. Returns '' if the ring is empty.
|
|
59
59
|
*/
|
|
@@ -85,7 +85,7 @@ export class KillRing {
|
|
|
85
85
|
// ---------------------------------------------------------------------------
|
|
86
86
|
|
|
87
87
|
/**
|
|
88
|
-
* isWordChar
|
|
88
|
+
* isWordChar, true when the character is a "word" character.
|
|
89
89
|
* Word = letter (Unicode), digit, or underscore. This is the emacs/readline
|
|
90
90
|
* word boundary definition used for Alt+B, Alt+F, Ctrl+W, Alt+D.
|
|
91
91
|
*/
|
|
@@ -94,7 +94,7 @@ function isWordChar(ch: string): boolean {
|
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
/**
|
|
97
|
-
* wordBoundaryBack
|
|
97
|
+
* wordBoundaryBack, find the start of the word that the cursor is in, or the
|
|
98
98
|
* start of the previous word if the cursor is at a non-word character.
|
|
99
99
|
*
|
|
100
100
|
* Emacs Alt+B semantics:
|
|
@@ -106,15 +106,13 @@ function isWordChar(ch: string): boolean {
|
|
|
106
106
|
*/
|
|
107
107
|
export function wordBoundaryBack(text: string, pos: number): number {
|
|
108
108
|
let p = pos;
|
|
109
|
-
// Skip non-word chars first (move past punctuation/spaces)
|
|
110
109
|
while (p > 0 && !isWordChar(text[p - 1]!)) p--;
|
|
111
|
-
// Then skip word chars (the word body)
|
|
112
110
|
while (p > 0 && isWordChar(text[p - 1]!)) p--;
|
|
113
111
|
return p;
|
|
114
112
|
}
|
|
115
113
|
|
|
116
114
|
/**
|
|
117
|
-
* wordBoundaryForward
|
|
115
|
+
* wordBoundaryForward, find the position just past the end of the next word.
|
|
118
116
|
*
|
|
119
117
|
* Emacs Alt+F semantics:
|
|
120
118
|
* - Skip non-word chars forward
|
|
@@ -126,9 +124,7 @@ export function wordBoundaryBack(text: string, pos: number): number {
|
|
|
126
124
|
export function wordBoundaryForward(text: string, pos: number): number {
|
|
127
125
|
let p = pos;
|
|
128
126
|
const len = text.length;
|
|
129
|
-
// Skip non-word chars first
|
|
130
127
|
while (p < len && !isWordChar(text[p]!)) p++;
|
|
131
|
-
// Then skip word chars
|
|
132
128
|
while (p < len && isWordChar(text[p]!)) p++;
|
|
133
129
|
return p;
|
|
134
130
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* model-picker-filter
|
|
2
|
+
* model-picker-filter, pure filtering, sorting, and cache-key helpers for ModelPickerModal.
|
|
3
3
|
*
|
|
4
4
|
* All functions are stateless: they receive inputs and return results without
|
|
5
5
|
* side-effects. The class in model-picker.ts uses these as delegates.
|
|
@@ -139,7 +139,7 @@ export function buildFilteredModels(
|
|
|
139
139
|
result = result.filter(m => m.capabilities?.multimodal === true);
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
-
// Query filter
|
|
142
|
+
// Query filter, fuzzy: every space-separated word must appear somewhere
|
|
143
143
|
if (query.trim().length > 0) {
|
|
144
144
|
const words = query.toLowerCase().split(/\s+/).filter(Boolean);
|
|
145
145
|
result = result.filter(m => {
|
|
@@ -168,7 +168,7 @@ export function buildFilteredModels(
|
|
|
168
168
|
scoreB = bB ? compositeScore(bB.benchmarks) : null;
|
|
169
169
|
}
|
|
170
170
|
} else {
|
|
171
|
-
// swe/gpqa sort
|
|
171
|
+
// swe/gpqa sort, individual scores not available for synthetic models
|
|
172
172
|
const bA = a.provider === 'synthetic' ? null : (benchmarkStore.getBenchmarks(a.id) ?? benchmarkStore.getBenchmarks(a.displayName));
|
|
173
173
|
const bB = b.provider === 'synthetic' ? null : (benchmarkStore.getBenchmarks(b.id) ?? benchmarkStore.getBenchmarks(b.displayName));
|
|
174
174
|
if (benchmarkSort === 'swe') {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* model-picker-items
|
|
2
|
+
* model-picker-items, pure item-building helpers for ModelPickerModal.
|
|
3
3
|
*
|
|
4
4
|
* Converts filtered ModelDefinition/provider arrays into PickerItem lists
|
|
5
5
|
* with group headers, quality-tier badges, pin markers, and configured-via flags.
|
|
@@ -55,7 +55,7 @@ export function getModelGroupKey(
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
// ---------------------------------------------------------------------------
|
|
58
|
-
// toModelItem
|
|
58
|
+
// toModelItem, single model -> PickerItem
|
|
59
59
|
// ---------------------------------------------------------------------------
|
|
60
60
|
|
|
61
61
|
export function toModelItem(
|
|
@@ -94,7 +94,7 @@ export function toModelItem(
|
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
// ---------------------------------------------------------------------------
|
|
97
|
-
// buildModelItems
|
|
97
|
+
// buildModelItems, filtered models -> PickerItem[] with group headers
|
|
98
98
|
// ---------------------------------------------------------------------------
|
|
99
99
|
|
|
100
100
|
export function buildModelItems(
|
|
@@ -151,7 +151,7 @@ export function buildModelItems(
|
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
// ---------------------------------------------------------------------------
|
|
154
|
-
// buildProviderItems
|
|
154
|
+
// buildProviderItems, filtered providers -> PickerItem[] with group headers
|
|
155
155
|
// ---------------------------------------------------------------------------
|
|
156
156
|
|
|
157
157
|
export function buildProviderItems(
|
|
@@ -200,7 +200,7 @@ export function buildProviderItems(
|
|
|
200
200
|
}
|
|
201
201
|
|
|
202
202
|
// ---------------------------------------------------------------------------
|
|
203
|
-
// buildEffortItems
|
|
203
|
+
// buildEffortItems, effort levels -> PickerItem[]
|
|
204
204
|
// ---------------------------------------------------------------------------
|
|
205
205
|
|
|
206
206
|
/**
|
|
@@ -9,7 +9,7 @@ export type PickerMode = 'model' | 'provider' | 'effort' | 'contextCap' | 'embed
|
|
|
9
9
|
* 'tool' -> tools.llmProvider + tools.llmModel (+ tools.llmEnabled: true)
|
|
10
10
|
* 'tts' -> tts.llmProvider + tts.llmModel
|
|
11
11
|
* 'embeddings' -> provider.embeddingProvider, via MemoryEmbeddingProviderRegistry.setDefaultProvider()
|
|
12
|
-
* (not an LLM route
|
|
12
|
+
* (not an LLM route, no model concept, see ModelPickerTargetInfo.configuredNote)
|
|
13
13
|
*/
|
|
14
14
|
export type ModelPickerTarget = 'main' | 'helper' | 'tool' | 'tts' | 'embeddings';
|
|
15
15
|
|
|
@@ -25,7 +25,7 @@ export interface ModelPickerTargetInfo {
|
|
|
25
25
|
readonly inherited: boolean;
|
|
26
26
|
/**
|
|
27
27
|
* Honest override for the "Current:" summary line. Used by the 'embeddings'
|
|
28
|
-
* target (which has no model concept
|
|
28
|
+
* target (which has no model concept, only a provider id + dimensions +
|
|
29
29
|
* configured state) so the renderer never prints a phantom "model:" value.
|
|
30
30
|
* When set, this replaces the computed provider:model route text.
|
|
31
31
|
*/
|
|
@@ -100,7 +100,7 @@ export class ModelPickerModal {
|
|
|
100
100
|
* spec carries a caveat. Null outside effort mode.
|
|
101
101
|
*/
|
|
102
102
|
public effortPresentation: EffortPresentation | null = null;
|
|
103
|
-
/** Entries for PickerMode 'embeddingProvider'
|
|
103
|
+
/** Entries for PickerMode 'embeddingProvider', the 'embeddings' target's own tiny item list. */
|
|
104
104
|
public embeddingProviders: EmbeddingProviderPickerEntry[] = [];
|
|
105
105
|
/** Mode to restore when navigating the targets rail away from 'embeddings'. */
|
|
106
106
|
private nonEmbeddingMode: PickerMode = 'model';
|
|
@@ -124,11 +124,11 @@ export class ModelPickerModal {
|
|
|
124
124
|
public availableOnly = true;
|
|
125
125
|
/** Set of provider names that have a configured key (used for availableOnly filter). */
|
|
126
126
|
public configuredProviders: Set<string> = new Set();
|
|
127
|
-
/** How each provider is configured
|
|
127
|
+
/** How each provider is configured, drives badge display in provider mode. */
|
|
128
128
|
public configuredViaMap: Map<string, 'env' | 'secrets' | 'subscription' | 'anonymous'> = new Map();
|
|
129
|
-
/** IDs of pinned/favorite models
|
|
129
|
+
/** IDs of pinned/favorite models, shown at top of list. */
|
|
130
130
|
public pinnedIds: Set<string> = new Set();
|
|
131
|
-
/** IDs of recently used models
|
|
131
|
+
/** IDs of recently used models, shown after pinned, before the rest. */
|
|
132
132
|
public recentIds: string[] = [];
|
|
133
133
|
/** Benchmark score sort order. */
|
|
134
134
|
public benchmarkSort: BenchmarkSort = 'none';
|
|
@@ -274,13 +274,13 @@ export class ModelPickerModal {
|
|
|
274
274
|
}
|
|
275
275
|
|
|
276
276
|
/**
|
|
277
|
-
* Open showing all models
|
|
277
|
+
* Open showing all models, entry point for /model.
|
|
278
278
|
*
|
|
279
279
|
* Search starts FOCUSED. A live tmux repro showed the actual
|
|
280
|
-
* friction wasn't the filter itself (it already works
|
|
280
|
+
* friction wasn't the filter itself (it already works, fuzzy multi-word
|
|
281
281
|
* substring over id/displayName/provider) but that with search unfocused by
|
|
282
282
|
* default, typing a search term went character-by-character into single-key
|
|
283
|
-
* shortcuts instead (g=group, c=capability, a=available-only, b=benchmark)
|
|
283
|
+
* shortcuts instead (g=group, c=capability, a=available-only, b=benchmark),
|
|
284
284
|
* e.g. typing "claude" silently cycled the capability filter (on 'c') and
|
|
285
285
|
* toggled available-only off (on 'a') while the visible list never
|
|
286
286
|
* filtered, with no error and no indication anything happened. Reaching
|
|
@@ -307,7 +307,7 @@ export class ModelPickerModal {
|
|
|
307
307
|
this.scrollOffset = 0;
|
|
308
308
|
}
|
|
309
309
|
|
|
310
|
-
/** Open showing providers first
|
|
310
|
+
/** Open showing providers first, entry point for /provider. Search starts focused, see openAllModels(). */
|
|
311
311
|
openProviders(providers: string[], currentProvider: string): void {
|
|
312
312
|
this.previousMode = null;
|
|
313
313
|
this.providers = providers;
|
|
@@ -327,9 +327,9 @@ export class ModelPickerModal {
|
|
|
327
327
|
}
|
|
328
328
|
|
|
329
329
|
/**
|
|
330
|
-
* Open the embedding-provider list
|
|
330
|
+
* Open the embedding-provider list, entry point for the 'embeddings' target.
|
|
331
331
|
* Deliberately NOT routed through openAllModels (ModelDefinition-shaped) or
|
|
332
|
-
* openProviders (LLM-provider label resolution)
|
|
332
|
+
* openProviders (LLM-provider label resolution), embedding providers are a
|
|
333
333
|
* flat {id, label, dimensions, configured} list with no model concept, and
|
|
334
334
|
* reusing either existing opener would mislabel or drop unrecognized ids.
|
|
335
335
|
*/
|
|
@@ -356,7 +356,7 @@ export class ModelPickerModal {
|
|
|
356
356
|
this.query = '';
|
|
357
357
|
this.categoryFilter = 'all';
|
|
358
358
|
this.capabilityFilter = 'none';
|
|
359
|
-
// User explicitly chose this provider
|
|
359
|
+
// User explicitly chose this provider, disable availability filter so synthetic
|
|
360
360
|
// models (which have no real API key) are not filtered out.
|
|
361
361
|
this.availableOnly = false;
|
|
362
362
|
this.selectedIndex = 0;
|
|
@@ -521,8 +521,8 @@ export class ModelPickerModal {
|
|
|
521
521
|
* Used for inserting group headers in getItems().
|
|
522
522
|
*
|
|
523
523
|
* For synthetic provider models with groupBy 'provider', returns sub-group keys:
|
|
524
|
-
* - 'Top Models'
|
|
525
|
-
* - 'All Synthetic'
|
|
524
|
+
* - 'Top Models' , benchmark composite score ≥ 0.65 (A-tier or S-tier)
|
|
525
|
+
* - 'All Synthetic', remaining synthetic models
|
|
526
526
|
*/
|
|
527
527
|
getModelGroupKey(model: ModelDefinition): string {
|
|
528
528
|
return getModelGroupKey(model, this.groupBy, this.providerRegistry, this.benchmarkStore);
|
|
@@ -555,7 +555,7 @@ export class ModelPickerModal {
|
|
|
555
555
|
return result;
|
|
556
556
|
}
|
|
557
557
|
if (this.mode === 'embeddingProvider') {
|
|
558
|
-
// Tiny list (typically 2-4 entries)
|
|
558
|
+
// Tiny list (typically 2-4 entries), no caching infrastructure needed.
|
|
559
559
|
// Unconfigured providers are shown honestly (isConfigured: false), never hidden.
|
|
560
560
|
return this.embeddingProviders.map((provider) => ({
|
|
561
561
|
id: provider.id,
|
|
@@ -577,7 +577,7 @@ export class ModelPickerModal {
|
|
|
577
577
|
}
|
|
578
578
|
|
|
579
579
|
/**
|
|
580
|
-
* Move selection up (stops at 0
|
|
580
|
+
* Move selection up (stops at 0, no wrap to avoid going off-screen).
|
|
581
581
|
* Updates scrollOffset to keep selection visible.
|
|
582
582
|
*/
|
|
583
583
|
moveUp(maxVisible = 20): void {
|
|
@@ -587,7 +587,7 @@ export class ModelPickerModal {
|
|
|
587
587
|
this.selectedIndex--;
|
|
588
588
|
this._scrollToSelection(maxVisible);
|
|
589
589
|
}
|
|
590
|
-
// At index 0
|
|
590
|
+
// At index 0, stop. Do NOT wrap to count-1 (that puts selection off-screen).
|
|
591
591
|
}
|
|
592
592
|
|
|
593
593
|
/**
|
|
@@ -632,10 +632,10 @@ export class ModelPickerModal {
|
|
|
632
632
|
*/
|
|
633
633
|
_scrollToSelection(maxVisible: number): void {
|
|
634
634
|
if (this.selectedIndex < this.scrollOffset) {
|
|
635
|
-
// Selection moved above viewport
|
|
635
|
+
// Selection moved above viewport, scroll up
|
|
636
636
|
this.scrollOffset = this.selectedIndex;
|
|
637
637
|
} else if (this.selectedIndex >= this.scrollOffset + maxVisible) {
|
|
638
|
-
// Selection moved below viewport
|
|
638
|
+
// Selection moved below viewport, scroll down
|
|
639
639
|
this.scrollOffset = this.selectedIndex - maxVisible + 1;
|
|
640
640
|
}
|
|
641
641
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Every feature flag that is NOT already reached through a surface/server
|
|
5
5
|
* capability selection (or the HITL experience step) is presented here as ONE
|
|
6
|
-
* unit
|
|
6
|
+
* unit, its enable toggle plus a meaningful subset of its config sub-options,
|
|
7
7
|
* grouped into thematic first-run steps (safety & sandboxing, memory & context,
|
|
8
8
|
* telemetry & observability, automation & initiative, provider & runtime, and a
|
|
9
9
|
* compact advanced-toggles step). Full sub-option depth lives in /settings; each
|
|
@@ -154,7 +154,7 @@ export const FEATURE_ONBOARDING_SECTIONS: readonly FeatureSection[] = [
|
|
|
154
154
|
key: 'source',
|
|
155
155
|
configKey: 'policy.bundleSource' as ConfigKey,
|
|
156
156
|
label: 'Startup bundle source',
|
|
157
|
-
hint: 'none (bundles supplied via commands) or file (load policy.bundlePath
|
|
157
|
+
hint: 'none (bundles supplied via commands) or file (load policy.bundlePath: set it in /settings).',
|
|
158
158
|
valueType: 'enum',
|
|
159
159
|
options: ['none', 'file'],
|
|
160
160
|
defaultValue: 'none',
|
|
@@ -231,7 +231,7 @@ export const FEATURE_ONBOARDING_SECTIONS: readonly FeatureSection[] = [
|
|
|
231
231
|
{
|
|
232
232
|
flagId: 'otel-remote-export',
|
|
233
233
|
label: 'OTLP remote export',
|
|
234
|
-
hint: 'Export spans over OTLP/HTTP JSON to a collector. Enabling this also turns on the OpenTelemetry foundation. Span export reads the OTEL_EXPORTER_OTLP_* environment variables; decision export reads telemetry.decisionOtlpEndpoint
|
|
234
|
+
hint: 'Export spans over OTLP/HTTP JSON to a collector. Enabling this also turns on the OpenTelemetry foundation. Span export reads the OTEL_EXPORTER_OTLP_* environment variables; decision export reads telemetry.decisionOtlpEndpoint: this unit sets the latter.',
|
|
235
235
|
requiresFlags: ['otel-foundation'],
|
|
236
236
|
impliedConfig: [{ key: 'telemetry.decisionOtlpEnabled' as ConfigKey, value: true }],
|
|
237
237
|
subOptions: [
|
|
@@ -284,7 +284,7 @@ export const FEATURE_ONBOARDING_SECTIONS: readonly FeatureSection[] = [
|
|
|
284
284
|
{
|
|
285
285
|
flagId: 'watcher-triggers',
|
|
286
286
|
label: 'Trigger family',
|
|
287
|
-
hint: 'Three unattended watcher kinds over one supervision spine: stream watchers that regex-filter and batch a long-lived command\'s output, model-free condition checks running a probe/extract/rule pipeline with no LLM in the loop, and one-shot on-exit triggers that fire exactly one payload when a launched command terminates. A firing trigger runs an agent turn or a pre-registered digest-pinned action grant
|
|
287
|
+
hint: 'Three unattended watcher kinds over one supervision spine: stream watchers that regex-filter and batch a long-lived command\'s output, model-free condition checks running a probe/extract/rule pipeline with no LLM in the loop, and one-shot on-exit triggers that fire exactly one payload when a launched command terminates. A firing trigger runs an agent turn or a pre-registered digest-pinned action grant; never a command composed at fire time. Off by default because a trigger supervises real processes with nobody watching; with it on and no triggers defined the supervisor idles and consumes nothing.',
|
|
288
288
|
note: 'Backoff ladder, strike breaker, retention bounds, batching and process caps are tuned through watchers.triggers.* in /settings.',
|
|
289
289
|
impliedConfig: [{ key: 'watchers.triggers.enabled' as ConfigKey, value: true }],
|
|
290
290
|
},
|
|
@@ -331,14 +331,14 @@ export const FEATURE_ONBOARDING_SECTIONS: readonly FeatureSection[] = [
|
|
|
331
331
|
{
|
|
332
332
|
flagId: 'paired-device-capabilities',
|
|
333
333
|
label: 'Paired phone capabilities',
|
|
334
|
-
hint: 'Turning this on grants access to nothing by itself
|
|
334
|
+
hint: 'Turning this on grants access to nothing by itself; it lets the agent ASK to use a paired phone as a tool: either camera, its screen, its location, its clipboard, and a small set of device effects (notification, link, buzz). It rides the existing peer transport as a native contract, never an MCP server. Every capture and every effect asks the person holding the phone first, and answering one request grants nothing beyond it; choosing "always allow" is a separate, explicit choice you make later on that prompt, and it writes one durable, revocable grant for that one capability on that one phone, with an age limit and a count cap so nothing is granted forever.',
|
|
335
335
|
note: 'Captures are kept 24 hours by default and then deleted, and every housekeeping sweep records exactly what it removed and why. Retention, grant limits, clipboard and location posture are tuned through device.* in /settings.',
|
|
336
336
|
subOptions: [
|
|
337
337
|
{
|
|
338
338
|
key: 'mode',
|
|
339
339
|
configKey: 'device.capabilities.mode' as ConfigKey,
|
|
340
340
|
label: 'Consent posture',
|
|
341
|
-
hint: 'honor-grants (stock) asks the first time and every time after unless you chose "always allow" for that capability on that phone; ask-every-time prompts on every single request and never consults a durable grant
|
|
341
|
+
hint: 'honor-grants (stock) asks the first time and every time after unless you chose "always allow" for that capability on that phone; ask-every-time prompts on every single request and never consults a durable grant; use it when someone else is holding the phone; off stops any capability request reaching any paired device.',
|
|
342
342
|
valueType: 'enum',
|
|
343
343
|
options: ['off', 'ask-every-time', 'honor-grants'],
|
|
344
344
|
defaultValue: 'honor-grants',
|
|
@@ -349,7 +349,7 @@ export const FEATURE_ONBOARDING_SECTIONS: readonly FeatureSection[] = [
|
|
|
349
349
|
flagId: 'wake-word-detection',
|
|
350
350
|
label: 'Wake-word detection',
|
|
351
351
|
hint: 'Listen continuously on a capture device for the pinned "hey goodvibes" phrase and hand the utterance that follows to speech-to-text. Off by default because holding a microphone open must be an explicit act.',
|
|
352
|
-
note: 'On this terminal, turning this on starts a recorder (pw-record, parecord, arecord, ffmpeg or sox
|
|
352
|
+
note: 'On this terminal, turning this on starts a recorder (pw-record, parecord, arecord, ffmpeg or sox; whichever is installed), scores every frame with the pinned classifier, plays a short chime the moment a wake confirms, and shows a persistent "listening" row in the footer for as long as it runs. What follows a wake goes to speech-to-text and lands in the composer, or is sent straight away if you turn voice.wake.autoSubmit on. The model it scores with is already here: installing GoodVibes downloads and checksum-verifies it, and a running daemon retries at boot if the install could not reach the network, so turning this on normally needs no setup step. What it will NOT do on its own is download anything at the moment you turn it on: a host whose artifacts are missing or fail verification says which and names /voice wake setup, instead of pretending to listen. That same provisioning fetches the speech gate, so voice.wake.vadThreshold above 0 screens frames once it has run and refuses to start before it has, rather than scoring frames it claims to be screening. voice.wake.noiseSuppression: speex runs here too, the filter travels with the platform, so there is nothing to install for it.',
|
|
353
353
|
},
|
|
354
354
|
],
|
|
355
355
|
},
|
|
@@ -447,10 +447,6 @@ function radioOptionsForSubOption(sub: FeatureSubOption): readonly OnboardingWiz
|
|
|
447
447
|
return (sub.options ?? []).map((id) => ({ id, label: id, hint: `Use ${id}.` }));
|
|
448
448
|
}
|
|
449
449
|
|
|
450
|
-
// ---------------------------------------------------------------------------
|
|
451
|
-
// Step builder
|
|
452
|
-
// ---------------------------------------------------------------------------
|
|
453
|
-
|
|
454
450
|
export function buildFeatureUnitStep(
|
|
455
451
|
controller: OnboardingWizardControllerLike,
|
|
456
452
|
section: FeatureSection,
|
|
@@ -512,7 +508,7 @@ export function buildFeatureUnitStep(
|
|
|
512
508
|
summaryTitle: `${section.title} selections`,
|
|
513
509
|
summaryLines: [
|
|
514
510
|
`${enabledCount}/${section.units.length} feature(s) enabled in this step`,
|
|
515
|
-
'Skippable
|
|
511
|
+
'Skippable: the honest defaults above apply if you make no change.',
|
|
516
512
|
'Full sub-option depth for every feature lives in /settings.',
|
|
517
513
|
],
|
|
518
514
|
fields,
|
|
@@ -571,7 +567,7 @@ export function applyFeatureUnitOperations(
|
|
|
571
567
|
}
|
|
572
568
|
// A sub-option that writes the unit's OWN enablement key (e.g. the
|
|
573
569
|
// provider-optimizer routing mode) is the authoritative enablement
|
|
574
|
-
// value
|
|
570
|
+
// value, drop the pending override so the flush cannot clobber it.
|
|
575
571
|
if (wrote && enablementKey !== undefined && sub.configKey === enablementKey) {
|
|
576
572
|
overrides.delete(unit.flagId);
|
|
577
573
|
}
|
|
@@ -15,15 +15,15 @@ import type {
|
|
|
15
15
|
} from './onboarding-wizard-types.ts';
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
|
-
* Providers with a wired in-wizard subscription sign-in flow. This is DATA
|
|
19
|
-
* set of providers whose OAuth login the wizard can start/finish itself
|
|
18
|
+
* Providers with a wired in-wizard subscription sign-in flow. This is DATA, the
|
|
19
|
+
* set of providers whose OAuth login the wizard can start/finish itself, not an
|
|
20
20
|
* assumption that any one vendor is the only subscription option.
|
|
21
21
|
*/
|
|
22
22
|
const SUBSCRIPTION_SIGN_IN_PROVIDER_IDS = new Set<string>(['openai']);
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
* One subscription-status row per subscription-capable provider. The row's copy
|
|
26
|
-
* names the provider from data
|
|
26
|
+
* names the provider from data, never a vendor hardcoded in the field set, so
|
|
27
27
|
* the status surface tracks whatever subscription-capable providers the runtime
|
|
28
28
|
* reports, not a single assumed one.
|
|
29
29
|
*/
|
|
@@ -41,7 +41,7 @@ export function runtimePortDiagnostic(
|
|
|
41
41
|
// The only mode left after every named branch above is 'embedded', and this
|
|
42
42
|
// function reads either endpoint's status (see getRuntimeEndpointStatus):
|
|
43
43
|
// the daemon status can never carry it in this product (adoptOnly is
|
|
44
|
-
// hardcoded
|
|
44
|
+
// hardcoded, see bootstrap.ts), but the HTTP listener's status legitimately
|
|
45
45
|
// does, since the SDK always reports its in-process listener as 'embedded'.
|
|
46
46
|
return `An embedded GoodVibes service is running at ${status.baseUrl}.`;
|
|
47
47
|
}
|
|
@@ -66,7 +66,7 @@ export function isRuntimeEndpointActive(
|
|
|
66
66
|
// This helper serves both endpoints (see handler-onboarding.ts's daemon and
|
|
67
67
|
// httpListener calls), so the 'embedded' arm stays live for httpListener even
|
|
68
68
|
// though a daemon status here is never 'embedded' in this product (adoptOnly
|
|
69
|
-
// is hardcoded
|
|
69
|
+
// is hardcoded, see bootstrap.ts). Dropping the arm would mark a running
|
|
70
70
|
// HTTP listener as inactive.
|
|
71
71
|
if (status) return status.mode === 'embedded' || status.mode === 'external';
|
|
72
72
|
return endpoint === 'daemon'
|
|
@@ -80,7 +80,7 @@ export function isRuntimeEndpointOccupyingConfiguredPort(
|
|
|
80
80
|
): boolean {
|
|
81
81
|
const status = getRuntimeEndpointStatus(state, endpoint);
|
|
82
82
|
// 'incompatible' means a GoodVibes daemon holds the configured port (we just
|
|
83
|
-
// did not adopt it)
|
|
83
|
+
// did not adopt it), the port IS occupied, so report it as such. As with
|
|
84
84
|
// isRuntimeEndpointActive above, 'embedded' stays live here for httpListener
|
|
85
85
|
// (daemon status never carries it in this product).
|
|
86
86
|
if (status) return status.mode === 'embedded' || status.mode === 'external' || status.mode === 'blocked' || status.mode === 'incompatible';
|