@pellux/goodvibes-tui 2.0.14 → 2.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +49 -0
  5. package/README.md +64 -44
  6. package/docs/README.md +6 -6
  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 +19 -19
  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 +11 -11
  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
@@ -2,14 +2,14 @@
2
2
  // fleet-spawn.ts
3
3
  //
4
4
  // The Fleet panel's ACP spawn affordance: 'n' on the fleet surface lists the
5
- // third-party coding agents the daemon discovered (acp.agents.list — read-only,
5
+ // third-party coding agents the daemon discovered (acp.agents.list, read-only,
6
6
  // quiet when none), you pick one, then pick a working directory from the known
7
- // candidates (the registered workspaces + the current dir — no free-text path
7
+ // candidates (the registered workspaces + the current dir, no free-text path
8
8
  // retyping where a known dir exists), and acp.sessions.create hosts it as a
9
9
  // long-lived daemon session. The new row shows up on the next fleet snapshot as
10
10
  // kind 'acp-agent' and steers/stops/flags-for-attention like any other row.
11
11
  //
12
- // A structured spawn failure ({binary, stage, message}) is surfaced verbatim —
12
+ // A structured spawn failure ({binary, stage, message}) is surfaced verbatim,
13
13
  // never a hung row: the daemon bounds the handshake and returns a 'failed'
14
14
  // record, and this controller reports its three honest fields.
15
15
  //
@@ -34,7 +34,7 @@ import {
34
34
 
35
35
  /** One discovered third-party ACP agent (acp.agents.list). */
36
36
  export type AcpDiscoveredAgent = OperatorMethodOutput<'acp.agents.list'>['agents'][number];
37
- /** acp.sessions.create output — the hosted record + whether it started. */
37
+ /** acp.sessions.create output, the hosted record + whether it started. */
38
38
  export type AcpSpawnResult = OperatorMethodOutput<'acp.sessions.create'>;
39
39
  /** One registered workspace root (workspaces.registrations.list). */
40
40
  export type AcpWorkspaceRegistration = OperatorMethodOutput<'workspaces.registrations.list'>['workspaces'][number];
@@ -47,13 +47,13 @@ export interface AcpDirCandidate {
47
47
  }
48
48
 
49
49
  /**
50
- * The async verb surface the spawn flow drives — real daemon round-trips in
50
+ * The async verb surface the spawn flow drives, real daemon round-trips in
51
51
  * production (createAcpSpawnGateway), a mocked shape in tests.
52
52
  */
53
53
  export interface AcpSpawnGateway {
54
54
  /** Discovered third-party agents (read-only; empty is a quiet, honest absence). */
55
55
  listAgents(): Promise<readonly AcpDiscoveredAgent[]>;
56
- /** The registered workspace roots — the known-dir candidates for the picker. */
56
+ /** The registered workspace roots, the known-dir candidates for the picker. */
57
57
  listWorkspaces(): Promise<readonly AcpWorkspaceRegistration[]>;
58
58
  /** Host a discovered agent in a directory as a long-lived daemon session. */
59
59
  createSession(input: { readonly agentId: string; readonly cwd: string }): Promise<AcpSpawnResult>;
@@ -69,7 +69,7 @@ export interface AcpSpawnGatewayDeps {
69
69
  }
70
70
 
71
71
  /**
72
- * Build the live ACP spawn gateway over the generic operator invoke path — the
72
+ * Build the live ACP spawn gateway over the generic operator invoke path, the
73
73
  * same daemon resolution the fleet acts use. Honest unavailable reason when no
74
74
  * daemon is reachable, so the spawn key refuses cleanly instead of throwing.
75
75
  */
@@ -88,7 +88,7 @@ export function createAcpSpawnGateway(deps: AcpSpawnGatewayDeps): AcpSpawnGatewa
88
88
  export interface FleetSpawnDeps {
89
89
  /** Resolve a live gateway per action (a daemon that comes up mid-session is seen). */
90
90
  readonly resolveGateway: () => AcpSpawnGatewayResolution;
91
- /** The current working directory — always a candidate dir (labeled "current directory"). */
91
+ /** The current working directory, always a candidate dir (labeled "current directory"). */
92
92
  readonly currentDirectory: () => string;
93
93
  /** Surface a result/receipt/error line to the operator (system message). */
94
94
  readonly notify: (message: string) => void;
@@ -204,10 +204,10 @@ export class FleetSpawn {
204
204
  const result = await gateway.createSession({ agentId, cwd });
205
205
  const hosted = result.hosted;
206
206
  if (hosted.error) {
207
- // Structured failure rendered verbatim — never a hung row.
208
- this.deps.notify(`[Fleet] Could not host ${hosted.title || agentId}: ${hosted.error.stage} stage failed for ${hosted.error.binary} — ${hosted.error.message}`);
207
+ // Structured failure rendered verbatim, never a hung row.
208
+ this.deps.notify(`[Fleet] Could not host ${hosted.title || agentId}: ${hosted.error.stage} stage failed for ${hosted.error.binary}; ${hosted.error.message}`);
209
209
  } else {
210
- this.deps.notify(`[Fleet] Hosting ${hosted.title || agentId} in ${cwd} — it appears as an acp-agent row; steer and stop it like any agent.`);
210
+ this.deps.notify(`[Fleet] Hosting ${hosted.title || agentId} in ${cwd}; it appears as an acp-agent row; steer and stop it like any agent.`);
211
211
  }
212
212
  } catch (err) {
213
213
  this.deps.notify(`ACP session create failed: ${summarizeError(err)}`);
@@ -225,10 +225,10 @@ export class FleetSpawn {
225
225
  const lines: Line[] = [];
226
226
  if (this.creating) {
227
227
  lines.push(buildPanelLine(width, [[' Hosting the agent…', P.dim]]));
228
- return buildPanelWorkspace(width, height, { title: 'Fleet — Host an agent', sections: [{ lines }], footerLines: [], palette: P });
228
+ return buildPanelWorkspace(width, height, { title: 'Fleet: Host an agent', sections: [{ lines }], footerLines: [], palette: P });
229
229
  }
230
230
  if (this.mode.step === 'agent') {
231
- lines.push(buildPanelLine(width, [[' Host a third-party coding agent — pick one, then a directory.', P.dim]]));
231
+ lines.push(buildPanelLine(width, [[' Host a third-party coding agent; pick one, then a directory.', P.dim]]));
232
232
  lines.push(buildPanelLine(width, [['', P.dim]]));
233
233
  this.mode.agents.forEach((agent, i) => {
234
234
  const selected = i === (this.mode as AgentStep).index;
@@ -239,7 +239,7 @@ export class FleetSpawn {
239
239
  ]));
240
240
  });
241
241
  } else {
242
- lines.push(buildPanelLine(width, [[` Directory for ${this.mode.agent.title} — a known dir, no path to type.`, P.dim]]));
242
+ lines.push(buildPanelLine(width, [[` Directory for ${this.mode.agent.title}: a known dir, no path to type.`, P.dim]]));
243
243
  lines.push(buildPanelLine(width, [['', P.dim]]));
244
244
  this.mode.candidates.forEach((cand, i) => {
245
245
  const selected = i === (this.mode as DirStep).index;
@@ -255,7 +255,7 @@ export class FleetSpawn {
255
255
  { keys: 'Enter', label: this.mode.step === 'agent' ? 'pick agent' : 'host here' },
256
256
  { keys: 'Esc', label: 'cancel' },
257
257
  ], P)];
258
- return buildPanelWorkspace(width, height, { title: 'Fleet — Host an agent', sections: [{ lines }], footerLines, palette: P });
258
+ return buildPanelWorkspace(width, height, { title: 'Fleet: Host an agent', sections: [{ lines }], footerLines, palette: P });
259
259
  }
260
260
 
261
261
  private requireGateway(): AcpSpawnGateway | null {
@@ -34,7 +34,7 @@ export function steerBadgeTone(status: SteerBadgeStatus, palette: PanelPalette):
34
34
  }
35
35
  }
36
36
 
37
- /** Labels of the currently live, steerable agent nodes other than `excludeNodeId` — offered when a steer target has gone inactive (WO item 4). */
37
+ /** Labels of the currently live, steerable agent nodes other than `excludeNodeId`, offered when a steer target has gone inactive (WO item 4). */
38
38
  export function liveSteerableLabels(nodes: readonly ProcessNode[], excludeNodeId: string): string[] {
39
39
  return nodes
40
40
  .filter((node) => node.id !== excludeNodeId && node.kind === 'agent' && node.capabilities.steerable && !isTerminalProcessState(node.state))
@@ -44,8 +44,8 @@ export function liveSteerableLabels(nodes: readonly ProcessNode[], excludeNodeId
44
44
  /** Refusal message for a steer that could not be queued: states why + preserves the draft + suggests live targets. */
45
45
  export function steerRefusalMessage(reason: string, siblingLabels: readonly string[]): string {
46
46
  const suggestion = siblingLabels.length > 0
47
- ? ` Draft kept — steerable now: ${siblingLabels.slice(0, 3).join(', ')}${siblingLabels.length > 3 ? '…' : ''}.`
48
- : ' Draft kept — no other agents are currently steerable.';
47
+ ? ` Draft kept: steerable now: ${siblingLabels.slice(0, 3).join(', ')}${siblingLabels.length > 3 ? '…' : ''}.`
48
+ : ' Draft kept: no other agents are currently steerable.';
49
49
  return `${reason}.${suggestion}`;
50
50
  }
51
51
 
@@ -55,10 +55,10 @@ export function renderSteerBadgeLine(badge: SteerBadge, width: number, palette:
55
55
  const tone = steerBadgeTone(badge.status, palette);
56
56
  const forTarget = targetLabel ? ` for ${targetLabel}` : '';
57
57
  const label = badge.status === 'queued'
58
- ? `steer queued${forTarget} — delivers on its next turn (watch the ${glyph} badge)`
58
+ ? `steer queued${forTarget}: delivers on its next turn (watch the ${glyph} badge)`
59
59
  : badge.status === 'consumed'
60
60
  ? 'steer consumed'
61
- : `steer dropped — ${badge.note ?? 'the target ended before delivery'}`;
61
+ : `steer dropped: ${badge.note ?? 'the target ended before delivery'}`;
62
62
  return buildPanelLine(width, [
63
63
  [' ', palette.dim],
64
64
  [glyph, tone],
@@ -75,7 +75,7 @@ export function renderSteerBadgeLine(badge: SteerBadge, width: number, palette:
75
75
  * its short linger so a tab doesn't accumulate stale indicators.
76
76
  *
77
77
  * Mutates `tab.steerBadge` in place (same mutable-slot convention as
78
- * `FleetTab.ledgerEntries` — see fleet-panel.ts's ensureLedgerLoaded).
78
+ * `FleetTab.ledgerEntries`, see fleet-panel.ts's ensureLedgerLoaded).
79
79
  * Returns true when anything changed, so the caller knows whether to mark
80
80
  * itself dirty.
81
81
  */
@@ -102,7 +102,7 @@ export function reconcileSteerBadges(
102
102
  changed = true;
103
103
  } else if (badge.queuedAt !== undefined && now - badge.queuedAt > STEER_TTL_MS) {
104
104
  // Long-tool-call case: the target is still healthy and non-terminal,
105
- // but the underlying steer message's own TTL (the SDK's MessageBus —
105
+ // but the underlying steer message's own TTL (the SDK's MessageBus,
106
106
  // see registry.js's steer(), which stamps every steer with
107
107
  // STEER_TTL_MS) has lapsed without a COMMUNICATION_CONSUMED ever
108
108
  // arriving. The SDK gives no explicit expiry signal, so without this
@@ -1,7 +1,7 @@
1
1
  // ---------------------------------------------------------------------------
2
2
  // fleet-stop.ts
3
3
  //
4
- // d1 — the "stopping…" write-window overlay, split out of fleet-panel.ts
4
+ // d1, the "stopping…" write-window overlay, split out of fleet-panel.ts
5
5
  // to keep that file under the architecture 800-line gate (same rationale as
6
6
  // fleet-steer.ts). FleetPanel owns nothing here beyond a FleetStopTracker
7
7
  // instance; all the state->display logic lives in these pure helpers.
@@ -26,7 +26,7 @@ export const BLOCKED_GLYPH = '⚑';
26
26
  /**
27
27
  * Tracks node ids the operator just asked to stop (kill/interrupt/pause) mapped
28
28
  * to the keypress time. While an id is present AND within STOP_SETTLE_MS its row
29
- * renders a display-only 'stopping…' instead of the raw state — so the tree
29
+ * renders a display-only 'stopping…' instead of the raw state, so the tree
30
30
  * never claims the past-tense 'killed'/'interrupted' during the brief write
31
31
  * window between the keypress and the state actually flipping. After the settle
32
32
  * window the TRUE state is ALWAYS shown, so a genuinely stuck kill is never
@@ -90,7 +90,7 @@ export interface FleetPauseDeps {
90
90
  * resumable node is resumed (interrupt's inverse); a live pausable node is
91
91
  * paused via the registry's interrupt() (its disable path). Honest refusal for
92
92
  * non-resumable/non-pausable kinds. Returns true when the key is consumed,
93
- * false to fall through (terminal, non-paused node — nothing to toggle).
93
+ * false to fall through (terminal, non-paused node, nothing to toggle).
94
94
  */
95
95
  export function toggleFleetPause(node: ProcessNode, deps: FleetPauseDeps): boolean {
96
96
  if (node.state === 'paused') {
@@ -141,7 +141,7 @@ export function buildFleetTreeHints(
141
141
  ];
142
142
  // Jump-to-blocked is offered whenever something is waiting on the operator,
143
143
  // in either view (the blocked nodes live in the active fleet, and the jump
144
- // switches back to it) — so it is placed before the view-specific branch.
144
+ // switches back to it), so it is placed before the view-specific branch.
145
145
  if (blockedCount > 0) hints.push({ keys: 'b', label: `blocked (${blockedCount})` });
146
146
  if (viewMode === 'archived') {
147
147
  // Archive view: restore + return to the live fleet; nothing here is live,
@@ -194,7 +194,7 @@ export function countDescendantStats(rows: readonly FleetTreeRow[], nodeId: stri
194
194
  }
195
195
 
196
196
  /**
197
- * Build the confirm-overlay arm options for a cascade Kill of one node — the
197
+ * Build the confirm-overlay arm options for a cascade Kill of one node, the
198
198
  * label carries the descendant count so the operator sees what a confirm takes
199
199
  * down. Extracted from FleetPanel to keep that file under the 800-line cap.
200
200
  */
@@ -14,7 +14,7 @@
14
14
  //
15
15
  // Attachable kinds: only 'agent' and 'wrfc-chain' carry anything worth
16
16
  // attaching to (a transcript for an agent; a live member summary for a
17
- // chain — see fleet-transcript.ts). workflow/trigger/schedule/watcher/
17
+ // chain, see fleet-transcript.ts). workflow/trigger/schedule/watcher/
18
18
  // background-process/wrfc-subtask nodes have no transcript and are never
19
19
  // attachable (FleetPanel shows a status message instead, matching the
20
20
  // existing i/K "not supported" convention).
@@ -34,14 +34,14 @@ export function isAttachableFleetKind(kind: ProcessKind): kind is FleetAttachabl
34
34
  /**
35
35
  * Lifecycle of a queued steer message, tracked
36
36
  * per-tab. `queued` means `ProcessRegistry.steer()` accepted the message
37
- * onto the target's inbox, NOT that the agent has seen it — that is the
37
+ * onto the target's inbox, NOT that the agent has seen it, that is the
38
38
  * later, honest `consumed` transition (a `COMMUNICATION_CONSUMED` runtime-bus
39
39
  * event matching this badge's `messageId`). `dropped` is a TUI-side
40
40
  * inference: the SDK emits no "expired"/"cancelled" signal for a queued
41
41
  * steer, so if the target node goes terminal (done/failed/killed/
42
42
  * interrupted) while the badge is still `queued`, FleetPanel resolves it to
43
43
  * `dropped` itself rather than leaving the badge hanging forever (see
44
- * fleet-panel.ts reconcileSteerBadges — cross-WO note: the SDK engineer
44
+ * fleet-panel.ts reconcileSteerBadges, cross-WO note: the SDK engineer
45
45
  * confirmed no dropped signal exists).
46
46
  */
47
47
  export type SteerBadgeStatus = 'queued' | 'consumed' | 'dropped';
@@ -50,19 +50,19 @@ export type SteerBadgeStatus = 'queued' | 'consumed' | 'dropped';
50
50
  export interface SteerBadge {
51
51
  readonly messageId: string;
52
52
  readonly status: SteerBadgeStatus;
53
- /** Present for 'dropped' — a one-line honest explanation shown in the tab. */
53
+ /** Present for 'dropped', a one-line honest explanation shown in the tab. */
54
54
  readonly note?: string;
55
- /** epoch ms when status left 'queued' (consumed or dropped) — drives FleetPanel's linger-then-clear tick. */
55
+ /** epoch ms when status left 'queued' (consumed or dropped), drives FleetPanel's linger-then-clear tick. */
56
56
  readonly resolvedAt?: number;
57
57
  /**
58
58
  * epoch ms when status entered 'queued' (set once, at submit time). Drives
59
59
  * fleet-steer.ts's reconcileSteerBadges TTL-expiry fallback: the SDK's
60
60
  * MessageBus attaches its own STEER_TTL_MS to the underlying steer message
61
61
  * (see registry.js's steer()) but never tells the TUI when that TTL lapses
62
- * without delivery — the "agent stays healthy/non-terminal through one
62
+ * without delivery, the "agent stays healthy/non-terminal through one
63
63
  * very long tool call, and the steer simply expires unseen in the bus"
64
64
  * case. Without this, that badge would show 'queued' forever. Optional
65
- * because older/hand-built badges (tests, pre-fix data) may not carry it —
65
+ * because older/hand-built badges (tests, pre-fix data) may not carry it,
66
66
  * absence just means "no TTL-expiry inference possible for this badge",
67
67
  * not an error.
68
68
  */
@@ -73,7 +73,7 @@ export interface SteerBadge {
73
73
  * Append one character of steer-composer input to a draft, normalizing a
74
74
  * pasted multi-line block's line breaks (terminals transmit bracketed-paste
75
75
  * newlines as literal `\r`/`\n` characters delivered one at a time through
76
- * the same per-char burst pipeline as ordinary typing — see
76
+ * the same per-char burst pipeline as ordinary typing, see
77
77
  * handler-feed-routes.ts's isCapturingTextBurst contract) to a single
78
78
  * collapsed space instead of either corrupting the one-line field with a
79
79
  * raw control character or silently dropping the content. Mirrors how a
@@ -89,10 +89,10 @@ export function appendSteerText(draft: string, ch: string): string {
89
89
 
90
90
  /**
91
91
  * One attached session tab. `agentId` is the SDK attach handle for
92
- * `AgentManager.getConversationSnapshot(agentId)` — populated only for
92
+ * `AgentManager.getConversationSnapshot(agentId)`, populated only for
93
93
  * 'agent' tabs (agent.ts sets ProcessNode.id = record.id, so node.id IS the
94
94
  * agentId). 'wrfc-chain' tabs render a live member-summary instead of a
95
- * transcript (a chain has no single conversation of its own — see
95
+ * transcript (a chain has no single conversation of its own, see
96
96
  * fleet-transcript.ts renderFleetChainSummary) and carry an empty agentId,
97
97
  * unused.
98
98
  *
@@ -112,7 +112,7 @@ export interface FleetTab {
112
112
  * Cached parsed ledger fallback for a terminal agent whose conversation
113
113
  * snapshot has been evicted from the SDK's retention ring (the degraded
114
114
  * fallback path). `null` = not yet loaded/attempted; `[]` = loaded and
115
- * empty (or the load failed) — both render the same honest "no transcript"
115
+ * empty (or the load failed), both render the same honest "no transcript"
116
116
  * state once loaded is true.
117
117
  */
118
118
  ledgerEntries: Record<string, unknown>[] | null;
@@ -122,7 +122,7 @@ export interface FleetTab {
122
122
  * when not composing. Mirrors git-panel.ts's `commitMessage` mutable-slot
123
123
  * convention (FleetPanel.isCapturingTextBurst() gates on this being
124
124
  * non-null so a burst/paste lands here char-by-char, never as tree/tab
125
- * hotkeys — see FleetPanel.handleSteerInput).
125
+ * hotkeys, see FleetPanel.handleSteerInput).
126
126
  */
127
127
  steerDraft: string | null;
128
128
  /** This tab's most recent steer message's lifecycle, or null. */
@@ -172,7 +172,7 @@ export function activeFleetTab(state: FleetTabsState): FleetTab | null {
172
172
  /**
173
173
  * Attach a node as a tab (Enter on an attachable tree row). Re-focuses an
174
174
  * already-open tab for the same node instead of creating a duplicate.
175
- * Returns `state` unchanged if `node.kind` is not attachable — callers
175
+ * Returns `state` unchanged if `node.kind` is not attachable, callers
176
176
  * (FleetPanel) are expected to guard with `isAttachableFleetKind` first and
177
177
  * report a status message rather than silently doing nothing; this
178
178
  * function's own no-op fallback is defense in depth.
@@ -222,7 +222,7 @@ export function switchFleetTab(state: FleetTabsState, activeTabIndex: number): F
222
222
  return { tabs: state.tabs, activeTabIndex };
223
223
  }
224
224
 
225
- /** Move focus to the next/previous tab in the strip (wrapping is deliberately NOT applied — clamps at the ends). */
225
+ /** Move focus to the next/previous tab in the strip (wrapping is deliberately NOT applied, clamps at the ends). */
226
226
  export function stepFleetTab(state: FleetTabsState, direction: 1 | -1): FleetTabsState {
227
227
  const next = state.activeTabIndex + direction;
228
228
  return switchFleetTab(state, Math.max(0, Math.min(state.tabs.length, next)));
@@ -3,12 +3,12 @@
3
3
  //
4
4
  // Renders the content of an attached FleetPanel
5
5
  // session tab. Three sources, chosen by what the SDK can actually provide
6
- // (see the design brief's "central reality check" — a full-fidelity live
6
+ // (see the design brief's "central reality check", a full-fidelity live
7
7
  // transcript needs a ConversationMessageSnapshot[] history source, which
8
8
  // only exists for a RUNNING agent or a just-completed one still inside the
9
9
  // SDK's bounded retention ring):
10
10
  //
11
- // - 'live'/'frozen' — a non-empty ConversationMessageSnapshot[] from
11
+ // - 'live'/'frozen' , a non-empty ConversationMessageSnapshot[] from
12
12
  // AgentManager.getConversationSnapshot(agentId), rendered through the
13
13
  // EXACT SAME conversation-rendering machinery the main session surface
14
14
  // uses (MessageLineCache -> conversation-rendering.ts render functions),
@@ -16,9 +16,9 @@
16
16
  // user would see in their own session. 'live' while the agent is still
17
17
  // running, 'frozen' once it has completed but the snapshot has not yet
18
18
  // been evicted from the retention ring.
19
- // - 'unavailable' — a terminal agent whose snapshot came back empty
20
- // (evicted past the retention bound, or an agent kind — e.g. the WRFC
21
- // owner — that never registered a live conversation source at all).
19
+ // - 'unavailable' , a terminal agent whose snapshot came back empty
20
+ // (evicted past the retention bound, or an agent kind, e.g. the WRFC
21
+ // owner, that never registered a live conversation source at all).
22
22
  // FleetPanel degrades to the on-disk event ledger (renderFleetLedgerFallback)
23
23
  // for this case; this module never fabricates transcript content.
24
24
  //
@@ -45,7 +45,7 @@ import {
45
45
  } from './fleet-read-model.ts';
46
46
 
47
47
  /** Duplicated from fleet-panel.ts's private helper (same tiny mapping) rather than
48
- * cross-importing — fleet-panel.ts imports THIS module to render tab content, so
48
+ * cross-importing, fleet-panel.ts imports THIS module to render tab content, so
49
49
  * importing back would form a cycle. See fleet-panel.ts's own toneColor for the
50
50
  * canonical copy; keep both in sync if the tone set ever changes. */
51
51
  function toneColor(tone: FleetStateTone, palette: PanelPalette): string {
@@ -70,17 +70,17 @@ export interface FleetTranscriptRender {
70
70
  }
71
71
 
72
72
  /**
73
- * (design point 4) — a 'frozen' transcript is a static capture of a
73
+ * (design point 4), a 'frozen' transcript is a static capture of a
74
74
  * completed process, not something that will change on the next render. The
75
75
  * distinction matters because this wave also introduced kill/interrupt
76
76
  * display bugs (elapsed/usage briefly climbing after a terminal state
77
- * shows) — a done-section tab that looked indistinguishable from a live one
77
+ * shows), a done-section tab that looked indistinguishable from a live one
78
78
  * would misleadingly suggest the underlying agent is still doing something.
79
79
  * Shown once at the top of a 'frozen' tab's content; 'live' tabs never show
80
80
  * it, and 'unavailable' tabs get the ledger fallback's own notice instead
81
81
  * (renderFleetLedgerFallback below) rather than this one.
82
82
  */
83
- const FROZEN_TRANSCRIPT_NOTICE = 'Read-only — this agent finished; not a live view.';
83
+ const FROZEN_TRANSCRIPT_NOTICE = 'Read-only: this agent finished; not a live view.';
84
84
 
85
85
  function renderFrozenTranscriptNotice(width: number): Line[] {
86
86
  const palette = DEFAULT_PANEL_PALETTE;
@@ -93,15 +93,15 @@ function renderFrozenTranscriptNotice(width: number): Line[] {
93
93
 
94
94
  /**
95
95
  * Render an agent tab's transcript from a `ConversationMessageSnapshot[]`
96
- * already fetched by the caller (this module does no I/O of its own — it is
96
+ * already fetched by the caller (this module does no I/O of its own, it is
97
97
  * a pure renderer, same convention as fleet-read-model.ts).
98
98
  *
99
- * `isTerminal` distinguishes 'live' (the agent is still running — the
99
+ * `isTerminal` distinguishes 'live' (the agent is still running, the
100
100
  * snapshot came from the SDK's live source, so it will change on the next
101
- * render) from 'frozen' (the agent finished — the snapshot is a static final
101
+ * render) from 'frozen' (the agent finished, the snapshot is a static final
102
102
  * capture; caller is showing a completed conversation, not a live one).
103
103
  * An empty snapshot on a terminal agent means the source was never
104
- * registered or has been evicted — the caller falls back to
104
+ * registered or has been evicted, the caller falls back to
105
105
  * `renderFleetLedgerFallback`; an empty snapshot on a non-terminal agent
106
106
  * (e.g. the SDK hasn't sent a turn yet) legitimately means "no messages yet".
107
107
  */
@@ -124,7 +124,7 @@ export function renderFleetAgentTranscript(
124
124
  addLines: (lines: Line[]): void => { historyLines.push(...lines); },
125
125
  getLineCount: (): number => historyLines.length,
126
126
  };
127
- // Scratch block/collapse/error registries — collapse-toggle and block-copy
127
+ // Scratch block/collapse/error registries, collapse-toggle and block-copy
128
128
  // interactions are out of scope for this tab (a later item, per the brief's
129
129
  // "transcript browse" follow-on); this render is a read-only tail view.
130
130
  const context: ConversationRenderContext = {
@@ -147,7 +147,7 @@ export function renderFleetAgentTranscript(
147
147
  // No `&& budgetHeight > 0` guard: when the notice alone already consumes
148
148
  // the whole height budget, `historyLines.slice(historyLines.length - 0)`
149
149
  // correctly yields an empty tail (nothing fits), rather than falling
150
- // through to the full, un-sliced history — which the caller would then
150
+ // through to the full, un-sliced history, which the caller would then
151
151
  // head-clip, silently swapping in the OLDEST lines instead of the
152
152
  // most-recent tail this view promises.
153
153
  const visible = historyLines.length > budgetHeight
@@ -157,7 +157,7 @@ export function renderFleetAgentTranscript(
157
157
  }
158
158
 
159
159
  // ---------------------------------------------------------------------------
160
- // Chain summary — 'wrfc-chain' tabs have no single conversation
160
+ // Chain summary, 'wrfc-chain' tabs have no single conversation
161
161
  // ---------------------------------------------------------------------------
162
162
 
163
163
  /**
@@ -177,7 +177,7 @@ export function renderFleetChainSummary(
177
177
  const C = DEFAULT_PANEL_PALETTE;
178
178
  if (memberRows.length === 0) {
179
179
  const message = chainDoneOrAbsent
180
- ? ' chain completed — members no longer tracked'
180
+ ? ' chain completed: members no longer tracked'
181
181
  : ' (no member agents yet)';
182
182
  return [buildPanelLine(width, [[message, C.dim]])];
183
183
  }
@@ -196,13 +196,13 @@ export function renderFleetChainSummary(
196
196
  }
197
197
 
198
198
  // ---------------------------------------------------------------------------
199
- // Ledger fallback — degraded activity view for a terminal agent whose
199
+ // Ledger fallback, degraded activity view for a terminal agent whose
200
200
  // full-fidelity snapshot is unavailable (an honest fallback)
201
201
  // ---------------------------------------------------------------------------
202
202
 
203
203
  /**
204
204
  * Parse an agent's `<agentId>.jsonl` event ledger. Tolerant of malformed
205
- * lines (skipped, not thrown) — matches agent-detail-modal.ts's existing
205
+ * lines (skipped, not thrown), matches agent-detail-modal.ts's existing
206
206
  * JSONL-reading convention for the same file shape.
207
207
  */
208
208
  export function parseAgentLedger(raw: string): Record<string, unknown>[] {
@@ -231,7 +231,7 @@ function renderLedgerEntry(width: number, entry: Record<string, unknown>, palett
231
231
  const model = typeof entry['model'] === 'string' ? entry['model'] : 'unknown model';
232
232
  const provider = typeof entry['provider'] === 'string' ? entry['provider'] : 'unknown';
233
233
  return renderConversationEventLine(width, { marker: '●', markerFg: palette.dim, label: 'session', labelFg: palette.dim }, [
234
- { text: `started — ${model} (${provider})`, fg: palette.value },
234
+ { text: `started: ${model} (${provider})`, fg: palette.value },
235
235
  ]);
236
236
  }
237
237
  case 'session_config': {
@@ -258,13 +258,13 @@ function renderLedgerEntry(width: number, entry: Record<string, unknown>, palett
258
258
  const success = entry['success'] !== false;
259
259
  const bad = palette.bad ?? DEFAULT_PANEL_PALETTE.bad;
260
260
  // the writer already truncates this to 500 chars (session.ts's
261
- // resultPreview field) — passed through verbatim (collapsed to one
261
+ // resultPreview field), passed through verbatim (collapsed to one
262
262
  // line), never re-summarized or fabricated, then tail-truncated again
263
263
  // to fit the row.
264
264
  const rawPreview = typeof entry['resultPreview'] === 'string' ? entry['resultPreview'] : '';
265
265
  const preview = rawPreview.replace(/\s+/g, ' ').trim();
266
266
  const label = `${toolName}${success ? '' : ' (failed)'}`;
267
- const text = preview ? `${label} — ${preview}` : label;
267
+ const text = preview ? `${label}: ${preview}` : label;
268
268
  return renderConversationEventLine(width, {
269
269
  marker: success ? '●' : '✗',
270
270
  markerFg: success ? palette.info : bad,
@@ -288,7 +288,7 @@ function renderLedgerEntry(width: number, entry: Record<string, unknown>, palett
288
288
  // records, appended to this same JSONL ledger as
289
289
  // `{type:'knowledge_injection', turn, ...record}` (orchestrator-runner.ts).
290
290
  // Without this case these fell through to the generic 'event' default
291
- // below (just the bare type name) — this renders the honest outcome
291
+ // below (just the bare type name), this renders the honest outcome
292
292
  // (what was injected, or why nothing was) instead.
293
293
  case 'knowledge_injection': {
294
294
  const turn = typeof entry['turn'] === 'number' ? entry['turn'] : '?';
@@ -300,7 +300,7 @@ function renderLedgerEntry(width: number, entry: Record<string, unknown>, palett
300
300
  ? entry['reason']
301
301
  : 'nothing cleared the relevance floor';
302
302
  return renderConversationEventLine(width, { marker: '◇', markerFg: palette.dim, label: 'knowledge', labelFg: palette.dim }, [
303
- { text: `turn ${turn} · nothing injected — ${reason}${backendTag}`, fg: palette.dim },
303
+ { text: `turn ${turn} · nothing injected; ${reason}${backendTag}`, fg: palette.dim },
304
304
  ]);
305
305
  }
306
306
  return renderConversationEventLine(width, { marker: '◇', markerFg: palette.info, label: 'knowledge', labelFg: palette.info }, [
@@ -318,7 +318,7 @@ function renderLedgerEntry(width: number, entry: Record<string, unknown>, palett
318
318
  * Degraded activity view for a terminal agent whose full-fidelity
319
319
  * conversation snapshot is unavailable (evicted, or never registered).
320
320
  * Explicitly framed as an activity log, never presented as a transcript
321
- * replay (the ledger is a truncated event record — see session.ts /
321
+ * replay (the ledger is a truncated event record, see session.ts /
322
322
  * orchestrator-runner.ts: tool args/results are sliced to 500 chars and
323
323
  * assistant response TEXT is never written at all, only its length).
324
324
  *
@@ -336,7 +336,7 @@ export function renderFleetLedgerFallback(
336
336
  ): Line[] {
337
337
  const palette = DEFAULT_PANEL_PALETTE;
338
338
  const notice = renderConversationNotice(
339
- 'Read-only. Full transcript unavailable for this agent — showing its activity log instead.',
339
+ 'Read-only. Full transcript unavailable for this agent; showing its activity log instead.',
340
340
  width,
341
341
  { accent: palette.warn, text: palette.dim, dim: true },
342
342
  );
@@ -57,7 +57,7 @@ type ViewItem =
57
57
  | { kind: 'commit'; entry: CommitEntry }
58
58
  | { kind: 'empty'; label: string };
59
59
 
60
- /** Subject carried by the panel's single ConfirmState — either a repo init or a commit. */
60
+ /** Subject carried by the panel's single ConfirmState, either a repo init or a commit. */
61
61
  type GitConfirmSubject =
62
62
  | { kind: 'init' }
63
63
  | { kind: 'commit'; message: string };
@@ -119,7 +119,7 @@ export class GitPanel extends BasePanel {
119
119
  /** True when the last refresh failed because `workingDirectory` isn't a git repo. */
120
120
  private notGitRepo = false;
121
121
 
122
- /** Single pending confirm — either "init this repo" or "commit with this message". */
122
+ /** Single pending confirm, either "init this repo" or "commit with this message". */
123
123
  private confirm: ConfirmState<GitConfirmSubject> | null = null;
124
124
 
125
125
  /** Non-null while composing a commit message; null means the compose UI is closed. */
@@ -211,12 +211,12 @@ export class GitPanel extends BasePanel {
211
211
  this.error = null;
212
212
  this.notGitRepo = false;
213
213
  this.rebuildItems();
214
- // Do not clear expandedDiff during auto-refresh — only clear on explicit user action
214
+ // Do not clear expandedDiff during auto-refresh, only clear on explicit user action
215
215
  this._markDirtyAndRender();
216
216
  } catch (err) {
217
217
  const msg = summarizeError(err);
218
218
  if (/not a git\b/i.test(msg)) {
219
- // I4: no more auto `git init` side effect — surface the state and let
219
+ // I4: no more auto `git init` side effect, surface the state and let
220
220
  // the user explicitly confirm initialisation with 'i'.
221
221
  this.notGitRepo = true;
222
222
  this.error = 'Not a git repository here. Press i to initialize one (explicit confirm).';
@@ -276,7 +276,7 @@ export class GitPanel extends BasePanel {
276
276
 
277
277
  // Input handling
278
278
 
279
- /** Commit-message entry wants every char of a burst delivered one at a time — see Panel.isCapturingTextBurst. */
279
+ /** Commit-message entry wants every char of a burst delivered one at a time, see Panel.isCapturingTextBurst. */
280
280
  isCapturingTextBurst(): boolean {
281
281
  return this.commitMessage !== null;
282
282
  }
@@ -346,7 +346,7 @@ export class GitPanel extends BasePanel {
346
346
  return true;
347
347
  }
348
348
  case 'i': {
349
- // Only meaningful when no repo is loaded — otherwise leave the key
349
+ // Only meaningful when no repo is loaded, otherwise leave the key
350
350
  // unconsumed instead of absorbing it as a silent no-op.
351
351
  if (!this.notGitRepo) return false;
352
352
  this.confirm = { subject: { kind: 'init' }, label: this.workingDirectory, verb: 'Init' };
@@ -437,7 +437,7 @@ export class GitPanel extends BasePanel {
437
437
  }
438
438
 
439
439
  if (item.kind === 'commit') {
440
- // Root commits have no parent (`<hash>^` is invalid) — the catch below
440
+ // Root commits have no parent (`<hash>^` is invalid), the catch below
441
441
  // surfaces that instead of pretending a diff exists.
442
442
  const before = `${item.entry.hash}^`;
443
443
  const after = item.entry.hash;
@@ -543,7 +543,7 @@ export class GitPanel extends BasePanel {
543
543
  buildKeyboardHints(width, [{ keys: 'Enter', label: 'review & confirm' }, { keys: 'Esc', label: 'cancel' }], DEFAULT_PANEL_PALETTE),
544
544
  ];
545
545
  return buildPanelWorkspace(width, height, {
546
- title: ' Git — Commit',
546
+ title: ' Git: Commit',
547
547
  sections: [{ title: 'Message', lines: [inputLine] }],
548
548
  footerLines,
549
549
  palette: DEFAULT_PANEL_PALETTE,