@xopcai/xopc 0.0.175 → 0.0.177

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 (286) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{activity-store-CM6mQUS2.js → activity-store-Wu2ikfbM.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-eckyE9AY.js → agent-avatar-dicebear-B0_biISn.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents-TpIpJk59.js +2 -0
  6. package/dist/gateway/static/root/assets/{api-BfMRS6FX.js → api-DljBt-N5.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-DYkzZQzZ.js → app-management-settings-panel-CKoZRi7Y.js} +1 -1
  8. package/dist/gateway/static/root/assets/appearance-settings-DOdXhNDo.js +1 -0
  9. package/dist/gateway/static/root/assets/apps-page-Cxbn5hy8.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-k909a76t.js → archive-plugin-D18gyP76.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-CqNzyhdJ.js → attachment-load-CZh9fc8u.js} +2 -2
  12. package/dist/gateway/static/root/assets/{attachment-preview-renderer-DonnL2dL.js → attachment-preview-renderer-Cmo-5BP5.js} +2 -2
  13. package/dist/gateway/static/root/assets/{attachment-process-heavy-RnGYy9bC.js → attachment-process-heavy-B2_kr5EA.js} +3 -3
  14. package/dist/gateway/static/root/assets/{automation-suggestion-card-snNG6u0v.js → automation-suggestion-card-DKrVoiiK.js} +1 -1
  15. package/dist/gateway/static/root/assets/automations-page-DYv16QMU.js +6 -0
  16. package/dist/gateway/static/root/assets/{binary-plugins-PfQ9ZHDF.js → binary-plugins-DdSyGL6M.js} +2 -2
  17. package/dist/gateway/static/root/assets/{block-editor-Xrw-DnE_.js → block-editor-BOpNApiX.js} +6 -6
  18. package/dist/gateway/static/root/assets/{browser-settings-page-G92AdEnX.js → browser-settings-page-DlcqaGu1.js} +4 -4
  19. package/dist/gateway/static/root/assets/{browser-workflow-inputs-DJPF2lUY.js → browser-workflow-inputs-C0SnSj_R.js} +1 -1
  20. package/dist/gateway/static/root/assets/{browser-workflows-page-BoXs4pgc.js → browser-workflows-page-CzlzH7HA.js} +2 -2
  21. package/dist/gateway/static/root/assets/capabilities-settings-panel-QPX4wsGZ.js +7 -0
  22. package/dist/gateway/static/root/assets/{capability-presets-api-BgY-Ysmi.js → capability-presets-api-RM6S7ES5.js} +1 -1
  23. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DmCeusO8.js +1 -0
  24. package/dist/gateway/static/root/assets/{channel-recipient-api-D32T1EJM.js → channel-recipient-api-B4sha-30.js} +1 -1
  25. package/dist/gateway/static/root/assets/channels-settings-HcKoP1wm.js +1 -0
  26. package/dist/gateway/static/root/assets/channels-status-swr-D3xr2enH.js +1 -0
  27. package/dist/gateway/static/root/assets/{connector-logo-C-l8haIK.js → connector-logo-BPsKIyoM.js} +1 -1
  28. package/dist/gateway/static/root/assets/connectors-page-DwbThFvd.js +2 -0
  29. package/dist/gateway/static/root/assets/desktop-pet-DjL1GWON.js +1 -0
  30. package/dist/gateway/static/root/assets/{desktop-pet-settings-Cldo_pA3.js → desktop-pet-settings-u_abAXh7.js} +1 -1
  31. package/dist/gateway/static/root/assets/{directory-picker-path-field-CMASXbgJ.js → directory-picker-path-field-BoZGualI.js} +1 -1
  32. package/dist/gateway/static/root/assets/{dreaming-settings-BnMx02w0.js → dreaming-settings-s3gn3f9h.js} +3 -3
  33. package/dist/gateway/static/root/assets/{extension-debug-page-mUFs3ign.js → extension-debug-page-DIbMngCF.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-page-BsFBOZ5N.js → extension-page-D94f2bWQ.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-settings-page-CTEoovnV.js → extension-settings-page-B7TI13ex.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-config-api-Bwx-EetD.js → gateway-config-api-Do77rV8R.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-settings-CvgyqhR_.js → gateway-settings-Dt1PNJmb.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-startup-retry-C8f5KwkT.js → gateway-startup-retry-WaXTw3fi.js} +1 -1
  39. package/dist/gateway/static/root/assets/{goal-create-dialog-Bhynl9LN.js → goal-create-dialog-DEiOOLGU.js} +1 -1
  40. package/dist/gateway/static/root/assets/goal-detail-page-C1Qj4o1K.js +4 -0
  41. package/dist/gateway/static/root/assets/{goals-config-api-CUnfbgHa.js → goals-config-api-BL0fAEns.js} +1 -1
  42. package/dist/gateway/static/root/assets/{goals-page-BAS_liXl.js → goals-page-qJDcEDzc.js} +2 -2
  43. package/dist/gateway/static/root/assets/{goals-settings-Bkk-tOcf.js → goals-settings-DV3ZlrdI.js} +1 -1
  44. package/dist/gateway/static/root/assets/{heartbeat-settings-D9Pldf5E.js → heartbeat-settings-C3kzg6ai.js} +1 -1
  45. package/dist/gateway/static/root/assets/{image-generation-api-D7aCMgOv.js → image-generation-api-BgISY8i-.js} +1 -1
  46. package/dist/gateway/static/root/assets/index-C1h0zkNo.js +212 -0
  47. package/dist/gateway/static/root/assets/index-Da36E3WH.css +1 -0
  48. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CBhtXhHb.js → keyboard-shortcuts-settings-0KSmaPu0.js} +1 -1
  49. package/dist/gateway/static/root/assets/local-app-workbench-page-DcD4mVId.js +2 -0
  50. package/dist/gateway/static/root/assets/{local-apps-page-BtJGF3M8.js → local-apps-page-BMrU8u7w.js} +1 -1
  51. package/dist/gateway/static/root/assets/{locale-store-DO-u1yS7.js → locale-store-DVGhFXRz.js} +1 -1
  52. package/dist/gateway/static/root/assets/{logs-page-0lvwfLAA.js → logs-page-CW5m9Cov.js} +3 -3
  53. package/dist/gateway/static/root/assets/{markdown-split-BGPaeTch.js → markdown-split-BVqbtN9o.js} +1 -1
  54. package/dist/gateway/static/root/assets/{media-plugins-C_Cx8v6u.js → media-plugins-Dr_wtkNJ.js} +1 -1
  55. package/dist/gateway/static/root/assets/messages-r8L6Ur3A.js +3 -0
  56. package/dist/gateway/static/root/assets/{notes-page-CIYy5BKF.js → notes-page-BWZRXsq6.js} +1 -1
  57. package/dist/gateway/static/root/assets/notes-workbench-DdnwNz9x.js +4 -0
  58. package/dist/gateway/static/root/assets/{page-tabs-C2vsdfJO.js → page-tabs-DWWgy0bF.js} +1 -1
  59. package/dist/gateway/static/root/assets/pdf-D4PI9qAw.js +54 -0
  60. package/dist/gateway/static/root/assets/pdf.worker.min-CHFwMXne.mjs +29 -0
  61. package/dist/gateway/static/root/assets/{preview-open-alternatives-D_VT83bW.js → preview-open-alternatives-Bnfs93ZP.js} +1 -1
  62. package/dist/gateway/static/root/assets/{product-open-page-BNP9kZ3Q.js → product-open-page-BR7QFmT-.js} +1 -1
  63. package/dist/gateway/static/root/assets/project-detail-page-B8GeS4dl.js +1 -0
  64. package/dist/gateway/static/root/assets/projects-page-DOeu1Hk_.js +1 -0
  65. package/dist/gateway/static/root/assets/remote-access-hub-De94rxnE.js +1 -0
  66. package/dist/gateway/static/root/assets/{save-bar-controls-BJL6Xb-F.js → save-bar-controls-BzS-rRTP.js} +1 -1
  67. package/dist/gateway/static/root/assets/{schedule-field-CxCPSLbu.js → schedule-field-Cl2IIDAN.js} +1 -1
  68. package/dist/gateway/static/root/assets/{schema-form-Cao1wGbk.js → schema-form-BjKjp5eZ.js} +1 -1
  69. package/dist/gateway/static/root/assets/sessions-page-A7p8G0OJ.js +1 -0
  70. package/dist/gateway/static/root/assets/settings-advanced-gate-BsGzjmqx.js +1 -0
  71. package/dist/gateway/static/root/assets/{settings-form-section-9pgClEud.js → settings-form-section-BSDNBfHn.js} +1 -1
  72. package/dist/gateway/static/root/assets/{settings-loading-skeleton-CQz0gEUK.js → settings-loading-skeleton-BD4peoAv.js} +1 -1
  73. package/dist/gateway/static/root/assets/{settings-page-DgsMzZLm.js → settings-page-S-P3U7at.js} +1 -1
  74. package/dist/gateway/static/root/assets/{settings-page-layout-BhqupMfG.js → settings-page-layout-BQTLh-86.js} +1 -1
  75. package/dist/gateway/static/root/assets/{setup-status-panel-B7BsWxJt.js → setup-status-panel-W3p6kNyA.js} +1 -1
  76. package/dist/gateway/static/root/assets/{share-preview-page-CC4dQsQN.js → share-preview-page-DQjMxyvw.js} +2 -2
  77. package/dist/gateway/static/root/assets/shares-settings-Xo3N99PO.js +1 -0
  78. package/dist/gateway/static/root/assets/skill-reload-api-ByPEG5t1.js +1 -0
  79. package/dist/gateway/static/root/assets/skills-page-C019Ml5q.js +2 -0
  80. package/dist/gateway/static/root/assets/{skills-page.utils-CF4AYPQg.js → skills-page.utils-CXnpudm6.js} +1 -1
  81. package/dist/gateway/static/root/assets/{system-settings-panel-CzZHWI4u.js → system-settings-panel-BhFwdYJP.js} +1 -1
  82. package/dist/gateway/static/root/assets/{theme-store-BZWNdSZC.js → theme-store-DQI-HPL-.js} +1 -1
  83. package/dist/gateway/static/root/assets/{time-picker-BC922Mdg.js → time-picker-C0DCya4U.js} +1 -1
  84. package/dist/gateway/static/root/assets/{typed-models-lib-C1S-B1pk.js → typed-models-lib-C-M3Fv2N.js} +1 -1
  85. package/dist/gateway/static/root/assets/{use-channel-catalog-DTiLxcLF.js → use-channel-catalog-Bndq4y4I.js} +1 -1
  86. package/dist/gateway/static/root/assets/user-context-page-fYBzpus-.js +1 -0
  87. package/dist/gateway/static/root/assets/{voice-api-key-field-CtIYRNfI.js → voice-api-key-field-p_g4UI1-.js} +1 -1
  88. package/dist/gateway/static/root/assets/work-discovery-page-DI0gCZRw.js +1 -0
  89. package/dist/gateway/static/root/assets/work-item-detail-page-DnBRP2wI.js +1 -0
  90. package/dist/gateway/static/root/assets/work-page-Z-nUaS_n.js +3 -0
  91. package/dist/gateway/static/root/assets/workflow-run-setup-panel-CHEXVvhH.js +3 -0
  92. package/dist/gateway/static/root/assets/workflows-page-BDfwnM-Y.js +11 -0
  93. package/dist/gateway/static/root/index.html +7 -7
  94. package/dist/package.js +1 -1
  95. package/dist/src/agent/agent-manager.js +7 -7
  96. package/dist/src/agent/context/execution-scope.d.ts +26 -0
  97. package/dist/src/agent/context/execution-scope.js +84 -0
  98. package/dist/src/agent/context/project-context.d.ts +3 -1
  99. package/dist/src/agent/context/project-context.js +26 -8
  100. package/dist/src/agent/embedded/model-runtime.d.ts +1 -2
  101. package/dist/src/agent/embedded/model-runtime.js +17 -29
  102. package/dist/src/agent/embedded/session-runner.js +2 -3
  103. package/dist/src/agent/prompt/service-prompt-builder.js +1 -0
  104. package/dist/src/agent/prompt/system-prompt.js +1 -1
  105. package/dist/src/agent/service/process-direct-streaming.js +7 -4
  106. package/dist/src/agent/session/session-config-service.d.ts +4 -1
  107. package/dist/src/agent/session/session-config-service.js +5 -3
  108. package/dist/src/agent/session/session-inspector.d.ts +6 -0
  109. package/dist/src/agent/session/session-inspector.js +9 -2
  110. package/dist/src/agent/workflow/subagent-runner.js +2 -0
  111. package/dist/src/agent/workflow/types.d.ts +1 -0
  112. package/dist/src/auth/model-credential-store.d.ts +17 -0
  113. package/dist/src/auth/model-credential-store.js +110 -0
  114. package/dist/src/auth/oauth/github-copilot.js +2 -2
  115. package/dist/src/auth/oauth/openai-codex.js +98 -7
  116. package/dist/src/auth/oauth/types.d.ts +4 -1
  117. package/dist/src/auth/oauth/xopc-cloud.js +124 -6
  118. package/dist/src/automations/service/automation-service.d.ts +3 -0
  119. package/dist/src/automations/service/automation-service.js +37 -7
  120. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  121. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  122. package/dist/src/config/agent-profile.js +1 -1
  123. package/dist/src/config/index.js +2 -2
  124. package/dist/src/config/schema.d.ts +21 -0
  125. package/dist/src/config/schema.js +12 -2
  126. package/dist/src/gateway/agents-admin.js +1 -1
  127. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -0
  128. package/dist/src/gateway/hono/lib/config-payload.js +1 -0
  129. package/dist/src/gateway/hono/oauth-async.d.ts +5 -0
  130. package/dist/src/gateway/hono/oauth-async.js +20 -8
  131. package/dist/src/gateway/hono/routes/browser-install.js +1 -1
  132. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +1 -1
  133. package/dist/src/gateway/hono/routes/config-patch/gateway.js +9 -0
  134. package/dist/src/gateway/hono/routes/goals.js +13 -0
  135. package/dist/src/gateway/hono/routes/home.d.ts +18 -2
  136. package/dist/src/gateway/hono/routes/home.js +19 -0
  137. package/dist/src/gateway/hono/routes/index.js +2 -2
  138. package/dist/src/gateway/hono/routes/proactive.d.ts +4 -0
  139. package/dist/src/gateway/hono/routes/proactive.js +157 -0
  140. package/dist/src/gateway/hono/routes/projects.js +2 -2
  141. package/dist/src/gateway/service/sessions-api.d.ts +2 -1
  142. package/dist/src/gateway/service.d.ts +10 -1
  143. package/dist/src/gateway/service.js +31 -31
  144. package/dist/src/infra/update-restart.js +1 -1
  145. package/dist/src/mobile/notification-service.d.ts +1 -0
  146. package/dist/src/mobile/notification-service.js +38 -18
  147. package/dist/src/mobile/notification-types.d.ts +2 -2
  148. package/dist/src/proactive/events/envelope.d.ts +2 -0
  149. package/dist/src/proactive/events/envelope.js +54 -0
  150. package/dist/src/proactive/events/publisher.d.ts +4 -0
  151. package/dist/src/proactive/events/repository.d.ts +9 -0
  152. package/dist/src/proactive/events/repository.js +62 -0
  153. package/dist/src/proactive/events/types.d.ts +44 -0
  154. package/dist/src/proactive/events/types.js +15 -0
  155. package/dist/src/proactive/execution/agent-executor.d.ts +16 -0
  156. package/dist/src/proactive/execution/agent-executor.js +104 -0
  157. package/dist/src/proactive/execution/context.d.ts +31 -0
  158. package/dist/src/proactive/execution/context.js +72 -0
  159. package/dist/src/proactive/execution/insight.d.ts +4 -0
  160. package/dist/src/proactive/execution/insight.js +74 -0
  161. package/dist/src/proactive/execution/repository.d.ts +23 -0
  162. package/dist/src/proactive/execution/repository.js +122 -0
  163. package/dist/src/proactive/execution/types.d.ts +54 -0
  164. package/dist/src/proactive/execution/types.js +1 -0
  165. package/dist/src/proactive/execution/worker.d.ts +15 -0
  166. package/dist/src/proactive/execution/worker.js +96 -0
  167. package/dist/src/proactive/inbox/repository.d.ts +24 -0
  168. package/dist/src/proactive/inbox/repository.js +117 -0
  169. package/dist/src/proactive/inbox/service.d.ts +17 -0
  170. package/dist/src/proactive/inbox/service.js +22 -0
  171. package/dist/src/proactive/inbox/types.d.ts +38 -0
  172. package/dist/src/proactive/inbox/types.js +1 -0
  173. package/dist/src/proactive/inbox/worker.d.ts +12 -0
  174. package/dist/src/proactive/inbox/worker.js +56 -0
  175. package/dist/src/proactive/index.d.ts +17 -0
  176. package/dist/src/proactive/index.js +11 -0
  177. package/dist/src/proactive/routing/batch-repository.d.ts +27 -0
  178. package/dist/src/proactive/routing/batch-repository.js +56 -0
  179. package/dist/src/proactive/routing/matcher.d.ts +5 -0
  180. package/dist/src/proactive/routing/matcher.js +56 -0
  181. package/dist/src/proactive/routing/types.d.ts +44 -0
  182. package/dist/src/proactive/routing/types.js +1 -0
  183. package/dist/src/proactive/scenarios/prompt-composer.d.ts +14 -0
  184. package/dist/src/proactive/scenarios/prompt-composer.js +24 -0
  185. package/dist/src/proactive/scenarios/repository.d.ts +23 -0
  186. package/dist/src/proactive/scenarios/repository.js +162 -0
  187. package/dist/src/proactive/scenarios/service.d.ts +15 -0
  188. package/dist/src/proactive/scenarios/service.js +26 -0
  189. package/dist/src/proactive/scenarios/types.d.ts +36 -0
  190. package/dist/src/proactive/scenarios/types.js +1 -0
  191. package/dist/src/proactive/service.d.ts +18 -0
  192. package/dist/src/proactive/service.js +61 -0
  193. package/dist/src/projects/project-service.d.ts +3 -1
  194. package/dist/src/projects/project-service.js +62 -32
  195. package/dist/src/providers/index.js +4 -2
  196. package/dist/src/providers/provider-auth-service.d.ts +22 -0
  197. package/dist/src/providers/provider-auth-service.js +66 -0
  198. package/dist/src/providers/register-runtime-providers.d.ts +6 -0
  199. package/dist/src/providers/register-runtime-providers.js +55 -0
  200. package/dist/src/providers/xopc-cloud-account-service.d.ts +2 -2
  201. package/dist/src/providers/xopc-cloud-account-service.js +6 -5
  202. package/dist/src/providers/xopc-cloud-config.d.ts +3 -0
  203. package/dist/src/providers/xopc-cloud-config.js +13 -0
  204. package/dist/src/providers/xopc-cloud-model-source.d.ts +2 -2
  205. package/dist/src/providers/xopc-cloud-model-source.js +6 -5
  206. package/dist/src/session/index.d.ts +1 -1
  207. package/dist/src/session/index.js +2 -2
  208. package/dist/src/session/thinking-resolve.d.ts +8 -0
  209. package/dist/src/session/thinking-resolve.js +6 -3
  210. package/dist/src/storage/sqlite/migrations/068_proactive_event_spine.sql +71 -0
  211. package/dist/src/storage/sqlite/migrations/069_proactive_scenario_control.sql +69 -0
  212. package/dist/src/storage/sqlite/migrations/070_proactive_execution.sql +55 -0
  213. package/dist/src/storage/sqlite/migrations/071_proactive_inbox.sql +45 -0
  214. package/dist/src/storage/sqlite/migrations/072_proactive_judgments.sql +14 -0
  215. package/dist/src/storage/sqlite/migrations/073_enable_default_proactive_scenarios.sql +13 -0
  216. package/dist/src/storage/sqlite/migrations/074_deduplicate_blocked_work_routing.sql +5 -0
  217. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  218. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  219. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  220. package/dist/src/storage/sqlite/schema.js +1 -1
  221. package/dist/src/tui/tui.js +2 -2
  222. package/dist/src/tui/xopc-tui-keybindings.d.ts +44 -4
  223. package/dist/src/work-discovery/thread-service.d.ts +1 -3
  224. package/dist/src/work-discovery/thread-service.js +13 -25
  225. package/dist/src/work-items/work-item-service.d.ts +3 -1
  226. package/dist/src/work-items/work-item-service.js +67 -36
  227. package/dist/src/workflows/engine/workflow-engine.d.ts +1 -0
  228. package/dist/src/workflows/engine/workflow-engine.js +2 -0
  229. package/dist/src/workflows/service/workflow-run-service.js +12 -6
  230. package/dist/src/workflows/service/workflow-session-bridge.js +2 -1
  231. package/package.json +5 -5
  232. package/dist/gateway/static/root/assets/agents-D-OIB_r0.js +0 -2
  233. package/dist/gateway/static/root/assets/api-2SLLStKp.js +0 -1
  234. package/dist/gateway/static/root/assets/appearance-settings-CDXXN57j.js +0 -1
  235. package/dist/gateway/static/root/assets/apps-page-CuvFyvuu.js +0 -1
  236. package/dist/gateway/static/root/assets/automations-page-DetGVTjI.js +0 -6
  237. package/dist/gateway/static/root/assets/capabilities-settings-panel-nS_AMN1K.js +0 -7
  238. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DIO8ZNHW.js +0 -1
  239. package/dist/gateway/static/root/assets/channels-settings-4Im3vtnO.js +0 -1
  240. package/dist/gateway/static/root/assets/channels-status-swr-CMctpuqb.js +0 -1
  241. package/dist/gateway/static/root/assets/connectors-page-vL3SjHSc.js +0 -2
  242. package/dist/gateway/static/root/assets/copy-VueTIC2x.js +0 -1
  243. package/dist/gateway/static/root/assets/desktop-pet-CwOI_Hei.js +0 -1
  244. package/dist/gateway/static/root/assets/focus-detail-page-CCaZthpU.js +0 -1
  245. package/dist/gateway/static/root/assets/goal-detail-page-ChS2rU0w.js +0 -4
  246. package/dist/gateway/static/root/assets/index-DJ5vdaHk.css +0 -1
  247. package/dist/gateway/static/root/assets/index-TnouSpay.js +0 -212
  248. package/dist/gateway/static/root/assets/local-app-workbench-page-HQeu_F1C.js +0 -2
  249. package/dist/gateway/static/root/assets/messages-BP8aQX-5.js +0 -3
  250. package/dist/gateway/static/root/assets/notes-workbench-_FgNPlOx.js +0 -4
  251. package/dist/gateway/static/root/assets/pdf-epILhEOn.js +0 -54
  252. package/dist/gateway/static/root/assets/pdf.worker.min-iDqQPrd3.mjs +0 -31
  253. package/dist/gateway/static/root/assets/project-detail-page-MNi-3mZU.js +0 -1
  254. package/dist/gateway/static/root/assets/projects-page-xx8nUKZO.js +0 -1
  255. package/dist/gateway/static/root/assets/remote-access-hub-H5DSn2bR.js +0 -1
  256. package/dist/gateway/static/root/assets/sessions-page-CMQsupwM.js +0 -1
  257. package/dist/gateway/static/root/assets/settings-advanced-gate-OBUdG6bV.js +0 -1
  258. package/dist/gateway/static/root/assets/shares-settings-Bhz21P05.js +0 -1
  259. package/dist/gateway/static/root/assets/skill-reload-api-CBP-UB88.js +0 -1
  260. package/dist/gateway/static/root/assets/skills-page-A0rNObNB.js +0 -2
  261. package/dist/gateway/static/root/assets/user-context-page-8XdpiAyP.js +0 -1
  262. package/dist/gateway/static/root/assets/work-discovery-page-DBer86NF.js +0 -1
  263. package/dist/gateway/static/root/assets/work-item-detail-page-BUPyfYaq.js +0 -1
  264. package/dist/gateway/static/root/assets/work-page-G8phwwI1.js +0 -1
  265. package/dist/gateway/static/root/assets/workflow-run-setup-panel-IKxqDAXw.js +0 -3
  266. package/dist/gateway/static/root/assets/workflows-page-CNls7g6v.js +0 -11
  267. package/dist/src/focuses/candidate-repository.d.ts +0 -15
  268. package/dist/src/focuses/candidate-repository.js +0 -91
  269. package/dist/src/focuses/index.d.ts +0 -7
  270. package/dist/src/focuses/index.js +0 -7
  271. package/dist/src/focuses/insight-repository.d.ts +0 -22
  272. package/dist/src/focuses/insight-repository.js +0 -77
  273. package/dist/src/focuses/prompts.d.ts +0 -2
  274. package/dist/src/focuses/prompts.js +0 -18
  275. package/dist/src/focuses/reconciler.d.ts +0 -5
  276. package/dist/src/focuses/reconciler.js +0 -26
  277. package/dist/src/focuses/repository.d.ts +0 -61
  278. package/dist/src/focuses/repository.js +0 -214
  279. package/dist/src/focuses/run-processor.d.ts +0 -18
  280. package/dist/src/focuses/run-processor.js +0 -162
  281. package/dist/src/focuses/service.d.ts +0 -42
  282. package/dist/src/focuses/service.js +0 -241
  283. package/dist/src/focuses/types.d.ts +0 -89
  284. package/dist/src/gateway/hono/routes/focuses.d.ts +0 -3
  285. package/dist/src/gateway/hono/routes/focuses.js +0 -319
  286. /package/dist/src/{focuses/types.js → proactive/events/publisher.js} +0 -0
@@ -0,0 +1,69 @@
1
+ CREATE TABLE proactive_scenarios (
2
+ scenario_key TEXT PRIMARY KEY,
3
+ version INTEGER NOT NULL CHECK (version > 0),
4
+ title TEXT NOT NULL,
5
+ description TEXT NOT NULL,
6
+ base_prompt TEXT NOT NULL,
7
+ base_template_version INTEGER NOT NULL CHECK (base_template_version > 0),
8
+ event_types_json TEXT NOT NULL,
9
+ condition_json TEXT,
10
+ aggregation TEXT NOT NULL CHECK (aggregation IN ('subject', 'project', 'workspace')),
11
+ debounce_seconds INTEGER NOT NULL CHECK (debounce_seconds >= 0),
12
+ max_window_seconds INTEGER NOT NULL CHECK (max_window_seconds > 0),
13
+ created_at TEXT NOT NULL,
14
+ updated_at TEXT NOT NULL
15
+ );
16
+
17
+ CREATE TABLE proactive_scenario_subscriptions (
18
+ subscription_id TEXT PRIMARY KEY,
19
+ scenario_key TEXT NOT NULL,
20
+ workspace_id TEXT NOT NULL,
21
+ scope_kind TEXT NOT NULL CHECK (scope_kind IN ('workspace', 'project')),
22
+ scope_id TEXT NOT NULL,
23
+ enabled INTEGER NOT NULL DEFAULT 0 CHECK (enabled IN (0, 1)),
24
+ active_prompt_revision_id TEXT,
25
+ created_at TEXT NOT NULL,
26
+ updated_at TEXT NOT NULL,
27
+ UNIQUE (scenario_key, workspace_id, scope_kind, scope_id),
28
+ FOREIGN KEY (scenario_key) REFERENCES proactive_scenarios(scenario_key) ON DELETE CASCADE
29
+ );
30
+
31
+ CREATE TABLE proactive_prompt_revisions (
32
+ revision_id TEXT PRIMARY KEY,
33
+ subscription_id TEXT NOT NULL,
34
+ revision INTEGER NOT NULL CHECK (revision > 0),
35
+ status TEXT NOT NULL CHECK (status IN ('draft', 'published', 'retired')),
36
+ base_template_version INTEGER NOT NULL CHECK (base_template_version > 0),
37
+ user_instructions TEXT NOT NULL,
38
+ content_hash TEXT NOT NULL,
39
+ created_at TEXT NOT NULL,
40
+ published_at TEXT,
41
+ UNIQUE (subscription_id, revision),
42
+ FOREIGN KEY (subscription_id) REFERENCES proactive_scenario_subscriptions(subscription_id) ON DELETE CASCADE
43
+ );
44
+
45
+ CREATE INDEX idx_proactive_subscriptions_enabled
46
+ ON proactive_scenario_subscriptions(enabled, workspace_id, scenario_key);
47
+ CREATE INDEX idx_proactive_prompt_revisions_subscription
48
+ ON proactive_prompt_revisions(subscription_id, status, revision DESC);
49
+
50
+ ALTER TABLE proactive_signal_batches ADD COLUMN subscription_id TEXT NOT NULL DEFAULT '';
51
+ DROP INDEX idx_proactive_collecting_batch;
52
+ CREATE UNIQUE INDEX idx_proactive_collecting_batch
53
+ ON proactive_signal_batches(subscription_id, scenario_key, aggregation_key)
54
+ WHERE status = 'collecting';
55
+
56
+ INSERT INTO proactive_scenarios VALUES
57
+ ('project_delivery_risk', 1, 'Project delivery risk', 'Detect credible risks to a project commitment.',
58
+ 'Identify material changes that create supported schedule, scope, dependency, capacity, or ownership risk. Ignore routine activity and unsupported absence-of-activity claims.',
59
+ 1, '["project.updated.v1","work_item.status_changed.v1","work_item.updated.v1"]', NULL,
60
+ 'project', 300, 1800, datetime('now'), datetime('now')),
61
+ ('blocked_work', 1, 'Blocked work', 'Find work that needs a decision, dependency, or owner intervention.',
62
+ 'Confirm that work is truly blocked, identify the blocking object and downstream impact, then propose the smallest supported intervention.',
63
+ 1, '["work_item.status_changed.v1","work_item.updated.v1"]',
64
+ '{"op":"any","conditions":[{"op":"eq","field":"payload.after.status","value":"blocked"},{"op":"changed","field":"payload.dependencyIds"}]}',
65
+ 'project', 180, 900, datetime('now'), datetime('now')),
66
+ ('automation_failure_impact', 1, 'Automation failure impact', 'Explain whether a terminal automation failure affects user outcomes.',
67
+ 'Classify the failure, distinguish completed from incomplete work, connect it to a user outcome, and request only supported recovery decisions. Do not repeat raw stack traces.',
68
+ 1, '["automation.run_failed.v1"]', NULL,
69
+ 'subject', 60, 300, datetime('now'), datetime('now'));
@@ -0,0 +1,55 @@
1
+ CREATE TABLE proactive_context_snapshots (
2
+ snapshot_id TEXT PRIMARY KEY,
3
+ batch_id TEXT NOT NULL,
4
+ content_json TEXT NOT NULL,
5
+ evidence_ids_json TEXT NOT NULL,
6
+ created_at TEXT NOT NULL,
7
+ FOREIGN KEY (batch_id) REFERENCES proactive_signal_batches(batch_id) ON DELETE CASCADE
8
+ );
9
+
10
+ CREATE TABLE proactive_runs (
11
+ run_id TEXT PRIMARY KEY,
12
+ batch_id TEXT NOT NULL UNIQUE,
13
+ subscription_id TEXT NOT NULL,
14
+ scenario_key TEXT NOT NULL,
15
+ scenario_version INTEGER NOT NULL,
16
+ prompt_revision_id TEXT,
17
+ context_snapshot_id TEXT,
18
+ status TEXT NOT NULL CHECK (status IN ('running', 'completed', 'discarded', 'retryable', 'failed')),
19
+ attempt INTEGER NOT NULL DEFAULT 1 CHECK (attempt > 0),
20
+ lease_owner TEXT,
21
+ lease_expires_at TEXT,
22
+ model_ref TEXT,
23
+ raw_output TEXT,
24
+ error_message TEXT,
25
+ next_attempt_at TEXT,
26
+ started_at TEXT NOT NULL,
27
+ completed_at TEXT,
28
+ updated_at TEXT NOT NULL,
29
+ FOREIGN KEY (batch_id) REFERENCES proactive_signal_batches(batch_id) ON DELETE CASCADE,
30
+ FOREIGN KEY (subscription_id) REFERENCES proactive_scenario_subscriptions(subscription_id) ON DELETE CASCADE,
31
+ FOREIGN KEY (prompt_revision_id) REFERENCES proactive_prompt_revisions(revision_id),
32
+ FOREIGN KEY (context_snapshot_id) REFERENCES proactive_context_snapshots(snapshot_id)
33
+ );
34
+
35
+ CREATE TABLE proactive_insights (
36
+ insight_id TEXT PRIMARY KEY,
37
+ run_id TEXT NOT NULL UNIQUE,
38
+ subscription_id TEXT NOT NULL,
39
+ scenario_key TEXT NOT NULL,
40
+ title TEXT NOT NULL,
41
+ summary TEXT NOT NULL,
42
+ why_now TEXT NOT NULL,
43
+ impact TEXT NOT NULL,
44
+ recommendation TEXT NOT NULL,
45
+ urgency TEXT NOT NULL CHECK (urgency IN ('low', 'medium', 'high', 'critical')),
46
+ confidence REAL NOT NULL CHECK (confidence >= 0 AND confidence <= 1),
47
+ value_score REAL NOT NULL CHECK (value_score >= 0 AND value_score <= 1),
48
+ evidence_ids_json TEXT NOT NULL,
49
+ created_at TEXT NOT NULL,
50
+ FOREIGN KEY (run_id) REFERENCES proactive_runs(run_id) ON DELETE CASCADE,
51
+ FOREIGN KEY (subscription_id) REFERENCES proactive_scenario_subscriptions(subscription_id) ON DELETE CASCADE
52
+ );
53
+
54
+ CREATE INDEX idx_proactive_runs_status_lease ON proactive_runs(status, next_attempt_at, lease_expires_at, updated_at);
55
+ CREATE INDEX idx_proactive_insights_created ON proactive_insights(created_at DESC);
@@ -0,0 +1,45 @@
1
+ CREATE TABLE proactive_inbox_items (
2
+ inbox_item_id TEXT PRIMARY KEY,
3
+ insight_id TEXT NOT NULL UNIQUE,
4
+ status TEXT NOT NULL CHECK (status IN ('unread', 'read', 'snoozed', 'resolved')),
5
+ snoozed_until TEXT,
6
+ resolution TEXT,
7
+ created_at TEXT NOT NULL,
8
+ updated_at TEXT NOT NULL,
9
+ FOREIGN KEY (insight_id) REFERENCES proactive_insights(insight_id) ON DELETE CASCADE
10
+ );
11
+
12
+ CREATE TABLE proactive_decisions (
13
+ decision_id TEXT PRIMARY KEY,
14
+ inbox_item_id TEXT NOT NULL,
15
+ choice TEXT NOT NULL,
16
+ note TEXT NOT NULL,
17
+ created_at TEXT NOT NULL,
18
+ FOREIGN KEY (inbox_item_id) REFERENCES proactive_inbox_items(inbox_item_id) ON DELETE CASCADE
19
+ );
20
+
21
+ CREATE TABLE proactive_delivery_outbox (
22
+ delivery_id TEXT PRIMARY KEY,
23
+ inbox_item_id TEXT NOT NULL UNIQUE,
24
+ status TEXT NOT NULL CHECK (status IN ('pending', 'delivering', 'delivered', 'retryable', 'failed')),
25
+ attempt INTEGER NOT NULL DEFAULT 0 CHECK (attempt >= 0),
26
+ next_attempt_at TEXT NOT NULL,
27
+ lease_expires_at TEXT,
28
+ error_message TEXT,
29
+ created_at TEXT NOT NULL,
30
+ delivered_at TEXT,
31
+ updated_at TEXT NOT NULL,
32
+ FOREIGN KEY (inbox_item_id) REFERENCES proactive_inbox_items(inbox_item_id) ON DELETE CASCADE
33
+ );
34
+
35
+ CREATE TABLE proactive_feedback (
36
+ feedback_id TEXT PRIMARY KEY,
37
+ inbox_item_id TEXT NOT NULL,
38
+ rating TEXT NOT NULL CHECK (rating IN ('useful', 'not_useful')),
39
+ note TEXT NOT NULL,
40
+ created_at TEXT NOT NULL,
41
+ FOREIGN KEY (inbox_item_id) REFERENCES proactive_inbox_items(inbox_item_id) ON DELETE CASCADE
42
+ );
43
+
44
+ CREATE INDEX idx_proactive_inbox_status ON proactive_inbox_items(status, updated_at DESC);
45
+ CREATE INDEX idx_proactive_outbox_ready ON proactive_delivery_outbox(status, next_attempt_at);
@@ -0,0 +1,14 @@
1
+ ALTER TABLE proactive_insights ADD COLUMN work_done TEXT NOT NULL DEFAULT '';
2
+ ALTER TABLE proactive_insights ADD COLUMN decision_json TEXT;
3
+
4
+ CREATE TABLE proactive_instruction_feedback (
5
+ instruction_id TEXT PRIMARY KEY,
6
+ inbox_item_id TEXT NOT NULL,
7
+ prompt_revision_id TEXT NOT NULL,
8
+ instruction TEXT NOT NULL,
9
+ created_at TEXT NOT NULL,
10
+ FOREIGN KEY (inbox_item_id) REFERENCES proactive_inbox_items(inbox_item_id) ON DELETE CASCADE,
11
+ FOREIGN KEY (prompt_revision_id) REFERENCES proactive_prompt_revisions(revision_id)
12
+ );
13
+
14
+ CREATE INDEX idx_proactive_instruction_item ON proactive_instruction_feedback(inbox_item_id, created_at DESC);
@@ -0,0 +1,13 @@
1
+ INSERT OR IGNORE INTO proactive_scenario_subscriptions (
2
+ subscription_id,
3
+ scenario_key,
4
+ workspace_id,
5
+ scope_kind,
6
+ scope_id,
7
+ enabled,
8
+ created_at,
9
+ updated_at
10
+ ) VALUES
11
+ ('default-project-delivery-risk', 'project_delivery_risk', 'default', 'workspace', 'default', 1, datetime('now'), datetime('now')),
12
+ ('default-blocked-work', 'blocked_work', 'default', 'workspace', 'default', 1, datetime('now'), datetime('now')),
13
+ ('default-automation-failure-impact', 'automation_failure_impact', 'default', 'workspace', 'default', 1, datetime('now'), datetime('now'));
@@ -0,0 +1,5 @@
1
+ UPDATE proactive_scenarios
2
+ SET condition_json = '{"op":"neq","field":"payload.after.status","value":"blocked"}',
3
+ version = version + 1,
4
+ updated_at = datetime('now')
5
+ WHERE scenario_key = 'project_delivery_risk';
@@ -3,7 +3,7 @@ import type { ApplyMigrationsOptions } from './types.js';
3
3
  /** Baseline schema version applied from schema.sql on first open. */
4
4
  export declare const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
5
5
  /** Latest schema version this release supports (increment when adding migrations). */
6
- export declare const XOPC_DB_SCHEMA_VERSION = 67;
6
+ export declare const XOPC_DB_SCHEMA_VERSION = 74;
7
7
  export declare function resolveMigrationsDir(override?: string): string;
8
8
  /**
9
9
  * Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.
@@ -12,7 +12,7 @@ const log = createLogger("Sqlite:Migrations");
12
12
  /** Baseline schema version applied from schema.sql on first open. */
13
13
  const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
14
14
  /** Latest schema version this release supports (increment when adding migrations). */
15
- const XOPC_DB_SCHEMA_VERSION = 67;
15
+ const XOPC_DB_SCHEMA_VERSION = 74;
16
16
  const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
17
17
  function resolveMigrationsDir(override) {
18
18
  if (override) return override;
@@ -46,7 +46,7 @@ function applySingleMigration(db, migration) {
46
46
  * Each step runs in its own transaction and updates schema_meta on success.
47
47
  */
48
48
  function applyPendingMigrations(db, options = {}) {
49
- const targetVersion = options.targetVersion ?? 67;
49
+ const targetVersion = options.targetVersion ?? 74;
50
50
  let currentVersion = readSchemaVersion(db);
51
51
  if (currentVersion > targetVersion) throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);
52
52
  if (currentVersion >= targetVersion) return currentVersion;
@@ -62,7 +62,7 @@ function applyPendingMigrations(db, options = {}) {
62
62
  }
63
63
  /** Inspect schema version without mutating the database. */
64
64
  function inspectSchemaMigrationStatus(db, options = {}) {
65
- const appVersion = options.targetVersion ?? 67;
65
+ const appVersion = options.targetVersion ?? 74;
66
66
  const dbVersion = readSchemaVersion(db);
67
67
  if (dbVersion > appVersion) return {
68
68
  dbVersion,
@@ -19,7 +19,7 @@ const log = createLogger('Sqlite:Migrations');
19
19
  export const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
20
20
 
21
21
  /** Latest schema version this release supports (increment when adding migrations). */
22
- export const XOPC_DB_SCHEMA_VERSION = 67;
22
+ export const XOPC_DB_SCHEMA_VERSION = 74;
23
23
 
24
24
  const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
25
25
 
@@ -31,7 +31,7 @@ function ensureXopcDatabaseSchema(db) {
31
31
  bootstrapFreshDatabase(db);
32
32
  currentVersion = 11;
33
33
  }
34
- applyPendingMigrations(db, { targetVersion: 67 });
34
+ applyPendingMigrations(db, { targetVersion: 74 });
35
35
  }
36
36
  //#endregion
37
37
  export { SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_SCHEMA_VERSION, ensureSchemaMetaTable, ensureXopcDatabaseSchema, readSchemaVersion, readSchemaVersionForTest, setSchemaVersion };
@@ -59,7 +59,7 @@ import { dirname, isAbsolute, join, relative, resolve } from "node:path";
59
59
  import { mkdirSync, mkdtempSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
60
60
  import { spawnSync } from "node:child_process";
61
61
  import { randomUUID } from "node:crypto";
62
- import { Container, Loader, ProcessTerminal, TUI, setKeybindings } from "@earendil-works/pi-tui";
62
+ import { Container, Loader, ProcessTerminal, TuiMainScreen, setKeybindings } from "@earendil-works/pi-tui";
63
63
  import { Buffer } from "node:buffer";
64
64
  //#region src/tui/tui.ts
65
65
  init_paths();
@@ -252,7 +252,7 @@ async function runTui(opts) {
252
252
  bottomBar.invalidate();
253
253
  tui.requestRender();
254
254
  };
255
- const tui = new TUI(new ProcessTerminal());
255
+ const tui = new TuiMainScreen(new ProcessTerminal());
256
256
  tui.setShowHardwareCursor(tuiSettings.showHardwareCursor);
257
257
  tui.setClearOnShrink(tuiSettings.clearOnShrink);
258
258
  const dedupeBackspace = createBackspaceDeduper();
@@ -213,6 +213,14 @@ export declare const XOPC_TUI_KEYBINDINGS: {
213
213
  readonly defaultKeys: "down";
214
214
  readonly description: "Move cursor down";
215
215
  };
216
+ readonly "tui.editor.historyPrevious": {
217
+ readonly defaultKeys: [];
218
+ readonly description: "Select previous prompt history entry";
219
+ };
220
+ readonly "tui.editor.historyNext": {
221
+ readonly defaultKeys: [];
222
+ readonly description: "Select next prompt history entry";
223
+ };
216
224
  readonly "tui.editor.cursorLeft": {
217
225
  readonly defaultKeys: ["left", "ctrl+b"];
218
226
  readonly description: "Move cursor left";
@@ -230,11 +238,11 @@ export declare const XOPC_TUI_KEYBINDINGS: {
230
238
  readonly description: "Move cursor word right";
231
239
  };
232
240
  readonly "tui.editor.cursorLineStart": {
233
- readonly defaultKeys: ["home", "ctrl+a"];
241
+ readonly defaultKeys: ["home", "ctrl+home", "ctrl+a"];
234
242
  readonly description: "Move to line start";
235
243
  };
236
244
  readonly "tui.editor.cursorLineEnd": {
237
- readonly defaultKeys: ["end", "ctrl+e"];
245
+ readonly defaultKeys: ["end", "ctrl+end", "ctrl+e"];
238
246
  readonly description: "Move to line end";
239
247
  };
240
248
  readonly "tui.editor.jumpForward": {
@@ -246,11 +254,11 @@ export declare const XOPC_TUI_KEYBINDINGS: {
246
254
  readonly description: "Jump backward to character";
247
255
  };
248
256
  readonly "tui.editor.pageUp": {
249
- readonly defaultKeys: "pageUp";
257
+ readonly defaultKeys: ["pageUp", "ctrl+pageUp"];
250
258
  readonly description: "Page up";
251
259
  };
252
260
  readonly "tui.editor.pageDown": {
253
- readonly defaultKeys: "pageDown";
261
+ readonly defaultKeys: ["pageDown", "ctrl+pageDown"];
254
262
  readonly description: "Page down";
255
263
  };
256
264
  readonly "tui.editor.deleteCharBackward": {
@@ -329,6 +337,38 @@ export declare const XOPC_TUI_KEYBINDINGS: {
329
337
  readonly defaultKeys: ["escape", "ctrl+c"];
330
338
  readonly description: "Cancel selection";
331
339
  };
340
+ readonly "tui.altScreen.pageUp": {
341
+ readonly defaultKeys: "pageUp";
342
+ readonly description: "Scroll viewport up one page";
343
+ };
344
+ readonly "tui.altScreen.pageDown": {
345
+ readonly defaultKeys: "pageDown";
346
+ readonly description: "Scroll viewport down one page";
347
+ };
348
+ readonly "tui.altScreen.halfPageUp": {
349
+ readonly defaultKeys: [];
350
+ readonly description: "Scroll viewport up half a page";
351
+ };
352
+ readonly "tui.altScreen.halfPageDown": {
353
+ readonly defaultKeys: [];
354
+ readonly description: "Scroll viewport down half a page";
355
+ };
356
+ readonly "tui.altScreen.previousPrompt": {
357
+ readonly defaultKeys: "ctrl+shift+up";
358
+ readonly description: "Jump to previous semantic prompt";
359
+ };
360
+ readonly "tui.altScreen.nextPrompt": {
361
+ readonly defaultKeys: "ctrl+shift+down";
362
+ readonly description: "Jump to next semantic prompt";
363
+ };
364
+ readonly "tui.altScreen.top": {
365
+ readonly defaultKeys: "home";
366
+ readonly description: "Scroll viewport to top";
367
+ };
368
+ readonly "tui.altScreen.bottom": {
369
+ readonly defaultKeys: "end";
370
+ readonly description: "Scroll viewport to bottom";
371
+ };
332
372
  };
333
373
  /** Order for `/hotkeys` and docs (pi-style UX). */
334
374
  export declare const XOPC_TUI_HOTKEY_ORDER: XopcTuiAppKeybinding[];
@@ -1,8 +1,6 @@
1
1
  import type { WorkContextSnapshot, WorkDiscoveryResult, WorkUnderstandingEvidenceItem, WorkUnderstandingThread } from './types.js';
2
2
  /**
3
- * Discovery produces suggestions only. The user turns a suggestion into a Focus explicitly.
4
- * The legacy thread-shaped return value remains local to the discovery result renderer; it is
5
- * not a second persisted domain model.
3
+ * Discovery returns bounded suggestions for the current result only.
6
4
  */
7
5
  export declare function persistWorkThreadsFromDiscovery(input: {
8
6
  projectId: string;
@@ -1,50 +1,38 @@
1
- import { upsertFocusCandidate } from "../focuses/candidate-repository.js";
2
1
  //#region src/work-discovery/thread-service.ts
3
2
  function confidenceValue(value) {
4
3
  return value === "high" ? .9 : value === "medium" ? .72 : .55;
5
4
  }
6
5
  /**
7
- * Discovery produces suggestions only. The user turns a suggestion into a Focus explicitly.
8
- * The legacy thread-shaped return value remains local to the discovery result renderer; it is
9
- * not a second persisted domain model.
6
+ * Discovery returns bounded suggestions for the current result only.
10
7
  */
11
8
  function persistWorkThreadsFromDiscovery(input) {
12
9
  const nowMs = input.nowMs ?? Date.now();
13
10
  return (input.result.workThreadCandidates ?? []).flatMap((candidate) => {
14
- const evidence = candidate.evidenceRefs.flatMap((ref) => {
11
+ if (candidate.evidenceRefs.flatMap((ref) => {
15
12
  const item = input.evidence.find((entry) => entry.sourceRef === ref);
16
13
  return item ? [{
17
14
  label: item.observation.slice(0, 300),
18
15
  source: item.sourceRef
19
16
  }] : [];
20
- });
21
- if (evidence.length === 0) return [];
17
+ }).length === 0) return [];
22
18
  const canonicalKey = `${input.projectId}:${candidate.horizon}:${candidate.topicKey}`.slice(0, 300);
23
- const stored = upsertFocusCandidate({
19
+ const confidence = confidenceValue(candidate.confidence);
20
+ return [{
21
+ id: canonicalKey,
24
22
  canonicalKey,
25
23
  title: candidate.title,
26
24
  summary: candidate.summary,
27
- confidence: confidenceValue(candidate.confidence),
28
- evidence,
29
- projectIds: [input.projectId],
30
- nowMs
31
- });
32
- return [{
33
- id: stored.id,
34
- canonicalKey,
35
- title: stored.title,
36
- summary: stored.summary,
37
25
  status: candidate.status,
38
26
  horizon: candidate.horizon,
39
- focusScore: Math.round(stored.confidence * 100),
40
- confidence: stored.confidence,
27
+ focusScore: Math.round(confidence * 100),
28
+ confidence,
41
29
  userStatus: "unreviewed",
42
- projectIds: stored.projectIds,
30
+ projectIds: [input.projectId],
43
31
  evidenceIds: [],
44
- firstObservedAt: stored.discoveredAt,
45
- lastObservedAt: stored.updatedAt,
46
- createdAt: stored.discoveredAt,
47
- updatedAt: stored.updatedAt
32
+ firstObservedAt: nowMs,
33
+ lastObservedAt: nowMs,
34
+ createdAt: nowMs,
35
+ updatedAt: nowMs
48
36
  }];
49
37
  });
50
38
  }
@@ -1,4 +1,5 @@
1
1
  import type { MediaRef } from '../media/types.js';
2
+ import type { ProactiveSignalPublisher } from '../proactive/events/publisher.js';
2
3
  import { WorkItemStore } from './work-item-store.js';
3
4
  import type { CreateWorkItemUpdateSuggestionInput, CreateWorkItemInput, UpdateWorkItemInput, WorkItem, WorkItemAttachment, WorkItemEvent, WorkItemLink, WorkItemListQuery, WorkItemListResult, WorkItemUpdateSuggestion, WorkItemUpdateSuggestionStatus } from './types.js';
4
5
  export declare const WORK_ITEM_ATTACHMENT_MAX_BYTES: number;
@@ -6,7 +7,8 @@ export declare const WORK_ITEM_ATTACHMENT_MAX_COUNT = 10;
6
7
  export declare const WORK_ITEM_ATTACHMENT_UPLOAD_BODY_MAX_BYTES: number;
7
8
  export declare class WorkItemService {
8
9
  private readonly store;
9
- constructor(store?: WorkItemStore);
10
+ private readonly signals?;
11
+ constructor(store?: WorkItemStore, signals?: ProactiveSignalPublisher);
10
12
  listProjectWorkItems(projectId: string, query?: WorkItemListQuery): WorkItemListResult;
11
13
  listWorkItems(query?: WorkItemListQuery): WorkItemListResult;
12
14
  createProjectWorkItem(projectId: string, input: CreateWorkItemInput): WorkItem;
@@ -1,7 +1,9 @@
1
+ import { runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
1
2
  import { changedFieldsFromPatch, emitActivity, systemActivityActor, systemActivitySource } from "../activity/emitter.js";
2
3
  import { deleteMediaBuffer, mimeTypeFromMediaPath, saveMediaBuffer } from "../media/store.js";
3
4
  import { readMediaReference } from "../media/media-reference.js";
4
5
  import { WorkItemStore } from "./work-item-store.js";
6
+ import { createHash } from "node:crypto";
5
7
  //#region src/work-items/work-item-service.ts
6
8
  const WORK_ITEM_ATTACHMENT_MAX_BYTES = 25 * 1024 * 1024;
7
9
  const WORK_ITEM_ATTACHMENT_MAX_COUNT = 10;
@@ -16,8 +18,9 @@ function attachmentTypeForMediaRef(attachment) {
16
18
  return attachment.type === "file" ? "document" : attachment.type;
17
19
  }
18
20
  var WorkItemService = class {
19
- constructor(store = new WorkItemStore()) {
21
+ constructor(store = new WorkItemStore(), signals) {
20
22
  this.store = store;
23
+ this.signals = signals;
21
24
  }
22
25
  listProjectWorkItems(projectId, query = {}) {
23
26
  return this.store.list(projectId, query);
@@ -62,42 +65,70 @@ var WorkItemService = class {
62
65
  return this.store.get(id);
63
66
  }
64
67
  updateWorkItem(id, patch) {
65
- const before = this.store.get(id);
66
- if (!before) return null;
67
- const after = this.store.update(id, patch);
68
- if (!after) return null;
69
- if (before.status !== after.status) this.store.addEvent(id, "status_changed", {
70
- from: before.status,
71
- to: after.status
72
- });
73
- else this.store.addEvent(id, "updated", patch);
74
- if (!before.archivedAt && after.archivedAt) this.store.addEvent(id, "archived", { archivedAt: after.archivedAt });
75
- const type = !before.archivedAt && after.archivedAt ? "work_item.archived" : before.status !== after.status ? "work_item.status_changed" : "work_item.updated";
76
- emitActivity({
77
- type,
78
- primaryObject: {
79
- kind: "work_item",
80
- id: after.id,
81
- title: after.title
82
- },
83
- actor: systemActivityActor(),
84
- source: systemActivitySource(),
85
- payload: {
86
- changes: changedFieldsFromPatch(patch),
87
- ...type === "work_item.status_changed" ? {
88
- from: before.status,
89
- to: after.status
90
- } : {},
91
- ...type === "work_item.archived" ? { archivedAt: after.archivedAt } : {}
92
- },
93
- scopes: [{
94
- scopeKind: "project",
95
- scopeId: after.projectId,
96
- reason: "object_owner"
97
- }],
98
- nowMs: after.updatedAt
68
+ return runSqliteWriteTransaction(() => {
69
+ const before = this.store.get(id);
70
+ if (!before) return null;
71
+ const after = this.store.update(id, patch);
72
+ if (!after) return null;
73
+ if (before.status !== after.status) this.store.addEvent(id, "status_changed", {
74
+ from: before.status,
75
+ to: after.status
76
+ });
77
+ else this.store.addEvent(id, "updated", patch);
78
+ if (!before.archivedAt && after.archivedAt) this.store.addEvent(id, "archived", { archivedAt: after.archivedAt });
79
+ const type = !before.archivedAt && after.archivedAt ? "work_item.archived" : before.status !== after.status ? "work_item.status_changed" : "work_item.updated";
80
+ const changes = changedFieldsFromPatch(patch);
81
+ emitActivity({
82
+ type,
83
+ primaryObject: {
84
+ kind: "work_item",
85
+ id: after.id,
86
+ title: after.title
87
+ },
88
+ actor: systemActivityActor(),
89
+ source: systemActivitySource(),
90
+ payload: {
91
+ changes,
92
+ ...type === "work_item.status_changed" ? {
93
+ from: before.status,
94
+ to: after.status
95
+ } : {},
96
+ ...type === "work_item.archived" ? { archivedAt: after.archivedAt } : {}
97
+ },
98
+ scopes: [{
99
+ scopeKind: "project",
100
+ scopeId: after.projectId,
101
+ reason: "object_owner"
102
+ }],
103
+ nowMs: after.updatedAt
104
+ });
105
+ this.signals?.publish({
106
+ type: before.status !== after.status ? "work_item.status_changed.v1" : "work_item.updated.v1",
107
+ schemaVersion: 1,
108
+ source: {
109
+ kind: "work_items",
110
+ id: "local"
111
+ },
112
+ subject: {
113
+ kind: "work_item",
114
+ id: after.id
115
+ },
116
+ actor: { kind: "system" },
117
+ scope: {
118
+ workspaceId: "default",
119
+ projectId: after.projectId
120
+ },
121
+ occurredAt: new Date(after.updatedAt).toISOString(),
122
+ dedupeKey: `work_item:${after.id}:${after.updatedAt}:${createHash("sha256").update(JSON.stringify(patch)).digest("hex")}`,
123
+ sensitivity: "personal",
124
+ payload: {
125
+ before,
126
+ after,
127
+ changes
128
+ }
129
+ });
130
+ return after;
99
131
  });
100
- return after;
101
132
  }
102
133
  addLink(workItemId, input, eventType = "link_added") {
103
134
  if (!this.store.get(workItemId)) return null;
@@ -8,6 +8,7 @@ import type { Api, Model } from '@earendil-works/pi-ai';
8
8
  import type { WorkflowAgentInvocationSnapshot } from '../domain/index.js';
9
9
  export interface WorkflowEngineOptions {
10
10
  cwd: string;
11
+ projectId?: string;
11
12
  eventStore: WorkflowEventStore;
12
13
  runStore: WorkflowRunStore;
13
14
  runner: WorkflowRuntimeSubagentRunner;
@@ -164,6 +164,7 @@ var WorkflowEngine = class {
164
164
  sessionKey,
165
165
  sessionMetadata: {
166
166
  parentSessionKey: this.options.parentSessionKey,
167
+ projectId: this.options.projectId,
167
168
  workflowRunId: runId,
168
169
  workflowDefinitionId: definition.id,
169
170
  workflowAgentId: agentId,
@@ -370,6 +371,7 @@ var WorkflowEngine = class {
370
371
  sessionKey,
371
372
  sessionMetadata: {
372
373
  parentSessionKey: this.options.parentSessionKey,
374
+ projectId: this.options.projectId,
373
375
  workflowRunId: params.runId,
374
376
  workflowDefinitionId: params.definition.id,
375
377
  workflowAgentId: target.agentId,