@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.
Files changed (405) hide show
  1. package/CHANGELOG.md +127 -2
  2. package/README.md +7 -9
  3. package/bin/goodvibes +2 -2
  4. package/bin/launcher-support.js +8 -4
  5. package/docs/README.md +11 -2
  6. package/docs/foundation-artifacts/operator-contract.json +6403 -2347
  7. package/package.json +14 -25
  8. package/scripts/postinstall.js +35 -35
  9. package/src/audio/spoken-turn-model-routing.ts +1 -1
  10. package/src/cli/bundle-command.ts +5 -5
  11. package/src/cli/completions/generate.ts +1 -1
  12. package/src/cli/doctor.ts +3 -3
  13. package/src/cli/entrypoint.ts +12 -7
  14. package/src/cli/help.ts +4 -5
  15. package/src/cli/hooks-command.ts +1 -1
  16. package/src/cli/index.ts +1 -4
  17. package/src/cli/launch-auto-update.ts +59 -7
  18. package/src/cli/management-commands.ts +6 -6
  19. package/src/cli/management-utils.ts +5 -5
  20. package/src/cli/management.ts +7 -7
  21. package/src/cli/network-posture.ts +1 -1
  22. package/src/cli/package-verification.ts +7 -6
  23. package/src/cli/plugin-bundles-command.ts +1 -1
  24. package/src/cli/plugin-command.ts +2 -2
  25. package/src/cli/service-command.ts +2 -2
  26. package/src/cli/service-posture.ts +4 -4
  27. package/src/cli/status.ts +9 -8
  28. package/src/cli/surface-command.ts +4 -4
  29. package/src/cli/tui-startup.ts +3 -3
  30. package/src/cli-flags.ts +3 -3
  31. package/src/config/goodvibes-home-audit.ts +0 -2
  32. package/src/config/secret-config.ts +37 -5
  33. package/src/config/tui-extension-settings.ts +1 -1
  34. package/src/core/approval-alert.ts +2 -2
  35. package/src/core/budget-breach-notifier.ts +3 -3
  36. package/src/core/conversation-compaction-render.ts +1 -1
  37. package/src/core/conversation-line-cache.ts +1 -1
  38. package/src/core/conversation-render-context.ts +1 -1
  39. package/src/core/conversation-rendering.ts +2 -2
  40. package/src/core/conversation.ts +10 -10
  41. package/src/core/long-task-notifier.ts +2 -2
  42. package/src/core/memory-diagnostics-gateway.ts +1 -1
  43. package/src/core/scriptable-statusline.ts +1 -1
  44. package/src/core/session-auto-titler.ts +1 -1
  45. package/src/core/session-resume-core.ts +2 -2
  46. package/src/core/stream-event-wiring.ts +24 -44
  47. package/src/core/terminal-notifier.ts +3 -3
  48. package/src/core/turn-cancellation.ts +1 -1
  49. package/src/core/turn-event-wiring.ts +5 -5
  50. package/src/input/command-registry.ts +6 -6
  51. package/src/input/commands/channel-pairing.ts +1 -1
  52. package/src/input/commands/cluster-runtime.ts +1 -1
  53. package/src/input/commands/codebase-runtime.ts +1 -1
  54. package/src/input/commands/devices-runtime.ts +1 -1
  55. package/src/input/commands/hosted-runtime.ts +330 -0
  56. package/src/input/commands/local-setup-review.ts +1 -1
  57. package/src/input/commands/local-setup-transfer.ts +2 -2
  58. package/src/input/commands/local-setup.ts +3 -3
  59. package/src/input/commands/managed-runtime.ts +2 -2
  60. package/src/input/commands/operator-rpc.ts +24 -110
  61. package/src/input/commands/payment-card-intake.ts +1 -1
  62. package/src/input/commands/permissions-provenance.ts +2 -2
  63. package/src/input/commands/plugin-runtime.ts +1 -1
  64. package/src/input/commands/provider.ts +1 -1
  65. package/src/input/commands/relay-runtime.ts +18 -9
  66. package/src/input/commands/rewind-runtime.ts +1 -1
  67. package/src/input/commands/runtime-services.ts +1 -1
  68. package/src/input/commands/services-runtime.ts +1 -1
  69. package/src/input/commands/session-workflow.ts +1 -1
  70. package/src/input/commands/settings-sync-runtime.ts +2 -2
  71. package/src/input/commands/share-runtime.ts +1 -1
  72. package/src/input/commands/tasks-runtime.ts +145 -55
  73. package/src/input/commands/update-runtime.ts +31 -28
  74. package/src/input/commands/work-plan-runtime.ts +2 -2
  75. package/src/input/commands/workstream-attempts.ts +1 -1
  76. package/src/input/commands/workstream-runtime.ts +2 -2
  77. package/src/input/commands.ts +2 -0
  78. package/src/input/feature-unit-layout.ts +1 -1
  79. package/src/input/feed-context-factory.ts +3 -3
  80. package/src/input/handler-content-actions.ts +2 -2
  81. package/src/input/handler-feed-routes.ts +1 -1
  82. package/src/input/handler-feed.ts +3 -3
  83. package/src/input/handler-modal-token-routes.ts +1 -1
  84. package/src/input/handler-onboarding-daemon-adopt.ts +3 -2
  85. package/src/input/handler-onboarding.ts +1 -1
  86. package/src/input/handler-types.ts +2 -2
  87. package/src/input/handler-ui-state.ts +1 -1
  88. package/src/input/handler.ts +4 -4
  89. package/src/input/input-history.ts +1 -1
  90. package/src/input/onboarding/onboarding-feature-units.ts +2 -2
  91. package/src/input/onboarding/onboarding-runtime-status.ts +15 -1
  92. package/src/input/onboarding/onboarding-wizard-apply.ts +17 -8
  93. package/src/input/onboarding/onboarding-wizard-cloudflare-step.ts +5 -3
  94. package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +1 -1
  95. package/src/input/onboarding/onboarding-wizard-types.ts +1 -1
  96. package/src/input/payments-config.ts +6 -6
  97. package/src/input/search.ts +1 -1
  98. package/src/input/session-picker-modal.ts +46 -0
  99. package/src/input/settings-modal-activation.ts +1 -1
  100. package/src/input/settings-modal-behavior.ts +4 -4
  101. package/src/input/settings-modal-commit.ts +11 -0
  102. package/src/input/settings-modal-data.ts +9 -122
  103. package/src/input/settings-modal-mutations.ts +33 -0
  104. package/src/input/settings-modal-secrets.ts +34 -0
  105. package/src/input/settings-modal-subscriptions.ts +1 -1
  106. package/src/input/settings-modal-types.ts +15 -1
  107. package/src/input/settings-modal.ts +28 -3
  108. package/src/input/worktree-setup-config.ts +1 -1
  109. package/src/main.ts +11 -9
  110. package/src/panels/agent-inspector-shared.ts +2 -2
  111. package/src/panels/base-panel.ts +2 -2
  112. package/src/panels/builtin/operations.ts +6 -8
  113. package/src/panels/builtin/session.ts +17 -0
  114. package/src/panels/builtin/shared.ts +5 -5
  115. package/src/panels/builtin-modals.ts +3 -3
  116. package/src/panels/confirm-state.ts +1 -1
  117. package/src/panels/cost-tracker-panel.ts +4 -4
  118. package/src/panels/diff-panel.ts +2 -2
  119. package/src/panels/diff-review-panel.ts +2 -2
  120. package/src/panels/expandable-list-panel.ts +2 -2
  121. package/src/panels/fleet-acts.ts +1 -1
  122. package/src/panels/fleet-observed-render.ts +1 -1
  123. package/src/panels/fleet-panel-format.ts +1 -1
  124. package/src/panels/fleet-panel.ts +1 -1
  125. package/src/panels/fleet-spawn.ts +1 -1
  126. package/src/panels/fleet-steer.ts +1 -1
  127. package/src/panels/fleet-transcript.ts +1 -1
  128. package/src/panels/git-panel.ts +1 -1
  129. package/src/panels/hosted-session-feed.ts +352 -0
  130. package/src/panels/hosted-session-panel.ts +221 -0
  131. package/src/panels/local-auth-panel.ts +3 -3
  132. package/src/panels/modals/devices-modal.ts +1 -1
  133. package/src/panels/modals/local-auth-modal.ts +1 -1
  134. package/src/panels/modals/pairing-modal.ts +1 -1
  135. package/src/panels/modals/services-modal.ts +1 -1
  136. package/src/panels/modals/settings-sync-modal.ts +1 -1
  137. package/src/panels/modals/subscription-modal.ts +1 -1
  138. package/src/panels/modals/work-plan-modal.ts +1 -1
  139. package/src/panels/notifications-panel.ts +1 -1
  140. package/src/panels/panel-confirm-overlay.ts +1 -1
  141. package/src/panels/plugins-panel.ts +2 -2
  142. package/src/panels/polish-core.ts +2 -2
  143. package/src/panels/polish-tables.ts +1 -1
  144. package/src/panels/polish.ts +2 -2
  145. package/src/panels/scrollable-list-panel.ts +3 -3
  146. package/src/panels/skills-panel.ts +3 -3
  147. package/src/panels/token-budget-panel.ts +5 -5
  148. package/src/panels/types.ts +1 -2
  149. package/src/permissions/prompt.ts +1 -1
  150. package/src/renderer/autocomplete-overlay.ts +1 -1
  151. package/src/renderer/block-actions-overlay.ts +1 -1
  152. package/src/renderer/bookmark-modal.ts +1 -1
  153. package/src/renderer/buffer.ts +1 -1
  154. package/src/renderer/code-block.ts +1 -1
  155. package/src/renderer/composer-fragments.ts +1 -1
  156. package/src/renderer/compositor.ts +2 -2
  157. package/src/renderer/config-modal.ts +1 -1
  158. package/src/renderer/context-inspector.ts +1 -1
  159. package/src/renderer/conversation-layout.ts +2 -2
  160. package/src/renderer/conversation-overlays.ts +1 -1
  161. package/src/renderer/conversation-surface.ts +2 -2
  162. package/src/renderer/diff-view.ts +1 -1
  163. package/src/renderer/diff.ts +1 -1
  164. package/src/renderer/file-picker-overlay.ts +1 -1
  165. package/src/renderer/fleet-tab-strip.ts +1 -1
  166. package/src/renderer/fullscreen-primitives.ts +2 -2
  167. package/src/renderer/fullscreen-workspace.ts +1 -1
  168. package/src/renderer/header-line.ts +1 -1
  169. package/src/renderer/help-overlay.ts +1 -1
  170. package/src/renderer/history-search-overlay.ts +2 -2
  171. package/src/renderer/layout.ts +5 -8
  172. package/src/renderer/markdown-inline.ts +1 -1
  173. package/src/renderer/markdown-table.ts +1 -1
  174. package/src/renderer/markdown.ts +1 -1
  175. package/src/renderer/mcp-workspace.ts +1 -1
  176. package/src/renderer/modal-factory.ts +2 -2
  177. package/src/renderer/model-workspace.ts +2 -2
  178. package/src/renderer/onboarding/onboarding-wizard.ts +1 -1
  179. package/src/renderer/overlay-box.ts +1 -1
  180. package/src/renderer/panel-composite.ts +1 -1
  181. package/src/renderer/panel-workspace-bar.ts +1 -1
  182. package/src/renderer/process-indicator.ts +1 -1
  183. package/src/renderer/profile-picker-modal.ts +1 -1
  184. package/src/renderer/search-overlay.ts +2 -2
  185. package/src/renderer/selection-modal-overlay.ts +1 -1
  186. package/src/renderer/session-picker-modal.ts +124 -3
  187. package/src/renderer/settings-modal-helpers.ts +2 -0
  188. package/src/renderer/settings-modal.ts +2 -2
  189. package/src/renderer/shell-surface.ts +2 -2
  190. package/src/renderer/system-message.ts +1 -1
  191. package/src/renderer/tab-strip.ts +1 -1
  192. package/src/renderer/theme-mode-config.ts +21 -33
  193. package/src/renderer/theme.ts +11 -12
  194. package/src/renderer/thinking.ts +1 -1
  195. package/src/renderer/tool-call.ts +2 -2
  196. package/src/renderer/tool-result-expanded-lines.ts +1 -1
  197. package/src/renderer/turn-injection.ts +7 -8
  198. package/src/renderer/ui-factory.ts +3 -3
  199. package/src/runtime/bootstrap-command-context.ts +4 -4
  200. package/src/runtime/bootstrap-command-parts.ts +5 -5
  201. package/src/runtime/bootstrap-core.ts +30 -30
  202. package/src/runtime/bootstrap-shell.ts +4 -4
  203. package/src/runtime/bootstrap.ts +128 -157
  204. package/src/runtime/client/approval-updates.ts +82 -0
  205. package/src/runtime/client/build-floors.ts +167 -0
  206. package/src/runtime/client/daemon-attach-handshake.ts +115 -0
  207. package/src/runtime/client/fleet-union.ts +147 -0
  208. package/src/runtime/client/host-service-status.ts +71 -0
  209. package/src/runtime/client/hosted-exit.ts +86 -0
  210. package/src/runtime/client/hosted-roster.ts +110 -0
  211. package/src/runtime/client/hosted-session-stream.ts +178 -0
  212. package/src/runtime/client/hosted-sessions.ts +187 -0
  213. package/src/runtime/client/operator-endpoint.ts +213 -0
  214. package/src/runtime/client/spine-adoption.ts +99 -0
  215. package/src/runtime/cloudflare-control-plane.ts +1 -1
  216. package/src/runtime/context-accounting-source.ts +1 -1
  217. package/src/runtime/context.ts +2 -2
  218. package/src/runtime/conversation-rewind-port.ts +42 -14
  219. package/src/runtime/daemon-attach-notices.ts +55 -19
  220. package/src/runtime/diagnostics/panels/ops.ts +1 -1
  221. package/src/runtime/disposal-wiring.ts +4 -24
  222. package/src/runtime/index.ts +119 -105
  223. package/src/runtime/install-self-check-startup.ts +2 -2
  224. package/src/runtime/interaction-seams.ts +1 -1
  225. package/src/runtime/knowledge-services.ts +8 -2
  226. package/src/runtime/legacy-daemon-migration.ts +4 -3
  227. package/src/runtime/legacy-daemon-reconcile.ts +3 -2
  228. package/src/runtime/memory-spine-transport.ts +37 -267
  229. package/src/runtime/notification-dispatch.ts +2 -2
  230. package/src/runtime/onboarding/apply.ts +2 -2
  231. package/src/runtime/onboarding/derivation.ts +2 -2
  232. package/src/runtime/onboarding/markers.ts +2 -2
  233. package/src/runtime/onboarding/progress.ts +2 -2
  234. package/src/runtime/onboarding/snapshot.ts +1 -1
  235. package/src/runtime/onboarding/state.ts +2 -2
  236. package/src/runtime/onboarding/types.ts +2 -2
  237. package/src/runtime/orchestrator-core-services.ts +1 -1
  238. package/src/runtime/path-shadow-startup.ts +28 -221
  239. package/src/runtime/power-keepawake-remote.ts +3 -2
  240. package/src/runtime/process-lifecycle.ts +2 -2
  241. package/src/runtime/provider-fallback.ts +10 -66
  242. package/src/runtime/recovery-autosave.ts +1 -1
  243. package/src/runtime/recovery-offer-wiring.ts +39 -23
  244. package/src/runtime/recovery-prompt.ts +31 -17
  245. package/src/runtime/relay-reachability-bridge.ts +53 -42
  246. package/src/runtime/release-artifacts.ts +2 -1
  247. package/src/runtime/runtime-services-types.ts +82 -35
  248. package/src/runtime/services.ts +305 -300
  249. package/src/runtime/session-resume-liveness-confirm.ts +1 -1
  250. package/src/runtime/ui-services.ts +7 -6
  251. package/src/runtime/update-check.ts +23 -43
  252. package/src/runtime/workspace-checkpointing.ts +1 -1
  253. package/src/runtime/wrfc-persistence.ts +2 -2
  254. package/src/shell/ui-openers.ts +30 -7
  255. package/src/utils/clipboard.ts +1 -1
  256. package/src/verification/verification-ledger.ts +10 -8
  257. package/src/version.ts +1 -1
  258. package/bin/goodvibes-daemon +0 -90
  259. package/src/cli/config-overrides.ts +0 -267
  260. package/src/cli/endpoints.ts +0 -109
  261. package/src/cli/parser.ts +0 -395
  262. package/src/cli/redaction.ts +0 -170
  263. package/src/cli/types.ts +0 -84
  264. package/src/cluster/commands.ts +0 -382
  265. package/src/cluster/remote-daemon-target.ts +0 -225
  266. package/src/cluster/render.ts +0 -268
  267. package/src/config/atomic-write.ts +0 -70
  268. package/src/config/credential-availability.ts +0 -122
  269. package/src/config/goodvibes-home.ts +0 -149
  270. package/src/config/index.ts +0 -88
  271. package/src/config/provider-model.ts +0 -23
  272. package/src/config/read-versioned.ts +0 -228
  273. package/src/core/alert-gating.ts +0 -67
  274. package/src/core/consolidation-receipt.ts +0 -41
  275. package/src/core/focus-tracker.ts +0 -41
  276. package/src/core/history.ts +0 -45
  277. package/src/core/memory-status.ts +0 -118
  278. package/src/core/orchestrator.ts +0 -7
  279. package/src/core/pairing-devices.ts +0 -49
  280. package/src/core/pairing-handoff.ts +0 -101
  281. package/src/core/pairing-offers.ts +0 -83
  282. package/src/core/pairing-origin.ts +0 -78
  283. package/src/core/rewind-turn-anchors.ts +0 -311
  284. package/src/core/session-recovery.ts +0 -210
  285. package/src/core/stable-host.ts +0 -171
  286. package/src/core/transcript-journal.ts +0 -503
  287. package/src/daemon/cli.ts +0 -693
  288. package/src/daemon/fatal-boot-report.ts +0 -111
  289. package/src/daemon/handlers/context.ts +0 -29
  290. package/src/daemon/handlers/contracts.ts +0 -77
  291. package/src/daemon/handlers/credentials.ts +0 -139
  292. package/src/daemon/handlers/drafts/draft-store.ts +0 -427
  293. package/src/daemon/handlers/drafts/index.ts +0 -17
  294. package/src/daemon/handlers/drafts/register.ts +0 -331
  295. package/src/daemon/handlers/errors.ts +0 -18
  296. package/src/daemon/handlers/inbox/cursor-store.ts +0 -457
  297. package/src/daemon/handlers/inbox/index.ts +0 -284
  298. package/src/daemon/handlers/inbox/mapping.ts +0 -192
  299. package/src/daemon/handlers/inbox/poller.ts +0 -212
  300. package/src/daemon/handlers/inbox/provider-adapter.ts +0 -156
  301. package/src/daemon/handlers/inbox/providers/discord.ts +0 -252
  302. package/src/daemon/handlers/inbox/providers/email.ts +0 -152
  303. package/src/daemon/handlers/inbox/providers/imap-client.ts +0 -300
  304. package/src/daemon/handlers/inbox/providers/route-util.ts +0 -24
  305. package/src/daemon/handlers/inbox/providers/slack.ts +0 -263
  306. package/src/daemon/handlers/index.ts +0 -117
  307. package/src/daemon/handlers/register.ts +0 -168
  308. package/src/daemon/handlers/remote/backends/cloud-terminal.ts +0 -142
  309. package/src/daemon/handlers/remote/backends/docker.ts +0 -79
  310. package/src/daemon/handlers/remote/backends/index.ts +0 -40
  311. package/src/daemon/handlers/remote/backends/local-process.ts +0 -113
  312. package/src/daemon/handlers/remote/backends/process-runner.ts +0 -127
  313. package/src/daemon/handlers/remote/backends/ssh.ts +0 -125
  314. package/src/daemon/handlers/remote/backends/types.ts +0 -97
  315. package/src/daemon/handlers/remote/dispatcher.ts +0 -181
  316. package/src/daemon/handlers/remote/index.ts +0 -119
  317. package/src/daemon/handlers/remote/peer-registry.ts +0 -357
  318. package/src/daemon/handlers/remote/service.ts +0 -191
  319. package/src/daemon/handlers/routing/inbox-bridge.ts +0 -71
  320. package/src/daemon/handlers/routing/index.ts +0 -261
  321. package/src/daemon/handlers/routing/route-store.ts +0 -319
  322. package/src/daemon/handlers/routing/routing-resolver.ts +0 -75
  323. package/src/daemon/handlers/sqlite-store.ts +0 -278
  324. package/src/daemon/handlers/triage/index.ts +0 -57
  325. package/src/daemon/handlers/triage/integration.ts +0 -213
  326. package/src/daemon/handlers/triage/pipeline.ts +0 -274
  327. package/src/daemon/handlers/triage/scorer.ts +0 -287
  328. package/src/daemon/handlers/triage/tagger/discord.ts +0 -187
  329. package/src/daemon/handlers/triage/tagger/imap.ts +0 -384
  330. package/src/daemon/handlers/triage/tagger/index.ts +0 -184
  331. package/src/daemon/handlers/triage/tagger/shared.ts +0 -70
  332. package/src/daemon/handlers/triage/tagger/slack.ts +0 -69
  333. package/src/daemon/handlers/triage/types.ts +0 -50
  334. package/src/daemon/lifecycle.ts +0 -41
  335. package/src/daemon/provision-wake-model.ts +0 -81
  336. package/src/daemon/safe-serve.ts +0 -61
  337. package/src/daemon/send/channels.ts +0 -200
  338. package/src/daemon/send/command.ts +0 -332
  339. package/src/daemon/send/composition.ts +0 -99
  340. package/src/daemon/send/failure-text.ts +0 -93
  341. package/src/daemon/send/inert-text.ts +0 -225
  342. package/src/daemon/send/stdin.ts +0 -24
  343. package/src/daemon/service-commands.ts +0 -329
  344. package/src/export/cost-utils.ts +0 -319
  345. package/src/input/selection.ts +0 -135
  346. package/src/plugins/loader.ts +0 -15
  347. package/src/renderer/bottom-bar.ts +0 -58
  348. package/src/renderer/conversation-tree.ts +0 -228
  349. package/src/runtime/agent-graph-composition.ts +0 -78
  350. package/src/runtime/channel-composition.ts +0 -46
  351. package/src/runtime/cluster-composition.ts +0 -124
  352. package/src/runtime/cluster-group-composition.ts +0 -284
  353. package/src/runtime/code-index-services.ts +0 -167
  354. package/src/runtime/daemon-handler-composition.ts +0 -76
  355. package/src/runtime/device-posture-composition.ts +0 -110
  356. package/src/runtime/durability-housekeeping.ts +0 -183
  357. package/src/runtime/durability-services.ts +0 -155
  358. package/src/runtime/embedded-service-factories.ts +0 -74
  359. package/src/runtime/feature-settings.ts +0 -154
  360. package/src/runtime/fleet-needs-input-push.ts +0 -70
  361. package/src/runtime/fleet-services.ts +0 -41
  362. package/src/runtime/idle-power-services.ts +0 -85
  363. package/src/runtime/mail-composition.ts +0 -65
  364. package/src/runtime/memory-fold.ts +0 -55
  365. package/src/runtime/operator-token-cleanup.ts +0 -109
  366. package/src/runtime/path-shadow.ts +0 -418
  367. package/src/runtime/perf/panel-health-monitor.ts +0 -18
  368. package/src/runtime/provider-optimizer-wiring.ts +0 -55
  369. package/src/runtime/reachability-notice.ts +0 -100
  370. package/src/runtime/remote-execution-composition.ts +0 -62
  371. package/src/runtime/session-liveness-marker.ts +0 -257
  372. package/src/runtime/session-pointer-surface.ts +0 -22
  373. package/src/runtime/session-storage-services.ts +0 -41
  374. package/src/runtime/surface-feature-flags.ts +0 -96
  375. package/src/runtime/terminal-output-guard.ts +0 -235
  376. package/src/runtime/trust/workspace-registration.ts +0 -192
  377. package/src/runtime/trust/workspace-trust.ts +0 -229
  378. package/src/runtime/ui/index.ts +0 -39
  379. package/src/runtime/ui/model-picker/data-provider.ts +0 -182
  380. package/src/runtime/ui/model-picker/health-enrichment.ts +0 -231
  381. package/src/runtime/ui/model-picker/index.ts +0 -59
  382. package/src/runtime/ui/model-picker/types.ts +0 -153
  383. package/src/runtime/ui/provider-health/data-provider.ts +0 -244
  384. package/src/runtime/ui/provider-health/fallback-visualizer.ts +0 -71
  385. package/src/runtime/ui/provider-health/index.ts +0 -46
  386. package/src/runtime/ui/provider-health/types.ts +0 -146
  387. package/src/runtime/ui-events.ts +0 -1
  388. package/src/runtime/ui-read-model-helpers.ts +0 -1
  389. package/src/runtime/ui-read-models-observability-maintenance.ts +0 -1
  390. package/src/runtime/ui-read-models-observability-options.ts +0 -1
  391. package/src/runtime/ui-read-models-observability-remote.ts +0 -1
  392. package/src/runtime/ui-read-models-observability-security.ts +0 -1
  393. package/src/runtime/ui-read-models-observability-system.ts +0 -1
  394. package/src/runtime/ui-read-models-observability.ts +0 -1
  395. package/src/runtime/ui-service-queries.ts +0 -1
  396. package/src/runtime/voice-setup-services.ts +0 -98
  397. package/src/runtime/workstream-attempts-validation.ts +0 -77
  398. package/src/runtime/workstream-draft-edits.ts +0 -95
  399. package/src/runtime/workstream-draft-store.ts +0 -274
  400. package/src/runtime/workstream-draft-types.ts +0 -42
  401. package/src/runtime/workstream-services.ts +0 -373
  402. package/src/tools/index.ts +0 -1
  403. package/src/types/grid.ts +0 -48
  404. package/src/types/sql-js.d.ts +0 -15
  405. 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 '../runtime/ui-service-queries.ts';
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
- { label: 'Surfaces & Cloud', categories: ['surfaces', 'device', 'conversationGate', 'integrations', 'connections', 'mcp', 'cloudflare'] },
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 '../runtime/ui-service-queries.ts';
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 '../runtime/feature-settings.ts';
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 (tts.speed, behavior.notifyAfterSeconds, etc).
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 './config/goodvibes-home.ts';
2
+ import { resolveGoodVibesDaemonHome, resolveGoodVibesHome } from '@pellux/goodvibes-sdk/platform/config';
3
3
  import { Compositor } from './renderer/compositor.ts';
4
- import { type Line } from './types/grid.ts';
4
+ import { type Line } from '@pellux/goodvibes-sdk/platform/types';
5
5
  import { UIFactory } from './renderer/ui-factory.ts';
6
- import { Orchestrator } from './core/orchestrator';
6
+ import { Orchestrator } from '@pellux/goodvibes-sdk/platform/core';
7
7
  import { InputHandler } from './input/handler.ts';
8
- import { SelectionManager } from './input/selection.ts';
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, applyTuiRuntimeConfigDefaults } from './cli/config-overrides.ts';
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, installTuiTerminalOutputGuard } from './runtime/terminal-output-guard.ts';
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 './config/index.ts';
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
- applyTuiRuntimeConfigDefaults(configManager);
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 = installTuiTerminalOutputGuard({ stdout, stderr: process.stderr, onCapture: (total) => { commandContext.session.runtime.terminalWritesIntercepted = total; render(); } });
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 '../export/cost-utils.ts';
2
+ import { calcSessionCost, isModelPriced } from '@pellux/goodvibes-sdk/platform/providers';
3
3
  import type { AgentEvent } from '@/runtime/index.ts';
4
- import type { UiEventFeed } from '../runtime/ui-events.ts';
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
 
@@ -1,7 +1,7 @@
1
- import type { Line } from '../types/grid.ts';
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 '../runtime/perf/panel-health-monitor.ts';
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 — the live unified process tree, read from the single
44
- // process registry constructed once in runtime/services.ts (shared with
45
- // every other consumer rather than duplicated here; the registry owns its
46
- // own coalesced tick, so no manual lifecycle-event wiring is needed).
47
- // runtimeBus is also passed so the read model can subscribe
48
- // to the honest COMMUNICATION_CONSUMED steer-ack signal (fleet-read-model.ts).
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 '../../core/orchestrator';
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 '../../runtime/perf/panel-health-monitor.ts';
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 '../../types/grid.ts';
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('../../work-plans/work-plan-store.ts').WorkPlanStore;
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('../../work-plans/work-plan-store.ts').WorkPlanStore;
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 '../runtime/ui-service-queries.ts';
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 '../core/pairing-origin.ts';
8
- import { availablePairingOffers, mintPairingHandoff, defaultPairingTokenName } from '../core/pairing-handoff.ts';
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 '../types/grid.ts';
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 '../types/grid.ts';
6
- import { createStyledCell, createEmptyLine } from '../types/grid.ts';
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 '../runtime/ui-events.ts';
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 '../export/cost-utils.ts';
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
 
@@ -2,8 +2,8 @@
2
2
  // DiffPanel — unified diff view of agent file changes
3
3
  // ---------------------------------------------------------------------------
4
4
 
5
- import type { Line } from '../types/grid.ts';
6
- import { createStyledCell, createEmptyLine } from '../types/grid.ts';
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 '../types/grid.ts';
17
- import { createEmptyLine } from '../types/grid.ts';
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 '../types/grid.ts';
2
- import { createEmptyLine } from '../types/grid.ts';
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,
@@ -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 '../types/grid.ts';
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 '../types/grid.ts';
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 '../types/grid.ts';
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 '../types/grid.ts';
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 '../types/grid.ts';
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 '../types/grid.ts';
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 '../types/grid.ts';
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';
@@ -1,5 +1,5 @@
1
1
  import { BasePanel } from './base-panel.ts';
2
- import { createEmptyLine, createStyledCell, type Line } from '../types/grid.ts';
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';