@xopcai/xopc 0.0.190 → 0.0.192

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 (342) 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-DstnJCS5.js → activity-store-B-tzXpDD.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-9vAbkroX.js → agent-avatar-dicebear-xOu0qNwc.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents-CxuwvDk0.js +68 -0
  6. package/dist/gateway/static/root/assets/{api-BTL9kayv.js → api-fMItZb-h.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-DkFeIdBf.js → app-management-settings-panel-D6Rv3OWI.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-Bxs8Fpaj.js → appearance-settings-CKoNCwco.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-wAb5dnHZ.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-Ch2RmLCC.js → archive-plugin-BokNQBwH.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-BhMQM_Ky.js → attachment-load-Dx1HglsM.js} +1 -1
  12. package/dist/gateway/static/root/assets/automations-page-Drgazevs.js +6 -0
  13. package/dist/gateway/static/root/assets/{binary-plugins-D6CqlymH.js → binary-plugins-CPYAflIG.js} +1 -1
  14. package/dist/gateway/static/root/assets/{block-editor-ClL6HEg9.js → block-editor-BFLgl8SS.js} +47 -47
  15. package/dist/gateway/static/root/assets/browser-settings-page-DmYlFJW7.js +8 -0
  16. package/dist/gateway/static/root/assets/{browser-workflow-inputs-BYy48VhN.js → browser-workflow-inputs-CqLnqA9z.js} +1 -1
  17. package/dist/gateway/static/root/assets/{browser-workflows-page-zgLibuMH.js → browser-workflows-page-Db5v3HtE.js} +2 -2
  18. package/dist/gateway/static/root/assets/capabilities-settings-panel-D7Z8T0o5.js +7 -0
  19. package/dist/gateway/static/root/assets/capability-presets-api-lov0J9A2.js +1 -0
  20. package/dist/gateway/static/root/assets/capability-presets-settings-panel-COjnwO0U.js +3 -0
  21. package/dist/gateway/static/root/assets/{channel-recipient-api-BThDGiO3.js → channel-recipient-api-DSJznouK.js} +1 -1
  22. package/dist/gateway/static/root/assets/channels-settings-DcRYBNN7.js +1 -0
  23. package/dist/gateway/static/root/assets/channels-status-swr-C2UYdebT.js +1 -0
  24. package/dist/gateway/static/root/assets/{code-editor-D4_k-6QN.js → code-editor-dFzqyDXS.js} +1 -1
  25. package/dist/gateway/static/root/assets/{connectors-api-DS9ED-EL.js → connectors-api-3ccRyS3L.js} +1 -1
  26. package/dist/gateway/static/root/assets/connectors-page-FVmvBG9H.js +2 -0
  27. package/dist/gateway/static/root/assets/{cron-expression-CkgsvhtW.js → cron-expression-C9hhCiuo.js} +1 -1
  28. package/dist/gateway/static/root/assets/dependency-picker-CTtZFZug.js +1 -0
  29. package/dist/gateway/static/root/assets/{desktop-pet-Cv8rGhYW.js → desktop-pet-DOUeNVmC.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-settings-CIeJdwfV.js → desktop-pet-settings-D4704vtl.js} +1 -1
  31. package/dist/gateway/static/root/assets/{directory-picker-path-field-D8jXEiAY.js → directory-picker-path-field-DJDXeA1B.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-debug-page-CCZ9u6TZ.js → extension-debug-page-C0n2NMF1.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-page-CV36ILRG.js → extension-page-vG-xxRNs.js} +1 -1
  34. package/dist/gateway/static/root/assets/extension-settings-page-CtuY2THd.js +1 -0
  35. package/dist/gateway/static/root/assets/{gateway-config-api-D4_r5iJM.js → gateway-config-api-CZra7GuI.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-settings-CYlntpBH.js → gateway-settings-Cz33jRkR.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-startup-retry-EO9mKvzE.js → gateway-startup-retry-BbVV0udv.js} +1 -1
  38. package/dist/gateway/static/root/assets/{heartbeat-settings-D4SyWob8.js → heartbeat-settings-D2XMlA_U.js} +1 -1
  39. package/dist/gateway/static/root/assets/home-page-CPrHkPN6.js +3 -0
  40. package/dist/gateway/static/root/assets/html-workspace-editor-bXK5tq64.js +1 -0
  41. package/dist/gateway/static/root/assets/{image-generation-api-Bu7PyVSh.js → image-generation-api-BgrOvhaJ.js} +1 -1
  42. package/dist/gateway/static/root/assets/index-Cg7Xnlu3.css +1 -0
  43. package/dist/gateway/static/root/assets/index-DzmbmOGA.js +150 -0
  44. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BMhCuVBZ.js → keyboard-shortcuts-settings-BfyAEG1G.js} +1 -1
  45. package/dist/gateway/static/root/assets/local-app-workbench-page-Clz47vSr.js +2 -0
  46. package/dist/gateway/static/root/assets/{local-apps-page-ijIe7_y2.js → local-apps-page-BYalcRSY.js} +1 -1
  47. package/dist/gateway/static/root/assets/{locale-store-deR2zRaE.js → locale-store-VOY1wMO9.js} +1 -1
  48. package/dist/gateway/static/root/assets/logs-page-Cxq9WMf5.js +2 -0
  49. package/dist/gateway/static/root/assets/{management-settings--V_fovKD.js → management-settings-BQf-6s32.js} +1 -1
  50. package/dist/gateway/static/root/assets/{markdown-editor-BvUebh3C.js → markdown-editor-TWGaF7Xa.js} +2 -2
  51. package/dist/gateway/static/root/assets/{markdown-split-Dt9-in6W.js → markdown-split-Cy_2SN1Q.js} +1 -1
  52. package/dist/gateway/static/root/assets/{media-plugins-B3pj_iO0.js → media-plugins-CkDupqb2.js} +1 -1
  53. package/dist/gateway/static/root/assets/messages-DMJ-6-1m.js +3 -0
  54. package/dist/gateway/static/root/assets/{notes-page-DZ366lIT.js → notes-page-kiGRR9jo.js} +1 -1
  55. package/dist/gateway/static/root/assets/notes-workbench-DkYkPGyB.js +4 -0
  56. package/dist/gateway/static/root/assets/{page-tabs-C5ge434C.js → page-tabs-CvzSdYVj.js} +1 -1
  57. package/dist/gateway/static/root/assets/{preview-open-alternatives-BFa9DgSV.js → preview-open-alternatives-kZ0nco7e.js} +1 -1
  58. package/dist/gateway/static/root/assets/{product-open-page-Dc9CcWdu.js → product-open-page-DgoieqQC.js} +1 -1
  59. package/dist/gateway/static/root/assets/project-detail-page-CeSjJd-N.js +1 -0
  60. package/dist/gateway/static/root/assets/projects-page-fZ1rm4b9.js +1 -0
  61. package/dist/gateway/static/root/assets/remote-access-hub-CbYI6KC8.js +1 -0
  62. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Bud_NTEZ.js +5 -0
  63. package/dist/gateway/static/root/assets/{schema-form-B84DckWe.js → schema-form-GlbsCBmv.js} +1 -1
  64. package/dist/gateway/static/root/assets/sessions-page-sOJ_TnLm.js +1 -0
  65. package/dist/gateway/static/root/assets/settings-advanced-gate-BI0u77dt.js +1 -0
  66. package/dist/gateway/static/root/assets/{settings-form-section-Dp9itvdy.js → settings-form-section-CKLns16d.js} +1 -1
  67. package/dist/gateway/static/root/assets/{settings-loading-skeleton-CCtlhoy7.js → settings-loading-skeleton-BDzpxgk0.js} +1 -1
  68. package/dist/gateway/static/root/assets/settings-page-BH0pF7QB.js +1 -0
  69. package/dist/gateway/static/root/assets/{settings-page-layout-EQIOJa_L.js → settings-page-layout-J793iqfm.js} +1 -1
  70. package/dist/gateway/static/root/assets/{setup-status-panel-Cwi-SPja.js → setup-status-panel-CGsml89P.js} +1 -1
  71. package/dist/gateway/static/root/assets/{share-preview-page-C4_B2jvf.js → share-preview-page-UTm_7r0l.js} +1 -1
  72. package/dist/gateway/static/root/assets/shares-settings-BM--lgUS.js +1 -0
  73. package/dist/gateway/static/root/assets/skill-reload-api-CGCOC-rV.js +1 -0
  74. package/dist/gateway/static/root/assets/skills-page-iLyaOl48.js +2 -0
  75. package/dist/gateway/static/root/assets/skills-page.utils-Bwid1TGB.js +1 -0
  76. package/dist/gateway/static/root/assets/style-TIDOdKy0.js +7 -0
  77. package/dist/gateway/static/root/assets/{system-settings-panel-Dpx2ags2.js → system-settings-panel-BcB3p1e3.js} +1 -1
  78. package/dist/gateway/static/root/assets/task-detail-page-DQYEf08v.js +1 -0
  79. package/dist/gateway/static/root/assets/{theme-store-DnBOcGXi.js → theme-store-GVZOImyb.js} +1 -1
  80. package/dist/gateway/static/root/assets/{typed-models-lib-DULmTHUB.js → typed-models-lib-CT2c85Ju.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-autosave-BrjVk5VH.js → use-autosave-CcvY7DTh.js} +1 -1
  82. package/dist/gateway/static/root/assets/user-context-page-CGI41bfO.js +1 -0
  83. package/dist/gateway/static/root/assets/{vendor-codemirror--gTq3YAI.js → vendor-codemirror-DRr7hFaD.js} +16 -16
  84. package/dist/gateway/static/root/assets/voice-api-key-field-Ricc3QGo.js +1 -0
  85. package/dist/gateway/static/root/assets/{work-discovery-overlay-Wr-uF7VA.js → work-discovery-overlay-BoomfqhX.js} +1 -1
  86. package/dist/gateway/static/root/assets/{work-discovery-page-BWds95sL.js → work-discovery-page-mbnepbQk.js} +1 -1
  87. package/dist/gateway/static/root/assets/workflow-run-setup-panel-DSWG2xqL.js +3 -0
  88. package/dist/gateway/static/root/assets/workflows-page-DtV0ruyk.js +5 -0
  89. package/dist/gateway/static/root/index.html +7 -7
  90. package/dist/package.js +1 -1
  91. package/dist/src/agent/agent-manager.d.ts +2 -0
  92. package/dist/src/agent/agent-manager.js +76 -0
  93. package/dist/src/agent/background-review/prompts.d.ts +1 -1
  94. package/dist/src/agent/background-review/prompts.js +1 -1
  95. package/dist/src/agent/background-review/run-background-review.js +3 -12
  96. package/dist/src/agent/embedded/run-for-session.js +3 -0
  97. package/dist/src/agent/embedded/run-turn.js +4 -1
  98. package/dist/src/agent/embedded/session-runner.js +3 -4
  99. package/dist/src/agent/embedded/types.d.ts +10 -1
  100. package/dist/src/agent/embedded/xopc-stream-bridge.js +3 -2
  101. package/dist/src/agent/external-tools/mcp-provider.d.ts +1 -0
  102. package/dist/src/agent/external-tools/mcp-provider.js +21 -6
  103. package/dist/src/agent/image/generation/openai-images-provider.d.ts +1 -1
  104. package/dist/src/agent/image/generation/openai-images-provider.js +1 -1
  105. package/dist/src/agent/image/generation/provider-registry.d.ts +2 -0
  106. package/dist/src/agent/image/generation/provider-registry.js +21 -10
  107. package/dist/src/agent/image/generation/providers/dashscope.js +20 -0
  108. package/dist/src/agent/image/generation/providers/fal.d.ts +1 -1
  109. package/dist/src/agent/image/generation/providers/fal.js +12 -6
  110. package/dist/src/agent/image/generation/providers/google.js +8 -0
  111. package/dist/src/agent/image/generation/providers/minimax.js +20 -0
  112. package/dist/src/agent/image/generation/providers/openai.js +36 -26
  113. package/dist/src/agent/image/generation/providers/xopc-cloud.d.ts +2 -0
  114. package/dist/src/agent/image/generation/providers/xopc-cloud.js +74 -0
  115. package/dist/src/agent/image/generation/types.d.ts +15 -2
  116. package/dist/src/agent/mcp/bundle-mcp-gateway.d.ts +1 -0
  117. package/dist/src/agent/mcp/bundle-mcp-gateway.js +2 -1
  118. package/dist/src/agent/mcp/bundle-mcp-policy.d.ts +5 -1
  119. package/dist/src/agent/mcp/bundle-mcp-policy.js +11 -3
  120. package/dist/src/agent/mcp/bundle-mcp-runtime.js +3 -2
  121. package/dist/src/agent/mcp/bundle-mcp-types.d.ts +2 -1
  122. package/dist/src/agent/mcp/index.js +2 -2
  123. package/dist/src/agent/mcp/mcp-stdio-transport.js +1 -1
  124. package/dist/src/agent/mcp/mcp-transport.d.ts +2 -1
  125. package/dist/src/agent/mcp/mcp-transport.js +22 -4
  126. package/dist/src/agent/memory/compaction.js +19 -17
  127. package/dist/src/agent/memory/context-budget.js +2 -3
  128. package/dist/src/agent/memory/understanding/service.d.ts +1 -0
  129. package/dist/src/agent/memory/understanding/service.js +49 -20
  130. package/dist/src/agent/memory/understanding/types.d.ts +1 -0
  131. package/dist/src/agent/memory/user-context-coordinator.js +6 -0
  132. package/dist/src/agent/orchestration/agent-orchestrator.js +15 -1
  133. package/dist/src/agent/service/direct-turn-helpers.js +14 -5
  134. package/dist/src/agent/skills/index.d.ts +1 -1
  135. package/dist/src/agent/skills/index.js +2 -2
  136. package/dist/src/agent/skills/installer.d.ts +3 -10
  137. package/dist/src/agent/skills/installer.js +99 -156
  138. package/dist/src/agent/skills/marketplace/adapter.types.d.ts +3 -1
  139. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +30 -6
  140. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +21 -4
  141. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +7 -4
  142. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +3 -0
  143. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +7 -1
  144. package/dist/src/agent/skills/marketplace/search.d.ts +2 -2
  145. package/dist/src/agent/skills/marketplace/search.js +52 -21
  146. package/dist/src/agent/skills/skills-marketplace.d.ts +1 -1
  147. package/dist/src/agent/skills/skills-marketplace.js +2 -2
  148. package/dist/src/agent/skills/types.d.ts +0 -8
  149. package/dist/src/agent/tools/exec-command.d.ts +1 -0
  150. package/dist/src/agent/tools/exec-command.js +2 -1
  151. package/dist/src/agent/tools/factory.d.ts +1 -0
  152. package/dist/src/agent/tools/factory.js +17 -2
  153. package/dist/src/agent/tools/managed-job-tool.d.ts +1 -1
  154. package/dist/src/agent/tools/managed-job-tool.js +3 -2
  155. package/dist/src/agent/tools/skill-install-tool.d.ts +2 -2
  156. package/dist/src/agent/tools/skill-install-tool.js +8 -4
  157. package/dist/src/agent/tools/skills-marketplace-search-tool.js +3 -2
  158. package/dist/src/agent/tools/workflow-tool.d.ts +1 -0
  159. package/dist/src/agent/tools/workflow-tool.js +14 -4
  160. package/dist/src/agent-manifest/schema.d.ts +20 -0
  161. package/dist/src/agent-manifest/schema.js +6 -1
  162. package/dist/src/browser/providers/cloakbrowser.js +1 -1
  163. package/dist/src/cli/command-loaders.js +1 -0
  164. package/dist/src/cli/command-manifest.js +4 -0
  165. package/dist/src/cli/commands/doctor/checks/node-version.js +3 -3
  166. package/dist/src/cli/commands/doctor/checks/tool-runtimes.d.ts +2 -0
  167. package/dist/src/cli/commands/doctor/checks/tool-runtimes.js +36 -0
  168. package/dist/src/cli/commands/doctor/flow.js +2 -0
  169. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  170. package/dist/src/cli/commands/models.js +0 -1
  171. package/dist/src/cli/commands/onboard/model.d.ts +18 -0
  172. package/dist/src/cli/commands/onboard/model.js +81 -5
  173. package/dist/src/cli/commands/onboard.js +13 -1
  174. package/dist/src/cli/commands/runtime.d.ts +1 -0
  175. package/dist/src/cli/commands/runtime.js +77 -0
  176. package/dist/src/cli/commands/setup.js +15 -1
  177. package/dist/src/cli/commands/skills.js +7 -4
  178. package/dist/src/config/agent-profile.js +1 -1
  179. package/dist/src/config/index.js +2 -2
  180. package/dist/src/config/schema.d.ts +125 -0
  181. package/dist/src/config/schema.js +77 -2
  182. package/dist/src/config/voice.d.ts +6 -0
  183. package/dist/src/config/voice.js +17 -0
  184. package/dist/src/extensions/install.js +1 -1
  185. package/dist/src/extensions/types/providers.d.ts +4 -0
  186. package/dist/src/gateway/agents-admin.js +1 -1
  187. package/dist/src/gateway/capability-presets-admin.d.ts +9 -0
  188. package/dist/src/gateway/capability-presets-admin.js +24 -6
  189. package/dist/src/gateway/chat-stream/mapper.js +8 -4
  190. package/dist/src/gateway/chat-stream/protocol.d.ts +10 -1
  191. package/dist/src/gateway/heartbeat/service.js +1 -1
  192. package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -0
  193. package/dist/src/gateway/hono/routes/commands-skills.js +2 -1
  194. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  195. package/dist/src/gateway/hono/routes/models.js +11 -11
  196. package/dist/src/gateway/hono/routes/runtime-tools.d.ts +3 -0
  197. package/dist/src/gateway/hono/routes/runtime-tools.js +142 -0
  198. package/dist/src/gateway/hono/routes/understanding-sources.js +2 -1
  199. package/dist/src/gateway/hono/routes/voice.js +43 -2
  200. package/dist/src/gateway/hono/routes/workflows.js +1 -1
  201. package/dist/src/gateway/hono/routes/you.js +22 -25
  202. package/dist/src/gateway/image-generation-setup.d.ts +2 -3
  203. package/dist/src/gateway/image-generation-setup.js +39 -8
  204. package/dist/src/gateway/service/marketplace-service.d.ts +1 -1
  205. package/dist/src/gateway/service/marketplace-service.js +2 -2
  206. package/dist/src/heartbeat/index.js +1 -1
  207. package/dist/src/infra/update-global.js +1 -1
  208. package/dist/src/providers/extension-stream-bridge.js +8 -7
  209. package/dist/src/providers/model-catalog-store.d.ts +35 -0
  210. package/dist/src/providers/model-catalog-store.js +25 -1
  211. package/dist/src/providers/model-catalog-sync-service.js +6 -0
  212. package/dist/src/providers/model-registry.js +4 -4
  213. package/dist/src/providers/prompt-cache-payload.d.ts +13 -0
  214. package/dist/src/providers/prompt-cache-payload.js +110 -0
  215. package/dist/src/providers/register-runtime-providers.js +4 -4
  216. package/dist/src/providers/xopc-cloud-model-source.js +101 -8
  217. package/dist/src/runtime-tools/archive.d.ts +8 -0
  218. package/dist/src/runtime-tools/archive.js +99 -0
  219. package/dist/src/runtime-tools/bootstrap.d.ts +16 -0
  220. package/dist/src/runtime-tools/bootstrap.js +33 -0
  221. package/dist/src/runtime-tools/catalog.d.ts +19 -0
  222. package/dist/src/runtime-tools/catalog.js +59 -0
  223. package/dist/src/runtime-tools/command.d.ts +15 -0
  224. package/dist/src/runtime-tools/command.js +59 -0
  225. package/dist/src/runtime-tools/download-source.d.ts +24 -0
  226. package/dist/src/runtime-tools/download-source.js +125 -0
  227. package/dist/src/runtime-tools/downloader.d.ts +21 -0
  228. package/dist/src/runtime-tools/downloader.js +137 -0
  229. package/dist/src/runtime-tools/environment.d.ts +20 -0
  230. package/dist/src/runtime-tools/environment.js +113 -0
  231. package/dist/src/runtime-tools/errors.d.ts +10 -0
  232. package/dist/src/runtime-tools/errors.js +14 -0
  233. package/dist/src/runtime-tools/index.d.ts +7 -0
  234. package/dist/src/runtime-tools/index.js +7 -0
  235. package/dist/src/runtime-tools/install-lock.d.ts +1 -0
  236. package/dist/src/runtime-tools/install-lock.js +50 -0
  237. package/dist/src/runtime-tools/manager.d.ts +20 -0
  238. package/dist/src/runtime-tools/manager.js +641 -0
  239. package/dist/src/runtime-tools/manifest-store.d.ts +3 -0
  240. package/dist/src/runtime-tools/manifest-store.js +26 -0
  241. package/dist/src/runtime-tools/network.d.ts +9 -0
  242. package/dist/src/runtime-tools/network.js +41 -0
  243. package/dist/src/runtime-tools/offline-bundle.d.ts +16 -0
  244. package/dist/src/runtime-tools/offline-bundle.js +41 -0
  245. package/dist/src/runtime-tools/paths.d.ts +7 -0
  246. package/dist/src/runtime-tools/paths.js +22 -0
  247. package/dist/src/runtime-tools/probe.d.ts +7 -0
  248. package/dist/src/runtime-tools/probe.js +71 -0
  249. package/dist/src/runtime-tools/prune.d.ts +10 -0
  250. package/dist/src/runtime-tools/prune.js +93 -0
  251. package/dist/src/runtime-tools/types.d.ts +70 -0
  252. package/dist/src/runtime-tools/types.js +1 -0
  253. package/dist/src/share/share-zip.js +1 -1
  254. package/dist/src/storage/sqlite/migrations/113_memory_evidence_single_source.sql +42 -20
  255. package/dist/src/tasks/home-query-service.js +1 -5
  256. package/dist/src/tasks/index.js +2 -2
  257. package/dist/src/tasks/project-operating-view-service.d.ts +2 -1
  258. package/dist/src/tasks/project-operating-view-service.js +6 -4
  259. package/dist/src/tasks/task-dependency-service.d.ts +2 -1
  260. package/dist/src/tasks/task-dependency-service.js +15 -0
  261. package/dist/src/tunnel/frpc-binary.js +1 -1
  262. package/dist/src/user-context/domain.d.ts +2 -1
  263. package/dist/src/user-context/domain.js +12 -1
  264. package/dist/src/user-context/manual-understanding.js +8 -10
  265. package/dist/src/user-context/planner.js +1 -6
  266. package/dist/src/user-context/sources/activity-clustering.d.ts +5 -0
  267. package/dist/src/user-context/sources/activity-clustering.js +130 -0
  268. package/dist/src/user-context/sources/catalog.js +26 -0
  269. package/dist/src/user-context/sources/local-source-contract.d.ts +3 -0
  270. package/dist/src/user-context/sources/local-source-contract.js +15 -0
  271. package/dist/src/user-context/sources/repository.js +7 -1
  272. package/dist/src/user-context/sources/types.d.ts +7 -1
  273. package/dist/src/user-context/understanding.d.ts +15 -0
  274. package/dist/src/user-context/understanding.js +24 -0
  275. package/dist/src/voice/local/model-files.js +1 -1
  276. package/dist/src/voice/metadata/builtin.js +99 -32
  277. package/dist/src/voice/metadata/types.d.ts +3 -0
  278. package/dist/src/voice/stt/availability.js +4 -1
  279. package/dist/src/voice/stt/config-slice.d.ts +0 -2
  280. package/dist/src/voice/stt/config-slice.js +1 -6
  281. package/dist/src/voice/stt/factory.js +2 -2
  282. package/dist/src/voice/stt/index.d.ts +2 -3
  283. package/dist/src/voice/stt/list-providers.js +1 -1
  284. package/dist/src/voice/stt/providers/alibaba-transcription.d.ts +0 -19
  285. package/dist/src/voice/stt/providers/alibaba-transcription.js +59 -132
  286. package/dist/src/voice/stt/providers/index.d.ts +1 -0
  287. package/dist/src/voice/stt/providers/index.js +2 -1
  288. package/dist/src/voice/stt/providers/openai-transcription.d.ts +2 -2
  289. package/dist/src/voice/stt/providers/openai-transcription.js +4 -4
  290. package/dist/src/voice/stt/providers/xopc-cloud-transcription.d.ts +2 -0
  291. package/dist/src/voice/stt/providers/xopc-cloud-transcription.js +49 -0
  292. package/dist/src/voice/stt/types.js +2 -2
  293. package/dist/src/voice/tts/providers/index.d.ts +1 -0
  294. package/dist/src/voice/tts/providers/index.js +2 -1
  295. package/dist/src/voice/tts/providers/xopc-cloud-speech.d.ts +2 -0
  296. package/dist/src/voice/tts/providers/xopc-cloud-speech.js +113 -0
  297. package/dist/src/voice/tts/types.d.ts +1 -1
  298. package/dist/src/work-discovery/analyzer.js +9 -4
  299. package/dist/src/work-discovery/candidate-discovery.d.ts +1 -0
  300. package/dist/src/work-discovery/candidate-discovery.js +3 -3
  301. package/dist/src/work-discovery/index.js +2 -2
  302. package/dist/src/work-discovery/service.d.ts +2 -1
  303. package/dist/src/work-discovery/service.js +126 -37
  304. package/dist/src/work-discovery/types.d.ts +1 -0
  305. package/dist/src/workflows/service/workflow-run-service.js +8 -0
  306. package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -1
  307. package/package.json +1 -1
  308. package/dist/gateway/static/root/assets/agents-D1t4SfMQ.js +0 -68
  309. package/dist/gateway/static/root/assets/apps-page-Cgrgu5OW.js +0 -1
  310. package/dist/gateway/static/root/assets/automations-page-CtJxstKh.js +0 -6
  311. package/dist/gateway/static/root/assets/browser-settings-page-DW99iDmD.js +0 -8
  312. package/dist/gateway/static/root/assets/capabilities-settings-panel-CHUrT9EB.js +0 -7
  313. package/dist/gateway/static/root/assets/capability-presets-api-BB8t4Ja7.js +0 -1
  314. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Cycrv0YV.js +0 -1
  315. package/dist/gateway/static/root/assets/channels-settings-V96gPUAU.js +0 -1
  316. package/dist/gateway/static/root/assets/channels-status-swr-Cz7SAAkm.js +0 -1
  317. package/dist/gateway/static/root/assets/connectors-page-BhlyQoQI.js +0 -2
  318. package/dist/gateway/static/root/assets/extension-settings-page-IyQrSILY.js +0 -1
  319. package/dist/gateway/static/root/assets/home-page-B2Kagoh8.js +0 -3
  320. package/dist/gateway/static/root/assets/html-workspace-editor-C3DKAkMc.js +0 -1
  321. package/dist/gateway/static/root/assets/index-CYT5DOzr.js +0 -150
  322. package/dist/gateway/static/root/assets/index-D6e3tPL-.css +0 -1
  323. package/dist/gateway/static/root/assets/local-app-workbench-page-BHYbFjqy.js +0 -2
  324. package/dist/gateway/static/root/assets/logs-page-IIn8Tess.js +0 -2
  325. package/dist/gateway/static/root/assets/messages-B4XqB8I6.js +0 -3
  326. package/dist/gateway/static/root/assets/notes-workbench-S2sBVOLw.js +0 -4
  327. package/dist/gateway/static/root/assets/project-detail-page-BilzoCJ7.js +0 -1
  328. package/dist/gateway/static/root/assets/projects-page-BoQUyacP.js +0 -1
  329. package/dist/gateway/static/root/assets/remote-access-hub-DUyUaCRF.js +0 -1
  330. package/dist/gateway/static/root/assets/sessions-page-Dzxlq1F0.js +0 -1
  331. package/dist/gateway/static/root/assets/settings-advanced-gate-TzwlZxU6.js +0 -1
  332. package/dist/gateway/static/root/assets/settings-page-DQmMKf8r.js +0 -1
  333. package/dist/gateway/static/root/assets/shares-settings-CkyuGlZK.js +0 -1
  334. package/dist/gateway/static/root/assets/skill-reload-api-BJCePQK5.js +0 -1
  335. package/dist/gateway/static/root/assets/skills-page-BYWLfmJi.js +0 -2
  336. package/dist/gateway/static/root/assets/skills-page.utils-Jhm24i4h.js +0 -1
  337. package/dist/gateway/static/root/assets/task-detail-page-DLAdxI6e.js +0 -1
  338. package/dist/gateway/static/root/assets/user-context-page-9AAFpGAL.js +0 -1
  339. package/dist/gateway/static/root/assets/voice-api-key-field-BISTPfq_.js +0 -1
  340. package/dist/gateway/static/root/assets/workflow-run-setup-panel-DHqHP8_6.js +0 -3
  341. package/dist/gateway/static/root/assets/workflows-page-0b4_DFHr.js +0 -11
  342. /package/dist/gateway/static/root/assets/{workflows-page-DLioOiRN.css → style-DLioOiRN.css} +0 -0
@@ -1,159 +1,86 @@
1
1
  import { createLogger } from "../../../utils/logger/index.js";
2
2
  import { init_logger } from "../../../utils/logger.js";
3
- import { ProviderHttpError } from "../../../media-shared/http/provider-http-errors.js";
4
- import { fetchWithTimeoutGuarded, postJsonRequest, waitProviderOperationPollInterval } from "../../../media-shared/http/provider-http.js";
3
+ import { postJsonRequest } from "../../../media-shared/http/provider-http.js";
5
4
  import "../../../media-shared/http/index.js";
6
5
  import { registerMediaUnderstandingProvider } from "../../../media-understanding/registry.js";
7
6
  //#region src/voice/stt/providers/alibaba-transcription.ts
8
- /**
9
- * Alibaba DashScope Paraformer STT — implements MediaUnderstandingProvider.transcribeAudio.
10
- *
11
- * DashScope's async API is a 4-step dance:
12
- * 1. POST /api/v1/services/audio/asr/transcription with `X-DashScope-Async: enable`
13
- * and `input.file_urls = [data:audio/ogg;base64,...]` → returns task_id
14
- * 2. Poll GET /api/v1/tasks/{task_id} until task_status === 'SUCCEEDED'
15
- * 3. The success result contains `transcription_url` pointing at a JSON document
16
- * 4. Fetch that JSON to extract the actual `transcripts[].text`
17
- *
18
- * All HTTP calls go through `fetchWithTimeoutGuarded` so the SSRF guard catches
19
- * malicious config injection. The transcription_url is a public OSS URL
20
- * (CDN-hosted); we keep `allowPrivateNetwork: false` so a malicious tenant
21
- * cannot redirect to an internal address.
22
- *
23
- * Polling caps at 60s by default (60 * 1s). The runner's `timeoutMs` controls
24
- * HTTP timeouts on each individual submit/poll/fetch call, not the overall
25
- * poll loop ceiling.
26
- */
27
7
  init_logger();
28
8
  const log = createLogger("STT:Alibaba");
29
- const DEFAULT_MODEL = "paraformer-v2";
30
- const DEFAULT_BASE_URL = "https://dashscope.aliyuncs.com/api/v1/services/audio/asr/transcription";
31
- const TASKS_BASE_URL = "https://dashscope.aliyuncs.com/api/v1/tasks";
32
- const POLL_INTERVAL_MS = 1e3;
33
- const MAX_POLL_MS = 6e4;
34
- async function submitTask(params) {
35
- const data = await (await postJsonRequest(params.baseUrl, {
36
- timeoutMs: params.timeoutMs,
37
- label: "Alibaba STT submit",
38
- headers: {
39
- Authorization: `Bearer ${params.apiKey}`,
40
- "X-DashScope-Async": "enable"
41
- },
42
- body: {
43
- model: params.model,
44
- input: { file_urls: [params.audioDataUrl] },
45
- ...params.language ? { parameters: { language_hint: params.language } } : {}
46
- },
47
- signal: params.signal
48
- })).json();
49
- if (data.code) throw new Error(`Alibaba STT API error: ${data.code} - ${data.message}`);
50
- if (!data.output?.task_id) {
51
- log.error({ response: data }, "Alibaba STT API response missing task_id");
52
- throw new Error(`No task_id returned from Alibaba STT API: ${JSON.stringify(data)}`);
53
- }
54
- log.debug({ taskId: data.output.task_id }, "Task submitted");
55
- return data.output.task_id;
56
- }
57
- async function pollTask(params) {
58
- const startTime = Date.now();
59
- const url = `${TASKS_BASE_URL}/${params.taskId}`;
60
- while (Date.now() - startTime < MAX_POLL_MS) {
61
- const response = await fetchWithTimeoutGuarded(url, {
62
- timeoutMs: params.timeoutMs,
63
- label: "Alibaba STT poll",
64
- signal: params.signal,
65
- init: {
66
- method: "GET",
67
- headers: { Authorization: `Bearer ${params.apiKey}` }
68
- }
69
- });
70
- if (!response.ok) {
71
- const errorText = await response.text().catch(() => "");
72
- throw new ProviderHttpError({
73
- label: "Alibaba STT poll",
74
- status: response.status,
75
- detail: errorText.slice(0, 220) || response.statusText
76
- });
77
- }
78
- const data = await response.json();
79
- const status = data.output?.task_status;
80
- if (status === "SUCCEEDED") {
81
- const result = data.output?.results?.[0];
82
- if (!result) throw new Error("Alibaba STT task succeeded but no results found");
83
- return { text: (await fetchTranscription(result.transcription_url, params.timeoutMs, params.signal)).transcripts.map((t) => t.text).join("\n") };
84
- }
85
- if (status === "FAILED") throw new Error("Alibaba STT task failed");
86
- await waitProviderOperationPollInterval(POLL_INTERVAL_MS, params.signal);
87
- }
88
- throw new Error(`Alibaba STT task did not complete within ${MAX_POLL_MS}ms`);
9
+ const DEFAULT_MODEL = "qwen-audio-3.0-asr-flash";
10
+ const DEFAULT_BASE_URL = "https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation";
11
+ function audioFormat(request) {
12
+ const extension = request.fileName.split(".").pop()?.toLowerCase();
13
+ if (extension === "mpeg" || extension === "mpga") return "mp3";
14
+ if (extension === "m4a") return "mp4";
15
+ return extension || "wav";
89
16
  }
90
- async function fetchTranscription(url, timeoutMs, signal) {
91
- const response = await fetchWithTimeoutGuarded(url, {
92
- timeoutMs,
93
- label: "Alibaba STT transcription fetch",
94
- signal
17
+ async function transcribeAudio(request) {
18
+ if (!request.apiKey) throw new Error("Alibaba STT API key is unavailable");
19
+ const startedAt = Date.now();
20
+ const model = request.model ?? DEFAULT_MODEL;
21
+ const audio = `data:${request.mime ?? "application/octet-stream"};base64,${request.buffer.toString("base64")}`;
22
+ const messages = [];
23
+ if (request.prompt) messages.push({
24
+ role: "user",
25
+ content: [{
26
+ type: "input_text",
27
+ text: request.prompt
28
+ }]
95
29
  });
96
- if (!response.ok) throw new ProviderHttpError({
97
- label: "Alibaba STT transcription fetch",
98
- status: response.status,
99
- detail: response.statusText
30
+ messages.push({
31
+ role: "user",
32
+ content: [{
33
+ type: "input_audio",
34
+ input_audio: { data: audio }
35
+ }]
100
36
  });
101
- return await response.json();
102
- }
103
- async function transcribeAudio(req) {
104
- const startTime = Date.now();
105
- const model = req.model ?? DEFAULT_MODEL;
106
- const baseUrl = req.baseUrl ?? DEFAULT_BASE_URL;
107
- const base64Audio = req.buffer.toString("base64");
108
- const audioDataUrl = `data:${req.mime ?? "audio/ogg"};base64,${base64Audio}`;
109
- log.debug({
110
- model,
111
- bufferSize: req.buffer.length,
112
- language: req.language,
113
- fileName: req.fileName
114
- }, "Sending to Alibaba Paraformer");
115
37
  try {
116
- const taskId = await submitTask({
117
- apiKey: req.apiKey,
118
- baseUrl,
119
- model,
120
- audioDataUrl,
121
- ...req.language ? { language: req.language } : {},
122
- timeoutMs: req.timeoutMs,
123
- signal: req.signal
124
- });
125
- const result = await pollTask({
126
- apiKey: req.apiKey,
127
- taskId,
128
- timeoutMs: req.timeoutMs,
129
- signal: req.signal
130
- });
131
- const durationSeconds = (Date.now() - startTime) / 1e3;
38
+ const data = await (await postJsonRequest(request.baseUrl ?? DEFAULT_BASE_URL, {
39
+ timeoutMs: request.timeoutMs,
40
+ label: "Alibaba STT",
41
+ headers: {
42
+ Authorization: `Bearer ${request.apiKey}`,
43
+ "X-DashScope-SSE": "disable"
44
+ },
45
+ body: {
46
+ model,
47
+ input: { messages },
48
+ parameters: {
49
+ format: audioFormat(request),
50
+ ...request.language && request.language !== "auto" ? { language_hints: [request.language] } : {}
51
+ }
52
+ },
53
+ signal: request.signal
54
+ })).json();
55
+ const text = data.output?.text;
56
+ if (typeof text !== "string") throw new Error("Alibaba STT returned an invalid response");
132
57
  log.info({
133
58
  provider: "alibaba",
134
- durationSeconds,
135
- textLength: result.text.length
59
+ model,
60
+ latencyMs: Date.now() - startedAt,
61
+ textLength: text.length
136
62
  }, "Transcription completed");
63
+ const durationSeconds = Number(data.usage?.duration);
137
64
  return {
138
- text: result.text,
65
+ text,
139
66
  model,
140
- ...req.language ? { language: req.language } : {},
141
- durationSeconds
67
+ ...request.language ? { language: request.language } : {},
68
+ ...Number.isFinite(durationSeconds) && durationSeconds >= 0 ? { durationSeconds } : {}
142
69
  };
143
70
  } catch (error) {
144
- if (req.signal?.aborted) throw error;
145
- const errorMsg = error instanceof Error ? error.message : String(error);
71
+ if (request.signal?.aborted) throw error;
72
+ const message = error instanceof Error ? error.message : String(error);
146
73
  log.error({
147
74
  err: error,
148
- bufferSize: req.buffer.length,
149
- model
150
- }, `Alibaba transcription failed: ${errorMsg}`);
151
- throw new Error(`Alibaba STT failed: ${errorMsg}`);
75
+ model,
76
+ bufferSize: request.buffer.length
77
+ }, `Alibaba transcription failed: ${message}`);
78
+ throw new Error(`Alibaba STT failed: ${message}`);
152
79
  }
153
80
  }
154
81
  const alibabaTranscriptionProvider = {
155
82
  id: "alibaba",
156
- aliases: ["dashscope", "paraformer"],
83
+ aliases: ["dashscope"],
157
84
  capabilities: ["audio"],
158
85
  envKey: "DASHSCOPE_API_KEY",
159
86
  defaultModels: { audio: DEFAULT_MODEL },
@@ -13,3 +13,4 @@
13
13
  export { openAiTranscriptionProvider } from './openai-transcription.js';
14
14
  export { alibabaTranscriptionProvider } from './alibaba-transcription.js';
15
15
  export { localTranscriptionProvider } from './local-transcription.js';
16
+ export { xopcCloudTranscriptionProvider } from './xopc-cloud-transcription.js';
@@ -1,4 +1,5 @@
1
1
  import { openAiTranscriptionProvider } from "./openai-transcription.js";
2
2
  import { alibabaTranscriptionProvider } from "./alibaba-transcription.js";
3
3
  import { localTranscriptionProvider } from "./local-transcription.js";
4
- export { alibabaTranscriptionProvider, localTranscriptionProvider, openAiTranscriptionProvider };
4
+ import { xopcCloudTranscriptionProvider } from "./xopc-cloud-transcription.js";
5
+ export { alibabaTranscriptionProvider, localTranscriptionProvider, openAiTranscriptionProvider, xopcCloudTranscriptionProvider };
@@ -1,5 +1,5 @@
1
1
  /**
2
- * OpenAI Whisper STT — implements MediaUnderstandingProvider.transcribeAudio.
2
+ * OpenAI transcription provider — implements MediaUnderstandingProvider.transcribeAudio.
3
3
  *
4
4
  * Uses the official `openai` SDK rather than the raw HTTP path because the SDK
5
5
  * already handles multipart/form-data encoding (`file` field), streaming
@@ -8,7 +8,7 @@
8
8
  * keep parity with the SDK's own fetch (proxy support, retries, etc.); the
9
9
  * only egress is api.openai.com which is HTTPS-only and public.
10
10
  *
11
- * Streaming transcription is not implemented (Whisper returns a final text
11
+ * Streaming transcription is not implemented (the API returns a final text
12
12
  * blob). Self-registers with `capabilities: ['audio']` only — the registry's
13
13
  * `listProvidersForCapability` filter skips this provider for image/video.
14
14
  */
@@ -4,7 +4,7 @@ import { registerMediaUnderstandingProvider } from "../../../media-understanding
4
4
  import OpenAI from "openai";
5
5
  //#region src/voice/stt/providers/openai-transcription.ts
6
6
  /**
7
- * OpenAI Whisper STT — implements MediaUnderstandingProvider.transcribeAudio.
7
+ * OpenAI transcription provider — implements MediaUnderstandingProvider.transcribeAudio.
8
8
  *
9
9
  * Uses the official `openai` SDK rather than the raw HTTP path because the SDK
10
10
  * already handles multipart/form-data encoding (`file` field), streaming
@@ -13,13 +13,13 @@ import OpenAI from "openai";
13
13
  * keep parity with the SDK's own fetch (proxy support, retries, etc.); the
14
14
  * only egress is api.openai.com which is HTTPS-only and public.
15
15
  *
16
- * Streaming transcription is not implemented (Whisper returns a final text
16
+ * Streaming transcription is not implemented (the API returns a final text
17
17
  * blob). Self-registers with `capabilities: ['audio']` only — the registry's
18
18
  * `listProvidersForCapability` filter skips this provider for image/video.
19
19
  */
20
20
  init_logger();
21
21
  const log = createLogger("STT:OpenAI");
22
- const DEFAULT_MODEL = "whisper-1";
22
+ const DEFAULT_MODEL = "gpt-4o-mini-transcribe";
23
23
  async function transcribeAudio(req) {
24
24
  const startTime = Date.now();
25
25
  const model = req.model ?? DEFAULT_MODEL;
@@ -36,7 +36,7 @@ async function transcribeAudio(req) {
36
36
  bufferSize: req.buffer.length,
37
37
  language: req.language,
38
38
  fileName: req.fileName
39
- }, "Sending to OpenAI Whisper");
39
+ }, "Sending to OpenAI transcription");
40
40
  try {
41
41
  const result = await client.audio.transcriptions.create({
42
42
  file,
@@ -0,0 +1,2 @@
1
+ import type { MediaUnderstandingProvider } from '../../../media-understanding/types.js';
2
+ export declare const xopcCloudTranscriptionProvider: MediaUnderstandingProvider;
@@ -0,0 +1,49 @@
1
+ import { getModelCatalogStore, init_model_catalog_store } from "../../../providers/model-catalog-store.js";
2
+ import { init_xopc_cloud_config, resolveXopcModelRouterUrl } from "../../../providers/xopc-cloud-config.js";
3
+ import { getProviderAuthService, init_provider_auth_service } from "../../../providers/provider-auth-service.js";
4
+ import { registerMediaUnderstandingProvider } from "../../../media-understanding/registry.js";
5
+ //#region src/voice/stt/providers/xopc-cloud-transcription.ts
6
+ init_model_catalog_store();
7
+ init_provider_auth_service();
8
+ init_xopc_cloud_config();
9
+ function defaultModel() {
10
+ return getModelCatalogStore().getSource("xopc-cloud")?.models.find((model) => model.availability === "available" && model.kind === "stt")?.id;
11
+ }
12
+ const xopcCloudTranscriptionProvider = {
13
+ id: "xopc-cloud",
14
+ capabilities: ["audio"],
15
+ requiresApiKey: false,
16
+ autoPriority: { audio: 5 },
17
+ isConfigured: () => Boolean(defaultModel()),
18
+ transcribeAudio: async (request) => {
19
+ const model = request.model ?? defaultModel();
20
+ if (!model) throw new Error("No XOPC Cloud speech-to-text model is available");
21
+ const accessToken = await getProviderAuthService().resolveApiKey("xopc-cloud", request.signal);
22
+ if (!accessToken) throw new Error("XOPC Cloud authorization is unavailable");
23
+ const source = getModelCatalogStore().getSource("xopc-cloud");
24
+ const baseUrl = (request.baseUrl ?? source?.baseUrl ?? resolveXopcModelRouterUrl()).replace(/\/+$/, "");
25
+ const form = new FormData();
26
+ form.append("model", model);
27
+ form.append("file", new File([Uint8Array.from(request.buffer)], request.fileName, { type: request.mime ?? "application/octet-stream" }));
28
+ if (request.language) form.append("language", request.language);
29
+ if (request.prompt) form.append("prompt", request.prompt);
30
+ const response = await fetch(`${baseUrl}/audio/transcriptions`, {
31
+ method: "POST",
32
+ headers: { authorization: `Bearer ${accessToken}` },
33
+ body: form,
34
+ signal: request.signal ?? AbortSignal.timeout(request.timeoutMs),
35
+ redirect: "error"
36
+ });
37
+ const body = await response.json().catch(() => null);
38
+ if (!response.ok) throw new Error(typeof body?.error?.message === "string" ? body.error.message : `XOPC Cloud STT failed (${response.status})`);
39
+ if (typeof body?.text !== "string") throw new Error("XOPC Cloud STT returned an invalid response");
40
+ return {
41
+ text: body.text,
42
+ model,
43
+ ...request.language ? { language: request.language } : {}
44
+ };
45
+ }
46
+ };
47
+ registerMediaUnderstandingProvider(xopcCloudTranscriptionProvider);
48
+ //#endregion
49
+ export { xopcCloudTranscriptionProvider };
@@ -4,8 +4,8 @@ const DEFAULT_STT_CONFIG = {
4
4
  provider: "xopc-local",
5
5
  providers: {
6
6
  "xopc-local": { model: "sensevoice-small" },
7
- alibaba: { model: "paraformer-v2" },
8
- openai: { model: "whisper-1" }
7
+ alibaba: { model: "qwen-audio-3.0-asr-flash" },
8
+ openai: { model: "gpt-4o-mini-transcribe" }
9
9
  },
10
10
  fallback: {
11
11
  enabled: false,
@@ -14,4 +14,5 @@
14
14
  export { openAiSpeechProvider, OPENAI_TTS_MODELS, OPENAI_TTS_VOICES } from './openai-speech.js';
15
15
  export { alibabaSpeechProvider } from './alibaba-speech.js';
16
16
  export { edgeSpeechProvider } from './edge-speech.js';
17
+ export { xopcCloudSpeechProvider } from './xopc-cloud-speech.js';
17
18
  export { minimaxSpeechProvider, MINIMAX_TTS_MODELS, MINIMAX_TTS_VOICES, } from './minimax-speech.js';
@@ -1,5 +1,6 @@
1
1
  import { OPENAI_TTS_MODELS, OPENAI_TTS_VOICES, openAiSpeechProvider } from "./openai-speech.js";
2
2
  import { alibabaSpeechProvider } from "./alibaba-speech.js";
3
3
  import { edgeSpeechProvider } from "./edge-speech.js";
4
+ import { xopcCloudSpeechProvider } from "./xopc-cloud-speech.js";
4
5
  import { MINIMAX_TTS_MODELS, MINIMAX_TTS_VOICES, minimaxSpeechProvider } from "./minimax-speech.js";
5
- export { MINIMAX_TTS_MODELS, MINIMAX_TTS_VOICES, OPENAI_TTS_MODELS, OPENAI_TTS_VOICES, alibabaSpeechProvider, edgeSpeechProvider, minimaxSpeechProvider, openAiSpeechProvider };
6
+ export { MINIMAX_TTS_MODELS, MINIMAX_TTS_VOICES, OPENAI_TTS_MODELS, OPENAI_TTS_VOICES, alibabaSpeechProvider, edgeSpeechProvider, minimaxSpeechProvider, openAiSpeechProvider, xopcCloudSpeechProvider };
@@ -0,0 +1,2 @@
1
+ import type { SpeechProviderPlugin } from '../speech-provider-types.js';
2
+ export declare const xopcCloudSpeechProvider: SpeechProviderPlugin;
@@ -0,0 +1,113 @@
1
+ import { getModelCatalogStore, init_model_catalog_store } from "../../../providers/model-catalog-store.js";
2
+ import { init_xopc_cloud_config, resolveXopcModelRouterUrl } from "../../../providers/xopc-cloud-config.js";
3
+ import { getProviderAuthService, init_provider_auth_service } from "../../../providers/provider-auth-service.js";
4
+ import { registerSpeechProvider } from "../speech-registry.js";
5
+ //#region src/voice/tts/providers/xopc-cloud-speech.ts
6
+ init_model_catalog_store();
7
+ init_provider_auth_service();
8
+ init_xopc_cloud_config();
9
+ function availableModels() {
10
+ return getModelCatalogStore().getSource("xopc-cloud")?.models.filter((model) => model.availability === "available" && model.kind === "tts") ?? [];
11
+ }
12
+ function readConfig(config) {
13
+ return config;
14
+ }
15
+ function readSpeed(value) {
16
+ if (value === void 0 || value === null || value === "") return void 0;
17
+ if (typeof value !== "number" || !Number.isFinite(value) || value < .25 || value > 4) throw new Error("XOPC Cloud TTS speed must be between 0.25 and 4");
18
+ return value;
19
+ }
20
+ function extension(contentType, fallback) {
21
+ return {
22
+ "audio/mpeg": "mp3",
23
+ "audio/opus": "opus",
24
+ "audio/ogg": "ogg",
25
+ "audio/wav": "wav",
26
+ "audio/flac": "flac",
27
+ "audio/aac": "aac",
28
+ "audio/pcm": "pcm"
29
+ }[contentType?.split(";")[0] ?? ""] ?? fallback;
30
+ }
31
+ const xopcCloudSpeechProvider = {
32
+ id: "xopc-cloud",
33
+ autoSelectOrder: 5,
34
+ resolveConfig: ({ rawConfig }) => {
35
+ const raw = rawConfig["xopc-cloud"];
36
+ const slice = raw && typeof raw === "object" && !Array.isArray(raw) ? raw : {};
37
+ const model = typeof slice.model === "string" ? slice.model : availableModels()[0]?.id;
38
+ const catalogModel = availableModels().find((entry) => entry.id === model);
39
+ return {
40
+ model,
41
+ voice: typeof slice.voice === "string" ? slice.voice : catalogModel?.tts?.defaultVoice,
42
+ speed: readSpeed(slice.speed),
43
+ instructions: typeof slice.instructions === "string" && slice.instructions.trim() ? slice.instructions.trim() : void 0,
44
+ baseUrl: typeof slice.baseUrl === "string" ? slice.baseUrl : getModelCatalogStore().getSource("xopc-cloud")?.baseUrl ?? resolveXopcModelRouterUrl()
45
+ };
46
+ },
47
+ isConfigured: ({ providerConfig }) => {
48
+ const config = readConfig(providerConfig);
49
+ return Boolean(config.model && config.voice && availableModels().some((model) => model.id === config.model));
50
+ },
51
+ listVoices: async ({ providerConfig }) => {
52
+ const config = readConfig(providerConfig ?? {});
53
+ if (!config.model) return [];
54
+ const token = await getProviderAuthService().resolveApiKey("xopc-cloud");
55
+ if (!token) return [];
56
+ const response = await fetch(`${config.baseUrl.replace(/\/+$/, "")}/audio/voices?model=${encodeURIComponent(config.model)}`, {
57
+ headers: { authorization: `Bearer ${token}` },
58
+ signal: AbortSignal.timeout(3e4),
59
+ redirect: "error"
60
+ });
61
+ if (!response.ok) return [];
62
+ return ((await response.json().catch(() => null))?.data ?? []).filter((voice) => typeof voice.id === "string").map((voice) => ({
63
+ id: voice.id,
64
+ ...typeof voice.name === "string" ? { name: voice.name } : {}
65
+ }));
66
+ },
67
+ synthesize: async (request) => {
68
+ const config = readConfig(request.providerConfig);
69
+ const model = typeof request.providerOverrides?.model === "string" ? request.providerOverrides.model : config.model;
70
+ const voice = typeof request.providerOverrides?.voice === "string" ? request.providerOverrides.voice : config.voice;
71
+ if (!model || !voice) throw new Error("XOPC Cloud TTS model or voice is unavailable");
72
+ const catalogModel = availableModels().find((entry) => entry.id === model);
73
+ if (!catalogModel) throw new Error(`XOPC Cloud TTS model is unavailable: ${model}`);
74
+ const speed = readSpeed(request.providerOverrides?.speed ?? config.speed);
75
+ const instructions = typeof request.providerOverrides?.instructions === "string" ? request.providerOverrides.instructions.trim() : config.instructions;
76
+ const outputFormat = request.target === "voice-note" && catalogModel.tts?.outputFormats.includes("opus") ? "opus" : catalogModel.tts?.outputFormats.includes("mp3") ? "mp3" : catalogModel.tts?.outputFormats[0] ?? "wav";
77
+ const token = await getProviderAuthService().resolveApiKey("xopc-cloud");
78
+ if (!token) throw new Error("XOPC Cloud authorization is unavailable");
79
+ const response = await fetch(`${config.baseUrl.replace(/\/+$/, "")}/audio/speech`, {
80
+ method: "POST",
81
+ headers: {
82
+ authorization: `Bearer ${token}`,
83
+ "content-type": "application/json"
84
+ },
85
+ body: JSON.stringify({
86
+ model,
87
+ input: request.text,
88
+ voice,
89
+ response_format: outputFormat,
90
+ ...speed !== void 0 && catalogModel.tts?.speed ? { speed } : {},
91
+ ...instructions && catalogModel.tts?.instructions ? { instructions } : {}
92
+ }),
93
+ signal: AbortSignal.timeout(request.timeoutMs),
94
+ redirect: "error"
95
+ });
96
+ if (!response.ok) {
97
+ const body = await response.json().catch(() => null);
98
+ throw new Error(typeof body?.error?.message === "string" ? body.error.message : `XOPC Cloud TTS failed (${response.status})`);
99
+ }
100
+ const audioBuffer = Buffer.from(await response.arrayBuffer());
101
+ if (audioBuffer.length === 0) throw new Error("XOPC Cloud TTS returned empty audio");
102
+ const fileExtension = extension(response.headers.get("content-type"), outputFormat);
103
+ return {
104
+ audioBuffer,
105
+ outputFormat: fileExtension,
106
+ fileExtension,
107
+ voiceCompatible: fileExtension === "opus" || fileExtension === "ogg"
108
+ };
109
+ }
110
+ };
111
+ registerSpeechProvider(xopcCloudSpeechProvider);
112
+ //#endregion
113
+ export { xopcCloudSpeechProvider };
@@ -57,7 +57,7 @@ export interface TTSModelOverrideConfig {
57
57
  export interface TTSConfig {
58
58
  enabled: boolean;
59
59
  provider: TTSProvider;
60
- /** Trigger mode: auto = reply with voice when user sends voice */
60
+ /** Trigger mode for automatic voice replies. */
61
61
  trigger: TTSAutoMode;
62
62
  /** Fallback configuration */
63
63
  fallback?: {
@@ -76,7 +76,7 @@ function validateSuggestion(value, allowedPaths) {
76
76
  verification: strings(item.verification, 4).map((entry) => entry.slice(0, 300))
77
77
  };
78
78
  }
79
- function validateProfileCandidate(value) {
79
+ function validateProfileCandidate(value, allowedRefs) {
80
80
  if (!value || typeof value !== "object") return null;
81
81
  const item = value;
82
82
  const category = item.category === "role" || item.category === "focus" || item.category === "technology" || item.category === "workflow" || item.category === "preference" ? item.category : void 0;
@@ -84,12 +84,15 @@ function validateProfileCandidate(value) {
84
84
  const statement = item.statement.trim().slice(0, 500);
85
85
  if (statement.length < 4) return null;
86
86
  const confidence = item.confidence === "high" || item.confidence === "low" ? item.confidence : "medium";
87
+ const evidenceRefs = allowedRefs ? strings(item.evidenceRefs, 12).filter((ref) => allowedRefs.has(ref)) : void 0;
88
+ if (allowedRefs && !evidenceRefs?.length) return null;
87
89
  return {
88
90
  id: randomUUID(),
89
91
  category,
90
92
  statement,
91
93
  confidence,
92
94
  evidence: strings(item.evidence, 4).map((entry) => entry.slice(0, 300)),
95
+ ...evidenceRefs?.length ? { evidenceRefs } : {},
93
96
  status: "pending"
94
97
  };
95
98
  }
@@ -216,7 +219,7 @@ async function analyzeWorkContext(input) {
216
219
  result: lowConfidenceResult(input.snapshot)
217
220
  };
218
221
  const primarySuggestion = [...suggestions].sort((a, b) => suggestionScore(b) - suggestionScore(a))[0];
219
- const profileCandidates = input.candidateContext?.length && Array.isArray(parsed.profileCandidates) ? parsed.profileCandidates.map(validateProfileCandidate).filter((value) => Boolean(value)).slice(0, 6) : [];
222
+ const profileCandidates = input.candidateContext?.length && Array.isArray(parsed.profileCandidates) ? parsed.profileCandidates.map((value) => validateProfileCandidate(value)).filter((value) => Boolean(value)).slice(0, 6) : [];
220
223
  const workThreadCandidates = Array.isArray(parsed.workThreads) ? parsed.workThreads.map((value) => validateWorkThreadCandidate(value, allowedThreadRefs)).filter((value) => Boolean(value)).slice(0, 3) : [];
221
224
  const projectSummary = typeof parsed.projectSummary === "string" ? parsed.projectSummary.trim() : "";
222
225
  const currentState = typeof parsed.currentState === "string" ? parsed.currentState.trim() : "";
@@ -254,6 +257,7 @@ async function analyzeUnderstandingSources(input) {
254
257
  endsAt: item.endsAt,
255
258
  ownerAttribution: item.ownerAttribution,
256
259
  sensitivity: item.sensitivity,
260
+ resourceUri: item.resourceUri,
257
261
  text
258
262
  }];
259
263
  });
@@ -266,7 +270,8 @@ async function analyzeUnderstandingSources(input) {
266
270
  "Analyze bounded context from sources the user explicitly chose to connect.",
267
271
  "Return only one JSON object with profileCandidates and workThreads.",
268
272
  "profileCandidates contains at most 6 stable, useful work-related facts.",
269
- "Each item has category (role, focus, technology, workflow, or preference), statement, confidence, and evidence.",
273
+ "Each item has category (role, focus, technology, workflow, or preference), statement, confidence, evidence, and evidenceRefs.",
274
+ "profileCandidates evidenceRefs must contain only supplied refs. Do not create a candidate without direct support.",
270
275
  "workThreads contains at most 3 evidence-backed current, ongoing, or long-term work streams.",
271
276
  "Each work thread has topicKey, title, summary, status, horizon, confidence, and evidenceRefs.",
272
277
  "evidenceRefs must contain only supplied refs. Do not create a thread without direct support.",
@@ -294,7 +299,7 @@ async function analyzeUnderstandingSources(input) {
294
299
  const raw = extractText(response.content);
295
300
  const parsed = parseJson(raw);
296
301
  if (!parsed) throw invalidJsonError("Understanding source analysis", response, raw);
297
- const profileCandidates = Array.isArray(parsed.profileCandidates) ? parsed.profileCandidates.map(validateProfileCandidate).filter((value) => Boolean(value)).slice(0, 6) : [];
302
+ const profileCandidates = Array.isArray(parsed.profileCandidates) ? parsed.profileCandidates.map((value) => validateProfileCandidate(value, allowedRefs)).filter((value) => Boolean(value)).slice(0, 6) : [];
298
303
  const allowedRefs = new Set(items.map((item) => item.ref));
299
304
  return {
300
305
  modelRef,
@@ -14,4 +14,5 @@ export interface DiscoverWorkCandidatesOptions {
14
14
  platform?: NodeJS.Platform;
15
15
  environment?: NodeJS.ProcessEnv;
16
16
  }
17
+ export declare function resolvePersonalWorkRoots(homeDirectory: string, platform: NodeJS.Platform, environment: NodeJS.ProcessEnv): Promise<string[]>;
17
18
  export declare function discoverWorkCandidates(options?: DiscoverWorkCandidatesOptions): Promise<WorkDiscoveryCandidate[]>;
@@ -187,7 +187,7 @@ function resolveXdgPath(value, homeDirectory) {
187
187
  const expanded = value.trim().replace(/^"|"$/g, "").replace(/^\$HOME(?=\/|$)|^\$\{HOME\}(?=\/|$)/, homeDirectory);
188
188
  return isAbsolute(expanded) ? resolve(expanded) : null;
189
189
  }
190
- async function personalWorkRoots(homeDirectory, platform, environment) {
190
+ async function resolvePersonalWorkRoots(homeDirectory, platform, environment) {
191
191
  const roots = PERSONAL_WORK_ROOT_NAMES.map((name) => join(homeDirectory, name));
192
192
  if (platform === "win32") for (const oneDrive of [
193
193
  environment.OneDrive,
@@ -253,7 +253,7 @@ async function discoverWorkCandidates(options = {}) {
253
253
  rootPath: source.rootPath,
254
254
  source: "approved_directory"
255
255
  }));
256
- const [commonInputs, personalInputs] = await Promise.all([commonRootInputs(homeDirectory, options.signal), personalWorkRoots(homeDirectory, options.platform ?? process.platform, options.environment ?? process.env).then((roots) => personalRootInputs(roots, nowMs, options.signal))]);
256
+ const [commonInputs, personalInputs] = await Promise.all([commonRootInputs(homeDirectory, options.signal), resolvePersonalWorkRoots(homeDirectory, options.platform ?? process.platform, options.environment ?? process.env).then((roots) => personalRootInputs(roots, nowMs, options.signal))]);
257
257
  const uniqueInputs = /* @__PURE__ */ new Map();
258
258
  for (const input of [
259
259
  ...existingInputs,
@@ -276,4 +276,4 @@ async function discoverWorkCandidates(options = {}) {
276
276
  return [...canonicalCandidates.values()].sort((a, b) => b.score - a.score || (b.lastActiveAt ?? 0) - (a.lastActiveAt ?? 0) || a.rootPath.localeCompare(b.rootPath)).slice(0, 8);
277
277
  }
278
278
  //#endregion
279
- export { discoverWorkCandidates };
279
+ export { discoverWorkCandidates, resolvePersonalWorkRoots };
@@ -1,6 +1,6 @@
1
1
  import { WORK_DISCOVERY_SCAN_POLICY_VERSION, canonicalWorkDiscoveryRoot, previewWorkDiscoveryRoot, probeWorkDiscoveryRoot, readWorkDiscoveryTextExcerpt, searchWorkDiscoveryText, summarizeWorkContextSnapshot } from "./probe.js";
2
2
  import { analyzeUnderstandingSources, analyzeWorkContext, workDiscoveryResultMarkdown } from "./analyzer.js";
3
- import { discoverWorkCandidates } from "./candidate-discovery.js";
3
+ import { discoverWorkCandidates, resolvePersonalWorkRoots } from "./candidate-discovery.js";
4
4
  import { workDiscoveryFingerprintsEqual } from "./incremental.js";
5
5
  import { createWorkDiscoveryRun, getWorkDiscoveryOnboardingState, getWorkDiscoveryRun, getWorkDiscoveryRunByIdempotencyKey, setWorkDiscoveryFeedback, setWorkDiscoveryOnboardingState, updateWorkDiscoveryRun } from "./repository.js";
6
6
  import { findActiveWorkDiscoverySourceRefresh, listWorkDiscoverySourceRefreshes, recordWorkDiscoverySourceRefresh, updateWorkDiscoverySourceRefreshForRun } from "./incremental-repository.js";
@@ -10,4 +10,4 @@ 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
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, revokeWorkDiscoveryDirectorySource, searchWorkDiscoveryText, setWorkDiscoveryFeedback, setWorkDiscoveryOnboardingState, summarizeWorkContextSnapshot, updateWorkDiscoveryRun, updateWorkDiscoverySourceRefreshForRun, updateWorkUnderstandingEvidenceObservation, updateWorkUnderstandingInvestigation, upsertWorkDiscoveryDirectorySource, workDiscoveryFingerprintsEqual, workDiscoveryResultMarkdown };
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 };
@@ -46,7 +46,7 @@ export declare class WorkDiscoveryService {
46
46
  reused?: undefined;
47
47
  }>;
48
48
  revokeDirectorySource(id: string): import("./types.js").WorkDiscoveryDirectorySource;
49
- importUnderstandingSources(rawItems: unknown[], signal?: AbortSignal, runId?: string): Promise<{
49
+ importUnderstandingSources(rawItems: unknown[], signal?: AbortSignal, runId?: string, rawCheckpoints?: Record<string, unknown>): Promise<{
50
50
  profileCandidates: {
51
51
  status: "rejected" | "pending";
52
52
  understandingId: string;
@@ -55,6 +55,7 @@ export declare class WorkDiscoveryService {
55
55
  statement: string;
56
56
  confidence: "high" | "medium" | "low";
57
57
  evidence: string[];
58
+ evidenceRefs?: string[];
58
59
  }[];
59
60
  workThreads: import("./types.js").WorkUnderstandingThread[];
60
61
  focuses: import("../user-context/sources/types.js").UserFocus[];