@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
@@ -1,6 +1,8 @@
1
1
  import { getAgentDefaultImageGenerationModelConfig, init_schema } from "../../config/schema.js";
2
2
  import { imageAssetFromDataUrl, imageFileExtensionForMimeType, mimeTypeFromFileName, parseImageDataUrl, sniffImageMimeType } from "../image/generation/image-assets.js";
3
3
  import { persistToolMedia } from "./tool-media.js";
4
+ import { buildCapabilityPlansForConfig } from "../../capabilities/readiness/from-config.js";
5
+ import "../../capabilities/readiness/index.js";
4
6
  import { applyImageGenerationModelConfigDefaults } from "../image/image-helpers.js";
5
7
  import { isFailoverError } from "../failover-error.js";
6
8
  import { getImageGenerationProvider } from "../image/generation/provider-registry.js";
@@ -127,14 +129,28 @@ async function loadInputImages(params) {
127
129
  }
128
130
  function resolveImageGenerationModelConfigForTool(params) {
129
131
  const explicit = params.cfg ? getAgentDefaultImageGenerationModelConfig(params.cfg, params.agentId) : void 0;
130
- if (explicit?.primary?.trim()) return {
131
- primary: explicit.primary.trim(),
132
- ...explicit.fallbacks?.length ? { fallbacks: explicit.fallbacks } : {},
133
- ...explicit.timeoutMs ? { timeoutMs: explicit.timeoutMs } : {},
134
- ...explicit.autoProviderFallback ? { autoProviderFallback: true } : {}
135
- };
132
+ if (explicit?.primary?.trim()) {
133
+ const plan = buildCapabilityPlansForConfig(params.cfg)["image-generation"];
134
+ const primarySlash = explicit.primary.indexOf("/");
135
+ const primaryProvider = primarySlash > 0 ? explicit.primary.slice(0, primarySlash) : "";
136
+ const managed = plan.primary ? [plan.primary, ...plan.fallbacks].filter((candidate) => explicit.autoProviderFallback || candidate.provider === primaryProvider).map((candidate) => `${candidate.provider}/${candidate.model}`) : [];
137
+ const fallbacks = [...new Set([...explicit.fallbacks ?? [], ...managed])].filter((ref) => ref !== explicit.primary);
138
+ return {
139
+ primary: explicit.primary.trim(),
140
+ ...fallbacks.length ? { fallbacks } : {},
141
+ ...explicit.timeoutMs ? { timeoutMs: explicit.timeoutMs } : {},
142
+ ...explicit.autoProviderFallback ? { autoProviderFallback: true } : {}
143
+ };
144
+ }
145
+ let planned;
146
+ if (params.cfg) try {
147
+ planned = buildCapabilityPlansForConfig(params.cfg)["image-generation"];
148
+ } catch {
149
+ planned = void 0;
150
+ }
151
+ const plannedRefs = planned?.primary ? [planned.primary, ...planned.fallbacks].map((candidate) => `${candidate.provider}/${candidate.model}`) : [];
136
152
  const providers = listImageGenerationProvidersSummary();
137
- const candidates = [];
153
+ const candidates = [...plannedRefs];
138
154
  for (const providerSummary of providers) {
139
155
  const provider = getImageGenerationProvider(providerSummary.id);
140
156
  let configured = false;
@@ -1,7 +1,7 @@
1
+ import { buildMemoryRuntime } from "./memory-runtime.js";
1
2
  import { checkBoundary } from "./boundary-guard.js";
2
3
  import { resolveModelRole } from "./model-router.js";
3
4
  import { buildRuntimeToolRegistry } from "./tool-registry.js";
4
- import { buildMemoryRuntime } from "./memory-runtime.js";
5
5
  import { resolveWorkflow, validateWorkflowForRuntime } from "./workflow-runtime.js";
6
6
  import { buildAgentRuntimeProfile } from "./runtime-profile.js";
7
7
  import { appendAgentRunEvent, createAgentRunTrace, finishAgentRunTrace, hashEffectiveManifest } from "./run-trace.js";
@@ -1,9 +1,9 @@
1
1
  import { buildAgentManifestPromptSection } from "../agent-manifest/prompt.js";
2
2
  import "../agent-manifest/index.js";
3
+ import { buildMemoryRuntime } from "./memory-runtime.js";
3
4
  import { checkBoundary } from "./boundary-guard.js";
4
5
  import { resolveModelRole } from "./model-router.js";
5
6
  import { buildRuntimeToolRegistry } from "./tool-registry.js";
6
- import { buildMemoryRuntime } from "./memory-runtime.js";
7
7
  import { resolveWorkflow, validateWorkflowForRuntime } from "./workflow-runtime.js";
8
8
  //#region src/agent-runtime/runtime-profile.ts
9
9
  function buildAgentRuntimeProfile(params) {
@@ -380,7 +380,7 @@ var init_xopc_cloud = __esmMin((() => {
380
380
  init_pkce();
381
381
  CLIENT_ID = "xopc-native";
382
382
  DEFAULT_CONSOLE_URL = "https://console.xopc.ai";
383
- DEFAULT_SCOPE = "models:read models:invoke account:usage offline_access";
383
+ DEFAULT_SCOPE = "models:read models:invoke account:usage connectors:read connectors:manage connectors:execute offline_access";
384
384
  CALLBACK_PATH = "/oauth/callback";
385
385
  AUTHORIZATION_TIMEOUT_MS = 5 * 6e4;
386
386
  xopcCloudOAuthProvider = {
@@ -0,0 +1,10 @@
1
+ import type { Config } from '../../config/schema.js';
2
+ import { type ModelCatalogSnapshot } from '../../providers/model-catalog-store.js';
3
+ import type { CapabilityId, CapabilityPlan } from './types.js';
4
+ interface BuildPlansOptions {
5
+ catalog?: ModelCatalogSnapshot;
6
+ providerReady?: (providerId: string) => boolean;
7
+ localSttReady?: boolean;
8
+ }
9
+ export declare function buildCapabilityPlansForConfig(config: Config, options?: BuildPlansOptions): Record<CapabilityId, CapabilityPlan>;
10
+ export {};
@@ -0,0 +1,128 @@
1
+ import { getAgentDefaultImageGenerationModelConfig, getAgentDefaultImageModelConfig, init_schema, parseModelRef } from "../../config/schema.js";
2
+ import { getModelCatalogStore, init_model_catalog_store } from "../../providers/model-catalog-store.js";
3
+ import { init_providers, isProviderConfiguredSync } from "../../providers/index.js";
4
+ import { compareCatalogModels } from "../../providers/model-catalog-ranking.js";
5
+ import { DEFAULT_LOCAL_VOICE_MODEL_ID, hasInstalledLocalVoiceModel } from "../../voice/local/models.js";
6
+ import { planCapabilities } from "./planner.js";
7
+ //#region src/capabilities/readiness/from-config.ts
8
+ init_schema();
9
+ init_model_catalog_store();
10
+ init_providers();
11
+ function buildCapabilityPlansForConfig(config, options = {}) {
12
+ const catalog = options.catalog ?? getModelCatalogStore().load();
13
+ const cloud = catalog.sources["xopc-cloud"];
14
+ const providerReady = options.providerReady ?? defaultProviderReady;
15
+ const cloudReady = providerReady("xopc-cloud");
16
+ const agentId = config.agents.default ?? config.agents.list[0]?.id ?? "main";
17
+ const stt = config.tools?.media?.audio;
18
+ const tts = config.messages?.tts;
19
+ const policies = {
20
+ vision: { explicit: refs(getAgentDefaultImageModelConfig(config)) },
21
+ "image-generation": { explicit: refs(getAgentDefaultImageGenerationModelConfig(config, agentId)) },
22
+ stt: {
23
+ disabled: stt?.enabled === false,
24
+ explicit: stt ? sttRefs(stt) : void 0
25
+ },
26
+ tts: {
27
+ disabled: tts?.enabled === false,
28
+ explicit: tts ? ttsRefs(tts) : void 0
29
+ }
30
+ };
31
+ markExplicitReadiness(policies, catalog, providerReady);
32
+ return planCapabilities({
33
+ policies,
34
+ automatic: {
35
+ vision: cloudCandidates("vision", cloud?.models ?? [], cloudReady, 0, cloud?.recommended?.vision),
36
+ "image-generation": cloudCandidates("image-generation", cloud?.models ?? [], cloudReady, 0, cloud?.recommended?.["image-generation"]),
37
+ stt: [candidate("stt", "xopc-local", DEFAULT_LOCAL_VOICE_MODEL_ID, "installed-local", options.localSttReady ?? hasInstalledLocalVoiceModel(), 0), ...cloudCandidates("stt", cloud?.models ?? [], cloudReady, 100, cloud?.recommended?.stt)],
38
+ tts: [...cloudCandidates("tts", cloud?.models ?? [], cloudReady, 0, cloud?.recommended?.tts), candidate("tts", "edge", "edge", "credentialless-fallback", true, 1e3)]
39
+ },
40
+ catalogVersion: cloud?.etag
41
+ });
42
+ }
43
+ function defaultProviderReady(providerId) {
44
+ if (providerId === "edge") return true;
45
+ if (providerId === "xopc-local") return hasInstalledLocalVoiceModel();
46
+ return isProviderConfiguredSync(providerId);
47
+ }
48
+ function refs(config) {
49
+ if (!config) return void 0;
50
+ return [config.primary, ...config.fallbacks ?? []].map((ref) => parseModelRef(ref)).filter((ref) => ref !== null);
51
+ }
52
+ function sttRefs(config) {
53
+ if (!config) return void 0;
54
+ const modelRefs = [...config.models ?? [], ...config.sharedModels ?? []].filter((entry) => entry.capabilities?.includes("audio") !== false).flatMap((entry) => entry.provider && entry.model ? [{
55
+ provider: entry.provider,
56
+ model: entry.model
57
+ }] : []);
58
+ if (modelRefs.length > 0) return modelRefs;
59
+ const provider = config.provider;
60
+ const slice = config.providers?.[provider];
61
+ return [{
62
+ provider,
63
+ model: typeof slice?.model === "string" ? slice.model : provider
64
+ }];
65
+ }
66
+ function ttsRefs(config) {
67
+ if (!config) return void 0;
68
+ const slice = config.providers?.[config.provider];
69
+ const model = typeof slice?.model === "string" ? slice.model : config.provider;
70
+ const refs = [{
71
+ provider: config.provider,
72
+ model
73
+ }];
74
+ if (config.fallback?.enabled) for (const provider of config.fallback.order) {
75
+ const fallbackSlice = config.providers?.[provider];
76
+ refs.push({
77
+ provider,
78
+ model: typeof fallbackSlice?.model === "string" ? fallbackSlice.model : provider
79
+ });
80
+ }
81
+ return refs;
82
+ }
83
+ function markExplicitReadiness(policies, catalog, providerReady) {
84
+ for (const [capability, policy] of Object.entries(policies)) policy.explicit = policy.explicit?.map((entry) => {
85
+ const ready = explicitReady(capability, entry.provider, entry.model, catalog, providerReady);
86
+ return {
87
+ ...entry,
88
+ ready,
89
+ reasons: ready ? [] : ["explicit_model_unavailable"]
90
+ };
91
+ });
92
+ }
93
+ function explicitReady(capability, provider, model, catalog, providerReady) {
94
+ if (!providerReady(provider)) return false;
95
+ if (provider !== "xopc-cloud") return true;
96
+ return (catalog.sources["xopc-cloud"]?.models ?? []).some((entry) => entry.id === model && matchesCapability(entry, capability));
97
+ }
98
+ function cloudCandidates(capability, models, authorized, basePriority = 0, recommendedModel) {
99
+ return models.filter((model) => model.availability === "available" && matchesCapability(model, capability)).sort((left, right) => compareCatalogModels(left, right, recommendedModel)).map((model, index) => candidate(capability, "xopc-cloud", model.id, "xopc-cloud-managed", authorized, basePriority + index, {
100
+ ...model.tts?.defaultVoice ? { defaultVoice: model.tts.defaultVoice } : {},
101
+ ...model.stability ? { stability: model.stability } : {},
102
+ ...model.tier ? { tier: model.tier } : {},
103
+ ...model.bestEffort !== void 0 ? { bestEffort: model.bestEffort } : {}
104
+ }));
105
+ }
106
+ function matchesCapability(model, capability) {
107
+ if (model.availability !== "available") return false;
108
+ switch (capability) {
109
+ case "vision": return model.kind === "language" && model.input.includes("image");
110
+ case "image-generation": return model.kind === "image" && model.operations.includes("images.generate");
111
+ case "stt": return model.kind === "stt" && model.operations.includes("audio.transcription");
112
+ case "tts": return model.kind === "tts" && model.operations.includes("audio.speech") && Boolean(model.tts?.defaultVoice);
113
+ }
114
+ }
115
+ function candidate(capability, provider, model, source, ready, priority, metadata) {
116
+ return {
117
+ capability,
118
+ provider,
119
+ model,
120
+ source,
121
+ ready,
122
+ priority,
123
+ reasons: ready ? [] : [provider === "xopc-cloud" ? "oauth_not_connected" : "provider_not_ready"],
124
+ ...metadata ? { metadata } : {}
125
+ };
126
+ }
127
+ //#endregion
128
+ export { buildCapabilityPlansForConfig };
@@ -0,0 +1,3 @@
1
+ export { buildCapabilityPlansForConfig } from './from-config.js';
2
+ export { planCapabilities, planCapability } from './planner.js';
3
+ export type { CandidateSource, CapabilityCandidate, CapabilityId, CapabilityPlan, CapabilityPlannerInput, CapabilityPolicy, } from './types.js';
@@ -0,0 +1,3 @@
1
+ import { planCapabilities, planCapability } from "./planner.js";
2
+ import { buildCapabilityPlansForConfig } from "./from-config.js";
3
+ export { buildCapabilityPlansForConfig, planCapabilities, planCapability };
@@ -0,0 +1,3 @@
1
+ import type { CapabilityId, CapabilityPlan, CapabilityPlannerInput } from './types.js';
2
+ export declare function planCapabilities(input: CapabilityPlannerInput): Record<CapabilityId, CapabilityPlan>;
3
+ export declare function planCapability(capability: CapabilityId, input: CapabilityPlannerInput): CapabilityPlan;
@@ -0,0 +1,56 @@
1
+ //#region src/capabilities/readiness/planner.ts
2
+ const CAPABILITIES = [
3
+ "vision",
4
+ "image-generation",
5
+ "stt",
6
+ "tts"
7
+ ];
8
+ function planCapabilities(input) {
9
+ return Object.fromEntries(CAPABILITIES.map((capability) => [capability, planCapability(capability, input)]));
10
+ }
11
+ function planCapability(capability, input) {
12
+ const policy = input.policies[capability];
13
+ if (policy.disabled) return {
14
+ capability,
15
+ status: "disabled",
16
+ fallbacks: [],
17
+ rejected: [],
18
+ selectionSource: "none",
19
+ catalogVersion: input.catalogVersion
20
+ };
21
+ const explicit = (policy.explicit ?? []).map((entry, index) => ({
22
+ capability,
23
+ provider: entry.provider,
24
+ model: entry.model,
25
+ source: "explicit-config",
26
+ ready: entry.ready ?? true,
27
+ priority: index,
28
+ reasons: entry.reasons ?? (entry.ready === false ? ["explicit_model_unavailable"] : [])
29
+ }));
30
+ const automatic = [...input.automatic[capability] ?? []].sort((left, right) => left.priority - right.priority || left.provider.localeCompare(right.provider) || left.model.localeCompare(right.model));
31
+ const candidates = dedupeCandidates([...explicit, ...automatic]);
32
+ const ready = candidates.filter((candidate) => candidate.ready);
33
+ const rejected = candidates.filter((candidate) => !candidate.ready);
34
+ const primary = ready[0];
35
+ const explicitRejected = rejected.some((candidate) => candidate.source === "explicit-config");
36
+ return {
37
+ capability,
38
+ status: primary ? explicitRejected ? "degraded" : "ready" : "unavailable",
39
+ ...primary ? { primary } : {},
40
+ fallbacks: ready.slice(1),
41
+ rejected,
42
+ selectionSource: primary?.source ?? "none",
43
+ catalogVersion: input.catalogVersion
44
+ };
45
+ }
46
+ function dedupeCandidates(candidates) {
47
+ const seen = /* @__PURE__ */ new Set();
48
+ return candidates.filter((candidate) => {
49
+ const key = `${candidate.provider}/${candidate.model}`;
50
+ if (seen.has(key)) return false;
51
+ seen.add(key);
52
+ return true;
53
+ });
54
+ }
55
+ //#endregion
56
+ export { planCapabilities, planCapability };
@@ -0,0 +1,35 @@
1
+ export type CapabilityId = 'vision' | 'image-generation' | 'stt' | 'tts';
2
+ export type CandidateSource = 'native-model' | 'explicit-config' | 'installed-local' | 'xopc-cloud-managed' | 'configured-provider' | 'credentialless-fallback';
3
+ export interface CapabilityCandidate {
4
+ capability: CapabilityId;
5
+ provider: string;
6
+ model: string;
7
+ source: CandidateSource;
8
+ ready: boolean;
9
+ priority: number;
10
+ reasons: string[];
11
+ metadata?: Record<string, unknown>;
12
+ }
13
+ export interface CapabilityPlan {
14
+ capability: CapabilityId;
15
+ status: 'ready' | 'degraded' | 'unavailable' | 'disabled';
16
+ primary?: CapabilityCandidate;
17
+ fallbacks: CapabilityCandidate[];
18
+ rejected: CapabilityCandidate[];
19
+ selectionSource: CandidateSource | 'none';
20
+ catalogVersion?: string | null;
21
+ }
22
+ export interface CapabilityPolicy {
23
+ disabled?: boolean;
24
+ explicit?: Array<{
25
+ provider: string;
26
+ model: string;
27
+ ready?: boolean;
28
+ reasons?: string[];
29
+ }>;
30
+ }
31
+ export interface CapabilityPlannerInput {
32
+ policies: Record<CapabilityId, CapabilityPolicy>;
33
+ automatic: Partial<Record<CapabilityId, CapabilityCandidate[]>>;
34
+ catalogVersion?: string | null;
35
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -12,6 +12,7 @@ import { formatExamples, register } from "../registry.js";
12
12
  import { getContextWithOpts } from "../context.js";
13
13
  import { getWorkspacePath } from "../../config/workspace-path-helpers.js";
14
14
  import "../../config/index.js";
15
+ import { getXopcCloudCatalogCoordinator } from "../../providers/xopc-cloud-catalog-coordinator.js";
15
16
  import { listSessions } from "./agent/sessions.js";
16
17
  import { renderStreamToTerminal } from "./agent/stream-renderer.js";
17
18
  import { startInteractiveChat } from "./agent/interactive.js";
@@ -38,6 +39,14 @@ function createAgentCommand(_ctx) {
38
39
  }
39
40
  const modelFromConfig = getAgentDefaultModelRef(config);
40
41
  const modelId = options.model?.trim() || modelFromConfig;
42
+ if (modelId?.startsWith("xopc-cloud/")) {
43
+ const readiness = await getXopcCloudCatalogCoordinator().ensure({
44
+ reason: "agent-run",
45
+ network: "if-empty",
46
+ timeoutMs: 1e4
47
+ });
48
+ if (readiness.state === "unavailable" || readiness.state === "not-authorized") throw new Error(readiness.error?.message ?? "XOPC Cloud model catalog is unavailable");
49
+ }
41
50
  const bus = new MessageBus();
42
51
  if (ctx.isVerbose) log.info({
43
52
  model: modelId,
@@ -3,6 +3,7 @@ import { init_logger } from "../../utils/logger.js";
3
3
  import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
4
4
  import { getAllProviders, init_providers } from "../../providers/index.js";
5
5
  import { formatExamples, register } from "../registry.js";
6
+ import { disconnectProvider } from "../../providers/provider-disconnect.js";
6
7
  import { listAllProfiles, listProfilesForProvider, removeAuthProfile, upsertAuthProfile } from "../../auth/profiles/profiles.js";
7
8
  import { getOAuthProvider, getSupportedOAuthProviders } from "../utils/oauth-providers.js";
8
9
  import { colorizeStatus, colors } from "../utils/colors.js";
@@ -69,7 +70,7 @@ function createAuthCommand(_ctx) {
69
70
  else log.warn(`Profile not found: ${options.profile}`);
70
71
  return;
71
72
  }
72
- await new CredentialResolver().deleteProviderCredential(provider);
73
+ await disconnectProvider(provider);
73
74
  log.info(`All credentials removed for provider: ${provider}`);
74
75
  });
75
76
  cmd.command("login <provider>").description("Login to a provider using OAuth").option("-p, --profile <profileId>", "Profile ID (default: provider:default)").action(async (provider, _options) => {
@@ -98,7 +99,7 @@ function createAuthCommand(_ctx) {
98
99
  else log.warn(`Profile not found: ${options.profile}`);
99
100
  return;
100
101
  }
101
- await new CredentialResolver().deleteProviderCredential(provider);
102
+ await disconnectProvider(provider);
102
103
  log.info(`Logged out from provider: ${provider}`);
103
104
  });
104
105
  const profilesCmd = cmd.command("profiles").description("Manage auth profiles");
@@ -147,7 +148,7 @@ function createAuthCommand(_ctx) {
147
148
  const providers = /* @__PURE__ */ new Set();
148
149
  for (const profile of profiles) providers.add(profile.provider);
149
150
  for (const token of oauthTokens) providers.add(token.provider);
150
- for (const provider of providers) await resolver.deleteProviderCredential(provider);
151
+ for (const provider of providers) await disconnectProvider(provider);
151
152
  log.info("All authentication credentials cleared.");
152
153
  });
153
154
  cmd.command("providers").description("List supported providers and their auth methods").action(() => {
@@ -52,7 +52,7 @@ async function checkDatabaseSchema(ctx) {
52
52
  id: "database-schema",
53
53
  label: "Database schema",
54
54
  status: "pass",
55
- message: `SQLite schema v${status.dbVersion} (current release v123).`,
55
+ message: `SQLite schema v${status.dbVersion} (current release v125).`,
56
56
  hints: []
57
57
  };
58
58
  }
@@ -6,6 +6,7 @@ import { formatExamples, register } from "../registry.js";
6
6
  import { getContextWithOpts } from "../context.js";
7
7
  import "../../config/index.js";
8
8
  import { prepareUpdateGlobalDefaults } from "../../gateway/global-defaults-admin.js";
9
+ import { disconnectProvider } from "../../providers/provider-disconnect.js";
9
10
  import { colors } from "../utils/colors.js";
10
11
  import { runCliOAuthLogin } from "../utils/oauth-login.js";
11
12
  import { input } from "@inquirer/prompts";
@@ -191,7 +192,7 @@ async function runAuthLogin(provider, options) {
191
192
  }
192
193
  }
193
194
  async function runAuthLogout(provider) {
194
- await new CredentialResolver().deleteProviderCredential(provider);
195
+ await disconnectProvider(provider);
195
196
  console.log(`✅ Credentials removed for ${provider}`);
196
197
  }
197
198
  function attachModelsListOptions(command) {
@@ -2,26 +2,8 @@
2
2
  * Catalog-driven model configuration for onboarding.
3
3
  */
4
4
  import type { Config } from '../../../config/schema.js';
5
- import { type ModelCatalogStore } from '../../../providers/model-catalog-store.js';
6
- import { XopcCloudModelSource } from '../../../providers/xopc-cloud-model-source.js';
5
+ import { type XopcCloudCatalogCoordinator } from '../../../providers/xopc-cloud-catalog-coordinator.js';
7
6
  import type { CLIContext } from '../../registry.js';
8
- export declare function defaultXopcCloudImageModel(catalogStore?: ModelCatalogStore): string | undefined;
9
- export declare function defaultXopcCloudVisionModel(catalogStore?: ModelCatalogStore): string | undefined;
10
- export declare function defaultXopcCloudAudioModels(catalogStore?: ModelCatalogStore): {
11
- stt?: string;
12
- tts?: {
13
- model: string;
14
- voice: string;
15
- maxCharacters: number;
16
- };
17
- };
18
- export declare function setPrimaryModel(config: Config, workspacePath: string, modelRef: string, defaultImageGenerationModel?: string, defaultAudioModels?: {
19
- stt?: string;
20
- tts?: {
21
- model: string;
22
- voice: string;
23
- maxCharacters: number;
24
- };
25
- }, defaultVisionModel?: string): Config;
26
- export declare function refreshOnboardModelCatalogIfNeeded(provider: string, hasCatalogModels: boolean, source?: Pick<XopcCloudModelSource, 'refresh'>): Promise<void>;
7
+ export declare function setPrimaryModel(config: Config, workspacePath: string, modelRef: string): Config;
8
+ export declare function refreshOnboardModelCatalogIfNeeded(provider: string, hasCatalogModels: boolean, coordinator?: Pick<XopcCloudCatalogCoordinator, 'refresh'>): Promise<void>;
27
9
  export declare function setupModel(existingConfig: Config | null, ctx: CLIContext): Promise<Config>;
@@ -2,7 +2,6 @@ import { getAgentDefaultModelRef, init_schema } from "../../../config/schema.js"
2
2
  import { resolveModelsJsonPath } from "../../../config/paths.js";
3
3
  import { init_models_json, loadModelsJson, saveModelsJson } from "../../../config/models-json.js";
4
4
  import { getApiKeyFromEnv } from "../../../providers/env-keys.js";
5
- import { getModelCatalogStore, init_model_catalog_store } from "../../../providers/model-catalog-store.js";
6
5
  import { getModelRegistry } from "../../../providers/model-registry.js";
7
6
  import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
8
7
  import { getAllProviders, getModelsByProvider, getProviderDisplayName, init_providers, providerSupportsApiKey, providerSupportsOAuth } from "../../../providers/index.js";
@@ -10,7 +9,7 @@ import { getDomesticProviderBaseUrl, getDomesticProviderPreset, getDomesticProvi
10
9
  import { getProviderHint, getRecommendedModelsForProvider, sortModelsForPicker, sortProvidersForPicker } from "../../../providers/presentation.js";
11
10
  import { prepareUpdateGlobalDefaults } from "../../../gateway/global-defaults-admin.js";
12
11
  import { discoverProviderModels, isProviderApiDiscoverable } from "../../../providers/model-discovery.js";
13
- import { XopcCloudModelSource } from "../../../providers/xopc-cloud-model-source.js";
12
+ import { getXopcCloudCatalogCoordinator } from "../../../providers/xopc-cloud-catalog-coordinator.js";
14
13
  import { listProfilesForProvider } from "../../../auth/profiles/profiles.js";
15
14
  import { getOAuthProvider } from "../../utils/oauth-providers.js";
16
15
  import { colors } from "../../utils/colors.js";
@@ -24,29 +23,7 @@ init_credentials();
24
23
  init_models_json();
25
24
  init_schema();
26
25
  init_providers();
27
- init_model_catalog_store();
28
- function defaultXopcCloudImageModel(catalogStore = getModelCatalogStore()) {
29
- const model = catalogStore.getSource("xopc-cloud")?.models.find((entry) => entry.availability === "available" && entry.kind === "image" && entry.operations.includes("images.generate"));
30
- return model ? `xopc-cloud/${model.id}` : void 0;
31
- }
32
- function defaultXopcCloudVisionModel(catalogStore = getModelCatalogStore()) {
33
- const model = catalogStore.getSource("xopc-cloud")?.models.find((entry) => entry.availability === "available" && entry.kind === "language" && entry.input.includes("image") && (entry.operations.includes("chat.completions") || entry.operations.includes("responses")));
34
- return model ? `xopc-cloud/${model.id}` : void 0;
35
- }
36
- function defaultXopcCloudAudioModels(catalogStore = getModelCatalogStore()) {
37
- const models = catalogStore.getSource("xopc-cloud")?.models.filter((entry) => entry.availability === "available") ?? [];
38
- const stt = models.find((entry) => entry.kind === "stt");
39
- const tts = models.find((entry) => entry.kind === "tts" && entry.tts?.defaultVoice);
40
- return {
41
- ...stt ? { stt: stt.id } : {},
42
- ...tts?.tts?.defaultVoice ? { tts: {
43
- model: tts.id,
44
- voice: tts.tts.defaultVoice,
45
- maxCharacters: tts.tts.maxCharacters
46
- } } : {}
47
- };
48
- }
49
- function setPrimaryModel(config, workspacePath, modelRef, defaultImageGenerationModel, defaultAudioModels, defaultVisionModel) {
26
+ function setPrimaryModel(config, workspacePath, modelRef) {
50
27
  const id = config.agents.default ?? config.agents.list[0]?.id ?? "main";
51
28
  const index = config.agents.list.findIndex((entry) => entry.id === id);
52
29
  let nextConfig = config;
@@ -73,57 +50,10 @@ function setPrimaryModel(config, workspacePath, modelRef, defaultImageGeneration
73
50
  roles: {
74
51
  ...currentModels?.roles,
75
52
  deep: { model: modelRef }
76
- },
77
- ...!currentModels?.imageModel && defaultVisionModel ? { imageModel: { primary: defaultVisionModel } } : {},
78
- ...!currentModels?.imageGenerationModel && defaultImageGenerationModel ? { imageGenerationModel: { primary: defaultImageGenerationModel } } : {}
53
+ }
79
54
  } });
80
55
  if (prep.ok === false) throw new Error(prep.error);
81
- let configured = prep.data.nextConfig;
82
- if (defaultAudioModels?.stt && !configured.tools.media?.audio) configured = {
83
- ...configured,
84
- tools: {
85
- ...configured.tools,
86
- media: {
87
- ...configured.tools.media,
88
- audio: {
89
- enabled: true,
90
- provider: "xopc-cloud",
91
- models: [{
92
- provider: "xopc-cloud",
93
- model: defaultAudioModels.stt,
94
- capabilities: ["audio"]
95
- }],
96
- providers: { "xopc-cloud": { model: defaultAudioModels.stt } },
97
- fallback: {
98
- enabled: false,
99
- order: []
100
- }
101
- }
102
- }
103
- }
104
- };
105
- if (defaultAudioModels?.tts && !configured.messages?.tts) configured = {
106
- ...configured,
107
- messages: {
108
- ...configured.messages,
109
- tts: {
110
- enabled: true,
111
- provider: "xopc-cloud",
112
- trigger: "off",
113
- fallback: {
114
- enabled: false,
115
- order: []
116
- },
117
- maxTextLength: defaultAudioModels.tts.maxCharacters,
118
- timeoutMs: 6e4,
119
- providers: { "xopc-cloud": {
120
- model: defaultAudioModels.tts.model,
121
- voice: defaultAudioModels.tts.voice
122
- } }
123
- }
124
- }
125
- };
126
- return configured;
56
+ return prep.data.nextConfig;
127
57
  }
128
58
  function formatRecommended(provider) {
129
59
  const labels = getRecommendedModelsForProvider(provider, 3).map((m) => m.name || m.id);
@@ -166,11 +96,12 @@ function getModelsForProvider(provider) {
166
96
  };
167
97
  });
168
98
  }
169
- async function refreshOnboardModelCatalogIfNeeded(provider, hasCatalogModels, source) {
99
+ async function refreshOnboardModelCatalogIfNeeded(provider, hasCatalogModels, coordinator = getXopcCloudCatalogCoordinator()) {
170
100
  if (provider !== "xopc-cloud" || hasCatalogModels) return;
171
101
  console.log("\n→ Loading models from XOPC Model Service...");
172
- const result = await (source ?? new XopcCloudModelSource()).refresh();
173
- if (result.status === "skipped") throw new Error("XOPC Model Service credentials are unavailable after OAuth login. Please sign in again.");
102
+ const result = await coordinator.refresh("oauth");
103
+ if (result.state === "not-authorized") throw new Error("XOPC Model Service credentials are unavailable after OAuth login. Please sign in again.");
104
+ if (result.error || result.modelCount === 0) throw new Error(result.error?.message ?? "XOPC Model Service did not publish any models for this account.");
174
105
  console.log(colors.green(`✓ Loaded ${result.modelCount} models`));
175
106
  }
176
107
  function discoveredModelsToChoices(provider, models) {
@@ -545,14 +476,7 @@ async function setupModel(existingConfig, ctx) {
545
476
  }))
546
477
  });
547
478
  console.log("\n✅ Model configured:", model);
548
- const imageModel = provider === "xopc-cloud" ? defaultXopcCloudImageModel() : void 0;
549
- const visionModel = provider === "xopc-cloud" ? defaultXopcCloudVisionModel() : void 0;
550
- const audioModels = provider === "xopc-cloud" ? defaultXopcCloudAudioModels() : void 0;
551
- if (visionModel) console.log("✅ Image understanding configured:", visionModel);
552
- if (imageModel) console.log("✅ Image generation configured:", imageModel);
553
- if (audioModels?.stt) console.log("✅ Speech recognition configured:", audioModels.stt);
554
- if (audioModels?.tts) console.log("✅ Speech synthesis configured:", audioModels.tts.model);
555
- return setPrimaryModel(config, ctx.workspacePath, model, imageModel, audioModels, visionModel);
479
+ return setPrimaryModel(config, ctx.workspacePath, model);
556
480
  }
557
481
  //#endregion
558
- export { defaultXopcCloudAudioModels, defaultXopcCloudImageModel, defaultXopcCloudVisionModel, refreshOnboardModelCatalogIfNeeded, setPrimaryModel, setupModel };
482
+ export { refreshOnboardModelCatalogIfNeeded, setPrimaryModel, setupModel };
@@ -3,15 +3,15 @@ import { init_logger } from "../../utils/logger.js";
3
3
  import { loadConfig, saveConfig } from "../../config/loader.js";
4
4
  import { resolveGatewayEffectiveHost } from "../../config/gateway-bind.js";
5
5
  import { loadTunnelState } from "../../tunnel/tunnel-state.js";
6
+ import { formatExamples, register } from "../registry.js";
7
+ import "../../config/index.js";
6
8
  import { TUNNEL_RISK_SUMMARY_LINES, TunnelConsentError, assertTunnelMayStart, hasValidTunnelConsent } from "../../tunnel/consent.js";
7
9
  import { resolveTunnelBrokerUrl, resolveTunnelRegistrationSecret } from "../../tunnel/env.js";
8
- import { applyTunnelConsentToConfig, mergeTunnelConfigPatch, setTunnelEnabledInConfig } from "../../tunnel/tunnel-config.js";
9
10
  import { ensureFrpcBinary } from "../../tunnel/frpc-binary.js";
10
11
  import { getTunnelService } from "../../tunnel/tunnel-service.js";
11
12
  import { resolveFrpSubdomainHost } from "../../tunnel/frp-subdomain-host.js";
13
+ import { applyTunnelConsentToConfig, mergeTunnelConfigPatch, setTunnelEnabledInConfig } from "../../tunnel/tunnel-config.js";
12
14
  import "../../tunnel/index.js";
13
- import { formatExamples, register } from "../registry.js";
14
- import "../../config/index.js";
15
15
  import { Command } from "commander";
16
16
  //#region src/cli/commands/tunnel.ts
17
17
  init_logger();
@@ -1,4 +1,5 @@
1
1
  import type { OAuthCredentials, OAuthLoginCallbacks, OAuthProviderInterface } from '../../auth/index.js';
2
+ import { type CatalogReadiness } from '../../providers/xopc-cloud-catalog-coordinator.js';
2
3
  import { type OAuthProviderConfig } from './oauth-providers.js';
3
4
  export interface RunCliOAuthLoginOptions {
4
5
  provider: string;
@@ -8,6 +9,7 @@ export interface RunCliOAuthLoginResult {
8
9
  provider: string;
9
10
  credentials: OAuthCredentials;
10
11
  expires?: number;
12
+ catalog?: CatalogReadiness;
11
13
  }
12
14
  export declare function buildCliOAuthCallbacks(params: {
13
15
  config: OAuthProviderConfig;
@@ -1,6 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
4
+ import { getXopcCloudCatalogCoordinator } from "../../providers/xopc-cloud-catalog-coordinator.js";
4
5
  import { getOAuthProvider } from "./oauth-providers.js";
5
6
  import { input, select } from "@inquirer/prompts";
6
7
  //#region src/cli/utils/oauth-login.ts
@@ -75,10 +76,17 @@ async function runCliOAuthLogin(options) {
75
76
  onProgress: options.onProgress
76
77
  }));
77
78
  await new CredentialResolver().saveOAuthCredentials(options.provider, credentials);
79
+ let catalog;
80
+ if (options.provider === "xopc-cloud") {
81
+ options.onProgress?.("Syncing XOPC Cloud model catalog...");
82
+ catalog = await getXopcCloudCatalogCoordinator().refresh("oauth");
83
+ if (catalog.error) options.onProgress?.(`Authorization succeeded, but model catalog sync failed: ${catalog.error.message}`);
84
+ }
78
85
  return {
79
86
  provider: options.provider,
80
87
  credentials,
81
- expires: credentials.expires
88
+ expires: credentials.expires,
89
+ catalog
82
90
  };
83
91
  }
84
92
  //#endregion