@xopcai/xopc 0.0.170 → 0.0.172

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 (242) 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-CkUp1qvf.js → activity-store-C3Y-bESI.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DDuem4HM.js → agent-avatar-dicebear-CPyev9P7.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents-Bf_kK2Ay.js +2 -0
  6. package/dist/gateway/static/root/assets/{api-BnuPQhJW.js → api-B7qEr_Rw.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-DdZw8Hi1.js → app-management-settings-panel-Br_9-7fs.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-BN8Vk2bX.js → appearance-settings-uyLcRPai.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-DXFCP5-1.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-C82MaDQj.js → archive-plugin-B19REnR5.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-uilrwSdW.js → attachment-load-DLWCC4Yi.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automation-suggestion-card-CkDZjAmy.js → automation-suggestion-card-ky5S5lly.js} +1 -1
  13. package/dist/gateway/static/root/assets/automations-page-D8pT1o2O.js +6 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-B7NTL0_T.js → binary-plugins-CtPEzLlo.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-D_LDNlB-.js → block-editor-CQVR4Xij.js} +32 -32
  16. package/dist/gateway/static/root/assets/browser-settings-page-Bav_skKN.js +8 -0
  17. package/dist/gateway/static/root/assets/{browser-workflow-inputs-UFVUzn4v.js → browser-workflow-inputs-CimCGbhq.js} +1 -1
  18. package/dist/gateway/static/root/assets/{browser-workflows-page-CGgC0N92.js → browser-workflows-page-DewuCw3p.js} +2 -2
  19. package/dist/gateway/static/root/assets/capabilities-settings-panel-BHaYYo9E.js +7 -0
  20. package/dist/gateway/static/root/assets/{capability-presets-api-DUIorGUd.js → capability-presets-api-B5RTs-Az.js} +1 -1
  21. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-PTz00nR4.js → capability-presets-settings-panel-BgchTh81.js} +1 -1
  22. package/dist/gateway/static/root/assets/{channel-recipient-api-BYwSB8c6.js → channel-recipient-api-Czu0YzIZ.js} +1 -1
  23. package/dist/gateway/static/root/assets/channels-settings-BP0e62wt.js +1 -0
  24. package/dist/gateway/static/root/assets/channels-status-swr-DBWKfeGe.js +1 -0
  25. package/dist/gateway/static/root/assets/connector-logo-Di3gnR_D.js +1 -0
  26. package/dist/gateway/static/root/assets/connectors-page-CC5kh0de.js +2 -0
  27. package/dist/gateway/static/root/assets/{desktop-pet-CkT98fPT.js → desktop-pet-D-ZUNHhn.js} +1 -1
  28. package/dist/gateway/static/root/assets/{desktop-pet-settings-DkbIzdA3.js → desktop-pet-settings-C3L6AI8_.js} +1 -1
  29. package/dist/gateway/static/root/assets/{directory-picker-path-field-dBQvj1sG.js → directory-picker-path-field-Dvq4iG6P.js} +1 -1
  30. package/dist/gateway/static/root/assets/dreaming-settings-D9i54kWO.js +3 -0
  31. package/dist/gateway/static/root/assets/{extension-debug-page-BfxoIiNo.js → extension-debug-page-BecQjU0J.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-page-EIJ3wIb7.js → extension-page-BeVkPSm-.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-settings-page-DBBec51N.js → extension-settings-page-DMoo2mKx.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-config-api-4_u53Ufq.js → gateway-config-api-Bthb3_6v.js} +1 -1
  35. package/dist/gateway/static/root/assets/{gateway-settings-v9kJM59H.js → gateway-settings-Bh8nPvJQ.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-startup-retry-CXITih5d.js → gateway-startup-retry-D3USVm9D.js} +1 -1
  37. package/dist/gateway/static/root/assets/goal-create-dialog-Dp0AyDHI.js +1 -0
  38. package/dist/gateway/static/root/assets/goal-detail-page-CNt7nrdS.js +4 -0
  39. package/dist/gateway/static/root/assets/{goals-config-api-D54YQPon.js → goals-config-api-C_2QWBtb.js} +1 -1
  40. package/dist/gateway/static/root/assets/goals-page-Bm_NZFiZ.js +2 -0
  41. package/dist/gateway/static/root/assets/{goals-settings-DDezXaVi.js → goals-settings-DhL643tc.js} +1 -1
  42. package/dist/gateway/static/root/assets/{heartbeat-settings-CRsIUeZN.js → heartbeat-settings-COVFwp7C.js} +1 -1
  43. package/dist/gateway/static/root/assets/{image-generation-api-CY6cQUHL.js → image-generation-api-BNQlnwpU.js} +1 -1
  44. package/dist/gateway/static/root/assets/index-C_XSKOH6.css +1 -0
  45. package/dist/gateway/static/root/assets/{index-Dfq2laZe.js → index-DUasAutC.js} +67 -67
  46. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-D9k7EDdY.js → keyboard-shortcuts-settings-DfdJRJVy.js} +1 -1
  47. package/dist/gateway/static/root/assets/local-app-workbench-page-DZwkD1co.js +2 -0
  48. package/dist/gateway/static/root/assets/{local-apps-page-DbaiBolh.js → local-apps-page-BvCPOgoi.js} +1 -1
  49. package/dist/gateway/static/root/assets/{locale-store-Dqp9H2Uf.js → locale-store-BP0vD37A.js} +1 -1
  50. package/dist/gateway/static/root/assets/{logs-page-DoCY0Mm9.js → logs-page-dNL0Y1dA.js} +3 -3
  51. package/dist/gateway/static/root/assets/{markdown-split-BGlQR-Be.js → markdown-split-YO1rDk9m.js} +1 -1
  52. package/dist/gateway/static/root/assets/{media-plugins-BpaeV6f_.js → media-plugins-CU_RRf-q.js} +1 -1
  53. package/dist/gateway/static/root/assets/messages-BWtP5TFz.js +3 -0
  54. package/dist/gateway/static/root/assets/{notes-page-Cd2HpciM.js → notes-page-CeFiOK3S.js} +1 -1
  55. package/dist/gateway/static/root/assets/notes-workbench-B8MKxpZb.js +4 -0
  56. package/dist/gateway/static/root/assets/{page-tabs-DyimBUp_.js → page-tabs-tiHmRJUA.js} +1 -1
  57. package/dist/gateway/static/root/assets/{preview-open-alternatives-BKZulEYr.js → preview-open-alternatives-CU6XgaCz.js} +1 -1
  58. package/dist/gateway/static/root/assets/{product-open-page-Bjz9BxBY.js → product-open-page-Dn4_qor4.js} +1 -1
  59. package/dist/gateway/static/root/assets/project-detail-page-CWBuuX-S.js +1 -0
  60. package/dist/gateway/static/root/assets/projects-page-BJSsLsXH.js +1 -0
  61. package/dist/gateway/static/root/assets/remote-access-hub-DXJDb8vB.js +1 -0
  62. package/dist/gateway/static/root/assets/{save-bar-controls-BPTqb2_r.js → save-bar-controls-edDUIbXo.js} +1 -1
  63. package/dist/gateway/static/root/assets/{schedule-field-YN0D81Dk.js → schedule-field-DqJO_5Yb.js} +1 -1
  64. package/dist/gateway/static/root/assets/{schema-form-BmY5PSS2.js → schema-form-CMh0jzy5.js} +1 -1
  65. package/dist/gateway/static/root/assets/sessions-page-DeHpWgxM.js +1 -0
  66. package/dist/gateway/static/root/assets/settings-advanced-gate-Cf-TEYUd.js +1 -0
  67. package/dist/gateway/static/root/assets/{settings-form-section-B-RhgD_p.js → settings-form-section-Bb0Bc3nJ.js} +1 -1
  68. package/dist/gateway/static/root/assets/{settings-loading-skeleton-DkPupX2B.js → settings-loading-skeleton-DQhADvz1.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-page-2QBMvaxj.js → settings-page-b0M5HukN.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-page-layout-CtrW-LD6.js → settings-page-layout-hvjtIjvh.js} +1 -1
  71. package/dist/gateway/static/root/assets/setup-status-panel-BFyfed_g.js +1 -0
  72. package/dist/gateway/static/root/assets/{share-preview-page-BezIW1n9.js → share-preview-page-rbeaOpTg.js} +1 -1
  73. package/dist/gateway/static/root/assets/shares-settings-CYnH9sTt.js +1 -0
  74. package/dist/gateway/static/root/assets/skill-reload-api-Cr8_m-jS.js +1 -0
  75. package/dist/gateway/static/root/assets/skills-page-Chtc1xDO.js +2 -0
  76. package/dist/gateway/static/root/assets/{system-settings-panel-WAFhKyAu.js → system-settings-panel-BHo_hgnL.js} +1 -1
  77. package/dist/gateway/static/root/assets/{theme-store-BiC0gIBa.js → theme-store-C3KnnjcU.js} +1 -1
  78. package/dist/gateway/static/root/assets/time-picker-D-G-uwVJ.js +1 -0
  79. package/dist/gateway/static/root/assets/{typed-models-lib-WAQO3F_8.js → typed-models-lib-DtRnG-YI.js} +1 -1
  80. package/dist/gateway/static/root/assets/{use-channel-catalog-CKlfsSeU.js → use-channel-catalog-CWWItX2g.js} +1 -1
  81. package/dist/gateway/static/root/assets/user-context-page-D7qMR26X.js +1 -0
  82. package/dist/gateway/static/root/assets/{voice-api-key-field-BAFHF0_v.js → voice-api-key-field-BTnltQHZ.js} +1 -1
  83. package/dist/gateway/static/root/assets/work-discovery-page-CpqFZze9.js +1 -0
  84. package/dist/gateway/static/root/assets/work-item-detail-page-t4dXpGC0.js +1 -0
  85. package/dist/gateway/static/root/assets/work-page-BXwDKiMZ.js +1 -0
  86. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-1OP4HyvS.js → workflow-run-setup-panel-D7vKChFZ.js} +2 -2
  87. package/dist/gateway/static/root/assets/workflows-page-Bos9HyqT.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/embedded/run-for-session.js +71 -24
  91. package/dist/src/agent/embedded/run-turn.js +68 -4
  92. package/dist/src/agent/inbound/inbound-loop.d.ts +0 -2
  93. package/dist/src/agent/inbound/inbound-loop.js +0 -2
  94. package/dist/src/agent/memory/builtin-provider.js +4 -4
  95. package/dist/src/agent/memory/compaction-planner.d.ts +16 -0
  96. package/dist/src/agent/memory/compaction-planner.js +152 -0
  97. package/dist/src/agent/memory/compaction-policy.d.ts +10 -0
  98. package/dist/src/agent/memory/compaction-policy.js +24 -0
  99. package/dist/src/agent/memory/compaction.d.ts +21 -22
  100. package/dist/src/agent/memory/compaction.js +220 -194
  101. package/dist/src/agent/memory/context-budget.d.ts +40 -0
  102. package/dist/src/agent/memory/context-budget.js +106 -0
  103. package/dist/src/agent/memory/manager.d.ts +4 -1
  104. package/dist/src/agent/memory/manager.js +8 -3
  105. package/dist/src/agent/memory/understanding/service.d.ts +2 -0
  106. package/dist/src/agent/memory/understanding/service.js +11 -9
  107. package/dist/src/agent/orchestration/context-overflow.d.ts +1 -0
  108. package/dist/src/agent/orchestration/context-overflow.js +19 -0
  109. package/dist/src/agent/orchestration/loop-guard.js +13 -9
  110. package/dist/src/agent/reply/post-compaction-context.d.ts +4 -0
  111. package/dist/src/agent/reply/post-compaction-context.js +5 -3
  112. package/dist/src/agent/service/process-direct-one-shot.js +1 -2
  113. package/dist/src/agent/service/process-direct-streaming.js +1 -2
  114. package/dist/src/agent/service.d.ts +1 -2
  115. package/dist/src/agent/service.js +16 -44
  116. package/dist/src/agent/session/session-inspector.js +10 -2
  117. package/dist/src/automations/domain/validation.d.ts +8 -8
  118. package/dist/src/automations/draft/automation-draft-validator.d.ts +1 -1
  119. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  120. package/dist/src/config/schema.d.ts +17 -1
  121. package/dist/src/connectors/composio-sessions.d.ts +1 -0
  122. package/dist/src/connectors/composio-sessions.js +14 -5
  123. package/dist/src/connectors/composio-triggers.d.ts +1 -1
  124. package/dist/src/connectors/composio-triggers.js +4 -3
  125. package/dist/src/connectors/composio.js +1 -0
  126. package/dist/src/connectors/{connector-memory-sync.d.ts → connected-source-ingestion.d.ts} +11 -4
  127. package/dist/src/connectors/{connector-memory-sync.js → connected-source-ingestion.js} +49 -101
  128. package/dist/src/connectors/connected-source-normalizers.d.ts +15 -0
  129. package/dist/src/connectors/connected-source-normalizers.js +186 -0
  130. package/dist/src/connectors/connector-identity.d.ts +2 -0
  131. package/dist/src/connectors/connector-identity.js +29 -0
  132. package/dist/src/connectors/learning-coordinator.d.ts +25 -0
  133. package/dist/src/connectors/learning-coordinator.js +214 -0
  134. package/dist/src/connectors/learning-recipes.d.ts +22 -0
  135. package/dist/src/connectors/learning-recipes.js +121 -0
  136. package/dist/src/connectors/runtime-status.d.ts +1 -8
  137. package/dist/src/connectors/runtime-status.js +4 -29
  138. package/dist/src/gateway/hono/lib/config-payload.d.ts +23 -0
  139. package/dist/src/gateway/hono/lib/config-payload.js +3 -0
  140. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +1 -1
  141. package/dist/src/gateway/hono/routes/config-patch/misc.js +28 -0
  142. package/dist/src/gateway/hono/routes/connectors.js +76 -118
  143. package/dist/src/gateway/hono/routes/models.js +24 -0
  144. package/dist/src/gateway/hono/routes/public-gateway.js +3 -2
  145. package/dist/src/gateway/hono/routes/sessions.js +17 -42
  146. package/dist/src/gateway/hono/routes/you.js +86 -5
  147. package/dist/src/gateway/service/sessions-api.d.ts +2 -3
  148. package/dist/src/gateway/service/sessions-api.js +4 -7
  149. package/dist/src/gateway/service.d.ts +5 -2
  150. package/dist/src/gateway/service.js +16 -11
  151. package/dist/src/knowledge/connected-understanding-pipeline.d.ts +19 -0
  152. package/dist/src/knowledge/connected-understanding-pipeline.js +268 -0
  153. package/dist/src/knowledge/index.d.ts +1 -0
  154. package/dist/src/knowledge/index.js +2 -1
  155. package/dist/src/knowledge/ingestion-service.d.ts +6 -4
  156. package/dist/src/knowledge/ingestion-service.js +13 -10
  157. package/dist/src/knowledge/local-folder-adapter.js +1 -0
  158. package/dist/src/knowledge/people-graph.js +43 -110
  159. package/dist/src/knowledge/types.d.ts +3 -0
  160. package/dist/src/providers/xopc-cloud-account-service.d.ts +40 -0
  161. package/dist/src/providers/xopc-cloud-account-service.js +65 -0
  162. package/dist/src/session/index.d.ts +1 -2
  163. package/dist/src/session/index.js +1 -2
  164. package/dist/src/session/init-session-turn.d.ts +0 -1
  165. package/dist/src/session/init-session-turn.js +1 -2
  166. package/dist/src/session/manager.d.ts +11 -17
  167. package/dist/src/session/manager.js +11 -14
  168. package/dist/src/session/session-context-for-llm.d.ts +19 -1
  169. package/dist/src/session/session-context-for-llm.js +87 -129
  170. package/dist/src/session/store.d.ts +28 -23
  171. package/dist/src/session/store.js +94 -83
  172. package/dist/src/session/transcript-format.d.ts +2 -8
  173. package/dist/src/session/types.d.ts +8 -6
  174. package/dist/src/session/user-round-delete.d.ts +3 -6
  175. package/dist/src/session/user-round-delete.js +12 -16
  176. package/dist/src/storage/sqlite/connector-learning-repository.d.ts +47 -0
  177. package/dist/src/storage/sqlite/connector-learning-repository.js +110 -0
  178. package/dist/src/storage/sqlite/index.d.ts +4 -2
  179. package/dist/src/storage/sqlite/index.js +5 -3
  180. package/dist/src/storage/sqlite/knowledge-repository.d.ts +4 -2
  181. package/dist/src/storage/sqlite/knowledge-repository.js +24 -13
  182. package/dist/src/storage/sqlite/migrations/060_remove_runtime_transcript_messages.sql +45 -0
  183. package/dist/src/storage/sqlite/migrations/061_drop_compaction_checkpoints.sql +2 -0
  184. package/dist/src/storage/sqlite/migrations/062_connector_learning_jobs.sql +27 -0
  185. package/dist/src/storage/sqlite/migrations/063_knowledge_collection_scopes.sql +14 -0
  186. package/dist/src/storage/sqlite/migrations/064_user_claims.sql +60 -0
  187. package/dist/src/storage/sqlite/migrations/065_knowledge_item_scope_identity.sql +116 -0
  188. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  189. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  190. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  191. package/dist/src/storage/sqlite/schema.js +1 -1
  192. package/dist/src/storage/sqlite/schema.sql +0 -19
  193. package/dist/src/storage/sqlite/transcript-repository.d.ts +6 -11
  194. package/dist/src/storage/sqlite/transcript-repository.js +90 -84
  195. package/dist/src/storage/sqlite/user-claims-repository.d.ts +101 -0
  196. package/dist/src/storage/sqlite/user-claims-repository.js +241 -0
  197. package/dist/src/user-context/config.d.ts +67 -2
  198. package/dist/src/user-context/config.js +36 -3
  199. package/dist/src/user-context/projection.d.ts +36 -1
  200. package/dist/src/user-context/projection.js +84 -6
  201. package/dist/src/work-discovery/service.js +1 -0
  202. package/package.json +1 -1
  203. package/dist/gateway/static/root/assets/agents-BiaQhiQp.js +0 -2
  204. package/dist/gateway/static/root/assets/apps-page-CuL8Q4yF.js +0 -1
  205. package/dist/gateway/static/root/assets/automations-page-TZOluRNp.js +0 -6
  206. package/dist/gateway/static/root/assets/browser-settings-page-C-l6O68Z.js +0 -8
  207. package/dist/gateway/static/root/assets/capabilities-settings-panel-BW8c0xPp.js +0 -7
  208. package/dist/gateway/static/root/assets/channels-settings-h9CsE0GT.js +0 -1
  209. package/dist/gateway/static/root/assets/channels-status-swr-C058Mcfr.js +0 -1
  210. package/dist/gateway/static/root/assets/connector-logo-CsbegNqi.js +0 -1
  211. package/dist/gateway/static/root/assets/connectors-page-BWALafGW.js +0 -2
  212. package/dist/gateway/static/root/assets/dreaming-settings-DkdnKMZx.js +0 -3
  213. package/dist/gateway/static/root/assets/goal-create-dialog-y2Y3p7_k.js +0 -1
  214. package/dist/gateway/static/root/assets/goal-detail-page-DuzL-alv.js +0 -4
  215. package/dist/gateway/static/root/assets/goals-page-OeLtfKI2.js +0 -2
  216. package/dist/gateway/static/root/assets/index-o4uaOGKT.css +0 -1
  217. package/dist/gateway/static/root/assets/local-app-workbench-page-3ssYIEK6.js +0 -2
  218. package/dist/gateway/static/root/assets/messages-KEk-hTFt.js +0 -3
  219. package/dist/gateway/static/root/assets/notes-workbench-CatZNAPc.js +0 -4
  220. package/dist/gateway/static/root/assets/project-detail-page-DJUOgqm4.js +0 -1
  221. package/dist/gateway/static/root/assets/projects-page-BQQAD_nu.js +0 -1
  222. package/dist/gateway/static/root/assets/remote-access-hub-fIGXTTnA.js +0 -1
  223. package/dist/gateway/static/root/assets/sessions-page-BuU-8FCe.js +0 -1
  224. package/dist/gateway/static/root/assets/settings-advanced-gate-DlKoeZm3.js +0 -1
  225. package/dist/gateway/static/root/assets/setup-status-panel-BSUcDFnb.js +0 -1
  226. package/dist/gateway/static/root/assets/shares-settings-Bk2-SwGJ.js +0 -1
  227. package/dist/gateway/static/root/assets/skill-reload-api-e_Fx1kVC.js +0 -1
  228. package/dist/gateway/static/root/assets/skills-page-D_cCADfj.js +0 -2
  229. package/dist/gateway/static/root/assets/time-picker-fqRXpNJV.js +0 -1
  230. package/dist/gateway/static/root/assets/user-context-page-9Ov4htPW.js +0 -1
  231. package/dist/gateway/static/root/assets/work-discovery-page-DGN2FxWv.js +0 -1
  232. package/dist/gateway/static/root/assets/work-item-detail-page-HmyWSgUo.js +0 -1
  233. package/dist/gateway/static/root/assets/work-page-D3iKVjFq.js +0 -1
  234. package/dist/gateway/static/root/assets/workflows-page-B5L4SFw4.js +0 -11
  235. package/dist/src/agent/lifecycle/handlers/compaction.d.ts +0 -13
  236. package/dist/src/agent/lifecycle/handlers/compaction.js +0 -18
  237. package/dist/src/connectors/memory-sync-coordinator.d.ts +0 -28
  238. package/dist/src/connectors/memory-sync-coordinator.js +0 -162
  239. package/dist/src/connectors/memory-sync-profile.d.ts +0 -13
  240. package/dist/src/connectors/memory-sync-profile.js +0 -73
  241. package/dist/src/session/compaction-checkpoints.d.ts +0 -8
  242. package/dist/src/session/compaction-checkpoints.js +0 -19
@@ -44,7 +44,7 @@ import { getWorkspacePath } from "../config/workspace-path-helpers.js";
44
44
  import "../config/index.js";
45
45
  import { startConnectedKnowledgeCoordinator } from "../knowledge/coordinator.js";
46
46
  import "../knowledge/index.js";
47
- import { startConnectorMemorySyncCoordinator } from "../connectors/memory-sync-coordinator.js";
47
+ import { startConnectorLearningCoordinator } from "../connectors/learning-coordinator.js";
48
48
  import { startConnectorSupervisor } from "../connectors/supervisor.js";
49
49
  import { assertGatewayAuthConfigured, extractToken, resolveGatewayAuth, validateToken } from "./auth.js";
50
50
  import { reconcileDreamingAutomations } from "./dreaming-automation-reconciler.js";
@@ -159,7 +159,7 @@ var GatewayService = class {
159
159
  goalNotifications = null;
160
160
  mobileNotifications = null;
161
161
  connectorSupervisor = null;
162
- connectorMemorySyncCoordinator = null;
162
+ connectorLearningCoordinator = null;
163
163
  connectedKnowledgeCoordinator = null;
164
164
  stopAutomationProductEventBridge = null;
165
165
  stopSessionTranscriptAutomationEvents = null;
@@ -713,9 +713,11 @@ var GatewayService = class {
713
713
  getConfig: () => this.config,
714
714
  saveConfig: (cfg) => this.saveConfig(cfg)
715
715
  });
716
- this.connectorMemorySyncCoordinator = startConnectorMemorySyncCoordinator({
716
+ this.connectorLearningCoordinator = startConnectorLearningCoordinator({
717
717
  getConfig: () => this.config,
718
- resolveAgentId: () => resolveDefaultAgentId(this.config)
718
+ resolveAgentId: () => resolveDefaultAgentId(this.config),
719
+ getMemoryManager: () => this.agentService.getMemoryManager(),
720
+ emit: (type, payload) => this.emit(type, payload)
719
721
  });
720
722
  this.connectedKnowledgeCoordinator = startConnectedKnowledgeCoordinator({ resolvePipelineOptions: () => ({
721
723
  agentId: resolveDefaultAgentId(this.config),
@@ -841,8 +843,8 @@ var GatewayService = class {
841
843
  this.heartbeatService?.stop();
842
844
  this.connectorSupervisor?.stop();
843
845
  this.connectorSupervisor = null;
844
- this.connectorMemorySyncCoordinator?.stop();
845
- this.connectorMemorySyncCoordinator = null;
846
+ this.connectorLearningCoordinator?.stop();
847
+ this.connectorLearningCoordinator = null;
846
848
  this.connectedKnowledgeCoordinator?.stop();
847
849
  this.connectedKnowledgeCoordinator = null;
848
850
  await this.browserRecipeService?.shutdown();
@@ -1085,11 +1087,14 @@ var GatewayService = class {
1085
1087
  requestHeartbeatNow(opts) {
1086
1088
  this.heartbeatService?.requestNow({ reason: opts?.reason ?? "manual" });
1087
1089
  }
1088
- requestConnectorMemorySync(toolkit) {
1089
- this.connectorMemorySyncCoordinator?.runNow({
1090
- toolkit,
1091
- force: true
1092
- });
1090
+ requestConnectorLearning(connectionId, request) {
1091
+ return this.connectorLearningCoordinator?.enqueueConnection(connectionId, request) ?? null;
1092
+ }
1093
+ requestConnectorLearningForToolkit(toolkit) {
1094
+ return this.connectorLearningCoordinator?.enqueueToolkit(toolkit) ?? [];
1095
+ }
1096
+ setConnectorLearningPaused(connectionId, paused) {
1097
+ return this.connectorLearningCoordinator?.setPaused(connectionId, paused) ?? 0;
1093
1098
  }
1094
1099
  /**
1095
1100
  * Register graceful shutdown used after spawning a replacement gateway process (foreground CLI server).
@@ -0,0 +1,19 @@
1
+ import type { UnderstandingCandidate, UnderstandingReviewResult } from '../agent/memory/understanding/types.js';
2
+ import type { MemoryManager } from '../agent/memory/manager.js';
3
+ import { resolveUserEntity, type UserClaim, type UserClaimClass } from '../storage/sqlite/index.js';
4
+ import type { KnowledgeSourceItem } from './types.js';
5
+ export type ClaimObservation = {
6
+ class: UserClaimClass;
7
+ key: string;
8
+ value: Record<string, unknown>;
9
+ subject?: Parameters<typeof resolveUserEntity>[0];
10
+ items: KnowledgeSourceItem[];
11
+ windowDays: number;
12
+ };
13
+ export declare function deriveConnectedClaimObservations(items: KnowledgeSourceItem[]): ClaimObservation[];
14
+ export declare function renderUserClaim(claim: UserClaim): UnderstandingCandidate;
15
+ export declare class ConnectedUnderstandingPipeline {
16
+ private readonly memoryManager;
17
+ constructor(memoryManager: MemoryManager);
18
+ process(sourceInstanceId: string, connectorId: string, agentId: string): Promise<UnderstandingReviewResult>;
19
+ }
@@ -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