@xopcai/xopc 0.0.208 → 0.0.211

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 (316) 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-D0mYZqhc.js → activity-store-BzjFoSr0.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-MWLQWL_i.js → agent-avatar-dicebear-DTfjhfVE.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents-CjhgfuVJ.js +68 -0
  6. package/dist/gateway/static/root/assets/{api-DZA1yVzM.js → api-D269PnU9.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-B2X6quAF.js → app-management-settings-panel-BFpfQDWc.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-BZW-c38q.js → appearance-settings-DLxFdqhY.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-CjmlGB5V.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-CK-gsjsJ.js → archive-plugin-DPlH4dnc.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-EJGP4rCw.js → attachment-load-xqfLLd0I.js} +1 -1
  12. package/dist/gateway/static/root/assets/automations-page-4m6Ey6wG.js +6 -0
  13. package/dist/gateway/static/root/assets/{binary-plugins-Tbss_4P-.js → binary-plugins-C0tuoPXk.js} +1 -1
  14. package/dist/gateway/static/root/assets/{block-editor-C-dOWigw.js → block-editor-Deyphj1o.js} +6 -6
  15. package/dist/gateway/static/root/assets/browser-settings-page-CAGCYx8U.js +8 -0
  16. package/dist/gateway/static/root/assets/{browser-workflow-inputs-DW06Zo1N.js → browser-workflow-inputs-CYEbXyRF.js} +1 -1
  17. package/dist/gateway/static/root/assets/{browser-workflows-page-B6RnRGwm.js → browser-workflows-page-Bf0tPbGi.js} +2 -2
  18. package/dist/gateway/static/root/assets/capabilities-settings-panel-CKfLsxTI.js +7 -0
  19. package/dist/gateway/static/root/assets/{capability-presets-api-Cc3BtQar.js → capability-presets-api-DPkFA_-R.js} +1 -1
  20. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CpipKNqX.js +3 -0
  21. package/dist/gateway/static/root/assets/{channel-recipient-api-BvZO5FaO.js → channel-recipient-api-DqKaAcnZ.js} +1 -1
  22. package/dist/gateway/static/root/assets/channels-settings-Bvq-O4pt.js +1 -0
  23. package/dist/gateway/static/root/assets/channels-status-swr-CrMld2l7.js +1 -0
  24. package/dist/gateway/static/root/assets/chat-terminal-dock-CTDRZa7e.js +36 -0
  25. package/dist/gateway/static/root/assets/{connectors-api-CUl6_EQJ.js → connectors-api-Buu8fif8.js} +1 -1
  26. package/dist/gateway/static/root/assets/connectors-page-CSQRzaVn.js +2 -0
  27. package/dist/gateway/static/root/assets/{cron-expression-BD9MgoE_.js → cron-expression-DTLR82NB.js} +1 -1
  28. package/dist/gateway/static/root/assets/{date-picker-ChqNmoxw.js → date-picker-DyNogHQH.js} +1 -1
  29. package/dist/gateway/static/root/assets/{dependency-picker-CDUmFs6H.js → dependency-picker-BpnCuo7B.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-D61gqxaD.js → desktop-pet-CDKI4gVB.js} +1 -1
  31. package/dist/gateway/static/root/assets/{desktop-pet-settings-QvuJvIX_.js → desktop-pet-settings-DjT5C2a3.js} +1 -1
  32. package/dist/gateway/static/root/assets/{directory-picker-path-field-DvXMvDNY.js → directory-picker-path-field-DlJY90TM.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-debug-page-DMdVTAQ3.js → extension-debug-page-DWf2z7q5.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-page-BNzxZtaK.js → extension-page-Dorx0kf9.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-settings-page-DoEfyizU.js → extension-settings-page-B1wU9ZOB.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-config-api-o7AKvthC.js → gateway-config-api-B1lG4dNr.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-swr-BQbkUP5X.js → gateway-config-swr-BIxuwPQi.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-settings-TO5YYZ9a.js → gateway-settings-DqIOqJjM.js} +1 -1
  39. package/dist/gateway/static/root/assets/{gateway-startup-retry-DIgdpHgk.js → gateway-startup-retry-BpZgd4U-.js} +1 -1
  40. package/dist/gateway/static/root/assets/heartbeat-settings-DG4Kmgkc.js +1 -0
  41. package/dist/gateway/static/root/assets/home-page-BhqItS_s.js +1 -0
  42. package/dist/gateway/static/root/assets/image-generation-api-PkhYohDa.js +1 -0
  43. package/dist/gateway/static/root/assets/index-DLhvsU9B.css +2 -0
  44. package/dist/gateway/static/root/assets/index-_cuTcWjB.js +107 -0
  45. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-4xaM3jjU.js → keyboard-shortcuts-settings-6OQT3gQF.js} +1 -1
  46. package/dist/gateway/static/root/assets/local-app-workbench-page-DWjTmzxw.js +2 -0
  47. package/dist/gateway/static/root/assets/{local-apps-page-C1xDicdr.js → local-apps-page-DfruRAmE.js} +1 -1
  48. package/dist/gateway/static/root/assets/{locale-store-pByvK12G.js → locale-store-C5MK9WcP.js} +1 -1
  49. package/dist/gateway/static/root/assets/logs-page-BA5efZ8B.js +2 -0
  50. package/dist/gateway/static/root/assets/{management-settings-D1XdHm7v.js → management-settings-L1VYkywO.js} +1 -1
  51. package/dist/gateway/static/root/assets/{markdown-split-B_Ijq1Fr.js → markdown-split-oqgHbqt-.js} +1 -1
  52. package/dist/gateway/static/root/assets/markdown-view-DD_PgVue.css +1 -0
  53. package/dist/gateway/static/root/assets/{markdown-view-CyJlGUxB.js → markdown-view-V4rcPPH0.js} +1 -1
  54. package/dist/gateway/static/root/assets/{media-plugins-CXXNRROJ.js → media-plugins-Bb6gSX2o.js} +1 -1
  55. package/dist/gateway/static/root/assets/messages-ctG2e-ix.js +3 -0
  56. package/dist/gateway/static/root/assets/{notes-page-rkePB4CB.js → notes-page-B1rOXjpT.js} +1 -1
  57. package/dist/gateway/static/root/assets/notes-workbench-CkHXVmKP.js +4 -0
  58. package/dist/gateway/static/root/assets/{page-tabs-gw-RMQCV.js → page-tabs-CBuCKeyy.js} +1 -1
  59. package/dist/gateway/static/root/assets/{preview-open-alternatives-B8aMScJ2.js → preview-open-alternatives-BQ0tLfPO.js} +1 -1
  60. package/dist/gateway/static/root/assets/{product-open-page-CjcpkWAz.js → product-open-page-DPeFn7Hu.js} +1 -1
  61. package/dist/gateway/static/root/assets/project-detail-page-DCqet9-L.js +1 -0
  62. package/dist/gateway/static/root/assets/projects-page-D0t_AjzG.js +1 -0
  63. package/dist/gateway/static/root/assets/remote-access-hub-BUWPoBvw.js +1 -0
  64. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Ch5qq86o.js → runtime-tools-settings-panel-BCfQNzjG.js} +2 -2
  65. package/dist/gateway/static/root/assets/{schema-form-DHYWYUFt.js → schema-form-Bo7YbHYN.js} +1 -1
  66. package/dist/gateway/static/root/assets/sessions-page-vLhrrM3m.js +1 -0
  67. package/dist/gateway/static/root/assets/settings-advanced-gate-OP1y0Y8M.js +1 -0
  68. package/dist/gateway/static/root/assets/{settings-form-section-DlzZx0-i.js → settings-form-section-B9dnKr3M.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-loading-skeleton-BVLhreQi.js → settings-loading-skeleton-CYDV2JtY.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-page-BJU-kUnN.js → settings-page-DbrIYfS9.js} +1 -1
  71. package/dist/gateway/static/root/assets/setup-status-panel-Cxc-Ejl5.js +1 -0
  72. package/dist/gateway/static/root/assets/{share-preview-page-hvIuZXMe.js → share-preview-page-olgr7LLN.js} +1 -1
  73. package/dist/gateway/static/root/assets/shares-settings-ZOqC6-aA.js +1 -0
  74. package/dist/gateway/static/root/assets/skill-reload-api-DwvC3Iuf.js +1 -0
  75. package/dist/gateway/static/root/assets/{skills-page-Dlvuh7D-.js → skills-page-PE16CNw5.js} +1 -1
  76. package/dist/gateway/static/root/assets/{skills-page.utils-B6ddOpnf.js → skills-page.utils-nXmBcBxt.js} +1 -1
  77. package/dist/gateway/static/root/assets/{system-settings-panel-BdbCAyoA.js → system-settings-panel-C3qPwAdY.js} +1 -1
  78. package/dist/gateway/static/root/assets/task-detail-page-DCRB-5q-.js +1 -0
  79. package/dist/gateway/static/root/assets/{theme-store-BtdGacMI.js → theme-store-KR5Otp5w.js} +1 -1
  80. package/dist/gateway/static/root/assets/{typed-models-lib-CL6qHYJA.js → typed-models-lib-lMZodtDF.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-autosave-DysNnqCS.js → use-autosave-CKpatP3S.js} +1 -1
  82. package/dist/gateway/static/root/assets/user-context-page-CoiedRuA.js +1 -0
  83. package/dist/gateway/static/root/assets/{voice-api-key-field-UEsO9Jr-.js → voice-api-key-field-CDcv0Wbh.js} +1 -1
  84. package/dist/gateway/static/root/assets/{work-discovery-overlay-B9disASf.js → work-discovery-overlay-CGdT22un.js} +1 -1
  85. package/dist/gateway/static/root/assets/work-discovery-page-BwaU1RqI.js +1 -0
  86. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-A0zTQHFQ.js → workflow-run-setup-panel-BAHYNlQt.js} +2 -2
  87. package/dist/gateway/static/root/assets/workflows-page-DHYmh9G7.js +5 -0
  88. package/dist/gateway/static/root/index.html +10 -10
  89. package/dist/package.js +1 -1
  90. package/dist/src/agent/agent-manager.js +1 -1
  91. package/dist/src/agent/background-review/coordinator.d.ts +1 -1
  92. package/dist/src/agent/background-review/coordinator.js +4 -5
  93. package/dist/src/agent/background-review/run-background-review.js +0 -1
  94. package/dist/src/agent/background-review/settings.d.ts +1 -2
  95. package/dist/src/agent/background-review/settings.js +3 -4
  96. package/dist/src/agent/external-tools/composio-provider.js +8 -4
  97. package/dist/src/agent/image/generation/providers/xopc-cloud.js +2 -1
  98. package/dist/src/agent/image/tool-model-config.js +15 -9
  99. package/dist/src/agent/memory/builtin-provider.js +1 -2
  100. package/dist/src/agent/memory/manager.js +2 -0
  101. package/dist/src/agent/memory/sensitivity.js +1 -1
  102. package/dist/src/agent/memory/understanding/service.js +43 -19
  103. package/dist/src/agent/memory/user-context-coordinator.js +1 -1
  104. package/dist/src/agent/tools/image-generate-tool.js +23 -7
  105. package/dist/src/automations/domain/validation.d.ts +7 -7
  106. package/dist/src/automations/draft/automation-draft-validator.d.ts +2 -2
  107. package/dist/src/capabilities/readiness/from-config.d.ts +10 -0
  108. package/dist/src/capabilities/readiness/from-config.js +128 -0
  109. package/dist/src/capabilities/readiness/index.d.ts +3 -0
  110. package/dist/src/capabilities/readiness/index.js +3 -0
  111. package/dist/src/capabilities/readiness/planner.d.ts +3 -0
  112. package/dist/src/capabilities/readiness/planner.js +56 -0
  113. package/dist/src/capabilities/readiness/types.d.ts +35 -0
  114. package/dist/src/capabilities/readiness/types.js +1 -0
  115. package/dist/src/cli/commands/agent.js +9 -0
  116. package/dist/src/cli/commands/auth.js +4 -3
  117. package/dist/src/cli/commands/connectors.js +1 -1
  118. package/dist/src/cli/commands/models.js +2 -1
  119. package/dist/src/cli/commands/onboard/model.d.ts +3 -21
  120. package/dist/src/cli/commands/onboard/model.js +10 -86
  121. package/dist/src/cli/utils/oauth-login.d.ts +2 -0
  122. package/dist/src/cli/utils/oauth-login.js +9 -1
  123. package/dist/src/config/agent-profile.js +1 -1
  124. package/dist/src/config/index.js +2 -2
  125. package/dist/src/config/paths-state.d.ts +2 -0
  126. package/dist/src/config/paths-state.js +5 -1
  127. package/dist/src/config/paths.d.ts +1 -1
  128. package/dist/src/config/paths.js +2 -2
  129. package/dist/src/config/schema.js +1 -1
  130. package/dist/src/connectors/auth-provider-registry.d.ts +2 -1
  131. package/dist/src/connectors/auth-provider-registry.js +5 -2
  132. package/dist/src/connectors/composio-sessions.d.ts +39 -0
  133. package/dist/src/connectors/composio-sessions.js +66 -7
  134. package/dist/src/connectors/composio.d.ts +4 -1
  135. package/dist/src/connectors/composio.js +34 -7
  136. package/dist/src/connectors/connected-source-cursor.d.ts +9 -0
  137. package/dist/src/connectors/connected-source-cursor.js +30 -0
  138. package/dist/src/connectors/connected-source-ingestion.js +67 -46
  139. package/dist/src/connectors/connected-source-normalizers.d.ts +1 -0
  140. package/dist/src/connectors/connected-source-normalizers.js +33 -2
  141. package/dist/src/connectors/connected-source-sanitization.d.ts +1 -0
  142. package/dist/src/connectors/connected-source-sanitization.js +21 -0
  143. package/dist/src/connectors/connector-identity.js +10 -2
  144. package/dist/src/connectors/content-enrichment.d.ts +29 -0
  145. package/dist/src/connectors/content-enrichment.js +273 -0
  146. package/dist/src/connectors/health.js +1 -1
  147. package/dist/src/connectors/learning-coordinator.js +1 -2
  148. package/dist/src/connectors/learning-recipes.js +28 -33
  149. package/dist/src/connectors/runtime-adapter-registry.js +14 -1
  150. package/dist/src/discussions/live-worker.d.ts +1 -0
  151. package/dist/src/discussions/live-worker.js +7 -1
  152. package/dist/src/discussions/repository.js +11 -1
  153. package/dist/src/discussions/sealer.d.ts +1 -1
  154. package/dist/src/discussions/sealer.js +16 -7
  155. package/dist/src/discussions/transcript.js +27 -1
  156. package/dist/src/discussions/types.d.ts +4 -0
  157. package/dist/src/gateway/agents-admin.js +1 -1
  158. package/dist/src/gateway/hono/app.js +8 -3
  159. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
  160. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +8 -1
  161. package/dist/src/gateway/hono/oauth-async.d.ts +11 -5
  162. package/dist/src/gateway/hono/oauth-async.js +29 -16
  163. package/dist/src/gateway/hono/oauth.d.ts +1 -3
  164. package/dist/src/gateway/hono/oauth.js +22 -22
  165. package/dist/src/gateway/hono/routes/agent-stream.js +4 -1
  166. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  167. package/dist/src/gateway/hono/routes/connectors.js +16 -3
  168. package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
  169. package/dist/src/gateway/hono/routes/discussions.js +2 -1
  170. package/dist/src/gateway/hono/routes/lazy-bundles.js +2 -1
  171. package/dist/src/gateway/hono/routes/mcp.js +1 -1
  172. package/dist/src/gateway/hono/routes/models.js +59 -5
  173. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +60 -0
  174. package/dist/src/gateway/hono/routes/session-input-handler.js +75 -1
  175. package/dist/src/gateway/hono/routes/understanding-sources.js +29 -0
  176. package/dist/src/gateway/hono/routes/voice.d.ts +1 -2
  177. package/dist/src/gateway/hono/routes/voice.js +16 -35
  178. package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
  179. package/dist/src/gateway/rate-limit/buckets.js +12 -0
  180. package/dist/src/gateway/service/agent-runner.d.ts +9 -1
  181. package/dist/src/gateway/service/agent-runner.js +9 -0
  182. package/dist/src/gateway/service/session-input-coordinator.d.ts +12 -0
  183. package/dist/src/gateway/service/session-input-coordinator.js +63 -6
  184. package/dist/src/gateway/service.d.ts +8 -0
  185. package/dist/src/gateway/service.js +18 -0
  186. package/dist/src/knowledge/connected-understanding-pipeline.d.ts +1 -1
  187. package/dist/src/knowledge/connected-understanding-pipeline.js +74 -25
  188. package/dist/src/knowledge/ingestion-service.js +33 -15
  189. package/dist/src/knowledge/types.d.ts +2 -0
  190. package/dist/src/media-understanding/audio-transcription-runner.d.ts +2 -0
  191. package/dist/src/media-understanding/audio-transcription-runner.js +3 -1
  192. package/dist/src/media-understanding/runner.js +3 -1
  193. package/dist/src/media-understanding/types.d.ts +2 -0
  194. package/dist/src/providers/model-catalog-persistence.d.ts +9 -0
  195. package/dist/src/providers/model-catalog-persistence.js +172 -0
  196. package/dist/src/providers/model-catalog-ranking.d.ts +2 -0
  197. package/dist/src/providers/model-catalog-ranking.js +17 -0
  198. package/dist/src/providers/model-catalog-store.d.ts +13 -3
  199. package/dist/src/providers/model-catalog-store.js +24 -5
  200. package/dist/src/providers/model-catalog-sync-service.d.ts +3 -3
  201. package/dist/src/providers/model-catalog-sync-service.js +12 -7
  202. package/dist/src/providers/provider-auth-service.d.ts +1 -0
  203. package/dist/src/providers/provider-auth-service.js +3 -0
  204. package/dist/src/providers/provider-disconnect.d.ts +11 -0
  205. package/dist/src/providers/provider-disconnect.js +33 -0
  206. package/dist/src/providers/xopc-cloud-catalog-coordinator.d.ts +56 -0
  207. package/dist/src/providers/xopc-cloud-catalog-coordinator.js +182 -0
  208. package/dist/src/providers/xopc-cloud-model-source.d.ts +6 -10
  209. package/dist/src/providers/xopc-cloud-model-source.js +49 -27
  210. package/dist/src/retrieval/audit.d.ts +1 -0
  211. package/dist/src/retrieval/audit.js +8 -0
  212. package/dist/src/retrieval/candidateFusion.d.ts +5 -0
  213. package/dist/src/retrieval/candidateFusion.js +20 -0
  214. package/dist/src/retrieval/queryProfile.d.ts +16 -0
  215. package/dist/src/retrieval/queryProfile.js +66 -0
  216. package/dist/src/retrieval/textFeatures.d.ts +5 -0
  217. package/dist/src/retrieval/textFeatures.js +71 -0
  218. package/dist/src/session/client-history.d.ts +1 -0
  219. package/dist/src/session/client-history.js +4 -0
  220. package/dist/src/session/index.js +1 -1
  221. package/dist/src/session/store.js +1 -1
  222. package/dist/src/storage/sqlite/fts.d.ts +0 -4
  223. package/dist/src/storage/sqlite/fts.js +2 -49
  224. package/dist/src/storage/sqlite/index.d.ts +3 -2
  225. package/dist/src/storage/sqlite/index.js +6 -5
  226. package/dist/src/storage/sqlite/knowledge-repository.d.ts +1 -0
  227. package/dist/src/storage/sqlite/knowledge-repository.js +4 -0
  228. package/dist/src/storage/sqlite/memory-records-repository.js +60 -38
  229. package/dist/src/storage/sqlite/row-mappers.js +2 -2
  230. package/dist/src/storage/sqlite/session-repository.js +2 -2
  231. package/dist/src/storage/sqlite/session-turn-replace-repository.d.ts +34 -0
  232. package/dist/src/storage/sqlite/session-turn-replace-repository.js +110 -0
  233. package/dist/src/storage/sqlite/transcript-repository.js +1 -1
  234. package/dist/src/storage/sqlite/user-context-quality-repository.d.ts +15 -0
  235. package/dist/src/storage/sqlite/user-context-quality-repository.js +46 -2
  236. package/dist/src/storage/sqlite/user-context-repository.d.ts +4 -0
  237. package/dist/src/storage/sqlite/user-context-repository.js +29 -3
  238. package/dist/src/tasks/home-query-service.d.ts +3 -1
  239. package/dist/src/tasks/home-query-service.js +73 -70
  240. package/dist/src/tui/backends/embedded-backend.js +12 -4
  241. package/dist/src/tui/tui-oauth-login.js +5 -0
  242. package/dist/src/tui/tui-startup-resources.js +1 -1
  243. package/dist/src/user-context/planner.d.ts +1 -0
  244. package/dist/src/user-context/planner.js +16 -29
  245. package/dist/src/user-context/retriever.d.ts +15 -0
  246. package/dist/src/user-context/retriever.js +65 -0
  247. package/dist/src/user-context/scope.d.ts +7 -0
  248. package/dist/src/user-context/scope.js +9 -0
  249. package/dist/src/user-context/sources/activity-clustering.js +30 -117
  250. package/dist/src/user-context/sources/index.d.ts +1 -0
  251. package/dist/src/user-context/sources/index.js +2 -1
  252. package/dist/src/user-context/sources/signal-clustering.d.ts +18 -0
  253. package/dist/src/user-context/sources/signal-clustering.js +131 -0
  254. package/dist/src/voice/audio/normalize.d.ts +17 -0
  255. package/dist/src/voice/audio/normalize.js +155 -0
  256. package/dist/src/voice/language-profile.d.ts +1 -4
  257. package/dist/src/voice/language-profile.js +2 -25
  258. package/dist/src/voice/local/runtime-client.d.ts +2 -0
  259. package/dist/src/voice/local/runtime-client.js +20 -1
  260. package/dist/src/voice/local/runtime-worker.js +7 -13
  261. package/dist/src/voice/local/wav.js +1 -1
  262. package/dist/src/voice/stt/availability.d.ts +1 -4
  263. package/dist/src/voice/stt/availability.js +3 -15
  264. package/dist/src/voice/stt/config.js +1 -0
  265. package/dist/src/voice/stt/factory.js +23 -0
  266. package/dist/src/voice/stt/index.d.ts +1 -0
  267. package/dist/src/voice/stt/index.js +2 -2
  268. package/dist/src/voice/stt/list-providers.js +1 -1
  269. package/dist/src/voice/stt/providers/local-transcription.js +7 -3
  270. package/dist/src/voice/stt/providers/xopc-cloud-transcription.js +3 -1
  271. package/dist/src/voice/stt/transcribe-core.d.ts +5 -1
  272. package/dist/src/voice/stt/transcribe-core.js +13 -5
  273. package/dist/src/voice/stt/types.d.ts +2 -0
  274. package/dist/src/voice/tts/factory.d.ts +1 -1
  275. package/dist/src/voice/tts/factory.js +23 -1
  276. package/dist/src/voice/tts/merge-config.js +5 -3
  277. package/dist/src/voice/tts/providers/xopc-cloud-speech.js +3 -1
  278. package/dist/src/voice/tts/types.d.ts +2 -0
  279. package/dist/src/voice/tts/types.js +4 -2
  280. package/dist/src/work-discovery/evaluation.d.ts +23 -0
  281. package/dist/src/work-discovery/evaluation.js +18 -1
  282. package/dist/src/work-discovery/index.js +2 -2
  283. package/package.json +4 -3
  284. package/dist/gateway/static/root/assets/agents-Bl8FQZxW.js +0 -68
  285. package/dist/gateway/static/root/assets/apps-page-CRUgTO10.js +0 -1
  286. package/dist/gateway/static/root/assets/automations-page-DrSwolhG.js +0 -6
  287. package/dist/gateway/static/root/assets/browser-settings-page-NlvDyMwD.js +0 -8
  288. package/dist/gateway/static/root/assets/capabilities-settings-panel-BWXUznw5.js +0 -7
  289. package/dist/gateway/static/root/assets/capability-presets-settings-panel-D0loEbzq.js +0 -3
  290. package/dist/gateway/static/root/assets/channels-settings-CcivCw8U.js +0 -1
  291. package/dist/gateway/static/root/assets/channels-status-swr-DkHAD2Zn.js +0 -1
  292. package/dist/gateway/static/root/assets/chat-terminal-dock-DVedGAeX.js +0 -36
  293. package/dist/gateway/static/root/assets/connectors-page-DlBSlfkv.js +0 -2
  294. package/dist/gateway/static/root/assets/heartbeat-settings-UZAn1aAQ.js +0 -1
  295. package/dist/gateway/static/root/assets/home-page-CRJDpy5E.js +0 -3
  296. package/dist/gateway/static/root/assets/index-BSjP0Wsx.css +0 -2
  297. package/dist/gateway/static/root/assets/index-C2ZYFBGL.js +0 -85
  298. package/dist/gateway/static/root/assets/local-app-workbench-page-D9bguWRo.js +0 -2
  299. package/dist/gateway/static/root/assets/logs-page-Gr-nE4nW.js +0 -2
  300. package/dist/gateway/static/root/assets/markdown-view-B12xeflb.css +0 -1
  301. package/dist/gateway/static/root/assets/messages-yG5P43Q9.js +0 -3
  302. package/dist/gateway/static/root/assets/notes-workbench-CpbD4XG2.js +0 -4
  303. package/dist/gateway/static/root/assets/project-detail-page-GvSYDbjR.js +0 -1
  304. package/dist/gateway/static/root/assets/projects-page-DPRxKGbs.js +0 -1
  305. package/dist/gateway/static/root/assets/remote-access-hub-WIzeu-gB.js +0 -1
  306. package/dist/gateway/static/root/assets/sessions-page-2XEJM0YE.js +0 -1
  307. package/dist/gateway/static/root/assets/settings-advanced-gate-g1GThZ0O.js +0 -1
  308. package/dist/gateway/static/root/assets/setup-status-panel-C6qj2L-q.js +0 -1
  309. package/dist/gateway/static/root/assets/shares-settings-BBpE1bep.js +0 -1
  310. package/dist/gateway/static/root/assets/skill-reload-api-DXORBJNk.js +0 -1
  311. package/dist/gateway/static/root/assets/task-detail-page-DC0hc8hp.js +0 -1
  312. package/dist/gateway/static/root/assets/user-context-page-Bwg4KV8B.js +0 -1
  313. package/dist/gateway/static/root/assets/work-discovery-page-CmPfOfHl.js +0 -1
  314. package/dist/gateway/static/root/assets/workflows-page-DhQNh7W6.js +0 -5
  315. package/dist/src/voice/local/runtime-dispatcher.d.ts +0 -9
  316. package/dist/src/voice/local/runtime-dispatcher.js +0 -20
@@ -1,13 +1,13 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
+ import { forEachNormalizedAudioSegment } from "../voice/audio/normalize.js";
3
4
  import { transcribe } from "../voice/stt/transcribe-core.js";
4
5
  import { isSTTAvailable } from "../voice/stt/availability.js";
5
6
  import { mergeSttConfigFromAppConfig } from "../voice/stt/config.js";
6
7
  import "../voice/stt/index.js";
7
8
  import { getDiscussionCapture, listDiscussionCaptures, listDiscussionTranscriptSegments, updateDiscussionCapture } from "./repository.js";
8
- import { assembleDiscussionTranscript } from "./transcript.js";
9
+ import { appendTranscriptWithoutOverlap, assembleDiscussionTranscript } from "./transcript.js";
9
10
  import { createHash } from "node:crypto";
10
- import { readFile } from "node:fs/promises";
11
11
  //#region src/discussions/sealer.ts
12
12
  init_logger();
13
13
  const log = createLogger("DiscussionSealer");
@@ -85,15 +85,24 @@ var DiscussionSealer = class {
85
85
  async transcribeFullRecording(capture) {
86
86
  const attachment = await this.deps.notes.getAttachmentPath(capture.noteId, capture.audioAttachmentId);
87
87
  if (!attachment) throw new Error("Discussion audio file is missing");
88
- const buffer = await readFile(attachment.filePath);
89
- if (this.deps.transcribeRecording) return this.deps.transcribeRecording(buffer, capture);
88
+ if (this.deps.transcribeRecording) return this.deps.transcribeRecording(attachment.filePath, capture);
90
89
  const config = this.deps.getConfig();
91
90
  const sttConfig = mergeSttConfigFromAppConfig(config.tools?.media?.audio, config.tools?.media);
92
91
  if (!isSTTAvailable(sttConfig)) throw new Error("STT is not configured");
93
- return transcribe(buffer, sttConfig, {
94
- mime: attachment.mimeType || capture.mimeType,
95
- fileName: attachment.fileName
92
+ let text = "";
93
+ let language;
94
+ await forEachNormalizedAudioSegment({ filePath: attachment.filePath }, async (buffer, index) => {
95
+ const result = await transcribe(buffer, sttConfig, {
96
+ mime: "audio/wav",
97
+ fileName: `discussion-recovery-${index}.wav`
98
+ });
99
+ text = appendTranscriptWithoutOverlap(text, result.text);
100
+ language ??= result.language;
96
101
  });
102
+ return {
103
+ text,
104
+ ...language ? { language } : {}
105
+ };
97
106
  }
98
107
  fail(capture, stage, code, message) {
99
108
  const current = getDiscussionCapture(capture.id);
@@ -1,11 +1,37 @@
1
1
  //#region src/discussions/transcript.ts
2
+ function searchableCharacters(value) {
3
+ let text = "";
4
+ const sourceEnds = [];
5
+ let sourceOffset = 0;
6
+ for (const character of value) {
7
+ sourceOffset += character.length;
8
+ if (!/[\p{L}\p{N}]/u.test(character)) continue;
9
+ text += character.toLocaleLowerCase();
10
+ sourceEnds.push(sourceOffset);
11
+ }
12
+ return {
13
+ text,
14
+ sourceEnds
15
+ };
16
+ }
17
+ function joinOverlap(left, remainder) {
18
+ return `${left}${/[\p{P}\p{S}]$/u.test(left) ? remainder.replace(/^[\s\p{P}\p{S}]+/u, "") : remainder}`.trim();
19
+ }
2
20
  function appendTranscriptWithoutOverlap(existing, next) {
3
21
  const left = existing.trim();
4
22
  const right = next.trim();
5
23
  if (!left) return right;
6
24
  if (!right) return left;
7
25
  const max = Math.min(200, left.length, right.length);
8
- for (let size = max; size >= 8; size -= 1) if (left.slice(-size).toLocaleLowerCase() === right.slice(0, size).toLocaleLowerCase()) return `${left}${right.slice(size)}`.trim();
26
+ for (let size = max; size >= 8; size -= 1) if (left.slice(-size).toLocaleLowerCase() === right.slice(0, size).toLocaleLowerCase()) return joinOverlap(left, right.slice(size));
27
+ const leftSearchable = searchableCharacters(left).text.slice(-200);
28
+ const rightSearchable = searchableCharacters(right);
29
+ const normalizedMax = Math.min(leftSearchable.length, rightSearchable.text.length);
30
+ for (let size = normalizedMax; size >= 5; size -= 1) {
31
+ if (leftSearchable.slice(-size) !== rightSearchable.text.slice(0, size)) continue;
32
+ const sourceEnd = rightSearchable.sourceEnds[size - 1];
33
+ return joinOverlap(left, right.slice(sourceEnd));
34
+ }
9
35
  return `${left}\n${right}`;
10
36
  }
11
37
  function assembleDiscussionTranscript(segments) {
@@ -132,6 +132,10 @@ export interface DiscussionMetrics {
132
132
  byStatus: Record<DiscussionStatus, number>;
133
133
  averageTimeToFirstTranscriptMs: number | null;
134
134
  averageTimeToCompleteMs: number | null;
135
+ totalSegments: number;
136
+ failedSegments: number;
137
+ retriedSegments: number;
138
+ averageSegmentLatencyMs: number | null;
135
139
  }
136
140
  export interface DiscussionDetail {
137
141
  discussion: DiscussionCapture;
@@ -1,5 +1,5 @@
1
- import { resolveCapabilityPresetLayer, resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
2
1
  import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
2
+ import { resolveCapabilityPresetLayer, resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
3
3
  import { resolveEffectiveAgentProfile } from "../config/agent-profile.js";
4
4
  import { WORKSPACE_FILES, init_paths } from "../config/paths.js";
5
5
  import { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET } from "../agent/context/workspace.js";
@@ -10,7 +10,7 @@ import { buildGatewayConsoleCspHeader } from "../security/csp.js";
10
10
  import { checkBrowserOrigin } from "../security/origin-check.js";
11
11
  import { auth } from "./middleware/auth.js";
12
12
  import { operatorScopes } from "./middleware/scopes.js";
13
- import { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createStrictRateLimitMiddleware, createTaskRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware } from "./middleware/strict-rate-limit.js";
13
+ import { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createMediaRateLimitMiddleware, createStrictRateLimitMiddleware, createTaskRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware } from "./middleware/strict-rate-limit.js";
14
14
  import { logContextMiddleware } from "./middleware/log-context.js";
15
15
  import { logger } from "./middleware/logger.js";
16
16
  import { routeErrorMiddleware } from "./middleware/route-errors.js";
@@ -147,7 +147,7 @@ function createHonoApp(config) {
147
147
  const DEFAULT_API_BODY_MAX = 1 * 1024 * 1024;
148
148
  const SKILL_UPLOAD_BODY_MAX = 10 * 1024 * 1024;
149
149
  const NOTE_MEDIA_BODY_MAX = 25 * 1024 * 1024;
150
- const VOICE_TRANSCRIBE_BODY_MAX = 35 * 1024 * 1024;
150
+ const VOICE_TRANSCRIBE_BODY_MAX = 26 * 1024 * 1024;
151
151
  const SESSION_INPUT_BODY_MAX = maxSessionInputRequestBodyBytes();
152
152
  const isNoteMediaUploadRequest = (path, method, contentType) => {
153
153
  if (method !== "POST") return false;
@@ -175,7 +175,7 @@ function createHonoApp(config) {
175
175
  }));
176
176
  app.use("/api/*", async (c, next) => {
177
177
  const contentType = c.req.header("content-type");
178
- const maxSize = c.req.method === "POST" && c.req.path === "/api/tasks" || c.req.method === "POST" && /^\/api\/sessions\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "POST" && /^\/api\/tasks\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "PATCH" && /^\/api\/sessions\/[^/]+\/inputs\/[^/]+$/.test(c.req.path) ? SESSION_INPUT_BODY_MAX : c.req.path === "/api/skills/upload" ? SKILL_UPLOAD_BODY_MAX : c.req.path === "/api/voice/transcribe" || c.req.path === "/api/voice/transcriptions" ? VOICE_TRANSCRIBE_BODY_MAX : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : isProjectFileUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : discussionUploadBodyMax(c.req.path, c.req.method, contentType) ?? DEFAULT_API_BODY_MAX;
178
+ const maxSize = c.req.method === "POST" && c.req.path === "/api/tasks" || c.req.method === "POST" && /^\/api\/sessions\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "POST" && /^\/api\/tasks\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "PATCH" && /^\/api\/sessions\/[^/]+\/inputs\/[^/]+$/.test(c.req.path) ? SESSION_INPUT_BODY_MAX : c.req.path === "/api/skills/upload" ? SKILL_UPLOAD_BODY_MAX : c.req.path === "/api/voice/transcriptions" ? VOICE_TRANSCRIBE_BODY_MAX : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : isProjectFileUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : discussionUploadBodyMax(c.req.path, c.req.method, contentType) ?? DEFAULT_API_BODY_MAX;
179
179
  const maxSizeMb = Math.ceil(maxSize / (1024 * 1024));
180
180
  return bodyLimit({
181
181
  maxSize,
@@ -213,6 +213,10 @@ function createHonoApp(config) {
213
213
  trustedProxies: service.currentConfig.gateway?.trustedProxies,
214
214
  allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
215
215
  }) });
216
+ const mediaRateLimitMiddleware = createMediaRateLimitMiddleware({ getTrustedProxyContext: () => ({
217
+ trustedProxies: service.currentConfig.gateway?.trustedProxies,
218
+ allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
219
+ }) });
216
220
  const taskRateLimitMiddleware = createTaskRateLimitMiddleware({ getTrustedProxyContext: () => ({
217
221
  trustedProxies: service.currentConfig.gateway?.trustedProxies,
218
222
  allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
@@ -225,6 +229,7 @@ function createHonoApp(config) {
225
229
  service,
226
230
  strictRateLimitMiddleware,
227
231
  chatRateLimitMiddleware,
232
+ mediaRateLimitMiddleware,
228
233
  taskRateLimitMiddleware,
229
234
  xopcCloudPollRateLimitMiddleware: createXopcCloudPollRateLimitMiddleware({ getTrustedProxyContext: () => ({
230
235
  trustedProxies: service.currentConfig.gateway?.trustedProxies,
@@ -16,6 +16,10 @@ export declare function createChatRateLimitMiddleware(deps: StrictRateLimitDeps)
16
16
  error: string;
17
17
  code: string;
18
18
  }, 429, "json">>;
19
+ export declare function createMediaRateLimitMiddleware(deps: StrictRateLimitDeps): import("hono").MiddlewareHandler<any, string, {}, Response & import("hono").TypedResponse<{
20
+ error: string;
21
+ code: string;
22
+ }, 429, "json">>;
19
23
  export declare function createTaskRateLimitMiddleware(deps: StrictRateLimitDeps): import("hono").MiddlewareHandler<any, string, {}, Response & import("hono").TypedResponse<{
20
24
  error: string;
21
25
  code: string;
@@ -70,6 +70,13 @@ function createChatRateLimitMiddleware(deps) {
70
70
  reason: "chat_rate_limit_exceeded"
71
71
  });
72
72
  }
73
+ function createMediaRateLimitMiddleware(deps) {
74
+ return createClientRateLimitMiddleware(deps, {
75
+ limiter: () => buckets.mediaApi(),
76
+ exceededMessage: "Media API rate limit exceeded",
77
+ reason: "media_rate_limit_exceeded"
78
+ });
79
+ }
73
80
  function createTaskRateLimitMiddleware(deps) {
74
81
  return createClientRateLimitMiddleware(deps, {
75
82
  limiter: () => buckets.taskApi(),
@@ -92,4 +99,4 @@ function createChannelRateLimitMiddleware(deps) {
92
99
  });
93
100
  }
94
101
  //#endregion
95
- export { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createStrictRateLimitMiddleware, createTaskRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware };
102
+ export { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createMediaRateLimitMiddleware, createStrictRateLimitMiddleware, createTaskRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware };
@@ -7,8 +7,17 @@
7
7
  */
8
8
  import { Hono } from 'hono';
9
9
  import type { GatewayService } from '../service.js';
10
- import { type OAuthCredentials } from '../../auth/oauth/types.js';
11
- export declare function refreshModelCatalogAfterOAuth(provider: string, service: Pick<GatewayService, 'getModelCatalogSync'>): Promise<void>;
10
+ import type { Config } from '../../config/schema.js';
11
+ import { type CapabilityId } from '../../capabilities/readiness/index.js';
12
+ import type { CatalogReadiness } from '../../providers/xopc-cloud-catalog-coordinator.js';
13
+ export interface OAuthCompletionReadiness {
14
+ authorized: true;
15
+ state: 'connected' | 'connected-degraded';
16
+ catalog: CatalogReadiness;
17
+ capabilities: Record<CapabilityId, 'ready' | 'unavailable' | 'disabled'>;
18
+ }
19
+ export declare function buildOAuthCompletionReadiness(config: Config, catalog: CatalogReadiness): OAuthCompletionReadiness;
20
+ export declare function refreshModelCatalogAfterOAuth(provider: string, service: Pick<GatewayService, 'getModelCatalogSync'>): Promise<CatalogReadiness | undefined>;
12
21
  export declare function normalizeDesktopOAuthReturnPath(value: unknown): string | undefined;
13
22
  export declare function resolveOAuthLoginMethodPreference(params: {
14
23
  requestedMethod?: unknown;
@@ -16,6 +25,3 @@ export declare function resolveOAuthLoginMethodPreference(params: {
16
25
  remote: boolean;
17
26
  }): string | undefined;
18
27
  export declare function createOAuthAsyncHandler(service: GatewayService): Hono<import("hono/dist/types/types.js").BlankEnv, import("hono/dist/types/types.js").BlankSchema, "/">;
19
- export declare function getOAuthCredentialsFromCache(provider: string): OAuthCredentials | undefined;
20
- export declare function setOAuthCredentialsToCache(provider: string, creds: OAuthCredentials): void;
21
- export declare function deleteOAuthCredentialsFromCache(provider: string): void;
@@ -4,6 +4,8 @@ import { getOAuthProviderInterfaces, init_registry } from "../../auth/oauth/regi
4
4
  import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
5
5
  import { isLoopbackHost } from "../host.js";
6
6
  import { resolveReverseProxyPublicUrl } from "../public-url.js";
7
+ import { buildCapabilityPlansForConfig } from "../../capabilities/readiness/from-config.js";
8
+ import "../../capabilities/readiness/index.js";
7
9
  import { Hono } from "hono";
8
10
  //#region src/gateway/hono/oauth-async.ts
9
11
  /**
@@ -17,10 +19,20 @@ init_registry();
17
19
  init_credentials();
18
20
  init_logger();
19
21
  const log = createLogger("OAuthAsync");
22
+ function buildOAuthCompletionReadiness(config, catalog) {
23
+ const plans = buildCapabilityPlansForConfig(config);
24
+ const capabilities = Object.fromEntries(Object.entries(plans).map(([capability, plan]) => [capability, plan.status === "disabled" ? "disabled" : plan.status === "unavailable" ? "unavailable" : "ready"]));
25
+ return {
26
+ authorized: true,
27
+ state: Boolean(catalog.error) || Object.values(capabilities).some((status) => status === "unavailable") ? "connected-degraded" : "connected",
28
+ catalog,
29
+ capabilities
30
+ };
31
+ }
20
32
  async function refreshModelCatalogAfterOAuth(provider, service) {
21
- if (provider !== "xopc-cloud") return;
33
+ if (provider !== "xopc-cloud") return void 0;
22
34
  try {
23
- await service.getModelCatalogSync().refreshNow();
35
+ return await service.getModelCatalogSync().refreshNow();
24
36
  } catch (err) {
25
37
  const errorMessage = err instanceof Error ? err.message : String(err);
26
38
  log.warn({
@@ -28,6 +40,16 @@ async function refreshModelCatalogAfterOAuth(provider, service) {
28
40
  provider,
29
41
  errorMessage
30
42
  }, `OAuth completed, but the model catalog could not be refreshed: ${errorMessage}`);
43
+ return {
44
+ state: "unavailable",
45
+ source: "none",
46
+ modelCount: 0,
47
+ error: {
48
+ code: "refresh_failed",
49
+ message: errorMessage,
50
+ retryable: true
51
+ }
52
+ };
31
53
  }
32
54
  }
33
55
  /** User-facing message when undici/fetch fails (often DNS, firewall, or wrong machine for localhost callback). */
@@ -172,6 +194,7 @@ function createOAuthAsyncHandler(service) {
172
194
  verificationUri: session.verificationUri,
173
195
  message: session.message,
174
196
  error: session.error,
197
+ readiness: session.readiness,
175
198
  expiresAt: session.expiresAt
176
199
  }
177
200
  });
@@ -301,13 +324,13 @@ async function runOAuthFlow(session, oauthProvider, service) {
301
324
  };
302
325
  try {
303
326
  const credentials = await oauthProvider.login(callbacks);
304
- setOAuthCredentialsToCache(session.provider, credentials);
305
327
  await new CredentialResolver().saveOAuthCredentials(session.provider, credentials);
306
328
  session.message = session.provider === "xopc-cloud" ? "OAuth login successful. Syncing available models..." : "OAuth login successful";
307
- await refreshModelCatalogAfterOAuth(session.provider, service);
329
+ const catalog = await refreshModelCatalogAfterOAuth(session.provider, service);
330
+ if (catalog && session.provider === "xopc-cloud") session.readiness = buildOAuthCompletionReadiness(service.currentConfig, catalog);
308
331
  session.status = "completed";
309
332
  session.credentials = credentials;
310
- session.message = "OAuth login successful";
333
+ session.message = session.readiness?.state === "connected-degraded" ? `OAuth login successful, but capability setup is degraded${catalog?.error ? `: ${catalog.error.message}` : ""}` : "OAuth login successful";
311
334
  log.info({
312
335
  sessionId: session.id,
313
336
  provider: session.provider
@@ -331,15 +354,5 @@ async function runOAuthFlow(session, oauthProvider, service) {
331
354
  session.manualCodeReject = void 0;
332
355
  }
333
356
  }
334
- const oauthCredentialsCache = /* @__PURE__ */ new Map();
335
- function getOAuthCredentialsFromCache(provider) {
336
- return oauthCredentialsCache.get(provider);
337
- }
338
- function setOAuthCredentialsToCache(provider, creds) {
339
- oauthCredentialsCache.set(provider, creds);
340
- }
341
- function deleteOAuthCredentialsFromCache(provider) {
342
- oauthCredentialsCache.delete(provider);
343
- }
344
357
  //#endregion
345
- export { createOAuthAsyncHandler, deleteOAuthCredentialsFromCache, getOAuthCredentialsFromCache, normalizeDesktopOAuthReturnPath, refreshModelCatalogAfterOAuth, resolveOAuthLoginMethodPreference, setOAuthCredentialsToCache };
358
+ export { buildOAuthCompletionReadiness, createOAuthAsyncHandler, normalizeDesktopOAuthReturnPath, refreshModelCatalogAfterOAuth, resolveOAuthLoginMethodPreference };
@@ -5,6 +5,4 @@
5
5
  */
6
6
  import { Hono } from 'hono';
7
7
  import type { GatewayService } from '../service.js';
8
- /** No-op: OAuth tokens live on disk under auth paths; cache is populated during login. */
9
- export declare function loadOAuthCredentialsToCache(_service: GatewayService): void;
10
- export declare function createOAuthHandler(_service: GatewayService): Hono<import("hono/dist/types/types.js").BlankEnv, import("hono/dist/types/types.js").BlankSchema, "/">;
8
+ export declare function createOAuthHandler(service: GatewayService): Hono<import("hono/dist/types/types.js").BlankEnv, import("hono/dist/types/types.js").BlankSchema, "/">;
@@ -1,6 +1,8 @@
1
1
  import { getOAuthProviderInterfaces, init_registry } from "../../auth/oauth/registry.js";
2
2
  import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
3
3
  import { getProviderAuthState, init_providers, isProviderConfigured } from "../../providers/index.js";
4
+ import { disconnectProvider } from "../../providers/provider-disconnect.js";
5
+ import { buildOAuthCompletionReadiness, refreshModelCatalogAfterOAuth } from "./oauth-async.js";
4
6
  import { Hono } from "hono";
5
7
  //#region src/gateway/hono/oauth.ts
6
8
  /**
@@ -12,19 +14,7 @@ init_registry();
12
14
  init_credentials();
13
15
  init_providers();
14
16
  const OAUTH_PROVIDERS = getOAuthProviderInterfaces();
15
- const oauthCredentialsCache = /* @__PURE__ */ new Map();
16
- function getOAuthCredentialsFromCache(provider) {
17
- return oauthCredentialsCache.get(provider);
18
- }
19
- function setOAuthCredentialsToCache(provider, creds) {
20
- oauthCredentialsCache.set(provider, creds);
21
- }
22
- function deleteOAuthCredentialsFromCache(provider) {
23
- oauthCredentialsCache.delete(provider);
24
- }
25
- /** No-op: OAuth tokens live on disk under auth paths; cache is populated during login. */
26
- function loadOAuthCredentialsToCache(_service) {}
27
- function createOAuthHandler(_service) {
17
+ function createOAuthHandler(service) {
28
18
  const oauth = new Hono();
29
19
  /**
30
20
  * POST /api/auth/oauth/start
@@ -73,21 +63,28 @@ function createOAuthHandler(_service) {
73
63
  return prompt.options.find((option) => option.id === "browser")?.id ?? prompt.options[0]?.id;
74
64
  }
75
65
  });
76
- setOAuthCredentialsToCache(provider, credentials);
77
66
  await new CredentialResolver().saveOAuthCredentials(provider, credentials);
67
+ const catalog = await refreshModelCatalogAfterOAuth(provider, service);
68
+ const readiness = catalog ? buildOAuthCompletionReadiness(service.currentConfig, catalog) : void 0;
69
+ service.emit("provider.auth.changed", {
70
+ provider,
71
+ connected: true
72
+ });
78
73
  return c.json({
79
74
  ok: true,
80
75
  payload: {
81
76
  success: true,
82
77
  provider,
83
- message: "OAuth login successful",
78
+ message: readiness?.state === "connected-degraded" ? "OAuth login successful, but capability setup is degraded" : "OAuth login successful",
84
79
  expires: credentials.expires,
85
80
  authUrl: authResult?.url,
86
81
  deviceCode: authResult?.deviceCode,
87
82
  verificationUri: authResult?.verificationUri,
88
83
  instructions: authResult?.instructions,
89
84
  usesCallbackServer: oauthProvider.usesCallbackServer ?? false,
90
- manualCodeRequested
85
+ manualCodeRequested,
86
+ catalog,
87
+ readiness
91
88
  }
92
89
  });
93
90
  } catch (err) {
@@ -101,16 +98,15 @@ function createOAuthHandler(_service) {
101
98
  */
102
99
  oauth.get("/:provider", async (c) => {
103
100
  const provider = c.req.param("provider");
104
- const credentials = getOAuthCredentialsFromCache(provider);
105
101
  const authState = await getProviderAuthState(provider);
106
102
  const configured = await isProviderConfigured(provider);
107
103
  return c.json({
108
104
  ok: true,
109
105
  payload: {
110
- configured: configured || !!credentials,
106
+ configured,
111
107
  authMode: authState.authMode,
112
108
  authStatus: authState.authStatus,
113
- expiresAt: authState.expiresAt ?? credentials?.expires
109
+ expiresAt: authState.expiresAt
114
110
  }
115
111
  });
116
112
  });
@@ -120,8 +116,12 @@ function createOAuthHandler(_service) {
120
116
  */
121
117
  oauth.delete("/:provider", async (c) => {
122
118
  const provider = c.req.param("provider");
123
- deleteOAuthCredentialsFromCache(provider);
124
- await new CredentialResolver().deleteProviderCredential(provider);
119
+ await disconnectProvider(provider);
120
+ service.emit("provider.auth.changed", {
121
+ provider,
122
+ connected: false
123
+ });
124
+ if (provider === "xopc-cloud") service.emit("model-catalog.updated", { modelCount: 0 });
125
125
  return c.json({
126
126
  ok: true,
127
127
  payload: { disconnected: provider }
@@ -144,4 +144,4 @@ function createOAuthHandler(_service) {
144
144
  return oauth;
145
145
  }
146
146
  //#endregion
147
- export { createOAuthHandler, loadOAuthCredentialsToCache };
147
+ export { createOAuthHandler };
@@ -1,5 +1,5 @@
1
1
  import { validateWebchatAttachments, validateWebchatContent } from "../../chat-limits.js";
2
- import { submitSessionInput } from "./session-input-handler.js";
2
+ import { replaceLatestSessionTurn, submitSessionInput } from "./session-input-handler.js";
3
3
  //#region src/gateway/hono/routes/agent-stream.ts
4
4
  function registerAgentStreamRoutes(authenticated, deps) {
5
5
  const { service, chatRateLimitMiddleware } = deps;
@@ -36,6 +36,9 @@ function registerAgentStreamRoutes(authenticated, deps) {
36
36
  authenticated.post("/api/sessions/:sessionKey/inputs", chatRateLimitMiddleware, async (c) => {
37
37
  return submitSessionInput(c, deps, (c.req.param("sessionKey") ?? "").trim());
38
38
  });
39
+ authenticated.post("/api/sessions/:sessionKey/turns/:turnId/replace", chatRateLimitMiddleware, async (c) => {
40
+ return replaceLatestSessionTurn(c, deps, (c.req.param("sessionKey") ?? "").trim(), (c.req.param("turnId") ?? "").trim());
41
+ });
39
42
  authenticated.patch("/api/sessions/:sessionKey/inputs/:inputId", chatRateLimitMiddleware, async (c) => {
40
43
  const sessionKey = (c.req.param("sessionKey") ?? "").trim();
41
44
  const inputId = c.req.param("inputId")?.trim() ?? "";
@@ -3,8 +3,8 @@ import { ActivationPlanner } from "../../../extensions/activation-planner.js";
3
3
  import { mergeActivationContext } from "../../../extensions/activation-context.js";
4
4
  import { fetchRegistry, listExtensions, searchExtensions } from "../../../extensions/marketplace.js";
5
5
  import { buildWhenContextSnapshot } from "../../../extensions/when-context.js";
6
- import { createOAuthHandler } from "../oauth.js";
7
6
  import { createOAuthAsyncHandler } from "../oauth-async.js";
7
+ import { createOAuthHandler } from "../oauth.js";
8
8
  import { extensionAssetMimeType } from "../lib/extension-assets.js";
9
9
  import { loadExtensionStore, saveExtensionStore } from "../lib/extension-store.js";
10
10
  import { relative, resolve } from "node:path";
@@ -8,13 +8,12 @@ import { resolveComposioApiKey } from "../../../connectors/composio-sessions.js"
8
8
  import { getConnectorLearningPlan } from "../../../connectors/learning-recipes.js";
9
9
  import { listComposioConnectorCatalog } from "../../../connectors/composio-catalog.js";
10
10
  import { createConnectorSetupSecretRequest, submitConnectorSetupSecret } from "../../../connectors/setup-secrets.js";
11
- import { configureComposioApiKey, executeComposioTool, getComposioInstallationPolicy, getComposioToolkitScope, inspectComposioConnectorHealth, listComposioConnections, listComposioTools, refreshComposioConnection, revokeComposioConnection, setComposioToolkitScope, updateComposioConnection, updateComposioInstallationPolicy } from "../../../connectors/composio.js";
11
+ import { configureComposioApiKey, executeComposioTool, getComposioInstallationPolicy, getComposioToolkitAuthState, getComposioToolkitScope, inspectComposioConnectorHealth, listComposioConnections, listComposioTools, refreshComposioConnection, revokeComposioConnection, setComposioToolkitScope, updateComposioConnection, updateComposioInstallationPolicy } from "../../../connectors/composio.js";
12
12
  import { listConnectorProviders } from "../../../connectors/providers.js";
13
13
  import { getConnectorDefinition, listConnectorCatalog } from "../../../connectors/catalog.js";
14
14
  import { listUnderstandingSourceGrants, revokeUnderstandingSourceGrant } from "../../../user-context/sources/repository.js";
15
15
  import { recordConnectorHealthUsage } from "../../../connectors/usage.js";
16
16
  import { getConnectorInstance, listConnectorInstances } from "../../../connectors/instances.js";
17
- import { installConnector, installConnectorDefinition, uninstallConnector, updateConnectorConfig } from "../../../connectors/install.js";
18
17
  import { startConnectorAuthorization } from "../../../connectors/auth-provider-registry.js";
19
18
  import { composioLogoResponse } from "../../../connectors/composio-logo.js";
20
19
  import { appendComposioTriggerEvent, listComposioTriggerEvents } from "../../../connectors/composio-triggers.js";
@@ -22,6 +21,7 @@ import { buildConnectedPeopleGraph } from "../../../knowledge/people-graph.js";
22
21
  import "../../../knowledge/index.js";
23
22
  import { ingestLocalFolderSource } from "../../../connectors/connected-source-ingestion.js";
24
23
  import { previewConnectorDefinition, testConnectorInstance } from "../../../connectors/health.js";
24
+ import { installConnector, installConnectorDefinition, uninstallConnector, updateConnectorConfig } from "../../../connectors/install.js";
25
25
  import { setConnectorEnabled } from "../../../connectors/lifecycle.js";
26
26
  import { projectComposioConnectionStatus } from "../../../connectors/runtime-status.js";
27
27
  //#region src/gateway/hono/routes/connectors.ts
@@ -314,6 +314,19 @@ function registerConnectorRoutes(authenticated, deps) {
314
314
  }, 400);
315
315
  }
316
316
  });
317
+ authenticated.get("/api/connectors/composio/:toolkit/auth-configs", async (c) => {
318
+ try {
319
+ return c.json({
320
+ ok: true,
321
+ payload: { auth: await getComposioToolkitAuthState(c.req.param("toolkit")) }
322
+ });
323
+ } catch (error) {
324
+ return c.json({
325
+ ok: false,
326
+ error: errorMessage(error)
327
+ }, 400);
328
+ }
329
+ });
317
330
  authenticated.get("/api/connectors/composio/:toolkit/scope", async (c) => {
318
331
  const toolkit = c.req.param("toolkit");
319
332
  return c.json({
@@ -566,7 +579,7 @@ function registerConnectorRoutes(authenticated, deps) {
566
579
  error: `Unknown connector: ${connectorId}`
567
580
  }, 404);
568
581
  try {
569
- const authorization = await startConnectorAuthorization(connector);
582
+ const authorization = await startConnectorAuthorization(connector, service.currentConfig);
570
583
  return c.json({
571
584
  ok: true,
572
585
  payload: { authorization }
@@ -4,6 +4,7 @@ export interface AuthenticatedRouteDeps {
4
4
  service: GatewayService;
5
5
  strictRateLimitMiddleware: MiddlewareHandler;
6
6
  chatRateLimitMiddleware: MiddlewareHandler;
7
+ mediaRateLimitMiddleware?: MiddlewareHandler;
7
8
  taskRateLimitMiddleware?: MiddlewareHandler;
8
9
  xopcCloudPollRateLimitMiddleware: MiddlewareHandler;
9
10
  channelRateLimitMiddleware?: MiddlewareHandler;
@@ -22,6 +22,7 @@ async function multipart(c) {
22
22
  }
23
23
  function registerDiscussionRoutes(authenticated, deps) {
24
24
  const { service, strictRateLimitMiddleware } = deps;
25
+ const mediaRateLimitMiddleware = deps.mediaRateLimitMiddleware ?? deps.chatRateLimitMiddleware ?? strictRateLimitMiddleware;
25
26
  authenticated.get("/api/discussion-capture/settings", (c) => c.json(service.discussions.settings()));
26
27
  authenticated.put("/api/discussion-capture/settings", strictRateLimitMiddleware, async (c) => {
27
28
  const body = await c.req.json().catch(() => ({}));
@@ -76,7 +77,7 @@ function registerDiscussionRoutes(authenticated, deps) {
76
77
  const transcript = service.discussions.transcript(c.req.param("id"));
77
78
  return transcript ? c.json(transcript) : c.json({ error: "Discussion not found" }, 404);
78
79
  });
79
- authenticated.put("/api/discussions/:id/segments/:sequence", strictRateLimitMiddleware, async (c) => {
80
+ authenticated.put("/api/discussions/:id/segments/:sequence", mediaRateLimitMiddleware, async (c) => {
80
81
  const body = await multipart(c);
81
82
  if (!body) return c.json({ error: "Invalid multipart body" }, 400);
82
83
  const file = body.file;
@@ -139,7 +139,8 @@ const AUTHENTICATED_LAZY_ROUTE_BUNDLES = [
139
139
  match: (path) => startsWithAny(path, [
140
140
  "/api/models",
141
141
  "/api/models-json",
142
- "/api/providers"
142
+ "/api/providers",
143
+ "/api/capabilities/readiness"
143
144
  ]),
144
145
  load: async () => {
145
146
  const { registerModelsRoutes } = await import("./models.js");
@@ -1,7 +1,7 @@
1
1
  import { canonicalizeConfiguredMcpServer, normalizeConfiguredMcpServers } from "../../../config/mcp-config-normalize.js";
2
2
  import { loadMergedBundleMcpConfig } from "../../../agent/mcp/bundle-mcp-config.js";
3
- import { isManagedConnectorServer } from "../../../connectors/materialize.js";
4
3
  import { getWorkspacePath } from "../../../config/workspace-path-helpers.js";
4
+ import { isManagedConnectorServer } from "../../../connectors/materialize.js";
5
5
  import { listBundleMcpServerCapabilitiesForGateway, listBundleMcpServerToolsForGateway } from "../../../agent/mcp/bundle-mcp-gateway.js";
6
6
  //#region src/gateway/hono/routes/mcp.ts
7
7
  function registerMcpRoutes(authenticated, deps) {
@@ -6,7 +6,9 @@ import { getModelRegistry } from "../../../providers/model-registry.js";
6
6
  import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
7
7
  import "../../../providers/constants.js";
8
8
  import { getProviderRegistry, init_plugin_registry } from "../../../providers/plugin-registry.js";
9
- import { PROVIDER_META, getAllModels, getAllProviders, getAvailableModels, getProviderAuthState, init_providers, isProviderConfigured } from "../../../providers/index.js";
9
+ import { PROVIDER_META, getAllModels, getAllProviders, getAvailableModels, getProviderAuthState, init_providers, isProviderConfigured, isProviderConfiguredSync } from "../../../providers/index.js";
10
+ import { buildCapabilityPlansForConfig } from "../../../capabilities/readiness/from-config.js";
11
+ import "../../../capabilities/readiness/index.js";
10
12
  import { getImageGenerationProvider, reloadImageGenerationProviders, resolveImageGenerationCredentialMode } from "../../../agent/image/generation/provider-registry.js";
11
13
  import { SessionConfigStore } from "../../../session/config-store.js";
12
14
  import { deleteCustomImageProvider, listCustomImageProviders, upsertCustomImageProvider } from "../../custom-image-providers.js";
@@ -14,6 +16,7 @@ import { getDomesticProviderPreset, getDomesticProviderPresetIds } from "../../.
14
16
  import { getOnboardingFeaturedProviders, getProviderHint, getRecommendedModelsForProvider, isRecommendedModel, sortModelsForPicker, sortProvidersForPicker } from "../../../providers/presentation.js";
15
17
  import { getAgentImageGenerationConfig, getImageGenerationCatalog, prepareImageGenerationSetup, verifyImageGenerationCredential } from "../../image-generation-setup.js";
16
18
  import { discoverProviderModels, isProviderApiDiscoverable } from "../../../providers/model-discovery.js";
19
+ import { getXopcCloudCatalogCoordinator } from "../../../providers/xopc-cloud-catalog-coordinator.js";
17
20
  import { respondStartupUnavailable } from "../lib/startup-unavailable.js";
18
21
  import { auditModelReferences } from "../../../providers/model-reference-auditor.js";
19
22
  import { XopcCloudAccountError, XopcCloudAccountService } from "../../../providers/xopc-cloud-account-service.js";
@@ -68,10 +71,61 @@ function registerModelsRoutes(authenticated, deps) {
68
71
  const { service, strictRateLimitMiddleware } = deps;
69
72
  const catalogSync = service.getModelCatalogSync();
70
73
  const xopcCloudAccount = new XopcCloudAccountService();
71
- authenticated.get("/api/models/catalog/status", (c) => c.json({
72
- ok: true,
73
- payload: catalogSync.getStatus()
74
- }));
74
+ authenticated.get("/api/models/catalog/status", (c) => {
75
+ const readiness = getXopcCloudCatalogCoordinator().snapshot();
76
+ return c.json({
77
+ ok: true,
78
+ payload: {
79
+ ...catalogSync.getStatus(),
80
+ hydratedFromDisk: readiness.source === "disk",
81
+ stale: readiness.state === "stale",
82
+ fetchedAt: readiness.fetchedAt,
83
+ catalogVersion: readiness.catalogVersion,
84
+ lastRefreshError: readiness.error
85
+ }
86
+ });
87
+ });
88
+ authenticated.get("/api/capabilities/readiness", async (c) => {
89
+ const auth = await getProviderAuthState("xopc-cloud");
90
+ const catalog = getXopcCloudCatalogCoordinator().snapshot();
91
+ const authorized = auth.authStatus === "connected";
92
+ const capabilities = buildCapabilityPlansForConfig(service.currentConfig, { providerReady: (providerId) => providerId === "xopc-cloud" ? authorized : isProviderConfiguredSync(providerId) });
93
+ const issues = [
94
+ ...auth.authStatus === "not_connected" ? [{
95
+ code: "oauth_not_connected",
96
+ capability: null
97
+ }] : [],
98
+ ...auth.authStatus === "expired" ? [{
99
+ code: "oauth_expired_refresh_failed",
100
+ capability: null
101
+ }] : [],
102
+ ...catalog.state === "unavailable" ? [{
103
+ code: "catalog_never_loaded",
104
+ capability: null
105
+ }] : [],
106
+ ...catalog.state === "stale" ? [{
107
+ code: "catalog_stale",
108
+ capability: null
109
+ }] : [],
110
+ ...Object.values(capabilities).filter((plan) => authorized && catalog.modelCount > 0 && plan.status === "unavailable").map((plan) => ({
111
+ code: "capability_not_published",
112
+ capability: plan.capability
113
+ }))
114
+ ];
115
+ return c.json({
116
+ ok: true,
117
+ payload: {
118
+ provider: {
119
+ id: "xopc-cloud",
120
+ authorized,
121
+ authStatus: auth.authStatus,
122
+ catalog
123
+ },
124
+ capabilities,
125
+ issues
126
+ }
127
+ });
128
+ });
75
129
  authenticated.get("/api/models/catalog", async (c) => {
76
130
  const catalog = getModelCatalogStore().load();
77
131
  const sessionConfigs = await new SessionConfigStore("").getAll();