@xopcai/xopc 0.0.389 → 0.0.390

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 (302) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/src/plugin.js +1 -1
  3. package/dist/extensions/telegram/xopc.extension.json +1 -1
  4. package/dist/gateway/static/root/assets/{activity-store-dvik6t7Z.js → activity-store-DGMAYkw8.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-bWMd5TDC.js → agent-avatar-dicebear-B4AsZzJR.js} +1 -1
  6. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-9NUY1sO3.js +1 -0
  7. package/dist/gateway/static/root/assets/agent-plugin-dialog-CNc6ntzP.js +1 -0
  8. package/dist/gateway/static/root/assets/agents-QNY9Vkrf.js +77 -0
  9. package/dist/gateway/static/root/assets/{agents-admin-api-BlNGyXpm.js → agents-admin-api-DxdaiFWn.js} +1 -1
  10. package/dist/gateway/static/root/assets/app-management-settings-panel-DHRfLkYD.js +1 -0
  11. package/dist/gateway/static/root/assets/{appearance-settings-CUAdx44v.js → appearance-settings-DtKSapgb.js} +1 -1
  12. package/dist/gateway/static/root/assets/{apps-page-D5zDB6gp.js → apps-page-B9kuRt_z.js} +1 -1
  13. package/dist/gateway/static/root/assets/{archive-plugin-Du6dJNcl.js → archive-plugin-AgySTXp_.js} +1 -1
  14. package/dist/gateway/static/root/assets/{automations-page-BO8Ig5Z4.js → automations-page-D1o7ZtUW.js} +1 -1
  15. package/dist/gateway/static/root/assets/automations-workspace-BJenz0P1.js +6 -0
  16. package/dist/gateway/static/root/assets/{binary-plugins-D7VJjwnr.js → binary-plugins-A1AXOsO6.js} +1 -1
  17. package/dist/gateway/static/root/assets/{block-editor-CaJlWTAn.js → block-editor-DUNLkLKF.js} +3 -3
  18. package/dist/gateway/static/root/assets/{browser-automation-inputs-iyMBJmQX.js → browser-automation-inputs-BvUC6OiW.js} +1 -1
  19. package/dist/gateway/static/root/assets/browser-automations-page-Dq2LlVMh.js +3 -0
  20. package/dist/gateway/static/root/assets/browser-settings-page-BOZ-1g51.js +3 -0
  21. package/dist/gateway/static/root/assets/{capabilities-MCKRMZDK.js → capabilities-BkCutK0V.js} +1 -1
  22. package/dist/gateway/static/root/assets/{capabilities-CEH1AnXc.js → capabilities-D61uSJPy.js} +1 -1
  23. package/dist/gateway/static/root/assets/capabilities-page-BDP6gzlv.js +2 -0
  24. package/dist/gateway/static/root/assets/capabilities-settings-panel-D6PL3Mfl.js +8 -0
  25. package/dist/gateway/static/root/assets/{capability-header-actions-BIA0Lwt5.js → capability-header-actions-D9uGs4Pw.js} +1 -1
  26. package/dist/gateway/static/root/assets/channels-xb7n8rwF.js +1 -0
  27. package/dist/gateway/static/root/assets/chat-terminal-dock-Dgn09YDs.js +36 -0
  28. package/dist/gateway/static/root/assets/{computer-settings-page-DvY3zgyY.js → computer-settings-page-C66P4ifT.js} +1 -1
  29. package/dist/gateway/static/root/assets/{connector-service-page-St2-Fj3y.js → connector-service-page-Dp35XdYf.js} +1 -1
  30. package/dist/gateway/static/root/assets/connectors-page-BHcRxYib.js +1 -0
  31. package/dist/gateway/static/root/assets/{date-picker-C0-D80ny.js → date-picker-CddHY982.js} +1 -1
  32. package/dist/gateway/static/root/assets/{dependency-picker-CNd7mwMU.js → dependency-picker-Ob6BZTqv.js} +1 -1
  33. package/dist/gateway/static/root/assets/{desktop-pet-C-2wDANn.js → desktop-pet-dmwCV-I4.js} +1 -1
  34. package/dist/gateway/static/root/assets/{desktop-pet-settings-DyhxLrdJ.js → desktop-pet-settings-B-TBkZAZ.js} +1 -1
  35. package/dist/gateway/static/root/assets/device-pairing-wizard-SWHwRgG3.js +1 -0
  36. package/dist/gateway/static/root/assets/{directory-picker-path-field-CNivVIPT.js → directory-picker-path-field-6VZa4fT1.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-debug-page-CGYO3JPw.js → extension-debug-page-C0_njMva.js} +1 -1
  38. package/dist/gateway/static/root/assets/{extension-page-Dc51ALAg.js → extension-page-BeBLMFmW.js} +1 -1
  39. package/dist/gateway/static/root/assets/{extension-provider-BXPILdlw.js → extension-provider-DWI0KAKT.js} +1 -1
  40. package/dist/gateway/static/root/assets/extension-settings-page-BiLUwoKx.js +1 -0
  41. package/dist/gateway/static/root/assets/{gateway-config-swr-Bc2MytsF.js → gateway-config-swr-CmYcOqhb.js} +1 -1
  42. package/dist/gateway/static/root/assets/{gateway-realtime-BFK-vlME.js → gateway-realtime-Ci1Jst5g.js} +1 -1
  43. package/dist/gateway/static/root/assets/gateway-realtime-store-BMUiUQMk.js +1 -0
  44. package/dist/gateway/static/root/assets/gateway-settings-CzWT_v09.js +1 -0
  45. package/dist/gateway/static/root/assets/{gateway-startup-retry-BDPMttPx.js → gateway-startup-retry-C-BG5M7H.js} +1 -1
  46. package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-DAlRGMge.js → highlighted-body-KQOG7T2V-CsA7lCVc.js} +1 -1
  47. package/dist/gateway/static/root/assets/home-page-BeXJfxsg.js +2 -0
  48. package/dist/gateway/static/root/assets/image-generation-api-B_DqCwtV.js +1 -0
  49. package/dist/gateway/static/root/assets/imports-page-oAvAF9QS.js +1 -0
  50. package/dist/gateway/static/root/assets/index-W9ls-0Yd.css +1 -0
  51. package/dist/gateway/static/root/assets/index-xTL-vb51.js +260 -0
  52. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BYYC9Qmw.js → keyboard-shortcuts-settings--MjYe-Pb.js} +1 -1
  53. package/dist/gateway/static/root/assets/{local-app-workbench-page-BKZfn-MS.js → local-app-workbench-page-DL33dtd7.js} +1 -1
  54. package/dist/gateway/static/root/assets/{local-apps-page-BU8pUsVM.js → local-apps-page-DOa7mxjB.js} +1 -1
  55. package/dist/gateway/static/root/assets/{local-session-drafts-kFc_MAA9.js → local-session-drafts-DAtLkTPg.js} +1 -1
  56. package/dist/gateway/static/root/assets/{locale-store-Dr43FCty.js → locale-store-DMy9W6IG.js} +1 -1
  57. package/dist/gateway/static/root/assets/logs-page-C-GbTYsM.js +2 -0
  58. package/dist/gateway/static/root/assets/management-settings-C0TzuD3-.js +1 -0
  59. package/dist/gateway/static/root/assets/{markdown-view-CdKlPjJM.js → markdown-view-wyOHdXEg.js} +1 -1
  60. package/dist/gateway/static/root/assets/{media-plugins-DE9zt88i.js → media-plugins-Pb2zr_-L.js} +1 -1
  61. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-BxyGGa4D.js +1 -0
  62. package/dist/gateway/static/root/assets/messages-O0BEUKnx.js +3 -0
  63. package/dist/gateway/static/root/assets/models-hub-cache-DdH1MODX.js +1 -0
  64. package/dist/gateway/static/root/assets/note-detail-panel-BFpEqskQ.js +5 -0
  65. package/dist/gateway/static/root/assets/{notes-api-BHouNL6-.js → notes-api-CYt2pGsm.js} +1 -1
  66. package/dist/gateway/static/root/assets/notes-page-h-qqFJ6Z.js +8 -0
  67. package/dist/gateway/static/root/assets/{page-context-capture-button-TQr8NnSc.js → page-context-capture-button-3uj5EcQC.js} +1 -1
  68. package/dist/gateway/static/root/assets/personal-page-BGyW6cdt.js +1 -0
  69. package/dist/gateway/static/root/assets/{product-open-page-BEl6syFp.js → product-open-page-hI13tPS1.js} +1 -1
  70. package/dist/gateway/static/root/assets/{product-preview-content-BxSHnbqz.js → product-preview-content-lT_in0-Q.js} +1 -1
  71. package/dist/gateway/static/root/assets/project-detail-page-Baj7fQ7N.js +1 -0
  72. package/dist/gateway/static/root/assets/projects-page-D7DyQFU3.js +1 -0
  73. package/dist/gateway/static/root/assets/{registry-api-BD5IgDOA.js → registry-api-CgQrCqL6.js} +1 -1
  74. package/dist/gateway/static/root/assets/remote-access-hub-DU_d93Tm.js +1 -0
  75. package/dist/gateway/static/root/assets/{runtime-tools-api-CjTRoQWT.js → runtime-tools-api-D12qVKeC.js} +1 -1
  76. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-DOSPOfCU.js +1 -0
  77. package/dist/gateway/static/root/assets/scenes-page-swyUIF5A.js +2 -0
  78. package/dist/gateway/static/root/assets/{schema-form-ByG-R6N2.js → schema-form-CwOFgsyh.js} +1 -1
  79. package/dist/gateway/static/root/assets/{send-session-input-UAVStisp.js → send-session-input-nH8Cw0US.js} +1 -1
  80. package/dist/gateway/static/root/assets/{session-api-DvgEiNRS.js → session-api-B9HrwF-c.js} +1 -1
  81. package/dist/gateway/static/root/assets/{session-manager-BOb1tC_Z.js → session-manager-aXqXuqDX.js} +1 -1
  82. package/dist/gateway/static/root/assets/sessions-page-CI_PJmlX.js +1 -0
  83. package/dist/gateway/static/root/assets/settings-advanced-gate-DCVaeBLW.js +1 -0
  84. package/dist/gateway/static/root/assets/{settings-page-C1e9m23j.js → settings-page-BN70wE6R.js} +1 -1
  85. package/dist/gateway/static/root/assets/setup-status-panel-CHzcVRi-.js +1 -0
  86. package/dist/gateway/static/root/assets/{share-link-dialog-kE_6v5Dp.js → share-link-dialog-B1TDyhPt.js} +1 -1
  87. package/dist/gateway/static/root/assets/{share-preview-page-BT-_yR1h.js → share-preview-page-Br-eAZaP.js} +1 -1
  88. package/dist/gateway/static/root/assets/{shares-api-Dg_SqHQE.js → shares-api-Bl1ZBh5S.js} +1 -1
  89. package/dist/gateway/static/root/assets/shares-settings-jgCC_E4Y.js +1 -0
  90. package/dist/gateway/static/root/assets/{skill-api-BslUYMnX.js → skill-api-ClUw3SRC.js} +1 -1
  91. package/dist/gateway/static/root/assets/{skill-reload-api-BQ2rTOP1.js → skill-reload-api--1BfIPzb.js} +1 -1
  92. package/dist/gateway/static/root/assets/skills-page-C9oRZSuL.js +2 -0
  93. package/dist/gateway/static/root/assets/{system-settings-panel-GpbPfWwo.js → system-settings-panel-tWrqu7ai.js} +1 -1
  94. package/dist/gateway/static/root/assets/{task-detail-page-5B5ZVAu0.js → task-detail-page-BYRW7Rrr.js} +2 -2
  95. package/dist/gateway/static/root/assets/{task-expandable-content-DJrrEBB4.js → task-expandable-content-D2t4ahzR.js} +1 -1
  96. package/dist/gateway/static/root/assets/{theme-store-BKpYnggg.js → theme-store-BBLjE0fi.js} +1 -1
  97. package/dist/gateway/static/root/assets/{tracing-settings-page-D71w7dwV.js → tracing-settings-page-5ATxQH5c.js} +1 -1
  98. package/dist/gateway/static/root/assets/{tunnel-api-BV46CvS8.js → tunnel-api-CF1Qh4wU.js} +1 -1
  99. package/dist/gateway/static/root/assets/{usage-page-rMuwNpJi.js → usage-page-CuEHzXil.js} +1 -1
  100. package/dist/gateway/static/root/assets/{use-autosave-CzyqRffr.js → use-autosave-tY3keIbm.js} +1 -1
  101. package/dist/gateway/static/root/assets/{use-composer-attachments-Dviq-1f6.js → use-composer-attachments-CXsocZjt.js} +1 -1
  102. package/dist/gateway/static/root/assets/{use-file-preview-expanded-D5Kk7Hon.js → use-file-preview-expanded-CEsxnDnQ.js} +2 -2
  103. package/dist/gateway/static/root/assets/user-model-page-Dvt5TIZ6.js +2 -0
  104. package/dist/gateway/static/root/assets/{voice-api-key-field-DWtbmacd.js → voice-api-key-field-COTNLUU3.js} +1 -1
  105. package/dist/gateway/static/root/assets/{voice-config-api-DnIjZm_9.js → voice-config-api-DrxBjSja.js} +1 -1
  106. package/dist/gateway/static/root/assets/voice-transcribe-api-B47j0_xA.js +1 -0
  107. package/dist/gateway/static/root/assets/{work-discovery-overlay-ChEG71hz.js → work-discovery-overlay-PByMJrhV.js} +1 -1
  108. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-pdiRKLxP.js → workflow-run-setup-panel-CSUkMo63.js} +2 -2
  109. package/dist/gateway/static/root/assets/{workflows-page-D9LMxINt.js → workflows-page-BUDvFo3R.js} +3 -3
  110. package/dist/gateway/static/root/assets/{workspace-api-CZDvu7uA.js → workspace-api-Bmx1O449.js} +2 -2
  111. package/dist/gateway/static/root/assets/{xopc-cloud-account-card-CbUgg1SK.js → xopc-cloud-account-card-DVsAbvwP.js} +1 -1
  112. package/dist/gateway/static/root/index.html +28 -27
  113. package/dist/package.js +1 -1
  114. package/dist/packages/gateway-contract/src/discussions.js +3 -2
  115. package/dist/packages/gateway-contract/src/index.js +4 -0
  116. package/dist/packages/gateway-contract/src/provider-setup.js +6 -0
  117. package/dist/packages/gateway-contract/src/recording-outcome.js +6 -0
  118. package/dist/packages/image-providers/src/catalog.js +10 -0
  119. package/dist/packages/image-providers/src/execute.js +5 -1
  120. package/dist/packages/image-providers/src/validation.js +19 -1
  121. package/dist/src/agent/background-review/run-background-review.d.ts +0 -1
  122. package/dist/src/agent/background-review/run-background-review.js +10 -2
  123. package/dist/src/agent/embedded/run-for-session.js +26 -3
  124. package/dist/src/agent/embedded/run-turn.js +12 -0
  125. package/dist/src/agent/embedded/xopc-stream-bridge.js +3 -0
  126. package/dist/src/agent/image/generation/runtime.js +12 -14
  127. package/dist/src/agent/image/understanding/runtime.js +5 -0
  128. package/dist/src/agent/inbound/inbound-loop.d.ts +1 -15
  129. package/dist/src/agent/inbound/inbound-loop.js +5 -0
  130. package/dist/src/agent/mcp/connection-errors.d.ts +3 -0
  131. package/dist/src/agent/mcp/connection-errors.js +32 -0
  132. package/dist/src/agent/mcp/connection-setup.d.ts +2 -0
  133. package/dist/src/agent/mcp/connection-setup.js +38 -18
  134. package/dist/src/agent/memory/compaction.js +5 -1
  135. package/dist/src/agent/memory/idle-compaction-scheduler.js +3 -1
  136. package/dist/src/agent/models/manager.d.ts +1 -0
  137. package/dist/src/agent/models/manager.js +4 -2
  138. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +1 -6
  139. package/dist/src/agent/orchestration/agent-orchestrator.js +5 -0
  140. package/dist/src/agent/service/process-direct-one-shot.js +5 -0
  141. package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
  142. package/dist/src/agent/service/process-direct-streaming.js +17 -1
  143. package/dist/src/agent/tools/image-generate-tool.js +5 -1
  144. package/dist/src/agent-config/resolver.js +5 -0
  145. package/dist/src/agent-config/schema.d.ts +26 -6
  146. package/dist/src/agent-config/schema.js +2 -0
  147. package/dist/src/ai-assist/text-assist.js +5 -16
  148. package/dist/src/automations/service/action-executor.js +3 -1
  149. package/dist/src/channels/index.js +1 -1
  150. package/dist/src/channels/manager.js +1 -1
  151. package/dist/src/cli/commands/channels.js +1 -1
  152. package/dist/src/cli/commands/connectors.js +1 -1
  153. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  154. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  155. package/dist/src/cli/commands/models.js +1 -1
  156. package/dist/src/cli/commands/onboard.js +1 -1
  157. package/dist/src/config/agent-model-intents.js +4 -1
  158. package/dist/src/config/schema.d.ts +11 -5
  159. package/dist/src/config/schema.js +11 -3
  160. package/dist/src/discussions/analyzer.d.ts +2 -0
  161. package/dist/src/discussions/analyzer.js +38 -9
  162. package/dist/src/discussions/audio-clip.d.ts +3 -0
  163. package/dist/src/discussions/audio-clip.js +72 -0
  164. package/dist/src/discussions/live-worker.js +3 -1
  165. package/dist/src/discussions/long-review.d.ts +17 -0
  166. package/dist/src/discussions/long-review.js +278 -0
  167. package/dist/src/discussions/media-timeline.d.ts +21 -0
  168. package/dist/src/discussions/media-timeline.js +134 -0
  169. package/dist/src/discussions/organizer-worker.d.ts +4 -1
  170. package/dist/src/discussions/organizer-worker.js +17 -12
  171. package/dist/src/discussions/organizer.js +2 -0
  172. package/dist/src/discussions/processing.d.ts +43 -0
  173. package/dist/src/discussions/processing.js +125 -0
  174. package/dist/src/discussions/recording.js +202 -42
  175. package/dist/src/discussions/recordingJobs.js +2 -0
  176. package/dist/src/discussions/repository.js +4 -2
  177. package/dist/src/discussions/review.d.ts +8 -0
  178. package/dist/src/discussions/review.js +183 -0
  179. package/dist/src/discussions/sealer.d.ts +7 -1
  180. package/dist/src/discussions/sealer.js +163 -87
  181. package/dist/src/discussions/service.d.ts +7 -1
  182. package/dist/src/discussions/service.js +51 -15
  183. package/dist/src/discussions/types.d.ts +2 -1
  184. package/dist/src/extensions/sdk/index.js +1 -1
  185. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  186. package/dist/src/gateway/global-defaults-admin.d.ts +3 -1
  187. package/dist/src/gateway/global-defaults-admin.js +14 -2
  188. package/dist/src/gateway/hono/lib/config-payload.d.ts +11 -2
  189. package/dist/src/gateway/hono/lib/config-payload.js +2 -0
  190. package/dist/src/gateway/hono/lib/voice-settings-revisions.d.ts +5 -0
  191. package/dist/src/gateway/hono/lib/voice-settings-revisions.js +23 -0
  192. package/dist/src/gateway/hono/routes/config-patch/misc.js +8 -1
  193. package/dist/src/gateway/hono/routes/config.js +12 -0
  194. package/dist/src/gateway/hono/routes/discussions.js +63 -1
  195. package/dist/src/gateway/hono/routes/global-defaults.js +8 -1
  196. package/dist/src/gateway/hono/routes/models.js +12 -4
  197. package/dist/src/gateway/hono/routes/provider-setup.d.ts +3 -0
  198. package/dist/src/gateway/hono/routes/provider-setup.js +106 -0
  199. package/dist/src/gateway/hono/routes/status.js +2 -0
  200. package/dist/src/gateway/hono/routes/voice.js +23 -10
  201. package/dist/src/gateway/provider-model-setup.d.ts +4 -0
  202. package/dist/src/gateway/provider-model-setup.js +56 -0
  203. package/dist/src/gateway/service/config-coordinator.d.ts +2 -2
  204. package/dist/src/gateway/service.js +7 -7
  205. package/dist/src/home-intelligence/host.js +2 -2
  206. package/dist/src/media-shared/http/provider-http.d.ts +0 -6
  207. package/dist/src/media-shared/http/provider-http.js +5 -4
  208. package/dist/src/media-understanding/runner.d.ts +0 -28
  209. package/dist/src/media-understanding/runner.js +4 -0
  210. package/dist/src/platform/client.d.ts +1 -1
  211. package/dist/src/platform/contracts.d.ts +1 -1
  212. package/dist/src/providers/env-keys.js +3 -0
  213. package/dist/src/providers/extension-stream-bridge.js +3 -0
  214. package/dist/src/providers/index.js +15 -0
  215. package/dist/src/providers/model-call.d.ts +5 -2
  216. package/dist/src/providers/model-call.js +13 -2
  217. package/dist/src/providers/model-reference-auditor.js +1 -0
  218. package/dist/src/providers/model-response.js +1 -1
  219. package/dist/src/providers/model-usage.d.ts +15 -0
  220. package/dist/src/providers/model-usage.js +50 -0
  221. package/dist/src/providers/presentation.js +8 -0
  222. package/dist/src/providers/setup/engine.d.ts +37 -0
  223. package/dist/src/providers/setup/engine.js +177 -0
  224. package/dist/src/providers/setup/profiles.d.ts +4 -0
  225. package/dist/src/providers/setup/profiles.js +94 -0
  226. package/dist/src/providers/setup/voice.d.ts +23 -0
  227. package/dist/src/providers/setup/voice.js +234 -0
  228. package/dist/src/scenes/agentExecutor.d.ts +1 -0
  229. package/dist/src/scenes/agentExecutor.js +5 -0
  230. package/dist/src/storage/sqlite/migrations/253_discussion_processing_recovery.sql +20 -0
  231. package/dist/src/storage/sqlite/migrations/254_discussion_annotations.sql +17 -0
  232. package/dist/src/storage/sqlite/migrations/255_discussion_chapter_progress.sql +10 -0
  233. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  234. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  235. package/dist/src/storage/sqlite/schema.js +1 -1
  236. package/dist/src/usage/recorder.js +2 -1
  237. package/dist/src/usage/scenario-registry.js +128 -123
  238. package/dist/src/voice/dashscope/streaming-stt-session.js +3 -0
  239. package/dist/src/voice/dashscope/streaming-tts-stream.js +3 -0
  240. package/dist/src/voice/dictation.d.ts +12 -0
  241. package/dist/src/voice/dictation.js +22 -0
  242. package/dist/src/voice/metadata/builtin.js +54 -0
  243. package/dist/src/voice/platform-streams.js +3 -0
  244. package/dist/src/voice/realtime/omniEngine.js +3 -0
  245. package/dist/src/voice/realtime/omniRoute.js +3 -2
  246. package/dist/src/voice/realtime/runtime.js +4 -2
  247. package/dist/src/voice/stt/factory.js +9 -3
  248. package/dist/src/voice/stt/providers/bailian-plan-transcription.d.ts +2 -0
  249. package/dist/src/voice/stt/providers/bailian-plan-transcription.js +32 -0
  250. package/dist/src/voice/stt/providers/index.d.ts +1 -0
  251. package/dist/src/voice/stt/providers/index.js +2 -1
  252. package/dist/src/voice/token-plan.d.ts +8 -0
  253. package/dist/src/voice/token-plan.js +11 -0
  254. package/dist/src/voice/tts/factory.js +4 -1
  255. package/dist/src/voice/tts/providers/bailian-plan-speech.d.ts +2 -0
  256. package/dist/src/voice/tts/providers/bailian-plan-speech.js +84 -0
  257. package/dist/src/voice/tts/providers/index.d.ts +1 -0
  258. package/dist/src/voice/tts/providers/index.js +2 -1
  259. package/dist/src/voice/tts/speak-core.js +10 -1
  260. package/package.json +4 -4
  261. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-Ds0Ue2FB.js +0 -1
  262. package/dist/gateway/static/root/assets/agent-plugin-dialog-UunIxc1q.js +0 -1
  263. package/dist/gateway/static/root/assets/agents-BLRM4o-U.js +0 -77
  264. package/dist/gateway/static/root/assets/app-management-settings-panel-Dmy828Pe.js +0 -1
  265. package/dist/gateway/static/root/assets/automations-workspace-UcCneEs3.js +0 -6
  266. package/dist/gateway/static/root/assets/browser-automations-page-BjvQnYfO.js +0 -3
  267. package/dist/gateway/static/root/assets/browser-settings-page-D5ZghI28.js +0 -3
  268. package/dist/gateway/static/root/assets/capabilities-page-MC8qIrXo.js +0 -2
  269. package/dist/gateway/static/root/assets/capabilities-settings-panel-Blz3hEzp.js +0 -8
  270. package/dist/gateway/static/root/assets/channels-DSg_iCVC.js +0 -1
  271. package/dist/gateway/static/root/assets/chat-terminal-dock-C97SJEwd.js +0 -36
  272. package/dist/gateway/static/root/assets/connectors-page-DXk-GAsd.js +0 -1
  273. package/dist/gateway/static/root/assets/device-pairing-wizard-BeSuq__I.js +0 -1
  274. package/dist/gateway/static/root/assets/extension-settings-page-jYu6qpY2.js +0 -1
  275. package/dist/gateway/static/root/assets/fallback-models-CoyzvDo7.js +0 -1
  276. package/dist/gateway/static/root/assets/gateway-realtime-store-C3vH-Iup.js +0 -1
  277. package/dist/gateway/static/root/assets/gateway-settings-JlT1dlSj.js +0 -1
  278. package/dist/gateway/static/root/assets/home-page-DOVl8s-1.js +0 -2
  279. package/dist/gateway/static/root/assets/image-generation-api-BZBiYDmV.js +0 -1
  280. package/dist/gateway/static/root/assets/imports-page-DgdBTp_0.js +0 -1
  281. package/dist/gateway/static/root/assets/index-CmC8JkSM.js +0 -260
  282. package/dist/gateway/static/root/assets/index-Dgzc0oBu.css +0 -1
  283. package/dist/gateway/static/root/assets/logs-page-BSepiACn.js +0 -2
  284. package/dist/gateway/static/root/assets/management-settings-dE_ykPNY.js +0 -1
  285. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-65SE6j-_.js +0 -1
  286. package/dist/gateway/static/root/assets/messages-DlTNQI92.js +0 -3
  287. package/dist/gateway/static/root/assets/models-hub-cache-C7FAsEe_.js +0 -1
  288. package/dist/gateway/static/root/assets/note-detail-panel-D9oqhdyk.js +0 -5
  289. package/dist/gateway/static/root/assets/notes-page-Bd4_7ph8.js +0 -8
  290. package/dist/gateway/static/root/assets/personal-page-BvWzq4Wp.js +0 -1
  291. package/dist/gateway/static/root/assets/project-detail-page-D-qkIXVT.js +0 -1
  292. package/dist/gateway/static/root/assets/projects-page-BQtw1Dfn.js +0 -1
  293. package/dist/gateway/static/root/assets/remote-access-hub-CYFNz0Jc.js +0 -1
  294. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Qq_NyYx_.js +0 -1
  295. package/dist/gateway/static/root/assets/scenes-page-hGr-ppYk.js +0 -2
  296. package/dist/gateway/static/root/assets/sessions-page-CpX1Rluw.js +0 -1
  297. package/dist/gateway/static/root/assets/settings-advanced-gate-D2s_MlxR.js +0 -1
  298. package/dist/gateway/static/root/assets/settings-loading-skeleton-BTqvr_Fw.js +0 -1
  299. package/dist/gateway/static/root/assets/setup-status-panel-BiHRYDHq.js +0 -1
  300. package/dist/gateway/static/root/assets/shares-settings-DfcAu08T.js +0 -1
  301. package/dist/gateway/static/root/assets/skills-page-CvKc5nBN.js +0 -2
  302. package/dist/gateway/static/root/assets/user-model-page-Dhqw3v_u.js +0 -2
@@ -1,10 +1,10 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { HomeAdviceBudgetExceededError, isHomeProseLocalized } from "./generator.js";
4
3
  import { homePatternKey } from "./strategy.js";
5
- import { HomeAdvicePolicy } from "./policy.js";
6
4
  import { HomeIntelligenceRepository } from "./repository.js";
7
5
  import { HomeOpportunityApplicationService } from "./application-service.js";
6
+ import { HomeAdvicePolicy } from "./policy.js";
7
+ import { HomeAdviceBudgetExceededError, isHomeProseLocalized } from "./generator.js";
8
8
  import { buildHomeOpportunityNotification } from "./notification.js";
9
9
  import { createHash } from "node:crypto";
10
10
  //#region src/home-intelligence/host.ts
@@ -1,9 +1,3 @@
1
- /**
2
- * Shared provider HTTP client (voice, STT/TTS, image-generation extensions).
3
- *
4
- * Wraps `globalThis.fetch` with SSRF guard (`assertSafeUrl`), timeout + signal
5
- * merge, and standardized errors via `assertOkOrThrowProviderError`.
6
- */
7
1
  import { type SsrfGuardOptions } from './ssrf-guard.js';
8
2
  export interface ProviderHttpRequestConfig extends SsrfGuardOptions {
9
3
  /** Hard timeout in milliseconds. Required: callers must always specify. */
@@ -1,3 +1,4 @@
1
+ import { assertProviderUsage, init_model_usage } from "../../providers/model-usage.js";
1
2
  import { assertOkOrThrowProviderError } from "./provider-http-errors.js";
2
3
  import { assertSafeUrl } from "./ssrf-guard.js";
3
4
  import { setTimeout as setTimeout$1 } from "node:timers/promises";
@@ -8,6 +9,7 @@ import { setTimeout as setTimeout$1 } from "node:timers/promises";
8
9
  * Wraps `globalThis.fetch` with SSRF guard (`assertSafeUrl`), timeout + signal
9
10
  * merge, and standardized errors via `assertOkOrThrowProviderError`.
10
11
  */
12
+ init_model_usage();
11
13
  function mergeHeadersRecord(input) {
12
14
  const out = {};
13
15
  if (!input) return out;
@@ -25,16 +27,15 @@ function mergeHeadersRecord(input) {
25
27
  * to assertOk / parse / stream). Throws SsrfBlockedError on guard failure.
26
28
  */
27
29
  async function fetchWithTimeoutGuarded(url, options) {
30
+ assertProviderUsage("endpoint", String(url));
28
31
  await assertSafeUrl(url, options);
29
32
  const controller = new AbortController();
30
33
  const timeoutHandle = setTimeout(() => controller.abort(), options.timeoutMs);
31
- const callerSignal = options.signal;
32
- if (callerSignal) if (callerSignal.aborted) controller.abort(callerSignal.reason);
33
- else callerSignal.addEventListener("abort", () => controller.abort(callerSignal.reason), { once: true });
34
+ const signal = options.signal ? AbortSignal.any([options.signal, controller.signal]) : controller.signal;
34
35
  try {
35
36
  return await fetch(url, {
36
37
  ...options.init,
37
- signal: controller.signal
38
+ signal
38
39
  });
39
40
  } finally {
40
41
  clearTimeout(timeoutHandle);
@@ -1,31 +1,3 @@
1
- /**
2
- * MediaUnderstanding capability runner.
3
- *
4
- * Orchestrates per-attachment fallback across providers for one capability
5
- * (audio / image / video). For each attachment:
6
- * 1. Build the candidate provider list from the registry, ordered by
7
- * autoPriority (lower = first), with caller-supplied `providerOrder`
8
- * overriding when set.
9
- * 2. Try providers in order. A provider is SKIPPED when it does not declare
10
- * the requested capability OR does not implement the corresponding method.
11
- * 3. The first provider whose capability call resolves successfully wins;
12
- * its output is recorded as `chosen`. Failures are recorded as attempts
13
- * and the next provider is tried.
14
- * 4. When ALL providers for an attachment fail, the attachment task is
15
- * `failed`; when no provider was even eligible (capability not registered),
16
- * it's `disabled`.
17
- *
18
- * DECISION (per docs/voice-rearchitecture.md §5):
19
- * - This is a thin runner only. xopc v2.0 ships ONLY audio; image/video
20
- * branches exist as type-level fall-throughs (the runner happily handles
21
- * them once a provider registers describeImage / describeVideo, but no
22
- * image-specific helpers — like multi-image batching — live here yet).
23
- * - We deliberately do NOT port openclaw's `MediaAttachmentCache` (which
24
- * handles temp-file extraction, SSRF re-validation on remote URLs, etc.).
25
- * For xopc v2.0 the caller is expected to pre-load the buffer; remote URL
26
- * fetching is the caller's responsibility (typically the channel adapter
27
- * does this before invoking the runner).
28
- */
29
1
  import type { AudioTranscriptionRequest, CapabilityAttachmentInput, ImageDescriptionRequest, MediaCapability, MediaUnderstandingProvider, MediaUnderstandingResult, VideoDescriptionRequest } from './types.js';
30
2
  export type { CapabilityAttachmentInput } from './types.js';
31
3
  export interface RunCapabilityOptions {
@@ -1,7 +1,9 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
+ import { assertProviderUsage, init_model_usage, isProviderUsageScopeError } from "../providers/model-usage.js";
3
4
  import { listProvidersForCapability } from "./registry.js";
4
5
  //#region src/media-understanding/runner.ts
6
+ init_model_usage();
5
7
  init_logger();
6
8
  const log = createLogger("MediaUnderstandingRunner");
7
9
  const KIND_BY_CAPABILITY = {
@@ -90,6 +92,7 @@ async function runCapability(options) {
90
92
  }
91
93
  const startedAt = Date.now();
92
94
  try {
95
+ assertProviderUsage(provider.id, request.baseUrl);
93
96
  const callResult = await method(request);
94
97
  const text = callResult.text?.trim() ?? "";
95
98
  if (!text) {
@@ -123,6 +126,7 @@ async function runCapability(options) {
123
126
  });
124
127
  break;
125
128
  } catch (error) {
129
+ if (isProviderUsageScopeError(error)) throw error;
126
130
  if (options.signal?.aborted) throw error;
127
131
  const reason = error instanceof Error ? error.message : String(error);
128
132
  log.warn({
@@ -33,9 +33,9 @@ export declare const RuntimeCommandSchema: z.ZodObject<{
33
33
  intents: z.ZodArray<z.ZodEnum<{
34
34
  review: "review";
35
35
  coding: "coding";
36
+ vision: "vision";
36
37
  fast: "fast";
37
38
  reasoning: "reasoning";
38
- vision: "vision";
39
39
  understanding: "understanding";
40
40
  }>>;
41
41
  allow: z.ZodArray<z.ZodString>;
@@ -119,9 +119,9 @@ export declare const AgentManifestSchema: z.ZodObject<{
119
119
  intents: z.ZodArray<z.ZodEnum<{
120
120
  review: "review";
121
121
  coding: "coding";
122
+ vision: "vision";
122
123
  fast: "fast";
123
124
  reasoning: "reasoning";
124
- vision: "vision";
125
125
  understanding: "understanding";
126
126
  }>>;
127
127
  allow: z.ZodArray<z.ZodString>;
@@ -16,6 +16,9 @@ var init_env_keys = __esmMin((() => {
16
16
  openai: ["OPENAI_API_KEY"],
17
17
  anthropic: ["ANTHROPIC_OAUTH_TOKEN", "ANTHROPIC_API_KEY"],
18
18
  deepseek: ["DEEPSEEK_API_KEY"],
19
+ "qwen-token-plan-cn": ["QWEN_TOKEN_PLAN_CN_API_KEY"],
20
+ "qwen-token-plan": ["QWEN_TOKEN_PLAN_API_KEY"],
21
+ "qwen-token-plan-individual": ["QWEN_TOKEN_PLAN_API_KEY"],
19
22
  google: ["GEMINI_API_KEY", "GOOGLE_API_KEY"],
20
23
  "google-vertex": [
21
24
  "GOOGLE_CLOUD_API_KEY",
@@ -1,11 +1,13 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
+ import { assertProviderUsage, init_model_usage } from "./model-usage.js";
3
4
  import "./constants.js";
4
5
  import { getProviderRegistry, init_plugin_registry } from "./plugin-registry.js";
5
6
  import { init_providers } from "./index.js";
6
7
  import { stripPromptCacheBoundary } from "../agent/prompt/cache-boundary.js";
7
8
  import { createAssistantMessageEventStream, getCurrentSystemPrompt, getCurrentTools, streamSimple } from "@earendil-works/pi-ai/compat";
8
9
  //#region src/providers/extension-stream-bridge.ts
10
+ init_model_usage();
9
11
  init_plugin_registry();
10
12
  init_providers();
11
13
  init_logger();
@@ -70,6 +72,7 @@ function collectExtraStreamOptions(options) {
70
72
  /** Wraps {@link streamSimple} so extension-registered models use the plugin `createStream()` path. */
71
73
  function createExtensionAwareStreamFn() {
72
74
  return ((model, context, options) => {
75
+ assertProviderUsage(model.provider, model.baseUrl);
73
76
  if (model.baseUrl !== "extension://provider-plugin") return streamSimple(model, context, options);
74
77
  const plugin = getProviderRegistry().get(model.provider);
75
78
  if (!plugin) return streamSimple(model, context, options);
@@ -468,6 +468,21 @@ var init_providers = __esmMin((() => {
468
468
  category: "specialty",
469
469
  supportsApiKey: true
470
470
  },
471
+ "qwen-token-plan-cn": {
472
+ name: "Alibaba Bailian Subscription (China)",
473
+ category: "domestic",
474
+ supportsApiKey: true
475
+ },
476
+ "qwen-token-plan": {
477
+ name: "Qwen Token Plan (International)",
478
+ category: "domestic",
479
+ supportsApiKey: true
480
+ },
481
+ "qwen-token-plan-individual": {
482
+ name: "Qwen Token Plan Individual (International)",
483
+ category: "domestic",
484
+ supportsApiKey: true
485
+ },
471
486
  "dashscope": {
472
487
  name: "DashScope (Alibaba)",
473
488
  category: "domestic",
@@ -7,10 +7,13 @@ export declare function resolveModelCallOptions(model: Model<Api>, options?: Sim
7
7
  /**
8
8
  * Complete a one-shot request with xopc credential resolution and extension-provider routing.
9
9
  */
10
- export declare function completeWithResolvedCredentials(model: Model<Api>, context: Context, options: SimpleStreamOptions, credentialOptions: CredentialResolverOptions | undefined, usageContext: AiUsageContext): Promise<AssistantMessage>;
10
+ declare function completeWithResolvedCredentialsInner(model: Model<Api>, context: Context, options: SimpleStreamOptions, credentialOptions: CredentialResolverOptions | undefined, usageContext: AiUsageContext): Promise<AssistantMessage>;
11
11
  /**
12
12
  * Start a model stream with xopc credential resolution and extension-provider routing.
13
13
  * Callers that need live visible output should consume the returned stream before calling
14
14
  * its `result()` method.
15
15
  */
16
- export declare function createResolvedModelStream(model: Model<Api>, context: Context, options: SimpleStreamOptions, credentialOptions: CredentialResolverOptions | undefined, usageContext: AiUsageContext): Promise<import("@earendil-works/pi-ai/compat").AssistantMessageEventStream>;
16
+ declare function createResolvedModelStreamInner(model: Model<Api>, context: Context, options: SimpleStreamOptions, credentialOptions: CredentialResolverOptions | undefined, usageContext: AiUsageContext): Promise<import("@earendil-works/pi-ai/compat").AssistantMessageEventStream>;
17
+ export declare function completeWithResolvedCredentials(...args: Parameters<typeof completeWithResolvedCredentialsInner>): Promise<AssistantMessage>;
18
+ export declare function createResolvedModelStream(...args: Parameters<typeof createResolvedModelStreamInner>): Promise<import("@earendil-works/pi-ai/compat").AssistantMessageEventStream>;
19
+ export {};
@@ -1,3 +1,4 @@
1
+ import { assertProviderUsage, init_model_usage, modelUsageOriginForCall, withModelUsageOrigin } from "./model-usage.js";
1
2
  import { init_constants } from "./constants.js";
2
3
  import { getApiKey, init_providers } from "./index.js";
3
4
  import { createExtensionAwareStreamFn } from "./extension-stream-bridge.js";
@@ -6,6 +7,7 @@ import { finishAiUsageFromMessage, observeAiUsageStream, startAiUsageCall } from
6
7
  import { assertCloudCreditBudgetActive, cloudCreditBudgetHeaders, reportCloudCreditError } from "./xopc-cloud-credit-budget.js";
7
8
  import { completeSimple, normalizeContext } from "@earendil-works/pi-ai/compat";
8
9
  //#region src/providers/model-call.ts
10
+ init_model_usage();
9
11
  init_constants();
10
12
  init_providers();
11
13
  function isLocalModelBaseUrl(baseUrl) {
@@ -28,6 +30,7 @@ async function resolveModelCallApiKey(model, credentialOptions) {
28
30
  }
29
31
  async function resolveModelCallOptions(model, options = {}, credentialOptions) {
30
32
  assertCloudCreditBudgetActive();
33
+ assertProviderUsage(model.provider, model.baseUrl);
31
34
  if (model.provider === "xopc-cloud") options = withCloudUsageResponse(options);
32
35
  const apiKey = options.apiKey ?? await resolveModelCallApiKey(model, credentialOptions);
33
36
  if (!apiKey) throw new Error(`No API key for provider: ${model.provider}`);
@@ -45,7 +48,8 @@ async function resolveModelCallOptions(model, options = {}, credentialOptions) {
45
48
  /**
46
49
  * Complete a one-shot request with xopc credential resolution and extension-provider routing.
47
50
  */
48
- async function completeWithResolvedCredentials(model, context, options, credentialOptions, usageContext) {
51
+ async function completeWithResolvedCredentialsInner(model, context, options, credentialOptions, usageContext) {
52
+ if (usageContext.trigger === "scheduled" || usageContext.trigger === "system") withModelUsageOrigin("background", () => assertProviderUsage(model.provider, model.baseUrl));
49
53
  const resolvedOptions = await resolveModelCallOptions(model, options, credentialOptions);
50
54
  const usageCall = startAiUsageCall(model, usageContext, {
51
55
  context,
@@ -79,7 +83,8 @@ async function completeWithResolvedCredentials(model, context, options, credenti
79
83
  * Callers that need live visible output should consume the returned stream before calling
80
84
  * its `result()` method.
81
85
  */
82
- async function createResolvedModelStream(model, context, options, credentialOptions, usageContext) {
86
+ async function createResolvedModelStreamInner(model, context, options, credentialOptions, usageContext) {
87
+ if (usageContext.trigger === "scheduled" || usageContext.trigger === "system") withModelUsageOrigin("background", () => assertProviderUsage(model.provider, model.baseUrl));
83
88
  const resolvedOptions = await resolveModelCallOptions(model, options, credentialOptions);
84
89
  const usageCall = startAiUsageCall(model, usageContext, {
85
90
  context,
@@ -103,5 +108,11 @@ async function createResolvedModelStream(model, context, options, credentialOpti
103
108
  throw error;
104
109
  }
105
110
  }
111
+ function completeWithResolvedCredentials(...args) {
112
+ return withModelUsageOrigin(modelUsageOriginForCall(args[4]), () => completeWithResolvedCredentialsInner(...args));
113
+ }
114
+ function createResolvedModelStream(...args) {
115
+ return withModelUsageOrigin(modelUsageOriginForCall(args[4]), () => createResolvedModelStreamInner(...args));
116
+ }
106
117
  //#endregion
107
118
  export { completeWithResolvedCredentials, createResolvedModelStream, isLocalModelBaseUrl, resolveModelCallApiKey, resolveModelCallOptions };
@@ -33,6 +33,7 @@ function collectModelPolicy(out, value, location) {
33
33
  addRef(out, chat.primary, `${location}.chat.primary`);
34
34
  if (Array.isArray(chat.fallbacks)) chat.fallbacks.forEach((ref, index) => addRef(out, ref, `${location}.chat.fallbacks[${index}]`));
35
35
  }
36
+ collectToolModel(out, policy.background, `${location}.background`);
36
37
  const intents = asRecord(policy.intents);
37
38
  for (const [intent, routeValue] of Object.entries(intents ?? {})) {
38
39
  const route = asRecord(routeValue);
@@ -46,7 +46,7 @@ function extractAssistantText(content) {
46
46
  /** True when retrying a model request may recover from a transport or upstream 5xx failure. */
47
47
  function isTransientProviderErrorMessage(message) {
48
48
  const lower = message.toLowerCase();
49
- if (/insufficient_quota|usage_limit_reached|usage_not_included|credit_budget_exhausted/.test(lower)) return false;
49
+ if (/provider_usage_scope_denied|insufficient_quota|usage_limit_reached|usage_not_included|credit_budget_exhausted/.test(lower)) return false;
50
50
  return TRANSIENT_PROVIDER_ERROR_SUBSTRINGS.some((value) => lower.includes(value)) || lower.trim() === "terminated" || /(?:^|\D)(?:408|409|429|500|502|503|504|529)(?:\D|$)/.test(lower);
51
51
  }
52
52
  function stripCodeFences(raw) {
@@ -0,0 +1,15 @@
1
+ import type { TurnOrigin } from '@xopcai/endpoint-tools-protocol';
2
+ import type { AiUsageContext } from '../usage/types.js';
3
+ export type ModelUsageOrigin = 'interactive' | 'background' | 'unknown';
4
+ export declare const getModelUsageOrigin: () => ModelUsageOrigin;
5
+ export declare function modelUsageOriginForCall(context: AiUsageContext): ModelUsageOrigin;
6
+ /** A nested task cannot upgrade its parent's background/unknown scope. */
7
+ export declare function withModelUsageOrigin<T>(origin: ModelUsageOrigin, run: () => T): T;
8
+ export declare function modelUsageOriginFromTurn(origin?: TurnOrigin): ModelUsageOrigin;
9
+ export declare class ProviderUsageScopeError extends Error {
10
+ readonly code = "provider_usage_scope_denied";
11
+ constructor(provider: string, origin: ModelUsageOrigin);
12
+ }
13
+ /** Transport wrappers may preserve only the error message or code. */
14
+ export declare function isProviderUsageScopeError(error: unknown): boolean;
15
+ export declare function assertProviderUsage(provider: string, baseUrl?: string): void;
@@ -0,0 +1,50 @@
1
+ import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
+ import { init_profiles, isInteractiveOnlyProvider } from "./setup/profiles.js";
3
+ import { init_scenario_registry, resolveAiUsageScenario } from "../usage/scenario-registry.js";
4
+ import { AsyncLocalStorage } from "node:async_hooks";
5
+ //#region src/providers/model-usage.ts
6
+ function modelUsageOriginForCall(context) {
7
+ const trigger = context.trigger ?? resolveAiUsageScenario(context.operation).trigger;
8
+ return trigger === "user" ? "interactive" : trigger === "system" || trigger === "scheduled" ? "background" : getModelUsageOrigin();
9
+ }
10
+ /** A nested task cannot upgrade its parent's background/unknown scope. */
11
+ function withModelUsageOrigin(origin, run) {
12
+ const parent = scopes.getStore();
13
+ const effective = parent === "background" || origin === "background" ? "background" : parent === "unknown" ? "unknown" : origin;
14
+ return scopes.run(effective, run);
15
+ }
16
+ function modelUsageOriginFromTurn(origin) {
17
+ if (!origin) return "unknown";
18
+ if (origin.type !== "system" || origin.source === "cli") return "interactive";
19
+ if ([
20
+ "workflow",
21
+ "internal",
22
+ "task_update"
23
+ ].includes(origin.source)) return scopes.getStore() ?? "background";
24
+ return "background";
25
+ }
26
+ /** Transport wrappers may preserve only the error message or code. */
27
+ function isProviderUsageScopeError(error) {
28
+ return error instanceof ProviderUsageScopeError || Boolean(error && typeof error === "object" && "code" in error && error.code === "provider_usage_scope_denied") || (error instanceof Error ? error.message : typeof error === "string" ? error : "").includes("provider_usage_scope_denied");
29
+ }
30
+ function assertProviderUsage(provider, baseUrl) {
31
+ const origin = getModelUsageOrigin();
32
+ if (origin !== "interactive" && isInteractiveOnlyProvider(provider, baseUrl)) throw new ProviderUsageScopeError(provider, origin);
33
+ }
34
+ var scopes, getModelUsageOrigin, ProviderUsageScopeError;
35
+ var init_model_usage = __esmMin((() => {
36
+ init_profiles();
37
+ init_scenario_registry();
38
+ scopes = new AsyncLocalStorage();
39
+ getModelUsageOrigin = () => scopes.getStore() ?? "unknown";
40
+ ProviderUsageScopeError = class extends Error {
41
+ code = "provider_usage_scope_denied";
42
+ constructor(provider, origin) {
43
+ super(`provider_usage_scope_denied: ${provider} requires an interactive user turn; ${origin} calls need a background-capable model.`);
44
+ this.name = "ProviderUsageScopeError";
45
+ }
46
+ };
47
+ }));
48
+ //#endregion
49
+ init_model_usage();
50
+ export { ProviderUsageScopeError, assertProviderUsage, getModelUsageOrigin, init_model_usage, isProviderUsageScopeError, modelUsageOriginForCall, modelUsageOriginFromTurn, withModelUsageOrigin };
@@ -8,6 +8,7 @@ init_plugin_registry();
8
8
  init_model_policy();
9
9
  const FEATURED_PROVIDER_ORDER = [
10
10
  "xopc-cloud",
11
+ "qwen-token-plan-cn",
11
12
  "deepseek",
12
13
  "openai",
13
14
  "anthropic",
@@ -38,6 +39,7 @@ const FEATURED_PROVIDER_ORDER = [
38
39
  ];
39
40
  const PROVIDER_HINTS = {
40
41
  "xopc-cloud": "Official XOPC model service with models discovered from your account.",
42
+ "qwen-token-plan-cn": "Alibaba Bailian subscription: one key for chat, vision and image generation.",
41
43
  openai: "Frontier OpenAI models from the official API.",
42
44
  anthropic: "Claude models for coding, long context, and reasoning.",
43
45
  xai: "Grok models from xAI.",
@@ -76,6 +78,12 @@ const PROVIDER_HINTS = {
76
78
  };
77
79
  const RECOMMENDED_MODEL_PATTERNS = {
78
80
  "xopc-cloud": [/^auto$/],
81
+ "qwen-token-plan-cn": [
82
+ /^qwen3\.8-flash$/i,
83
+ /^qwen3\.8-max$/i,
84
+ /^qwen3\.7-plus$/i,
85
+ /^qwen3\.6-flash$/i
86
+ ],
79
87
  openai: [
80
88
  /^gpt-6-sol$/i,
81
89
  /^gpt-6-luna$/i,
@@ -0,0 +1,37 @@
1
+ import type { ModelSetupPreview, ModelSetupRequest, ProviderSetupProfile } from '@xopcai/gateway-contract';
2
+ import type { AgentDefaults } from '../../agent-config/index.js';
3
+ import type { SetupVoiceState, SetupVoiceModel, VoiceSetupUse } from './voice.js';
4
+ export type SetupModel = {
5
+ ref: string;
6
+ name: string;
7
+ baseUrl?: string;
8
+ api?: string;
9
+ vision?: boolean;
10
+ reasoning?: boolean;
11
+ recommended?: boolean;
12
+ };
13
+ export type SetupSnapshot = {
14
+ profile: ProviderSetupProfile;
15
+ defaults: AgentDefaults;
16
+ models: SetupModel[];
17
+ images: Array<{
18
+ ref: string;
19
+ name: string;
20
+ }>;
21
+ configured: boolean;
22
+ configuredProviders: Set<string>;
23
+ backgroundRestrictedModels?: Set<string>;
24
+ voice?: SetupVoiceState;
25
+ };
26
+ export declare class SetupConflictError extends Error {
27
+ }
28
+ /** Pure preview over authoritative catalog and defaults; never writes or probes a model. */
29
+ export declare function previewProviderSetup(snapshot: SetupSnapshot, request?: ModelSetupRequest): ModelSetupPreview;
30
+ export declare function applyProviderSetup(snapshot: SetupSnapshot, request: ModelSetupRequest, revision: string): {
31
+ defaults: AgentDefaults;
32
+ preview: ModelSetupPreview;
33
+ voiceAssignments: Array<{
34
+ use: VoiceSetupUse;
35
+ model: SetupVoiceModel;
36
+ }>;
37
+ };
@@ -0,0 +1,177 @@
1
+ import { init_profiles, isInteractiveOnlyProvider } from "./profiles.js";
2
+ import { createHash } from "node:crypto";
3
+ //#region src/providers/setup/engine.ts
4
+ init_profiles();
5
+ const preferred = {
6
+ "qwen-token-plan-cn": {
7
+ fast: [
8
+ "qwen3.8-flash",
9
+ "qwen3.7-plus",
10
+ "qwen3.6-flash"
11
+ ],
12
+ reasoning: [
13
+ "qwen3.8-max",
14
+ "deepseek-v4-pro-0813",
15
+ "deepseek-v4-pro"
16
+ ]
17
+ },
18
+ "xopc-cloud": {
19
+ fast: ["auto"],
20
+ reasoning: ["advanced", "auto"]
21
+ },
22
+ "xiaomi-token-plan-cn": {
23
+ fast: ["mimo-v2.5", "mimo-v2.5-pro"],
24
+ reasoning: ["mimo-v2.5-pro", "mimo-v2.5"]
25
+ }
26
+ };
27
+ const uses = [
28
+ "chat",
29
+ "vision",
30
+ "image",
31
+ "background"
32
+ ];
33
+ var SetupConflictError = class extends Error {};
34
+ function choose(models, ids, provider) {
35
+ return ids.map((id) => models.find((model) => model.ref === `${provider}/${id}`)?.ref).find(Boolean) ?? models.find((model) => model.recommended)?.ref ?? (models.length === 1 ? models[0]?.ref : void 0);
36
+ }
37
+ /** Pure preview over authoritative catalog and defaults; never writes or probes a model. */
38
+ function previewProviderSetup(snapshot, request = {}) {
39
+ const { profile, defaults, configured, configuredProviders } = snapshot;
40
+ const models = snapshot.models.filter((model) => !request.modelIds || request.modelIds.some((id) => model.ref === id || model.ref === `${profile.id}/${id}`));
41
+ const vision = models.filter((model) => model.vision);
42
+ const reasoning = models.filter((model) => model.reasoning);
43
+ const preference = preferred[profile.id] ?? {
44
+ fast: [],
45
+ reasoning: []
46
+ };
47
+ const fast = choose(models, preference.fast, profile.id);
48
+ const complex = choose(reasoning, preference.reasoning, profile.id);
49
+ const isRestricted = (ref) => snapshot.backgroundRestrictedModels?.has(ref) || isInteractiveOnlyProvider(ref.split("/")[0], snapshot.models.find((model) => model.ref === ref)?.baseUrl);
50
+ const background = profile.interactiveOnly ? [] : models.filter((model) => !isRestricted(model.ref));
51
+ const recommended = {
52
+ chat: fast,
53
+ vision: choose(vision, preference.fast, profile.id),
54
+ image: snapshot.images[0]?.ref,
55
+ background: choose(background, preference.fast, profile.id)
56
+ };
57
+ const choices = {
58
+ chat: models,
59
+ vision,
60
+ image: snapshot.images,
61
+ background
62
+ };
63
+ const current = {
64
+ chat: defaults.models.chat.primary,
65
+ vision: defaults.models.imageUnderstanding?.primary,
66
+ image: defaults.models.imageGeneration?.primary,
67
+ background: defaults.models.background?.primary ?? (!isRestricted(defaults.models.chat.primary) ? defaults.models.chat.primary : void 0)
68
+ };
69
+ for (const id of Object.keys(snapshot.voice?.choices ?? {})) {
70
+ const options = snapshot.voice.choices[id];
71
+ choices[id] = options;
72
+ recommended[id] = options.find((model) => model.recommended)?.ref ?? (options.length === 1 ? options[0]?.ref : void 0);
73
+ current[id] = snapshot.voice.current[id];
74
+ }
75
+ const revision = createHash("sha256").update(JSON.stringify({
76
+ defaults,
77
+ profile,
78
+ models: snapshot.models,
79
+ images: snapshot.images,
80
+ voice: snapshot.voice,
81
+ backgroundRestrictedModels: [...snapshot.backgroundRestrictedModels ?? []].sort()
82
+ })).digest("hex");
83
+ return {
84
+ providerId: profile.id,
85
+ profile,
86
+ revision,
87
+ configured,
88
+ mode: request.mode ?? "fill",
89
+ taskModels: {
90
+ ...fast ? { fast } : {},
91
+ ...complex ? {
92
+ reasoning: complex,
93
+ coding: complex,
94
+ review: complex
95
+ } : {},
96
+ ...recommended.vision ? { vision: recommended.vision } : {}
97
+ },
98
+ uses: [...uses, ...snapshot.voice ? [
99
+ "transcription",
100
+ "speech",
101
+ "conversation"
102
+ ] : []].map((id) => {
103
+ const options = (choices[id] ?? []).map((model) => ({
104
+ id: model.ref,
105
+ name: model.name
106
+ }));
107
+ const override = request.overrides?.[id];
108
+ if (override && !options.some((model) => model.id === override)) throw new Error(`Invalid ${id} model for ${profile.id}`);
109
+ const ref = override ?? recommended[id];
110
+ const currentProvider = current[id]?.split("/")[0];
111
+ const currentConfigured = currentProvider && (configuredProviders.has(currentProvider) || [
112
+ "speech",
113
+ "transcription",
114
+ "conversation"
115
+ ].includes(id)) && (id !== "background" || !isRestricted(current[id]));
116
+ const selected = options.length > 0 && Boolean(ref) && (request.selected ? request.selected.includes(id) : request.mode === "replace" || !currentConfigured);
117
+ return {
118
+ id,
119
+ current: current[id],
120
+ recommended: ref,
121
+ choices: options,
122
+ selected,
123
+ ...!options.length ? { reason: id === "background" && profile.interactiveOnly ? "interactive_only" : "not_supported" } : !ref ? { reason: "no_recommendation" } : {}
124
+ };
125
+ })
126
+ };
127
+ }
128
+ function applyProviderSetup(snapshot, request, revision) {
129
+ const preview = previewProviderSetup(snapshot, request);
130
+ if (revision !== preview.revision) throw new SetupConflictError("Model catalog or settings changed. Review the refreshed configuration.");
131
+ for (const id of request.selected ?? []) if (!preview.uses.some((use) => use.id === id && use.selected)) throw new Error(`No eligible model selected for ${id}`);
132
+ if (!snapshot.configured) throw new Error("Connect this model service before applying its models.");
133
+ const models = structuredClone(snapshot.defaults.models);
134
+ const voiceAssignments = [];
135
+ const route = (primary) => ({
136
+ primary,
137
+ fallbacks: []
138
+ });
139
+ for (const use of preview.uses) {
140
+ if (!use.selected) continue;
141
+ if (!use.recommended) throw new Error(`Choose a model for ${use.id}`);
142
+ if (use.id === "chat") {
143
+ models.chat = route(use.recommended);
144
+ for (const [intent, ref] of Object.entries(preview.taskModels)) {
145
+ const key = intent;
146
+ const existing = models.intents[key];
147
+ const keep = request.mode !== "replace" && existing && snapshot.configuredProviders.has(existing.primary.split("/")[0]);
148
+ if (ref && !keep && (intent !== "vision" || preview.uses.some((use) => use.id === "vision" && use.selected))) models.intents[key] = route(ref);
149
+ }
150
+ } else if (use.id === "vision") models.imageUnderstanding = route(use.recommended);
151
+ else if (use.id === "image") models.imageGeneration = {
152
+ ...models.imageGeneration,
153
+ ...route(use.recommended),
154
+ autoProviderFallback: false
155
+ };
156
+ else if (use.id === "background") models.background = route(use.recommended);
157
+ else {
158
+ const voiceUse = use.id;
159
+ const model = snapshot.voice?.choices[voiceUse].find((model) => model.ref === use.recommended);
160
+ if (!model) throw new Error(`No voice binding for ${use.id}`);
161
+ voiceAssignments.push({
162
+ use: voiceUse,
163
+ model
164
+ });
165
+ }
166
+ }
167
+ return {
168
+ defaults: {
169
+ ...snapshot.defaults,
170
+ models
171
+ },
172
+ preview,
173
+ voiceAssignments
174
+ };
175
+ }
176
+ //#endregion
177
+ export { SetupConflictError, applyProviderSetup, previewProviderSetup };
@@ -0,0 +1,4 @@
1
+ import type { ProviderSetupProfile } from '@xopcai/gateway-contract';
2
+ /** Plan usage is conservative until a vendor explicitly permits unattended execution. */
3
+ export declare function isInteractiveOnlyProvider(provider: string, baseUrl?: string): boolean;
4
+ export declare function getProviderSetupProfile(provider: string, name?: string, oauth?: boolean, baseUrl?: string): ProviderSetupProfile;