@pellux/goodvibes-tui 2.0.13 → 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 +61 -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
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* hosted-session-feed.ts
|
|
2
|
+
* hosted-session-feed.ts, what this terminal knows about the daemon-hosted
|
|
3
3
|
* session it is attached to.
|
|
4
4
|
*
|
|
5
5
|
* One place holds it because two surfaces read it: the `/hosted` command family
|
|
6
6
|
* (which prints status and drives the verbs) and the Hosted Session panel
|
|
7
7
|
* (which renders the conversation). The same shared-feed shape
|
|
8
|
-
* notifications-feed.ts already uses in this repo
|
|
9
|
-
* command writes and a panel subscribes to
|
|
8
|
+
* notifications-feed.ts already uses in this repo, a module-level instance a
|
|
9
|
+
* command writes and a panel subscribes to, rather than threading a service
|
|
10
10
|
* through the command context and the panel deps for one feature.
|
|
11
11
|
*
|
|
12
12
|
* ── What is a fact here, and what is a rendering ──────────────────────────
|
|
13
13
|
*
|
|
14
14
|
* The RECORD is the daemon's, verbatim: status, attached clients, turn count,
|
|
15
|
-
* and `effectiveDetachPolicy
|
|
15
|
+
* and `effectiveDetachPolicy`, what leaving would do right now. This feed
|
|
16
16
|
* never recomputes those; it stores the last record a verb or a lifecycle event
|
|
17
17
|
* handed it.
|
|
18
18
|
*
|
|
19
19
|
* The ROWS are this terminal's rendering of the transcript: the history
|
|
20
20
|
* `attach` backfilled, plus what the live `turn` and `tools` frames have said
|
|
21
21
|
* since. A row that is still being streamed is marked `streaming` so the panel
|
|
22
|
-
* can show it growing rather than waiting for the turn to end
|
|
22
|
+
* can show it growing rather than waiting for the turn to end, the same thing
|
|
23
23
|
* a local turn does.
|
|
24
24
|
*
|
|
25
25
|
* ── Bounded, because it is a live buffer ──────────────────────────────────
|
|
@@ -142,7 +142,7 @@ export class HostedSessionFeed {
|
|
|
142
142
|
this.emit();
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
-
/** Replace the record
|
|
145
|
+
/** Replace the record, every verb answer and every lifecycle notice lands here. */
|
|
146
146
|
setRecord(record: HostedSessionRecord): void {
|
|
147
147
|
if (this.state.record && this.state.record.id !== record.id) return;
|
|
148
148
|
this.state = { ...this.state, record };
|
|
@@ -167,7 +167,7 @@ export class HostedSessionFeed {
|
|
|
167
167
|
close?.();
|
|
168
168
|
}
|
|
169
169
|
|
|
170
|
-
/** Append a note of this terminal's own
|
|
170
|
+
/** Append a note of this terminal's own, a detach, a refusal, a stream drop. */
|
|
171
171
|
note(text: string, kind: HostedRowKind = 'system'): void {
|
|
172
172
|
this.appendRow({ kind, text, at: Date.now(), streaming: false });
|
|
173
173
|
}
|
|
@@ -231,7 +231,7 @@ export class HostedSessionFeed {
|
|
|
231
231
|
const reason = readString(event.payload, 'reason');
|
|
232
232
|
this.appendRow({
|
|
233
233
|
kind: 'system',
|
|
234
|
-
text: reason ? `turn cancelled
|
|
234
|
+
text: reason ? `turn cancelled: ${reason}` : 'turn cancelled',
|
|
235
235
|
at: event.at,
|
|
236
236
|
streaming: false,
|
|
237
237
|
});
|
|
@@ -256,7 +256,7 @@ export class HostedSessionFeed {
|
|
|
256
256
|
{ callId, tool, startedAt: event.at },
|
|
257
257
|
],
|
|
258
258
|
};
|
|
259
|
-
this.appendRow({ kind: 'tool', text: `${tool}
|
|
259
|
+
this.appendRow({ kind: 'tool', text: `${tool}: running`, at: event.at, streaming: true, callId });
|
|
260
260
|
return;
|
|
261
261
|
}
|
|
262
262
|
case 'TOOL_SUCCEEDED':
|
|
@@ -265,14 +265,14 @@ export class HostedSessionFeed {
|
|
|
265
265
|
const outcome = event.type === 'TOOL_SUCCEEDED'
|
|
266
266
|
? 'done'
|
|
267
267
|
: event.type === 'TOOL_FAILED'
|
|
268
|
-
? `failed
|
|
269
|
-
: `cancelled${readString(event.payload, 'reason') ?
|
|
268
|
+
? `failed: ${readString(event.payload, 'error') || 'no reason reported'}`
|
|
269
|
+
: `cancelled${readString(event.payload, 'reason') ? `: ${readString(event.payload, 'reason')}` : ''}`;
|
|
270
270
|
this.state = {
|
|
271
271
|
...this.state,
|
|
272
272
|
runningToolCalls: this.state.runningToolCalls.filter((call) => call.callId !== callId),
|
|
273
273
|
rows: this.state.rows.map((row) => (
|
|
274
274
|
row.callId === callId && row.streaming
|
|
275
|
-
? { ...row, text: `${tool}
|
|
275
|
+
? { ...row, text: `${tool}: ${outcome}`, streaming: false }
|
|
276
276
|
: row
|
|
277
277
|
)),
|
|
278
278
|
};
|
|
@@ -290,7 +290,7 @@ export class HostedSessionFeed {
|
|
|
290
290
|
if (update.event === 'hosted-session-terminated') {
|
|
291
291
|
this.settleStreamingRow();
|
|
292
292
|
const reason = update.session.terminatedReason ?? 'no reason recorded';
|
|
293
|
-
this.note(`this hosted session ended
|
|
293
|
+
this.note(`this hosted session ended: ${reason}${update.detail ? ` (${update.detail})` : ''}`);
|
|
294
294
|
}
|
|
295
295
|
}
|
|
296
296
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* HostedSessionPanel
|
|
2
|
+
* HostedSessionPanel, the conversation the daemon is running, rendered here.
|
|
3
3
|
*
|
|
4
4
|
* A hosted session's turn arrives on the same `turn` and `tools` event domains
|
|
5
5
|
* a local turn does, so what this panel shows is the same thing the transcript
|
|
6
6
|
* shows for a local conversation: what was said, what tool is running, and
|
|
7
7
|
* whether text is still streaming. The difference is where the loop lives, and
|
|
8
|
-
* the header says so plainly
|
|
8
|
+
* the header says so plainly, including `effectiveDetachPolicy`, so a person
|
|
9
9
|
* about to quit knows whether that ends the work.
|
|
10
10
|
*
|
|
11
11
|
* The panel renders; it decides nothing. Every fact in the header is a field of
|
|
@@ -33,7 +33,7 @@ import {
|
|
|
33
33
|
|
|
34
34
|
const C = DEFAULT_PANEL_PALETTE;
|
|
35
35
|
|
|
36
|
-
const INTRO = 'A conversation whose loop runs inside the daemon. Steer it with /hosted say, leave it with /hosted detach
|
|
36
|
+
const INTRO = 'A conversation whose loop runs inside the daemon. Steer it with /hosted say, leave it with /hosted detach; the header says what leaving would do.';
|
|
37
37
|
|
|
38
38
|
function rowColor(kind: HostedSessionRow['kind']): string {
|
|
39
39
|
switch (kind) {
|
|
@@ -80,7 +80,7 @@ export function buildHostedHeaderLines(state: HostedSessionFeedState, width: num
|
|
|
80
80
|
: 'detaching ends it (kill)';
|
|
81
81
|
const policySource = record.detachPolicy === null ? 'from the setting' : 'per-session override';
|
|
82
82
|
const rows: { text: string; fg: string }[] = [
|
|
83
|
-
{ text: `${record.title.trim() || record.id}
|
|
83
|
+
{ text: `${record.title.trim() || record.id}: ${record.status}`, fg: C.header },
|
|
84
84
|
{ text: `id ${record.id}`, fg: C.dim },
|
|
85
85
|
{ text: `workspace ${record.workspaceRoot}`, fg: C.dim },
|
|
86
86
|
{
|
|
@@ -93,14 +93,14 @@ export function buildHostedHeaderLines(state: HostedSessionFeedState, width: num
|
|
|
93
93
|
},
|
|
94
94
|
];
|
|
95
95
|
if (record.status === 'terminated') {
|
|
96
|
-
rows.push({ text: `ended
|
|
96
|
+
rows.push({ text: `ended: ${record.terminatedReason ?? 'no reason recorded'}`, fg: C.bad });
|
|
97
97
|
}
|
|
98
98
|
if (record.restoredFromDisk) {
|
|
99
99
|
rows.push({ text: 'restored from disk after a daemon restart', fg: C.warn });
|
|
100
100
|
}
|
|
101
101
|
rows.push(state.streaming
|
|
102
102
|
? { text: 'live event stream open', fg: C.good }
|
|
103
|
-
: { text: `no live stream
|
|
103
|
+
: { text: `no live stream: ${state.streamNote ?? 'not subscribed'}`, fg: C.warn });
|
|
104
104
|
if (state.runningToolCalls.length > 0) {
|
|
105
105
|
rows.push({
|
|
106
106
|
text: `running: ${state.runningToolCalls.map((call) => `${call.tool} (${call.callId})`).join(', ')}`,
|
|
@@ -108,7 +108,7 @@ export function buildHostedHeaderLines(state: HostedSessionFeedState, width: num
|
|
|
108
108
|
});
|
|
109
109
|
}
|
|
110
110
|
if (state.droppedRows > 0) {
|
|
111
|
-
rows.push({ text: `${state.droppedRows} earlier row(s) dropped by this panel's buffer
|
|
111
|
+
rows.push({ text: `${state.droppedRows} earlier row(s) dropped by this panel's buffer; reattach to backfill`, fg: C.dim });
|
|
112
112
|
}
|
|
113
113
|
const lines: Line[] = [];
|
|
114
114
|
for (const row of rows) {
|
package/src/panels/index.ts
CHANGED
|
@@ -7,7 +7,7 @@ export { CostTrackerPanel } from './cost-tracker-panel.ts';
|
|
|
7
7
|
export { GitPanel } from './git-panel.ts';
|
|
8
8
|
export { registerBuiltinPanels } from './builtin-panels.ts';
|
|
9
9
|
export type { BuiltinPanelDeps } from './builtin-panels.ts';
|
|
10
|
-
// (the purge)
|
|
10
|
+
// (the purge), group B: plugins/skills panels are register-retired but
|
|
11
11
|
// their modules are retained for shared non-class exports (PluginManagerControls;
|
|
12
12
|
// discoverSkills + SkillRecord/SkillOrigin, consumed by command runtimes and the
|
|
13
13
|
// skills modal). The other group-A and group-B panel classes are deleted outright
|
|
@@ -20,7 +20,7 @@ import { isTextBackspace } from '../input/delete-key-policy.ts';
|
|
|
20
20
|
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
|
|
21
21
|
import { type ConfirmState, handleConfirmInput } from './confirm-state.ts';
|
|
22
22
|
|
|
23
|
-
// Base chrome only
|
|
23
|
+
// Base chrome only, state colors and text tokens come straight from
|
|
24
24
|
// DEFAULT_PANEL_PALETTE.
|
|
25
25
|
const C = DEFAULT_PANEL_PALETTE;
|
|
26
26
|
|
|
@@ -40,7 +40,7 @@ interface MaskedEntryState {
|
|
|
40
40
|
buffer: string;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
/** Mutation surface the panel needs for p/a/d/b
|
|
43
|
+
/** Mutation surface the panel needs for p/a/d/b, a subset of UserAuthManager. */
|
|
44
44
|
type LocalAuthMutations = Pick<UserAuthManager, 'addUser' | 'deleteUser' | 'rotatePassword' | 'clearBootstrapCredentialFile'>;
|
|
45
45
|
|
|
46
46
|
function hasLocalAuthMutations(value: LocalAuthInspectionQuery): value is LocalAuthInspectionQuery & LocalAuthMutations {
|
|
@@ -54,12 +54,12 @@ function hasLocalAuthMutations(value: LocalAuthInspectionQuery): value is LocalA
|
|
|
54
54
|
export class LocalAuthPanel extends ScrollableListPanel<LocalAuthUser> {
|
|
55
55
|
private readonly authManager: LocalAuthInspectionQuery;
|
|
56
56
|
private maskedState: MaskedEntryState | null = null;
|
|
57
|
-
/** Pending delete-user confirmation
|
|
57
|
+
/** Pending delete-user confirmation, project-standard ConfirmState contract. */
|
|
58
58
|
private deleteConfirm: ConfirmState<string> | null = null;
|
|
59
59
|
/** Draft username buffer for the 'a' add-user flow's first step (username,
|
|
60
|
-
* then openMaskedEntry for the password). Not masked
|
|
60
|
+
* then openMaskedEntry for the password). Not masked, usernames aren't secret. */
|
|
61
61
|
private usernameEntry: string | null = null;
|
|
62
|
-
/** Cached inspect() snapshot for the current render pass
|
|
62
|
+
/** Cached inspect() snapshot for the current render pass, see render(). */
|
|
63
63
|
private cachedSnapshot: LocalAuthSnapshot | null = null;
|
|
64
64
|
|
|
65
65
|
public constructor(authManager: LocalAuthInspectionQuery) {
|
|
@@ -99,7 +99,7 @@ export class LocalAuthPanel extends ScrollableListPanel<LocalAuthUser> {
|
|
|
99
99
|
/**
|
|
100
100
|
* Masked password/username entry wants every character of a burst (paste,
|
|
101
101
|
* or fast typing landing in one input.feed() call) delivered one at a
|
|
102
|
-
* time, same as it always has
|
|
102
|
+
* time, same as it always has, see the interface doc on
|
|
103
103
|
* `Panel.isCapturingTextBurst`.
|
|
104
104
|
*/
|
|
105
105
|
public override isCapturingTextBurst(): boolean {
|
|
@@ -107,7 +107,7 @@ export class LocalAuthPanel extends ScrollableListPanel<LocalAuthUser> {
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
public override handleInput(key: KeyName): boolean {
|
|
110
|
-
// Masked entry takes priority when active
|
|
110
|
+
// Masked entry takes priority when active, it must capture every
|
|
111
111
|
// keystroke (including letters that would otherwise be p/a/d/b actions)
|
|
112
112
|
// as part of the password being typed.
|
|
113
113
|
if (this.maskedState !== null) {
|
|
@@ -200,7 +200,7 @@ export class LocalAuthPanel extends ScrollableListPanel<LocalAuthUser> {
|
|
|
200
200
|
this.invalidate();
|
|
201
201
|
return true;
|
|
202
202
|
}
|
|
203
|
-
// 'absorbed' (or defensively, 'inactive'
|
|
203
|
+
// 'absorbed' (or defensively, 'inactive', deleteConfirm is non-null here so this never fires)
|
|
204
204
|
return true;
|
|
205
205
|
}
|
|
206
206
|
|
|
@@ -242,7 +242,7 @@ export class LocalAuthPanel extends ScrollableListPanel<LocalAuthUser> {
|
|
|
242
242
|
}
|
|
243
243
|
|
|
244
244
|
private handleMaskedEntryInput(key: KeyName): boolean {
|
|
245
|
-
// Masked entry is active
|
|
245
|
+
// Masked entry is active, capture all keystrokes.
|
|
246
246
|
const state = this.maskedState!;
|
|
247
247
|
|
|
248
248
|
if (key === 'escape') {
|
|
@@ -330,7 +330,7 @@ export class LocalAuthPanel extends ScrollableListPanel<LocalAuthUser> {
|
|
|
330
330
|
}
|
|
331
331
|
|
|
332
332
|
const intro = 'Manage local daemon and HTTP-listener auth users, bootstrap state, and active sessions.';
|
|
333
|
-
// Single inspect() call for this whole render pass
|
|
333
|
+
// Single inspect() call for this whole render pass, getItems() (called
|
|
334
334
|
// both directly below and again inside renderList()'s internal
|
|
335
335
|
// getVisibleItems()) reads from this cache instead of re-inspecting.
|
|
336
336
|
this.cachedSnapshot = this.authManager.inspect();
|
|
@@ -338,7 +338,7 @@ export class LocalAuthPanel extends ScrollableListPanel<LocalAuthUser> {
|
|
|
338
338
|
const users = this.getItems();
|
|
339
339
|
|
|
340
340
|
const issueMessages: string[] = [];
|
|
341
|
-
if (snapshot.bootstrapCredentialPresent) issueMessages.push('Bootstrap credential file still exists
|
|
341
|
+
if (snapshot.bootstrapCredentialPresent) issueMessages.push('Bootstrap credential file still exists; press b to clear it after password rotation.');
|
|
342
342
|
if (snapshot.sessionCount === 0) issueMessages.push('No active local auth sessions are currently tracked.');
|
|
343
343
|
|
|
344
344
|
const headerLines: Line[] = [
|
|
@@ -407,7 +407,7 @@ export class LocalAuthPanel extends ScrollableListPanel<LocalAuthUser> {
|
|
|
407
407
|
});
|
|
408
408
|
}
|
|
409
409
|
|
|
410
|
-
/** Footer keyboard hints, adapted to the current state
|
|
410
|
+
/** Footer keyboard hints, adapted to the current state, confirm-pending
|
|
411
411
|
* vs. normal browsing, and whether there's a bootstrap credential to clear. */
|
|
412
412
|
private buildHints(
|
|
413
413
|
selected: LocalAuthUser | null,
|
|
@@ -435,14 +435,14 @@ export class LocalAuthPanel extends ScrollableListPanel<LocalAuthUser> {
|
|
|
435
435
|
private renderUsernameEntryPrompt(width: number, height: number): Line[] {
|
|
436
436
|
const draft = this.usernameEntry ?? '';
|
|
437
437
|
const promptLines: Line[] = [
|
|
438
|
-
buildPanelLine(width, [[' Add local auth user
|
|
438
|
+
buildPanelLine(width, [[' Add local auth user: enter a username, then set a masked password.', C.value]]),
|
|
439
439
|
buildPanelLine(width, [['', C.label]]),
|
|
440
440
|
buildPanelLine(width, [[' Username ', C.label], [`${draft}█`, C.info]]),
|
|
441
441
|
buildPanelLine(width, [['', C.label]]),
|
|
442
442
|
buildPanelLine(width, [[' [Enter] Continue to password entry [Esc] Cancel [Backspace] Delete char', C.dim]]),
|
|
443
443
|
];
|
|
444
444
|
const workspace = buildPanelWorkspace(width, height, {
|
|
445
|
-
title: 'Local Auth
|
|
445
|
+
title: 'Local Auth: Add User',
|
|
446
446
|
intro: 'Type the new username and press Enter to continue to masked password entry.',
|
|
447
447
|
sections: [{ lines: promptLines }],
|
|
448
448
|
palette: C,
|
|
@@ -467,7 +467,7 @@ export class LocalAuthPanel extends ScrollableListPanel<LocalAuthUser> {
|
|
|
467
467
|
];
|
|
468
468
|
|
|
469
469
|
const workspace = buildPanelWorkspace(width, height, {
|
|
470
|
-
title: 'Local Auth
|
|
470
|
+
title: 'Local Auth: Password Entry',
|
|
471
471
|
intro: `Type a password for ${state.username}. The value is never echoed in plaintext or stored in history.`,
|
|
472
472
|
sections: [{ lines: promptLines }],
|
|
473
473
|
palette: C,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// memory-consolidation-gateway.ts
|
|
3
3
|
//
|
|
4
4
|
// The async, daemon-backed verb the Memory modal's Proposals tab reads:
|
|
5
|
-
// memory.consolidation.receipts (GET /api/memory/consolidation/receipts)
|
|
5
|
+
// memory.consolidation.receipts (GET /api/memory/consolidation/receipts), the
|
|
6
6
|
// retained memory-consolidation run receipts plus the flattened
|
|
7
7
|
// pendingProposals (contradiction / cross-scope-duplicate / stale-delete)
|
|
8
8
|
// awaiting human review. The records a proposal references are already
|
|
@@ -11,12 +11,12 @@
|
|
|
11
11
|
// how the Memory modal learns WHAT was proposed and WHY, so it can show that
|
|
12
12
|
// reason next to the affected records and offer a jump to them.
|
|
13
13
|
//
|
|
14
|
-
// No named facade exists on the in-process OperatorClient for this verb, so
|
|
15
|
-
// exactly like the Fleet gateway (fleet-gateway.ts)
|
|
14
|
+
// No named facade exists on the in-process OperatorClient for this verb, so,
|
|
15
|
+
// exactly like the Fleet gateway (fleet-gateway.ts), it goes over the
|
|
16
16
|
// generic operator invoke path (operator-rpc.ts's resolveOperatorRpc ->
|
|
17
17
|
// sdk.operator.invoke), reaching the SAME daemon the command layer does. A
|
|
18
18
|
// runtime without the consolidation scheduler answers an honest 501; an older
|
|
19
|
-
// daemon that has not wired this route yet answers 404
|
|
19
|
+
// daemon that has not wired this route yet answers 404, both are "verb
|
|
20
20
|
// unavailable", not "no proposals" (see classifyConsolidationFetchError).
|
|
21
21
|
//
|
|
22
22
|
// The interface is injectable so the modal's proposals fetch round-trips
|
|
@@ -30,7 +30,7 @@ import type { OperatorMethodOutput } from '@pellux/goodvibes-sdk';
|
|
|
30
30
|
import { GoodVibesSdkError } from '@pellux/goodvibes-sdk';
|
|
31
31
|
import { resolveOperatorRpc, describeOperatorRpcError } from '../input/commands/operator-rpc.ts';
|
|
32
32
|
|
|
33
|
-
/** memory.consolidation.receipts output
|
|
33
|
+
/** memory.consolidation.receipts output, retained receipts + the flattened pending proposals. */
|
|
34
34
|
export type MemoryConsolidationReceiptsResult = OperatorMethodOutput<'memory.consolidation.receipts'>;
|
|
35
35
|
/** One pending judgment proposal (contradiction / cross-scope-duplicate / stale-delete) awaiting human review. */
|
|
36
36
|
export type MemoryConsolidationProposal = MemoryConsolidationReceiptsResult['pendingProposals'][number];
|
|
@@ -44,7 +44,7 @@ export interface MemoryConsolidationGateway {
|
|
|
44
44
|
/**
|
|
45
45
|
* Why the gateway could not be built (daemon disabled / no control-plane URL),
|
|
46
46
|
* surfaced verbatim so the modal can print an honest "unavailable" line
|
|
47
|
-
* rather than guessing
|
|
47
|
+
* rather than guessing, mirrors FleetGatewayResolution.
|
|
48
48
|
*/
|
|
49
49
|
export type MemoryConsolidationGatewayResolution =
|
|
50
50
|
| { readonly available: true; readonly gateway: MemoryConsolidationGateway }
|
|
@@ -57,7 +57,7 @@ export interface MemoryConsolidationGatewayDeps {
|
|
|
57
57
|
|
|
58
58
|
/**
|
|
59
59
|
* Build the live consolidation-receipts gateway over the generic operator
|
|
60
|
-
* invoke path
|
|
60
|
+
* invoke path, the same daemon resolution the command layer and the Fleet
|
|
61
61
|
* gateway use. Returns an honest unavailable reason when no daemon is
|
|
62
62
|
* reachable, so the modal can refuse cleanly instead of throwing mid-render.
|
|
63
63
|
*/
|
|
@@ -79,7 +79,7 @@ export type MemoryConsolidationFetchFailure =
|
|
|
79
79
|
/**
|
|
80
80
|
* Classify a `fetchReceipts()` rejection: a 501 (the documented "no
|
|
81
81
|
* consolidation scheduler on this runtime" response) or a 404 (an older
|
|
82
|
-
* daemon that has not wired this route yet) are both "verb unavailable"
|
|
82
|
+
* daemon that has not wired this route yet) are both "verb unavailable",
|
|
83
83
|
* distinct from a generic request failure (network error, 401/403, 500),
|
|
84
84
|
* which renders as an honest fetch error instead. Reuses
|
|
85
85
|
* describeOperatorRpcError's wording so the two call sites (command layer,
|
|
@@ -10,7 +10,7 @@ import type { MintedPairingToken, PublicPairingToken } from '@pellux/goodvibes-s
|
|
|
10
10
|
import { formatDeviceLine, shortTokenId } from '@pellux/goodvibes-sdk/platform/pairing';
|
|
11
11
|
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
13
|
-
// Paired Devices
|
|
13
|
+
// Paired Devices, the settings security-domain device/token management surface.
|
|
14
14
|
// Lists every per-device pairing token (name · created · last-seen · id) and
|
|
15
15
|
// mirrors the pairing.tokens.* gateway verbs: revoke a device, migrate off the
|
|
16
16
|
// legacy shared token, revoke the shared token. Rename needs a name, which the
|
|
@@ -19,7 +19,7 @@ import { formatDeviceLine, shortTokenId } from '@pellux/goodvibes-sdk/platform/p
|
|
|
19
19
|
// fresh every render, so a revoke/migrate reflects immediately.
|
|
20
20
|
// ---------------------------------------------------------------------------
|
|
21
21
|
|
|
22
|
-
/** The token-store capability this surface needs
|
|
22
|
+
/** The token-store capability this surface needs, satisfied by PairingTokenManager. */
|
|
23
23
|
export interface DevicesModalPairingTokens {
|
|
24
24
|
list(): PublicPairingToken[];
|
|
25
25
|
rename(id: string, name: string): boolean;
|
|
@@ -62,10 +62,10 @@ class DevicesModalSurface implements ConfigModalSurface {
|
|
|
62
62
|
const now = this.deps.now?.() ?? Date.now();
|
|
63
63
|
const tokens = this.deps.pairingTokens.list();
|
|
64
64
|
const rows: ConfigModalRow[] = [];
|
|
65
|
-
rows.push(infoRow('intro', 'Devices paired to this daemon. Each has its own token
|
|
65
|
+
rows.push(infoRow('intro', 'Devices paired to this daemon. Each has its own token; revoke one without affecting the others.', { dim: true }));
|
|
66
66
|
|
|
67
67
|
if (tokens.length === 0) {
|
|
68
|
-
rows.push(infoRow('empty', 'No devices paired yet
|
|
68
|
+
rows.push(infoRow('empty', 'No devices paired yet: run /pair (or open the pairing QR) to add one.'));
|
|
69
69
|
} else {
|
|
70
70
|
for (const token of tokens) {
|
|
71
71
|
rows.push({ id: `${DEVICE_ROW_PREFIX}${token.id}`, label: formatDeviceLine(token, now) });
|
|
@@ -77,7 +77,7 @@ class DevicesModalSurface implements ConfigModalSurface {
|
|
|
77
77
|
'legacy',
|
|
78
78
|
legacyRevoked
|
|
79
79
|
? 'Legacy shared token: revoked.'
|
|
80
|
-
: 'Legacy shared token: active
|
|
80
|
+
: 'Legacy shared token: active; migrate a device off it (m), then revoke it (s).',
|
|
81
81
|
legacyRevoked ? { dim: true } : { fg: MODAL_TONES.reasoning },
|
|
82
82
|
));
|
|
83
83
|
|
|
@@ -93,7 +93,7 @@ class DevicesModalSurface implements ConfigModalSurface {
|
|
|
93
93
|
if (id === 'rename') {
|
|
94
94
|
const deviceId = deviceIdOf(ctx.row);
|
|
95
95
|
if (!deviceId) { ctx.setStatus('Select a device row first.'); return; }
|
|
96
|
-
// The stable-layout modal cannot capture a name inline
|
|
96
|
+
// The stable-layout modal cannot capture a name inline, route to the
|
|
97
97
|
// command with the id pre-filled so the user only types the new name.
|
|
98
98
|
ctx.print(`To rename this device, run: /devices rename ${shortTokenId(deviceId)} <new name>`);
|
|
99
99
|
return;
|
|
@@ -104,7 +104,7 @@ class DevicesModalSurface implements ConfigModalSurface {
|
|
|
104
104
|
if (!deviceId) { ctx.setStatus('Select a device row first.'); return; }
|
|
105
105
|
const record = tokens.list().find((t) => t.id === deviceId);
|
|
106
106
|
const revoked = tokens.revoke(deviceId);
|
|
107
|
-
ctx.setStatus(revoked ? `Revoked "${record?.name ?? shortTokenId(deviceId)}"
|
|
107
|
+
ctx.setStatus(revoked ? `Revoked "${record?.name ?? shortTokenId(deviceId)}": its token stops working now.` : 'That device was already absent.');
|
|
108
108
|
this.requestRender();
|
|
109
109
|
return;
|
|
110
110
|
}
|
|
@@ -124,7 +124,7 @@ class DevicesModalSurface implements ConfigModalSurface {
|
|
|
124
124
|
if (id === 'revokeShared') {
|
|
125
125
|
if (tokens.isLegacyRevoked()) { ctx.setStatus('The legacy shared token is already revoked.'); return; }
|
|
126
126
|
tokens.revokeLegacyShared();
|
|
127
|
-
ctx.setStatus('Revoked the legacy shared token
|
|
127
|
+
ctx.setStatus('Revoked the legacy shared token; devices on it must re-pair with their own token.');
|
|
128
128
|
this.requestRender();
|
|
129
129
|
return;
|
|
130
130
|
}
|
|
@@ -18,7 +18,7 @@ import type {
|
|
|
18
18
|
// ---------------------------------------------------------------------------
|
|
19
19
|
// Hooks → config-modal surface (group-B port). Two tabs: 'Hooks' (active
|
|
20
20
|
// registrations + contract posture) and 'Activity' (recent runtime activity +
|
|
21
|
-
// managed authoring + last simulation
|
|
21
|
+
// managed authoring + last simulation, the panel's expand-activity view, now a
|
|
22
22
|
// dedicated tab). All sources are in-memory (dispatcher/workbench/tracker hold
|
|
23
23
|
// live state), so buildView reads live and refresh() is a no-op. Toggle/remove/
|
|
24
24
|
// simulate route to their `/hooks` command path. Selection-blind port: the
|
|
@@ -12,8 +12,8 @@ import { KeybindingsManager } from '../../input/keybindings.ts';
|
|
|
12
12
|
// Docs + Shortcuts → 'keybindings' config-modal surface (group-B port).
|
|
13
13
|
// A MERGE of the retired DocsPanel (tools/models/shortcuts) and the
|
|
14
14
|
// shortcuts-overlay reference. Three tabs: 'Tools', 'Models', and 'Shortcuts'
|
|
15
|
-
// (the categorized keyboard reference
|
|
16
|
-
// user overrides show up
|
|
15
|
+
// (the categorized keyboard reference, driven live off keybindingsManager so
|
|
16
|
+
// user overrides show up, followed by an exhaustive 'All Bindings (live)'
|
|
17
17
|
// table). Enter opens the tool-inspector successor ('fleet') or switches the
|
|
18
18
|
// active model, both via the command path (fleet is a panel; /model is a
|
|
19
19
|
// settings mutation). Selection-blind port: the panel's selected tool/model
|
|
@@ -114,11 +114,11 @@ class KeybindingsModalSurface implements ConfigModalSurface {
|
|
|
114
114
|
if (ctx.tabId === 'tools') {
|
|
115
115
|
// item 4: pass the tool name through as a deep-link target.
|
|
116
116
|
// Honest caveat (documented, not a bug to silently paper over): fleet's
|
|
117
|
-
// ProcessKind set has no 'tool' node
|
|
117
|
+
// ProcessKind set has no 'tool' node, a docs Tools row names a static
|
|
118
118
|
// tool DEFINITION, not a live process, so FleetPanel.receiveDeepLink
|
|
119
119
|
// will not currently find a match and shows its honest "node no longer
|
|
120
120
|
// present" line. The plumbing is still worth wiring now (matches the
|
|
121
|
-
// work-plan agent/wrfc jumps' shape)
|
|
121
|
+
// work-plan agent/wrfc jumps' shape), it starts resolving for free the
|
|
122
122
|
// day fleet grows a per-tool-call node (the retired DocsPanel's own
|
|
123
123
|
// comment already anticipated this: "no filter-by-tool equivalent
|
|
124
124
|
// there yet").
|
|
@@ -145,7 +145,7 @@ export function createKeybindingsModalSurface(deps: KeybindingsModalDeps): Confi
|
|
|
145
145
|
/**
|
|
146
146
|
* Deterministic golden fixture. KeybindingsManager is pointed at a nonexistent
|
|
147
147
|
* config path so it always resolves to DEFAULT_KEYBINDINGS. Tool and model
|
|
148
|
-
* fixtures are frozen literals
|
|
148
|
+
* fixtures are frozen literals, no disk, no live registry.
|
|
149
149
|
*/
|
|
150
150
|
export function keybindingsModalGoldenSurface(): ConfigModalSurface {
|
|
151
151
|
const keybindingsManager = new KeybindingsManager({ configPath: '/nonexistent/golden-keybindings.json' });
|
|
@@ -11,7 +11,7 @@ import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
|
|
|
11
11
|
// ---------------------------------------------------------------------------
|
|
12
12
|
// Knowledge (graph) → config-modal surface (group-B port). Two tabs:
|
|
13
13
|
// 'Browse' (sources/nodes/issues + schedules) and 'Review' (the open-issue
|
|
14
|
-
// queue)
|
|
14
|
+
// queue), the panel's browse/review toggle, now host tabs. Issue review
|
|
15
15
|
// mutations (accept/reject/resolve/reopen) route to the `/knowledge
|
|
16
16
|
// review-issue` command. 'm' cross-opens the memory surface. Selection-blind
|
|
17
17
|
// port: the panel's selected-row id/detail is folded into each row label.
|
|
@@ -140,7 +140,7 @@ export function createKnowledgeModalSurface(deps: KnowledgeModalDeps): ConfigMod
|
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
/**
|
|
143
|
-
* Deterministic golden fixture: fixed node/source/issue/schedule records
|
|
143
|
+
* Deterministic golden fixture: fixed node/source/issue/schedule records,
|
|
144
144
|
* no live SDK calls, no random ids, no wall-clock reads.
|
|
145
145
|
*/
|
|
146
146
|
export function knowledgeModalGoldenSurface(): ConfigModalSurface {
|
|
@@ -4,7 +4,7 @@ import type { UserAuthManager } from '@pellux/goodvibes-sdk/platform/security';
|
|
|
4
4
|
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
|
|
5
5
|
import { postureLine, kv } from './modal-surface-helpers.ts';
|
|
6
6
|
|
|
7
|
-
/** Mutation surface the surface needs to gate p/d/b on
|
|
7
|
+
/** Mutation surface the surface needs to gate p/d/b on, a subset of UserAuthManager,
|
|
8
8
|
* mirroring LocalAuthPanel's own `hasLocalAuthMutations` guard. */
|
|
9
9
|
type LocalAuthMutations = Pick<UserAuthManager, 'addUser' | 'deleteUser' | 'rotatePassword' | 'clearBootstrapCredentialFile'>;
|
|
10
10
|
|
|
@@ -29,7 +29,7 @@ function usernameOf(row: ConfigModalRow | null): string | null {
|
|
|
29
29
|
* `inspect()` is synchronous, so buildView reads it live every tick. All
|
|
30
30
|
* mutations (add-user, rotate-password, delete-user, clear-bootstrap-file)
|
|
31
31
|
* dispatch through the existing `/local-auth` command rather than touching
|
|
32
|
-
* the auth manager directly
|
|
32
|
+
* the auth manager directly, the command opens masked password entry for
|
|
33
33
|
* add-user/rotate-password when no password argument is supplied, which is
|
|
34
34
|
* exactly how the retired panel kept plaintext out of history and the
|
|
35
35
|
* transcript. This surface never renders, accepts, or holds a password.
|
|
@@ -37,7 +37,7 @@ function usernameOf(row: ConfigModalRow | null): string | null {
|
|
|
37
37
|
class LocalAuthModalSurface implements ConfigModalSurface {
|
|
38
38
|
readonly name = 'local-auth-modal';
|
|
39
39
|
readonly title = 'Local Auth';
|
|
40
|
-
/** Cached from the last buildView()
|
|
40
|
+
/** Cached from the last buildView(), read by the 'b' action's enabledFor,
|
|
41
41
|
* set fresh every tick (buildView always runs before enabledFor is
|
|
42
42
|
* consulted; see settings-sync-modal's `hasStaged` for the same idiom). */
|
|
43
43
|
private bootstrapPresent = false;
|
|
@@ -97,7 +97,7 @@ class LocalAuthModalSurface implements ConfigModalSurface {
|
|
|
97
97
|
// which renders on the LocalAuthPanel and cannot draw or capture input
|
|
98
98
|
// underneath this fullscreen modal. Point the operator at the command
|
|
99
99
|
// (which opens masked entry) rather than dispatching it into a hidden
|
|
100
|
-
// surface
|
|
100
|
+
// surface, the secure flow stays a keystroke away, just not from here.
|
|
101
101
|
case 'add-user':
|
|
102
102
|
ctx.print('To add a user securely, run /local-auth add-user <username> (opens masked password entry).');
|
|
103
103
|
ctx.setStatus('Run /local-auth add-user <username> for masked entry.');
|
|
@@ -46,7 +46,7 @@ const KINDS: readonly EcosystemEntryKind[] = ['plugin', 'skill', 'hook-pack', 'p
|
|
|
46
46
|
* destructive confirm folded into a modal).
|
|
47
47
|
*
|
|
48
48
|
* Honest empty-state: the panel's original "No curated marketplace
|
|
49
|
-
* entries found yet." copy implied a curated remote catalog. It isn't one
|
|
49
|
+
* entries found yet." copy implied a curated remote catalog. It isn't one,
|
|
50
50
|
* loadEcosystemCatalog only ever reads .goodvibes/ecosystem/<kind>s.json under
|
|
51
51
|
* the project/home, populated solely by `/marketplace publish` and
|
|
52
52
|
* `/marketplace bundle import`. The empty-state copy below (locked byte-for-byte
|
|
@@ -126,7 +126,7 @@ class MarketplaceModalSurface implements ConfigModalSurface {
|
|
|
126
126
|
if (!this.deps.ecosystemPaths) {
|
|
127
127
|
rows.push(infoRow('empty:unwired', 'Marketplace catalog roots aren’t wired into this session, so there’s nothing to read yet.'));
|
|
128
128
|
} else {
|
|
129
|
-
rows.push(infoRow('empty:0', 'This is your local plugin, skill, hook-pack, and policy-pack catalog
|
|
129
|
+
rows.push(infoRow('empty:0', 'This is your local plugin, skill, hook-pack, and policy-pack catalog; not a remote store.'));
|
|
130
130
|
rows.push(infoRow('empty:1', 'It’s empty because nothing has been published or imported into this workspace yet. Entries appear here once you publish a local component or import a bundle.'));
|
|
131
131
|
}
|
|
132
132
|
rows.push(infoRow('empty:title', 'Populate it', { bold: true }));
|
|
@@ -152,7 +152,7 @@ class MarketplaceModalSurface implements ConfigModalSurface {
|
|
|
152
152
|
rows.push(infoRow(`issue:${i}`, `⚠ ${issue}`, { fg: MODAL_TONES.warn }));
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
-
// Catalog list
|
|
155
|
+
// Catalog list, selection-blind: fold provenance/compat/risk/state into the label.
|
|
156
156
|
for (const row of this.rows) {
|
|
157
157
|
const review = row.review;
|
|
158
158
|
const provenance = row.entry.provenance ?? 'local';
|