@pellux/goodvibes-tui 2.0.14 → 2.0.15

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