@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
|
@@ -42,7 +42,7 @@ export function registerHealthRuntimeCommands(registry: CommandRegistry): void {
|
|
|
42
42
|
name: 'health',
|
|
43
43
|
aliases: ['doctor'],
|
|
44
44
|
description: 'Health workspace for startup posture, service readiness, sandbox posture, and provider health',
|
|
45
|
-
usage: '[report|review|open|setup|services|sandbox|provider|accounts|auth|settings|intelligence|remote|mcp|memory|metrics|continuity|worktrees|maintenance|term|repair [domain]]
|
|
45
|
+
usage: '[report|review|open|setup|services|sandbox|provider|accounts|auth|settings|intelligence|remote|mcp|memory|metrics|continuity|worktrees|maintenance|term|repair [domain]]: bare and report stay a cross-domain transcript report (see also /health provider for the providers modal)',
|
|
46
46
|
async handler(args, ctx) {
|
|
47
47
|
const sub = (args[0] ?? 'review').toLowerCase();
|
|
48
48
|
const readModels = requireReadModels(ctx);
|
|
@@ -54,7 +54,7 @@ export function registerHealthRuntimeCommands(registry: CommandRegistry): void {
|
|
|
54
54
|
|
|
55
55
|
if (sub === 'memory') {
|
|
56
56
|
// The MemoryGovernor snapshot (ops.memory.get): tier, budget vs RSS,
|
|
57
|
-
// per-cache footprints, paused jobs, tripwire
|
|
57
|
+
// per-cache footprints, paused jobs, tripwire, read-only, honest 501
|
|
58
58
|
// when a daemon predates the governor verb.
|
|
59
59
|
const resolution = createMemoryDiagnosticsGateway({
|
|
60
60
|
configManager: ctx.platform.configManager,
|
|
@@ -354,9 +354,9 @@ export function registerHealthRuntimeCommands(registry: CommandRegistry): void {
|
|
|
354
354
|
if (sub === 'term') {
|
|
355
355
|
const caps = probeTermCaps(process.stdout as NodeJS.WriteStream);
|
|
356
356
|
const issues: string[] = [];
|
|
357
|
-
if (caps.capability === 'none') issues.push('terminal reports no color support
|
|
358
|
-
if (caps.capability === 'basic16') issues.push('terminal limited to 16 ANSI colors
|
|
359
|
-
if (!caps.syncedOutput) issues.push('DEC Synchronized Output (mode 2026) is disabled
|
|
357
|
+
if (caps.capability === 'none') issues.push('terminal reports no color support; UI rendering will be degraded (no ANSI colors)');
|
|
358
|
+
if (caps.capability === 'basic16') issues.push('terminal limited to 16 ANSI colors; gradient and true-color UI elements will be approximated');
|
|
359
|
+
if (!caps.syncedOutput) issues.push('DEC Synchronized Output (mode 2026) is disabled; screen-tearing may be visible on slow connections');
|
|
360
360
|
ctx.print([
|
|
361
361
|
'Health Review: Terminal Capabilities',
|
|
362
362
|
` color capability: ${caps.capability}`,
|
|
@@ -490,13 +490,13 @@ export function registerHealthRuntimeCommands(registry: CommandRegistry): void {
|
|
|
490
490
|
ctx.print([
|
|
491
491
|
'Health Review',
|
|
492
492
|
// item 3: /health stays a cross-domain transcript report (it
|
|
493
|
-
// genuinely spans settings/accounts/auth/sandbox/etc
|
|
493
|
+
// genuinely spans settings/accounts/auth/sandbox/etc, no single
|
|
494
494
|
// modal owns this data), but the providers domain DOES have one, so
|
|
495
495
|
// point at it honestly. "/provider" (no domain) is a DIFFERENT
|
|
496
|
-
// command (switch/manage custom providers)
|
|
496
|
+
// command (switch/manage custom providers), the real front door to
|
|
497
497
|
// the providers modal is /health provider (see sub === 'provider'
|
|
498
498
|
// above), so that is what this hint names.
|
|
499
|
-
' see also: the providers modal
|
|
499
|
+
' see also: the providers modal; /health provider',
|
|
500
500
|
` session: ${snapshot.sessionId}`,
|
|
501
501
|
` setup issues: ${snapshot.issues.length}`,
|
|
502
502
|
` service issues: ${snapshot.serviceIssues.length}`,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* hosted-runtime.ts
|
|
2
|
+
* hosted-runtime.ts, `/hosted`, the front door to a conversation the DAEMON
|
|
3
3
|
* runs.
|
|
4
4
|
*
|
|
5
5
|
* Local sessions are unchanged and remain the default experience: a turn typed
|
|
6
6
|
* into the composer runs in this process, exactly as it always has. `/hosted`
|
|
7
|
-
* is the opt-in
|
|
7
|
+
* is the opt-in, it asks the daemon to compose the same loop on its side, so
|
|
8
8
|
* the conversation does not depend on this window staying open.
|
|
9
9
|
*
|
|
10
10
|
* ── The subcommands, and why they are these ───────────────────────────────
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* /hosted say <text…> steer the attached session (ordinary verb)
|
|
19
19
|
* /hosted later <text…> queue a follow-up (ordinary verb)
|
|
20
20
|
* /hosted cancel [callId] cancel one in-flight tool call (ordinary verb)
|
|
21
|
-
* /hosted detach leave
|
|
21
|
+
* /hosted detach leave, the policy the record names then applies
|
|
22
22
|
* /hosted kill [id] end it regardless of policy
|
|
23
23
|
*
|
|
24
24
|
* There is no `/hosted steer` beside `say` and no hosted-only cancel: those
|
|
@@ -54,7 +54,7 @@ let lastListedIds: readonly string[] = [];
|
|
|
54
54
|
export function renderHostedRecordLine(record: HostedSessionRecord, index: number): string {
|
|
55
55
|
const attached = record.attachedClients.length > 0 ? record.attachedClients.join(', ') : 'nobody';
|
|
56
56
|
const ended = record.status === 'terminated'
|
|
57
|
-
?
|
|
57
|
+
? `: ended: ${record.terminatedReason ?? 'no reason recorded'}`
|
|
58
58
|
: '';
|
|
59
59
|
return [
|
|
60
60
|
` ${index + 1}. ${hostedSessionLabel(record)} [${record.status}]${ended}`,
|
|
@@ -84,7 +84,7 @@ export function renderHostedStatus(feed: HostedSessionFeed): string {
|
|
|
84
84
|
` ${record.turnCount} turn(s), ${record.messageCount} message(s)`,
|
|
85
85
|
state.streaming
|
|
86
86
|
? ' live event stream open'
|
|
87
|
-
: ` no live stream
|
|
87
|
+
: ` no live stream: ${state.streamNote ?? 'not subscribed'}`,
|
|
88
88
|
state.runningToolCalls.length > 0
|
|
89
89
|
? ` running: ${state.runningToolCalls.map((call) => `${call.tool} (${call.callId})`).join(', ')}`
|
|
90
90
|
: ' no tool call is running',
|
|
@@ -248,7 +248,7 @@ export function registerHostedRuntimeCommands(registry: CommandRegistry): void {
|
|
|
248
248
|
const records = await seams.client.list({ includeTerminated });
|
|
249
249
|
lastListedIds = records.map((record) => record.id);
|
|
250
250
|
// The session picker reads the same roster, so a list typed here is
|
|
251
|
-
// the list it shows
|
|
251
|
+
// the list it shows, one answer, not two that drift.
|
|
252
252
|
if (!includeTerminated) getSharedHostedSessionRoster().accept(records);
|
|
253
253
|
if (records.length === 0) {
|
|
254
254
|
ctx.print(includeTerminated
|
|
@@ -272,14 +272,14 @@ export function registerHostedRuntimeCommands(registry: CommandRegistry): void {
|
|
|
272
272
|
}
|
|
273
273
|
case 'say':
|
|
274
274
|
case 'later': {
|
|
275
|
-
if (!attachedId) { ctx.print('[hosted] no hosted session is attached
|
|
275
|
+
if (!attachedId) { ctx.print('[hosted] no hosted session is attached; /hosted attach <id> first.'); return; }
|
|
276
276
|
const body = args.slice(1).join(' ').trim();
|
|
277
277
|
if (!body) { ctx.print(`Usage: /hosted ${sub} <text>`); return; }
|
|
278
278
|
if (sub === 'say') await seams.client.steer(attachedId, body);
|
|
279
279
|
else await seams.client.followUp(attachedId, body);
|
|
280
280
|
ctx.print(sub === 'say'
|
|
281
|
-
? '[hosted] sent
|
|
282
|
-
: '[hosted] queued
|
|
281
|
+
? '[hosted] sent: its output arrives on the Hosted Session panel.'
|
|
282
|
+
: '[hosted] queued: it runs after the current turn.');
|
|
283
283
|
return;
|
|
284
284
|
}
|
|
285
285
|
case 'cancel': {
|
|
@@ -290,7 +290,7 @@ export function registerHostedRuntimeCommands(registry: CommandRegistry): void {
|
|
|
290
290
|
const cancelled = await seams.client.cancelToolCall(attachedId, callId);
|
|
291
291
|
ctx.print(cancelled
|
|
292
292
|
? `[hosted] cancelled tool call ${callId}.`
|
|
293
|
-
: `[hosted] the daemon did not cancel ${callId}
|
|
293
|
+
: `[hosted] the daemon did not cancel ${callId}; it may have already settled.`);
|
|
294
294
|
return;
|
|
295
295
|
}
|
|
296
296
|
case 'detach': {
|
|
@@ -298,8 +298,8 @@ export function registerHostedRuntimeCommands(registry: CommandRegistry): void {
|
|
|
298
298
|
const record = await seams.client.detach(attachedId);
|
|
299
299
|
feed.clear();
|
|
300
300
|
ctx.print(record.status === 'terminated'
|
|
301
|
-
? `[hosted] detached
|
|
302
|
-
: '[hosted] detached
|
|
301
|
+
? `[hosted] detached: the session ended (${record.terminatedReason ?? 'no reason recorded'}), which is what its detach policy said would happen.`
|
|
302
|
+
: '[hosted] detached: the session is still running in the daemon and can be reattached.');
|
|
303
303
|
return;
|
|
304
304
|
}
|
|
305
305
|
case 'kill': {
|
|
@@ -307,7 +307,7 @@ export function registerHostedRuntimeCommands(registry: CommandRegistry): void {
|
|
|
307
307
|
if (!target) { ctx.print('Usage: /hosted kill <id> (or attach one first)'); return; }
|
|
308
308
|
const record = await seams.client.kill(target);
|
|
309
309
|
if (target === attachedId) feed.clear();
|
|
310
|
-
ctx.print(`[hosted] ended ${hostedSessionLabel(record)}
|
|
310
|
+
ctx.print(`[hosted] ended ${hostedSessionLabel(record)}: ${record.terminatedReason ?? 'no reason recorded'}.`);
|
|
311
311
|
return;
|
|
312
312
|
}
|
|
313
313
|
default:
|
|
@@ -4,17 +4,17 @@ import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
|
|
|
4
4
|
/**
|
|
5
5
|
* registerImageRuntimeCommands - `/imagine <prompt>`.
|
|
6
6
|
*
|
|
7
|
-
* Named 'imagine', not 'image'
|
|
7
|
+
* Named 'imagine', not 'image', `/image <path> [prompt]` already exists
|
|
8
8
|
* (local-runtime.ts) and does something entirely different (attach a local
|
|
9
9
|
* image file to the next message). Re-verified against the current registry
|
|
10
10
|
* before wiring this in: the brief that scoped this command was written
|
|
11
11
|
* before checking for the collision.
|
|
12
12
|
*
|
|
13
|
-
* First production caller of MediaProviderRegistry.generate()
|
|
13
|
+
* First production caller of MediaProviderRegistry.generate(), the SDK
|
|
14
14
|
* plumbing existed with zero non-test call sites before this command.
|
|
15
15
|
* findProvider('generate') returns whichever generation-capable provider is
|
|
16
16
|
* configured; when none are, the command prints the registry's own
|
|
17
|
-
* per-provider status (id/state/detail) verbatim
|
|
17
|
+
* per-provider status (id/state/detail) verbatim, those detail strings
|
|
18
18
|
* already name the exact env var per builtin provider
|
|
19
19
|
* (builtin-generation-providers.ts's buildStatus()), so this command never
|
|
20
20
|
* has to (and never should) guess or hardcode an env-var name itself.
|
|
@@ -48,7 +48,7 @@ export function registerImageRuntimeCommands(registry: CommandRegistry): void {
|
|
|
48
48
|
lines.push('No media-generation providers are registered in this build.');
|
|
49
49
|
} else {
|
|
50
50
|
for (const status of generationStatuses) {
|
|
51
|
-
lines.push(` ${status.id} (${status.label}): ${status.state}${status.detail ?
|
|
51
|
+
lines.push(` ${status.id} (${status.label}): ${status.state}${status.detail ? `; ${status.detail}` : ''}`);
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
ctx.print(lines.join('\n'));
|
|
@@ -70,7 +70,7 @@ export function registerImageRuntimeCommands(registry: CommandRegistry): void {
|
|
|
70
70
|
const lines = [`Generated ${result.artifacts.length} artifact(s) via ${provider.label} (${result.providerId}).`];
|
|
71
71
|
for (const artifact of result.artifacts) {
|
|
72
72
|
if (!artifact.mimeType.startsWith('image/')) {
|
|
73
|
-
lines.push(` Note: ${provider.label} produced ${artifact.mimeType}, not an image
|
|
73
|
+
lines.push(` Note: ${provider.label} produced ${artifact.mimeType}, not an image; no image-capable provider is configured in this build.`);
|
|
74
74
|
}
|
|
75
75
|
if (artifact.dataBase64) {
|
|
76
76
|
const descriptor = await artifactStore.create({
|
|
@@ -97,7 +97,7 @@ export function registerImageRuntimeCommands(registry: CommandRegistry): void {
|
|
|
97
97
|
sourceUri: artifact.uri,
|
|
98
98
|
metadata: { ...artifact.metadata, generatedBy: result.providerId, remote: true },
|
|
99
99
|
});
|
|
100
|
-
lines.push(` artifact: ${descriptor.id} (remote reference
|
|
100
|
+
lines.push(` artifact: ${descriptor.id} (remote reference; not downloaded)`);
|
|
101
101
|
lines.push(` url: ${artifact.uri}`);
|
|
102
102
|
} else {
|
|
103
103
|
lines.push(' artifact: (no retrievable content returned)');
|
|
@@ -56,11 +56,11 @@ export function registerIntelligenceRuntimeCommands(registry: CommandRegistry):
|
|
|
56
56
|
const sub = (args[0] ?? 'review').toLowerCase();
|
|
57
57
|
if (sub === 'panel' || sub === 'open') {
|
|
58
58
|
// (the purge): 'intelligence'/IntelligencePanel was
|
|
59
|
-
// DELETE-disposition (no surviving human surface
|
|
59
|
+
// DELETE-disposition (no surviving human surface, its read model
|
|
60
60
|
// stays and still backs every subcommand below). There is no alias
|
|
61
61
|
// to resolve through, so this prints an honest notice and opens
|
|
62
62
|
// Fleet instead of throwing "Unknown panel".
|
|
63
|
-
ctx.print('Intelligence panel retired
|
|
63
|
+
ctx.print('Intelligence panel retired: use /intelligence review|diagnostics|symbols|outline|definition|references|hover|repair for the live data. Opening Fleet.');
|
|
64
64
|
try {
|
|
65
65
|
openCommandPanel(ctx, 'fleet');
|
|
66
66
|
} catch {
|
|
@@ -12,7 +12,7 @@ export function handleLocalAuthCommand(args: string[], ctx: CommandContext): voi
|
|
|
12
12
|
if (sub === 'panel' || sub === 'open') {
|
|
13
13
|
// browse view moved to local-auth-modal. The LocalAuthPanel itself is
|
|
14
14
|
// kept (masked password-entry host) but is no longer the /local-auth panel
|
|
15
|
-
// destination
|
|
15
|
+
// destination, masked entry is reached via add-user/rotate-password below.
|
|
16
16
|
ctx.openModal?.('local-auth-modal');
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
@@ -25,7 +25,7 @@ export function handleLocalAuthCommand(args: string[], ctx: CommandContext): voi
|
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
27
27
|
if (!password) {
|
|
28
|
-
// No password supplied
|
|
28
|
+
// No password supplied, open masked-entry mode on the LocalAuthPanel.
|
|
29
29
|
if (ctx.openLocalAuthMaskedEntry) {
|
|
30
30
|
ctx.openLocalAuthMaskedEntry('add-user', username);
|
|
31
31
|
} else {
|
|
@@ -68,7 +68,7 @@ export function handleLocalAuthCommand(args: string[], ctx: CommandContext): voi
|
|
|
68
68
|
return;
|
|
69
69
|
}
|
|
70
70
|
if (!password) {
|
|
71
|
-
// No password supplied
|
|
71
|
+
// No password supplied, open masked-entry mode on the LocalAuthPanel.
|
|
72
72
|
if (ctx.openLocalAuthMaskedEntry) {
|
|
73
73
|
ctx.openLocalAuthMaskedEntry('rotate-password', username);
|
|
74
74
|
} else {
|
|
@@ -69,7 +69,7 @@ export function registerLocalProviderRuntimeCommands(registry: CommandRegistry):
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
} catch {
|
|
72
|
-
ctx.print(`Could not reach ${baseURL}/models
|
|
72
|
+
ctx.print(`Could not reach ${baseURL}/models: creating provider with a minimal starter config.`);
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
let contextWindows: Record<string, number> = {};
|
|
@@ -117,7 +117,7 @@ export function registerLocalProviderRuntimeCommands(registry: CommandRegistry):
|
|
|
117
117
|
}
|
|
118
118
|
ctx.print(`Provider '${name}' added with ${models.length} model(s):\n${discoveredModelIds.length > 0 ? discoveredModelIds.map((id) => ` • ${id} (${(contextWindows[id] ?? 8192).toLocaleString()} ctx)`).join('\n') : ` • ${defaultModel} (starter entry)`}\nThe file watcher will auto-register it shortly.`);
|
|
119
119
|
// Capture the key with the keystrokes masked, straight into the secrets
|
|
120
|
-
// manager
|
|
120
|
+
// manager, never a cleartext argument, never written into the JSON.
|
|
121
121
|
if (ctx.beginConcealedInput) {
|
|
122
122
|
const secretsManager = requireSecretsManager(ctx);
|
|
123
123
|
ctx.print(`Enter the API key for provider '${name}' (input is masked; press Enter to store, Esc to skip if the endpoint needs no key).`);
|
|
@@ -139,7 +139,7 @@ export function registerLocalProviderRuntimeCommands(registry: CommandRegistry):
|
|
|
139
139
|
// has to reach the daemon tier or a locally-hosted endpoint
|
|
140
140
|
// is usable only while this TUI is open.
|
|
141
141
|
await secretsManager.set(keyName, value, { scope: 'daemon', medium: 'secure' });
|
|
142
|
-
ctx.print(`Stored the API key for '${name}' (value hidden). It resolves live for this provider
|
|
142
|
+
ctx.print(`Stored the API key for '${name}' (value hidden). It resolves live for this provider; no restart needed.`);
|
|
143
143
|
} catch (error) {
|
|
144
144
|
ctx.print(`Could not store the key for '${name}': ${summarizeError(error)}`);
|
|
145
145
|
}
|
|
@@ -37,7 +37,7 @@ function toggleBlocks(typeFilter: string, collapsed: boolean, ctx: CommandContex
|
|
|
37
37
|
// A merged assistant turn (type 'assistant_turn', see
|
|
38
38
|
// conversation-turn-structure.ts) owns the whole tool subtree beneath its
|
|
39
39
|
// header, so '/expand tool'/'collapse tool' treats it the same as a plain
|
|
40
|
-
// 'tool' block
|
|
40
|
+
// 'tool' block, toggling the header's collapse key shows or hides every
|
|
41
41
|
// tool row underneath it.
|
|
42
42
|
const matchesType = typeFilter === 'all'
|
|
43
43
|
|| (typeFilter === 'tool' && (block.type === 'tool' || block.type === 'assistant_turn'))
|
|
@@ -50,7 +50,7 @@ function toggleBlocks(typeFilter: string, collapsed: boolean, ctx: CommandContex
|
|
|
50
50
|
// Expanding a turn also expands each result's own collapse key in the
|
|
51
51
|
// same pass. A result hidden by a collapsed turn pushes no BlockMeta of
|
|
52
52
|
// its own, so it never surfaces from this loop to be toggled
|
|
53
|
-
// individually
|
|
53
|
+
// individually, without this, '/expand tool' would only open the turn
|
|
54
54
|
// header and each result would still render at its own default collapse
|
|
55
55
|
// state, needing a second pass. '/collapse tool' needs no matching step:
|
|
56
56
|
// collapsing the turn hides every result regardless of its own key.
|
|
@@ -59,7 +59,7 @@ function toggleBlocks(typeFilter: string, collapsed: boolean, ctx: CommandContex
|
|
|
59
59
|
const memberKey = `msg_${memberIdx}`;
|
|
60
60
|
ctx.session.conversationManager.setCollapsed(memberKey, false);
|
|
61
61
|
// An explicit /expand is a deliberate user action on this key, same
|
|
62
|
-
// as Tab/Ctrl+Y/Ctrl+B
|
|
62
|
+
// as Tab/Ctrl+Y/Ctrl+B, exempts it from search's close-time
|
|
63
63
|
// auto-re-collapse (see ConversationManager.noteUserTouch).
|
|
64
64
|
ctx.session.conversationManager.searchExpansion.noteUserTouch(memberKey);
|
|
65
65
|
}
|
|
@@ -88,17 +88,17 @@ export function registerLocalRuntimeCommands(registry: CommandRegistry): void {
|
|
|
88
88
|
registry.register({
|
|
89
89
|
name: 'tools',
|
|
90
90
|
aliases: ['t'],
|
|
91
|
-
description: 'List available tools and review compact native tool
|
|
91
|
+
description: 'List available tools and review compact native tool capabilities',
|
|
92
92
|
usage: '[review|panel]',
|
|
93
93
|
handler(args, ctx) {
|
|
94
94
|
const sub = (args[0] ?? '').toLowerCase();
|
|
95
95
|
if (sub === 'panel' || sub === 'review') {
|
|
96
96
|
// (the purge): 'tools'/ToolInspectorPanel was DELETE-disposition
|
|
97
|
-
// (no surviving human surface
|
|
97
|
+
// (no surviving human surface, tool results render inline in the
|
|
98
98
|
// transcript, plus a per-node tool list in Fleet). There is no alias
|
|
99
99
|
// to resolve through, so this prints an honest notice and opens
|
|
100
100
|
// Fleet instead of the retired inspector.
|
|
101
|
-
ctx.print('Tools panel retired
|
|
101
|
+
ctx.print('Tools panel retired: tool activity now renders inline in the transcript and per-agent in the Fleet panel. Opening Fleet.');
|
|
102
102
|
try {
|
|
103
103
|
openCommandPanel(ctx, 'fleet');
|
|
104
104
|
} catch {
|
|
@@ -407,7 +407,7 @@ export function registerLocalRuntimeCommands(registry: CommandRegistry): void {
|
|
|
407
407
|
} catch (e) {
|
|
408
408
|
ctx.print(`Live model discovery failed: ${summarizeError(e)}`);
|
|
409
409
|
}
|
|
410
|
-
if (!catalogOk || !benchmarksOk || !limitsOk || !discoveryOk) ctx.print('Some refreshes failed
|
|
410
|
+
if (!catalogOk || !benchmarksOk || !limitsOk || !discoveryOk) ctx.print('Some refreshes failed: see messages above.');
|
|
411
411
|
},
|
|
412
412
|
});
|
|
413
413
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* mail-runtime.ts
|
|
2
|
+
* mail-runtime.ts, `/mail`, the terminal surface over the daemon's mail
|
|
3
3
|
* capability.
|
|
4
4
|
*
|
|
5
5
|
* This command implements no mail. Every verb here is one call into the
|
|
6
6
|
* gateway method catalog, where `src/daemon/handlers/email/` owns IMAP, SMTP,
|
|
7
7
|
* settings resolution, the credential read, and the confirmation gate. What
|
|
8
8
|
* lives in this file is argument parsing, rendering, and an honest refusal when
|
|
9
|
-
* the capability is not set up
|
|
9
|
+
* the capability is not set up, nothing else.
|
|
10
10
|
*
|
|
11
11
|
* ## What is exposed, and what is not
|
|
12
12
|
*
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
* without leaving the terminal is squarely what this product is for, and
|
|
15
15
|
* because a draft changes nothing outside the account's own Drafts folder.
|
|
16
16
|
*
|
|
17
|
-
* Sending is exposed too
|
|
18
|
-
* that is not wired up
|
|
17
|
+
* Sending is exposed too, a shipped route with no way to reach it is a route
|
|
18
|
+
* that is not wired up, but never in one step. `/mail send` first renders
|
|
19
19
|
* exactly what would leave the machine and stops; only a re-run carrying
|
|
20
20
|
* `--confirm` sets both flags the daemon's gate demands. That mirrors the
|
|
21
21
|
* preview-then-confirm shape `/review` uses for hunk reverts, and it means the
|
|
@@ -65,12 +65,12 @@ function truncate(value: string, width: number): string {
|
|
|
65
65
|
|
|
66
66
|
export function renderInboxList(messages: readonly InboxMessage[]): string {
|
|
67
67
|
if (messages.length === 0) return 'Inbox is empty (nothing matched).';
|
|
68
|
-
const lines = [`Inbox
|
|
68
|
+
const lines = [`Inbox: ${messages.length} message${messages.length === 1 ? '' : 's'}:`];
|
|
69
69
|
for (const message of messages) {
|
|
70
70
|
const mark = message.unread ? '●' : ' ';
|
|
71
71
|
lines.push(` ${mark} ${String(message.uid).padStart(6)} ${truncate(message.from, 28).padEnd(28)} ${truncate(message.subject, 48)}`);
|
|
72
72
|
}
|
|
73
|
-
lines.push('', ' /mail read <uid
|
|
73
|
+
lines.push('', ' /mail read <uid>: open one message');
|
|
74
74
|
return lines.join('\n');
|
|
75
75
|
}
|
|
76
76
|
|
|
@@ -191,7 +191,7 @@ async function listInbox(ctx: CommandContext, gateway: Gateway, limit: number, w
|
|
|
191
191
|
ctx.print(renderConnectionStatus({
|
|
192
192
|
surface: 'mail',
|
|
193
193
|
state: 'ready',
|
|
194
|
-
detail: 'Mail is connected
|
|
194
|
+
detail: 'Mail is connected: the daemon reached the server and returned a result.',
|
|
195
195
|
nextActions: [],
|
|
196
196
|
}));
|
|
197
197
|
}
|
|
@@ -202,7 +202,7 @@ async function listInbox(ctx: CommandContext, gateway: Gateway, limit: number, w
|
|
|
202
202
|
async function readMessage(ctx: CommandContext, gateway: Gateway, rawUid: string | undefined): Promise<void> {
|
|
203
203
|
const uid = Number(rawUid);
|
|
204
204
|
if (!Number.isFinite(uid) || uid <= 0) {
|
|
205
|
-
ctx.print('Usage: /mail read <uid
|
|
205
|
+
ctx.print('Usage: /mail read <uid>; the uid column from /mail list.');
|
|
206
206
|
return;
|
|
207
207
|
}
|
|
208
208
|
await withStatusOnFailure(ctx, gateway, 'read', async () => {
|
|
@@ -221,7 +221,7 @@ async function compose(ctx: CommandContext, gateway: Gateway, verb: 'draft' | 's
|
|
|
221
221
|
if (parsed === null) {
|
|
222
222
|
ctx.print([
|
|
223
223
|
`Usage: /mail ${verb} <to | subject | body>`,
|
|
224
|
-
' Three fields separated by
|
|
224
|
+
' Three fields separated by |, for example:',
|
|
225
225
|
` /mail ${verb} me@example.com | Build is green | All gates passed.`,
|
|
226
226
|
].join('\n'));
|
|
227
227
|
return;
|
|
@@ -184,7 +184,7 @@ export function registerMcpRuntimeCommands(registry: CommandRegistry): void {
|
|
|
184
184
|
lines.push(`\n [${tool.serverName}]`);
|
|
185
185
|
lastServer = tool.serverName;
|
|
186
186
|
}
|
|
187
|
-
lines.push(` ${tool.toolName}${tool.description ?
|
|
187
|
+
lines.push(` ${tool.toolName}${tool.description ? `: ${tool.description}` : ''}`);
|
|
188
188
|
}
|
|
189
189
|
ctx.print(lines.join('\n'));
|
|
190
190
|
return;
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Implements the Project Memory Substrate commands:
|
|
5
5
|
*
|
|
6
|
-
* /recall add <class> <summary>
|
|
6
|
+
* /recall add <class> <summary> , Add a new memory record
|
|
7
7
|
* /recall add <class> <summary> --detail <text> --tags <tag,tag>
|
|
8
|
-
* /recall search [query]
|
|
9
|
-
* /recall search --cls <class>
|
|
10
|
-
* /recall link <fromId> <toId> <relation
|
|
11
|
-
* /recall get <id>
|
|
12
|
-
* /recall list [class]
|
|
13
|
-
* /recall remove <id>
|
|
8
|
+
* /recall search [query] , Search memory records
|
|
9
|
+
* /recall search --cls <class> , Filter by class
|
|
10
|
+
* /recall link <fromId> <toId> <relation>, Link two records
|
|
11
|
+
* /recall get <id> , Show a single record with provenance
|
|
12
|
+
* /recall list [class] , List all records (optionally by class)
|
|
13
|
+
* /recall remove <id> , Delete a record
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
import type { SlashCommand, CommandContext } from '../command-registry.ts';
|
|
@@ -27,17 +27,17 @@ import { handleRecallFilesApply, handleRecallFilesReview, handleRecallFilesSync
|
|
|
27
27
|
* item 3 divergence note (historical): the work order that shipped
|
|
28
28
|
* this command named its front door "/memory", but at the time `/memory` was
|
|
29
29
|
* already a distinct, unrelated command (session-pinned sticky notes,
|
|
30
|
-
* src/input/commands/session-content.ts) with no modal surface
|
|
30
|
+
* src/input/commands/session-content.ts) with no modal surface, so that
|
|
31
31
|
* work order deliberately did NOT touch /memory and used /recall instead.
|
|
32
32
|
*
|
|
33
|
-
* Update from the core-verb naming pass (MEMORY fragmentation
|
|
33
|
+
* Update from the core-verb naming pass (MEMORY fragmentation, worst-class
|
|
34
34
|
* collision #2): the agent's own `/memory` command was a plain alias for its
|
|
35
35
|
* `/recall`-equivalent the whole time, meaning "/memory" meant two unrelated
|
|
36
36
|
* things depending which surface you were on. The session-notes command was
|
|
37
37
|
* renamed to `/note` (session-content.ts) to free the word, and `/memory` is
|
|
38
|
-
* now registered here as a real alias of `/recall
|
|
38
|
+
* now registered here as a real alias of `/recall`, the word means the same
|
|
39
39
|
* durable Project Memory Substrate on both surfaces. The modal that exists
|
|
40
|
-
* for this data
|
|
40
|
+
* for this data, the Project Memory Substrate, is still `memory-modal.ts`,
|
|
41
41
|
* owned by THIS command, confirmed by the panel-id redirect
|
|
42
42
|
* `registerModalRedirect('memory', 'memory-modal')` in builtin-modals.ts.
|
|
43
43
|
*/
|
|
@@ -79,12 +79,12 @@ export const recallCommand: SlashCommand = {
|
|
|
79
79
|
name: 'recall',
|
|
80
80
|
aliases: ['rc', 'memory', 'mem'],
|
|
81
81
|
description: 'Bare opens the Memory modal; project memory subcommands add decisions, constraints, incidents, and patterns with provenance',
|
|
82
|
-
usage: '[<subcommand> [args]]
|
|
82
|
+
usage: '[<subcommand> [args]]: bare opens the modal; report prints the subcommand usage text',
|
|
83
83
|
argsHint: 'add|search|link|get|list|remove|report',
|
|
84
84
|
handler: async (args: string[], context: CommandContext): Promise<void> => {
|
|
85
85
|
const [sub, ...rest] = args;
|
|
86
86
|
|
|
87
|
-
// item 3: bare `/recall` opens the memory-modal surface
|
|
87
|
+
// item 3: bare `/recall` opens the memory-modal surface, the old
|
|
88
88
|
// bare/unknown-subcommand usage block moved to an explicit `report`
|
|
89
89
|
// subcommand (scriptability preserved: /recall report).
|
|
90
90
|
if (sub === undefined) {
|
|
@@ -73,7 +73,7 @@ export function registerNotifyRuntimeCommands(registry: CommandRegistry): void {
|
|
|
73
73
|
ctx.print(`Testing ${urls.length} webhook${urls.length !== 1 ? 's' : ''}...`);
|
|
74
74
|
notifier.setUrls(urls);
|
|
75
75
|
const results = await notifier.test();
|
|
76
|
-
ctx.print(results.map((r) => r.ok ? ` [ok] ${r.url}` : ` [fail] ${r.url}
|
|
76
|
+
ctx.print(results.map((r) => r.ok ? ` [ok] ${r.url}` : ` [fail] ${r.url}: ${r.error ?? 'unknown error'}`).join('\n'));
|
|
77
77
|
return;
|
|
78
78
|
}
|
|
79
79
|
|
|
@@ -8,7 +8,7 @@ import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
|
|
|
8
8
|
* [top|bottom]` (item 4). Splits the args array in place (removing the
|
|
9
9
|
* flag + its value) so positional `pane` parsing downstream is unaffected by
|
|
10
10
|
* where the flag appears. Only `open fleet` currently has a deep-link
|
|
11
|
-
* consumer (FleetPanel.receiveDeepLink)
|
|
11
|
+
* consumer (FleetPanel.receiveDeepLink), other panel ids just ignore an
|
|
12
12
|
* unused target via PanelManager's optional-chaining delivery.
|
|
13
13
|
*/
|
|
14
14
|
function extractTargetFlag(rest: string[]): PanelDeepLinkTarget | undefined {
|
|
@@ -33,7 +33,7 @@ export function registerOperatorPanelCommand(registry: CommandRegistry): void {
|
|
|
33
33
|
const sub = args[0]?.toLowerCase() ?? '';
|
|
34
34
|
if (!sub || sub === 'toggle') {
|
|
35
35
|
// (the purge): 'panel-list' (the browse-all-panels picker) was
|
|
36
|
-
// DELETE-disposition
|
|
36
|
+
// DELETE-disposition, a picker over a handful of panels is dead
|
|
37
37
|
// weight now (see the Ctrl+P selectionModal repoint in
|
|
38
38
|
// shell/ui-openers.ts for its interactive replacement). Bare
|
|
39
39
|
// `/panel` and `/panel toggle` now do what "toggle" actually means:
|
|
@@ -43,7 +43,7 @@ export function registerOperatorPanelCommand(registry: CommandRegistry): void {
|
|
|
43
43
|
pm.toggle();
|
|
44
44
|
ctx.renderRequest();
|
|
45
45
|
} else if (sub === 'list') {
|
|
46
|
-
// Print a text listing instead of opening a picker panel
|
|
46
|
+
// Print a text listing instead of opening a picker panel, grouped
|
|
47
47
|
// by category from the live registry, so this can never drift from
|
|
48
48
|
// what's actually registered.
|
|
49
49
|
const byCategory = pm.getTypesByCategory();
|
|
@@ -51,7 +51,7 @@ export function registerOperatorPanelCommand(registry: CommandRegistry): void {
|
|
|
51
51
|
for (const [category, entries] of byCategory) {
|
|
52
52
|
lines.push(`${category}:`);
|
|
53
53
|
for (const entry of entries) {
|
|
54
|
-
lines.push(` ${entry.icon} ${entry.id}
|
|
54
|
+
lines.push(` ${entry.icon} ${entry.id}: ${entry.name}`);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
ctx.print(lines.length > 0 ? lines.join('\n') : 'No panels registered.');
|
|
@@ -72,7 +72,7 @@ export function registerOperatorPanelCommand(registry: CommandRegistry): void {
|
|
|
72
72
|
// claiming "Panel opened: <id>".
|
|
73
73
|
const redirectTarget = pm.getModalRedirect(id);
|
|
74
74
|
// focus rule 1a: the command path leaves focus in the composer
|
|
75
|
-
// ("mid-command-flow")
|
|
75
|
+
// ("mid-command-flow"), showPanel does not grab panel focus here.
|
|
76
76
|
// forward the deep-link target so the panel lands on the row.
|
|
77
77
|
if (ctx.showPanel) ctx.showPanel(id, pane as 'top' | 'bottom' | undefined, target);
|
|
78
78
|
else {
|
|
@@ -81,13 +81,13 @@ export function registerOperatorPanelCommand(registry: CommandRegistry): void {
|
|
|
81
81
|
ctx.renderRequest();
|
|
82
82
|
}
|
|
83
83
|
if (redirectTarget) {
|
|
84
|
-
ctx.print(`"${id}" moved to the ${redirectTarget} modal
|
|
84
|
+
ctx.print(`"${id}" moved to the ${redirectTarget} modal; opening it.`);
|
|
85
85
|
} else {
|
|
86
86
|
ctx.print(`Panel opened: ${id}${pane ? ` (${pane} pane)` : ''}`);
|
|
87
87
|
}
|
|
88
88
|
} catch (e) {
|
|
89
89
|
// A deleted/unknown panel id throws "No panel type registered with
|
|
90
|
-
// id: <id>" from PanelManager.open
|
|
90
|
+
// id: <id>" from PanelManager.open, surface the same friendly line
|
|
91
91
|
// the bare-/panel path uses instead of leaking the raw error. Any
|
|
92
92
|
// genuinely unexpected failure still shows its real message.
|
|
93
93
|
const message = summarizeError(e);
|
|
@@ -170,7 +170,7 @@ export function registerOperatorPanelCommand(registry: CommandRegistry): void {
|
|
|
170
170
|
const id = args[0]!;
|
|
171
171
|
try {
|
|
172
172
|
// bare `/panel <id>` is the same command path as `/panel open
|
|
173
|
-
// <id
|
|
173
|
+
// <id>`, composer stays focused.
|
|
174
174
|
if (ctx.showPanel) ctx.showPanel(id);
|
|
175
175
|
else {
|
|
176
176
|
pm.open(id);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* operator-rpc.ts
|
|
2
|
+
* operator-rpc.ts, the command layer's handle on the daemon.
|
|
3
3
|
*
|
|
4
4
|
* The resolution itself (is the daemon enabled, what base URL, what bearer)
|
|
5
5
|
* moved to runtime/client/operator-endpoint.ts when the terminal app became a
|
|
6
|
-
* pure client: the runtime seams
|
|
7
|
-
* fleet, tasks, devices, checkpoints
|
|
6
|
+
* pure client: the runtime seams, approvals, config, credentials, sessions,
|
|
7
|
+
* fleet, tasks, devices, checkpoints, all need the same answer, and two copies
|
|
8
8
|
* of it is how one call ended up on a DirectTransport while another made a real
|
|
9
9
|
* request. This module keeps the command-context-shaped entry point and
|
|
10
10
|
* re-exports the rest so no command import site had to change.
|
|
@@ -66,9 +66,9 @@ export function registerOperatorRuntimeCommands(registry: CommandRegistry): void
|
|
|
66
66
|
registry.register({
|
|
67
67
|
name: 'profiles',
|
|
68
68
|
// The singular `profile` alias was given up to /profile, the owner profile
|
|
69
|
-
// (docs/owner-profile.md). These are two unrelated things
|
|
69
|
+
// (docs/owner-profile.md). These are two unrelated things, this command
|
|
70
70
|
// loads saved display/provider settings presets, and the other one is what
|
|
71
|
-
// the platform knows about the person who owns it
|
|
71
|
+
// the platform knows about the person who owns it, and the singular word
|
|
72
72
|
// now belongs to the second. `/profiles` is unchanged; only the abbreviation
|
|
73
73
|
// moved. See the naming note in docs/owner-profile.md §3.
|
|
74
74
|
description: 'Browse and load config profiles',
|
|
@@ -254,7 +254,7 @@ export function registerOperatorRuntimeCommands(registry: CommandRegistry): void
|
|
|
254
254
|
|
|
255
255
|
registry.register({
|
|
256
256
|
name: 'tool',
|
|
257
|
-
description: '
|
|
257
|
+
description: 'Verify registered tool contracts',
|
|
258
258
|
usage: 'verify <name> | verify-all | contract show <name>',
|
|
259
259
|
argsHint: 'verify <name> | verify-all | contract show <name>',
|
|
260
260
|
handler(args, ctx) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { CommandRegistry } from '../command-registry.ts';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* /palette
|
|
4
|
+
* /palette, open the fuzzy command palette, a searchable picker over every
|
|
5
5
|
* registered slash command. The palette itself is generated live from the
|
|
6
6
|
* registry (see openCommandPalette in shell/ui-openers.ts); this command is
|
|
7
7
|
* just the discoverable front door, mirroring the Ctrl+K chord.
|