@xopcai/xopc 0.0.176 → 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 (233) 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-DsFM1upC.js → activity-store-Wu2ikfbM.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DvdMLOga.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-BdPLCCBm.js → api-DljBt-N5.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-DMLDOHul.js → app-management-settings-panel-CKoZRi7Y.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-DbI9foFR.js → appearance-settings-DOdXhNDo.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-Cxbn5hy8.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-Dfdxuwvb.js → archive-plugin-D18gyP76.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-Dn3RlnYD.js → attachment-load-CZh9fc8u.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automation-suggestion-card-Bc0Y7A9u.js → automation-suggestion-card-DKrVoiiK.js} +1 -1
  13. package/dist/gateway/static/root/assets/automations-page-DYv16QMU.js +6 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-0XtB-xC0.js → binary-plugins-DdSyGL6M.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-C4fXWbEE.js → block-editor-BOpNApiX.js} +6 -6
  16. package/dist/gateway/static/root/assets/{browser-settings-page-lC86-drr.js → browser-settings-page-DlcqaGu1.js} +4 -4
  17. package/dist/gateway/static/root/assets/{browser-workflow-inputs-CZmzNymN.js → browser-workflow-inputs-C0SnSj_R.js} +1 -1
  18. package/dist/gateway/static/root/assets/{browser-workflows-page-CBYM9HqG.js → browser-workflows-page-CzlzH7HA.js} +2 -2
  19. package/dist/gateway/static/root/assets/capabilities-settings-panel-QPX4wsGZ.js +7 -0
  20. package/dist/gateway/static/root/assets/{capability-presets-api-BiJxmmhW.js → capability-presets-api-RM6S7ES5.js} +1 -1
  21. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DmCeusO8.js +1 -0
  22. package/dist/gateway/static/root/assets/{channel-recipient-api-BKTUZDp-.js → channel-recipient-api-B4sha-30.js} +1 -1
  23. package/dist/gateway/static/root/assets/channels-settings-HcKoP1wm.js +1 -0
  24. package/dist/gateway/static/root/assets/channels-status-swr-D3xr2enH.js +1 -0
  25. package/dist/gateway/static/root/assets/{connector-logo-Pr4RIKjj.js → connector-logo-BPsKIyoM.js} +1 -1
  26. package/dist/gateway/static/root/assets/connectors-page-DwbThFvd.js +2 -0
  27. package/dist/gateway/static/root/assets/desktop-pet-DjL1GWON.js +1 -0
  28. package/dist/gateway/static/root/assets/{desktop-pet-settings-CEQacUDF.js → desktop-pet-settings-u_abAXh7.js} +1 -1
  29. package/dist/gateway/static/root/assets/{directory-picker-path-field-DWnxdZtc.js → directory-picker-path-field-BoZGualI.js} +1 -1
  30. package/dist/gateway/static/root/assets/{dreaming-settings-D2e2w2Ho.js → dreaming-settings-s3gn3f9h.js} +3 -3
  31. package/dist/gateway/static/root/assets/{extension-debug-page-BLjTGbv3.js → extension-debug-page-DIbMngCF.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-page-D2_UC6hy.js → extension-page-D94f2bWQ.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-settings-page-BsH6o_PX.js → extension-settings-page-B7TI13ex.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-config-api-C-DkC6UJ.js → gateway-config-api-Do77rV8R.js} +1 -1
  35. package/dist/gateway/static/root/assets/{gateway-settings-DEOGiimF.js → gateway-settings-Dt1PNJmb.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-startup-retry-BlSLh1TF.js → gateway-startup-retry-WaXTw3fi.js} +1 -1
  37. package/dist/gateway/static/root/assets/{goal-create-dialog-CSFcRE_N.js → goal-create-dialog-DEiOOLGU.js} +1 -1
  38. package/dist/gateway/static/root/assets/goal-detail-page-C1Qj4o1K.js +4 -0
  39. package/dist/gateway/static/root/assets/{goals-config-api-CcdS9qek.js → goals-config-api-BL0fAEns.js} +1 -1
  40. package/dist/gateway/static/root/assets/{goals-page-BAcErdch.js → goals-page-qJDcEDzc.js} +2 -2
  41. package/dist/gateway/static/root/assets/{goals-settings-BY7crl0z.js → goals-settings-DV3ZlrdI.js} +1 -1
  42. package/dist/gateway/static/root/assets/{heartbeat-settings-DtTkS0gs.js → heartbeat-settings-C3kzg6ai.js} +1 -1
  43. package/dist/gateway/static/root/assets/{image-generation-api-WGgkbwDZ.js → image-generation-api-BgISY8i-.js} +1 -1
  44. package/dist/gateway/static/root/assets/{index-2UImfRDC.js → index-C1h0zkNo.js} +65 -65
  45. package/dist/gateway/static/root/assets/index-Da36E3WH.css +1 -0
  46. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-C5lpWQ3f.js → keyboard-shortcuts-settings-0KSmaPu0.js} +1 -1
  47. package/dist/gateway/static/root/assets/local-app-workbench-page-DcD4mVId.js +2 -0
  48. package/dist/gateway/static/root/assets/{local-apps-page-b05wWvXG.js → local-apps-page-BMrU8u7w.js} +1 -1
  49. package/dist/gateway/static/root/assets/{locale-store-sToMfHX_.js → locale-store-DVGhFXRz.js} +1 -1
  50. package/dist/gateway/static/root/assets/{logs-page-cDE1jLJv.js → logs-page-CW5m9Cov.js} +3 -3
  51. package/dist/gateway/static/root/assets/{markdown-split-0gPVst5y.js → markdown-split-BVqbtN9o.js} +1 -1
  52. package/dist/gateway/static/root/assets/{media-plugins-Rxyq_KTm.js → media-plugins-Dr_wtkNJ.js} +1 -1
  53. package/dist/gateway/static/root/assets/messages-r8L6Ur3A.js +3 -0
  54. package/dist/gateway/static/root/assets/{notes-page-DRhNDl_Q.js → notes-page-BWZRXsq6.js} +1 -1
  55. package/dist/gateway/static/root/assets/notes-workbench-DdnwNz9x.js +4 -0
  56. package/dist/gateway/static/root/assets/{page-tabs-cOEOQqHh.js → page-tabs-DWWgy0bF.js} +1 -1
  57. package/dist/gateway/static/root/assets/{preview-open-alternatives-BopOLFvu.js → preview-open-alternatives-Bnfs93ZP.js} +1 -1
  58. package/dist/gateway/static/root/assets/{product-open-page-DWVPmmOq.js → product-open-page-BR7QFmT-.js} +1 -1
  59. package/dist/gateway/static/root/assets/project-detail-page-B8GeS4dl.js +1 -0
  60. package/dist/gateway/static/root/assets/projects-page-DOeu1Hk_.js +1 -0
  61. package/dist/gateway/static/root/assets/remote-access-hub-De94rxnE.js +1 -0
  62. package/dist/gateway/static/root/assets/{save-bar-controls-BfZmKe1t.js → save-bar-controls-BzS-rRTP.js} +1 -1
  63. package/dist/gateway/static/root/assets/{schedule-field-Cpi4jCRV.js → schedule-field-Cl2IIDAN.js} +1 -1
  64. package/dist/gateway/static/root/assets/{schema-form-OXFkcZQe.js → schema-form-BjKjp5eZ.js} +1 -1
  65. package/dist/gateway/static/root/assets/sessions-page-A7p8G0OJ.js +1 -0
  66. package/dist/gateway/static/root/assets/settings-advanced-gate-BsGzjmqx.js +1 -0
  67. package/dist/gateway/static/root/assets/{settings-form-section-BwqkZCHJ.js → settings-form-section-BSDNBfHn.js} +1 -1
  68. package/dist/gateway/static/root/assets/{settings-loading-skeleton-BbqH_S3Y.js → settings-loading-skeleton-BD4peoAv.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-page-BoxC-JSa.js → settings-page-S-P3U7at.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-page-layout-Ddu2iGaW.js → settings-page-layout-BQTLh-86.js} +1 -1
  71. package/dist/gateway/static/root/assets/{setup-status-panel-z1Lwv0js.js → setup-status-panel-W3p6kNyA.js} +1 -1
  72. package/dist/gateway/static/root/assets/{share-preview-page-CVazOFjy.js → share-preview-page-DQjMxyvw.js} +1 -1
  73. package/dist/gateway/static/root/assets/shares-settings-Xo3N99PO.js +1 -0
  74. package/dist/gateway/static/root/assets/skill-reload-api-ByPEG5t1.js +1 -0
  75. package/dist/gateway/static/root/assets/skills-page-C019Ml5q.js +2 -0
  76. package/dist/gateway/static/root/assets/{skills-page.utils-DgyB1tSo.js → skills-page.utils-CXnpudm6.js} +1 -1
  77. package/dist/gateway/static/root/assets/{system-settings-panel-BoLSQL65.js → system-settings-panel-BhFwdYJP.js} +1 -1
  78. package/dist/gateway/static/root/assets/{theme-store-CBNcGOfj.js → theme-store-DQI-HPL-.js} +1 -1
  79. package/dist/gateway/static/root/assets/{time-picker-gochWrny.js → time-picker-C0DCya4U.js} +1 -1
  80. package/dist/gateway/static/root/assets/{typed-models-lib-DvRnr7YB.js → typed-models-lib-C-M3Fv2N.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-channel-catalog-CA9BFVB7.js → use-channel-catalog-Bndq4y4I.js} +1 -1
  82. package/dist/gateway/static/root/assets/user-context-page-fYBzpus-.js +1 -0
  83. package/dist/gateway/static/root/assets/{voice-api-key-field-v8tgylEZ.js → voice-api-key-field-p_g4UI1-.js} +1 -1
  84. package/dist/gateway/static/root/assets/work-discovery-page-DI0gCZRw.js +1 -0
  85. package/dist/gateway/static/root/assets/work-item-detail-page-DnBRP2wI.js +1 -0
  86. package/dist/gateway/static/root/assets/work-page-Z-nUaS_n.js +3 -0
  87. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CC3cJn5k.js → workflow-run-setup-panel-CHEXVvhH.js} +2 -2
  88. package/dist/gateway/static/root/assets/workflows-page-BDfwnM-Y.js +11 -0
  89. package/dist/gateway/static/root/index.html +7 -7
  90. package/dist/package.js +1 -1
  91. package/dist/src/automations/service/automation-service.d.ts +3 -0
  92. package/dist/src/automations/service/automation-service.js +37 -7
  93. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  94. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  95. package/dist/src/cli/commands/update.js +1 -1
  96. package/dist/src/config/agent-profile.js +1 -1
  97. package/dist/src/gateway/agents-admin.js +1 -1
  98. package/dist/src/gateway/heartbeat/service.js +1 -1
  99. package/dist/src/gateway/hono/routes/browser-install.js +1 -1
  100. package/dist/src/gateway/hono/routes/home.d.ts +18 -2
  101. package/dist/src/gateway/hono/routes/home.js +19 -0
  102. package/dist/src/gateway/hono/routes/index.js +2 -2
  103. package/dist/src/gateway/hono/routes/local-apps.js +1 -1
  104. package/dist/src/gateway/hono/routes/proactive.d.ts +4 -0
  105. package/dist/src/gateway/hono/routes/proactive.js +157 -0
  106. package/dist/src/gateway/hono/routes/projects.js +2 -2
  107. package/dist/src/gateway/hono/routes/update.js +2 -2
  108. package/dist/src/gateway/index.js +1 -1
  109. package/dist/src/gateway/run-loop.js +1 -1
  110. package/dist/src/gateway/service.d.ts +10 -1
  111. package/dist/src/gateway/service.js +36 -36
  112. package/dist/src/heartbeat/index.js +1 -1
  113. package/dist/src/infra/gateway-processes.js +1 -1
  114. package/dist/src/infra/update-restart.js +1 -1
  115. package/dist/src/infra/update-runner.js +2 -2
  116. package/dist/src/infra/update-startup.js +1 -1
  117. package/dist/src/mcp/channel-bridge.js +1 -1
  118. package/dist/src/mobile/notification-service.d.ts +1 -0
  119. package/dist/src/mobile/notification-service.js +38 -18
  120. package/dist/src/mobile/notification-types.d.ts +2 -2
  121. package/dist/src/proactive/events/envelope.d.ts +2 -0
  122. package/dist/src/proactive/events/envelope.js +54 -0
  123. package/dist/src/proactive/events/publisher.d.ts +4 -0
  124. package/dist/src/proactive/events/repository.d.ts +9 -0
  125. package/dist/src/proactive/events/repository.js +62 -0
  126. package/dist/src/proactive/events/types.d.ts +44 -0
  127. package/dist/src/proactive/events/types.js +15 -0
  128. package/dist/src/proactive/execution/agent-executor.d.ts +16 -0
  129. package/dist/src/proactive/execution/agent-executor.js +104 -0
  130. package/dist/src/proactive/execution/context.d.ts +31 -0
  131. package/dist/src/proactive/execution/context.js +72 -0
  132. package/dist/src/proactive/execution/insight.d.ts +4 -0
  133. package/dist/src/proactive/execution/insight.js +74 -0
  134. package/dist/src/proactive/execution/repository.d.ts +23 -0
  135. package/dist/src/proactive/execution/repository.js +122 -0
  136. package/dist/src/proactive/execution/types.d.ts +54 -0
  137. package/dist/src/proactive/execution/types.js +1 -0
  138. package/dist/src/proactive/execution/worker.d.ts +15 -0
  139. package/dist/src/proactive/execution/worker.js +96 -0
  140. package/dist/src/proactive/inbox/repository.d.ts +24 -0
  141. package/dist/src/proactive/inbox/repository.js +117 -0
  142. package/dist/src/proactive/inbox/service.d.ts +17 -0
  143. package/dist/src/proactive/inbox/service.js +22 -0
  144. package/dist/src/proactive/inbox/types.d.ts +38 -0
  145. package/dist/src/proactive/inbox/types.js +1 -0
  146. package/dist/src/proactive/inbox/worker.d.ts +12 -0
  147. package/dist/src/proactive/inbox/worker.js +56 -0
  148. package/dist/src/proactive/index.d.ts +17 -0
  149. package/dist/src/proactive/index.js +11 -0
  150. package/dist/src/proactive/routing/batch-repository.d.ts +27 -0
  151. package/dist/src/proactive/routing/batch-repository.js +56 -0
  152. package/dist/src/proactive/routing/matcher.d.ts +5 -0
  153. package/dist/src/proactive/routing/matcher.js +56 -0
  154. package/dist/src/proactive/routing/types.d.ts +44 -0
  155. package/dist/src/proactive/routing/types.js +1 -0
  156. package/dist/src/proactive/scenarios/prompt-composer.d.ts +14 -0
  157. package/dist/src/proactive/scenarios/prompt-composer.js +24 -0
  158. package/dist/src/proactive/scenarios/repository.d.ts +23 -0
  159. package/dist/src/proactive/scenarios/repository.js +162 -0
  160. package/dist/src/proactive/scenarios/service.d.ts +15 -0
  161. package/dist/src/proactive/scenarios/service.js +26 -0
  162. package/dist/src/proactive/scenarios/types.d.ts +36 -0
  163. package/dist/src/proactive/scenarios/types.js +1 -0
  164. package/dist/src/proactive/service.d.ts +18 -0
  165. package/dist/src/proactive/service.js +61 -0
  166. package/dist/src/projects/project-service.d.ts +3 -1
  167. package/dist/src/projects/project-service.js +62 -32
  168. package/dist/src/storage/sqlite/migrations/068_proactive_event_spine.sql +71 -0
  169. package/dist/src/storage/sqlite/migrations/069_proactive_scenario_control.sql +69 -0
  170. package/dist/src/storage/sqlite/migrations/070_proactive_execution.sql +55 -0
  171. package/dist/src/storage/sqlite/migrations/071_proactive_inbox.sql +45 -0
  172. package/dist/src/storage/sqlite/migrations/072_proactive_judgments.sql +14 -0
  173. package/dist/src/storage/sqlite/migrations/073_enable_default_proactive_scenarios.sql +13 -0
  174. package/dist/src/storage/sqlite/migrations/074_deduplicate_blocked_work_routing.sql +5 -0
  175. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  176. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  177. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  178. package/dist/src/storage/sqlite/schema.js +1 -1
  179. package/dist/src/work-discovery/thread-service.d.ts +1 -3
  180. package/dist/src/work-discovery/thread-service.js +13 -25
  181. package/dist/src/work-items/work-item-service.d.ts +3 -1
  182. package/dist/src/work-items/work-item-service.js +67 -36
  183. package/package.json +1 -1
  184. package/dist/gateway/static/root/assets/agents-BVjlpbeZ.js +0 -2
  185. package/dist/gateway/static/root/assets/api-Bop4IQRW.js +0 -1
  186. package/dist/gateway/static/root/assets/apps-page-njqxLWYD.js +0 -1
  187. package/dist/gateway/static/root/assets/automations-page-D-eweHZJ.js +0 -6
  188. package/dist/gateway/static/root/assets/capabilities-settings-panel-6tYNfHqJ.js +0 -7
  189. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Co-ymbd9.js +0 -1
  190. package/dist/gateway/static/root/assets/channels-settings-D46eVjaQ.js +0 -1
  191. package/dist/gateway/static/root/assets/channels-status-swr-BMRAO4zZ.js +0 -1
  192. package/dist/gateway/static/root/assets/connectors-page-Dw1eYbRi.js +0 -2
  193. package/dist/gateway/static/root/assets/copy-VueTIC2x.js +0 -1
  194. package/dist/gateway/static/root/assets/desktop-pet-B8cZuQUt.js +0 -1
  195. package/dist/gateway/static/root/assets/focus-detail-page-BBXUtxRB.js +0 -1
  196. package/dist/gateway/static/root/assets/goal-detail-page-VjRArfAJ.js +0 -4
  197. package/dist/gateway/static/root/assets/index-CS9sVShT.css +0 -1
  198. package/dist/gateway/static/root/assets/local-app-workbench-page-Cl0fcPL4.js +0 -2
  199. package/dist/gateway/static/root/assets/messages-CarlxqXV.js +0 -3
  200. package/dist/gateway/static/root/assets/notes-workbench-BKNBk0Uf.js +0 -4
  201. package/dist/gateway/static/root/assets/project-detail-page-BhjEXNQW.js +0 -1
  202. package/dist/gateway/static/root/assets/projects-page-B80e69PH.js +0 -1
  203. package/dist/gateway/static/root/assets/remote-access-hub-CwdVob6H.js +0 -1
  204. package/dist/gateway/static/root/assets/sessions-page-BGt3Asj6.js +0 -1
  205. package/dist/gateway/static/root/assets/settings-advanced-gate-BnTdM9Nn.js +0 -1
  206. package/dist/gateway/static/root/assets/shares-settings-C4lXuyQj.js +0 -1
  207. package/dist/gateway/static/root/assets/skill-reload-api-DSuIDkeI.js +0 -1
  208. package/dist/gateway/static/root/assets/skills-page-xgZczqVe.js +0 -2
  209. package/dist/gateway/static/root/assets/user-context-page-CEfIy4WZ.js +0 -1
  210. package/dist/gateway/static/root/assets/work-discovery-page-B-3MClaf.js +0 -1
  211. package/dist/gateway/static/root/assets/work-item-detail-page-CEsFEdax.js +0 -1
  212. package/dist/gateway/static/root/assets/work-page-CT9AHnq6.js +0 -3
  213. package/dist/gateway/static/root/assets/workflows-page-C-1-_Zp1.js +0 -11
  214. package/dist/src/focuses/candidate-repository.d.ts +0 -15
  215. package/dist/src/focuses/candidate-repository.js +0 -91
  216. package/dist/src/focuses/index.d.ts +0 -7
  217. package/dist/src/focuses/index.js +0 -7
  218. package/dist/src/focuses/insight-repository.d.ts +0 -22
  219. package/dist/src/focuses/insight-repository.js +0 -77
  220. package/dist/src/focuses/prompts.d.ts +0 -2
  221. package/dist/src/focuses/prompts.js +0 -18
  222. package/dist/src/focuses/reconciler.d.ts +0 -5
  223. package/dist/src/focuses/reconciler.js +0 -26
  224. package/dist/src/focuses/repository.d.ts +0 -61
  225. package/dist/src/focuses/repository.js +0 -214
  226. package/dist/src/focuses/run-processor.d.ts +0 -18
  227. package/dist/src/focuses/run-processor.js +0 -162
  228. package/dist/src/focuses/service.d.ts +0 -42
  229. package/dist/src/focuses/service.js +0 -241
  230. package/dist/src/focuses/types.d.ts +0 -89
  231. package/dist/src/gateway/hono/routes/focuses.d.ts +0 -3
  232. package/dist/src/gateway/hono/routes/focuses.js +0 -319
  233. /package/dist/src/{focuses/types.js → proactive/events/publisher.js} +0 -0
@@ -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 };
@@ -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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xopcai/xopc",
3
- "version": "0.0.176",
3
+ "version": "0.0.177",
4
4
  "description": "Local-first AI system that remembers context, coordinates AI, and sustains long-term progress.",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",