@xopcai/xopc 0.0.173 → 0.0.175

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 (224) 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-ByVA0N5n.js → activity-store-CM6mQUS2.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CJ5HvqE7.js → agent-avatar-dicebear-eckyE9AY.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents-D-OIB_r0.js +2 -0
  6. package/dist/gateway/static/root/assets/api-2SLLStKp.js +1 -0
  7. package/dist/gateway/static/root/assets/{api-BZtCKzg4.js → api-BfMRS6FX.js} +1 -1
  8. package/dist/gateway/static/root/assets/{app-management-settings-panel-B0oNNcFn.js → app-management-settings-panel-DYkzZQzZ.js} +1 -1
  9. package/dist/gateway/static/root/assets/{appearance-settings-DbIj4NQ1.js → appearance-settings-CDXXN57j.js} +1 -1
  10. package/dist/gateway/static/root/assets/apps-page-CuvFyvuu.js +1 -0
  11. package/dist/gateway/static/root/assets/{archive-plugin-BICLQFWJ.js → archive-plugin-k909a76t.js} +1 -1
  12. package/dist/gateway/static/root/assets/{attachment-load-DV3PteSU.js → attachment-load-CqNzyhdJ.js} +1 -1
  13. package/dist/gateway/static/root/assets/{automation-suggestion-card-CZUImis0.js → automation-suggestion-card-snNG6u0v.js} +1 -1
  14. package/dist/gateway/static/root/assets/automations-page-DetGVTjI.js +6 -0
  15. package/dist/gateway/static/root/assets/{binary-plugins-D6zkab6N.js → binary-plugins-PfQ9ZHDF.js} +1 -1
  16. package/dist/gateway/static/root/assets/{block-editor-zCzoQI-g.js → block-editor-Xrw-DnE_.js} +6 -6
  17. package/dist/gateway/static/root/assets/browser-settings-page-G92AdEnX.js +8 -0
  18. package/dist/gateway/static/root/assets/{browser-workflow-inputs-CY3X83xQ.js → browser-workflow-inputs-DJPF2lUY.js} +1 -1
  19. package/dist/gateway/static/root/assets/{browser-workflows-page-DDRtZLuM.js → browser-workflows-page-BoXs4pgc.js} +2 -2
  20. package/dist/gateway/static/root/assets/capabilities-settings-panel-nS_AMN1K.js +7 -0
  21. package/dist/gateway/static/root/assets/{capability-presets-api-pYLW6P7g.js → capability-presets-api-BgY-Ysmi.js} +1 -1
  22. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DIO8ZNHW.js +1 -0
  23. package/dist/gateway/static/root/assets/{channel-recipient-api-DxyOH3BO.js → channel-recipient-api-D32T1EJM.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-4Im3vtnO.js +1 -0
  25. package/dist/gateway/static/root/assets/channels-status-swr-CMctpuqb.js +1 -0
  26. package/dist/gateway/static/root/assets/{connector-logo-BgANwjt-.js → connector-logo-C-l8haIK.js} +1 -1
  27. package/dist/gateway/static/root/assets/connectors-page-vL3SjHSc.js +2 -0
  28. package/dist/gateway/static/root/assets/copy-VueTIC2x.js +1 -0
  29. package/dist/gateway/static/root/assets/{desktop-pet-BPjQbPeA.js → desktop-pet-CwOI_Hei.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-settings-8CaU1Mhm.js → desktop-pet-settings-Cldo_pA3.js} +1 -1
  31. package/dist/gateway/static/root/assets/{directory-picker-path-field-BtNRUvzM.js → directory-picker-path-field-CMASXbgJ.js} +1 -1
  32. package/dist/gateway/static/root/assets/dreaming-settings-BnMx02w0.js +3 -0
  33. package/dist/gateway/static/root/assets/{extension-debug-page-DFjTfx6f.js → extension-debug-page-mUFs3ign.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-page-NyEYtWWg.js → extension-page-BsFBOZ5N.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-settings-page-BynTCfgf.js → extension-settings-page-CTEoovnV.js} +1 -1
  36. package/dist/gateway/static/root/assets/focus-detail-page-CCaZthpU.js +1 -0
  37. package/dist/gateway/static/root/assets/{gateway-config-api-BzOWImvU.js → gateway-config-api-Bwx-EetD.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-settings-DXepE_Jw.js → gateway-settings-CvgyqhR_.js} +1 -1
  39. package/dist/gateway/static/root/assets/{gateway-startup-retry-C2JXXtwg.js → gateway-startup-retry-C8f5KwkT.js} +1 -1
  40. package/dist/gateway/static/root/assets/{goal-create-dialog-ClOZyG52.js → goal-create-dialog-Bhynl9LN.js} +1 -1
  41. package/dist/gateway/static/root/assets/goal-detail-page-ChS2rU0w.js +4 -0
  42. package/dist/gateway/static/root/assets/{goals-config-api-CU3JR9MI.js → goals-config-api-CUnfbgHa.js} +1 -1
  43. package/dist/gateway/static/root/assets/goals-page-BAS_liXl.js +2 -0
  44. package/dist/gateway/static/root/assets/{goals-settings-DSZguLEx.js → goals-settings-Bkk-tOcf.js} +1 -1
  45. package/dist/gateway/static/root/assets/{heartbeat-settings-KRkYziEF.js → heartbeat-settings-D9Pldf5E.js} +1 -1
  46. package/dist/gateway/static/root/assets/{image-generation-api-Y-n6TaZ_.js → image-generation-api-D7aCMgOv.js} +1 -1
  47. package/dist/gateway/static/root/assets/index-DJ5vdaHk.css +1 -0
  48. package/dist/gateway/static/root/assets/index-TnouSpay.js +212 -0
  49. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CwrQv952.js → keyboard-shortcuts-settings-CBhtXhHb.js} +1 -1
  50. package/dist/gateway/static/root/assets/local-app-workbench-page-HQeu_F1C.js +2 -0
  51. package/dist/gateway/static/root/assets/{local-apps-page-DtITcS4K.js → local-apps-page-BtJGF3M8.js} +1 -1
  52. package/dist/gateway/static/root/assets/{locale-store-Ccv7tH8B.js → locale-store-DO-u1yS7.js} +1 -1
  53. package/dist/gateway/static/root/assets/logs-page-0lvwfLAA.js +7 -0
  54. package/dist/gateway/static/root/assets/{markdown-split-D1oZlq1m.js → markdown-split-BGPaeTch.js} +1 -1
  55. package/dist/gateway/static/root/assets/{media-plugins-BKz5V32t.js → media-plugins-C_Cx8v6u.js} +1 -1
  56. package/dist/gateway/static/root/assets/messages-BP8aQX-5.js +3 -0
  57. package/dist/gateway/static/root/assets/{notes-page-DLekBQPa.js → notes-page-CIYy5BKF.js} +1 -1
  58. package/dist/gateway/static/root/assets/notes-workbench-_FgNPlOx.js +4 -0
  59. package/dist/gateway/static/root/assets/{page-tabs-pT4nLfqS.js → page-tabs-C2vsdfJO.js} +1 -1
  60. package/dist/gateway/static/root/assets/{preview-open-alternatives-OtAiaJm2.js → preview-open-alternatives-D_VT83bW.js} +1 -1
  61. package/dist/gateway/static/root/assets/{product-open-page-CfryBKD9.js → product-open-page-BNP9kZ3Q.js} +1 -1
  62. package/dist/gateway/static/root/assets/project-detail-page-MNi-3mZU.js +1 -0
  63. package/dist/gateway/static/root/assets/{projects-page-3ubcbqHr.js → projects-page-xx8nUKZO.js} +1 -1
  64. package/dist/gateway/static/root/assets/remote-access-hub-H5DSn2bR.js +1 -0
  65. package/dist/gateway/static/root/assets/{save-bar-controls-nP1SB3Lf.js → save-bar-controls-BJL6Xb-F.js} +1 -1
  66. package/dist/gateway/static/root/assets/{schedule-field-OEQTsUNz.js → schedule-field-CxCPSLbu.js} +1 -1
  67. package/dist/gateway/static/root/assets/{schema-form-DIcAa7CJ.js → schema-form-Cao1wGbk.js} +1 -1
  68. package/dist/gateway/static/root/assets/sessions-page-CMQsupwM.js +1 -0
  69. package/dist/gateway/static/root/assets/settings-advanced-gate-OBUdG6bV.js +1 -0
  70. package/dist/gateway/static/root/assets/{settings-form-section-BxNcTbYO.js → settings-form-section-9pgClEud.js} +1 -1
  71. package/dist/gateway/static/root/assets/{settings-loading-skeleton-Dpdxu4sf.js → settings-loading-skeleton-CQz0gEUK.js} +1 -1
  72. package/dist/gateway/static/root/assets/{settings-page-DwPeOm1c.js → settings-page-DgsMzZLm.js} +1 -1
  73. package/dist/gateway/static/root/assets/{settings-page-layout-CqirFmMn.js → settings-page-layout-BhqupMfG.js} +1 -1
  74. package/dist/gateway/static/root/assets/setup-status-panel-B7BsWxJt.js +1 -0
  75. package/dist/gateway/static/root/assets/{share-preview-page-D72gYeux.js → share-preview-page-CC4dQsQN.js} +1 -1
  76. package/dist/gateway/static/root/assets/shares-settings-Bhz21P05.js +1 -0
  77. package/dist/gateway/static/root/assets/skill-reload-api-CBP-UB88.js +1 -0
  78. package/dist/gateway/static/root/assets/skills-page-A0rNObNB.js +2 -0
  79. package/dist/gateway/static/root/assets/skills-page.utils-CF4AYPQg.js +1 -0
  80. package/dist/gateway/static/root/assets/{system-settings-panel-U0tBgW46.js → system-settings-panel-CzZHWI4u.js} +1 -1
  81. package/dist/gateway/static/root/assets/{theme-store-DCKDVPFF.js → theme-store-BZWNdSZC.js} +1 -1
  82. package/dist/gateway/static/root/assets/time-picker-BC922Mdg.js +1 -0
  83. package/dist/gateway/static/root/assets/{typed-models-lib-D0XCOCAM.js → typed-models-lib-C1S-B1pk.js} +1 -1
  84. package/dist/gateway/static/root/assets/{use-channel-catalog-mq_Inao2.js → use-channel-catalog-DTiLxcLF.js} +1 -1
  85. package/dist/gateway/static/root/assets/user-context-page-8XdpiAyP.js +1 -0
  86. package/dist/gateway/static/root/assets/{voice-api-key-field-CKaDitO6.js → voice-api-key-field-CtIYRNfI.js} +1 -1
  87. package/dist/gateway/static/root/assets/work-discovery-page-DBer86NF.js +1 -0
  88. package/dist/gateway/static/root/assets/work-item-detail-page-BUPyfYaq.js +1 -0
  89. package/dist/gateway/static/root/assets/work-page-G8phwwI1.js +1 -0
  90. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-s_kS_FYA.js → workflow-run-setup-panel-IKxqDAXw.js} +2 -2
  91. package/dist/gateway/static/root/assets/workflows-page-CNls7g6v.js +11 -0
  92. package/dist/gateway/static/root/index.html +7 -7
  93. package/dist/package.js +1 -1
  94. package/dist/src/agent/agent-manager.js +1 -1
  95. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  96. package/dist/src/agent/service.js +1 -1
  97. package/dist/src/agent/skills/hub-pull.js +1 -1
  98. package/dist/src/agent/skills/index.d.ts +2 -0
  99. package/dist/src/agent/skills/index.js +14 -5
  100. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +1 -1
  101. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  102. package/dist/src/agent/skills/test-framework.js +1 -1
  103. package/dist/src/automations/domain/defaults.d.ts +1 -0
  104. package/dist/src/automations/domain/defaults.js +4 -0
  105. package/dist/src/automations/domain/index.d.ts +1 -0
  106. package/dist/src/automations/domain/index.js +2 -1
  107. package/dist/src/automations/index.js +2 -1
  108. package/dist/src/automations/service/action-executor.js +2 -2
  109. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  110. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  111. package/dist/src/cli/commands/skills.js +1 -1
  112. package/dist/src/config/agent-profile.js +1 -1
  113. package/dist/src/focuses/candidate-repository.d.ts +15 -0
  114. package/dist/src/focuses/candidate-repository.js +91 -0
  115. package/dist/src/focuses/index.d.ts +7 -0
  116. package/dist/src/focuses/index.js +7 -0
  117. package/dist/src/focuses/insight-repository.d.ts +22 -0
  118. package/dist/src/focuses/insight-repository.js +77 -0
  119. package/dist/src/focuses/prompts.d.ts +2 -0
  120. package/dist/src/focuses/prompts.js +18 -0
  121. package/dist/src/focuses/reconciler.d.ts +5 -0
  122. package/dist/src/focuses/reconciler.js +26 -0
  123. package/dist/src/focuses/repository.d.ts +61 -0
  124. package/dist/src/focuses/repository.js +214 -0
  125. package/dist/src/focuses/run-processor.d.ts +18 -0
  126. package/dist/src/focuses/run-processor.js +162 -0
  127. package/dist/src/focuses/service.d.ts +42 -0
  128. package/dist/src/focuses/service.js +241 -0
  129. package/dist/src/focuses/types.d.ts +89 -0
  130. package/dist/src/gateway/agents-admin.js +1 -1
  131. package/dist/src/gateway/heartbeat/service.js +1 -1
  132. package/dist/src/gateway/hono/routes/focuses.d.ts +3 -0
  133. package/dist/src/gateway/hono/routes/focuses.js +319 -0
  134. package/dist/src/gateway/hono/routes/home.d.ts +16 -3
  135. package/dist/src/gateway/hono/routes/home.js +113 -42
  136. package/dist/src/gateway/hono/routes/index.js +4 -0
  137. package/dist/src/gateway/hono/routes/local-apps.js +1 -1
  138. package/dist/src/gateway/hono/routes/project-skills.d.ts +3 -0
  139. package/dist/src/gateway/hono/routes/project-skills.js +119 -0
  140. package/dist/src/gateway/hono/routes/projects.js +2 -103
  141. package/dist/src/gateway/hono/routes/work-discovery.js +0 -239
  142. package/dist/src/gateway/service.d.ts +1 -1
  143. package/dist/src/gateway/service.js +17 -13
  144. package/dist/src/heartbeat/index.js +1 -1
  145. package/dist/src/infra/update-restart.js +1 -1
  146. package/dist/src/mcp/channel-bridge.js +1 -1
  147. package/dist/src/projects/index.d.ts +1 -0
  148. package/dist/src/projects/index.js +2 -1
  149. package/dist/src/projects/project-skill-service.d.ts +67 -0
  150. package/dist/src/projects/project-skill-service.js +131 -0
  151. package/dist/src/storage/sqlite/home-attention-repository.d.ts +3 -0
  152. package/dist/src/storage/sqlite/home-attention-repository.js +21 -0
  153. package/dist/src/storage/sqlite/index.d.ts +1 -0
  154. package/dist/src/storage/sqlite/index.js +2 -1
  155. package/dist/src/storage/sqlite/migrations/066_first_class_focuses.sql +126 -0
  156. package/dist/src/storage/sqlite/migrations/067_home_attention_acknowledgements.sql +9 -0
  157. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  158. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  159. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  160. package/dist/src/storage/sqlite/schema.js +1 -1
  161. package/dist/src/storage/sqlite/schema.sql +10 -0
  162. package/dist/src/tui/tui-startup-resources.js +1 -1
  163. package/dist/src/work-discovery/index.d.ts +0 -2
  164. package/dist/src/work-discovery/index.js +1 -3
  165. package/dist/src/work-discovery/service.d.ts +0 -30
  166. package/dist/src/work-discovery/service.js +1 -35
  167. package/dist/src/work-discovery/thread-service.d.ts +5 -0
  168. package/dist/src/work-discovery/thread-service.js +36 -88
  169. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  170. package/package.json +1 -1
  171. package/dist/gateway/static/root/assets/agents--TQ9jM_1.js +0 -2
  172. package/dist/gateway/static/root/assets/apps-page-BDsoZDEn.js +0 -1
  173. package/dist/gateway/static/root/assets/automations-page-CHrNcppN.js +0 -6
  174. package/dist/gateway/static/root/assets/browser-settings-page-BQoRuQzH.js +0 -8
  175. package/dist/gateway/static/root/assets/capabilities-settings-panel-BOcU0qeM.js +0 -7
  176. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CJ1F_hlX.js +0 -1
  177. package/dist/gateway/static/root/assets/channels-settings-C4vDwRil.js +0 -1
  178. package/dist/gateway/static/root/assets/channels-status-swr-B0Pgq5x2.js +0 -1
  179. package/dist/gateway/static/root/assets/connectors-page-D6JEqDEj.js +0 -2
  180. package/dist/gateway/static/root/assets/dreaming-settings-Byv-h8XZ.js +0 -3
  181. package/dist/gateway/static/root/assets/goal-detail-page-UbZB77De.js +0 -4
  182. package/dist/gateway/static/root/assets/goals-page-GMqV8Fwv.js +0 -2
  183. package/dist/gateway/static/root/assets/index-BCkNJ5cR.css +0 -1
  184. package/dist/gateway/static/root/assets/index-CAZ9343h.js +0 -212
  185. package/dist/gateway/static/root/assets/local-app-workbench-page-m5HEyrHT.js +0 -2
  186. package/dist/gateway/static/root/assets/logs-page-Bf_nk75f.js +0 -7
  187. package/dist/gateway/static/root/assets/messages-DWrg3c4K.js +0 -3
  188. package/dist/gateway/static/root/assets/notes-workbench-BTDmprHM.js +0 -4
  189. package/dist/gateway/static/root/assets/project-detail-page-C7kntu4H.js +0 -1
  190. package/dist/gateway/static/root/assets/remote-access-hub-DoUkN3ik.js +0 -1
  191. package/dist/gateway/static/root/assets/sessions-page-ElAAlZ-R.js +0 -1
  192. package/dist/gateway/static/root/assets/settings-advanced-gate-CQn_KBqr.js +0 -1
  193. package/dist/gateway/static/root/assets/setup-status-panel-DX_LdcTN.js +0 -1
  194. package/dist/gateway/static/root/assets/shares-settings-nSfe-5xK.js +0 -1
  195. package/dist/gateway/static/root/assets/skill-reload-api-1tYpZrJf.js +0 -1
  196. package/dist/gateway/static/root/assets/skills-page-BUJl8LJG.js +0 -2
  197. package/dist/gateway/static/root/assets/time-picker-BpiBF5-d.js +0 -1
  198. package/dist/gateway/static/root/assets/user-context-page-BOC6Hn19.js +0 -1
  199. package/dist/gateway/static/root/assets/work-discovery-page-DWGYp5yV.js +0 -1
  200. package/dist/gateway/static/root/assets/work-item-detail-page-CpeWcpSp.js +0 -1
  201. package/dist/gateway/static/root/assets/work-page-MsEKzmSt.js +0 -1
  202. package/dist/gateway/static/root/assets/workflows-page-ByhHaUHB.js +0 -11
  203. package/dist/src/proactive/calendar-signals.d.ts +0 -4
  204. package/dist/src/proactive/calendar-signals.js +0 -120
  205. package/dist/src/proactive/focus-service.d.ts +0 -62
  206. package/dist/src/proactive/focus-service.js +0 -173
  207. package/dist/src/proactive/index.d.ts +0 -7
  208. package/dist/src/proactive/index.js +0 -7
  209. package/dist/src/proactive/insight-repository.d.ts +0 -21
  210. package/dist/src/proactive/insight-repository.js +0 -109
  211. package/dist/src/proactive/run-processor.d.ts +0 -19
  212. package/dist/src/proactive/run-processor.js +0 -146
  213. package/dist/src/proactive/trial-expiry-reconciler.d.ts +0 -5
  214. package/dist/src/proactive/trial-expiry-reconciler.js +0 -30
  215. package/dist/src/proactive/types.d.ts +0 -66
  216. package/dist/src/proactive/value-score.d.ts +0 -13
  217. package/dist/src/proactive/value-score.js +0 -30
  218. package/dist/src/proactive/watch-repository.d.ts +0 -28
  219. package/dist/src/proactive/watch-repository.js +0 -129
  220. package/dist/src/work-discovery/governance.d.ts +0 -25
  221. package/dist/src/work-discovery/governance.js +0 -96
  222. package/dist/src/work-discovery/thread-repository.d.ts +0 -34
  223. package/dist/src/work-discovery/thread-repository.js +0 -112
  224. /package/dist/src/{proactive → focuses}/types.js +0 -0
@@ -6,6 +6,7 @@ import { XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_SCHEMA_VERSION, applyPendingMi
6
6
  import { ensureXopcDatabaseSchema } from "./schema.js";
7
7
  import { closeXopcDatabase, getXopcDatabase, isXopcDatabaseOpen, openXopcDatabase, requireXopcDatabase, resetXopcDatabaseSingletonForTest } from "./connection.js";
8
8
  import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
9
+ import { acknowledgeHomeAttention, isHomeAttentionAcknowledged } from "./home-attention-repository.js";
9
10
  import { getUserClaim, linkUserClaimMemoryRecord, listUserClaimEvidence, listUserClaimStatsBySource, listUserClaims, listUserPeopleGraphRows, reinforceUserClaim, removeUserClaimEvidenceForSource, resolveUserEntity, setUserClaimDecision } from "./user-claims-repository.js";
10
11
  import { claimNextConnectorLearningJob, enqueueConnectorLearningJob, listConnectorLearningJobs, recoverStaleConnectorLearningJobs, setConnectorLearningPaused, updateConnectorLearningJob } from "./connector-learning-repository.js";
11
12
  import { COMPOSER_INPUT_HISTORY_LIMIT, appendComposerInputHistory, clearComposerInputHistory, listComposerInputHistory } from "./composer-input-history-repository.js";
@@ -27,4 +28,4 @@ import { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeC
27
28
  import { getUserTrustPolicy, setUserTrustPolicy } from "./user-trust-repository.js";
28
29
  import { consumeMemoryReferenceConsent, decideMemoryReferenceConsent, ensureMemoryReferenceConsentRequest, hasMemoryReferenceConsent, listMemoryReferenceConsents, revokeMemoryReferenceConsent } from "./memory-reference-consent-repository.js";
29
30
  import { getUserProfilePromptState, setUserProfilePromptState } from "./user-profile-setup-repository.js";
30
- export { COMPOSER_INPUT_HISTORY_LIMIT, DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, USER_UNDERSTANDING_REMEDIATION_POLICY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, appendCompactionBoundary, appendComposerInputHistory, appendConnectorExecutionAudit, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, attachMemoryEvidence, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRelationshipPrompt, claimConnectorWebhookDelivery, claimKnowledgeSourceItems, claimNextConnectorLearningJob, classifyStoredRow, clearComposerInputHistory, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, completeTaskOutcome, consumeConnectorApproval, consumeMemoryReferenceConsent, createConnectorApproval, createObjectLinkRecord, decideConnectorApproval, decideMemoryReferenceConsent, deleteConnectorConnection, deleteConnectorInstallation, deleteMemoryEvidenceForRecord, deleteMemoryRecord, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, enqueueConnectorLearningJob, ensureMemoryReferenceConsentRequest, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findLatestMemoryInjectTrace, findSessionKeyBySessionId, findTaskOutcomeForAssistant, finishKnowledgeSyncRun, getActivityEventRecord, getCachedConnectorCatalogEntry, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getCurrentSessionId, getGlobalSessionStats, getInteractionState, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, getMemoryProviderState, getMemoryRecord, getNoteAgentContextRecord, getNoteRecord, getRelationshipSettings, getSessionConfig, getSessionMetadata, getSessionPersistedLevels, getSqliteDatabase, getTaskOutcome, getUserClaim, getUserProfilePromptState, getUserTrustPolicy, getXopcDatabase, hasMemoryReferenceConsent, hasSessionConfig, hasUnresolvedMemoryConflict, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isProactiveSupportAllowed, isXopcDatabaseOpen, linkUserClaimMemoryRecord, listActivityRecords, listCachedConnectorCatalogEntries, listCompactionBoundaries, listComposerInputHistory, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listConnectorLearningJobs, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, listMemoryRecords, listMemoryReferenceConsents, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTaskOutcomes, listUserClaimEvidence, listUserClaimStatsBySource, listUserClaims, listUserPeopleGraphRows, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, markMemoryRecordsConflicted, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, pruneBoundedKnowledgeSourceItems, readSchemaVersion, readSchemaVersionForTest, recordActivityEvent, recoverStaleConnectorLearningJobs, reinforceUserClaim, releaseConnectorWebhookDelivery, removeUserClaimEvidenceForSource, replaceConnectorCatalogEntries, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveMigrationsDir, resolveSessionAgentId, resolveUserEntity, resolveXopcDatabasePath, restoreBeforeCompactionBoundary, revokeMemoryReferenceConsent, runSqliteWriteTransaction, searchMemoryIndex, searchMemoryRecords, sessionConfigRowToConfig, sessionRowToMetadata, setConnectorLearningPaused, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setLatestMemoryInjectFeedback, setMemoryProviderState, setMemoryTraceFeedback, setSessionConfig, setTaskOutcomeFeedback, setUserClaimDecision, setUserProfilePromptState, setUserTrustPolicy, startKnowledgeSyncRun, startTaskOutcome, summarizeMemoryRecallFeedback, summarizeTaskOutcomes, summarizeUserUnderstandingQuality, syncMemoryIndex, transcriptEntryRowToStoredRow, updateConnectorLearningJob, updateInteractionStateFromMessage, updateRelationshipSettings, updateSessionConfig, updateSessionStats, updateTaskOutcome, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertKnowledgeSourceItems, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord };
31
+ export { COMPOSER_INPUT_HISTORY_LIMIT, DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, USER_UNDERSTANDING_REMEDIATION_POLICY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, acknowledgeHomeAttention, appendCompactionBoundary, appendComposerInputHistory, appendConnectorExecutionAudit, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, attachMemoryEvidence, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRelationshipPrompt, claimConnectorWebhookDelivery, claimKnowledgeSourceItems, claimNextConnectorLearningJob, classifyStoredRow, clearComposerInputHistory, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, completeTaskOutcome, consumeConnectorApproval, consumeMemoryReferenceConsent, createConnectorApproval, createObjectLinkRecord, decideConnectorApproval, decideMemoryReferenceConsent, deleteConnectorConnection, deleteConnectorInstallation, deleteMemoryEvidenceForRecord, deleteMemoryRecord, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, enqueueConnectorLearningJob, ensureMemoryReferenceConsentRequest, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findLatestMemoryInjectTrace, findSessionKeyBySessionId, findTaskOutcomeForAssistant, finishKnowledgeSyncRun, getActivityEventRecord, getCachedConnectorCatalogEntry, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getCurrentSessionId, getGlobalSessionStats, getInteractionState, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, getMemoryProviderState, getMemoryRecord, getNoteAgentContextRecord, getNoteRecord, getRelationshipSettings, getSessionConfig, getSessionMetadata, getSessionPersistedLevels, getSqliteDatabase, getTaskOutcome, getUserClaim, getUserProfilePromptState, getUserTrustPolicy, getXopcDatabase, hasMemoryReferenceConsent, hasSessionConfig, hasUnresolvedMemoryConflict, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isHomeAttentionAcknowledged, isProactiveSupportAllowed, isXopcDatabaseOpen, linkUserClaimMemoryRecord, listActivityRecords, listCachedConnectorCatalogEntries, listCompactionBoundaries, listComposerInputHistory, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listConnectorLearningJobs, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, listMemoryRecords, listMemoryReferenceConsents, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTaskOutcomes, listUserClaimEvidence, listUserClaimStatsBySource, listUserClaims, listUserPeopleGraphRows, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, markMemoryRecordsConflicted, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, pruneBoundedKnowledgeSourceItems, readSchemaVersion, readSchemaVersionForTest, recordActivityEvent, recoverStaleConnectorLearningJobs, reinforceUserClaim, releaseConnectorWebhookDelivery, removeUserClaimEvidenceForSource, replaceConnectorCatalogEntries, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveMigrationsDir, resolveSessionAgentId, resolveUserEntity, resolveXopcDatabasePath, restoreBeforeCompactionBoundary, revokeMemoryReferenceConsent, runSqliteWriteTransaction, searchMemoryIndex, searchMemoryRecords, sessionConfigRowToConfig, sessionRowToMetadata, setConnectorLearningPaused, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setLatestMemoryInjectFeedback, setMemoryProviderState, setMemoryTraceFeedback, setSessionConfig, setTaskOutcomeFeedback, setUserClaimDecision, setUserProfilePromptState, setUserTrustPolicy, startKnowledgeSyncRun, startTaskOutcome, summarizeMemoryRecallFeedback, summarizeTaskOutcomes, summarizeUserUnderstandingQuality, syncMemoryIndex, transcriptEntryRowToStoredRow, updateConnectorLearningJob, updateInteractionStateFromMessage, updateRelationshipSettings, updateSessionConfig, updateSessionStats, updateTaskOutcome, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertKnowledgeSourceItems, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord };
@@ -0,0 +1,126 @@
1
+ DROP TABLE IF EXISTS proactive_insights;
2
+ DROP TABLE IF EXISTS focus_watches;
3
+ DROP TABLE IF EXISTS work_understanding_thread_feedback;
4
+ DROP TABLE IF EXISTS work_understanding_thread_evidence;
5
+ DROP TABLE IF EXISTS work_understanding_thread_projects;
6
+ DROP TABLE IF EXISTS work_understanding_threads;
7
+
8
+ CREATE TABLE focus_candidates (
9
+ candidate_id TEXT PRIMARY KEY,
10
+ canonical_key TEXT NOT NULL UNIQUE,
11
+ title TEXT NOT NULL,
12
+ summary TEXT NOT NULL,
13
+ confidence REAL NOT NULL CHECK (confidence >= 0 AND confidence <= 1),
14
+ evidence_json TEXT NOT NULL DEFAULT '[]',
15
+ status TEXT NOT NULL CHECK (status IN ('pending', 'accepted', 'dismissed')),
16
+ discovered_at INTEGER NOT NULL,
17
+ updated_at INTEGER NOT NULL
18
+ );
19
+
20
+ CREATE TABLE focus_candidate_projects (
21
+ candidate_id TEXT NOT NULL,
22
+ project_id TEXT NOT NULL,
23
+ created_at INTEGER NOT NULL,
24
+ PRIMARY KEY (candidate_id, project_id),
25
+ FOREIGN KEY (candidate_id) REFERENCES focus_candidates(candidate_id) ON DELETE CASCADE,
26
+ FOREIGN KEY (project_id) REFERENCES projects(project_id) ON DELETE CASCADE
27
+ );
28
+
29
+ CREATE TABLE focuses (
30
+ focus_id TEXT PRIMARY KEY,
31
+ title TEXT NOT NULL,
32
+ summary TEXT NOT NULL,
33
+ status TEXT NOT NULL CHECK (status IN ('active', 'paused', 'completed')),
34
+ source TEXT NOT NULL CHECK (source IN ('user', 'discovery')),
35
+ source_candidate_id TEXT,
36
+ goal_id TEXT,
37
+ created_at INTEGER NOT NULL,
38
+ updated_at INTEGER NOT NULL,
39
+ completed_at INTEGER,
40
+ last_activity_at INTEGER,
41
+ FOREIGN KEY (source_candidate_id) REFERENCES focus_candidates(candidate_id) ON DELETE SET NULL,
42
+ FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE SET NULL
43
+ );
44
+
45
+ CREATE TABLE focus_projects (
46
+ focus_id TEXT NOT NULL,
47
+ project_id TEXT NOT NULL,
48
+ created_at INTEGER NOT NULL,
49
+ PRIMARY KEY (focus_id, project_id),
50
+ FOREIGN KEY (focus_id) REFERENCES focuses(focus_id) ON DELETE CASCADE,
51
+ FOREIGN KEY (project_id) REFERENCES projects(project_id) ON DELETE CASCADE
52
+ );
53
+
54
+ CREATE TABLE focus_monitors (
55
+ monitor_id TEXT PRIMARY KEY,
56
+ focus_id TEXT NOT NULL,
57
+ kind TEXT NOT NULL CHECK (kind IN ('progress', 'external_changes')),
58
+ enabled INTEGER NOT NULL DEFAULT 0 CHECK (enabled IN (0, 1)),
59
+ run_state TEXT NOT NULL DEFAULT 'idle' CHECK (run_state IN ('idle', 'queued', 'running', 'failed')),
60
+ cadence_json TEXT NOT NULL,
61
+ automation_id TEXT,
62
+ last_run_id TEXT,
63
+ last_run_at INTEGER,
64
+ next_run_at INTEGER,
65
+ last_meaningful_result_at INTEGER,
66
+ last_error TEXT,
67
+ consecutive_failures INTEGER NOT NULL DEFAULT 0,
68
+ created_at INTEGER NOT NULL,
69
+ updated_at INTEGER NOT NULL,
70
+ UNIQUE (focus_id, kind),
71
+ FOREIGN KEY (focus_id) REFERENCES focuses(focus_id) ON DELETE CASCADE,
72
+ FOREIGN KEY (automation_id) REFERENCES automations(automation_id) ON DELETE SET NULL
73
+ );
74
+
75
+ CREATE TABLE focus_activities (
76
+ activity_id TEXT PRIMARY KEY,
77
+ focus_id TEXT NOT NULL,
78
+ monitor_id TEXT,
79
+ type TEXT NOT NULL CHECK (type IN (
80
+ 'created', 'updated', 'paused', 'resumed', 'completed',
81
+ 'monitor_enabled', 'monitor_disabled', 'run_started', 'run_no_change',
82
+ 'run_failed', 'insight_created', 'insight_dismissed', 'insight_approved'
83
+ )),
84
+ summary TEXT NOT NULL,
85
+ details_json TEXT NOT NULL DEFAULT '{}',
86
+ created_at INTEGER NOT NULL,
87
+ FOREIGN KEY (focus_id) REFERENCES focuses(focus_id) ON DELETE CASCADE,
88
+ FOREIGN KEY (monitor_id) REFERENCES focus_monitors(monitor_id) ON DELETE SET NULL
89
+ );
90
+
91
+ CREATE TABLE focus_insights (
92
+ insight_id TEXT PRIMARY KEY,
93
+ focus_id TEXT NOT NULL,
94
+ monitor_id TEXT NOT NULL,
95
+ run_id TEXT NOT NULL,
96
+ kind TEXT NOT NULL CHECK (kind IN ('progress', 'external_changes')),
97
+ title TEXT NOT NULL,
98
+ summary TEXT NOT NULL,
99
+ why_it_matters TEXT NOT NULL,
100
+ next_action TEXT NOT NULL,
101
+ evidence_json TEXT NOT NULL,
102
+ content_hash TEXT NOT NULL,
103
+ status TEXT NOT NULL CHECK (status IN ('unread', 'dismissed', 'approved')),
104
+ value_score REAL NOT NULL DEFAULT 0,
105
+ value_reasons_json TEXT NOT NULL DEFAULT '[]',
106
+ created_at INTEGER NOT NULL,
107
+ updated_at INTEGER NOT NULL,
108
+ UNIQUE (monitor_id, content_hash),
109
+ FOREIGN KEY (focus_id) REFERENCES focuses(focus_id) ON DELETE CASCADE,
110
+ FOREIGN KEY (monitor_id) REFERENCES focus_monitors(monitor_id) ON DELETE CASCADE
111
+ );
112
+
113
+ CREATE INDEX idx_focus_candidates_status
114
+ ON focus_candidates(status, updated_at DESC);
115
+ CREATE INDEX idx_focuses_status_activity
116
+ ON focuses(status, last_activity_at DESC, updated_at DESC);
117
+ CREATE UNIQUE INDEX idx_focuses_source_candidate
118
+ ON focuses(source_candidate_id) WHERE source_candidate_id IS NOT NULL;
119
+ CREATE INDEX idx_focus_monitors_focus
120
+ ON focus_monitors(focus_id, enabled, updated_at DESC);
121
+ CREATE INDEX idx_focus_monitors_automation
122
+ ON focus_monitors(automation_id);
123
+ CREATE INDEX idx_focus_activities_focus
124
+ ON focus_activities(focus_id, created_at DESC);
125
+ CREATE INDEX idx_focus_insights_focus
126
+ ON focus_insights(focus_id, status, created_at DESC);
@@ -0,0 +1,9 @@
1
+ CREATE TABLE IF NOT EXISTS home_attention_acknowledgements (
2
+ subject_kind TEXT NOT NULL CHECK (subject_kind IN ('automation_run', 'workflow_run')),
3
+ subject_id TEXT NOT NULL,
4
+ acknowledged_at INTEGER NOT NULL,
5
+ PRIMARY KEY (subject_kind, subject_id)
6
+ );
7
+
8
+ CREATE INDEX IF NOT EXISTS idx_home_attention_acknowledged_at
9
+ ON home_attention_acknowledgements(acknowledged_at DESC);
@@ -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 = 65;
6
+ export declare const XOPC_DB_SCHEMA_VERSION = 67;
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 = 65;
15
+ const XOPC_DB_SCHEMA_VERSION = 67;
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 ?? 65;
49
+ const targetVersion = options.targetVersion ?? 67;
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 ?? 65;
65
+ const appVersion = options.targetVersion ?? 67;
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 = 65;
22
+ export const XOPC_DB_SCHEMA_VERSION = 67;
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: 65 });
34
+ applyPendingMigrations(db, { targetVersion: 67 });
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 };
@@ -189,6 +189,16 @@ CREATE INDEX IF NOT EXISTS idx_workflow_runs_definition_created
189
189
  CREATE INDEX IF NOT EXISTS idx_workflow_runs_created
190
190
  ON workflow_runs(agent_id, created_at_ms DESC);
191
191
 
192
+ CREATE TABLE IF NOT EXISTS home_attention_acknowledgements (
193
+ subject_kind TEXT NOT NULL CHECK (subject_kind IN ('automation_run', 'workflow_run')),
194
+ subject_id TEXT NOT NULL,
195
+ acknowledged_at INTEGER NOT NULL,
196
+ PRIMARY KEY (subject_kind, subject_id)
197
+ );
198
+
199
+ CREATE INDEX IF NOT EXISTS idx_home_attention_acknowledged_at
200
+ ON home_attention_acknowledgements(acknowledged_at DESC);
201
+
192
202
  CREATE TABLE IF NOT EXISTS notes (
193
203
  note_id TEXT PRIMARY KEY,
194
204
  title TEXT,
@@ -3,8 +3,8 @@ import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.
3
3
  import { init_paths, resolveAgentProfileDir, resolveBundledSkillsDir, resolveUserProfilePath } from "../config/paths.js";
4
4
  import { resolveBootstrapFilesSync } from "../agent/bootstrap/bootstrap-files.js";
5
5
  import { createSkillConfigManager, isSkillEnabled } from "../agent/skills/config.js";
6
- import { createWorkflowCatalog } from "../agent/workflow/catalog.js";
7
6
  import { loadSkills } from "../agent/skills/index.js";
7
+ import { createWorkflowCatalog } from "../agent/workflow/catalog.js";
8
8
  import { listConnectorInstances } from "../connectors/instances.js";
9
9
  import { getWorkspacePath } from "../config/workspace-path-helpers.js";
10
10
  import "../config/index.js";
@@ -9,7 +9,5 @@ export * from './investigation-repository.js';
9
9
  export * from './investigator.js';
10
10
  export * from './incremental.js';
11
11
  export * from './incremental-repository.js';
12
- export * from './governance.js';
13
12
  export * from './evaluation.js';
14
- export * from './thread-repository.js';
15
13
  export * from './thread-service.js';
@@ -1,8 +1,6 @@
1
- import { addWorkUnderstandingThreadFeedback, attachWorkUnderstandingThreadEvidence, getWorkUnderstandingThread, getWorkUnderstandingThreadByCanonicalKey, listWorkUnderstandingThreads, upsertWorkUnderstandingThread } from "./thread-repository.js";
2
1
  import { WORK_DISCOVERY_SCAN_POLICY_VERSION, canonicalWorkDiscoveryRoot, previewWorkDiscoveryRoot, probeWorkDiscoveryRoot, readWorkDiscoveryTextExcerpt, searchWorkDiscoveryText, summarizeWorkContextSnapshot } from "./probe.js";
3
2
  import { analyzePersonalContext, analyzeWorkContext, workDiscoveryResultMarkdown } from "./analyzer.js";
4
3
  import { discoverWorkCandidates } from "./candidate-discovery.js";
5
- import { deleteWorkUnderstandingDerivedData, getWorkUnderstandingMetrics, getWorkUnderstandingSourceLineage } from "./governance.js";
6
4
  import { workDiscoveryFingerprintsEqual } from "./incremental.js";
7
5
  import { findActiveWorkDiscoverySourceRefresh, listWorkDiscoverySourceRefreshes, recordWorkDiscoverySourceRefresh, updateWorkDiscoverySourceRefreshForRun } from "./incremental-repository.js";
8
6
  import { appendWorkUnderstandingEvidence, createWorkUnderstandingInvestigation, getWorkUnderstandingInvestigation, getWorkUnderstandingInvestigationForRun, listWorkUnderstandingEvidence, resetWorkUnderstandingInvestigation, updateWorkUnderstandingEvidenceObservation, updateWorkUnderstandingInvestigation } from "./investigation-repository.js";
@@ -12,4 +10,4 @@ import { createWorkDiscoveryRun, getWorkDiscoveryOnboardingState, getWorkDiscove
12
10
  import { getWorkDiscoveryDirectorySource, listWorkDiscoveryDirectorySources, revokeWorkDiscoveryDirectorySource, upsertWorkDiscoveryDirectorySource } from "./source-repository.js";
13
11
  import { WorkDiscoveryService } from "./service.js";
14
12
  import { evaluateWorkUnderstandingCase } from "./evaluation.js";
15
- export { DEFAULT_WORK_INVESTIGATION_BUDGET, WORK_DISCOVERY_SCAN_POLICY_VERSION, WorkDiscoveryService, addWorkUnderstandingThreadFeedback, analyzePersonalContext, analyzeWorkContext, appendWorkUnderstandingEvidence, attachWorkUnderstandingThreadEvidence, canonicalWorkDiscoveryRoot, createWorkDiscoveryRun, createWorkUnderstandingInvestigation, deleteWorkUnderstandingDerivedData, discoverWorkCandidates, evaluateWorkUnderstandingCase, findActiveWorkDiscoverySourceRefresh, getWorkDiscoveryDirectorySource, getWorkDiscoveryOnboardingState, getWorkDiscoveryRun, getWorkDiscoveryRunByIdempotencyKey, getWorkUnderstandingInvestigation, getWorkUnderstandingInvestigationForRun, getWorkUnderstandingMetrics, getWorkUnderstandingSourceLineage, getWorkUnderstandingThread, getWorkUnderstandingThreadByCanonicalKey, investigateWorkContext, listWorkDiscoveryDirectorySources, listWorkDiscoverySourceRefreshes, listWorkUnderstandingEvidence, listWorkUnderstandingThreads, persistWorkThreadsFromDiscovery, previewWorkDiscoveryRoot, probeWorkDiscoveryRoot, readWorkDiscoveryTextExcerpt, recordWorkDiscoverySourceRefresh, resetWorkUnderstandingInvestigation, revokeWorkDiscoveryDirectorySource, searchWorkDiscoveryText, setWorkDiscoveryFeedback, setWorkDiscoveryOnboardingState, summarizeWorkContextSnapshot, updateWorkDiscoveryRun, updateWorkDiscoverySourceRefreshForRun, updateWorkUnderstandingEvidenceObservation, updateWorkUnderstandingInvestigation, upsertWorkDiscoveryDirectorySource, upsertWorkUnderstandingThread, workDiscoveryFingerprintsEqual, workDiscoveryResultMarkdown };
13
+ export { DEFAULT_WORK_INVESTIGATION_BUDGET, WORK_DISCOVERY_SCAN_POLICY_VERSION, WorkDiscoveryService, analyzePersonalContext, analyzeWorkContext, appendWorkUnderstandingEvidence, canonicalWorkDiscoveryRoot, createWorkDiscoveryRun, createWorkUnderstandingInvestigation, discoverWorkCandidates, evaluateWorkUnderstandingCase, findActiveWorkDiscoverySourceRefresh, getWorkDiscoveryDirectorySource, getWorkDiscoveryOnboardingState, getWorkDiscoveryRun, getWorkDiscoveryRunByIdempotencyKey, getWorkUnderstandingInvestigation, getWorkUnderstandingInvestigationForRun, investigateWorkContext, listWorkDiscoveryDirectorySources, listWorkDiscoverySourceRefreshes, listWorkUnderstandingEvidence, persistWorkThreadsFromDiscovery, previewWorkDiscoveryRoot, probeWorkDiscoveryRoot, readWorkDiscoveryTextExcerpt, recordWorkDiscoverySourceRefresh, resetWorkUnderstandingInvestigation, revokeWorkDiscoveryDirectorySource, searchWorkDiscoveryText, setWorkDiscoveryFeedback, setWorkDiscoveryOnboardingState, summarizeWorkContextSnapshot, updateWorkDiscoveryRun, updateWorkDiscoverySourceRefreshForRun, updateWorkUnderstandingEvidenceObservation, updateWorkUnderstandingInvestigation, upsertWorkDiscoveryDirectorySource, workDiscoveryFingerprintsEqual, workDiscoveryResultMarkdown };
@@ -22,36 +22,6 @@ export declare class WorkDiscoveryService {
22
22
  investigation: import("./types.js").WorkUnderstandingInvestigation;
23
23
  evidence: import("./types.js").WorkUnderstandingEvidenceItem[];
24
24
  };
25
- listWorkThreads(options?: {
26
- projectId?: string;
27
- includeRejected?: boolean;
28
- limit?: number;
29
- }): import("./types.js").WorkUnderstandingThread[];
30
- getWorkThread(id: string): import("./types.js").WorkUnderstandingThread;
31
- getSourceLineage(sourceId: string): import("./governance.js").WorkUnderstandingSourceLineage;
32
- deleteSourceDerivedData(sourceId: string): {
33
- deletedMemoryRecords: number;
34
- evidenceCount: number | bigint;
35
- deletedThreads: number;
36
- retainedThreads: number;
37
- };
38
- getUnderstandingMetrics(): {
39
- completedInvestigations: number;
40
- averageToolCalls: number;
41
- activeThreads: number;
42
- confirmedThreads: number;
43
- recognitionConfirmationRate: number;
44
- evidenceBySource: {
45
- sourceType: string;
46
- count: number;
47
- }[];
48
- };
49
- updateWorkThread(input: {
50
- id: string;
51
- decision: 'confirmed' | 'corrected' | 'rejected' | 'paused' | 'completed';
52
- correctedTitle?: string;
53
- correctedSummary?: string;
54
- }): import("./types.js").WorkUnderstandingThread;
55
25
  discoverCandidates(signal?: AbortSignal): Promise<WorkDiscoveryCandidate[]>;
56
26
  listDirectorySources(): import("./types.js").WorkDiscoveryDirectorySource[];
57
27
  grantDirectorySource(rootPath: string): Promise<import("./types.js").WorkDiscoveryDirectorySource>;
@@ -8,11 +8,9 @@ import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
8
8
  import { buildSessionKey, init_session_key } from "../routing/session-key.js";
9
9
  import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
10
10
  import { nextMemoryReviewAt } from "../agent/memory/lifecycle.js";
11
- import { addWorkUnderstandingThreadFeedback, attachWorkUnderstandingThreadEvidence, getWorkUnderstandingThread, listWorkUnderstandingThreads } from "./thread-repository.js";
12
11
  import { previewWorkDiscoveryRoot, probeWorkDiscoveryRoot, summarizeWorkContextSnapshot } from "./probe.js";
13
12
  import { analyzePersonalContext, analyzeWorkContext, workDiscoveryResultMarkdown } from "./analyzer.js";
14
13
  import { discoverWorkCandidates } from "./candidate-discovery.js";
15
- import { deleteWorkUnderstandingDerivedData, getWorkUnderstandingMetrics, getWorkUnderstandingSourceLineage } from "./governance.js";
16
14
  import { workDiscoveryFingerprintsEqual } from "./incremental.js";
17
15
  import { findActiveWorkDiscoverySourceRefresh, recordWorkDiscoverySourceRefresh, updateWorkDiscoverySourceRefreshForRun } from "./incremental-repository.js";
18
16
  import { appendWorkUnderstandingEvidence, getWorkUnderstandingInvestigationForRun, listWorkUnderstandingEvidence } from "./investigation-repository.js";
@@ -99,29 +97,6 @@ var WorkDiscoveryService = class {
99
97
  evidence: listWorkUnderstandingEvidence(investigation.id)
100
98
  } : null;
101
99
  }
102
- listWorkThreads(options = {}) {
103
- return listWorkUnderstandingThreads(options);
104
- }
105
- getWorkThread(id) {
106
- return getWorkUnderstandingThread(id);
107
- }
108
- getSourceLineage(sourceId) {
109
- return getWorkUnderstandingSourceLineage(sourceId);
110
- }
111
- deleteSourceDerivedData(sourceId) {
112
- return deleteWorkUnderstandingDerivedData(sourceId);
113
- }
114
- getUnderstandingMetrics() {
115
- return getWorkUnderstandingMetrics();
116
- }
117
- updateWorkThread(input) {
118
- return addWorkUnderstandingThreadFeedback({
119
- threadId: input.id,
120
- decision: input.decision,
121
- correctedTitle: input.correctedTitle,
122
- correctedSummary: input.correctedSummary
123
- });
124
- }
125
100
  async discoverCandidates(signal) {
126
101
  return discoverWorkCandidates({
127
102
  existingProjects: this.options.projects.list({
@@ -903,7 +878,7 @@ var WorkDiscoveryService = class {
903
878
  const investigation = getWorkUnderstandingInvestigationForRun(run.id);
904
879
  if (investigation && input.decision !== "dismissed") {
905
880
  const observation = correctedIntent ? `The user explicitly stated their current intent: ${correctedIntent}` : "The user explicitly confirmed the inferred current work understanding.";
906
- const evidence = appendWorkUnderstandingEvidence({
881
+ appendWorkUnderstandingEvidence({
907
882
  investigationId: investigation.id,
908
883
  projectId: run.projectId,
909
884
  sourceType: "user_statement",
@@ -913,15 +888,6 @@ var WorkDiscoveryService = class {
913
888
  observedAt: Date.now(),
914
889
  sensitivity: "normal"
915
890
  });
916
- const currentThreads = listWorkUnderstandingThreads({
917
- projectId: run.projectId,
918
- limit: 50
919
- }).filter((thread) => thread.horizon === "current").slice(0, 3);
920
- for (const thread of currentThreads) attachWorkUnderstandingThreadEvidence({
921
- threadId: thread.id,
922
- evidenceId: evidence.id,
923
- projectId: run.projectId
924
- });
925
891
  }
926
892
  if (run.source === "onboarding_selected_directory") setWorkDiscoveryOnboardingState({
927
893
  status: input.decision === "dismissed" ? "dismissed" : "completed",
@@ -1,4 +1,9 @@
1
1
  import type { WorkContextSnapshot, WorkDiscoveryResult, WorkUnderstandingEvidenceItem, WorkUnderstandingThread } from './types.js';
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.
6
+ */
2
7
  export declare function persistWorkThreadsFromDiscovery(input: {
3
8
  projectId: string;
4
9
  result: WorkDiscoveryResult;
@@ -1,104 +1,52 @@
1
- import { listWorkUnderstandingThreads, upsertWorkUnderstandingThread } from "./thread-repository.js";
1
+ import { upsertFocusCandidate } from "../focuses/candidate-repository.js";
2
2
  //#region src/work-discovery/thread-service.ts
3
3
  function confidenceValue(value) {
4
4
  return value === "high" ? .9 : value === "medium" ? .72 : .55;
5
5
  }
6
- function recencyPoints(observedAt, nowMs) {
7
- if (!observedAt) return 8;
8
- const days = Math.max(0, (nowMs - observedAt) / 864e5);
9
- if (days <= 2) return 40;
10
- if (days <= 7) return 32;
11
- if (days <= 14) return 24;
12
- if (days <= 30) return 14;
13
- return 5;
14
- }
15
- function focusScore(input) {
16
- const latest = input.evidence.reduce((value, item) => item.observedAt != null && (value == null || item.observedAt > value) ? item.observedAt : value, void 0);
17
- const commitDays = new Set((input.snapshot.git?.recentCommits ?? []).flatMap((commit) => commit.committedAt ? [new Date(commit.committedAt).toISOString().slice(0, 10)] : []));
18
- const sourceTypes = new Set(input.evidence.map((item) => item.sourceType));
19
- const continuity = Math.min(20, commitDays.size * 5);
20
- const corroboration = Math.min(15, input.evidence.length * 3 + Math.max(0, sourceTypes.size - 1) * 5);
21
- const unfinished = input.candidate.status === "active" ? 15 : input.candidate.status === "blocked" ? 12 : 3;
22
- const confidence = Math.round(confidenceValue(input.candidate.confidence) * 10);
23
- const horizonAdjustment = input.candidate.horizon === "current" ? 0 : input.candidate.horizon === "ongoing" ? -4 : -8;
24
- return Math.max(0, Math.min(100, Math.round(recencyPoints(latest, input.nowMs) + continuity + corroboration + unfinished + confidence + horizonAdjustment)));
25
- }
26
- function fallbackCandidate(result, evidence) {
27
- return {
28
- topicKey: "current-project-work",
29
- title: result.projectSummary.slice(0, 200),
30
- summary: result.currentState.slice(0, 2e3),
31
- status: result.lowConfidence ? "uncertain" : "active",
32
- horizon: "current",
33
- confidence: result.lowConfidence ? "low" : "medium",
34
- evidenceRefs: evidence.slice(0, 6).map((item) => item.sourceRef)
35
- };
36
- }
37
- function titleTokens(value) {
38
- return new Set(value.toLocaleLowerCase().match(/[\p{L}\p{N}]{2,}/gu)?.filter((token) => ![
39
- "the",
40
- "and",
41
- "for",
42
- "with",
43
- "from",
44
- "this",
45
- "that"
46
- ].includes(token)).slice(0, 30) ?? []);
47
- }
48
- function titleSimilarity(left, right) {
49
- const leftTokens = titleTokens(left);
50
- const rightTokens = titleTokens(right);
51
- if (!leftTokens.size || !rightTokens.size) return 0;
52
- return [...leftTokens].filter((token) => rightTokens.has(token)).length / Math.max(leftTokens.size, rightTokens.size);
53
- }
54
- function canonicalKeyForCandidate(input) {
55
- const proposed = `${input.projectId}:${input.candidate.horizon}:${input.candidate.topicKey}`.slice(0, 300);
56
- const existing = listWorkUnderstandingThreads({
57
- projectId: input.projectId,
58
- includeRejected: true,
59
- limit: 100
60
- });
61
- const exact = existing.find((thread) => thread.canonicalKey === proposed);
62
- if (exact) return exact.canonicalKey;
63
- return existing.filter((thread) => thread.horizon === input.candidate.horizon && thread.userStatus !== "rejected").map((thread) => ({
64
- thread,
65
- similarity: titleSimilarity(thread.title, input.candidate.title)
66
- })).filter((item) => item.similarity >= .5).sort((left, right) => right.similarity - left.similarity)[0]?.thread.canonicalKey ?? proposed;
67
- }
6
+ /**
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.
10
+ */
68
11
  function persistWorkThreadsFromDiscovery(input) {
69
12
  const nowMs = input.nowMs ?? Date.now();
70
- const candidates = input.result.workThreadCandidates?.length ? input.result.workThreadCandidates : input.evidence.length ? [fallbackCandidate(input.result, input.evidence)] : [];
71
- const persist = (candidate) => {
13
+ return (input.result.workThreadCandidates ?? []).flatMap((candidate) => {
72
14
  const evidence = candidate.evidenceRefs.flatMap((ref) => {
73
- const match = input.evidence.find((item) => item.sourceRef === ref);
74
- return match ? [match] : [];
15
+ const item = input.evidence.find((entry) => entry.sourceRef === ref);
16
+ return item ? [{
17
+ label: item.observation.slice(0, 300),
18
+ source: item.sourceRef
19
+ }] : [];
75
20
  });
76
- if (!evidence.length) return [];
77
- return [upsertWorkUnderstandingThread({
78
- canonicalKey: canonicalKeyForCandidate({
79
- projectId: input.projectId,
80
- candidate
81
- }),
21
+ if (evidence.length === 0) return [];
22
+ const canonicalKey = `${input.projectId}:${candidate.horizon}:${candidate.topicKey}`.slice(0, 300);
23
+ const stored = upsertFocusCandidate({
24
+ canonicalKey,
82
25
  title: candidate.title,
83
26
  summary: candidate.summary,
84
- status: candidate.status,
85
- horizon: candidate.horizon,
86
- focusScore: focusScore({
87
- candidate,
88
- evidence,
89
- snapshot: input.snapshot,
90
- nowMs
91
- }),
92
27
  confidence: confidenceValue(candidate.confidence),
28
+ evidence,
93
29
  projectIds: [input.projectId],
94
- evidenceIds: evidence.map((item) => item.id),
95
- observedAt: evidence.reduce((latest, item) => Math.max(latest, item.observedAt ?? nowMs), 0) || nowMs,
96
30
  nowMs
97
- })];
98
- };
99
- const persisted = candidates.flatMap(persist);
100
- if (persisted.length || !input.evidence.length || !input.result.workThreadCandidates?.length) return persisted;
101
- return persist(fallbackCandidate(input.result, input.evidence));
31
+ });
32
+ return [{
33
+ id: stored.id,
34
+ canonicalKey,
35
+ title: stored.title,
36
+ summary: stored.summary,
37
+ status: candidate.status,
38
+ horizon: candidate.horizon,
39
+ focusScore: Math.round(stored.confidence * 100),
40
+ confidence: stored.confidence,
41
+ userStatus: "unreviewed",
42
+ projectIds: stored.projectIds,
43
+ evidenceIds: [],
44
+ firstObservedAt: stored.discoveredAt,
45
+ lastObservedAt: stored.updatedAt,
46
+ createdAt: stored.discoveredAt,
47
+ updatedAt: stored.updatedAt
48
+ }];
49
+ });
102
50
  }
103
51
  //#endregion
104
52
  export { persistWorkThreadsFromDiscovery };
@@ -4,8 +4,8 @@ import { publishAutomationProductEvent } from "../../automations/product-events.
4
4
  import { GoalService } from "../../goals/goal-service.js";
5
5
  import "../../goals/index.js";
6
6
  import { DelegateSubagentRunner } from "../../agent/workflow/subagent-runner.js";
7
- import { resolveModelRef } from "../../config/agent-typed-models.js";
8
7
  import { preflightWorkflowConnectors } from "../../connectors/workflow-preflight.js";
8
+ import { resolveModelRef } from "../../config/agent-typed-models.js";
9
9
  import { CatalogWorkflowDefinitionRegistry } from "../registry/catalog-workflow-definition-registry.js";
10
10
  import { validateWorkflowJsonSchema } from "../domain/schema-validation.js";
11
11
  import { isTerminalWorkflowRunStatus } from "../domain/run.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xopcai/xopc",
3
- "version": "0.0.173",
3
+ "version": "0.0.175",
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",