@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,18 +1,3 @@
1
- /**
2
- * InboundLoop — owns the bus-driven inbound pipeline.
3
- *
4
- * Replaces the previous `AgentService.start()` while-loop, `handleInboundMessage`,
5
- * and `handleSystemMessage` methods. Everything that "a message arrives, run the
6
- * agent turn, publish the reply" needs is concentrated here; the parent
7
- * `AgentService` now just constructs the loop with collaborators and forwards
8
- * start/stop to it.
9
- *
10
- * The constructor takes a fairly wide config because handling a single inbound
11
- * message touches almost every subsystem (router, command handler, lifecycle
12
- * manager, agent orchestrator, outbound coordinator, session state, etc.). All
13
- * dependencies are injected so this class is unit-testable and the inbound
14
- * pipeline can evolve without touching `AgentService`.
15
- */
16
1
  import type { MessageBus } from '../../infra/bus/index.js';
17
2
  import type { Config } from '../../config/schema.js';
18
3
  import type { ChannelManager } from '../../channels/manager.js';
@@ -74,5 +59,6 @@ export declare class InboundLoop {
74
59
  /** Cooperatively stop the loop; the current message (if any) is allowed to finish. */
75
60
  stop(): void;
76
61
  private handleInboundMessage;
62
+ private handleInboundMessageScoped;
77
63
  private handleSystemMessage;
78
64
  }
@@ -1,5 +1,6 @@
1
1
  import { runWithLogContext, updateAsyncLogContext } from "../../utils/logger/context.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { init_model_usage, withModelUsageOrigin } from "../../providers/model-usage.js";
3
4
  import { shouldSkipResetOverlapCommand } from "../../session/reset-triggers.js";
4
5
  import { initSessionTurn } from "../../session/init-session-turn.js";
5
6
  import { MessageBusShutdownError } from "../../infra/bus/queue.js";
@@ -7,6 +8,7 @@ import "../../infra/bus/index.js";
7
8
  import { runEmbeddedTurnForSession } from "../embedded/run-for-session.js";
8
9
  import { inboundMessageLogRequestId } from "../service-inbound-utils.js";
9
10
  //#region src/agent/inbound/inbound-loop.ts
11
+ init_model_usage();
10
12
  init_logger();
11
13
  /** Initial back-off when bus consume fails. Doubles each consecutive failure. */
12
14
  const INBOUND_CONSUME_BASE_BACKOFF_MS = 1e3;
@@ -75,6 +77,9 @@ var InboundLoop = class {
75
77
  this.running = false;
76
78
  }
77
79
  async handleInboundMessage(msg) {
80
+ return withModelUsageOrigin(msg.channel === "system" ? "background" : "interactive", () => this.handleInboundMessageScoped(msg));
81
+ }
82
+ async handleInboundMessageScoped(msg) {
78
83
  await runWithLogContext({ requestId: inboundMessageLogRequestId(msg) }, async () => {
79
84
  const { context, isCommand, command, commandArgs } = await this.cfg.messageRouter.routeMessage(msg);
80
85
  const sessionContext = {
@@ -0,0 +1,3 @@
1
+ export type McpConnectionErrorCode = 'command_missing' | 'connection_refused' | 'host_not_found' | 'timeout' | 'access_denied' | 'network' | 'tls' | 'invalid_response' | 'not_found' | 'rate_limited' | 'configuration' | 'unknown';
2
+ /** Return a safe category without exposing addresses, headers, or credential-bearing errors. */
3
+ export declare function classifyMcpConnectionError(error: unknown): McpConnectionErrorCode;
@@ -0,0 +1,32 @@
1
+ //#region src/agent/mcp/connection-errors.ts
2
+ /** Return a safe category without exposing addresses, headers, or credential-bearing errors. */
3
+ function classifyMcpConnectionError(error) {
4
+ const messages = [];
5
+ const seen = /* @__PURE__ */ new Set();
6
+ let current = error;
7
+ while (current && !seen.has(current) && seen.size < 8) {
8
+ seen.add(current);
9
+ if (typeof current !== "object") {
10
+ messages.push(String(current));
11
+ break;
12
+ }
13
+ const detail = current;
14
+ messages.push(String(detail.message ?? ""), String(detail.code ?? ""));
15
+ current = detail.cause;
16
+ }
17
+ const message = messages.join(" ");
18
+ if (/ENOENT|command not found|executable.{0,30}not found/i.test(message)) return "command_missing";
19
+ if (/ECONNREFUSED|connection refused/i.test(message)) return "connection_refused";
20
+ if (/ENOTFOUND|EAI_AGAIN|could not resolve/i.test(message)) return "host_not_found";
21
+ if (/timeout|timed out|ETIMEDOUT/i.test(message)) return "timeout";
22
+ if (/CERT_|CERTIFICATE|ERR_TLS|UNABLE_TO_VERIFY|DEPTH_ZERO|self.signed|unable to verify/i.test(message)) return "tls";
23
+ if (/\b429\b|too many requests|rate.limit/i.test(message)) return "rate_limited";
24
+ if (/\b(?:401|403)\b|unauthorized|forbidden|permission denied|invalid_token/i.test(message)) return "access_denied";
25
+ if (/\b404\b|\b405\b|method not allowed/i.test(message)) return "not_found";
26
+ if (/ECONNRESET|EHOSTUNREACH|ENETUNREACH|fetch failed|network error|socket.*closed/i.test(message)) return "network";
27
+ if (/content.type|text\/html|invalid json|unexpected token|protocol version|not a valid JSON/i.test(message)) return "invalid_response";
28
+ if (/not configured|invalid configuration|is disabled/i.test(message)) return "configuration";
29
+ return "unknown";
30
+ }
31
+ //#endregion
32
+ export { classifyMcpConnectionError };
@@ -1,9 +1,11 @@
1
1
  import type { Config } from '../../config/schema.js';
2
+ import { type McpConnectionErrorCode } from './connection-errors.js';
2
3
  import { type McpSessionOptions } from './tool-catalog.js';
3
4
  export type McpConnectionProbe = {
4
5
  state: 'connected' | 'oauth_required' | 'token_required' | 'error';
5
6
  toolCount?: number;
6
7
  error?: string;
8
+ errorCode?: McpConnectionErrorCode;
7
9
  };
8
10
  export declare function probeMcpConnection(config: Config, workspace: string, serverId: string, options?: McpSessionOptions): Promise<McpConnectionProbe>;
9
11
  export type McpAuthorization = {
@@ -1,34 +1,44 @@
1
+ import { createLogger } from "../../utils/logger/index.js";
2
+ import { init_logger } from "../../utils/logger.js";
1
3
  import { isManagedConnectorServer } from "../../connectors/materialize.js";
2
4
  import { prepareNativeMcpConfig } from "./native-mcp.js";
5
+ import { classifyMcpConnectionError } from "./connection-errors.js";
3
6
  import { McpAuthenticationRequiredError, discoverMcpTools, signInNativeMcp } from "./tool-catalog.js";
4
7
  import { createHash, randomUUID } from "node:crypto";
5
8
  //#region src/agent/mcp/connection-setup.ts
9
+ init_logger();
10
+ const log = createLogger("McpConnectionSetup");
6
11
  function httpUrl(value) {
7
12
  const url = new URL(value);
8
13
  if (!["http:", "https:"].includes(url.protocol) || url.username || url.password) throw new Error("Use an HTTP or HTTPS MCP address without embedded credentials.");
9
14
  return url;
10
15
  }
11
- async function metadata(url) {
16
+ async function metadata(url, signal) {
12
17
  try {
13
18
  const response = await fetch(url, {
14
- signal: AbortSignal.timeout(5e3),
19
+ signal: signal ? AbortSignal.any([signal, AbortSignal.timeout(5e3)]) : AbortSignal.timeout(5e3),
15
20
  redirect: "error",
16
21
  headers: { Accept: "application/json" }
17
22
  });
18
23
  if (!response.ok) return;
19
24
  const result = await response.json();
20
25
  if (result && typeof result === "object" && !Array.isArray(result)) return result;
21
- } catch {}
26
+ } catch {
27
+ signal?.throwIfAborted();
28
+ }
22
29
  }
23
30
  /** A 401 alone is not evidence that a service supports OAuth. */
24
- async function advertisesOAuth(config, workspace, serverId) {
25
- const entry = (await prepareNativeMcpConfig(config, workspace)).servers.find((server) => server.name === serverId);
31
+ async function advertisesOAuth(config, workspace, serverId, signal) {
32
+ signal?.throwIfAborted();
33
+ const loaded = await prepareNativeMcpConfig(config, workspace);
34
+ signal?.throwIfAborted();
35
+ const entry = loaded.servers.find((server) => server.name === serverId);
26
36
  if (!entry || !("url" in entry.config)) return false;
27
37
  const url = httpUrl(entry.config.url);
28
38
  if (Object.keys(entry.config.headers ?? {}).some((name) => name.toLowerCase() === "authorization")) return false;
29
39
  const response = await fetch(url, {
30
40
  method: "POST",
31
- signal: AbortSignal.timeout(1e4),
41
+ signal: signal ? AbortSignal.any([signal, AbortSignal.timeout(1e4)]) : AbortSignal.timeout(1e4),
32
42
  redirect: "error",
33
43
  headers: {
34
44
  Accept: "application/json, text/event-stream",
@@ -58,7 +68,8 @@ async function advertisesOAuth(config, workspace, serverId) {
58
68
  new URL("/.well-known/oauth-protected-resource", url)
59
69
  ];
60
70
  for (const candidate of candidates) {
61
- const data = await metadata(candidate);
71
+ signal?.throwIfAborted();
72
+ const data = await metadata(candidate, signal);
62
73
  if (data && typeof data.resource === "string" && data.resource === url.href && Array.isArray(data.authorization_servers) && data.authorization_servers.some((value) => {
63
74
  try {
64
75
  return typeof value === "string" && Boolean(httpUrl(value));
@@ -68,7 +79,7 @@ async function advertisesOAuth(config, workspace, serverId) {
68
79
  })) return true;
69
80
  }
70
81
  if (!/\bBearer\b/i.test(challenge)) return false;
71
- const legacy = await metadata(new URL("/.well-known/oauth-authorization-server", url));
82
+ const legacy = await metadata(new URL("/.well-known/oauth-authorization-server", url), signal);
72
83
  return Boolean(legacy && legacy.issuer === url.origin && typeof legacy.authorization_endpoint === "string" && typeof legacy.token_endpoint === "string");
73
84
  }
74
85
  async function probeMcpConnection(config, workspace, serverId, options) {
@@ -78,20 +89,29 @@ async function probeMcpConnection(config, workspace, serverId, options) {
78
89
  toolCount: (await discoverMcpTools(config, workspace, serverId, options)).length
79
90
  };
80
91
  } catch (error) {
81
- if (error instanceof McpAuthenticationRequiredError) try {
82
- return { state: await advertisesOAuth(config, workspace, serverId) ? "oauth_required" : "token_required" };
83
- } catch (error) {
92
+ const failed = (cause) => {
93
+ const errorCode = classifyMcpConnectionError(cause);
94
+ log.warn({
95
+ serverId,
96
+ errorCode
97
+ }, `MCP connection check failed: ${errorCode}`);
84
98
  return {
85
99
  state: "error",
86
- error: error instanceof Error ? error.message : String(error)
100
+ error: cause instanceof Error ? cause.message : String(cause),
101
+ errorCode
87
102
  };
88
- }
89
- const server = config.mcp?.servers?.[serverId];
90
- if (server?.url && Object.keys(server.headers ?? {}).some((name) => name.toLowerCase() === "authorization") && /401|403|unauthorized|forbidden/i.test(String(error))) return { state: "token_required" };
91
- return {
92
- state: "error",
93
- error: error instanceof Error ? error.message : String(error)
94
103
  };
104
+ const server = config.mcp?.servers?.[serverId];
105
+ const rejectedCredential = /\b401\b|unauthorized|invalid_token/i.test(String(error));
106
+ const hasCredentials = server?.auth || Object.keys(server?.headers ?? {}).some((name) => name.toLowerCase() === "authorization");
107
+ if (error instanceof McpAuthenticationRequiredError || server?.url && rejectedCredential && !hasCredentials) try {
108
+ options?.signal?.throwIfAborted();
109
+ return { state: await advertisesOAuth(config, workspace, serverId, options?.signal) ? "oauth_required" : "token_required" };
110
+ } catch (cause) {
111
+ return failed(cause);
112
+ }
113
+ if (server?.url && hasCredentials && /\b(?:401|403)\b|unauthorized|forbidden/i.test(String(error))) return { state: "token_required" };
114
+ return failed(error);
95
115
  }
96
116
  }
97
117
  const attempts = /* @__PURE__ */ new Map();
@@ -2,6 +2,7 @@ import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { init_compaction_types, isCompactionHandover } from "../../session/compaction-types.js";
4
4
  import { buildSessionContextForLlm, init_session_context_for_llm, isTranscriptCompactionEntry } from "../../session/session-context-for-llm.js";
5
+ import { getModelUsageOrigin, init_model_usage, isProviderUsageScopeError } from "../../providers/model-usage.js";
5
6
  import { completeWithResolvedCredentials } from "../../providers/model-call.js";
6
7
  import { estimateMessagesTokens, estimateTextTokens } from "./context-budget.js";
7
8
  import { applyCompactionHandoverDelta, consolidateCompactionHandover, handoverForPrompt, renderCompactionHandover } from "./compaction-ledger.js";
@@ -11,6 +12,7 @@ import { CompactionChunkCursor } from "./compaction-chunks.js";
11
12
  import { COMPACTION_REPAIR_RESERVE, CompactionRequestError, compactionOutputLimit, compactionPayloadGuard, compactionPromptFits, initialCompactionOutputLimit, isPermanentCompactionError } from "./compaction-request.js";
12
13
  import { createHash } from "node:crypto";
13
14
  //#region src/agent/memory/compaction.ts
15
+ init_model_usage();
14
16
  init_session_context_for_llm();
15
17
  init_compaction_types();
16
18
  init_logger();
@@ -397,6 +399,7 @@ Return a valid JSON delta only.`;
397
399
  auditModelRef: reviewed.modelRef
398
400
  };
399
401
  } catch (error) {
402
+ if (isProviderUsageScopeError(error)) throw error;
400
403
  signal?.throwIfAborted();
401
404
  log.warn({
402
405
  err: error,
@@ -521,7 +524,7 @@ Return a JSON delta containing only missing facts, using {"upserts":[]}. Include
521
524
  }, void 0, {
522
525
  operation: "session.compact",
523
526
  conversationId: callContext.conversationId,
524
- trigger: attempt === 0 && modelIndex === 0 ? "system" : "retry"
527
+ trigger: attempt === 0 && modelIndex === 0 ? getModelUsageOrigin() === "interactive" ? "agent" : "system" : "retry"
525
528
  });
526
529
  parentSignal?.throwIfAborted();
527
530
  if (linked.timedOut()) throw new CompactionRequestError("timeout", "Compaction handover timed out");
@@ -554,6 +557,7 @@ Return a JSON delta containing only missing facts, using {"upserts":[]}. Include
554
557
  modelRef: `${model.provider}/${model.id}`
555
558
  };
556
559
  } catch (error) {
560
+ if (isProviderUsageScopeError(error)) throw error;
557
561
  parentSignal?.throwIfAborted();
558
562
  lastError = linked.timedOut() ? new CompactionRequestError("timeout", `Compaction handover timed out after ${this.config.summaryTimeoutMs}ms`) : error;
559
563
  const kind = lastError instanceof CompactionRequestError ? lastError.kind : "provider";
@@ -1,6 +1,8 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { init_model_usage, withModelUsageOrigin } from "../../providers/model-usage.js";
3
4
  //#region src/agent/memory/idle-compaction-scheduler.ts
5
+ init_model_usage();
4
6
  init_logger();
5
7
  const log = createLogger("IdleCompaction");
6
8
  /** Generation checks protect commits even when a provider ignores cancellation. */
@@ -89,7 +91,7 @@ var IdleCompactionScheduler = class {
89
91
  state.deadline = timeout;
90
92
  timeout.unref?.();
91
93
  });
92
- const operation = Promise.resolve().then(() => job(controller.signal, isCurrent));
94
+ const operation = Promise.resolve().then(() => withModelUsageOrigin("background", () => job(controller.signal, isCurrent)));
93
95
  Promise.race([operation, deadline]).then((outcome) => {
94
96
  this.metrics[outcome]++;
95
97
  if (outcome === "committed") state.eligibleAt = Date.now() + options.cooldownMs;
@@ -62,6 +62,7 @@ export declare class ModelManager {
62
62
  * Get model for session, checking session override first
63
63
  */
64
64
  getModelForSession(conversationId: string): string;
65
+ hasSessionModelOverride(conversationId: string): boolean;
65
66
  /**
66
67
  * Apply model to agent if different from current
67
68
  */
@@ -42,8 +42,7 @@ var ModelManager = class {
42
42
  setSessionProfileDefault(conversationId, modelRef, fallbacks = []) {
43
43
  this.sessionProfileDefaults.set(conversationId, modelRef);
44
44
  const cleanFallbacks = fallbacks.map((ref) => ref.trim()).filter(Boolean);
45
- if (cleanFallbacks.length > 0) this.sessionProfileFallbacks.set(conversationId, cleanFallbacks);
46
- else this.sessionProfileFallbacks.delete(conversationId);
45
+ this.sessionProfileFallbacks.set(conversationId, cleanFallbacks);
47
46
  }
48
47
  /**
49
48
  * Register the profile model and return the model that should initialize the
@@ -117,6 +116,9 @@ var ModelManager = class {
117
116
  if (profileDefault) return profileDefault;
118
117
  return this.defaultModel;
119
118
  }
119
+ hasSessionModelOverride(conversationId) {
120
+ return this.sessionModels.has(conversationId);
121
+ }
120
122
  /**
121
123
  * Apply model to agent if different from current
122
124
  */
@@ -1,9 +1,3 @@
1
- /**
2
- * Agent Orchestrator - Coordinates Agent execution flow
3
- *
4
- * Manages the complete agent execution pipeline from message processing
5
- * to response generation.
6
- */
7
1
  import type { Config } from '../../config/schema.js';
8
2
  import type { InboundMessage } from '../../infra/bus/index.js';
9
3
  import type { SessionConfigStore, SessionStore } from '../../session/index.js';
@@ -52,6 +46,7 @@ export declare class AgentOrchestrator {
52
46
  * Process a message through the agent orchestration pipeline
53
47
  */
54
48
  process(msg: InboundMessage, context: SessionContext): Promise<void>;
49
+ private processScoped;
55
50
  /**
56
51
  * Get the current agent model ID
57
52
  */
@@ -1,5 +1,6 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { init_model_usage, modelUsageOriginFromTurn, withModelUsageOrigin } from "../../providers/model-usage.js";
3
4
  import { abortEmbeddedRun } from "../embedded/runs.js";
4
5
  import { persistInboundAttachments } from "../../channels/attachments/inbound-persist.js";
5
6
  import { buildTranscriptUserMessage, clearPendingTranscriptUserMessage, hydrateUserTurnForLlm, setPendingTranscriptUserMessage } from "../inbound/attachment-pipeline.js";
@@ -13,6 +14,7 @@ import { randomUUID } from "node:crypto";
13
14
  * Manages the complete agent execution pipeline from message processing
14
15
  * to response generation.
15
16
  */
17
+ init_model_usage();
16
18
  init_logger();
17
19
  const log = createLogger("AgentOrchestrator");
18
20
  var AgentOrchestrator = class {
@@ -42,6 +44,9 @@ var AgentOrchestrator = class {
42
44
  * Process a message through the agent orchestration pipeline
43
45
  */
44
46
  async process(msg, context) {
47
+ return withModelUsageOrigin(modelUsageOriginFromTurn(context.origin), () => this.processScoped(msg, context));
48
+ }
49
+ async processScoped(msg, context) {
45
50
  const { conversationId } = context;
46
51
  log.debug({ conversationId }, "Processing message through agent orchestrator");
47
52
  await this.sessionHydrator.workspace(conversationId);
@@ -1,13 +1,18 @@
1
+ import { init_model_usage, modelUsageOriginFromTurn, withModelUsageOrigin } from "../../providers/model-usage.js";
1
2
  import { clearPendingTranscriptUserMessage, setPendingTranscriptUserMessage } from "../inbound/attachment-pipeline.js";
2
3
  import { initSessionTurn } from "../../session/init-session-turn.js";
3
4
  import "../../session/index.js";
4
5
  import { buildDirectUserMessageContent } from "./build-direct-message-content.js";
5
6
  import { hydratePerTurnState, runDirectAgentTurn, tryRunSlashCommand } from "./direct-turn-helpers.js";
6
7
  //#region src/agent/service/process-direct-one-shot.ts
8
+ init_model_usage();
7
9
  function isReviewOutput(value) {
8
10
  return !!value && typeof value === "object" && !Array.isArray(value) && value.type === "review";
9
11
  }
10
12
  async function runProcessDirect(deps, input) {
13
+ return withModelUsageOrigin(modelUsageOriginFromTurn(input.origin), () => runProcessDirectInner(deps, input));
14
+ }
15
+ async function runProcessDirectInner(deps, input) {
11
16
  deps.sessionStore?.idleCompaction?.interrupt(input.conversationId);
12
17
  const { channel, chatId } = await deps.resolveSessionEndpoint(input.conversationId);
13
18
  deps.initSessionContext(input.conversationId, channel, chatId, input.origin);
@@ -77,4 +77,5 @@ export type ProcessDirectStreamEvent = {
77
77
  type: string;
78
78
  [key: string]: unknown;
79
79
  };
80
+ /** Bind each generator advancement so independent streams retain their own origin. */
80
81
  export declare function runProcessDirectStreaming(deps: ProcessDirectStreamingDeps, input: ProcessDirectStreamingInput): AsyncGenerator<ProcessDirectStreamEvent, void, unknown>;
@@ -5,6 +5,7 @@ import { getClarificationResumeInput, init_clarification_wait_repository } from
5
5
  import { getConnectionResumeInput, init_connection_wait_repository } from "../../storage/sqlite/connection-wait-repository.js";
6
6
  import { init_agent_scope, resolveDefaultAgentId } from "../agent-scope.js";
7
7
  import { init_agent_session_key, resolveAgentMainConversationId } from "../../routing/agent-session-key.js";
8
+ import { init_model_usage, modelUsageOriginFromTurn, withModelUsageOrigin } from "../../providers/model-usage.js";
8
9
  import { readAgentMessageContent } from "../memory/agent-message-access.js";
9
10
  import { abortEmbeddedRun } from "../embedded/runs.js";
10
11
  import { clearPendingTranscriptUserMessage, setPendingTranscriptUserMessage } from "../inbound/attachment-pipeline.js";
@@ -24,6 +25,7 @@ import { AsyncQueue, AsyncQueueOverflowError } from "./async-queue.js";
24
25
  import { hydratePerTurnState, runDirectAgentTurn, tryRunSlashCommand } from "./direct-turn-helpers.js";
25
26
  import { isSuccessfulWebchatTtsToolEvent } from "./webchat-tts.js";
26
27
  //#region src/agent/service/process-direct-streaming.ts
28
+ init_model_usage();
27
29
  init_agent_session_key();
28
30
  init_agent_scope();
29
31
  init_src();
@@ -137,7 +139,7 @@ function pushAssistantReceipt(queue, text, runId, metadata) {
137
139
  message
138
140
  });
139
141
  }
140
- async function* runProcessDirectStreaming(deps, input) {
142
+ async function* runProcessDirectStreamingInner(deps, input) {
141
143
  const conversationId = input.conversationId ?? resolveAgentMainConversationId({ agentId: resolveDefaultAgentId() });
142
144
  deps.sessionStore?.idleCompaction?.interrupt(conversationId);
143
145
  const isConnectionResume = Boolean(input.runId && getConnectionResumeInput(conversationId, input.runId));
@@ -445,5 +447,19 @@ async function* runProcessDirectStreaming(deps, input) {
445
447
  deps.endDirectRequestContext();
446
448
  }
447
449
  }
450
+ /** Bind each generator advancement so independent streams retain their own origin. */
451
+ async function* runProcessDirectStreaming(deps, input) {
452
+ const iterator = runProcessDirectStreamingInner(deps, input);
453
+ const origin = modelUsageOriginFromTurn(input.origin);
454
+ try {
455
+ while (true) {
456
+ const result = await withModelUsageOrigin(origin, () => iterator.next());
457
+ if (result.done) return;
458
+ yield result.value;
459
+ }
460
+ } finally {
461
+ await withModelUsageOrigin(origin, () => iterator.return());
462
+ }
463
+ }
448
464
  //#endregion
449
465
  export { runProcessDirectStreaming };
@@ -195,10 +195,14 @@ function createImageGenerateTool(options) {
195
195
  });
196
196
  if (!imageGenerationModelConfig) return null;
197
197
  const effectiveCfg = applyImageGenerationModelConfigDefaults(options.config, imageGenerationModelConfig) ?? options.config;
198
+ const primaryRef = imageGenerationModelConfig.primary;
199
+ const primaryProvider = primaryRef ? getImageGenerationProvider(primaryRef.slice(0, primaryRef.indexOf("/"))) : void 0;
200
+ const primaryModel = primaryRef?.slice(primaryRef.indexOf("/") + 1);
201
+ const capabilities = primaryModel ? primaryProvider?.modelCapabilities?.[primaryModel] ?? primaryProvider?.capabilities : void 0;
198
202
  return {
199
203
  name: "image_generate",
200
204
  label: "Image Generation",
201
- description: "Generate and attach images with the configured image-generation model. Use action=\"list\" to see providers. Also saves files under workspace/media/generated/. Do not call send_media for generated images.",
205
+ description: `Generate and attach images with the configured image-generation model (${primaryRef}). ${capabilities ? `Configured model capabilities: ${JSON.stringify(capabilities)}. ` : ""}Omit optional image parameters unless needed. Keep the configured model unless the user asks for another provider/model. Use action="list" to see providers. Also saves files under workspace/media/generated/. Do not call send_media for generated images.`,
202
206
  parameters: ImageGenerateToolSchema,
203
207
  async execute(_toolCallId, args) {
204
208
  const params = args;
@@ -55,10 +55,15 @@ function resolveEffectiveAgentConfig(params) {
55
55
  const models = {
56
56
  chat: structuredClone(agent.models?.chat ?? defaults.models.chat),
57
57
  intents,
58
+ ...agent.models?.background === null ? {} : agent.models?.background ?? defaults.models.background ? { background: structuredClone(agent.models?.background ?? defaults.models.background) } : {},
58
59
  ...agent.models?.computerUse ?? defaults.models.computerUse ? { computerUse: structuredClone(agent.models?.computerUse ?? defaults.models.computerUse) } : {},
59
60
  ...agent.models?.imageUnderstanding === null ? {} : agent.models?.imageUnderstanding ? { imageUnderstanding: structuredClone(agent.models.imageUnderstanding) } : defaults.models.imageUnderstanding ? { imageUnderstanding: structuredClone(defaults.models.imageUnderstanding) } : {},
60
61
  ...agent.models?.imageGeneration === null ? {} : agent.models?.imageGeneration ? { imageGeneration: structuredClone(agent.models.imageGeneration) } : defaults.models.imageGeneration ? { imageGeneration: structuredClone(defaults.models.imageGeneration) } : {}
61
62
  };
63
+ if (agent.models && Object.hasOwn(agent.models, "background")) {
64
+ clearSources("models.background", sources);
65
+ if (agent.models.background) markObjectSources(agent.models.background, "agent", "models.background", sources);
66
+ }
62
67
  if (agent.models?.chat) markObjectSources(agent.models.chat, "agent", "models.chat", sources);
63
68
  if (agent.models?.computerUse) {
64
69
  clearSources("models.computerUse", sources);
@@ -24,9 +24,9 @@ export declare const ComputerModelRouteSchema: z.ZodObject<{
24
24
  export declare const ModelIntentSchema: z.ZodEnum<{
25
25
  review: "review";
26
26
  coding: "coding";
27
+ vision: "vision";
27
28
  fast: "fast";
28
29
  reasoning: "reasoning";
29
- vision: "vision";
30
30
  understanding: "understanding";
31
31
  }>;
32
32
  export declare const AgentModelsDefaultsSchema: z.ZodObject<{
@@ -34,12 +34,16 @@ export declare const AgentModelsDefaultsSchema: z.ZodObject<{
34
34
  primary: z.ZodString;
35
35
  fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
36
36
  }, z.core.$strict>;
37
+ background: z.ZodOptional<z.ZodObject<{
38
+ primary: z.ZodString;
39
+ fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
40
+ }, z.core.$strict>>;
37
41
  intents: z.ZodDefault<z.ZodRecord<z.ZodEnum<{
38
42
  review: "review";
39
43
  coding: "coding";
44
+ vision: "vision";
40
45
  fast: "fast";
41
46
  reasoning: "reasoning";
42
- vision: "vision";
43
47
  understanding: "understanding";
44
48
  }> & z.core.$partial, z.ZodObject<{
45
49
  primary: z.ZodString;
@@ -65,12 +69,16 @@ export declare const AgentModelsOverrideSchema: z.ZodObject<{
65
69
  primary: z.ZodString;
66
70
  fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
67
71
  }, z.core.$strict>>;
72
+ background: z.ZodOptional<z.ZodNullable<z.ZodObject<{
73
+ primary: z.ZodString;
74
+ fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
75
+ }, z.core.$strict>>>;
68
76
  intents: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
69
77
  review: "review";
70
78
  coding: "coding";
79
+ vision: "vision";
71
80
  fast: "fast";
72
81
  reasoning: "reasoning";
73
- vision: "vision";
74
82
  understanding: "understanding";
75
83
  }> & z.core.$partial, z.ZodNullable<z.ZodObject<{
76
84
  primary: z.ZodString;
@@ -184,12 +192,16 @@ export declare const AgentDefaultsSchema: z.ZodObject<{
184
192
  primary: z.ZodString;
185
193
  fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
186
194
  }, z.core.$strict>;
195
+ background: z.ZodOptional<z.ZodObject<{
196
+ primary: z.ZodString;
197
+ fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
198
+ }, z.core.$strict>>;
187
199
  intents: z.ZodDefault<z.ZodRecord<z.ZodEnum<{
188
200
  review: "review";
189
201
  coding: "coding";
202
+ vision: "vision";
190
203
  fast: "fast";
191
204
  reasoning: "reasoning";
192
- vision: "vision";
193
205
  understanding: "understanding";
194
206
  }> & z.core.$partial, z.ZodObject<{
195
207
  primary: z.ZodString;
@@ -424,12 +436,16 @@ export declare const AgentEntrySchema: z.ZodObject<{
424
436
  primary: z.ZodString;
425
437
  fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
426
438
  }, z.core.$strict>>;
439
+ background: z.ZodOptional<z.ZodNullable<z.ZodObject<{
440
+ primary: z.ZodString;
441
+ fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
442
+ }, z.core.$strict>>>;
427
443
  intents: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
428
444
  review: "review";
429
445
  coding: "coding";
446
+ vision: "vision";
430
447
  fast: "fast";
431
448
  reasoning: "reasoning";
432
- vision: "vision";
433
449
  understanding: "understanding";
434
450
  }> & z.core.$partial, z.ZodNullable<z.ZodObject<{
435
451
  primary: z.ZodString;
@@ -590,12 +606,16 @@ export declare const EffectiveAgentConfigSchema: z.ZodObject<{
590
606
  primary: z.ZodString;
591
607
  fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
592
608
  }, z.core.$strict>;
609
+ background: z.ZodOptional<z.ZodObject<{
610
+ primary: z.ZodString;
611
+ fallbacks: z.ZodDefault<z.ZodArray<z.ZodString>>;
612
+ }, z.core.$strict>>;
593
613
  intents: z.ZodDefault<z.ZodRecord<z.ZodEnum<{
594
614
  review: "review";
595
615
  coding: "coding";
616
+ vision: "vision";
596
617
  fast: "fast";
597
618
  reasoning: "reasoning";
598
- vision: "vision";
599
619
  understanding: "understanding";
600
620
  }> & z.core.$partial, z.ZodObject<{
601
621
  primary: z.ZodString;
@@ -43,6 +43,7 @@ var init_schema = __esmMin((() => {
43
43
  ModelIntentOverridesSchema = z.partialRecord(ModelIntentSchema, ModelRouteSchema.nullable());
44
44
  AgentModelsDefaultsSchema = z.object({
45
45
  chat: ModelRouteSchema,
46
+ background: ModelRouteSchema.optional(),
46
47
  intents: ModelIntentRoutesSchema.default({}),
47
48
  imageUnderstanding: ModelRouteSchema.optional(),
48
49
  computerUse: ComputerModelRouteSchema.optional(),
@@ -50,6 +51,7 @@ var init_schema = __esmMin((() => {
50
51
  }).strict();
51
52
  AgentModelsOverrideSchema = z.object({
52
53
  chat: ModelRouteSchema.optional(),
54
+ background: ModelRouteSchema.nullable().optional(),
53
55
  intents: ModelIntentOverridesSchema.optional(),
54
56
  imageUnderstanding: ModelRouteSchema.nullable().optional(),
55
57
  computerUse: ComputerModelRouteSchema.nullable().optional(),
@@ -1,11 +1,8 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
4
- import { createExtensionAwareStreamFn } from "../providers/extension-stream-bridge.js";
5
- import { trackAiUsageStream } from "../usage/recorder.js";
6
- import { isLocalModelBaseUrl, resolveModelCallApiKey, resolveModelCallOptions } from "../providers/model-call.js";
4
+ import { createResolvedModelStream, isLocalModelBaseUrl, resolveModelCallApiKey } from "../providers/model-call.js";
7
5
  import { getAssistantMessageErrorReason, stripCodeFences } from "../providers/model-response.js";
8
- import { normalizeContext } from "@earendil-works/pi-ai";
9
6
  //#region src/ai-assist/text-assist.ts
10
7
  init_providers();
11
8
  init_logger();
@@ -228,28 +225,20 @@ async function* streamTextAssist(request, config, signal) {
228
225
  };
229
226
  const scenario = scenarioFromRequest(resolvedRequest);
230
227
  const model = resolveModel(getDefaultModelSync(config));
231
- const prompt = buildPrompt(resolvedRequest, scenario);
232
- const modelCallOptions = await resolveModelCallOptions(model, {
228
+ const stream = await createResolvedModelStream(model, buildPrompt(resolvedRequest, scenario), {
233
229
  maxTokens: 1600,
234
230
  temperature: intent === "fix" ? .15 : .25,
235
231
  signal
232
+ }, void 0, {
233
+ operation: "text_assist.generate",
234
+ trigger: "user"
236
235
  });
237
- log.debug({
238
- provider: model.provider,
239
- modelId: model.id,
240
- hasApiKey: Boolean(modelCallOptions.apiKey),
241
- localBaseUrl: isLocalModelBaseUrl(model.baseUrl)
242
- }, "Resolved AI text assist model auth");
243
236
  yield {
244
237
  type: "start",
245
238
  provider: model.provider,
246
239
  modelId: model.id,
247
240
  scenario: scenario.id
248
241
  };
249
- const stream = await trackAiUsageStream(model, {
250
- operation: "text_assist.generate",
251
- trigger: "user"
252
- }, () => createExtensionAwareStreamFn()(model, normalizeContext(prompt), modelCallOptions));
253
242
  let streamedText = "";
254
243
  for await (const event of stream) {
255
244
  const streamEvent = event;
@@ -3,8 +3,10 @@ import { init_logger } from "../../utils/logger.js";
3
3
  import { normalizeAgentId } from "../../agent-catalog/id.js";
4
4
  import { init_agent_scope } from "../../agent/agent-scope.js";
5
5
  import { init_session_key, resolveConversationId } from "../../routing/session-key.js";
6
+ import { init_model_usage, withModelUsageOrigin } from "../../providers/model-usage.js";
6
7
  import { resolveAutomationTimeoutSeconds } from "../domain/defaults.js";
7
8
  //#region src/automations/service/action-executor.ts
9
+ init_model_usage();
8
10
  init_agent_scope();
9
11
  init_session_key();
10
12
  init_logger();
@@ -111,7 +113,7 @@ var AutomationActionExecutor = class {
111
113
  const deadlineAtMs = run.deadlineAtMs ?? Date.now() + configuredTimeoutMs;
112
114
  const timeoutMs = Math.max(1, deadlineAtMs - Date.now());
113
115
  await hooks.onRunPatch?.({ deadlineAtMs });
114
- return executeWithDeadline((deadlineSignal) => this.executeWithoutTimeout(automation, run, deadlineSignal, hooks, deadlineAtMs, context), timeoutMs, signal, deadlineAtMs).catch((err) => {
116
+ return withModelUsageOrigin("background", () => executeWithDeadline((deadlineSignal) => this.executeWithoutTimeout(automation, run, deadlineSignal, hooks, deadlineAtMs, context), timeoutMs, signal, deadlineAtMs)).catch((err) => {
115
117
  const message = err instanceof Error ? err.message : String(err);
116
118
  if (err instanceof AutomationExecutionStoppedError) return {
117
119
  status: err.status,