@pellux/goodvibes-tui 2.0.14 → 2.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.goodvibes/GOODVIBES.md +1 -1
- package/.goodvibes/agents/reviewer.md +8 -8
- package/.goodvibes/skills/add-provider/SKILL.md +22 -22
- package/CHANGELOG.md +35 -0
- package/README.md +40 -29
- package/docs/README.md +1 -1
- package/docs/foundation-artifacts/README.md +5 -5
- package/docs/foundation-artifacts/operator-contract.json +123 -123
- package/package.json +12 -10
- package/scripts/postinstall.js +3 -3
- package/src/audio/activation-sound.ts +7 -7
- package/src/audio/capture.ts +7 -7
- package/src/audio/onnxruntime-assets.d.ts +1 -1
- package/src/audio/player.ts +4 -4
- package/src/audio/spoken-turn-wiring.ts +4 -4
- package/src/audio/voice-capture-wiring.ts +5 -5
- package/src/audio/voice-input-session.ts +3 -3
- package/src/audio/wake-inference.ts +13 -8
- package/src/audio/wake-runtime.ts +10 -10
- package/src/cli/completions/generate.ts +2 -2
- package/src/cli/doctor.ts +13 -13
- package/src/cli/ensure-goodvibes-gitignore.ts +3 -3
- package/src/cli/entrypoint.ts +3 -3
- package/src/cli/help.ts +6 -6
- package/src/cli/hooks-command.ts +4 -4
- package/src/cli/hooks-report.ts +4 -4
- package/src/cli/launch-auto-update.ts +17 -17
- package/src/cli/management-commands.ts +8 -8
- package/src/cli/management-utils.ts +3 -3
- package/src/cli/management.ts +1 -1
- package/src/cli/plugin-bundles-command.ts +10 -10
- package/src/cli/plugin-command.ts +9 -9
- package/src/cli/service-posture.ts +1 -1
- package/src/cli/status.ts +10 -10
- package/src/cli/surface-command.ts +4 -4
- package/src/cli/tui-startup.ts +23 -23
- package/src/config/run-daemon-config-migration.ts +3 -3
- package/src/config/secret-config.ts +10 -10
- package/src/config/surface.ts +1 -1
- package/src/config/tui-extension-settings.ts +8 -8
- package/src/core/active-model-identity.ts +7 -7
- package/src/core/approval-alert.ts +5 -5
- package/src/core/bookmark-navigation.ts +3 -3
- package/src/core/budget-breach-notifier.ts +6 -6
- package/src/core/compaction-receipt.ts +8 -8
- package/src/core/composer-state.ts +2 -2
- package/src/core/context-usage.ts +1 -1
- package/src/core/conversation-compaction-render.ts +3 -3
- package/src/core/conversation-event-navigation.ts +2 -2
- package/src/core/conversation-fold.ts +9 -9
- package/src/core/conversation-line-cache.ts +14 -14
- package/src/core/conversation-render-context.ts +6 -6
- package/src/core/conversation-rendering.ts +27 -30
- package/src/core/conversation-search-expansion.ts +6 -6
- package/src/core/conversation-splash-state.ts +3 -3
- package/src/core/conversation-turn-structure.ts +13 -13
- package/src/core/conversation-types.ts +3 -3
- package/src/core/conversation-user-receipts.ts +5 -5
- package/src/core/conversation.ts +17 -17
- package/src/core/format-user-error.ts +5 -5
- package/src/core/long-task-notifier.ts +9 -9
- package/src/core/memory-diagnostics-gateway.ts +8 -8
- package/src/core/memory-provenance.ts +5 -5
- package/src/core/model-routing-chip.ts +3 -3
- package/src/core/pairing-tailscale-gateway.ts +3 -3
- package/src/core/permission-mode.ts +5 -5
- package/src/core/power-chip-source.ts +3 -3
- package/src/core/power-status.ts +8 -8
- package/src/core/rewind-receipt.ts +6 -6
- package/src/core/session-resume-core.ts +8 -8
- package/src/core/stream-event-wiring.ts +36 -36
- package/src/core/stream-stall-watchdog.ts +4 -4
- package/src/core/system-message-noise.ts +7 -7
- package/src/core/system-message-router.ts +10 -10
- package/src/core/terminal-notifier.ts +5 -5
- package/src/core/turn-budget-outcome.ts +5 -5
- package/src/core/turn-cancellation.ts +3 -3
- package/src/core/turn-event-wiring.ts +16 -16
- package/src/core/voice-capture-status.ts +2 -2
- package/src/core/voice-provision-gateway.ts +12 -12
- package/src/core/voice-provision-status.ts +19 -19
- package/src/core/voice-stt-gateway.ts +6 -6
- package/src/core/wake-provision-runner.ts +7 -7
- package/src/core/wake-provision-status.ts +17 -17
- package/src/core/workstream-notification.ts +8 -8
- package/src/export/gist-uploader.ts +7 -7
- package/src/input/autocomplete.ts +3 -3
- package/src/input/bookmark-modal.ts +1 -1
- package/src/input/command-args-hint.ts +2 -2
- package/src/input/command-reference.ts +9 -9
- package/src/input/command-registry.ts +32 -32
- package/src/input/commands/acp-runtime.ts +6 -6
- package/src/input/commands/calendar-runtime.ts +9 -9
- package/src/input/commands/channel-pairing.ts +11 -11
- package/src/input/commands/channel-runtime.ts +1 -1
- package/src/input/commands/checkin-runtime.ts +4 -4
- package/src/input/commands/checkpoint-runtime.ts +4 -4
- package/src/input/commands/ci-runtime.ts +4 -4
- package/src/input/commands/cluster-runtime.ts +3 -3
- package/src/input/commands/codebase-runtime.ts +16 -16
- package/src/input/commands/config.ts +6 -6
- package/src/input/commands/connection-status.ts +12 -12
- package/src/input/commands/context-window.ts +2 -2
- package/src/input/commands/cost-attribution-format.ts +4 -4
- package/src/input/commands/cost-runtime.ts +2 -2
- package/src/input/commands/devices-runtime.ts +7 -7
- package/src/input/commands/diff-runtime.ts +2 -2
- package/src/input/commands/editor-runtime.ts +1 -1
- package/src/input/commands/eval.ts +4 -4
- package/src/input/commands/experience-runtime.ts +1 -1
- package/src/input/commands/git-runtime.ts +3 -3
- package/src/input/commands/graph-runtime.ts +3 -3
- package/src/input/commands/guidance-runtime.ts +1 -1
- package/src/input/commands/health-metrics-format.ts +2 -2
- package/src/input/commands/health-runtime.ts +8 -8
- package/src/input/commands/hosted-runtime.ts +13 -13
- package/src/input/commands/image-runtime.ts +6 -6
- package/src/input/commands/intelligence-runtime.ts +2 -2
- package/src/input/commands/local-auth-runtime.ts +3 -3
- package/src/input/commands/local-provider-runtime.ts +3 -3
- package/src/input/commands/local-runtime.ts +7 -7
- package/src/input/commands/mail-runtime.ts +9 -9
- package/src/input/commands/mcp-runtime.ts +1 -1
- package/src/input/commands/memory.ts +13 -13
- package/src/input/commands/notify-runtime.ts +1 -1
- package/src/input/commands/operator-panel-runtime.ts +8 -8
- package/src/input/commands/operator-rpc.ts +3 -3
- package/src/input/commands/operator-runtime.ts +3 -3
- package/src/input/commands/palette-runtime.ts +1 -1
- package/src/input/commands/payment-card-intake.ts +17 -17
- package/src/input/commands/permissions-provenance.ts +7 -7
- package/src/input/commands/permissions-runtime.ts +1 -1
- package/src/input/commands/planning-runtime.ts +9 -9
- package/src/input/commands/platform-services-runtime.ts +2 -2
- package/src/input/commands/policy-dispatch.ts +6 -6
- package/src/input/commands/power-runtime.ts +6 -6
- package/src/input/commands/principals-runtime.ts +3 -3
- package/src/input/commands/product-runtime.ts +3 -3
- package/src/input/commands/profile-render.ts +13 -13
- package/src/input/commands/profile-runtime.ts +13 -13
- package/src/input/commands/profile-types.ts +13 -13
- package/src/input/commands/provider-accounts-runtime.ts +5 -5
- package/src/input/commands/provider.ts +10 -10
- package/src/input/commands/qrcode-runtime.ts +3 -3
- package/src/input/commands/queue-runtime.ts +6 -6
- package/src/input/commands/recall-files-config.ts +4 -4
- package/src/input/commands/recall-files-git.ts +3 -3
- package/src/input/commands/recall-files.ts +12 -12
- package/src/input/commands/recall-query.ts +3 -3
- package/src/input/commands/recall-review.ts +3 -3
- package/src/input/commands/recall-shared.ts +1 -1
- package/src/input/commands/relay-runtime.ts +5 -5
- package/src/input/commands/remote-runtime.ts +3 -3
- package/src/input/commands/review-runtime.ts +8 -8
- package/src/input/commands/rewind-runtime.ts +21 -21
- package/src/input/commands/runtime-services.ts +1 -2
- package/src/input/commands/schedule-nl.ts +2 -2
- package/src/input/commands/schedule-runtime.ts +2 -2
- package/src/input/commands/secret-runtime.ts +3 -3
- package/src/input/commands/session-content.ts +7 -7
- package/src/input/commands/session-picker-filter.ts +3 -3
- package/src/input/commands/session-workflow.ts +10 -10
- package/src/input/commands/session.ts +15 -15
- package/src/input/commands/settings-sync-runtime.ts +2 -2
- package/src/input/commands/share-runtime.ts +4 -4
- package/src/input/commands/shell-core.ts +11 -11
- package/src/input/commands/tasks-runtime.ts +4 -4
- package/src/input/commands/test-runtime.ts +6 -6
- package/src/input/commands/tts-runtime.ts +4 -4
- package/src/input/commands/update-runtime.ts +27 -27
- package/src/input/commands/websearch-runtime.ts +2 -2
- package/src/input/commands/work-plan-runtime.ts +2 -2
- package/src/input/commands/workstream-attempt-dependents.ts +4 -4
- package/src/input/commands/workstream-attempts.ts +16 -16
- package/src/input/commands/workstream-runtime.ts +36 -36
- package/src/input/commands/worktree-runtime.ts +6 -6
- package/src/input/composer-capture.ts +5 -5
- package/src/input/concealed-input.ts +2 -2
- package/src/input/config-modal-types.ts +16 -16
- package/src/input/config-modal.ts +30 -30
- package/src/input/daemon-owned-settings-descriptions.ts +4 -4
- package/src/input/delete-key-policy.ts +1 -1
- package/src/input/exec-env-scrub-config.ts +7 -7
- package/src/input/feature-unit-layout.ts +5 -5
- package/src/input/feed-context-factory.ts +38 -38
- package/src/input/file-picker.ts +1 -1
- package/src/input/handler-command-route.ts +2 -2
- package/src/input/handler-content-actions.ts +8 -8
- package/src/input/handler-feed-routes.ts +13 -13
- package/src/input/handler-feed.ts +31 -31
- package/src/input/handler-interactions.ts +2 -2
- package/src/input/handler-modal-routes.ts +13 -13
- package/src/input/handler-modal-stack.ts +1 -1
- package/src/input/handler-modal-token-routes.ts +1 -1
- package/src/input/handler-onboarding-daemon-adopt.ts +6 -6
- package/src/input/handler-picker-routes.ts +7 -7
- package/src/input/handler-prompt-buffer.ts +1 -1
- package/src/input/handler-shortcuts.ts +12 -12
- package/src/input/handler-types.ts +3 -3
- package/src/input/handler-ui-state.ts +1 -1
- package/src/input/handler.ts +9 -9
- package/src/input/input-history.ts +1 -1
- package/src/input/keybindings.ts +13 -13
- package/src/input/kill-ring.ts +7 -11
- package/src/input/model-picker-filter.ts +3 -3
- package/src/input/model-picker-items.ts +5 -5
- package/src/input/model-picker-types.ts +2 -2
- package/src/input/model-picker.ts +18 -18
- package/src/input/onboarding/onboarding-feature-units.ts +9 -13
- package/src/input/onboarding/onboarding-provider-key-fields.ts +3 -3
- package/src/input/onboarding/onboarding-runtime-status.ts +3 -3
- package/src/input/onboarding/onboarding-wizard-apply.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-cloudflare-step.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-constants.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +4 -4
- package/src/input/onboarding/onboarding-wizard-network-adopt.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-steps.ts +2 -2
- package/src/input/panel-integration-actions.ts +3 -3
- package/src/input/panel-mouse-geometry.ts +1 -1
- package/src/input/panel-paste-flood-guard.ts +9 -9
- package/src/input/payments-config.ts +15 -15
- package/src/input/profile-picker-modal.ts +1 -1
- package/src/input/provider-key-intake.ts +9 -9
- package/src/input/relay-settings-descriptions.ts +3 -3
- package/src/input/sandbox-exec-config.ts +9 -9
- package/src/input/search.ts +18 -18
- package/src/input/selection-modal-queue.ts +10 -10
- package/src/input/selection-modal.ts +2 -2
- package/src/input/session-picker-modal.ts +7 -7
- package/src/input/settings-modal-activation.ts +1 -1
- package/src/input/settings-modal-adjustment.ts +2 -2
- package/src/input/settings-modal-commit.ts +6 -6
- package/src/input/settings-modal-connections.ts +2 -2
- package/src/input/settings-modal-data.ts +29 -29
- package/src/input/settings-modal-mutations.ts +7 -7
- package/src/input/settings-modal-reset.ts +3 -3
- package/src/input/settings-modal-search.ts +6 -6
- package/src/input/settings-modal-secrets.ts +3 -3
- package/src/input/settings-modal-types.ts +16 -16
- package/src/input/settings-modal.ts +4 -4
- package/src/input/voice-local-settings.ts +3 -3
- package/src/input/worktree-setup-config.ts +8 -8
- package/src/main.ts +15 -15
- package/src/panels/agent-inspector-shared.ts +5 -5
- package/src/panels/base-panel.ts +3 -3
- package/src/panels/builtin/agent.ts +3 -3
- package/src/panels/builtin/development.ts +4 -4
- package/src/panels/builtin/knowledge.ts +1 -1
- package/src/panels/builtin/operations.ts +12 -12
- package/src/panels/builtin/session.ts +8 -8
- package/src/panels/builtin/shared.ts +6 -6
- package/src/panels/builtin-modals.ts +8 -8
- package/src/panels/confirm-state.ts +5 -5
- package/src/panels/cost-tracker-panel.ts +22 -22
- package/src/panels/diff-panel.ts +20 -20
- package/src/panels/diff-review-model.ts +5 -5
- package/src/panels/diff-review-panel.ts +5 -5
- package/src/panels/eval-registry.ts +2 -2
- package/src/panels/expandable-list-panel.ts +5 -5
- package/src/panels/fleet-acts.ts +20 -20
- package/src/panels/fleet-deep-link.ts +5 -5
- package/src/panels/fleet-gateway.ts +12 -12
- package/src/panels/fleet-observed-render.ts +11 -11
- package/src/panels/fleet-panel-format.ts +14 -14
- package/src/panels/fleet-panel-worktree-detail.ts +8 -8
- package/src/panels/fleet-panel.ts +34 -34
- package/src/panels/fleet-read-model.ts +49 -49
- package/src/panels/fleet-spawn.ts +15 -15
- package/src/panels/fleet-steer.ts +7 -7
- package/src/panels/fleet-stop.ts +5 -5
- package/src/panels/fleet-tabs.ts +14 -14
- package/src/panels/fleet-transcript.ts +26 -26
- package/src/panels/git-panel.ts +8 -8
- package/src/panels/hosted-session-feed.ts +13 -13
- package/src/panels/hosted-session-panel.ts +7 -7
- package/src/panels/index.ts +1 -1
- package/src/panels/local-auth-panel.ts +15 -15
- package/src/panels/memory-consolidation-gateway.ts +8 -8
- package/src/panels/modals/devices-modal.ts +8 -8
- package/src/panels/modals/hooks-modal.ts +1 -1
- package/src/panels/modals/keybindings-modal.ts +5 -5
- package/src/panels/modals/knowledge-modal.ts +2 -2
- package/src/panels/modals/local-auth-modal.ts +4 -4
- package/src/panels/modals/marketplace-modal.ts +3 -3
- package/src/panels/modals/memory-modal.ts +19 -19
- package/src/panels/modals/modal-surface-helpers.ts +1 -1
- package/src/panels/modals/modal-theme.ts +3 -3
- package/src/panels/modals/pairing-modal.ts +19 -19
- package/src/panels/modals/planning-modal.ts +4 -4
- package/src/panels/modals/plugins-modal.ts +1 -1
- package/src/panels/modals/policy-modal.ts +4 -4
- package/src/panels/modals/provider-health-modal.ts +1 -1
- package/src/panels/modals/remote-modal.ts +1 -1
- package/src/panels/modals/sandbox-modal.ts +2 -2
- package/src/panels/modals/security-modal.ts +4 -4
- package/src/panels/modals/services-modal.ts +1 -1
- package/src/panels/modals/work-plan-modal.ts +4 -4
- package/src/panels/notifications-feed.ts +6 -6
- package/src/panels/notifications-panel.ts +6 -6
- package/src/panels/panel-confirm-overlay.ts +4 -4
- package/src/panels/panel-manager.ts +13 -13
- package/src/panels/plugins-panel.ts +6 -6
- package/src/panels/polish-core.ts +2 -2
- package/src/panels/polish-tables.ts +2 -2
- package/src/panels/polish.ts +1 -1
- package/src/panels/project-planning-answer-actions.ts +3 -3
- package/src/panels/scrollable-list-panel.ts +15 -15
- package/src/panels/search-focus.ts +1 -1
- package/src/panels/session-maintenance.ts +1 -1
- package/src/panels/skills-panel.ts +3 -3
- package/src/panels/token-budget-panel.ts +11 -11
- package/src/panels/types.ts +14 -14
- package/src/panels/workstream-graph-render.ts +5 -5
- package/src/panels/wrfc-panel-format.ts +1 -1
- package/src/permissions/broker-approval-card.ts +13 -13
- package/src/permissions/hunk-selection.ts +13 -13
- package/src/permissions/prompt.ts +22 -22
- package/src/permissions/sandbox-exec-gate.ts +5 -5
- package/src/providers/provider-classification.ts +1 -1
- package/src/providers/reasoning-effort-surface.ts +12 -12
- package/src/renderer/ansi-sanitize.ts +5 -6
- package/src/renderer/autocomplete-overlay.ts +5 -5
- package/src/renderer/block-actions-overlay.ts +1 -1
- package/src/renderer/bookmark-modal.ts +1 -1
- package/src/renderer/code-block.ts +2 -2
- package/src/renderer/compaction-history-modal.ts +4 -4
- package/src/renderer/compaction-preview.ts +5 -5
- package/src/renderer/compaction-quality.ts +5 -5
- package/src/renderer/composer-fragments.ts +6 -6
- package/src/renderer/compositor.ts +9 -9
- package/src/renderer/config-modal.ts +3 -3
- package/src/renderer/context-inspector.ts +1 -1
- package/src/renderer/context-status-hint.ts +10 -10
- package/src/renderer/conversation-layout.ts +2 -2
- package/src/renderer/conversation-overlays.ts +2 -2
- package/src/renderer/conversation-surface.ts +6 -6
- package/src/renderer/diff.ts +4 -4
- package/src/renderer/fleet-tab-strip.ts +2 -2
- package/src/renderer/footer-tips.ts +4 -4
- package/src/renderer/fullscreen-primitives.ts +1 -1
- package/src/renderer/git-status.ts +5 -5
- package/src/renderer/header-line.ts +5 -5
- package/src/renderer/help-overlay.ts +5 -5
- package/src/renderer/hint-grammar.ts +2 -2
- package/src/renderer/layout.ts +1 -1
- package/src/renderer/markdown-inline.ts +3 -3
- package/src/renderer/markdown-table.ts +7 -7
- package/src/renderer/modal-factory.ts +3 -3
- package/src/renderer/model-picker-overlay.ts +2 -2
- package/src/renderer/model-workspace.ts +7 -7
- package/src/renderer/onboarding/onboarding-wizard.ts +1 -1
- package/src/renderer/overlay-box.ts +1 -1
- package/src/renderer/panel-composite.ts +5 -5
- package/src/renderer/panel-workspace-bar.ts +1 -1
- package/src/renderer/process-indicator.ts +8 -8
- package/src/renderer/profile-picker-modal.ts +3 -3
- package/src/renderer/prompt-content-width.ts +1 -1
- package/src/renderer/search-overlay.ts +3 -3
- package/src/renderer/selection-modal-overlay.ts +6 -6
- package/src/renderer/semantic-diff.ts +6 -7
- package/src/renderer/session-picker-modal.ts +24 -24
- package/src/renderer/settings-modal-connections.ts +3 -3
- package/src/renderer/settings-modal-helpers.ts +16 -16
- package/src/renderer/settings-modal.ts +10 -10
- package/src/renderer/shell-surface.ts +8 -8
- package/src/renderer/status-glyphs.ts +6 -6
- package/src/renderer/syntax-highlighter.ts +2 -3
- package/src/renderer/system-message.ts +3 -3
- package/src/renderer/tab-strip.ts +2 -2
- package/src/renderer/term-caps.ts +12 -12
- package/src/renderer/terminal-bg-probe.ts +10 -10
- package/src/renderer/terminal-escapes.ts +1 -1
- package/src/renderer/theme-mode-config.ts +3 -3
- package/src/renderer/theme.ts +34 -34
- package/src/renderer/thinking.ts +1 -1
- package/src/renderer/tool-call.ts +5 -5
- package/src/renderer/tool-result-expanded-lines.ts +3 -3
- package/src/renderer/tool-result-summary.ts +6 -6
- package/src/renderer/turn-injection.ts +9 -9
- package/src/renderer/ui-factory.ts +33 -33
- package/src/renderer/ui-primitives.ts +4 -4
- package/src/runtime/bootstrap-command-parts.ts +3 -3
- package/src/runtime/bootstrap-core.ts +21 -21
- package/src/runtime/bootstrap-hook-bridge.ts +8 -8
- package/src/runtime/bootstrap-shell.ts +9 -9
- package/src/runtime/bootstrap.ts +16 -16
- package/src/runtime/client/approval-updates.ts +3 -3
- package/src/runtime/client/build-floors.ts +7 -7
- package/src/runtime/client/daemon-attach-handshake.ts +5 -5
- package/src/runtime/client/fleet-union.ts +7 -7
- package/src/runtime/client/host-service-status.ts +2 -2
- package/src/runtime/client/hosted-exit.ts +4 -4
- package/src/runtime/client/hosted-roster.ts +4 -4
- package/src/runtime/client/hosted-session-stream.ts +5 -5
- package/src/runtime/client/hosted-sessions.ts +8 -8
- package/src/runtime/client/operator-endpoint.ts +14 -14
- package/src/runtime/client/spine-adoption.ts +8 -8
- package/src/runtime/context-accounting-source.ts +4 -4
- package/src/runtime/context.ts +2 -2
- package/src/runtime/conversation-rewind-port.ts +6 -6
- package/src/runtime/credential-composition.ts +2 -2
- package/src/runtime/daemon-attach-notices.ts +6 -6
- package/src/runtime/diagnostics/panels/index.ts +1 -1
- package/src/runtime/diagnostics/panels/ops.ts +2 -2
- package/src/runtime/disposal-wiring.ts +6 -6
- package/src/runtime/index.ts +11 -11
- package/src/runtime/install-self-check-startup.ts +4 -4
- package/src/runtime/install-self-check.ts +6 -6
- package/src/runtime/interaction-seams.ts +4 -4
- package/src/runtime/knowledge-services.ts +2 -2
- package/src/runtime/legacy-daemon-migration.ts +37 -37
- package/src/runtime/legacy-daemon-reconcile.ts +30 -30
- package/src/runtime/memory-governance-services.ts +3 -3
- package/src/runtime/memory-spine-transport.ts +3 -3
- package/src/runtime/notification-dispatch.ts +4 -4
- package/src/runtime/onboarding/apply.ts +1 -1
- package/src/runtime/onboarding/derivation.ts +1 -1
- package/src/runtime/onboarding/fast-path.ts +7 -7
- package/src/runtime/onboarding/progress.ts +2 -2
- package/src/runtime/onboarding/provider-key-capture.ts +4 -4
- package/src/runtime/onboarding/snapshot.ts +2 -2
- package/src/runtime/onboarding/state.ts +4 -4
- package/src/runtime/onboarding/types.ts +4 -4
- package/src/runtime/orchestrator-core-services.ts +5 -5
- package/src/runtime/path-shadow-startup.ts +3 -3
- package/src/runtime/perf/panel-contracts.ts +1 -1
- package/src/runtime/power-keepawake-remote.ts +6 -6
- package/src/runtime/process-lifecycle.ts +14 -14
- package/src/runtime/provider-fallback.ts +3 -3
- package/src/runtime/recovery-autosave.ts +3 -3
- package/src/runtime/recovery-decisions.ts +19 -19
- package/src/runtime/recovery-offer-wiring.ts +4 -4
- package/src/runtime/recovery-prompt.ts +20 -20
- package/src/runtime/relay-reachability-bridge.ts +3 -3
- package/src/runtime/release-artifacts.ts +1 -1
- package/src/runtime/resume-notice.ts +20 -20
- package/src/runtime/runtime-services-types.ts +20 -20
- package/src/runtime/services.ts +20 -20
- package/src/runtime/session-continuity-hints.ts +1 -1
- package/src/runtime/session-inbound-inputs.ts +12 -12
- package/src/runtime/session-resume-liveness-confirm.ts +4 -4
- package/src/runtime/session-spine-transport.ts +3 -3
- package/src/runtime/store/domains/panels.ts +2 -2
- package/src/runtime/store/domains/ui-perf.ts +2 -2
- package/src/runtime/store/index.ts +1 -1
- package/src/runtime/store/selectors/index.ts +1 -1
- package/src/runtime/store/state.ts +2 -2
- package/src/runtime/ui-services.ts +3 -3
- package/src/runtime/workspace-checkpointing.ts +3 -3
- package/src/runtime/wrfc-persistence.ts +15 -15
- package/src/scripts/process-messages.ts +1 -1
- package/src/shell/blocking-input.ts +9 -9
- package/src/shell/recovery-input-helpers.ts +2 -2
- package/src/shell/retry-affordance.ts +9 -9
- package/src/shell/ui-openers.ts +14 -14
- package/src/shell/voice-capture-shell.ts +3 -3
- package/src/tools/wrfc-agent-guard.ts +4 -4
- package/src/utils/browser.ts +2 -2
- package/src/utils/format-duration.ts +3 -3
- package/src/utils/format-number.ts +2 -2
- package/src/utils/splash-lines.ts +4 -4
- package/src/utils/terminal-width.ts +6 -6
- package/src/verification/verification-ledger.ts +25 -25
- package/src/version.ts +3 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// gist-uploader
|
|
2
|
+
// gist-uploader, upload export content to a GitHub Gist
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
//
|
|
5
5
|
// Architecture: UploadTarget interface with a single GistUploadTarget
|
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
// UploadTarget without changing the caller in share-runtime.
|
|
8
8
|
//
|
|
9
9
|
// Token resolution:
|
|
10
|
-
// 1. serviceRegistry.resolveAuth('github')
|
|
10
|
+
// 1. serviceRegistry.resolveAuth('github'), standard service registry path
|
|
11
11
|
// (configured via .goodvibes/tui/services.json with tokenKey: GITHUB_TOKEN)
|
|
12
12
|
// 2. process.env.GITHUB_TOKEN fallback
|
|
13
13
|
// 3. No token → honest guidance; no upload.
|
|
14
14
|
//
|
|
15
|
-
// Privacy: Gist is created as secret=true (unlisted, not private
|
|
15
|
+
// Privacy: Gist is created as secret=true (unlisted, not private, anyone with
|
|
16
16
|
// the URL can view it).
|
|
17
17
|
// ---------------------------------------------------------------------------
|
|
18
18
|
|
|
@@ -23,7 +23,7 @@ export type UploadResult =
|
|
|
23
23
|
| { ok: false; error: string };
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
|
-
* UploadTarget
|
|
26
|
+
* UploadTarget, interface for pluggable export upload backends.
|
|
27
27
|
* Future HTTP PUT / other targets implement this.
|
|
28
28
|
*/
|
|
29
29
|
export interface UploadTarget {
|
|
@@ -41,7 +41,7 @@ export interface GistUploaderOptions {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
|
-
* resolveGithubToken
|
|
44
|
+
* resolveGithubToken, try auth header map then env var.
|
|
45
45
|
* Returns undefined when no token is available.
|
|
46
46
|
*/
|
|
47
47
|
export function resolveGithubToken(
|
|
@@ -65,7 +65,7 @@ export function resolveGithubToken(
|
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
/**
|
|
68
|
-
* GistUploadTarget
|
|
68
|
+
* GistUploadTarget, uploads content to a secret (unlisted) GitHub Gist.
|
|
69
69
|
*/
|
|
70
70
|
export class GistUploadTarget implements UploadTarget {
|
|
71
71
|
private readonly token: string;
|
|
@@ -127,7 +127,7 @@ export class GistUploadTarget implements UploadTarget {
|
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
/**
|
|
130
|
-
* noTokenGuidance
|
|
130
|
+
* noTokenGuidance, message printed when no GitHub PAT is found.
|
|
131
131
|
*/
|
|
132
132
|
export const NO_TOKEN_GUIDANCE = [
|
|
133
133
|
'No GitHub token found for --upload.',
|
|
@@ -20,7 +20,7 @@ export interface AutocompleteState {
|
|
|
20
20
|
selectedIndex: number;
|
|
21
21
|
/**
|
|
22
22
|
* (item 4): how many leading entries of `results` belong to the
|
|
23
|
-
* curated "common" tier
|
|
23
|
+
* curated "common" tier, only meaningful when `query === ''` (0
|
|
24
24
|
* otherwise, since a typed filter searches everything and the common/rest
|
|
25
25
|
* split no longer applies). The renderer uses this to draw a separator
|
|
26
26
|
* before the alphabetical rest.
|
|
@@ -57,11 +57,11 @@ export class AutocompleteEngine {
|
|
|
57
57
|
this.state.results = this.registry.fuzzyMatch(query);
|
|
58
58
|
this.state.active = true;
|
|
59
59
|
// fuzzyMatch('') sorts the curated common tier first (score 2),
|
|
60
|
-
// then the alphabetical rest (score 1)
|
|
60
|
+
// then the alphabetical rest (score 1), both tiers alphabetical within
|
|
61
61
|
// themselves. Count the leading common run to tell the renderer where to
|
|
62
62
|
// draw the separator. A non-empty query means every command was scored on
|
|
63
63
|
// its actual match quality, not tier, so the common/rest split does not
|
|
64
|
-
// apply
|
|
64
|
+
// apply, the resulting 0 is not a real answer to "how many are common"
|
|
65
65
|
// and is unused because renderAutocompleteOverlay itself gates on the
|
|
66
66
|
// query string too, but zeroing here keeps the field internally honest.
|
|
67
67
|
let commonCount = 0;
|
|
@@ -4,8 +4,8 @@ import { CLUSTER_SUBCOMMAND_ARG_HINTS } from './commands/cluster-runtime.ts';
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Per-command subcommand → argument-hint maps. `session`'s entries come
|
|
7
|
-
* straight from session.ts (SESSION_SUBCOMMAND_ARG_HINTS)
|
|
8
|
-
* the `/session` switch itself is built from
|
|
7
|
+
* straight from session.ts (SESSION_SUBCOMMAND_ARG_HINTS), the same table
|
|
8
|
+
* the `/session` switch itself is built from, so the two can never drift
|
|
9
9
|
* apart; the others are hand-maintained here since they're small and their
|
|
10
10
|
* owning modules don't export an equivalent table. A drift test
|
|
11
11
|
* (src/test/input/command-args-hint.test.ts) checks every top-level key
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* command-reference.ts
|
|
2
|
+
* command-reference.ts, pure renderer for the generated slash-command
|
|
3
3
|
* reference (docs/commands-reference.md).
|
|
4
4
|
*
|
|
5
5
|
* The reference is generated from the live command registry (via
|
|
6
6
|
* {@link categorizeBuiltinCommands} in ./commands.ts), never hand-maintained.
|
|
7
7
|
* This module is deliberately side-effect free so both the generator
|
|
8
8
|
* (scripts/project-surfaces.ts) and the drift-check test import the same
|
|
9
|
-
* rendering logic
|
|
9
|
+
* rendering logic, the committed file and a fresh render must be byte-identical
|
|
10
10
|
* or the gate fails.
|
|
11
11
|
*/
|
|
12
12
|
import type { SlashCommand } from './command-registry.ts';
|
|
@@ -31,10 +31,10 @@ function slug(text: string): string {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
|
-
* renderCommandReferenceMarkdown
|
|
34
|
+
* renderCommandReferenceMarkdown, deterministic markdown for the full command
|
|
35
35
|
* set. Categories are sorted alphabetically and commands alphabetically by
|
|
36
36
|
* primary name within each category, so the output depends only on the command
|
|
37
|
-
* set and their metadata
|
|
37
|
+
* set and their metadata, not on registration order, which keeps the drift
|
|
38
38
|
* check meaningful (a genuinely new/renamed command moves the bytes; a pure
|
|
39
39
|
* reordering does not).
|
|
40
40
|
*/
|
|
@@ -50,7 +50,7 @@ export function renderCommandReferenceMarkdown(entries: readonly CategorizedComm
|
|
|
50
50
|
const total = entries.length;
|
|
51
51
|
|
|
52
52
|
const lines: string[] = [];
|
|
53
|
-
lines.push('<!-- GENERATED FILE
|
|
53
|
+
lines.push('<!-- GENERATED FILE: DO NOT EDIT BY HAND.');
|
|
54
54
|
lines.push(' Regenerate with `bun run docs:commands`.');
|
|
55
55
|
lines.push(' Source of truth: the slash-command registry (src/input/commands.ts).');
|
|
56
56
|
lines.push(' A drift check (src/test/release-gates/command-reference-gate.test.ts)');
|
|
@@ -69,7 +69,7 @@ export function renderCommandReferenceMarkdown(entries: readonly CategorizedComm
|
|
|
69
69
|
lines.push('');
|
|
70
70
|
for (const category of categories) {
|
|
71
71
|
const count = byCategory.get(category)?.length ?? 0;
|
|
72
|
-
lines.push(`- [${escapeCell(category)}](#${slug(category)})
|
|
72
|
+
lines.push(`- [${escapeCell(category)}](#${slug(category)}): ${count}`);
|
|
73
73
|
}
|
|
74
74
|
lines.push('');
|
|
75
75
|
|
|
@@ -83,10 +83,10 @@ export function renderCommandReferenceMarkdown(entries: readonly CategorizedComm
|
|
|
83
83
|
const name = `\`/${escapeCell(cmd.name)}\``;
|
|
84
84
|
const aliases = (cmd.aliases ?? []).length > 0
|
|
85
85
|
? (cmd.aliases ?? []).map((a) => `\`/${escapeCell(a)}\``).join(', ')
|
|
86
|
-
: '
|
|
86
|
+
: 'None';
|
|
87
87
|
const usageText = cmd.usage ?? cmd.argsHint ?? '';
|
|
88
|
-
const usage = usageText ? `\`${escapeCell(usageText)}\`` : '
|
|
89
|
-
const description = cmd.description ? escapeCell(cmd.description) : '
|
|
88
|
+
const usage = usageText ? `\`${escapeCell(usageText)}\`` : 'None';
|
|
89
|
+
const description = cmd.description ? escapeCell(cmd.description) : 'None';
|
|
90
90
|
lines.push(`| ${name} | ${aliases} | ${usage} | ${description} |`);
|
|
91
91
|
}
|
|
92
92
|
lines.push('');
|
|
@@ -55,7 +55,7 @@ export interface CommandRuntimeState {
|
|
|
55
55
|
sessionId: string;
|
|
56
56
|
/**
|
|
57
57
|
* Cumulative count of direct terminal writes the output guard intercepted
|
|
58
|
-
* this session
|
|
58
|
+
* this session, surfaced by /debug. Optional so the SDK's MutableRuntimeState
|
|
59
59
|
* (which has no such field) stays assignable; the guard sets it lazily on the
|
|
60
60
|
* shared runtime object. (item 1a.)
|
|
61
61
|
*/
|
|
@@ -83,7 +83,7 @@ export interface CommandUiActions {
|
|
|
83
83
|
};
|
|
84
84
|
/**
|
|
85
85
|
* Read-only view of pending `[TEXT: pN, M lines]` fold markers currently
|
|
86
|
-
* sitting in the composer (registerPaste in handler-content-actions.ts)
|
|
86
|
+
* sitting in the composer (registerPaste in handler-content-actions.ts),
|
|
87
87
|
* backs /pastes, which previews a folded paste's actual content before the
|
|
88
88
|
* user submits it. A paste over the fold threshold is otherwise invisible
|
|
89
89
|
* until the LLM sees it.
|
|
@@ -95,7 +95,7 @@ export interface CommandUiActions {
|
|
|
95
95
|
cancelGeneration?: () => void;
|
|
96
96
|
/**
|
|
97
97
|
* Cancel JUST the currently-running tool call (the live transcript row),
|
|
98
|
-
* leaving the turn to continue
|
|
98
|
+
* leaving the turn to continue, the local-session equivalent of the
|
|
99
99
|
* sessions.toolCalls.cancel wire verb over the in-process orchestrator.
|
|
100
100
|
* Returns true when a running call was found and cancelled.
|
|
101
101
|
*/
|
|
@@ -114,7 +114,7 @@ export interface CommandUiActions {
|
|
|
114
114
|
* terminal delivers key events and never key-release state.
|
|
115
115
|
*/
|
|
116
116
|
toggleVoiceInput?: () => void;
|
|
117
|
-
/** The current host sleep-ownership projection (power.status.get, flattened)
|
|
117
|
+
/** The current host sleep-ownership projection (power.status.get, flattened), chip, held-because, lid-split. */
|
|
118
118
|
getPowerState?: () => import('../core/power-status.ts').PowerSurfaceState;
|
|
119
119
|
/** Set the daemon-held keep-awake toggle (power.keepAwake.set), acquiring/releasing the inhibitor live; returns the new state. */
|
|
120
120
|
setKeepAwake?: (enabled: boolean) => Promise<import('../core/power-status.ts').PowerSurfaceState>;
|
|
@@ -128,7 +128,7 @@ export interface CommandUiActions {
|
|
|
128
128
|
/** Which config target to write the selected model to. Defaults to 'main'. */
|
|
129
129
|
target?: import('./model-picker.ts').ModelPickerTarget;
|
|
130
130
|
/**
|
|
131
|
-
* True only when `effort` came from the picker's effort STEP
|
|
131
|
+
* True only when `effort` came from the picker's effort STEP, an explicit
|
|
132
132
|
* user choice, which is the only thing allowed to update the stored
|
|
133
133
|
* preference `provider.reasoningEffort`. The model-only and context-cap
|
|
134
134
|
* commit routes pass a level merely carried over from the previous model;
|
|
@@ -139,7 +139,7 @@ export interface CommandUiActions {
|
|
|
139
139
|
/**
|
|
140
140
|
* Commit an embedding-provider selection from the model picker's
|
|
141
141
|
* 'embeddingProvider' mode (the 'embeddings' target). Deliberately separate
|
|
142
|
-
* from completeModelSelection
|
|
142
|
+
* from completeModelSelection, embedding providers are not
|
|
143
143
|
* ModelDefinition-shaped, so routing them through the same commit path
|
|
144
144
|
* would require fabricating a fake model object.
|
|
145
145
|
*/
|
|
@@ -157,7 +157,7 @@ export interface CommandUiActions {
|
|
|
157
157
|
* Force a full-screen repaint on the next frame (reuses Compositor.resetDiff(),
|
|
158
158
|
* the same call resize/bootstrap already use). Defense-in-depth for command
|
|
159
159
|
* handlers whose spawned subprocess may have written to the real tty (e.g. a
|
|
160
|
-
* stderr-capture regression)
|
|
160
|
+
* stderr-capture regression), nulls the diff buffers so the next composite()
|
|
161
161
|
* repaints over any stray output instead of leaving it until an unrelated resize.
|
|
162
162
|
*/
|
|
163
163
|
requestFullRepaint?: () => void;
|
|
@@ -175,7 +175,7 @@ export interface CommandShellUiOpeners {
|
|
|
175
175
|
jumpToBookmark?: (key: string) => void;
|
|
176
176
|
scrollToLine?: (line: number) => void;
|
|
177
177
|
openHelpOverlay?: () => void;
|
|
178
|
-
/** Toggle the transcript search overlay (same action as Ctrl+F)
|
|
178
|
+
/** Toggle the transcript search overlay (same action as Ctrl+F), backs /find. */
|
|
179
179
|
openTranscriptSearch?: () => void;
|
|
180
180
|
openSelection?: (
|
|
181
181
|
title: string,
|
|
@@ -185,7 +185,7 @@ export interface CommandShellUiOpeners {
|
|
|
185
185
|
) => void;
|
|
186
186
|
openSettingsModal?: (target?: string) => void;
|
|
187
187
|
/**
|
|
188
|
-
* Open a MIGRATE-TO-MODAL surface by name (purge skeleton
|
|
188
|
+
* Open a MIGRATE-TO-MODAL surface by name (purge skeleton, B
|
|
189
189
|
* command runtimes call this instead of openCommandPanel once their panel
|
|
190
190
|
* is converted to a ModalFactory config). Threaded from ui-openers.ts the
|
|
191
191
|
* same way openSettingsModal is.
|
|
@@ -197,7 +197,7 @@ export interface CommandShellUiOpeners {
|
|
|
197
197
|
getScrollTop?: () => number;
|
|
198
198
|
openPanelPicker?: () => void;
|
|
199
199
|
/**
|
|
200
|
-
* Open the fuzzy command palette
|
|
200
|
+
* Open the fuzzy command palette, a searchable picker over every registered
|
|
201
201
|
* slash command (generated live from the registry). Bound to Ctrl+K and the
|
|
202
202
|
* /palette command. Selecting a command pre-fills it into the composer.
|
|
203
203
|
*/
|
|
@@ -207,16 +207,16 @@ export interface CommandShellUiOpeners {
|
|
|
207
207
|
* truth as the generated command reference (categorizeBuiltinCommands),
|
|
208
208
|
* memoized by the shell. Lets registry-driven surfaces built inside command
|
|
209
209
|
* handlers (/help) group by category without importing the aggregation
|
|
210
|
-
* module
|
|
210
|
+
* module, a static import there would cycle (commands.ts registers those
|
|
211
211
|
* very handlers).
|
|
212
212
|
*/
|
|
213
213
|
getCommandCategories?: () => ReadonlyMap<string, string>;
|
|
214
214
|
/**
|
|
215
215
|
* Open (and optionally focus) a panel. focus rule: the command path is
|
|
216
|
-
* "the user is mid-command-flow"
|
|
216
|
+
* "the user is mid-command-flow", opening a panel this way leaves keyboard
|
|
217
217
|
* focus in the composer by default. Pass `{ focus: true }` for a caller that
|
|
218
218
|
* genuinely wants to grab focus (chords use panelManager.focusPanels()
|
|
219
|
-
* directly instead of this method, so no current call site needs it
|
|
219
|
+
* directly instead of this method, so no current call site needs it, but
|
|
220
220
|
* the intent is explicit rather than implicit here). `target` is a
|
|
221
221
|
* fleet deep-link jump target forwarded to PanelManager.open.
|
|
222
222
|
*/
|
|
@@ -265,17 +265,17 @@ export interface CommandSessionServices {
|
|
|
265
265
|
* fresh Orchestrator's zeroed default.
|
|
266
266
|
*/
|
|
267
267
|
readonly hydrateSessionUsage?: () => void;
|
|
268
|
-
/** The orchestration engine's command-facing facade
|
|
268
|
+
/** The orchestration engine's command-facing facade, see runtime/workstream-services.ts. */
|
|
269
269
|
readonly workstreamEngine?: import('@pellux/goodvibes-sdk/platform/orchestration').WorkstreamCommandService;
|
|
270
|
-
/** The repo source-tree code index
|
|
270
|
+
/** The repo source-tree code index, see runtime/code-index-services.ts. */
|
|
271
271
|
readonly codeIndexStore?: import('@pellux/goodvibes-sdk/platform/state').CodeIndexStore;
|
|
272
|
-
/** Tool-site reindex scheduler
|
|
272
|
+
/** Tool-site reindex scheduler, `/codebase status` reports its last activity. */
|
|
273
273
|
readonly codeIndexReindexScheduler?: import('@pellux/goodvibes-sdk/platform/state').CodeIndexReindexScheduler;
|
|
274
|
-
/** Whether the (default-off) `agent-passive-code-injection` flag is on
|
|
274
|
+
/** Whether the (default-off) `agent-passive-code-injection` flag is on, for `/codebase status`. */
|
|
275
275
|
readonly isPassiveCodeInjectionFlagEnabled?: () => boolean;
|
|
276
276
|
/**
|
|
277
277
|
* The MAIN interactive session's per-turn passive-injection
|
|
278
|
-
* honesty ring
|
|
278
|
+
* honesty ring, `Orchestrator.getTurnInjections()`, the main-session
|
|
279
279
|
* counterpart to `AgentRecord.turnInjections`. `/recall injections`
|
|
280
280
|
* with no agent id reads this. Optional so command contexts built without an
|
|
281
281
|
* orchestrator (headless, tests) fall back to the honest empty state.
|
|
@@ -297,8 +297,8 @@ export interface CommandProviderServices {
|
|
|
297
297
|
export interface CommandWorkspaceUiServices {
|
|
298
298
|
/**
|
|
299
299
|
* The app's declare-once session-storage handle (runtime/services.ts). Every
|
|
300
|
-
* command that reads or writes session state
|
|
301
|
-
* markers, the rewind anchor sidecar
|
|
300
|
+
* command that reads or writes session state, resume, save, the liveness
|
|
301
|
+
* markers, the rewind anchor sidecar, takes its paths from here instead of
|
|
302
302
|
* re-deriving a scope from shellPaths, so a command can never land on a
|
|
303
303
|
* different directory than the runtime that wrote the file.
|
|
304
304
|
*/
|
|
@@ -306,7 +306,7 @@ export interface CommandWorkspaceUiServices {
|
|
|
306
306
|
keybindingsManager?: KeybindingsManager;
|
|
307
307
|
fileUndoManager?: FileUndoManager;
|
|
308
308
|
workspaceCheckpointManager?: WorkspaceCheckpointManager;
|
|
309
|
-
/** In-process gateway catalog
|
|
309
|
+
/** In-process gateway catalog, the /review hunk-revert flow invokes checkpoints.revertHunk(Preview) over it. */
|
|
310
310
|
gatewayMethods?: GatewayMethodCatalog;
|
|
311
311
|
workspaceTrustManager?: import('@pellux/goodvibes-sdk/platform/runtime/operations').WorkspaceTrustManager;
|
|
312
312
|
workspaceRegistrationManager?: import('@pellux/goodvibes-sdk/platform/runtime/operations').WorkspaceRegistrationManager;
|
|
@@ -325,15 +325,15 @@ export interface CommandWorkspaceServices
|
|
|
325
325
|
export interface CommandPlatformConfigServices {
|
|
326
326
|
readonly config: DeepReadonly<GoodVibesConfig>;
|
|
327
327
|
readonly configManager: ConfigManager;
|
|
328
|
-
/** Per-device pairing tokens
|
|
328
|
+
/** Per-device pairing tokens, backs the /devices command family. */
|
|
329
329
|
readonly pairingTokens?: import('@pellux/goodvibes-sdk/platform/pairing').PairingTokenManager;
|
|
330
|
-
/** Capability gate runtime
|
|
330
|
+
/** Capability gate runtime, feature states derive from domain settings keys; surfaces read live/pending state here. */
|
|
331
331
|
readonly featureFlagManager?: FeatureFlagManager;
|
|
332
332
|
readonly voiceProviderRegistry?: VoiceProviderRegistry;
|
|
333
333
|
readonly voiceService?: VoiceService;
|
|
334
334
|
/** Direct-command consumer (`/search`) alongside the existing agent-tool consumer. */
|
|
335
335
|
readonly webSearchService?: import('@pellux/goodvibes-sdk/platform/web-search').WebSearchService;
|
|
336
|
-
/** Direct-command consumer (`/image`)
|
|
336
|
+
/** Direct-command consumer (`/image`), first production caller of `.generate()`. */
|
|
337
337
|
readonly mediaProviders?: import('@pellux/goodvibes-sdk/platform/media').MediaProviderRegistry;
|
|
338
338
|
readonly artifactStore?: import('@pellux/goodvibes-sdk/platform/artifacts').ArtifactStore;
|
|
339
339
|
/** Background daemon/HTTP-listener/relay controller. Mutable: main.ts patches it in post-bootstrap (see bootstrap-command-parts.ts ordering note). */
|
|
@@ -378,8 +378,8 @@ export interface CommandContext
|
|
|
378
378
|
readonly knowledgeApi?: KnowledgeApi;
|
|
379
379
|
/**
|
|
380
380
|
* The cross-surface memory spine client (SDK 1.2.0 full-detach). `/recall`'s
|
|
381
|
-
* browse/link/queue/export/import subcommands read and write through this
|
|
382
|
-
* not `knowledgeApi.memory
|
|
381
|
+
* browse/link/queue/export/import subcommands read and write through this,
|
|
382
|
+
* not `knowledgeApi.memory`, so they fully detach from the local store file
|
|
383
383
|
* when a daemon has been adopted, per
|
|
384
384
|
* docs/decisions/2026-07-06-memory-wire-full-detach.md in the SDK repo.
|
|
385
385
|
* `explain` and the `vector` diagnostic subcommand stay on `knowledgeApi.memory`
|
|
@@ -403,9 +403,9 @@ export interface CommandContext
|
|
|
403
403
|
/**
|
|
404
404
|
* palette curation (item 4): the "common" first tier the slash-command
|
|
405
405
|
* autocomplete dropdown shows before the alphabetical rest when it opens with
|
|
406
|
-
* no filter typed yet (bare '/')
|
|
406
|
+
* no filter typed yet (bare '/'), the "132-command palette unranked"
|
|
407
407
|
* evaluator finding. Typed filtering (any non-empty query) is completely
|
|
408
|
-
* unaffected
|
|
408
|
+
* unaffected, fuzzyMatch still searches every registered command exactly as
|
|
409
409
|
* before; this only reorders the empty-query case. Curated for breadth across
|
|
410
410
|
* the product's main workflows rather than raw usage frequency: help/config
|
|
411
411
|
* (orientation), panel/model (workspace + provider), recall/codebase/search
|
|
@@ -446,7 +446,7 @@ export class CommandRegistry {
|
|
|
446
446
|
/**
|
|
447
447
|
* Register a command. Also indexes all aliases for O(1) lookup.
|
|
448
448
|
* Throws if the primary name or any alias collides with an existing
|
|
449
|
-
* registration
|
|
449
|
+
* registration, silent last-write-wins previously shadowed whole
|
|
450
450
|
* commands, so collisions must fail fast at startup (and are caught
|
|
451
451
|
* statically by the alias lint test).
|
|
452
452
|
*/
|
|
@@ -454,9 +454,9 @@ export class CommandRegistry {
|
|
|
454
454
|
// Every registered command is rendered with its description in /help, the
|
|
455
455
|
// command palette, and the generated reference (docs/commands-reference.md).
|
|
456
456
|
// A blank description would ship an unexplained row in all three, so it
|
|
457
|
-
// fails fast here
|
|
457
|
+
// fails fast here, the release gate red-tests this invariant.
|
|
458
458
|
if (!command.description || command.description.trim().length === 0) {
|
|
459
|
-
throw new Error(`Command registration for "${command.name}" has no description
|
|
459
|
+
throw new Error(`Command registration for "${command.name}" has no description: every command must describe itself.`);
|
|
460
460
|
}
|
|
461
461
|
const existingByName = this.commands.get(command.name) ?? this.aliasIndex.get(command.name);
|
|
462
462
|
if (existingByName) {
|
|
@@ -527,7 +527,7 @@ export class CommandRegistry {
|
|
|
527
527
|
|
|
528
528
|
if (bestScore > 0 || q === '') {
|
|
529
529
|
// with no query yet, rank the curated common tier (score 2)
|
|
530
|
-
// ahead of everything else (score 1)
|
|
530
|
+
// ahead of everything else (score 1), the tie-break below then sorts
|
|
531
531
|
// each tier alphabetically, so the result is "common tier, then the
|
|
532
532
|
// alphabetical rest" rather than one flat alphabetical list.
|
|
533
533
|
const score = q === '' ? (COMMON_COMMAND_NAMES.has(cmd.name) ? 2 : 1) : bestScore;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// acp-runtime.ts
|
|
2
|
+
// acp-runtime.ts, the scripted path for hosting third-party coding agents,
|
|
3
3
|
// over the SAME verbs the Fleet panel's spawn affordance drives (acp.agents.list
|
|
4
4
|
// / acp.sessions.create). `/agents list` shows what the daemon discovered
|
|
5
5
|
// (read-only, quiet when none); `/agents host <agentId> [dir]` spawns one as a
|
|
6
6
|
// long-lived daemon session that shows up as an acp-agent fleet row. A working
|
|
7
7
|
// directory defaults to the current one; a known workspace root can be named
|
|
8
|
-
// instead
|
|
8
|
+
// instead, but no path is ever required beyond what the operator already has.
|
|
9
9
|
//
|
|
10
10
|
// A structured spawn failure ({binary, stage, message}) is printed verbatim,
|
|
11
11
|
// never left as a hung row: the daemon bounds the handshake and returns a
|
|
@@ -37,7 +37,7 @@ export function registerAcpRuntimeCommands(registry: CommandRegistry): void {
|
|
|
37
37
|
}
|
|
38
38
|
ctx.print([
|
|
39
39
|
'Discovered ACP agents (host with /agents host <id> [directory]):',
|
|
40
|
-
...agents.map((a) => ` ${a.id}
|
|
40
|
+
...agents.map((a) => ` ${a.id}: ${a.title} (${a.binaryPath})`),
|
|
41
41
|
].join('\n'));
|
|
42
42
|
} catch (error) {
|
|
43
43
|
ctx.print(`[agents list] ${describeOperatorRpcError(error)}`);
|
|
@@ -55,11 +55,11 @@ export function registerAcpRuntimeCommands(registry: CommandRegistry): void {
|
|
|
55
55
|
try {
|
|
56
56
|
const { hosted, started } = await rpc.sdk.operator.invoke('acp.sessions.create', { agentId, cwd });
|
|
57
57
|
if (hosted.error) {
|
|
58
|
-
// Structured failure, verbatim
|
|
59
|
-
ctx.print(`[agents host] Could not host ${hosted.title || agentId}: ${hosted.error.stage} stage failed for ${hosted.error.binary}
|
|
58
|
+
// Structured failure, verbatim, never a hung row.
|
|
59
|
+
ctx.print(`[agents host] Could not host ${hosted.title || agentId}: ${hosted.error.stage} stage failed for ${hosted.error.binary}; ${hosted.error.message}`);
|
|
60
60
|
return;
|
|
61
61
|
}
|
|
62
|
-
ctx.print(`[agents host] Hosting ${hosted.title || agentId} in ${cwd}${started ? '' : ' (queued)'}
|
|
62
|
+
ctx.print(`[agents host] Hosting ${hosted.title || agentId} in ${cwd}${started ? '' : ' (queued)'}; it appears as an acp-agent row in the fleet; steer and stop it like any agent.`);
|
|
63
63
|
} catch (error) {
|
|
64
64
|
ctx.print(`[agents host] ${describeOperatorRpcError(error)}`);
|
|
65
65
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* calendar-runtime.ts
|
|
2
|
+
* calendar-runtime.ts, `/calendar`, the terminal surface over the daemon's
|
|
3
3
|
* calendar capability.
|
|
4
4
|
*
|
|
5
5
|
* As with `/mail`, no calendar logic lives here. CalDAV, ICS parsing, settings
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* nuisance to undo.
|
|
18
18
|
*
|
|
19
19
|
* `calendar.ics.import` and `calendar.ics.export` are deliberately NOT given a
|
|
20
|
-
* command. They are bulk file-level transfers of a whole calendar
|
|
20
|
+
* command. They are bulk file-level transfers of a whole calendar, an
|
|
21
21
|
* operation whose natural home is a file path and a scheduled job, not a line
|
|
22
22
|
* typed into a coding session. They stay available to any surface through the
|
|
23
23
|
* same catalog; this product simply does not claim to be the right place for
|
|
@@ -52,7 +52,7 @@ const MAX_LIST_LIMIT = 200;
|
|
|
52
52
|
* Render a timestamp for a terminal agenda.
|
|
53
53
|
*
|
|
54
54
|
* An unparseable value is printed verbatim rather than replaced with a
|
|
55
|
-
* placeholder
|
|
55
|
+
* placeholder, showing what the server actually returned is more useful than
|
|
56
56
|
* hiding it behind "invalid date".
|
|
57
57
|
*/
|
|
58
58
|
export function formatWhen(raw: string): string {
|
|
@@ -70,12 +70,12 @@ function truncate(value: string, width: number): string {
|
|
|
70
70
|
|
|
71
71
|
export function renderAgenda(events: readonly CalendarEvent[]): string {
|
|
72
72
|
if (events.length === 0) return 'No events in this window.';
|
|
73
|
-
const lines = [`Agenda
|
|
73
|
+
const lines = [`Agenda: ${events.length} event${events.length === 1 ? '' : 's'}:`];
|
|
74
74
|
for (const event of events) {
|
|
75
75
|
const where = event.location ? ` @ ${truncate(event.location, 24)}` : '';
|
|
76
76
|
lines.push(` ${formatWhen(event.start)} ${truncate(event.title, 44).padEnd(44)}${where}`);
|
|
77
77
|
}
|
|
78
|
-
lines.push('', ' /calendar get <id
|
|
78
|
+
lines.push('', ' /calendar get <id>: open one event');
|
|
79
79
|
return lines.join('\n');
|
|
80
80
|
}
|
|
81
81
|
|
|
@@ -95,7 +95,7 @@ export function renderEvent(event: CalendarEvent): string {
|
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
/**
|
|
98
|
-
* Split `title | start | end` on unescaped pipes
|
|
98
|
+
* Split `title | start | end` on unescaped pipes, same separator rule as
|
|
99
99
|
* `/mail`, for the same reason: titles contain spaces and per-command quoting
|
|
100
100
|
* conventions are their own bug source.
|
|
101
101
|
*/
|
|
@@ -188,7 +188,7 @@ async function listEvents(ctx: CommandContext, gateway: Gateway, limit: number,
|
|
|
188
188
|
ctx.print(renderConnectionStatus({
|
|
189
189
|
surface: 'calendar',
|
|
190
190
|
state: 'ready',
|
|
191
|
-
detail: 'Calendar is connected
|
|
191
|
+
detail: 'Calendar is connected: the daemon reached the server and returned a result.',
|
|
192
192
|
nextActions: [],
|
|
193
193
|
}));
|
|
194
194
|
}
|
|
@@ -198,7 +198,7 @@ async function listEvents(ctx: CommandContext, gateway: Gateway, limit: number,
|
|
|
198
198
|
|
|
199
199
|
async function getEvent(ctx: CommandContext, gateway: Gateway, eventId: string | undefined): Promise<void> {
|
|
200
200
|
if (!eventId) {
|
|
201
|
-
ctx.print('Usage: /calendar get <id
|
|
201
|
+
ctx.print('Usage: /calendar get <id>; the id from /calendar list.');
|
|
202
202
|
return;
|
|
203
203
|
}
|
|
204
204
|
await withStatusOnFailure(ctx, gateway, 'get', async () => {
|
|
@@ -217,7 +217,7 @@ async function createEvent(ctx: CommandContext, gateway: Gateway, rest: readonly
|
|
|
217
217
|
if (parsed === null) {
|
|
218
218
|
ctx.print([
|
|
219
219
|
'Usage: /calendar create <title | start | end>',
|
|
220
|
-
' Three fields separated by
|
|
220
|
+
' Three fields separated by |, for example:',
|
|
221
221
|
' /calendar create Design review | 2026-08-01T14:00:00Z | 2026-08-01T15:00:00Z',
|
|
222
222
|
].join('\n'));
|
|
223
223
|
return;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* channel-pairing.ts
|
|
2
|
+
* channel-pairing.ts, guided `/channel pair` flow.
|
|
3
3
|
*
|
|
4
4
|
* Adapters and their credential requirements are driven from the SDK's
|
|
5
|
-
* getBuiltinSetupSchema
|
|
5
|
+
* getBuiltinSetupSchema, the same setup-schema source every GoodVibes
|
|
6
6
|
* consumer (TUI, webui, agent) reads, not a hand-maintained list here.
|
|
7
7
|
* Secret (masked) credentials are stored the same secure way onboarding
|
|
8
8
|
* stores them, via persistSecretBackedConfigValue (secret manager + a
|
|
@@ -25,7 +25,7 @@ import { persistSecretBackedConfigValue } from '../../config/secret-config.ts';
|
|
|
25
25
|
import { describeOperatorRpcError, getOperatorRpc } from './operator-rpc.ts';
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
|
-
* Surfaces pairable through /channel pair
|
|
28
|
+
* Surfaces pairable through /channel pair, every ChannelSurface except the
|
|
29
29
|
* two internal render surfaces ('tui', 'web'), which are not externally
|
|
30
30
|
* paired channels. The `satisfies Record<...>` shape makes this exhaustive:
|
|
31
31
|
* a new ChannelSurface value that isn't listed here fails to compile.
|
|
@@ -71,7 +71,7 @@ function fieldConfigured(field: ChannelSetupFieldDescriptor, configManager: Conf
|
|
|
71
71
|
return fieldValue(field, configManager).length > 0;
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
/** Credential fields the user must supply
|
|
74
|
+
/** Credential fields the user must supply, secret (masked) and plain text; booleans/selects are defaulted. */
|
|
75
75
|
function credentialFields(schema: ChannelSetupSchema): ChannelSetupFieldDescriptor[] {
|
|
76
76
|
return schema.fields.filter((field) => field.kind === 'secret' || field.kind === 'string' || field.kind === 'url' || field.kind === 'number');
|
|
77
77
|
}
|
|
@@ -87,7 +87,7 @@ function fieldHint(field: ChannelSetupFieldDescriptor, schema: ChannelSetupSchem
|
|
|
87
87
|
|
|
88
88
|
function listAdapters(ctx: CommandContext): void {
|
|
89
89
|
const configManager = ctx.platform.configManager;
|
|
90
|
-
const lines: string[] = ['Channel adapters
|
|
90
|
+
const lines: string[] = ['Channel adapters: pair with /channel pair <surface>:', ''];
|
|
91
91
|
for (const surface of PAIRABLE_SURFACES) {
|
|
92
92
|
const schema = getBuiltinSetupSchema(surface);
|
|
93
93
|
const creds = credentialFields(schema);
|
|
@@ -108,7 +108,7 @@ function renderSurface(schema: ChannelSetupSchema, configManager: ConfigManager)
|
|
|
108
108
|
const configured = fieldConfigured(field, configManager);
|
|
109
109
|
const kindTag = field.kind === 'secret' ? 'secret' : 'value';
|
|
110
110
|
const status = configured ? 'set' : 'not set';
|
|
111
|
-
lines.push(` - ${field.label} (${kindTag}): ${status}
|
|
111
|
+
lines.push(` - ${field.label} (${kindTag}): ${status}; ${fieldHint(field, schema)}`);
|
|
112
112
|
}
|
|
113
113
|
if (schema.externalSteps.length > 0) {
|
|
114
114
|
lines.push('', 'External setup steps:');
|
|
@@ -143,7 +143,7 @@ function promptMissingSecrets(
|
|
|
143
143
|
ctx.print('[pair] Concealed input is unavailable on this surface; set credentials via /config and re-run verify.');
|
|
144
144
|
return;
|
|
145
145
|
}
|
|
146
|
-
ctx.print(`[pair] Enter ${field.label} (${field.placeholder || 'value'})
|
|
146
|
+
ctx.print(`[pair] Enter ${field.label} (${field.placeholder || 'value'}): masked; Enter to store, Esc to stop.`);
|
|
147
147
|
ctx.beginConcealedInput({
|
|
148
148
|
label: field.label,
|
|
149
149
|
onSubmit: (value) => {
|
|
@@ -171,7 +171,7 @@ function promptMissingSecrets(
|
|
|
171
171
|
/**
|
|
172
172
|
* Verify a surface: report which declared credentials resolve locally, then
|
|
173
173
|
* perform a REAL round-trip through the daemon (channels.test.send) and
|
|
174
|
-
* report the actual delivered/error outcome
|
|
174
|
+
* report the actual delivered/error outcome, never a fabricated success.
|
|
175
175
|
*/
|
|
176
176
|
async function verifySurface(ctx: CommandContext, schema: ChannelSetupSchema): Promise<void> {
|
|
177
177
|
const configManager = ctx.platform.configManager;
|
|
@@ -181,7 +181,7 @@ async function verifySurface(ctx: CommandContext, schema: ChannelSetupSchema): P
|
|
|
181
181
|
for (const field of creds) {
|
|
182
182
|
const ok = fieldConfigured(field, configManager);
|
|
183
183
|
if (!ok) missing.push(field);
|
|
184
|
-
lines.push(` ${ok ? '[ok] ' : '[fail]'} ${field.label}${ok ? '' : '
|
|
184
|
+
lines.push(` ${ok ? '[ok] ' : '[fail]'} ${field.label}${ok ? '' : '; missing'}`);
|
|
185
185
|
}
|
|
186
186
|
lines.push('');
|
|
187
187
|
if (missing.length === 0) {
|
|
@@ -203,7 +203,7 @@ async function verifySurface(ctx: CommandContext, schema: ChannelSetupSchema): P
|
|
|
203
203
|
if (result.delivered) {
|
|
204
204
|
ctx.print(`[verify] delivered:true${result.responseId ? ` (responseId: ${result.responseId})` : ''}${result.address ? ` → ${result.address}` : ''}`);
|
|
205
205
|
} else {
|
|
206
|
-
ctx.print(`[verify] delivered:false
|
|
206
|
+
ctx.print(`[verify] delivered:false; ${result.error ?? 'the daemon returned no error detail'}`);
|
|
207
207
|
}
|
|
208
208
|
} catch (error) {
|
|
209
209
|
ctx.print(`[verify] round-trip request failed: ${describeOperatorRpcError(error)}`);
|
|
@@ -240,6 +240,6 @@ export async function runChannelPairing(args: readonly string[], ctx: CommandCon
|
|
|
240
240
|
ctx.print(`\nNo missing secrets. Verify with: /channel pair ${schema.surface} verify`);
|
|
241
241
|
return;
|
|
242
242
|
}
|
|
243
|
-
ctx.print(`\nEntering ${missingSecrets.length} secret credential(s)
|
|
243
|
+
ctx.print(`\nEntering ${missingSecrets.length} secret credential(s): Esc to stop.`);
|
|
244
244
|
promptMissingSecrets(ctx, schema, missingSecrets, 0);
|
|
245
245
|
}
|
|
@@ -231,7 +231,7 @@ export function registerChannelRuntimeCommands(registry: CommandRegistry): void
|
|
|
231
231
|
if (sub === 'policy') {
|
|
232
232
|
const configManager = ctx.platform.configManager;
|
|
233
233
|
// Channel policy is persisted by ChannelPolicyManager in
|
|
234
|
-
// .goodvibes/tui/channels/policies.json
|
|
234
|
+
// .goodvibes/tui/channels/policies.json, surface via configManager
|
|
235
235
|
// category (runtime-accessible without a daemon round-trip).
|
|
236
236
|
const surfaces = [
|
|
237
237
|
'slack', 'discord', 'ntfy', 'webhook', 'homeassistant',
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* checkin-runtime.ts
|
|
3
3
|
*
|
|
4
|
-
* `/checkin
|
|
4
|
+
* `/checkin`, the proactive check-in surface: config (enabled/cadence/
|
|
5
5
|
* delivery channel/quiet hours) and its receipt trail, over the operator
|
|
6
6
|
* wire (see operator-rpc.ts for why this goes over HTTP rather than the
|
|
7
|
-
* in-process OperatorClient facade). Off by default; every run
|
|
8
|
-
* or manual
|
|
7
|
+
* in-process OperatorClient facade). Off by default; every run, scheduled
|
|
8
|
+
* or manual, leaves a receipt (`checkin.receipts.list`) recording whether it
|
|
9
9
|
* stayed quiet, delivered a message, or was skipped, so the config surface
|
|
10
10
|
* in /config's Automation group is never the only place this feature's
|
|
11
11
|
* behavior is visible.
|
|
@@ -79,7 +79,7 @@ export function registerCheckinRuntimeCommands(registry: CommandRegistry): void
|
|
|
79
79
|
lines.push('Recent receipts:');
|
|
80
80
|
lines.push(...receipts.map(renderReceipt));
|
|
81
81
|
}
|
|
82
|
-
lines.push('', ' /checkin run
|
|
82
|
+
lines.push('', ' /checkin run: trigger one now');
|
|
83
83
|
ctx.print(lines.join('\n'));
|
|
84
84
|
} catch (error) {
|
|
85
85
|
ctx.print(`[checkin] ${describeOperatorRpcError(error)}`);
|