@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
@@ -33,11 +33,11 @@ export interface ConfigModalRenderRow {
33
33
  readonly selected: boolean;
34
34
  readonly selectable: boolean;
35
35
  /** True when this frozen row has no live counterpart this tick (value went
36
- * stale — kept in place, dimmed, until the next interaction boundary). */
36
+ * stale, kept in place, dimmed, until the next interaction boundary). */
37
37
  readonly stale: boolean;
38
38
  }
39
39
 
40
- /** Everything renderConfigModal needs — computed by overlaying live values onto
40
+ /** Everything renderConfigModal needs, computed by overlaying live values onto
41
41
  * the frozen structure so layout stays stable between key presses. */
42
42
  export interface ConfigModalRenderModel {
43
43
  readonly title: string;
@@ -60,7 +60,7 @@ const DEFAULT_VISIBLE_ROWS = 10;
60
60
  * minus the 4-column text margin and 2-column selection indicator (see
61
61
  * ModalFactory._renderListSection's `contentW - 2`). renderConfigModal()
62
62
  * itself always computes and passes the ACTUAL width for the current
63
- * terminal size — this constant only matters when getRenderModel() is
63
+ * terminal size, this constant only matters when getRenderModel() is
64
64
  * called directly without going through the renderer.
65
65
  */
66
66
  const DEFAULT_LABEL_WRAP_WIDTH = 70;
@@ -68,16 +68,16 @@ const DEFAULT_LABEL_WRAP_WIDTH = 70;
68
68
  /**
69
69
  * Stable id for the synthesized "no matches" row item 1 injects when a
70
70
  * filter query excludes every selectable row in a tab. Non-selectable (info
71
- * rows are never filtered — see ConfigModal's filter doc) so this id can
71
+ * rows are never filtered, see ConfigModal's filter doc) so this id can
72
72
  * never collide with a real surface row id.
73
73
  */
74
74
  const FILTER_NO_MATCH_ROW_ID = '__config_modal_filter_no_match__';
75
75
 
76
76
  /**
77
- * ConfigModal — the single, generic, named config-modal host. One instance
77
+ * ConfigModal, the single, generic, named config-modal host. One instance
78
78
  * lives on the InputHandler (like `settingsModal`); it renders whatever
79
79
  * `ConfigModalSurface` is currently open. Key routing is a single
80
- * `handleConfigModalToken` path (handler-modal-routes.ts) — no parallel input
80
+ * `handleConfigModalToken` path (handler-modal-routes.ts), no parallel input
81
81
  * system. See config-modal-types.ts for the surface contract and the liveness
82
82
  * doctrine this class enforces.
83
83
  */
@@ -97,28 +97,28 @@ export class ConfigModal {
97
97
  private pendingConfirmKey: string | null = null;
98
98
 
99
99
  /**
100
- * item 1 — the host's own type-to-filter, armed with '/' (matching
100
+ * item 1, the host's own type-to-filter, armed with '/' (matching
101
101
  * the pre-existing "'/' to filter" convention: scrollable-list-panel.ts's
102
102
  * opt-in filter, and SettingsModal's own '/'-armed search). `filterActive`
103
103
  * gates whether printable keys go to the query instead of nav/actions;
104
104
  * `filterQuery` is the TEXT-CAPTURE buffer itself (a multi-char paste token
105
- * appends in one shot — see handleConfigModalToken). Filtering only ever
105
+ * appends in one shot, see handleConfigModalToken). Filtering only ever
106
106
  * narrows the ACTIVE tab's rows and is reset on tab switch (a query typed
107
107
  * against one tab's rows has no defined meaning against another's).
108
108
  *
109
- * FILTER-CONVENTION RULING (batch integration — where '/'-armed vs instant
109
+ * FILTER-CONVENTION RULING (batch integration, where '/'-armed vs instant
110
110
  * filtering is decided across the TUI's list UIs):
111
111
  * - '/'-ARMED here (config-modal host surfaces): these surfaces bind PLAIN
112
112
  * single keys to ACTION HOTKEYS (e.g. 'r' refresh, 'd' delete). A key
113
113
  * can't be both an action and a filter character, so filtering must be
114
114
  * explicitly armed with '/' first. This is a deliberate design choice.
115
- * - INSTANT filtering (pure pickers — help overlay, command palette,
115
+ * - INSTANT filtering (pure pickers, help overlay, command palette,
116
116
  * selection-modal): these have no single-key actions, so every printable
117
117
  * key is unambiguously a filter character and narrows the list on the
118
118
  * first keystroke. This is a deliberate design choice (selection-modal-overlay.ts).
119
119
  * - Both keep single-Esc-close semantics. The only extra step is here: a
120
120
  * two-stage Esc (first Esc clears a NON-EMPTY query, second Esc closes)
121
- * — see the Esc branch in handleConfigModalToken. With an empty query,
121
+ * , see the Esc branch in handleConfigModalToken. With an empty query,
122
122
  * one Esc closes, exactly like the instant pickers.
123
123
  */
124
124
  private filterActive = false;
@@ -201,8 +201,8 @@ export class ConfigModal {
201
201
 
202
202
  /**
203
203
  * Re-capture the structure from the current live view. Called on every key
204
- * press (never during a pure render tick — with one exception: before the
205
- * FIRST interaction, getRenderModel syncs so async loads paint) — this is
204
+ * press (never during a pure render tick, with one exception: before the
205
+ * FIRST interaction, getRenderModel syncs so async loads paint), this is
206
206
  * what makes structural changes appear only at an interaction boundary.
207
207
  * Selection + active tab are preserved by id and clamped if their target
208
208
  * vanished.
@@ -221,7 +221,7 @@ export class ConfigModal {
221
221
  this._clampScroll();
222
222
  }
223
223
 
224
- // ── Filter (item 1 — each mutation is an interaction boundary) ──────
224
+ // ── Filter (item 1, each mutation is an interaction boundary) ──────
225
225
 
226
226
  isFilterActive(): boolean {
227
227
  return this.filterActive;
@@ -240,7 +240,7 @@ export class ConfigModal {
240
240
  }
241
241
 
242
242
  /**
243
- * Append text to the query — the WHOLE token value in one call, so a
243
+ * Append text to the query, the WHOLE token value in one call, so a
244
244
  * multi-char paste token lands in the filter atomically rather than being
245
245
  * split into per-char nav/action dispatch (the text-capture invariant this
246
246
  * item's brief calls out). A no-op when the filter isn't armed.
@@ -261,7 +261,7 @@ export class ConfigModal {
261
261
  * Esc while filtering: a non-empty query is CLEARED (stays armed, ready to
262
262
  * retype without pressing '/' again) and this returns true so the caller
263
263
  * (handleConfigModalToken) stops here instead of closing the modal. An
264
- * empty query returns false — the caller falls through to the ordinary
264
+ * empty query returns false, the caller falls through to the ordinary
265
265
  * close path, preserving single-Esc-close for the no-filter case (the one
266
266
  * documented exception: two-stage Esc only when there is something to
267
267
  * clear).
@@ -305,7 +305,7 @@ export class ConfigModal {
305
305
 
306
306
  private _switchTab(dir: 1 | -1): void {
307
307
  this._clearConfirm();
308
- // A filter query is scoped to the tab it was typed against — switching
308
+ // A filter query is scoped to the tab it was typed against, switching
309
309
  // tabs resets it (item 1), same as statusMessage below.
310
310
  this.filterActive = false;
311
311
  this.filterQuery = '';
@@ -367,7 +367,7 @@ export class ConfigModal {
367
367
 
368
368
  /**
369
369
  * In-surface "jump": switch the active tab (by id) and select a specific
370
- * row (by id) within it — the mechanism a surface's own action handler
370
+ * row (by id) within it, the mechanism a surface's own action handler
371
371
  * uses to move the user from one tab to a specific row in another (e.g.
372
372
  * the Memory modal's Proposals tab jumping to an affected record in the
373
373
  * Review Queue tab). An interaction boundary (re-syncs structure first,
@@ -414,20 +414,20 @@ export class ConfigModal {
414
414
  }
415
415
 
416
416
  /**
417
- * Compute the render model: frozen structure + live value overlay. Pure —
417
+ * Compute the render model: frozen structure + live value overlay. Pure,
418
418
  * does NOT sync structure, so calling it repeatedly with only value mutations
419
419
  * yields byte-identical layout (the liveness contract).
420
420
  *
421
421
  * `labelWrapWidth` is the wrap column ModalFactory's list section will use
422
422
  * for row labels (renderConfigModal computes and passes the real one for
423
423
  * the current terminal size). It exists so the wrap-clamp below (* item 2) can pre-empt a live label growing past ModalFactory's wrap width
424
- * mid-tick — a structural change (an extra visible line) without an
425
- * interaction — by measuring wrapped line counts here, before the label
424
+ * mid-tick, a structural change (an extra visible line) without an
425
+ * interaction, by measuring wrapped line counts here, before the label
426
426
  * ever reaches the renderer.
427
427
  */
428
428
  getRenderModel(labelWrapWidth: number = DEFAULT_LABEL_WRAP_WIDTH): ConfigModalRenderModel {
429
429
  // Pre-first-interaction: async onOpen loads may restructure freely (the
430
- // user hasn't engaged a cursor yet) — sync so "Loading…" is replaced by
430
+ // user hasn't engaged a cursor yet), sync so "Loading…" is replaced by
431
431
  // real content on the load's own requestRender, not the next keypress.
432
432
  if (this.active && !this.interactedSinceOpen) this.syncStructure();
433
433
  const live = this.surface?.buildView() ?? null;
@@ -471,7 +471,7 @@ export class ConfigModal {
471
471
 
472
472
  // item 1: while filtering, the surface's own action/tab hints are
473
473
  // unreliable (their printable-letter keys are captured by the filter
474
- // instead of firing — see handleConfigModalToken), so the footer swaps
474
+ // instead of firing, see handleConfigModalToken), so the footer swaps
475
475
  // to just the filter status (query + a truthful match count) and the
476
476
  // Esc contract for this mode. See getFilterQuery/isFilterActive callers.
477
477
  const filtering = this.filterActive;
@@ -512,7 +512,7 @@ export class ConfigModal {
512
512
  * `frozenLabel` is what the row wrapped to when the structure was captured
513
513
  * (open/nav/filter keystroke); `liveLabel` is this tick's value. If the
514
514
  * live label would wrap into MORE lines than the frozen one, that is a
515
- * structural change (an extra visible row) happening without a keypress —
515
+ * structural change (an extra visible row) happening without a keypress,
516
516
  * exactly the hazard this closes. Clamp to the frozen line count, ellipsis
517
517
  * on the last line to signal truncation; a live label that wraps to the
518
518
  * SAME or FEWER lines passes through untouched (not the documented hazard).
@@ -532,20 +532,20 @@ export class ConfigModal {
532
532
 
533
533
  /**
534
534
  * Modal sizing rule (owner, zero tolerance: a modal/list must never clip
535
- * its full descriptive text — size to content or scroll, never clip).
535
+ * its full descriptive text, size to content or scroll, never clip).
536
536
  * `scrollOffset`/`visible` are ROW-count based, which is exactly right when
537
- * every row wraps to one line — but ModalFactory renders each row's WRAPPED
537
+ * every row wraps to one line, but ModalFactory renders each row's WRAPPED
538
538
  * lines and then bounds the whole section to a fixed content-row budget
539
539
  * computed from `visible` (see renderConfigModal's targetContentRows). A
540
540
  * row whose label wraps to MULTIPLE lines can therefore push the total past
541
541
  * that budget, and the LAST row handed to the renderer gets cut off
542
- * mid-line instead of being deferred to the next scroll page — the
542
+ * mid-line instead of being deferred to the next scroll page, the
543
543
  * clipping hazard this closes.
544
544
  *
545
545
  * Windows `rows` starting at `scrollOffset`, greedily including whole rows
546
546
  * while their CUMULATIVE wrapped-line count (at `wrapWidth`) stays within
547
547
  * the `visible` line budget. Always includes at least the first candidate
548
- * row so the view is never empty — a single row that alone exceeds the
548
+ * row so the view is never empty, a single row that alone exceeds the
549
549
  * budget is shown in full rather than replaced with nothing; only a
550
550
  * SUBSEQUENT row that would overflow is deferred to scrolling instead of
551
551
  * being rendered partially.
@@ -572,7 +572,7 @@ export class ConfigModal {
572
572
  private _filterStatusHint(matched: number, total: number): string {
573
573
  const q = this.filterQuery;
574
574
  if (q.length === 0) return `/ type to filter (${total} row${total === 1 ? '' : 's'})`;
575
- return `/${q} — ${matched} of ${total} match${matched === 1 ? '' : 'es'}`;
575
+ return `/${q}: ${matched} of ${total} match${matched === 1 ? '' : 'es'}`;
576
576
  }
577
577
 
578
578
  /** Apply the active filter query to every tab's rows. A no-op passthrough when not filtering. */
@@ -585,7 +585,7 @@ export class ConfigModal {
585
585
  /**
586
586
  * Narrow one tab's rows to those matching `query` (case-insensitive
587
587
  * substring on the label). Non-selectable rows (section titles, honest
588
- * empty-state copy, warning banners) always pass through unfiltered —
588
+ * empty-state copy, warning banners) always pass through unfiltered,
589
589
  * they're context, not data. When the query excludes every selectable row
590
590
  * but the tab genuinely had some, append the honest "no rows match" line
591
591
  * (item 1's empty-result case) instead of silently showing nothing
@@ -1,11 +1,11 @@
1
1
  /**
2
- * daemon-owned-settings-descriptions.ts — appends an honest storage-location
2
+ * daemon-owned-settings-descriptions.ts, appends an honest storage-location
3
3
  * note to any settings-modal entry whose config key is daemon-owned (see
4
4
  * `@pellux/goodvibes-sdk/platform/config`'s `isDaemonOwnedConfigKey`).
5
5
  *
6
6
  * Before the daemon-owned-config migration, every product wrote every key
7
7
  * into its own per-surface silo, and a value like `surfaces.telegram.token`
8
- * looked — from the settings modal — exactly like any other TUI-local
8
+ * looked, from the settings modal, exactly like any other TUI-local
9
9
  * setting. It never was: the daemon is the only process that reads it, so a
10
10
  * value the TUI wrote to its own surface file could silently do nothing.
11
11
  * This enrichment tells the truth in the one place a user checks: the
@@ -25,8 +25,8 @@ import type { SettingEntry, SettingsCategory } from './settings-modal-types.ts';
25
25
  /** Build the daemon-owned disclosure note for a given daemon store path. */
26
26
  export function daemonOwnedSettingNote(daemonTierPath: string | null): string {
27
27
  return daemonTierPath
28
- ? `This value is stored in the daemon's own configuration (${daemonTierPath}) and applies to every client — not just this one.`
29
- : "This value is stored in the daemon's own configuration and applies to every client — not just this one.";
28
+ ? `This value is stored in the daemon's own configuration (${daemonTierPath}) and applies to every client; not just this one.`
29
+ : "This value is stored in the daemon's own configuration and applies to every client; not just this one.";
30
30
  }
31
31
 
32
32
  /**
@@ -1,5 +1,5 @@
1
1
  // ---------------------------------------------------------------------------
2
- // Delete-key policy — single source of truth for text-editing key semantics
2
+ // Delete-key policy, single source of truth for text-editing key semantics
3
3
  //
4
4
  // In text-editing contexts:
5
5
  // 'backspace' → delete one character backward (the character before cursor /
@@ -1,5 +1,5 @@
1
1
  /**
2
- * exec-env-scrub-config.ts — TUI-local synthetic settings entry for
2
+ * exec-env-scrub-config.ts, TUI-local synthetic settings entry for
3
3
  * permissions.execEnvScrubAllowlist.
4
4
  *
5
5
  * The SDK's credential-bearing env-var scrub (platform/tools/exec/credential-env.ts)
@@ -8,24 +8,24 @@
8
8
  * exec command, and is threaded into `registerAllTools`'s `credentialEnvScrub`
9
9
  * option (bootstrap-core.ts) so a consumer can wire an operator-configured
10
10
  * allowlist instead of the scrub always resolving to its built-in default. The
11
- * scrub's master switch stays on: this entry configures ONLY the allowlist —
11
+ * scrub's master switch stays on: this entry configures ONLY the allowlist,
12
12
  * variable NAMES always kept even though their name looks credential-bearing
13
13
  * (case-insensitive), for a command that genuinely needs one (e.g. a CI runner
14
14
  * re-reading its own signing key). NEVER a value; the scrub only ever inspects
15
15
  * and reports NAMES.
16
16
  *
17
- * `permissions.execEnvScrubAllowlist` is not in CONFIG_SCHEMA — there is no SDK
17
+ * `permissions.execEnvScrubAllowlist` is not in CONFIG_SCHEMA, there is no SDK
18
18
  * config domain for the exec env scrub at all (it is consumer-wired, not
19
19
  * schema-registered), so this mirrors the other TUI-local synthetic settings
20
20
  * (worktree.setup.*, sandbox.egressAllowlist, …). No defensive try/catch is
21
21
  * needed: 'permissions' already exists as a DEFAULT_CONFIG section (it backs
22
22
  * permissions.mode/tools.*), so a plain get()/set() resolves the path without
23
- * throwing — only the LEAF field is new, and ConfigManager.resolvePath never
23
+ * throwing, only the LEAF field is new, and ConfigManager.resolvePath never
24
24
  * validates leaf existence.
25
25
  *
26
26
  * Stored as a JSON array of strings on disk; the settings modal's inline
27
- * editor is a single-line text field, so — matching worktree.setup.* and
28
- * sandbox.egressAllowlist/workspaceWritable — it is displayed and edited as a
27
+ * editor is a single-line text field, so, matching worktree.setup.* and
28
+ * sandbox.egressAllowlist/workspaceWritable, it is displayed and edited as a
29
29
  * comma-separated list and parsed back into an array on commit (see
30
30
  * isExecEnvScrubAllowlistConfigKey's use in settings-modal.ts#commitEdit).
31
31
  */
@@ -55,7 +55,7 @@ export const EXEC_ENV_SCRUB_ALLOWLIST_SYNTHETIC_SETTING: ConfigSetting = {
55
55
  key: EXEC_ENV_SCRUB_ALLOWLIST_CONFIG_KEY,
56
56
  type: 'string',
57
57
  default: [],
58
- description: 'Comma-separated environment variable NAMES always kept in a spawned exec command\'s environment even when the name looks credential-bearing (case-insensitive). Names only — this never inspects or reports values. The scrub itself stays on; this only widens what it lets through. Empty = the built-in credential-name scrub applies with no extra exceptions.',
58
+ description: 'Comma-separated environment variable NAMES always kept in a spawned exec command\'s environment even when the name looks credential-bearing (case-insensitive). Names only: this never inspects or reports values. The scrub itself stays on; this only widens what it lets through. Empty = the built-in credential-name scrub applies with no extra exceptions.',
59
59
  };
60
60
 
61
61
  /** Build the synthetic SettingEntry for permissions.execEnvScrubAllowlist. */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * feature-unit-layout — every platform capability renders as a feature UNIT in
2
+ * feature-unit-layout, every platform capability renders as a feature UNIT in
3
3
  * its settings DOMAIN: the feature's real enablement row (its domain settings
4
4
  * key, with the feature's name and full description attached) immediately
5
5
  * followed by the settings keys that tune it.
@@ -12,7 +12,7 @@
12
12
  * configures the feature.
13
13
  *
14
14
  * A feature-unit header is the REAL config row for the feature's enablement
15
- * key — boolean headers toggle, enum headers cycle their mode choices through
15
+ * key, boolean headers toggle, enum headers cycle their mode choices through
16
16
  * the ordinary settings interactions. Two features can share one enablement
17
17
  * key (e.g. behavior.compactionStrategy drives both compaction features);
18
18
  * each still gets its own header row so every capability keeps its own name,
@@ -25,7 +25,7 @@ import type { ConfigSetting } from '@pellux/goodvibes-sdk/platform/config';
25
25
  import { getConfigSchemaSetting } from '@pellux/goodvibes-terminal-shell';
26
26
  import type { FlagEntry, SettingEntry, SettingsCategory } from './settings-modal-types.ts';
27
27
 
28
- /** Every enablement key — these rows render as feature headers, never as plain sub-rows. */
28
+ /** Every enablement key, these rows render as feature headers, never as plain sub-rows. */
29
29
  const ENABLEMENT_KEYS: ReadonlySet<string> = new Set(
30
30
  FEATURE_SETTINGS.map((feature) => feature.enablement.key),
31
31
  );
@@ -41,7 +41,7 @@ export function getFeatureUnitHostCategory(featureId: string): SettingsCategory
41
41
 
42
42
  /**
43
43
  * Map every non-enablement settings key claimed by any feature to the feature
44
- * that OWNS it — the first feature (in FEATURE_SETTINGS declaration order)
44
+ * that OWNS it, the first feature (in FEATURE_SETTINGS declaration order)
45
45
  * whose settings list contains it. A key claimed by two features is listed
46
46
  * once, under its owner, so no settings key double-lists across feature units.
47
47
  */
@@ -60,7 +60,7 @@ export function buildConfigKeyOwnership(): Map<string, string> {
60
60
  * Build a feature unit's header row: the REAL config row for the feature's
61
61
  * enablement key (so booleans toggle and enums cycle their mode choices
62
62
  * through the ordinary settings paths), cloned with the feature attached.
63
- * When the category has no row for the key (it should always have one — every
63
+ * When the category has no row for the key (it should always have one, every
64
64
  * binding key is CONFIG_SCHEMA-registered), the schema descriptor is used
65
65
  * directly so the header still renders honestly.
66
66
  */
@@ -1,13 +1,13 @@
1
1
  /**
2
- * feed-context-factory.ts — Construction and mutable-field sync for InputFeedContext.
2
+ * feed-context-factory.ts, Construction and mutable-field sync for InputFeedContext.
3
3
  *
4
4
  * Extracted from handler.ts (review follow-up, 0.18.23) to keep handler.ts under the
5
5
  * 800-line architecture cap.
6
6
  *
7
7
  * Two exported functions:
8
- * - `buildInitialFeedContext` — assembles the long-lived InputFeedContext from
8
+ * - `buildInitialFeedContext`, assembles the long-lived InputFeedContext from
9
9
  * pre-built field groups. Called once at InputHandler construction time.
10
- * - `syncFeedContextMutableFields` — copies mutable scalar fields into the
10
+ * - `syncFeedContextMutableFields`, copies mutable scalar fields into the
11
11
  * already-allocated context before each feed() dispatch.
12
12
  */
13
13
  import type { InputFeedContext } from './handler-feed.ts';
@@ -46,14 +46,14 @@ import type { PanelBurstGuardState } from './panel-paste-flood-guard.ts';
46
46
  *
47
47
  * **Mutable fields** (synced per-feed via syncFeedContextMutableFields or inside
48
48
  * action closures that call syncFeedContextMutableFields):
49
- * - `prompt`, `cursorPos` — current text buffer state
50
- * - `commandMode`, `panelFocused`, `indicatorFocused` — focus-mode flags
51
- * - `helpOverlayActive`, `helpScrollOffset` — help overlay state
52
- * - `shortcutsOverlayActive`, `shortcutsScrollOffset` — shortcuts overlay state
53
- * - `nextPasteId`, `nextImageId` — monotonically increasing ID counters
54
- * - `mouseDownRow`, `mouseDownCol` — drag-tracking coordinates
55
- * - `contentWidth` — reflow width, updated by setContentWidth()
56
- * - `selectionCallback` — current selection modal callback (nullable)
49
+ * - `prompt`, `cursorPos`, current text buffer state
50
+ * - `commandMode`, `panelFocused`, `indicatorFocused`, focus-mode flags
51
+ * - `helpOverlayActive`, `helpScrollOffset`, help overlay state
52
+ * - `shortcutsOverlayActive`, `shortcutsScrollOffset`, shortcuts overlay state
53
+ * - `nextPasteId`, `nextImageId`, monotonically increasing ID counters
54
+ * - `mouseDownRow`, `mouseDownCol`, drag-tracking coordinates
55
+ * - `contentWidth`, reflow width, updated by setContentWidth()
56
+ * - `selectionCallback`, current selection modal callback (nullable)
57
57
  */
58
58
  export interface FeedContextMutableInit {
59
59
  prompt: string;
@@ -79,18 +79,18 @@ export interface FeedContextMutableInit {
79
79
  * Stable (readonly) service references for InputFeedContext.
80
80
  *
81
81
  * **Stable references** (set once at construction, never reallocated):
82
- * - `pasteRegistry`, `imageRegistry` — owned Maps, never replaced
82
+ * - `pasteRegistry`, `imageRegistry`, owned Maps, never replaced
83
83
  * - `selectionModal`, `bookmarkModal`, `settingsModal`, `sessionPickerModal`,
84
- * `profilePickerModal` — modal objects constructed once
84
+ * `profilePickerModal`, modal objects constructed once
85
85
  * - `filePicker`, `modelPicker`, `contextInspectorModal`, `blockActionsMenu`,
86
- * `searchManager`, `historySearch`, `onboardingWizard` — service objects constructed once
87
- * - `panelManager`, `keybindingsManager` — from uiServices, stable
88
- * - `modalStack` — reference to the handler's shared array
89
- * - `getHistory`, `getViewportHeight`, `getScrollTop`, `scroll`, `exitApp` — callbacks
86
+ * `searchManager`, `historySearch`, `onboardingWizard`, service objects constructed once
87
+ * - `panelManager`, `keybindingsManager`, from uiServices, stable
88
+ * - `modalStack`, reference to the handler's shared array
89
+ * - `getHistory`, `getViewportHeight`, `getScrollTop`, `scroll`, `exitApp`, callbacks
90
90
  * - `commandRegistry`, `commandContext`, `autocomplete`, `inputHistory`,
91
- * `conversationManager` — wired after construction; synced at feed() entry only
91
+ * `conversationManager`, wired after construction; synced at feed() entry only
92
92
  * (not per-action) since no in-feed action changes them
93
- * - `focusTracker` — shared instance from uiServices.platform, mutated
93
+ * - `focusTracker`, shared instance from uiServices.platform, mutated
94
94
  * directly by feedInputTokens() on 'focus' tokens; never reallocated
95
95
  *
96
96
  * **Rationale:** per-feed mutation on a single object avoids per-keystroke GC pressure
@@ -126,7 +126,7 @@ export interface FeedContextStableRefs {
126
126
  keybindingsManager: KeybindingsManager;
127
127
  killRing: KillRing;
128
128
  focusTracker: FocusTracker;
129
- /** item 5 — paste-flood guard state, mutated in place (never reallocated). */
129
+ /** item 5, paste-flood guard state, mutated in place (never reallocated). */
130
130
  panelBurstGuard: PanelBurstGuardState;
131
131
  getHistory: () => InfiniteBuffer;
132
132
  getViewportHeight: () => number;
@@ -176,12 +176,12 @@ export interface FeedContextClosures {
176
176
  }
177
177
 
178
178
  /**
179
- * buildInitialFeedContext — Allocate the single InputFeedContext that lives for the
179
+ * buildInitialFeedContext, Allocate the single InputFeedContext that lives for the
180
180
  * lifetime of the InputHandler.
181
181
  *
182
182
  * Accepts pre-built field groups from handler.ts where private access is available.
183
183
  * The resulting context object is mutated in place on every feed() call via
184
- * syncFeedContextMutableFields — no re-allocation occurs per keystroke.
184
+ * syncFeedContextMutableFields, no re-allocation occurs per keystroke.
185
185
  *
186
186
  * @param mutable Initial mutable scalar values (synced per-feed).
187
187
  * @param stable Stable service references (set once, never replaced).
@@ -206,31 +206,31 @@ export function buildInitialFeedContext(
206
206
  }
207
207
 
208
208
  /**
209
- * syncFeedContextMutableFields — Copy mutable scalar fields into the reused
209
+ * syncFeedContextMutableFields, Copy mutable scalar fields into the reused
210
210
  * InputFeedContext object.
211
211
  *
212
212
  * **Fields synced (updated on every call):**
213
- * - `prompt` — current prompt text buffer
214
- * - `cursorPos` — caret position within prompt
215
- * - `commandMode` — whether command-mode prefix is active
216
- * - `panelFocused` — whether the active panel owns keyboard focus
217
- * - `indicatorFocused` — whether the status indicator owns focus
218
- * - `helpOverlayActive` / `helpScrollOffset` — help overlay visibility and scroll
219
- * - `shortcutsOverlayActive` / `shortcutsScrollOffset` — shortcuts overlay state
220
- * - `selectionCallback` — the current in-flight selection modal callback
221
- * - `nextPasteId` / `nextImageId` — monotonically increasing allocation counters
222
- * - `mouseDownRow` / `mouseDownCol` — drag-start coordinates
213
+ * - `prompt`, current prompt text buffer
214
+ * - `cursorPos`, caret position within prompt
215
+ * - `commandMode`, whether command-mode prefix is active
216
+ * - `panelFocused`, whether the active panel owns keyboard focus
217
+ * - `indicatorFocused`, whether the status indicator owns focus
218
+ * - `helpOverlayActive` / `helpScrollOffset`, help overlay visibility and scroll
219
+ * - `shortcutsOverlayActive` / `shortcutsScrollOffset`, shortcuts overlay state
220
+ * - `selectionCallback`, the current in-flight selection modal callback
221
+ * - `nextPasteId` / `nextImageId`, monotonically increasing allocation counters
222
+ * - `mouseDownRow` / `mouseDownCol`, drag-start coordinates
223
223
  *
224
224
  * **Fields intentionally excluded (synced only at feed() entry, not here):**
225
- * - `contentWidth` — semi-stable; only changes on terminal resize via setContentWidth().
225
+ * - `contentWidth`, semi-stable; only changes on terminal resize via setContentWidth().
226
226
  * Synced at feed() entry because it is only relevant for layout, not action-reaction
227
227
  * sequences within a single feed.
228
- * - `commandRegistry`, `commandContext` — wired after construction via
228
+ * - `commandRegistry`, `commandContext`, wired after construction via
229
229
  * setCommandRegistry(); synced at feed() entry since no in-feed action changes them.
230
- * - `autocomplete` — wired after construction; synced at feed() entry.
231
- * - `inputHistory`, `conversationManager` — late-wired service handles; stable within
230
+ * - `autocomplete`, wired after construction; synced at feed() entry.
231
+ * - `inputHistory`, `conversationManager`, late-wired service handles; stable within
232
232
  * a feed. Synced at feed() entry only.
233
- * - `requestRender` — swapped to a buffered version at feed() entry and restored in
233
+ * - `requestRender`, swapped to a buffered version at feed() entry and restored in
234
234
  * the finally block; not managed by this function.
235
235
  *
236
236
  * Called from within action closures (`handleEscape`, `handleCtrlC`, `handleUndo`,
@@ -15,7 +15,7 @@ export class FilePickerModal {
15
15
  public searchFocused = true;
16
16
  public results: string[] = [];
17
17
  public selectedIndex = 0;
18
- /** Position in the prompt where @ was typed — used to replace @query with the selected path */
18
+ /** Position in the prompt where @ was typed, used to replace @query with the selected path */
19
19
  public insertPos = 0;
20
20
  /** When true, selected file inserts as !@path (inject mode) instead of @path */
21
21
  public injectMode = false;
@@ -121,7 +121,7 @@ export function handleCommandModeToken(state: CommandModeRouteState, token: Inpu
121
121
  // Defense in depth for EVERY command, not just the ones that
122
122
  // already guard their own internals: a handler that throws or
123
123
  // awaits a rejected promise must never become a silent unhandled
124
- // rejection — it renders the same way an unknown command does.
124
+ // rejection, it renders the same way an unknown command does.
125
125
  state.conversationManager?.log(`Command /${name} failed: ${summarizeError(err)}`, { fg: '#ef4444' });
126
126
  state.requestRender();
127
127
  });
@@ -149,7 +149,7 @@ function withPanelFocusSync(context: CommandContext, state: CommandModeRouteStat
149
149
  showPanel: context.showPanel
150
150
  ? (panelId, pane, target, opts) => {
151
151
  context.showPanel?.(panelId, pane, target, opts);
152
- // showPanel no longer transfers focus by default — the command
152
+ // showPanel no longer transfers focus by default, the command
153
153
  // path leaves the composer focused (ui-openers.ts's showPanel only
154
154
  // calls focusPanels() when opts.focus is set). Only flip the local
155
155
  // panelFocused mirror when the caller explicitly asked for focus;
@@ -123,7 +123,7 @@ export function registerPaste(
123
123
 
124
124
  // Terminals transmit the line breaks inside a bracketed paste as \r (the
125
125
  // byte Enter sends), and external clipboards can carry \r\n. Normalize to
126
- // \n only here in the text branch — the image sniffing above must see the
126
+ // \n only here in the text branch, the image sniffing above must see the
127
127
  // raw bytes (PNG's magic sequence itself contains \r\n).
128
128
  const text = content.replace(/\r\n?/g, '\n');
129
129
  const lines = text.split('\n');
@@ -246,7 +246,7 @@ export function findMarkerAtPos(prompt: string, pos: number): { start: number; e
246
246
  /**
247
247
  * describeBlockForReceipt - Honest, human-readable name for a block, used by
248
248
  * every anchor-based action's receipt (Ctrl+Y/B/S/A, Tab, block-actions menu)
249
- * so the transcript always says exactly what was acted on — never just an
249
+ * so the transcript always says exactly what was acted on, never just an
250
250
  * internal collapseKey or a bare "done".
251
251
  */
252
252
  export function describeBlockForReceipt(block: BlockMeta): string {
@@ -286,7 +286,7 @@ export function handleCopy(
286
286
  * handleBlockCopy - Ctrl+Y: copy the content of the block the user is
287
287
  * actually looking at. `getAnchorLine` resolves to the viewport's
288
288
  * bottom-most visible line (see getViewportBottomLine in
289
- * conversation-layout.ts), not the raw scroll position — the top of the
289
+ * conversation-layout.ts), not the raw scroll position, the top of the
290
290
  * viewport is off-screen-above once the transcript is longer than one page.
291
291
  */
292
292
  export function handleBlockCopy(
@@ -306,7 +306,7 @@ export function handleBlockCopy(
306
306
  copyToClipboard(nearest.rawContent);
307
307
  onCopied();
308
308
  // An explicit action on this block permanently exempts it from the
309
- // search-close auto-re-collapse (see ConversationManager.noteUserTouch) —
309
+ // search-close auto-re-collapse (see ConversationManager.noteUserTouch),
310
310
  // copying content the user just had search reveal is a deliberate choice
311
311
  // to keep it visible, not an accident of typing a query.
312
312
  conversationManager.searchExpansion.noteUserTouch(nearest.collapseKey);
@@ -331,7 +331,7 @@ export function handleBookmark(
331
331
  }
332
332
  const label = `${nearest.type}: ${nearest.rawContent.slice(0, 40).replace(/\n/g, ' ')}`;
333
333
  const added = bookmarkManager.toggle(nearest.collapseKey, label);
334
- // See handleBlockCopy's note — bookmarking is an explicit block action too.
334
+ // See handleBlockCopy's note, bookmarking is an explicit block action too.
335
335
  conversationManager.searchExpansion.noteUserTouch(nearest.collapseKey);
336
336
  const target = describeBlockForReceipt(nearest);
337
337
  const msg = added
@@ -355,7 +355,7 @@ export function handleBlockSave(
355
355
  requestRender();
356
356
  return;
357
357
  }
358
- // See handleBlockCopy's note — saving to a file is an explicit block action too.
358
+ // See handleBlockCopy's note, saving to a file is an explicit block action too.
359
359
  conversationManager.searchExpansion.noteUserTouch(nearest.collapseKey);
360
360
  const target = describeBlockForReceipt(nearest);
361
361
  try {
@@ -483,7 +483,7 @@ export function handleCtrlC(
483
483
  // Non-fatal to the exit chord; the quit-window bookkeeping still runs.
484
484
  }
485
485
  // A press that silenced LIVE speech is consumed by that job (an earlier replay
486
- // fix) — symmetric with the prompt-clearing press above. The quit chord
486
+ // fix), symmetric with the prompt-clearing press above. The quit chord
487
487
  // ("Ctrl+C x2") starts from a quiet state; turn-aborts still count toward
488
488
  // the double-press.
489
489
  if (stoppedSpeech) return;
@@ -492,7 +492,7 @@ export function handleCtrlC(
492
492
  // one's outcome, whichever branch below runs. Without this, a hide-timer
493
493
  // scheduled by an earlier press could still fire after a newer notice
494
494
  // window opened, or after exitApp() was just called (if exitApp isn't
495
- // synchronous) — flipping showExitNotice/requestRender during a shutdown
495
+ // synchronous), flipping showExitNotice/requestRender during a shutdown
496
496
  // the user already believes is in progress.
497
497
  if (lastCtrlCTimeoutId !== null) {
498
498
  clearTimeout(lastCtrlCTimeoutId);