@xopcai/xopc 0.0.374 → 0.0.376

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 (304) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  3. package/dist/extensions/telegram/xopc.extension.json +1 -1
  4. package/dist/gateway/static/root/assets/{activity-store-BeYLqqr8.js → activity-store-CvR3rjdp.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BrA20N2m.js → agent-avatar-dicebear-B6OsxiBw.js} +1 -1
  6. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-MB_QmjX-.js +1 -0
  7. package/dist/gateway/static/root/assets/agent-plugin-dialog-Bpcf0zhP.js +1 -0
  8. package/dist/gateway/static/root/assets/agents-BQ7ag_R3.js +66 -0
  9. package/dist/gateway/static/root/assets/{agents-admin-api-B4tgTbWG.js → agents-admin-api-DsXvJeqd.js} +1 -1
  10. package/dist/gateway/static/root/assets/{app-management-settings-panel-BXahEVPm.js → app-management-settings-panel-9JzhRHSD.js} +1 -1
  11. package/dist/gateway/static/root/assets/{appearance-settings-CE2qJMkD.js → appearance-settings-CoyZuGAt.js} +1 -1
  12. package/dist/gateway/static/root/assets/{apps-page-DGVOnCxZ.js → apps-page-CcbCxZaw.js} +1 -1
  13. package/dist/gateway/static/root/assets/{archive-plugin-bI9OLnXj.js → archive-plugin-kfDRSd7K.js} +1 -1
  14. package/dist/gateway/static/root/assets/{automations-page-BWL7eT4_.js → automations-page-DZJKbmlm.js} +1 -1
  15. package/dist/gateway/static/root/assets/automations-workspace-ChKT1JN6.js +6 -0
  16. package/dist/gateway/static/root/assets/{binary-plugins-dOwLzjeH.js → binary-plugins-d4QP_iyy.js} +1 -1
  17. package/dist/gateway/static/root/assets/{block-editor-3n446-mX.js → block-editor-DraiSml9.js} +2 -2
  18. package/dist/gateway/static/root/assets/{browser-automation-inputs-i7h1Svpf.js → browser-automation-inputs-BAiaU9gl.js} +1 -1
  19. package/dist/gateway/static/root/assets/browser-automations-page-Bo40qRor.js +3 -0
  20. package/dist/gateway/static/root/assets/browser-settings-page-Dg4S7ph5.js +3 -0
  21. package/dist/gateway/static/root/assets/{capabilities-D4KFLtqM.js → capabilities-B-vsqiw2.js} +1 -1
  22. package/dist/gateway/static/root/assets/{capabilities-CquUV0DP.js → capabilities-DQEeiNq_.js} +1 -1
  23. package/dist/gateway/static/root/assets/capabilities-page-CuHSjBDG.js +2 -0
  24. package/dist/gateway/static/root/assets/capabilities-settings-panel-bxxADxzW.js +8 -0
  25. package/dist/gateway/static/root/assets/{capability-header-actions-BRMqvQVb.js → capability-header-actions-CaH0L2sV.js} +1 -1
  26. package/dist/gateway/static/root/assets/channels-Drx78hEY.js +1 -0
  27. package/dist/gateway/static/root/assets/{chat-terminal-dock-BRdzCjWO.js → chat-terminal-dock-hZnKhClF.js} +2 -2
  28. package/dist/gateway/static/root/assets/{computer-settings-page-BhCHMRpD.js → computer-settings-page-CYEA9B-G.js} +1 -1
  29. package/dist/gateway/static/root/assets/{connector-service-page-BXE8Z-Ll.js → connector-service-page-DXi2Bx2u.js} +1 -1
  30. package/dist/gateway/static/root/assets/connectors-page-BCWPY5hs.js +1 -0
  31. package/dist/gateway/static/root/assets/{date-picker-BJ7N92wm.js → date-picker-BW_xBw2L.js} +1 -1
  32. package/dist/gateway/static/root/assets/{dependency-picker-gyxCM-hb.js → dependency-picker-ByRPupfC.js} +1 -1
  33. package/dist/gateway/static/root/assets/{desktop-pet-B-WM4l-L.js → desktop-pet-DTcVMPlC.js} +1 -1
  34. package/dist/gateway/static/root/assets/{desktop-pet-settings-usJqcew5.js → desktop-pet-settings-BkMP5pdR.js} +1 -1
  35. package/dist/gateway/static/root/assets/{device-pairing-wizard-DoSR4DGk.js → device-pairing-wizard-5kYuK9oW.js} +1 -1
  36. package/dist/gateway/static/root/assets/{directory-picker-path-field-DqVlV2YH.js → directory-picker-path-field-DIYIejyX.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-debug-page-CbgEonkK.js → extension-debug-page-QCUvXcP2.js} +1 -1
  38. package/dist/gateway/static/root/assets/{extension-page-CUule9SU.js → extension-page-BMeQveJ_.js} +1 -1
  39. package/dist/gateway/static/root/assets/{extension-provider-DxlAZ2iy.js → extension-provider-CDOEBj7F.js} +1 -1
  40. package/dist/gateway/static/root/assets/{extension-settings-page-_OFukkEJ.js → extension-settings-page-D-M7P4HQ.js} +1 -1
  41. package/dist/gateway/static/root/assets/{fallback-models-CiSc3h8i.js → fallback-models-5DaUVrLS.js} +1 -1
  42. package/dist/gateway/static/root/assets/{gateway-config-swr-BoRkBnsw.js → gateway-config-swr-CWIVt5XM.js} +1 -1
  43. package/dist/gateway/static/root/assets/{gateway-realtime-C3WQQY10.js → gateway-realtime-DC8N3fNU.js} +1 -1
  44. package/dist/gateway/static/root/assets/gateway-realtime-store-BkE2mHog.js +1 -0
  45. package/dist/gateway/static/root/assets/gateway-settings-DK2NzPkL.js +1 -0
  46. package/dist/gateway/static/root/assets/{gateway-startup-retry-TYSQEQcG.js → gateway-startup-retry-pVqdX0dO.js} +1 -1
  47. package/dist/gateway/static/root/assets/home-page-A3oTV3Vq.js +2 -0
  48. package/dist/gateway/static/root/assets/{image-generation-api-_pKiNfSq.js → image-generation-api-CX6__We2.js} +1 -1
  49. package/dist/gateway/static/root/assets/{imports-page-DdvIj-ZL.js → imports-page-b0ILSTz1.js} +1 -1
  50. package/dist/gateway/static/root/assets/index-Cz75qf5b.js +106 -0
  51. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DbqFlNsF.js → keyboard-shortcuts-settings-DGl7wSHG.js} +1 -1
  52. package/dist/gateway/static/root/assets/{local-app-workbench-page-REowUzkp.js → local-app-workbench-page--W2QjBqz.js} +1 -1
  53. package/dist/gateway/static/root/assets/{local-apps-page-DdCMNn_z.js → local-apps-page-8SQ85WLr.js} +1 -1
  54. package/dist/gateway/static/root/assets/{local-session-drafts-Cg9RdsNN.js → local-session-drafts-LCEmswHW.js} +1 -1
  55. package/dist/gateway/static/root/assets/{locale-store-rWFLl-p4.js → locale-store-UEl-U1DO.js} +1 -1
  56. package/dist/gateway/static/root/assets/logs-page-BAQeHGd4.js +2 -0
  57. package/dist/gateway/static/root/assets/{management-settings-D4vcSRE3.js → management-settings-DoXDsSSN.js} +1 -1
  58. package/dist/gateway/static/root/assets/{markdown-view-BHFFusQs.js → markdown-view-DUo9Tl3H.js} +1 -1
  59. package/dist/gateway/static/root/assets/{media-plugins-BVPTMWJI.js → media-plugins-8zr2wlMR.js} +1 -1
  60. package/dist/gateway/static/root/assets/{messages-C1SUo4gG.js → messages-Uqz0xpsK.js} +2 -2
  61. package/dist/gateway/static/root/assets/models-hub-cache-3HOFy11k.js +1 -0
  62. package/dist/gateway/static/root/assets/note-detail-panel-Cg65uYJ3.js +5 -0
  63. package/dist/gateway/static/root/assets/{notes-api-CSLVCZBn.js → notes-api-bDQOslzF.js} +1 -1
  64. package/dist/gateway/static/root/assets/notes-page-DDUlWJOk.js +8 -0
  65. package/dist/gateway/static/root/assets/number-input-DDeqHK-G.js +1 -0
  66. package/dist/gateway/static/root/assets/{page-context-capture-button-D7Y4vFRN.js → page-context-capture-button-o-i2_7Jz.js} +1 -1
  67. package/dist/gateway/static/root/assets/personal-page-E9-LBR1_.js +1 -0
  68. package/dist/gateway/static/root/assets/{product-open-page-CK_czbBx.js → product-open-page-DWgjStlK.js} +1 -1
  69. package/dist/gateway/static/root/assets/{product-preview-content-CU6KlaVP.js → product-preview-content-BWQRI242.js} +1 -1
  70. package/dist/gateway/static/root/assets/{project-detail-page-c3ye2bdq.js → project-detail-page-FjGobz6n.js} +1 -1
  71. package/dist/gateway/static/root/assets/{projects-page-BA1UuuRF.js → projects-page-CVhXJp7f.js} +1 -1
  72. package/dist/gateway/static/root/assets/{registry-api-CoMBYjHD.js → registry-api-CftkuRz7.js} +1 -1
  73. package/dist/gateway/static/root/assets/remote-access-hub-B2AcKWlb.js +1 -0
  74. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Cxjmwdyf.js → runtime-tools-settings-panel-DmOfq9ay.js} +1 -1
  75. package/dist/gateway/static/root/assets/{scenes-page-Av47PHdM.js → scenes-page-QQ2CiTee.js} +2 -2
  76. package/dist/gateway/static/root/assets/schema-form-TbUx_9NF.js +1 -0
  77. package/dist/gateway/static/root/assets/{send-session-input-CLhR1uEp.js → send-session-input-D4c72mD6.js} +1 -1
  78. package/dist/gateway/static/root/assets/{session-api-u_4_kFQt.js → session-api-DtpzfFNw.js} +1 -1
  79. package/dist/gateway/static/root/assets/session-manager-De46GeR0.js +16 -0
  80. package/dist/gateway/static/root/assets/sessions-page-CquSXQHo.js +1 -0
  81. package/dist/gateway/static/root/assets/settings-advanced-gate-BOHKIN4t.js +1 -0
  82. package/dist/gateway/static/root/assets/{settings-page-BeVtwwVd.js → settings-page-NncRVc1e.js} +1 -1
  83. package/dist/gateway/static/root/assets/setup-status-panel-t1vcGUsK.js +1 -0
  84. package/dist/gateway/static/root/assets/{share-link-dialog-XhiuPKF4.js → share-link-dialog-DGUiTTZ3.js} +1 -1
  85. package/dist/gateway/static/root/assets/{share-preview-page-Vc0TQuZ8.js → share-preview-page-BDl6XGKm.js} +1 -1
  86. package/dist/gateway/static/root/assets/{shares-api-BVSb1vh4.js → shares-api-BIx5ji2U.js} +1 -1
  87. package/dist/gateway/static/root/assets/shares-settings-DVM6xJuW.js +1 -0
  88. package/dist/gateway/static/root/assets/{skill-api-Dgwc707w.js → skill-api-Crld1PEV.js} +1 -1
  89. package/dist/gateway/static/root/assets/{skill-reload-api-BsLx_FXd.js → skill-reload-api-D2HAboLP.js} +1 -1
  90. package/dist/gateway/static/root/assets/skills-page-DdD6C_Z8.js +2 -0
  91. package/dist/gateway/static/root/assets/{system-settings-panel-Ck6zGDHb.js → system-settings-panel-DUro5X0b.js} +1 -1
  92. package/dist/gateway/static/root/assets/{task-detail-page-C3ZPEZqw.js → task-detail-page-BYNcWubZ.js} +2 -2
  93. package/dist/gateway/static/root/assets/{task-expandable-content-DxeBTJvh.js → task-expandable-content-BKa2YEJy.js} +1 -1
  94. package/dist/gateway/static/root/assets/{theme-store-KcQhCg1-.js → theme-store-ByAapAD7.js} +1 -1
  95. package/dist/gateway/static/root/assets/tracing-settings-page-Dv-XBvpD.js +1 -0
  96. package/dist/gateway/static/root/assets/{tunnel-api-CjxMpAm2.js → tunnel-api-C2_SEpMa.js} +1 -1
  97. package/dist/gateway/static/root/assets/{usage-page-Dnhp9xQ4.js → usage-page-CqMzyGiK.js} +1 -1
  98. package/dist/gateway/static/root/assets/{use-autosave-C-IWxbzm.js → use-autosave-BhsYFV0o.js} +1 -1
  99. package/dist/gateway/static/root/assets/{use-composer-attachments-Dxphaxk-.js → use-composer-attachments-Bv4umde0.js} +1 -1
  100. package/dist/gateway/static/root/assets/{use-file-preview-expanded-Du37Gofn.js → use-file-preview-expanded-CBVymo3h.js} +2 -2
  101. package/dist/gateway/static/root/assets/user-model-page-EMn_nA9w.js +2 -0
  102. package/dist/gateway/static/root/assets/{voice-api-key-field-7BImy8Jc.js → voice-api-key-field-DRoGFFs6.js} +1 -1
  103. package/dist/gateway/static/root/assets/{voice-config-api-6MINytQl.js → voice-config-api-BwLiaw5J.js} +1 -1
  104. package/dist/gateway/static/root/assets/{work-discovery-overlay-CVd_y3K2.js → work-discovery-overlay-DbH62mtI.js} +1 -1
  105. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-Dwg40uGK.js → workflow-run-setup-panel-BYfytB9q.js} +2 -2
  106. package/dist/gateway/static/root/assets/workflows-page-rJqJ9dQo.js +6 -0
  107. package/dist/gateway/static/root/assets/{workspace-api-CXiyhTwv.js → workspace-api-BHy2a_hm.js} +2 -2
  108. package/dist/gateway/static/root/assets/{xopc-cloud-account-card-CaKc_J7j.js → xopc-cloud-account-card-DrAX_9m_.js} +1 -1
  109. package/dist/gateway/static/root/index.html +26 -26
  110. package/dist/package.js +1 -1
  111. package/dist/src/agent/agent-manager.d.ts +2 -7
  112. package/dist/src/agent/agent-manager.js +23 -52
  113. package/dist/src/agent/background-review/coordinator.js +1 -1
  114. package/dist/src/agent/background-review/prompts.d.ts +6 -0
  115. package/dist/src/agent/background-review/prompts.js +7 -1
  116. package/dist/src/agent/background-review/run-background-review.d.ts +3 -0
  117. package/dist/src/agent/background-review/run-background-review.js +183 -15
  118. package/dist/src/agent/context/coordinator.d.ts +1 -0
  119. package/dist/src/agent/context/coordinator.js +11 -2
  120. package/dist/src/agent/context/execution-context.js +40 -4
  121. package/dist/src/agent/context/project-context.js +11 -3
  122. package/dist/src/agent/embedded/model-runtime.js +1 -1
  123. package/dist/src/agent/embedded/run-for-session.js +2 -2
  124. package/dist/src/agent/embedded/run-turn.js +5 -5
  125. package/dist/src/agent/image/tool-model-config.js +1 -1
  126. package/dist/src/agent/inbound/attachment-pipeline.js +1 -1
  127. package/dist/src/agent/mcp/connection-setup.d.ts +21 -0
  128. package/dist/src/agent/mcp/connection-setup.js +214 -0
  129. package/dist/src/agent/mcp/tool-catalog.d.ts +18 -0
  130. package/dist/src/agent/mcp/tool-catalog.js +120 -0
  131. package/dist/src/agent/memory/compaction-promotion.d.ts +2 -0
  132. package/dist/src/agent/memory/compaction-promotion.js +33 -2
  133. package/dist/src/agent/service.js +5 -5
  134. package/dist/src/agent/tasks/task-judge-service.js +3 -3
  135. package/dist/src/agent/tools/factory.js +1 -1
  136. package/dist/src/agent/tools/knowledge-memory-tool.js +14 -6
  137. package/dist/src/auth/credentials.js +2 -2
  138. package/dist/src/auth/model-credential-store.js +1 -1
  139. package/dist/src/auth/sync-provider-auth.js +2 -2
  140. package/dist/src/automations/draft/automation-draft-service.js +1 -1
  141. package/dist/src/chat-commands/agent-edit.js +1 -1
  142. package/dist/src/chat-commands/builtins/config.js +1 -1
  143. package/dist/src/chat-commands/context.js +1 -1
  144. package/dist/src/cli/commands/agent.js +2 -2
  145. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  146. package/dist/src/cli/commands/doctor/checks/image-providers.js +1 -1
  147. package/dist/src/cli/commands/doctor/checks/provider-auth.js +2 -2
  148. package/dist/src/cli/commands/models.js +1 -1
  149. package/dist/src/cli/commands/onboard/model.js +3 -3
  150. package/dist/src/cli/commands/onboard.js +1 -1
  151. package/dist/src/cli/extension-cli-register.js +1 -1
  152. package/dist/src/config/agent-model-intents.js +1 -1
  153. package/dist/src/config/index.js +4 -4
  154. package/dist/src/config/loader.js +1 -1
  155. package/dist/src/config/models-json.js +2 -2
  156. package/dist/src/config/schema.d.ts +5 -0
  157. package/dist/src/config/schema.js +5 -5
  158. package/dist/src/connectors/connected-source-ingestion.js +45 -7
  159. package/dist/src/connectors/connected-source-understanding.d.ts +1 -0
  160. package/dist/src/connectors/connected-source-understanding.js +59 -67
  161. package/dist/src/connectors/content-enrichment.js +1 -1
  162. package/dist/src/connectors/health.js +35 -2
  163. package/dist/src/connectors/learning-coordinator.js +2 -2
  164. package/dist/src/extensions/activation-context.js +1 -1
  165. package/dist/src/gateway/file-path-classifier.js +1 -1
  166. package/dist/src/gateway/hono/lib/config-payload.d.ts +5 -0
  167. package/dist/src/gateway/hono/lib/config-payload.js +2 -2
  168. package/dist/src/gateway/hono/routes/config-patch/misc.js +5 -5
  169. package/dist/src/gateway/hono/routes/connectors.js +4 -4
  170. package/dist/src/gateway/hono/routes/context-sources.js +2 -2
  171. package/dist/src/gateway/hono/routes/lazy-bundles.js +2 -1
  172. package/dist/src/gateway/hono/routes/mcp.js +90 -1
  173. package/dist/src/gateway/hono/routes/memory-learning.d.ts +3 -0
  174. package/dist/src/gateway/hono/routes/memory-learning.js +76 -0
  175. package/dist/src/gateway/hono/routes/models.js +2 -2
  176. package/dist/src/gateway/hono/routes/observability.js +1 -1
  177. package/dist/src/gateway/hono/routes/projects.js +1 -1
  178. package/dist/src/gateway/hono/routes/user-model-refresh.js +1 -1
  179. package/dist/src/gateway/hono/routes/user-model.js +5 -3
  180. package/dist/src/gateway/hono/routes/voice.js +1 -1
  181. package/dist/src/gateway/image-generation-setup.js +1 -1
  182. package/dist/src/gateway/service/config-coordinator.js +1 -1
  183. package/dist/src/gateway/service.js +18 -8
  184. package/dist/src/home-intelligence/generator.js +1 -1
  185. package/dist/src/imports/inventory.js +1 -1
  186. package/dist/src/infra/update-restart.d.ts +5 -0
  187. package/dist/src/infra/update-restart.js +38 -31
  188. package/dist/src/infra/update-runner.d.ts +1 -0
  189. package/dist/src/infra/update-runner.js +47 -18
  190. package/dist/src/knowledge/chunks.d.ts +10 -0
  191. package/dist/src/knowledge/chunks.js +28 -0
  192. package/dist/src/knowledge/connected-knowledge-pipeline.js +67 -33
  193. package/dist/src/knowledge/index.js +1 -1
  194. package/dist/src/knowledge/ingestion-service.js +5 -1
  195. package/dist/src/knowledge/local-folder-adapter.d.ts +2 -1
  196. package/dist/src/knowledge/local-folder-adapter.js +22 -13
  197. package/dist/src/knowledge-memory/domain.d.ts +4 -0
  198. package/dist/src/knowledge-memory/index.d.ts +1 -0
  199. package/dist/src/knowledge-memory/index.js +2 -1
  200. package/dist/src/knowledge-memory/repair-evidence.d.ts +2 -0
  201. package/dist/src/knowledge-memory/repair-evidence.js +57 -0
  202. package/dist/src/knowledge-memory/repository.d.ts +8 -0
  203. package/dist/src/knowledge-memory/repository.js +48 -27
  204. package/dist/src/knowledge-memory/search-text.d.ts +3 -0
  205. package/dist/src/knowledge-memory/search-text.js +32 -0
  206. package/dist/src/knowledge-memory/usage-policy.d.ts +6 -0
  207. package/dist/src/knowledge-memory/usage-policy.js +61 -0
  208. package/dist/src/memory-learning/repository.d.ts +24 -0
  209. package/dist/src/memory-learning/repository.js +96 -0
  210. package/dist/src/memory-learning/service.d.ts +17 -0
  211. package/dist/src/memory-learning/service.js +105 -0
  212. package/dist/src/memory-learning/source-learning.d.ts +7 -0
  213. package/dist/src/memory-learning/source-learning.js +235 -0
  214. package/dist/src/memory-learning/task-receipts.d.ts +3 -0
  215. package/dist/src/memory-learning/task-receipts.js +95 -0
  216. package/dist/src/memory-learning/work-capture.d.ts +51 -0
  217. package/dist/src/memory-learning/work-capture.js +140 -0
  218. package/dist/src/memory-maintenance/service.js +5 -5
  219. package/dist/src/notes/service.js +1 -1
  220. package/dist/src/observability/runtime.js +1 -1
  221. package/dist/src/personal-agent/proactivity/service.js +3 -3
  222. package/dist/src/personal-agent/prompt-context.js +2 -2
  223. package/dist/src/personal-agent/reply-composer.d.ts +1 -1
  224. package/dist/src/personal-agent/reply-composer.js +10 -3
  225. package/dist/src/platform/index.js +1 -1
  226. package/dist/src/providers/index.js +4 -4
  227. package/dist/src/providers/local-model.d.ts +2 -0
  228. package/dist/src/providers/local-model.js +16 -0
  229. package/dist/src/providers/model-registry.js +2 -2
  230. package/dist/src/providers/provider-auth-service.js +1 -1
  231. package/dist/src/providers/provider-disconnect-core.js +1 -1
  232. package/dist/src/providers/register-runtime-providers.js +1 -1
  233. package/dist/src/providers/xopc-cloud-catalog-coordinator.js +1 -1
  234. package/dist/src/scenes/taskFollowUp/service.js +1 -1
  235. package/dist/src/session/session-title.js +1 -1
  236. package/dist/src/session/store.js +2 -1
  237. package/dist/src/storage/sqlite/knowledge-repository.js +6 -0
  238. package/dist/src/storage/sqlite/migrations/245_memory_learning.sql +125 -0
  239. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  240. package/dist/src/storage/sqlite/migrations/runner.js +6 -3
  241. package/dist/src/storage/sqlite/schema.js +1 -1
  242. package/dist/src/tasks/task-main-update-decision-service.js +1 -1
  243. package/dist/src/tui/backends/embedded-backend.js +3 -3
  244. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  245. package/dist/src/tui/tui-commands.js +1 -1
  246. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  247. package/dist/src/tui/tui-startup-resources.js +2 -2
  248. package/dist/src/tui/tui.js +1 -1
  249. package/dist/src/user-context/access-policy.js +2 -1
  250. package/dist/src/user-context/config.d.ts +10 -0
  251. package/dist/src/user-context/config.js +5 -0
  252. package/dist/src/user-context/extraction/registry.d.ts +1 -1
  253. package/dist/src/user-context/extraction/registry.js +10 -0
  254. package/dist/src/user-context/identity-bindings.d.ts +10 -0
  255. package/dist/src/user-context/identity-bindings.js +24 -0
  256. package/dist/src/user-context/sources/consent-fields.d.ts +2 -0
  257. package/dist/src/user-context/sources/consent-fields.js +66 -0
  258. package/dist/src/user-model/bootstrap.js +1 -1
  259. package/dist/src/user-model/capture/executor.js +1 -1
  260. package/dist/src/user-model/capture/semantic.d.ts +3 -1
  261. package/dist/src/user-model/capture/semantic.js +14 -6
  262. package/dist/src/user-model/index.js +1 -1
  263. package/dist/src/user-model/usage-policy.js +34 -0
  264. package/dist/src/voice/platform-streams.js +2 -1
  265. package/dist/src/voice/realtime/agentEngine.js +21 -5
  266. package/dist/src/voice/realtime/engine.d.ts +4 -0
  267. package/dist/src/voice/realtime/memory-context.js +19 -5
  268. package/dist/src/voice/realtime/runtime.d.ts +5 -0
  269. package/dist/src/voice/realtime/runtime.js +4 -0
  270. package/dist/src/work-discovery/incremental-repository.js +1 -1
  271. package/dist/src/work-discovery/service.js +6 -6
  272. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  273. package/dist/src/workflows/service/workflow-session-bridge.js +38 -10
  274. package/package.json +3 -3
  275. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BZrOdxou.js +0 -1
  276. package/dist/gateway/static/root/assets/agent-plugin-dialog-B3ux1AhY.js +0 -1
  277. package/dist/gateway/static/root/assets/agents-CXlXFU6M.js +0 -66
  278. package/dist/gateway/static/root/assets/automations-workspace-BxIShhkZ.js +0 -6
  279. package/dist/gateway/static/root/assets/browser-automations-page-BmTK7Gtn.js +0 -3
  280. package/dist/gateway/static/root/assets/browser-settings-page-DBQ-WETQ.js +0 -3
  281. package/dist/gateway/static/root/assets/capabilities-page-D-nQ6Zzi.js +0 -2
  282. package/dist/gateway/static/root/assets/capabilities-settings-panel-Dx1fpBmH.js +0 -8
  283. package/dist/gateway/static/root/assets/channels-DXfEP1FR.js +0 -1
  284. package/dist/gateway/static/root/assets/connectors-page-D9RZjhw8.js +0 -1
  285. package/dist/gateway/static/root/assets/gateway-realtime-store-cLCDEe4D.js +0 -1
  286. package/dist/gateway/static/root/assets/gateway-settings-qSUrpS1h.js +0 -1
  287. package/dist/gateway/static/root/assets/home-page-COjDsuzg.js +0 -2
  288. package/dist/gateway/static/root/assets/index-DEaVabvo.js +0 -106
  289. package/dist/gateway/static/root/assets/logs-page-B_6fHDoi.js +0 -2
  290. package/dist/gateway/static/root/assets/models-hub-cache-Jj8dvYcv.js +0 -1
  291. package/dist/gateway/static/root/assets/note-detail-panel-B7U6EbAi.js +0 -5
  292. package/dist/gateway/static/root/assets/notes-page-BzHVaH8j.js +0 -8
  293. package/dist/gateway/static/root/assets/personal-page-E6huhFk4.js +0 -1
  294. package/dist/gateway/static/root/assets/remote-access-hub-D_FLVZAm.js +0 -1
  295. package/dist/gateway/static/root/assets/schema-form-IM7QeSm3.js +0 -1
  296. package/dist/gateway/static/root/assets/session-manager-B06ZCie_.js +0 -16
  297. package/dist/gateway/static/root/assets/sessions-page-Bol3ScEc.js +0 -1
  298. package/dist/gateway/static/root/assets/settings-advanced-gate-DpCanqrD.js +0 -1
  299. package/dist/gateway/static/root/assets/setup-status-panel-zTmrMwMm.js +0 -1
  300. package/dist/gateway/static/root/assets/shares-settings-Bkhkt_6M.js +0 -1
  301. package/dist/gateway/static/root/assets/skills-page-CFIte-vM.js +0 -2
  302. package/dist/gateway/static/root/assets/tracing-settings-page-DJRAP3nb.js +0 -1
  303. package/dist/gateway/static/root/assets/user-model-page-sx1lNWKf.js +0 -2
  304. package/dist/gateway/static/root/assets/workflows-page-BQR4JdXB.js +0 -6
@@ -4,14 +4,15 @@ import { finishContextExtractionRun } from "../storage/sqlite/context-extraction
4
4
  import { createContextEvidence, init_context_evidence_repository } from "../storage/sqlite/context-evidence-repository.js";
5
5
  import { getKnowledgeSourceItem } from "../storage/sqlite/knowledge-repository.js";
6
6
  import { init_sqlite } from "../storage/sqlite/index.js";
7
+ import { getActiveUnderstandingConsent } from "../user-context/sources/consent-repository.js";
8
+ import { getUnderstandingSourceRun } from "../user-context/sources/repository.js";
7
9
  import { writeKnowledgeItem } from "../knowledge-memory/repository.js";
8
10
  import "../knowledge-memory/index.js";
11
+ import { consentFilteredText } from "../user-context/sources/consent-fields.js";
12
+ import { claimRegisteredExtraction } from "../user-context/extraction/registry.js";
9
13
  import { reconcileAssertion } from "../user-model/repository.js";
10
14
  import "../user-model/index.js";
11
- import { claimRegisteredExtraction } from "../user-context/extraction/registry.js";
12
15
  import { recordConnectedSourceObservations } from "./connected-source-observations.js";
13
- import { getActiveUnderstandingConsent } from "../user-context/sources/consent-repository.js";
14
- import { getUnderstandingSourceRun } from "../user-context/sources/repository.js";
15
16
  import { allowsRemoteSourceProcessing } from "../user-context/sources/processing-policy.js";
16
17
  import { analyzeUnderstandingSources } from "../work-discovery/analyzer.js";
17
18
  import { createHash } from "node:crypto";
@@ -48,68 +49,6 @@ function timestamp(value) {
48
49
  const parsed = Date.parse(value);
49
50
  return Number.isFinite(parsed) ? parsed : void 0;
50
51
  }
51
- const CONSENT_FIELD_KEYS = {
52
- title: new Set([
53
- "title",
54
- "subject",
55
- "name",
56
- "fullName",
57
- "repository"
58
- ]),
59
- content: new Set([
60
- "content",
61
- "body",
62
- "text",
63
- "snippet",
64
- "description",
65
- "summary"
66
- ]),
67
- participants: new Set([
68
- "from",
69
- "to",
70
- "cc",
71
- "bcc",
72
- "sender",
73
- "author",
74
- "organizer",
75
- "attendees",
76
- "participants",
77
- "assignee",
78
- "owners"
79
- ]),
80
- status: new Set([
81
- "status",
82
- "state",
83
- "labels"
84
- ]),
85
- timestamps: new Set([
86
- "createdAt",
87
- "updatedAt",
88
- "modifiedAt",
89
- "start",
90
- "end",
91
- "created_at",
92
- "updated_at",
93
- "modified_at"
94
- ]),
95
- owner_activity: new Set([
96
- "user",
97
- "username",
98
- "owner"
99
- ])
100
- };
101
- function consentFilteredText(textValue, allowedFields) {
102
- if (!textValue) return void 0;
103
- try {
104
- const parsed = JSON.parse(textValue);
105
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return void 0;
106
- const allowedKeys = new Set([...allowedFields].flatMap((field) => [...CONSENT_FIELD_KEYS[field] ?? []]));
107
- const filtered = Object.fromEntries(Object.entries(parsed).filter(([key]) => allowedKeys.has(key)));
108
- return Object.keys(filtered).length ? JSON.stringify(filtered) : void 0;
109
- } catch {
110
- return allowedFields.has("content") ? textValue.slice(0, 24e3) : void 0;
111
- }
112
- }
113
52
  function itemsAllowedByConsent(items, consent) {
114
53
  if (!consent) return [];
115
54
  const allowed = new Set(consent.allowedFields);
@@ -180,7 +119,27 @@ function candidatePolicy(candidate) {
180
119
  };
181
120
  }
182
121
  async function deriveConnectedSourceUnderstanding(input) {
183
- const sourceItems = [...new Set(input.sourceItemIds)].slice(0, MAX_CONNECTED_ITEMS).flatMap((itemId) => getKnowledgeSourceItem(itemId) ?? []).filter((item) => item.sourceInstanceId === input.sourceInstanceId && item.metadata.agentId === input.agentId && !item.deletedAt);
122
+ const uniqueIds = [...new Set(input.sourceItemIds)];
123
+ if (uniqueIds.length > MAX_CONNECTED_ITEMS) {
124
+ let created = 0, knowledgeCount = 0;
125
+ let status = "completed";
126
+ for (let offset = 0; offset < uniqueIds.length; offset += MAX_CONNECTED_ITEMS) {
127
+ const batch = await deriveConnectedSourceUnderstanding({
128
+ ...input,
129
+ sourceItemIds: uniqueIds.slice(offset, offset + MAX_CONNECTED_ITEMS),
130
+ batchOrdinal: offset / MAX_CONNECTED_ITEMS
131
+ });
132
+ created += batch.created;
133
+ knowledgeCount += batch.knowledgeCount;
134
+ if (batch.status !== "completed") status = "partial";
135
+ }
136
+ return {
137
+ created,
138
+ knowledgeCount,
139
+ status
140
+ };
141
+ }
142
+ const sourceItems = uniqueIds.flatMap((itemId) => getKnowledgeSourceItem(itemId) ?? []).filter((item) => item.sourceInstanceId === input.sourceInstanceId && item.metadata.agentId === input.agentId && !item.deletedAt);
184
143
  const items = connectedItemsForUnderstanding(sourceItems);
185
144
  if (!items.length) {
186
145
  log.info({
@@ -206,7 +165,7 @@ async function deriveConnectedSourceUnderstanding(input) {
206
165
  const effectiveProcessingPolicy = input.processingPolicy === "remote_allowed" && consentReceipt?.processingPolicy === "remote_allowed" ? "remote_allowed" : "local_only";
207
166
  const extraction = claimRegisteredExtraction({
208
167
  extractorId: "connector-semantic",
209
- sourceRef: `understanding-source-run:${input.sourceRunId}`,
168
+ sourceRef: `understanding-source-run:${input.sourceRunId}${input.batchOrdinal === void 0 ? "" : `:batch:${input.batchOrdinal}`}`,
210
169
  contentForHash: sourceItems.map((item) => `${item.id}:${item.contentHash}`).join("\n"),
211
170
  processingPolicy: effectiveProcessingPolicy,
212
171
  destination: "remote_model"
@@ -239,9 +198,12 @@ async function deriveConnectedSourceUnderstanding(input) {
239
198
  let assertionId;
240
199
  let candidateCreated = false;
241
200
  for (const [index, evidenceItem] of evidenceItems.entries()) {
201
+ const sourceItem = sourceItems.find((item) => `knowledge-source://${item.id}` === evidenceItem.evidenceRef);
242
202
  const evidence = createContextEvidence({
243
203
  sourceType: "connector",
244
204
  sourceInstanceId: input.sourceInstanceId,
205
+ sourceItemId: sourceItem?.id,
206
+ contentHash: sourceItem?.contentHash,
245
207
  sourceRef: evidenceItem.evidenceRef,
246
208
  redactedExcerpt: evidenceItem.title.slice(0, 600),
247
209
  trustLevel: "owner",
@@ -316,9 +278,12 @@ async function deriveConnectedSourceUnderstanding(input) {
316
278
  const validityDays = thread.horizon === "current" ? 30 : thread.horizon === "ongoing" ? 90 : 365;
317
279
  let goalCreated = false;
318
280
  for (const evidenceItem of goalEvidence) {
281
+ const sourceItem = sourceItems.find((item) => `knowledge-source://${item.id}` === evidenceItem.evidenceRef);
319
282
  const evidence = createContextEvidence({
320
283
  sourceType: "connector",
321
284
  sourceInstanceId: input.sourceInstanceId,
285
+ sourceItemId: sourceItem?.id,
286
+ contentHash: sourceItem?.contentHash,
322
287
  sourceRef: evidenceItem.evidenceRef,
323
288
  redactedExcerpt: evidenceItem.title.slice(0, 600),
324
289
  trustLevel: "owner",
@@ -372,8 +337,33 @@ async function deriveConnectedSourceUnderstanding(input) {
372
337
  }
373
338
  if (goalCreated) created += 1;
374
339
  }
340
+ const evidence = evidenceRefs.flatMap((ref) => {
341
+ const evidenceItem = byRef.get(ref);
342
+ const sourceItem = sourceItems.find((item) => `knowledge-source://${item.id}` === ref);
343
+ if (!evidenceItem || !sourceItem || !consentReceipt) return [];
344
+ return [{
345
+ id: createContextEvidence({
346
+ sourceType: "connector",
347
+ sourceInstanceId: input.sourceInstanceId,
348
+ sourceRef: ref,
349
+ sourceItemId: sourceItem.id,
350
+ sourceRunId: input.sourceRunId,
351
+ contentHash: sourceItem.contentHash,
352
+ processingPolicy: effectiveProcessingPolicy,
353
+ redactedExcerpt: evidenceItem.title.slice(0, 600),
354
+ trustLevel: "untrusted",
355
+ observedAt: evidenceItem.occurredAt ?? evidenceItem.modifiedAt ?? Date.now()
356
+ }).id,
357
+ contentHash: sourceItem.contentHash,
358
+ consentReceiptId: consentReceipt.id
359
+ }];
360
+ });
375
361
  const result = writeKnowledgeItem({
376
362
  kind: "work_thread",
363
+ claimMode: "reported",
364
+ verification: evidence.length === evidenceRefs.length ? "supported" : "tentative",
365
+ evidence,
366
+ reviewAt: Date.now() + (thread.horizon === "current" ? 14 : 90) * 864e5,
377
367
  scope: { type: "global" },
378
368
  content: `${thread.title}: ${thread.summary}`,
379
369
  canonicalKey: candidateKey,
@@ -383,6 +373,8 @@ async function deriveConnectedSourceUnderstanding(input) {
383
373
  sourceAgentId: input.agentId,
384
374
  source: {
385
375
  sourceRunId: input.sourceRunId,
376
+ sourceInstanceId: input.sourceInstanceId,
377
+ consentReceiptId: consentReceipt?.id,
386
378
  evidenceRefs
387
379
  },
388
380
  replaceExisting: true
@@ -1,8 +1,8 @@
1
1
  import { getConnectorConnection, getConnectorInstallation } from "../storage/sqlite/connector-repository.js";
2
2
  import { getKnowledgeSourceItem, listKnowledgeSourceItems, upsertKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
3
3
  import { init_sqlite } from "../storage/sqlite/index.js";
4
- import { ComposioSessionsAdapter } from "./composio-sessions.js";
5
4
  import { ConnectedKnowledgePipeline } from "../knowledge/connected-knowledge-pipeline.js";
5
+ import { ComposioSessionsAdapter } from "./composio-sessions.js";
6
6
  import { sanitizeConnectedSourceValue } from "./connected-source-sanitization.js";
7
7
  import { tmpdir } from "node:os";
8
8
  import { isAbsolute, join, relative, sep } from "node:path";
@@ -1,4 +1,5 @@
1
1
  import { init_connector_repository, listConnectorConnections } from "../storage/sqlite/connector-repository.js";
2
+ import { getWorkspacePath } from "../config/workspace-path-helpers.js";
2
3
  import { currentAccountConnections } from "./account-access.js";
3
4
  import { getConnectorInstance } from "./instances.js";
4
5
  import { describeCliAction, verifyCliConnection } from "./cli/runtime.js";
@@ -8,7 +9,7 @@ function classifyConnectorHealthError(error) {
8
9
  const message = error instanceof Error ? error.message : String(error);
9
10
  if (/timed out|timeout/i.test(message)) return "timeout";
10
11
  if (/ECONN|ENOTFOUND|network|fetch failed/i.test(message)) return "network_failed";
11
- if (/401|unauthorized|forbidden|permission denied/i.test(message)) return "unauthorized";
12
+ if (/401|unauthorized|forbidden|permission denied|needs sign-in|needs-auth/i.test(message)) return "unauthorized";
12
13
  if (/missing|required|credential|api key|token/i.test(message)) return "missing_secret";
13
14
  if (/tools|listTools/i.test(message)) return "tools_list_failed";
14
15
  if (/spawn|command|start|connect/i.test(message)) return "startup_failed";
@@ -88,7 +89,39 @@ async function testConnectorInstance(config, serverId) {
88
89
  };
89
90
  }
90
91
  }
91
- throw new Error("MCP diagnostics are provided by xopc mcp list.");
92
+ if (instance.materialized.type === "mcp") {
93
+ const base = {
94
+ serverId,
95
+ toolCount: 0,
96
+ resourceCount: 0,
97
+ promptCount: 0,
98
+ tools: [],
99
+ resources: [],
100
+ prompts: []
101
+ };
102
+ try {
103
+ const { discoverMcpTools } = await import("../agent/mcp/tool-catalog.js");
104
+ const tools = await discoverMcpTools(config, getWorkspacePath(config) || process.cwd(), serverId);
105
+ return {
106
+ ...base,
107
+ ok: true,
108
+ status: "ok",
109
+ toolCount: tools.length,
110
+ tools: tools.map((tool) => ({
111
+ name: tool.name,
112
+ description: tool.description
113
+ }))
114
+ };
115
+ } catch (error) {
116
+ return {
117
+ ...base,
118
+ ok: false,
119
+ status: classifyConnectorHealthError(error),
120
+ error: error instanceof Error ? error.message : String(error)
121
+ };
122
+ }
123
+ }
124
+ throw new Error(`Connector type "${instance.materialized.type}" does not support health checks.`);
92
125
  }
93
126
  //#endregion
94
127
  export { testConnectorInstance };
@@ -6,13 +6,13 @@ import { getConnectorInstallation, listConnectorConnections, upsertConnectorConn
6
6
  import { pruneBoundedKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
7
7
  import { getConnectorSyncPolicyForConnection } from "../storage/sqlite/connector-sync-policy-repository.js";
8
8
  import { init_sqlite } from "../storage/sqlite/index.js";
9
+ import { getActiveUnderstandingConsent, grantUnderstandingConsent } from "../user-context/sources/consent-repository.js";
10
+ import { getConnectorUnderstandingSourceRun, getOrCreateConnectorUnderstandingSourceRun, getUnderstandingSourceGrant, listUnderstandingSourceGrants, updateUnderstandingSourceGrantCheckpoint, updateUnderstandingSourceRun, upsertUnderstandingSourceGrant } from "../user-context/sources/repository.js";
9
11
  import { connectorIdentityKey, normalizeConnectorIdentity } from "./connector-identity.js";
10
12
  import { ComposioSessionsAdapter } from "./composio-sessions.js";
11
13
  import { buildConnectorLearningArguments, getConnectorLearningPlan } from "./learning-recipes.js";
12
14
  import { getConnectorDefinition } from "./catalog.js";
13
15
  import { ingestComposioConnectedSource } from "./connected-source-ingestion.js";
14
- import { getActiveUnderstandingConsent, grantUnderstandingConsent } from "../user-context/sources/consent-repository.js";
15
- import { getConnectorUnderstandingSourceRun, getOrCreateConnectorUnderstandingSourceRun, getUnderstandingSourceGrant, listUnderstandingSourceGrants, updateUnderstandingSourceGrantCheckpoint, updateUnderstandingSourceRun, upsertUnderstandingSourceGrant } from "../user-context/sources/repository.js";
16
16
  import { deriveConnectedSourceUnderstanding } from "./connected-source-understanding.js";
17
17
  import { listConnectedContentCandidates, readConnectedContent } from "./content-enrichment.js";
18
18
  //#region src/connectors/learning-coordinator.ts
@@ -1,5 +1,5 @@
1
- import { PROVIDER_ENV_MAP, init_env_keys } from "../providers/env-keys.js";
2
1
  import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
2
+ import { PROVIDER_ENV_MAP, init_env_keys } from "../providers/env-keys.js";
3
3
  import { init_providers, isProviderConfiguredSync } from "../providers/index.js";
4
4
  import { collectSttProviderConfigEntries } from "../voice/stt/config-slice.js";
5
5
  import { mergeSttConfigFromAppConfig } from "../voice/stt/config.js";
@@ -1,7 +1,7 @@
1
1
  import { init_paths_state, resolveStateDir } from "../config/paths-state.js";
2
2
  import { init_agent_scope, resolveAgentProfileDir } from "../agent/agent-scope.js";
3
- import { init_paths, resolveConfigPath, resolveSkillsDir } from "../config/paths.js";
4
3
  import { extractProfileAgentId } from "../config/agent-profile.js";
4
+ import { init_paths, resolveConfigPath, resolveSkillsDir } from "../config/paths.js";
5
5
  import { isBareProfileMarkdownFileName, resolveProfileMarkdownPathIfBareName } from "../agent/tools/tool-paths.js";
6
6
  import { isPathUnderWorkspace } from "./workspace-editor-path.js";
7
7
  import { homedir } from "node:os";
@@ -250,6 +250,11 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
250
250
  searchTimeoutMs: number;
251
251
  writeStrategy: "local-first" | "external-first" | "local-only" | "external-only" | "write-through";
252
252
  allowExternalWrites: boolean;
253
+ learning?: {
254
+ idleFlushMs: number;
255
+ maxBatchChars: number;
256
+ maxDailyBatches: number;
257
+ };
253
258
  allowedProviderIds?: string[];
254
259
  autoWriteKinds?: string[];
255
260
  };
@@ -1,10 +1,10 @@
1
1
  import { normalizeAgentId } from "../../../agent-catalog/id.js";
2
2
  import { AgentCatalogRepository, init_repository } from "../../../agent-catalog/repository.js";
3
3
  import { init_agent_scope, listAgentEntries, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
4
- import { resolveModelsJsonPath } from "../../../config/paths.js";
5
- import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
6
4
  import { ContextPlanningConfigSchema, KnowledgeMemoryConfigSchema, UserModelConfigSchema, init_config } from "../../../user-context/config.js";
5
+ import { resolveModelsJsonPath } from "../../../config/paths.js";
7
6
  import { init_models_json, loadModelsJson } from "../../../config/models-json.js";
7
+ import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
8
8
  import { getProviderRegistry, init_plugin_registry } from "../../../providers/plugin-registry.js";
9
9
  import { getAllProviders, init_providers, isProviderConfigured } from "../../../providers/index.js";
10
10
  import { resolveShareConfig } from "../../../share/share-config.js";
@@ -1,9 +1,9 @@
1
1
  import { BindingsSchema, init_binding_schema } from "../../../../routing/binding-schema.js";
2
2
  import { AgentCatalogService } from "../../../../agent-catalog/service.js";
3
- import { CredentialResolver, init_credentials } from "../../../../auth/credentials.js";
4
- import { ComputerConfigSchema, init_config } from "../../../../computer/config.js";
5
- import { ContextPlanningConfigSchema, HomeIntelligenceConfigSchema, KnowledgeMemoryConfigSchema, UserContextConfigSchema, UserModelConfigSchema, init_config as init_config$1 } from "../../../../user-context/config.js";
3
+ import { ContextPlanningConfigSchema, HomeIntelligenceConfigSchema, KnowledgeMemoryConfigSchema, UserContextConfigSchema, UserModelConfigSchema, init_config } from "../../../../user-context/config.js";
4
+ import { ComputerConfigSchema, init_config as init_config$1 } from "../../../../computer/config.js";
6
5
  import { BrowserConfigSchema, McpConfigSchema, VoiceConfigSchema, init_schema } from "../../../../config/schema.js";
6
+ import { CredentialResolver, init_credentials } from "../../../../auth/credentials.js";
7
7
  import { canonicalizeConfiguredMcpServer } from "../../../../config/mcp-config-normalize.js";
8
8
  import { mergeGatewaySkillsMarketplacePatch, mergeSessionConfigPatch, mergeUpdateConfigPatch } from "../../../../config/web-patch.js";
9
9
  import { assertGatewayAuthConfigured, resolveGatewayAuth } from "../../../auth.js";
@@ -14,11 +14,11 @@ import { assertGatewayRuntimeConfig } from "../../../runtime-config.js";
14
14
  import { mergeRealtimeVoiceConfigPatch, mergeSttConfigPatch, mergeTtsConfigPatch } from "../../lib/safe-voice-config.js";
15
15
  import { PATCH_OK, patchError } from "./result.js";
16
16
  //#region src/gateway/hono/routes/config-patch/misc.ts
17
- init_config();
17
+ init_config$1();
18
18
  init_schema();
19
19
  init_binding_schema();
20
20
  init_credentials();
21
- init_config$1();
21
+ init_config();
22
22
  async function applyMiscPatch(config, body) {
23
23
  if (body.update !== void 0 && typeof body.update === "object" && body.update !== null) {
24
24
  const updateResult = mergeUpdateConfigPatch(config, body.update);
@@ -8,6 +8,7 @@ import { getConnectorSyncPolicy, upsertConnectorSyncPolicy } from "../../../stor
8
8
  import { init_sqlite } from "../../../storage/sqlite/index.js";
9
9
  import { AgentCatalogRepository, init_repository } from "../../../agent-catalog/repository.js";
10
10
  import { init_agent_scope, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
11
+ import { listUnderstandingSourceGrants, revokeUnderstandingSourceGrant } from "../../../user-context/sources/repository.js";
11
12
  import { activateComposioBackend, addComposioBackend, ensureComposioBackend, getComposioBackend, listComposioBackends, removeComposioBackend } from "../../../connectors/composio-backends.js";
12
13
  import { getAuthorizationAttempt } from "../../../connectors/authorization-attempts.js";
13
14
  import { ComposioSessionsAdapter, resolveComposioApiKey } from "../../../connectors/composio-sessions.js";
@@ -27,7 +28,6 @@ import { composioLogoResponse } from "../../../connectors/composio-logo.js";
27
28
  import { inspectManagedComposioStatus } from "../../../connectors/composio-managed-client.js";
28
29
  import { appendComposioTriggerEvent, listComposioTriggerEvents } from "../../../connectors/composio-triggers.js";
29
30
  import { ingestLocalFolderSource } from "../../../connectors/connected-source-ingestion.js";
30
- import { listUnderstandingSourceGrants, revokeUnderstandingSourceGrant } from "../../../user-context/sources/repository.js";
31
31
  import { testConnectorInstance } from "../../../connectors/health.js";
32
32
  import { setConnectorEnabled } from "../../../connectors/lifecycle.js";
33
33
  import { projectComposioConnectionStatus } from "../../../connectors/runtime-status.js";
@@ -822,7 +822,7 @@ function registerConnectorRoutes(authenticated, deps) {
822
822
  }, error instanceof ConfigPersistenceError ? 500 : 400);
823
823
  }
824
824
  });
825
- authenticated.post("/api/connectors/:id/test", async (c) => {
825
+ authenticated.post("/api/connectors/:id/test", strictRateLimitMiddleware, async (c) => {
826
826
  const instanceId = c.req.param("id");
827
827
  const config = service.currentConfig;
828
828
  const instance = getConnectorInstance(config, instanceId);
@@ -830,9 +830,9 @@ function registerConnectorRoutes(authenticated, deps) {
830
830
  ok: false,
831
831
  error: `Connector instance not found: ${instanceId}`
832
832
  }, 404);
833
- if (instance.materialized.type !== "cli") return c.json({
833
+ if (instance.materialized.type !== "cli" && instance.materialized.type !== "mcp") return c.json({
834
834
  ok: false,
835
- error: `Connector type "${instance.materialized.type}" does not support CLI health checks. Use xopc mcp list for MCP diagnostics.`
835
+ error: `Connector type "${instance.materialized.type}" does not support health checks.`
836
836
  }, 400);
837
837
  try {
838
838
  const result = await testConnectorInstance(config, instance.instanceId);
@@ -3,10 +3,10 @@ import { getConnectorAccount } from "../../../storage/sqlite/connector-account-r
3
3
  import { countKnowledgeSourceItems, deleteKnowledgeSourceItems } from "../../../storage/sqlite/knowledge-repository.js";
4
4
  import { init_sqlite } from "../../../storage/sqlite/index.js";
5
5
  import { init_agent_scope, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
6
- import { listUserModelObservations } from "../../../user-model/observation-repository.js";
7
- import "../../../user-model/index.js";
8
6
  import { getActiveUnderstandingConsent } from "../../../user-context/sources/consent-repository.js";
9
7
  import { getUnderstandingSourceGrant, listUnderstandingSourceGrants, listUnderstandingSourceRuns, revokeUnderstandingSourceGrant, updateUnderstandingSourceGrantPolicies } from "../../../user-context/sources/repository.js";
8
+ import { listUserModelObservations } from "../../../user-model/observation-repository.js";
9
+ import "../../../user-model/index.js";
10
10
  import { listConnectedContentCandidates, readConnectedContent } from "../../../connectors/content-enrichment.js";
11
11
  import { listUnderstandingSourceDefinitions } from "../../../user-context/sources/catalog.js";
12
12
  //#region src/gateway/hono/routes/context-sources.ts
@@ -407,6 +407,7 @@ const AUTHENTICATED_LAZY_ROUTE_BUNDLES = [
407
407
  "/api/user-model",
408
408
  "/api/knowledge-memory",
409
409
  "/api/memory-maintenance",
410
+ "/api/memory-learning",
410
411
  "/api/turns"
411
412
  ]),
412
413
  load: async () => {
@@ -440,7 +441,7 @@ const AUTHENTICATED_LAZY_ROUTE_BUNDLES = [
440
441
  },
441
442
  {
442
443
  id: "mcp",
443
- match: (path) => path === "/api/mcp/servers",
444
+ match: (path) => path === "/api/mcp/servers" || /^\/api\/mcp\/servers\/[^/]+\/(tools|probe|auth)$/.test(path) || /^\/api\/mcp\/auth\/[^/]+(?:\/redirect)?$/.test(path),
444
445
  load: async () => {
445
446
  const { registerMcpRoutes } = await import("./mcp.js");
446
447
  return { register: registerMcpRoutes };
@@ -1,8 +1,97 @@
1
+ import { getWorkspacePath } from "../../../config/workspace-path-helpers.js";
1
2
  import { isManagedConnectorServer } from "../../../connectors/materialize.js";
2
3
  import { loadMergedMcpConfig } from "../../../agent/mcp/config.js";
3
- import { getWorkspacePath } from "../../../config/workspace-path-helpers.js";
4
+ import { getGatewayPrincipal } from "../../security/gateway-principal.js";
5
+ import { discoverMcpTools } from "../../../agent/mcp/tool-catalog.js";
6
+ import { cancelMcpAuthorization, getMcpAuthorization, probeMcpConnection, startMcpAuthorization, submitMcpRedirect } from "../../../agent/mcp/connection-setup.js";
4
7
  //#region src/gateway/hono/routes/mcp.ts
5
8
  function registerMcpRoutes(app, deps) {
9
+ app.post("/api/mcp/servers/:id/probe", deps.strictRateLimitMiddleware, async (c) => {
10
+ const config = deps.service.currentConfig;
11
+ const id = c.req.param("id");
12
+ if (!Object.hasOwn(config.mcp?.servers ?? {}, id)) return c.json({
13
+ ok: false,
14
+ error: "MCP server not found."
15
+ }, 404);
16
+ const result = await probeMcpConnection(config, getWorkspacePath(config) || process.cwd(), id);
17
+ return c.json({
18
+ ok: true,
19
+ payload: result
20
+ });
21
+ });
22
+ app.post("/api/mcp/servers/:id/auth", deps.strictRateLimitMiddleware, async (c) => {
23
+ const config = deps.service.currentConfig;
24
+ const id = c.req.param("id");
25
+ if (!Object.hasOwn(config.mcp?.servers ?? {}, id)) return c.json({
26
+ ok: false,
27
+ error: "MCP server not found."
28
+ }, 404);
29
+ try {
30
+ const attempt = startMcpAuthorization(config, getWorkspacePath(config) || process.cwd(), id, getGatewayPrincipal(c).principalId);
31
+ return c.json({
32
+ ok: true,
33
+ payload: attempt
34
+ });
35
+ } catch (error) {
36
+ return c.json({
37
+ ok: false,
38
+ error: error instanceof Error ? error.message : String(error)
39
+ }, 400);
40
+ }
41
+ });
42
+ app.get("/api/mcp/auth/:id", (c) => {
43
+ const attempt = getMcpAuthorization(c.req.param("id"), getGatewayPrincipal(c).principalId, deps.service.currentConfig);
44
+ return attempt ? c.json({
45
+ ok: true,
46
+ payload: attempt
47
+ }) : c.json({
48
+ ok: false,
49
+ error: "Sign-in not found or expired."
50
+ }, 404);
51
+ });
52
+ app.post("/api/mcp/auth/:id/redirect", deps.strictRateLimitMiddleware, async (c) => {
53
+ const body = await c.req.json().catch(() => null);
54
+ try {
55
+ return typeof body?.url === "string" && body.url.length < 16384 && submitMcpRedirect(c.req.param("id"), getGatewayPrincipal(c).principalId, body.url, deps.service.currentConfig) ? c.json({ ok: true }) : c.json({
56
+ ok: false,
57
+ error: "The callback address does not match this sign-in."
58
+ }, 400);
59
+ } catch {
60
+ return c.json({
61
+ ok: false,
62
+ error: "Invalid callback address."
63
+ }, 400);
64
+ }
65
+ });
66
+ app.delete("/api/mcp/auth/:id", (c) => {
67
+ return cancelMcpAuthorization(c.req.param("id"), getGatewayPrincipal(c).principalId) ? c.json({ ok: true }) : c.json({
68
+ ok: false,
69
+ error: "Sign-in not found."
70
+ }, 404);
71
+ });
72
+ app.post("/api/mcp/servers/:id/tools", deps.strictRateLimitMiddleware, async (c) => {
73
+ const cfg = deps.service.currentConfig;
74
+ const id = c.req.param("id");
75
+ if (!Object.hasOwn(cfg.mcp?.servers ?? {}, id)) return c.json({
76
+ ok: false,
77
+ error: "MCP server not found."
78
+ }, 404);
79
+ try {
80
+ const tools = await discoverMcpTools(cfg, getWorkspacePath(cfg) || process.cwd(), id);
81
+ return c.json({
82
+ ok: true,
83
+ payload: {
84
+ serverId: id,
85
+ tools
86
+ }
87
+ });
88
+ } catch (error) {
89
+ return c.json({
90
+ ok: false,
91
+ error: error instanceof Error ? error.message : String(error)
92
+ }, 502);
93
+ }
94
+ });
6
95
  app.get("/api/mcp/servers", (c) => {
7
96
  const cfg = deps.service.currentConfig;
8
97
  const merged = loadMergedMcpConfig({
@@ -0,0 +1,3 @@
1
+ import type { Hono } from 'hono';
2
+ import type { AuthenticatedRouteDeps } from './deps.js';
3
+ export declare function registerMemoryLearningRoutes(app: Hono, deps: AuthenticatedRouteDeps): void;
@@ -0,0 +1,76 @@
1
+ import { getSqliteDatabase, init_transaction } from "../../../storage/sqlite/transaction.js";
2
+ import { getSessionMetadata } from "../../../storage/sqlite/session-read-repository.js";
3
+ import { init_session_repository } from "../../../storage/sqlite/session-repository.js";
4
+ import { getSessionConfig, init_config_repository } from "../../../storage/sqlite/config-repository.js";
5
+ import { bindOwnerIdentity } from "../../../user-context/identity-bindings.js";
6
+ import { canUseKnowledge, knowledgeExclusion } from "../../../knowledge-memory/usage-policy.js";
7
+ import { getKnowledgeItem } from "../../../knowledge-memory/repository.js";
8
+ import { init_config, resolveKnowledgeReadPolicy } from "../../../user-context/config.js";
9
+ import { enqueueConversationLearning, learningStatus } from "../../../memory-learning/repository.js";
10
+ import "../../../knowledge-memory/index.js";
11
+ import { resolveEffectiveAgentProfileForSession } from "../../../config/agent-profile.js";
12
+ //#region src/gateway/hono/routes/memory-learning.ts
13
+ init_config_repository();
14
+ init_transaction();
15
+ init_session_repository();
16
+ init_config();
17
+ function registerMemoryLearningRoutes(app, deps) {
18
+ app.get("/api/memory-learning/status", (c) => c.json(learningStatus(deps.service.currentConfig)));
19
+ app.get("/api/memory-learning/jobs/:id", (c) => {
20
+ const job = getSqliteDatabase().prepare(`SELECT job_id AS id, state, attempts, error_code AS errorCode,
21
+ created_at AS createdAt, updated_at AS updatedAt FROM memory_learning_jobs WHERE job_id = ? AND principal_id = 'local-owner'`).get(c.req.param("id"));
22
+ return job ? c.json({ job }) : c.json({ error: "Learning job not found" }, 404);
23
+ });
24
+ app.post("/api/memory-learning/rebuild", deps.strictRateLimitMiddleware, async (c) => {
25
+ const input = await c.req.json().catch(() => null);
26
+ if (!input || typeof input.conversationId !== "string") return c.json({ error: "conversationId is required" }, 400);
27
+ if (!getSessionMetadata(input.conversationId)) return c.json({ error: "Conversation not found" }, 404);
28
+ const jobId = enqueueConversationLearning(deps.service.currentConfig, input.conversationId, getSessionConfig(input.conversationId)?.workingDirectoryOverride ?? resolveEffectiveAgentProfileForSession(input.conversationId).resolvedWorkspacePath, true);
29
+ return jobId ? c.json({ jobId }, 202) : c.json({
30
+ queued: false,
31
+ reason: "not_eligible_or_already_queued"
32
+ });
33
+ });
34
+ app.post("/api/memory-learning/owner-identities", deps.strictRateLimitMiddleware, async (c) => {
35
+ const input = await c.req.json().catch(() => null);
36
+ if (!input || ![
37
+ "channel",
38
+ "accountId",
39
+ "peerId"
40
+ ].every((key) => typeof input[key] === "string" && input[key].trim())) return c.json({ error: "channel, accountId and peerId are required" }, 400);
41
+ bindOwnerIdentity(input);
42
+ return c.json({ ok: true });
43
+ });
44
+ app.get("/api/memory-learning/owner-identities", (c) => c.json({ identities: getSqliteDatabase().prepare(`
45
+ SELECT channel, account_id AS accountId, peer_id AS peerId, verified_at AS verifiedAt
46
+ FROM owner_identity_bindings WHERE principal_id = 'local-owner' AND revoked_at IS NULL ORDER BY verified_at DESC`).all() }));
47
+ app.delete("/api/memory-learning/owner-identities", deps.strictRateLimitMiddleware, async (c) => {
48
+ const input = await c.req.json().catch(() => null);
49
+ if (!input || ![
50
+ "channel",
51
+ "accountId",
52
+ "peerId"
53
+ ].every((key) => typeof input[key] === "string")) return c.json({ error: "Identity fields are required" }, 400);
54
+ getSqliteDatabase().prepare("UPDATE owner_identity_bindings SET revoked_at = ? WHERE channel = ? AND account_id = ? AND peer_id = ?").run(Date.now(), input.channel, input.accountId, input.peerId);
55
+ return c.json({ ok: true });
56
+ });
57
+ app.get("/api/knowledge-memory/:id/evidence", (c) => {
58
+ const item = getKnowledgeItem(c.req.param("id"));
59
+ const context = {
60
+ agentId: c.req.query("agentId") ?? item?.sourceAgentId ?? "main",
61
+ workspaceId: c.req.query("workspaceId") ?? (item?.scope.type === "workspace" ? item.scope.id : ""),
62
+ conversationId: c.req.query("conversationId") ?? item?.sourceConversationId ?? "",
63
+ projectId: c.req.query("projectId") ?? (item?.scope.type === "project" ? item.scope.id : void 0)
64
+ };
65
+ if (!item || !canUseKnowledge(item, context, resolveKnowledgeReadPolicy(deps.service.currentConfig.userContext.knowledgeMemory))) return c.json({
66
+ error: "Knowledge evidence not available",
67
+ reason: item ? knowledgeExclusion(item, context, resolveKnowledgeReadPolicy(deps.service.currentConfig.userContext.knowledgeMemory)) : "not_found"
68
+ }, 404);
69
+ const evidence = getSqliteDatabase().prepare(`SELECT e.source_type AS sourceType, e.source_ref AS sourceRef,
70
+ e.observed_at AS observedAt, e.redacted_excerpt AS excerpt FROM knowledge_evidence_links l
71
+ JOIN context_evidence e ON e.evidence_id = l.evidence_id WHERE l.knowledge_id = ?`).all(item.id);
72
+ return c.json({ evidence });
73
+ });
74
+ }
75
+ //#endregion
76
+ export { registerMemoryLearningRoutes };
@@ -1,11 +1,11 @@
1
- import { resolveModelsJsonPath } from "../../../config/paths.js";
2
- import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
3
1
  import { resolveEffectiveAgentConfigForAgent } from "../../../config/agent-profile.js";
4
2
  import { init_resolve_config_value, testApiKeyResolution } from "../../../config/resolve-config-value.js";
3
+ import { resolveModelsJsonPath } from "../../../config/paths.js";
5
4
  import { computerModelProfile, init_model_policy, isDedicatedComputerModel } from "../../../computer/model-policy.js";
6
5
  import { init_models_json, loadModelsJson, saveModelsJson, validateModelsConfig } from "../../../config/models-json.js";
7
6
  import { getModelCatalogStore, init_model_catalog_store } from "../../../providers/model-catalog-store.js";
8
7
  import { getModelRegistry } from "../../../providers/model-registry.js";
8
+ import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
9
9
  import "../../../providers/constants.js";
10
10
  import { getProviderRegistry, init_plugin_registry } from "../../../providers/plugin-registry.js";
11
11
  import { PROVIDER_META, getAllModels, getAllProviders, getAvailableModels, getProviderAuthState, init_providers, isProviderConfigured, isProviderConfiguredSync } from "../../../providers/index.js";
@@ -1,5 +1,5 @@
1
- import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
2
1
  import { TracingConfigSchema, init_config } from "../../../observability/config.js";
2
+ import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
3
3
  import { configureTracing, localStore, testLangfuse, tracingConfig, tracingStatus } from "../../../observability/runtime.js";
4
4
  import { z } from "zod";
5
5
  import { Hono } from "hono";
@@ -9,9 +9,9 @@ import { ActivityService } from "../../../activity/service.js";
9
9
  import "../../../activity/index.js";
10
10
  import { CapabilityError } from "../../../capabilities/runtime/errors.js";
11
11
  import "../../../capabilities/runtime/dispatcher.js";
12
- import { resolveEffectiveAgentProfile } from "../../../config/agent-profile.js";
13
12
  import { listKnowledgeItems, writeKnowledgeItem } from "../../../knowledge-memory/repository.js";
14
13
  import "../../../knowledge-memory/index.js";
14
+ import { resolveEffectiveAgentProfile } from "../../../config/agent-profile.js";
15
15
  import { TaskReadModelProjector } from "../../../tasks/task-read-model-projector.js";
16
16
  import { ProjectWorkspaceConflictError, ProjectWorkspaceMissingError } from "../../../projects/workspace-project.js";
17
17
  import { inferProjectExecutionMode, inferProjectKind } from "../../../projects/project-kind.js";