@xopcai/xopc 0.0.389 → 0.0.391

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 (321) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{activity-store-dvik6t7Z.js → activity-store-DWQCDi8M.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-bWMd5TDC.js → agent-avatar-dicebear-CzS0TUv9.js} +1 -1
  5. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-DE910MyU.js +1 -0
  6. package/dist/gateway/static/root/assets/{agent-plugin-dialog-UunIxc1q.js → agent-plugin-dialog-0SlvsYl7.js} +1 -1
  7. package/dist/gateway/static/root/assets/agents-BZh28Qn1.js +77 -0
  8. package/dist/gateway/static/root/assets/{agents-admin-api-BlNGyXpm.js → agents-admin-api-Bb3Kvz3X.js} +1 -1
  9. package/dist/gateway/static/root/assets/app-management-settings-panel-9A7JN5V5.js +1 -0
  10. package/dist/gateway/static/root/assets/{appearance-settings-CUAdx44v.js → appearance-settings-BPdLEo6L.js} +1 -1
  11. package/dist/gateway/static/root/assets/{apps-page-D5zDB6gp.js → apps-page-Cz7LypV9.js} +1 -1
  12. package/dist/gateway/static/root/assets/{archive-plugin-Du6dJNcl.js → archive-plugin-DFnHPNie.js} +1 -1
  13. package/dist/gateway/static/root/assets/{automations-page-BO8Ig5Z4.js → automations-page-CnBLPVNh.js} +1 -1
  14. package/dist/gateway/static/root/assets/automations-workspace-BBjS-sk-.js +6 -0
  15. package/dist/gateway/static/root/assets/{binary-plugins-D7VJjwnr.js → binary-plugins-BQC0Tzoi.js} +1 -1
  16. package/dist/gateway/static/root/assets/{block-editor-CaJlWTAn.js → block-editor-DSh5019z.js} +4 -4
  17. package/dist/gateway/static/root/assets/{browser-automation-inputs-iyMBJmQX.js → browser-automation-inputs-C5tIrIRL.js} +1 -1
  18. package/dist/gateway/static/root/assets/browser-automations-page-CFCMNfJN.js +3 -0
  19. package/dist/gateway/static/root/assets/browser-settings-page-C__tyPwu.js +3 -0
  20. package/dist/gateway/static/root/assets/{capabilities-CEH1AnXc.js → capabilities-D6RJG4QY.js} +1 -1
  21. package/dist/gateway/static/root/assets/{capabilities-MCKRMZDK.js → capabilities-DGEmBQnF.js} +1 -1
  22. package/dist/gateway/static/root/assets/capabilities-page-B5AZa7ir.js +2 -0
  23. package/dist/gateway/static/root/assets/capabilities-settings-panel-Dskz2_bh.js +8 -0
  24. package/dist/gateway/static/root/assets/{capability-header-actions-BIA0Lwt5.js → capability-header-actions-xzjWZVbg.js} +1 -1
  25. package/dist/gateway/static/root/assets/channels-DRse_dD3.js +1 -0
  26. package/dist/gateway/static/root/assets/chat-terminal-dock-CQF0M4kE.js +36 -0
  27. package/dist/gateway/static/root/assets/{computer-settings-page-DvY3zgyY.js → computer-settings-page-ZfzCTS0N.js} +1 -1
  28. package/dist/gateway/static/root/assets/{connector-service-page-St2-Fj3y.js → connector-service-page-CwAeWVLK.js} +1 -1
  29. package/dist/gateway/static/root/assets/connectors-page-CanakKaj.js +1 -0
  30. package/dist/gateway/static/root/assets/{date-picker-C0-D80ny.js → date-picker-hmJlEAQZ.js} +1 -1
  31. package/dist/gateway/static/root/assets/{dependency-picker-CNd7mwMU.js → dependency-picker-Us_Juz6I.js} +1 -1
  32. package/dist/gateway/static/root/assets/{desktop-pet-C-2wDANn.js → desktop-pet-CvOTI4uw.js} +1 -1
  33. package/dist/gateway/static/root/assets/{desktop-pet-settings-DyhxLrdJ.js → desktop-pet-settings-DYg-Gb8t.js} +1 -1
  34. package/dist/gateway/static/root/assets/device-pairing-wizard-B1FbZ8C1.js +1 -0
  35. package/dist/gateway/static/root/assets/{directory-picker-path-field-CNivVIPT.js → directory-picker-path-field-DZN9EDvM.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-debug-page-CGYO3JPw.js → extension-debug-page-YIibp6Kk.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-page-Dc51ALAg.js → extension-page-DkcGyb28.js} +1 -1
  38. package/dist/gateway/static/root/assets/{extension-provider-BXPILdlw.js → extension-provider-B1PQGTtY.js} +1 -1
  39. package/dist/gateway/static/root/assets/extension-settings-page-C_rJiSKo.js +1 -0
  40. package/dist/gateway/static/root/assets/{gateway-config-swr-Bc2MytsF.js → gateway-config-swr-Dv_A5FMu.js} +1 -1
  41. package/dist/gateway/static/root/assets/{gateway-realtime-BFK-vlME.js → gateway-realtime-DghCGfY_.js} +1 -1
  42. package/dist/gateway/static/root/assets/gateway-realtime-store-CMJVSnvi.js +1 -0
  43. package/dist/gateway/static/root/assets/gateway-settings-CjCWPHNJ.js +1 -0
  44. package/dist/gateway/static/root/assets/{gateway-startup-retry-BDPMttPx.js → gateway-startup-retry-CkTVSESs.js} +1 -1
  45. package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-DAlRGMge.js → highlighted-body-KQOG7T2V-DV2wNqBn.js} +1 -1
  46. package/dist/gateway/static/root/assets/home-page-fAYsd7kG.js +2 -0
  47. package/dist/gateway/static/root/assets/image-generation-api-B98iXt6A.js +1 -0
  48. package/dist/gateway/static/root/assets/imports-page-DoBCBN8G.js +1 -0
  49. package/dist/gateway/static/root/assets/index-DFgXwLsv.js +260 -0
  50. package/dist/gateway/static/root/assets/index-a6ZvhclR.css +1 -0
  51. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BYYC9Qmw.js → keyboard-shortcuts-settings-DXVu4lqV.js} +1 -1
  52. package/dist/gateway/static/root/assets/local-app-workbench-page-B3fz6uRi.js +1 -0
  53. package/dist/gateway/static/root/assets/{local-apps-page-BU8pUsVM.js → local-apps-page-BC6xhmUh.js} +1 -1
  54. package/dist/gateway/static/root/assets/{local-session-drafts-kFc_MAA9.js → local-session-drafts-DFnZQu9A.js} +1 -1
  55. package/dist/gateway/static/root/assets/{locale-store-Dr43FCty.js → locale-store-BpK9AiDq.js} +1 -1
  56. package/dist/gateway/static/root/assets/logs-page-CSqSFDRU.js +2 -0
  57. package/dist/gateway/static/root/assets/management-settings-gq5L0THs.js +1 -0
  58. package/dist/gateway/static/root/assets/{markdown-view-CdKlPjJM.js → markdown-view-IsYTotu6.js} +18 -18
  59. package/dist/gateway/static/root/assets/{media-plugins-DE9zt88i.js → media-plugins-oSChWbcP.js} +1 -1
  60. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-C_QKwqDN.js +1 -0
  61. package/dist/gateway/static/root/assets/messages-CKTo_sIF.js +3 -0
  62. package/dist/gateway/static/root/assets/models-hub-cache-TjpL7hZ5.js +1 -0
  63. package/dist/gateway/static/root/assets/note-detail-panel-CdpNXre-.js +5 -0
  64. package/dist/gateway/static/root/assets/{notes-api-BHouNL6-.js → notes-api-CBb944yw.js} +1 -1
  65. package/dist/gateway/static/root/assets/notes-page-EGvGw8MN.js +8 -0
  66. package/dist/gateway/static/root/assets/{page-context-capture-button-TQr8NnSc.js → page-context-capture-button-CoWb7BYP.js} +1 -1
  67. package/dist/gateway/static/root/assets/personal-page-DYzbNTyN.js +1 -0
  68. package/dist/gateway/static/root/assets/{product-open-page-BEl6syFp.js → product-open-page-CTyy7H7-.js} +1 -1
  69. package/dist/gateway/static/root/assets/{product-preview-content-BxSHnbqz.js → product-preview-content-D4xqTaEy.js} +1 -1
  70. package/dist/gateway/static/root/assets/project-detail-page-DIVCw0QQ.js +1 -0
  71. package/dist/gateway/static/root/assets/projects-page-B4L9VnBN.js +1 -0
  72. package/dist/gateway/static/root/assets/{registry-api-BD5IgDOA.js → registry-api-Dsa2LvRt.js} +1 -1
  73. package/dist/gateway/static/root/assets/remote-access-hub-B8PvgLVz.js +1 -0
  74. package/dist/gateway/static/root/assets/{runtime-tools-api-CjTRoQWT.js → runtime-tools-api-C2Uw89eY.js} +1 -1
  75. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Bqnp3tyt.js +1 -0
  76. package/dist/gateway/static/root/assets/scenes-page-D50g4GM2.js +2 -0
  77. package/dist/gateway/static/root/assets/{schema-form-ByG-R6N2.js → schema-form-h_RCNfiO.js} +1 -1
  78. package/dist/gateway/static/root/assets/{send-session-input-UAVStisp.js → send-session-input-DypbVTT7.js} +1 -1
  79. package/dist/gateway/static/root/assets/{session-api-DvgEiNRS.js → session-api-ga-SUOq_.js} +1 -1
  80. package/dist/gateway/static/root/assets/{session-manager-BOb1tC_Z.js → session-manager-C_OiKblh.js} +8 -8
  81. package/dist/gateway/static/root/assets/sessions-page-BsqDIbIr.js +1 -0
  82. package/dist/gateway/static/root/assets/settings-advanced-gate-D3zJAW4p.js +1 -0
  83. package/dist/gateway/static/root/assets/{settings-page-C1e9m23j.js → settings-page-DPCgrICd.js} +1 -1
  84. package/dist/gateway/static/root/assets/setup-status-panel-jjSYJpDd.js +1 -0
  85. package/dist/gateway/static/root/assets/{share-link-dialog-kE_6v5Dp.js → share-link-dialog-BGicglAS.js} +1 -1
  86. package/dist/gateway/static/root/assets/{share-preview-page-BT-_yR1h.js → share-preview-page-BORe9rLB.js} +1 -1
  87. package/dist/gateway/static/root/assets/{shares-api-Dg_SqHQE.js → shares-api-Dbx3z6-1.js} +1 -1
  88. package/dist/gateway/static/root/assets/shares-settings-C13FgfWk.js +1 -0
  89. package/dist/gateway/static/root/assets/{skill-api-BslUYMnX.js → skill-api-Cq6O1DZK.js} +1 -1
  90. package/dist/gateway/static/root/assets/{skill-reload-api-BQ2rTOP1.js → skill-reload-api-Cq7QDjMA.js} +1 -1
  91. package/dist/gateway/static/root/assets/skills-page-BM1ShEjx.js +2 -0
  92. package/dist/gateway/static/root/assets/{system-settings-panel-GpbPfWwo.js → system-settings-panel-BNCGFO1e.js} +1 -1
  93. package/dist/gateway/static/root/assets/task-detail-page-4VG82wcF.js +2 -0
  94. package/dist/gateway/static/root/assets/{task-expandable-content-DJrrEBB4.js → task-expandable-content-DAZGz5YC.js} +1 -1
  95. package/dist/gateway/static/root/assets/{theme-store-BKpYnggg.js → theme-store-Db7hDESt.js} +1 -1
  96. package/dist/gateway/static/root/assets/{tracing-settings-page-D71w7dwV.js → tracing-settings-page-C6p2Mu92.js} +1 -1
  97. package/dist/gateway/static/root/assets/{tunnel-api-BV46CvS8.js → tunnel-api-Dw15EJp0.js} +1 -1
  98. package/dist/gateway/static/root/assets/usage-page-DDrIqgGe.js +1 -0
  99. package/dist/gateway/static/root/assets/{use-autosave-CzyqRffr.js → use-autosave-DDjIdW4U.js} +1 -1
  100. package/dist/gateway/static/root/assets/{use-composer-attachments-Dviq-1f6.js → use-composer-attachments-DNl7O3Vb.js} +1 -1
  101. package/dist/gateway/static/root/assets/{use-file-preview-expanded-D5Kk7Hon.js → use-file-preview-expanded-DMHehhwG.js} +2 -2
  102. package/dist/gateway/static/root/assets/user-model-page-CaS9dOIr.js +2 -0
  103. package/dist/gateway/static/root/assets/{voice-api-key-field-DWtbmacd.js → voice-api-key-field-ByAxHE4P.js} +1 -1
  104. package/dist/gateway/static/root/assets/{voice-config-api-DnIjZm_9.js → voice-config-api-Dl39b27p.js} +1 -1
  105. package/dist/gateway/static/root/assets/voice-transcribe-api-CVaU83Jc.js +1 -0
  106. package/dist/gateway/static/root/assets/{work-discovery-overlay-ChEG71hz.js → work-discovery-overlay-BvVvPA1T.js} +1 -1
  107. package/dist/gateway/static/root/assets/workflow-run-setup-panel-BcFm9QcC.js +3 -0
  108. package/dist/gateway/static/root/assets/workflows-page-DMec_XZB.js +6 -0
  109. package/dist/gateway/static/root/assets/{workspace-api-CZDvu7uA.js → workspace-api-BpfKsrtP.js} +2 -2
  110. package/dist/gateway/static/root/assets/{xopc-cloud-account-card-CbUgg1SK.js → xopc-cloud-account-card-CU5lzzE9.js} +1 -1
  111. package/dist/gateway/static/root/index.html +28 -35
  112. package/dist/package.js +1 -1
  113. package/dist/packages/gateway-contract/src/discussions.js +3 -2
  114. package/dist/packages/gateway-contract/src/index.js +4 -0
  115. package/dist/packages/gateway-contract/src/provider-setup.js +6 -0
  116. package/dist/packages/gateway-contract/src/recording-outcome.js +6 -0
  117. package/dist/packages/image-providers/src/catalog.js +10 -0
  118. package/dist/packages/image-providers/src/execute.js +5 -1
  119. package/dist/packages/image-providers/src/validation.js +19 -1
  120. package/dist/src/agent/agent-manager.d.ts +1 -0
  121. package/dist/src/agent/agent-manager.js +4 -1
  122. package/dist/src/agent/background-review/run-background-review.d.ts +0 -1
  123. package/dist/src/agent/background-review/run-background-review.js +10 -2
  124. package/dist/src/agent/context/execution-scope.js +1 -1
  125. package/dist/src/agent/embedded/execution-tool-policy.d.ts +2 -0
  126. package/dist/src/agent/embedded/execution-tool-policy.js +8 -3
  127. package/dist/src/agent/embedded/run-for-session.js +26 -3
  128. package/dist/src/agent/embedded/run-turn.js +14 -1
  129. package/dist/src/agent/embedded/session-runner.js +1 -1
  130. package/dist/src/agent/embedded/xopc-stream-bridge.js +3 -0
  131. package/dist/src/agent/image/generation/runtime.js +12 -14
  132. package/dist/src/agent/image/understanding/runtime.js +5 -0
  133. package/dist/src/agent/inbound/inbound-loop.d.ts +1 -15
  134. package/dist/src/agent/inbound/inbound-loop.js +5 -0
  135. package/dist/src/agent/mcp/connection-errors.d.ts +3 -0
  136. package/dist/src/agent/mcp/connection-errors.js +32 -0
  137. package/dist/src/agent/mcp/connection-setup.d.ts +2 -0
  138. package/dist/src/agent/mcp/connection-setup.js +38 -18
  139. package/dist/src/agent/memory/compaction.js +5 -1
  140. package/dist/src/agent/memory/idle-compaction-scheduler.js +3 -1
  141. package/dist/src/agent/models/manager.d.ts +1 -0
  142. package/dist/src/agent/models/manager.js +4 -2
  143. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +1 -6
  144. package/dist/src/agent/orchestration/agent-orchestrator.js +5 -0
  145. package/dist/src/agent/service/process-direct-one-shot.js +5 -0
  146. package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
  147. package/dist/src/agent/service/process-direct-streaming.js +17 -1
  148. package/dist/src/agent/tools/factory.js +14 -12
  149. package/dist/src/agent/tools/image-generate-tool.js +5 -1
  150. package/dist/src/agent/tools/personal-read-tool.js +4 -0
  151. package/dist/src/agent/tools/task-collaboration-tool.js +1 -1
  152. package/dist/src/agent-config/resolver.js +5 -0
  153. package/dist/src/agent-config/schema.d.ts +26 -6
  154. package/dist/src/agent-config/schema.js +2 -0
  155. package/dist/src/ai-assist/text-assist.js +5 -16
  156. package/dist/src/automations/service/action-executor.js +3 -1
  157. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  158. package/dist/src/config/agent-model-intents.js +4 -1
  159. package/dist/src/config/schema.d.ts +11 -5
  160. package/dist/src/config/schema.js +11 -3
  161. package/dist/src/discussions/analyzer.d.ts +2 -0
  162. package/dist/src/discussions/analyzer.js +38 -9
  163. package/dist/src/discussions/audio-clip.d.ts +3 -0
  164. package/dist/src/discussions/audio-clip.js +72 -0
  165. package/dist/src/discussions/live-worker.js +3 -1
  166. package/dist/src/discussions/long-review.d.ts +17 -0
  167. package/dist/src/discussions/long-review.js +278 -0
  168. package/dist/src/discussions/media-timeline.d.ts +21 -0
  169. package/dist/src/discussions/media-timeline.js +134 -0
  170. package/dist/src/discussions/organizer-worker.d.ts +4 -1
  171. package/dist/src/discussions/organizer-worker.js +17 -12
  172. package/dist/src/discussions/organizer.js +2 -0
  173. package/dist/src/discussions/processing.d.ts +43 -0
  174. package/dist/src/discussions/processing.js +125 -0
  175. package/dist/src/discussions/recording.js +202 -42
  176. package/dist/src/discussions/recordingJobs.js +2 -0
  177. package/dist/src/discussions/repository.js +4 -2
  178. package/dist/src/discussions/review.d.ts +8 -0
  179. package/dist/src/discussions/review.js +183 -0
  180. package/dist/src/discussions/sealer.d.ts +7 -1
  181. package/dist/src/discussions/sealer.js +163 -87
  182. package/dist/src/discussions/service.d.ts +7 -1
  183. package/dist/src/discussions/service.js +51 -15
  184. package/dist/src/discussions/types.d.ts +2 -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 +24 -0
  192. package/dist/src/gateway/hono/routes/commands-skills.js +15 -0
  193. package/dist/src/gateway/hono/routes/config-patch/misc.js +8 -1
  194. package/dist/src/gateway/hono/routes/config.js +12 -0
  195. package/dist/src/gateway/hono/routes/discussions.js +63 -1
  196. package/dist/src/gateway/hono/routes/global-defaults.js +8 -1
  197. package/dist/src/gateway/hono/routes/models.js +12 -4
  198. package/dist/src/gateway/hono/routes/provider-setup.d.ts +3 -0
  199. package/dist/src/gateway/hono/routes/provider-setup.js +106 -0
  200. package/dist/src/gateway/hono/routes/status.js +2 -0
  201. package/dist/src/gateway/hono/routes/voice.js +23 -10
  202. package/dist/src/gateway/provider-model-setup.d.ts +4 -0
  203. package/dist/src/gateway/provider-model-setup.js +56 -0
  204. package/dist/src/gateway/service/config-coordinator.d.ts +2 -2
  205. package/dist/src/gateway/service.js +2 -0
  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 +78 -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/256_task_main_update_retries.sql +21 -0
  234. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  235. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  236. package/dist/src/storage/sqlite/schema.js +1 -1
  237. package/dist/src/tasks/task-collaboration-repository.d.ts +2 -0
  238. package/dist/src/tasks/task-collaboration-repository.js +7 -1
  239. package/dist/src/tasks/task-main-update-delivery.js +11 -4
  240. package/dist/src/tasks/task-main-update-input.js +2 -1
  241. package/dist/src/tasks/task-main-update-retry.d.ts +5 -0
  242. package/dist/src/tasks/task-main-update-retry.js +15 -0
  243. package/dist/src/usage/recorder.js +2 -1
  244. package/dist/src/usage/scenario-registry.js +128 -123
  245. package/dist/src/voice/dashscope/streaming-stt-session.js +3 -0
  246. package/dist/src/voice/dashscope/streaming-tts-stream.js +3 -0
  247. package/dist/src/voice/dictation.d.ts +12 -0
  248. package/dist/src/voice/dictation.js +22 -0
  249. package/dist/src/voice/metadata/builtin.js +54 -0
  250. package/dist/src/voice/platform-streams.js +3 -0
  251. package/dist/src/voice/realtime/omniEngine.js +3 -0
  252. package/dist/src/voice/realtime/omniRoute.js +3 -2
  253. package/dist/src/voice/realtime/runtime.js +4 -2
  254. package/dist/src/voice/stt/factory.js +9 -3
  255. package/dist/src/voice/stt/providers/bailian-plan-transcription.d.ts +2 -0
  256. package/dist/src/voice/stt/providers/bailian-plan-transcription.js +32 -0
  257. package/dist/src/voice/stt/providers/index.d.ts +1 -0
  258. package/dist/src/voice/stt/providers/index.js +2 -1
  259. package/dist/src/voice/token-plan.d.ts +8 -0
  260. package/dist/src/voice/token-plan.js +11 -0
  261. package/dist/src/voice/tts/factory.js +4 -1
  262. package/dist/src/voice/tts/providers/bailian-plan-speech.d.ts +2 -0
  263. package/dist/src/voice/tts/providers/bailian-plan-speech.js +84 -0
  264. package/dist/src/voice/tts/providers/index.d.ts +1 -0
  265. package/dist/src/voice/tts/providers/index.js +2 -1
  266. package/dist/src/voice/tts/speak-core.js +10 -1
  267. package/package.json +2 -2
  268. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-Ds0Ue2FB.js +0 -1
  269. package/dist/gateway/static/root/assets/agents-BLRM4o-U.js +0 -77
  270. package/dist/gateway/static/root/assets/app-management-settings-panel-Dmy828Pe.js +0 -1
  271. package/dist/gateway/static/root/assets/automations-workspace-UcCneEs3.js +0 -6
  272. package/dist/gateway/static/root/assets/bot-DjLkhyZL.js +0 -1
  273. package/dist/gateway/static/root/assets/browser-automations-page-BjvQnYfO.js +0 -3
  274. package/dist/gateway/static/root/assets/browser-settings-page-D5ZghI28.js +0 -3
  275. package/dist/gateway/static/root/assets/capabilities-page-MC8qIrXo.js +0 -2
  276. package/dist/gateway/static/root/assets/capabilities-settings-panel-Blz3hEzp.js +0 -8
  277. package/dist/gateway/static/root/assets/channels-DSg_iCVC.js +0 -1
  278. package/dist/gateway/static/root/assets/chat-terminal-dock-C97SJEwd.js +0 -36
  279. package/dist/gateway/static/root/assets/circle-pause-CN9jYH2s.js +0 -1
  280. package/dist/gateway/static/root/assets/clock-3-DnrAnuyZ.js +0 -1
  281. package/dist/gateway/static/root/assets/connectors-page-DXk-GAsd.js +0 -1
  282. package/dist/gateway/static/root/assets/device-pairing-wizard-BeSuq__I.js +0 -1
  283. package/dist/gateway/static/root/assets/extension-settings-page-jYu6qpY2.js +0 -1
  284. package/dist/gateway/static/root/assets/fallback-models-CoyzvDo7.js +0 -1
  285. package/dist/gateway/static/root/assets/gateway-realtime-store-C3vH-Iup.js +0 -1
  286. package/dist/gateway/static/root/assets/gateway-settings-JlT1dlSj.js +0 -1
  287. package/dist/gateway/static/root/assets/git-branch-Dh9uxTot.js +0 -1
  288. package/dist/gateway/static/root/assets/home-page-DOVl8s-1.js +0 -2
  289. package/dist/gateway/static/root/assets/image-generation-api-BZBiYDmV.js +0 -1
  290. package/dist/gateway/static/root/assets/imports-page-DgdBTp_0.js +0 -1
  291. package/dist/gateway/static/root/assets/index-CmC8JkSM.js +0 -260
  292. package/dist/gateway/static/root/assets/index-Dgzc0oBu.css +0 -1
  293. package/dist/gateway/static/root/assets/local-app-workbench-page-BKZfn-MS.js +0 -1
  294. package/dist/gateway/static/root/assets/logs-page-BSepiACn.js +0 -2
  295. package/dist/gateway/static/root/assets/management-settings-dE_ykPNY.js +0 -1
  296. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-65SE6j-_.js +0 -1
  297. package/dist/gateway/static/root/assets/message-square-fVE7Ghj1.js +0 -1
  298. package/dist/gateway/static/root/assets/messages-DlTNQI92.js +0 -3
  299. package/dist/gateway/static/root/assets/models-hub-cache-C7FAsEe_.js +0 -1
  300. package/dist/gateway/static/root/assets/note-detail-panel-D9oqhdyk.js +0 -5
  301. package/dist/gateway/static/root/assets/notes-page-Bd4_7ph8.js +0 -8
  302. package/dist/gateway/static/root/assets/pause-DuPxgSxk.js +0 -1
  303. package/dist/gateway/static/root/assets/personal-page-BvWzq4Wp.js +0 -1
  304. package/dist/gateway/static/root/assets/play-kxZvpBg8.js +0 -1
  305. package/dist/gateway/static/root/assets/project-detail-page-D-qkIXVT.js +0 -1
  306. package/dist/gateway/static/root/assets/projects-page-BQtw1Dfn.js +0 -1
  307. package/dist/gateway/static/root/assets/remote-access-hub-CYFNz0Jc.js +0 -1
  308. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Qq_NyYx_.js +0 -1
  309. package/dist/gateway/static/root/assets/scenes-page-hGr-ppYk.js +0 -2
  310. package/dist/gateway/static/root/assets/sessions-page-CpX1Rluw.js +0 -1
  311. package/dist/gateway/static/root/assets/settings-advanced-gate-D2s_MlxR.js +0 -1
  312. package/dist/gateway/static/root/assets/settings-loading-skeleton-BTqvr_Fw.js +0 -1
  313. package/dist/gateway/static/root/assets/setup-status-panel-BiHRYDHq.js +0 -1
  314. package/dist/gateway/static/root/assets/shares-settings-DfcAu08T.js +0 -1
  315. package/dist/gateway/static/root/assets/skills-page-CvKc5nBN.js +0 -2
  316. package/dist/gateway/static/root/assets/sparkles-DHlfQFAF.js +0 -1
  317. package/dist/gateway/static/root/assets/task-detail-page-5B5ZVAu0.js +0 -2
  318. package/dist/gateway/static/root/assets/usage-page-rMuwNpJi.js +0 -1
  319. package/dist/gateway/static/root/assets/user-model-page-Dhqw3v_u.js +0 -2
  320. package/dist/gateway/static/root/assets/workflow-run-setup-panel-pdiRKLxP.js +0 -3
  321. package/dist/gateway/static/root/assets/workflows-page-D9LMxINt.js +0 -6
@@ -6,6 +6,7 @@ import { getConnectionResumeInput, init_connection_wait_repository, isConnection
6
6
  import { getSessionMetadata } from "../../storage/sqlite/session-read-repository.js";
7
7
  import { init_session_repository } from "../../storage/sqlite/session-repository.js";
8
8
  import { init_sqlite } from "../../storage/sqlite/index.js";
9
+ import { ProviderUsageScopeError, init_model_usage } from "../../providers/model-usage.js";
9
10
  import { resolveEffectiveAgentConfigForSession } from "../../config/agent-profile.js";
10
11
  import { setTraceIdentity, traceOperation, traceRun, traceTools } from "../../observability/runtime.js";
11
12
  import { continuesAfterTool, trackAiUsageStream } from "../../usage/recorder.js";
@@ -41,6 +42,7 @@ import { getModelThinking } from "../../providers/model-thinking.js";
41
42
  import "../messaging/no-reply.js";
42
43
  import { createAssistantMessageEventStream, getCurrentSystemPrompt, getCurrentTools, isRecoverableLength } from "@earendil-works/pi-ai";
43
44
  //#region src/agent/embedded/run-turn.ts
45
+ init_model_usage();
44
46
  init_connection_wait_repository();
45
47
  init_clarification_wait_repository();
46
48
  init_logger();
@@ -273,6 +275,11 @@ async function runXopcEmbeddedTurn(params) {
273
275
  conversationId: params.conversationId,
274
276
  runId: params.runId
275
277
  }, () => runXopcEmbeddedTurnInner(params), params.userMessage);
278
+ if (result.errorMessage?.includes("provider_usage_scope_denied")) return {
279
+ ...result,
280
+ ok: false,
281
+ retryable: false
282
+ };
276
283
  const stopped = cloudCreditBudgetStopMessage();
277
284
  if (stopped) return {
278
285
  ...result,
@@ -289,6 +296,11 @@ async function runXopcEmbeddedTurn(params) {
289
296
  }
290
297
  return result;
291
298
  } catch (error) {
299
+ if (error instanceof ProviderUsageScopeError) return {
300
+ ok: false,
301
+ retryable: false,
302
+ errorMessage: error.message
303
+ };
292
304
  const message = error instanceof Error ? error.message : String(error);
293
305
  if (isCloudCreditBudgetExhausted(message)) {
294
306
  reportCloudCreditError(message);
@@ -612,7 +624,8 @@ async function runXopcEmbeddedTurnInner(params) {
612
624
  block: true,
613
625
  reason: "Tool is outside this execution scope."
614
626
  };
615
- if (executionToolPolicy.surface !== "agent" && resolveExecutionToolPolicy(toolPolicyConversationId).surface !== executionToolPolicy.surface) {
627
+ const currentToolPolicy = resolveExecutionToolPolicy(toolPolicyConversationId);
628
+ if (currentToolPolicy.surface !== executionToolPolicy.surface || currentToolPolicy.taskExecution !== executionToolPolicy.taskExecution) {
616
629
  policyStopped = true;
617
630
  policyStopReason = "Execution identity changed during the run";
618
631
  quarantineRunner = true;
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { isCodemodeCoreRead } from "../tools/codemode-permissions.js";
4
3
  import { filterExecutionTools, resolveExecutionToolPolicy } from "./execution-tool-policy.js";
4
+ import { isCodemodeCoreRead } from "../tools/codemode-permissions.js";
5
5
  import { deferredToolContract, getXopcToolMetadata } from "./tool-metadata.js";
6
6
  import { abortEmbeddedRun } from "./runs.js";
7
7
  import { guardSessionManager } from "./session-tool-result-guard.js";
@@ -1,3 +1,4 @@
1
+ import { assertProviderUsage, init_model_usage } from "../../providers/model-usage.js";
1
2
  import "../../providers/constants.js";
2
3
  import { init_providers } from "../../providers/index.js";
3
4
  import { createExtensionAwareStreamFn } from "../../providers/extension-stream-bridge.js";
@@ -6,6 +7,7 @@ import { assertCloudCreditBudgetActive, cloudCreditBudgetHeaders, hasCloudCredit
6
7
  import { preparePromptCacheContext, withPromptCachePayloadTransform } from "../../providers/prompt-cache-payload.js";
7
8
  import { getCurrentSystemPrompt, getCurrentTools, normalizeContext } from "@earendil-works/pi-ai";
8
9
  //#region src/agent/embedded/xopc-stream-bridge.ts
10
+ init_model_usage();
9
11
  init_providers();
10
12
  /**
11
13
  * pi-coding-agent's default {@link createAgentSession} streamFn always routes through
@@ -20,6 +22,7 @@ function wrapStreamFnForXopcExtensions(originalStreamFn, promptCachePolicy) {
20
22
  const extensionStreamFn = createExtensionAwareStreamFn();
21
23
  return ((model, context, options) => {
22
24
  assertCloudCreditBudgetActive();
25
+ assertProviderUsage(model.provider, model.baseUrl);
23
26
  if (model.provider === "xopc-cloud") options = withCloudUsageResponse(options);
24
27
  const promptContext = {
25
28
  systemPrompt: getCurrentSystemPrompt(context.messages),
@@ -1,7 +1,8 @@
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 "../../../providers/model-usage.js";
3
4
  import { PROVIDER_ENV_MAP, init_env_keys } from "../../../providers/env-keys.js";
4
- import { ImageProviderError } from "../../../../packages/image-providers/src/validation.js";
5
+ import { ImageProviderError, normalizeImageGeometry } from "../../../../packages/image-providers/src/validation.js";
5
6
  import "../../../../packages/image-providers/src/index.js";
6
7
  import { describeFailoverError, isFailoverError } from "../../failover-error.js";
7
8
  import { buildNoCapabilityModelConfiguredMessage, recordCapabilityCandidateFailure, resolveCapabilityModelCandidates, throwCapabilityGenerationFailure } from "../../media-generation/runtime-shared.js";
@@ -10,6 +11,7 @@ import { parseImageGenerationModelRef } from "./model-ref.js";
10
11
  import { validateImageGenerationRequest } from "./validation.js";
11
12
  import { getImageGenerationProvider, listImageGenerationProviders, listImageGenerationProvidersSummary as listImageGenerationProvidersSummary$1 } from "./provider-registry.js";
12
13
  //#region src/agent/image/generation/runtime.ts
14
+ init_model_usage();
13
15
  init_env_keys();
14
16
  init_logger();
15
17
  const log = createLogger("ImageGen");
@@ -59,30 +61,26 @@ async function generateImage(params, deps = {}) {
59
61
  try {
60
62
  if (!provider.models.includes(candidate.model)) throw new ImageProviderError(`Unsupported image model: ${candidate.model}`, 400);
61
63
  const modelCapabilities = provider.modelCapabilities?.[candidate.model];
64
+ const capabilityProvider = modelCapabilities ? {
65
+ ...provider,
66
+ capabilities: modelCapabilities
67
+ } : provider;
68
+ const candidateParams = normalizeImageGeometry(params, capabilityProvider.capabilities, Boolean(params.inputImages?.length));
62
69
  validateImageGenerationRequest({
63
- provider: modelCapabilities ? {
64
- ...provider,
65
- capabilities: modelCapabilities
66
- } : provider,
67
- size: params.size,
68
- count: params.count,
69
- aspectRatio: params.aspectRatio,
70
- resolution: params.resolution,
71
- quality: params.quality,
72
- outputFormat: params.outputFormat,
73
- background: params.background,
74
- inputImages: params.inputImages
70
+ provider: capabilityProvider,
71
+ ...candidateParams
75
72
  });
76
73
  const request = buildProviderRequest({
77
74
  provider,
78
75
  candidate,
79
- params
76
+ params: candidateParams
80
77
  });
81
78
  log.debug({
82
79
  provider: candidate.provider,
83
80
  model: candidate.model,
84
81
  phase: "provider_invoked"
85
82
  }, `image-generation provider invoked: ${candidate.provider}/${candidate.model}`);
83
+ assertProviderUsage(candidate.provider, request.cfg?.providers?.[candidate.provider]?.baseUrl);
86
84
  const result = await provider.generateImage(request);
87
85
  if (!result.images?.length) throw new Error("Image generation provider returned no images.");
88
86
  return {
@@ -1,11 +1,14 @@
1
+ import { assertProviderUsage, init_model_usage, isProviderUsageScopeError } from "../../../providers/model-usage.js";
1
2
  import { init_schema, parseModelRef } from "../../../config/schema.js";
2
3
  import { getImageUnderstandingProvider } from "./provider-registry.js";
3
4
  import "./pi-ai-provider.js";
4
5
  //#region src/agent/image/understanding/runtime.ts
6
+ init_model_usage();
5
7
  init_schema();
6
8
  async function describeImages(params) {
7
9
  const parsed = parseModelRef(params.modelRef);
8
10
  if (!parsed) throw new Error(`Invalid model reference: ${params.modelRef}`);
11
+ assertProviderUsage(parsed.provider);
9
12
  const provider = getImageUnderstandingProvider(parsed.provider);
10
13
  if (!provider) throw new Error(`No image understanding provider registered for: ${parsed.provider}. Ensure the provider module is imported.`);
11
14
  return provider.describeImages(parsed.model, {
@@ -40,6 +43,7 @@ async function describeImagesWithFallback(params) {
40
43
  continue;
41
44
  }
42
45
  try {
46
+ assertProviderUsage(parsed.provider);
43
47
  return {
44
48
  ...await provider.describeImages(parsed.model, {
45
49
  images: params.images,
@@ -51,6 +55,7 @@ async function describeImagesWithFallback(params) {
51
55
  attempts
52
56
  };
53
57
  } catch (err) {
58
+ if (isProviderUsageScopeError(err)) throw err;
54
59
  lastError = err;
55
60
  attempts.push({
56
61
  provider: parsed.provider,
@@ -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 };