@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,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* profile-runtime.ts
|
|
3
3
|
*
|
|
4
|
-
* `/profile
|
|
4
|
+
* `/profile`, the owner profile in the TUI: what the platform knows about the
|
|
5
5
|
* person who owns it, kept as one hand-editable Markdown file at daemon scope
|
|
6
6
|
* (docs/owner-profile.md).
|
|
7
7
|
*
|
|
@@ -14,13 +14,13 @@
|
|
|
14
14
|
*
|
|
15
15
|
* plus `set`, `note`, `undo` and `status` so a correction, a note, a recovery
|
|
16
16
|
* and a diagnosis do not require leaving the terminal or hand-editing the file
|
|
17
|
-
* (which remains allowed, and authoritative
|
|
17
|
+
* (which remains allowed, and authoritative, §4.5).
|
|
18
18
|
*
|
|
19
19
|
* ## Why it goes over the operator wire
|
|
20
20
|
*
|
|
21
21
|
* Same reason `/principals`, `/ci` and `/checkin` do (see operator-rpc.ts): the
|
|
22
22
|
* `profile.*` family ships in the operator contract and has not been promoted to
|
|
23
|
-
* the in-process `OperatorClient` facade. Surfaces never open the profile file
|
|
23
|
+
* the in-process `OperatorClient` facade. Surfaces never open the profile file,
|
|
24
24
|
* the daemon is the single writer, which is what makes its rename-based atomic
|
|
25
25
|
* writes sufficient with no lock (§3, §5.4). This command therefore has no file
|
|
26
26
|
* path, no parser and no writer of its own, and could not corrupt the document
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
*
|
|
31
31
|
* Values reach exactly one place: the string handed to `ctx.print`. This module
|
|
32
32
|
* imports no logger, builds no diagnostic payload, and never puts a value in an
|
|
33
|
-
* error message
|
|
33
|
+
* error message, a failed call renders `describeOperatorRpcError`, which
|
|
34
34
|
* describes the transport, not the content. A write prints the daemon's
|
|
35
35
|
* one-line disclosure and the field names that changed, never the value that was
|
|
36
36
|
* just recorded (§8.2). The `People` section is third-party personal data and is
|
|
@@ -80,7 +80,7 @@ const USAGE = [
|
|
|
80
80
|
' in the file (e.g. "shipping address") once that field is recorded. /profile show',
|
|
81
81
|
' prints each field id beside its value.',
|
|
82
82
|
'',
|
|
83
|
-
' Notes in People, Places, Work and Notes have no field id
|
|
83
|
+
' Notes in People, Places, Work and Notes have no field id; forget those with',
|
|
84
84
|
' --section and the line as /profile show prints it. The leading "-" is optional;',
|
|
85
85
|
' the rest must match, and if two notes read the same nothing is removed.',
|
|
86
86
|
].join('\n');
|
|
@@ -118,7 +118,7 @@ export interface ProfileCommandDeps {
|
|
|
118
118
|
const DEFAULT_DEPS: ProfileCommandDeps = { resolveRpc: getOperatorRpc };
|
|
119
119
|
|
|
120
120
|
function unrecognizedResponse(verb: string): string {
|
|
121
|
-
return `${PROFILE_TAG} the daemon answered ${verb} with a response this build does not recognise
|
|
121
|
+
return `${PROFILE_TAG} the daemon answered ${verb} with a response this build does not recognise; it is probably running a different platform version. Nothing was read or written.`;
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
/**
|
|
@@ -126,7 +126,7 @@ function unrecognizedResponse(verb: string): string {
|
|
|
126
126
|
*
|
|
127
127
|
* A dotted token is already an id and is passed through untouched. A bare label
|
|
128
128
|
* ("shipping address") is matched against the labels in the live `profile.read`
|
|
129
|
-
* response
|
|
129
|
+
* response, deliberately NOT against a copy of the SDK's field registry, which
|
|
130
130
|
* would be a second list to keep in step with the first. A label that matches
|
|
131
131
|
* nothing is passed through unchanged so the daemon answers with its own message
|
|
132
132
|
* naming what is wrong, rather than this command guessing.
|
|
@@ -205,7 +205,7 @@ async function runWrite<TVerb extends ProfileWriteVerb, TBody extends ProfileInp
|
|
|
205
205
|
/**
|
|
206
206
|
* `--section <name>` followed by free text, shared by `/profile note` and
|
|
207
207
|
* `/profile forget`. Section defaults to Notes, which is only meaningful for
|
|
208
|
-
* `note
|
|
208
|
+
* `note`, `forget` calls this solely when `--section` was given.
|
|
209
209
|
*/
|
|
210
210
|
function parseSectionArgs(args: readonly string[]): { section: string; text: string } {
|
|
211
211
|
if (args[1] === '--section' && typeof args[2] === 'string' && args[2].length > 0) {
|
|
@@ -235,12 +235,12 @@ export function registerProfileRuntimeCommands(
|
|
|
235
235
|
//
|
|
236
236
|
// where/forget/undo take the whole remainder as the field, so a label
|
|
237
237
|
// written with a space ("shipping address") works unquoted. `set` cannot
|
|
238
|
-
// do that
|
|
238
|
+
// do that, everything after the first token is the value, so a label
|
|
239
239
|
// there must be one word, or the field id.
|
|
240
240
|
const fieldToken = sub === 'set' ? args[1] : args.slice(1).join(' ').trim();
|
|
241
241
|
|
|
242
242
|
// `/profile forget --section <name> <text>` removes a prose bullet, which
|
|
243
|
-
// is the only way to forget a line in People, Places, Work or Notes
|
|
243
|
+
// is the only way to forget a line in People, Places, Work or Notes,
|
|
244
244
|
// those sections have no mechanical fields at all (§4.3), so without this
|
|
245
245
|
// "forget that" would answer for a shipping address but not for a note
|
|
246
246
|
// about a person. The line is named by its exact text, never by position:
|
|
@@ -272,7 +272,7 @@ export function registerProfileRuntimeCommands(
|
|
|
272
272
|
return;
|
|
273
273
|
}
|
|
274
274
|
// `methodId as string` is what picks the generic overload, so the result
|
|
275
|
-
// stays `unknown` and has to go through a checker
|
|
275
|
+
// stays `unknown` and has to go through a checker, see ProfileInvoke.
|
|
276
276
|
const invoke: ProfileInvoke = (methodId, input) =>
|
|
277
277
|
rpc.sdk.operator.invoke(methodId as string, input as unknown as Record<string, unknown>);
|
|
278
278
|
const print = (text: string): void => { ctx.print(text); };
|
|
@@ -309,8 +309,8 @@ export function registerProfileRuntimeCommands(
|
|
|
309
309
|
// outright. An earlier build defaulted it to owner-direct instead, and
|
|
310
310
|
// stating the claim rather than leaning on that default is precisely
|
|
311
311
|
// why this command kept working when it was tightened. It is the only
|
|
312
|
-
// gate `forget` and `undo` have
|
|
313
|
-
// removal
|
|
312
|
+
// gate `forget` and `undo` have, layers 2 and 3 do not apply to a
|
|
313
|
+
// removal, so it is not a field to leave to anyone else's default.
|
|
314
314
|
//
|
|
315
315
|
// This surface can hardcode it; the agent must not. The TUI's only
|
|
316
316
|
// input is the owner at his own keyboard, whereas the agent can be
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* ## The shapes come from the contract, not from a copy of it
|
|
8
8
|
*
|
|
9
|
-
* Every type below is derived from `OperatorMethodOutput<'profile.…'
|
|
9
|
+
* Every type below is derived from `OperatorMethodOutput<'profile.…'>`, the
|
|
10
10
|
* types generated from the SDK's own output schemas
|
|
11
11
|
* (`platform/control-plane/method-catalog-owner-profile.ts`). Nothing here
|
|
12
12
|
* restates a field name, so this file cannot drift from the contract: if a
|
|
@@ -20,11 +20,11 @@
|
|
|
20
20
|
* matching exported Zod schema and `buildSchemaRegistry` silently skips the
|
|
21
21
|
* rest. Measured against the installed contracts package: 5 of 452 method ids
|
|
22
22
|
* have one, and no `profile.*` verb is among them. So response validation is
|
|
23
|
-
* not a safety net this command can lean on
|
|
23
|
+
* not a safety net this command can lean on, for these verbs or for most
|
|
24
24
|
* others.
|
|
25
25
|
*
|
|
26
|
-
* So a daemon on a different version
|
|
27
|
-
* daemon at all
|
|
26
|
+
* So a daemon on a different version, or a 200 from something that is not this
|
|
27
|
+
* daemon at all, would otherwise reach a renderer and throw on a missing array,
|
|
28
28
|
* which in a slash command means a stack trace instead of an answer. Each `toX`
|
|
29
29
|
* function does the cast to `Record<string, unknown>` in ONE place, checks every
|
|
30
30
|
* property a renderer will read, and returns {@link MALFORMED} when anything is
|
|
@@ -66,16 +66,16 @@ type UnionKeys<T> = T extends unknown ? keyof T : never;
|
|
|
66
66
|
* carries alone. Four ways a stale key can arrive, all compiled against this
|
|
67
67
|
* repo's TypeScript with a `profile.forget`-shaped input:
|
|
68
68
|
*
|
|
69
|
-
* 1. written inline in a fresh literal
|
|
70
|
-
* 2. written inline BESIDE a spread
|
|
71
|
-
* 3. body built as a variable first
|
|
72
|
-
* 4. carried in by the spread source's type
|
|
69
|
+
* 1. written inline in a fresh literal , parameter typing already rejects
|
|
70
|
+
* 2. written inline BESIDE a spread , parameter typing already rejects
|
|
71
|
+
* 3. body built as a variable first , SLIPS PAST parameter typing
|
|
72
|
+
* 4. carried in by the spread source's type, SLIPS PAST parameter typing
|
|
73
73
|
*
|
|
74
74
|
* A spread literal is not uniformly unchecked, which is the easy thing to get
|
|
75
75
|
* wrong: anything written inline in one is still checked normally, and only what
|
|
76
76
|
* arrives THROUGH the spread escapes, because it belongs to the source's type
|
|
77
77
|
* rather than to the literal. Rows 3 and 4 are the two nothing else catches, and
|
|
78
|
-
* this guard rejects both with TS2345
|
|
78
|
+
* this guard rejects both with TS2345, measured, not reasoned about.
|
|
79
79
|
*
|
|
80
80
|
* That is not hypothetical: `profile.forget` really did retire `lineIndex`, and
|
|
81
81
|
* a body built one line earlier would have carried it silently past a correctly
|
|
@@ -83,7 +83,7 @@ type UnionKeys<T> = T extends unknown ? keyof T : never;
|
|
|
83
83
|
* to seed; this closes the shape.
|
|
84
84
|
*
|
|
85
85
|
* There is a second reason it earns its place here. The SDK's `invoke` is
|
|
86
|
-
* OVERLOADED
|
|
86
|
+
* OVERLOADED, a typed signature plus a loose
|
|
87
87
|
* `invoke<T = unknown>(methodId: string, input?: Record<string, unknown>)`. At a
|
|
88
88
|
* bare call site a body the typed overload rejects does not raise an
|
|
89
89
|
* excess-property error at all; overload resolution simply falls through to the
|
|
@@ -107,7 +107,7 @@ export type ExactProfileInput<TVerb extends ProfileVerb, TBody> =
|
|
|
107
107
|
export type ProfileDocumentView = OperatorMethodOutput<'profile.read'>;
|
|
108
108
|
|
|
109
109
|
/**
|
|
110
|
-
* Load state
|
|
110
|
+
* Load state, what `profile.status` answers, and the `state` half of a read.
|
|
111
111
|
*
|
|
112
112
|
* `kind` is `loaded` | `unavailable` | `disabled`. The counts belong to
|
|
113
113
|
* `loaded` and `reason` to `unavailable`. There is no value property anywhere
|
|
@@ -124,7 +124,7 @@ export type ProfileWriteResultView = OperatorMethodOutput<'profile.set'>;
|
|
|
124
124
|
|
|
125
125
|
/** One `## ` section, with the tier its content belongs to. */
|
|
126
126
|
export type ProfileSectionView = ProfileDocumentView['sections'][number];
|
|
127
|
-
/** One mechanical field. `valid: false` still carries the value
|
|
127
|
+
/** One mechanical field. `valid: false` still carries the value, see §4.3. */
|
|
128
128
|
export type ProfileFieldView = ProfileSectionView['fields'][number];
|
|
129
129
|
/** One prose line, preserved as written. */
|
|
130
130
|
export type ProfileLineView = ProfileSectionView['prose'][number];
|
|
@@ -355,7 +355,7 @@ export function toProfileProvenanceReport(value: unknown): Checked<ProfileProven
|
|
|
355
355
|
const superseded = checkedArray(record.superseded, toSuperseded);
|
|
356
356
|
if (superseded === MALFORMED) return MALFORMED;
|
|
357
357
|
// Platform runtime 2.0.8: the contract declares provenance nullable and
|
|
358
|
-
// always present
|
|
358
|
+
// always present, null IS the answer for a hand-edited field.
|
|
359
359
|
return { fieldId, present, handEdited, provenance: provenance ?? null, superseded };
|
|
360
360
|
}
|
|
361
361
|
|
|
@@ -25,7 +25,7 @@ function findProviderAccountRecord(
|
|
|
25
25
|
/**
|
|
26
26
|
* Present a record's recommended actions as executable rows. A recommended
|
|
27
27
|
* action that carries a structured command becomes a press-Enter row that RUNS
|
|
28
|
-
* that command through the command registry
|
|
28
|
+
* that command through the command registry, never a line the user has to
|
|
29
29
|
* retype. Actions with no command are genuinely out-of-product steps, so they
|
|
30
30
|
* stay as plain (non-executing) rows. When there is no interactive selection
|
|
31
31
|
* surface, each action is printed honestly instead.
|
|
@@ -68,7 +68,7 @@ export function presentRecommendedActions(
|
|
|
68
68
|
if (action.command) {
|
|
69
69
|
const args = [...action.command.args];
|
|
70
70
|
void (ctx.executeCommand?.(action.command.name, args)
|
|
71
|
-
?? Promise.resolve(ctx.print(`Cannot run /${action.command.name}
|
|
71
|
+
?? Promise.resolve(ctx.print(`Cannot run /${action.command.name}: command execution is unavailable here.`)));
|
|
72
72
|
return;
|
|
73
73
|
}
|
|
74
74
|
ctx.print(action.description);
|
|
@@ -81,7 +81,7 @@ export function presentRecommendedActions(
|
|
|
81
81
|
'Recommended actions:',
|
|
82
82
|
...actions.map((action) => (
|
|
83
83
|
action.command
|
|
84
|
-
? ` • ${action.description}
|
|
84
|
+
? ` • ${action.description}: /${action.command.name}${action.command.args.length > 0 ? ` ${action.command.args.join(' ')}` : ''}`
|
|
85
85
|
: ` • ${action.description} (manual step)`
|
|
86
86
|
)),
|
|
87
87
|
].join('\n'));
|
|
@@ -155,9 +155,9 @@ export function registerProviderAccountsRuntimeCommands(registry: CommandRegistr
|
|
|
155
155
|
...(record.fallbackRoute ? [` fallbackRoute: ${record.fallbackRoute}`] : []),
|
|
156
156
|
...(record.fallbackRisk ? [` fallbackRisk: ${record.fallbackRisk}`] : []),
|
|
157
157
|
...(record.expiresAt ? [` expiresAt: ${new Date(record.expiresAt).toISOString()}`] : []),
|
|
158
|
-
...record.routeRecords.map((route) => ` route ${route.route}: usable=${route.usable ? 'yes' : 'no'} freshness=${route.freshness}
|
|
158
|
+
...record.routeRecords.map((route) => ` route ${route.route}: usable=${route.usable ? 'yes' : 'no'} freshness=${route.freshness}; ${route.detail}`),
|
|
159
159
|
...record.routeRecords.flatMap((route) => route.issues.map((issue) => ` issue: ${issue}`)),
|
|
160
|
-
...record.usageWindows.map((entry) => ` window: ${entry.label}
|
|
160
|
+
...record.usageWindows.map((entry) => ` window: ${entry.label}; ${entry.detail}`),
|
|
161
161
|
...record.issues.map((issue) => ` issue: ${issue}`),
|
|
162
162
|
...record.notes.map((note) => ` note: ${note}`),
|
|
163
163
|
].join('\n'));
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Implements the Provider Optimizer panel commands:
|
|
5
5
|
*
|
|
6
|
-
* /provider optimizer on|off
|
|
7
|
-
* /provider route auto|manual
|
|
8
|
-
* /provider explain-route
|
|
9
|
-
* /provider pin <provider:model
|
|
10
|
-
* /provider fallback test
|
|
6
|
+
* /provider optimizer on|off , Enable or disable the provider optimizer
|
|
7
|
+
* /provider route auto|manual , Set optimizer routing mode
|
|
8
|
+
* /provider explain-route , Print current route explanation
|
|
9
|
+
* /provider pin <provider:model>, Pin routing to a specific provider/model
|
|
10
|
+
* /provider fallback test , Simulate the fallback chain
|
|
11
11
|
*
|
|
12
12
|
* When the optimizer is disabled, commands report its status and
|
|
13
13
|
* explain-route still works (reads current model capabilities).
|
|
@@ -112,7 +112,7 @@ function handleOptimizerToggle(
|
|
|
112
112
|
context.print(' Provider selection returns to manual-only mode. No automatic failover.');
|
|
113
113
|
context.print(' Pinned targets and fallback log are preserved; re-enable to resume.');
|
|
114
114
|
} else {
|
|
115
|
-
context.print(`[provider] Optimizer already ${enable ? 'enabled' : 'disabled'}
|
|
115
|
+
context.print(`[provider] Optimizer already ${enable ? 'enabled' : 'disabled'}; no change.`);
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
118
|
|
|
@@ -136,7 +136,7 @@ function handleRoute(
|
|
|
136
136
|
|
|
137
137
|
if (!optimizer.enabled) {
|
|
138
138
|
context.print(
|
|
139
|
-
'[provider] Optimizer is off
|
|
139
|
+
'[provider] Optimizer is off: routing mode recorded but failover will not fire until optimizer is enabled.',
|
|
140
140
|
);
|
|
141
141
|
context.print(' Enable with: /provider optimizer on');
|
|
142
142
|
}
|
|
@@ -273,7 +273,7 @@ async function handlePin(
|
|
|
273
273
|
// Enable optimizer if it's off
|
|
274
274
|
if (!optimizer.enabled) {
|
|
275
275
|
optimizer.setEnabled(true);
|
|
276
|
-
context.print('⚠ Optimizer was disabled
|
|
276
|
+
context.print('⚠ Optimizer was disabled: enabling it for pin to take effect.');
|
|
277
277
|
}
|
|
278
278
|
|
|
279
279
|
optimizer.pin(match.providerId, match.modelId);
|
|
@@ -299,7 +299,7 @@ function handleFallbackTest(
|
|
|
299
299
|
return;
|
|
300
300
|
}
|
|
301
301
|
|
|
302
|
-
context.print('[provider] Simulating fallback chain (empty request profile
|
|
302
|
+
context.print('[provider] Simulating fallback chain (empty request profile; no requirements)...');
|
|
303
303
|
|
|
304
304
|
const result: FallbackTestResult = optimizer.testFallback();
|
|
305
305
|
|
|
@@ -360,7 +360,7 @@ function handleFallbackTest(
|
|
|
360
360
|
// ---------------------------------------------------------------------------
|
|
361
361
|
|
|
362
362
|
/**
|
|
363
|
-
* providerCommand
|
|
363
|
+
* providerCommand, The `/provider` slash command.
|
|
364
364
|
*
|
|
365
365
|
* Routes to subcommand handlers based on args[0].
|
|
366
366
|
*/
|
|
@@ -7,7 +7,7 @@ import { openModalCommand } from './runtime-services.ts';
|
|
|
7
7
|
* `/qrcode` (no args, aliases /qr /pair) opens the device-pairing modal: a QR of
|
|
8
8
|
* the `#pair=<token>` deep link plus the offer set. Each open mints its own
|
|
9
9
|
* named per-device token, so `/qrcode regenerate` no longer rotates a shared
|
|
10
|
-
* token
|
|
10
|
+
* token, it simply re-opens the modal, which mints a fresh token and QR. The
|
|
11
11
|
* previously-shown token stays valid until you revoke it in
|
|
12
12
|
* /settings → security → devices.
|
|
13
13
|
*/
|
|
@@ -22,9 +22,9 @@ export function registerQrcodeRuntimeCommands(registry: CommandRegistry): void {
|
|
|
22
22
|
if (args[0]?.toLowerCase() === 'regenerate') {
|
|
23
23
|
// Each pairing-modal open mints its own token, so "regenerate" is just a
|
|
24
24
|
// fresh open: the re-pull mints a new named token + QR in place. The
|
|
25
|
-
// prior token is not rotated out from under a live device
|
|
25
|
+
// prior token is not rotated out from under a live device, revoke it
|
|
26
26
|
// explicitly in /settings → security → devices when you no longer need it.
|
|
27
|
-
ctx.print('Opening a fresh pairing QR
|
|
27
|
+
ctx.print('Opening a fresh pairing QR; it mints a new device token. Revoke old ones in /settings → security → devices.');
|
|
28
28
|
openModalCommand(ctx, 'pairing-modal');
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { CommandRegistry } from '../command-registry.ts';
|
|
2
2
|
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
|
-
// /queue
|
|
4
|
+
// /queue, the mid-turn message queue as an editable list.
|
|
5
5
|
//
|
|
6
6
|
// Messages typed while a turn is streaming are QUEUED (they deliver after the
|
|
7
7
|
// turn). Until a message is delivered it stays editable and deletable via the
|
|
8
8
|
// SDK's editQueuedMessage / deleteQueuedMessage verbs; a delivered message has
|
|
9
|
-
// left the queue and is no longer listed
|
|
9
|
+
// left the queue and is no longer listed, delivery is immutability. This
|
|
10
10
|
// command is the editable interface over the same list the composer renders.
|
|
11
11
|
// ---------------------------------------------------------------------------
|
|
12
12
|
|
|
@@ -14,7 +14,7 @@ export function registerQueueRuntimeCommands(registry: CommandRegistry): void {
|
|
|
14
14
|
registry.register({
|
|
15
15
|
name: 'queue',
|
|
16
16
|
aliases: ['q'],
|
|
17
|
-
description: 'Mid-turn message queue
|
|
17
|
+
description: 'Mid-turn message queue: list, edit, or delete still-undelivered messages',
|
|
18
18
|
usage: '[list | edit <n> <text> | delete <n>]',
|
|
19
19
|
argsHint: '[list|edit <n> <text>|delete <n>]',
|
|
20
20
|
handler(args, ctx) {
|
|
@@ -26,7 +26,7 @@ export function registerQueueRuntimeCommands(registry: CommandRegistry): void {
|
|
|
26
26
|
ctx.print('No queued messages. (Messages typed while a turn is streaming queue here until it finishes.)');
|
|
27
27
|
return;
|
|
28
28
|
}
|
|
29
|
-
const lines = [`Queued messages (${list.length})
|
|
29
|
+
const lines = [`Queued messages (${list.length}): editable until delivered:`];
|
|
30
30
|
list.forEach((m, i) => lines.push(` ${i + 1}. ${m.text}`));
|
|
31
31
|
lines.push('Use /queue edit <n> <new text> or /queue delete <n>.');
|
|
32
32
|
ctx.print(lines.join('\n'));
|
|
@@ -47,7 +47,7 @@ export function registerQueueRuntimeCommands(registry: CommandRegistry): void {
|
|
|
47
47
|
const ok = ctx.deleteQueuedMessage?.(target.id) ?? false;
|
|
48
48
|
ctx.print(ok
|
|
49
49
|
? `Deleted queued message #${n}.`
|
|
50
|
-
: `Could not delete message #${n}
|
|
50
|
+
: `Could not delete message #${n}; it was already delivered (delivered messages are immutable).`);
|
|
51
51
|
return;
|
|
52
52
|
}
|
|
53
53
|
|
|
@@ -60,7 +60,7 @@ export function registerQueueRuntimeCommands(registry: CommandRegistry): void {
|
|
|
60
60
|
const ok = ctx.editQueuedMessage?.(target.id, text) ?? false;
|
|
61
61
|
ctx.print(ok
|
|
62
62
|
? `Edited queued message #${n}.`
|
|
63
|
-
: `Could not edit message #${n}
|
|
63
|
+
: `Could not edit message #${n}; it was already delivered (delivered messages are immutable).`);
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
66
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* recall-files-config.ts
|
|
2
|
+
* recall-files-config.ts, TUI-local synthetic setting for the memory file
|
|
3
3
|
* projection directory (`memory.projection.dir`).
|
|
4
4
|
*
|
|
5
|
-
* `memory.projection.dir` is not in the SDK's ConfigKey union
|
|
5
|
+
* `memory.projection.dir` is not in the SDK's ConfigKey union, same
|
|
6
6
|
* situation as worktree.setup.commands (see worktree-setup-config.ts, which
|
|
7
7
|
* this file mirrors): a brand-new top-level config section with no
|
|
8
8
|
* DEFAULT_CONFIG entry, so ConfigManager.get()/set() path resolution can
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* degrades a resolution failure into an honest "Save failed" message.
|
|
11
11
|
*
|
|
12
12
|
* Default: `.goodvibes/memory/projection`, relative to the project working
|
|
13
|
-
* directory
|
|
13
|
+
* directory, under the project's own `.goodvibes/` control directory,
|
|
14
14
|
* alongside the (separate) KV-state memory directory used by the state tool.
|
|
15
15
|
*/
|
|
16
16
|
import type { ConfigKey, ConfigManager, ConfigSetting } from '@pellux/goodvibes-sdk/platform/config';
|
|
@@ -24,7 +24,7 @@ export const MEMORY_PROJECTION_DIR_SYNTHETIC_SETTING: ConfigSetting = {
|
|
|
24
24
|
key: MEMORY_PROJECTION_DIR_CONFIG_KEY,
|
|
25
25
|
type: 'string',
|
|
26
26
|
default: MEMORY_PROJECTION_DIR_DEFAULT,
|
|
27
|
-
description: '/recall files sync writes one markdown file per standing (project/team-scope) memory record here, and commits the directory when it sits inside a git repository. Relative paths resolve against the project working directory. /recall files review reads user edits back from this directory as proposals
|
|
27
|
+
description: '/recall files sync writes one markdown file per standing (project/team-scope) memory record here, and commits the directory when it sits inside a git repository. Relative paths resolve against the project working directory. /recall files review reads user edits back from this directory as proposals; a file edit or deletion never mutates the store directly.',
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
/** Read the configured projection directory, falling back to the default for an absent/malformed value. */
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* recall-files-git.ts
|
|
2
|
+
* recall-files-git.ts, the git seam for memory file projection.
|
|
3
3
|
*
|
|
4
4
|
* The SDK owns the production seam now (`createMemoryProjectionGit`,
|
|
5
5
|
* platform/state): it shells out to the system git, commits with a neutral
|
|
6
6
|
* projection identity (never the operator's), tolerates an unchanged tree,
|
|
7
|
-
* and
|
|
7
|
+
* and, through `projectMemoryToFiles`'s ownership gate, only ever commits
|
|
8
8
|
* to a repository whose toplevel IS the projection directory, initializing
|
|
9
9
|
* one there when needed. A projection directory nested inside some other
|
|
10
10
|
* checkout can never pollute that checkout. This module is a thin local
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
import { createMemoryProjectionGit } from '@pellux/goodvibes-sdk/platform/state';
|
|
14
14
|
import type { MemoryProjectionGit } from '@pellux/goodvibes-sdk/platform/state';
|
|
15
15
|
|
|
16
|
-
/** The projection git seam (see module note
|
|
16
|
+
/** The projection git seam (see module note, SDK-owned behavior). */
|
|
17
17
|
export function createSyncGitSeam(): MemoryProjectionGit {
|
|
18
18
|
return createMemoryProjectionGit();
|
|
19
19
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* recall-files.ts
|
|
2
|
+
* recall-files.ts, `/recall files sync|review|apply`, the git-backed markdown
|
|
3
3
|
* projection surface for standing (project/team-scope) memory records.
|
|
4
4
|
*
|
|
5
5
|
* Round-trip:
|
|
6
|
-
* sync
|
|
6
|
+
* sync , project store records to `<dir>/<id>.md`, git-commit the directory
|
|
7
7
|
* when it sits inside a repo. Read-only against the store.
|
|
8
|
-
* review
|
|
8
|
+
* review, diff the on-disk projection against the current store and print
|
|
9
9
|
* the resulting proposals (a file edit -> 'update', a deleted file
|
|
10
|
-
* for an in-scope record -> 'delete'). PURE
|
|
11
|
-
* apply
|
|
10
|
+
* for an in-scope record -> 'delete'). PURE, no store writes.
|
|
11
|
+
* apply , re-diff fresh, then mutate the store ONLY for the proposal ids
|
|
12
12
|
* the caller explicitly names (or --all), through the memory spine
|
|
13
13
|
* client's own update/delete. Never a silent write.
|
|
14
14
|
*
|
|
@@ -17,14 +17,14 @@
|
|
|
17
17
|
* snapshot from an earlier `review` call.
|
|
18
18
|
*
|
|
19
19
|
* Routes through `getMemorySpine` (not the host-only `knowledgeApi.memory`)
|
|
20
|
-
* per the SDK's memory-wire-full-detach decision
|
|
20
|
+
* per the SDK's memory-wire-full-detach decision, same as every other
|
|
21
21
|
* mutating `/recall` subcommand, so this fully detaches from the local store
|
|
22
22
|
* file when a daemon has been adopted.
|
|
23
23
|
*
|
|
24
24
|
* The memory spine's wire `MemoryUpdatePatch` (SDK platform/runtime/memory-spine)
|
|
25
|
-
* now carries validFrom/validUntil alongside scope/summary/detail/tags
|
|
25
|
+
* now carries validFrom/validUntil alongside scope/summary/detail/tags, a
|
|
26
26
|
* number sets the bound, `null` clears it, and an omitted field leaves it
|
|
27
|
-
* unchanged
|
|
27
|
+
* unchanged, so a proposal whose `desired` changes ONLY the temporal window
|
|
28
28
|
* applies for real over the wire, the same as any other field change.
|
|
29
29
|
*/
|
|
30
30
|
import { existsSync } from 'node:fs';
|
|
@@ -61,7 +61,7 @@ export async function handleRecallFilesSync(args: string[], context: CommandCont
|
|
|
61
61
|
|
|
62
62
|
try {
|
|
63
63
|
// The SDK's ownership gate commits only to a repository whose toplevel IS
|
|
64
|
-
// the projection directory (initializing one there when needed)
|
|
64
|
+
// the projection directory (initializing one there when needed), never
|
|
65
65
|
// to a checkout the directory merely sits inside.
|
|
66
66
|
const report = projectMemoryToFiles(records, dir, { git: createSyncGitSeam() });
|
|
67
67
|
context.print(`[recall] Projected ${report.written.length} record(s) to ${report.dir}`);
|
|
@@ -102,7 +102,7 @@ export async function handleRecallFilesReview(args: string[], context: CommandCo
|
|
|
102
102
|
if (proposals === null) return;
|
|
103
103
|
|
|
104
104
|
if (proposals.length === 0) {
|
|
105
|
-
context.print(`[recall] No changes
|
|
105
|
+
context.print(`[recall] No changes: ${dir} matches the store.`);
|
|
106
106
|
return;
|
|
107
107
|
}
|
|
108
108
|
context.print(`[recall] ${proposals.length} proposal(s) from ${dir}:`);
|
|
@@ -116,7 +116,7 @@ export async function handleRecallFilesApply(args: string[], context: CommandCon
|
|
|
116
116
|
|
|
117
117
|
const applyAll = args.includes('--all') || args.includes('all');
|
|
118
118
|
const ids = new Set(args.filter((a) => a !== '--all' && a !== 'all' && a !== '--dir' && !a.startsWith('.') && !a.startsWith('/')));
|
|
119
|
-
// --dir's value (the token right after it) is not a proposal id
|
|
119
|
+
// --dir's value (the token right after it) is not a proposal id, drop it.
|
|
120
120
|
const dirIdx = args.indexOf('--dir');
|
|
121
121
|
if (dirIdx !== -1 && args[dirIdx + 1]) ids.delete(args[dirIdx + 1]!);
|
|
122
122
|
|
|
@@ -178,5 +178,5 @@ export async function handleRecallFilesApply(args: string[], context: CommandCon
|
|
|
178
178
|
|
|
179
179
|
context.print(`[recall] Applied ${applied.length}, skipped ${skipped.length}, failed ${failed.length}.`);
|
|
180
180
|
for (const proposal of applied) context.print(` applied ${proposal.id} [${proposal.kind}]`);
|
|
181
|
-
for (const { proposal, reason } of failed) context.print(` failed ${proposal.id} [${proposal.kind}]
|
|
181
|
+
for (const { proposal, reason } of failed) context.print(` failed ${proposal.id} [${proposal.kind}]: ${reason}`);
|
|
182
182
|
}
|
|
@@ -5,7 +5,7 @@ import type { MemorySearchFilter } from '@pellux/goodvibes-sdk/platform/state';
|
|
|
5
5
|
import { VALID_CLASSES, VALID_SCOPES, isValidClass, isValidScope, temporalStatusLabel } from './recall-shared.ts';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* The local, host-only `MemoryApi
|
|
8
|
+
* The local, host-only `MemoryApi`, kept for `/recall explain` and `/recall
|
|
9
9
|
* vector` only. Both are ruled explicitly out of the wire catalog in
|
|
10
10
|
* docs/decisions/2026-07-06-memory-wire-full-detach.md (SDK repo): `explain`
|
|
11
11
|
* is a client-side projection over whatever read surface is active, not a
|
|
@@ -24,7 +24,7 @@ export function getMemoryApi(context: CommandContext): MemoryApi | null {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
|
-
* The cross-surface memory spine client
|
|
27
|
+
* The cross-surface memory spine client, routes local when offline/embedded,
|
|
28
28
|
* over the wire when a daemon has been adopted, never both. `/recall`'s
|
|
29
29
|
* browse/link/queue/export/import subcommands use this so they never read a
|
|
30
30
|
* divergent local copy while a daemon owns the canonical store.
|
|
@@ -196,7 +196,7 @@ export async function handleRecallLink(args: string[], context: CommandContext):
|
|
|
196
196
|
}
|
|
197
197
|
const link = await memory.link(fromId, toId, relation);
|
|
198
198
|
if (!link) {
|
|
199
|
-
context.print('[recall] Link failed
|
|
199
|
+
context.print('[recall] Link failed: check that both IDs exist.');
|
|
200
200
|
return;
|
|
201
201
|
}
|
|
202
202
|
context.print(`[recall] Linked: ${fromId} -> ${toId} [${relation}]`);
|
|
@@ -40,7 +40,7 @@ export async function handleRecallQueue(args: string[], context: CommandContext)
|
|
|
40
40
|
}
|
|
41
41
|
context.print(`[recall] Review queue (${queue.length}):`);
|
|
42
42
|
for (const record of queue) {
|
|
43
|
-
const reason = record.staleReason ?
|
|
43
|
+
const reason = record.staleReason ? `: ${record.staleReason}` : '';
|
|
44
44
|
context.print(` ${record.id} [${record.scope}/${record.cls}] ${record.reviewState} ${record.confidence}% ${record.summary}${reason}${temporalStatusLabel(record)}`);
|
|
45
45
|
}
|
|
46
46
|
}
|
|
@@ -107,13 +107,13 @@ export function handleRecallExplain(args: string[], context: CommandContext): vo
|
|
|
107
107
|
* Per-turn passive knowledge injection inspectability.
|
|
108
108
|
*
|
|
109
109
|
* With an explicit agent id, reads `AgentRecord.turnInjections`
|
|
110
|
-
* via `context.ops.agentManager.exportState()
|
|
110
|
+
* via `context.ops.agentManager.exportState()`, the CommandContext-exposed
|
|
111
111
|
* `ShellAgentManagerService` doesn't have a `getStatus`/`list` pair, but
|
|
112
112
|
* `exportState()` returns the same full `AgentRecord[]` (it's what
|
|
113
113
|
* compactConversation() already uses for the same reason).
|
|
114
114
|
*
|
|
115
115
|
* With NO agent id (wiring), renders the MAIN interactive session's own
|
|
116
|
-
* per-turn injection ring
|
|
116
|
+
* per-turn injection ring, `Orchestrator.getTurnInjections()`, threaded onto
|
|
117
117
|
* the command context as `session.getMainSessionTurnInjections`. As of the
|
|
118
118
|
* main session DOES route through the passive-injection engine, so this is the
|
|
119
119
|
* honest main-session default (previously there was no record source, so the
|
|
@@ -23,7 +23,7 @@ export function resolveBundlePath(pathArg: string, shellPaths: ShellPathService)
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
|
-
* Compact inline label for a record's temporal validity window
|
|
26
|
+
* Compact inline label for a record's temporal validity window, appended
|
|
27
27
|
* wherever `/recall` lists records, so an out-of-window record is visibly
|
|
28
28
|
* `[pending]`/`[expired]` rather than silently indistinguishable from an
|
|
29
29
|
* always-valid one. Empty string for 'active' (the common case; no window,
|
|
@@ -4,7 +4,7 @@ import { generateQrMatrix, renderQrToString } from '@pellux/goodvibes-sdk/platfo
|
|
|
4
4
|
import { RELAY_STATE_NOT_READABLE_HERE } from '../../runtime/relay-reachability-bridge.ts';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* Register the /relay command
|
|
7
|
+
* Register the /relay command, the relay's configuration, its reachability
|
|
8
8
|
* state, and a QR-encodable pairing payload for the SDK's outbound
|
|
9
9
|
* zero-knowledge relay (relay.* settings, gated by the `relay-connect` feature
|
|
10
10
|
* flag).
|
|
@@ -12,7 +12,7 @@ import { RELAY_STATE_NOT_READABLE_HERE } from '../../runtime/relay-reachability-
|
|
|
12
12
|
* The CONFIGURATION half is read here, from this terminal's own config. The
|
|
13
13
|
* LIVE half is not: registration state and pairing live in the running daemon's
|
|
14
14
|
* memory (`DaemonServer.getRelayReachability()`), and no verb exposes either to
|
|
15
|
-
* a client
|
|
15
|
+
* a client, so both read 'unavailable' with the reason said out loud rather
|
|
16
16
|
* than a state this terminal is in no position to know. See
|
|
17
17
|
* relay-reachability-bridge.ts.
|
|
18
18
|
*/
|
|
@@ -43,20 +43,20 @@ async function renderStatus(ctx: CommandContext): Promise<void> {
|
|
|
43
43
|
const state = live === 'registered' || live === 'disabled' || live === 'unavailable' ? live : 'offline';
|
|
44
44
|
ctx.print([
|
|
45
45
|
`Relay: ${state}`,
|
|
46
|
-
` rendezvous id: ${cfg.rendezvousId || '(not yet minted
|
|
46
|
+
` rendezvous id: ${cfg.rendezvousId || '(not yet minted; start the daemon to generate one)'}`,
|
|
47
47
|
` url: ${cfg.url || '(not set)'}`,
|
|
48
48
|
` label: ${cfg.label || '(not set)'}`,
|
|
49
49
|
state === 'unavailable'
|
|
50
50
|
? ` ${RELAY_STATE_NOT_READABLE_HERE}`
|
|
51
51
|
: ` live connection state: ${live}`,
|
|
52
|
-
' The relay operator sees only ciphertext and connection metadata
|
|
52
|
+
' The relay operator sees only ciphertext and connection metadata; self-host your own relay for full control.',
|
|
53
53
|
].join('\n'));
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
async function renderPair(ctx: CommandContext): Promise<void> {
|
|
57
57
|
const cfg = relayConfigured(ctx);
|
|
58
58
|
if (!cfg.enabled || !cfg.flagOn) {
|
|
59
|
-
ctx.print('Relay is disabled
|
|
59
|
+
ctx.print('Relay is disabled: turn on relay.enabled in /config relay first.');
|
|
60
60
|
return;
|
|
61
61
|
}
|
|
62
62
|
const externalServices = ctx.platform.externalServices;
|
|
@@ -132,7 +132,7 @@ export function registerRemoteRuntimeCommands(registry: CommandRegistry): void {
|
|
|
132
132
|
' capabilities:',
|
|
133
133
|
...selected.capabilities.map((capability) => ` ${capability.id}: ${capability.supported ? 'yes' : 'no'} (${capability.detail})`),
|
|
134
134
|
' recovery:',
|
|
135
|
-
...selected.recovery.map((action) => ` ${action.command}
|
|
135
|
+
...selected.recovery.map((action) => ` ${action.command}: ${action.reason}`),
|
|
136
136
|
].join('\n'));
|
|
137
137
|
return;
|
|
138
138
|
}
|
|
@@ -157,7 +157,7 @@ export function registerRemoteRuntimeCommands(registry: CommandRegistry): void {
|
|
|
157
157
|
` trustClass: ${selected.negotiation.trustClass}`,
|
|
158
158
|
' capabilities:',
|
|
159
159
|
...selected.capabilities.map((capability) => (
|
|
160
|
-
` ${capability.id}: ${capability.supported ? 'supported' : 'missing'}
|
|
160
|
+
` ${capability.id}: ${capability.supported ? 'supported' : 'missing'}; ${capability.detail}`
|
|
161
161
|
)),
|
|
162
162
|
].join('\n'));
|
|
163
163
|
return;
|
|
@@ -190,7 +190,7 @@ export function registerRemoteRuntimeCommands(registry: CommandRegistry): void {
|
|
|
190
190
|
...(selected.lastError ? [` lastError: ${selected.lastError}`] : []),
|
|
191
191
|
...(selected.taskId ? [` bound task: ${selected.taskId}`] : []),
|
|
192
192
|
' actions:',
|
|
193
|
-
...nextSteps.map((action) => ` ${action.command}
|
|
193
|
+
...nextSteps.map((action) => ` ${action.command}: ${action.reason}`),
|
|
194
194
|
].join('\n'));
|
|
195
195
|
return;
|
|
196
196
|
}
|