@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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// checkpoint-runtime.ts
|
|
2
|
+
// checkpoint-runtime.ts, /checkpoints, /checkpoint
|
|
3
3
|
//
|
|
4
4
|
// UX over WorkspaceCheckpointManager (@pellux/goodvibes-sdk/platform/workspace),
|
|
5
5
|
// the whole-workspace, git-backed snapshot engine wired onto RuntimeServices as
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
//
|
|
9
9
|
// Restoring a checkpoint is now done through the unified, message-anchored
|
|
10
10
|
// /rewind (rewind-runtime.ts), which rewinds files AND/OR conversation to a
|
|
11
|
-
// completed turn
|
|
11
|
+
// completed turn, reusing this same checkpoint store for the files half.
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
13
13
|
|
|
14
14
|
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
|
|
@@ -77,7 +77,7 @@ export function registerCheckpointRuntimeCommands(registry: CommandRegistry): vo
|
|
|
77
77
|
// them would cost one diff spawn per checkpoint (O(checkpoints)), which
|
|
78
78
|
// stops being cheap once there are more than a handful. /rewind <id>
|
|
79
79
|
// loads exactly one diff, so the exact file list is available there.
|
|
80
|
-
ctx.print('Use /rewind to preview and restore a completed turn (files and/or conversation)
|
|
80
|
+
ctx.print('Use /rewind to preview and restore a completed turn (files and/or conversation); it reuses these checkpoints for the files half. With no completed turns recorded this run (e.g. right after a restart), /rewind falls back to restoring one of these checkpoints directly, by number or id; files only, no conversation state.');
|
|
81
81
|
},
|
|
82
82
|
});
|
|
83
83
|
|
|
@@ -96,7 +96,7 @@ export function registerCheckpointRuntimeCommands(registry: CommandRegistry): vo
|
|
|
96
96
|
try {
|
|
97
97
|
const checkpoint = await mgr.create({ kind: 'manual', label, retentionClass: 'forensic' });
|
|
98
98
|
if (!checkpoint) {
|
|
99
|
-
ctx.print('No changes since the last checkpoint
|
|
99
|
+
ctx.print('No changes since the last checkpoint; nothing to save.');
|
|
100
100
|
return;
|
|
101
101
|
}
|
|
102
102
|
ctx.print(`Checkpoint created: ${shortId(checkpoint.id)} "${checkpoint.label}" (forensic retention).`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ci-runtime.ts
|
|
3
3
|
*
|
|
4
|
-
* `/ci
|
|
4
|
+
* `/ci`, the CI-watch surface: a one-shot per-job status check (`ci.status`)
|
|
5
5
|
* and standing watches (`ci.watches.*`) over the operator wire (see
|
|
6
6
|
* operator-rpc.ts for why this goes over HTTP rather than the in-process
|
|
7
7
|
* OperatorClient facade). The doctrine, verbatim from the operator contract's
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* violations and force the verdict off 'passed'." `platform/ci-watch` (the
|
|
11
11
|
* module implementing that doctrine server-side) is not in this SDK's public
|
|
12
12
|
* export map yet, so the per-job rendering below is a thin, doctrine-faithful
|
|
13
|
-
* mirror of the contract's own `ci.status`/`ci.watches.run` output
|
|
13
|
+
* mirror of the contract's own `ci.status`/`ci.watches.run` output, every job
|
|
14
14
|
* name and conclusion listed individually, never summarized.
|
|
15
15
|
*/
|
|
16
16
|
import type { CommandRegistry } from '../command-registry.ts';
|
|
@@ -83,7 +83,7 @@ export function renderWatch(watch: CiWatchSubscription): string {
|
|
|
83
83
|
export function registerCiRuntimeCommands(registry: CommandRegistry): void {
|
|
84
84
|
registry.register({
|
|
85
85
|
name: 'ci',
|
|
86
|
-
description: 'CI-watch: one-shot per-job status and standing watches over the operator
|
|
86
|
+
description: 'CI-watch: one-shot per-job status and standing watches over the operator panel',
|
|
87
87
|
usage: 'status <repo-or-pr> | watch <repo-or-pr> <deliveryChannel> [--fix-session] | watches | unwatch <id>',
|
|
88
88
|
argsHint: '[status|watch|watches|unwatch]',
|
|
89
89
|
async handler(args, ctx) {
|
|
@@ -158,7 +158,7 @@ export function registerCiRuntimeCommands(registry: CommandRegistry): void {
|
|
|
158
158
|
lines.push(`fix-session triggered: ${result.fixSessionTriggered ? 'yes' : 'no'}`);
|
|
159
159
|
ctx.print(lines.join('\n'));
|
|
160
160
|
// Route the spawned session through the shared one-key jump affordance
|
|
161
|
-
// instead of printing the id for the user to retype
|
|
161
|
+
// instead of printing the id for the user to retype, same attach flow
|
|
162
162
|
// as the accepted fix-this card.
|
|
163
163
|
if (result.fixSessionId) ctx.armFixSessionAttach?.(result.fixSessionId);
|
|
164
164
|
} catch (error) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* cluster-runtime.ts
|
|
2
|
+
* cluster-runtime.ts, `/cluster` in the TUI.
|
|
3
3
|
*
|
|
4
4
|
* The same operations as the `goodvibes-daemon cluster` subcommands, reaching
|
|
5
5
|
* the same daemon verbs through the same caller. There is no cluster logic in
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*
|
|
9
9
|
* The one honest difference is `join` without arguments. The CLI can stop and
|
|
10
10
|
* ask which group and for the join key; a slash command has nowhere to ask, so
|
|
11
|
-
* it requires `--group` and `--key` and says so
|
|
11
|
+
* it requires `--group` and `--key` and says so, which is exactly what the
|
|
12
12
|
* shared caller already reports for any non-interactive invocation.
|
|
13
13
|
*/
|
|
14
14
|
import { resolveDaemonHomeDir } from '@pellux/goodvibes-sdk/platform/workspace';
|
|
@@ -33,7 +33,7 @@ export function registerClusterRuntimeCommands(registry: CommandRegistry): void
|
|
|
33
33
|
registry.register({
|
|
34
34
|
name: 'cluster',
|
|
35
35
|
description: 'Share inbound channel work with your other goodvibes machines on this network',
|
|
36
|
-
usage: `[${CLUSTER_SUBCOMMANDS.join('|')}]
|
|
36
|
+
usage: `[${CLUSTER_SUBCOMMANDS.join('|')}]: status is the default; `
|
|
37
37
|
+ 'add --host/--port/--token to reach a daemon on another machine',
|
|
38
38
|
argsHint: `[${CLUSTER_SUBCOMMANDS.join('|')}]`,
|
|
39
39
|
async handler(args, ctx) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// codebase-runtime.ts
|
|
2
|
+
// codebase-runtime.ts, /codebase
|
|
3
3
|
//
|
|
4
4
|
// Explicit-query + transparency surface over the repo source-tree code index
|
|
5
5
|
// (CodeIndexStore, @pellux/goodvibes-sdk/platform/state, landed on SDK main
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
//
|
|
11
11
|
// Mirrors /recall's transparency idiom (recall-query.ts's handleRecallVector:
|
|
12
12
|
// status/rebuild) and /workstream's registerXRuntimeCommands function-export
|
|
13
|
-
// shape: build (schedules the index build
|
|
13
|
+
// shape: build (schedules the index build, visible as a fleet 'code-index'
|
|
14
14
|
// node while it runs), status (counts, skips, degradation state, last
|
|
15
15
|
// build), search <query> (explicit retrieval, results labeled
|
|
16
|
-
// 'lexical'|'semantic' honestly
|
|
16
|
+
// 'lexical'|'semantic' honestly, never implied as more precise than they
|
|
17
17
|
// are). Passive auto-injection into coding turns and tool-site incremental
|
|
18
18
|
// reindex followed later; `status` surfaces both honestly (the
|
|
19
19
|
// auto-injection flag+setting gate, and the last reindex activity).
|
|
@@ -37,15 +37,15 @@ function formatBytes(bytes: number): string {
|
|
|
37
37
|
/**
|
|
38
38
|
* Honest one-line auto-injection state: both the (default-off)
|
|
39
39
|
* `agent-passive-code-injection` feature flag AND storage.codeIndexEnabled must
|
|
40
|
-
* be on for passive code injection to run
|
|
40
|
+
* be on for passive code injection to run, state which is off, and why.
|
|
41
41
|
*/
|
|
42
42
|
function renderAutoInjectionState(flagEnabled: boolean, settingEnabled: boolean): string {
|
|
43
43
|
if (flagEnabled && settingEnabled) {
|
|
44
44
|
return ' auto-injection: on (code hits may be injected into coding turns within the shared knowledge budget)';
|
|
45
45
|
}
|
|
46
46
|
const reasons: string[] = [];
|
|
47
|
-
if (!flagEnabled) reasons.push('agent-passive-code-injection flag off (default off)
|
|
48
|
-
if (!settingEnabled) reasons.push('storage.codeIndexEnabled off
|
|
47
|
+
if (!flagEnabled) reasons.push('agent-passive-code-injection flag off (default off); enable in the settings modal flags section');
|
|
48
|
+
if (!settingEnabled) reasons.push('storage.codeIndexEnabled off: /config to change');
|
|
49
49
|
return ` auto-injection: off (${reasons.join('; ')})`;
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -58,7 +58,7 @@ function renderReindexActivity(activity: CodeIndexReindexActivity | null, now: n
|
|
|
58
58
|
: activity.status === 'skipped'
|
|
59
59
|
? `skipped (${activity.mode ?? 'empty'})`
|
|
60
60
|
: `indexed (${activity.mode ?? 'symbols'})`;
|
|
61
|
-
return ` last reindex: ${activity.path}
|
|
61
|
+
return ` last reindex: ${activity.path}; ${detail}, ${agoSec}s ago`;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
interface CodeIndexStatusExtras {
|
|
@@ -69,18 +69,18 @@ interface CodeIndexStatusExtras {
|
|
|
69
69
|
|
|
70
70
|
function renderCodeIndexStatus(stats: CodeIndexStats, configManager: Pick<ConfigManager, 'get'>, extras: CodeIndexStatusExtras): string {
|
|
71
71
|
const lines: string[] = [];
|
|
72
|
-
lines.push(`Code index
|
|
72
|
+
lines.push(`Code index: backend: ${stats.backend}, available: ${stats.available ? 'yes' : 'no'}`);
|
|
73
73
|
lines.push(` path: ${stats.path}`);
|
|
74
74
|
lines.push(` indexed: ${stats.indexedFiles} file(s), ${stats.indexedChunks} chunk(s), ${stats.dimensions} dims`);
|
|
75
75
|
lines.push(` embedding provider: ${stats.embeddingProviderLabel} (${stats.embeddingProviderId})`);
|
|
76
76
|
lines.push(
|
|
77
77
|
stats.semanticRetrievalAvailable
|
|
78
78
|
? ' search results labeled: semantic'
|
|
79
|
-
: ' search results labeled: lexical (hashed fallback
|
|
79
|
+
: ' search results labeled: lexical (hashed fallback; low precision)',
|
|
80
80
|
);
|
|
81
81
|
const autoStart = isCodeIndexAutoStartEnabled(configManager);
|
|
82
82
|
lines.push(
|
|
83
|
-
` auto-build on startup: ${autoStart ? 'on' : 'off'} (storage.codeIndexEnabled, default off
|
|
83
|
+
` auto-build on startup: ${autoStart ? 'on' : 'off'} (storage.codeIndexEnabled, default off; /config to change)`,
|
|
84
84
|
);
|
|
85
85
|
// Passive code auto-injection state (flag + setting) and the last tool-site reindex.
|
|
86
86
|
lines.push(renderAutoInjectionState(extras.flagEnabled, autoStart));
|
|
@@ -91,9 +91,9 @@ function renderCodeIndexStatus(stats: CodeIndexStats, configManager: Pick<Config
|
|
|
91
91
|
);
|
|
92
92
|
// Provider-space honesty (SDK finding): vectors embedded under a different
|
|
93
93
|
// provider than the current default disable the vector search path until a
|
|
94
|
-
// rebuild re-embeds
|
|
94
|
+
// rebuild re-embeds, say so, in the store's own words.
|
|
95
95
|
if (stats.embeddingProviderMismatch) {
|
|
96
|
-
lines.push(` provider mismatch: ${stats.embeddingProviderMismatch} (vector search disabled
|
|
96
|
+
lines.push(` provider mismatch: ${stats.embeddingProviderMismatch} (vector search disabled; lexical fallback only)`);
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
if (stats.building) {
|
|
@@ -115,7 +115,7 @@ function renderCodeIndexStatus(stats: CodeIndexStats, configManager: Pick<Config
|
|
|
115
115
|
if (skip.chunkedByWindow) skipParts.push(`${skip.chunkedByWindow} windowed (no tree-sitter symbols)`);
|
|
116
116
|
lines.push(skipParts.length > 0 ? ` skipped: ${skipParts.join(', ')}` : ' skipped: none');
|
|
117
117
|
} else {
|
|
118
|
-
lines.push(' last build: never
|
|
118
|
+
lines.push(' last build: never; run /codebase build');
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
if (stats.error) lines.push(` error: ${stats.error}`);
|
|
@@ -170,7 +170,7 @@ const USAGE = 'Usage:\n'
|
|
|
170
170
|
export function registerCodebaseRuntimeCommands(registry: CommandRegistry): void {
|
|
171
171
|
registry.register({
|
|
172
172
|
name: 'codebase',
|
|
173
|
-
description: 'Repo source-tree code index
|
|
173
|
+
description: 'Repo source-tree code index: build, inspect, and search',
|
|
174
174
|
usage: 'build | status | search <query...> [--limit n]',
|
|
175
175
|
argsHint: 'build | status | search <query>',
|
|
176
176
|
handler(args: string[], ctx: CommandContext) {
|
|
@@ -201,7 +201,7 @@ export function registerCodebaseRuntimeCommands(registry: CommandRegistry): void
|
|
|
201
201
|
return;
|
|
202
202
|
}
|
|
203
203
|
store.scheduleBuild();
|
|
204
|
-
ctx.print('Build scheduled
|
|
204
|
+
ctx.print('Build scheduled: track progress with /codebase status or the fleet panel (code-index node).');
|
|
205
205
|
return;
|
|
206
206
|
}
|
|
207
207
|
|
|
@@ -217,7 +217,7 @@ export function registerCodebaseRuntimeCommands(registry: CommandRegistry): void
|
|
|
217
217
|
const stats = store.stats();
|
|
218
218
|
ctx.print(
|
|
219
219
|
stats.indexedChunks === 0
|
|
220
|
-
? 'No results
|
|
220
|
+
? 'No results: the code index is empty. Run /codebase build first.'
|
|
221
221
|
: 'No matching chunks found.',
|
|
222
222
|
);
|
|
223
223
|
return;
|
|
@@ -18,13 +18,13 @@ export function registerConfigCommand(registry: CommandRegistry): void {
|
|
|
18
18
|
argsHint: '[category|key] | set <key> <value>',
|
|
19
19
|
async handler(args, ctx) {
|
|
20
20
|
// An earlier replay fix: `/config set <key> <value>` used to fall through to
|
|
21
|
-
// the workspace with the assignment silently ignored
|
|
21
|
+
// the workspace with the assignment silently ignored, the dishonest-
|
|
22
22
|
// fallthrough class. `set` is now a real verb.
|
|
23
23
|
if (args[0] === 'set') {
|
|
24
24
|
const key = args[1];
|
|
25
25
|
const value = args.slice(2).join(' ');
|
|
26
26
|
if (!key || value === '') {
|
|
27
|
-
ctx.print('Usage: /config set <key> <value
|
|
27
|
+
ctx.print('Usage: /config set <key> <value>; e.g. /config set display.themeMode light');
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
30
|
// A credential key must never take the generic path below: setDynamic
|
|
@@ -72,9 +72,9 @@ export function registerConfigCommand(registry: CommandRegistry): void {
|
|
|
72
72
|
* writing it into a config file: the value goes to the secret store and the
|
|
73
73
|
* config key keeps only a `goodvibes://secrets/...` reference to it.
|
|
74
74
|
*
|
|
75
|
-
* The entered value is never echoed. The transcript is a diagnostic surface
|
|
75
|
+
* The entered value is never echoed. The transcript is a diagnostic surface,
|
|
76
76
|
* it is scrolled back through, copied into support threads and captured in
|
|
77
|
-
* screen recordings
|
|
77
|
+
* screen recordings, so it gets the reference and the store key, never the
|
|
78
78
|
* secret.
|
|
79
79
|
*
|
|
80
80
|
* With no secret manager in this runtime there is nowhere safe to put it, and
|
|
@@ -89,7 +89,7 @@ async function handleSecretConfigSet(
|
|
|
89
89
|
const secretsManager = ctx.platform?.secretsManager;
|
|
90
90
|
if (!secretsManager) {
|
|
91
91
|
ctx.print(
|
|
92
|
-
`${key} holds a credential, and this runtime has no secret store to put it in
|
|
92
|
+
`${key} holds a credential, and this runtime has no secret store to put it in; `
|
|
93
93
|
+ `refusing rather than writing it in cleartext into a config file.\n`
|
|
94
94
|
+ ` Store it with: /secrets set ${secretKey} <value>`,
|
|
95
95
|
);
|
|
@@ -105,7 +105,7 @@ async function handleSecretConfigSet(
|
|
|
105
105
|
const scope = defaultSecretBackedScope(key);
|
|
106
106
|
ctx.print(
|
|
107
107
|
`Set ${key}: stored in the ${scope} secret tier as ${secretKey} (value hidden).\n`
|
|
108
|
-
+ ` ${key} now holds the reference ${configValue}
|
|
108
|
+
+ ` ${key} now holds the reference ${configValue}; the value itself is never written to a config file.`
|
|
109
109
|
+ (scope === 'daemon'
|
|
110
110
|
? '\n The daemon reads that tier, so this keeps working with this client closed.'
|
|
111
111
|
: ''),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* connection-status.ts
|
|
2
|
+
* connection-status.ts, honest connection state for the mail and calendar
|
|
3
3
|
* capabilities, derived from the daemon's own answer rather than re-decided
|
|
4
4
|
* here.
|
|
5
5
|
*
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* settings resolution, the credential read, the connectors, the confirmation
|
|
8
8
|
* posture (see src/daemon/handlers/email and src/daemon/handlers/calendar).
|
|
9
9
|
* The TUI holds no second copy of any of it. So "is mail connected?" is not a
|
|
10
|
-
* question this file answers from config
|
|
10
|
+
* question this file answers from config, it is a question it ASKS, by
|
|
11
11
|
* invoking the cheapest read verb and reading the failure code that comes back:
|
|
12
12
|
*
|
|
13
13
|
* EMAIL_NOT_CONFIGURED host/user are missing
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* Every `email.*` / `calendar.*` descriptor the SDK catalogs carries
|
|
24
24
|
* `invokable: false`. On the generic HTTP/WS dispatch path that flag is checked
|
|
25
25
|
* by `validateGatewayInvocation` BEFORE any handler lookup and answered with a
|
|
26
|
-
* flat 400 `NOT_INVOKABLE
|
|
26
|
+
* flat 400 `NOT_INVOKABLE`, so `sdk.operator.invoke('email.inbox.list', …)`
|
|
27
27
|
* cannot reach these verbs no matter what is configured, and a surface built on
|
|
28
28
|
* it would be a dead button.
|
|
29
29
|
*
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
* own method works. This product registers those handlers into its own catalog
|
|
33
33
|
* at composition time (`createDaemonHandlerComposition`, called by the shared
|
|
34
34
|
* `createRuntimeServices` root that both the TUI and the daemon boot from), so
|
|
35
|
-
* the in-process catalog is a live, correct route to the same code
|
|
35
|
+
* the in-process catalog is a live, correct route to the same code, the same
|
|
36
36
|
* seam `/review` already uses for `checkpoints.*`. That is what these surfaces
|
|
37
37
|
* call.
|
|
38
38
|
*
|
|
@@ -48,7 +48,7 @@ export type ConnectionSurface = 'mail' | 'calendar';
|
|
|
48
48
|
* What a surface can be.
|
|
49
49
|
*
|
|
50
50
|
* `checking` exists because the probe is real I/O and the settings workspace
|
|
51
|
-
* renders synchronously
|
|
51
|
+
* renders synchronously, a row has to say something true while the answer is
|
|
52
52
|
* in flight, and "checking" is true where "not configured" would be invented.
|
|
53
53
|
*/
|
|
54
54
|
export type ConnectionState = 'ready' | 'needs-setup' | 'unreachable' | 'checking';
|
|
@@ -67,7 +67,7 @@ export function connectionSurfaceLabel(surface: ConnectionSurface): string {
|
|
|
67
67
|
return surface === 'mail' ? 'Mail' : 'Calendar';
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
/** The read verb each surface is probed with
|
|
70
|
+
/** The read verb each surface is probed with, the cheapest read it has. */
|
|
71
71
|
export const CONNECTION_PROBE_METHOD = {
|
|
72
72
|
mail: 'email.inbox.list',
|
|
73
73
|
calendar: 'calendar.events.list',
|
|
@@ -78,12 +78,12 @@ export const CONNECTION_PROBE_METHOD = {
|
|
|
78
78
|
*
|
|
79
79
|
* The `surfaces.*` settings are daemon-owned by prefix (see the SDK's
|
|
80
80
|
* `config-ownership`), so `/config set` on them lands in the daemon's own
|
|
81
|
-
* store and keeps working with this client closed
|
|
81
|
+
* store and keeps working with this client closed, which is the requirement.
|
|
82
82
|
*
|
|
83
83
|
* The PASSWORDS now have it too, and these steps changed the round the platform
|
|
84
84
|
* gave it to them. A credential is filed in the daemon's tier only when a
|
|
85
85
|
* daemon-owned config path declares it, and the two keys this product's daemon
|
|
86
|
-
* reads
|
|
86
|
+
* reads, `surfaces.email.password` and `surfaces.calendar.caldavPassword`,
|
|
87
87
|
* were declared in neither `CONFIG_SCHEMA` nor the platform's non-schema
|
|
88
88
|
* daemon-owned path list. `isDaemonOwnedSecretKey()` answered false for both,
|
|
89
89
|
* so a `/secrets set` filed them in THIS client's store where the daemon never
|
|
@@ -144,7 +144,7 @@ export function daemonErrorCode(error: unknown): string | null {
|
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
/**
|
|
147
|
-
* Turn a probe outcome into a status. Pure
|
|
147
|
+
* Turn a probe outcome into a status. Pure, the caller does the I/O, so every
|
|
148
148
|
* daemon answer is exercised in tests without a daemon.
|
|
149
149
|
*
|
|
150
150
|
* `error === null` means the read verb returned. That is the only evidence
|
|
@@ -160,7 +160,7 @@ export function describeConnectionProbe(
|
|
|
160
160
|
return {
|
|
161
161
|
surface,
|
|
162
162
|
state: 'ready',
|
|
163
|
-
detail: `${label} is connected
|
|
163
|
+
detail: `${label} is connected: the daemon reached the server and returned a result.`,
|
|
164
164
|
nextActions: [],
|
|
165
165
|
};
|
|
166
166
|
}
|
|
@@ -215,7 +215,7 @@ export const READ_INVOCATION_CONTEXT = { context: { clientKind: 'tui' as const }
|
|
|
215
215
|
* The daemon's register wrapper demands BOTH `body.confirm === true` and
|
|
216
216
|
* `context.metadata.explicitUserRequest === true`. The second is set only on
|
|
217
217
|
* paths where a person typed the command that performs the write, which is the
|
|
218
|
-
* whole point of the flag
|
|
218
|
+
* whole point of the flag, it is never set on a read or on a background
|
|
219
219
|
* refresh.
|
|
220
220
|
*/
|
|
221
221
|
export const EXPLICIT_WRITE_INVOCATION_CONTEXT = {
|
|
@@ -225,7 +225,7 @@ export const EXPLICIT_WRITE_INVOCATION_CONTEXT = {
|
|
|
225
225
|
/**
|
|
226
226
|
* Probe one surface against the in-process gateway catalog.
|
|
227
227
|
*
|
|
228
|
-
* Asks for a single item
|
|
228
|
+
* Asks for a single item, enough to prove the whole path (settings →
|
|
229
229
|
* credential → connector → server) without pulling a mailbox into memory.
|
|
230
230
|
*/
|
|
231
231
|
export async function probeConnection(
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* /context window
|
|
2
|
+
* /context window, view, set, or clear a custom context window for the
|
|
3
3
|
* current model.
|
|
4
4
|
*
|
|
5
5
|
* The override is stored by the SDK's ProviderRegistry (persisted under the
|
|
@@ -84,7 +84,7 @@ export function handleContextWindowSubcommand(args: readonly string[], ctx: Comm
|
|
|
84
84
|
} else {
|
|
85
85
|
const size = parseContextWindowSize(arg);
|
|
86
86
|
if (size === null) {
|
|
87
|
-
output = `Invalid size '${args[0]}'. Use a token count between 1 and ${MAX_CONTEXT_WINDOW_OVERRIDE.toLocaleString()}
|
|
87
|
+
output = `Invalid size '${args[0]}'. Use a token count between 1 and ${MAX_CONTEXT_WINDOW_OVERRIDE.toLocaleString()}, e.g. 120000, 200k, 1m, or 'clear'.`;
|
|
88
88
|
} else {
|
|
89
89
|
registry.setModelContextCap(model.registryKey, size);
|
|
90
90
|
output = `Context window for ${model.displayName} set to ${size.toLocaleString()} tokens (was ${registry.getContextWindowForModel(model).toLocaleString()}). Clear with /context window clear.`;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* cost-attribution-format.ts
|
|
2
|
+
* cost-attribution-format.ts, pure rendering helpers for /cost attribution.
|
|
3
3
|
*
|
|
4
4
|
* cost.attribution.get (SDK 1.6.1) is honest-unpriced by design: an unknown
|
|
5
5
|
* model contributes to unpricedRecordCount with a null cost rather than a
|
|
6
6
|
* fabricated amount, and costState is 'priced' | 'estimated' | 'unpriced'
|
|
7
7
|
* (a mix across contributors). These helpers preserve that distinction all
|
|
8
|
-
* the way to the rendered line
|
|
8
|
+
* the way to the rendered line, "unpriced" always reads as unpriced,
|
|
9
9
|
* "estimated" is always labeled, and a dollar figure only ever comes from a
|
|
10
10
|
* real priced/estimated costUsd.
|
|
11
11
|
*/
|
|
@@ -21,7 +21,7 @@ export const COST_ATTRIBUTION_PRIMARY_DIMENSIONS: readonly CostAttributionDimens
|
|
|
21
21
|
/**
|
|
22
22
|
* Dimensions that exist on the wire but return honest-empty until their
|
|
23
23
|
* emit sites tag records with this dimension. Queried the same as the
|
|
24
|
-
* primary set, but rendered ONLY when non-empty
|
|
24
|
+
* primary set, but rendered ONLY when non-empty, never a fabricated
|
|
25
25
|
* "0 tool calls" section implying tool-level attribution works today.
|
|
26
26
|
*/
|
|
27
27
|
export const COST_ATTRIBUTION_OPTIONAL_DIMENSIONS: readonly CostAttributionDimension[] = ['tool', 'hook', 'mcp'];
|
|
@@ -47,6 +47,6 @@ export function formatCostAttributionSection(result: CostAttributionResult, isOp
|
|
|
47
47
|
for (const row of result.rows) {
|
|
48
48
|
lines.push(` ${row.key.padEnd(24)} ${formatCostAmount(row.costUsd, row.costState).padEnd(20)} ${formatTokens(row.tokens)}`);
|
|
49
49
|
}
|
|
50
|
-
lines.push(` total: ${formatCostAmount(result.totalCostUsd, result.costState)}
|
|
50
|
+
lines.push(` total: ${formatCostAmount(result.totalCostUsd, result.costState)}; ${result.pricedRecordCount} priced, ${result.unpricedRecordCount} unpriced record(s)`);
|
|
51
51
|
return lines;
|
|
52
52
|
}
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
} from './cost-attribution-format.ts';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
|
-
* /cost budget <usd
|
|
14
|
+
* /cost budget <usd>, makes the CostTrackerPanel's budget alert real.
|
|
15
15
|
* Opens the cost panel (creating it via the registered factory if not already
|
|
16
16
|
* open) and sets its budget threshold directly, so the meter+alert already
|
|
17
17
|
* built into CostTrackerPanel.render() (:266-290) actually fires. 0 disables
|
|
@@ -73,7 +73,7 @@ export function registerCostRuntimeCommands(registry: CommandRegistry): void {
|
|
|
73
73
|
ctx.print(JSON.stringify(results, null, 2));
|
|
74
74
|
return;
|
|
75
75
|
}
|
|
76
|
-
const lines: string[] = [`Cost Attribution
|
|
76
|
+
const lines: string[] = [`Cost Attribution: ${window}`];
|
|
77
77
|
for (const result of results) {
|
|
78
78
|
const isOptional = (COST_ATTRIBUTION_OPTIONAL_DIMENSIONS as readonly string[]).includes(result.dimension);
|
|
79
79
|
const section = formatCostAttributionSection(result, isOptional);
|
|
@@ -2,7 +2,7 @@ import type { CommandContext, CommandRegistry } from '../command-registry.ts';
|
|
|
2
2
|
import { formatDeviceLine, resolveTokenByIdPrefix } from '@pellux/goodvibes-sdk/platform/pairing';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Register the /devices command
|
|
5
|
+
* Register the /devices command, manage the per-device pairing tokens minted by
|
|
6
6
|
* the pairing surfaces. Mirrors the pairing.tokens.* gateway verbs the daemon
|
|
7
7
|
* serves (list/rename/revoke/migrate/revoke-shared) so the terminal has the same
|
|
8
8
|
* capability as the web app's device manager.
|
|
@@ -42,7 +42,7 @@ export function registerDevicesRuntimeCommands(registry: CommandRegistry): void
|
|
|
42
42
|
}
|
|
43
43
|
const resolved = resolveTokenByIdPrefix(pairingTokens.list(), idOrPrefix);
|
|
44
44
|
if (!resolved.ok) {
|
|
45
|
-
ctx.print(resolved.reason === 'ambiguous' ? `Ambiguous device id "${idOrPrefix}"
|
|
45
|
+
ctx.print(resolved.reason === 'ambiguous' ? `Ambiguous device id "${idOrPrefix}": use more characters.` : `No device matches "${idOrPrefix}".`);
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
48
48
|
pairingTokens.rename(resolved.token.id, name);
|
|
@@ -58,11 +58,11 @@ export function registerDevicesRuntimeCommands(registry: CommandRegistry): void
|
|
|
58
58
|
}
|
|
59
59
|
const resolved = resolveTokenByIdPrefix(pairingTokens.list(), idOrPrefix);
|
|
60
60
|
if (!resolved.ok) {
|
|
61
|
-
ctx.print(resolved.reason === 'ambiguous' ? `Ambiguous device id "${idOrPrefix}"
|
|
61
|
+
ctx.print(resolved.reason === 'ambiguous' ? `Ambiguous device id "${idOrPrefix}": use more characters.` : `No device matches "${idOrPrefix}".`);
|
|
62
62
|
return;
|
|
63
63
|
}
|
|
64
64
|
const revoked = pairingTokens.revoke(resolved.token.id);
|
|
65
|
-
ctx.print(revoked ? `Revoked "${resolved.token.name}"
|
|
65
|
+
ctx.print(revoked ? `Revoked "${resolved.token.name}": its token stops working immediately.` : `Device "${resolved.token.name}" was already absent.`);
|
|
66
66
|
return;
|
|
67
67
|
}
|
|
68
68
|
|
|
@@ -82,7 +82,7 @@ export function registerDevicesRuntimeCommands(registry: CommandRegistry): void
|
|
|
82
82
|
return;
|
|
83
83
|
}
|
|
84
84
|
pairingTokens.revokeLegacyShared();
|
|
85
|
-
ctx.print('Revoked the legacy shared token
|
|
85
|
+
ctx.print('Revoked the legacy shared token; devices still on it must re-pair with their own token.');
|
|
86
86
|
return;
|
|
87
87
|
}
|
|
88
88
|
|
|
@@ -95,7 +95,7 @@ function renderList(ctx: CommandContext, pairingTokens: NonNullable<CommandConte
|
|
|
95
95
|
const list = pairingTokens.list();
|
|
96
96
|
const lines: string[] = ['Paired devices:'];
|
|
97
97
|
if (list.length === 0) {
|
|
98
|
-
lines.push(' (none yet
|
|
98
|
+
lines.push(' (none yet: pair one with /pair)');
|
|
99
99
|
} else {
|
|
100
100
|
for (const token of list) lines.push(` ${formatDeviceLine(token)}`);
|
|
101
101
|
}
|
|
@@ -103,7 +103,7 @@ function renderList(ctx: CommandContext, pairingTokens: NonNullable<CommandConte
|
|
|
103
103
|
'',
|
|
104
104
|
pairingTokens.isLegacyRevoked()
|
|
105
105
|
? 'Legacy shared token: revoked.'
|
|
106
|
-
: 'Legacy shared token: active
|
|
106
|
+
: 'Legacy shared token: active; run /devices migrate-shared then /devices revoke-shared to retire it.',
|
|
107
107
|
);
|
|
108
108
|
ctx.print(lines.join('\n'));
|
|
109
109
|
}
|
|
@@ -7,7 +7,7 @@ import { requirePanelManager, requireSessionChangeTracker, requireShellPaths } f
|
|
|
7
7
|
/**
|
|
8
8
|
* Run a git command that lists changed file names, capturing stderr instead
|
|
9
9
|
* of letting it fall through to the process's real stderr (which, for a
|
|
10
|
-
* spawned child with no stdio option, is inherited from the parent
|
|
10
|
+
* spawned child with no stdio option, is inherited from the parent, i.e.
|
|
11
11
|
* written straight to the TUI's controlling terminal, corrupting the screen
|
|
12
12
|
* outside the renderer's front/back-buffer diffing). Mirrors the 'staged'
|
|
13
13
|
* subcommand's existing pattern below.
|
|
@@ -89,7 +89,7 @@ export function registerDiffRuntimeCommands(registry: CommandRegistry): void {
|
|
|
89
89
|
const shellPaths = requireShellPaths(ctx);
|
|
90
90
|
const workingDirectory = shellPaths.workingDirectory;
|
|
91
91
|
// Gate before any git spawn happens (same defensive check /git already
|
|
92
|
-
// has)
|
|
92
|
+
// has), every subcommand below shells out to git, and without this
|
|
93
93
|
// they each produced a differently-shaped error for the same
|
|
94
94
|
// not-a-git-repo condition.
|
|
95
95
|
if (!GitService.isGitRepo(workingDirectory)) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { CommandRegistry } from '../command-registry.ts';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* `/editor
|
|
4
|
+
* `/editor`, open the current composer draft in the user's $EDITOR / $VISUAL,
|
|
5
5
|
* then load the edited text back into the composer. The actual terminal
|
|
6
6
|
* suspend/resume and buffer round-trip are wired in main.ts as the
|
|
7
7
|
* `openComposerEditor` command action; this command is the front door for it.
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Implements the Evaluation Harness commands:
|
|
5
5
|
*
|
|
6
|
-
* /eval list
|
|
7
|
-
* /eval run <suite>
|
|
8
|
-
* /eval compare <baseline-file
|
|
9
|
-
* /eval gate <suite>
|
|
6
|
+
* /eval list , List all available eval suites
|
|
7
|
+
* /eval run <suite> , Run a named suite (or 'all')
|
|
8
|
+
* /eval compare <baseline-file>, Compare last run against a baseline file
|
|
9
|
+
* /eval gate <suite> , Run suite and apply CI gate (exits 1 on regression)
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import type { SlashCommand, CommandContext } from '../command-registry.ts';
|
|
@@ -237,7 +237,7 @@ export function registerExperienceRuntimeCommands(registry: CommandRegistry): vo
|
|
|
237
237
|
// download), not through a daemon verb, so this path needs no gateway.
|
|
238
238
|
// Installation already provisions them and a daemon retries at boot;
|
|
239
239
|
// `setup` here is the recovery act, and nothing downloads unless the user
|
|
240
|
-
// typed it
|
|
240
|
+
// typed it, see wake-provision-runner.ts.
|
|
241
241
|
const wakeSub = (args[1] ?? 'status').toLowerCase();
|
|
242
242
|
const managedRoot = shellPaths.resolveUserPath('voice');
|
|
243
243
|
const runner = {
|
|
@@ -7,7 +7,7 @@ export function registerGitRuntimeCommands(registry: CommandRegistry): void {
|
|
|
7
7
|
registry.register({
|
|
8
8
|
name: 'git',
|
|
9
9
|
aliases: ['g'],
|
|
10
|
-
description: 'Git repository commands
|
|
10
|
+
description: 'Git repository commands: status, log, diff',
|
|
11
11
|
usage: '[status|log|diff]',
|
|
12
12
|
argsHint: '[status|log|diff]',
|
|
13
13
|
async handler(args, ctx) {
|
|
@@ -29,7 +29,7 @@ export function registerGitRuntimeCommands(registry: CommandRegistry): void {
|
|
|
29
29
|
const st = await git.status();
|
|
30
30
|
const lines: string[] = ['Git status:'];
|
|
31
31
|
if (st.isClean()) {
|
|
32
|
-
lines.push(' Working tree clean
|
|
32
|
+
lines.push(' Working tree clean: nothing to commit.');
|
|
33
33
|
} else {
|
|
34
34
|
if (st.staged.length > 0) {
|
|
35
35
|
lines.push(` Staged (${st.staged.length}):`);
|
|
@@ -65,7 +65,7 @@ export function registerGitRuntimeCommands(registry: CommandRegistry): void {
|
|
|
65
65
|
}
|
|
66
66
|
case 'diff': {
|
|
67
67
|
// Route the full, uncapped working-tree diff (GitService.diffStructured
|
|
68
|
-
|
|
68
|
+
//, parsed per-file/per-hunk with no size limit) into the real diff
|
|
69
69
|
// panel. The old path sliced the raw text at 4,000 chars and printed a
|
|
70
70
|
// stub; a large diff now renders complete.
|
|
71
71
|
try {
|
|
@@ -3,11 +3,11 @@ import { getOperatorRpc, describeOperatorRpcError } from './operator-rpc.ts';
|
|
|
3
3
|
import { renderWorkstreamGraphLines } from '../../panels/workstream-graph-render.ts';
|
|
4
4
|
|
|
5
5
|
// ---------------------------------------------------------------------------
|
|
6
|
-
// /graph
|
|
6
|
+
// /graph, a workstream's task graph (fleet.graph.get) rendered legibly.
|
|
7
7
|
//
|
|
8
8
|
// The observability-layer surface: nodes, edges, per-node states (ready /
|
|
9
9
|
// running / blocked-with-"waiting on: X" / stalled / orphaned) and the elastic
|
|
10
|
-
// pool posture ("N ready, M running, at cap (fleet.maxSize=N)")
|
|
10
|
+
// pool posture ("N ready, M running, at cap (fleet.maxSize=N)"), the shape of
|
|
11
11
|
// the dependency graph WITHOUT opening any transcript. The fix-phase chain's
|
|
12
12
|
// task graph is one such workstream.
|
|
13
13
|
// ---------------------------------------------------------------------------
|
|
@@ -20,7 +20,7 @@ function renderWidth(): number {
|
|
|
20
20
|
export function registerGraphRuntimeCommands(registry: CommandRegistry): void {
|
|
21
21
|
registry.register({
|
|
22
22
|
name: 'graph',
|
|
23
|
-
description: "Show a workstream's task graph
|
|
23
|
+
description: "Show a workstream's task graph: nodes, edges, states, and pool posture",
|
|
24
24
|
usage: '<workstreamId>',
|
|
25
25
|
argsHint: '<workstreamId>',
|
|
26
26
|
async handler(args, ctx) {
|
|
@@ -8,7 +8,7 @@ export function registerGuidanceRuntimeCommands(registry: CommandRegistry): void
|
|
|
8
8
|
registry.register({
|
|
9
9
|
name: 'welcome',
|
|
10
10
|
aliases: ['guide'],
|
|
11
|
-
description: 'Open the product entry
|
|
11
|
+
description: 'Open the product entry point for the onboarding wizard, security, marketplace, remote, and operator workflows',
|
|
12
12
|
usage: '[open|print]',
|
|
13
13
|
handler(args, ctx) {
|
|
14
14
|
const sub = args[0] ?? 'open';
|
|
@@ -28,12 +28,12 @@ export function renderMetricMap(label: string, map: Record<string, unknown> | un
|
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
30
|
* When a telemetry verb fails because the companion token lacks the required
|
|
31
|
-
* scope, say exactly that
|
|
31
|
+
* scope, say exactly that, never render zeros in place of missing authority.
|
|
32
32
|
* Returns the honest line, or null when the error is not a scope refusal.
|
|
33
33
|
*/
|
|
34
34
|
export function telemetryScopeRefusalLine(error: unknown, what: string): string | null {
|
|
35
35
|
if (error instanceof GoodVibesSdkError && (error.status === 401 || error.status === 403)) {
|
|
36
|
-
return ` ${what}: unavailable
|
|
36
|
+
return ` ${what}: unavailable; the companion token lacks the read:telemetry scope this data requires (daemon returned ${error.status}).`;
|
|
37
37
|
}
|
|
38
38
|
return null;
|
|
39
39
|
}
|