@pellux/goodvibes-tui 2.0.14 → 2.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.goodvibes/GOODVIBES.md +1 -1
- package/.goodvibes/agents/reviewer.md +8 -8
- package/.goodvibes/skills/add-provider/SKILL.md +22 -22
- package/CHANGELOG.md +35 -0
- package/README.md +40 -29
- package/docs/README.md +1 -1
- package/docs/foundation-artifacts/README.md +5 -5
- package/docs/foundation-artifacts/operator-contract.json +123 -123
- package/package.json +12 -10
- package/scripts/postinstall.js +3 -3
- package/src/audio/activation-sound.ts +7 -7
- package/src/audio/capture.ts +7 -7
- package/src/audio/onnxruntime-assets.d.ts +1 -1
- package/src/audio/player.ts +4 -4
- package/src/audio/spoken-turn-wiring.ts +4 -4
- package/src/audio/voice-capture-wiring.ts +5 -5
- package/src/audio/voice-input-session.ts +3 -3
- package/src/audio/wake-inference.ts +13 -8
- package/src/audio/wake-runtime.ts +10 -10
- package/src/cli/completions/generate.ts +2 -2
- package/src/cli/doctor.ts +13 -13
- package/src/cli/ensure-goodvibes-gitignore.ts +3 -3
- package/src/cli/entrypoint.ts +3 -3
- package/src/cli/help.ts +6 -6
- package/src/cli/hooks-command.ts +4 -4
- package/src/cli/hooks-report.ts +4 -4
- package/src/cli/launch-auto-update.ts +17 -17
- package/src/cli/management-commands.ts +8 -8
- package/src/cli/management-utils.ts +3 -3
- package/src/cli/management.ts +1 -1
- package/src/cli/plugin-bundles-command.ts +10 -10
- package/src/cli/plugin-command.ts +9 -9
- package/src/cli/service-posture.ts +1 -1
- package/src/cli/status.ts +10 -10
- package/src/cli/surface-command.ts +4 -4
- package/src/cli/tui-startup.ts +23 -23
- package/src/config/run-daemon-config-migration.ts +3 -3
- package/src/config/secret-config.ts +10 -10
- package/src/config/surface.ts +1 -1
- package/src/config/tui-extension-settings.ts +8 -8
- package/src/core/active-model-identity.ts +7 -7
- package/src/core/approval-alert.ts +5 -5
- package/src/core/bookmark-navigation.ts +3 -3
- package/src/core/budget-breach-notifier.ts +6 -6
- package/src/core/compaction-receipt.ts +8 -8
- package/src/core/composer-state.ts +2 -2
- package/src/core/context-usage.ts +1 -1
- package/src/core/conversation-compaction-render.ts +3 -3
- package/src/core/conversation-event-navigation.ts +2 -2
- package/src/core/conversation-fold.ts +9 -9
- package/src/core/conversation-line-cache.ts +14 -14
- package/src/core/conversation-render-context.ts +6 -6
- package/src/core/conversation-rendering.ts +27 -30
- package/src/core/conversation-search-expansion.ts +6 -6
- package/src/core/conversation-splash-state.ts +3 -3
- package/src/core/conversation-turn-structure.ts +13 -13
- package/src/core/conversation-types.ts +3 -3
- package/src/core/conversation-user-receipts.ts +5 -5
- package/src/core/conversation.ts +17 -17
- package/src/core/format-user-error.ts +5 -5
- package/src/core/long-task-notifier.ts +9 -9
- package/src/core/memory-diagnostics-gateway.ts +8 -8
- package/src/core/memory-provenance.ts +5 -5
- package/src/core/model-routing-chip.ts +3 -3
- package/src/core/pairing-tailscale-gateway.ts +3 -3
- package/src/core/permission-mode.ts +5 -5
- package/src/core/power-chip-source.ts +3 -3
- package/src/core/power-status.ts +8 -8
- package/src/core/rewind-receipt.ts +6 -6
- package/src/core/session-resume-core.ts +8 -8
- package/src/core/stream-event-wiring.ts +36 -36
- package/src/core/stream-stall-watchdog.ts +4 -4
- package/src/core/system-message-noise.ts +7 -7
- package/src/core/system-message-router.ts +10 -10
- package/src/core/terminal-notifier.ts +5 -5
- package/src/core/turn-budget-outcome.ts +5 -5
- package/src/core/turn-cancellation.ts +3 -3
- package/src/core/turn-event-wiring.ts +16 -16
- package/src/core/voice-capture-status.ts +2 -2
- package/src/core/voice-provision-gateway.ts +12 -12
- package/src/core/voice-provision-status.ts +19 -19
- package/src/core/voice-stt-gateway.ts +6 -6
- package/src/core/wake-provision-runner.ts +7 -7
- package/src/core/wake-provision-status.ts +17 -17
- package/src/core/workstream-notification.ts +8 -8
- package/src/export/gist-uploader.ts +7 -7
- package/src/input/autocomplete.ts +3 -3
- package/src/input/bookmark-modal.ts +1 -1
- package/src/input/command-args-hint.ts +2 -2
- package/src/input/command-reference.ts +9 -9
- package/src/input/command-registry.ts +32 -32
- package/src/input/commands/acp-runtime.ts +6 -6
- package/src/input/commands/calendar-runtime.ts +9 -9
- package/src/input/commands/channel-pairing.ts +11 -11
- package/src/input/commands/channel-runtime.ts +1 -1
- package/src/input/commands/checkin-runtime.ts +4 -4
- package/src/input/commands/checkpoint-runtime.ts +4 -4
- package/src/input/commands/ci-runtime.ts +4 -4
- package/src/input/commands/cluster-runtime.ts +3 -3
- package/src/input/commands/codebase-runtime.ts +16 -16
- package/src/input/commands/config.ts +6 -6
- package/src/input/commands/connection-status.ts +12 -12
- package/src/input/commands/context-window.ts +2 -2
- package/src/input/commands/cost-attribution-format.ts +4 -4
- package/src/input/commands/cost-runtime.ts +2 -2
- package/src/input/commands/devices-runtime.ts +7 -7
- package/src/input/commands/diff-runtime.ts +2 -2
- package/src/input/commands/editor-runtime.ts +1 -1
- package/src/input/commands/eval.ts +4 -4
- package/src/input/commands/experience-runtime.ts +1 -1
- package/src/input/commands/git-runtime.ts +3 -3
- package/src/input/commands/graph-runtime.ts +3 -3
- package/src/input/commands/guidance-runtime.ts +1 -1
- package/src/input/commands/health-metrics-format.ts +2 -2
- package/src/input/commands/health-runtime.ts +8 -8
- package/src/input/commands/hosted-runtime.ts +13 -13
- package/src/input/commands/image-runtime.ts +6 -6
- package/src/input/commands/intelligence-runtime.ts +2 -2
- package/src/input/commands/local-auth-runtime.ts +3 -3
- package/src/input/commands/local-provider-runtime.ts +3 -3
- package/src/input/commands/local-runtime.ts +7 -7
- package/src/input/commands/mail-runtime.ts +9 -9
- package/src/input/commands/mcp-runtime.ts +1 -1
- package/src/input/commands/memory.ts +13 -13
- package/src/input/commands/notify-runtime.ts +1 -1
- package/src/input/commands/operator-panel-runtime.ts +8 -8
- package/src/input/commands/operator-rpc.ts +3 -3
- package/src/input/commands/operator-runtime.ts +3 -3
- package/src/input/commands/palette-runtime.ts +1 -1
- package/src/input/commands/payment-card-intake.ts +17 -17
- package/src/input/commands/permissions-provenance.ts +7 -7
- package/src/input/commands/permissions-runtime.ts +1 -1
- package/src/input/commands/planning-runtime.ts +9 -9
- package/src/input/commands/platform-services-runtime.ts +2 -2
- package/src/input/commands/policy-dispatch.ts +6 -6
- package/src/input/commands/power-runtime.ts +6 -6
- package/src/input/commands/principals-runtime.ts +3 -3
- package/src/input/commands/product-runtime.ts +3 -3
- package/src/input/commands/profile-render.ts +13 -13
- package/src/input/commands/profile-runtime.ts +13 -13
- package/src/input/commands/profile-types.ts +13 -13
- package/src/input/commands/provider-accounts-runtime.ts +5 -5
- package/src/input/commands/provider.ts +10 -10
- package/src/input/commands/qrcode-runtime.ts +3 -3
- package/src/input/commands/queue-runtime.ts +6 -6
- package/src/input/commands/recall-files-config.ts +4 -4
- package/src/input/commands/recall-files-git.ts +3 -3
- package/src/input/commands/recall-files.ts +12 -12
- package/src/input/commands/recall-query.ts +3 -3
- package/src/input/commands/recall-review.ts +3 -3
- package/src/input/commands/recall-shared.ts +1 -1
- package/src/input/commands/relay-runtime.ts +5 -5
- package/src/input/commands/remote-runtime.ts +3 -3
- package/src/input/commands/review-runtime.ts +8 -8
- package/src/input/commands/rewind-runtime.ts +21 -21
- package/src/input/commands/runtime-services.ts +1 -2
- package/src/input/commands/schedule-nl.ts +2 -2
- package/src/input/commands/schedule-runtime.ts +2 -2
- package/src/input/commands/secret-runtime.ts +3 -3
- package/src/input/commands/session-content.ts +7 -7
- package/src/input/commands/session-picker-filter.ts +3 -3
- package/src/input/commands/session-workflow.ts +10 -10
- package/src/input/commands/session.ts +15 -15
- package/src/input/commands/settings-sync-runtime.ts +2 -2
- package/src/input/commands/share-runtime.ts +4 -4
- package/src/input/commands/shell-core.ts +11 -11
- package/src/input/commands/tasks-runtime.ts +4 -4
- package/src/input/commands/test-runtime.ts +6 -6
- package/src/input/commands/tts-runtime.ts +4 -4
- package/src/input/commands/update-runtime.ts +27 -27
- package/src/input/commands/websearch-runtime.ts +2 -2
- package/src/input/commands/work-plan-runtime.ts +2 -2
- package/src/input/commands/workstream-attempt-dependents.ts +4 -4
- package/src/input/commands/workstream-attempts.ts +16 -16
- package/src/input/commands/workstream-runtime.ts +36 -36
- package/src/input/commands/worktree-runtime.ts +6 -6
- package/src/input/composer-capture.ts +5 -5
- package/src/input/concealed-input.ts +2 -2
- package/src/input/config-modal-types.ts +16 -16
- package/src/input/config-modal.ts +30 -30
- package/src/input/daemon-owned-settings-descriptions.ts +4 -4
- package/src/input/delete-key-policy.ts +1 -1
- package/src/input/exec-env-scrub-config.ts +7 -7
- package/src/input/feature-unit-layout.ts +5 -5
- package/src/input/feed-context-factory.ts +38 -38
- package/src/input/file-picker.ts +1 -1
- package/src/input/handler-command-route.ts +2 -2
- package/src/input/handler-content-actions.ts +8 -8
- package/src/input/handler-feed-routes.ts +13 -13
- package/src/input/handler-feed.ts +31 -31
- package/src/input/handler-interactions.ts +2 -2
- package/src/input/handler-modal-routes.ts +13 -13
- package/src/input/handler-modal-stack.ts +1 -1
- package/src/input/handler-modal-token-routes.ts +1 -1
- package/src/input/handler-onboarding-daemon-adopt.ts +6 -6
- package/src/input/handler-picker-routes.ts +7 -7
- package/src/input/handler-prompt-buffer.ts +1 -1
- package/src/input/handler-shortcuts.ts +12 -12
- package/src/input/handler-types.ts +3 -3
- package/src/input/handler-ui-state.ts +1 -1
- package/src/input/handler.ts +9 -9
- package/src/input/input-history.ts +1 -1
- package/src/input/keybindings.ts +13 -13
- package/src/input/kill-ring.ts +7 -11
- package/src/input/model-picker-filter.ts +3 -3
- package/src/input/model-picker-items.ts +5 -5
- package/src/input/model-picker-types.ts +2 -2
- package/src/input/model-picker.ts +18 -18
- package/src/input/onboarding/onboarding-feature-units.ts +9 -13
- package/src/input/onboarding/onboarding-provider-key-fields.ts +3 -3
- package/src/input/onboarding/onboarding-runtime-status.ts +3 -3
- package/src/input/onboarding/onboarding-wizard-apply.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-cloudflare-step.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-constants.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +4 -4
- package/src/input/onboarding/onboarding-wizard-network-adopt.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-steps.ts +2 -2
- package/src/input/panel-integration-actions.ts +3 -3
- package/src/input/panel-mouse-geometry.ts +1 -1
- package/src/input/panel-paste-flood-guard.ts +9 -9
- package/src/input/payments-config.ts +15 -15
- package/src/input/profile-picker-modal.ts +1 -1
- package/src/input/provider-key-intake.ts +9 -9
- package/src/input/relay-settings-descriptions.ts +3 -3
- package/src/input/sandbox-exec-config.ts +9 -9
- package/src/input/search.ts +18 -18
- package/src/input/selection-modal-queue.ts +10 -10
- package/src/input/selection-modal.ts +2 -2
- package/src/input/session-picker-modal.ts +7 -7
- package/src/input/settings-modal-activation.ts +1 -1
- package/src/input/settings-modal-adjustment.ts +2 -2
- package/src/input/settings-modal-commit.ts +6 -6
- package/src/input/settings-modal-connections.ts +2 -2
- package/src/input/settings-modal-data.ts +29 -29
- package/src/input/settings-modal-mutations.ts +7 -7
- package/src/input/settings-modal-reset.ts +3 -3
- package/src/input/settings-modal-search.ts +6 -6
- package/src/input/settings-modal-secrets.ts +3 -3
- package/src/input/settings-modal-types.ts +16 -16
- package/src/input/settings-modal.ts +4 -4
- package/src/input/voice-local-settings.ts +3 -3
- package/src/input/worktree-setup-config.ts +8 -8
- package/src/main.ts +15 -15
- package/src/panels/agent-inspector-shared.ts +5 -5
- package/src/panels/base-panel.ts +3 -3
- package/src/panels/builtin/agent.ts +3 -3
- package/src/panels/builtin/development.ts +4 -4
- package/src/panels/builtin/knowledge.ts +1 -1
- package/src/panels/builtin/operations.ts +12 -12
- package/src/panels/builtin/session.ts +8 -8
- package/src/panels/builtin/shared.ts +6 -6
- package/src/panels/builtin-modals.ts +8 -8
- package/src/panels/confirm-state.ts +5 -5
- package/src/panels/cost-tracker-panel.ts +22 -22
- package/src/panels/diff-panel.ts +20 -20
- package/src/panels/diff-review-model.ts +5 -5
- package/src/panels/diff-review-panel.ts +5 -5
- package/src/panels/eval-registry.ts +2 -2
- package/src/panels/expandable-list-panel.ts +5 -5
- package/src/panels/fleet-acts.ts +20 -20
- package/src/panels/fleet-deep-link.ts +5 -5
- package/src/panels/fleet-gateway.ts +12 -12
- package/src/panels/fleet-observed-render.ts +11 -11
- package/src/panels/fleet-panel-format.ts +14 -14
- package/src/panels/fleet-panel-worktree-detail.ts +8 -8
- package/src/panels/fleet-panel.ts +34 -34
- package/src/panels/fleet-read-model.ts +49 -49
- package/src/panels/fleet-spawn.ts +15 -15
- package/src/panels/fleet-steer.ts +7 -7
- package/src/panels/fleet-stop.ts +5 -5
- package/src/panels/fleet-tabs.ts +14 -14
- package/src/panels/fleet-transcript.ts +26 -26
- package/src/panels/git-panel.ts +8 -8
- package/src/panels/hosted-session-feed.ts +13 -13
- package/src/panels/hosted-session-panel.ts +7 -7
- package/src/panels/index.ts +1 -1
- package/src/panels/local-auth-panel.ts +15 -15
- package/src/panels/memory-consolidation-gateway.ts +8 -8
- package/src/panels/modals/devices-modal.ts +8 -8
- package/src/panels/modals/hooks-modal.ts +1 -1
- package/src/panels/modals/keybindings-modal.ts +5 -5
- package/src/panels/modals/knowledge-modal.ts +2 -2
- package/src/panels/modals/local-auth-modal.ts +4 -4
- package/src/panels/modals/marketplace-modal.ts +3 -3
- package/src/panels/modals/memory-modal.ts +19 -19
- package/src/panels/modals/modal-surface-helpers.ts +1 -1
- package/src/panels/modals/modal-theme.ts +3 -3
- package/src/panels/modals/pairing-modal.ts +19 -19
- package/src/panels/modals/planning-modal.ts +4 -4
- package/src/panels/modals/plugins-modal.ts +1 -1
- package/src/panels/modals/policy-modal.ts +4 -4
- package/src/panels/modals/provider-health-modal.ts +1 -1
- package/src/panels/modals/remote-modal.ts +1 -1
- package/src/panels/modals/sandbox-modal.ts +2 -2
- package/src/panels/modals/security-modal.ts +4 -4
- package/src/panels/modals/services-modal.ts +1 -1
- package/src/panels/modals/work-plan-modal.ts +4 -4
- package/src/panels/notifications-feed.ts +6 -6
- package/src/panels/notifications-panel.ts +6 -6
- package/src/panels/panel-confirm-overlay.ts +4 -4
- package/src/panels/panel-manager.ts +13 -13
- package/src/panels/plugins-panel.ts +6 -6
- package/src/panels/polish-core.ts +2 -2
- package/src/panels/polish-tables.ts +2 -2
- package/src/panels/polish.ts +1 -1
- package/src/panels/project-planning-answer-actions.ts +3 -3
- package/src/panels/scrollable-list-panel.ts +15 -15
- package/src/panels/search-focus.ts +1 -1
- package/src/panels/session-maintenance.ts +1 -1
- package/src/panels/skills-panel.ts +3 -3
- package/src/panels/token-budget-panel.ts +11 -11
- package/src/panels/types.ts +14 -14
- package/src/panels/workstream-graph-render.ts +5 -5
- package/src/panels/wrfc-panel-format.ts +1 -1
- package/src/permissions/broker-approval-card.ts +13 -13
- package/src/permissions/hunk-selection.ts +13 -13
- package/src/permissions/prompt.ts +22 -22
- package/src/permissions/sandbox-exec-gate.ts +5 -5
- package/src/providers/provider-classification.ts +1 -1
- package/src/providers/reasoning-effort-surface.ts +12 -12
- package/src/renderer/ansi-sanitize.ts +5 -6
- package/src/renderer/autocomplete-overlay.ts +5 -5
- package/src/renderer/block-actions-overlay.ts +1 -1
- package/src/renderer/bookmark-modal.ts +1 -1
- package/src/renderer/code-block.ts +2 -2
- package/src/renderer/compaction-history-modal.ts +4 -4
- package/src/renderer/compaction-preview.ts +5 -5
- package/src/renderer/compaction-quality.ts +5 -5
- package/src/renderer/composer-fragments.ts +6 -6
- package/src/renderer/compositor.ts +9 -9
- package/src/renderer/config-modal.ts +3 -3
- package/src/renderer/context-inspector.ts +1 -1
- package/src/renderer/context-status-hint.ts +10 -10
- package/src/renderer/conversation-layout.ts +2 -2
- package/src/renderer/conversation-overlays.ts +2 -2
- package/src/renderer/conversation-surface.ts +6 -6
- package/src/renderer/diff.ts +4 -4
- package/src/renderer/fleet-tab-strip.ts +2 -2
- package/src/renderer/footer-tips.ts +4 -4
- package/src/renderer/fullscreen-primitives.ts +1 -1
- package/src/renderer/git-status.ts +5 -5
- package/src/renderer/header-line.ts +5 -5
- package/src/renderer/help-overlay.ts +5 -5
- package/src/renderer/hint-grammar.ts +2 -2
- package/src/renderer/layout.ts +1 -1
- package/src/renderer/markdown-inline.ts +3 -3
- package/src/renderer/markdown-table.ts +7 -7
- package/src/renderer/modal-factory.ts +3 -3
- package/src/renderer/model-picker-overlay.ts +2 -2
- package/src/renderer/model-workspace.ts +7 -7
- package/src/renderer/onboarding/onboarding-wizard.ts +1 -1
- package/src/renderer/overlay-box.ts +1 -1
- package/src/renderer/panel-composite.ts +5 -5
- package/src/renderer/panel-workspace-bar.ts +1 -1
- package/src/renderer/process-indicator.ts +8 -8
- package/src/renderer/profile-picker-modal.ts +3 -3
- package/src/renderer/prompt-content-width.ts +1 -1
- package/src/renderer/search-overlay.ts +3 -3
- package/src/renderer/selection-modal-overlay.ts +6 -6
- package/src/renderer/semantic-diff.ts +6 -7
- package/src/renderer/session-picker-modal.ts +24 -24
- package/src/renderer/settings-modal-connections.ts +3 -3
- package/src/renderer/settings-modal-helpers.ts +16 -16
- package/src/renderer/settings-modal.ts +10 -10
- package/src/renderer/shell-surface.ts +8 -8
- package/src/renderer/status-glyphs.ts +6 -6
- package/src/renderer/syntax-highlighter.ts +2 -3
- package/src/renderer/system-message.ts +3 -3
- package/src/renderer/tab-strip.ts +2 -2
- package/src/renderer/term-caps.ts +12 -12
- package/src/renderer/terminal-bg-probe.ts +10 -10
- package/src/renderer/terminal-escapes.ts +1 -1
- package/src/renderer/theme-mode-config.ts +3 -3
- package/src/renderer/theme.ts +34 -34
- package/src/renderer/thinking.ts +1 -1
- package/src/renderer/tool-call.ts +5 -5
- package/src/renderer/tool-result-expanded-lines.ts +3 -3
- package/src/renderer/tool-result-summary.ts +6 -6
- package/src/renderer/turn-injection.ts +9 -9
- package/src/renderer/ui-factory.ts +33 -33
- package/src/renderer/ui-primitives.ts +4 -4
- package/src/runtime/bootstrap-command-parts.ts +3 -3
- package/src/runtime/bootstrap-core.ts +21 -21
- package/src/runtime/bootstrap-hook-bridge.ts +8 -8
- package/src/runtime/bootstrap-shell.ts +9 -9
- package/src/runtime/bootstrap.ts +16 -16
- package/src/runtime/client/approval-updates.ts +3 -3
- package/src/runtime/client/build-floors.ts +7 -7
- package/src/runtime/client/daemon-attach-handshake.ts +5 -5
- package/src/runtime/client/fleet-union.ts +7 -7
- package/src/runtime/client/host-service-status.ts +2 -2
- package/src/runtime/client/hosted-exit.ts +4 -4
- package/src/runtime/client/hosted-roster.ts +4 -4
- package/src/runtime/client/hosted-session-stream.ts +5 -5
- package/src/runtime/client/hosted-sessions.ts +8 -8
- package/src/runtime/client/operator-endpoint.ts +14 -14
- package/src/runtime/client/spine-adoption.ts +8 -8
- package/src/runtime/context-accounting-source.ts +4 -4
- package/src/runtime/context.ts +2 -2
- package/src/runtime/conversation-rewind-port.ts +6 -6
- package/src/runtime/credential-composition.ts +2 -2
- package/src/runtime/daemon-attach-notices.ts +6 -6
- package/src/runtime/diagnostics/panels/index.ts +1 -1
- package/src/runtime/diagnostics/panels/ops.ts +2 -2
- package/src/runtime/disposal-wiring.ts +6 -6
- package/src/runtime/index.ts +11 -11
- package/src/runtime/install-self-check-startup.ts +4 -4
- package/src/runtime/install-self-check.ts +6 -6
- package/src/runtime/interaction-seams.ts +4 -4
- package/src/runtime/knowledge-services.ts +2 -2
- package/src/runtime/legacy-daemon-migration.ts +37 -37
- package/src/runtime/legacy-daemon-reconcile.ts +30 -30
- package/src/runtime/memory-governance-services.ts +3 -3
- package/src/runtime/memory-spine-transport.ts +3 -3
- package/src/runtime/notification-dispatch.ts +4 -4
- package/src/runtime/onboarding/apply.ts +1 -1
- package/src/runtime/onboarding/derivation.ts +1 -1
- package/src/runtime/onboarding/fast-path.ts +7 -7
- package/src/runtime/onboarding/progress.ts +2 -2
- package/src/runtime/onboarding/provider-key-capture.ts +4 -4
- package/src/runtime/onboarding/snapshot.ts +2 -2
- package/src/runtime/onboarding/state.ts +4 -4
- package/src/runtime/onboarding/types.ts +4 -4
- package/src/runtime/orchestrator-core-services.ts +5 -5
- package/src/runtime/path-shadow-startup.ts +3 -3
- package/src/runtime/perf/panel-contracts.ts +1 -1
- package/src/runtime/power-keepawake-remote.ts +6 -6
- package/src/runtime/process-lifecycle.ts +14 -14
- package/src/runtime/provider-fallback.ts +3 -3
- package/src/runtime/recovery-autosave.ts +3 -3
- package/src/runtime/recovery-decisions.ts +19 -19
- package/src/runtime/recovery-offer-wiring.ts +4 -4
- package/src/runtime/recovery-prompt.ts +20 -20
- package/src/runtime/relay-reachability-bridge.ts +3 -3
- package/src/runtime/release-artifacts.ts +1 -1
- package/src/runtime/resume-notice.ts +20 -20
- package/src/runtime/runtime-services-types.ts +20 -20
- package/src/runtime/services.ts +20 -20
- package/src/runtime/session-continuity-hints.ts +1 -1
- package/src/runtime/session-inbound-inputs.ts +12 -12
- package/src/runtime/session-resume-liveness-confirm.ts +4 -4
- package/src/runtime/session-spine-transport.ts +3 -3
- package/src/runtime/store/domains/panels.ts +2 -2
- package/src/runtime/store/domains/ui-perf.ts +2 -2
- package/src/runtime/store/index.ts +1 -1
- package/src/runtime/store/selectors/index.ts +1 -1
- package/src/runtime/store/state.ts +2 -2
- package/src/runtime/ui-services.ts +3 -3
- package/src/runtime/workspace-checkpointing.ts +3 -3
- package/src/runtime/wrfc-persistence.ts +15 -15
- package/src/scripts/process-messages.ts +1 -1
- package/src/shell/blocking-input.ts +9 -9
- package/src/shell/recovery-input-helpers.ts +2 -2
- package/src/shell/retry-affordance.ts +9 -9
- package/src/shell/ui-openers.ts +14 -14
- package/src/shell/voice-capture-shell.ts +3 -3
- package/src/tools/wrfc-agent-guard.ts +4 -4
- package/src/utils/browser.ts +2 -2
- package/src/utils/format-duration.ts +3 -3
- package/src/utils/format-number.ts +2 -2
- package/src/utils/splash-lines.ts +4 -4
- package/src/utils/terminal-width.ts +6 -6
- package/src/verification/verification-ledger.ts +25 -25
- package/src/version.ts +3 -3
|
@@ -103,13 +103,13 @@ export function registerShellCoreCommands(registry: CommandRegistry): void {
|
|
|
103
103
|
registry.register({
|
|
104
104
|
name: 'find',
|
|
105
105
|
aliases: ['findtext'],
|
|
106
|
-
description: 'Search THIS conversation transcript (same as Ctrl+F)
|
|
106
|
+
description: 'Search THIS conversation transcript (same as Ctrl+F). Searching the web instead? Use /search',
|
|
107
107
|
handler(_args, ctx) {
|
|
108
108
|
if (ctx.openTranscriptSearch) {
|
|
109
109
|
ctx.openTranscriptSearch();
|
|
110
110
|
return;
|
|
111
111
|
}
|
|
112
|
-
ctx.print('Transcript search is not available in this context
|
|
112
|
+
ctx.print('Transcript search is not available in this context; try Ctrl+F.');
|
|
113
113
|
},
|
|
114
114
|
});
|
|
115
115
|
|
|
@@ -121,7 +121,7 @@ export function registerShellCoreCommands(registry: CommandRegistry): void {
|
|
|
121
121
|
const km = requireKeybindingsManager(ctx);
|
|
122
122
|
// The full binding table (~45 rows) is presented via the same
|
|
123
123
|
// generated, scrollable overlay /shortcuts opens (see
|
|
124
|
-
// renderShortcutsOverlay) rather than a one-shot transcript dump
|
|
124
|
+
// renderShortcutsOverlay) rather than a one-shot transcript dump,
|
|
125
125
|
// the file path (dynamic, per-user) still gets a short transcript
|
|
126
126
|
// line since the overlay itself doesn't show it.
|
|
127
127
|
ctx.print(`Keybindings config: ${km.getConfigPath()} (create it to override any binding: { "action": { "key": "x", "ctrl": true } })`);
|
|
@@ -196,8 +196,8 @@ export function registerShellCoreCommands(registry: CommandRegistry): void {
|
|
|
196
196
|
aliases: ['h', '?'],
|
|
197
197
|
description: 'Browse every command with its description; picking one runs it',
|
|
198
198
|
handler(_args, ctx) {
|
|
199
|
-
// Generated live from the command registry
|
|
200
|
-
// list
|
|
199
|
+
// Generated live from the command registry, never a hand-maintained
|
|
200
|
+
// list, so /help can never drift from the real command set. Category
|
|
201
201
|
// labels come from the same single source of truth as the generated
|
|
202
202
|
// reference and the palette (ctx.getCommandCategories; see its doc for
|
|
203
203
|
// why it is threaded through the context rather than imported here).
|
|
@@ -217,7 +217,7 @@ export function registerShellCoreCommands(registry: CommandRegistry): void {
|
|
|
217
217
|
category: categoryByName.get(cmd.name) ?? 'Other',
|
|
218
218
|
};
|
|
219
219
|
});
|
|
220
|
-
// every item here is a command, and picking one RUNS it
|
|
220
|
+
// every item here is a command, and picking one RUNS it, label
|
|
221
221
|
// the verb "Run" (matching the slash-command palette) instead of the
|
|
222
222
|
// generic "Select" default.
|
|
223
223
|
ctx.openSelection('Help — Commands', items, { allowSearch: true, primaryVerbLabel: 'Run' }, (result) => {
|
|
@@ -269,7 +269,7 @@ export function registerShellCoreCommands(registry: CommandRegistry): void {
|
|
|
269
269
|
description: 'Summarize conversation to free context window',
|
|
270
270
|
async handler(_args, ctx) {
|
|
271
271
|
const messages = ctx.session.conversationManager.getMessagesForLLM();
|
|
272
|
-
// contextWindow IS reachable from CommandContext
|
|
272
|
+
// contextWindow IS reachable from CommandContext, the same
|
|
273
273
|
// call compactConversation() (runtime-services.ts) already makes to scale
|
|
274
274
|
// its own behaviour by window size. Previously hardcoded to 0 here, which
|
|
275
275
|
// silently suppressed buildCompactionPreview()'s capacity-% clause even
|
|
@@ -320,7 +320,7 @@ export function registerShellCoreCommands(registry: CommandRegistry): void {
|
|
|
320
320
|
const memStore = requireSessionMemoryStore(ctx);
|
|
321
321
|
const id = memStore.add(text);
|
|
322
322
|
if (!id) {
|
|
323
|
-
ctx.print('[Pin] Nothing pinned
|
|
323
|
+
ctx.print('[Pin] Nothing pinned: text was blank.');
|
|
324
324
|
} else {
|
|
325
325
|
const count = memStore.list().length;
|
|
326
326
|
ctx.print(buildPinSuccessText(id, text, count));
|
|
@@ -370,7 +370,7 @@ export function registerShellCoreCommands(registry: CommandRegistry): void {
|
|
|
370
370
|
usage: '[level]',
|
|
371
371
|
// No fixed list here. The accepted levels belong to the serving model, so
|
|
372
372
|
// the old '[instant|low|medium|high]' hint was wrong for every model that
|
|
373
|
-
// offers 'none', 'minimal', 'xhigh' or 'max'
|
|
373
|
+
// offers 'none', 'minimal', 'xhigh' or 'max', and for every model that
|
|
374
374
|
// rejects 'instant'. Running `/effort` with no argument prints the real
|
|
375
375
|
// ones for the model currently in use.
|
|
376
376
|
argsHint: '[level]',
|
|
@@ -394,7 +394,7 @@ export function registerShellCoreCommands(registry: CommandRegistry): void {
|
|
|
394
394
|
// command is where the preference is read back and re-chosen, so it must
|
|
395
395
|
// show what was asked for even while a capped model is serving.
|
|
396
396
|
const current = requestedEffortLevel(ctx.platform.configManager);
|
|
397
|
-
// What the list should open on, though, is the level in EFFECT
|
|
397
|
+
// What the list should open on, though, is the level in EFFECT, the
|
|
398
398
|
// requested level snapped to this model. The requested level may not be
|
|
399
399
|
// in the list at all when the model caps lower, and preselecting a
|
|
400
400
|
// missing id lands the cursor on the lowest level instead of on what is
|
|
@@ -402,7 +402,7 @@ export function registerShellCoreCommands(registry: CommandRegistry): void {
|
|
|
402
402
|
const inEffect = servingEffortForLevel(current, model).effective ?? current;
|
|
403
403
|
|
|
404
404
|
const applyLevel = (level: string): void => {
|
|
405
|
-
// An explicit user choice
|
|
405
|
+
// An explicit user choice, the one kind of write that is allowed to
|
|
406
406
|
// change the stored preference.
|
|
407
407
|
ctx.platform.configManager.set('provider.reasoningEffort', level);
|
|
408
408
|
const serving = servingEffortForLevel(level, model);
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* tasks-runtime.ts
|
|
2
|
+
* tasks-runtime.ts, `/tasks`.
|
|
3
3
|
*
|
|
4
4
|
* The reads are a UNION now: this surface's own runtime tasks (the exec, agent
|
|
5
5
|
* and ACP work the loop here spawned) plus the daemon's (scheduled work,
|
|
6
6
|
* channel-driven runs, tasks other surfaces submitted). Before the daemon
|
|
7
7
|
* became its own product one registry held both, and `tasks.list(500)` off the
|
|
8
8
|
* in-process transport answered synchronously. It no longer holds both, so this
|
|
9
|
-
* command crosses a wire and is async
|
|
9
|
+
* command crosses a wire and is async, the same shape `/ci` and the fleet act
|
|
10
10
|
* verbs already use.
|
|
11
11
|
*
|
|
12
12
|
* The list output is unchanged for a local-only fleet: same header, same
|
|
13
13
|
* columns, same 20-row cap, same filter semantics. What is added is the daemon
|
|
14
|
-
* half, and one honest line when the daemon could not be reached
|
|
14
|
+
* half, and one honest line when the daemon could not be reached, a partial
|
|
15
15
|
* list of real tasks beats an error page, but it must not read as complete.
|
|
16
16
|
*
|
|
17
17
|
* Writes do NOT degrade that way. A lifecycle act against a task this terminal
|
|
@@ -226,7 +226,7 @@ export function registerTasksRuntimeCommands(registry: CommandRegistry): void {
|
|
|
226
226
|
|
|
227
227
|
// Which registry owns this id decides what may be done to it. An act
|
|
228
228
|
// aimed at a daemon task must never be applied to a local record that
|
|
229
|
-
// does not exist
|
|
229
|
+
// does not exist, that reports success and changes nothing.
|
|
230
230
|
const found = await tasksClient.get(taskId);
|
|
231
231
|
if (!found) {
|
|
232
232
|
ctx.print(`Unknown task: ${taskId}`);
|
|
@@ -5,7 +5,7 @@ import { requireShellPaths } from './runtime-services.ts';
|
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Timeout for a /test run, in milliseconds. Deliberately much longer than
|
|
8
|
-
* WRFC's WRFC_GATE_TIMEOUT_MS (120s, tuned for CI gates)
|
|
8
|
+
* WRFC's WRFC_GATE_TIMEOUT_MS (120s, tuned for CI gates), this repo's own
|
|
9
9
|
* suite is 600+ test files (scripts/run-tests.ts), and /test is an
|
|
10
10
|
* interactive command with no other caller waiting on it.
|
|
11
11
|
*
|
|
@@ -48,7 +48,7 @@ interface ParsedTestResults {
|
|
|
48
48
|
* Parse this repo's own scripts/run-tests.ts output shape:
|
|
49
49
|
* per-file: `==> path/to/file.test.ts [FAIL]` (only present on failure)
|
|
50
50
|
* summary: `Test files: N, passed: P, failed: F`
|
|
51
|
-
* Returns null when the summary line isn't present at all
|
|
51
|
+
* Returns null when the summary line isn't present at all, the fallback
|
|
52
52
|
* path (raw tail, no fabricated counts) covers a different project's
|
|
53
53
|
* jest/vitest/pytest output, or any run that bypassed run-tests.ts.
|
|
54
54
|
*/
|
|
@@ -96,7 +96,7 @@ export function parseTestOutput(output: string): ParsedTestResults | null {
|
|
|
96
96
|
* quote into `'\''` (close quote, escaped literal quote, reopen quote).
|
|
97
97
|
* Mirrors the injection-risk class already present in the SDK's
|
|
98
98
|
* wrfc-gates.ts (executeGateCommand) and this repo's git-runtime.ts /
|
|
99
|
-
* diff-runtime.ts, which build shell command strings the same way
|
|
99
|
+
* diff-runtime.ts, which build shell command strings the same way, a
|
|
100
100
|
* pattern arg is never string-concatenated into the command raw.
|
|
101
101
|
*/
|
|
102
102
|
export function shQuote(value: string): string {
|
|
@@ -215,13 +215,13 @@ export async function runTestCommand(
|
|
|
215
215
|
// Durable end state: logToolResultBlock (above) renders straight into the
|
|
216
216
|
// display-only history buffer and never touches the real message list, so
|
|
217
217
|
// it does not survive the next full rebuildHistory() (which rebuilds
|
|
218
|
-
// strictly from conversationManager.getMessageSnapshot())
|
|
218
|
+
// strictly from conversationManager.getMessageSnapshot()), the very next
|
|
219
219
|
// dirty render silently wipes it back to how the transcript looked before
|
|
220
220
|
// /test ran. addSystemMessage persists the same content as a real message
|
|
221
221
|
// (same durable pattern as /rewind's confirm notice in
|
|
222
222
|
// checkpoint-runtime.ts) so the timeout outcome survives like any other
|
|
223
223
|
// command's output. The streamed output during the run is allowed to stay
|
|
224
|
-
// transient
|
|
224
|
+
// transient, only this final state needs to persist.
|
|
225
225
|
ctx.session.conversationManager.addSystemMessage(
|
|
226
226
|
`[Test] Timed out after ${timeoutSeconds}s and was killed.`,
|
|
227
227
|
);
|
|
@@ -241,7 +241,7 @@ export async function runTestCommand(
|
|
|
241
241
|
const failedNoun = parsed.unit === 'files' ? 'file' : 'test';
|
|
242
242
|
const errorMsg = ok ? undefined : `${parsed.failed} ${failedNoun}${parsed.failed === 1 ? '' : 's'} failed`;
|
|
243
243
|
ctx.session.conversationManager.logToolResultBlock(toolCall, ok ? 'done' : 'error', summary, durationMs, errorMsg);
|
|
244
|
-
const durableLines = [`[Test] ${summary}${errorMsg ?
|
|
244
|
+
const durableLines = [`[Test] ${summary}${errorMsg ? `: ${errorMsg}` : ''}`];
|
|
245
245
|
if (parsed.failingFiles.length > 0) {
|
|
246
246
|
const shown = parsed.failingFiles.slice(0, MAX_FAILING_NAMES_SHOWN);
|
|
247
247
|
const failListHeader = parsed.unit === 'files' ? 'Failing test files:' : 'Failing tests:';
|
|
@@ -8,14 +8,14 @@ export function registerTtsRuntimeCommands(registry: CommandRegistry): void {
|
|
|
8
8
|
handler(args, ctx) {
|
|
9
9
|
const first = (args[0] ?? '').toLowerCase();
|
|
10
10
|
|
|
11
|
-
// /tts stop
|
|
11
|
+
// /tts stop, cancel active playback
|
|
12
12
|
if (first === 'stop' || first === 'cancel') {
|
|
13
13
|
ctx.stopSpokenOutput?.();
|
|
14
14
|
ctx.print('Live TTS playback stopped.');
|
|
15
15
|
return;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
// /tts on
|
|
18
|
+
// /tts on, enable always-speak mode (every turn spoken automatically)
|
|
19
19
|
if (first === 'on') {
|
|
20
20
|
if (!ctx.platform.voiceService) {
|
|
21
21
|
ctx.print('Live TTS is not available in this runtime.');
|
|
@@ -28,7 +28,7 @@ export function registerTtsRuntimeCommands(registry: CommandRegistry): void {
|
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
// /tts off
|
|
31
|
+
// /tts off, disable always-speak mode
|
|
32
32
|
if (first === 'off') {
|
|
33
33
|
ctx.platform.configManager.setDynamic('ui.voiceEnabled', false);
|
|
34
34
|
ctx.platform.configManager.save();
|
|
@@ -37,7 +37,7 @@ export function registerTtsRuntimeCommands(registry: CommandRegistry): void {
|
|
|
37
37
|
return;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
// /tts <prompt
|
|
40
|
+
// /tts <prompt>, mark this prompt for spoken output
|
|
41
41
|
const prompt = args.join(' ').trim();
|
|
42
42
|
if (!prompt) {
|
|
43
43
|
const enabled = ctx.platform.configManager.get('ui.voiceEnabled');
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `/update
|
|
2
|
+
* `/update`, a real self-update path for binary installs. The
|
|
3
3
|
* download-verify-swap mechanics are the SDK's canonical update policy
|
|
4
|
-
* module (platform/runtime/self-update
|
|
4
|
+
* module (platform/runtime/self-update, hoisted from this file's
|
|
5
5
|
* semantics), the same mechanism the daemon's hourly loop and
|
|
6
6
|
* the suite installer follow: one update mechanism everywhere. This file owns
|
|
7
7
|
* only the /update UX: install-kind gating, target selection, and the
|
|
8
8
|
* printed report.
|
|
9
9
|
*
|
|
10
10
|
* Subcommands:
|
|
11
|
-
* /update [check]
|
|
11
|
+
* /update [check] , resolve the latest release tag and report
|
|
12
12
|
* whether this build is already current.
|
|
13
|
-
* /update apply
|
|
13
|
+
* /update apply , for a binary install (the curl installer),
|
|
14
14
|
* download + verify + atomically swap THIS
|
|
15
15
|
* app's binary, and refresh the sqlite-vec
|
|
16
16
|
* native addon in lockstep so the vector index
|
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
* swap parks the outgoing file at
|
|
19
19
|
* `<path>.previous`, so the replaced version is
|
|
20
20
|
* always kept. For any other install kind,
|
|
21
|
-
* prints the exact command to run instead
|
|
21
|
+
* prints the exact command to run instead, it
|
|
22
22
|
* never attempts a swap it can't do safely.
|
|
23
|
-
* /update rollback
|
|
23
|
+
* /update rollback , exchange each installed file with its kept
|
|
24
24
|
* `.previous` counterpart: one command back to
|
|
25
25
|
* the version that ran before the last update
|
|
26
26
|
* (and, being an exchange, one more command
|
|
@@ -30,15 +30,15 @@
|
|
|
30
30
|
* binary as part of the same release, and this command swapped both. The daemon
|
|
31
31
|
* is its own product now, released from its own repository on its own version
|
|
32
32
|
* line, and it updates itself on an hourly loop. A swap from here would fetch
|
|
33
|
-
* an asset this repository's releases do not publish
|
|
33
|
+
* an asset this repository's releases do not publish, and if one ever appeared
|
|
34
34
|
* under that name, would overwrite a working daemon with a build from the wrong
|
|
35
35
|
* line. The daemon is a neighbour in the install directory, not cargo.
|
|
36
|
-
* /update review
|
|
36
|
+
* /update review , install/subscription/sandbox posture,
|
|
37
37
|
* unrelated to the update mechanics above.
|
|
38
|
-
* /update bundle export|inspect <path
|
|
38
|
+
* /update bundle export|inspect <path>, portable posture bundle, as before.
|
|
39
39
|
*
|
|
40
40
|
* The former `/update channel <stable|preview>` subcommand wrote a
|
|
41
|
-
* release.channel config value that nothing downstream ever read
|
|
41
|
+
* release.channel config value that nothing downstream ever read, it only
|
|
42
42
|
* ever changed what a later `/update review` printed back to you. It has
|
|
43
43
|
* been removed rather than kept decorative; this repo's release process
|
|
44
44
|
* (scripts/release.ts) does not publish separate stable/preview channels,
|
|
@@ -94,13 +94,13 @@ async function downloadText(fetchImpl: UpdateFetchLike, url: string): Promise<st
|
|
|
94
94
|
* to and including the moment BEFORE the first file is written: every fetch on
|
|
95
95
|
* the way there carries the caller's signal, and every await boundary re-checks
|
|
96
96
|
* it. From the first write onward the swap owns the installed files and always
|
|
97
|
-
* runs to completion
|
|
97
|
+
* runs to completion, a half-applied swap is the one outcome worse than a slow
|
|
98
98
|
* one.
|
|
99
99
|
*
|
|
100
100
|
* This record makes that boundary readable from outside the call. The launch
|
|
101
101
|
* updater gives `applyUpdate` a budget and abandons the promise when it runs
|
|
102
102
|
* out, so it cannot learn from the return value which side of the line the work
|
|
103
|
-
* was on
|
|
103
|
+
* was on, it reads these flags instead, and prints the receipt that is
|
|
104
104
|
* actually true (see src/cli/launch-auto-update.ts).
|
|
105
105
|
*/
|
|
106
106
|
export interface UpdateSwapProgress {
|
|
@@ -116,7 +116,7 @@ export function createUpdateSwapProgress(): UpdateSwapProgress {
|
|
|
116
116
|
return { begun: false, committed: false, targetTag: null };
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
/** The failure an aborted update ends with
|
|
119
|
+
/** The failure an aborted update ends with, raised only while nothing has been written yet. */
|
|
120
120
|
export const UPDATE_ABORTED_MESSAGE = 'update cancelled before any file was replaced';
|
|
121
121
|
|
|
122
122
|
function throwIfAborted(signal: AbortSignal | undefined): void {
|
|
@@ -127,8 +127,8 @@ function throwIfAborted(signal: AbortSignal | undefined): void {
|
|
|
127
127
|
|
|
128
128
|
/**
|
|
129
129
|
* The shared UpdateFetchLike init shape predates cancellation, so the signal
|
|
130
|
-
* rides on a widened version of it: the real `fetch` reads it
|
|
131
|
-
* makes the DOWNLOAD itself cancellable rather than merely abandoned
|
|
130
|
+
* rides on a widened version of it: the real `fetch` reads it, which is what
|
|
131
|
+
* makes the DOWNLOAD itself cancellable rather than merely abandoned, and a
|
|
132
132
|
* test stub that ignores the extra field behaves exactly as it did before.
|
|
133
133
|
*/
|
|
134
134
|
type AbortableFetchInit = NonNullable<Parameters<UpdateFetchLike>[1]> & { signal?: AbortSignal };
|
|
@@ -175,7 +175,7 @@ function trackSwapProgress(io: UpdateFileIo, progress: UpdateSwapProgress): Upda
|
|
|
175
175
|
}
|
|
176
176
|
|
|
177
177
|
/**
|
|
178
|
-
* Suffix under which every swap keeps the file it replaced
|
|
178
|
+
* Suffix under which every swap keeps the file it replaced, re-exported
|
|
179
179
|
* from the SDK's canonical update policy module so rollback and swap share
|
|
180
180
|
* one definition everywhere.
|
|
181
181
|
*/
|
|
@@ -202,7 +202,7 @@ const defaultRunCommand: RunCommand = (command, args) => {
|
|
|
202
202
|
|
|
203
203
|
/**
|
|
204
204
|
* Detects, honestly, whether the daemon is currently running as a systemd
|
|
205
|
-
* user service
|
|
205
|
+
* user service, so the post-update message can tell the user the real
|
|
206
206
|
* restart command instead of assuming one. Only Linux/systemd is checked
|
|
207
207
|
* (this repo's PlatformServiceManager also supports launchd on macOS and
|
|
208
208
|
* Scheduled Tasks on Windows, but those aren't restarted with `systemctl`,
|
|
@@ -246,7 +246,7 @@ export interface ApplyUpdateOptions {
|
|
|
246
246
|
/** Injectable filesystem seam (the SDK's UpdateFileIo) so tests observe swaps in memory. */
|
|
247
247
|
readonly io?: UpdateFileIo;
|
|
248
248
|
/**
|
|
249
|
-
* Cancels the update
|
|
249
|
+
* Cancels the update, for real: it is passed to every fetch in the path and
|
|
250
250
|
* re-checked at every await boundary, so an abort stops the download instead
|
|
251
251
|
* of leaving it running unwatched. Honoured only up to the moment before the
|
|
252
252
|
* swap begins; from the first file write onward it is deliberately ignored
|
|
@@ -259,13 +259,13 @@ export interface ApplyUpdateOptions {
|
|
|
259
259
|
|
|
260
260
|
/**
|
|
261
261
|
* The real self-update path, delegating the download-verify-swap mechanics
|
|
262
|
-
* to the SDK's canonical update policy module (applyVerifiedUpdate
|
|
262
|
+
* to the SDK's canonical update policy module (applyVerifiedUpdate, the
|
|
263
263
|
* same mechanism the daemon's hourly loop uses). For a binary install:
|
|
264
264
|
* resolve the latest tag, compare to the running version, and if newer,
|
|
265
265
|
* download + checksum-verify EVERY artifact before swapping any one (so a
|
|
266
266
|
* checksum failure never leaves a mismatched pair installed), then
|
|
267
267
|
* atomically swap each in place with the outgoing file kept at
|
|
268
|
-
* `<path>.previous`. For any other install kind, never attempts a swap
|
|
268
|
+
* `<path>.previous`. For any other install kind, never attempts a swap, it
|
|
269
269
|
* prints the exact command for that install method instead.
|
|
270
270
|
*/
|
|
271
271
|
export async function applyUpdate(options: ApplyUpdateOptions): Promise<void> {
|
|
@@ -313,7 +313,7 @@ export async function applyUpdate(options: ApplyUpdateOptions): Promise<void> {
|
|
|
313
313
|
// same download-verify-swap pass so /update never leaves a new binary beside a
|
|
314
314
|
// stale addon. It lands at <execDir>/lib/sqlite-vec-<os>-<arch>/vec0.<suffix>,
|
|
315
315
|
// exactly where the SDK's loader resolves it. The manifest entry decides
|
|
316
|
-
// whether the target release ships it
|
|
316
|
+
// whether the target release ships it, an entry that IS present makes the
|
|
317
317
|
// download and checksum mandatory (a mismatch is fatal, verified before any
|
|
318
318
|
// swap), while an absent entry means the target predates the addon and is
|
|
319
319
|
// skipped rather than blocking an otherwise-valid binary update. On macOS the
|
|
@@ -343,7 +343,7 @@ export async function applyUpdate(options: ApplyUpdateOptions): Promise<void> {
|
|
|
343
343
|
// This is the last point at which the update can be called off. The
|
|
344
344
|
// downloads inside applyVerifiedUpdate are still cancellable (the signal
|
|
345
345
|
// rides on every request), but its swap loop is synchronous and runs to
|
|
346
|
-
// completion once its first write lands
|
|
346
|
+
// completion once its first write lands, which is precisely what
|
|
347
347
|
// `progress.begun` records, and why nothing below this call re-checks the
|
|
348
348
|
// signal.
|
|
349
349
|
throwIfAborted(signal);
|
|
@@ -368,8 +368,8 @@ export async function applyUpdate(options: ApplyUpdateOptions): Promise<void> {
|
|
|
368
368
|
// Named, not silently omitted: someone who used to see two binaries swap
|
|
369
369
|
// here should read why only one did.
|
|
370
370
|
serviceInfo.managed
|
|
371
|
-
? `The daemon updates itself on its own release line
|
|
372
|
-
: 'The daemon updates itself on its own release line
|
|
371
|
+
? `The daemon updates itself on its own release line; this changed nothing about it (it runs under ${serviceInfo.unitName}.service).`
|
|
372
|
+
: 'The daemon updates itself on its own release line; this changed nothing about it.',
|
|
373
373
|
].join('\n'),
|
|
374
374
|
);
|
|
375
375
|
}
|
|
@@ -390,7 +390,7 @@ export interface RollbackUpdateOptions {
|
|
|
390
390
|
* delegating the exchange mechanics to the SDK's rollbackKeptPrevious (the
|
|
391
391
|
* same module the swap uses): every installed file this command owns (the app
|
|
392
392
|
* binary and the vector addon) that has a kept `.previous` counterpart is
|
|
393
|
-
* EXCHANGED with it
|
|
393
|
+
* EXCHANGED with it, the previous version becomes live, and the version being rolled
|
|
394
394
|
* back is itself kept at `.previous`, so a second `/update rollback` rolls
|
|
395
395
|
* forward again. Files without a kept counterpart are reported and left
|
|
396
396
|
* untouched; nothing is downloaded.
|
|
@@ -434,8 +434,8 @@ export function rollbackUpdate(options: RollbackUpdateOptions): void {
|
|
|
434
434
|
'',
|
|
435
435
|
'Restart goodvibes to run the restored version.',
|
|
436
436
|
serviceInfo.managed
|
|
437
|
-
? `The daemon was not rolled back
|
|
438
|
-
: 'The daemon was not rolled back
|
|
437
|
+
? `The daemon was not rolled back; it updates itself on its own release line (it runs under ${serviceInfo.unitName}.service).`
|
|
438
|
+
: 'The daemon was not rolled back; it updates itself on its own release line.',
|
|
439
439
|
].join('\n'),
|
|
440
440
|
);
|
|
441
441
|
}
|
|
@@ -25,7 +25,7 @@ function parseSearchArgs(args: string[]): ParsedSearchArgs {
|
|
|
25
25
|
* registerWebSearchRuntimeCommands - `/search <query> [--limit <n>]`.
|
|
26
26
|
*
|
|
27
27
|
* Calls webSearchService.search() directly (skipping the agent-tool wrapper's
|
|
28
|
-
* JSON-stringify contract
|
|
28
|
+
* JSON-stringify contract, same shape as /schedule's ctx.ops.automationManager
|
|
29
29
|
* pattern: read the service off the context, guard on undefined, print) and
|
|
30
30
|
* renders ranked results + the instant answer into the transcript with
|
|
31
31
|
* source labels. webSearchService is already constructed in services.ts and
|
|
@@ -35,7 +35,7 @@ function parseSearchArgs(args: string[]): ParsedSearchArgs {
|
|
|
35
35
|
export function registerWebSearchRuntimeCommands(registry: CommandRegistry): void {
|
|
36
36
|
registry.register({
|
|
37
37
|
name: 'search',
|
|
38
|
-
description: 'Web search
|
|
38
|
+
description: 'Web search, ranked results with source labels (searching THIS transcript? use /find)',
|
|
39
39
|
usage: '<query> [--limit <n>]',
|
|
40
40
|
argsHint: '<query> [--limit <n>]',
|
|
41
41
|
async handler(args, ctx) {
|
|
@@ -25,7 +25,7 @@ function getStore(ctx: import('../command-registry.ts').CommandContext): WorkPla
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
function openPanel(ctx: import('../command-registry.ts').CommandContext): void {
|
|
28
|
-
// work-plan migrated to the 'work-plan' modal
|
|
28
|
+
// work-plan migrated to the 'work-plan' modal, open it via the seam.
|
|
29
29
|
openModalCommand(ctx, 'work-plan-modal');
|
|
30
30
|
}
|
|
31
31
|
|
|
@@ -99,7 +99,7 @@ export function registerWorkPlanRuntimeCommands(registry: CommandRegistry): void
|
|
|
99
99
|
return;
|
|
100
100
|
}
|
|
101
101
|
if (subcommand === 'export') {
|
|
102
|
-
// Thin wrapper over WorkPlanStore.exportMarkdown()
|
|
102
|
+
// Thin wrapper over WorkPlanStore.exportMarkdown(), writes the plan's
|
|
103
103
|
// markdown alongside the JSON and reports the path. (W6 command-path
|
|
104
104
|
// parity: the work-plan modal's export action routes here.)
|
|
105
105
|
const { path } = store.exportMarkdown();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// workstream-attempt-dependents.ts
|
|
2
|
+
// workstream-attempt-dependents.ts, held-dependent rendering for non-leaf
|
|
3
3
|
// best-of-N groups.
|
|
4
4
|
//
|
|
5
5
|
// A best-of-N item may be NON-LEAF: other items can depend on it. The scheduler
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
// resolves the dependency to that winner (SDK scheduler.ts attemptGroup
|
|
8
8
|
// DependencyStatus). This module mirrors that status computation as a pure
|
|
9
9
|
// function so the /workstream attempts surface can show, honestly, which
|
|
10
|
-
// dependents are held/waiting/released for a group
|
|
10
|
+
// dependents are held/waiting/released for a group, and reflect the losing
|
|
11
11
|
// attempts' cleanup that the winner pick performs.
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
13
13
|
|
|
@@ -65,9 +65,9 @@ export interface DependentHold {
|
|
|
65
65
|
function holdDescriptor(status: AttemptGroupDependencyStatus): string {
|
|
66
66
|
switch (status) {
|
|
67
67
|
case 'satisfied':
|
|
68
|
-
return 'released
|
|
68
|
+
return 'released: the winner was picked and merged';
|
|
69
69
|
case 'failed':
|
|
70
|
-
return 'blocked
|
|
70
|
+
return 'blocked: every attempt in the group failed';
|
|
71
71
|
default:
|
|
72
72
|
return 'held until the winner is picked and merged';
|
|
73
73
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// workstream-attempts.ts
|
|
2
|
+
// workstream-attempts.ts, the /workstream attempts surface for best-of-N.
|
|
3
3
|
//
|
|
4
4
|
// The engine runs a best-of-N work item as N sibling attempts in isolated
|
|
5
5
|
// worktrees and HOLDS the merge, exposing the candidates for a winner pick
|
|
6
6
|
// (orchestration engine.listHeldMergeGroups / proposeAttemptWinner /
|
|
7
|
-
// pickAttemptWinner
|
|
7
|
+
// pickAttemptWinner, the same seam the fleet.attempts.* gateway verbs use).
|
|
8
8
|
// This module drives that seam from the /workstream command:
|
|
9
|
-
// • list
|
|
10
|
-
// • diff <c>
|
|
11
|
-
// • judge
|
|
9
|
+
// • list , the held-merge groups awaiting a pick, with candidates.
|
|
10
|
+
// • diff <c> , one candidate's worktree diff in the existing DiffPanel.
|
|
11
|
+
// • judge , the OPTIONAL model proposal, clearly labelled a model
|
|
12
12
|
// judgment (scoredBy 'model'), with its reasons; never a pick.
|
|
13
|
-
// • pick <c>
|
|
13
|
+
// • pick <c> , behind a DiffPanel confirm; merges the winner and lets
|
|
14
14
|
// the engine clean the losers, then renders the receipt.
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
16
16
|
|
|
@@ -64,7 +64,7 @@ function candidateLine(c: AttemptCandidate): string {
|
|
|
64
64
|
: isTurnBudgetReason(c.failureReason)
|
|
65
65
|
? describeFailureReason(c.failureReason) // a spent budget, not an infrastructure failure
|
|
66
66
|
: `failed${c.failureReason ? `: ${c.failureReason}` : ''}`;
|
|
67
|
-
return ` ${c.attemptIndex + 1}. [${state}] ${c.title}
|
|
67
|
+
return ` ${c.attemptIndex + 1}. [${state}] ${c.title}: ${files}, item ${shortId(c.itemId)}`;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
function renderGroupList(groups: readonly HeldMergeGroup[], resolveItems?: ResolveWorkstreamItems): string {
|
|
@@ -73,7 +73,7 @@ function renderGroupList(groups: readonly HeldMergeGroup[], resolveItems?: Resol
|
|
|
73
73
|
}
|
|
74
74
|
const lines: string[] = ['Best-of-N groups (held for a winner pick):'];
|
|
75
75
|
for (const g of groups) {
|
|
76
|
-
lines.push(` ${shortId(g.groupId)}
|
|
76
|
+
lines.push(` ${shortId(g.groupId)}: "${g.sourceTitle}" (workstream ${shortId(g.workstreamId)}) ${g.ready ? 'READY' : 'still running'}${g.autoAccept ? ', auto-accept' : ''}`);
|
|
77
77
|
for (const c of g.candidates) lines.push(candidateLine(c));
|
|
78
78
|
if (g.judgment?.proposedWinnerItemId) {
|
|
79
79
|
lines.push(` judge proposal: item ${shortId(g.judgment.proposedWinnerItemId)} (model, advisory)`);
|
|
@@ -91,13 +91,13 @@ function renderGroupList(groups: readonly HeldMergeGroup[], resolveItems?: Resol
|
|
|
91
91
|
|
|
92
92
|
/** The model proposal, CLEARLY labelled a model judgment (never ground truth), with reasons. */
|
|
93
93
|
function renderJudgment(group: HeldMergeGroup, judgment: AttemptJudgment): string {
|
|
94
|
-
const lines: string[] = [`Judge proposal for group ${shortId(group.groupId)}
|
|
95
|
-
lines.push(' MODEL PROPOSAL (scoredBy: model)
|
|
94
|
+
const lines: string[] = [`Judge proposal for group ${shortId(group.groupId)}: "${group.sourceTitle}"`];
|
|
95
|
+
lines.push(' MODEL PROPOSAL (scoredBy: model); advisory only; a human still confirms the pick.');
|
|
96
96
|
if (judgment.proposedWinnerItemId) {
|
|
97
97
|
const cand = group.candidates.find((c) => c.itemId === judgment.proposedWinnerItemId);
|
|
98
|
-
lines.push(` Proposed winner: ${cand ? `attempt ${cand.attemptIndex + 1}
|
|
98
|
+
lines.push(` Proposed winner: ${cand ? `attempt ${cand.attemptIndex + 1}: ${cand.title}` : `item ${shortId(judgment.proposedWinnerItemId)}`}`);
|
|
99
99
|
} else {
|
|
100
|
-
lines.push(' Proposed winner: none
|
|
100
|
+
lines.push(' Proposed winner: none; the judge declined to choose.');
|
|
101
101
|
}
|
|
102
102
|
if (judgment.model) lines.push(` Model: ${judgment.model}`);
|
|
103
103
|
if (judgment.reasons.length > 0) {
|
|
@@ -199,10 +199,10 @@ export async function handleAttemptsSubcommand(ctx: CommandContext, service: Wor
|
|
|
199
199
|
if (action === 'pick') {
|
|
200
200
|
const candRef = args[3];
|
|
201
201
|
if (!candRef) { ctx.print(`Usage: /workstream attempts pick ${shortId(group.groupId)} <#>`); return true; }
|
|
202
|
-
if (!group.ready) { ctx.print(`Group ${shortId(group.groupId)} is not ready
|
|
202
|
+
if (!group.ready) { ctx.print(`Group ${shortId(group.groupId)} is not ready: its siblings are still running. Wait until every attempt is terminal.`); return true; }
|
|
203
203
|
const cand = resolveCandidate(group, candRef);
|
|
204
204
|
if ('error' in cand) { ctx.print(cand.error); return true; }
|
|
205
|
-
if (cand.state !== 'held-merge') { ctx.print(`Attempt ${cand.attemptIndex + 1} failed
|
|
205
|
+
if (cand.state !== 'held-merge') { ctx.print(`Attempt ${cand.attemptIndex + 1} failed: only a held (pick-ready) candidate can win.`); return true; }
|
|
206
206
|
|
|
207
207
|
const { DiffPanel } = await import('../../panels/diff-panel.ts');
|
|
208
208
|
const pm = requirePanelManager(ctx);
|
|
@@ -217,7 +217,7 @@ export async function handleAttemptsSubcommand(ctx: CommandContext, service: Wor
|
|
|
217
217
|
|
|
218
218
|
diffPanel.confirmOverlay.arm({
|
|
219
219
|
id: `${group.groupId}:${cand.itemId}`,
|
|
220
|
-
label: `Pick attempt ${cand.attemptIndex + 1} ("${cand.title}")
|
|
220
|
+
label: `Pick attempt ${cand.attemptIndex + 1} ("${cand.title}"): merge it, clean the ${group.candidates.length - 1} other worktree(s)`,
|
|
221
221
|
verb: 'Pick',
|
|
222
222
|
onConfirm: async () => {
|
|
223
223
|
try {
|
|
@@ -235,7 +235,7 @@ export async function handleAttemptsSubcommand(ctx: CommandContext, service: Wor
|
|
|
235
235
|
onCancel: () => {
|
|
236
236
|
pm.close('diff');
|
|
237
237
|
ctx.focusPrompt?.();
|
|
238
|
-
ctx.print('Pick cancelled
|
|
238
|
+
ctx.print('Pick cancelled: nothing merged, no worktree cleaned.');
|
|
239
239
|
ctx.renderRequest();
|
|
240
240
|
},
|
|
241
241
|
});
|