@xopcai/xopc 0.0.324 → 0.0.329

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 (325) hide show
  1. package/README.md +4 -3
  2. package/README.zh-CN.md +4 -3
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/telegram/xopc.extension.json +1 -1
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-B-Gczr_A.js → agent-avatar-dicebear-Bs1qnnhD.js} +1 -1
  6. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-DHJyAT7t.js +1 -0
  7. package/dist/gateway/static/root/assets/agent-plugin-dialog-DLKj_iIh.js +1 -0
  8. package/dist/gateway/static/root/assets/agents-SXZ5O0g4.js +70 -0
  9. package/dist/gateway/static/root/assets/{app-management-settings-panel-BwWdVRlb.js → app-management-settings-panel-BrIji9B5.js} +1 -1
  10. package/dist/gateway/static/root/assets/{appearance-settings-EoXNDO1j.js → appearance-settings-Uts-MQ7K.js} +1 -1
  11. package/dist/gateway/static/root/assets/apps-page-DcclVdxW.js +1 -0
  12. package/dist/gateway/static/root/assets/{archive-plugin-B_T0uMvL.js → archive-plugin-_EzRfBuI.js} +1 -1
  13. package/dist/gateway/static/root/assets/{attachment-load-D9DDwxd2.js → attachment-load-CHg7_XFl.js} +1 -1
  14. package/dist/gateway/static/root/assets/{automations-page-jI9vNr2r.js → automations-page-CGMErk_w.js} +1 -1
  15. package/dist/gateway/static/root/assets/automations-workspace-Cc4yqiF6.js +7 -0
  16. package/dist/gateway/static/root/assets/{binary-plugins-Dzsxh9OL.js → binary-plugins-D3WB-tVn.js} +1 -1
  17. package/dist/gateway/static/root/assets/{block-editor-CWUUgWWk.js → block-editor-Cm1W-14I.js} +53 -53
  18. package/dist/gateway/static/root/assets/box-DvYoGszj.js +1 -0
  19. package/dist/gateway/static/root/assets/braces-Cfmtagno.js +1 -0
  20. package/dist/gateway/static/root/assets/{browser-automation-inputs-DSWXq9lI.js → browser-automation-inputs-VnvK-GQP.js} +1 -1
  21. package/dist/gateway/static/root/assets/browser-automations-page-CZYCvSSU.js +3 -0
  22. package/dist/gateway/static/root/assets/browser-settings-page-DDz9PE6m.js +3 -0
  23. package/dist/gateway/static/root/assets/calendar-clock-D-quYVPe.js +1 -0
  24. package/dist/gateway/static/root/assets/capabilities-page-DH3aDk53.js +2 -0
  25. package/dist/gateway/static/root/assets/capabilities-settings-panel-C8jMZAJl.js +8 -0
  26. package/dist/gateway/static/root/assets/capability-discover-page-CgGvsf3t.js +1 -0
  27. package/dist/gateway/static/root/assets/capability-header-actions-C3chJDQu.js +1 -0
  28. package/dist/gateway/static/root/assets/capability-icon-BYm2-nS-.js +1 -0
  29. package/dist/gateway/static/root/assets/channels-CuVS_KsY.js +1 -0
  30. package/dist/gateway/static/root/assets/{chat-terminal-dock-WXZrEB3K.js → chat-terminal-dock-ClbmjCL2.js} +2 -2
  31. package/dist/gateway/static/root/assets/chevron-left-DqFhpbvK.js +1 -0
  32. package/dist/gateway/static/root/assets/clock-3-DnrAnuyZ.js +1 -0
  33. package/dist/gateway/static/root/assets/computer-settings-page-BfZaf516.js +1 -0
  34. package/dist/gateway/static/root/assets/connector-service-page-F-fYNIx8.js +1 -0
  35. package/dist/gateway/static/root/assets/connectors-page-B4SLpvSL.js +2 -0
  36. package/dist/gateway/static/root/assets/date-picker-DXQTsUJn.js +1 -0
  37. package/dist/gateway/static/root/assets/dependency-picker-B_z3zihW.js +1 -0
  38. package/dist/gateway/static/root/assets/{desktop-pet-DPVPqFlh.js → desktop-pet-C1TZzKS3.js} +1 -1
  39. package/dist/gateway/static/root/assets/desktop-pet-settings-B5JGIfqn.js +1 -0
  40. package/dist/gateway/static/root/assets/device-pairing-wizard-DFYK_Ywf.js +1 -0
  41. package/dist/gateway/static/root/assets/directory-picker-path-field-BfxaNwMB.js +1 -0
  42. package/dist/gateway/static/root/assets/ellipsis-0k4rZLoy.js +1 -0
  43. package/dist/gateway/static/root/assets/{extension-debug-page-cuG5Lnwf.js → extension-debug-page-Bs8_FYCm.js} +1 -1
  44. package/dist/gateway/static/root/assets/extension-marketplace-api-DqV4YRYs.js +1 -0
  45. package/dist/gateway/static/root/assets/{extension-page-BCTAXdyE.js → extension-page-DH5vFbBw.js} +1 -1
  46. package/dist/gateway/static/root/assets/{extension-settings-page-kadW_icu.js → extension-settings-page-hGKovxxC.js} +1 -1
  47. package/dist/gateway/static/root/assets/external-link-DjqjBmc3.js +1 -0
  48. package/dist/gateway/static/root/assets/eye-CABVeTq0.js +1 -0
  49. package/dist/gateway/static/root/assets/folder-open-CyzJ19I9.js +1 -0
  50. package/dist/gateway/static/root/assets/{gateway-config-swr-CoQVulMd.js → gateway-config-swr-BYMrbKZE.js} +1 -1
  51. package/dist/gateway/static/root/assets/gateway-settings-BIsiP-JI.js +1 -0
  52. package/dist/gateway/static/root/assets/{gateway-startup-retry-B5GJ-CQV.js → gateway-startup-retry-DMqYXHAn.js} +1 -1
  53. package/dist/gateway/static/root/assets/gauge-C78eD2BA.js +1 -0
  54. package/dist/gateway/static/root/assets/git-branch-Dh9uxTot.js +1 -0
  55. package/dist/gateway/static/root/assets/globe-DSSGFWFn.js +1 -0
  56. package/dist/gateway/static/root/assets/home-page-CoBivEvx.js +1 -0
  57. package/dist/gateway/static/root/assets/image-Cwyalflz.js +1 -0
  58. package/dist/gateway/static/root/assets/{image-generation-api-DvWDkbk1.js → image-generation-api-D1sQGaJz.js} +1 -1
  59. package/dist/gateway/static/root/assets/imports-page-rssb4rjP.js +1 -0
  60. package/dist/gateway/static/root/assets/inbox-DNoSz682.js +1 -0
  61. package/dist/gateway/static/root/assets/index-C4QN4gCi.css +1 -0
  62. package/dist/gateway/static/root/assets/index-Cr4SINLG.js +121 -0
  63. package/dist/gateway/static/root/assets/is-masked-secret-DOkL5b_X.js +1 -0
  64. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-C1fKIjz4.js → keyboard-shortcuts-settings-CMitbles.js} +1 -1
  65. package/dist/gateway/static/root/assets/layout-grid-CEVZdVFU.js +1 -0
  66. package/dist/gateway/static/root/assets/link-2-D_ZKYUW7.js +1 -0
  67. package/dist/gateway/static/root/assets/list-BBGUdmkF.js +1 -0
  68. package/dist/gateway/static/root/assets/loader-circle-CifKLtgG.js +1 -0
  69. package/dist/gateway/static/root/assets/local-app-workbench-page-Di82Oacm.js +1 -0
  70. package/dist/gateway/static/root/assets/local-apps-page-CCvA9d9L.js +1 -0
  71. package/dist/gateway/static/root/assets/{locale-store-BPZR8x9b.js → locale-store-BSkKhYkc.js} +1 -1
  72. package/dist/gateway/static/root/assets/lock-keyhole-DEK5kH0u.js +1 -0
  73. package/dist/gateway/static/root/assets/logs-page-BK8ol1q0.js +2 -0
  74. package/dist/gateway/static/root/assets/management-settings-CebXkEtB.js +1 -0
  75. package/dist/gateway/static/root/assets/{markdown-view-Dft8ASFD.js → markdown-view-DXubGEic.js} +2 -2
  76. package/dist/gateway/static/root/assets/{media-plugins-Cjj-fidX.js → media-plugins-DLJrmU9J.js} +1 -1
  77. package/dist/gateway/static/root/assets/message-circle-Badhj-4D.js +1 -0
  78. package/dist/gateway/static/root/assets/message-square-fVE7Ghj1.js +1 -0
  79. package/dist/gateway/static/root/assets/message-square-plus-XP0tGdlV.js +1 -0
  80. package/dist/gateway/static/root/assets/messages-D0G_sZvA.js +3 -0
  81. package/dist/gateway/static/root/assets/minimize-2-DtOGrlpo.js +1 -0
  82. package/dist/gateway/static/root/assets/models-hub-cache-B0EUPwTv.js +1 -0
  83. package/dist/gateway/static/root/assets/network-BUQLY1BV.js +1 -0
  84. package/dist/gateway/static/root/assets/note-detail-panel-xsKDIJdK.js +5 -0
  85. package/dist/gateway/static/root/assets/note-image-lightbox-1qg2v-9j.js +1 -0
  86. package/dist/gateway/static/root/assets/notes-page-BFm7XnWH.js +8 -0
  87. package/dist/gateway/static/root/assets/page-context-capture-button-C3JiQEKD.js +1 -0
  88. package/dist/gateway/static/root/assets/paperclip-f1HujQY1.js +1 -0
  89. package/dist/gateway/static/root/assets/pencil-DmIY3Oa-.js +1 -0
  90. package/dist/gateway/static/root/assets/power-ZI-pBczI.js +1 -0
  91. package/dist/gateway/static/root/assets/preview-open-alternatives-buk_gdip.js +1 -0
  92. package/dist/gateway/static/root/assets/{product-open-page-DlpCi5zT.js → product-open-page-DwEEO0Ak.js} +1 -1
  93. package/dist/gateway/static/root/assets/project-detail-page-CRQGCRSU.js +1 -0
  94. package/dist/gateway/static/root/assets/projects-page-DcqylysA.js +1 -0
  95. package/dist/gateway/static/root/assets/{registry-api-DWWO6ajd.js → registry-api-tx8XCHOs.js} +1 -1
  96. package/dist/gateway/static/root/assets/remote-access-hub-Cq5MaiRW.js +1 -0
  97. package/dist/gateway/static/root/assets/rotate-cw-LIg3Am9S.js +1 -0
  98. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-BT_ANpaT.js → runtime-tools-settings-panel-De7HmmBu.js} +2 -2
  99. package/dist/gateway/static/root/assets/scenes-page-GXJ-b3dO.js +2 -0
  100. package/dist/gateway/static/root/assets/{schema-form-BcqsqSsV.js → schema-form-DPMEuj5D.js} +1 -1
  101. package/dist/gateway/static/root/assets/search-DA7gz22f.js +1 -0
  102. package/dist/gateway/static/root/assets/server-BlHCBjiE.js +1 -0
  103. package/dist/gateway/static/root/assets/sessions-page-C6FwYIRA.js +1 -0
  104. package/dist/gateway/static/root/assets/settings-advanced-gate-BEyQiZs0.js +1 -0
  105. package/dist/gateway/static/root/assets/settings-form-section-DM0D-BQ_.js +1 -0
  106. package/dist/gateway/static/root/assets/{settings-page-B65vii9U.js → settings-page-CWS9yOH3.js} +1 -1
  107. package/dist/gateway/static/root/assets/settings-page-layout-X1x-2Cp9.js +1 -0
  108. package/dist/gateway/static/root/assets/setup-status-panel-BhGKiTPf.js +1 -0
  109. package/dist/gateway/static/root/assets/{share-preview-page-BS8o58NJ.js → share-preview-page-CcRi2yGy.js} +1 -1
  110. package/dist/gateway/static/root/assets/shares-settings-DNmcCBfX.js +1 -0
  111. package/dist/gateway/static/root/assets/skill-api-BCAV_F1P.js +1 -0
  112. package/dist/gateway/static/root/assets/skill-card-icon-BrrpZ3Mw.js +1 -0
  113. package/dist/gateway/static/root/assets/skill-reload-api-BEV2WXGk.js +1 -0
  114. package/dist/gateway/static/root/assets/skills-page-C8zOGpKw.js +2 -0
  115. package/dist/gateway/static/root/assets/star-BUWJqJ5c.js +1 -0
  116. package/dist/gateway/static/root/assets/stethoscope-DRqTAtjD.js +1 -0
  117. package/dist/gateway/static/root/assets/store-SzD1Jvgm.js +1 -0
  118. package/dist/gateway/static/root/assets/system-settings-panel-C_lajq9u.js +1 -0
  119. package/dist/gateway/static/root/assets/task-detail-page-Dk8Bmlhw.js +1 -0
  120. package/dist/gateway/static/root/assets/tunnel-api-CYvKiE_f.js +1 -0
  121. package/dist/gateway/static/root/assets/upload-rrb46c3c.js +1 -0
  122. package/dist/gateway/static/root/assets/use-autosave-ZTHe1zCM.js +1 -0
  123. package/dist/gateway/static/root/assets/user-model-page-C_SPNZbP.js +2 -0
  124. package/dist/gateway/static/root/assets/user-round-C9jxPhMR.js +1 -0
  125. package/dist/gateway/static/root/assets/{voice-api-key-field-DJV-qERt.js → voice-api-key-field-C8Kpkct-.js} +1 -1
  126. package/dist/gateway/static/root/assets/voice-config-api-BvzxINUk.js +1 -0
  127. package/dist/gateway/static/root/assets/wand-sparkles-DWuJz5ya.js +1 -0
  128. package/dist/gateway/static/root/assets/{work-discovery-overlay-DcHhy54L.js → work-discovery-overlay-ClB6T-dm.js} +1 -1
  129. package/dist/gateway/static/root/assets/workflow-run-setup-panel-X0Cyh2AR.js +3 -0
  130. package/dist/gateway/static/root/assets/workflows-page-BrL6dzf0.js +6 -0
  131. package/dist/gateway/static/root/connector-icons/SOURCES.md +1 -0
  132. package/dist/gateway/static/root/connector-icons/wecom.svg +9 -0
  133. package/dist/gateway/static/root/index.html +26 -8
  134. package/dist/package.js +1 -1
  135. package/dist/src/agent/agent-instance-gateway.d.ts +2 -2
  136. package/dist/src/agent/agent-manager.d.ts +4 -2
  137. package/dist/src/agent/agent-manager.js +58 -19
  138. package/dist/src/agent/background-review/coordinator.d.ts +2 -7
  139. package/dist/src/agent/background-review/coordinator.js +17 -34
  140. package/dist/src/agent/background-review/prompts.d.ts +13 -5
  141. package/dist/src/agent/background-review/prompts.js +17 -12
  142. package/dist/src/agent/background-review/run-background-review.d.ts +3 -3
  143. package/dist/src/agent/background-review/run-background-review.js +58 -43
  144. package/dist/src/agent/context/execution-context.js +5 -2
  145. package/dist/src/agent/mcp/index.js +1 -1
  146. package/dist/src/agent/mcp/mcp-transport.js +2 -2
  147. package/dist/src/agent/mcp/oauth/index.js +1 -1
  148. package/dist/src/agent/mcp/oauth/mcp-oauth-manager.js +2 -2
  149. package/dist/src/agent/mcp/oauth/mcp-oauth-provider.js +1 -1
  150. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
  151. package/dist/src/agent/prompt/sections/tooling.js +3 -0
  152. package/dist/src/agent/service/direct-turn-helpers.js +1 -1
  153. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +12 -0
  154. package/dist/src/agent/tools/user-context-tool.js +29 -4
  155. package/dist/src/automations/domain/types.d.ts +7 -1
  156. package/dist/src/automations/service/action-executor.d.ts +2 -2
  157. package/dist/src/automations/service/action-executor.js +36 -13
  158. package/dist/src/automations/service/automation-service.js +2 -1
  159. package/dist/src/browser/automations/index.js +2 -2
  160. package/dist/src/browser/automations/service.d.ts +11 -2
  161. package/dist/src/browser/automations/service.js +19 -5
  162. package/dist/src/capabilities/readiness/from-config.d.ts +0 -1
  163. package/dist/src/capabilities/readiness/from-config.js +2 -4
  164. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  165. package/dist/src/cli/commands/extension-agent-plugin.js +2 -1
  166. package/dist/src/config/schema.js +4 -4
  167. package/dist/src/connectors/china-catalog.js +5 -1
  168. package/dist/src/connectors/connected-source-ingestion.js +6 -1
  169. package/dist/src/connectors/connected-source-observations.d.ts +10 -0
  170. package/dist/src/connectors/connected-source-observations.js +80 -0
  171. package/dist/src/connectors/connected-source-understanding.js +198 -8
  172. package/dist/src/connectors/learning-coordinator.js +63 -26
  173. package/dist/src/connectors/learning-recipes.js +19 -2
  174. package/dist/src/discussions/audio-repair.d.ts +1 -1
  175. package/dist/src/discussions/live-worker.js +1 -3
  176. package/dist/src/discussions/recording.js +2 -2
  177. package/dist/src/discussions/sealer.js +2 -2
  178. package/dist/src/extensions/agent-plugins/auth.d.ts +2 -2
  179. package/dist/src/extensions/agent-plugins/auth.js +6 -35
  180. package/dist/src/extensions/agent-plugins/credentials.d.ts +2 -0
  181. package/dist/src/extensions/agent-plugins/credentials.js +37 -0
  182. package/dist/src/extensions/agent-plugins/plugin-oauth-scope.d.ts +1 -0
  183. package/dist/src/extensions/agent-plugins/plugin-oauth-scope.js +8 -0
  184. package/dist/src/extensions/marketplace.d.ts +4 -0
  185. package/dist/src/extensions/marketplace.js +4 -0
  186. package/dist/src/gateway/file-space-service.d.ts +9 -2
  187. package/dist/src/gateway/hono/routes/agent-plugins.js +2 -1
  188. package/dist/src/gateway/hono/routes/config.js +0 -3
  189. package/dist/src/gateway/hono/routes/connectors.js +3 -10
  190. package/dist/src/gateway/hono/routes/context-sources.d.ts +0 -1
  191. package/dist/src/gateway/hono/routes/context-sources.js +12 -15
  192. package/dist/src/gateway/hono/routes/status.js +0 -1
  193. package/dist/src/gateway/hono/routes/user-model.js +21 -3
  194. package/dist/src/gateway/hono/routes/voice.js +0 -67
  195. package/dist/src/gateway/service.js +6 -4
  196. package/dist/src/media-understanding/types.d.ts +1 -1
  197. package/dist/src/memory-maintenance/service.d.ts +1 -0
  198. package/dist/src/memory-maintenance/service.js +13 -0
  199. package/dist/src/migrations/retired-local-stt.d.ts +2 -0
  200. package/dist/src/migrations/retired-local-stt.js +52 -0
  201. package/dist/src/migrations/runner.js +2 -1
  202. package/dist/src/session/turn-outcome-projector.js +1 -1
  203. package/dist/src/storage/sqlite/connection.js +1 -0
  204. package/dist/src/storage/sqlite/migrations/207_user_model_policy_contract.sql +121 -0
  205. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  206. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  207. package/dist/src/storage/sqlite/schema.js +1 -1
  208. package/dist/src/storage/sqlite/sql-assets.d.ts +1 -0
  209. package/dist/src/storage/sqlite/sql-assets.js +7 -4
  210. package/dist/src/tasks/index.js +2 -2
  211. package/dist/src/tasks/task-application-service.d.ts +1 -0
  212. package/dist/src/tasks/task-application-service.js +4 -2
  213. package/dist/src/tasks/task-context-assembler.js +10 -1
  214. package/dist/src/tasks/task-run-dispatcher.d.ts +1 -0
  215. package/dist/src/tasks/task-run-dispatcher.js +15 -2
  216. package/dist/src/user-context/sources/consent-repository.d.ts +7 -0
  217. package/dist/src/user-context/sources/consent-repository.js +81 -0
  218. package/dist/src/user-context/sources/index.d.ts +1 -0
  219. package/dist/src/user-context/sources/index.js +2 -1
  220. package/dist/src/user-context/sources/repository.js +73 -1
  221. package/dist/src/user-context/sources/types.d.ts +16 -0
  222. package/dist/src/user-model/action-rule-suggestions.d.ts +11 -0
  223. package/dist/src/user-model/action-rule-suggestions.js +29 -0
  224. package/dist/src/user-model/bootstrap.js +1 -1
  225. package/dist/src/user-model/capture/executor.js +83 -7
  226. package/dist/src/user-model/capture/semantic.d.ts +5 -2
  227. package/dist/src/user-model/capture/semantic.js +27 -11
  228. package/dist/src/user-model/domain.d.ts +26 -0
  229. package/dist/src/user-model/domain.js +40 -2
  230. package/dist/src/user-model/index.d.ts +2 -0
  231. package/dist/src/user-model/index.js +6 -4
  232. package/dist/src/user-model/maintenance-policy.d.ts +1 -0
  233. package/dist/src/user-model/maintenance-policy.js +13 -0
  234. package/dist/src/user-model/observation-repository.d.ts +48 -0
  235. package/dist/src/user-model/observation-repository.js +100 -0
  236. package/dist/src/user-model/repository.d.ts +5 -0
  237. package/dist/src/user-model/repository.js +121 -10
  238. package/dist/src/user-model/usage-policy.d.ts +5 -2
  239. package/dist/src/user-model/usage-policy.js +2 -2
  240. package/dist/src/voice/audio/normalize.d.ts +1 -1
  241. package/dist/src/voice/audio/normalize.js +1 -1
  242. package/dist/src/voice/{local → audio}/wav.js +1 -1
  243. package/dist/src/voice/language-profile.js +10 -16
  244. package/dist/src/voice/metadata/builtin.js +0 -46
  245. package/dist/src/voice/stt/providers/index.d.ts +0 -1
  246. package/dist/src/voice/stt/providers/index.js +1 -2
  247. package/dist/src/voice/stt/types.js +3 -4
  248. package/dist/src/voice/tts/merge-config.js +1 -1
  249. package/dist/src/voice/tts/speech-registry.d.ts +1 -1
  250. package/dist/src/voice/tts/types.d.ts +1 -1
  251. package/dist/src/work-discovery/analyzer.js +6 -5
  252. package/dist/src/work-discovery/service.js +2 -2
  253. package/dist/src/work-discovery/types.d.ts +1 -1
  254. package/dist/src/workflows/context/workflow-context.js +5 -1
  255. package/dist/src/workflows/index.js +2 -2
  256. package/dist/src/workflows/service/workflow-run-service.d.ts +1 -0
  257. package/dist/src/workflows/service/workflow-run-service.js +13 -4
  258. package/package.json +13 -17
  259. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-CxcIHW_Z.js +0 -1
  260. package/dist/gateway/static/root/assets/agent-plugin-dialog-CNuqJcHQ.js +0 -1
  261. package/dist/gateway/static/root/assets/agents-CPpmkx7O.js +0 -1
  262. package/dist/gateway/static/root/assets/apps-page-6xEgLDv8.js +0 -1
  263. package/dist/gateway/static/root/assets/automations-workspace-rztQnZDk.js +0 -7
  264. package/dist/gateway/static/root/assets/browser-automations-page-D96o3bDY.js +0 -3
  265. package/dist/gateway/static/root/assets/browser-settings-page-DUQzQ3ic.js +0 -3
  266. package/dist/gateway/static/root/assets/capabilities-settings-panel-CKWtXof8.js +0 -8
  267. package/dist/gateway/static/root/assets/channels-settings-C8ducWB7.js +0 -1
  268. package/dist/gateway/static/root/assets/computer-settings-page-uy9YDwxJ.js +0 -1
  269. package/dist/gateway/static/root/assets/connector-service-page-BpF0SjB9.js +0 -1
  270. package/dist/gateway/static/root/assets/connectors-page-eZTfIMWI.js +0 -2
  271. package/dist/gateway/static/root/assets/date-picker-Do1dl0La.js +0 -1
  272. package/dist/gateway/static/root/assets/dependency-picker-BhS8s080.js +0 -1
  273. package/dist/gateway/static/root/assets/desktop-pet-settings-Dv3vG9HZ.js +0 -1
  274. package/dist/gateway/static/root/assets/device-pairing-wizard-DdvO1O6W.js +0 -1
  275. package/dist/gateway/static/root/assets/gateway-settings-CLZyN-u9.js +0 -1
  276. package/dist/gateway/static/root/assets/home-page-BSqg-JE9.js +0 -1
  277. package/dist/gateway/static/root/assets/imports-page-_pddpuej.js +0 -1
  278. package/dist/gateway/static/root/assets/index-BKL5tg2f.css +0 -1
  279. package/dist/gateway/static/root/assets/index-CJuypaNt.js +0 -121
  280. package/dist/gateway/static/root/assets/local-app-workbench-page-DXFnYiA0.js +0 -1
  281. package/dist/gateway/static/root/assets/local-apps-page-CkXKS5xe.js +0 -1
  282. package/dist/gateway/static/root/assets/logs-page-C33z-ife.js +0 -2
  283. package/dist/gateway/static/root/assets/management-settings-8eDZb0uS.js +0 -1
  284. package/dist/gateway/static/root/assets/messages-kFWhF6_t.js +0 -3
  285. package/dist/gateway/static/root/assets/note-detail-panel-C95RtLuL.js +0 -5
  286. package/dist/gateway/static/root/assets/notes-page-kFxknjMR.js +0 -8
  287. package/dist/gateway/static/root/assets/page-context-capture-button-OUL3fEYh.js +0 -1
  288. package/dist/gateway/static/root/assets/page-tabs-CVbY7_N5.js +0 -1
  289. package/dist/gateway/static/root/assets/preview-open-alternatives-CKiIby0r.js +0 -1
  290. package/dist/gateway/static/root/assets/project-detail-page-LPAxUszX.js +0 -1
  291. package/dist/gateway/static/root/assets/projects-page-Cbyb4hyy.js +0 -1
  292. package/dist/gateway/static/root/assets/remote-access-hub-BtDFZc6g.js +0 -1
  293. package/dist/gateway/static/root/assets/scenes-page-CJlc-mg1.js +0 -2
  294. package/dist/gateway/static/root/assets/sessions-page-CUo6-iV2.js +0 -1
  295. package/dist/gateway/static/root/assets/settings-advanced-gate-XeSxPjP7.js +0 -1
  296. package/dist/gateway/static/root/assets/settings-form-section-Dol9j_pF.js +0 -1
  297. package/dist/gateway/static/root/assets/settings-page-layout-eqTUTW2L.js +0 -1
  298. package/dist/gateway/static/root/assets/setup-status-panel-BCt__prc.js +0 -1
  299. package/dist/gateway/static/root/assets/shares-settings-BsjSqEnw.js +0 -1
  300. package/dist/gateway/static/root/assets/skill-reload-api-evN7gs0S.js +0 -1
  301. package/dist/gateway/static/root/assets/skills-page-BifYwEhe.js +0 -2
  302. package/dist/gateway/static/root/assets/skills-page.utils-DOk-iOvN.js +0 -1
  303. package/dist/gateway/static/root/assets/system-settings-panel-CcSvoHfY.js +0 -1
  304. package/dist/gateway/static/root/assets/task-detail-page-pCRG7Jb3.js +0 -1
  305. package/dist/gateway/static/root/assets/tunnel-api-DDGMf44u.js +0 -1
  306. package/dist/gateway/static/root/assets/use-autosave-DiIkxIq7.js +0 -1
  307. package/dist/gateway/static/root/assets/user-model-page-CvYeM0Ml.js +0 -2
  308. package/dist/gateway/static/root/assets/voice-config-api-BaxITrwZ.js +0 -1
  309. package/dist/gateway/static/root/assets/workflow-run-setup-panel-DbVtLh0R.js +0 -3
  310. package/dist/gateway/static/root/assets/workflows-page-CT8ouKcB.js +0 -6
  311. package/dist/src/voice/local/model-files.d.ts +0 -14
  312. package/dist/src/voice/local/model-files.js +0 -92
  313. package/dist/src/voice/local/model-manager.d.ts +0 -18
  314. package/dist/src/voice/local/model-manager.js +0 -133
  315. package/dist/src/voice/local/models.d.ts +0 -28
  316. package/dist/src/voice/local/models.js +0 -99
  317. package/dist/src/voice/local/provider-switch.d.ts +0 -4
  318. package/dist/src/voice/local/provider-switch.js +0 -36
  319. package/dist/src/voice/local/runtime-client.d.ts +0 -28
  320. package/dist/src/voice/local/runtime-client.js +0 -183
  321. package/dist/src/voice/local/runtime-worker.d.ts +0 -1
  322. package/dist/src/voice/local/runtime-worker.js +0 -271
  323. package/dist/src/voice/stt/providers/local-transcription.d.ts +0 -2
  324. package/dist/src/voice/stt/providers/local-transcription.js +0 -53
  325. /package/dist/src/voice/{local → audio}/wav.d.ts +0 -0
@@ -9,6 +9,9 @@ import "../knowledge-memory/index.js";
9
9
  import { reconcileAssertion } from "../user-model/repository.js";
10
10
  import "../user-model/index.js";
11
11
  import { claimRegisteredExtraction } from "../user-context/extraction/registry.js";
12
+ 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";
12
15
  import { allowsRemoteSourceProcessing } from "../user-context/sources/processing-policy.js";
13
16
  import { analyzeUnderstandingSources } from "../work-discovery/analyzer.js";
14
17
  import { createHash } from "node:crypto";
@@ -45,6 +48,90 @@ function timestamp(value) {
45
48
  const parsed = Date.parse(value);
46
49
  return Number.isFinite(parsed) ? parsed : void 0;
47
50
  }
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
+ function itemsAllowedByConsent(items, consent) {
114
+ if (!consent) return [];
115
+ const allowed = new Set(consent.allowedFields);
116
+ return items.map((item) => {
117
+ const filteredText = consentFilteredText(item.text, allowed);
118
+ return {
119
+ id: item.id,
120
+ sourceId: item.sourceId,
121
+ type: item.type,
122
+ title: allowed.has("title") ? item.title : item.type,
123
+ ...filteredText ? { text: filteredText } : {},
124
+ ...allowed.has("owner_activity") ? { ownerAttribution: item.ownerAttribution } : { ownerAttribution: "unknown" },
125
+ ...allowed.has("timestamps") && item.occurredAt !== void 0 ? { occurredAt: item.occurredAt } : {},
126
+ ...allowed.has("timestamps") && item.modifiedAt !== void 0 ? { modifiedAt: item.modifiedAt } : {},
127
+ ...allowed.has("timestamps") && item.startsAt !== void 0 ? { startsAt: item.startsAt } : {},
128
+ ...allowed.has("timestamps") && item.endsAt !== void 0 ? { endsAt: item.endsAt } : {},
129
+ ...allowed.has("status") && item.group ? { group: item.group } : {},
130
+ evidenceRef: item.evidenceRef,
131
+ sensitivity: item.sensitivity
132
+ };
133
+ });
134
+ }
48
135
  function connectedItemsForUnderstanding(items) {
49
136
  return [...items].sort((left, right) => Number(right.itemType === "connected_content") - Number(left.itemType === "connected_content")).slice(0, MAX_CONNECTED_ITEMS).flatMap((item) => {
50
137
  const value = normalizedValue(item);
@@ -67,7 +154,7 @@ function connectedItemsForUnderstanding(items) {
67
154
  });
68
155
  }
69
156
  function isPortraitCandidate(candidate) {
70
- return candidate.category === "preference" || candidate.category === "routine" || candidate.category === "communication";
157
+ return candidate.category === "role" || candidate.category === "responsibility" || candidate.category === "capability" || candidate.category === "preference" || candidate.category === "routine" || candidate.category === "communication";
71
158
  }
72
159
  function durableEvidence(candidate, items) {
73
160
  const evidence = [...new Set(candidate.evidenceRefs ?? [])].flatMap((ref) => items.get(ref) ?? []);
@@ -75,6 +162,23 @@ function durableEvidence(candidate, items) {
75
162
  const dates = new Set(evidence.map((item) => item.occurredAt ?? item.modifiedAt).filter((value) => value !== void 0).map((value) => new Date(value).toISOString().slice(0, 10)));
76
163
  return candidate.confidence === "high" && evidence.every((item) => item.ownerAttribution === "user") && evidence.length >= required && dates.size >= required ? evidence : [];
77
164
  }
165
+ function candidatePolicy(candidate) {
166
+ const statement = candidate.statement.toLocaleLowerCase();
167
+ const sensitivityCategories = [
168
+ ["health", /\b(health|medical|diagnos|medication|therapy|disability)\b|健康|疾病|诊断|用药|治疗|残疾/i],
169
+ ["financial", /\b(salary|income|debt|bank|account balance|credit card)\b|工资|收入|债务|银行|余额|信用卡/i],
170
+ ["political", /\b(political|party|election|vote[dr]?)\b|政治|政党|选举|投票/i],
171
+ ["religious", /\b(religio|church|mosque|temple|faith)\b|宗教|教会|清真寺|寺庙|信仰/i],
172
+ ["sexuality", /\b(sexual|orientation|gender identity)\b|性取向|性别认同/i],
173
+ ["trauma", /\b(trauma|abuse|assault)\b|创伤|虐待|侵害/i],
174
+ ["credential", /\b(password|secret key|api key|token)\b|密码|密钥|令牌/i]
175
+ ].filter(([, pattern]) => pattern.test(statement)).map(([name]) => name);
176
+ return {
177
+ domain: candidate.category === "role" ? "identity" : candidate.category === "responsibility" ? "goals" : candidate.category === "capability" ? "capabilities" : candidate.category === "routine" ? "behavior" : "preferences",
178
+ sensitivity: sensitivityCategories.length ? sensitivityCategories.includes("health") || sensitivityCategories.includes("financial") ? "regulated" : "personal" : "normal",
179
+ sensitivityCategories
180
+ };
181
+ }
78
182
  async function deriveConnectedSourceUnderstanding(input) {
79
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);
80
184
  const items = connectedItemsForUnderstanding(sourceItems);
@@ -91,14 +195,23 @@ async function deriveConnectedSourceUnderstanding(input) {
91
195
  status: "completed"
92
196
  };
93
197
  }
198
+ const sourceRun = getUnderstandingSourceRun(input.sourceRunId);
199
+ const consentReceipt = sourceRun ? getActiveUnderstandingConsent(sourceRun.grantId) ?? void 0 : void 0;
200
+ const modelItems = itemsAllowedByConsent(items, consentReceipt);
201
+ recordConnectedSourceObservations({
202
+ items: sourceItems,
203
+ consent: consentReceipt,
204
+ sourceGrantId: sourceRun?.grantId
205
+ });
206
+ const effectiveProcessingPolicy = input.processingPolicy === "remote_allowed" && consentReceipt?.processingPolicy === "remote_allowed" ? "remote_allowed" : "local_only";
94
207
  const extraction = claimRegisteredExtraction({
95
208
  extractorId: "connector-semantic",
96
209
  sourceRef: `understanding-source-run:${input.sourceRunId}`,
97
210
  contentForHash: sourceItems.map((item) => `${item.id}:${item.contentHash}`).join("\n"),
98
- processingPolicy: input.processingPolicy,
211
+ processingPolicy: effectiveProcessingPolicy,
99
212
  destination: "remote_model"
100
213
  });
101
- if (!allowsRemoteSourceProcessing([input.processingPolicy]) || !extraction.shouldExecute) return {
214
+ if (!allowsRemoteSourceProcessing([effectiveProcessingPolicy]) || !extraction.shouldExecute) return {
102
215
  created: 0,
103
216
  knowledgeCount: 0,
104
217
  status: "completed"
@@ -106,16 +219,17 @@ async function deriveConnectedSourceUnderstanding(input) {
106
219
  try {
107
220
  const analysis = await (input.analyze ?? analyzeUnderstandingSources)({
108
221
  config: input.config,
109
- items
222
+ items: modelItems
110
223
  });
111
224
  input.assertAuthorized?.();
112
- const byRef = new Map(items.map((item) => [item.evidenceRef, item]));
225
+ const byRef = new Map(modelItems.map((item) => [item.evidenceRef, item]));
113
226
  const outputs = [];
114
227
  let created = 0;
115
228
  for (const candidate of analysis.profileCandidates.filter(isPortraitCandidate)) {
229
+ const policy = candidatePolicy(candidate);
116
230
  const evidenceItems = durableEvidence(candidate, byRef);
117
231
  const candidateKey = `connected-profile:${candidate.category}:${candidate.factKey}`;
118
- if (!evidenceItems.length) {
232
+ if (!evidenceItems.length || !consentReceipt || !consentReceipt.allowedDomains.includes(policy.domain) || consentReceipt.deniedDomains.includes(policy.domain)) {
119
233
  outputs.push({
120
234
  candidateKey,
121
235
  outcome: "rejected"
@@ -141,7 +255,7 @@ async function deriveConnectedSourceUnderstanding(input) {
141
255
  predicate: `${candidate.category}.connected.${candidate.factKey}`,
142
256
  cardinality: "single",
143
257
  scope: { type: "global" },
144
- kind: candidate.category === "communication" ? "preference" : candidate.category,
258
+ kind: candidate.category === "role" ? "identity" : candidate.category === "responsibility" ? "derived_insight" : candidate.category === "communication" ? "preference" : candidate.category,
145
259
  value: candidate.statement,
146
260
  normalizedValue: candidate.statement.toLocaleLowerCase(),
147
261
  statement: candidate.statement,
@@ -151,7 +265,18 @@ async function deriveConnectedSourceUnderstanding(input) {
151
265
  consequence: "medium",
152
266
  actionability: .6,
153
267
  volatility: candidate.category === "routine" || candidate.category === "communication" ? "slow" : "stable",
154
- sensitivity: "normal",
268
+ sensitivity: policy.sensitivity,
269
+ domain: policy.domain,
270
+ layer: "pattern",
271
+ sensitivityCategories: policy.sensitivityCategories,
272
+ purposeIds: ["personalization", "work_assistance"],
273
+ allowedUses: [
274
+ "answer",
275
+ "rank",
276
+ "recommend"
277
+ ],
278
+ allowedAgentIds: consentReceipt.allowedAgentIds,
279
+ consentReceiptId: consentReceipt.id,
155
280
  disclosurePolicy: "referenceable",
156
281
  observedAt: evidenceItem.occurredAt ?? evidenceItem.modifiedAt ?? Date.now(),
157
282
  createdBy: "connector",
@@ -182,6 +307,71 @@ async function deriveConnectedSourceUnderstanding(input) {
182
307
  });
183
308
  continue;
184
309
  }
310
+ const goalEvidence = evidenceRefs.flatMap((ref) => {
311
+ const item = byRef.get(ref);
312
+ return item?.ownerAttribution === "user" ? [item] : [];
313
+ });
314
+ if (consentReceipt?.allowedDomains.includes("goals") && !consentReceipt.deniedDomains.includes("goals") && thread.confidence !== "low" && goalEvidence.length) {
315
+ const observedAt = Math.max(...goalEvidence.map((item) => item.occurredAt ?? item.modifiedAt ?? Date.now()));
316
+ const validityDays = thread.horizon === "current" ? 30 : thread.horizon === "ongoing" ? 90 : 365;
317
+ let goalCreated = false;
318
+ for (const evidenceItem of goalEvidence) {
319
+ const evidence = createContextEvidence({
320
+ sourceType: "connector",
321
+ sourceInstanceId: input.sourceInstanceId,
322
+ sourceRef: evidenceItem.evidenceRef,
323
+ redactedExcerpt: evidenceItem.title.slice(0, 600),
324
+ trustLevel: "owner",
325
+ observedAt: evidenceItem.occurredAt ?? evidenceItem.modifiedAt ?? observedAt
326
+ });
327
+ const result = reconcileAssertion({
328
+ subject: {
329
+ type: "goal",
330
+ id: thread.topicKey
331
+ },
332
+ predicate: "goal.connected.current_state",
333
+ cardinality: "single",
334
+ scope: { type: "global" },
335
+ kind: "current_state",
336
+ value: {
337
+ title: thread.title,
338
+ summary: thread.summary,
339
+ status: thread.status
340
+ },
341
+ normalizedValue: `${thread.status}:${thread.title}:${thread.summary}`.toLocaleLowerCase(),
342
+ statement: `${thread.title}: ${thread.summary}`,
343
+ authority: "user_observed",
344
+ confidence: thread.confidence === "high" ? .9 : .72,
345
+ inferredImportance: thread.horizon === "current" ? .8 : .65,
346
+ consequence: "medium",
347
+ actionability: .85,
348
+ volatility: "event",
349
+ sensitivity: "normal",
350
+ domain: "goals",
351
+ layer: "fact",
352
+ sensitivityCategories: [],
353
+ purposeIds: ["personalization", "work_assistance"],
354
+ allowedUses: [
355
+ "answer",
356
+ "rank",
357
+ "recommend",
358
+ "remind"
359
+ ],
360
+ allowedAgentIds: consentReceipt.allowedAgentIds,
361
+ consentReceiptId: consentReceipt.id,
362
+ disclosurePolicy: "referenceable",
363
+ observedAt,
364
+ validFrom: observedAt,
365
+ validTo: observedAt + validityDays * 864e5,
366
+ reviewAt: observedAt + Math.min(validityDays, 14) * 864e5,
367
+ createdBy: "connector",
368
+ evidenceId: evidence.id,
369
+ evidenceConfidence: thread.confidence === "high" ? .9 : .72
370
+ });
371
+ goalCreated ||= result.action === "created" || result.action === "superseded";
372
+ }
373
+ if (goalCreated) created += 1;
374
+ }
185
375
  const result = writeKnowledgeItem({
186
376
  kind: "work_thread",
187
377
  scope: { type: "global" },
@@ -3,19 +3,18 @@ import { init_logger } from "../utils/logger.js";
3
3
  import { claimNextConnectorLearningJob, enqueueConnectorLearningJob, listConnectorLearningJobs, recoverStaleConnectorLearningJobs, setConnectorLearningPaused, updateConnectorLearningJob } from "../storage/sqlite/connector-learning-repository.js";
4
4
  import { getConnectorAccount, reconcileConnectorAccount } from "../storage/sqlite/connector-account-repository.js";
5
5
  import { getConnectorInstallation, listConnectorConnections, upsertConnectorConnection } from "../storage/sqlite/connector-repository.js";
6
+ import { pruneBoundedKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
6
7
  import { getConnectorSyncPolicyForConnection } from "../storage/sqlite/connector-sync-policy-repository.js";
7
8
  import { init_sqlite } from "../storage/sqlite/index.js";
8
9
  import { connectorIdentityKey, normalizeConnectorIdentity } from "./connector-identity.js";
9
10
  import { ComposioSessionsAdapter } from "./composio-sessions.js";
10
11
  import { buildConnectorLearningArguments, getConnectorLearningPlan } from "./learning-recipes.js";
11
12
  import { getConnectorDefinition } from "./catalog.js";
12
- import { getWorkspacePath } from "../config/workspace-path-helpers.js";
13
- import { ConnectedKnowledgePipeline } from "../knowledge/connected-knowledge-pipeline.js";
14
- import "../knowledge/index.js";
15
13
  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
- import { getConnectorUnderstandingSourceRun, getOrCreateConnectorUnderstandingSourceRun, getUnderstandingSourceGrant, listUnderstandingSourceGrants, updateUnderstandingSourceGrantCheckpoint, updateUnderstandingSourceRun, upsertUnderstandingSourceGrant } from "../user-context/sources/repository.js";
19
18
  //#region src/connectors/learning-coordinator.ts
20
19
  init_sqlite();
21
20
  init_logger();
@@ -33,25 +32,60 @@ function connectorSourceCategory(toolkit) {
33
32
  if (toolkit === "github" || toolkit === "linear") return "code_activity";
34
33
  return "files";
35
34
  }
36
- function ensureUnderstandingSourceRun(job, toolkit, displayName) {
35
+ function ensureUnderstandingSourceRun(job, toolkit, displayName, config) {
37
36
  const existing = listUnderstandingSourceGrants({ includeRevoked: true }).find((grant) => grant.sourceKey === `connector-account:${job.accountId}`);
38
37
  if (existing?.status === "revoked") throw new Error("Source authorization was revoked.");
38
+ const grant = existing ?? upsertUnderstandingSourceGrant({
39
+ sourceKey: `connector-account:${job.accountId}`,
40
+ adapterId: `connector:${job.connectorId}`,
41
+ category: connectorSourceCategory(toolkit),
42
+ platform: "all",
43
+ displayName,
44
+ accessMode: "continuous",
45
+ retentionPolicy: config.userContext.userModel.processingPolicy === "remote_allowed" ? "derived_only" : "bounded_raw",
46
+ processingPolicy: config.userContext.userModel.processingPolicy,
47
+ config: {
48
+ connectorId: job.connectorId,
49
+ accountId: job.accountId,
50
+ readOnly: true
51
+ }
52
+ });
53
+ if (!getActiveUnderstandingConsent(grant.id)) grantUnderstandingConsent({
54
+ grantId: grant.id,
55
+ purposes: ["personalization", "work_assistance"],
56
+ allowedDomains: [
57
+ "identity",
58
+ "goals",
59
+ "capabilities",
60
+ "behavior",
61
+ "preferences",
62
+ "relationships",
63
+ "environment",
64
+ "digital_life"
65
+ ],
66
+ deniedDomains: [
67
+ "health",
68
+ "emotion",
69
+ "life_history",
70
+ "resources_constraints"
71
+ ],
72
+ allowedFields: [
73
+ "title",
74
+ "content",
75
+ "timestamps",
76
+ "participants",
77
+ "owner_activity",
78
+ "status"
79
+ ],
80
+ accessMode: grant.accessMode,
81
+ lookbackDays: getConnectorLearningPlan(toolkit)?.bootstrapWindowDays ?? 30,
82
+ rawRetentionDays: grant.retentionPolicy === "bounded_raw" ? 7 : 0,
83
+ processingPolicy: grant.processingPolicy,
84
+ allowedAgentIds: [job.agentId],
85
+ disclosureVersion: "connector-understanding-v1"
86
+ });
39
87
  return getOrCreateConnectorUnderstandingSourceRun({
40
- grantId: (existing ?? upsertUnderstandingSourceGrant({
41
- sourceKey: `connector-account:${job.accountId}`,
42
- adapterId: `connector:${job.connectorId}`,
43
- category: connectorSourceCategory(toolkit),
44
- platform: "all",
45
- displayName,
46
- accessMode: "continuous",
47
- retentionPolicy: "bounded_raw",
48
- processingPolicy: "remote_allowed",
49
- config: {
50
- connectorId: job.connectorId,
51
- accountId: job.accountId,
52
- readOnly: true
53
- }
54
- })).id,
88
+ grantId: grant.id,
55
89
  connectorLearningJobId: job.id,
56
90
  kind: job.mode,
57
91
  status: "queued",
@@ -105,7 +139,7 @@ function startConnectorLearningCoordinator(options) {
105
139
  idempotencyKey: request.idempotencyKey ?? (mode === "bootstrap" ? `bootstrap:${connection.accountId}:v1` : `incremental:${connection.accountId}:${request.reason ?? "manual"}:${bucket}`),
106
140
  nextRunAt: request.nextRunAt
107
141
  });
108
- ensureUnderstandingSourceRun(job, definition.runtime.toolkit, definition.displayName);
142
+ ensureUnderstandingSourceRun(job, definition.runtime.toolkit, definition.displayName, options.getConfig());
109
143
  publish(job);
110
144
  queueMicrotask(() => void runNow());
111
145
  return job;
@@ -123,7 +157,7 @@ function startConnectorLearningCoordinator(options) {
123
157
  if (definition?.runtime.type !== "composio" || definition.runtime.role !== "toolkit") throw new Error(`Connector learning is unavailable for ${job.connectorId}.`);
124
158
  const plan = getConnectorLearningPlan(definition.runtime.toolkit);
125
159
  if (!plan) throw new Error(`Connector learning has no plan for ${definition.runtime.toolkit}.`);
126
- const sourceRun = ensureUnderstandingSourceRun(job, plan.toolkit, definition.displayName);
160
+ const sourceRun = ensureUnderstandingSourceRun(job, plan.toolkit, definition.displayName, options.getConfig());
127
161
  updateUnderstandingSourceRun(sourceRun.id, { status: "running" });
128
162
  let connection = listConnectorConnections().find((candidate) => candidate.id === job.connectionId);
129
163
  if (!connection) throw new Error("Connector account no longer exists.");
@@ -286,10 +320,13 @@ function startConnectorLearningCoordinator(options) {
286
320
  lastCollectedAt: Date.now()
287
321
  });
288
322
  publish(completed);
289
- const retention = new ConnectedKnowledgePipeline({
290
- agentId: job.agentId,
291
- workspaceId: getWorkspacePath(options.getConfig())
292
- }).pruneBoundedRetention(job.sourceInstanceId, Date.now() - plan.bootstrapWindowDays * 24 * 60 * 6e4);
323
+ const sourceGrant = getUnderstandingSourceGrant(sourceRun.grantId);
324
+ const activeConsent = getActiveUnderstandingConsent(sourceRun.grantId);
325
+ const rawRetentionDays = sourceGrant?.retentionPolicy === "bounded_raw" ? activeConsent?.rawRetentionDays ?? 7 : 0;
326
+ const retention = {
327
+ rawDeleted: pruneBoundedKnowledgeSourceItems(job.sourceInstanceId, rawRetentionDays === 0 ? Date.now() + 1 : Date.now() - rawRetentionDays * 864e5),
328
+ derivedDeleted: 0
329
+ };
293
330
  if (retention.rawDeleted || retention.derivedDeleted) log.info({
294
331
  jobId: job.id,
295
332
  sourceInstanceId: job.sourceInstanceId,
@@ -12,9 +12,16 @@ function buildConnectorLearningArguments(plan, stream, input, identity) {
12
12
  }
13
13
  if (plan.toolkit === "gmail") {
14
14
  const after = cursor?.checkpoint ? Math.floor(Date.parse(cursor.checkpoint) / 1e3) : NaN;
15
+ const baseQuery = typeof stream.arguments.query === "string" ? stream.arguments.query.trim() : "";
16
+ const incrementalQuery = Number.isFinite(after) ? `after:${after}` : "";
15
17
  return {
16
18
  ...stream.arguments,
17
- ...Number.isFinite(after) ? { query: `after:${after} -in:spam -in:trash` } : {},
19
+ ...baseQuery || incrementalQuery ? { query: [
20
+ baseQuery,
21
+ incrementalQuery,
22
+ "-in:spam",
23
+ "-in:trash"
24
+ ].filter(Boolean).join(" ") } : {},
18
25
  ...cursor?.pageToken ? { page_token: cursor.pageToken } : {}
19
26
  };
20
27
  }
@@ -39,6 +46,16 @@ const PLANS = {
39
46
  toolkit: "gmail",
40
47
  identityProbe: { actionId: "GMAIL_GET_PROFILE" },
41
48
  streams: [{
49
+ scope: "sent-messages",
50
+ actionId: "GMAIL_FETCH_EMAILS",
51
+ kind: "activity",
52
+ arguments: {
53
+ max_results: 30,
54
+ include_payload: true,
55
+ verbose: false,
56
+ query: "in:sent newer_than:30d"
57
+ }
58
+ }, {
42
59
  scope: "messages",
43
60
  actionId: "GMAIL_FETCH_EMAILS",
44
61
  kind: "activity",
@@ -46,7 +63,7 @@ const PLANS = {
46
63
  max_results: 30,
47
64
  include_payload: true,
48
65
  verbose: false,
49
- query: "newer_than:30d -in:spam -in:trash"
66
+ query: "newer_than:30d -in:sent"
50
67
  }
51
68
  }],
52
69
  bootstrapWindowDays: 30,
@@ -1,4 +1,4 @@
1
- import type { DecodedPcmAudio } from '../voice/local/wav.js';
1
+ import type { DecodedPcmAudio } from '../voice/audio/wav.js';
2
2
  export interface AudioRange {
3
3
  startedAtMs: number;
4
4
  endedAtMs: number;
@@ -51,9 +51,7 @@ var DiscussionLiveWorker = class {
51
51
  }
52
52
  resolveConcurrency() {
53
53
  if (this.deps.transcribeSegment) return this.concurrency;
54
- const config = this.deps.getConfig();
55
- const sttConfig = mergeSttConfigFromAppConfig(config.tools?.media?.audio, config.tools?.media);
56
- return sttConfig.provider === "xopc-local" || sttConfig.provider === "local" ? 1 : this.concurrency;
54
+ return this.concurrency;
57
55
  }
58
56
  async processOne() {
59
57
  const segment = claimNextDiscussionTranscriptSegment(this.owner);
@@ -1,11 +1,11 @@
1
1
  import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
2
2
  import { DISCUSSION_MAX_DURATION_MS } from "../../packages/gateway-contract/src/discussions.js";
3
3
  import { init_src } from "../../packages/gateway-contract/src/index.js";
4
- import { decodeWavToMonoFloat32 } from "../voice/local/wav.js";
5
- import { forEachNormalizedAudioSegment } from "../voice/audio/normalize.js";
6
4
  import { resolveNoteMediaDir } from "../notes/paths.js";
7
5
  import { DiscussionServiceError } from "./errors.js";
8
6
  import { getDiscussionCapture, updateDiscussionCapture } from "./repository.js";
7
+ import { decodeWavToMonoFloat32 } from "../voice/audio/wav.js";
8
+ import { forEachNormalizedAudioSegment } from "../voice/audio/normalize.js";
9
9
  import { join } from "node:path";
10
10
  import { createReadStream } from "node:fs";
11
11
  import { createHash, randomUUID } from "node:crypto";
@@ -1,7 +1,5 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { decodeWavToMonoFloat32 } from "../voice/local/wav.js";
4
- import { forEachNormalizedAudioSegment } from "../voice/audio/normalize.js";
5
3
  import { transcribe } from "../voice/stt/transcribe-core.js";
6
4
  import { isSTTAvailable } from "../voice/stt/availability.js";
7
5
  import { mergeSttConfigFromAppConfig } from "../voice/stt/config.js";
@@ -10,6 +8,8 @@ import { getDiscussionCapture, listDiscussionCaptures, listDiscussionTranscriptS
10
8
  import { assembleDiscussionTranscript } from "./transcript.js";
11
9
  import { replaceTranscriptSegments, saveTranscriptRevision } from "./revisions.js";
12
10
  import { missingAudioRanges, slicePcmWav } from "./audio-repair.js";
11
+ import { decodeWavToMonoFloat32 } from "../voice/audio/wav.js";
12
+ import { forEachNormalizedAudioSegment } from "../voice/audio/normalize.js";
13
13
  import { getRecordingJob } from "./recordingJobs.js";
14
14
  import { createHash } from "node:crypto";
15
15
  //#region src/discussions/sealer.ts
@@ -22,6 +22,8 @@ declare const bindingSchema: z.ZodObject<{
22
22
  }, z.core.$strict>>;
23
23
  }, z.core.$strict>;
24
24
  export type PluginAuthBinding = z.infer<typeof bindingSchema>;
25
+ export declare const pluginCredentialProviderPrefix: (id: string) => string;
26
+ export declare const parsePluginAuthBinding: (value: unknown) => PluginAuthBinding;
25
27
  export declare function pluginEndpointFingerprint(server: PluginServer): string;
26
28
  export declare function readPluginAuthBinding(store: AgentPluginStore, id: string, name: string, server: PluginServer): PluginAuthBinding | undefined;
27
29
  export declare function savePluginAuthBinding(store: AgentPluginStore, id: string, name: string, input: {
@@ -34,6 +36,4 @@ export declare function savePluginAuthBinding(store: AgentPluginStore, id: strin
34
36
  }>;
35
37
  }): Promise<void>;
36
38
  export declare function applyPluginAuthBinding(raw: Record<string, unknown>, binding: PluginAuthBinding | undefined): Record<string, unknown>;
37
- export declare function pluginOAuthScope(raw: unknown): string | undefined;
38
- export declare function removePluginCredentials(store: AgentPluginStore, id: string): Promise<void>;
39
39
  export {};
@@ -1,12 +1,11 @@
1
1
  import { init_paths_state, resolveStateDir } from "../../config/paths-state.js";
2
2
  import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
3
3
  import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
4
- import { pluginName, pluginServerId } from "./validation.js";
4
+ import { pluginName } from "./validation.js";
5
5
  import { clearPluginMcpHealth } from "./health.js";
6
6
  import { isDangerousHostEnvVarName } from "../../infra/host-env-security.js";
7
- import { McpOAuthStore } from "../../agent/mcp/oauth/mcp-oauth-store.js";
8
7
  import { join } from "node:path";
9
- import { existsSync, readFileSync, readdirSync, rmSync } from "node:fs";
8
+ import { existsSync, readFileSync } from "node:fs";
10
9
  import { createHash } from "node:crypto";
11
10
  import { z } from "zod";
12
11
  import { validateHeaderName } from "node:http";
@@ -32,7 +31,8 @@ const bindingSchema = z.strictObject({
32
31
  }))
33
32
  });
34
33
  const hash = (value) => createHash("sha256").update(value).digest("hex");
35
- const providerPrefix = (id) => `plugin-${hash(id).slice(0, 16)}-`;
34
+ const pluginCredentialProviderPrefix = (id) => `plugin-${hash(id).slice(0, 16)}-`;
35
+ const parsePluginAuthBinding = (value) => bindingSchema.parse(value);
36
36
  function pluginEndpointFingerprint(server) {
37
37
  return hash(server.type === "stdio" ? JSON.stringify(server) : new URL(server.url).toString());
38
38
  }
@@ -71,7 +71,7 @@ async function savePluginAuthBinding(store, id, name, input) {
71
71
  const normalizedKey = field.target === "headers" || process.platform === "win32" ? field.key.toLowerCase() : field.key;
72
72
  if (seen.has(normalizedKey)) throw new Error("Duplicate credential field");
73
73
  seen.add(normalizedKey);
74
- const provider = `${providerPrefix(id)}${hash(JSON.stringify([
74
+ const provider = `${pluginCredentialProviderPrefix(id)}${hash(JSON.stringify([
75
75
  "owner",
76
76
  id,
77
77
  name,
@@ -123,34 +123,5 @@ function applyPluginAuthBinding(raw, binding) {
123
123
  result.xopcAuthRevision = hash(JSON.stringify(binding));
124
124
  return result;
125
125
  }
126
- function pluginOAuthScope(raw) {
127
- const plugin = raw?.xopcPlugin;
128
- return plugin ? `owner:${pluginServerId(plugin.id, plugin.serverName)}` : void 0;
129
- }
130
- async function removePluginCredentials(store, id) {
131
- pluginName.parse(id);
132
- const plugin = store.get(id);
133
- const serverNames = new Set(Object.keys(plugin?.servers ?? {}));
134
- const dir = join(store.stateDir, "plugin-auth", id);
135
- if (existsSync(dir)) for (const file of readdirSync(dir)) {
136
- if (!/^[a-f0-9]{64}\.json$/.test(file)) throw new Error("Unexpected plugin auth store entry");
137
- const binding = bindingSchema.parse(JSON.parse(readFileSync(join(dir, file), "utf8")));
138
- serverNames.add(binding.serverName);
139
- }
140
- const { getMcpOAuthManager } = await import("../../agent/mcp/oauth/mcp-oauth-manager.js");
141
- for (const name of serverNames) {
142
- await getMcpOAuthManager({ xopcPlugin: {
143
- id,
144
- serverName: name
145
- } }).cancelPending();
146
- await new McpOAuthStore(`owner:${pluginServerId(id, name)}`).deleteScope();
147
- }
148
- const resolver = new CredentialResolver(store.stateDir === resolveStateDir() ? {} : { stateDir: store.stateDir });
149
- for (const profile of await resolver.listProfiles()) if (profile.provider.startsWith(providerPrefix(id))) await resolver.deleteProviderCredential(profile.provider);
150
- if (existsSync(dir)) rmSync(dir, {
151
- recursive: true,
152
- force: true
153
- });
154
- }
155
126
  //#endregion
156
- export { applyPluginAuthBinding, pluginEndpointFingerprint, pluginOAuthScope, readPluginAuthBinding, removePluginCredentials, savePluginAuthBinding };
127
+ export { applyPluginAuthBinding, parsePluginAuthBinding, pluginCredentialProviderPrefix, pluginEndpointFingerprint, readPluginAuthBinding, savePluginAuthBinding };
@@ -0,0 +1,2 @@
1
+ import { AgentPluginStore } from './store.js';
2
+ export declare function removePluginCredentials(store: AgentPluginStore, id: string): Promise<void>;
@@ -0,0 +1,37 @@
1
+ import { init_paths_state, resolveStateDir } from "../../config/paths-state.js";
2
+ import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
3
+ import { pluginName, pluginServerId } from "./validation.js";
4
+ import { parsePluginAuthBinding, pluginCredentialProviderPrefix } from "./auth.js";
5
+ import { McpOAuthStore } from "../../agent/mcp/oauth/mcp-oauth-store.js";
6
+ import { getMcpOAuthManager } from "../../agent/mcp/oauth/mcp-oauth-manager.js";
7
+ import { join } from "node:path";
8
+ import { existsSync, readFileSync, readdirSync, rmSync } from "node:fs";
9
+ //#region src/extensions/agent-plugins/credentials.ts
10
+ init_credentials();
11
+ init_paths_state();
12
+ async function removePluginCredentials(store, id) {
13
+ pluginName.parse(id);
14
+ const plugin = store.get(id);
15
+ const serverNames = new Set(Object.keys(plugin?.servers ?? {}));
16
+ const dir = join(store.stateDir, "plugin-auth", id);
17
+ if (existsSync(dir)) for (const file of readdirSync(dir)) {
18
+ if (!/^[a-f0-9]{64}\.json$/.test(file)) throw new Error("Unexpected plugin auth store entry");
19
+ const binding = parsePluginAuthBinding(JSON.parse(readFileSync(join(dir, file), "utf8")));
20
+ serverNames.add(binding.serverName);
21
+ }
22
+ for (const name of serverNames) {
23
+ await getMcpOAuthManager({ xopcPlugin: {
24
+ id,
25
+ serverName: name
26
+ } }).cancelPending();
27
+ await new McpOAuthStore(`owner:${pluginServerId(id, name)}`).deleteScope();
28
+ }
29
+ const resolver = new CredentialResolver(store.stateDir === resolveStateDir() ? {} : { stateDir: store.stateDir });
30
+ for (const profile of await resolver.listProfiles()) if (profile.provider.startsWith(pluginCredentialProviderPrefix(id))) await resolver.deleteProviderCredential(profile.provider);
31
+ if (existsSync(dir)) rmSync(dir, {
32
+ recursive: true,
33
+ force: true
34
+ });
35
+ }
36
+ //#endregion
37
+ export { removePluginCredentials };
@@ -0,0 +1 @@
1
+ export declare function pluginOAuthScope(raw: unknown): string | undefined;
@@ -0,0 +1,8 @@
1
+ import { pluginServerId } from "./validation.js";
2
+ //#region src/extensions/agent-plugins/plugin-oauth-scope.ts
3
+ function pluginOAuthScope(raw) {
4
+ const plugin = raw?.xopcPlugin;
5
+ return plugin ? `owner:${pluginServerId(plugin.id, plugin.serverName)}` : void 0;
6
+ }
7
+ //#endregion
8
+ export { pluginOAuthScope };