@xopcai/xopc 0.0.210 → 0.0.213

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 (326) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{activity-store-JLmEb1p0.js → activity-store-Xw-pOm9A.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CI1zQfzY.js → agent-avatar-dicebear-Ca1bciiK.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents-DD3TqNrC.js +68 -0
  6. package/dist/gateway/static/root/assets/{api-C6MmWfcb.js → api-CZK-lRew.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-Cd02GGpV.js → app-management-settings-panel-BLFIG09j.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-Db-h2I3G.js → appearance-settings-BsTWUq1i.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-cJkDKn72.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-CMHzJT2a.js → archive-plugin-B9LsFfEx.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-BzhI2LoH.js → attachment-load-CsWiFfmN.js} +1 -1
  12. package/dist/gateway/static/root/assets/automations-page-CbjU2e75.js +1 -0
  13. package/dist/gateway/static/root/assets/automations-workspace-C4xyo0c4.js +6 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-DsUeHvZO.js → binary-plugins-DbqhT_JB.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-CFfsIeZ4.js → block-editor-BGpHwxZ5.js} +4 -4
  16. package/dist/gateway/static/root/assets/browser-settings-page-CrhpQl-e.js +8 -0
  17. package/dist/gateway/static/root/assets/{browser-workflow-inputs-BiWghvJ0.js → browser-workflow-inputs-BXlon_hL.js} +1 -1
  18. package/dist/gateway/static/root/assets/{browser-workflows-page-DPLdT6Zn.js → browser-workflows-page-B3BBDM_r.js} +2 -2
  19. package/dist/gateway/static/root/assets/capabilities-settings-panel-B9MoPW9u.js +7 -0
  20. package/dist/gateway/static/root/assets/{capability-presets-api-CTxGFvsS.js → capability-presets-api-BqvMm6UW.js} +1 -1
  21. package/dist/gateway/static/root/assets/capability-presets-settings-panel-BmwldV9R.js +3 -0
  22. package/dist/gateway/static/root/assets/{channel-recipient-api-BklVUOxC.js → channel-recipient-api-9uca5kDa.js} +1 -1
  23. package/dist/gateway/static/root/assets/channels-settings-CwLqWcy_.js +1 -0
  24. package/dist/gateway/static/root/assets/channels-status-swr-DeBw3du9.js +1 -0
  25. package/dist/gateway/static/root/assets/{chat-terminal-dock-0F4Jmma2.js → chat-terminal-dock-DJjYT3WX.js} +2 -2
  26. package/dist/gateway/static/root/assets/{chunk-KS7C4IRE-BMhrPKJC.js → chunk-KS7C4IRE-BaASWQor.js} +1 -1
  27. package/dist/gateway/static/root/assets/{connectors-api-BvIZ51ty.js → connectors-api-XCLfuDrN.js} +1 -1
  28. package/dist/gateway/static/root/assets/connectors-page-CVkGtcMS.js +2 -0
  29. package/dist/gateway/static/root/assets/{cron-expression-BHmwaMbO.js → cron-expression-DzQN7zBR.js} +1 -1
  30. package/dist/gateway/static/root/assets/{date-picker-fj_pPCv5.js → date-picker-B-r5O5qd.js} +1 -1
  31. package/dist/gateway/static/root/assets/{dependency-picker-DsWvwOv-.js → dependency-picker-Ch2XBU2s.js} +1 -1
  32. package/dist/gateway/static/root/assets/{desktop-pet-mjkF0Xxh.js → desktop-pet-BdjX8jde.js} +1 -1
  33. package/dist/gateway/static/root/assets/{desktop-pet-settings-ClwUpRYu.js → desktop-pet-settings-CzjjgMMn.js} +1 -1
  34. package/dist/gateway/static/root/assets/directory-picker-path-field-BCTgGTk4.js +1 -0
  35. package/dist/gateway/static/root/assets/{extension-debug-page-DC69wplH.js → extension-debug-page-6OGgOucD.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-page-DCtk6zdJ.js → extension-page-Cf6MUfCF.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-settings-page-Bkm4zzv-.js → extension-settings-page-pSY_ZvQZ.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-config-api-Dr_NQt7v.js → gateway-config-api-CFJMng9v.js} +1 -1
  39. package/dist/gateway/static/root/assets/{gateway-config-swr-CEfv8N1J.js → gateway-config-swr-DpiY6aub.js} +1 -1
  40. package/dist/gateway/static/root/assets/gateway-settings-aQYxNePf.js +1 -0
  41. package/dist/gateway/static/root/assets/{gateway-startup-retry-B8hebJ7s.js → gateway-startup-retry-BZ_6ChP4.js} +1 -1
  42. package/dist/gateway/static/root/assets/heartbeat-settings-CI33q9i1.js +1 -0
  43. package/dist/gateway/static/root/assets/home-page-CAIaWs6r.js +1 -0
  44. package/dist/gateway/static/root/assets/image-generation-api-DPndEWOU.js +1 -0
  45. package/dist/gateway/static/root/assets/index-BhstAl5i.js +108 -0
  46. package/dist/gateway/static/root/assets/index-DQzjgIkQ.css +2 -0
  47. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DCQvf05d.js → keyboard-shortcuts-settings-CbLJRGXR.js} +1 -1
  48. package/dist/gateway/static/root/assets/local-app-workbench-page-BqFnCaKT.js +2 -0
  49. package/dist/gateway/static/root/assets/{local-apps-page-B3Ugd0my.js → local-apps-page-Crf6c3SK.js} +1 -1
  50. package/dist/gateway/static/root/assets/{locale-store-hDBVeG3G.js → locale-store-BYSRjM6g.js} +1 -1
  51. package/dist/gateway/static/root/assets/{logs-page-nXdF3wOT.js → logs-page-BpfLQWex.js} +2 -2
  52. package/dist/gateway/static/root/assets/{management-settings-C-S5Llq3.js → management-settings-mxyYWKgM.js} +1 -1
  53. package/dist/gateway/static/root/assets/{markdown-split-DuVq37Uh.js → markdown-split-kZaPrUTM.js} +1 -1
  54. package/dist/gateway/static/root/assets/markdown-view-DD_PgVue.css +1 -0
  55. package/dist/gateway/static/root/assets/{markdown-view-D8eO_6h3.js → markdown-view-DlsczsQ1.js} +1 -1
  56. package/dist/gateway/static/root/assets/{media-plugins-C1V6pkX3.js → media-plugins-Dk67jaG6.js} +1 -1
  57. package/dist/gateway/static/root/assets/messages-DyM8OOVG.js +3 -0
  58. package/dist/gateway/static/root/assets/notes-api-DaeeQw8A.js +1 -0
  59. package/dist/gateway/static/root/assets/{notes-page-Dn71ZV8c.js → notes-page-CQDzw8fX.js} +1 -1
  60. package/dist/gateway/static/root/assets/notes-workbench-BYiROmRJ.js +4 -0
  61. package/dist/gateway/static/root/assets/{page-tabs-B5a5aSoS.js → page-tabs-C4UkhX2U.js} +1 -1
  62. package/dist/gateway/static/root/assets/{preview-open-alternatives-5041AIBX.js → preview-open-alternatives-nzcjh6y0.js} +1 -1
  63. package/dist/gateway/static/root/assets/{product-open-page-7UkouFQU.js → product-open-page-3FvW5cHm.js} +1 -1
  64. package/dist/gateway/static/root/assets/project-detail-page-p45i1sMj.js +1 -0
  65. package/dist/gateway/static/root/assets/projects-page-Y9yXB4DX.js +1 -0
  66. package/dist/gateway/static/root/assets/registry-api-Bu6OGEY2.js +2 -0
  67. package/dist/gateway/static/root/assets/remote-access-hub-CNsGY0VS.js +1 -0
  68. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-DvaXzHYS.js → runtime-tools-settings-panel-CVqPSfUb.js} +2 -2
  69. package/dist/gateway/static/root/assets/{schema-form-Dlxl_5X0.js → schema-form-Dz6eZpqv.js} +1 -1
  70. package/dist/gateway/static/root/assets/sessions-page-BAtpgb1t.js +1 -0
  71. package/dist/gateway/static/root/assets/settings-advanced-gate-pgBQ21Oe.js +1 -0
  72. package/dist/gateway/static/root/assets/{settings-form-section-CSaiuuer.js → settings-form-section-BaWFAZv4.js} +1 -1
  73. package/dist/gateway/static/root/assets/{settings-loading-skeleton-H3mJwt3r.js → settings-loading-skeleton-BWmdZfNg.js} +1 -1
  74. package/dist/gateway/static/root/assets/{settings-page-Cs7zA4BS.js → settings-page-Btcb-Dc8.js} +1 -1
  75. package/dist/gateway/static/root/assets/setup-status-panel-BNllZUFP.js +1 -0
  76. package/dist/gateway/static/root/assets/{share-preview-page-Bdpw5m7M.js → share-preview-page-CGzY3S0N.js} +1 -1
  77. package/dist/gateway/static/root/assets/shares-settings-CncwbTHY.js +1 -0
  78. package/dist/gateway/static/root/assets/skill-reload-api-CcW2dhSW.js +1 -0
  79. package/dist/gateway/static/root/assets/{skills-page-Bup3Lg1Z.js → skills-page-Bi2IWpU0.js} +1 -1
  80. package/dist/gateway/static/root/assets/{skills-page.utils-D22ORR21.js → skills-page.utils-BancvwN2.js} +1 -1
  81. package/dist/gateway/static/root/assets/{system-settings-panel-GmtWsfjB.js → system-settings-panel-CihjIzWx.js} +1 -1
  82. package/dist/gateway/static/root/assets/task-detail-page-SSNFtY-d.js +1 -0
  83. package/dist/gateway/static/root/assets/{theme-store-CtY8RwMX.js → theme-store-D1_t_31B.js} +1 -1
  84. package/dist/gateway/static/root/assets/{typed-models-lib-C2aOdlEA.js → typed-models-lib-C2LhiQq5.js} +1 -1
  85. package/dist/gateway/static/root/assets/{use-autosave-DOj5i8d_.js → use-autosave-tf_8rxAK.js} +1 -1
  86. package/dist/gateway/static/root/assets/user-context-page-BnPTFEar.js +1 -0
  87. package/dist/gateway/static/root/assets/{voice-api-key-field-5WfurWYa.js → voice-api-key-field-DN-y7Zfe.js} +1 -1
  88. package/dist/gateway/static/root/assets/work-discovery-overlay-bqqH4aZ9.js +1 -0
  89. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-bBA8LinI.js → workflow-run-setup-panel-2H33iXOB.js} +2 -2
  90. package/dist/gateway/static/root/assets/workflows-page-BnfxRf1q.js +5 -0
  91. package/dist/gateway/static/root/index.html +13 -11
  92. package/dist/package.js +1 -1
  93. package/dist/src/agent/agent-manager.js +1 -1
  94. package/dist/src/agent/image/generation/providers/xopc-cloud.js +2 -1
  95. package/dist/src/agent/image/tool-model-config.js +15 -9
  96. package/dist/src/agent/memory/builtin-provider.js +0 -1
  97. package/dist/src/agent/memory/create-memory-manager.js +1 -1
  98. package/dist/src/agent/tools/image-generate-tool.js +23 -7
  99. package/dist/src/agent-runtime/index.js +1 -1
  100. package/dist/src/agent-runtime/runtime-profile.js +1 -1
  101. package/dist/src/auth/oauth/xopc-cloud.js +1 -1
  102. package/dist/src/capabilities/readiness/from-config.d.ts +10 -0
  103. package/dist/src/capabilities/readiness/from-config.js +128 -0
  104. package/dist/src/capabilities/readiness/index.d.ts +3 -0
  105. package/dist/src/capabilities/readiness/index.js +3 -0
  106. package/dist/src/capabilities/readiness/planner.d.ts +3 -0
  107. package/dist/src/capabilities/readiness/planner.js +56 -0
  108. package/dist/src/capabilities/readiness/types.d.ts +35 -0
  109. package/dist/src/capabilities/readiness/types.js +1 -0
  110. package/dist/src/cli/commands/agent.js +9 -0
  111. package/dist/src/cli/commands/auth.js +4 -3
  112. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  113. package/dist/src/cli/commands/models.js +2 -1
  114. package/dist/src/cli/commands/onboard/model.d.ts +3 -21
  115. package/dist/src/cli/commands/onboard/model.js +10 -86
  116. package/dist/src/cli/commands/tunnel.js +3 -3
  117. package/dist/src/cli/utils/oauth-login.d.ts +2 -0
  118. package/dist/src/cli/utils/oauth-login.js +9 -1
  119. package/dist/src/config/index.js +2 -2
  120. package/dist/src/config/paths-state.d.ts +2 -0
  121. package/dist/src/config/paths-state.js +5 -1
  122. package/dist/src/config/paths.d.ts +1 -1
  123. package/dist/src/config/paths.js +2 -2
  124. package/dist/src/config/schema.js +1 -1
  125. package/dist/src/connectors/composio-managed-client.d.ts +60 -0
  126. package/dist/src/connectors/composio-managed-client.js +135 -0
  127. package/dist/src/connectors/composio-managed-events.d.ts +41 -0
  128. package/dist/src/connectors/composio-managed-events.js +105 -0
  129. package/dist/src/connectors/composio-sessions.d.ts +3 -1
  130. package/dist/src/connectors/composio-sessions.js +15 -8
  131. package/dist/src/connectors/composio.js +10 -4
  132. package/dist/src/connectors/connected-source-cursor.d.ts +9 -0
  133. package/dist/src/connectors/connected-source-cursor.js +30 -0
  134. package/dist/src/connectors/connected-source-ingestion.js +128 -65
  135. package/dist/src/connectors/connected-source-normalizers.d.ts +1 -0
  136. package/dist/src/connectors/connected-source-normalizers.js +33 -2
  137. package/dist/src/connectors/connected-source-sanitization.d.ts +1 -0
  138. package/dist/src/connectors/connected-source-sanitization.js +21 -0
  139. package/dist/src/connectors/connector-identity.js +10 -2
  140. package/dist/src/connectors/content-enrichment.d.ts +29 -0
  141. package/dist/src/connectors/content-enrichment.js +273 -0
  142. package/dist/src/connectors/learning-coordinator.js +1 -2
  143. package/dist/src/connectors/learning-recipes.js +30 -33
  144. package/dist/src/connectors/runtime-adapter-registry.js +2 -2
  145. package/dist/src/discussions/live-worker.d.ts +1 -0
  146. package/dist/src/discussions/live-worker.js +7 -1
  147. package/dist/src/discussions/repository.js +11 -1
  148. package/dist/src/discussions/sealer.d.ts +1 -1
  149. package/dist/src/discussions/sealer.js +16 -7
  150. package/dist/src/discussions/service.js +6 -2
  151. package/dist/src/discussions/transcript.d.ts +2 -0
  152. package/dist/src/discussions/transcript.js +42 -3
  153. package/dist/src/discussions/types.d.ts +4 -0
  154. package/dist/src/extensions/install.d.ts +10 -0
  155. package/dist/src/extensions/install.js +111 -14
  156. package/dist/src/extensions/loader.js +22 -18
  157. package/dist/src/gateway/hono/app.js +8 -3
  158. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  159. package/dist/src/gateway/hono/middleware/auth.js +2 -2
  160. package/dist/src/gateway/hono/middleware/logger.js +1 -1
  161. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
  162. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +9 -2
  163. package/dist/src/gateway/hono/oauth-async.d.ts +11 -5
  164. package/dist/src/gateway/hono/oauth-async.js +29 -16
  165. package/dist/src/gateway/hono/oauth.d.ts +1 -3
  166. package/dist/src/gateway/hono/oauth.js +22 -22
  167. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  168. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  169. package/dist/src/gateway/hono/routes/connectors.js +10 -3
  170. package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
  171. package/dist/src/gateway/hono/routes/discussions.js +2 -1
  172. package/dist/src/gateway/hono/routes/exposure.js +1 -1
  173. package/dist/src/gateway/hono/routes/home.d.ts +1 -1
  174. package/dist/src/gateway/hono/routes/home.js +2 -2
  175. package/dist/src/gateway/hono/routes/lazy-bundles.js +2 -1
  176. package/dist/src/gateway/hono/routes/models.js +59 -5
  177. package/dist/src/gateway/hono/routes/shares.js +1 -1
  178. package/dist/src/gateway/hono/routes/tunnel.js +3 -3
  179. package/dist/src/gateway/hono/routes/understanding-sources.js +29 -0
  180. package/dist/src/gateway/hono/routes/voice.d.ts +1 -2
  181. package/dist/src/gateway/hono/routes/voice.js +16 -35
  182. package/dist/src/gateway/hono/routes/workflows.js +69 -0
  183. package/dist/src/gateway/index.js +2 -2
  184. package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
  185. package/dist/src/gateway/rate-limit/buckets.js +12 -0
  186. package/dist/src/gateway/runtime-config.js +2 -2
  187. package/dist/src/gateway/security/audit.js +2 -2
  188. package/dist/src/gateway/service/config-coordinator.js +1 -1
  189. package/dist/src/gateway/service/session-input-coordinator.js +1 -2
  190. package/dist/src/gateway/service.d.ts +1 -0
  191. package/dist/src/gateway/service.js +37 -7
  192. package/dist/src/knowledge/connected-understanding-pipeline.d.ts +1 -1
  193. package/dist/src/knowledge/connected-understanding-pipeline.js +74 -25
  194. package/dist/src/knowledge/ingestion-service.js +33 -15
  195. package/dist/src/knowledge/types.d.ts +2 -0
  196. package/dist/src/media-understanding/audio-transcription-runner.d.ts +2 -0
  197. package/dist/src/media-understanding/audio-transcription-runner.js +3 -1
  198. package/dist/src/media-understanding/runner.js +3 -1
  199. package/dist/src/media-understanding/types.d.ts +2 -0
  200. package/dist/src/notes/note-attachment-sync.js +1 -1
  201. package/dist/src/notes/service.d.ts +1 -0
  202. package/dist/src/notes/service.js +2 -1
  203. package/dist/src/notes/types.d.ts +2 -0
  204. package/dist/src/providers/model-catalog-persistence.d.ts +9 -0
  205. package/dist/src/providers/model-catalog-persistence.js +172 -0
  206. package/dist/src/providers/model-catalog-ranking.d.ts +2 -0
  207. package/dist/src/providers/model-catalog-ranking.js +17 -0
  208. package/dist/src/providers/model-catalog-store.d.ts +9 -57
  209. package/dist/src/providers/model-catalog-store.js +24 -5
  210. package/dist/src/providers/model-catalog-sync-service.d.ts +3 -3
  211. package/dist/src/providers/model-catalog-sync-service.js +12 -7
  212. package/dist/src/providers/model-catalog-types.d.ts +60 -0
  213. package/dist/src/providers/model-catalog-types.js +1 -0
  214. package/dist/src/providers/provider-auth-service.d.ts +1 -0
  215. package/dist/src/providers/provider-auth-service.js +3 -0
  216. package/dist/src/providers/provider-disconnect-core.d.ts +11 -0
  217. package/dist/src/providers/provider-disconnect-core.js +35 -0
  218. package/dist/src/providers/provider-disconnect.d.ts +3 -0
  219. package/dist/src/providers/provider-disconnect.js +11 -0
  220. package/dist/src/providers/xopc-cloud-catalog-coordinator.d.ts +56 -0
  221. package/dist/src/providers/xopc-cloud-catalog-coordinator.js +182 -0
  222. package/dist/src/providers/xopc-cloud-model-source.d.ts +6 -10
  223. package/dist/src/providers/xopc-cloud-model-source.js +49 -27
  224. package/dist/src/storage/sqlite/knowledge-repository.d.ts +1 -0
  225. package/dist/src/storage/sqlite/knowledge-repository.js +4 -0
  226. package/dist/src/storage/sqlite/migrations/124_workflow_context_snapshots.sql +15 -0
  227. package/dist/src/storage/sqlite/migrations/125_project_workflow_presets.sql +12 -0
  228. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  229. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  230. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  231. package/dist/src/storage/sqlite/schema.js +1 -1
  232. package/dist/src/storage/sqlite/user-context-quality-repository.d.ts +8 -0
  233. package/dist/src/storage/sqlite/user-context-quality-repository.js +21 -1
  234. package/dist/src/tasks/home-query-service.d.ts +12 -127
  235. package/dist/src/tasks/home-query-service.js +73 -271
  236. package/dist/src/tasks/index.js +2 -2
  237. package/dist/src/tui/backends/embedded-backend.js +11 -3
  238. package/dist/src/tui/tui-oauth-login.js +5 -0
  239. package/dist/src/tui/xopc-tui-keybindings.d.ts +2 -2
  240. package/dist/src/tunnel/index.js +2 -2
  241. package/dist/src/user-context/sources/activity-clustering.js +30 -117
  242. package/dist/src/user-context/sources/index.d.ts +1 -0
  243. package/dist/src/user-context/sources/index.js +2 -1
  244. package/dist/src/user-context/sources/signal-clustering.d.ts +18 -0
  245. package/dist/src/user-context/sources/signal-clustering.js +131 -0
  246. package/dist/src/voice/audio/normalize.d.ts +18 -0
  247. package/dist/src/voice/audio/normalize.js +175 -0
  248. package/dist/src/voice/language-profile.d.ts +1 -4
  249. package/dist/src/voice/language-profile.js +2 -25
  250. package/dist/src/voice/local/runtime-client.d.ts +2 -0
  251. package/dist/src/voice/local/runtime-client.js +20 -1
  252. package/dist/src/voice/local/runtime-worker.js +7 -13
  253. package/dist/src/voice/local/wav.d.ts +3 -0
  254. package/dist/src/voice/local/wav.js +11 -5
  255. package/dist/src/voice/stt/availability.d.ts +1 -4
  256. package/dist/src/voice/stt/availability.js +3 -15
  257. package/dist/src/voice/stt/config.js +1 -0
  258. package/dist/src/voice/stt/factory.js +23 -0
  259. package/dist/src/voice/stt/index.d.ts +1 -0
  260. package/dist/src/voice/stt/index.js +2 -2
  261. package/dist/src/voice/stt/list-providers.js +1 -1
  262. package/dist/src/voice/stt/providers/local-transcription.js +7 -3
  263. package/dist/src/voice/stt/providers/xopc-cloud-transcription.js +3 -1
  264. package/dist/src/voice/stt/transcribe-core.d.ts +5 -1
  265. package/dist/src/voice/stt/transcribe-core.js +13 -5
  266. package/dist/src/voice/stt/types.d.ts +2 -0
  267. package/dist/src/voice/tts/factory.d.ts +1 -1
  268. package/dist/src/voice/tts/factory.js +23 -1
  269. package/dist/src/voice/tts/merge-config.js +5 -3
  270. package/dist/src/voice/tts/providers/xopc-cloud-speech.js +3 -1
  271. package/dist/src/voice/tts/types.d.ts +2 -0
  272. package/dist/src/voice/tts/types.js +4 -2
  273. package/dist/src/work-discovery/evaluation.d.ts +23 -0
  274. package/dist/src/work-discovery/evaluation.js +18 -1
  275. package/dist/src/work-discovery/index.js +2 -2
  276. package/dist/src/work-discovery/service.js +6 -8
  277. package/dist/src/work-discovery/types.d.ts +2 -0
  278. package/dist/src/workflows/context/workflow-context-snapshot-repository.d.ts +21 -0
  279. package/dist/src/workflows/context/workflow-context-snapshot-repository.js +40 -0
  280. package/dist/src/workflows/context/workflow-context.d.ts +18 -0
  281. package/dist/src/workflows/context/workflow-context.js +159 -0
  282. package/dist/src/workflows/domain/run.d.ts +10 -1
  283. package/dist/src/workflows/engine/workflow-engine.d.ts +1 -0
  284. package/dist/src/workflows/engine/workflow-engine.js +2 -0
  285. package/dist/src/workflows/project-presets/project-workflow-preset-repository.d.ts +20 -0
  286. package/dist/src/workflows/project-presets/project-workflow-preset-repository.js +38 -0
  287. package/dist/src/workflows/service/workflow-run-service.d.ts +1 -0
  288. package/dist/src/workflows/service/workflow-run-service.js +107 -22
  289. package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -0
  290. package/dist/src/workflows/service/workflow-writeback-service.d.ts +9 -0
  291. package/dist/src/workflows/service/workflow-writeback-service.js +106 -0
  292. package/package.json +9 -8
  293. package/dist/gateway/static/root/assets/agents-DqGMj3QJ.js +0 -68
  294. package/dist/gateway/static/root/assets/apps-page-BT7F4WBI.js +0 -1
  295. package/dist/gateway/static/root/assets/automations-page-CwOXGV9z.js +0 -6
  296. package/dist/gateway/static/root/assets/browser-settings-page-CyRLhCod.js +0 -8
  297. package/dist/gateway/static/root/assets/capabilities-settings-panel-jRKcS7lZ.js +0 -7
  298. package/dist/gateway/static/root/assets/capability-presets-settings-panel-B3bKdtwU.js +0 -3
  299. package/dist/gateway/static/root/assets/channels-settings-yZBWH02s.js +0 -1
  300. package/dist/gateway/static/root/assets/channels-status-swr-C3zlimZd.js +0 -1
  301. package/dist/gateway/static/root/assets/connectors-page-OX4KvUkA.js +0 -2
  302. package/dist/gateway/static/root/assets/directory-picker-path-field-OkqRFyRL.js +0 -1
  303. package/dist/gateway/static/root/assets/gateway-settings-V1XVxjHa.js +0 -1
  304. package/dist/gateway/static/root/assets/heartbeat-settings-CWUBAQrE.js +0 -1
  305. package/dist/gateway/static/root/assets/home-page-D57cYRd3.js +0 -1
  306. package/dist/gateway/static/root/assets/index-DJ7HSgKs.js +0 -85
  307. package/dist/gateway/static/root/assets/index-PNBFdxHb.css +0 -2
  308. package/dist/gateway/static/root/assets/local-app-workbench-page-BbAiMZE1.js +0 -2
  309. package/dist/gateway/static/root/assets/markdown-view-B12xeflb.css +0 -1
  310. package/dist/gateway/static/root/assets/messages-1qg_hOOd.js +0 -3
  311. package/dist/gateway/static/root/assets/notes-workbench-BYPoZeRw.js +0 -4
  312. package/dist/gateway/static/root/assets/project-detail-page-D27nOKbo.js +0 -1
  313. package/dist/gateway/static/root/assets/projects-page-CdB5cJJ-.js +0 -1
  314. package/dist/gateway/static/root/assets/remote-access-hub-DFoZ3UNS.js +0 -1
  315. package/dist/gateway/static/root/assets/sessions-page-C1cbIcJ7.js +0 -1
  316. package/dist/gateway/static/root/assets/settings-advanced-gate-DnXRlQXS.js +0 -1
  317. package/dist/gateway/static/root/assets/setup-status-panel-CwgMODfJ.js +0 -1
  318. package/dist/gateway/static/root/assets/shares-settings-hlUgIkrp.js +0 -1
  319. package/dist/gateway/static/root/assets/skill-reload-api-DR31B_Gz.js +0 -1
  320. package/dist/gateway/static/root/assets/task-detail-page-CTKDpxhf.js +0 -1
  321. package/dist/gateway/static/root/assets/user-context-page-keJJYpix.js +0 -1
  322. package/dist/gateway/static/root/assets/work-discovery-overlay-D5_MH3n3.js +0 -1
  323. package/dist/gateway/static/root/assets/work-discovery-page-BcvBiebt.js +0 -1
  324. package/dist/gateway/static/root/assets/workflows-page-Cz2VpWdj.js +0 -5
  325. package/dist/src/voice/local/runtime-dispatcher.d.ts +0 -9
  326. package/dist/src/voice/local/runtime-dispatcher.js +0 -20
@@ -28,11 +28,6 @@ import "../automations/index.js";
28
28
  import { ProjectService } from "../projects/project-service.js";
29
29
  import { resolveProjectAgentId } from "../projects/project-agent.js";
30
30
  import "../projects/index.js";
31
- import { sanitizeTunnelConfig } from "../tunnel/tunnel-config.js";
32
- import { wireTunnelEventsToGateway } from "../tunnel/gateway-lifecycle.js";
33
- import { buckets } from "./rate-limit/buckets.js";
34
- import { isGatewayStrictSecurityEnabled } from "./rate-limit/env-flags.js";
35
- import "./rate-limit/index.js";
36
31
  import { TaskApplicationService } from "../tasks/task-application-service.js";
37
32
  import { ProactiveScenarioService } from "../proactive/scenarios/service.js";
38
33
  import { TaskOutboxDispatcher } from "../tasks/task-outbox-dispatcher.js";
@@ -61,13 +56,14 @@ import { DiscussionLiveWorker } from "../discussions/live-worker.js";
61
56
  import { DiscussionOrganizerWorker } from "../discussions/organizer-worker.js";
62
57
  import { DiscussionSealer } from "../discussions/sealer.js";
63
58
  import "../discussions/index.js";
64
- import { EndpointToolRuntime } from "../endpoint-tools/runtime.js";
65
- import "../endpoint-tools/index.js";
59
+ import { ManagedComposioEventPoller } from "../connectors/composio-managed-events.js";
66
60
  import { startConnectedKnowledgeCoordinator } from "../knowledge/coordinator.js";
67
61
  import "../knowledge/index.js";
68
62
  import { startConnectorLearningCoordinator } from "../connectors/learning-coordinator.js";
69
63
  import { ConnectedSourceChangePublisher } from "../connectors/source-change-publisher.js";
70
64
  import { startConnectorSupervisor } from "../connectors/supervisor.js";
65
+ import { EndpointToolRuntime } from "../endpoint-tools/runtime.js";
66
+ import "../endpoint-tools/index.js";
71
67
  import { assertGatewayAuthConfigured, extractToken, resolveGatewayAuth, validateToken } from "./auth.js";
72
68
  import { prepareAutomationAgentSession } from "./automation-agent-session.js";
73
69
  import { reconcileDreamingAutomations } from "./dreaming-automation-reconciler.js";
@@ -83,11 +79,17 @@ import "./heartbeat/index.js";
83
79
  import { EphemeralSideChatManager } from "./side-chat/manager.js";
84
80
  import { SideChatRunService } from "./side-chat/run-service.js";
85
81
  import "./side-chat/index.js";
82
+ import { wireTunnelEventsToGateway } from "../tunnel/gateway-lifecycle.js";
86
83
  import { stopTailscaleExposure } from "./tailscale-lifecycle.js";
87
84
  import { getExposureManager } from "../remote-access/exposure-manager.js";
85
+ import { sanitizeTunnelConfig } from "../tunnel/tunnel-config.js";
88
86
  import { assertGatewayAuthNotKnownWeak } from "./security/known-weak-secrets.js";
87
+ import { buckets } from "./rate-limit/buckets.js";
88
+ import { isGatewayStrictSecurityEnabled } from "./rate-limit/env-flags.js";
89
+ import "./rate-limit/index.js";
89
90
  import { assertGatewayRuntimeConfig } from "./runtime-config.js";
90
91
  import { auditGatewayConfig } from "./security/audit.js";
92
+ import { getXopcCloudCatalogCoordinator } from "../providers/xopc-cloud-catalog-coordinator.js";
91
93
  import { ModelCatalogSyncService } from "../providers/model-catalog-sync-service.js";
92
94
  import { runBootstrapMigrationsSync } from "../migrations/runner.js";
93
95
  import { MobileNotificationService } from "../mobile/notification-service.js";
@@ -182,6 +184,7 @@ var GatewayService = class {
182
184
  workflowRunServiceInstance = null;
183
185
  taskRunDispatcher = null;
184
186
  taskRunDispatchTimer = null;
187
+ managedComposioEventPoller;
185
188
  mobileNotifications = null;
186
189
  connectorSupervisor = null;
187
190
  connectorLearningCoordinator = null;
@@ -794,6 +797,20 @@ var GatewayService = class {
794
797
  this.startupTrace = createGatewayStartupTrace();
795
798
  this.readiness.markStarting(this.startTime);
796
799
  const trace = this.startupTrace;
800
+ const catalogCoordinator = getXopcCloudCatalogCoordinator();
801
+ const catalog = await trace.measure("model-catalog.hydrate", () => catalogCoordinator.hydrate());
802
+ if (getAgentDefaultModelRef(this.config)?.startsWith("xopc-cloud/") && catalog.source === "none") {
803
+ const readiness = await trace.measure("model-catalog.initial-refresh", () => catalogCoordinator.ensure({
804
+ reason: "startup",
805
+ network: "if-empty",
806
+ timeoutMs: 1e4
807
+ }));
808
+ if (readiness.error) log.warn({
809
+ provider: "xopc-cloud",
810
+ phase: "catalog_refresh",
811
+ errorMessage: readiness.error.message
812
+ }, `Initial XOPC Cloud catalog refresh failed: ${readiness.error.message}`);
813
+ }
797
814
  registerClarifyBridge(this.agentRunner.getClarifyBridge());
798
815
  this.ensureAgentService();
799
816
  this.agentRunner.recoverSessionInputs();
@@ -926,6 +943,17 @@ var GatewayService = class {
926
943
  getMemoryManager: () => this.agentService.getMemoryManager(),
927
944
  emit: (type, payload) => this.emit(type, payload)
928
945
  });
946
+ this.managedComposioEventPoller = new ManagedComposioEventPoller({
947
+ getConfig: () => this.config,
948
+ triggerAutomation: (event) => this.automationService.triggerEvent(event),
949
+ requestLearning: (toolkit) => {
950
+ this.requestConnectorLearningForToolkit(toolkit);
951
+ },
952
+ setLearningPaused: (connectionId, paused) => {
953
+ this.setConnectorLearningPaused(connectionId, paused);
954
+ }
955
+ });
956
+ this.managedComposioEventPoller.start();
929
957
  this.connectedSourceChangePublisher = new ConnectedSourceChangePublisher(this.proactive);
930
958
  this.connectedSourceChangePublisher.start();
931
959
  this.connectedKnowledgeCoordinator = startConnectedKnowledgeCoordinator({ resolvePipelineOptions: () => ({
@@ -1081,6 +1109,8 @@ var GatewayService = class {
1081
1109
  this.connectorSupervisor = null;
1082
1110
  this.connectorLearningCoordinator?.stop();
1083
1111
  this.connectorLearningCoordinator = null;
1112
+ this.managedComposioEventPoller?.stop();
1113
+ this.managedComposioEventPoller = void 0;
1084
1114
  this.connectedSourceChangePublisher?.stop();
1085
1115
  this.connectedSourceChangePublisher = null;
1086
1116
  this.connectedKnowledgeCoordinator?.stop();
@@ -13,5 +13,5 @@ export declare function renderConnectedObservation(observation: ClaimObservation
13
13
  export declare class ConnectedUnderstandingPipeline {
14
14
  private readonly memoryManager;
15
15
  constructor(memoryManager: MemoryManager);
16
- process(sourceInstanceId: string, connectorId: string, agentId: string): Promise<UnderstandingReviewResult>;
16
+ process(agentId: string): Promise<UnderstandingReviewResult>;
17
17
  }
@@ -1,5 +1,6 @@
1
1
  import { listKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
2
2
  import "../storage/sqlite/index.js";
3
+ import { clusterUnderstandingSignals } from "../user-context/sources/signal-clustering.js";
3
4
  //#region src/knowledge/connected-understanding-pipeline.ts
4
5
  function logicalEventKey(item) {
5
6
  const value = item.metadata.logicalEventKey;
@@ -10,6 +11,59 @@ function eventTime(item) {
10
11
  const value = Date.parse(item.occurredAt);
11
12
  return Number.isFinite(value) ? value : void 0;
12
13
  }
14
+ function normalizedRecord(item) {
15
+ if (!item.normalizedText) return {};
16
+ try {
17
+ const value = JSON.parse(item.normalizedText);
18
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
19
+ } catch {
20
+ return {};
21
+ }
22
+ }
23
+ function textField(record, ...fields) {
24
+ for (const field of fields) {
25
+ const value = record[field];
26
+ if (typeof value === "string" && value.trim()) return value.trim();
27
+ if (value && typeof value === "object" && !Array.isArray(value)) {
28
+ const nested = value;
29
+ for (const nestedField of [
30
+ "name",
31
+ "full_name",
32
+ "fullName",
33
+ "title"
34
+ ]) {
35
+ const nestedValue = nested[nestedField];
36
+ if (typeof nestedValue === "string" && nestedValue.trim()) return nestedValue.trim();
37
+ }
38
+ }
39
+ }
40
+ }
41
+ function normalizeConversationTitle(value) {
42
+ return value.replace(/^(?:(?:re|fwd?|回复|转发)\s*[::]\s*)+/i, "").trim();
43
+ }
44
+ function projectSignal(item) {
45
+ if (item.metadata.actorAttributed !== true) return void 0;
46
+ const observationKind = item.metadata.observationKind;
47
+ if (![
48
+ "activity",
49
+ "message",
50
+ "calendar_event",
51
+ "external_task",
52
+ "document_metadata"
53
+ ].includes(String(observationKind))) return;
54
+ const title = textField(normalizedRecord(item), "subject", "title", "repository", "project", "fullName", "full_name", "name");
55
+ const subjectKey = typeof item.metadata.subjectKey === "string" && item.metadata.subjectKey.trim() ? item.metadata.subjectKey.trim() : void 0;
56
+ const displayTitle = title ? normalizeConversationTitle(title) : subjectKey;
57
+ if (!displayTitle) return void 0;
58
+ return {
59
+ evidenceRef: item.id,
60
+ sourceId: item.sourceInstanceId,
61
+ title: displayTitle,
62
+ group: typeof item.metadata.toolkit === "string" ? item.metadata.toolkit : void 0,
63
+ subjectKey,
64
+ occurredAt: eventTime(item)
65
+ };
66
+ }
13
67
  function recent(items, days) {
14
68
  const now = Date.now();
15
69
  const cutoff = now - days * 864e5;
@@ -86,30 +140,24 @@ function routineObservations(items) {
86
140
  });
87
141
  }
88
142
  function projectObservations(items) {
89
- const grouped = /* @__PURE__ */ new Map();
90
- for (const item of recent(items, 60)) {
91
- if (item.metadata.observationKind !== "activity" || item.metadata.actorAttributed !== true) continue;
92
- const subject = typeof item.metadata.subjectKey === "string" ? item.metadata.subjectKey.trim() : "";
93
- if (!subject) continue;
94
- const entry = grouped.get(subject.toLowerCase()) ?? {
95
- label: subject,
96
- events: /* @__PURE__ */ new Map()
97
- };
98
- const events = entry.events;
99
- const eventKey = logicalEventKey(item);
100
- if (!events.has(eventKey)) events.set(eventKey, item);
101
- grouped.set(subject.toLowerCase(), entry);
102
- }
103
- return [...grouped.entries()].sort((left, right) => right[1].events.size - left[1].events.size).slice(0, 8).map(([, entry]) => {
104
- const { label: subject, events } = entry;
105
- return {
143
+ const recentItems = recent(items, 60);
144
+ const byId = new Map(recentItems.map((item) => [item.id, item]));
145
+ return clusterUnderstandingSignals(recentItems.map(projectSignal).filter((signal) => Boolean(signal))).flatMap((cluster) => {
146
+ const events = /* @__PURE__ */ new Map();
147
+ for (const signal of cluster.signals) {
148
+ const item = byId.get(signal.evidenceRef);
149
+ const eventKey = item && logicalEventKey(item);
150
+ if (item && eventKey && !events.has(eventKey)) events.set(eventKey, item);
151
+ }
152
+ if (![...events.values()].some((item) => item.itemType !== "calendar_event")) return [];
153
+ return [{
106
154
  class: "project",
107
- key: `project:${subject.toLocaleLowerCase()}`,
108
- value: { label: subject },
155
+ key: `project:${cluster.key}`,
156
+ value: { label: cluster.title },
109
157
  items: [...events.values()],
110
158
  windowDays: 60
111
- };
112
- });
159
+ }];
160
+ }).sort((left, right) => right.items.length - left.items.length).slice(0, 8);
113
161
  }
114
162
  function deriveConnectedClaimObservations(items) {
115
163
  const active = items.filter((item) => !item.deletedAt && item.synthesisPipeline === "connected_knowledge" && item.sensitivity !== "secret" && item.sensitivity !== "regulated" && item.metadata.observationKind !== "inventory");
@@ -178,9 +226,9 @@ var ConnectedUnderstandingPipeline = class {
178
226
  constructor(memoryManager) {
179
227
  this.memoryManager = memoryManager;
180
228
  }
181
- async process(sourceInstanceId, connectorId, agentId) {
229
+ async process(agentId) {
182
230
  const observations = deriveConnectedClaimObservations(listKnowledgeSourceItems({
183
- sourceInstanceId,
231
+ agentId,
184
232
  includeDeleted: false,
185
233
  limit: 500
186
234
  }));
@@ -193,6 +241,7 @@ var ConnectedUnderstandingPipeline = class {
193
241
  };
194
242
  for (const observation of observations) {
195
243
  if (!isDurableObservation(observation)) continue;
244
+ const sourceInstanceIds = [...new Set(observation.items.map((item) => item.sourceInstanceId))];
196
245
  const result = await this.memoryManager.applyUnderstandingCandidates([renderConnectedObservation(observation)], {
197
246
  sourceItemIds: observation.items.map((item) => item.id).slice(0, 20),
198
247
  sourceText: JSON.stringify({
@@ -201,8 +250,8 @@ var ConnectedUnderstandingPipeline = class {
201
250
  windowDays: observation.windowDays
202
251
  }),
203
252
  source: {
204
- provider: connectorId,
205
- sourceInstanceId
253
+ provider: "connected-sources",
254
+ ...sourceInstanceIds.length === 1 ? { sourceInstanceId: sourceInstanceIds[0] } : {}
206
255
  },
207
256
  reviewSource: "background"
208
257
  });
@@ -4,6 +4,7 @@ import { finishKnowledgeSyncRun, getKnowledgeSourceCursor, listKnowledgeSourceIt
4
4
  //#region src/knowledge/ingestion-service.ts
5
5
  init_logger();
6
6
  const log = createLogger("KnowledgeIngestion");
7
+ const MAX_PULL_PAGES = 20;
7
8
  function deletionInputs(instanceId, collectionScope, snapshotExternalIds) {
8
9
  if (!snapshotExternalIds) return [];
9
10
  const seen = new Set(snapshotExternalIds);
@@ -93,29 +94,46 @@ var KnowledgeIngestionService = class {
93
94
  const controller = params.signal ? null : new AbortController();
94
95
  const signal = params.signal ?? controller.signal;
95
96
  try {
96
- const pulled = await adapter.pull({
97
- instanceId: params.instanceId,
98
- collectionScope: params.collectionScope,
99
- cursor: cursorBefore,
100
- windowStart: params.windowStart,
101
- signal
102
- });
103
- const tombstones = deletionInputs(params.instanceId, params.collectionScope, pulled.snapshotExternalIds);
104
- const stored = upsertKnowledgeSourceItems([...pulled.items, ...tombstones]);
105
- this.state.setCursor(params.instanceId, params.collectionScope, pulled.nextCursor);
97
+ const items = [];
98
+ const warnings = [];
99
+ const snapshotExternalIds = [];
100
+ let snapshotComplete = true;
101
+ let pullCursor = cursorBefore;
102
+ let cursorAfter = cursorBefore;
103
+ for (let page = 0; page < MAX_PULL_PAGES; page += 1) {
104
+ const pulled = await adapter.pull({
105
+ instanceId: params.instanceId,
106
+ collectionScope: params.collectionScope,
107
+ cursor: pullCursor,
108
+ windowStart: params.windowStart,
109
+ signal
110
+ });
111
+ items.push(...pulled.items);
112
+ warnings.push(...pulled.warnings);
113
+ if (pulled.snapshotExternalIds) snapshotExternalIds.push(...pulled.snapshotExternalIds);
114
+ else snapshotComplete = false;
115
+ cursorAfter = pulled.nextCursor;
116
+ if (!pulled.hasMore) break;
117
+ if (!pulled.nextCursor || pulled.nextCursor === pullCursor) throw new Error("Knowledge source returned an invalid pagination cursor.");
118
+ if (page === MAX_PULL_PAGES - 1) throw new Error(`Knowledge source exceeded the ${MAX_PULL_PAGES}-page safety limit.`);
119
+ pullCursor = pulled.nextCursor;
120
+ }
121
+ const tombstones = deletionInputs(params.instanceId, params.collectionScope, snapshotComplete ? snapshotExternalIds : void 0);
122
+ const stored = upsertKnowledgeSourceItems([...items, ...tombstones]);
123
+ this.state.setCursor(params.instanceId, params.collectionScope, cursorAfter);
106
124
  const completed = finishKnowledgeSyncRun({
107
125
  runId: run.id,
108
- status: pulled.warnings.length > 0 ? "partial" : "succeeded",
109
- cursorAfter: pulled.nextCursor,
110
- itemsSeen: pulled.items.length,
126
+ status: warnings.length > 0 ? "partial" : "succeeded",
127
+ cursorAfter,
128
+ itemsSeen: items.length,
111
129
  itemsCreated: stored.created,
112
130
  itemsUpdated: stored.updated,
113
- warnings: pulled.warnings
131
+ warnings
114
132
  });
115
133
  log.info({
116
134
  runId: run.id,
117
135
  sourceInstanceId: params.instanceId,
118
- itemsSeen: pulled.items.length,
136
+ itemsSeen: items.length,
119
137
  itemsCreated: stored.created,
120
138
  itemsUpdated: stored.updated,
121
139
  itemsDeleted: tombstones.length
@@ -83,6 +83,8 @@ export interface KnowledgePullInput {
83
83
  export interface KnowledgePullResult {
84
84
  items: KnowledgeSourceItemInput[];
85
85
  nextCursor?: string;
86
+ /** True only when nextCursor is a required continuation page, not a committed checkpoint. */
87
+ hasMore?: boolean;
86
88
  warnings: string[];
87
89
  /** All active external ids observed during a complete source snapshot. Omit for partial/incremental-only pulls. */
88
90
  snapshotExternalIds?: string[];
@@ -41,6 +41,8 @@ export interface RunAudioTranscriptionResult {
41
41
  text: string;
42
42
  provider: string;
43
43
  model?: string;
44
+ language?: string;
45
+ durationSeconds?: number;
44
46
  }>;
45
47
  decision: MediaUnderstandingDecision;
46
48
  }
@@ -25,7 +25,9 @@ async function runAudioTranscription(options) {
25
25
  attachmentIndex: entry.attachmentIndex,
26
26
  text: entry.text,
27
27
  provider: entry.provider,
28
- ...entry.model ? { model: entry.model } : {}
28
+ ...entry.model ? { model: entry.model } : {},
29
+ ...entry.language ? { language: entry.language } : {},
30
+ ...entry.durationSeconds !== void 0 ? { durationSeconds: entry.durationSeconds } : {}
29
31
  }));
30
32
  return {
31
33
  transcript: outputs.length === 0 ? void 0 : outputs.slice().sort((a, b) => a.attachmentIndex - b.attachmentIndex).map((o) => o.text).join("\n").trim() || void 0,
@@ -116,7 +116,9 @@ async function runCapability(options) {
116
116
  attachmentIndex: attachment.attachmentIndex,
117
117
  text,
118
118
  provider: provider.id,
119
- model: callResult.model
119
+ model: callResult.model,
120
+ ...callResult.language ? { language: callResult.language } : {},
121
+ ...callResult.durationSeconds !== void 0 ? { durationSeconds: callResult.durationSeconds } : {}
120
122
  });
121
123
  break;
122
124
  } catch (error) {
@@ -63,6 +63,8 @@ export interface MediaUnderstandingOutput {
63
63
  text: string;
64
64
  provider: string;
65
65
  model?: string;
66
+ language?: string;
67
+ durationSeconds?: number;
66
68
  }
67
69
  export interface MediaUnderstandingModelDecision {
68
70
  provider?: string;
@@ -8,7 +8,7 @@ function partitionAttachmentsByReference(note) {
8
8
  const attachments = note.attachments ?? [];
9
9
  const kept = [];
10
10
  const removed = [];
11
- for (const attachment of attachments) if (referenced.has(attachment.id)) kept.push(attachment);
11
+ for (const attachment of attachments) if (attachment.retainWithoutReference || referenced.has(attachment.id)) kept.push(attachment);
12
12
  else removed.push(attachment);
13
13
  return {
14
14
  kept,
@@ -48,6 +48,7 @@ export declare class NotesService {
48
48
  buffer: Buffer;
49
49
  mimeType: string;
50
50
  duration?: number;
51
+ retainWithoutReference?: boolean;
51
52
  }): Promise<NoteAttachment | null>;
52
53
  removeAttachment(noteId: string, attachmentId: string): Promise<boolean>;
53
54
  getAttachmentPath(noteId: string, attachmentId: string): Promise<{
@@ -474,7 +474,8 @@ var NotesService = class {
474
474
  fileName: file.name,
475
475
  size,
476
476
  relativePath,
477
- duration: file.duration
477
+ duration: file.duration,
478
+ retainWithoutReference: file.retainWithoutReference
478
479
  };
479
480
  const attachments = [...note.attachments || [], attachment];
480
481
  const kind = note.kind === "thought" && attachment.type === "audio" ? "voice" : note.kind === "thought" ? "media" : note.kind;
@@ -45,6 +45,8 @@ export interface NoteAttachment {
45
45
  relativePath: string;
46
46
  transcript?: string;
47
47
  duration?: number;
48
+ /** Retained by a structured note feature even when absent from user-owned Markdown. */
49
+ retainWithoutReference?: boolean;
48
50
  }
49
51
  export interface NoteAiMeta {
50
52
  summary?: string;
@@ -0,0 +1,9 @@
1
+ import type { CatalogSource } from './model-catalog-types.js';
2
+ export declare class ModelCatalogPersistence {
3
+ private readonly path;
4
+ constructor(path?: string);
5
+ loadSync(): CatalogSource | undefined;
6
+ save(source: CatalogSource): Promise<void>;
7
+ clear(): Promise<void>;
8
+ clearSync(): void;
9
+ }
@@ -0,0 +1,172 @@
1
+ import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
+ import { init_paths_state, resolveXopcCloudCatalogCachePath } from "../config/paths-state.js";
3
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
4
+ import { readFileSync, rmSync } from "node:fs";
5
+ import { z } from "zod";
6
+ import { rm } from "node:fs/promises";
7
+ //#region src/providers/model-catalog-persistence.ts
8
+ var MAX_CATALOG_BYTES, imageGenerationSchema, sttSchema, ttsSchema, catalogModelSchema, persistedCatalogSchema, ModelCatalogPersistence;
9
+ var init_model_catalog_persistence = __esmMin((() => {
10
+ init_paths_state();
11
+ init_write_file_atomic();
12
+ MAX_CATALOG_BYTES = 4 * 1024 * 1024;
13
+ imageGenerationSchema = z.object({
14
+ maxCount: z.number().int().positive(),
15
+ sizes: z.array(z.string()),
16
+ aspectRatios: z.array(z.string()).optional(),
17
+ qualities: z.array(z.enum([
18
+ "low",
19
+ "medium",
20
+ "high",
21
+ "auto"
22
+ ])),
23
+ formats: z.array(z.enum([
24
+ "png",
25
+ "jpeg",
26
+ "webp"
27
+ ])),
28
+ backgrounds: z.array(z.enum([
29
+ "transparent",
30
+ "opaque",
31
+ "auto"
32
+ ])),
33
+ maxInputImages: z.number().int().nonnegative()
34
+ }).strict();
35
+ sttSchema = z.object({
36
+ inputFormats: z.array(z.string()),
37
+ maxBytes: z.number().int().nonnegative(),
38
+ maxDurationSeconds: z.number().int().nonnegative(),
39
+ languages: z.array(z.string()),
40
+ languageHint: z.boolean(),
41
+ prompt: z.boolean(),
42
+ timestamps: z.array(z.enum(["segment", "word"])),
43
+ diarization: z.boolean()
44
+ }).strict();
45
+ ttsSchema = z.object({
46
+ maxCharacters: z.number().int().nonnegative(),
47
+ languages: z.array(z.string()),
48
+ outputFormats: z.array(z.enum([
49
+ "mp3",
50
+ "opus",
51
+ "aac",
52
+ "flac",
53
+ "wav",
54
+ "pcm"
55
+ ])),
56
+ streaming: z.boolean(),
57
+ speed: z.boolean(),
58
+ pitch: z.boolean(),
59
+ instructions: z.boolean(),
60
+ defaultVoice: z.string().optional()
61
+ }).strict();
62
+ catalogModelSchema = z.object({
63
+ id: z.string().min(1),
64
+ name: z.string().min(1),
65
+ availability: z.enum(["available", "unavailable"]),
66
+ kind: z.enum([
67
+ "language",
68
+ "image",
69
+ "stt",
70
+ "tts"
71
+ ]),
72
+ input: z.array(z.enum([
73
+ "text",
74
+ "image",
75
+ "audio"
76
+ ])),
77
+ output: z.array(z.enum([
78
+ "text",
79
+ "image",
80
+ "audio"
81
+ ])),
82
+ operations: z.array(z.enum([
83
+ "chat.completions",
84
+ "responses",
85
+ "images.generate",
86
+ "images.edit",
87
+ "audio.transcription",
88
+ "audio.speech"
89
+ ])),
90
+ reasoning: z.boolean(),
91
+ contextWindow: z.number().int().positive(),
92
+ maxOutputTokens: z.number().int().positive().nullable(),
93
+ stability: z.enum([
94
+ "stable",
95
+ "preview",
96
+ "deprecated"
97
+ ]).optional(),
98
+ priority: z.number().optional(),
99
+ tier: z.string().optional(),
100
+ bestEffort: z.boolean().optional(),
101
+ imageGeneration: imageGenerationSchema.optional(),
102
+ stt: sttSchema.optional(),
103
+ tts: ttsSchema.optional()
104
+ }).strict();
105
+ persistedCatalogSchema = z.object({
106
+ schemaVersion: z.literal(1),
107
+ providerId: z.literal("xopc-cloud"),
108
+ catalogVersion: z.string().nullable(),
109
+ fetchedAt: z.number().int().nonnegative(),
110
+ baseUrl: z.string().url(),
111
+ api: z.enum(["openai-completions", "openai-responses"]),
112
+ recommendedModel: z.string().nullable(),
113
+ recommended: z.record(z.enum([
114
+ "vision",
115
+ "image-generation",
116
+ "stt",
117
+ "tts"
118
+ ]), z.string()).optional(),
119
+ models: z.array(catalogModelSchema)
120
+ }).strict();
121
+ ModelCatalogPersistence = class {
122
+ constructor(path = resolveXopcCloudCatalogCachePath()) {
123
+ this.path = path;
124
+ }
125
+ loadSync() {
126
+ try {
127
+ const raw = readFileSync(this.path, "utf8");
128
+ if (Buffer.byteLength(raw) > MAX_CATALOG_BYTES) return void 0;
129
+ const parsed = persistedCatalogSchema.safeParse(JSON.parse(raw));
130
+ if (!parsed.success) return void 0;
131
+ return {
132
+ providerId: parsed.data.providerId,
133
+ baseUrl: parsed.data.baseUrl,
134
+ api: parsed.data.api,
135
+ etag: parsed.data.catalogVersion,
136
+ recommendedModel: parsed.data.recommendedModel,
137
+ recommended: parsed.data.recommended,
138
+ lastSuccessAt: parsed.data.fetchedAt,
139
+ models: parsed.data.models
140
+ };
141
+ } catch {
142
+ return;
143
+ }
144
+ }
145
+ async save(source) {
146
+ if (source.providerId !== "xopc-cloud") throw new Error(`Cannot persist catalog for provider ${source.providerId}`);
147
+ const payload = persistedCatalogSchema.parse({
148
+ schemaVersion: 1,
149
+ providerId: source.providerId,
150
+ catalogVersion: source.etag,
151
+ fetchedAt: source.lastSuccessAt,
152
+ baseUrl: source.baseUrl,
153
+ api: source.api,
154
+ recommendedModel: source.recommendedModel,
155
+ recommended: source.recommended,
156
+ models: source.models
157
+ });
158
+ const serialized = `${JSON.stringify(payload, null, 2)}\n`;
159
+ if (Buffer.byteLength(serialized) > MAX_CATALOG_BYTES) throw new Error("XOPC Cloud model catalog exceeds the 4 MiB cache limit");
160
+ await writeTextAtomic(this.path, serialized, { mode: 384 });
161
+ }
162
+ async clear() {
163
+ await rm(this.path, { force: true });
164
+ }
165
+ clearSync() {
166
+ rmSync(this.path, { force: true });
167
+ }
168
+ };
169
+ }));
170
+ //#endregion
171
+ init_model_catalog_persistence();
172
+ export { ModelCatalogPersistence, init_model_catalog_persistence };
@@ -0,0 +1,2 @@
1
+ import type { CatalogModel } from './model-catalog-store.js';
2
+ export declare function compareCatalogModels(left: CatalogModel, right: CatalogModel, recommendedModel?: string): number;
@@ -0,0 +1,17 @@
1
+ //#region src/providers/model-catalog-ranking.ts
2
+ const STABILITY_ORDER = {
3
+ stable: 0,
4
+ preview: 1,
5
+ deprecated: 2
6
+ };
7
+ function compareCatalogModels(left, right, recommendedModel) {
8
+ if (left.id === recommendedModel) return -1;
9
+ if (right.id === recommendedModel) return 1;
10
+ const stability = STABILITY_ORDER[left.stability ?? "stable"] - STABILITY_ORDER[right.stability ?? "stable"];
11
+ if (stability !== 0) return stability;
12
+ if (left.bestEffort !== right.bestEffort) return left.bestEffort ? 1 : -1;
13
+ if ((left.priority ?? 0) !== (right.priority ?? 0)) return (right.priority ?? 0) - (left.priority ?? 0);
14
+ return left.id.localeCompare(right.id);
15
+ }
16
+ //#endregion
17
+ export { compareCatalogModels };