@pellux/goodvibes-tui 2.0.14 → 2.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.goodvibes/GOODVIBES.md +1 -1
- package/.goodvibes/agents/reviewer.md +8 -8
- package/.goodvibes/skills/add-provider/SKILL.md +22 -22
- package/CHANGELOG.md +49 -0
- package/README.md +64 -44
- package/docs/README.md +6 -6
- package/docs/foundation-artifacts/README.md +5 -5
- package/docs/foundation-artifacts/operator-contract.json +123 -123
- package/package.json +12 -10
- package/scripts/postinstall.js +3 -3
- package/src/audio/activation-sound.ts +7 -7
- package/src/audio/capture.ts +7 -7
- package/src/audio/onnxruntime-assets.d.ts +1 -1
- package/src/audio/player.ts +4 -4
- package/src/audio/spoken-turn-wiring.ts +4 -4
- package/src/audio/voice-capture-wiring.ts +5 -5
- package/src/audio/voice-input-session.ts +3 -3
- package/src/audio/wake-inference.ts +13 -8
- package/src/audio/wake-runtime.ts +10 -10
- package/src/cli/completions/generate.ts +2 -2
- package/src/cli/doctor.ts +13 -13
- package/src/cli/ensure-goodvibes-gitignore.ts +3 -3
- package/src/cli/entrypoint.ts +3 -3
- package/src/cli/help.ts +6 -6
- package/src/cli/hooks-command.ts +4 -4
- package/src/cli/hooks-report.ts +4 -4
- package/src/cli/launch-auto-update.ts +17 -17
- package/src/cli/management-commands.ts +8 -8
- package/src/cli/management-utils.ts +3 -3
- package/src/cli/management.ts +1 -1
- package/src/cli/plugin-bundles-command.ts +10 -10
- package/src/cli/plugin-command.ts +9 -9
- package/src/cli/service-posture.ts +1 -1
- package/src/cli/status.ts +10 -10
- package/src/cli/surface-command.ts +4 -4
- package/src/cli/tui-startup.ts +23 -23
- package/src/config/run-daemon-config-migration.ts +3 -3
- package/src/config/secret-config.ts +10 -10
- package/src/config/surface.ts +1 -1
- package/src/config/tui-extension-settings.ts +8 -8
- package/src/core/active-model-identity.ts +7 -7
- package/src/core/approval-alert.ts +5 -5
- package/src/core/bookmark-navigation.ts +3 -3
- package/src/core/budget-breach-notifier.ts +6 -6
- package/src/core/compaction-receipt.ts +8 -8
- package/src/core/composer-state.ts +2 -2
- package/src/core/context-usage.ts +1 -1
- package/src/core/conversation-compaction-render.ts +3 -3
- package/src/core/conversation-event-navigation.ts +2 -2
- package/src/core/conversation-fold.ts +9 -9
- package/src/core/conversation-line-cache.ts +14 -14
- package/src/core/conversation-render-context.ts +6 -6
- package/src/core/conversation-rendering.ts +27 -30
- package/src/core/conversation-search-expansion.ts +6 -6
- package/src/core/conversation-splash-state.ts +3 -3
- package/src/core/conversation-turn-structure.ts +13 -13
- package/src/core/conversation-types.ts +3 -3
- package/src/core/conversation-user-receipts.ts +5 -5
- package/src/core/conversation.ts +17 -17
- package/src/core/format-user-error.ts +5 -5
- package/src/core/long-task-notifier.ts +9 -9
- package/src/core/memory-diagnostics-gateway.ts +8 -8
- package/src/core/memory-provenance.ts +5 -5
- package/src/core/model-routing-chip.ts +3 -3
- package/src/core/pairing-tailscale-gateway.ts +3 -3
- package/src/core/permission-mode.ts +5 -5
- package/src/core/power-chip-source.ts +3 -3
- package/src/core/power-status.ts +8 -8
- package/src/core/rewind-receipt.ts +6 -6
- package/src/core/session-resume-core.ts +8 -8
- package/src/core/stream-event-wiring.ts +36 -36
- package/src/core/stream-stall-watchdog.ts +4 -4
- package/src/core/system-message-noise.ts +7 -7
- package/src/core/system-message-router.ts +10 -10
- package/src/core/terminal-notifier.ts +5 -5
- package/src/core/turn-budget-outcome.ts +5 -5
- package/src/core/turn-cancellation.ts +3 -3
- package/src/core/turn-event-wiring.ts +16 -16
- package/src/core/voice-capture-status.ts +2 -2
- package/src/core/voice-provision-gateway.ts +12 -12
- package/src/core/voice-provision-status.ts +19 -19
- package/src/core/voice-stt-gateway.ts +6 -6
- package/src/core/wake-provision-runner.ts +7 -7
- package/src/core/wake-provision-status.ts +17 -17
- package/src/core/workstream-notification.ts +8 -8
- package/src/export/gist-uploader.ts +7 -7
- package/src/input/autocomplete.ts +3 -3
- package/src/input/bookmark-modal.ts +1 -1
- package/src/input/command-args-hint.ts +2 -2
- package/src/input/command-reference.ts +9 -9
- package/src/input/command-registry.ts +32 -32
- package/src/input/commands/acp-runtime.ts +6 -6
- package/src/input/commands/calendar-runtime.ts +9 -9
- package/src/input/commands/channel-pairing.ts +11 -11
- package/src/input/commands/channel-runtime.ts +1 -1
- package/src/input/commands/checkin-runtime.ts +4 -4
- package/src/input/commands/checkpoint-runtime.ts +4 -4
- package/src/input/commands/ci-runtime.ts +4 -4
- package/src/input/commands/cluster-runtime.ts +3 -3
- package/src/input/commands/codebase-runtime.ts +16 -16
- package/src/input/commands/config.ts +6 -6
- package/src/input/commands/connection-status.ts +12 -12
- package/src/input/commands/context-window.ts +2 -2
- package/src/input/commands/cost-attribution-format.ts +4 -4
- package/src/input/commands/cost-runtime.ts +2 -2
- package/src/input/commands/devices-runtime.ts +7 -7
- package/src/input/commands/diff-runtime.ts +2 -2
- package/src/input/commands/editor-runtime.ts +1 -1
- package/src/input/commands/eval.ts +4 -4
- package/src/input/commands/experience-runtime.ts +1 -1
- package/src/input/commands/git-runtime.ts +3 -3
- package/src/input/commands/graph-runtime.ts +3 -3
- package/src/input/commands/guidance-runtime.ts +1 -1
- package/src/input/commands/health-metrics-format.ts +2 -2
- package/src/input/commands/health-runtime.ts +8 -8
- package/src/input/commands/hosted-runtime.ts +13 -13
- package/src/input/commands/image-runtime.ts +6 -6
- package/src/input/commands/intelligence-runtime.ts +2 -2
- package/src/input/commands/local-auth-runtime.ts +3 -3
- package/src/input/commands/local-provider-runtime.ts +3 -3
- package/src/input/commands/local-runtime.ts +7 -7
- package/src/input/commands/mail-runtime.ts +9 -9
- package/src/input/commands/mcp-runtime.ts +1 -1
- package/src/input/commands/memory.ts +13 -13
- package/src/input/commands/notify-runtime.ts +1 -1
- package/src/input/commands/operator-panel-runtime.ts +8 -8
- package/src/input/commands/operator-rpc.ts +3 -3
- package/src/input/commands/operator-runtime.ts +3 -3
- package/src/input/commands/palette-runtime.ts +1 -1
- package/src/input/commands/payment-card-intake.ts +17 -17
- package/src/input/commands/permissions-provenance.ts +7 -7
- package/src/input/commands/permissions-runtime.ts +1 -1
- package/src/input/commands/planning-runtime.ts +19 -19
- package/src/input/commands/platform-services-runtime.ts +2 -2
- package/src/input/commands/policy-dispatch.ts +6 -6
- package/src/input/commands/power-runtime.ts +6 -6
- package/src/input/commands/principals-runtime.ts +3 -3
- package/src/input/commands/product-runtime.ts +3 -3
- package/src/input/commands/profile-render.ts +13 -13
- package/src/input/commands/profile-runtime.ts +13 -13
- package/src/input/commands/profile-types.ts +13 -13
- package/src/input/commands/provider-accounts-runtime.ts +5 -5
- package/src/input/commands/provider.ts +10 -10
- package/src/input/commands/qrcode-runtime.ts +3 -3
- package/src/input/commands/queue-runtime.ts +6 -6
- package/src/input/commands/recall-files-config.ts +4 -4
- package/src/input/commands/recall-files-git.ts +3 -3
- package/src/input/commands/recall-files.ts +12 -12
- package/src/input/commands/recall-query.ts +3 -3
- package/src/input/commands/recall-review.ts +3 -3
- package/src/input/commands/recall-shared.ts +1 -1
- package/src/input/commands/relay-runtime.ts +5 -5
- package/src/input/commands/remote-runtime.ts +3 -3
- package/src/input/commands/review-runtime.ts +8 -8
- package/src/input/commands/rewind-runtime.ts +21 -21
- package/src/input/commands/runtime-services.ts +1 -2
- package/src/input/commands/schedule-nl.ts +2 -2
- package/src/input/commands/schedule-runtime.ts +2 -2
- package/src/input/commands/secret-runtime.ts +3 -3
- package/src/input/commands/session-content.ts +7 -7
- package/src/input/commands/session-picker-filter.ts +3 -3
- package/src/input/commands/session-workflow.ts +10 -10
- package/src/input/commands/session.ts +15 -15
- package/src/input/commands/settings-sync-runtime.ts +2 -2
- package/src/input/commands/share-runtime.ts +4 -4
- package/src/input/commands/shell-core.ts +11 -11
- package/src/input/commands/tasks-runtime.ts +4 -4
- package/src/input/commands/test-runtime.ts +6 -6
- package/src/input/commands/tts-runtime.ts +4 -4
- package/src/input/commands/update-runtime.ts +27 -27
- package/src/input/commands/websearch-runtime.ts +2 -2
- package/src/input/commands/work-plan-runtime.ts +2 -2
- package/src/input/commands/workstream-attempt-dependents.ts +4 -4
- package/src/input/commands/workstream-attempts.ts +16 -16
- package/src/input/commands/workstream-runtime.ts +36 -36
- package/src/input/commands/worktree-runtime.ts +6 -6
- package/src/input/composer-capture.ts +5 -5
- package/src/input/concealed-input.ts +2 -2
- package/src/input/config-modal-types.ts +16 -16
- package/src/input/config-modal.ts +30 -30
- package/src/input/daemon-owned-settings-descriptions.ts +4 -4
- package/src/input/delete-key-policy.ts +1 -1
- package/src/input/exec-env-scrub-config.ts +7 -7
- package/src/input/feature-unit-layout.ts +5 -5
- package/src/input/feed-context-factory.ts +38 -38
- package/src/input/file-picker.ts +1 -1
- package/src/input/handler-command-route.ts +2 -2
- package/src/input/handler-content-actions.ts +8 -8
- package/src/input/handler-feed-routes.ts +13 -13
- package/src/input/handler-feed.ts +31 -31
- package/src/input/handler-interactions.ts +2 -2
- package/src/input/handler-modal-routes.ts +13 -13
- package/src/input/handler-modal-stack.ts +1 -1
- package/src/input/handler-modal-token-routes.ts +1 -1
- package/src/input/handler-onboarding-daemon-adopt.ts +6 -6
- package/src/input/handler-picker-routes.ts +7 -7
- package/src/input/handler-prompt-buffer.ts +1 -1
- package/src/input/handler-shortcuts.ts +12 -12
- package/src/input/handler-types.ts +3 -3
- package/src/input/handler-ui-state.ts +1 -1
- package/src/input/handler.ts +9 -9
- package/src/input/input-history.ts +1 -1
- package/src/input/keybindings.ts +13 -13
- package/src/input/kill-ring.ts +7 -11
- package/src/input/model-picker-filter.ts +3 -3
- package/src/input/model-picker-items.ts +5 -5
- package/src/input/model-picker-types.ts +2 -2
- package/src/input/model-picker.ts +18 -18
- package/src/input/onboarding/onboarding-feature-units.ts +9 -13
- package/src/input/onboarding/onboarding-provider-key-fields.ts +3 -3
- package/src/input/onboarding/onboarding-runtime-status.ts +3 -3
- package/src/input/onboarding/onboarding-wizard-apply.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-cloudflare-step.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-constants.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +4 -4
- package/src/input/onboarding/onboarding-wizard-network-adopt.ts +6 -6
- package/src/input/onboarding/onboarding-wizard-steps.ts +2 -2
- package/src/input/panel-integration-actions.ts +3 -3
- package/src/input/panel-mouse-geometry.ts +1 -1
- package/src/input/panel-paste-flood-guard.ts +9 -9
- package/src/input/payments-config.ts +15 -15
- package/src/input/profile-picker-modal.ts +1 -1
- package/src/input/provider-key-intake.ts +9 -9
- package/src/input/relay-settings-descriptions.ts +3 -3
- package/src/input/sandbox-exec-config.ts +9 -9
- package/src/input/search.ts +18 -18
- package/src/input/selection-modal-queue.ts +10 -10
- package/src/input/selection-modal.ts +2 -2
- package/src/input/session-picker-modal.ts +7 -7
- package/src/input/settings-modal-activation.ts +1 -1
- package/src/input/settings-modal-adjustment.ts +2 -2
- package/src/input/settings-modal-commit.ts +6 -6
- package/src/input/settings-modal-connections.ts +2 -2
- package/src/input/settings-modal-data.ts +29 -29
- package/src/input/settings-modal-mutations.ts +7 -7
- package/src/input/settings-modal-reset.ts +3 -3
- package/src/input/settings-modal-search.ts +6 -6
- package/src/input/settings-modal-secrets.ts +3 -3
- package/src/input/settings-modal-types.ts +16 -16
- package/src/input/settings-modal.ts +4 -4
- package/src/input/voice-local-settings.ts +3 -3
- package/src/input/worktree-setup-config.ts +8 -8
- package/src/main.ts +15 -15
- package/src/panels/agent-inspector-shared.ts +5 -5
- package/src/panels/base-panel.ts +3 -3
- package/src/panels/builtin/agent.ts +3 -3
- package/src/panels/builtin/development.ts +4 -4
- package/src/panels/builtin/knowledge.ts +1 -1
- package/src/panels/builtin/operations.ts +12 -12
- package/src/panels/builtin/session.ts +8 -8
- package/src/panels/builtin/shared.ts +6 -6
- package/src/panels/builtin-modals.ts +8 -8
- package/src/panels/confirm-state.ts +5 -5
- package/src/panels/cost-tracker-panel.ts +22 -22
- package/src/panels/diff-panel.ts +20 -20
- package/src/panels/diff-review-model.ts +5 -5
- package/src/panels/diff-review-panel.ts +5 -5
- package/src/panels/eval-registry.ts +2 -2
- package/src/panels/expandable-list-panel.ts +5 -5
- package/src/panels/fleet-acts.ts +20 -20
- package/src/panels/fleet-deep-link.ts +5 -5
- package/src/panels/fleet-gateway.ts +12 -12
- package/src/panels/fleet-observed-render.ts +11 -11
- package/src/panels/fleet-panel-format.ts +14 -14
- package/src/panels/fleet-panel-worktree-detail.ts +8 -8
- package/src/panels/fleet-panel.ts +34 -34
- package/src/panels/fleet-read-model.ts +49 -49
- package/src/panels/fleet-spawn.ts +15 -15
- package/src/panels/fleet-steer.ts +7 -7
- package/src/panels/fleet-stop.ts +5 -5
- package/src/panels/fleet-tabs.ts +14 -14
- package/src/panels/fleet-transcript.ts +26 -26
- package/src/panels/git-panel.ts +8 -8
- package/src/panels/hosted-session-feed.ts +13 -13
- package/src/panels/hosted-session-panel.ts +7 -7
- package/src/panels/index.ts +1 -1
- package/src/panels/local-auth-panel.ts +15 -15
- package/src/panels/memory-consolidation-gateway.ts +8 -8
- package/src/panels/modals/devices-modal.ts +8 -8
- package/src/panels/modals/hooks-modal.ts +1 -1
- package/src/panels/modals/keybindings-modal.ts +5 -5
- package/src/panels/modals/knowledge-modal.ts +2 -2
- package/src/panels/modals/local-auth-modal.ts +4 -4
- package/src/panels/modals/marketplace-modal.ts +3 -3
- package/src/panels/modals/memory-modal.ts +19 -19
- package/src/panels/modals/modal-surface-helpers.ts +1 -1
- package/src/panels/modals/modal-theme.ts +3 -3
- package/src/panels/modals/pairing-modal.ts +19 -19
- package/src/panels/modals/planning-modal.ts +11 -11
- package/src/panels/modals/plugins-modal.ts +1 -1
- package/src/panels/modals/policy-modal.ts +4 -4
- package/src/panels/modals/provider-health-modal.ts +1 -1
- package/src/panels/modals/remote-modal.ts +1 -1
- package/src/panels/modals/sandbox-modal.ts +2 -2
- package/src/panels/modals/security-modal.ts +4 -4
- package/src/panels/modals/services-modal.ts +1 -1
- package/src/panels/modals/work-plan-modal.ts +4 -4
- package/src/panels/notifications-feed.ts +6 -6
- package/src/panels/notifications-panel.ts +6 -6
- package/src/panels/panel-confirm-overlay.ts +4 -4
- package/src/panels/panel-manager.ts +13 -13
- package/src/panels/plugins-panel.ts +6 -6
- package/src/panels/polish-core.ts +2 -2
- package/src/panels/polish-tables.ts +2 -2
- package/src/panels/polish.ts +1 -1
- package/src/panels/project-planning-answer-actions.ts +3 -3
- package/src/panels/scrollable-list-panel.ts +15 -15
- package/src/panels/search-focus.ts +1 -1
- package/src/panels/session-maintenance.ts +1 -1
- package/src/panels/skills-panel.ts +3 -3
- package/src/panels/token-budget-panel.ts +11 -11
- package/src/panels/types.ts +14 -14
- package/src/panels/workstream-graph-render.ts +5 -5
- package/src/panels/wrfc-panel-format.ts +1 -1
- package/src/permissions/broker-approval-card.ts +13 -13
- package/src/permissions/hunk-selection.ts +13 -13
- package/src/permissions/prompt.ts +22 -22
- package/src/permissions/sandbox-exec-gate.ts +5 -5
- package/src/providers/provider-classification.ts +1 -1
- package/src/providers/reasoning-effort-surface.ts +12 -12
- package/src/renderer/ansi-sanitize.ts +5 -6
- package/src/renderer/autocomplete-overlay.ts +5 -5
- package/src/renderer/block-actions-overlay.ts +1 -1
- package/src/renderer/bookmark-modal.ts +1 -1
- package/src/renderer/code-block.ts +2 -2
- package/src/renderer/compaction-history-modal.ts +4 -4
- package/src/renderer/compaction-preview.ts +5 -5
- package/src/renderer/compaction-quality.ts +5 -5
- package/src/renderer/composer-fragments.ts +6 -6
- package/src/renderer/compositor.ts +9 -9
- package/src/renderer/config-modal.ts +3 -3
- package/src/renderer/context-inspector.ts +1 -1
- package/src/renderer/context-status-hint.ts +10 -10
- package/src/renderer/conversation-layout.ts +2 -2
- package/src/renderer/conversation-overlays.ts +2 -2
- package/src/renderer/conversation-surface.ts +6 -6
- package/src/renderer/diff.ts +4 -4
- package/src/renderer/fleet-tab-strip.ts +2 -2
- package/src/renderer/footer-tips.ts +4 -4
- package/src/renderer/fullscreen-primitives.ts +1 -1
- package/src/renderer/git-status.ts +5 -5
- package/src/renderer/header-line.ts +5 -5
- package/src/renderer/help-overlay.ts +5 -5
- package/src/renderer/hint-grammar.ts +2 -2
- package/src/renderer/layout.ts +1 -1
- package/src/renderer/markdown-inline.ts +3 -3
- package/src/renderer/markdown-table.ts +7 -7
- package/src/renderer/modal-factory.ts +3 -3
- package/src/renderer/model-picker-overlay.ts +2 -2
- package/src/renderer/model-workspace.ts +7 -7
- package/src/renderer/onboarding/onboarding-wizard.ts +1 -1
- package/src/renderer/overlay-box.ts +1 -1
- package/src/renderer/panel-composite.ts +5 -5
- package/src/renderer/panel-workspace-bar.ts +1 -1
- package/src/renderer/process-indicator.ts +8 -8
- package/src/renderer/profile-picker-modal.ts +3 -3
- package/src/renderer/prompt-content-width.ts +1 -1
- package/src/renderer/search-overlay.ts +3 -3
- package/src/renderer/selection-modal-overlay.ts +6 -6
- package/src/renderer/semantic-diff.ts +6 -7
- package/src/renderer/session-picker-modal.ts +24 -24
- package/src/renderer/settings-modal-connections.ts +3 -3
- package/src/renderer/settings-modal-helpers.ts +16 -16
- package/src/renderer/settings-modal.ts +10 -10
- package/src/renderer/shell-surface.ts +8 -8
- package/src/renderer/status-glyphs.ts +6 -6
- package/src/renderer/syntax-highlighter.ts +2 -3
- package/src/renderer/system-message.ts +3 -3
- package/src/renderer/tab-strip.ts +2 -2
- package/src/renderer/term-caps.ts +12 -12
- package/src/renderer/terminal-bg-probe.ts +10 -10
- package/src/renderer/terminal-escapes.ts +1 -1
- package/src/renderer/theme-mode-config.ts +3 -3
- package/src/renderer/theme.ts +34 -34
- package/src/renderer/thinking.ts +1 -1
- package/src/renderer/tool-call.ts +5 -5
- package/src/renderer/tool-result-expanded-lines.ts +3 -3
- package/src/renderer/tool-result-summary.ts +6 -6
- package/src/renderer/turn-injection.ts +9 -9
- package/src/renderer/ui-factory.ts +33 -33
- package/src/renderer/ui-primitives.ts +4 -4
- package/src/runtime/bootstrap-command-parts.ts +3 -3
- package/src/runtime/bootstrap-core.ts +21 -21
- package/src/runtime/bootstrap-hook-bridge.ts +8 -8
- package/src/runtime/bootstrap-shell.ts +9 -9
- package/src/runtime/bootstrap.ts +16 -16
- package/src/runtime/client/approval-updates.ts +3 -3
- package/src/runtime/client/build-floors.ts +7 -7
- package/src/runtime/client/daemon-attach-handshake.ts +5 -5
- package/src/runtime/client/fleet-union.ts +7 -7
- package/src/runtime/client/host-service-status.ts +2 -2
- package/src/runtime/client/hosted-exit.ts +4 -4
- package/src/runtime/client/hosted-roster.ts +4 -4
- package/src/runtime/client/hosted-session-stream.ts +5 -5
- package/src/runtime/client/hosted-sessions.ts +8 -8
- package/src/runtime/client/operator-endpoint.ts +14 -14
- package/src/runtime/client/spine-adoption.ts +8 -8
- package/src/runtime/context-accounting-source.ts +4 -4
- package/src/runtime/context.ts +2 -2
- package/src/runtime/conversation-rewind-port.ts +6 -6
- package/src/runtime/credential-composition.ts +2 -2
- package/src/runtime/daemon-attach-notices.ts +6 -6
- package/src/runtime/diagnostics/panels/index.ts +1 -1
- package/src/runtime/diagnostics/panels/ops.ts +2 -2
- package/src/runtime/disposal-wiring.ts +6 -6
- package/src/runtime/index.ts +11 -11
- package/src/runtime/install-self-check-startup.ts +4 -4
- package/src/runtime/install-self-check.ts +6 -6
- package/src/runtime/interaction-seams.ts +4 -4
- package/src/runtime/knowledge-services.ts +2 -2
- package/src/runtime/legacy-daemon-migration.ts +37 -37
- package/src/runtime/legacy-daemon-reconcile.ts +30 -30
- package/src/runtime/memory-governance-services.ts +3 -3
- package/src/runtime/memory-spine-transport.ts +3 -3
- package/src/runtime/notification-dispatch.ts +4 -4
- package/src/runtime/onboarding/apply.ts +1 -1
- package/src/runtime/onboarding/derivation.ts +1 -1
- package/src/runtime/onboarding/fast-path.ts +7 -7
- package/src/runtime/onboarding/progress.ts +2 -2
- package/src/runtime/onboarding/provider-key-capture.ts +4 -4
- package/src/runtime/onboarding/snapshot.ts +2 -2
- package/src/runtime/onboarding/state.ts +4 -4
- package/src/runtime/onboarding/types.ts +4 -4
- package/src/runtime/orchestrator-core-services.ts +5 -5
- package/src/runtime/path-shadow-startup.ts +3 -3
- package/src/runtime/perf/panel-contracts.ts +1 -1
- package/src/runtime/power-keepawake-remote.ts +6 -6
- package/src/runtime/process-lifecycle.ts +14 -14
- package/src/runtime/provider-fallback.ts +3 -3
- package/src/runtime/recovery-autosave.ts +3 -3
- package/src/runtime/recovery-decisions.ts +19 -19
- package/src/runtime/recovery-offer-wiring.ts +4 -4
- package/src/runtime/recovery-prompt.ts +20 -20
- package/src/runtime/relay-reachability-bridge.ts +3 -3
- package/src/runtime/release-artifacts.ts +1 -1
- package/src/runtime/resume-notice.ts +20 -20
- package/src/runtime/runtime-services-types.ts +20 -20
- package/src/runtime/services.ts +20 -20
- package/src/runtime/session-continuity-hints.ts +1 -1
- package/src/runtime/session-inbound-inputs.ts +12 -12
- package/src/runtime/session-resume-liveness-confirm.ts +4 -4
- package/src/runtime/session-spine-transport.ts +3 -3
- package/src/runtime/store/domains/panels.ts +2 -2
- package/src/runtime/store/domains/ui-perf.ts +2 -2
- package/src/runtime/store/index.ts +1 -1
- package/src/runtime/store/selectors/index.ts +1 -1
- package/src/runtime/store/state.ts +2 -2
- package/src/runtime/ui-services.ts +3 -3
- package/src/runtime/workspace-checkpointing.ts +3 -3
- package/src/runtime/wrfc-persistence.ts +15 -15
- package/src/scripts/process-messages.ts +1 -1
- package/src/shell/blocking-input.ts +9 -9
- package/src/shell/recovery-input-helpers.ts +2 -2
- package/src/shell/retry-affordance.ts +9 -9
- package/src/shell/ui-openers.ts +14 -14
- package/src/shell/voice-capture-shell.ts +3 -3
- package/src/tools/wrfc-agent-guard.ts +4 -4
- package/src/utils/browser.ts +2 -2
- package/src/utils/format-duration.ts +3 -3
- package/src/utils/format-number.ts +2 -2
- package/src/utils/splash-lines.ts +4 -4
- package/src/utils/terminal-width.ts +6 -6
- package/src/verification/verification-ledger.ts +25 -25
- package/src/version.ts +3 -3
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* recovery-prompt.ts
|
|
2
|
+
* recovery-prompt.ts, the startup "a recovery snapshot exists, do you want
|
|
3
3
|
* it?" flow.
|
|
4
4
|
*
|
|
5
5
|
* A crash-recovery snapshot used to get one sentence in the boot resume
|
|
6
|
-
* notice, which left the operator to read it and retype a command
|
|
6
|
+
* notice, which left the operator to read it and retype a command, and for a
|
|
7
7
|
* session that crashed before its first clean save, there was no command that
|
|
8
8
|
* reached the snapshot at all, so the sentence was a dead end. This module
|
|
9
9
|
* replaces that with an explicit two-step ask:
|
|
@@ -14,13 +14,13 @@
|
|
|
14
14
|
* Rules this flow keeps:
|
|
15
15
|
* - Nothing is ever applied without the user picking Resume. There is no
|
|
16
16
|
* silent auto-restore path here, and this module never loads a snapshot
|
|
17
|
-
* just to look at it
|
|
17
|
+
* just to look at it, `checkRecoveryFile` reports, and only an explicit
|
|
18
18
|
* yes reaches the code that opens the file.
|
|
19
19
|
* - The SDK's `applyRecoverySnapshot` is what runs on that yes, and it will
|
|
20
20
|
* not run without the confirmation token this flow hands it. It reads,
|
|
21
21
|
* retires and applies in one operation, load-then-delete: the file is
|
|
22
22
|
* retired only after a successful load, so a failed read can never destroy
|
|
23
|
-
* state that was never actually recovered
|
|
23
|
+
* state that was never actually recovered, and a successful load can
|
|
24
24
|
* never leave a restored snapshot behind to be offered again.
|
|
25
25
|
* - Every fact shown is one we actually have (session id, snapshot age,
|
|
26
26
|
* title when the snapshot carries one, byte size when the file is where
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
* is offered again on the next launch, not again in this one.
|
|
45
45
|
* - Remove is permanent, not just for this file. The decision is written to
|
|
46
46
|
* the durable ledger in recovery-decisions.ts, so a snapshot that comes
|
|
47
|
-
* back byte-for-byte
|
|
48
|
-
* is rewriting it every minute
|
|
47
|
+
* back byte-for-byte, because a session still running on an older build
|
|
48
|
+
* is rewriting it every minute, is deleted on sight instead of asked
|
|
49
49
|
* about again. Deleting the file used to be the entire memory of the
|
|
50
50
|
* answer, which is how the same question survived being answered three
|
|
51
51
|
* times.
|
|
@@ -79,7 +79,7 @@ export type SelectionOpener = (
|
|
|
79
79
|
|
|
80
80
|
export interface RecoveryPromptDeps {
|
|
81
81
|
readonly surface: SessionSurface;
|
|
82
|
-
/** The shell's selection-modal opener. Absent in headless hosts
|
|
82
|
+
/** The shell's selection-modal opener. Absent in headless hosts, the flow then does nothing at all. */
|
|
83
83
|
readonly openSelection: SelectionOpener | undefined;
|
|
84
84
|
/**
|
|
85
85
|
* Apply an explicitly-accepted snapshot to the live conversation and report
|
|
@@ -106,7 +106,7 @@ export interface RecoveryPromptDeps {
|
|
|
106
106
|
* session (`checkRecoveryFile`). Used by the `--continue` / bare `--resume`
|
|
107
107
|
* pre-resume check (cli/tui-startup.ts): resuming a named session straight
|
|
108
108
|
* from its durable store would silently drop the tail of messages held only
|
|
109
|
-
* in a snapshot newer than that store
|
|
109
|
+
* in a snapshot newer than that store, the same rule `checkRecoveryFile`
|
|
110
110
|
* uses, just scoped to the one session being resumed instead of "whichever
|
|
111
111
|
* session has the newest snapshot".
|
|
112
112
|
*/
|
|
@@ -115,7 +115,7 @@ export interface RecoveryPromptDeps {
|
|
|
115
115
|
|
|
116
116
|
// ─── Honest fact formatting ─────────────────────────────────────────────────
|
|
117
117
|
|
|
118
|
-
/** Human-readable age of a snapshot. Coarse on purpose
|
|
118
|
+
/** Human-readable age of a snapshot. Coarse on purpose, the exact second is not a fact worth claiming. */
|
|
119
119
|
export function formatSnapshotAge(ageMs: number): string {
|
|
120
120
|
if (ageMs < 0) return 'just now';
|
|
121
121
|
const minutes = Math.floor(ageMs / 60_000);
|
|
@@ -155,7 +155,7 @@ export function describeRecoverySnapshot(
|
|
|
155
155
|
|
|
156
156
|
/**
|
|
157
157
|
* The offer modal's rows. The snapshot's facts ride on the Resume row's
|
|
158
|
-
* `detail
|
|
158
|
+
* `detail`, both because that is where they are decision-relevant ("this is
|
|
159
159
|
* what you would be loading") and because `detail` is the only field the
|
|
160
160
|
* selection overlay wraps rather than truncates, so the full description
|
|
161
161
|
* survives any terminal width.
|
|
@@ -226,8 +226,8 @@ function defaultSnapshotBytes(surface: SessionSurface, sessionId: string): numbe
|
|
|
226
226
|
|
|
227
227
|
/**
|
|
228
228
|
* Snapshots the user has already answered about (Keep or dismissal) during
|
|
229
|
-
* this process's lifetime. Two offer paths exist in one boot
|
|
230
|
-
* pre-resume check for `--continue`/`--resume` and the general startup offer
|
|
229
|
+
* this process's lifetime. Two offer paths exist in one boot, the targeted
|
|
230
|
+
* pre-resume check for `--continue`/`--resume` and the general startup offer,
|
|
231
231
|
* and both can find the same snapshot; an answer given to either binds both,
|
|
232
232
|
* so "stays quiet for the rest of the run" holds across the pair. Resume and
|
|
233
233
|
* Remove retire the file itself, so only the declined cases need remembering.
|
|
@@ -236,7 +236,7 @@ const answeredThisRun = new Set<string>();
|
|
|
236
236
|
|
|
237
237
|
/**
|
|
238
238
|
* Test seam: a fresh process has no answered offers. Only clears the
|
|
239
|
-
* in-process Keep memory
|
|
239
|
+
* in-process Keep memory, removal decisions are durable on purpose and live
|
|
240
240
|
* in the surface's own directory, so a test gets a clean ledger by using a
|
|
241
241
|
* fresh temp surface, the same way a real user gets one by using a different
|
|
242
242
|
* machine.
|
|
@@ -259,7 +259,7 @@ const MAX_RECORDED_REMOVAL_PASSES = 8;
|
|
|
259
259
|
*
|
|
260
260
|
* A snapshot whose session is in the removal ledger is deleted here and NOT
|
|
261
261
|
* offered: the user answered that question already, and re-asking because the
|
|
262
|
-
* file came back is the defect. Deleting rather than merely skipping matters
|
|
262
|
+
* file came back is the defect. Deleting rather than merely skipping matters,
|
|
263
263
|
* skipping would leave the file to mask an older, genuinely-orphaned snapshot
|
|
264
264
|
* underneath it forever.
|
|
265
265
|
*/
|
|
@@ -298,7 +298,7 @@ export async function offerRecoverySnapshot(deps: RecoveryPromptDeps): Promise<R
|
|
|
298
298
|
// targeted --continue offer and the general startup offer can both find
|
|
299
299
|
// it). The earlier answer stands; don't ask twice.
|
|
300
300
|
if (answeredThisRun.has(info.sessionId)) return 'kept';
|
|
301
|
-
// Another terminal is actively refreshing this snapshot
|
|
301
|
+
// Another terminal is actively refreshing this snapshot, it is that
|
|
302
302
|
// instance's live state, not an orphaned crash.
|
|
303
303
|
if (checkSessionLiveness(deps.surface, info.sessionId).live) return 'none';
|
|
304
304
|
const open = deps.openSelection;
|
|
@@ -318,8 +318,8 @@ export async function offerRecoverySnapshot(deps: RecoveryPromptDeps): Promise<R
|
|
|
318
318
|
// is gone" are not the same news.
|
|
319
319
|
deps.receipt(
|
|
320
320
|
result.refusal === 'no-snapshot'
|
|
321
|
-
? 'Recovery snapshot could not be read
|
|
322
|
-
: `Recovery snapshot for session ${info.sessionId} could not be restored
|
|
321
|
+
? 'Recovery snapshot could not be read; it was left on disk and will be offered again next launch.'
|
|
322
|
+
: `Recovery snapshot for session ${info.sessionId} could not be restored; the file was damaged, and reading it retired it. Nothing was changed in this session.`,
|
|
323
323
|
);
|
|
324
324
|
deps.render();
|
|
325
325
|
return 'resume-failed';
|
|
@@ -345,14 +345,14 @@ export async function offerRecoverySnapshot(deps: RecoveryPromptDeps): Promise<R
|
|
|
345
345
|
// it in the first place.
|
|
346
346
|
recordRecoveryRemoval(deps.surface, info.sessionId);
|
|
347
347
|
deps.receipt(removed
|
|
348
|
-
? `Recovery point removed (session ${info.sessionId})
|
|
349
|
-
: `No recovery point was found to remove (session ${info.sessionId})
|
|
348
|
+
? `Recovery point removed (session ${info.sessionId}): it will not be offered again, even if the file reappears.`
|
|
349
|
+
: `No recovery point was found to remove (session ${info.sessionId}): if one reappears for that session it will be discarded, not offered.`);
|
|
350
350
|
deps.render();
|
|
351
351
|
return 'removed';
|
|
352
352
|
}
|
|
353
353
|
|
|
354
354
|
answeredThisRun.add(info.sessionId);
|
|
355
|
-
deps.receipt(`Recovery point kept (session ${info.sessionId})
|
|
355
|
+
deps.receipt(`Recovery point kept (session ${info.sessionId}): it will be offered again next launch.`);
|
|
356
356
|
deps.render();
|
|
357
357
|
return 'kept';
|
|
358
358
|
} catch {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* relay-reachability-bridge.ts
|
|
2
|
+
* relay-reachability-bridge.ts, what this terminal can honestly say about the
|
|
3
3
|
* outbound relay's live state.
|
|
4
4
|
*
|
|
5
5
|
* The relay is a DAEMON capability. The reachability controller is composed
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* registers with the relay and can mint a pairing payload for it.
|
|
10
10
|
*
|
|
11
11
|
* This terminal is a client. It never constructs a `DaemonServer`, so it holds
|
|
12
|
-
* no controller of its own, and it has no handle to the adopted daemon's
|
|
12
|
+
* no controller of its own, and it has no handle to the adopted daemon's, the
|
|
13
13
|
* control plane exposes no verb for one. The operator contract's `relay`
|
|
14
14
|
* category carries the two step-up ceremony verbs (`stepup.challenge.mint`,
|
|
15
15
|
* `stepup.credential.register`) and nothing that reports registration state or
|
|
@@ -55,7 +55,7 @@ export interface RelayReadAccessors {
|
|
|
55
55
|
*/
|
|
56
56
|
export const RELAY_STATE_NOT_READABLE_HERE =
|
|
57
57
|
'The daemon holds the relay connection and the control plane exposes no verb for its state, '
|
|
58
|
-
+ 'so this terminal cannot read it
|
|
58
|
+
+ 'so this terminal cannot read it; ask the machine running the daemon.';
|
|
59
59
|
|
|
60
60
|
/** The two relay accessors, spread into `externalServices` from bootstrap.ts. */
|
|
61
61
|
export const relayReadAccessors: RelayReadAccessors = {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Release-artifact naming and checksum verification
|
|
2
|
+
* Release-artifact naming and checksum verification, re-exported from the
|
|
3
3
|
* SDK's canonical update policy module (platform/runtime/self-update), which
|
|
4
4
|
* was hoisted from this file's semantics. One mechanism everywhere: the
|
|
5
5
|
* asset naming convention (`goodvibes[-daemon]-{platform}-{arch}`), the
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* resume-notice.ts
|
|
2
|
+
* resume-notice.ts, the boot-time "previous session found" transcript notice.
|
|
3
3
|
*
|
|
4
4
|
* item 1: a supervision-journey audit of 1.7.0 found that the TUI
|
|
5
5
|
* accumulates rich resumable state on disk (a saved conversation, workspace
|
|
6
|
-
* checkpoints, WRFC chain history) but never surfaces any of it at startup
|
|
6
|
+
* checkpoints, WRFC chain history) but never surfaces any of it at startup,
|
|
7
7
|
* an operator has no way to know it exists short of already knowing the
|
|
8
8
|
* right command. This module builds ONE compact, honest system-message block
|
|
9
9
|
* printed after the splash and before the first prompt, summarizing exactly
|
|
@@ -14,17 +14,17 @@
|
|
|
14
14
|
* (session.ts) opens a zero-typing picker over saved sessions when
|
|
15
15
|
* called bare, and resumes directly when given an id/name; `/sessions`
|
|
16
16
|
* (session-content.ts) forwards a `resume <id>` subcommand to the same
|
|
17
|
-
* `/session resume` path. All three spellings
|
|
18
|
-
* `/session resume <id>`, `/sessions resume <id
|
|
17
|
+
* `/session resume` path. All three spellings, `/resume <id>`,
|
|
18
|
+
* `/session resume <id>`, `/sessions resume <id>`, reach the identical
|
|
19
19
|
* resume routine. This notice leads with the zero-typing picker
|
|
20
20
|
* (`/resume`) and keeps the direct, exact-id form (`/session resume
|
|
21
21
|
* <id>`) as a secondary hint, for the case of already knowing which
|
|
22
22
|
* session to reach for.
|
|
23
23
|
* - `/checkpoints` works with zero arguments and behaves correctly at any
|
|
24
|
-
* checkpoint count (including zero)
|
|
24
|
+
* checkpoint count (including zero), advertised whenever the checkpoint
|
|
25
25
|
* manager is available in this session.
|
|
26
26
|
* - `/recall` (memory) is only advertised when the memory API is actually
|
|
27
|
-
* wired up in this session (context.clients?.knowledgeApi?.memory)
|
|
27
|
+
* wired up in this session (context.clients?.knowledgeApi?.memory),
|
|
28
28
|
* some runtimes don't have it, and claiming it works there would not be
|
|
29
29
|
* honest.
|
|
30
30
|
* - Every clause is independently gated on real data: a claim about
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
* It used to get a clause here, which meant an operator's only route back
|
|
35
35
|
* to a crashed session was reading a sentence and retyping a command. It
|
|
36
36
|
* is now an explicit ask-then-retire modal raised right after first
|
|
37
|
-
* render
|
|
37
|
+
* render, see runtime/recovery-prompt.ts. Keeping a passive clause here
|
|
38
38
|
* as well would announce the same snapshot twice.
|
|
39
39
|
*/
|
|
40
40
|
|
|
@@ -56,7 +56,7 @@ import type { SystemMessageRouter } from '../core/system-message-router.ts';
|
|
|
56
56
|
* existed lack it; for those we fall back to the owner-decision log, where
|
|
57
57
|
* cancelChain() also records a `chain_cancelled` decision. A chain still
|
|
58
58
|
* non-terminal after rehydrate's zombie-reap check (see wrfc-persistence.ts)
|
|
59
|
-
* is reported as 'interrupted'
|
|
59
|
+
* is reported as 'interrupted', re-imported and live again, not history.
|
|
60
60
|
*/
|
|
61
61
|
export type ChainOutcome = 'passed' | 'failed' | 'cancelled' | 'interrupted';
|
|
62
62
|
|
|
@@ -91,7 +91,7 @@ export function mostRecentChain(chains: readonly WrfcChain[]): WrfcChain | null
|
|
|
91
91
|
export interface ResumeNoticeFacts {
|
|
92
92
|
/** Number of user turns in the last saved session. Null when there is no prior session (or it could not be read). */
|
|
93
93
|
readonly turnCount: number | null;
|
|
94
|
-
/** Session id of the last saved session
|
|
94
|
+
/** Session id of the last saved session, needed to build a truthful, directly-runnable resume hint. Null when there is no prior session. */
|
|
95
95
|
readonly lastSessionId: string | null;
|
|
96
96
|
/** Number of workspace checkpoints. Null when the checkpoint manager is unavailable in this session (not the same as zero). */
|
|
97
97
|
readonly checkpointCount: number | null;
|
|
@@ -107,7 +107,7 @@ function plural(n: number, word: string): string {
|
|
|
107
107
|
|
|
108
108
|
/**
|
|
109
109
|
* Build the boot resume notice text, or null when there is nothing to
|
|
110
|
-
* report (no prior session, no checkpoints ever taken, no chain history
|
|
110
|
+
* report (no prior session, no checkpoints ever taken, no chain history,
|
|
111
111
|
* a clean/new working directory prints nothing, respecting quiet startup).
|
|
112
112
|
*/
|
|
113
113
|
export function buildResumeNotice(facts: ResumeNoticeFacts): string | null {
|
|
@@ -123,7 +123,7 @@ export function buildResumeNotice(facts: ResumeNoticeFacts): string | null {
|
|
|
123
123
|
if (hasSession) summary.push(plural(facts.turnCount!, 'turn'));
|
|
124
124
|
// Show the checkpoint count whenever it's knowable and there's a reason to
|
|
125
125
|
// (anchored to an existing session, or checkpoints genuinely exist even
|
|
126
|
-
// without one)
|
|
126
|
+
// without one), never guessed when the manager is unavailable.
|
|
127
127
|
if (checkpointsKnown && (hasSession || hasCheckpoints)) summary.push(plural(checkpointCount, 'checkpoint'));
|
|
128
128
|
if (hasChainHistory) summary.push(`last chain: ${facts.lastChainOutcome}`);
|
|
129
129
|
|
|
@@ -132,11 +132,11 @@ export function buildResumeNotice(facts: ResumeNoticeFacts): string | null {
|
|
|
132
132
|
|
|
133
133
|
const hints: string[] = [];
|
|
134
134
|
// Lead with the zero-typing picker (/resume), keep the direct exact-id
|
|
135
|
-
// form as a secondary hint
|
|
135
|
+
// form as a secondary hint, see the header doc for why both are honest.
|
|
136
136
|
if (hasSession) hints.push(`/resume to continue (or /session resume ${facts.lastSessionId} directly)`);
|
|
137
137
|
if (hasCheckpoints) hints.push('/checkpoints to browse');
|
|
138
138
|
if (facts.memoryAvailable) hints.push('/recall for memory');
|
|
139
|
-
if (hints.length > 0) notice +=
|
|
139
|
+
if (hints.length > 0) notice += `: ${hints.join(' · ')}`;
|
|
140
140
|
|
|
141
141
|
return notice;
|
|
142
142
|
}
|
|
@@ -144,9 +144,9 @@ export function buildResumeNotice(facts: ResumeNoticeFacts): string | null {
|
|
|
144
144
|
// ─── Fact gathering (I/O) ────────────────────────────────────────────────────
|
|
145
145
|
|
|
146
146
|
export interface ResumeNoticeDeps {
|
|
147
|
-
/** The app's declare-once session-storage handle
|
|
147
|
+
/** The app's declare-once session-storage handle, the same one the runtime writes the pointer through. */
|
|
148
148
|
readonly surface: SessionSurface;
|
|
149
|
-
/** Only `load()` is needed
|
|
149
|
+
/** Only `load()` is needed, kept narrow for testability. */
|
|
150
150
|
readonly sessionManager: Pick<SessionManager, 'load'>;
|
|
151
151
|
/** Undefined when checkpoints are not wired up in this session at all. Only `list()` is needed. */
|
|
152
152
|
readonly checkpointManager: Pick<WorkspaceCheckpointManager, 'list'> | undefined;
|
|
@@ -158,11 +158,11 @@ export interface ResumeNoticeDeps {
|
|
|
158
158
|
|
|
159
159
|
/**
|
|
160
160
|
* Read the last session's real turn count from its saved JSONL file. A user
|
|
161
|
-
* turn is one stored message with role 'user'
|
|
161
|
+
* turn is one stored message with role 'user', the number of times the
|
|
162
162
|
* operator spoke, which is what "N turns" means to a human reading the
|
|
163
163
|
* notice (as opposed to a raw message count, which double-counts replies).
|
|
164
164
|
* Returns null when there is no last-session pointer, or the pointed-to
|
|
165
|
-
* session file is missing/corrupt
|
|
165
|
+
* session file is missing/corrupt, never a claim about a session that
|
|
166
166
|
* cannot actually be resumed.
|
|
167
167
|
*/
|
|
168
168
|
function readLastSessionTurns(deps: Pick<ResumeNoticeDeps, 'surface' | 'sessionManager'>): { turnCount: number; lastSessionId: string } | null {
|
|
@@ -173,7 +173,7 @@ function readLastSessionTurns(deps: Pick<ResumeNoticeDeps, 'surface' | 'sessionM
|
|
|
173
173
|
const turnCount = messages.filter((m) => (m as { role?: unknown }).role === 'user').length;
|
|
174
174
|
return { turnCount, lastSessionId };
|
|
175
175
|
} catch {
|
|
176
|
-
// Pointer file present but the session it points to is gone/corrupt
|
|
176
|
+
// Pointer file present but the session it points to is gone/corrupt,
|
|
177
177
|
// there is nothing truthful to resume.
|
|
178
178
|
return null;
|
|
179
179
|
}
|
|
@@ -185,7 +185,7 @@ async function readCheckpointCount(mgr: ResumeNoticeDeps['checkpointManager']):
|
|
|
185
185
|
return (await mgr.list()).length;
|
|
186
186
|
} catch {
|
|
187
187
|
// Checkpoint manager present but its cached init() rejection makes every
|
|
188
|
-
// call fail forever (see services.ts)
|
|
188
|
+
// call fail forever (see services.ts), treat as "unknown", not zero.
|
|
189
189
|
return null;
|
|
190
190
|
}
|
|
191
191
|
}
|
|
@@ -194,7 +194,7 @@ async function readCheckpointCount(mgr: ResumeNoticeDeps['checkpointManager']):
|
|
|
194
194
|
* Gather real facts from disk/services and, if there is anything to report,
|
|
195
195
|
* print ONE compact system message via `deps.router.high`. No-op (and no
|
|
196
196
|
* message) when there is no prior session, no checkpoints, and no chain
|
|
197
|
-
* history
|
|
197
|
+
* history, a fresh working directory stays quiet. Nothing here ever mutates
|
|
198
198
|
* the conversation: this is a report, not a restore.
|
|
199
199
|
*/
|
|
200
200
|
export async function announceResumeState(deps: ResumeNoticeDeps): Promise<void> {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* runtime-services-types.ts
|
|
2
|
+
* runtime-services-types.ts, the public contract createRuntimeServices() takes
|
|
3
3
|
* and returns.
|
|
4
4
|
*
|
|
5
5
|
* Split out of services.ts (the composition root that builds every one of
|
|
6
6
|
* these fields) so the construction logic can stay under the repo's
|
|
7
7
|
* architecture line-count gate without trimming 35 arbitrary lines to clear
|
|
8
8
|
* the number. This module owns ONLY the shape of the input options and the
|
|
9
|
-
* output surface
|
|
9
|
+
* output surface, no runtime code, no wiring order, nothing that constructs
|
|
10
10
|
* anything. services.ts re-exports both types from here, so no import site
|
|
11
11
|
* anywhere else in the app had to change.
|
|
12
12
|
*/
|
|
@@ -87,14 +87,14 @@ export interface RuntimeServicesOptions {
|
|
|
87
87
|
* Threaded into `SecretsManager` so the override MOVES the daemon-scoped
|
|
88
88
|
* credential store; without it a daemon told to run out of a temp tree still
|
|
89
89
|
* read the real home's daemon secrets, so an "isolated" test daemon held the
|
|
90
|
-
* owner's live credentials. One name for one thing
|
|
90
|
+
* owner's live credentials. One name for one thing, `resolveGoodVibesHomeOwnership`
|
|
91
91
|
* is the single reader that produces it.
|
|
92
92
|
*/
|
|
93
93
|
readonly daemonHomeDirectory?: string | undefined;
|
|
94
94
|
/** Host power seam opt-in. Fork mirrors the SDK: non-spawning unavailable-seam
|
|
95
95
|
* default (idle-power-services.ts); this product always passes createHostPowerSeam(), since it never has a co-located daemon to own its own inhibitor. */
|
|
96
96
|
readonly powerSeam?: Parameters<typeof wireIdlePowerAndLiveTurn>[0]['powerSeam'];
|
|
97
|
-
/** Live session id, read per crash-residue sweep so the running session is exempt
|
|
97
|
+
/** Live session id, read per crash-residue sweep so the running session is exempt, see durability-services.ts. */
|
|
98
98
|
readonly currentSessionId?: (() => string | null) | undefined;
|
|
99
99
|
/**
|
|
100
100
|
* Wake-word boot provisioning opt-in. Same shape as `powerSeam`: the real
|
|
@@ -108,9 +108,9 @@ export interface RuntimeServicesOptions {
|
|
|
108
108
|
export interface RuntimeServices {
|
|
109
109
|
readonly workingDirectory: string;
|
|
110
110
|
readonly homeDirectory: string;
|
|
111
|
-
/** The surface segment this runtime's stores live under (platform runtime 2.0.8 requires it
|
|
111
|
+
/** The surface segment this runtime's stores live under (platform runtime 2.0.8 requires it, a blank segment resolved to the unscoped control-plane orphan). */
|
|
112
112
|
readonly surfaceRoot: string;
|
|
113
|
-
/** The declare-once session-storage handle every session reader and writer threads through
|
|
113
|
+
/** The declare-once session-storage handle every session reader and writer threads through, see session-storage-services.ts. */
|
|
114
114
|
readonly surface: SessionSurface;
|
|
115
115
|
readonly shellPaths: ShellPathService;
|
|
116
116
|
readonly configManager: ConfigManager;
|
|
@@ -123,11 +123,11 @@ export interface RuntimeServices {
|
|
|
123
123
|
readonly routeBindings: RouteBindingManager;
|
|
124
124
|
readonly surfaceRegistry: SurfaceRegistry;
|
|
125
125
|
readonly channelPlugins: ChannelPluginRegistry;
|
|
126
|
-
/** The one router this surface delivers through
|
|
126
|
+
/** The one router this surface delivers through, AutomationDeliveryManager's own, not a second copy of it. */
|
|
127
127
|
readonly channelDeliveryRouter: ChannelDeliveryRouter;
|
|
128
128
|
readonly watcherRegistry: WatcherRegistry;
|
|
129
129
|
/**
|
|
130
|
-
* This surface's own record of the asks IT raised
|
|
130
|
+
* This surface's own record of the asks IT raised, what the approval card
|
|
131
131
|
* and the panel render. Not authoritative: `requestApproval` below raises the
|
|
132
132
|
* same ask on the daemon, whose record every other surface reads.
|
|
133
133
|
*/
|
|
@@ -152,7 +152,7 @@ export interface RuntimeServices {
|
|
|
152
152
|
readonly clientBuildGuard: ClientBuildGuard;
|
|
153
153
|
/**
|
|
154
154
|
* This surface offering its live conversation to the daemon, so a rewind
|
|
155
|
-
* driven from anywhere can reach the messages
|
|
155
|
+
* driven from anywhere can reach the messages, which only this process
|
|
156
156
|
* holds. Started on adoption; released on disposal.
|
|
157
157
|
*/
|
|
158
158
|
readonly conversationRewindHost: ConversationRewindHostClient;
|
|
@@ -160,7 +160,7 @@ export interface RuntimeServices {
|
|
|
160
160
|
readonly daemonConfig: DaemonConfigClient;
|
|
161
161
|
/** Daemon-scoped credential writes: `credentials.set`/`delete` on the daemon, one verified sequence. */
|
|
162
162
|
readonly daemonCredentials: DaemonCredentialsClient;
|
|
163
|
-
/** The terminal prompt, late-bound
|
|
163
|
+
/** The terminal prompt, late-bound, the UI layer patches the real one in after boot. */
|
|
164
164
|
readonly localPromptRef: { requestPermission: (request: PermissionPromptRequest) => Promise<PermissionPromptDecision> };
|
|
165
165
|
/** The live session id an ask belongs to; written by the bootstrap tail. */
|
|
166
166
|
readonly liveSessionIdRef: { value: string | null };
|
|
@@ -173,18 +173,18 @@ export interface RuntimeServices {
|
|
|
173
173
|
/** Durable user-origin permission rules (remembered approvals); permissions.rules.* surface. Mirrors the SDK composition. */
|
|
174
174
|
readonly userPermissionRuleStore: UserPermissionRuleStore;
|
|
175
175
|
/**
|
|
176
|
-
* An EMPTY verb catalog. This product answers no verbs
|
|
176
|
+
* An EMPTY verb catalog. This product answers no verbs, it is a client. The
|
|
177
177
|
* field exists because the SDK's `startExternalServices` takes a daemon-grade
|
|
178
178
|
* `RuntimeServices` even in the adopt-only mode this surface runs in, and
|
|
179
179
|
* because plugin loading is handed one. Nothing is ever served off it: with
|
|
180
180
|
* `adoptOnly` no `DaemonServer` is constructed, so a descriptor registered
|
|
181
181
|
* here has no listener behind it. Plugin registrations that need to be
|
|
182
|
-
* ANSWERED belong daemon-side
|
|
182
|
+
* ANSWERED belong daemon-side, see docs/decisions for the plugin split.
|
|
183
183
|
*/
|
|
184
184
|
readonly gatewayMethods: GatewayMethodCatalog;
|
|
185
185
|
/** Step-up (re-auth) for this surface's own privileged actions. */
|
|
186
186
|
readonly stepUpService: StepUpService;
|
|
187
|
-
/** This installation's pairing tokens
|
|
187
|
+
/** This installation's pairing tokens, the bearer a phone or browser presents. */
|
|
188
188
|
readonly pairingTokens: PairingTokenManager;
|
|
189
189
|
/** Paired-phone posture over `devices.*` verbs; the `phone` tool calls through it. */
|
|
190
190
|
readonly devices: DevicesClient;
|
|
@@ -229,7 +229,7 @@ export interface RuntimeServices {
|
|
|
229
229
|
readonly worktreeRegistry: WorktreeRegistry;
|
|
230
230
|
readonly sandboxSessionRegistry: SandboxSessionRegistry;
|
|
231
231
|
readonly webhookNotifier: WebhookNotifier;
|
|
232
|
-
/** Terminal focus tracker
|
|
232
|
+
/** Terminal focus tracker, fed by input/handler-feed.ts, read by the alert notifiers in core/. */
|
|
233
233
|
readonly focusTracker: FocusTracker;
|
|
234
234
|
readonly replayEngine: DeterministicReplayEngine;
|
|
235
235
|
readonly providerOptimizer: ProviderOptimizer;
|
|
@@ -258,13 +258,13 @@ export interface RuntimeServices {
|
|
|
258
258
|
readonly contextAccountingHolder: ContextAccountingHolder; // bound at bootstrap.ts; see context-accounting-source.ts
|
|
259
259
|
readonly wrfcController: WrfcController;
|
|
260
260
|
readonly processManager: ProcessManager;
|
|
261
|
-
/** The phase/work-item orchestration engine
|
|
261
|
+
/** The phase/work-item orchestration engine, see runtime/workstream-services.ts. */
|
|
262
262
|
readonly orchestrationEngine: OrchestrationEngine;
|
|
263
263
|
readonly workstreamCommands: WorkstreamCommandService;
|
|
264
|
-
/** The repo source-tree code index
|
|
264
|
+
/** The repo source-tree code index, see runtime/code-index-services.ts. */
|
|
265
265
|
readonly codeIndexStore: CodeIndexStore;
|
|
266
266
|
readonly codeIndexReindexScheduler: CodeIndexReindexScheduler; // tool-site reindex
|
|
267
|
-
/** Daily snapshots of every SQLite store this runtime writes, with bounded retention; unref'd timers (mirrors the SDK composition
|
|
267
|
+
/** Daily snapshots of every SQLite store this runtime writes, with bounded retention; unref'd timers (mirrors the SDK composition, hosts that tear down a runtime stop() it themselves). */
|
|
268
268
|
readonly storeSnapshotScheduler: StoreSnapshotScheduler;
|
|
269
269
|
readonly appendOnlyRetentionScheduler: ReturnType<typeof createDurabilityServices>['appendOnlyRetentionScheduler']; // periodic append-only sweep; unref'd timers, stop() on teardown
|
|
270
270
|
/** Stops the recurring crash-residue sweep; idempotent, unref'd timer (hosts that tear a runtime down call it). */
|
|
@@ -280,18 +280,18 @@ export interface RuntimeServices {
|
|
|
280
280
|
/** Controller the governor uses to pause/resume the deferrable background jobs under pressure. */
|
|
281
281
|
readonly pauseController: PauseController;
|
|
282
282
|
readonly sessionLiveTurnControls: SessionLiveTurnControlsHolder;
|
|
283
|
-
/** Unified live process registry (agents, WRFC chains, workflows, watchers, background processes) backing the Fleet panel; archive-aware
|
|
283
|
+
/** Unified live process registry (agents, WRFC chains, workflows, watchers, background processes) backing the Fleet panel; archive-aware, finished subtrees can be moved to the session archive view. */
|
|
284
284
|
readonly processRegistry: ArchivableProcessRegistry;
|
|
285
285
|
/**
|
|
286
286
|
* What the Fleet panel reads: this surface's own registry rows UNION the
|
|
287
287
|
* adopted daemon's, deduped by node id with the local (live, actionable) copy
|
|
288
|
-
* winning. Interval-refreshed on the daemon half
|
|
288
|
+
* winning. Interval-refreshed on the daemon half, see client/fleet-union.ts.
|
|
289
289
|
*/
|
|
290
290
|
readonly fleetReadModel: FleetUnionReadModel;
|
|
291
291
|
readonly modeManager: ModeManager;
|
|
292
292
|
readonly fileUndoManager: FileUndoManager;
|
|
293
293
|
readonly workspaceCheckpointManager: WorkspaceCheckpointManager;
|
|
294
|
-
/** Per-workspace trust gate
|
|
294
|
+
/** Per-workspace trust gate, restricts write/execute/delegate tools until the workspace is trusted. */
|
|
295
295
|
readonly workspaceTrustManager: WorkspaceTrustManager;
|
|
296
296
|
readonly integrationHelpers: IntegrationHelperService;
|
|
297
297
|
/** Re-root path-bound stores (MemoryStore, ProjectIndex) to a new working directory, called by WorkspaceSwapManager after verification; stores needing a process restart just warn-log and keep serving the old path until the daemon restarts with the new --working-dir. */
|
package/src/runtime/services.ts
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* services.ts
|
|
2
|
+
* services.ts, the terminal app's composition root, as a CLIENT.
|
|
3
3
|
*
|
|
4
|
-
* Every gateway-serving piece
|
|
4
|
+
* Every gateway-serving piece, the `GatewayMethodCatalog`, the
|
|
5
5
|
* inbox/triage/drafts/routing handlers, the cluster group and its election,
|
|
6
|
-
* the device-posture runtime and its housekeeping, the mail service deps
|
|
6
|
+
* the device-posture runtime and its housekeeping, the mail service deps,
|
|
7
7
|
* lives in the daemon product. This composition serves no verbs, elects
|
|
8
8
|
* nothing, polls no mailbox, and supervises no remote runner. It builds what
|
|
9
9
|
* a TURN needs in this process and reaches the daemon for the rest.
|
|
10
10
|
*
|
|
11
11
|
* ── The floor comes from the SDK ───────────────────────────────────────────
|
|
12
12
|
*
|
|
13
|
-
* The loop essentials
|
|
13
|
+
* The loop essentials, the agent graph, the model stack, config/secrets/
|
|
14
14
|
* services, hooks, plugins, MCP, the file-tool caches, permissions as a client,
|
|
15
|
-
* the spine clients
|
|
15
|
+
* the spine clients, are composed by `createClientRuntimeServices`, the SDK's
|
|
16
16
|
* one implementation of that shape. Not a fork of it and not a copy of it: the
|
|
17
17
|
* agent product composes the same function, so a wiring step added there
|
|
18
18
|
* cannot silently miss this product.
|
|
19
19
|
*
|
|
20
20
|
* The SDK's own note on that shape applies here literally: it is a FLOOR, not a
|
|
21
21
|
* ceiling. Everything below the `createClientRuntimeServices` call is what THIS
|
|
22
|
-
* surface adds on top
|
|
22
|
+
* surface adds on top, panels, keybindings, the WRFC controller wired over the
|
|
23
23
|
* client's own `agentManager`, the workstream engine, the fleet read model, the
|
|
24
24
|
* voice stack with its local playback sink, the knowledge stack the recall
|
|
25
25
|
* surfaces read. None of those need daemon furniture; they are simply not
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
* ── The two things that look like daemon furniture and are not ─────────────
|
|
30
30
|
*
|
|
31
31
|
* `sessionBroker` and `approvalBroker` are still constructed. They are this
|
|
32
|
-
* surface's own record of the sessions it is running and the asks it raised
|
|
32
|
+
* surface's own record of the sessions it is running and the asks it raised,
|
|
33
33
|
* what the transcript, the session panel and the approval card read. They are
|
|
34
34
|
* NOT authoritative: session identity is mirrored to the daemon's spine
|
|
35
35
|
* (register/heartbeat/inputs) and an ask is raised on the daemon
|
|
@@ -110,7 +110,7 @@ export type { RuntimeServicesOptions, RuntimeServices } from './runtime-services
|
|
|
110
110
|
export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeServices {
|
|
111
111
|
const disposalScope = createDisposalScope('RuntimeServices'); const workingDirectory = options.workingDir; // disposal seam: see ./disposal-wiring.ts
|
|
112
112
|
const homeDirectory = options.homeDirectory;
|
|
113
|
-
// Built before anything that touches session state
|
|
113
|
+
// Built before anything that touches session state, see session-storage-services.ts.
|
|
114
114
|
const { surface, sessionManager } = createSessionStorageServices({ workingDirectory, homeDirectory, surfaceRoot: GOODVIBES_TUI_SURFACE_ROOT });
|
|
115
115
|
const configManager = options.configManager;
|
|
116
116
|
const featureFlags = options.featureFlags ?? createFeatureFlagManager();
|
|
@@ -135,7 +135,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
135
135
|
// pure (it derives paths, it opens nothing), so building it twice costs
|
|
136
136
|
// nothing and keeps the ordering honest.
|
|
137
137
|
const shellPaths = createShellPathService({ workingDirectory, homeDirectory });
|
|
138
|
-
// The surface's own record of the asks it raised
|
|
138
|
+
// The surface's own record of the asks it raised, what the approval card and
|
|
139
139
|
// the panel read. The AUTHORITATIVE record is the daemon's; the raiser below
|
|
140
140
|
// keeps the two in step (see the SDK's client/approval-raiser.ts).
|
|
141
141
|
const approvalBroker = new ApprovalBroker({
|
|
@@ -166,7 +166,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
166
166
|
// The push channel for a decision made on another surface. Without it the
|
|
167
167
|
// raiser learns by re-reading the record on an interval; with it a phone's
|
|
168
168
|
// answer reaches this terminal in the time one SSE frame takes. The interval
|
|
169
|
-
// stays as the fallback
|
|
169
|
+
// stays as the fallback, see client/approval-updates.ts.
|
|
170
170
|
subscribeApprovalUpdates: createTerminalApprovalUpdateSubscriber({ configManager, homeDirectory }),
|
|
171
171
|
});
|
|
172
172
|
|
|
@@ -235,7 +235,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
235
235
|
// handed one. With adoptOnly no DaemonServer is constructed, so nothing is
|
|
236
236
|
// ever served off it.
|
|
237
237
|
const gatewayMethods = new GatewayMethodCatalog();
|
|
238
|
-
// The credential/identity seam (credential-composition.ts)
|
|
238
|
+
// The credential/identity seam (credential-composition.ts), this
|
|
239
239
|
// installation's own pairing tokens and step-up service.
|
|
240
240
|
const { stepUpService, pairingTokens } = composeCredentialServices({
|
|
241
241
|
workingDirectory, homeDirectory, configManager,
|
|
@@ -258,7 +258,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
258
258
|
runtimeStore: options.runtimeStore,
|
|
259
259
|
runtimeBus: options.runtimeBus,
|
|
260
260
|
});
|
|
261
|
-
// WRFC over the client's own agent graph
|
|
261
|
+
// WRFC over the client's own agent graph, the "floor, not ceiling" case,
|
|
262
262
|
// verbatim: the review/fix workstream controller needs the agent manager and
|
|
263
263
|
// the message bus, and nothing daemon-side at all.
|
|
264
264
|
const wrfcController = new WrfcController(options.runtimeBus, agentMessageBus, {
|
|
@@ -278,8 +278,8 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
278
278
|
// the same runner whether it came from the local broker or from the daemon's
|
|
279
279
|
// queue. The wire half is inert until bootstrap.ts adopts a daemon (see
|
|
280
280
|
// the SDK's client/session-dispatch.ts); binding one runner to both is what stops a
|
|
281
|
-
// continuation delivered over the wire from taking a different path
|
|
282
|
-
// different set of routing options
|
|
281
|
+
// continuation delivered over the wire from taking a different path, and a
|
|
282
|
+
// different set of routing options, than one raised locally.
|
|
283
283
|
const wireSessionDispatch = createWireSessionDispatch({
|
|
284
284
|
hostedSessionIds: () => (liveSessionIdRef.value ? [liveSessionIdRef.value] : []),
|
|
285
285
|
// The reply half. A continuation dispatched here runs in THIS process, so
|
|
@@ -382,7 +382,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
382
382
|
return record.id;
|
|
383
383
|
},
|
|
384
384
|
});
|
|
385
|
-
// Knowledge/wiki + home-graph stack (governor backpressure wired in)
|
|
385
|
+
// Knowledge/wiki + home-graph stack (governor backpressure wired in), see knowledge-services.ts.
|
|
386
386
|
const {
|
|
387
387
|
knowledgeStore, agentKnowledgeStore, homeGraphKnowledgeStore,
|
|
388
388
|
knowledgeSemanticService, homeGraphSemanticService, agentKnowledgeSemanticService,
|
|
@@ -390,7 +390,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
390
390
|
projectPlanningService, projectPlanningProjectId, workPlanStore,
|
|
391
391
|
} = createKnowledgeServices({ configManager, providerRegistry, artifactStore, memoryRegistry, runtimeBus: options.runtimeBus, workingDirectory, homeDirectory, isBackgroundPaused: isKnowledgeBackgroundPaused, admitExpensiveWork });
|
|
392
392
|
// Voice: the PROVIDERS are local (a spoken turn plays out of this terminal's
|
|
393
|
-
// own speaker)
|
|
393
|
+
// own speaker), synthesis reaches `voice.tts.stream` when a daemon serves it
|
|
394
394
|
// and falls back to a local provider otherwise; see audio/spoken-turn-wiring.ts.
|
|
395
395
|
const voiceProviders = new VoiceProviderRegistry();
|
|
396
396
|
ensureBuiltinVoiceProviders(voiceProviders, { readConfig: (key) => configManager.get(key as Parameters<typeof configManager.get>[0]) });
|
|
@@ -435,7 +435,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
435
435
|
const idempotencyStore = new IdempotencyStore();
|
|
436
436
|
// ONE router, not two. This surface used to build a second ChannelDeliveryRouter
|
|
437
437
|
// from the same four arguments AutomationDeliveryManager builds its own from,
|
|
438
|
-
// and expose that second one
|
|
438
|
+
// and expose that second one, so the router on the service surface and the
|
|
439
439
|
// router replies actually leave through were different objects, and a delivery
|
|
440
440
|
// strategy registered on the exposed one reached nothing. The SDK's
|
|
441
441
|
// RuntimeServices contract requires the field; it now names the real router.
|
|
@@ -467,7 +467,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
467
467
|
// adopted daemon's rows. The daemon runs work no registry here knows about
|
|
468
468
|
// (scheduled jobs, channel-driven runs, sessions other surfaces started, the
|
|
469
469
|
// external agents it observes), and a panel showing only half the fleet is
|
|
470
|
-
// worse than one showing none
|
|
470
|
+
// worse than one showing none, the half it shows looks complete.
|
|
471
471
|
const fleetReadModel = createFleetUnionReadModel({
|
|
472
472
|
local: createFleetReadModel(processRegistry, options.runtimeBus),
|
|
473
473
|
verbs,
|
|
@@ -500,7 +500,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
500
500
|
});
|
|
501
501
|
admitExpensiveWorkRef.current = (label) => memoryGovernor.admitExpensiveWork(label);
|
|
502
502
|
|
|
503
|
-
// Managed local-voice provisioning (voice.local.status/install)
|
|
503
|
+
// Managed local-voice provisioning (voice.local.status/install), single-flight
|
|
504
504
|
// one-act install + no-network status; see voice-setup-services.ts.
|
|
505
505
|
const { voiceSetup, stopWakeHousekeeping } = wireVoiceSetup({ configManager, shellPaths, voiceProviders, admitExpensiveWork,
|
|
506
506
|
provisionWakeModelsAtBoot: options.provisionWakeModelsAtBoot === true });
|
|
@@ -517,7 +517,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
517
517
|
// "allow for this project" persists and later fetches never ask.
|
|
518
518
|
const localhostFetchApproval = buildLocalhostFetchApproval({ requestApproval: (input) => requestApproval(input), configManager });
|
|
519
519
|
// Exec stuck on a terminal prompt rides the same raiser; the typed answer feeds
|
|
520
|
-
// the continuing run. Built once and shared with every setDependencies site
|
|
520
|
+
// the continuing run. Built once and shared with every setDependencies site,
|
|
521
521
|
// a wholesale replace that forgets it hangs interactive prompts.
|
|
522
522
|
const execPromptAnswerHandler = buildExecPromptAnswerHandler({ requestApproval: (input) => requestApproval(input) });
|
|
523
523
|
agentOrchestrator.setDependencies({
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* session-continuity-hints
|
|
2
|
+
* session-continuity-hints, the recovery snapshot's continuity summary.
|
|
3
3
|
*
|
|
4
4
|
* Extracted from main.ts (which sits at the architecture line cap) so the
|
|
5
5
|
* startup wiring there stays within budget. Builds the small counts/paths
|