@pellux/goodvibes-tui 1.27.0 → 2.0.1

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 (404) hide show
  1. package/CHANGELOG.md +125 -2
  2. package/README.md +7 -9
  3. package/bin/goodvibes +2 -2
  4. package/bin/launcher-support.js +8 -4
  5. package/docs/README.md +11 -2
  6. package/docs/foundation-artifacts/operator-contract.json +6403 -2347
  7. package/package.json +14 -25
  8. package/scripts/postinstall.js +35 -35
  9. package/src/audio/spoken-turn-model-routing.ts +1 -1
  10. package/src/cli/bundle-command.ts +5 -5
  11. package/src/cli/completions/generate.ts +1 -1
  12. package/src/cli/doctor.ts +3 -3
  13. package/src/cli/entrypoint.ts +12 -7
  14. package/src/cli/help.ts +4 -5
  15. package/src/cli/hooks-command.ts +1 -1
  16. package/src/cli/index.ts +1 -4
  17. package/src/cli/launch-auto-update.ts +59 -7
  18. package/src/cli/management-commands.ts +6 -6
  19. package/src/cli/management-utils.ts +5 -5
  20. package/src/cli/management.ts +7 -7
  21. package/src/cli/network-posture.ts +1 -1
  22. package/src/cli/package-verification.ts +7 -6
  23. package/src/cli/plugin-bundles-command.ts +1 -1
  24. package/src/cli/plugin-command.ts +2 -2
  25. package/src/cli/service-command.ts +2 -2
  26. package/src/cli/service-posture.ts +4 -4
  27. package/src/cli/status.ts +9 -8
  28. package/src/cli/surface-command.ts +4 -4
  29. package/src/cli/tui-startup.ts +12 -3
  30. package/src/cli-flags.ts +3 -3
  31. package/src/config/goodvibes-home-audit.ts +0 -2
  32. package/src/config/secret-config.ts +37 -5
  33. package/src/config/tui-extension-settings.ts +1 -1
  34. package/src/core/approval-alert.ts +2 -2
  35. package/src/core/budget-breach-notifier.ts +3 -3
  36. package/src/core/conversation-compaction-render.ts +1 -1
  37. package/src/core/conversation-line-cache.ts +1 -1
  38. package/src/core/conversation-render-context.ts +1 -1
  39. package/src/core/conversation-rendering.ts +2 -2
  40. package/src/core/conversation.ts +10 -10
  41. package/src/core/long-task-notifier.ts +2 -2
  42. package/src/core/memory-diagnostics-gateway.ts +1 -1
  43. package/src/core/scriptable-statusline.ts +1 -1
  44. package/src/core/session-auto-titler.ts +1 -1
  45. package/src/core/session-resume-core.ts +2 -2
  46. package/src/core/stream-event-wiring.ts +24 -44
  47. package/src/core/terminal-notifier.ts +3 -3
  48. package/src/core/turn-cancellation.ts +1 -1
  49. package/src/core/turn-event-wiring.ts +5 -5
  50. package/src/input/command-registry.ts +6 -6
  51. package/src/input/commands/channel-pairing.ts +1 -1
  52. package/src/input/commands/cluster-runtime.ts +1 -1
  53. package/src/input/commands/codebase-runtime.ts +1 -1
  54. package/src/input/commands/devices-runtime.ts +1 -1
  55. package/src/input/commands/hosted-runtime.ts +330 -0
  56. package/src/input/commands/local-setup-review.ts +1 -1
  57. package/src/input/commands/local-setup-transfer.ts +2 -2
  58. package/src/input/commands/local-setup.ts +3 -3
  59. package/src/input/commands/managed-runtime.ts +2 -2
  60. package/src/input/commands/operator-rpc.ts +24 -110
  61. package/src/input/commands/payment-card-intake.ts +1 -1
  62. package/src/input/commands/permissions-provenance.ts +2 -2
  63. package/src/input/commands/plugin-runtime.ts +1 -1
  64. package/src/input/commands/provider.ts +1 -1
  65. package/src/input/commands/relay-runtime.ts +18 -9
  66. package/src/input/commands/rewind-runtime.ts +1 -1
  67. package/src/input/commands/runtime-services.ts +1 -1
  68. package/src/input/commands/services-runtime.ts +1 -1
  69. package/src/input/commands/session-workflow.ts +1 -1
  70. package/src/input/commands/settings-sync-runtime.ts +2 -2
  71. package/src/input/commands/share-runtime.ts +1 -1
  72. package/src/input/commands/tasks-runtime.ts +145 -55
  73. package/src/input/commands/update-runtime.ts +31 -28
  74. package/src/input/commands/work-plan-runtime.ts +2 -2
  75. package/src/input/commands/workstream-attempts.ts +1 -1
  76. package/src/input/commands/workstream-runtime.ts +2 -2
  77. package/src/input/commands.ts +2 -0
  78. package/src/input/feature-unit-layout.ts +1 -1
  79. package/src/input/feed-context-factory.ts +3 -3
  80. package/src/input/handler-content-actions.ts +2 -2
  81. package/src/input/handler-feed-routes.ts +1 -1
  82. package/src/input/handler-feed.ts +3 -3
  83. package/src/input/handler-modal-token-routes.ts +1 -1
  84. package/src/input/handler-onboarding-daemon-adopt.ts +3 -2
  85. package/src/input/handler-onboarding.ts +1 -1
  86. package/src/input/handler-types.ts +2 -2
  87. package/src/input/handler-ui-state.ts +1 -1
  88. package/src/input/handler.ts +4 -4
  89. package/src/input/input-history.ts +1 -1
  90. package/src/input/onboarding/onboarding-feature-units.ts +2 -2
  91. package/src/input/onboarding/onboarding-runtime-status.ts +15 -1
  92. package/src/input/onboarding/onboarding-wizard-apply.ts +17 -8
  93. package/src/input/onboarding/onboarding-wizard-cloudflare-step.ts +5 -3
  94. package/src/input/onboarding/onboarding-wizard-external-surfaces.ts +1 -1
  95. package/src/input/onboarding/onboarding-wizard-types.ts +1 -1
  96. package/src/input/payments-config.ts +6 -6
  97. package/src/input/search.ts +1 -1
  98. package/src/input/session-picker-modal.ts +46 -0
  99. package/src/input/settings-modal-activation.ts +1 -1
  100. package/src/input/settings-modal-behavior.ts +4 -4
  101. package/src/input/settings-modal-commit.ts +11 -0
  102. package/src/input/settings-modal-data.ts +13 -80
  103. package/src/input/settings-modal-mutations.ts +33 -0
  104. package/src/input/settings-modal-secrets.ts +34 -0
  105. package/src/input/settings-modal-subscriptions.ts +1 -1
  106. package/src/input/settings-modal-types.ts +15 -1
  107. package/src/input/settings-modal.ts +28 -3
  108. package/src/input/worktree-setup-config.ts +1 -1
  109. package/src/main.ts +11 -9
  110. package/src/panels/agent-inspector-shared.ts +2 -2
  111. package/src/panels/base-panel.ts +2 -2
  112. package/src/panels/builtin/operations.ts +6 -8
  113. package/src/panels/builtin/session.ts +17 -0
  114. package/src/panels/builtin/shared.ts +5 -5
  115. package/src/panels/builtin-modals.ts +3 -3
  116. package/src/panels/confirm-state.ts +1 -1
  117. package/src/panels/cost-tracker-panel.ts +4 -4
  118. package/src/panels/diff-panel.ts +2 -2
  119. package/src/panels/diff-review-panel.ts +2 -2
  120. package/src/panels/expandable-list-panel.ts +2 -2
  121. package/src/panels/fleet-acts.ts +1 -1
  122. package/src/panels/fleet-observed-render.ts +1 -1
  123. package/src/panels/fleet-panel-format.ts +1 -1
  124. package/src/panels/fleet-panel.ts +1 -1
  125. package/src/panels/fleet-spawn.ts +1 -1
  126. package/src/panels/fleet-steer.ts +1 -1
  127. package/src/panels/fleet-transcript.ts +1 -1
  128. package/src/panels/git-panel.ts +1 -1
  129. package/src/panels/hosted-session-feed.ts +352 -0
  130. package/src/panels/hosted-session-panel.ts +221 -0
  131. package/src/panels/local-auth-panel.ts +3 -3
  132. package/src/panels/modals/devices-modal.ts +1 -1
  133. package/src/panels/modals/local-auth-modal.ts +1 -1
  134. package/src/panels/modals/pairing-modal.ts +1 -1
  135. package/src/panels/modals/services-modal.ts +1 -1
  136. package/src/panels/modals/settings-sync-modal.ts +1 -1
  137. package/src/panels/modals/subscription-modal.ts +1 -1
  138. package/src/panels/modals/work-plan-modal.ts +1 -1
  139. package/src/panels/notifications-panel.ts +1 -1
  140. package/src/panels/panel-confirm-overlay.ts +1 -1
  141. package/src/panels/plugins-panel.ts +2 -2
  142. package/src/panels/polish-core.ts +2 -2
  143. package/src/panels/polish-tables.ts +1 -1
  144. package/src/panels/polish.ts +2 -2
  145. package/src/panels/scrollable-list-panel.ts +3 -3
  146. package/src/panels/skills-panel.ts +3 -3
  147. package/src/panels/token-budget-panel.ts +5 -5
  148. package/src/panels/types.ts +1 -2
  149. package/src/permissions/prompt.ts +1 -1
  150. package/src/renderer/autocomplete-overlay.ts +1 -1
  151. package/src/renderer/block-actions-overlay.ts +1 -1
  152. package/src/renderer/bookmark-modal.ts +1 -1
  153. package/src/renderer/buffer.ts +1 -1
  154. package/src/renderer/code-block.ts +1 -1
  155. package/src/renderer/composer-fragments.ts +1 -1
  156. package/src/renderer/compositor.ts +2 -2
  157. package/src/renderer/config-modal.ts +1 -1
  158. package/src/renderer/context-inspector.ts +1 -1
  159. package/src/renderer/conversation-layout.ts +2 -2
  160. package/src/renderer/conversation-overlays.ts +1 -1
  161. package/src/renderer/conversation-surface.ts +2 -2
  162. package/src/renderer/diff-view.ts +1 -1
  163. package/src/renderer/diff.ts +1 -1
  164. package/src/renderer/file-picker-overlay.ts +1 -1
  165. package/src/renderer/fleet-tab-strip.ts +1 -1
  166. package/src/renderer/fullscreen-primitives.ts +2 -2
  167. package/src/renderer/fullscreen-workspace.ts +1 -1
  168. package/src/renderer/header-line.ts +1 -1
  169. package/src/renderer/help-overlay.ts +1 -1
  170. package/src/renderer/history-search-overlay.ts +2 -2
  171. package/src/renderer/layout.ts +5 -8
  172. package/src/renderer/markdown-inline.ts +1 -1
  173. package/src/renderer/markdown-table.ts +1 -1
  174. package/src/renderer/markdown.ts +1 -1
  175. package/src/renderer/mcp-workspace.ts +1 -1
  176. package/src/renderer/modal-factory.ts +2 -2
  177. package/src/renderer/model-workspace.ts +2 -2
  178. package/src/renderer/onboarding/onboarding-wizard.ts +1 -1
  179. package/src/renderer/overlay-box.ts +1 -1
  180. package/src/renderer/panel-composite.ts +1 -1
  181. package/src/renderer/panel-workspace-bar.ts +1 -1
  182. package/src/renderer/process-indicator.ts +1 -1
  183. package/src/renderer/profile-picker-modal.ts +1 -1
  184. package/src/renderer/search-overlay.ts +2 -2
  185. package/src/renderer/selection-modal-overlay.ts +1 -1
  186. package/src/renderer/session-picker-modal.ts +124 -3
  187. package/src/renderer/settings-modal-helpers.ts +2 -0
  188. package/src/renderer/settings-modal.ts +2 -2
  189. package/src/renderer/shell-surface.ts +2 -2
  190. package/src/renderer/system-message.ts +1 -1
  191. package/src/renderer/tab-strip.ts +1 -1
  192. package/src/renderer/theme-mode-config.ts +1 -1
  193. package/src/renderer/theme.ts +11 -12
  194. package/src/renderer/thinking.ts +1 -1
  195. package/src/renderer/tool-call.ts +2 -2
  196. package/src/renderer/tool-result-expanded-lines.ts +1 -1
  197. package/src/renderer/turn-injection.ts +7 -8
  198. package/src/renderer/ui-factory.ts +3 -3
  199. package/src/runtime/bootstrap-command-context.ts +4 -4
  200. package/src/runtime/bootstrap-command-parts.ts +5 -5
  201. package/src/runtime/bootstrap-core.ts +30 -30
  202. package/src/runtime/bootstrap-shell.ts +4 -4
  203. package/src/runtime/bootstrap.ts +128 -157
  204. package/src/runtime/client/approval-updates.ts +82 -0
  205. package/src/runtime/client/build-floors.ts +167 -0
  206. package/src/runtime/client/daemon-attach-handshake.ts +115 -0
  207. package/src/runtime/client/fleet-union.ts +147 -0
  208. package/src/runtime/client/host-service-status.ts +71 -0
  209. package/src/runtime/client/hosted-exit.ts +86 -0
  210. package/src/runtime/client/hosted-roster.ts +110 -0
  211. package/src/runtime/client/hosted-session-stream.ts +178 -0
  212. package/src/runtime/client/hosted-sessions.ts +187 -0
  213. package/src/runtime/client/operator-endpoint.ts +213 -0
  214. package/src/runtime/client/spine-adoption.ts +99 -0
  215. package/src/runtime/cloudflare-control-plane.ts +1 -1
  216. package/src/runtime/context-accounting-source.ts +1 -1
  217. package/src/runtime/context.ts +2 -2
  218. package/src/runtime/conversation-rewind-port.ts +42 -14
  219. package/src/runtime/daemon-attach-notices.ts +55 -19
  220. package/src/runtime/diagnostics/panels/ops.ts +1 -1
  221. package/src/runtime/disposal-wiring.ts +4 -24
  222. package/src/runtime/index.ts +119 -105
  223. package/src/runtime/install-self-check-startup.ts +2 -2
  224. package/src/runtime/interaction-seams.ts +1 -1
  225. package/src/runtime/knowledge-services.ts +8 -2
  226. package/src/runtime/legacy-daemon-migration.ts +15 -3
  227. package/src/runtime/legacy-daemon-reconcile.ts +3 -2
  228. package/src/runtime/memory-spine-transport.ts +37 -267
  229. package/src/runtime/notification-dispatch.ts +2 -2
  230. package/src/runtime/onboarding/apply.ts +2 -2
  231. package/src/runtime/onboarding/derivation.ts +2 -2
  232. package/src/runtime/onboarding/markers.ts +2 -2
  233. package/src/runtime/onboarding/progress.ts +2 -2
  234. package/src/runtime/onboarding/snapshot.ts +1 -1
  235. package/src/runtime/onboarding/state.ts +2 -2
  236. package/src/runtime/onboarding/types.ts +2 -2
  237. package/src/runtime/orchestrator-core-services.ts +1 -1
  238. package/src/runtime/path-shadow-startup.ts +28 -221
  239. package/src/runtime/power-keepawake-remote.ts +3 -2
  240. package/src/runtime/process-lifecycle.ts +2 -2
  241. package/src/runtime/provider-fallback.ts +10 -66
  242. package/src/runtime/recovery-autosave.ts +1 -1
  243. package/src/runtime/recovery-offer-wiring.ts +39 -23
  244. package/src/runtime/recovery-prompt.ts +31 -17
  245. package/src/runtime/relay-reachability-bridge.ts +53 -42
  246. package/src/runtime/release-artifacts.ts +2 -1
  247. package/src/runtime/runtime-services-types.ts +82 -35
  248. package/src/runtime/services.ts +305 -300
  249. package/src/runtime/session-resume-liveness-confirm.ts +1 -1
  250. package/src/runtime/ui-services.ts +7 -6
  251. package/src/runtime/update-check.ts +23 -43
  252. package/src/runtime/workspace-checkpointing.ts +1 -1
  253. package/src/runtime/wrfc-persistence.ts +2 -2
  254. package/src/shell/ui-openers.ts +30 -7
  255. package/src/utils/clipboard.ts +1 -1
  256. package/src/verification/verification-ledger.ts +10 -8
  257. package/src/version.ts +1 -1
  258. package/bin/goodvibes-daemon +0 -90
  259. package/src/cli/config-overrides.ts +0 -267
  260. package/src/cli/endpoints.ts +0 -109
  261. package/src/cli/parser.ts +0 -395
  262. package/src/cli/redaction.ts +0 -170
  263. package/src/cli/types.ts +0 -84
  264. package/src/cluster/commands.ts +0 -382
  265. package/src/cluster/remote-daemon-target.ts +0 -225
  266. package/src/cluster/render.ts +0 -268
  267. package/src/config/atomic-write.ts +0 -70
  268. package/src/config/credential-availability.ts +0 -122
  269. package/src/config/goodvibes-home.ts +0 -149
  270. package/src/config/index.ts +0 -88
  271. package/src/config/provider-model.ts +0 -23
  272. package/src/config/read-versioned.ts +0 -228
  273. package/src/core/alert-gating.ts +0 -67
  274. package/src/core/consolidation-receipt.ts +0 -41
  275. package/src/core/focus-tracker.ts +0 -41
  276. package/src/core/history.ts +0 -45
  277. package/src/core/memory-status.ts +0 -118
  278. package/src/core/orchestrator.ts +0 -7
  279. package/src/core/pairing-devices.ts +0 -49
  280. package/src/core/pairing-handoff.ts +0 -101
  281. package/src/core/pairing-offers.ts +0 -83
  282. package/src/core/pairing-origin.ts +0 -78
  283. package/src/core/rewind-turn-anchors.ts +0 -311
  284. package/src/core/session-recovery.ts +0 -210
  285. package/src/core/stable-host.ts +0 -171
  286. package/src/core/transcript-journal.ts +0 -503
  287. package/src/daemon/cli.ts +0 -641
  288. package/src/daemon/handlers/context.ts +0 -29
  289. package/src/daemon/handlers/contracts.ts +0 -77
  290. package/src/daemon/handlers/credentials.ts +0 -139
  291. package/src/daemon/handlers/drafts/draft-store.ts +0 -427
  292. package/src/daemon/handlers/drafts/index.ts +0 -17
  293. package/src/daemon/handlers/drafts/register.ts +0 -331
  294. package/src/daemon/handlers/errors.ts +0 -18
  295. package/src/daemon/handlers/inbox/cursor-store.ts +0 -457
  296. package/src/daemon/handlers/inbox/index.ts +0 -284
  297. package/src/daemon/handlers/inbox/mapping.ts +0 -192
  298. package/src/daemon/handlers/inbox/poller.ts +0 -212
  299. package/src/daemon/handlers/inbox/provider-adapter.ts +0 -156
  300. package/src/daemon/handlers/inbox/providers/discord.ts +0 -252
  301. package/src/daemon/handlers/inbox/providers/email.ts +0 -152
  302. package/src/daemon/handlers/inbox/providers/imap-client.ts +0 -300
  303. package/src/daemon/handlers/inbox/providers/route-util.ts +0 -24
  304. package/src/daemon/handlers/inbox/providers/slack.ts +0 -263
  305. package/src/daemon/handlers/index.ts +0 -117
  306. package/src/daemon/handlers/register.ts +0 -168
  307. package/src/daemon/handlers/remote/backends/cloud-terminal.ts +0 -142
  308. package/src/daemon/handlers/remote/backends/docker.ts +0 -79
  309. package/src/daemon/handlers/remote/backends/index.ts +0 -40
  310. package/src/daemon/handlers/remote/backends/local-process.ts +0 -113
  311. package/src/daemon/handlers/remote/backends/process-runner.ts +0 -127
  312. package/src/daemon/handlers/remote/backends/ssh.ts +0 -125
  313. package/src/daemon/handlers/remote/backends/types.ts +0 -97
  314. package/src/daemon/handlers/remote/dispatcher.ts +0 -181
  315. package/src/daemon/handlers/remote/index.ts +0 -119
  316. package/src/daemon/handlers/remote/peer-registry.ts +0 -357
  317. package/src/daemon/handlers/remote/service.ts +0 -191
  318. package/src/daemon/handlers/routing/inbox-bridge.ts +0 -71
  319. package/src/daemon/handlers/routing/index.ts +0 -261
  320. package/src/daemon/handlers/routing/route-store.ts +0 -319
  321. package/src/daemon/handlers/routing/routing-resolver.ts +0 -75
  322. package/src/daemon/handlers/sqlite-store.ts +0 -278
  323. package/src/daemon/handlers/triage/index.ts +0 -57
  324. package/src/daemon/handlers/triage/integration.ts +0 -213
  325. package/src/daemon/handlers/triage/pipeline.ts +0 -274
  326. package/src/daemon/handlers/triage/scorer.ts +0 -287
  327. package/src/daemon/handlers/triage/tagger/discord.ts +0 -187
  328. package/src/daemon/handlers/triage/tagger/imap.ts +0 -384
  329. package/src/daemon/handlers/triage/tagger/index.ts +0 -184
  330. package/src/daemon/handlers/triage/tagger/shared.ts +0 -70
  331. package/src/daemon/handlers/triage/tagger/slack.ts +0 -69
  332. package/src/daemon/handlers/triage/types.ts +0 -50
  333. package/src/daemon/lifecycle.ts +0 -41
  334. package/src/daemon/provision-wake-model.ts +0 -81
  335. package/src/daemon/safe-serve.ts +0 -61
  336. package/src/daemon/send/channels.ts +0 -200
  337. package/src/daemon/send/command.ts +0 -332
  338. package/src/daemon/send/composition.ts +0 -99
  339. package/src/daemon/send/failure-text.ts +0 -93
  340. package/src/daemon/send/inert-text.ts +0 -225
  341. package/src/daemon/send/stdin.ts +0 -24
  342. package/src/daemon/service-commands.ts +0 -329
  343. package/src/export/cost-utils.ts +0 -319
  344. package/src/input/selection.ts +0 -135
  345. package/src/plugins/loader.ts +0 -15
  346. package/src/renderer/bottom-bar.ts +0 -58
  347. package/src/renderer/conversation-tree.ts +0 -228
  348. package/src/runtime/agent-graph-composition.ts +0 -78
  349. package/src/runtime/channel-composition.ts +0 -46
  350. package/src/runtime/cluster-composition.ts +0 -124
  351. package/src/runtime/cluster-group-composition.ts +0 -284
  352. package/src/runtime/code-index-services.ts +0 -167
  353. package/src/runtime/daemon-handler-composition.ts +0 -76
  354. package/src/runtime/device-posture-composition.ts +0 -110
  355. package/src/runtime/durability-housekeeping.ts +0 -183
  356. package/src/runtime/durability-services.ts +0 -155
  357. package/src/runtime/embedded-service-factories.ts +0 -58
  358. package/src/runtime/feature-settings.ts +0 -154
  359. package/src/runtime/fleet-needs-input-push.ts +0 -70
  360. package/src/runtime/fleet-services.ts +0 -41
  361. package/src/runtime/idle-power-services.ts +0 -85
  362. package/src/runtime/mail-composition.ts +0 -65
  363. package/src/runtime/memory-fold.ts +0 -55
  364. package/src/runtime/operator-token-cleanup.ts +0 -109
  365. package/src/runtime/path-shadow.ts +0 -418
  366. package/src/runtime/perf/panel-health-monitor.ts +0 -18
  367. package/src/runtime/provider-optimizer-wiring.ts +0 -55
  368. package/src/runtime/reachability-notice.ts +0 -100
  369. package/src/runtime/remote-execution-composition.ts +0 -62
  370. package/src/runtime/session-liveness-marker.ts +0 -257
  371. package/src/runtime/session-pointer-surface.ts +0 -22
  372. package/src/runtime/session-storage-services.ts +0 -41
  373. package/src/runtime/surface-feature-flags.ts +0 -96
  374. package/src/runtime/terminal-output-guard.ts +0 -235
  375. package/src/runtime/trust/workspace-registration.ts +0 -192
  376. package/src/runtime/trust/workspace-trust.ts +0 -229
  377. package/src/runtime/ui/index.ts +0 -39
  378. package/src/runtime/ui/model-picker/data-provider.ts +0 -182
  379. package/src/runtime/ui/model-picker/health-enrichment.ts +0 -231
  380. package/src/runtime/ui/model-picker/index.ts +0 -59
  381. package/src/runtime/ui/model-picker/types.ts +0 -153
  382. package/src/runtime/ui/provider-health/data-provider.ts +0 -244
  383. package/src/runtime/ui/provider-health/fallback-visualizer.ts +0 -71
  384. package/src/runtime/ui/provider-health/index.ts +0 -46
  385. package/src/runtime/ui/provider-health/types.ts +0 -146
  386. package/src/runtime/ui-events.ts +0 -1
  387. package/src/runtime/ui-read-model-helpers.ts +0 -1
  388. package/src/runtime/ui-read-models-observability-maintenance.ts +0 -1
  389. package/src/runtime/ui-read-models-observability-options.ts +0 -1
  390. package/src/runtime/ui-read-models-observability-remote.ts +0 -1
  391. package/src/runtime/ui-read-models-observability-security.ts +0 -1
  392. package/src/runtime/ui-read-models-observability-system.ts +0 -1
  393. package/src/runtime/ui-read-models-observability.ts +0 -1
  394. package/src/runtime/ui-service-queries.ts +0 -1
  395. package/src/runtime/voice-setup-services.ts +0 -98
  396. package/src/runtime/workstream-attempts-validation.ts +0 -77
  397. package/src/runtime/workstream-draft-edits.ts +0 -95
  398. package/src/runtime/workstream-draft-store.ts +0 -274
  399. package/src/runtime/workstream-draft-types.ts +0 -42
  400. package/src/runtime/workstream-services.ts +0 -373
  401. package/src/tools/index.ts +0 -1
  402. package/src/types/grid.ts +0 -48
  403. package/src/types/sql-js.d.ts +0 -15
  404. package/src/work-plans/work-plan-store.ts +0 -702
@@ -1,274 +0,0 @@
1
- // ---------------------------------------------------------------------------
2
- // Daemon-internal triage PIPELINE.
3
- //
4
- // runInboxTriage(items): scores each inbound item (scorer.ts) and writes the
5
- // resulting triageScore/triageTags back into the inbox triage store so that a
6
- // later channels.inbox.list response can surface pre-scored items.
7
- //
8
- // The inbox surface owns the authoritative cursor-store and exposes
9
- // triageScore/triageTags columns. To stay strictly within the triage handler
10
- // surface, this pipeline persists into a dedicated, co-located
11
- // HandlerSqliteStore ('inbox-triage.sqlite') keyed by item id. The inbox
12
- // surface reads these rows by id when assembling its list response (the
13
- // integration decorator does exactly that). The schema mirrors the agreed
14
- // columns: triageScore REAL, triageTags TEXT (JSON array).
15
- // ---------------------------------------------------------------------------
16
-
17
- import { HandlerSqliteStore } from '../sqlite-store.ts';
18
- import type { HandlerContext } from '../context.ts';
19
- import type { InboundChannelItem, TriageLabel } from './types.ts';
20
- import {
21
- labelToTag,
22
- scoreInboundItem,
23
- type TriageScore,
24
- type TriageScorerOptions,
25
- } from './scorer.ts';
26
- import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils';
27
-
28
- export const TRIAGE_STORE_FILE = 'inbox-triage.sqlite';
29
-
30
- const SCHEMA: string[] = [
31
- `CREATE TABLE IF NOT EXISTS inbox_triage (
32
- id TEXT PRIMARY KEY,
33
- surface TEXT NOT NULL,
34
- triageScore REAL NOT NULL,
35
- triageLabel TEXT NOT NULL,
36
- triageTags TEXT NOT NULL,
37
- spamSignal REAL NOT NULL,
38
- prioritySignal REAL NOT NULL,
39
- updatedAt TEXT NOT NULL
40
- )`,
41
- `CREATE INDEX IF NOT EXISTS idx_inbox_triage_label ON inbox_triage (triageLabel)`,
42
- `CREATE INDEX IF NOT EXISTS idx_inbox_triage_surface ON inbox_triage (surface)`,
43
- ];
44
-
45
- export interface TriageMetadata {
46
- triageScore: number;
47
- triageLabel: TriageLabel;
48
- triageTags: string[];
49
- signals: TriageScore['signals'];
50
- }
51
-
52
- export interface TriagedItem extends InboundChannelItem {
53
- triage: TriageMetadata;
54
- }
55
-
56
- export interface RunInboxTriageOptions {
57
- scorer?: TriageScorerOptions;
58
- /** Inject a store (tests). When omitted, a triage store is opened/closed. */
59
- store?: HandlerSqliteStore;
60
- /** When true, do not persist — only compute (used by inbox.triage.list). */
61
- dryRun?: boolean;
62
- /** Clock injection for deterministic updatedAt in tests. */
63
- now?: () => Date;
64
- }
65
-
66
- export interface RunInboxTriageResult {
67
- items: TriagedItem[];
68
- scored: number;
69
- persisted: number;
70
- }
71
-
72
- function toMetadata(score: TriageScore): TriageMetadata {
73
- return {
74
- triageScore: score.score,
75
- triageLabel: score.label,
76
- triageTags: [labelToTag(score.label)],
77
- signals: score.signals,
78
- };
79
- }
80
-
81
- /**
82
- * Open the triage store for this working directory. Caller owns close()/save()
83
- * when they pass their own store; otherwise runInboxTriage manages lifecycle.
84
- */
85
- export function createTriageStore(workingDirectory: string): HandlerSqliteStore {
86
- return new HandlerSqliteStore({
87
- workingDirectory,
88
- fileName: TRIAGE_STORE_FILE,
89
- schema: SCHEMA,
90
- });
91
- }
92
-
93
- function persistRow(
94
- store: HandlerSqliteStore,
95
- item: InboundChannelItem,
96
- meta: TriageMetadata,
97
- updatedAt: string,
98
- ): void {
99
- store.run(
100
- `INSERT INTO inbox_triage
101
- (id, surface, triageScore, triageLabel, triageTags, spamSignal, prioritySignal, updatedAt)
102
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)
103
- ON CONFLICT(id) DO UPDATE SET
104
- surface = excluded.surface,
105
- triageScore = excluded.triageScore,
106
- triageLabel = excluded.triageLabel,
107
- triageTags = excluded.triageTags,
108
- spamSignal = excluded.spamSignal,
109
- prioritySignal = excluded.prioritySignal,
110
- updatedAt = excluded.updatedAt`,
111
- [
112
- item.id,
113
- item.surface,
114
- meta.triageScore,
115
- meta.triageLabel,
116
- JSON.stringify(meta.triageTags),
117
- meta.signals.spam,
118
- meta.signals.priority,
119
- updatedAt,
120
- ],
121
- );
122
- }
123
-
124
- /**
125
- * Score every item and (unless dryRun) persist triageScore/triageTags back into
126
- * the inbox triage store. Returns each item enriched with triage metadata so
127
- * the caller can surface it without a second read.
128
- *
129
- * Called by the inbox poller (Responsibility 1) after each poll.
130
- */
131
- export async function runInboxTriage(
132
- items: readonly InboundChannelItem[],
133
- ctx: HandlerContext,
134
- options: RunInboxTriageOptions = {},
135
- ): Promise<RunInboxTriageResult> {
136
- const now = options.now ?? (() => new Date());
137
- const updatedAt = now().toISOString();
138
-
139
- const enriched: TriagedItem[] = items.map((item) => {
140
- const score = scoreInboundItem(item, options.scorer);
141
- return { ...item, triage: toMetadata(score) };
142
- });
143
-
144
- if (options.dryRun || enriched.length === 0) {
145
- return { items: enriched, scored: enriched.length, persisted: 0 };
146
- }
147
-
148
- const ownsStore = !options.store;
149
- const store = options.store ?? createTriageStore(ctx.workingDirectory);
150
- let persisted = 0;
151
- try {
152
- if (ownsStore) await store.init();
153
- store.transaction(() => {
154
- for (const item of enriched) {
155
- persistRow(store, item, item.triage, updatedAt);
156
- persisted += 1;
157
- }
158
- });
159
- if (ownsStore) await store.save();
160
- } catch (error) {
161
- ctx.logger.error('triage: failed to persist scores', {
162
- message: summarizeError(error),
163
- });
164
- throw error;
165
- } finally {
166
- if (ownsStore) store.close();
167
- }
168
-
169
- return { items: enriched, scored: enriched.length, persisted };
170
- }
171
-
172
- /** Optional persisted triage metadata overlaid onto an inbound item. */
173
- export interface TriageOverlay {
174
- triageScore?: number;
175
- triageTags?: string[];
176
- triageLabel?: TriageLabel;
177
- }
178
-
179
- /** An inbound item overlaid with optional persisted triage metadata. */
180
- export type TriageEnrichedItem = InboundChannelItem & TriageOverlay;
181
-
182
- function rowToMetadata(row: Omit<TriageRow, 'id'>): TriageMetadata {
183
- let tags: string[] = [];
184
- try {
185
- const parsed = JSON.parse(row.triageTags) as unknown;
186
- if (Array.isArray(parsed)) tags = parsed.filter((t): t is string => typeof t === 'string');
187
- } catch {
188
- tags = [];
189
- }
190
- return {
191
- triageScore: row.triageScore,
192
- triageLabel: row.triageLabel as TriageLabel,
193
- triageTags: tags,
194
- signals: { spam: row.spamSignal, priority: row.prioritySignal },
195
- };
196
- }
197
-
198
- interface TriageRow {
199
- id: string;
200
- triageScore: number;
201
- triageLabel: string;
202
- triageTags: string;
203
- spamSignal: number;
204
- prioritySignal: number;
205
- }
206
-
207
- /**
208
- * Read persisted triage rows for many item ids in a single `WHERE id IN (...)`
209
- * query. Returns a Map keyed by item id; ids without a stored row are absent.
210
- * De-duplicates ids so the placeholder list stays minimal.
211
- */
212
- export function readTriageMetadataBatch(
213
- store: HandlerSqliteStore,
214
- itemIds: readonly string[],
215
- ): Map<string, TriageMetadata> {
216
- const out = new Map<string, TriageMetadata>();
217
- const uniqueIds = [...new Set(itemIds)];
218
- if (uniqueIds.length === 0) return out;
219
- const placeholders = uniqueIds.map(() => '?').join(', ');
220
- const rows = store.all<TriageRow>(
221
- `SELECT id, triageScore, triageLabel, triageTags, spamSignal, prioritySignal
222
- FROM inbox_triage WHERE id IN (${placeholders})`,
223
- uniqueIds,
224
- );
225
- for (const row of rows) {
226
- out.set(row.id, rowToMetadata(row));
227
- }
228
- return out;
229
- }
230
-
231
- /** Read a single persisted triage row by item id (used by the inbox surface). */
232
- export function readTriageMetadata(
233
- store: HandlerSqliteStore,
234
- itemId: string,
235
- ): TriageMetadata | null {
236
- const row = store.get<Omit<TriageRow, 'id'>>(
237
- `SELECT triageScore, triageLabel, triageTags, spamSignal, prioritySignal
238
- FROM inbox_triage WHERE id = ?`,
239
- [itemId],
240
- );
241
- if (!row) return null;
242
- return rowToMetadata(row);
243
- }
244
-
245
- /**
246
- * Merge persisted triage metadata onto a batch of inbound items by id. This is
247
- * the exact glue `channels.inbox.list` invokes to surface pre-scored items: the
248
- * inbox surface lists from its cursor store, then calls this to overlay the
249
- * triageScore/triageTags columns the contract promises. Items without a stored
250
- * triage row pass through untouched, so an un-scored feed degrades gracefully.
251
- */
252
- export function enrichItemsWithTriage<T extends { id: string }>(
253
- store: HandlerSqliteStore,
254
- items: readonly T[],
255
- ): Array<T & TriageOverlay> {
256
- if (items.length === 0) return [];
257
- // Single batched read (`WHERE id IN (...)`) instead of one SELECT per item —
258
- // this is a hot read path (every channels.inbox.list call), so the N+1 is
259
- // collapsed to one query keyed by id.
260
- const byId = readTriageMetadataBatch(
261
- store,
262
- items.map((item) => item.id),
263
- );
264
- return items.map((item) => {
265
- const meta = byId.get(item.id);
266
- if (!meta) return { ...item };
267
- return {
268
- ...item,
269
- triageScore: meta.triageScore,
270
- triageLabel: meta.triageLabel,
271
- triageTags: meta.triageTags,
272
- };
273
- });
274
- }
@@ -1,287 +0,0 @@
1
- // ---------------------------------------------------------------------------
2
- // Daemon-internal email auto-tag / spam triage SCORER.
3
- //
4
- // Pure, dependency-free heuristic + naive-Bayes-style spam/priority scoring
5
- // over an InboundChannelItem's textual surface (subject + snippet). No I/O,
6
- // no credentials, no network — safe to run on every polled item.
7
- //
8
- // The score is a normalized 0..1 confidence in the assigned label. The label
9
- // is one of 'spam' | 'priority' | 'normal'. Scoring is deterministic so the
10
- // pipeline can persist stable triageScore/triageTags values across polls.
11
- // ---------------------------------------------------------------------------
12
-
13
- import type { InboundChannelItem, TriageLabel } from './types.ts';
14
-
15
- export type { TriageLabel } from './types.ts';
16
-
17
- export interface TriageScore {
18
- /** Confidence in the assigned label, 0..1 (2-decimal rounded). */
19
- score: number;
20
- label: TriageLabel;
21
- /** Raw component probabilities (for diagnostics / tests). */
22
- signals: {
23
- spam: number; // 0..1 P(spam)
24
- priority: number; // 0..1 P(priority)
25
- };
26
- }
27
-
28
- export interface TriageScorerOptions {
29
- /** Minimum P(spam) to label an item 'spam'. Default 0.65. */
30
- spamThreshold?: number;
31
- /** Minimum P(priority) to label an item 'priority'. Default 0.6. */
32
- priorityThreshold?: number;
33
- /** Extra spam lexicon terms (lowercased) merged with the defaults. */
34
- extraSpamTerms?: readonly string[];
35
- /** Extra priority lexicon terms (lowercased) merged with the defaults. */
36
- extraPriorityTerms?: readonly string[];
37
- }
38
-
39
- const DEFAULT_SPAM_THRESHOLD = 0.65;
40
- const DEFAULT_PRIORITY_THRESHOLD = 0.6;
41
-
42
- // Tokens that, when present, push toward spam. Weighted log-likelihoods.
43
- const SPAM_TERMS: ReadonlyMap<string, number> = new Map([
44
- ['viagra', 3.2],
45
- ['lottery', 2.8],
46
- ['winner', 2.0],
47
- ['congratulations', 1.4],
48
- ['prize', 2.2],
49
- ['free', 1.1],
50
- ['cash', 1.6],
51
- ['bitcoin', 1.5],
52
- ['crypto', 1.2],
53
- ['investment', 1.0],
54
- ['guarantee', 1.3],
55
- ['guaranteed', 1.5],
56
- ['risk-free', 2.0],
57
- ['click', 1.2],
58
- ['unsubscribe', 0.9],
59
- ['limited', 0.9],
60
- ['offer', 1.0],
61
- ['act now', 2.2],
62
- ['urgent', 0.7],
63
- ['wire transfer', 2.6],
64
- ['nigerian', 2.6],
65
- ['inheritance', 2.4],
66
- ['million', 1.4],
67
- ['pharmacy', 2.2],
68
- ['pills', 2.0],
69
- ['loan', 1.4],
70
- ['debt', 1.2],
71
- ['refinance', 1.6],
72
- ['casino', 2.4],
73
- ['earn money', 2.2],
74
- ['work from home', 1.8],
75
- ['100% free', 2.4],
76
- ['no cost', 1.6],
77
- ['cheap', 1.2],
78
- ['discount', 0.8],
79
- ['weight loss', 2.0],
80
- ['verify your account', 2.6],
81
- ['suspended', 1.4],
82
- ['password', 1.0],
83
- ['confirm your identity', 2.4],
84
- ]);
85
-
86
- // Tokens that push toward priority/important.
87
- const PRIORITY_TERMS: ReadonlyMap<string, number> = new Map([
88
- ['urgent', 2.4],
89
- ['asap', 2.4],
90
- ['immediately', 2.0],
91
- ['deadline', 2.0],
92
- ['today', 1.2],
93
- ['eod', 1.6],
94
- ['important', 1.6],
95
- ['action required', 2.2],
96
- ['action needed', 2.2],
97
- ['please respond', 1.8],
98
- ['please reply', 1.8],
99
- ['waiting', 1.0],
100
- ['follow up', 1.2],
101
- ['follow-up', 1.2],
102
- ['reminder', 1.0],
103
- ['overdue', 2.2],
104
- ['blocker', 2.0],
105
- ['blocked', 1.6],
106
- ['escalation', 2.2],
107
- ['escalate', 2.0],
108
- ['critical', 2.4],
109
- ['emergency', 2.6],
110
- ['payment due', 2.0],
111
- ['invoice', 1.2],
112
- ['signature', 1.0],
113
- ['approval', 1.4],
114
- ['approve', 1.4],
115
- ['meeting', 0.8],
116
- ['call me', 1.6],
117
- ]);
118
-
119
- const URL_PATTERN = /https?:\/\/[^\s]+/gi;
120
- const MONEY_PATTERN = /(?:[$£€]\s?\d|(?:\d[\d,]*)\s?(?:usd|eur|gbp|dollars|euros))/i;
121
- const EXCESSIVE_PUNCT = /[!?]{2,}/;
122
-
123
- function normalizeText(item: InboundChannelItem): string {
124
- const subject = typeof item.subject === 'string' ? item.subject : '';
125
- const snippet = typeof item.snippet === 'string' ? item.snippet : '';
126
- // Subject is weighted more heavily by duplicating it once.
127
- return `${subject} ${subject} ${snippet}`.trim();
128
- }
129
-
130
- function escapeRegExp(value: string): string {
131
- return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
132
- }
133
-
134
- function countLexicon(text: string, lexicon: ReadonlyMap<string, number>): number {
135
- let total = 0;
136
- for (const [term, weight] of lexicon) {
137
- if (term.includes(' ')) {
138
- // Phrase match: count non-overlapping occurrences.
139
- let from = 0;
140
- let idx = text.indexOf(term, from);
141
- while (idx !== -1) {
142
- total += weight;
143
- from = idx + term.length;
144
- idx = text.indexOf(term, from);
145
- }
146
- } else {
147
- // Word-boundary match for single tokens.
148
- const re = new RegExp(`\\b${escapeRegExp(term)}\\b`, 'g');
149
- const matches = text.match(re);
150
- if (matches) total += weight * matches.length;
151
- }
152
- }
153
- return total;
154
- }
155
-
156
- function upperCaseRatio(text: string): number {
157
- const letters = text.replace(/[^a-zA-Z]/g, '');
158
- if (letters.length < 8) return 0;
159
- let upper = 0;
160
- for (const ch of letters) {
161
- if (ch >= 'A' && ch <= 'Z') upper += 1;
162
- }
163
- return upper / letters.length;
164
- }
165
-
166
- function urlDensity(text: string): number {
167
- const urls = text.match(URL_PATTERN);
168
- const urlCount = urls ? urls.length : 0;
169
- const words = text.split(/\s+/).filter((w) => w.length > 0).length || 1;
170
- return urlCount / words;
171
- }
172
-
173
- /** Logistic squash of an accumulated log-likelihood into 0..1. */
174
- function sigmoid(x: number): number {
175
- return 1 / (1 + Math.exp(-x));
176
- }
177
-
178
- function round2(value: number): number {
179
- return Math.round(value * 100) / 100;
180
- }
181
-
182
- function clamp01(value: number): number {
183
- if (Number.isNaN(value)) return 0;
184
- if (value < 0) return 0;
185
- if (value > 1) return 1;
186
- return value;
187
- }
188
-
189
- function mergeLexicon(
190
- base: ReadonlyMap<string, number>,
191
- extra: readonly string[] | undefined,
192
- extraWeight: number,
193
- ): ReadonlyMap<string, number> {
194
- if (!extra || extra.length === 0) return base;
195
- const merged = new Map(base);
196
- for (const term of extra) {
197
- const key = term.trim().toLowerCase();
198
- if (key.length === 0) continue;
199
- merged.set(key, Math.max(merged.get(key) ?? 0, extraWeight));
200
- }
201
- return merged;
202
- }
203
-
204
- /**
205
- * Score a single inbound item for spam likelihood and priority likelihood,
206
- * then resolve a single label. Deterministic and side-effect free.
207
- */
208
- export function scoreInboundItem(
209
- item: InboundChannelItem,
210
- options: TriageScorerOptions = {},
211
- ): TriageScore {
212
- const spamThreshold = options.spamThreshold ?? DEFAULT_SPAM_THRESHOLD;
213
- const priorityThreshold = options.priorityThreshold ?? DEFAULT_PRIORITY_THRESHOLD;
214
-
215
- const spamLexicon = mergeLexicon(SPAM_TERMS, options.extraSpamTerms, 1.5);
216
- const priorityLexicon = mergeLexicon(PRIORITY_TERMS, options.extraPriorityTerms, 1.5);
217
-
218
- const raw = normalizeText(item);
219
- const text = raw.toLowerCase();
220
-
221
- // ---- Spam evidence -----------------------------------------------------
222
- // Bias term tuned so a clean message lands well below the threshold.
223
- let spamLL = -2.4;
224
- spamLL += countLexicon(text, spamLexicon);
225
-
226
- const caps = upperCaseRatio(raw);
227
- if (caps > 0.6) spamLL += 1.8;
228
- else if (caps > 0.4) spamLL += 0.9;
229
-
230
- const density = urlDensity(text);
231
- if (density > 0.25) spamLL += 1.6;
232
- else if (density > 0.1) spamLL += 0.8;
233
-
234
- if (MONEY_PATTERN.test(raw)) spamLL += 0.8;
235
- if (EXCESSIVE_PUNCT.test(raw)) spamLL += 0.6;
236
- if (raw.length === 0) spamLL -= 1.0; // empty/no-text items are not spam
237
-
238
- const spam = clamp01(sigmoid(spamLL));
239
-
240
- // ---- Priority evidence -------------------------------------------------
241
- let priorityLL = -2.2;
242
- priorityLL += countLexicon(text, priorityLexicon);
243
-
244
- // Direct conversations (1:1 DMs) are inherently more likely to be priority.
245
- if (item.conversationKind === 'direct') priorityLL += 0.8;
246
- if (item.unread === true) priorityLL += 0.3;
247
- // A trailing question mark suggests an awaited answer.
248
- if (/\?\s*$/.test(raw)) priorityLL += 0.5;
249
-
250
- // Spam strongly suppresses priority — promotional text is rarely urgent.
251
- priorityLL -= spam * 2.5;
252
-
253
- const priority = clamp01(sigmoid(priorityLL));
254
-
255
- // ---- Label resolution --------------------------------------------------
256
- let label: TriageLabel = 'normal';
257
- let score: number;
258
- if (spam >= spamThreshold && spam >= priority) {
259
- label = 'spam';
260
- score = spam;
261
- } else if (priority >= priorityThreshold) {
262
- label = 'priority';
263
- score = priority;
264
- } else {
265
- label = 'normal';
266
- // Confidence in 'normal' is how far both signals sit below their gates.
267
- score = clamp01(1 - Math.max(spam, priority));
268
- }
269
-
270
- return {
271
- score: round2(score),
272
- label,
273
- signals: { spam: round2(spam), priority: round2(priority) },
274
- };
275
- }
276
-
277
- /** Map a label to the canonical provider-side tag string applied by the tagger. */
278
- export function labelToTag(label: TriageLabel): string {
279
- switch (label) {
280
- case 'spam':
281
- return 'GoodVibes/Spam';
282
- case 'priority':
283
- return 'GoodVibes/Priority';
284
- default:
285
- return 'GoodVibes/Normal';
286
- }
287
- }