@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,268 @@
1
+ import { linkUserClaimMemoryRecord, reinforceUserClaim, resolveUserEntity } from "../storage/sqlite/user-claims-repository.js";
2
+ import { listKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
3
+ import "../storage/sqlite/index.js";
4
+ //#region src/knowledge/connected-understanding-pipeline.ts
5
+ function logicalEventKey(item) {
6
+ const value = item.metadata.logicalEventKey;
7
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
8
+ }
9
+ function eventTime(item) {
10
+ if (!item.occurredAt) return void 0;
11
+ const value = Date.parse(item.occurredAt);
12
+ return Number.isFinite(value) ? value : void 0;
13
+ }
14
+ function recent(items, days) {
15
+ const now = Date.now();
16
+ const cutoff = now - days * 864e5;
17
+ return items.filter((item) => {
18
+ const time = eventTime(item);
19
+ return time !== void 0 && time >= cutoff && time <= now + 3e5 && logicalEventKey(item);
20
+ });
21
+ }
22
+ function person(value) {
23
+ if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
24
+ const row = value;
25
+ const read = (field) => typeof row[field] === "string" && row[field].trim() ? row[field].trim().slice(0, 160) : void 0;
26
+ const result = {
27
+ name: read("name"),
28
+ email: read("email"),
29
+ username: read("username")
30
+ };
31
+ return result.name || result.email || result.username ? result : void 0;
32
+ }
33
+ function relationshipObservations(items) {
34
+ const grouped = /* @__PURE__ */ new Map();
35
+ for (const item of recent(items, 90)) {
36
+ if (item.metadata.actorAttributed !== true) continue;
37
+ const owners = new Set(Array.isArray(item.metadata.ownerIdentities) ? item.metadata.ownerIdentities.filter((value) => typeof value === "string").map((value) => value.toLowerCase()) : []);
38
+ const values = item.metadata.personEntities;
39
+ if (!Array.isArray(values)) continue;
40
+ for (const value of values) {
41
+ const signal = person(value);
42
+ if (!signal) continue;
43
+ const strongIdentity = (signal.email ?? signal.username)?.toLowerCase();
44
+ if (strongIdentity && owners.has(strongIdentity)) continue;
45
+ const label = signal.name ?? signal.email ?? signal.username;
46
+ const handles = [
47
+ ...signal.email ? [{
48
+ type: "email",
49
+ value: signal.email,
50
+ sourceScope: "global",
51
+ verified: true
52
+ }] : [],
53
+ ...signal.username ? [{
54
+ type: "provider_user",
55
+ value: signal.username,
56
+ sourceScope: String(item.metadata.toolkit ?? item.sourceInstanceId),
57
+ verified: true
58
+ }] : [],
59
+ ...signal.name ? [{
60
+ type: "display_name",
61
+ value: signal.name,
62
+ sourceScope: item.sourceInstanceId,
63
+ verified: false
64
+ }] : []
65
+ ];
66
+ const identityKey = signal.email?.toLowerCase() ?? `${String(item.metadata.toolkit ?? item.sourceInstanceId)}:${signal.username?.toLowerCase() ?? signal.name?.toLowerCase()}`;
67
+ const entry = grouped.get(identityKey) ?? {
68
+ label,
69
+ handles,
70
+ events: /* @__PURE__ */ new Map()
71
+ };
72
+ const eventKey = logicalEventKey(item);
73
+ if (!entry.events.has(eventKey)) entry.events.set(eventKey, item);
74
+ grouped.set(identityKey, entry);
75
+ }
76
+ }
77
+ return [...grouped.values()].sort((left, right) => right.events.size - left.events.size).slice(0, 8).map((entry) => ({
78
+ class: "relationship",
79
+ key: "person",
80
+ value: { label: entry.label },
81
+ subject: {
82
+ type: "person",
83
+ canonicalLabel: entry.label,
84
+ handles: entry.handles
85
+ },
86
+ items: [...entry.events.values()],
87
+ windowDays: 90
88
+ }));
89
+ }
90
+ function routineObservations(items) {
91
+ const slots = /* @__PURE__ */ new Map();
92
+ for (const item of recent(items, 120).filter((candidate) => candidate.itemType === "calendar_event")) {
93
+ const date = new Date(item.occurredAt);
94
+ const slot = `${date.getUTCDay()}:${date.getUTCHours()}`;
95
+ const events = slots.get(slot) ?? /* @__PURE__ */ new Map();
96
+ const eventKey = logicalEventKey(item);
97
+ if (!events.has(eventKey)) events.set(eventKey, item);
98
+ slots.set(slot, events);
99
+ }
100
+ return [...slots.entries()].sort((left, right) => right[1].size - left[1].size).slice(0, 4).map(([slot, events]) => {
101
+ const [weekday, hour] = slot.split(":").map(Number);
102
+ return {
103
+ class: "routine",
104
+ key: `calendar-slot:${slot}`,
105
+ value: {
106
+ weekday,
107
+ hour,
108
+ timezone: "UTC"
109
+ },
110
+ items: [...events.values()],
111
+ windowDays: 120
112
+ };
113
+ });
114
+ }
115
+ function projectObservations(items) {
116
+ const grouped = /* @__PURE__ */ new Map();
117
+ for (const item of recent(items, 60)) {
118
+ if (item.metadata.observationKind !== "activity" || item.metadata.actorAttributed !== true) continue;
119
+ const subject = typeof item.metadata.subjectKey === "string" ? item.metadata.subjectKey.trim() : "";
120
+ if (!subject) continue;
121
+ const entry = grouped.get(subject.toLowerCase()) ?? {
122
+ label: subject,
123
+ events: /* @__PURE__ */ new Map()
124
+ };
125
+ const events = entry.events;
126
+ const eventKey = logicalEventKey(item);
127
+ if (!events.has(eventKey)) events.set(eventKey, item);
128
+ grouped.set(subject.toLowerCase(), entry);
129
+ }
130
+ return [...grouped.entries()].sort((left, right) => right[1].events.size - left[1].events.size).slice(0, 8).map(([, entry]) => {
131
+ const { label: subject, events } = entry;
132
+ return {
133
+ class: "project",
134
+ key: "project",
135
+ value: { label: subject },
136
+ subject: {
137
+ type: "project",
138
+ canonicalLabel: subject,
139
+ handles: [{
140
+ type: "provider_user",
141
+ value: subject,
142
+ sourceScope: "project",
143
+ verified: true
144
+ }]
145
+ },
146
+ items: [...events.values()],
147
+ windowDays: 60
148
+ };
149
+ });
150
+ }
151
+ function deriveConnectedClaimObservations(items) {
152
+ const active = items.filter((item) => !item.deletedAt && item.synthesisPipeline === "connected_knowledge" && item.sensitivity !== "secret" && item.sensitivity !== "regulated" && item.metadata.observationKind !== "inventory");
153
+ return [
154
+ ...relationshipObservations(active),
155
+ ...routineObservations(active),
156
+ ...projectObservations(active)
157
+ ];
158
+ }
159
+ function renderUserClaim(claim) {
160
+ const label = typeof claim.value.label === "string" ? claim.value.label : "";
161
+ if (claim.class === "relationship") return {
162
+ kind: "relationship",
163
+ content: `Frequently collaborates with ${label}.`,
164
+ canonicalKey: `claim:${claim.id}`,
165
+ confidence: claim.confidence,
166
+ importance: .65,
167
+ explicitness: "inferred",
168
+ durability: "recurring",
169
+ sensitivity: "personal",
170
+ disclosurePolicy: "ask_before_reference",
171
+ tags: ["connected-source", "structured-claim"]
172
+ };
173
+ if (claim.class === "project") return {
174
+ kind: "project_context",
175
+ content: `Recently contributed repeatedly to ${label}.`,
176
+ canonicalKey: `claim:${claim.id}`,
177
+ confidence: claim.confidence,
178
+ importance: .72,
179
+ explicitness: "inferred",
180
+ durability: "recurring",
181
+ sensitivity: "personal",
182
+ disclosurePolicy: "referenceable",
183
+ tags: ["connected-source", "structured-claim"]
184
+ };
185
+ const weekday = Number(claim.value.weekday);
186
+ const hour = Number(claim.value.hour);
187
+ return {
188
+ kind: "routine",
189
+ content: `Often has calendar activity on ${[
190
+ "Sunday",
191
+ "Monday",
192
+ "Tuesday",
193
+ "Wednesday",
194
+ "Thursday",
195
+ "Friday",
196
+ "Saturday"
197
+ ][weekday] ?? "Unknown"} around ${String(hour).padStart(2, "0")}:00 UTC.`,
198
+ canonicalKey: `claim:${claim.id}`,
199
+ confidence: claim.confidence,
200
+ importance: .58,
201
+ explicitness: "inferred",
202
+ durability: "recurring",
203
+ sensitivity: "personal",
204
+ disclosurePolicy: "referenceable",
205
+ tags: ["connected-source", "structured-claim"]
206
+ };
207
+ }
208
+ var ConnectedUnderstandingPipeline = class {
209
+ constructor(memoryManager) {
210
+ this.memoryManager = memoryManager;
211
+ }
212
+ async process(sourceInstanceId, connectorId, agentId) {
213
+ const observations = deriveConnectedClaimObservations(listKnowledgeSourceItems({
214
+ sourceInstanceId,
215
+ includeDeleted: false,
216
+ limit: 500
217
+ }));
218
+ const totals = {
219
+ proposed: observations.length,
220
+ created: 0,
221
+ deduplicated: 0,
222
+ rejected: 0,
223
+ createdRecords: []
224
+ };
225
+ for (const observation of observations) {
226
+ const subject = observation.subject ? resolveUserEntity(observation.subject) : void 0;
227
+ const claim = reinforceUserClaim({
228
+ agentId,
229
+ class: observation.class,
230
+ key: subject ? `${observation.key}:${subject.id}` : observation.key,
231
+ subjectEntityId: subject?.id,
232
+ value: observation.value,
233
+ evidence: observation.items.map((item) => ({
234
+ logicalEventKey: logicalEventKey(item),
235
+ sourceItemId: item.id,
236
+ sourceInstanceId: item.sourceInstanceId,
237
+ relation: "supports",
238
+ observedAt: item.occurredAt
239
+ }))
240
+ });
241
+ if (claim.state !== "active") continue;
242
+ const result = await this.memoryManager.applyUnderstandingCandidates([renderUserClaim(claim)], {
243
+ agentId,
244
+ sourceItemIds: observation.items.map((item) => item.id).slice(0, 20),
245
+ sourceText: JSON.stringify({
246
+ claimId: claim.id,
247
+ independentEvidenceCount: claim.independentEvidenceCount,
248
+ activeDays: claim.activeDayCount,
249
+ windowDays: observation.windowDays
250
+ }),
251
+ source: {
252
+ provider: connectorId,
253
+ sourceInstanceId
254
+ },
255
+ reviewSource: "background"
256
+ });
257
+ const memoryRecordId = result.createdRecords[0]?.id;
258
+ if (memoryRecordId) linkUserClaimMemoryRecord(claim.id, memoryRecordId);
259
+ totals.created += result.created;
260
+ totals.deduplicated += result.deduplicated;
261
+ totals.rejected += result.rejected;
262
+ totals.createdRecords.push(...result.createdRecords);
263
+ }
264
+ return totals;
265
+ }
266
+ };
267
+ //#endregion
268
+ export { ConnectedUnderstandingPipeline, deriveConnectedClaimObservations, renderUserClaim };
@@ -1,6 +1,7 @@
1
1
  export * from './types.js';
2
2
  export * from './ingestion-service.js';
3
3
  export * from './connected-knowledge-pipeline.js';
4
+ export * from './connected-understanding-pipeline.js';
4
5
  export * from './coordinator.js';
5
6
  export * from './local-folder-adapter.js';
6
7
  export * from './people-graph.js';
@@ -1,6 +1,7 @@
1
1
  import { KnowledgeIngestionService, SqliteKnowledgeSourceStateStore } from "./ingestion-service.js";
2
2
  import { ConnectedKnowledgePipeline } from "./connected-knowledge-pipeline.js";
3
+ import { ConnectedUnderstandingPipeline, deriveConnectedClaimObservations, renderUserClaim } from "./connected-understanding-pipeline.js";
3
4
  import { startConnectedKnowledgeCoordinator } from "./coordinator.js";
4
5
  import { LocalFolderKnowledgeSourceAdapter } from "./local-folder-adapter.js";
5
6
  import { buildConnectedPeopleGraph } from "./people-graph.js";
6
- export { ConnectedKnowledgePipeline, KnowledgeIngestionService, LocalFolderKnowledgeSourceAdapter, SqliteKnowledgeSourceStateStore, buildConnectedPeopleGraph, startConnectedKnowledgeCoordinator };
7
+ export { ConnectedKnowledgePipeline, ConnectedUnderstandingPipeline, KnowledgeIngestionService, LocalFolderKnowledgeSourceAdapter, SqliteKnowledgeSourceStateStore, buildConnectedPeopleGraph, deriveConnectedClaimObservations, renderUserClaim, startConnectedKnowledgeCoordinator };
@@ -1,11 +1,11 @@
1
1
  import type { KnowledgeSourceAdapter, KnowledgeSourceItemInput, KnowledgeSyncRun } from './types.js';
2
2
  export interface KnowledgeSourceStateStore {
3
- getCursor(instanceId: string): string | undefined;
4
- setCursor(instanceId: string, cursor: string | undefined): void;
3
+ getCursor(instanceId: string, collectionScope: string): string | undefined;
4
+ setCursor(instanceId: string, collectionScope: string, cursor: string | undefined): void;
5
5
  }
6
6
  export declare class SqliteKnowledgeSourceStateStore implements KnowledgeSourceStateStore {
7
- getCursor(instanceId: string): string | undefined;
8
- setCursor(instanceId: string, cursor: string | undefined): void;
7
+ getCursor(instanceId: string, collectionScope: string): string | undefined;
8
+ setCursor(instanceId: string, collectionScope: string, cursor: string | undefined): void;
9
9
  }
10
10
  export declare class KnowledgeIngestionService {
11
11
  private readonly adapters;
@@ -13,6 +13,7 @@ export declare class KnowledgeIngestionService {
13
13
  constructor(adapters: ReadonlyMap<string, KnowledgeSourceAdapter>, state?: KnowledgeSourceStateStore);
14
14
  ingest(params: {
15
15
  instanceId: string;
16
+ collectionScope: string;
16
17
  items: KnowledgeSourceItemInput[];
17
18
  cursorAfter?: string;
18
19
  warnings?: string[];
@@ -20,6 +21,7 @@ export declare class KnowledgeIngestionService {
20
21
  sync(params: {
21
22
  adapterKind: string;
22
23
  instanceId: string;
24
+ collectionScope: string;
23
25
  windowStart?: string;
24
26
  signal?: AbortSignal;
25
27
  }): Promise<KnowledgeSyncRun>;
@@ -4,7 +4,7 @@ import { finishKnowledgeSyncRun, getKnowledgeSourceCursor, listKnowledgeSourceIt
4
4
  //#region src/knowledge/ingestion-service.ts
5
5
  init_logger();
6
6
  const log = createLogger("KnowledgeIngestion");
7
- function deletionInputs(instanceId, snapshotExternalIds) {
7
+ function deletionInputs(instanceId, collectionScope, snapshotExternalIds) {
8
8
  if (!snapshotExternalIds) return [];
9
9
  const seen = new Set(snapshotExternalIds);
10
10
  const deletedAt = (/* @__PURE__ */ new Date()).toISOString();
@@ -12,6 +12,7 @@ function deletionInputs(instanceId, snapshotExternalIds) {
12
12
  for (let offset = 0;; offset += 500) {
13
13
  const page = listKnowledgeSourceItems({
14
14
  sourceInstanceId: instanceId,
15
+ collectionScope,
15
16
  limit: 500,
16
17
  offset
17
18
  });
@@ -20,6 +21,7 @@ function deletionInputs(instanceId, snapshotExternalIds) {
20
21
  missing.push({
21
22
  id: item.id,
22
23
  sourceInstanceId: item.sourceInstanceId,
24
+ collectionScope: item.collectionScope,
23
25
  externalId: item.externalId,
24
26
  itemType: item.itemType,
25
27
  authorRole: item.authorRole,
@@ -40,11 +42,11 @@ function deletionInputs(instanceId, snapshotExternalIds) {
40
42
  return missing;
41
43
  }
42
44
  var SqliteKnowledgeSourceStateStore = class {
43
- getCursor(instanceId) {
44
- return getKnowledgeSourceCursor(instanceId);
45
+ getCursor(instanceId, collectionScope) {
46
+ return getKnowledgeSourceCursor(instanceId, collectionScope);
45
47
  }
46
- setCursor(instanceId, cursor) {
47
- setKnowledgeSourceCursor(instanceId, cursor);
48
+ setCursor(instanceId, collectionScope, cursor) {
49
+ setKnowledgeSourceCursor(instanceId, collectionScope, cursor);
48
50
  }
49
51
  };
50
52
  var KnowledgeIngestionService = class {
@@ -53,14 +55,14 @@ var KnowledgeIngestionService = class {
53
55
  this.state = state;
54
56
  }
55
57
  ingest(params) {
56
- const cursorBefore = this.state.getCursor(params.instanceId);
58
+ const cursorBefore = this.state.getCursor(params.instanceId, params.collectionScope);
57
59
  const run = startKnowledgeSyncRun({
58
60
  sourceInstanceId: params.instanceId,
59
61
  cursorBefore
60
62
  });
61
63
  try {
62
64
  const stored = upsertKnowledgeSourceItems(params.items);
63
- this.state.setCursor(params.instanceId, params.cursorAfter);
65
+ this.state.setCursor(params.instanceId, params.collectionScope, params.cursorAfter);
64
66
  return finishKnowledgeSyncRun({
65
67
  runId: run.id,
66
68
  status: params.warnings?.length ? "partial" : "succeeded",
@@ -83,7 +85,7 @@ var KnowledgeIngestionService = class {
83
85
  async sync(params) {
84
86
  const adapter = this.adapters.get(params.adapterKind);
85
87
  if (!adapter) throw new Error(`Knowledge source adapter not found: ${params.adapterKind}`);
86
- const cursorBefore = this.state.getCursor(params.instanceId);
88
+ const cursorBefore = this.state.getCursor(params.instanceId, params.collectionScope);
87
89
  const run = startKnowledgeSyncRun({
88
90
  sourceInstanceId: params.instanceId,
89
91
  cursorBefore
@@ -93,13 +95,14 @@ var KnowledgeIngestionService = class {
93
95
  try {
94
96
  const pulled = await adapter.pull({
95
97
  instanceId: params.instanceId,
98
+ collectionScope: params.collectionScope,
96
99
  cursor: cursorBefore,
97
100
  windowStart: params.windowStart,
98
101
  signal
99
102
  });
100
- const tombstones = deletionInputs(params.instanceId, pulled.snapshotExternalIds);
103
+ const tombstones = deletionInputs(params.instanceId, params.collectionScope, pulled.snapshotExternalIds);
101
104
  const stored = upsertKnowledgeSourceItems([...pulled.items, ...tombstones]);
102
- this.state.setCursor(params.instanceId, pulled.nextCursor);
105
+ this.state.setCursor(params.instanceId, params.collectionScope, pulled.nextCursor);
103
106
  const completed = finishKnowledgeSyncRun({
104
107
  runId: run.id,
105
108
  status: pulled.warnings.length > 0 ? "partial" : "succeeded",
@@ -59,6 +59,7 @@ var LocalFolderKnowledgeSourceAdapter = class {
59
59
  const externalId = relative(root, canonicalPath).split(sep).join("/");
60
60
  items.push({
61
61
  sourceInstanceId: input.instanceId,
62
+ collectionScope: "files",
62
63
  externalId,
63
64
  itemType: "local_file",
64
65
  authorRole: "user",
@@ -1,125 +1,58 @@
1
- import { listKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
2
- import { createHash } from "node:crypto";
1
+ import { listUserPeopleGraphRows } from "../storage/sqlite/user-claims-repository.js";
2
+ import "../storage/sqlite/index.js";
3
3
  //#region src/knowledge/people-graph.ts
4
- function nonEmpty(value) {
5
- return typeof value === "string" && value.trim() ? value.trim() : void 0;
6
- }
7
- function signalsFor(item) {
8
- const structured = item.metadata.personEntities;
9
- if (Array.isArray(structured)) {
10
- const signals = structured.flatMap((value) => {
11
- if (!value || typeof value !== "object" || Array.isArray(value)) return [];
12
- const record = value;
13
- const signal = {
14
- role: nonEmpty(record.role),
15
- name: nonEmpty(record.name),
16
- email: nonEmpty(record.email),
17
- username: nonEmpty(record.username)
18
- };
19
- return signal.name || signal.email || signal.username ? [signal] : [];
20
- });
21
- if (signals.length > 0) return signals;
22
- }
23
- return Array.isArray(item.metadata.people) ? item.metadata.people.flatMap((value) => {
24
- const text = nonEmpty(value);
25
- if (!text) return [];
26
- return text.includes("@") ? [{ email: text }] : [{ name: text }];
27
- }) : [];
28
- }
29
- function identityFor(signal) {
30
- if (signal.email) return `email:${signal.email.toLowerCase()}`;
31
- if (signal.username) return `username:${signal.username.toLowerCase().replace(/^@/, "")}`;
32
- if (signal.name) return `name:${signal.name.toLocaleLowerCase()}`;
33
- }
34
- function personId(identity) {
35
- return `person_${createHash("sha256").update(identity).digest("hex").slice(0, 24)}`;
36
- }
37
- function latest(left, right) {
38
- return Date.parse(left) >= Date.parse(right) ? left : right;
4
+ function sourceMetadata(sourceInstanceId) {
5
+ const parts = sourceInstanceId.split(":");
6
+ if (parts[0] !== "composio" || !parts[1]) return {};
7
+ return {
8
+ connectorId: parts[1],
9
+ toolkit: parts[1].replace(/^composio-/, "")
10
+ };
39
11
  }
40
12
  function buildConnectedPeopleGraph(options = {}) {
41
- const maxItems = 5e3;
42
- const items = [];
43
- for (let offset = 0; offset < maxItems; offset += 500) {
44
- const page = listKnowledgeSourceItems({
45
- limit: 500,
46
- offset
47
- });
48
- items.push(...page);
49
- if (page.length < 500) break;
50
- }
51
- const nodeByIdentity = /* @__PURE__ */ new Map();
52
- const edgeByKey = /* @__PURE__ */ new Map();
53
- for (const item of items) {
54
- const observedAt = item.occurredAt ?? item.sourceUpdatedAt ?? item.updatedAt;
55
- const observedIdentities = /* @__PURE__ */ new Set();
56
- for (const signal of signalsFor(item)) {
57
- const identity = identityFor(signal);
58
- if (!identity) continue;
59
- let aggregate = nodeByIdentity.get(identity);
60
- if (!aggregate) {
61
- aggregate = {
62
- node: {
63
- id: personId(identity),
64
- label: signal.name ?? signal.email ?? signal.username ?? identity,
65
- names: [],
66
- emails: [],
67
- usernames: [],
68
- roles: [],
69
- mentionCount: 0,
70
- lastObservedAt: observedAt
71
- },
72
- names: /* @__PURE__ */ new Set(),
73
- emails: /* @__PURE__ */ new Set(),
74
- usernames: /* @__PURE__ */ new Set(),
75
- roles: /* @__PURE__ */ new Set()
76
- };
77
- nodeByIdentity.set(identity, aggregate);
78
- }
79
- if (signal.name) aggregate.names.add(signal.name);
80
- if (signal.email) aggregate.emails.add(signal.email.toLowerCase());
81
- if (signal.username) aggregate.usernames.add(signal.username.replace(/^@/, ""));
82
- if (signal.role) aggregate.roles.add(signal.role);
83
- if (observedIdentities.has(identity)) continue;
84
- observedIdentities.add(identity);
85
- aggregate.node.mentionCount += 1;
86
- aggregate.node.lastObservedAt = latest(aggregate.node.lastObservedAt, observedAt);
87
- const edgeKey = `${aggregate.node.id}\u0000${item.sourceInstanceId}`;
88
- const existingEdge = edgeByKey.get(edgeKey);
89
- if (existingEdge) {
90
- existingEdge.mentionCount += 1;
91
- existingEdge.lastObservedAt = latest(existingEdge.lastObservedAt, observedAt);
92
- } else edgeByKey.set(edgeKey, {
93
- personId: aggregate.node.id,
94
- sourceInstanceId: item.sourceInstanceId,
95
- connectorId: nonEmpty(item.metadata.connectorId),
96
- toolkit: nonEmpty(item.metadata.toolkit),
97
- mentionCount: 1,
98
- lastObservedAt: observedAt
99
- });
100
- }
13
+ const graph = listUserPeopleGraphRows();
14
+ const edgesByPerson = /* @__PURE__ */ new Map();
15
+ for (const edge of graph.edges) {
16
+ const values = edgesByPerson.get(edge.entityId) ?? [];
17
+ values.push(edge);
18
+ edgesByPerson.set(edge.entityId, values);
101
19
  }
102
- const query = options.query?.trim().toLocaleLowerCase() ?? "";
20
+ const query = options.query?.trim().toLowerCase() ?? "";
103
21
  const limit = Math.max(1, Math.min(options.limit ?? 100, 500));
104
- const matchingPeople = [...nodeByIdentity.values()].map((aggregate) => ({
105
- ...aggregate.node,
106
- names: [...aggregate.names].toSorted(),
107
- emails: [...aggregate.emails].toSorted(),
108
- usernames: [...aggregate.usernames].toSorted(),
109
- roles: [...aggregate.roles].toSorted()
110
- })).filter((person) => !query || [
22
+ const matching = graph.people.map((entity) => {
23
+ const edges = edgesByPerson.get(entity.id) ?? [];
24
+ const names = [...entity.canonicalLabel.includes("@") ? [] : [entity.canonicalLabel], ...entity.handles.filter((handle) => handle.type === "display_name").map((handle) => handle.value)].filter((value, index, values) => values.findIndex((candidate) => candidate.toLowerCase() === value.toLowerCase()) === index).toSorted();
25
+ const emails = entity.handles.filter((handle) => handle.type === "email").map((handle) => handle.value).toSorted();
26
+ const usernames = entity.handles.filter((handle) => handle.type === "provider_user").map((handle) => handle.value).toSorted();
27
+ return {
28
+ id: entity.id,
29
+ label: entity.canonicalLabel,
30
+ names,
31
+ emails,
32
+ usernames,
33
+ roles: [],
34
+ mentionCount: edges.reduce((sum, edge) => sum + edge.mentionCount, 0),
35
+ lastObservedAt: edges.reduce((latest, edge) => !latest || edge.lastObservedAt > latest ? edge.lastObservedAt : latest, "") || entity.updatedAt
36
+ };
37
+ }).filter((person) => !query || [
111
38
  person.label,
112
39
  ...person.names,
113
40
  ...person.emails,
114
41
  ...person.usernames
115
- ].some((value) => value.toLocaleLowerCase().includes(query))).toSorted((left, right) => right.mentionCount - left.mentionCount || right.lastObservedAt.localeCompare(left.lastObservedAt));
116
- const people = matchingPeople.slice(0, limit);
42
+ ].some((value) => value.toLowerCase().includes(query))).toSorted((left, right) => right.mentionCount - left.mentionCount || right.lastObservedAt.localeCompare(left.lastObservedAt));
43
+ const people = matching.slice(0, limit);
117
44
  const included = new Set(people.map((person) => person.id));
118
45
  return {
119
46
  people,
120
- sourceEdges: [...edgeByKey.values()].filter((edge) => included.has(edge.personId)),
121
- scannedItems: items.length,
122
- truncated: items.length >= maxItems || matchingPeople.length > limit
47
+ sourceEdges: graph.edges.filter((edge) => included.has(edge.entityId)).map((edge) => ({
48
+ personId: edge.entityId,
49
+ sourceInstanceId: edge.sourceInstanceId,
50
+ ...sourceMetadata(edge.sourceInstanceId),
51
+ mentionCount: edge.mentionCount,
52
+ lastObservedAt: edge.lastObservedAt
53
+ })),
54
+ scannedItems: graph.evidenceCount,
55
+ truncated: matching.length > limit
123
56
  };
124
57
  }
125
58
  //#endregion
@@ -8,6 +8,7 @@ export type KnowledgeChangeKind = 'added' | 'modified' | 'deleted';
8
8
  export interface KnowledgeSourceItem {
9
9
  id: string;
10
10
  sourceInstanceId: string;
11
+ collectionScope: string;
11
12
  externalId: string;
12
13
  itemType: string;
13
14
  authorRole?: KnowledgeAuthorRole;
@@ -42,6 +43,7 @@ export interface KnowledgeSourceChange {
42
43
  export interface KnowledgeSourceItemInput {
43
44
  id?: string;
44
45
  sourceInstanceId: string;
46
+ collectionScope: string;
45
47
  externalId: string;
46
48
  itemType: string;
47
49
  authorRole?: KnowledgeAuthorRole;
@@ -73,6 +75,7 @@ export interface KnowledgeSyncRun {
73
75
  }
74
76
  export interface KnowledgePullInput {
75
77
  instanceId: string;
78
+ collectionScope: string;
76
79
  cursor?: string;
77
80
  windowStart?: string;
78
81
  signal: AbortSignal;
@@ -2,9 +2,9 @@ import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { init_loader, loadConfig } from "../config/loader.js";
4
4
  import { gatewayCredentialAuthorization } from "../gateway/credential.js";
5
- import { loadUndiciRuntimeDeps } from "../infra/undici-fetch.js";
6
5
  import { toConversation } from "./channel-shared.js";
7
6
  import { createGatewayHttpClientFromConfig, resolveGatewayHttpBaseUrl } from "./gateway-http-client.js";
7
+ import { loadUndiciRuntimeDeps } from "../infra/undici-fetch.js";
8
8
  //#region src/mcp/channel-bridge.ts
9
9
  init_loader();
10
10
  init_logger();
@@ -0,0 +1,40 @@
1
+ import { z } from 'zod';
2
+ import { type CredentialResolver } from '../auth/credentials.js';
3
+ declare const accountSummarySchema: z.ZodObject<{
4
+ balance: z.ZodObject<{
5
+ credits: z.ZodNumber;
6
+ updatedAt: z.ZodString;
7
+ }, z.core.$strip>;
8
+ usage: z.ZodObject<{
9
+ days: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<7>, z.ZodLiteral<30>]>;
10
+ requests: z.ZodNumber;
11
+ inputTokens: z.ZodNumber;
12
+ outputTokens: z.ZodNumber;
13
+ totalTokens: z.ZodNumber;
14
+ errors: z.ZodNumber;
15
+ averageLatencyMs: z.ZodNumber;
16
+ chargedCredits: z.ZodNumber;
17
+ }, z.core.$strip>;
18
+ links: z.ZodObject<{
19
+ details: z.ZodString;
20
+ purchase: z.ZodString;
21
+ }, z.core.$strip>;
22
+ }, z.core.$strip>;
23
+ export type XopcCloudAccountSummary = z.infer<typeof accountSummarySchema>;
24
+ export declare class XopcCloudAccountError extends Error {
25
+ readonly status: number;
26
+ readonly code?: string;
27
+ constructor(message: string, status: number, code?: string);
28
+ }
29
+ export declare class XopcCloudAccountService {
30
+ private readonly fetchImpl;
31
+ private readonly routerUrl;
32
+ private readonly credentials;
33
+ constructor(options?: {
34
+ fetchImpl?: typeof fetch;
35
+ routerUrl?: string;
36
+ credentials?: Pick<CredentialResolver, 'resolveApiKey'>;
37
+ });
38
+ getSummary(days?: 1 | 7 | 30): Promise<XopcCloudAccountSummary | null>;
39
+ }
40
+ export {};