@pellux/goodvibes-tui 1.27.1 → 2.0.2
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/CHANGELOG.md +127 -2
- package/README.md +7 -9
- package/bin/goodvibes +2 -2
- package/bin/launcher-support.js +8 -4
- package/docs/README.md +11 -2
- package/docs/foundation-artifacts/operator-contract.json +6403 -2347
- package/package.json +14 -25
- package/scripts/postinstall.js +35 -35
- package/src/audio/spoken-turn-model-routing.ts +1 -1
- package/src/cli/bundle-command.ts +5 -5
- package/src/cli/completions/generate.ts +1 -1
- package/src/cli/doctor.ts +3 -3
- package/src/cli/entrypoint.ts +12 -7
- package/src/cli/help.ts +4 -5
- package/src/cli/hooks-command.ts +1 -1
- package/src/cli/index.ts +1 -4
- package/src/cli/launch-auto-update.ts +59 -7
- package/src/cli/management-commands.ts +6 -6
- package/src/cli/management-utils.ts +5 -5
- package/src/cli/management.ts +7 -7
- package/src/cli/network-posture.ts +1 -1
- package/src/cli/package-verification.ts +7 -6
- package/src/cli/plugin-bundles-command.ts +1 -1
- package/src/cli/plugin-command.ts +2 -2
- package/src/cli/service-command.ts +2 -2
- package/src/cli/service-posture.ts +4 -4
- package/src/cli/status.ts +9 -8
- package/src/cli/surface-command.ts +4 -4
- package/src/cli/tui-startup.ts +3 -3
- package/src/cli-flags.ts +3 -3
- package/src/config/goodvibes-home-audit.ts +0 -2
- package/src/config/secret-config.ts +37 -5
- package/src/config/tui-extension-settings.ts +1 -1
- package/src/core/approval-alert.ts +2 -2
- package/src/core/budget-breach-notifier.ts +3 -3
- package/src/core/conversation-compaction-render.ts +1 -1
- package/src/core/conversation-line-cache.ts +1 -1
- package/src/core/conversation-render-context.ts +1 -1
- package/src/core/conversation-rendering.ts +2 -2
- package/src/core/conversation.ts +10 -10
- package/src/core/long-task-notifier.ts +2 -2
- package/src/core/memory-diagnostics-gateway.ts +1 -1
- package/src/core/scriptable-statusline.ts +1 -1
- package/src/core/session-auto-titler.ts +1 -1
- package/src/core/session-resume-core.ts +2 -2
- package/src/core/stream-event-wiring.ts +24 -44
- package/src/core/terminal-notifier.ts +3 -3
- package/src/core/turn-cancellation.ts +1 -1
- package/src/core/turn-event-wiring.ts +5 -5
- package/src/input/command-registry.ts +6 -6
- package/src/input/commands/channel-pairing.ts +1 -1
- package/src/input/commands/cluster-runtime.ts +1 -1
- package/src/input/commands/codebase-runtime.ts +1 -1
- package/src/input/commands/devices-runtime.ts +1 -1
- package/src/input/commands/hosted-runtime.ts +330 -0
- package/src/input/commands/local-setup-review.ts +1 -1
- package/src/input/commands/local-setup-transfer.ts +2 -2
- package/src/input/commands/local-setup.ts +3 -3
- package/src/input/commands/managed-runtime.ts +2 -2
- package/src/input/commands/operator-rpc.ts +24 -110
- package/src/input/commands/payment-card-intake.ts +1 -1
- package/src/input/commands/permissions-provenance.ts +2 -2
- package/src/input/commands/plugin-runtime.ts +1 -1
- package/src/input/commands/provider.ts +1 -1
- package/src/input/commands/relay-runtime.ts +18 -9
- package/src/input/commands/rewind-runtime.ts +1 -1
- package/src/input/commands/runtime-services.ts +1 -1
- package/src/input/commands/services-runtime.ts +1 -1
- package/src/input/commands/session-workflow.ts +1 -1
- package/src/input/commands/settings-sync-runtime.ts +2 -2
- package/src/input/commands/share-runtime.ts +1 -1
- package/src/input/commands/tasks-runtime.ts +145 -55
- package/src/input/commands/update-runtime.ts +31 -28
- package/src/input/commands/work-plan-runtime.ts +2 -2
- package/src/input/commands/workstream-attempts.ts +1 -1
- package/src/input/commands/workstream-runtime.ts +2 -2
- package/src/input/commands.ts +2 -0
- package/src/input/feature-unit-layout.ts +1 -1
- package/src/input/feed-context-factory.ts +3 -3
- package/src/input/handler-content-actions.ts +2 -2
- package/src/input/handler-feed-routes.ts +1 -1
- package/src/input/handler-feed.ts +3 -3
- package/src/input/handler-modal-token-routes.ts +1 -1
- package/src/input/handler-onboarding-daemon-adopt.ts +3 -2
- package/src/input/handler-onboarding.ts +1 -1
- package/src/input/handler-types.ts +2 -2
- package/src/input/handler-ui-state.ts +1 -1
- package/src/input/handler.ts +4 -4
- package/src/input/input-history.ts +1 -1
- package/src/input/onboarding/onboarding-feature-units.ts +2 -2
- package/src/input/onboarding/onboarding-runtime-status.ts +15 -1
- package/src/input/onboarding/onboarding-wizard-apply.ts +17 -8
- package/src/input/onboarding/onboarding-wizard-cloudflare-step.ts +5 -3
- package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +1 -1
- package/src/input/onboarding/onboarding-wizard-types.ts +1 -1
- package/src/input/payments-config.ts +6 -6
- package/src/input/search.ts +1 -1
- package/src/input/session-picker-modal.ts +46 -0
- package/src/input/settings-modal-activation.ts +1 -1
- package/src/input/settings-modal-behavior.ts +4 -4
- package/src/input/settings-modal-commit.ts +11 -0
- package/src/input/settings-modal-data.ts +9 -122
- package/src/input/settings-modal-mutations.ts +33 -0
- package/src/input/settings-modal-secrets.ts +34 -0
- package/src/input/settings-modal-subscriptions.ts +1 -1
- package/src/input/settings-modal-types.ts +15 -1
- package/src/input/settings-modal.ts +28 -3
- package/src/input/worktree-setup-config.ts +1 -1
- package/src/main.ts +11 -9
- package/src/panels/agent-inspector-shared.ts +2 -2
- package/src/panels/base-panel.ts +2 -2
- package/src/panels/builtin/operations.ts +6 -8
- package/src/panels/builtin/session.ts +17 -0
- package/src/panels/builtin/shared.ts +5 -5
- package/src/panels/builtin-modals.ts +3 -3
- package/src/panels/confirm-state.ts +1 -1
- package/src/panels/cost-tracker-panel.ts +4 -4
- package/src/panels/diff-panel.ts +2 -2
- package/src/panels/diff-review-panel.ts +2 -2
- package/src/panels/expandable-list-panel.ts +2 -2
- package/src/panels/fleet-acts.ts +1 -1
- package/src/panels/fleet-observed-render.ts +1 -1
- package/src/panels/fleet-panel-format.ts +1 -1
- package/src/panels/fleet-panel.ts +1 -1
- package/src/panels/fleet-spawn.ts +1 -1
- package/src/panels/fleet-steer.ts +1 -1
- package/src/panels/fleet-transcript.ts +1 -1
- package/src/panels/git-panel.ts +1 -1
- package/src/panels/hosted-session-feed.ts +352 -0
- package/src/panels/hosted-session-panel.ts +221 -0
- package/src/panels/local-auth-panel.ts +3 -3
- package/src/panels/modals/devices-modal.ts +1 -1
- package/src/panels/modals/local-auth-modal.ts +1 -1
- package/src/panels/modals/pairing-modal.ts +1 -1
- package/src/panels/modals/services-modal.ts +1 -1
- package/src/panels/modals/settings-sync-modal.ts +1 -1
- package/src/panels/modals/subscription-modal.ts +1 -1
- package/src/panels/modals/work-plan-modal.ts +1 -1
- package/src/panels/notifications-panel.ts +1 -1
- package/src/panels/panel-confirm-overlay.ts +1 -1
- package/src/panels/plugins-panel.ts +2 -2
- package/src/panels/polish-core.ts +2 -2
- package/src/panels/polish-tables.ts +1 -1
- package/src/panels/polish.ts +2 -2
- package/src/panels/scrollable-list-panel.ts +3 -3
- package/src/panels/skills-panel.ts +3 -3
- package/src/panels/token-budget-panel.ts +5 -5
- package/src/panels/types.ts +1 -2
- package/src/permissions/prompt.ts +1 -1
- package/src/renderer/autocomplete-overlay.ts +1 -1
- package/src/renderer/block-actions-overlay.ts +1 -1
- package/src/renderer/bookmark-modal.ts +1 -1
- package/src/renderer/buffer.ts +1 -1
- package/src/renderer/code-block.ts +1 -1
- package/src/renderer/composer-fragments.ts +1 -1
- package/src/renderer/compositor.ts +2 -2
- package/src/renderer/config-modal.ts +1 -1
- package/src/renderer/context-inspector.ts +1 -1
- package/src/renderer/conversation-layout.ts +2 -2
- package/src/renderer/conversation-overlays.ts +1 -1
- package/src/renderer/conversation-surface.ts +2 -2
- package/src/renderer/diff-view.ts +1 -1
- package/src/renderer/diff.ts +1 -1
- package/src/renderer/file-picker-overlay.ts +1 -1
- package/src/renderer/fleet-tab-strip.ts +1 -1
- package/src/renderer/fullscreen-primitives.ts +2 -2
- package/src/renderer/fullscreen-workspace.ts +1 -1
- package/src/renderer/header-line.ts +1 -1
- package/src/renderer/help-overlay.ts +1 -1
- package/src/renderer/history-search-overlay.ts +2 -2
- package/src/renderer/layout.ts +5 -8
- package/src/renderer/markdown-inline.ts +1 -1
- package/src/renderer/markdown-table.ts +1 -1
- package/src/renderer/markdown.ts +1 -1
- package/src/renderer/mcp-workspace.ts +1 -1
- package/src/renderer/modal-factory.ts +2 -2
- package/src/renderer/model-workspace.ts +2 -2
- package/src/renderer/onboarding/onboarding-wizard.ts +1 -1
- package/src/renderer/overlay-box.ts +1 -1
- package/src/renderer/panel-composite.ts +1 -1
- package/src/renderer/panel-workspace-bar.ts +1 -1
- package/src/renderer/process-indicator.ts +1 -1
- package/src/renderer/profile-picker-modal.ts +1 -1
- package/src/renderer/search-overlay.ts +2 -2
- package/src/renderer/selection-modal-overlay.ts +1 -1
- package/src/renderer/session-picker-modal.ts +124 -3
- package/src/renderer/settings-modal-helpers.ts +2 -0
- package/src/renderer/settings-modal.ts +2 -2
- package/src/renderer/shell-surface.ts +2 -2
- package/src/renderer/system-message.ts +1 -1
- package/src/renderer/tab-strip.ts +1 -1
- package/src/renderer/theme-mode-config.ts +21 -33
- package/src/renderer/theme.ts +11 -12
- package/src/renderer/thinking.ts +1 -1
- package/src/renderer/tool-call.ts +2 -2
- package/src/renderer/tool-result-expanded-lines.ts +1 -1
- package/src/renderer/turn-injection.ts +7 -8
- package/src/renderer/ui-factory.ts +3 -3
- package/src/runtime/bootstrap-command-context.ts +4 -4
- package/src/runtime/bootstrap-command-parts.ts +5 -5
- package/src/runtime/bootstrap-core.ts +30 -30
- package/src/runtime/bootstrap-shell.ts +4 -4
- package/src/runtime/bootstrap.ts +128 -157
- package/src/runtime/client/approval-updates.ts +82 -0
- package/src/runtime/client/build-floors.ts +167 -0
- package/src/runtime/client/daemon-attach-handshake.ts +115 -0
- package/src/runtime/client/fleet-union.ts +147 -0
- package/src/runtime/client/host-service-status.ts +71 -0
- package/src/runtime/client/hosted-exit.ts +86 -0
- package/src/runtime/client/hosted-roster.ts +110 -0
- package/src/runtime/client/hosted-session-stream.ts +178 -0
- package/src/runtime/client/hosted-sessions.ts +187 -0
- package/src/runtime/client/operator-endpoint.ts +213 -0
- package/src/runtime/client/spine-adoption.ts +99 -0
- package/src/runtime/cloudflare-control-plane.ts +1 -1
- package/src/runtime/context-accounting-source.ts +1 -1
- package/src/runtime/context.ts +2 -2
- package/src/runtime/conversation-rewind-port.ts +42 -14
- package/src/runtime/daemon-attach-notices.ts +55 -19
- package/src/runtime/diagnostics/panels/ops.ts +1 -1
- package/src/runtime/disposal-wiring.ts +4 -24
- package/src/runtime/index.ts +119 -105
- package/src/runtime/install-self-check-startup.ts +2 -2
- package/src/runtime/interaction-seams.ts +1 -1
- package/src/runtime/knowledge-services.ts +8 -2
- package/src/runtime/legacy-daemon-migration.ts +4 -3
- package/src/runtime/legacy-daemon-reconcile.ts +3 -2
- package/src/runtime/memory-spine-transport.ts +37 -267
- package/src/runtime/notification-dispatch.ts +2 -2
- package/src/runtime/onboarding/apply.ts +2 -2
- package/src/runtime/onboarding/derivation.ts +2 -2
- package/src/runtime/onboarding/markers.ts +2 -2
- package/src/runtime/onboarding/progress.ts +2 -2
- package/src/runtime/onboarding/snapshot.ts +1 -1
- package/src/runtime/onboarding/state.ts +2 -2
- package/src/runtime/onboarding/types.ts +2 -2
- package/src/runtime/orchestrator-core-services.ts +1 -1
- package/src/runtime/path-shadow-startup.ts +28 -221
- package/src/runtime/power-keepawake-remote.ts +3 -2
- package/src/runtime/process-lifecycle.ts +2 -2
- package/src/runtime/provider-fallback.ts +10 -66
- package/src/runtime/recovery-autosave.ts +1 -1
- package/src/runtime/recovery-offer-wiring.ts +39 -23
- package/src/runtime/recovery-prompt.ts +31 -17
- package/src/runtime/relay-reachability-bridge.ts +53 -42
- package/src/runtime/release-artifacts.ts +2 -1
- package/src/runtime/runtime-services-types.ts +82 -35
- package/src/runtime/services.ts +305 -300
- package/src/runtime/session-resume-liveness-confirm.ts +1 -1
- package/src/runtime/ui-services.ts +7 -6
- package/src/runtime/update-check.ts +23 -43
- package/src/runtime/workspace-checkpointing.ts +1 -1
- package/src/runtime/wrfc-persistence.ts +2 -2
- package/src/shell/ui-openers.ts +30 -7
- package/src/utils/clipboard.ts +1 -1
- package/src/verification/verification-ledger.ts +10 -8
- package/src/version.ts +1 -1
- package/bin/goodvibes-daemon +0 -90
- package/src/cli/config-overrides.ts +0 -267
- package/src/cli/endpoints.ts +0 -109
- package/src/cli/parser.ts +0 -395
- package/src/cli/redaction.ts +0 -170
- package/src/cli/types.ts +0 -84
- package/src/cluster/commands.ts +0 -382
- package/src/cluster/remote-daemon-target.ts +0 -225
- package/src/cluster/render.ts +0 -268
- package/src/config/atomic-write.ts +0 -70
- package/src/config/credential-availability.ts +0 -122
- package/src/config/goodvibes-home.ts +0 -149
- package/src/config/index.ts +0 -88
- package/src/config/provider-model.ts +0 -23
- package/src/config/read-versioned.ts +0 -228
- package/src/core/alert-gating.ts +0 -67
- package/src/core/consolidation-receipt.ts +0 -41
- package/src/core/focus-tracker.ts +0 -41
- package/src/core/history.ts +0 -45
- package/src/core/memory-status.ts +0 -118
- package/src/core/orchestrator.ts +0 -7
- package/src/core/pairing-devices.ts +0 -49
- package/src/core/pairing-handoff.ts +0 -101
- package/src/core/pairing-offers.ts +0 -83
- package/src/core/pairing-origin.ts +0 -78
- package/src/core/rewind-turn-anchors.ts +0 -311
- package/src/core/session-recovery.ts +0 -210
- package/src/core/stable-host.ts +0 -171
- package/src/core/transcript-journal.ts +0 -503
- package/src/daemon/cli.ts +0 -693
- package/src/daemon/fatal-boot-report.ts +0 -111
- package/src/daemon/handlers/context.ts +0 -29
- package/src/daemon/handlers/contracts.ts +0 -77
- package/src/daemon/handlers/credentials.ts +0 -139
- package/src/daemon/handlers/drafts/draft-store.ts +0 -427
- package/src/daemon/handlers/drafts/index.ts +0 -17
- package/src/daemon/handlers/drafts/register.ts +0 -331
- package/src/daemon/handlers/errors.ts +0 -18
- package/src/daemon/handlers/inbox/cursor-store.ts +0 -457
- package/src/daemon/handlers/inbox/index.ts +0 -284
- package/src/daemon/handlers/inbox/mapping.ts +0 -192
- package/src/daemon/handlers/inbox/poller.ts +0 -212
- package/src/daemon/handlers/inbox/provider-adapter.ts +0 -156
- package/src/daemon/handlers/inbox/providers/discord.ts +0 -252
- package/src/daemon/handlers/inbox/providers/email.ts +0 -152
- package/src/daemon/handlers/inbox/providers/imap-client.ts +0 -300
- package/src/daemon/handlers/inbox/providers/route-util.ts +0 -24
- package/src/daemon/handlers/inbox/providers/slack.ts +0 -263
- package/src/daemon/handlers/index.ts +0 -117
- package/src/daemon/handlers/register.ts +0 -168
- package/src/daemon/handlers/remote/backends/cloud-terminal.ts +0 -142
- package/src/daemon/handlers/remote/backends/docker.ts +0 -79
- package/src/daemon/handlers/remote/backends/index.ts +0 -40
- package/src/daemon/handlers/remote/backends/local-process.ts +0 -113
- package/src/daemon/handlers/remote/backends/process-runner.ts +0 -127
- package/src/daemon/handlers/remote/backends/ssh.ts +0 -125
- package/src/daemon/handlers/remote/backends/types.ts +0 -97
- package/src/daemon/handlers/remote/dispatcher.ts +0 -181
- package/src/daemon/handlers/remote/index.ts +0 -119
- package/src/daemon/handlers/remote/peer-registry.ts +0 -357
- package/src/daemon/handlers/remote/service.ts +0 -191
- package/src/daemon/handlers/routing/inbox-bridge.ts +0 -71
- package/src/daemon/handlers/routing/index.ts +0 -261
- package/src/daemon/handlers/routing/route-store.ts +0 -319
- package/src/daemon/handlers/routing/routing-resolver.ts +0 -75
- package/src/daemon/handlers/sqlite-store.ts +0 -278
- package/src/daemon/handlers/triage/index.ts +0 -57
- package/src/daemon/handlers/triage/integration.ts +0 -213
- package/src/daemon/handlers/triage/pipeline.ts +0 -274
- package/src/daemon/handlers/triage/scorer.ts +0 -287
- package/src/daemon/handlers/triage/tagger/discord.ts +0 -187
- package/src/daemon/handlers/triage/tagger/imap.ts +0 -384
- package/src/daemon/handlers/triage/tagger/index.ts +0 -184
- package/src/daemon/handlers/triage/tagger/shared.ts +0 -70
- package/src/daemon/handlers/triage/tagger/slack.ts +0 -69
- package/src/daemon/handlers/triage/types.ts +0 -50
- package/src/daemon/lifecycle.ts +0 -41
- package/src/daemon/provision-wake-model.ts +0 -81
- package/src/daemon/safe-serve.ts +0 -61
- package/src/daemon/send/channels.ts +0 -200
- package/src/daemon/send/command.ts +0 -332
- package/src/daemon/send/composition.ts +0 -99
- package/src/daemon/send/failure-text.ts +0 -93
- package/src/daemon/send/inert-text.ts +0 -225
- package/src/daemon/send/stdin.ts +0 -24
- package/src/daemon/service-commands.ts +0 -329
- package/src/export/cost-utils.ts +0 -319
- package/src/input/selection.ts +0 -135
- package/src/plugins/loader.ts +0 -15
- package/src/renderer/bottom-bar.ts +0 -58
- package/src/renderer/conversation-tree.ts +0 -228
- package/src/runtime/agent-graph-composition.ts +0 -78
- package/src/runtime/channel-composition.ts +0 -46
- package/src/runtime/cluster-composition.ts +0 -124
- package/src/runtime/cluster-group-composition.ts +0 -284
- package/src/runtime/code-index-services.ts +0 -167
- package/src/runtime/daemon-handler-composition.ts +0 -76
- package/src/runtime/device-posture-composition.ts +0 -110
- package/src/runtime/durability-housekeeping.ts +0 -183
- package/src/runtime/durability-services.ts +0 -155
- package/src/runtime/embedded-service-factories.ts +0 -74
- package/src/runtime/feature-settings.ts +0 -154
- package/src/runtime/fleet-needs-input-push.ts +0 -70
- package/src/runtime/fleet-services.ts +0 -41
- package/src/runtime/idle-power-services.ts +0 -85
- package/src/runtime/mail-composition.ts +0 -65
- package/src/runtime/memory-fold.ts +0 -55
- package/src/runtime/operator-token-cleanup.ts +0 -109
- package/src/runtime/path-shadow.ts +0 -418
- package/src/runtime/perf/panel-health-monitor.ts +0 -18
- package/src/runtime/provider-optimizer-wiring.ts +0 -55
- package/src/runtime/reachability-notice.ts +0 -100
- package/src/runtime/remote-execution-composition.ts +0 -62
- package/src/runtime/session-liveness-marker.ts +0 -257
- package/src/runtime/session-pointer-surface.ts +0 -22
- package/src/runtime/session-storage-services.ts +0 -41
- package/src/runtime/surface-feature-flags.ts +0 -96
- package/src/runtime/terminal-output-guard.ts +0 -235
- package/src/runtime/trust/workspace-registration.ts +0 -192
- package/src/runtime/trust/workspace-trust.ts +0 -229
- package/src/runtime/ui/index.ts +0 -39
- package/src/runtime/ui/model-picker/data-provider.ts +0 -182
- package/src/runtime/ui/model-picker/health-enrichment.ts +0 -231
- package/src/runtime/ui/model-picker/index.ts +0 -59
- package/src/runtime/ui/model-picker/types.ts +0 -153
- package/src/runtime/ui/provider-health/data-provider.ts +0 -244
- package/src/runtime/ui/provider-health/fallback-visualizer.ts +0 -71
- package/src/runtime/ui/provider-health/index.ts +0 -46
- package/src/runtime/ui/provider-health/types.ts +0 -146
- package/src/runtime/ui-events.ts +0 -1
- package/src/runtime/ui-read-model-helpers.ts +0 -1
- package/src/runtime/ui-read-models-observability-maintenance.ts +0 -1
- package/src/runtime/ui-read-models-observability-options.ts +0 -1
- package/src/runtime/ui-read-models-observability-remote.ts +0 -1
- package/src/runtime/ui-read-models-observability-security.ts +0 -1
- package/src/runtime/ui-read-models-observability-system.ts +0 -1
- package/src/runtime/ui-read-models-observability.ts +0 -1
- package/src/runtime/ui-service-queries.ts +0 -1
- package/src/runtime/voice-setup-services.ts +0 -98
- package/src/runtime/workstream-attempts-validation.ts +0 -77
- package/src/runtime/workstream-draft-edits.ts +0 -95
- package/src/runtime/workstream-draft-store.ts +0 -274
- package/src/runtime/workstream-draft-types.ts +0 -42
- package/src/runtime/workstream-services.ts +0 -373
- package/src/tools/index.ts +0 -1
- package/src/types/grid.ts +0 -48
- package/src/types/sql-js.d.ts +0 -15
- package/src/work-plans/work-plan-store.ts +0 -702
|
@@ -39,6 +39,21 @@ export type SettingAppliedCallback = (change: {
|
|
|
39
39
|
// applySettingValue
|
|
40
40
|
// ---------------------------------------------------------------------------
|
|
41
41
|
|
|
42
|
+
/**
|
|
43
|
+
* Where a DAEMON-owned setting is written.
|
|
44
|
+
*
|
|
45
|
+
* `surfaces.*`, `controlPlane.*`, `watchers.*`, `device.*`, `automation.*` and
|
|
46
|
+
* the rest are executed by the daemon, unattended, with every surface closed.
|
|
47
|
+
* Writing one into this surface's own settings file reports success and
|
|
48
|
+
* configures nothing — the daemon reads a different file and never sees it.
|
|
49
|
+
* So a daemon-owned write goes over `config.set`, and a write with no reachable
|
|
50
|
+
* daemon FAILS rather than landing somewhere harmless-looking.
|
|
51
|
+
*/
|
|
52
|
+
export interface DaemonOwnedConfigWriter {
|
|
53
|
+
ownsKey(key: string): boolean;
|
|
54
|
+
set(key: string, value: unknown): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
|
|
42
57
|
export function applySettingValue({
|
|
43
58
|
key,
|
|
44
59
|
value,
|
|
@@ -46,6 +61,8 @@ export function applySettingValue({
|
|
|
46
61
|
groups,
|
|
47
62
|
onSettingApplied,
|
|
48
63
|
refreshGroups,
|
|
64
|
+
daemonConfig,
|
|
65
|
+
onAsyncError,
|
|
49
66
|
}: {
|
|
50
67
|
key: ConfigKey;
|
|
51
68
|
value: unknown;
|
|
@@ -54,6 +71,10 @@ export function applySettingValue({
|
|
|
54
71
|
onSettingApplied: SettingAppliedCallback | null;
|
|
55
72
|
/** Called after applying the value so the caller can re-read currentValues. */
|
|
56
73
|
refreshGroups: () => void;
|
|
74
|
+
/** Present when a daemon is configured; absent keeps every write local. */
|
|
75
|
+
daemonConfig?: DaemonOwnedConfigWriter | null | undefined;
|
|
76
|
+
/** Renders a refused daemon write, so a failed save is never silent. */
|
|
77
|
+
onAsyncError?: ((message: string) => void) | undefined;
|
|
57
78
|
}): ApplyValueResult {
|
|
58
79
|
// Defensive: a handful of TUI-local synthetic keys (see worktree-setup-config.ts)
|
|
59
80
|
// live under a config section CONFIG_SCHEMA/DEFAULT_CONFIG has never populated
|
|
@@ -73,7 +94,19 @@ export function applySettingValue({
|
|
|
73
94
|
// we detect restart-triggering keys by sub-key name heuristic below.
|
|
74
95
|
const isRestartKey = ['host', 'port', 'hostMode', 'enabled'].includes(key.split('.')[1] ?? '');
|
|
75
96
|
|
|
97
|
+
const daemonOwned = daemonConfig?.ownsKey(key) === true;
|
|
76
98
|
try {
|
|
99
|
+
if (daemonOwned && daemonConfig) {
|
|
100
|
+
// The daemon's store is the one that counts for this key. The local
|
|
101
|
+
// manager is still written so this session's own reads and the rows
|
|
102
|
+
// below reflect the edit immediately; the daemon's copy is what the
|
|
103
|
+
// daemon acts on, and a refusal from it is surfaced rather than
|
|
104
|
+
// swallowed — the local value would then be the lie.
|
|
105
|
+
void daemonConfig.set(key, value).catch((error) => {
|
|
106
|
+
logger.error('SettingsModal: the daemon refused a daemon-owned config write', { key, error: summarizeError(error) });
|
|
107
|
+
onAsyncError?.(`That setting is applied by the daemon and saving it there failed: ${summarizeError(error)}`);
|
|
108
|
+
});
|
|
109
|
+
}
|
|
77
110
|
configManager.setDynamic(key, value);
|
|
78
111
|
} catch (e) {
|
|
79
112
|
logger.error('SettingsModal: failed to set config value', { key, error: summarizeError(e) });
|
|
@@ -11,12 +11,31 @@ import {
|
|
|
11
11
|
|
|
12
12
|
export type SettingsSecretsManager = Pick<SecretsManager, 'delete' | 'set'>;
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
* The daemon's own credential write, when this app has a daemon to write to.
|
|
16
|
+
*
|
|
17
|
+
* A daemon-scoped credential is two writes that only work together — the secret
|
|
18
|
+
* value and the config reference that points at it — and `credentials.set` does
|
|
19
|
+
* both, verifying the value reads back before it touches the config. Splitting
|
|
20
|
+
* them across a process boundary leaves a window where the config names a
|
|
21
|
+
* reference resolving to nothing, which every reader treats as a
|
|
22
|
+
* configured-but-broken credential.
|
|
23
|
+
*/
|
|
24
|
+
export interface SettingsDaemonCredentialWriter {
|
|
25
|
+
set(configKey: string, value: string): Promise<unknown>;
|
|
26
|
+
clear(configKey: string): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
|
|
14
29
|
export function setSecretBackedSettingValue(args: {
|
|
15
30
|
key: ConfigKey;
|
|
16
31
|
value: string;
|
|
17
32
|
configManager: ConfigManager;
|
|
18
33
|
secretsManager: SettingsSecretsManager | null;
|
|
34
|
+
/** Present when a daemon is adopted; absent leaves the historical local path. */
|
|
35
|
+
daemonCredentials?: SettingsDaemonCredentialWriter | null;
|
|
19
36
|
setConfigValue: (key: ConfigKey, value: unknown) => void;
|
|
37
|
+
/** Surface the daemon's refusal; without it a failed write would be silent. */
|
|
38
|
+
onError?: (message: string) => void;
|
|
20
39
|
}): void {
|
|
21
40
|
const { key, value, configManager, secretsManager, setConfigValue } = args;
|
|
22
41
|
if (!secretsManager) {
|
|
@@ -24,6 +43,21 @@ export function setSecretBackedSettingValue(args: {
|
|
|
24
43
|
return;
|
|
25
44
|
}
|
|
26
45
|
|
|
46
|
+
// A daemon-scoped credential never lands in this surface's own tree: the
|
|
47
|
+
// daemon is the process that spends it, and a copy here would be a credential
|
|
48
|
+
// sitting somewhere nothing reads it from.
|
|
49
|
+
if (defaultSecretBackedScope(key) === 'daemon' && args.daemonCredentials) {
|
|
50
|
+
const writer = args.daemonCredentials;
|
|
51
|
+
const trimmed = value.trim();
|
|
52
|
+
const done = trimmed.length === 0 ? writer.clear(key) : writer.set(key, value);
|
|
53
|
+
void done.catch((error) => {
|
|
54
|
+
const message = summarizeError(error);
|
|
55
|
+
logger.error('SettingsModal: the daemon refused the credential write', { key, error: message });
|
|
56
|
+
args.onError?.(`Saving that credential failed: ${message}`);
|
|
57
|
+
});
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
27
61
|
const update = buildSecretBackedConfigUpdate(key, value);
|
|
28
62
|
// A daemon-owned key (surfaces.*, payments.*, controlPlane.*, ...) names a
|
|
29
63
|
// credential the daemon itself executes with, so its secret material lands in
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ProviderAuthFreshness } from '@/runtime/index.ts';
|
|
2
2
|
import { listBuiltinSubscriptionProviders } from '@pellux/goodvibes-sdk/platform/config';
|
|
3
3
|
import type { SubscriptionManager } from '@pellux/goodvibes-sdk/platform/config';
|
|
4
|
-
import type { ServiceInspectionQuery } from '
|
|
4
|
+
import type { ServiceInspectionQuery } from '@/runtime/index.ts';
|
|
5
5
|
import type { SubscriptionEntry } from './settings-modal-types.ts';
|
|
6
6
|
|
|
7
7
|
export function buildSubscriptionEntries(
|
|
@@ -71,6 +71,16 @@ export type SettingsCategory =
|
|
|
71
71
|
// hand-editing a settings file — a third occurrence of the push.*/cluster.*
|
|
72
72
|
// class the profile comment already names two of.
|
|
73
73
|
| 'occasions'
|
|
74
|
+
// hostedSessions.* — sessions whose conversation loop runs inside the daemon
|
|
75
|
+
// instead of this terminal: what detaching does to one (the owner-confirmed
|
|
76
|
+
// default is `kill`, the behavior closing a client has always had), how many
|
|
77
|
+
// may run at once, how much of a conversation is kept, and how long a
|
|
78
|
+
// terminated one's record is retained. Same mandatory-dual-membership rule as
|
|
79
|
+
// profile and occasions above — without BOTH this entry and the
|
|
80
|
+
// SETTINGS_CATEGORY_GROUPS membership below, buildSettingGroups drops every
|
|
81
|
+
// hostedSessions.* key from the workspace, which is exactly what happened to
|
|
82
|
+
// push.* and cluster.* before them.
|
|
83
|
+
| 'hostedSessions'
|
|
74
84
|
| 'danger';
|
|
75
85
|
|
|
76
86
|
export type SettingsFocusPane = 'categories' | 'settings';
|
|
@@ -82,7 +92,11 @@ export const SETTINGS_CATEGORY_GROUPS: ReadonlyArray<{
|
|
|
82
92
|
{ label: 'Interface', categories: ['display', 'ui', 'behavior', 'notifications', 'permissions', 'policy', 'security'] },
|
|
83
93
|
{ label: 'AI Routing', categories: ['provider', 'pricing', 'subscriptions', 'helper', 'tools', 'tts', 'voice'] },
|
|
84
94
|
{ label: 'Service & Network', categories: ['service', 'daemon', 'network', 'controlPlane', 'httpListener', 'web', 'relay'] },
|
|
85
|
-
|
|
95
|
+
// 'hostedSessions' sits beside 'surfaces' and 'conversationGate': all three
|
|
96
|
+
// answer "where does this conversation actually run, and who can reach it" —
|
|
97
|
+
// the detach policy is a fact about the daemon holding a session open, not
|
|
98
|
+
// about this terminal's presentation of it.
|
|
99
|
+
{ label: 'Surfaces & Cloud', categories: ['surfaces', 'hostedSessions', 'device', 'conversationGate', 'integrations', 'connections', 'mcp', 'cloudflare'] },
|
|
86
100
|
// 'occasions' sits beside 'checkin': both are proactive background loops
|
|
87
101
|
// (a cadence, a judgment pass, a conditional channel delivery) rather than
|
|
88
102
|
// facts held about the owner — the data occasions/plans declare lives in
|
|
@@ -20,8 +20,8 @@ import { type ConfigKey } from '@pellux/goodvibes-sdk/platform/config';
|
|
|
20
20
|
import type { ModelPickerTarget } from './model-picker.ts';
|
|
21
21
|
import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config';
|
|
22
22
|
import type { SubscriptionManager } from '@pellux/goodvibes-sdk/platform/config';
|
|
23
|
-
import type { ServiceInspectionQuery } from '
|
|
24
|
-
import type { SettingsSecretsManager } from './settings-modal-secrets.ts';
|
|
23
|
+
import type { ServiceInspectionQuery } from '@/runtime/index.ts';
|
|
24
|
+
import type { SettingsDaemonCredentialWriter, SettingsSecretsManager } from './settings-modal-secrets.ts';
|
|
25
25
|
import { CVV_PROMPT_TRADEOFF_WARNING } from '@pellux/goodvibes-sdk/platform/payments';
|
|
26
26
|
import { PAYMENTS_CVV_HANDLING_CONFIG_KEY } from './payments-config.ts';
|
|
27
27
|
import type { FeatureFlagManager } from '@/runtime/index.ts';
|
|
@@ -52,9 +52,10 @@ import { getSettingLabel } from '../renderer/settings-modal-helpers.ts';
|
|
|
52
52
|
import {
|
|
53
53
|
applySettingValue,
|
|
54
54
|
syncFlagEntryFromManager,
|
|
55
|
+
type DaemonOwnedConfigWriter,
|
|
55
56
|
type SettingAppliedCallback,
|
|
56
57
|
} from './settings-modal-mutations.ts';
|
|
57
|
-
import { featureEnablementWrite, isFeatureValueEnabled } from '
|
|
58
|
+
import { featureEnablementWrite, isFeatureValueEnabled } from '@pellux/goodvibes-terminal-shell';
|
|
58
59
|
import {
|
|
59
60
|
activateSelected as _activateSelected,
|
|
60
61
|
handleSubscriptionLogoutKey as _handleSubscriptionLogoutKey,
|
|
@@ -85,6 +86,20 @@ export type SettingsModalChangeHandler = (change: SettingsModalChange) => Settin
|
|
|
85
86
|
|
|
86
87
|
export interface SettingsModalOpenOptions {
|
|
87
88
|
readonly onSettingApplied?: SettingsModalChangeHandler;
|
|
89
|
+
/**
|
|
90
|
+
* The daemon's credential write. A daemon-scoped credential (a mailbox
|
|
91
|
+
* password, a bot token, a card) must land where the daemon reads it — this
|
|
92
|
+
* surface storing a copy is a credential in a place nothing consults.
|
|
93
|
+
*/
|
|
94
|
+
readonly daemonCredentials?: SettingsDaemonCredentialWriter | null;
|
|
95
|
+
/**
|
|
96
|
+
* Where a daemon-owned setting is written. Present when a daemon is
|
|
97
|
+
* configured; without it every write stays local, which is right only when
|
|
98
|
+
* there is no daemon to disagree with.
|
|
99
|
+
*/
|
|
100
|
+
readonly daemonConfig?: DaemonOwnedConfigWriter | null;
|
|
101
|
+
/** Renders a refused credential write, so a failed save is never silent. */
|
|
102
|
+
readonly reportError?: (message: string) => void;
|
|
88
103
|
/** In-process catalog the Connections category probes; see that module. */
|
|
89
104
|
readonly gatewayMethods?: GatewayMethodCatalog;
|
|
90
105
|
/** Called when an async connection refresh has new rows to paint. */
|
|
@@ -194,6 +209,9 @@ export class SettingsModal {
|
|
|
194
209
|
|
|
195
210
|
private configManager: ConfigManager | null = null;
|
|
196
211
|
private secretsManager: SettingsSecretsManager | null = null;
|
|
212
|
+
private daemonCredentials: SettingsDaemonCredentialWriter | null = null;
|
|
213
|
+
private daemonConfig: DaemonOwnedConfigWriter | null = null;
|
|
214
|
+
private reportError: ((message: string) => void) | null = null;
|
|
197
215
|
private featureFlagManager: FeatureFlagManager | null = null;
|
|
198
216
|
private mcpRegistry: McpRegistry | null = null;
|
|
199
217
|
private subscriptionManager: SubscriptionManager | null = null;
|
|
@@ -217,6 +235,9 @@ export class SettingsModal {
|
|
|
217
235
|
): void {
|
|
218
236
|
this.configManager = configManager;
|
|
219
237
|
this.secretsManager = secretsManager ?? null;
|
|
238
|
+
this.daemonCredentials = options?.daemonCredentials ?? null;
|
|
239
|
+
this.daemonConfig = options?.daemonConfig ?? null;
|
|
240
|
+
this.reportError = options?.reportError ?? null;
|
|
220
241
|
this.featureFlagManager = featureFlagManager;
|
|
221
242
|
this.subscriptionManager = subscriptionManager;
|
|
222
243
|
this.serviceRegistry = serviceRegistry;
|
|
@@ -557,6 +578,8 @@ export class SettingsModal {
|
|
|
557
578
|
editBuffer: this.editBuffer,
|
|
558
579
|
configManager: this.configManager,
|
|
559
580
|
secretsManager: this.secretsManager,
|
|
581
|
+
daemonCredentials: this.daemonCredentials,
|
|
582
|
+
...(this.reportError ? { reportError: this.reportError } : {}),
|
|
560
583
|
mcpRegistry: this.mcpRegistry,
|
|
561
584
|
mcpAllowAllConfirmationTarget: this.mcpAllowAllConfirmationTarget,
|
|
562
585
|
getSelectedMcp: () => this.getSelectedMcp(),
|
|
@@ -678,6 +701,8 @@ export class SettingsModal {
|
|
|
678
701
|
refreshGroups: () => {
|
|
679
702
|
if (this.configManager) refreshEntryValues(this.groups, this.configManager);
|
|
680
703
|
},
|
|
704
|
+
daemonConfig: this.daemonConfig,
|
|
705
|
+
...(this.reportError ? { onAsyncError: this.reportError } : {}),
|
|
681
706
|
});
|
|
682
707
|
|
|
683
708
|
// Feature-unit headers write plain domain keys; the SDK settings bridge
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* settings modal even though they fully control what runs when a fresh
|
|
10
10
|
* isolated worktree is provisioned (setup commands, then untracked-file
|
|
11
11
|
* carry-over). Same rationale as the other synthetic settings in
|
|
12
|
-
* settings-modal-data.ts (
|
|
12
|
+
* settings-modal-data.ts (behavior.notifyAfterSeconds, storage.codeIndexEnabled, etc).
|
|
13
13
|
*
|
|
14
14
|
* Both keys hold a JSON array of strings on disk. The settings modal's
|
|
15
15
|
* inline editor is a single-line text field, so — matching the SDK's own
|
package/src/main.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
|
-
import { resolveGoodVibesDaemonHome, resolveGoodVibesHome } from '
|
|
2
|
+
import { resolveGoodVibesDaemonHome, resolveGoodVibesHome } from '@pellux/goodvibes-sdk/platform/config';
|
|
3
3
|
import { Compositor } from './renderer/compositor.ts';
|
|
4
|
-
import { type Line } from '
|
|
4
|
+
import { type Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
5
5
|
import { UIFactory } from './renderer/ui-factory.ts';
|
|
6
|
-
import { Orchestrator } from '
|
|
6
|
+
import { Orchestrator } from '@pellux/goodvibes-sdk/platform/core';
|
|
7
7
|
import { InputHandler } from './input/handler.ts';
|
|
8
|
-
import { SelectionManager } from '
|
|
8
|
+
import { SelectionManager } from '@pellux/goodvibes-terminal-shell';
|
|
9
9
|
import type { ContentPart } from '@pellux/goodvibes-sdk/platform/providers';
|
|
10
10
|
import { ToolRegistry } from '@pellux/goodvibes-sdk/platform/tools';
|
|
11
11
|
import { registerAllTools } from '@pellux/goodvibes-sdk/platform/tools';
|
|
@@ -52,12 +52,12 @@ import { resolveFoldedBookmarkLine } from './core/bookmark-navigation.ts';
|
|
|
52
52
|
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
|
|
53
53
|
import { prepareShellCliRuntime } from './cli/entrypoint.ts';
|
|
54
54
|
import { applyInitialTuiCliState, reportFatalStartupError } from './cli/tui-startup.ts';
|
|
55
|
-
import { applyConfiguredHitlMode, applyRuntimeConfigValue,
|
|
55
|
+
import { applyConfiguredHitlMode, applyRuntimeConfigValue, applyTerminalRuntimeConfigDefaults } from '@pellux/goodvibes-terminal-shell';
|
|
56
56
|
import { renderToolCallBlock } from './renderer/tool-call.ts';
|
|
57
57
|
import { wireSpokenTurnRuntime } from './audio/spoken-turn-wiring.ts';
|
|
58
58
|
import { installVoiceCapture } from './shell/voice-capture-shell.ts';
|
|
59
59
|
import { attachSpokenTurnModelRouting, createSpokenTurnInputOptions } from './audio/spoken-turn-model-routing.ts';
|
|
60
|
-
import { allowTerminalWrite,
|
|
60
|
+
import { allowTerminalWrite, installFullScreenTerminalOutputGuard } from '@pellux/goodvibes-terminal-shell/terminal-output-guard';
|
|
61
61
|
import { installProcessLifecycle } from './runtime/process-lifecycle.ts';
|
|
62
62
|
import { createRenderScheduler } from '@pellux/goodvibes-terminal-shell';
|
|
63
63
|
import { buildCommandArgsHint } from './input/command-args-hint.ts';
|
|
@@ -67,7 +67,7 @@ import { formatUserFacingErrorLine } from './core/format-user-error.ts';
|
|
|
67
67
|
import { wireStreamEventMetrics, createStreamMetrics, type StreamMetrics, type WireStreamEventMetricsResult } from './core/stream-event-wiring.ts';
|
|
68
68
|
import { wireTurnEventHandlers } from './core/turn-event-wiring.ts';
|
|
69
69
|
import { resolveContextStatusHint } from './renderer/context-status-hint.ts';
|
|
70
|
-
import { isEffectiveDangerMode } from '
|
|
70
|
+
import { isEffectiveDangerMode } from '@pellux/goodvibes-sdk/platform/config';
|
|
71
71
|
import { createScriptableStatusline } from './core/scriptable-statusline.ts';
|
|
72
72
|
import { applyComposerCapture, applyAtModelDirective } from './input/composer-capture.ts';
|
|
73
73
|
import { createSessionAutoTitler } from './core/session-auto-titler.ts';
|
|
@@ -151,7 +151,7 @@ async function main() {
|
|
|
151
151
|
conversation.setWidthProvider(() => activeConversationWidth);
|
|
152
152
|
// Persisted HITL mode + TUI-side config defaults (doc'd at their definitions).
|
|
153
153
|
applyConfiguredHitlMode(configManager, modeManager);
|
|
154
|
-
|
|
154
|
+
applyTerminalRuntimeConfigDefaults(configManager);
|
|
155
155
|
|
|
156
156
|
// Re-surface pre-TUI launch-update lines in-session (the alt screen wipes
|
|
157
157
|
// stdout). Launch-time update mechanics are routine, not urgent — low
|
|
@@ -650,7 +650,7 @@ async function main() {
|
|
|
650
650
|
};
|
|
651
651
|
const renderScheduler = createRenderScheduler(renderNow, undefined, () => lifecycle.isTerminalRestored()); // coalescer; no frames after terminal restore
|
|
652
652
|
const render = (): void => renderScheduler.schedule(); // captured direct writes → activity log + quiet /debug counter, not repeated transcript lines (1a)
|
|
653
|
-
const terminalOutputGuard =
|
|
653
|
+
const terminalOutputGuard = installFullScreenTerminalOutputGuard({ stdout, stderr: process.stderr, onCapture: (total) => { commandContext.session.runtime.terminalWritesIntercepted = total; render(); } });
|
|
654
654
|
|
|
655
655
|
setRenderRequest(() => renderScheduler.flushNow()); // bootstrap's 16ms coalescer composites via the (restore-gated) scheduler
|
|
656
656
|
setPanelFrameRequester(render); // live panels repaint when idle (a replay finding: fleet sat stale until keypress)
|
|
@@ -668,6 +668,8 @@ async function main() {
|
|
|
668
668
|
mcpRegistry: ctx.services.mcpRegistry,
|
|
669
669
|
subscriptionManager,
|
|
670
670
|
secretsManager,
|
|
671
|
+
daemonCredentials: ctx.services.daemonCredentials, // a daemon-scoped credential is stored by the daemon, in one verified step
|
|
672
|
+
daemonConfig: ctx.services.daemonConfig, // a daemon-owned setting is written where the daemon reads it
|
|
671
673
|
serviceRegistry: ctx.services.serviceRegistry,
|
|
672
674
|
memoryEmbeddingRegistry: ctx.services.memoryEmbeddingRegistry,
|
|
673
675
|
workingDirectory: workingDir,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { formatDuration } from '../utils/format-duration.ts';
|
|
2
|
-
import { calcSessionCost, isModelPriced } from '
|
|
2
|
+
import { calcSessionCost, isModelPriced } from '@pellux/goodvibes-sdk/platform/providers';
|
|
3
3
|
import type { AgentEvent } from '@/runtime/index.ts';
|
|
4
|
-
import type { UiEventFeed } from '
|
|
4
|
+
import type { UiEventFeed } from '@/runtime/index.ts';
|
|
5
5
|
|
|
6
6
|
export type AgentInspectorEntryKind = 'user' | 'assistant' | 'tool_call' | 'tool_result' | 'session' | 'error';
|
|
7
7
|
|
package/src/panels/base-panel.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { Line } from '
|
|
1
|
+
import type { Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
2
2
|
import type { Panel, PanelCategory } from './types.ts';
|
|
3
3
|
import type { ComponentResourceContract, ComponentHealthState } from '../runtime/perf/panel-contracts.ts';
|
|
4
|
-
import type { ComponentHealthMonitor } from '
|
|
4
|
+
import type { ComponentHealthMonitor } from '@pellux/goodvibes-sdk/platform/runtime/observability';
|
|
5
5
|
import { UIFactory } from '../renderer/ui-factory.ts';
|
|
6
6
|
import { SPINNER_FRAMES } from '../renderer/ui-primitives.ts';
|
|
7
7
|
import { fitDisplay } from '../utils/terminal-width.ts';
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { PanelManager } from '../panel-manager.ts';
|
|
2
2
|
import { FleetPanel } from '../fleet-panel.ts';
|
|
3
|
-
import { createFleetReadModel } from '../fleet-read-model.ts';
|
|
4
3
|
import { FleetActs, type FleetDiffSurface } from '../fleet-acts.ts';
|
|
5
4
|
import { createFleetGateway } from '../fleet-gateway.ts';
|
|
6
5
|
import { FleetSpawn, createAcpSpawnGateway } from '../fleet-spawn.ts';
|
|
@@ -40,13 +39,12 @@ import { GOODVIBES_TUI_SURFACE_ROOT } from '../../config/surface.ts';
|
|
|
40
39
|
export function registerOperationsPanels(manager: PanelManager, deps: ResolvedBuiltinPanelDeps): void {
|
|
41
40
|
const ui = requireUiServices(deps);
|
|
42
41
|
|
|
43
|
-
// Fleet —
|
|
44
|
-
//
|
|
45
|
-
//
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
const fleetReadModel = createFleetReadModel(ui.runtime.processRegistry, ui.runtime.runtimeBus);
|
|
42
|
+
// Fleet — everything running, not just what this terminal started. The read
|
|
43
|
+
// model is composed once in runtime/services.ts (so its refresh timer has an
|
|
44
|
+
// owner that stops it) and unions this surface's own live process registry
|
|
45
|
+
// with the adopted daemon's rows; see runtime/client/fleet-union.ts for who
|
|
46
|
+
// wins on a shared id and why the daemon half is polled rather than streamed.
|
|
47
|
+
const fleetReadModel = ui.runtime.fleetReadModel;
|
|
50
48
|
|
|
51
49
|
// The Fleet panel's waiting-on-human acts (pick / conflict / discard) drive
|
|
52
50
|
// gateway verbs over the same operator invoke path the command layer uses, and
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { PanelManager } from '../panel-manager.ts';
|
|
2
2
|
import { TokenBudgetPanel } from '../token-budget-panel.ts';
|
|
3
|
+
import { HostedSessionPanel } from '../hosted-session-panel.ts';
|
|
3
4
|
import type { ResolvedBuiltinPanelDeps } from './shared.ts';
|
|
4
5
|
import { requireUiServices } from './shared.ts';
|
|
5
6
|
|
|
@@ -58,6 +59,22 @@ export function registerSessionPanels(manager: PanelManager, deps: ResolvedBuilt
|
|
|
58
59
|
},
|
|
59
60
|
});
|
|
60
61
|
|
|
62
|
+
// Hosted Session — a conversation whose loop runs INSIDE the daemon rather
|
|
63
|
+
// than in this process, rendered from the same `turn`/`tools` event domains a
|
|
64
|
+
// local turn emits (see panels/hosted-session-feed.ts). Not preloaded: a
|
|
65
|
+
// terminal that never opts into hosting should not carry an empty tab for it,
|
|
66
|
+
// and `/hosted new`/`/hosted attach` open it on the way in.
|
|
67
|
+
manager.registerType({
|
|
68
|
+
id: 'hosted',
|
|
69
|
+
name: 'Hosted Session',
|
|
70
|
+
// '◈' verified free against the registered builtin panel icons.
|
|
71
|
+
icon: '◈',
|
|
72
|
+
category: 'session',
|
|
73
|
+
description: 'A daemon-hosted conversation: its live transcript, the tool calls it is running, and what detaching would do to it',
|
|
74
|
+
retainOnClose: true,
|
|
75
|
+
factory: () => new HostedSessionPanel(),
|
|
76
|
+
});
|
|
77
|
+
|
|
61
78
|
// compat: the retired 'context' panel id still resolves — redirected
|
|
62
79
|
// to the merged tokens console ('/panel open context', saved layouts).
|
|
63
80
|
manager.registerAlias('context', 'tokens');
|
|
@@ -2,7 +2,7 @@ import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config';
|
|
|
2
2
|
import type { ServiceRegistry } from '@pellux/goodvibes-sdk/platform/config';
|
|
3
3
|
import type { ToolRegistry } from '@pellux/goodvibes-sdk/platform/tools';
|
|
4
4
|
import type { ProviderRegistry } from '@pellux/goodvibes-sdk/platform/providers';
|
|
5
|
-
import type { Orchestrator } from '
|
|
5
|
+
import type { Orchestrator } from '@pellux/goodvibes-sdk/platform/core';
|
|
6
6
|
import type { MemoryAccess } from '@pellux/goodvibes-sdk/platform/runtime/memory-spine';
|
|
7
7
|
import type { ApprovalBroker } from '@pellux/goodvibes-sdk/platform/control-plane';
|
|
8
8
|
import type { SessionReadFacade } from '@pellux/goodvibes-sdk/platform/runtime/session-spine';
|
|
@@ -23,7 +23,7 @@ import type { ExecutionPlanManager } from '@pellux/goodvibes-sdk/platform/core';
|
|
|
23
23
|
import type { AdaptivePlanner } from '@pellux/goodvibes-sdk/platform/core';
|
|
24
24
|
import type { ProjectPlanningService } from '@pellux/goodvibes-sdk/platform/knowledge';
|
|
25
25
|
import type { ApiTokenAuditor } from '@pellux/goodvibes-sdk/platform/security';
|
|
26
|
-
import type { ComponentHealthMonitor } from '
|
|
26
|
+
import type { ComponentHealthMonitor } from '@pellux/goodvibes-sdk/platform/runtime/observability';
|
|
27
27
|
import type { WorktreeRegistry } from '@/runtime/index.ts';
|
|
28
28
|
import type { SandboxSessionRegistry } from '@/runtime/index.ts';
|
|
29
29
|
import type { OpsApi, PlanRuntimeService } from '@/runtime/index.ts';
|
|
@@ -31,7 +31,7 @@ import type { WatcherRegistry } from '@pellux/goodvibes-sdk/platform/watchers';
|
|
|
31
31
|
import type { RuntimeStore } from '../../runtime/store/index.ts';
|
|
32
32
|
import type { KnowledgeApi } from '@pellux/goodvibes-sdk/platform/knowledge';
|
|
33
33
|
import type { SessionChangeTracker } from '@pellux/goodvibes-sdk/platform/sessions';
|
|
34
|
-
import type { Line } from '
|
|
34
|
+
import type { Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
35
35
|
import type { Panel, PanelCategory } from '../types.ts';
|
|
36
36
|
import { BasePanel } from '../base-panel.ts';
|
|
37
37
|
import { buildEmptyState, buildPanelWorkspace, DEFAULT_PANEL_PALETTE } from '../polish.ts';
|
|
@@ -120,7 +120,7 @@ export interface BuiltinPanelDeps {
|
|
|
120
120
|
/** Stable workspace project id for project:<projectId> planning spaces. */
|
|
121
121
|
projectPlanningProjectId?: string;
|
|
122
122
|
/** TUI-owned persistent work plan store. */
|
|
123
|
-
workPlanStore?: import('
|
|
123
|
+
workPlanStore?: import('@pellux/goodvibes-sdk/platform/workflow').WorkPlanStore;
|
|
124
124
|
/** Explicit UI-facing runtime services for agent/process/WRFC/remote panels and modals. */
|
|
125
125
|
uiServices?: UiRuntimeServices;
|
|
126
126
|
/** Shared plugin manager for plugin and security panels (widened past the read-only observer surface — — so PluginsPanel can drive enable/disable/verify/lift-quarantine). */
|
|
@@ -189,7 +189,7 @@ export type ResolvedBuiltinPanelDeps = Omit<
|
|
|
189
189
|
readonly adaptivePlanner: AdaptivePlanner;
|
|
190
190
|
readonly projectPlanningService: ProjectPlanningService;
|
|
191
191
|
readonly projectPlanningProjectId: string;
|
|
192
|
-
readonly workPlanStore: import('
|
|
192
|
+
readonly workPlanStore: import('@pellux/goodvibes-sdk/platform/workflow').WorkPlanStore;
|
|
193
193
|
readonly policyRuntimeState: PolicyRuntimeState;
|
|
194
194
|
};
|
|
195
195
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { PanelManager } from './panel-manager.ts';
|
|
2
2
|
import { requireUiServices, type ResolvedBuiltinPanelDeps } from './builtin/shared.ts';
|
|
3
3
|
import type { ConfigModalSurface, ConfigModalView } from '../input/config-modal-types.ts';
|
|
4
|
-
import { createProviderRuntimeInspectionQuery } from '
|
|
4
|
+
import { createProviderRuntimeInspectionQuery } from '@/runtime/index.ts';
|
|
5
5
|
import { createRuntimeProviderApi } from '@/runtime/index.ts';
|
|
6
6
|
import { copyToClipboard } from '../utils/clipboard.ts';
|
|
7
|
-
import { ensurePublicBaseUrl } from '
|
|
8
|
-
import { availablePairingOffers, mintPairingHandoff, defaultPairingTokenName } from '
|
|
7
|
+
import { ensurePublicBaseUrl } from '@pellux/goodvibes-sdk/platform/pairing';
|
|
8
|
+
import { availablePairingOffers, mintPairingHandoff, defaultPairingTokenName } from '@pellux/goodvibes-sdk/platform/pairing';
|
|
9
9
|
import { probePairingTailscale, runPairingTailscaleServe } from '../core/pairing-tailscale-gateway.ts';
|
|
10
10
|
// ── Providers & Connectivity + Security subset ────────────────────────────────
|
|
11
11
|
import { createServicesModalSurface } from './modals/services-modal.ts';
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
// do not implement a bespoke two-press or Enter-only variant.
|
|
20
20
|
// ---------------------------------------------------------------------------
|
|
21
21
|
|
|
22
|
-
import type { Line } from '
|
|
22
|
+
import type { Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
23
23
|
import { buildPanelLine } from './polish.ts';
|
|
24
24
|
import { DEFAULT_PANEL_PALETTE } from './polish.ts';
|
|
25
25
|
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
// CostTrackerPanel — per-session / per-agent / per-plan cost estimates
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
|
|
5
|
-
import type { Line } from '
|
|
6
|
-
import { createStyledCell, createEmptyLine } from '
|
|
5
|
+
import type { Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
6
|
+
import { createStyledCell, createEmptyLine } from '@pellux/goodvibes-sdk/platform/types';
|
|
7
7
|
import { fitDisplay, truncateDisplay } from '../utils/terminal-width.ts';
|
|
8
8
|
import { BasePanel } from './base-panel.ts';
|
|
9
9
|
import type { AgentEvent, TurnEvent } from '@/runtime/index.ts';
|
|
10
|
-
import type { UiEventFeed } from '
|
|
10
|
+
import type { UiEventFeed } from '@/runtime/index.ts';
|
|
11
11
|
import type { AgentRecord } from '@pellux/goodvibes-sdk/platform/tools';
|
|
12
12
|
import {
|
|
13
13
|
buildEmptyState,
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
DEFAULT_PANEL_PALETTE,
|
|
23
23
|
type PanelWorkspaceSection,
|
|
24
24
|
} from './polish.ts';
|
|
25
|
-
import { calcSessionCost, describePricingSource, isModelPriced, computeBudgetBreach, readBudgetAlertUsd, writeManualModelPrice, BUDGET_ALERT_USD_CONFIG_KEY, type BudgetAlertConfigAccess } from '
|
|
25
|
+
import { calcSessionCost, describePricingSource, isModelPriced, computeBudgetBreach, readBudgetAlertUsd, writeManualModelPrice, BUDGET_ALERT_USD_CONFIG_KEY, type BudgetAlertConfigAccess } from '@pellux/goodvibes-sdk/platform/providers';
|
|
26
26
|
import { abbreviateCount } from '../utils/format-number.ts';
|
|
27
27
|
import { isTextBackspace } from '../input/delete-key-policy.ts';
|
|
28
28
|
|
package/src/panels/diff-panel.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
// DiffPanel — unified diff view of agent file changes
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
|
|
5
|
-
import type { Line } from '
|
|
6
|
-
import { createStyledCell, createEmptyLine } from '
|
|
5
|
+
import type { Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
6
|
+
import { createStyledCell, createEmptyLine } from '@pellux/goodvibes-sdk/platform/types';
|
|
7
7
|
import { truncateDisplay, getDisplayWidth } from '../utils/terminal-width.ts';
|
|
8
8
|
import { GitService, type StructuredDiff, type StructuredDiffFile } from '@pellux/goodvibes-sdk/platform/git';
|
|
9
9
|
import { BasePanel } from './base-panel.ts';
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
// snapshot. The panel never presents a stale diff as current.
|
|
14
14
|
// ---------------------------------------------------------------------------
|
|
15
15
|
|
|
16
|
-
import type { Line } from '
|
|
17
|
-
import { createEmptyLine } from '
|
|
16
|
+
import type { Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
17
|
+
import { createEmptyLine } from '@pellux/goodvibes-sdk/platform/types';
|
|
18
18
|
import { truncateDisplay } from '../utils/terminal-width.ts';
|
|
19
19
|
import { GitService } from '@pellux/goodvibes-sdk/platform/git';
|
|
20
20
|
import { BasePanel } from './base-panel.ts';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Line } from '
|
|
2
|
-
import { createEmptyLine } from '
|
|
1
|
+
import type { Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
2
|
+
import { createEmptyLine } from '@pellux/goodvibes-sdk/platform/types';
|
|
3
3
|
import { ScrollableListPanel } from './scrollable-list-panel.ts';
|
|
4
4
|
import {
|
|
5
5
|
buildKeyboardHints,
|
package/src/panels/fleet-acts.ts
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
import type { ProcessNode } from '@pellux/goodvibes-sdk/platform/runtime/fleet';
|
|
26
26
|
import type { WorkItem } from '@pellux/goodvibes-sdk/platform/orchestration';
|
|
27
27
|
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
|
|
28
|
-
import type { Line } from '
|
|
28
|
+
import type { Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
29
29
|
import { isPanelSearchBackspace, isPanelSearchCancel, isPanelSearchCommit, isPanelSearchPrintable } from './search-focus.ts';
|
|
30
30
|
import { appendSteerText } from './fleet-tabs.ts';
|
|
31
31
|
import { isObservedExternalNode, observedKindLabel, type ObservedNode } from './fleet-observed-render.ts';
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
// ---------------------------------------------------------------------------
|
|
15
15
|
|
|
16
16
|
import type { ProcessNode, ProcessObserved, ObservedAgentKind } from '@pellux/goodvibes-sdk/platform/runtime/fleet';
|
|
17
|
-
import type { Line } from '
|
|
17
|
+
import type { Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
18
18
|
import { buildPanelLine, buildSearchInputLine, DEFAULT_PANEL_PALETTE, type PanelPalette } from './polish.ts';
|
|
19
19
|
import { truncateDisplay, wrapText } from '../utils/terminal-width.ts';
|
|
20
20
|
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// ---------------------------------------------------------------------------
|
|
9
9
|
|
|
10
10
|
import type { ProcessCostState, ProcessNode, ProcessReviewSummary, ProcessUsage } from '@pellux/goodvibes-sdk/platform/runtime/fleet';
|
|
11
|
-
import type { Line } from '
|
|
11
|
+
import type { Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
12
12
|
import { formatAgentCost } from './agent-inspector-shared.ts';
|
|
13
13
|
import { buildPanelLine, DEFAULT_PANEL_PALETTE, type ColumnSpec, type PanelPalette } from './polish.ts';
|
|
14
14
|
import { fleetAttentionText, fleetNodeAttention, fleetStallMarker, fleetUsageTokens, hasFleetCost, type FleetStateTone } from './fleet-read-model.ts';
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
13
13
|
|
|
14
14
|
import { readFile } from 'node:fs/promises';
|
|
15
|
-
import type { Line } from '
|
|
15
|
+
import type { Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
16
16
|
import type { SteerResult } from '@pellux/goodvibes-sdk/platform/runtime/fleet';
|
|
17
17
|
import type { ConversationMessageSnapshot } from '@pellux/goodvibes-sdk/platform/core';
|
|
18
18
|
import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config';
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config';
|
|
23
23
|
import type { OperatorMethodOutput } from '@pellux/goodvibes-sdk';
|
|
24
24
|
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
|
|
25
|
-
import type { Line } from '
|
|
25
|
+
import type { Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
26
26
|
import { resolveOperatorRpc } from '../input/commands/operator-rpc.ts';
|
|
27
27
|
import {
|
|
28
28
|
buildKeyboardHints,
|
|
@@ -13,7 +13,7 @@ import { STEER_TTL_MS, type ProcessNode } from '@pellux/goodvibes-sdk/platform/r
|
|
|
13
13
|
import { isTerminalProcessState } from './fleet-read-model.ts';
|
|
14
14
|
import type { FleetTab, SteerBadge, SteerBadgeStatus } from './fleet-tabs.ts';
|
|
15
15
|
import { buildPanelLine, DEFAULT_PANEL_PALETTE, type PanelPalette } from './polish.ts';
|
|
16
|
-
import type { Line } from '
|
|
16
|
+
import type { Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
17
17
|
|
|
18
18
|
/** Linger before an auto-resolved (consumed/dropped) steer badge is cleared from the tab. */
|
|
19
19
|
export const STEER_BADGE_LINGER_MS = 4_000;
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
|
|
30
30
|
import type { ConversationMessageSnapshot } from '@pellux/goodvibes-sdk/platform/core';
|
|
31
31
|
import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config';
|
|
32
|
-
import { createEmptyLine, type Line } from '
|
|
32
|
+
import { createEmptyLine, type Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
33
33
|
import type { MessageLineCache } from '../core/conversation-line-cache.ts';
|
|
34
34
|
import type { ConversationRenderContext } from '../core/conversation-rendering.ts';
|
|
35
35
|
import { renderConversationEventLine, renderConversationNotice } from '../renderer/conversation-surface.ts';
|
package/src/panels/git-panel.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BasePanel } from './base-panel.ts';
|
|
2
|
-
import { createEmptyLine, createStyledCell, type Line } from '
|
|
2
|
+
import { createEmptyLine, createStyledCell, type Line } from '@pellux/goodvibes-sdk/platform/types';
|
|
3
3
|
import { truncateDisplay, getDisplayWidth } from '../utils/terminal-width.ts';
|
|
4
4
|
import { GitService } from '@pellux/goodvibes-sdk/platform/git';
|
|
5
5
|
import { logger } from '@pellux/goodvibes-sdk/platform/utils';
|