@xopcai/xopc 0.0.171 → 0.0.173

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 (228) 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-BLz30jWq.js → activity-store-ByVA0N5n.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BKZO0EFn.js → agent-avatar-dicebear-CJ5HvqE7.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents--TQ9jM_1.js +2 -0
  6. package/dist/gateway/static/root/assets/{api-N2qKY-WI.js → api-BZtCKzg4.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-CNZkpXCD.js → app-management-settings-panel-B0oNNcFn.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-Drf5a563.js → appearance-settings-DbIj4NQ1.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-BDsoZDEn.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-ChVwOXE5.js → archive-plugin-BICLQFWJ.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-BVK3Y2d9.js → attachment-load-DV3PteSU.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automation-suggestion-card-DH4N0SYR.js → automation-suggestion-card-CZUImis0.js} +1 -1
  13. package/dist/gateway/static/root/assets/automations-page-CHrNcppN.js +6 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-CeHY6VVP.js → binary-plugins-D6zkab6N.js} +1 -1
  15. package/dist/gateway/static/root/assets/block-editor-zCzoQI-g.js +184 -0
  16. package/dist/gateway/static/root/assets/browser-settings-page-BQoRuQzH.js +8 -0
  17. package/dist/gateway/static/root/assets/{browser-workflow-inputs-femCtfpo.js → browser-workflow-inputs-CY3X83xQ.js} +1 -1
  18. package/dist/gateway/static/root/assets/{browser-workflows-page-o0GVE_aF.js → browser-workflows-page-DDRtZLuM.js} +2 -2
  19. package/dist/gateway/static/root/assets/capabilities-settings-panel-BOcU0qeM.js +7 -0
  20. package/dist/gateway/static/root/assets/{capability-presets-api-Bx-JJC0R.js → capability-presets-api-pYLW6P7g.js} +1 -1
  21. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CJ1F_hlX.js +1 -0
  22. package/dist/gateway/static/root/assets/{channel-recipient-api-CTw3ibx4.js → channel-recipient-api-DxyOH3BO.js} +1 -1
  23. package/dist/gateway/static/root/assets/channels-settings-C4vDwRil.js +1 -0
  24. package/dist/gateway/static/root/assets/channels-status-swr-B0Pgq5x2.js +1 -0
  25. package/dist/gateway/static/root/assets/connector-logo-BgANwjt-.js +1 -0
  26. package/dist/gateway/static/root/assets/connectors-page-D6JEqDEj.js +2 -0
  27. package/dist/gateway/static/root/assets/desktop-pet-BPjQbPeA.js +1 -0
  28. package/dist/gateway/static/root/assets/{desktop-pet-settings-CIeH4VyP.js → desktop-pet-settings-8CaU1Mhm.js} +1 -1
  29. package/dist/gateway/static/root/assets/{directory-picker-path-field-Ddgt6c3K.js → directory-picker-path-field-BtNRUvzM.js} +1 -1
  30. package/dist/gateway/static/root/assets/dreaming-settings-Byv-h8XZ.js +3 -0
  31. package/dist/gateway/static/root/assets/{extension-debug-page-CJGwUaQX.js → extension-debug-page-DFjTfx6f.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-page-B3zHKJAB.js → extension-page-NyEYtWWg.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-settings-page-Cj9rrSr1.js → extension-settings-page-BynTCfgf.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-config-api-BdmtlJRP.js → gateway-config-api-BzOWImvU.js} +1 -1
  35. package/dist/gateway/static/root/assets/{gateway-settings-C2RwKIsl.js → gateway-settings-DXepE_Jw.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-startup-retry-mcMq_uu_.js → gateway-startup-retry-C2JXXtwg.js} +1 -1
  37. package/dist/gateway/static/root/assets/{goal-create-dialog-5Ryd_rx4.js → goal-create-dialog-ClOZyG52.js} +1 -1
  38. package/dist/gateway/static/root/assets/goal-detail-page-UbZB77De.js +4 -0
  39. package/dist/gateway/static/root/assets/{goals-config-api-CAO1J4jn.js → goals-config-api-CU3JR9MI.js} +1 -1
  40. package/dist/gateway/static/root/assets/goals-page-GMqV8Fwv.js +2 -0
  41. package/dist/gateway/static/root/assets/{goals-settings-Boj2izKZ.js → goals-settings-DSZguLEx.js} +1 -1
  42. package/dist/gateway/static/root/assets/{heartbeat-settings-DbPC9a_y.js → heartbeat-settings-KRkYziEF.js} +1 -1
  43. package/dist/gateway/static/root/assets/{image-generation-api-DrLCLTXn.js → image-generation-api-Y-n6TaZ_.js} +1 -1
  44. package/dist/gateway/static/root/assets/index-BCkNJ5cR.css +1 -0
  45. package/dist/gateway/static/root/assets/{index-vHb2z7VS.js → index-CAZ9343h.js} +67 -67
  46. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BrxfptgY.js → keyboard-shortcuts-settings-CwrQv952.js} +1 -1
  47. package/dist/gateway/static/root/assets/{local-app-workbench-page-BP0_Ih0e.js → local-app-workbench-page-m5HEyrHT.js} +2 -2
  48. package/dist/gateway/static/root/assets/{local-apps-page-DNCRlfFs.js → local-apps-page-DtITcS4K.js} +1 -1
  49. package/dist/gateway/static/root/assets/{locale-store-CzIfXqm8.js → locale-store-Ccv7tH8B.js} +1 -1
  50. package/dist/gateway/static/root/assets/logs-page-Bf_nk75f.js +7 -0
  51. package/dist/gateway/static/root/assets/{markdown-split-CIUH9Lor.js → markdown-split-D1oZlq1m.js} +1 -1
  52. package/dist/gateway/static/root/assets/{media-plugins-DX4AgkCs.js → media-plugins-BKz5V32t.js} +1 -1
  53. package/dist/gateway/static/root/assets/{messages-CKZuaOeG.js → messages-DWrg3c4K.js} +2 -2
  54. package/dist/gateway/static/root/assets/{notes-page-D1KprtxL.js → notes-page-DLekBQPa.js} +1 -1
  55. package/dist/gateway/static/root/assets/notes-workbench-BTDmprHM.js +4 -0
  56. package/dist/gateway/static/root/assets/{page-tabs-DjZPJGf6.js → page-tabs-pT4nLfqS.js} +1 -1
  57. package/dist/gateway/static/root/assets/{preview-open-alternatives-DNiJTpwZ.js → preview-open-alternatives-OtAiaJm2.js} +1 -1
  58. package/dist/gateway/static/root/assets/{product-open-page-CNfR17-g.js → product-open-page-CfryBKD9.js} +1 -1
  59. package/dist/gateway/static/root/assets/project-detail-page-C7kntu4H.js +1 -0
  60. package/dist/gateway/static/root/assets/projects-page-3ubcbqHr.js +1 -0
  61. package/dist/gateway/static/root/assets/remote-access-hub-DoUkN3ik.js +1 -0
  62. package/dist/gateway/static/root/assets/{save-bar-controls-BGZFVO9S.js → save-bar-controls-nP1SB3Lf.js} +1 -1
  63. package/dist/gateway/static/root/assets/{schedule-field-BAZiHtds.js → schedule-field-OEQTsUNz.js} +1 -1
  64. package/dist/gateway/static/root/assets/{schema-form-CesBcwJH.js → schema-form-DIcAa7CJ.js} +1 -1
  65. package/dist/gateway/static/root/assets/sessions-page-ElAAlZ-R.js +1 -0
  66. package/dist/gateway/static/root/assets/settings-advanced-gate-CQn_KBqr.js +1 -0
  67. package/dist/gateway/static/root/assets/{settings-form-section-Bxc54BLj.js → settings-form-section-BxNcTbYO.js} +1 -1
  68. package/dist/gateway/static/root/assets/{settings-loading-skeleton-CYrho7Db.js → settings-loading-skeleton-Dpdxu4sf.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-page-C03X5fkh.js → settings-page-DwPeOm1c.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-page-layout-CZAJbv4E.js → settings-page-layout-CqirFmMn.js} +1 -1
  71. package/dist/gateway/static/root/assets/{setup-status-panel-Jv8_bcOD.js → setup-status-panel-DX_LdcTN.js} +1 -1
  72. package/dist/gateway/static/root/assets/{share-preview-page-DSC7tKKG.js → share-preview-page-D72gYeux.js} +1 -1
  73. package/dist/gateway/static/root/assets/shares-settings-nSfe-5xK.js +1 -0
  74. package/dist/gateway/static/root/assets/skill-reload-api-1tYpZrJf.js +1 -0
  75. package/dist/gateway/static/root/assets/skills-page-BUJl8LJG.js +2 -0
  76. package/dist/gateway/static/root/assets/{system-settings-panel-BO89zw5H.js → system-settings-panel-U0tBgW46.js} +1 -1
  77. package/dist/gateway/static/root/assets/{theme-store-1OkdVC8l.js → theme-store-DCKDVPFF.js} +1 -1
  78. package/dist/gateway/static/root/assets/time-picker-BpiBF5-d.js +1 -0
  79. package/dist/gateway/static/root/assets/{typed-models-lib-D-_vct_y.js → typed-models-lib-D0XCOCAM.js} +1 -1
  80. package/dist/gateway/static/root/assets/{use-channel-catalog-VlFtjlET.js → use-channel-catalog-mq_Inao2.js} +1 -1
  81. package/dist/gateway/static/root/assets/user-context-page-BOC6Hn19.js +1 -0
  82. package/dist/gateway/static/root/assets/{voice-api-key-field-BhDk-UV_.js → voice-api-key-field-CKaDitO6.js} +1 -1
  83. package/dist/gateway/static/root/assets/work-discovery-page-DWGYp5yV.js +1 -0
  84. package/dist/gateway/static/root/assets/work-item-detail-page-CpeWcpSp.js +1 -0
  85. package/dist/gateway/static/root/assets/work-page-MsEKzmSt.js +1 -0
  86. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-uVw4Yoej.js → workflow-run-setup-panel-s_kS_FYA.js} +2 -2
  87. package/dist/gateway/static/root/assets/workflows-page-ByhHaUHB.js +11 -0
  88. package/dist/gateway/static/root/index.html +7 -7
  89. package/dist/package.js +1 -1
  90. package/dist/src/agent/agent-manager.d.ts +3 -1
  91. package/dist/src/agent/agent-manager.js +4 -3
  92. package/dist/src/agent/capabilities/definitions.d.ts +2 -1
  93. package/dist/src/agent/capabilities/definitions.js +3 -1
  94. package/dist/src/agent/memory/builtin-provider.js +4 -4
  95. package/dist/src/agent/memory/manager.d.ts +4 -1
  96. package/dist/src/agent/memory/manager.js +8 -3
  97. package/dist/src/agent/memory/understanding/service.d.ts +2 -0
  98. package/dist/src/agent/memory/understanding/service.js +11 -9
  99. package/dist/src/agent/prompt/sections/tooling.js +4 -0
  100. package/dist/src/agent/service.d.ts +3 -1
  101. package/dist/src/agent/service.js +29 -0
  102. package/dist/src/agent/skills/hub-pull.js +1 -1
  103. package/dist/src/agent/skills/index.js +1 -1
  104. package/dist/src/agent/skills/install-target.js +1 -1
  105. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.d.ts +64 -0
  106. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +27 -18
  107. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +1 -1
  108. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +1 -1
  109. package/dist/src/agent/skills/marketplace/search.d.ts +46 -0
  110. package/dist/src/agent/skills/marketplace/search.js +193 -0
  111. package/dist/src/agent/skills/skill-tool-gating.js +2 -1
  112. package/dist/src/agent/tools/delegate-tool.js +2 -0
  113. package/dist/src/agent/tools/factory.d.ts +4 -2
  114. package/dist/src/agent/tools/factory.js +11 -5
  115. package/dist/src/agent/tools/index.d.ts +2 -1
  116. package/dist/src/agent/tools/index.js +2 -1
  117. package/dist/src/agent/tools/skill-install-tool.d.ts +17 -0
  118. package/dist/src/agent/tools/skill-install-tool.js +76 -8
  119. package/dist/src/agent/tools/skills-marketplace-search-tool.d.ts +17 -0
  120. package/dist/src/agent/tools/skills-marketplace-search-tool.js +77 -0
  121. package/dist/src/automations/domain/validation.d.ts +8 -8
  122. package/dist/src/automations/draft/automation-draft-validator.d.ts +1 -1
  123. package/dist/src/browser/providers/cloakbrowser.js +1 -1
  124. package/dist/src/capabilities/store-connector.js +1 -1
  125. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  126. package/dist/src/config/agent-profile.js +1 -1
  127. package/dist/src/connectors/composio-sessions.d.ts +1 -0
  128. package/dist/src/connectors/composio-sessions.js +14 -5
  129. package/dist/src/connectors/composio-triggers.d.ts +1 -1
  130. package/dist/src/connectors/composio-triggers.js +4 -3
  131. package/dist/src/connectors/composio.js +1 -0
  132. package/dist/src/connectors/{connector-memory-sync.d.ts → connected-source-ingestion.d.ts} +11 -4
  133. package/dist/src/connectors/{connector-memory-sync.js → connected-source-ingestion.js} +49 -101
  134. package/dist/src/connectors/connected-source-normalizers.d.ts +15 -0
  135. package/dist/src/connectors/connected-source-normalizers.js +186 -0
  136. package/dist/src/connectors/connector-identity.d.ts +2 -0
  137. package/dist/src/connectors/connector-identity.js +29 -0
  138. package/dist/src/connectors/learning-coordinator.d.ts +25 -0
  139. package/dist/src/connectors/learning-coordinator.js +214 -0
  140. package/dist/src/connectors/learning-recipes.d.ts +22 -0
  141. package/dist/src/connectors/learning-recipes.js +121 -0
  142. package/dist/src/connectors/runtime-status.d.ts +1 -8
  143. package/dist/src/connectors/runtime-status.js +4 -29
  144. package/dist/src/extensions/api.js +1 -1
  145. package/dist/src/extensions/install.js +1 -1
  146. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  147. package/dist/src/gateway/agent-builtin-tools.js +2 -0
  148. package/dist/src/gateway/agents-admin.js +1 -1
  149. package/dist/src/gateway/heartbeat/service.js +1 -1
  150. package/dist/src/gateway/hono/routes/commands-skills.js +2 -2
  151. package/dist/src/gateway/hono/routes/connectors.js +76 -118
  152. package/dist/src/gateway/hono/routes/local-apps.js +1 -1
  153. package/dist/src/gateway/hono/routes/models.js +24 -0
  154. package/dist/src/gateway/hono/routes/public-gateway.js +3 -2
  155. package/dist/src/gateway/hono/routes/you.js +86 -5
  156. package/dist/src/gateway/service/marketplace-service.js +1 -1
  157. package/dist/src/gateway/service.d.ts +5 -2
  158. package/dist/src/gateway/service.js +18 -13
  159. package/dist/src/heartbeat/index.js +1 -1
  160. package/dist/src/knowledge/connected-understanding-pipeline.d.ts +19 -0
  161. package/dist/src/knowledge/connected-understanding-pipeline.js +268 -0
  162. package/dist/src/knowledge/index.d.ts +1 -0
  163. package/dist/src/knowledge/index.js +2 -1
  164. package/dist/src/knowledge/ingestion-service.d.ts +6 -4
  165. package/dist/src/knowledge/ingestion-service.js +13 -10
  166. package/dist/src/knowledge/local-folder-adapter.js +1 -0
  167. package/dist/src/knowledge/people-graph.js +43 -110
  168. package/dist/src/knowledge/types.d.ts +3 -0
  169. package/dist/src/mcp/channel-bridge.js +1 -1
  170. package/dist/src/providers/xopc-cloud-account-service.d.ts +40 -0
  171. package/dist/src/providers/xopc-cloud-account-service.js +65 -0
  172. package/dist/src/storage/sqlite/connector-learning-repository.d.ts +47 -0
  173. package/dist/src/storage/sqlite/connector-learning-repository.js +110 -0
  174. package/dist/src/storage/sqlite/index.d.ts +3 -1
  175. package/dist/src/storage/sqlite/index.js +4 -2
  176. package/dist/src/storage/sqlite/knowledge-repository.d.ts +4 -2
  177. package/dist/src/storage/sqlite/knowledge-repository.js +24 -13
  178. package/dist/src/storage/sqlite/migrations/062_connector_learning_jobs.sql +27 -0
  179. package/dist/src/storage/sqlite/migrations/063_knowledge_collection_scopes.sql +14 -0
  180. package/dist/src/storage/sqlite/migrations/064_user_claims.sql +60 -0
  181. package/dist/src/storage/sqlite/migrations/065_knowledge_item_scope_identity.sql +116 -0
  182. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  183. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  184. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  185. package/dist/src/storage/sqlite/schema.js +1 -1
  186. package/dist/src/storage/sqlite/user-claims-repository.d.ts +101 -0
  187. package/dist/src/storage/sqlite/user-claims-repository.js +241 -0
  188. package/dist/src/user-context/projection.d.ts +36 -1
  189. package/dist/src/user-context/projection.js +84 -6
  190. package/dist/src/work-discovery/service.js +1 -0
  191. package/package.json +1 -1
  192. package/skills/tools/find-skills/SKILL.md +18 -428
  193. package/dist/gateway/static/root/assets/agents-ZCIC8mhO.js +0 -2
  194. package/dist/gateway/static/root/assets/apps-page-DJmgBaAm.js +0 -1
  195. package/dist/gateway/static/root/assets/automations-page-Ddot8-Md.js +0 -6
  196. package/dist/gateway/static/root/assets/block-editor-D3GIllO3.js +0 -184
  197. package/dist/gateway/static/root/assets/browser-settings-page-DvETvRcg.js +0 -8
  198. package/dist/gateway/static/root/assets/capabilities-settings-panel-ChXIYbys.js +0 -7
  199. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CUekXsJy.js +0 -1
  200. package/dist/gateway/static/root/assets/channels-settings-CkhveNsQ.js +0 -1
  201. package/dist/gateway/static/root/assets/channels-status-swr-DRTb8DBk.js +0 -1
  202. package/dist/gateway/static/root/assets/connector-logo-CQznQcd4.js +0 -1
  203. package/dist/gateway/static/root/assets/connectors-page-DkSGIxWP.js +0 -2
  204. package/dist/gateway/static/root/assets/desktop-pet-BtP-xUQ9.js +0 -1
  205. package/dist/gateway/static/root/assets/dreaming-settings-gd9W6SLj.js +0 -3
  206. package/dist/gateway/static/root/assets/goal-detail-page-DizZ6Cpl.js +0 -4
  207. package/dist/gateway/static/root/assets/goals-page-Dqry_hi2.js +0 -2
  208. package/dist/gateway/static/root/assets/index-DEdyUjxM.css +0 -1
  209. package/dist/gateway/static/root/assets/logs-page-mT48mcF4.js +0 -7
  210. package/dist/gateway/static/root/assets/notes-workbench-wgt2Osyk.js +0 -4
  211. package/dist/gateway/static/root/assets/project-detail-page-CDjHvxJm.js +0 -1
  212. package/dist/gateway/static/root/assets/projects-page-kJZwQXfC.js +0 -1
  213. package/dist/gateway/static/root/assets/remote-access-hub-MJdI9ek_.js +0 -1
  214. package/dist/gateway/static/root/assets/sessions-page-BqC7GDC_.js +0 -1
  215. package/dist/gateway/static/root/assets/settings-advanced-gate-CYwz8MfF.js +0 -1
  216. package/dist/gateway/static/root/assets/shares-settings-h8tGDkA3.js +0 -1
  217. package/dist/gateway/static/root/assets/skill-reload-api-D2DGvRUn.js +0 -1
  218. package/dist/gateway/static/root/assets/skills-page-vqhjSMhZ.js +0 -2
  219. package/dist/gateway/static/root/assets/time-picker-mtD64kFB.js +0 -1
  220. package/dist/gateway/static/root/assets/user-context-page-BgF0WxjM.js +0 -1
  221. package/dist/gateway/static/root/assets/work-discovery-page-CP0Daig-.js +0 -1
  222. package/dist/gateway/static/root/assets/work-item-detail-page-NEWZPKB_.js +0 -1
  223. package/dist/gateway/static/root/assets/work-page-BkWntcQh.js +0 -1
  224. package/dist/gateway/static/root/assets/workflows-page-DRvhNQGe.js +0 -11
  225. package/dist/src/connectors/memory-sync-coordinator.d.ts +0 -28
  226. package/dist/src/connectors/memory-sync-coordinator.js +0 -162
  227. package/dist/src/connectors/memory-sync-profile.d.ts +0 -13
  228. package/dist/src/connectors/memory-sync-profile.js +0 -73
@@ -0,0 +1,65 @@
1
+ import { getCredentialResolver, init_credentials } from "../auth/credentials.js";
2
+ import { z } from "zod";
3
+ //#region src/providers/xopc-cloud-account-service.ts
4
+ init_credentials();
5
+ const DEFAULT_ROUTER_URL = "https://router.xopc.ai/v1";
6
+ const accountSummarySchema = z.object({
7
+ balance: z.object({
8
+ credits: z.number().int().nonnegative(),
9
+ updatedAt: z.string().datetime()
10
+ }),
11
+ usage: z.object({
12
+ days: z.union([
13
+ z.literal(1),
14
+ z.literal(7),
15
+ z.literal(30)
16
+ ]),
17
+ requests: z.number().int().nonnegative(),
18
+ inputTokens: z.number().int().nonnegative(),
19
+ outputTokens: z.number().int().nonnegative(),
20
+ totalTokens: z.number().int().nonnegative(),
21
+ errors: z.number().int().nonnegative(),
22
+ averageLatencyMs: z.number().nonnegative(),
23
+ chargedCredits: z.number().int().nonnegative()
24
+ }),
25
+ links: z.object({
26
+ details: z.string().url(),
27
+ purchase: z.string().url()
28
+ })
29
+ });
30
+ var XopcCloudAccountError = class extends Error {
31
+ constructor(message, status, code) {
32
+ super(message);
33
+ this.status = status;
34
+ this.code = code;
35
+ this.name = "XopcCloudAccountError";
36
+ }
37
+ };
38
+ var XopcCloudAccountService = class {
39
+ fetchImpl;
40
+ routerUrl;
41
+ credentials;
42
+ constructor(options = {}) {
43
+ this.fetchImpl = options.fetchImpl ?? fetch;
44
+ this.routerUrl = (options.routerUrl ?? process.env.XOPC_MODEL_ROUTER_URL ?? DEFAULT_ROUTER_URL).replace(/\/+$/, "");
45
+ this.credentials = options.credentials ?? getCredentialResolver();
46
+ }
47
+ async getSummary(days = 7) {
48
+ const accessToken = await this.credentials.resolveApiKey("xopc-cloud");
49
+ if (!accessToken) return null;
50
+ const response = await this.fetchImpl(`${this.routerUrl}/account/summary?days=${days}`, {
51
+ headers: {
52
+ authorization: `Bearer ${accessToken}`,
53
+ accept: "application/json"
54
+ },
55
+ signal: AbortSignal.timeout(3e4)
56
+ });
57
+ const body = await response.json().catch(() => null);
58
+ if (!response.ok) throw new XopcCloudAccountError(typeof body?.error?.message === "string" ? body.error.message : `XOPC account summary failed (${response.status})`, response.status, typeof body?.error?.code === "string" ? body.error.code : void 0);
59
+ const parsed = accountSummarySchema.safeParse(body);
60
+ if (!parsed.success) throw new XopcCloudAccountError("XOPC account summary returned an invalid response", response.status, "invalid_response");
61
+ return parsed.data;
62
+ }
63
+ };
64
+ //#endregion
65
+ export { XopcCloudAccountError, XopcCloudAccountService };
@@ -0,0 +1,47 @@
1
+ export type ConnectorLearningMode = 'bootstrap' | 'incremental';
2
+ export type ConnectorLearningStatus = 'queued' | 'running' | 'completed' | 'failed' | 'paused';
3
+ export type ConnectorLearningPhase = 'queued' | 'fetching' | 'indexing' | 'deriving' | 'completed';
4
+ export type ConnectorLearningJob = {
5
+ id: string;
6
+ idempotencyKey: string;
7
+ connectorId: string;
8
+ connectionId: string;
9
+ sourceInstanceId: string;
10
+ agentId: string;
11
+ mode: ConnectorLearningMode;
12
+ status: ConnectorLearningStatus;
13
+ phase: ConnectorLearningPhase;
14
+ itemsDiscovered: number;
15
+ itemsIndexed: number;
16
+ candidatesCreated: number;
17
+ attemptCount: number;
18
+ error?: string;
19
+ nextRunAt?: string;
20
+ startedAt?: string;
21
+ finishedAt?: string;
22
+ createdAt: string;
23
+ updatedAt: string;
24
+ };
25
+ export declare function enqueueConnectorLearningJob(input: {
26
+ connectorId: string;
27
+ connectionId: string;
28
+ sourceInstanceId: string;
29
+ agentId: string;
30
+ mode: ConnectorLearningMode;
31
+ idempotencyKey: string;
32
+ nextRunAt?: number;
33
+ nowMs?: number;
34
+ }): ConnectorLearningJob;
35
+ export declare function claimNextConnectorLearningJob(nowMs?: number): ConnectorLearningJob | null;
36
+ export declare function recoverStaleConnectorLearningJobs(staleBeforeMs: number, nowMs?: number): number;
37
+ export declare function setConnectorLearningPaused(connectionId: string, paused: boolean, nowMs?: number): number;
38
+ export declare function updateConnectorLearningJob(id: string, patch: Partial<Pick<ConnectorLearningJob, 'status' | 'phase' | 'itemsDiscovered' | 'itemsIndexed' | 'candidatesCreated' | 'error'>> & {
39
+ nextRunAt?: number | null;
40
+ finished?: boolean;
41
+ nowMs?: number;
42
+ }): ConnectorLearningJob;
43
+ export declare function listConnectorLearningJobs(options?: {
44
+ sourceInstanceId?: string;
45
+ connectionId?: string;
46
+ limit?: number;
47
+ }): ConnectorLearningJob[];
@@ -0,0 +1,110 @@
1
+ import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
2
+ import { randomUUID } from "node:crypto";
3
+ //#region src/storage/sqlite/connector-learning-repository.ts
4
+ function iso(value) {
5
+ return value == null ? void 0 : new Date(value).toISOString();
6
+ }
7
+ function fromRow(row) {
8
+ return {
9
+ id: row.job_id,
10
+ idempotencyKey: row.idempotency_key,
11
+ connectorId: row.connector_id,
12
+ connectionId: row.connection_id,
13
+ sourceInstanceId: row.source_instance_id,
14
+ agentId: row.agent_id,
15
+ mode: row.mode,
16
+ status: row.status,
17
+ phase: row.phase,
18
+ itemsDiscovered: row.items_discovered,
19
+ itemsIndexed: row.items_indexed,
20
+ candidatesCreated: row.candidates_created,
21
+ attemptCount: row.attempt_count,
22
+ ...row.error ? { error: row.error } : {},
23
+ ...iso(row.next_run_at) ? { nextRunAt: iso(row.next_run_at) } : {},
24
+ ...iso(row.started_at) ? { startedAt: iso(row.started_at) } : {},
25
+ ...iso(row.finished_at) ? { finishedAt: iso(row.finished_at) } : {},
26
+ createdAt: new Date(row.created_at).toISOString(),
27
+ updatedAt: new Date(row.updated_at).toISOString()
28
+ };
29
+ }
30
+ function enqueueConnectorLearningJob(input) {
31
+ const now = input.nowMs ?? Date.now();
32
+ runSqliteWriteTransaction((db) => {
33
+ db.prepare(`INSERT INTO connector_learning_jobs (
34
+ job_id, idempotency_key, connector_id, connection_id, source_instance_id,
35
+ agent_id, mode, status, phase, next_run_at, created_at, updated_at
36
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', 'queued', ?, ?, ?)
37
+ ON CONFLICT(idempotency_key) DO NOTHING`).run(randomUUID(), input.idempotencyKey, input.connectorId, input.connectionId, input.sourceInstanceId, input.agentId, input.mode, input.nextRunAt ?? now, now, now);
38
+ });
39
+ return fromRow(getSqliteDatabase().prepare("SELECT * FROM connector_learning_jobs WHERE idempotency_key = ?").get(input.idempotencyKey));
40
+ }
41
+ function claimNextConnectorLearningJob(nowMs = Date.now()) {
42
+ return runSqliteWriteTransaction((db) => {
43
+ const row = db.prepare(`SELECT * FROM connector_learning_jobs
44
+ WHERE status IN ('queued', 'failed') AND attempt_count < 5 AND COALESCE(next_run_at, 0) <= ?
45
+ ORDER BY next_run_at ASC, created_at ASC LIMIT 1`).get(nowMs);
46
+ if (!row) return null;
47
+ if (db.prepare(`UPDATE connector_learning_jobs SET
48
+ status = 'running', phase = 'fetching', attempt_count = attempt_count + 1,
49
+ error = NULL, started_at = COALESCE(started_at, ?), updated_at = ?
50
+ WHERE job_id = ? AND status IN ('queued', 'failed')`).run(nowMs, nowMs, row.job_id).changes !== 1) return null;
51
+ return fromRow(db.prepare("SELECT * FROM connector_learning_jobs WHERE job_id = ?").get(row.job_id));
52
+ });
53
+ }
54
+ function recoverStaleConnectorLearningJobs(staleBeforeMs, nowMs = Date.now()) {
55
+ return runSqliteWriteTransaction((db) => Number(db.prepare(`UPDATE connector_learning_jobs SET
56
+ status = CASE WHEN attempt_count >= 5 THEN 'paused' ELSE 'failed' END,
57
+ error = 'Interrupted while learning; queued for recovery.',
58
+ next_run_at = CASE WHEN attempt_count >= 5 THEN NULL ELSE ? END,
59
+ finished_at = ?, updated_at = ?
60
+ WHERE status = 'running' AND updated_at < ?`).run(nowMs, nowMs, nowMs, staleBeforeMs).changes));
61
+ }
62
+ function setConnectorLearningPaused(connectionId, paused, nowMs = Date.now()) {
63
+ return runSqliteWriteTransaction((db) => Number(db.prepare(paused ? `UPDATE connector_learning_jobs SET status = 'paused', next_run_at = NULL, updated_at = ?
64
+ WHERE connection_id = ? AND status IN ('queued', 'failed', 'running')` : `UPDATE connector_learning_jobs SET status = 'queued', next_run_at = ?, updated_at = ?
65
+ WHERE connection_id = ? AND status = 'paused'`).run(...paused ? [nowMs, connectionId] : [
66
+ nowMs,
67
+ nowMs,
68
+ connectionId
69
+ ]).changes));
70
+ }
71
+ function updateConnectorLearningJob(id, patch) {
72
+ const now = patch.nowMs ?? Date.now();
73
+ const fields = ["updated_at = ?"];
74
+ const values = [now];
75
+ const add = (column, value) => {
76
+ if (value === void 0) return;
77
+ fields.push(`${column} = ?`);
78
+ values.push(value);
79
+ };
80
+ add("status", patch.status);
81
+ add("phase", patch.phase);
82
+ add("items_discovered", patch.itemsDiscovered);
83
+ add("items_indexed", patch.itemsIndexed);
84
+ add("candidates_created", patch.candidatesCreated);
85
+ add("error", patch.error);
86
+ add("next_run_at", patch.nextRunAt);
87
+ if (patch.finished) add("finished_at", now);
88
+ values.push(id);
89
+ getSqliteDatabase().prepare(`UPDATE connector_learning_jobs SET ${fields.join(", ")} WHERE job_id = ?`).run(...values);
90
+ const row = getSqliteDatabase().prepare("SELECT * FROM connector_learning_jobs WHERE job_id = ?").get(id);
91
+ if (!row) throw new Error(`Connector learning job not found: ${id}`);
92
+ return fromRow(row);
93
+ }
94
+ function listConnectorLearningJobs(options = {}) {
95
+ const clauses = [];
96
+ const values = [];
97
+ if (options.sourceInstanceId) {
98
+ clauses.push("source_instance_id = ?");
99
+ values.push(options.sourceInstanceId);
100
+ }
101
+ if (options.connectionId) {
102
+ clauses.push("connection_id = ?");
103
+ values.push(options.connectionId);
104
+ }
105
+ const limit = Math.max(1, Math.min(options.limit ?? 100, 500));
106
+ return getSqliteDatabase().prepare(`SELECT * FROM connector_learning_jobs ${clauses.length ? `WHERE ${clauses.join(" AND ")}` : ""}
107
+ ORDER BY created_at DESC LIMIT ?`).all(...values, limit).map(fromRow);
108
+ }
109
+ //#endregion
110
+ export { claimNextConnectorLearningJob, enqueueConnectorLearningJob, listConnectorLearningJobs, recoverStaleConnectorLearningJobs, setConnectorLearningPaused, updateConnectorLearningJob };
@@ -5,6 +5,8 @@ export { DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, } from './m
5
5
  export { discoverSqlMigrations, listRegisteredMigrationTargets } from './migrations/discover.js';
6
6
  export { closeXopcDatabase, getXopcDatabase, isXopcDatabaseOpen, openXopcDatabase, requireXopcDatabase, resetXopcDatabaseSingletonForTest, type OpenXopcDatabaseOptions, type XopcDatabase, } from './connection.js';
7
7
  export { getSqliteDatabase, runSqliteWriteTransaction } from './transaction.js';
8
+ export { getUserClaim, linkUserClaimMemoryRecord, listUserClaimEvidence, listUserClaimStatsBySource, listUserClaims, listUserPeopleGraphRows, removeUserClaimEvidenceForSource, reinforceUserClaim, resolveUserEntity, setUserClaimDecision, type UserClaim, type UserClaimClass, type UserClaimState, type UserEntity, } from './user-claims-repository.js';
9
+ export { claimNextConnectorLearningJob, enqueueConnectorLearningJob, listConnectorLearningJobs, recoverStaleConnectorLearningJobs, setConnectorLearningPaused, updateConnectorLearningJob, type ConnectorLearningJob, type ConnectorLearningMode, type ConnectorLearningPhase, type ConnectorLearningStatus, } from './connector-learning-repository.js';
8
10
  export { appendComposerInputHistory, clearComposerInputHistory, listComposerInputHistory, COMPOSER_INPUT_HISTORY_LIMIT, type ComposerInputHistoryItem, } from './composer-input-history-repository.js';
9
11
  export { getInteractionState, setInteractionState, updateInteractionStateFromMessage, type InteractionState, } from './interaction-state-repository.js';
10
12
  export { buildRelationshipPrompt, getRelationshipSettings, isProactiveSupportAllowed, updateRelationshipSettings, type RelationshipSettings, type SupportMode, } from './relationship-settings-repository.js';
@@ -17,7 +19,7 @@ export { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord, } f
17
19
  export { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord, type NoteAgentContextRecord, } from './note-agent-context-repository.js';
18
20
  export { searchMemoryIndex, syncMemoryIndex, type MemorySearchHit, } from './memory-index-repository.js';
19
21
  export { appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, findLatestMemoryInjectTrace, getMemoryProviderState, getMemoryRecord, hasUnresolvedMemoryConflict, listMemorySignals, listMemoryTraceEvents, listMemoryRecords, markMemoryRecordsConflicted, searchMemoryRecords, setMemoryProviderState, setMemoryTraceFeedback, setLatestMemoryInjectFeedback, summarizeMemoryRecallFeedback, summarizeUserUnderstandingQuality, USER_UNDERSTANDING_REMEDIATION_POLICY, upsertMemoryRecord, type AppendMemorySignalInput, type AppendMemoryTraceEventInput, type FindLatestMemoryInjectTraceInput, type ListMemoryRecordsOptions, type MemoryRecallFeedbackSummary, type MemoryFeedbackRemediationResult, type MemorySignalRowPayload, type MemoryTraceFeedback, type MemoryTraceEventPayload, type UserUnderstandingQualityMetrics, type SearchMemoryRecordsOptions, type SetMemoryTraceFeedbackInput, type SetLatestMemoryInjectFeedbackInput, type UpsertMemoryRecordInput, } from './memory-records-repository.js';
20
- export { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceItems, listKnowledgeSourceChanges, listKnowledgeSyncRuns, listMemoryEvidence, setKnowledgeSourceItemSynthesisStatus, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, startKnowledgeSyncRun, upsertKnowledgeSourceItems, } from './knowledge-repository.js';
22
+ export { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceItems, listKnowledgeSourceChanges, listKnowledgeSyncRuns, listMemoryEvidence, pruneBoundedKnowledgeSourceItems, setKnowledgeSourceItemSynthesisStatus, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, startKnowledgeSyncRun, upsertKnowledgeSourceItems, } from './knowledge-repository.js';
21
23
  export { deleteSessionConfig, getSessionConfig, hasSessionConfig, setSessionConfig, updateSessionConfig, } from './config-repository.js';
22
24
  export { createObjectLinkRecord, getActivityEventRecord, listActivityRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, recordActivityEvent, } from './activity-repository.js';
23
25
  export { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getConnectorConnection, getConnectorApproval, getConnectorInstallation, getCachedConnectorCatalogEntry, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, type CachedConnectorCatalogEntry, } from './connector-repository.js';
@@ -6,6 +6,8 @@ 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 { getUserClaim, linkUserClaimMemoryRecord, listUserClaimEvidence, listUserClaimStatsBySource, listUserClaims, listUserPeopleGraphRows, reinforceUserClaim, removeUserClaimEvidenceForSource, resolveUserEntity, setUserClaimDecision } from "./user-claims-repository.js";
10
+ import { claimNextConnectorLearningJob, enqueueConnectorLearningJob, listConnectorLearningJobs, recoverStaleConnectorLearningJobs, setConnectorLearningPaused, updateConnectorLearningJob } from "./connector-learning-repository.js";
9
11
  import { COMPOSER_INPUT_HISTORY_LIMIT, appendComposerInputHistory, clearComposerInputHistory, listComposerInputHistory } from "./composer-input-history-repository.js";
10
12
  import { getInteractionState, setInteractionState, updateInteractionStateFromMessage } from "./interaction-state-repository.js";
11
13
  import { buildRelationshipPrompt, getRelationshipSettings, isProactiveSupportAllowed, updateRelationshipSettings } from "./relationship-settings-repository.js";
@@ -18,11 +20,11 @@ import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } fr
18
20
  import { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord } from "./note-agent-context-repository.js";
19
21
  import { searchMemoryIndex, syncMemoryIndex } from "./memory-index-repository.js";
20
22
  import { USER_UNDERSTANDING_REMEDIATION_POLICY, appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, findLatestMemoryInjectTrace, getMemoryProviderState, getMemoryRecord, hasUnresolvedMemoryConflict, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, markMemoryRecordsConflicted, searchMemoryRecords, setLatestMemoryInjectFeedback, setMemoryProviderState, setMemoryTraceFeedback, summarizeMemoryRecallFeedback, summarizeUserUnderstandingQuality, upsertMemoryRecord } from "./memory-records-repository.js";
21
- import { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems } from "./knowledge-repository.js";
23
+ import { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, pruneBoundedKnowledgeSourceItems, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems } from "./knowledge-repository.js";
22
24
  import { deleteSessionConfig, getSessionConfig, hasSessionConfig, setSessionConfig, updateSessionConfig } from "./config-repository.js";
23
25
  import { createObjectLinkRecord, getActivityEventRecord, listActivityRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, recordActivityEvent } from "./activity-repository.js";
24
26
  import { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getCachedConnectorCatalogEntry, getConnectorApproval, getConnectorConnection, getConnectorInstallation, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation } from "./connector-repository.js";
25
27
  import { getUserTrustPolicy, setUserTrustPolicy } from "./user-trust-repository.js";
26
28
  import { consumeMemoryReferenceConsent, decideMemoryReferenceConsent, ensureMemoryReferenceConsentRequest, hasMemoryReferenceConsent, listMemoryReferenceConsents, revokeMemoryReferenceConsent } from "./memory-reference-consent-repository.js";
27
29
  import { getUserProfilePromptState, setUserProfilePromptState } from "./user-profile-setup-repository.js";
28
- 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, classifyStoredRow, clearComposerInputHistory, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, completeTaskOutcome, consumeConnectorApproval, consumeMemoryReferenceConsent, createConnectorApproval, createObjectLinkRecord, decideConnectorApproval, decideMemoryReferenceConsent, deleteConnectorConnection, deleteConnectorInstallation, deleteMemoryEvidenceForRecord, deleteMemoryRecord, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, 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, getUserProfilePromptState, getUserTrustPolicy, getXopcDatabase, hasMemoryReferenceConsent, hasSessionConfig, hasUnresolvedMemoryConflict, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isProactiveSupportAllowed, isXopcDatabaseOpen, listActivityRecords, listCachedConnectorCatalogEntries, listCompactionBoundaries, listComposerInputHistory, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, listMemoryRecords, listMemoryReferenceConsents, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTaskOutcomes, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, markMemoryRecordsConflicted, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, readSchemaVersion, readSchemaVersionForTest, recordActivityEvent, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreBeforeCompactionBoundary, revokeMemoryReferenceConsent, runSqliteWriteTransaction, searchMemoryIndex, searchMemoryRecords, sessionConfigRowToConfig, sessionRowToMetadata, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setLatestMemoryInjectFeedback, setMemoryProviderState, setMemoryTraceFeedback, setSessionConfig, setTaskOutcomeFeedback, setUserProfilePromptState, setUserTrustPolicy, startKnowledgeSyncRun, startTaskOutcome, summarizeMemoryRecallFeedback, summarizeTaskOutcomes, summarizeUserUnderstandingQuality, syncMemoryIndex, transcriptEntryRowToStoredRow, updateInteractionStateFromMessage, updateRelationshipSettings, updateSessionConfig, updateSessionStats, updateTaskOutcome, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertKnowledgeSourceItems, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord };
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 };
@@ -21,8 +21,8 @@ export declare function listKnowledgeSyncRuns(options?: {
21
21
  status?: KnowledgeSyncRunStatus;
22
22
  limit?: number;
23
23
  }): KnowledgeSyncRun[];
24
- export declare function getKnowledgeSourceCursor(sourceInstanceId: string): string | undefined;
25
- export declare function setKnowledgeSourceCursor(sourceInstanceId: string, cursor: string | undefined): void;
24
+ export declare function getKnowledgeSourceCursor(sourceInstanceId: string, collectionScope: string): string | undefined;
25
+ export declare function setKnowledgeSourceCursor(sourceInstanceId: string, collectionScope: string, cursor: string | undefined): void;
26
26
  export declare function upsertKnowledgeSourceItems(inputs: KnowledgeSourceItemInput[], nowMs?: number): {
27
27
  items: KnowledgeSourceItem[];
28
28
  created: number;
@@ -39,12 +39,14 @@ export declare function getKnowledgeConsumerWatermark(consumerId: string, source
39
39
  export declare function setKnowledgeConsumerWatermark(consumerId: string, sourceInstanceId: string, sequence: number, nowMs?: number): void;
40
40
  export declare function listKnowledgeSourceItems(options?: {
41
41
  sourceInstanceId?: string;
42
+ collectionScope?: string;
42
43
  itemType?: string;
43
44
  synthesisStatus?: KnowledgeSynthesisStatus;
44
45
  includeDeleted?: boolean;
45
46
  limit?: number;
46
47
  offset?: number;
47
48
  }): KnowledgeSourceItem[];
49
+ export declare function pruneBoundedKnowledgeSourceItems(sourceInstanceId: string, olderThanMs: number): number;
48
50
  export declare function setKnowledgeSourceItemSynthesisStatus(itemIds: string[], status: KnowledgeSynthesisStatus, nowMs?: number): number;
49
51
  export declare function claimKnowledgeSourceItems(options: {
50
52
  workerId: string;
@@ -29,6 +29,7 @@ function sourceItemFromRow(row) {
29
29
  return {
30
30
  id: row.item_id,
31
31
  sourceInstanceId: row.source_instance_id,
32
+ collectionScope: row.collection_scope,
32
33
  externalId: row.external_id,
33
34
  itemType: row.item_type,
34
35
  ...row.author_role ? { authorRole: row.author_role } : {},
@@ -127,16 +128,16 @@ function listKnowledgeSyncRuns(options = {}) {
127
128
  ${where.length > 0 ? `WHERE ${where.join(" AND ")}` : ""}
128
129
  ORDER BY started_at DESC LIMIT ?`).all(...params, limit).map(syncRunFromRow);
129
130
  }
130
- function getKnowledgeSourceCursor(sourceInstanceId) {
131
- return getSqliteDatabase().prepare(`SELECT cursor FROM knowledge_source_state WHERE source_instance_id = ?`).get(sourceInstanceId)?.cursor ?? void 0;
131
+ function getKnowledgeSourceCursor(sourceInstanceId, collectionScope) {
132
+ return getSqliteDatabase().prepare(`SELECT cursor FROM knowledge_collection_state WHERE source_instance_id = ? AND collection_scope = ?`).get(sourceInstanceId, collectionScope)?.cursor ?? void 0;
132
133
  }
133
- function setKnowledgeSourceCursor(sourceInstanceId, cursor) {
134
+ function setKnowledgeSourceCursor(sourceInstanceId, collectionScope, cursor) {
134
135
  runSqliteWriteTransaction((db) => {
135
- db.prepare(`INSERT INTO knowledge_source_state (source_instance_id, cursor, updated_at)
136
- VALUES (?, ?, ?)
137
- ON CONFLICT(source_instance_id) DO UPDATE SET
136
+ db.prepare(`INSERT INTO knowledge_collection_state (source_instance_id, collection_scope, cursor, updated_at)
137
+ VALUES (?, ?, ?, ?)
138
+ ON CONFLICT(source_instance_id, collection_scope) DO UPDATE SET
138
139
  cursor = excluded.cursor,
139
- updated_at = excluded.updated_at`).run(sourceInstanceId, cursor ?? null, Date.now());
140
+ updated_at = excluded.updated_at`).run(sourceInstanceId, collectionScope, cursor ?? null, Date.now());
140
141
  });
141
142
  }
142
143
  function upsertKnowledgeSourceItems(inputs, nowMs = Date.now()) {
@@ -147,7 +148,7 @@ function upsertKnowledgeSourceItems(inputs, nowMs = Date.now()) {
147
148
  let unchanged = 0;
148
149
  for (const input of inputs) {
149
150
  const existing = db.prepare(`SELECT * FROM knowledge_source_items
150
- WHERE source_instance_id = ? AND external_id = ?`).get(input.sourceInstanceId, input.externalId);
151
+ WHERE source_instance_id = ? AND collection_scope = ? AND external_id = ?`).get(input.sourceInstanceId, input.collectionScope, input.externalId);
151
152
  const id = existing?.item_id ?? input.id ?? randomUUID();
152
153
  if (existing?.content_hash === input.contentHash && existing.deleted_at === parseTimestamp(input.deletedAt)) {
153
154
  unchanged += 1;
@@ -155,13 +156,14 @@ function upsertKnowledgeSourceItems(inputs, nowMs = Date.now()) {
155
156
  continue;
156
157
  }
157
158
  db.prepare(`INSERT INTO knowledge_source_items (
158
- item_id, source_instance_id, external_id, item_type, author_role,
159
+ item_id, source_instance_id, collection_scope, external_id, item_type, author_role,
159
160
  occurred_at, source_updated_at, content_hash, normalized_text,
160
161
  payload_ref, metadata_json, sensitivity, retention_class,
161
162
  synthesis_pipeline, synthesis_status, deleted_at, created_at, updated_at
162
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
163
- ON CONFLICT(source_instance_id, external_id) DO UPDATE SET
163
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
164
+ ON CONFLICT(source_instance_id, collection_scope, external_id) DO UPDATE SET
164
165
  item_type = excluded.item_type,
166
+ collection_scope = excluded.collection_scope,
165
167
  author_role = excluded.author_role,
166
168
  occurred_at = excluded.occurred_at,
167
169
  source_updated_at = excluded.source_updated_at,
@@ -178,7 +180,7 @@ function upsertKnowledgeSourceItems(inputs, nowMs = Date.now()) {
178
180
  synthesis_claimed_by = NULL,
179
181
  synthesis_error = NULL,
180
182
  deleted_at = excluded.deleted_at,
181
- updated_at = excluded.updated_at`).run(id, input.sourceInstanceId, input.externalId, input.itemType, input.authorRole ?? null, parseTimestamp(input.occurredAt), parseTimestamp(input.sourceUpdatedAt), input.contentHash, input.normalizedText ?? null, input.payloadRef ?? null, JSON.stringify(input.metadata ?? {}), input.sensitivity ?? "normal", input.retentionClass ?? "bounded", input.synthesisPipeline ?? "user_understanding", input.synthesisStatus ?? "pending", parseTimestamp(input.deletedAt), existing?.created_at ?? nowMs, nowMs);
183
+ updated_at = excluded.updated_at`).run(id, input.sourceInstanceId, input.collectionScope, input.externalId, input.itemType, input.authorRole ?? null, parseTimestamp(input.occurredAt), parseTimestamp(input.sourceUpdatedAt), input.contentHash, input.normalizedText ?? null, input.payloadRef ?? null, JSON.stringify(input.metadata ?? {}), input.sensitivity ?? "normal", input.retentionClass ?? "bounded", input.synthesisPipeline ?? "user_understanding", input.synthesisStatus ?? "pending", parseTimestamp(input.deletedAt), existing?.created_at ?? nowMs, nowMs);
182
184
  const row = db.prepare(`SELECT * FROM knowledge_source_items WHERE item_id = ?`).get(id);
183
185
  items.push(sourceItemFromRow(row));
184
186
  const changeKind = input.deletedAt ? "deleted" : existing ? "modified" : "added";
@@ -238,6 +240,10 @@ function listKnowledgeSourceItems(options = {}) {
238
240
  where.push("source_instance_id = ?");
239
241
  params.push(options.sourceInstanceId);
240
242
  }
243
+ if (options.collectionScope) {
244
+ where.push("collection_scope = ?");
245
+ params.push(options.collectionScope);
246
+ }
241
247
  if (options.itemType) {
242
248
  where.push("item_type = ?");
243
249
  params.push(options.itemType);
@@ -254,6 +260,11 @@ function listKnowledgeSourceItems(options = {}) {
254
260
  ORDER BY COALESCE(source_updated_at, occurred_at, updated_at) DESC
255
261
  LIMIT ? OFFSET ?`).all(...params, limit, offset).map(sourceItemFromRow);
256
262
  }
263
+ function pruneBoundedKnowledgeSourceItems(sourceInstanceId, olderThanMs) {
264
+ return runSqliteWriteTransaction((db) => Number(db.prepare(`DELETE FROM knowledge_source_items
265
+ WHERE source_instance_id = ? AND retention_class = 'bounded'
266
+ AND COALESCE(source_updated_at, occurred_at, updated_at) < ?`).run(sourceInstanceId, olderThanMs).changes));
267
+ }
257
268
  function setKnowledgeSourceItemSynthesisStatus(itemIds, status, nowMs = Date.now()) {
258
269
  if (itemIds.length === 0) return 0;
259
270
  return runSqliteWriteTransaction((db) => {
@@ -350,4 +361,4 @@ function listMemoryEvidence(recordId) {
350
361
  }));
351
362
  }
352
363
  //#endregion
353
- export { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems };
364
+ export { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, pruneBoundedKnowledgeSourceItems, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems };
@@ -0,0 +1,27 @@
1
+ CREATE TABLE connector_learning_jobs (
2
+ job_id TEXT PRIMARY KEY,
3
+ idempotency_key TEXT NOT NULL UNIQUE,
4
+ connector_id TEXT NOT NULL,
5
+ connection_id TEXT NOT NULL,
6
+ source_instance_id TEXT NOT NULL,
7
+ agent_id TEXT NOT NULL,
8
+ mode TEXT NOT NULL CHECK(mode IN ('bootstrap', 'incremental')),
9
+ status TEXT NOT NULL CHECK(status IN ('queued', 'running', 'completed', 'failed', 'paused')),
10
+ phase TEXT NOT NULL CHECK(phase IN ('queued', 'fetching', 'indexing', 'deriving', 'completed')),
11
+ items_discovered INTEGER NOT NULL DEFAULT 0,
12
+ items_indexed INTEGER NOT NULL DEFAULT 0,
13
+ candidates_created INTEGER NOT NULL DEFAULT 0,
14
+ attempt_count INTEGER NOT NULL DEFAULT 0,
15
+ error TEXT,
16
+ next_run_at INTEGER,
17
+ started_at INTEGER,
18
+ finished_at INTEGER,
19
+ created_at INTEGER NOT NULL,
20
+ updated_at INTEGER NOT NULL,
21
+ FOREIGN KEY(connection_id) REFERENCES connector_connections(id) ON DELETE CASCADE
22
+ );
23
+
24
+ CREATE INDEX idx_connector_learning_jobs_due
25
+ ON connector_learning_jobs(status, next_run_at, created_at);
26
+ CREATE INDEX idx_connector_learning_jobs_source
27
+ ON connector_learning_jobs(source_instance_id, created_at DESC);
@@ -0,0 +1,14 @@
1
+ ALTER TABLE knowledge_source_items ADD COLUMN collection_scope TEXT NOT NULL DEFAULT 'primary';
2
+
3
+ DROP TABLE knowledge_source_state;
4
+
5
+ CREATE TABLE knowledge_collection_state (
6
+ source_instance_id TEXT NOT NULL,
7
+ collection_scope TEXT NOT NULL,
8
+ cursor TEXT,
9
+ updated_at INTEGER NOT NULL,
10
+ PRIMARY KEY(source_instance_id, collection_scope)
11
+ );
12
+
13
+ CREATE INDEX idx_knowledge_source_items_collection
14
+ ON knowledge_source_items(source_instance_id, collection_scope, updated_at DESC);
@@ -0,0 +1,60 @@
1
+ CREATE TABLE user_entities (
2
+ entity_id TEXT PRIMARY KEY,
3
+ entity_type TEXT NOT NULL CHECK(entity_type IN ('person', 'project', 'organization')),
4
+ canonical_label TEXT NOT NULL,
5
+ created_at INTEGER NOT NULL,
6
+ updated_at INTEGER NOT NULL
7
+ );
8
+
9
+ CREATE TABLE user_entity_handles (
10
+ entity_id TEXT NOT NULL,
11
+ handle_type TEXT NOT NULL CHECK(handle_type IN ('email', 'provider_user', 'display_name')),
12
+ normalized_value TEXT NOT NULL,
13
+ source_scope TEXT NOT NULL,
14
+ verified INTEGER NOT NULL CHECK(verified IN (0, 1)),
15
+ created_at INTEGER NOT NULL,
16
+ PRIMARY KEY(handle_type, normalized_value, source_scope),
17
+ FOREIGN KEY(entity_id) REFERENCES user_entities(entity_id) ON DELETE CASCADE
18
+ );
19
+
20
+ CREATE INDEX idx_user_entity_handles_entity ON user_entity_handles(entity_id);
21
+
22
+ CREATE TABLE user_claims (
23
+ claim_id TEXT PRIMARY KEY,
24
+ agent_id TEXT NOT NULL,
25
+ claim_class TEXT NOT NULL CHECK(claim_class IN ('relationship', 'project', 'routine')),
26
+ claim_key TEXT NOT NULL,
27
+ subject_entity_id TEXT,
28
+ value_json TEXT NOT NULL,
29
+ state TEXT NOT NULL CHECK(state IN ('provisional', 'active', 'rejected', 'stale')),
30
+ user_state TEXT NOT NULL CHECK(user_state IN ('auto', 'confirmed', 'rejected')),
31
+ confidence REAL NOT NULL,
32
+ independent_evidence_count INTEGER NOT NULL,
33
+ active_day_count INTEGER NOT NULL,
34
+ first_observed_at INTEGER NOT NULL,
35
+ last_reinforced_at INTEGER NOT NULL,
36
+ memory_record_id TEXT,
37
+ created_at INTEGER NOT NULL,
38
+ updated_at INTEGER NOT NULL,
39
+ UNIQUE(agent_id, claim_class, claim_key),
40
+ FOREIGN KEY(subject_entity_id) REFERENCES user_entities(entity_id) ON DELETE SET NULL,
41
+ FOREIGN KEY(memory_record_id) REFERENCES memory_records(record_id) ON DELETE SET NULL
42
+ );
43
+
44
+ CREATE INDEX idx_user_claims_agent_state
45
+ ON user_claims(agent_id, state, confidence DESC, last_reinforced_at DESC);
46
+
47
+ CREATE TABLE user_claim_evidence (
48
+ claim_id TEXT NOT NULL,
49
+ logical_event_key TEXT NOT NULL,
50
+ source_item_id TEXT NOT NULL,
51
+ source_instance_id TEXT NOT NULL,
52
+ relation TEXT NOT NULL CHECK(relation IN ('supports', 'contradicts')),
53
+ observed_at INTEGER NOT NULL,
54
+ created_at INTEGER NOT NULL,
55
+ PRIMARY KEY(claim_id, logical_event_key),
56
+ FOREIGN KEY(claim_id) REFERENCES user_claims(claim_id) ON DELETE CASCADE,
57
+ FOREIGN KEY(source_item_id) REFERENCES knowledge_source_items(item_id) ON DELETE CASCADE
58
+ );
59
+
60
+ CREATE INDEX idx_user_claim_evidence_source ON user_claim_evidence(source_item_id);
@@ -0,0 +1,116 @@
1
+ CREATE TABLE memory_evidence_backup AS SELECT * FROM memory_evidence;
2
+ CREATE TABLE knowledge_source_changes_backup AS SELECT * FROM knowledge_source_changes;
3
+ CREATE TABLE user_claim_evidence_backup AS SELECT * FROM user_claim_evidence;
4
+
5
+ DROP TABLE memory_evidence;
6
+ DROP TABLE knowledge_source_changes;
7
+ DROP TABLE user_claim_evidence;
8
+
9
+ CREATE TABLE knowledge_source_items_v65 (
10
+ item_id TEXT PRIMARY KEY,
11
+ source_instance_id TEXT NOT NULL,
12
+ collection_scope TEXT NOT NULL,
13
+ external_id TEXT NOT NULL,
14
+ item_type TEXT NOT NULL,
15
+ author_role TEXT,
16
+ occurred_at INTEGER,
17
+ source_updated_at INTEGER,
18
+ content_hash TEXT NOT NULL,
19
+ normalized_text TEXT,
20
+ payload_ref TEXT,
21
+ metadata_json TEXT NOT NULL DEFAULT '{}',
22
+ sensitivity TEXT NOT NULL DEFAULT 'normal',
23
+ retention_class TEXT NOT NULL DEFAULT 'bounded',
24
+ synthesis_status TEXT NOT NULL DEFAULT 'pending',
25
+ synthesis_pipeline TEXT NOT NULL DEFAULT 'user_understanding'
26
+ CHECK(synthesis_pipeline IN ('user_understanding', 'connected_knowledge')),
27
+ synthesis_attempts INTEGER NOT NULL DEFAULT 0,
28
+ synthesis_claimed_at INTEGER,
29
+ synthesis_claimed_by TEXT,
30
+ synthesis_error TEXT,
31
+ deleted_at INTEGER,
32
+ created_at INTEGER NOT NULL,
33
+ updated_at INTEGER NOT NULL,
34
+ UNIQUE(source_instance_id, collection_scope, external_id)
35
+ );
36
+
37
+ INSERT INTO knowledge_source_items_v65 (
38
+ item_id, source_instance_id, collection_scope, external_id, item_type, author_role,
39
+ occurred_at, source_updated_at, content_hash, normalized_text, payload_ref, metadata_json,
40
+ sensitivity, retention_class, synthesis_status, synthesis_pipeline, synthesis_attempts,
41
+ synthesis_claimed_at, synthesis_claimed_by, synthesis_error, deleted_at, created_at, updated_at
42
+ )
43
+ SELECT
44
+ item_id, source_instance_id, collection_scope, external_id, item_type, author_role,
45
+ occurred_at, source_updated_at, content_hash, normalized_text, payload_ref, metadata_json,
46
+ sensitivity, retention_class, synthesis_status, synthesis_pipeline, synthesis_attempts,
47
+ synthesis_claimed_at, synthesis_claimed_by, synthesis_error, deleted_at, created_at, updated_at
48
+ FROM knowledge_source_items;
49
+
50
+ DROP TABLE knowledge_source_items;
51
+ ALTER TABLE knowledge_source_items_v65 RENAME TO knowledge_source_items;
52
+
53
+ CREATE INDEX idx_knowledge_source_items_source_updated
54
+ ON knowledge_source_items(source_instance_id, updated_at DESC);
55
+ CREATE INDEX idx_knowledge_source_items_synthesis
56
+ ON knowledge_source_items(synthesis_status, updated_at);
57
+ CREATE INDEX idx_knowledge_source_items_hash
58
+ ON knowledge_source_items(content_hash);
59
+ CREATE INDEX idx_knowledge_source_items_synthesis_lease
60
+ ON knowledge_source_items(synthesis_pipeline, synthesis_status, synthesis_claimed_at, updated_at);
61
+ CREATE INDEX idx_knowledge_source_items_collection
62
+ ON knowledge_source_items(source_instance_id, collection_scope, updated_at DESC);
63
+
64
+ CREATE TABLE memory_evidence (
65
+ evidence_id TEXT PRIMARY KEY,
66
+ record_id TEXT NOT NULL,
67
+ source_item_id TEXT,
68
+ relation TEXT NOT NULL,
69
+ excerpt TEXT,
70
+ confidence REAL,
71
+ observed_at INTEGER,
72
+ created_at INTEGER NOT NULL,
73
+ FOREIGN KEY(record_id) REFERENCES memory_records(record_id) ON DELETE CASCADE,
74
+ FOREIGN KEY(source_item_id) REFERENCES knowledge_source_items(item_id) ON DELETE SET NULL
75
+ );
76
+ INSERT INTO memory_evidence SELECT * FROM memory_evidence_backup;
77
+ DROP TABLE memory_evidence_backup;
78
+ CREATE INDEX idx_memory_evidence_record ON memory_evidence(record_id, created_at DESC);
79
+ CREATE INDEX idx_memory_evidence_source_item ON memory_evidence(source_item_id);
80
+ CREATE UNIQUE INDEX idx_memory_evidence_record_source_relation
81
+ ON memory_evidence(record_id, source_item_id, relation)
82
+ WHERE source_item_id IS NOT NULL;
83
+
84
+ CREATE TABLE knowledge_source_changes (
85
+ sequence INTEGER PRIMARY KEY AUTOINCREMENT,
86
+ change_id TEXT NOT NULL UNIQUE,
87
+ source_instance_id TEXT NOT NULL,
88
+ source_item_id TEXT NOT NULL,
89
+ change_kind TEXT NOT NULL CHECK(change_kind IN ('added', 'modified', 'deleted')),
90
+ old_hash TEXT,
91
+ new_hash TEXT,
92
+ changed_at INTEGER NOT NULL,
93
+ FOREIGN KEY(source_item_id) REFERENCES knowledge_source_items(item_id) ON DELETE CASCADE
94
+ );
95
+ INSERT INTO knowledge_source_changes SELECT * FROM knowledge_source_changes_backup;
96
+ DROP TABLE knowledge_source_changes_backup;
97
+ CREATE INDEX idx_knowledge_source_changes_source_sequence
98
+ ON knowledge_source_changes(source_instance_id, sequence);
99
+ CREATE INDEX idx_knowledge_source_changes_changed_at
100
+ ON knowledge_source_changes(changed_at DESC);
101
+
102
+ CREATE TABLE user_claim_evidence (
103
+ claim_id TEXT NOT NULL,
104
+ logical_event_key TEXT NOT NULL,
105
+ source_item_id TEXT NOT NULL,
106
+ source_instance_id TEXT NOT NULL,
107
+ relation TEXT NOT NULL CHECK(relation IN ('supports', 'contradicts')),
108
+ observed_at INTEGER NOT NULL,
109
+ created_at INTEGER NOT NULL,
110
+ PRIMARY KEY(claim_id, logical_event_key),
111
+ FOREIGN KEY(claim_id) REFERENCES user_claims(claim_id) ON DELETE CASCADE,
112
+ FOREIGN KEY(source_item_id) REFERENCES knowledge_source_items(item_id) ON DELETE CASCADE
113
+ );
114
+ INSERT INTO user_claim_evidence SELECT * FROM user_claim_evidence_backup;
115
+ DROP TABLE user_claim_evidence_backup;
116
+ CREATE INDEX idx_user_claim_evidence_source ON user_claim_evidence(source_item_id);