@xopcai/xopc 0.0.210 → 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 (263) 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-BzjFoSr0.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CI1zQfzY.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-C6MmWfcb.js → api-D269PnU9.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-Cd02GGpV.js → app-management-settings-panel-BFpfQDWc.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-Db-h2I3G.js → appearance-settings-DLxFdqhY.js} +1 -1
  9. package/dist/gateway/static/root/assets/{apps-page-BT7F4WBI.js → apps-page-CjmlGB5V.js} +1 -1
  10. package/dist/gateway/static/root/assets/{archive-plugin-CMHzJT2a.js → archive-plugin-DPlH4dnc.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-BzhI2LoH.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-DsUeHvZO.js → binary-plugins-C0tuoPXk.js} +1 -1
  14. package/dist/gateway/static/root/assets/{block-editor-CFfsIeZ4.js → block-editor-Deyphj1o.js} +47 -47
  15. package/dist/gateway/static/root/assets/browser-settings-page-CAGCYx8U.js +8 -0
  16. package/dist/gateway/static/root/assets/{browser-workflow-inputs-BiWghvJ0.js → browser-workflow-inputs-CYEbXyRF.js} +1 -1
  17. package/dist/gateway/static/root/assets/{browser-workflows-page-DPLdT6Zn.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-CTxGFvsS.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-BklVUOxC.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-0F4Jmma2.js → chat-terminal-dock-CTDRZa7e.js} +2 -2
  25. package/dist/gateway/static/root/assets/{connectors-api-BvIZ51ty.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-BHmwaMbO.js → cron-expression-DTLR82NB.js} +1 -1
  28. package/dist/gateway/static/root/assets/{date-picker-fj_pPCv5.js → date-picker-DyNogHQH.js} +1 -1
  29. package/dist/gateway/static/root/assets/{dependency-picker-DsWvwOv-.js → dependency-picker-BpnCuo7B.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-mjkF0Xxh.js → desktop-pet-CDKI4gVB.js} +1 -1
  31. package/dist/gateway/static/root/assets/{desktop-pet-settings-ClwUpRYu.js → desktop-pet-settings-DjT5C2a3.js} +1 -1
  32. package/dist/gateway/static/root/assets/{directory-picker-path-field-OkqRFyRL.js → directory-picker-path-field-DlJY90TM.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-debug-page-DC69wplH.js → extension-debug-page-DWf2z7q5.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-page-DCtk6zdJ.js → extension-page-Dorx0kf9.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-settings-page-Bkm4zzv-.js → extension-settings-page-B1wU9ZOB.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-config-api-Dr_NQt7v.js → gateway-config-api-B1lG4dNr.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-swr-CEfv8N1J.js → gateway-config-swr-BIxuwPQi.js} +1 -1
  38. package/dist/gateway/static/root/assets/gateway-settings-DqIOqJjM.js +1 -0
  39. package/dist/gateway/static/root/assets/{gateway-startup-retry-B8hebJ7s.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-DJ7HSgKs.js → index-_cuTcWjB.js} +78 -56
  45. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DCQvf05d.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-B3Ugd0my.js → local-apps-page-DfruRAmE.js} +1 -1
  48. package/dist/gateway/static/root/assets/{locale-store-hDBVeG3G.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-C-S5Llq3.js → management-settings-L1VYkywO.js} +1 -1
  51. package/dist/gateway/static/root/assets/{markdown-split-DuVq37Uh.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-D8eO_6h3.js → markdown-view-V4rcPPH0.js} +1 -1
  54. package/dist/gateway/static/root/assets/{media-plugins-C1V6pkX3.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-Dn71ZV8c.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-B5a5aSoS.js → page-tabs-CBuCKeyy.js} +1 -1
  59. package/dist/gateway/static/root/assets/{preview-open-alternatives-5041AIBX.js → preview-open-alternatives-BQ0tLfPO.js} +1 -1
  60. package/dist/gateway/static/root/assets/{product-open-page-7UkouFQU.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-DvaXzHYS.js → runtime-tools-settings-panel-BCfQNzjG.js} +2 -2
  65. package/dist/gateway/static/root/assets/{schema-form-Dlxl_5X0.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-CSaiuuer.js → settings-form-section-B9dnKr3M.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-loading-skeleton-H3mJwt3r.js → settings-loading-skeleton-CYDV2JtY.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-page-Cs7zA4BS.js → settings-page-DbrIYfS9.js} +1 -1
  71. package/dist/gateway/static/root/assets/{setup-status-panel-CwgMODfJ.js → setup-status-panel-Cxc-Ejl5.js} +1 -1
  72. package/dist/gateway/static/root/assets/{share-preview-page-Bdpw5m7M.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-Bup3Lg1Z.js → skills-page-PE16CNw5.js} +1 -1
  76. package/dist/gateway/static/root/assets/{skills-page.utils-D22ORR21.js → skills-page.utils-nXmBcBxt.js} +1 -1
  77. package/dist/gateway/static/root/assets/{system-settings-panel-GmtWsfjB.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-CtY8RwMX.js → theme-store-KR5Otp5w.js} +1 -1
  80. package/dist/gateway/static/root/assets/{typed-models-lib-C2aOdlEA.js → typed-models-lib-lMZodtDF.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-autosave-DOj5i8d_.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-5WfurWYa.js → voice-api-key-field-CDcv0Wbh.js} +1 -1
  84. package/dist/gateway/static/root/assets/{work-discovery-overlay-D5_MH3n3.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-bBA8LinI.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/image/generation/providers/xopc-cloud.js +2 -1
  92. package/dist/src/agent/image/tool-model-config.js +15 -9
  93. package/dist/src/agent/memory/builtin-provider.js +0 -1
  94. package/dist/src/agent/memory/create-memory-manager.js +1 -1
  95. package/dist/src/agent/tools/image-generate-tool.js +23 -7
  96. package/dist/src/agent-runtime/index.js +1 -1
  97. package/dist/src/agent-runtime/runtime-profile.js +1 -1
  98. package/dist/src/capabilities/readiness/from-config.d.ts +10 -0
  99. package/dist/src/capabilities/readiness/from-config.js +128 -0
  100. package/dist/src/capabilities/readiness/index.d.ts +3 -0
  101. package/dist/src/capabilities/readiness/index.js +3 -0
  102. package/dist/src/capabilities/readiness/planner.d.ts +3 -0
  103. package/dist/src/capabilities/readiness/planner.js +56 -0
  104. package/dist/src/capabilities/readiness/types.d.ts +35 -0
  105. package/dist/src/capabilities/readiness/types.js +1 -0
  106. package/dist/src/cli/commands/agent.js +9 -0
  107. package/dist/src/cli/commands/auth.js +4 -3
  108. package/dist/src/cli/commands/connectors.js +1 -1
  109. package/dist/src/cli/commands/models.js +2 -1
  110. package/dist/src/cli/commands/onboard/model.d.ts +3 -21
  111. package/dist/src/cli/commands/onboard/model.js +10 -86
  112. package/dist/src/cli/utils/oauth-login.d.ts +2 -0
  113. package/dist/src/cli/utils/oauth-login.js +9 -1
  114. package/dist/src/config/agent-profile.js +1 -1
  115. package/dist/src/config/index.js +2 -2
  116. package/dist/src/config/paths-state.d.ts +2 -0
  117. package/dist/src/config/paths-state.js +5 -1
  118. package/dist/src/config/paths.d.ts +1 -1
  119. package/dist/src/config/paths.js +2 -2
  120. package/dist/src/config/schema.js +1 -1
  121. package/dist/src/connectors/composio-sessions.d.ts +1 -0
  122. package/dist/src/connectors/composio-sessions.js +2 -1
  123. package/dist/src/connectors/composio.js +8 -3
  124. package/dist/src/connectors/connected-source-cursor.d.ts +9 -0
  125. package/dist/src/connectors/connected-source-cursor.js +30 -0
  126. package/dist/src/connectors/connected-source-ingestion.js +67 -46
  127. package/dist/src/connectors/connected-source-normalizers.d.ts +1 -0
  128. package/dist/src/connectors/connected-source-normalizers.js +33 -2
  129. package/dist/src/connectors/connected-source-sanitization.d.ts +1 -0
  130. package/dist/src/connectors/connected-source-sanitization.js +21 -0
  131. package/dist/src/connectors/connector-identity.js +10 -2
  132. package/dist/src/connectors/content-enrichment.d.ts +29 -0
  133. package/dist/src/connectors/content-enrichment.js +273 -0
  134. package/dist/src/connectors/health.js +1 -1
  135. package/dist/src/connectors/learning-coordinator.js +1 -2
  136. package/dist/src/connectors/learning-recipes.js +28 -33
  137. package/dist/src/discussions/live-worker.d.ts +1 -0
  138. package/dist/src/discussions/live-worker.js +7 -1
  139. package/dist/src/discussions/repository.js +11 -1
  140. package/dist/src/discussions/sealer.d.ts +1 -1
  141. package/dist/src/discussions/sealer.js +16 -7
  142. package/dist/src/discussions/transcript.js +27 -1
  143. package/dist/src/discussions/types.d.ts +4 -0
  144. package/dist/src/gateway/agents-admin.js +1 -1
  145. package/dist/src/gateway/heartbeat/service.js +1 -1
  146. package/dist/src/gateway/hono/app.js +8 -3
  147. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
  148. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +8 -1
  149. package/dist/src/gateway/hono/oauth-async.d.ts +11 -5
  150. package/dist/src/gateway/hono/oauth-async.js +29 -16
  151. package/dist/src/gateway/hono/oauth.d.ts +1 -3
  152. package/dist/src/gateway/hono/oauth.js +22 -22
  153. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  154. package/dist/src/gateway/hono/routes/connectors.js +1 -1
  155. package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
  156. package/dist/src/gateway/hono/routes/discussions.js +2 -1
  157. package/dist/src/gateway/hono/routes/lazy-bundles.js +2 -1
  158. package/dist/src/gateway/hono/routes/mcp.js +1 -1
  159. package/dist/src/gateway/hono/routes/models.js +59 -5
  160. package/dist/src/gateway/hono/routes/understanding-sources.js +29 -0
  161. package/dist/src/gateway/hono/routes/voice.d.ts +1 -2
  162. package/dist/src/gateway/hono/routes/voice.js +16 -35
  163. package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
  164. package/dist/src/gateway/rate-limit/buckets.js +12 -0
  165. package/dist/src/gateway/service/session-input-coordinator.js +1 -2
  166. package/dist/src/gateway/service.js +20 -5
  167. package/dist/src/heartbeat/index.js +1 -1
  168. package/dist/src/knowledge/connected-understanding-pipeline.d.ts +1 -1
  169. package/dist/src/knowledge/connected-understanding-pipeline.js +74 -25
  170. package/dist/src/knowledge/ingestion-service.js +33 -15
  171. package/dist/src/knowledge/types.d.ts +2 -0
  172. package/dist/src/media-understanding/audio-transcription-runner.d.ts +2 -0
  173. package/dist/src/media-understanding/audio-transcription-runner.js +3 -1
  174. package/dist/src/media-understanding/runner.js +3 -1
  175. package/dist/src/media-understanding/types.d.ts +2 -0
  176. package/dist/src/providers/model-catalog-persistence.d.ts +9 -0
  177. package/dist/src/providers/model-catalog-persistence.js +172 -0
  178. package/dist/src/providers/model-catalog-ranking.d.ts +2 -0
  179. package/dist/src/providers/model-catalog-ranking.js +17 -0
  180. package/dist/src/providers/model-catalog-store.d.ts +13 -3
  181. package/dist/src/providers/model-catalog-store.js +24 -5
  182. package/dist/src/providers/model-catalog-sync-service.d.ts +3 -3
  183. package/dist/src/providers/model-catalog-sync-service.js +12 -7
  184. package/dist/src/providers/provider-auth-service.d.ts +1 -0
  185. package/dist/src/providers/provider-auth-service.js +3 -0
  186. package/dist/src/providers/provider-disconnect.d.ts +11 -0
  187. package/dist/src/providers/provider-disconnect.js +33 -0
  188. package/dist/src/providers/xopc-cloud-catalog-coordinator.d.ts +56 -0
  189. package/dist/src/providers/xopc-cloud-catalog-coordinator.js +182 -0
  190. package/dist/src/providers/xopc-cloud-model-source.d.ts +6 -10
  191. package/dist/src/providers/xopc-cloud-model-source.js +49 -27
  192. package/dist/src/storage/sqlite/knowledge-repository.d.ts +1 -0
  193. package/dist/src/storage/sqlite/knowledge-repository.js +4 -0
  194. package/dist/src/storage/sqlite/user-context-quality-repository.d.ts +8 -0
  195. package/dist/src/storage/sqlite/user-context-quality-repository.js +21 -1
  196. package/dist/src/tui/backends/embedded-backend.js +11 -3
  197. package/dist/src/tui/tui-oauth-login.js +5 -0
  198. package/dist/src/tui/tui-startup-resources.js +1 -1
  199. package/dist/src/user-context/sources/activity-clustering.js +30 -117
  200. package/dist/src/user-context/sources/index.d.ts +1 -0
  201. package/dist/src/user-context/sources/index.js +2 -1
  202. package/dist/src/user-context/sources/signal-clustering.d.ts +18 -0
  203. package/dist/src/user-context/sources/signal-clustering.js +131 -0
  204. package/dist/src/voice/audio/normalize.d.ts +17 -0
  205. package/dist/src/voice/audio/normalize.js +155 -0
  206. package/dist/src/voice/language-profile.d.ts +1 -4
  207. package/dist/src/voice/language-profile.js +2 -25
  208. package/dist/src/voice/local/runtime-client.d.ts +2 -0
  209. package/dist/src/voice/local/runtime-client.js +20 -1
  210. package/dist/src/voice/local/runtime-worker.js +7 -13
  211. package/dist/src/voice/local/wav.js +1 -1
  212. package/dist/src/voice/stt/availability.d.ts +1 -4
  213. package/dist/src/voice/stt/availability.js +3 -15
  214. package/dist/src/voice/stt/config.js +1 -0
  215. package/dist/src/voice/stt/factory.js +23 -0
  216. package/dist/src/voice/stt/index.d.ts +1 -0
  217. package/dist/src/voice/stt/index.js +2 -2
  218. package/dist/src/voice/stt/list-providers.js +1 -1
  219. package/dist/src/voice/stt/providers/local-transcription.js +7 -3
  220. package/dist/src/voice/stt/providers/xopc-cloud-transcription.js +3 -1
  221. package/dist/src/voice/stt/transcribe-core.d.ts +5 -1
  222. package/dist/src/voice/stt/transcribe-core.js +13 -5
  223. package/dist/src/voice/stt/types.d.ts +2 -0
  224. package/dist/src/voice/tts/factory.d.ts +1 -1
  225. package/dist/src/voice/tts/factory.js +23 -1
  226. package/dist/src/voice/tts/merge-config.js +5 -3
  227. package/dist/src/voice/tts/providers/xopc-cloud-speech.js +3 -1
  228. package/dist/src/voice/tts/types.d.ts +2 -0
  229. package/dist/src/voice/tts/types.js +4 -2
  230. package/dist/src/work-discovery/evaluation.d.ts +23 -0
  231. package/dist/src/work-discovery/evaluation.js +18 -1
  232. package/dist/src/work-discovery/index.js +2 -2
  233. package/package.json +4 -3
  234. package/dist/gateway/static/root/assets/agents-DqGMj3QJ.js +0 -68
  235. package/dist/gateway/static/root/assets/automations-page-CwOXGV9z.js +0 -6
  236. package/dist/gateway/static/root/assets/browser-settings-page-CyRLhCod.js +0 -8
  237. package/dist/gateway/static/root/assets/capabilities-settings-panel-jRKcS7lZ.js +0 -7
  238. package/dist/gateway/static/root/assets/capability-presets-settings-panel-B3bKdtwU.js +0 -3
  239. package/dist/gateway/static/root/assets/channels-settings-yZBWH02s.js +0 -1
  240. package/dist/gateway/static/root/assets/channels-status-swr-C3zlimZd.js +0 -1
  241. package/dist/gateway/static/root/assets/connectors-page-OX4KvUkA.js +0 -2
  242. package/dist/gateway/static/root/assets/gateway-settings-V1XVxjHa.js +0 -1
  243. package/dist/gateway/static/root/assets/heartbeat-settings-CWUBAQrE.js +0 -1
  244. package/dist/gateway/static/root/assets/home-page-D57cYRd3.js +0 -1
  245. package/dist/gateway/static/root/assets/index-PNBFdxHb.css +0 -2
  246. package/dist/gateway/static/root/assets/local-app-workbench-page-BbAiMZE1.js +0 -2
  247. package/dist/gateway/static/root/assets/logs-page-nXdF3wOT.js +0 -2
  248. package/dist/gateway/static/root/assets/markdown-view-B12xeflb.css +0 -1
  249. package/dist/gateway/static/root/assets/messages-1qg_hOOd.js +0 -3
  250. package/dist/gateway/static/root/assets/notes-workbench-BYPoZeRw.js +0 -4
  251. package/dist/gateway/static/root/assets/project-detail-page-D27nOKbo.js +0 -1
  252. package/dist/gateway/static/root/assets/projects-page-CdB5cJJ-.js +0 -1
  253. package/dist/gateway/static/root/assets/remote-access-hub-DFoZ3UNS.js +0 -1
  254. package/dist/gateway/static/root/assets/sessions-page-C1cbIcJ7.js +0 -1
  255. package/dist/gateway/static/root/assets/settings-advanced-gate-DnXRlQXS.js +0 -1
  256. package/dist/gateway/static/root/assets/shares-settings-hlUgIkrp.js +0 -1
  257. package/dist/gateway/static/root/assets/skill-reload-api-DR31B_Gz.js +0 -1
  258. package/dist/gateway/static/root/assets/task-detail-page-CTKDpxhf.js +0 -1
  259. package/dist/gateway/static/root/assets/user-context-page-keJJYpix.js +0 -1
  260. package/dist/gateway/static/root/assets/work-discovery-page-BcvBiebt.js +0 -1
  261. package/dist/gateway/static/root/assets/workflows-page-Cz2VpWdj.js +0 -5
  262. package/dist/src/voice/local/runtime-dispatcher.d.ts +0 -9
  263. package/dist/src/voice/local/runtime-dispatcher.js +0 -20
@@ -1,6 +1,5 @@
1
1
  import { getLocalVoiceModel, resolveLocalVoiceModelDir } from "./models.js";
2
2
  import { downloadLocalVoiceModelFiles } from "./model-files.js";
3
- import { createRuntimeDispatcher } from "./runtime-dispatcher.js";
4
3
  import { join, resolve, sep } from "node:path";
5
4
  import { mkdir, rm } from "node:fs/promises";
6
5
  import { EnvHttpProxyAgent, RetryAgent, setGlobalDispatcher } from "undici";
@@ -230,17 +229,6 @@ async function handle(request) {
230
229
  throw new Error(`Unknown local voice runtime method: ${request.method}`);
231
230
  }
232
231
  const lines = createInterface({ input: process.stdin });
233
- const dispatch = createRuntimeDispatcher({
234
- execute: handle,
235
- sendResult: (request, result) => send({
236
- id: request.id,
237
- result
238
- }),
239
- sendError: (request, error) => send({
240
- id: request.id,
241
- error: serializeError(error)
242
- })
243
- });
244
232
  lines.on("line", (line) => {
245
233
  let request;
246
234
  try {
@@ -248,7 +236,13 @@ lines.on("line", (line) => {
248
236
  } catch {
249
237
  return;
250
238
  }
251
- dispatch(request);
239
+ handle(request).then((result) => send({
240
+ id: request.id,
241
+ result
242
+ }), (error) => send({
243
+ id: request.id,
244
+ error: serializeError(error)
245
+ }));
252
246
  });
253
247
  lines.once("close", () => {
254
248
  networkAgent.close().finally(() => process.exit(0));
@@ -17,7 +17,7 @@ function resampleLinear(input, sourceRate, targetRate) {
17
17
  return output;
18
18
  }
19
19
  function decodeWavToMonoFloat32(buffer, targetRate = 16e3) {
20
- if (buffer.length < 44 || readChunkId(buffer, 0) !== "RIFF" || readChunkId(buffer, 8) !== "WAVE") throw new Error("Local STT currently requires PCM WAV audio");
20
+ if (buffer.length < 44 || readChunkId(buffer, 0) !== "RIFF" || readChunkId(buffer, 8) !== "WAVE") throw new Error("Unsupported or corrupt WAV audio");
21
21
  let offset = 12;
22
22
  let format;
23
23
  let dataOffset = -1;
@@ -1,8 +1,5 @@
1
1
  import type { STTConfig } from './types.js';
2
2
  /**
3
- * Lightweight availability check for channel routing. Do not import the STT
4
- * factory/provider registry here; channel plugins call this at startup and the
5
- * provider registry pulls optional SDKs (e.g. openai) into Electron's dynamic
6
- * extension runtime path.
3
+ * Runtime-truth availability check shared by channels and the gateway.
7
4
  */
8
5
  export declare function isSTTAvailable(config?: STTConfig): boolean;
@@ -1,23 +1,11 @@
1
- import { getVoiceProviderMetadata } from "../metadata/registry.js";
2
- import "../metadata/index.js";
1
+ import { resolveSTTProviderChain } from "./factory.js";
3
2
  //#region src/voice/stt/availability.ts
4
- function providerHasConfig(config, providerId) {
5
- const provider = config.providers?.[providerId];
6
- if (provider && Object.keys(provider).length > 0) return true;
7
- if ([...config.models ?? [], ...config.sharedModels ?? []].some((entry) => entry.provider === providerId && entry.capabilities?.includes("audio"))) return true;
8
- return getVoiceProviderMetadata("stt", providerId)?.diagnostics.requiresApiKey === false;
9
- }
10
3
  /**
11
- * Lightweight availability check for channel routing. Do not import the STT
12
- * factory/provider registry here; channel plugins call this at startup and the
13
- * provider registry pulls optional SDKs (e.g. openai) into Electron's dynamic
14
- * extension runtime path.
4
+ * Runtime-truth availability check shared by channels and the gateway.
15
5
  */
16
6
  function isSTTAvailable(config) {
17
7
  if (!config?.enabled) return false;
18
- if (providerHasConfig(config, config.provider)) return true;
19
- if (config.fallback?.enabled) return config.fallback.order.some((providerId) => providerHasConfig(config, providerId));
20
- return false;
8
+ return resolveSTTProviderChain(config).length > 0;
21
9
  }
22
10
  //#endregion
23
11
  export { isSTTAvailable };
@@ -14,6 +14,7 @@ function mergeSttConfigFromAppConfig(stt, toolsMedia) {
14
14
  return {
15
15
  ...DEFAULT_STT_CONFIG,
16
16
  ...patch,
17
+ managedAuto: stt === void 0,
17
18
  providers: mergeSttProviders(DEFAULT_STT_CONFIG.providers, patch.providers),
18
19
  fallback: {
19
20
  ...DEFAULT_STT_CONFIG.fallback,
@@ -1,11 +1,14 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { getModelCatalogStore, init_model_catalog_store } from "../../providers/model-catalog-store.js";
4
+ import { compareCatalogModels } from "../../providers/model-catalog-ranking.js";
3
5
  import { getMediaUnderstandingProvider, listMediaUnderstandingProviders } from "../../media-understanding/registry.js";
4
6
  import "./providers/index.js";
5
7
  import { resolveModelEntries } from "../../media-understanding/resolve-entries.js";
6
8
  import { readSttProviderFields, resolveSttProviderConfigSlice } from "./config-slice.js";
7
9
  //#region src/voice/stt/factory.ts
8
10
  init_logger();
11
+ init_model_catalog_store();
9
12
  const log = createLogger("STT:Factory");
10
13
  function resolveApiKey(providerId, fields, envKey) {
11
14
  return fields.apiKey ?? (envKey ? process.env[envKey] : void 0);
@@ -54,6 +57,7 @@ function resolveSTTProviderOrder(primary, fallback, config) {
54
57
  for (const providerId of fallback.order) if (providerId !== primary && !order.includes(providerId)) order.push(providerId);
55
58
  return order;
56
59
  }
60
+ if (!config.managedAuto) return [primary];
57
61
  const configured = sortAudioProvidersByAutoPriority(listMediaUnderstandingProviders()).filter((providerId) => resolveSTTProviderConfig(providerId, config) !== null);
58
62
  const order = [primary];
59
63
  for (const providerId of configured) if (providerId !== primary && !order.includes(providerId)) order.push(providerId);
@@ -72,8 +76,23 @@ function resolveModelEntryChain(config) {
72
76
  const resolved = resolveSTTProviderConfig(providerId, config, entry);
73
77
  if (resolved) chain.push(resolved);
74
78
  }
79
+ if (chain.some((entry) => entry.id === "xopc-cloud")) appendManagedCloudModels(chain, config);
75
80
  return chain;
76
81
  }
82
+ function appendManagedCloudModels(chain, config) {
83
+ const seen = new Set(chain.filter((entry) => entry.id === "xopc-cloud" && entry.model).map((entry) => entry.model));
84
+ const source = getModelCatalogStore().getSource("xopc-cloud");
85
+ const models = [...source?.models ?? []].sort((left, right) => compareCatalogModels(left, right, source?.recommended?.stt));
86
+ for (const model of models) {
87
+ if (model.availability !== "available" || model.kind !== "stt" || !model.operations.includes("audio.transcription") || seen.has(model.id)) continue;
88
+ const resolved = resolveSTTProviderConfig("xopc-cloud", config, {
89
+ provider: "xopc-cloud",
90
+ model: model.id,
91
+ capabilities: ["audio"]
92
+ });
93
+ if (resolved) chain.push(resolved);
94
+ }
95
+ }
77
96
  /** Build the full chain of resolved provider configs in priority order. */
78
97
  function resolveSTTProviderChain(config) {
79
98
  if (!config.enabled) return [];
@@ -82,6 +101,10 @@ function resolveSTTProviderChain(config) {
82
101
  const order = resolveSTTProviderOrder(config.provider, config.fallback, config);
83
102
  const chain = [];
84
103
  for (const providerId of order) {
104
+ if (providerId === "xopc-cloud") {
105
+ appendManagedCloudModels(chain, config);
106
+ continue;
107
+ }
85
108
  const resolved = resolveSTTProviderConfig(providerId, config);
86
109
  if (resolved) chain.push(resolved);
87
110
  }
@@ -7,6 +7,7 @@
7
7
  import './providers/index.js';
8
8
  import type { STTConfig, STTOptions, STTResult } from './types.js';
9
9
  export { transcribe } from './transcribe-core.js';
10
+ export { STTTranscriptionError } from './transcribe-core.js';
10
11
  export { isSTTAvailable } from './availability.js';
11
12
  export { mergeSttConfigFromAppConfig } from './config.js';
12
13
  /**
@@ -2,7 +2,7 @@ import { openAiTranscriptionProvider } from "./providers/openai-transcription.js
2
2
  import { alibabaTranscriptionProvider } from "./providers/alibaba-transcription.js";
3
3
  import "./providers/index.js";
4
4
  import { resolveSTTProviderChain, resolveSTTProviderConfig, resolveSTTProviderOrder } from "./factory.js";
5
- import { transcribe } from "./transcribe-core.js";
5
+ import { STTTranscriptionError, transcribe } from "./transcribe-core.js";
6
6
  import { isSTTAvailable } from "./availability.js";
7
7
  import { mergeSttConfigFromAppConfig } from "./config.js";
8
8
  import { checkMentionInTranscription } from "./mention.js";
@@ -29,4 +29,4 @@ async function transcribeWithProvider(audioBuffer, providerName, config, options
29
29
  };
30
30
  }
31
31
  //#endregion
32
- export { alibabaTranscriptionProvider, audioPreflightTranscribe, checkMentionInTranscription, isSTTAvailable, mergeSttConfigFromAppConfig, openAiTranscriptionProvider, resolveSTTProviderChain, resolveSTTProviderConfig, resolveSTTProviderOrder, transcribe, transcribeWithProvider };
32
+ export { STTTranscriptionError, alibabaTranscriptionProvider, audioPreflightTranscribe, checkMentionInTranscription, isSTTAvailable, mergeSttConfigFromAppConfig, openAiTranscriptionProvider, resolveSTTProviderChain, resolveSTTProviderConfig, resolveSTTProviderOrder, transcribe, transcribeWithProvider };
@@ -1,8 +1,8 @@
1
1
  import { listMediaUnderstandingProviders } from "../../media-understanding/registry.js";
2
2
  import { resolveSTTProviderConfig } from "./factory.js";
3
+ import { mergeSttConfigFromAppConfig } from "./config.js";
3
4
  import { getVoiceProviderMetadata } from "../metadata/registry.js";
4
5
  import "../metadata/index.js";
5
- import { mergeSttConfigFromAppConfig } from "./config.js";
6
6
  //#region src/voice/stt/list-providers.ts
7
7
  function fallbackMetadata(providerId, aliases) {
8
8
  return {
@@ -1,16 +1,19 @@
1
1
  import { createLogger } from "../../../utils/logger/index.js";
2
2
  import { init_logger } from "../../../utils/logger.js";
3
- import { registerMediaUnderstandingProvider } from "../../../media-understanding/registry.js";
4
3
  import { DEFAULT_LOCAL_VOICE_MODEL_ID, getLocalVoiceModel, hasInstalledLocalVoiceModel, isLocalVoiceModelInstalled } from "../../local/models.js";
4
+ import { registerMediaUnderstandingProvider } from "../../../media-understanding/registry.js";
5
5
  import { getLocalVoiceRuntimeClient } from "../../local/runtime-client.js";
6
- import { decodeWavToMonoFloat32 } from "../../local/wav.js";
6
+ import { decodeAudioToMonoFloat32 } from "../../audio/normalize.js";
7
7
  //#region src/voice/stt/providers/local-transcription.ts
8
8
  init_logger();
9
9
  const log = createLogger("STT:Local");
10
10
  async function transcribeAudio(req) {
11
11
  const model = getLocalVoiceModel(req.model);
12
12
  if (!isLocalVoiceModelInstalled(model.id)) throw new Error(`Local voice model "${model.id}" is not installed`);
13
- const decoded = decodeWavToMonoFloat32(req.buffer);
13
+ const decoded = await decodeAudioToMonoFloat32({
14
+ buffer: req.buffer,
15
+ signal: req.signal
16
+ });
14
17
  const audioBytes = Buffer.from(decoded.samples.buffer, decoded.samples.byteOffset, decoded.samples.byteLength);
15
18
  const startedAt = Date.now();
16
19
  const result = await getLocalVoiceRuntimeClient().request("transcribe", {
@@ -25,6 +28,7 @@ async function transcribeAudio(req) {
25
28
  model: model.id,
26
29
  audioDurationSeconds: decoded.durationSeconds,
27
30
  latencyMs: Date.now() - startedAt,
31
+ realTimeFactor: decoded.durationSeconds > 0 ? (Date.now() - startedAt) / 1e3 / decoded.durationSeconds : void 0,
28
32
  textLength: result.text.length
29
33
  }, "Local transcription completed");
30
34
  return {
@@ -1,13 +1,15 @@
1
1
  import { getModelCatalogStore, init_model_catalog_store } from "../../../providers/model-catalog-store.js";
2
2
  import { init_xopc_cloud_config, resolveXopcModelRouterUrl } from "../../../providers/xopc-cloud-config.js";
3
3
  import { getProviderAuthService, init_provider_auth_service } from "../../../providers/provider-auth-service.js";
4
+ import { compareCatalogModels } from "../../../providers/model-catalog-ranking.js";
4
5
  import { registerMediaUnderstandingProvider } from "../../../media-understanding/registry.js";
5
6
  //#region src/voice/stt/providers/xopc-cloud-transcription.ts
6
7
  init_model_catalog_store();
7
8
  init_provider_auth_service();
8
9
  init_xopc_cloud_config();
9
10
  function defaultModel() {
10
- return getModelCatalogStore().getSource("xopc-cloud")?.models.find((model) => model.availability === "available" && model.kind === "stt")?.id;
11
+ const source = getModelCatalogStore().getSource("xopc-cloud");
12
+ return source?.models.filter((model) => model.availability === "available" && model.kind === "stt").sort((left, right) => compareCatalogModels(left, right, source.recommended?.stt))[0]?.id;
11
13
  }
12
14
  const xopcCloudTranscriptionProvider = {
13
15
  id: "xopc-cloud",
@@ -11,5 +11,9 @@
11
11
  * wrap the input as a single CapabilityAttachmentInput and unpack the first
12
12
  * output. Multi-attachment cases go through `runAudioTranscription` directly.
13
13
  */
14
- import type { STTConfig, STTOptions, STTResultWithTracking } from './types.js';
14
+ import type { STTConfig, STTOptions, STTProviderFailureReason, STTResultWithTracking } from './types.js';
15
+ export declare class STTTranscriptionError extends Error {
16
+ readonly reasonCode: STTProviderFailureReason;
17
+ constructor(message: string, reasonCode: STTProviderFailureReason);
18
+ }
15
19
  export declare function transcribe(audioBuffer: Buffer, config: STTConfig, options?: STTOptions): Promise<STTResultWithTracking>;
@@ -10,9 +10,16 @@ function classifyFailureReason(reason) {
10
10
  const lower = reason.toLowerCase();
11
11
  if (lower.includes("not configured") || lower.includes("api key") || lower.includes("missing")) return "not_configured";
12
12
  if (lower.includes("timeout") || lower.includes("timed out") || lower.includes("aborted")) return "timeout";
13
- if (lower.includes("unsupported") || lower.includes("format")) return "unsupported_format";
13
+ if (lower.includes("unsupported") || lower.includes("format") || lower.includes("audio decoder")) return "unsupported_format";
14
14
  return "provider_error";
15
15
  }
16
+ var STTTranscriptionError = class extends Error {
17
+ constructor(message, reasonCode) {
18
+ super(message);
19
+ this.reasonCode = reasonCode;
20
+ this.name = "STTTranscriptionError";
21
+ }
22
+ };
16
23
  function toAttempt(attempt) {
17
24
  return {
18
25
  provider: attempt.provider ?? "unknown",
@@ -49,8 +56,8 @@ async function transcribe(audioBuffer, config, options) {
49
56
  attempts,
50
57
  attemptedProviders
51
58
  }, "All STT providers failed");
52
- const lastError = attempts.find((a) => a.task === "failed")?.error;
53
- throw new Error(lastError ?? "All STT providers failed");
59
+ const lastFailure = attempts.findLast((attempt) => attempt.task === "failed");
60
+ throw new STTTranscriptionError(lastFailure?.error ?? "All STT providers failed", lastFailure?.reasonCode ?? "unknown");
54
61
  }
55
62
  const chosen = attachmentDecision.chosen;
56
63
  const output = result.outputs[0];
@@ -60,11 +67,12 @@ async function transcribe(audioBuffer, config, options) {
60
67
  return {
61
68
  text: output.text,
62
69
  provider: chosen.provider ?? "unknown",
63
- ...chosen.model ? { language: options?.language } : {},
70
+ ...output.durationSeconds !== void 0 ? { duration: output.durationSeconds } : {},
71
+ ...output.language || options?.language ? { language: output.language ?? options?.language } : {},
64
72
  attempts,
65
73
  ...fallbackFrom ? { fallbackFrom } : {},
66
74
  attemptedProviders
67
75
  };
68
76
  }
69
77
  //#endregion
70
- export { transcribe };
78
+ export { STTTranscriptionError, transcribe };
@@ -31,6 +31,8 @@ import type { MediaUnderstandingModelEntry } from '../../media-understanding/typ
31
31
  export interface STTConfig {
32
32
  enabled: boolean;
33
33
  provider: string;
34
+ /** Runtime-only flag: absent app config enables managed provider selection. */
35
+ managedAuto?: boolean;
34
36
  /** Capability-local model chain (`tools.media.audio.models`). */
35
37
  models?: MediaUnderstandingModelEntry[];
36
38
  /** Shared model entries merged from `tools.media.models` at runtime. */
@@ -23,7 +23,7 @@ export interface ResolvedSpeechProvider {
23
23
  timeoutMs: number;
24
24
  }
25
25
  /** Resolve a single provider id → plugin + per-call config, or null if unavailable. */
26
- export declare function resolveSpeechProvider(providerId: TTSProvider, config: TTSConfig): ResolvedSpeechProvider | null;
26
+ export declare function resolveSpeechProvider(providerId: TTSProvider, config: TTSConfig, providerOverride?: Record<string, unknown>): ResolvedSpeechProvider | null;
27
27
  /** Order providers: explicit fallback when enabled, otherwise auto-select by registry order. */
28
28
  export declare function resolveProviderOrder(primary: TTSProvider, fallback: TTSConfig['fallback'] | undefined, config: TTSConfig): TTSProvider[];
29
29
  /** Resolve the full provider chain in priority order; only configured plugins included. */
@@ -1,19 +1,26 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { getModelCatalogStore, init_model_catalog_store } from "../../providers/model-catalog-store.js";
4
+ import { compareCatalogModels } from "../../providers/model-catalog-ranking.js";
3
5
  import { getSpeechProvider, listSpeechProviders } from "./speech-registry.js";
4
6
  import "./providers/index.js";
5
7
  import { buildTtsResolveRawConfig } from "./config-slice.js";
6
8
  //#region src/voice/tts/factory.ts
7
9
  init_logger();
10
+ init_model_catalog_store();
8
11
  const log = createLogger("TTS:Factory");
9
12
  /** Resolve a single provider id → plugin + per-call config, or null if unavailable. */
10
- function resolveSpeechProvider(providerId, config) {
13
+ function resolveSpeechProvider(providerId, config, providerOverride) {
11
14
  const plugin = getSpeechProvider(providerId);
12
15
  if (!plugin) {
13
16
  log.warn({ providerId }, `Unknown TTS provider "${providerId}" (not registered)`);
14
17
  return null;
15
18
  }
16
19
  const rawConfig = buildTtsResolveRawConfig(providerId, config);
20
+ if (providerOverride) rawConfig[providerId] = {
21
+ ...rawConfig[providerId] ?? {},
22
+ ...providerOverride
23
+ };
17
24
  const timeoutMs = config.timeoutMs ?? 3e4;
18
25
  const providerConfig = plugin.resolveConfig({
19
26
  cfg: void 0,
@@ -41,6 +48,7 @@ function resolveProviderOrder(primary, fallback, config) {
41
48
  for (const provider of fallback.order) if (provider !== primary && !order.includes(provider)) order.push(provider);
42
49
  return order;
43
50
  }
51
+ if (!config.managedAuto) return [primary];
44
52
  const configured = listSpeechProviders().map((plugin) => {
45
53
  return resolveSpeechProvider(plugin.id, config) ? plugin : null;
46
54
  }).filter((plugin) => plugin !== null).sort((left, right) => {
@@ -59,6 +67,20 @@ function resolveSpeechProviderChain(config) {
59
67
  const order = resolveProviderOrder(config.provider, config.fallback, config);
60
68
  const chain = [];
61
69
  for (const providerId of order) {
70
+ if (providerId === "xopc-cloud") {
71
+ const configuredModel = typeof config.providers?.["xopc-cloud"]?.model === "string" ? config.providers["xopc-cloud"].model : void 0;
72
+ const source = getModelCatalogStore().getSource("xopc-cloud");
73
+ const models = source?.models.filter((model) => model.availability === "available" && model.kind === "tts" && model.operations.includes("audio.speech") && Boolean(model.tts?.defaultVoice)).sort((left, right) => {
74
+ if (left.id === configuredModel) return -1;
75
+ if (right.id === configuredModel) return 1;
76
+ return compareCatalogModels(left, right, source.recommended?.tts);
77
+ }) ?? [];
78
+ for (const model of models) {
79
+ const resolved = resolveSpeechProvider(providerId, config, { model: model.id });
80
+ if (resolved) chain.push(resolved);
81
+ }
82
+ continue;
83
+ }
62
84
  const resolved = resolveSpeechProvider(providerId, config);
63
85
  if (resolved) chain.push(resolved);
64
86
  }
@@ -24,15 +24,17 @@ function mergeProviderEntries(base, patch) {
24
24
  }
25
25
  function mergeTtsConfigFromAppConfig(tts) {
26
26
  const p = tts ?? {};
27
+ const managedAuto = tts === void 0;
27
28
  return {
28
29
  ...DEFAULT_TTS_CONFIG,
29
30
  ...p,
31
+ managedAuto,
30
32
  enabled: p.enabled ?? DEFAULT_TTS_CONFIG.enabled,
31
33
  provider: normalizeTtsProvider(p.provider),
32
34
  trigger: normalizeTtsTrigger(p.trigger ?? DEFAULT_TTS_CONFIG.trigger),
33
- fallback: {
34
- ...DEFAULT_TTS_CONFIG.fallback,
35
- ...p.fallback
35
+ fallback: managedAuto ? { ...DEFAULT_TTS_CONFIG.fallback } : p.fallback ? { ...p.fallback } : {
36
+ enabled: false,
37
+ order: []
36
38
  },
37
39
  modelOverrides: {
38
40
  ...DEFAULT_TTS_CONFIG.modelOverrides,
@@ -1,13 +1,15 @@
1
1
  import { getModelCatalogStore, init_model_catalog_store } from "../../../providers/model-catalog-store.js";
2
2
  import { init_xopc_cloud_config, resolveXopcModelRouterUrl } from "../../../providers/xopc-cloud-config.js";
3
3
  import { getProviderAuthService, init_provider_auth_service } from "../../../providers/provider-auth-service.js";
4
+ import { compareCatalogModels } from "../../../providers/model-catalog-ranking.js";
4
5
  import { registerSpeechProvider } from "../speech-registry.js";
5
6
  //#region src/voice/tts/providers/xopc-cloud-speech.ts
6
7
  init_model_catalog_store();
7
8
  init_provider_auth_service();
8
9
  init_xopc_cloud_config();
9
10
  function availableModels() {
10
- return getModelCatalogStore().getSource("xopc-cloud")?.models.filter((model) => model.availability === "available" && model.kind === "tts") ?? [];
11
+ const source = getModelCatalogStore().getSource("xopc-cloud");
12
+ return source?.models.filter((model) => model.availability === "available" && model.kind === "tts").sort((left, right) => compareCatalogModels(left, right, source.recommended?.tts)) ?? [];
11
13
  }
12
14
  function readConfig(config) {
13
15
  return config;
@@ -57,6 +57,8 @@ export interface TTSModelOverrideConfig {
57
57
  export interface TTSConfig {
58
58
  enabled: boolean;
59
59
  provider: TTSProvider;
60
+ /** Runtime-only flag: absent app config enables managed provider selection. */
61
+ managedAuto?: boolean;
60
62
  /** Trigger mode for automatic voice replies. */
61
63
  trigger: TTSAutoMode;
62
64
  /** Fallback configuration */
@@ -1,11 +1,12 @@
1
1
  //#region src/voice/tts/types.ts
2
2
  const DEFAULT_TTS_CONFIG = {
3
3
  enabled: true,
4
- provider: "edge",
5
- trigger: "inbound",
4
+ provider: "xopc-cloud",
5
+ trigger: "off",
6
6
  fallback: {
7
7
  enabled: true,
8
8
  order: [
9
+ "xopc-cloud",
9
10
  "openai",
10
11
  "alibaba",
11
12
  "minimax",
@@ -26,6 +27,7 @@ const DEFAULT_TTS_CONFIG = {
26
27
  allowSeed: false
27
28
  },
28
29
  providers: {
30
+ "xopc-cloud": {},
29
31
  alibaba: {
30
32
  model: "qwen-tts",
31
33
  voice: "Cherry"
@@ -9,3 +9,26 @@ export declare function evaluateWorkUnderstandingCase(input: WorkUnderstandingEv
9
9
  evidenceCoverage: number;
10
10
  f1: number;
11
11
  };
12
+ export interface QuickUnderstandingEvaluationCase extends WorkUnderstandingEvaluationCase {
13
+ expectedSourceIds: string[];
14
+ observedSourceIds: string[];
15
+ startedAtMs: number;
16
+ firstCandidateAtMs?: number;
17
+ timeBudgetMs: number;
18
+ }
19
+ export type QuickUnderstandingGate = {
20
+ minPrecision: number;
21
+ minRecall: number;
22
+ minEvidenceCoverage: number;
23
+ minSourceCoverage: number;
24
+ };
25
+ export declare function evaluateQuickUnderstandingCase(input: QuickUnderstandingEvaluationCase): {
26
+ sourceCoverage: number;
27
+ timeToFirstCandidateMs: number;
28
+ withinTimeBudget: boolean;
29
+ precision: number;
30
+ recall: number;
31
+ evidenceCoverage: number;
32
+ f1: number;
33
+ };
34
+ export declare function meetsQuickUnderstandingGate(metrics: ReturnType<typeof evaluateQuickUnderstandingCase>, gate: QuickUnderstandingGate): boolean;
@@ -13,5 +13,22 @@ function evaluateWorkUnderstandingCase(input) {
13
13
  f1: precision + recall ? 2 * precision * recall / (precision + recall) : 0
14
14
  };
15
15
  }
16
+ function evaluateQuickUnderstandingCase(input) {
17
+ const topic = evaluateWorkUnderstandingCase(input);
18
+ const expectedSources = new Set(input.expectedSourceIds);
19
+ const observedSources = new Set(input.observedSourceIds);
20
+ const coveredSources = [...expectedSources].filter((sourceId) => observedSources.has(sourceId)).length;
21
+ const sourceCoverage = expectedSources.size ? coveredSources / expectedSources.size : 1;
22
+ const timeToFirstCandidateMs = input.firstCandidateAtMs === void 0 ? null : Math.max(0, input.firstCandidateAtMs - input.startedAtMs);
23
+ return {
24
+ ...topic,
25
+ sourceCoverage,
26
+ timeToFirstCandidateMs,
27
+ withinTimeBudget: timeToFirstCandidateMs !== null && timeToFirstCandidateMs <= input.timeBudgetMs
28
+ };
29
+ }
30
+ function meetsQuickUnderstandingGate(metrics, gate) {
31
+ return metrics.precision >= gate.minPrecision && metrics.recall >= gate.minRecall && metrics.evidenceCoverage >= gate.minEvidenceCoverage && metrics.sourceCoverage >= gate.minSourceCoverage && metrics.withinTimeBudget;
32
+ }
16
33
  //#endregion
17
- export { evaluateWorkUnderstandingCase };
34
+ export { evaluateQuickUnderstandingCase, evaluateWorkUnderstandingCase, meetsQuickUnderstandingGate };
@@ -9,5 +9,5 @@ import { DEFAULT_WORK_INVESTIGATION_BUDGET, investigateWorkContext } from "./inv
9
9
  import { persistWorkThreadsFromDiscovery } from "./thread-service.js";
10
10
  import { getWorkDiscoveryDirectorySource, listWorkDiscoveryDirectorySources, revokeWorkDiscoveryDirectorySource, upsertWorkDiscoveryDirectorySource } from "./source-repository.js";
11
11
  import { WorkDiscoveryService } from "./service.js";
12
- import { evaluateWorkUnderstandingCase } from "./evaluation.js";
13
- export { DEFAULT_WORK_INVESTIGATION_BUDGET, WORK_DISCOVERY_SCAN_POLICY_VERSION, WorkDiscoveryService, analyzeUnderstandingSources, analyzeWorkContext, appendWorkUnderstandingEvidence, canonicalWorkDiscoveryRoot, createWorkDiscoveryRun, createWorkUnderstandingInvestigation, discoverWorkCandidates, evaluateWorkUnderstandingCase, findActiveWorkDiscoverySourceRefresh, getWorkDiscoveryDirectorySource, getWorkDiscoveryOnboardingState, getWorkDiscoveryRun, getWorkDiscoveryRunByIdempotencyKey, getWorkUnderstandingInvestigation, getWorkUnderstandingInvestigationForRun, investigateWorkContext, listWorkDiscoveryDirectorySources, listWorkDiscoverySourceRefreshes, listWorkUnderstandingEvidence, persistWorkThreadsFromDiscovery, previewWorkDiscoveryRoot, probeWorkDiscoveryRoot, readWorkDiscoveryTextExcerpt, recordWorkDiscoverySourceRefresh, resetWorkUnderstandingInvestigation, resolvePersonalWorkRoots, revokeWorkDiscoveryDirectorySource, searchWorkDiscoveryText, setWorkDiscoveryFeedback, setWorkDiscoveryOnboardingState, summarizeWorkContextSnapshot, updateWorkDiscoveryRun, updateWorkDiscoverySourceRefreshForRun, updateWorkUnderstandingEvidenceObservation, updateWorkUnderstandingInvestigation, upsertWorkDiscoveryDirectorySource, workDiscoveryFingerprintsEqual, workDiscoveryResultMarkdown };
12
+ import { evaluateQuickUnderstandingCase, evaluateWorkUnderstandingCase, meetsQuickUnderstandingGate } from "./evaluation.js";
13
+ export { DEFAULT_WORK_INVESTIGATION_BUDGET, WORK_DISCOVERY_SCAN_POLICY_VERSION, WorkDiscoveryService, analyzeUnderstandingSources, analyzeWorkContext, appendWorkUnderstandingEvidence, canonicalWorkDiscoveryRoot, createWorkDiscoveryRun, createWorkUnderstandingInvestigation, discoverWorkCandidates, evaluateQuickUnderstandingCase, evaluateWorkUnderstandingCase, findActiveWorkDiscoverySourceRefresh, getWorkDiscoveryDirectorySource, getWorkDiscoveryOnboardingState, getWorkDiscoveryRun, getWorkDiscoveryRunByIdempotencyKey, getWorkUnderstandingInvestigation, getWorkUnderstandingInvestigationForRun, investigateWorkContext, listWorkDiscoveryDirectorySources, listWorkDiscoverySourceRefreshes, listWorkUnderstandingEvidence, meetsQuickUnderstandingGate, persistWorkThreadsFromDiscovery, previewWorkDiscoveryRoot, probeWorkDiscoveryRoot, readWorkDiscoveryTextExcerpt, recordWorkDiscoverySourceRefresh, resetWorkUnderstandingInvestigation, resolvePersonalWorkRoots, revokeWorkDiscoveryDirectorySource, searchWorkDiscoveryText, setWorkDiscoveryFeedback, setWorkDiscoveryOnboardingState, summarizeWorkContextSnapshot, updateWorkDiscoveryRun, updateWorkDiscoverySourceRefreshForRun, updateWorkUnderstandingEvidenceObservation, updateWorkUnderstandingInvestigation, upsertWorkDiscoveryDirectorySource, workDiscoveryFingerprintsEqual, workDiscoveryResultMarkdown };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xopcai/xopc",
3
- "version": "0.0.210",
3
+ "version": "0.0.211",
4
4
  "description": "Local-first AI system that remembers context, coordinates AI, and sustains long-term progress.",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -165,8 +165,8 @@
165
165
  "vue": "^3.5.35",
166
166
  "@xopcai/endpoint-tools-protocol": "0.0.0",
167
167
  "@xopcai/gateway-contract": "0.0.0",
168
- "@xopcai/realtime-client": "0.0.0",
169
- "@xopcai/realtime-protocol": "0.0.0"
168
+ "@xopcai/realtime-protocol": "0.0.0",
169
+ "@xopcai/realtime-client": "0.0.0"
170
170
  },
171
171
  "scripts": {
172
172
  "assets:brand": "node scripts/generate-brand-assets.mjs",
@@ -198,6 +198,7 @@
198
198
  "dev:gateway": "sh -c 'mkdir -p \"$HOME/.xopc-dev\" && XOPC_STATE_DIR=\"$HOME/.xopc-dev\" XOPC_CONFIG_PATH=\"$HOME/.xopc-dev/xopc.json\" XOPC_CONFIG=\"$HOME/.xopc-dev/xopc.json\" XOPC_LOG_DIR=\"$HOME/.xopc-dev/logs\" XOPC_LOG_LEVEL=info tsx src/cli/bin.ts gateway \"$@\"' --",
199
199
  "start": "node dist/src/cli/bin.js",
200
200
  "test": "vitest run src extensions/telegram/src extensions/feishu/src extensions/weixin/src",
201
+ "test:quick-understanding": "XOPC_LOG_LEVEL=fatal vitest run src/work-discovery/__tests__/evaluation.test.ts src/user-context/sources/__tests__/activity-clustering.test.ts src/knowledge/__tests__/quick-understanding.e2e.test.ts src/connectors/__tests__/content-enrichment.test.ts src/connectors/__tests__/connected-source-ingestion.test.ts",
201
202
  "test:skills": "vitest run src/agent/skills/__tests__",
202
203
  "test:skills:regression": "./scripts/test-skills.sh",
203
204
  "test:skills:all": "npm run test:skills && npm run test:skills:regression",