@xopcai/xopc 0.0.372 → 0.0.373

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 (201) 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-BQ3PMp2q.js → activity-store-BeYLqqr8.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-D4iAZErG.js → agent-avatar-dicebear--kDkSTqC.js} +1 -1
  5. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-z4_2-Kn2.js +1 -0
  6. package/dist/gateway/static/root/assets/{agent-plugin-dialog-BYB0G2aF.js → agent-plugin-dialog-BYndK83K.js} +1 -1
  7. package/dist/gateway/static/root/assets/{agents-D0JBkZPV.js → agents-CVo96cx1.js} +3 -3
  8. package/dist/gateway/static/root/assets/{agents-admin-api-HBZvVyzF.js → agents-admin-api-B4tgTbWG.js} +1 -1
  9. package/dist/gateway/static/root/assets/{app-management-settings-panel-C1tQxHaP.js → app-management-settings-panel-D9oOJKiH.js} +1 -1
  10. package/dist/gateway/static/root/assets/{appearance-settings-BfavIBbb.js → appearance-settings-B0-8Cdyv.js} +1 -1
  11. package/dist/gateway/static/root/assets/{apps-page-CUS5S1qa.js → apps-page-DasVc6i4.js} +1 -1
  12. package/dist/gateway/static/root/assets/{archive-plugin-BO3I9zRP.js → archive-plugin-bI9OLnXj.js} +1 -1
  13. package/dist/gateway/static/root/assets/{automations-page-iY0KMPSa.js → automations-page-BlCNqy2i.js} +1 -1
  14. package/dist/gateway/static/root/assets/{automations-workspace-LQsa5ohY.js → automations-workspace-C8ipDP05.js} +1 -1
  15. package/dist/gateway/static/root/assets/{binary-plugins-gFD7vH9R.js → binary-plugins-dOwLzjeH.js} +1 -1
  16. package/dist/gateway/static/root/assets/{block-editor-Cft0fd_O.js → block-editor-Cktlez6g.js} +1 -1
  17. package/dist/gateway/static/root/assets/{browser-automation-inputs-DxRoKFun.js → browser-automation-inputs-i7h1Svpf.js} +1 -1
  18. package/dist/gateway/static/root/assets/{browser-automations-page-C6EWx_Y4.js → browser-automations-page-KRfDl8ej.js} +1 -1
  19. package/dist/gateway/static/root/assets/{browser-settings-page-CKlt_8IS.js → browser-settings-page-BraQ4wnh.js} +1 -1
  20. package/dist/gateway/static/root/assets/{capabilities-CY4SiHcP.js → capabilities-CquUV0DP.js} +1 -1
  21. package/dist/gateway/static/root/assets/{capabilities-gjQtMhKu.js → capabilities-D4KFLtqM.js} +1 -1
  22. package/dist/gateway/static/root/assets/{capabilities-page-UrQ8EY_o.js → capabilities-page-B3m8xGzd.js} +2 -2
  23. package/dist/gateway/static/root/assets/{capabilities-settings-panel-C9HIr2CZ.js → capabilities-settings-panel-VQ4fHuBV.js} +6 -6
  24. package/dist/gateway/static/root/assets/{capability-header-actions-uxIiW_2_.js → capability-header-actions-f5Ido4Eg.js} +1 -1
  25. package/dist/gateway/static/root/assets/{channels-By3dmQ4Y.js → channels-N4Vc2nEG.js} +1 -1
  26. package/dist/gateway/static/root/assets/{chat-terminal-dock-DeDTSl64.js → chat-terminal-dock-BwvTKwsn.js} +1 -1
  27. package/dist/gateway/static/root/assets/cloud-credits-BMYMiiNn.js +1 -0
  28. package/dist/gateway/static/root/assets/{computer-settings-page-Cw1Z1epy.js → computer-settings-page-CAwUsKpw.js} +1 -1
  29. package/dist/gateway/static/root/assets/{connector-service-page-D664WEhj.js → connector-service-page-C0HuAMuH.js} +1 -1
  30. package/dist/gateway/static/root/assets/{connectors-page-sjyjY7Fl.js → connectors-page-BcBmW8JT.js} +1 -1
  31. package/dist/gateway/static/root/assets/{date-picker-BVmFrPfX.js → date-picker-DiQxRpe-.js} +1 -1
  32. package/dist/gateway/static/root/assets/{dependency-picker-YIoP-e5-.js → dependency-picker-Ds0_BJbN.js} +1 -1
  33. package/dist/gateway/static/root/assets/{desktop-pet-CzS468vR.js → desktop-pet-ZMEOYwrR.js} +1 -1
  34. package/dist/gateway/static/root/assets/{desktop-pet-settings-BPcgZUcK.js → desktop-pet-settings-DkyTqD07.js} +1 -1
  35. package/dist/gateway/static/root/assets/{device-pairing-wizard-Cgba-4m9.js → device-pairing-wizard-CvaI5ZJZ.js} +1 -1
  36. package/dist/gateway/static/root/assets/{directory-picker-path-field-_nHmZtnY.js → directory-picker-path-field-Bfv93eK1.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-debug-page-IIky9Iqr.js → extension-debug-page-CbgEonkK.js} +1 -1
  38. package/dist/gateway/static/root/assets/{extension-page-C-7ngTTj.js → extension-page-JXKGtIdM.js} +1 -1
  39. package/dist/gateway/static/root/assets/{extension-provider-VFWspV08.js → extension-provider-DxlAZ2iy.js} +1 -1
  40. package/dist/gateway/static/root/assets/{extension-settings-page-_hovFCWi.js → extension-settings-page-lsQ2xvbr.js} +1 -1
  41. package/dist/gateway/static/root/assets/{fallback-models-CUHrPpGV.js → fallback-models-7bG0AND1.js} +1 -1
  42. package/dist/gateway/static/root/assets/{gateway-config-swr-7RKqgU_U.js → gateway-config-swr-BoRkBnsw.js} +1 -1
  43. package/dist/gateway/static/root/assets/{gateway-realtime-BwX_fHUS.js → gateway-realtime-C3WQQY10.js} +1 -1
  44. package/dist/gateway/static/root/assets/gateway-realtime-store-cLCDEe4D.js +1 -0
  45. package/dist/gateway/static/root/assets/{gateway-settings-sbaOzlEH.js → gateway-settings-BpbcoPx9.js} +1 -1
  46. package/dist/gateway/static/root/assets/{gateway-startup-retry-jiV5sbEX.js → gateway-startup-retry-TYSQEQcG.js} +1 -1
  47. package/dist/gateway/static/root/assets/{home-page-DjquRIFR.js → home-page-BxctC0aJ.js} +1 -1
  48. package/dist/gateway/static/root/assets/{image-generation-api-DO4mXb6I.js → image-generation-api-_pKiNfSq.js} +1 -1
  49. package/dist/gateway/static/root/assets/{imports-page-xWWIeT_t.js → imports-page-Bq8CazCb.js} +1 -1
  50. package/dist/gateway/static/root/assets/{index-BWDK2eIj.js → index-B40-KDN8.js} +7 -7
  51. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DWazrDgz.js → keyboard-shortcuts-settings-kkAevkl2.js} +1 -1
  52. package/dist/gateway/static/root/assets/{local-app-workbench-page-CkxDdlYU.js → local-app-workbench-page-abLaf1hW.js} +1 -1
  53. package/dist/gateway/static/root/assets/{local-apps-page-BISZ4bi5.js → local-apps-page-nwsnwYjK.js} +1 -1
  54. package/dist/gateway/static/root/assets/{local-session-drafts-pox8evDV.js → local-session-drafts-Cg9RdsNN.js} +1 -1
  55. package/dist/gateway/static/root/assets/{locale-store-COVscAqC.js → locale-store-rWFLl-p4.js} +1 -1
  56. package/dist/gateway/static/root/assets/{logs-page-GiCulc9k.js → logs-page-BEgYS-Xg.js} +1 -1
  57. package/dist/gateway/static/root/assets/{management-settings-GUpOcTqa.js → management-settings-D_JQ6_X0.js} +1 -1
  58. package/dist/gateway/static/root/assets/{markdown-view-B_qnAcW2.js → markdown-view-BHFFusQs.js} +1 -1
  59. package/dist/gateway/static/root/assets/{media-plugins-C0Pc-wSY.js → media-plugins-BVPTMWJI.js} +1 -1
  60. package/dist/gateway/static/root/assets/messages-C1SUo4gG.js +3 -0
  61. package/dist/gateway/static/root/assets/models-hub-cache-Jj8dvYcv.js +1 -0
  62. package/dist/gateway/static/root/assets/{note-detail-panel-CqealmSc.js → note-detail-panel-CCnfurBR.js} +3 -3
  63. package/dist/gateway/static/root/assets/{notes-api-sBgBcyLW.js → notes-api-CSLVCZBn.js} +1 -1
  64. package/dist/gateway/static/root/assets/{notes-page-BtTU5mnS.js → notes-page-D9u_znxM.js} +1 -1
  65. package/dist/gateway/static/root/assets/{page-context-capture-button-Yt-BpPRh.js → page-context-capture-button-BO3FoRej.js} +1 -1
  66. package/dist/gateway/static/root/assets/{personal-page-C8SEQpEu.js → personal-page-BJn6UHAF.js} +1 -1
  67. package/dist/gateway/static/root/assets/{product-open-page-etM6Ijfe.js → product-open-page-Dso2_hyl.js} +1 -1
  68. package/dist/gateway/static/root/assets/{product-preview-content-C6aeRrWe.js → product-preview-content-CkvVb3EA.js} +1 -1
  69. package/dist/gateway/static/root/assets/{project-detail-page-K4ASOTki.js → project-detail-page-UjrrzE3H.js} +1 -1
  70. package/dist/gateway/static/root/assets/{projects-page-BssImjwl.js → projects-page-C1h63P2M.js} +1 -1
  71. package/dist/gateway/static/root/assets/{registry-api-Bh9UBb-f.js → registry-api-CoMBYjHD.js} +1 -1
  72. package/dist/gateway/static/root/assets/{remote-access-hub-BznC_5H0.js → remote-access-hub-BJifH8AB.js} +1 -1
  73. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-BJAzqQik.js → runtime-tools-settings-panel-vG1wqcEb.js} +1 -1
  74. package/dist/gateway/static/root/assets/{scenes-page-uZUXm03X.js → scenes-page-CwoAoYMX.js} +1 -1
  75. package/dist/gateway/static/root/assets/{schema-form-SA3Ld7zf.js → schema-form-BIsHdyz7.js} +1 -1
  76. package/dist/gateway/static/root/assets/{send-session-input-Di3Q846r.js → send-session-input-CLhR1uEp.js} +1 -1
  77. package/dist/gateway/static/root/assets/{session-api-yjpEz4pP.js → session-api-u_4_kFQt.js} +1 -1
  78. package/dist/gateway/static/root/assets/{session-manager-CWjhJxJs.js → session-manager-B06ZCie_.js} +1 -1
  79. package/dist/gateway/static/root/assets/{sessions-page-DdL8zVrF.js → sessions-page-BcCLp3yU.js} +1 -1
  80. package/dist/gateway/static/root/assets/settings-advanced-gate-D114UdRI.js +1 -0
  81. package/dist/gateway/static/root/assets/{settings-page-CUJQMNF7.js → settings-page-z9Jlk0BL.js} +1 -1
  82. package/dist/gateway/static/root/assets/{setup-status-panel-BGBWC0Bc.js → setup-status-panel-CrpXECqe.js} +1 -1
  83. package/dist/gateway/static/root/assets/{share-link-dialog-HCHM8qnf.js → share-link-dialog-XhiuPKF4.js} +1 -1
  84. package/dist/gateway/static/root/assets/{share-preview-page-DJmyACyp.js → share-preview-page-Vc0TQuZ8.js} +1 -1
  85. package/dist/gateway/static/root/assets/{shares-api-c0dfWz6h.js → shares-api-BVSb1vh4.js} +1 -1
  86. package/dist/gateway/static/root/assets/{shares-settings-BzqcGh7W.js → shares-settings-D9XpTJXP.js} +1 -1
  87. package/dist/gateway/static/root/assets/{skill-api-9XSn7R8L.js → skill-api-DtPOf1aW.js} +1 -1
  88. package/dist/gateway/static/root/assets/{skill-reload-api-Ge5XymHa.js → skill-reload-api-BsLx_FXd.js} +1 -1
  89. package/dist/gateway/static/root/assets/{skills-page-DwyDfh9g.js → skills-page-Bq9-2b9U.js} +1 -1
  90. package/dist/gateway/static/root/assets/{system-settings-panel-B6axBPLO.js → system-settings-panel-P7T729uD.js} +1 -1
  91. package/dist/gateway/static/root/assets/{task-detail-page-ftCTqBDB.js → task-detail-page-CsB9AFx6.js} +1 -1
  92. package/dist/gateway/static/root/assets/{task-expandable-content-hYcgCEE3.js → task-expandable-content-DxeBTJvh.js} +1 -1
  93. package/dist/gateway/static/root/assets/{theme-store-BOfCKgl6.js → theme-store-KcQhCg1-.js} +1 -1
  94. package/dist/gateway/static/root/assets/{tracing-settings-page-DDWFXcST.js → tracing-settings-page-DJRAP3nb.js} +1 -1
  95. package/dist/gateway/static/root/assets/{tunnel-api-BYU2v0im.js → tunnel-api-CuowqIZ7.js} +1 -1
  96. package/dist/gateway/static/root/assets/usage-page-avX3msoZ.js +1 -0
  97. package/dist/gateway/static/root/assets/{use-autosave-CSckcjFx.js → use-autosave-C-IWxbzm.js} +1 -1
  98. package/dist/gateway/static/root/assets/{use-composer-attachments-OFlldkKg.js → use-composer-attachments-Dxphaxk-.js} +1 -1
  99. package/dist/gateway/static/root/assets/{use-file-preview-expanded-BF1TeNXP.js → use-file-preview-expanded-Du37Gofn.js} +2 -2
  100. package/dist/gateway/static/root/assets/{user-model-page-CqnGITYf.js → user-model-page-DGDBWw7P.js} +1 -1
  101. package/dist/gateway/static/root/assets/{voice-api-key-field-GEw5x2fU.js → voice-api-key-field-7BImy8Jc.js} +1 -1
  102. package/dist/gateway/static/root/assets/{voice-config-api-3yyVwXln.js → voice-config-api-6MINytQl.js} +1 -1
  103. package/dist/gateway/static/root/assets/{work-discovery-overlay-BDM7BEKH.js → work-discovery-overlay-BgJNz2tH.js} +1 -1
  104. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BBwx-tUb.js → workflow-run-setup-panel-1I2q2J_U.js} +1 -1
  105. package/dist/gateway/static/root/assets/{workflows-page-BHigZn6E.js → workflows-page-DhJl9pnO.js} +1 -1
  106. package/dist/gateway/static/root/assets/{workspace-api-CTm8s6Jr.js → workspace-api-CXiyhTwv.js} +2 -2
  107. package/dist/gateway/static/root/assets/xopc-cloud-account-card-CnPBP1V_.js +1 -0
  108. package/dist/gateway/static/root/index.html +26 -26
  109. package/dist/package.js +1 -1
  110. package/dist/packages/gateway-contract/src/cloud-credits.js +80 -0
  111. package/dist/packages/gateway-contract/src/index.js +2 -0
  112. package/dist/src/agent/agent-manager.js +4 -4
  113. package/dist/src/agent/background-review/run-background-review.js +1 -1
  114. package/dist/src/agent/client-error-format.d.ts +1 -1
  115. package/dist/src/agent/client-error-format.js +7 -0
  116. package/dist/src/agent/embedded/model-runtime.js +1 -1
  117. package/dist/src/agent/embedded/run-for-session.js +2 -2
  118. package/dist/src/agent/embedded/run-turn.js +40 -4
  119. package/dist/src/agent/embedded/xopc-stream-bridge.js +18 -0
  120. package/dist/src/agent/image/generation/openai-images-provider.d.ts +2 -1
  121. package/dist/src/agent/image/generation/openai-images-provider.js +13 -7
  122. package/dist/src/agent/image/generation/providers/xopc-cloud.js +14 -2
  123. package/dist/src/agent/image/tool-model-config.js +1 -1
  124. package/dist/src/agent/service.js +3 -3
  125. package/dist/src/agent/session/session-inspector.js +1 -1
  126. package/dist/src/agent/tasks/task-judge-service.js +3 -3
  127. package/dist/src/agent-config/schema.d.ts +4 -0
  128. package/dist/src/agent-config/schema.js +1 -0
  129. package/dist/src/ai-assist/text-assist.js +1 -1
  130. package/dist/src/auth/credentials.js +2 -2
  131. package/dist/src/auth/model-credential-store.js +1 -1
  132. package/dist/src/auth/sync-provider-auth.js +1 -1
  133. package/dist/src/chat-commands/builtins/config.js +1 -1
  134. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  135. package/dist/src/cli/commands/doctor/checks/image-providers.js +1 -1
  136. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  137. package/dist/src/cli/commands/models.js +42 -1
  138. package/dist/src/cli/commands/onboard/model.js +3 -3
  139. package/dist/src/computer/runtime.js +4 -1
  140. package/dist/src/config/index.js +3 -3
  141. package/dist/src/config/loader.js +1 -1
  142. package/dist/src/config/models-json.js +2 -2
  143. package/dist/src/extensions/activation-context.js +1 -1
  144. package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -0
  145. package/dist/src/gateway/hono/lib/config-payload.js +2 -2
  146. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  147. package/dist/src/gateway/hono/routes/models.js +4 -4
  148. package/dist/src/gateway/hono/routes/observability.js +1 -1
  149. package/dist/src/gateway/hono/routes/usage.js +15 -5
  150. package/dist/src/gateway/hono/routes/voice.js +1 -1
  151. package/dist/src/gateway/service/config-coordinator.js +1 -1
  152. package/dist/src/gateway/service/session-command-service.js +1 -1
  153. package/dist/src/gateway/service.js +4 -4
  154. package/dist/src/home-intelligence/generator.js +1 -1
  155. package/dist/src/notes/service.js +1 -1
  156. package/dist/src/observability/runtime.js +1 -1
  157. package/dist/src/personal-agent/proactivity/service.js +2 -2
  158. package/dist/src/personal-agent/reply-composer.js +2 -2
  159. package/dist/src/platform/client.d.ts +1 -1
  160. package/dist/src/platform/contracts.d.ts +1 -1
  161. package/dist/src/platform/index.js +1 -1
  162. package/dist/src/providers/index.js +4 -4
  163. package/dist/src/providers/model-call.js +15 -1
  164. package/dist/src/providers/model-registry.js +2 -2
  165. package/dist/src/providers/provider-auth-service.js +1 -1
  166. package/dist/src/providers/provider-disconnect-core.js +1 -1
  167. package/dist/src/providers/register-runtime-providers.js +1 -1
  168. package/dist/src/providers/xopc-cloud-account-service.d.ts +7 -23
  169. package/dist/src/providers/xopc-cloud-account-service.js +49 -29
  170. package/dist/src/providers/xopc-cloud-catalog-coordinator.js +1 -1
  171. package/dist/src/providers/xopc-cloud-credit-budget.d.ts +14 -0
  172. package/dist/src/providers/xopc-cloud-credit-budget.js +61 -0
  173. package/dist/src/storage/sqlite/ai-usage-repository.d.ts +9 -0
  174. package/dist/src/storage/sqlite/ai-usage-repository.js +94 -5
  175. package/dist/src/storage/sqlite/migrations/242_cloud_usage_receipts.sql +5 -0
  176. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  177. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  178. package/dist/src/storage/sqlite/schema.js +1 -1
  179. package/dist/src/tasks/task-main-update-decision-service.js +2 -2
  180. package/dist/src/tui/backends/embedded-backend.js +1 -1
  181. package/dist/src/tui/tui.js +1 -1
  182. package/dist/src/usage/cloud-capability.d.ts +2 -0
  183. package/dist/src/usage/cloud-capability.js +34 -0
  184. package/dist/src/usage/cloud-receipts.d.ts +10 -0
  185. package/dist/src/usage/cloud-receipts.js +55 -0
  186. package/dist/src/usage/cost.js +1 -0
  187. package/dist/src/usage/recorder.js +3 -1
  188. package/dist/src/usage/scenario-registry.js +15 -0
  189. package/dist/src/voice/realtime/runtime.js +27 -22
  190. package/dist/src/voice/stt/providers/xopc-cloud-transcription.js +28 -14
  191. package/dist/src/voice/tts/providers/xopc-cloud-speech.js +39 -29
  192. package/dist/src/voice/tts/speech-provider-types.d.ts +1 -0
  193. package/dist/src/work-discovery/service.js +2 -2
  194. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  195. package/package.json +4 -4
  196. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BdxzGSiO.js +0 -1
  197. package/dist/gateway/static/root/assets/gateway-realtime-store-BheKaO6d.js +0 -1
  198. package/dist/gateway/static/root/assets/messages-Bb2GK-Nj.js +0 -3
  199. package/dist/gateway/static/root/assets/models-hub-cache-DyPPksMP.js +0 -1
  200. package/dist/gateway/static/root/assets/settings-advanced-gate-DmawLOHR.js +0 -1
  201. package/dist/gateway/static/root/assets/usage-page-BvPcpxTQ.js +0 -1
@@ -11,7 +11,7 @@
11
11
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=20260910-1" />
12
12
  <link rel="manifest" href="/site.webmanifest?v=20260910-1" />
13
13
  <title>XOPC — Keep what matters moving.</title>
14
- <script type="module" crossorigin src="/assets/index-BWDK2eIj.js"></script>
14
+ <script type="module" crossorigin src="/assets/index-B40-KDN8.js"></script>
15
15
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-aKtaBQYM.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-zJ_50EbN.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/vendor-react-BOUWij0V.js">
@@ -25,15 +25,15 @@
25
25
  <link rel="modulepreload" crossorigin href="/assets/download-Dk-ZjtO6.js">
26
26
  <link rel="modulepreload" crossorigin href="/assets/plus-Q2yW6OE7.js">
27
27
  <link rel="modulepreload" crossorigin href="/assets/x-B_N4OPjy.js">
28
- <link rel="modulepreload" crossorigin href="/assets/messages-Bb2GK-Nj.js">
29
- <link rel="modulepreload" crossorigin href="/assets/locale-store-COVscAqC.js">
28
+ <link rel="modulepreload" crossorigin href="/assets/messages-C1SUo4gG.js">
29
+ <link rel="modulepreload" crossorigin href="/assets/locale-store-rWFLl-p4.js">
30
30
  <link rel="modulepreload" crossorigin href="/assets/cn-JdwAhgNB.js">
31
31
  <link rel="modulepreload" crossorigin href="/assets/schemas-CObaziC7.js">
32
32
  <link rel="modulepreload" crossorigin href="/assets/local-apps-yys1VChX.js">
33
33
  <link rel="modulepreload" crossorigin href="/assets/product-delivery-BAks11S4.js">
34
34
  <link rel="modulepreload" crossorigin href="/assets/app-link-4gpFbdsr.js">
35
35
  <link rel="modulepreload" crossorigin href="/assets/copy-to-clipboard-HOJ79TWv.js">
36
- <link rel="modulepreload" crossorigin href="/assets/markdown-view-B_qnAcW2.js">
36
+ <link rel="modulepreload" crossorigin href="/assets/markdown-view-BHFFusQs.js">
37
37
  <link rel="modulepreload" crossorigin href="/assets/check-DUBLcKHA.js">
38
38
  <link rel="modulepreload" crossorigin href="/assets/copy-Dv6d4Dvw.js">
39
39
  <link rel="modulepreload" crossorigin href="/assets/button-CS04eWY9.js">
@@ -69,29 +69,29 @@
69
69
  <link rel="modulepreload" crossorigin href="/assets/rotate-cw-LIg3Am9S.js">
70
70
  <link rel="modulepreload" crossorigin href="/assets/search-DA7gz22f.js">
71
71
  <link rel="modulepreload" crossorigin href="/assets/index.module-Cd9ENXfk.js">
72
- <link rel="modulepreload" crossorigin href="/assets/gateway-startup-retry-jiV5sbEX.js">
73
- <link rel="modulepreload" crossorigin href="/assets/session-api-yjpEz4pP.js">
72
+ <link rel="modulepreload" crossorigin href="/assets/gateway-startup-retry-TYSQEQcG.js">
73
+ <link rel="modulepreload" crossorigin href="/assets/session-api-u_4_kFQt.js">
74
74
  <link rel="modulepreload" crossorigin href="/assets/constants-Dy8Gw0sF.js">
75
75
  <link rel="modulepreload" crossorigin href="/assets/app-chrome-BeB4KgOf.js">
76
76
  <link rel="modulepreload" crossorigin href="/assets/attachment-utils-core-BIOUBrpT.js">
77
77
  <link rel="modulepreload" crossorigin href="/assets/files-Bw4SBGdM.js">
78
- <link rel="modulepreload" crossorigin href="/assets/workspace-api-CTm8s6Jr.js">
78
+ <link rel="modulepreload" crossorigin href="/assets/workspace-api-CXiyhTwv.js">
79
79
  <link rel="modulepreload" crossorigin href="/assets/electron-env-Dit0bHgy.js">
80
80
  <link rel="modulepreload" crossorigin href="/assets/use-async-resource-GrnWNwMZ.js">
81
- <link rel="modulepreload" crossorigin href="/assets/activity-store-BQ3PMp2q.js">
82
- <link rel="modulepreload" crossorigin href="/assets/use-file-preview-expanded-BF1TeNXP.js">
81
+ <link rel="modulepreload" crossorigin href="/assets/activity-store-BeYLqqr8.js">
82
+ <link rel="modulepreload" crossorigin href="/assets/use-file-preview-expanded-Du37Gofn.js">
83
83
  <link rel="modulepreload" crossorigin href="/assets/mic-CuUb7zc-.js">
84
84
  <link rel="modulepreload" crossorigin href="/assets/globe-DSSGFWFn.js">
85
- <link rel="modulepreload" crossorigin href="/assets/share-link-dialog-HCHM8qnf.js">
86
- <link rel="modulepreload" crossorigin href="/assets/local-session-drafts-pox8evDV.js">
85
+ <link rel="modulepreload" crossorigin href="/assets/share-link-dialog-XhiuPKF4.js">
86
+ <link rel="modulepreload" crossorigin href="/assets/local-session-drafts-Cg9RdsNN.js">
87
87
  <link rel="modulepreload" crossorigin href="/assets/tasks-DwKXgZ-I.js">
88
- <link rel="modulepreload" crossorigin href="/assets/capabilities-CY4SiHcP.js">
88
+ <link rel="modulepreload" crossorigin href="/assets/capabilities-CquUV0DP.js">
89
89
  <link rel="modulepreload" crossorigin href="/assets/skill-wire-pattern-BPpeIcCi.js">
90
- <link rel="modulepreload" crossorigin href="/assets/shares-api-c0dfWz6h.js">
91
- <link rel="modulepreload" crossorigin href="/assets/capabilities-gjQtMhKu.js">
92
- <link rel="modulepreload" crossorigin href="/assets/use-composer-attachments-OFlldkKg.js">
90
+ <link rel="modulepreload" crossorigin href="/assets/shares-api-BVSb1vh4.js">
91
+ <link rel="modulepreload" crossorigin href="/assets/capabilities-D4KFLtqM.js">
92
+ <link rel="modulepreload" crossorigin href="/assets/use-composer-attachments-Dxphaxk-.js">
93
93
  <link rel="modulepreload" crossorigin href="/assets/git-branch-Dh9uxTot.js">
94
- <link rel="modulepreload" crossorigin href="/assets/notes-api-sBgBcyLW.js">
94
+ <link rel="modulepreload" crossorigin href="/assets/notes-api-CSLVCZBn.js">
95
95
  <link rel="modulepreload" crossorigin href="/assets/message-square-fVE7Ghj1.js">
96
96
  <link rel="modulepreload" crossorigin href="/assets/pause-DuPxgSxk.js">
97
97
  <link rel="modulepreload" crossorigin href="/assets/play-kxZvpBg8.js">
@@ -99,18 +99,18 @@
99
99
  <link rel="modulepreload" crossorigin href="/assets/settings-2-D-csvaET.js">
100
100
  <link rel="modulepreload" crossorigin href="/assets/sparkles-DHlfQFAF.js">
101
101
  <link rel="modulepreload" crossorigin href="/assets/middleware-Pd0e8Igk.js">
102
- <link rel="modulepreload" crossorigin href="/assets/gateway-realtime-store-BheKaO6d.js">
103
- <link rel="modulepreload" crossorigin href="/assets/gateway-realtime-BwX_fHUS.js">
102
+ <link rel="modulepreload" crossorigin href="/assets/gateway-realtime-store-cLCDEe4D.js">
103
+ <link rel="modulepreload" crossorigin href="/assets/gateway-realtime-C3WQQY10.js">
104
104
  <link rel="modulepreload" crossorigin href="/assets/tool-activity-BtJkgjFf.js">
105
- <link rel="modulepreload" crossorigin href="/assets/registry-api-Bh9UBb-f.js">
106
- <link rel="modulepreload" crossorigin href="/assets/gateway-config-swr-7RKqgU_U.js">
107
- <link rel="modulepreload" crossorigin href="/assets/agents-admin-api-HBZvVyzF.js">
108
- <link rel="modulepreload" crossorigin href="/assets/session-manager-CWjhJxJs.js">
109
- <link rel="modulepreload" crossorigin href="/assets/send-session-input-Di3Q846r.js">
110
- <link rel="modulepreload" crossorigin href="/assets/theme-store-BOfCKgl6.js">
111
- <link rel="modulepreload" crossorigin href="/assets/extension-provider-VFWspV08.js">
105
+ <link rel="modulepreload" crossorigin href="/assets/registry-api-CoMBYjHD.js">
106
+ <link rel="modulepreload" crossorigin href="/assets/gateway-config-swr-BoRkBnsw.js">
107
+ <link rel="modulepreload" crossorigin href="/assets/agents-admin-api-B4tgTbWG.js">
108
+ <link rel="modulepreload" crossorigin href="/assets/session-manager-B06ZCie_.js">
109
+ <link rel="modulepreload" crossorigin href="/assets/send-session-input-CLhR1uEp.js">
110
+ <link rel="modulepreload" crossorigin href="/assets/theme-store-KcQhCg1-.js">
111
+ <link rel="modulepreload" crossorigin href="/assets/extension-provider-DxlAZ2iy.js">
112
112
  <link rel="modulepreload" crossorigin href="/assets/loopi-Djb8XU3l.js">
113
- <link rel="modulepreload" crossorigin href="/assets/models-hub-cache-DyPPksMP.js">
113
+ <link rel="modulepreload" crossorigin href="/assets/models-hub-cache-Jj8dvYcv.js">
114
114
  <link rel="modulepreload" crossorigin href="/assets/skill-api-utils-C7V4JVXM.js">
115
115
  <link rel="modulepreload" crossorigin href="/assets/date-formatters-CUZAyDEg.js">
116
116
  <link rel="modulepreload" crossorigin href="/assets/settings-form-draft-Dy10ldo8.js">
package/dist/package.js CHANGED
@@ -1,4 +1,4 @@
1
1
  //#region package.json
2
- var version = "0.0.372";
2
+ var version = "0.0.373";
3
3
  //#endregion
4
4
  export { version };
@@ -0,0 +1,80 @@
1
+ import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
2
+ import { z } from "zod";
3
+ //#region packages/gateway-contract/src/cloud-credits.ts
4
+ /** Format integers exactly, including quantities too large for decimal Number arithmetic. */
5
+ function creditDecimal(micro) {
6
+ creditMicroSchema.parse(micro);
7
+ const value = BigInt(micro);
8
+ const fraction = String(value % 10000n).padStart(4, "0").replace(/0+$/, "");
9
+ return `${value / 10000n}${fraction ? `.${fraction}` : ""}`;
10
+ }
11
+ var creditMicroSchema, creditUnitSchema, cloudAccountSummarySchema, cloudCreditBudgetSchema, cloudBillingReceiptSchema;
12
+ var init_cloud_credits = __esmMin((() => {
13
+ creditMicroSchema = z.string().regex(/^(0|[1-9]\d{0,15})$/).refine((value) => BigInt(value) <= BigInt(Number.MAX_SAFE_INTEGER), "Credit amount exceeds supported range");
14
+ creditUnitSchema = z.object({
15
+ unit: z.literal("credit"),
16
+ microPerCredit: z.literal("10000"),
17
+ version: z.literal("credit-v1"),
18
+ standardCreditsPerYuan: z.string().regex(/^\d+$/)
19
+ });
20
+ cloudAccountSummarySchema = z.object({
21
+ schemaVersion: z.literal(2),
22
+ creditUnit: creditUnitSchema,
23
+ balance: z.object({
24
+ availableCreditMicro: creditMicroSchema,
25
+ purchasedCreditMicro: creditMicroSchema,
26
+ grantedCreditMicro: creditMicroSchema,
27
+ usageReservedCreditMicro: creditMicroSchema,
28
+ refundReservedCreditMicro: creditMicroSchema,
29
+ expiring: z.array(z.object({
30
+ id: z.string(),
31
+ creditMicro: creditMicroSchema,
32
+ expiresAt: z.number().int().nonnegative()
33
+ })),
34
+ updatedAt: z.string().datetime()
35
+ }),
36
+ usage: z.object({
37
+ days: z.union([
38
+ z.literal(1),
39
+ z.literal(7),
40
+ z.literal(30)
41
+ ]),
42
+ requests: z.number().int().nonnegative(),
43
+ inputTokens: z.number().int().nonnegative(),
44
+ outputTokens: z.number().int().nonnegative(),
45
+ totalTokens: z.number().int().nonnegative(),
46
+ errors: z.number().int().nonnegative(),
47
+ averageLatencyMs: z.number().nonnegative(),
48
+ chargedCreditMicro: creditMicroSchema
49
+ }),
50
+ links: z.object({
51
+ details: z.string().url(),
52
+ purchase: z.string().url()
53
+ })
54
+ });
55
+ cloudCreditBudgetSchema = z.object({
56
+ id: z.string().uuid(),
57
+ limitCreditMicro: creditMicroSchema,
58
+ reservedCreditMicro: creditMicroSchema,
59
+ chargedCreditMicro: creditMicroSchema,
60
+ remainingCreditMicro: creditMicroSchema,
61
+ revision: z.number().int().positive(),
62
+ createdAt: z.number().int().nonnegative()
63
+ });
64
+ cloudBillingReceiptSchema = z.object({
65
+ requestId: z.string(),
66
+ model: z.string(),
67
+ state: z.string(),
68
+ reservedCreditMicro: creditMicroSchema,
69
+ chargedCreditMicro: creditMicroSchema.nullable(),
70
+ releasedCreditMicro: creditMicroSchema,
71
+ ratedCreditMicro: creditMicroSchema.nullable(),
72
+ absorbedCreditMicro: creditMicroSchema.nullable(),
73
+ priceSnapshot: z.unknown().nullable(),
74
+ createdAt: z.number().int().nonnegative(),
75
+ settledAt: z.number().int().nonnegative().nullable()
76
+ });
77
+ }));
78
+ //#endregion
79
+ init_cloud_credits();
80
+ export { cloudAccountSummarySchema, cloudBillingReceiptSchema, cloudCreditBudgetSchema, creditDecimal, creditMicroSchema, creditUnitSchema, init_cloud_credits };
@@ -31,6 +31,7 @@ import { init_device_pairing } from "./device-pairing.js";
31
31
  import { init_gateway_scopes } from "./gateway-scopes.js";
32
32
  import { init_browser_tab_binding } from "./browser-tab-binding.js";
33
33
  import { init_model_selection } from "./model-selection.js";
34
+ import { init_cloud_credits } from "./cloud-credits.js";
34
35
  import { init_connection_waits } from "./connection-waits.js";
35
36
  import { init_clarifications } from "./clarifications.js";
36
37
  import { init_discussions } from "./discussions.js";
@@ -72,6 +73,7 @@ var init_src = __esmMin((() => {
72
73
  init_browser_page_context();
73
74
  init_browser_tab_binding();
74
75
  init_model_selection();
76
+ init_cloud_credits();
75
77
  init_connection_waits();
76
78
  init_clarifications();
77
79
  init_discussions();
@@ -9,16 +9,16 @@ import { init_sqlite } from "../storage/sqlite/index.js";
9
9
  import { expandWorkspacePathString, init_workspace_path } from "../config/workspace-path.js";
10
10
  import { init_agent_scope, listAgentEntries, resolveAgentProfileDir } from "./agent-scope.js";
11
11
  import { extractTextContent } from "./context/workspace.js";
12
+ import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
12
13
  import { init_paths, resolveBundledSkillsDir } from "../config/paths.js";
13
14
  import { CredentialResolver, init_credentials } from "../auth/credentials.js";
14
- import { traceTools } from "../observability/runtime.js";
15
- import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
16
- import { applyConfigOverrides } from "../config/runtime-overrides.js";
17
- import { resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
18
15
  import { init_sync_provider_auth, resolveProviderApiKeySync } from "../auth/sync-provider-auth.js";
19
16
  import { getApiKeySync, getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
20
17
  import { createExtensionAwareStreamFn } from "../providers/extension-stream-bridge.js";
18
+ import { traceTools } from "../observability/runtime.js";
21
19
  import { continuesAfterTool, trackAiUsageStream } from "../usage/recorder.js";
20
+ import { applyConfigOverrides } from "../config/runtime-overrides.js";
21
+ import { resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
22
22
  import { resolveUserContextSessionAccess } from "../user-context/access-policy.js";
23
23
  import { isPersonalConversation } from "../personal-agent/repository.js";
24
24
  import { PersonalPromptContext } from "../personal-agent/prompt-context.js";
@@ -5,11 +5,11 @@ import { getSessionMetadata } from "../../storage/sqlite/session-read-repository
5
5
  import { loadCompactionSourceSnapshot } from "../../storage/sqlite/transcript-repository.js";
6
6
  import { init_sqlite } from "../../storage/sqlite/index.js";
7
7
  import { extractTextContent } from "../context/workspace.js";
8
- import { extractProfileAgentId } from "../../config/agent-profile.js";
9
8
  import { init_sync_provider_auth, resolveProviderApiKeySync } from "../../auth/sync-provider-auth.js";
10
9
  import { getApiKeySync, init_providers, resolveModel } from "../../providers/index.js";
11
10
  import { createExtensionAwareStreamFn } from "../../providers/extension-stream-bridge.js";
12
11
  import { trackAiUsageStream } from "../../usage/recorder.js";
12
+ import { extractProfileAgentId } from "../../config/agent-profile.js";
13
13
  import { getAssertionSlot, listUserAssertions } from "../../user-model/repository.js";
14
14
  import { readAgentMessageContent } from "../memory/agent-message-access.js";
15
15
  import { isAssistantTurnAborted, isAssistantTurnFailed } from "../orchestration/llm-turn-retry.js";
@@ -1,4 +1,4 @@
1
- export type AgentRunErrorKind = 'provider_setup_required' | 'provider_auth_invalid' | 'rate_limit' | 'timeout' | 'billing' | 'xopc_quota_exhausted' | 'xopc_platform_limit' | 'unknown';
1
+ export type AgentRunErrorKind = 'provider_setup_required' | 'provider_auth_invalid' | 'rate_limit' | 'timeout' | 'billing' | 'xopc_quota_exhausted' | 'xopc_platform_limit' | 'xopc_credit_budget_exhausted' | 'unknown';
2
2
  export type AgentRunErrorPayload = {
3
3
  kind: AgentRunErrorKind;
4
4
  code: string;
@@ -67,6 +67,13 @@ function formatAgentRunErrorForClient(rawError, context) {
67
67
  message: trimmed
68
68
  });
69
69
  }
70
+ if (/credit_budget_exhausted|(?:task Credit|Credit task) budget exhausted/i.test(trimmed)) return JSON.stringify({
71
+ kind: "xopc_credit_budget_exhausted",
72
+ code: "credit_budget_exhausted",
73
+ message: trimmed,
74
+ provider: "xopc-cloud",
75
+ deepLink: "/settings/agent-defaults?panel=runtime"
76
+ });
70
77
  const reason = classifyFailoverReason(trimmed);
71
78
  const xopcPlatformLimit = context?.provider === "xopc-cloud" && XOPC_PLATFORM_LIMIT_RE.test(trimmed);
72
79
  const xopcQuotaExhausted = context?.provider === "xopc-cloud" && (XOPC_QUOTA_RE.test(trimmed) || reason === "billing");
@@ -1,6 +1,6 @@
1
1
  import { init_paths, resolveModelsJsonPath } from "../../config/paths.js";
2
- import { init_register_bundled_oauth_flows, registerBundledOAuthFlows } from "../../providers/register-bundled-oauth-flows.js";
3
2
  import { assertCurrentModelProvider, init_provider_policy } from "../../providers/provider-policy.js";
3
+ import { init_register_bundled_oauth_flows, registerBundledOAuthFlows } from "../../providers/register-bundled-oauth-flows.js";
4
4
  import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
5
5
  import { init_sync_provider_auth, resolveProviderApiKeySync } from "../../auth/sync-provider-auth.js";
6
6
  import { XopcModelCredentialStore, init_model_credential_store } from "../../auth/model-credential-store.js";
@@ -2,10 +2,10 @@ import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { parseTurnOutcome } from "../../../packages/gateway-contract/src/turn-outcome.js";
4
4
  import { init_src } from "../../../packages/gateway-contract/src/index.js";
5
- import { setTraceIdentity, startObservation, traceOperation, traceRun } from "../../observability/runtime.js";
6
- import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
7
5
  import { init_providers, resolveModel } from "../../providers/index.js";
8
6
  import { appendDynamicPromptSection } from "../prompt/cache-boundary.js";
7
+ import { setTraceIdentity, startObservation, traceOperation, traceRun } from "../../observability/runtime.js";
8
+ import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
9
9
  import { isPersonalConversation } from "../../personal-agent/repository.js";
10
10
  import { runWithEmbeddedExecutionSession } from "./execution-context.js";
11
11
  import { resolveAgentTurnTimeoutMs } from "../orchestration/run-agent-turn-with-timeout.js";
@@ -7,8 +7,9 @@ import { getSessionMetadata } from "../../storage/sqlite/session-read-repository
7
7
  import { init_session_repository } from "../../storage/sqlite/session-repository.js";
8
8
  import { init_sqlite } from "../../storage/sqlite/index.js";
9
9
  import { setTraceIdentity, traceOperation, traceRun, traceTools } from "../../observability/runtime.js";
10
- import { resolveEffectiveAgentConfigForSession } from "../../config/agent-profile.js";
11
10
  import { continuesAfterTool, trackAiUsageStream } from "../../usage/recorder.js";
11
+ import { cloudCreditBudgetStopMessage, isCloudCreditBudgetExhausted, reportCloudCreditError, withCloudCreditBudget } from "../../providers/xopc-cloud-credit-budget.js";
12
+ import { resolveEffectiveAgentConfigForSession } from "../../config/agent-profile.js";
12
13
  import { runWithEmbeddedExecutionSession } from "./execution-context.js";
13
14
  import { externalPolicyContext } from "./tool-metadata.js";
14
15
  import { isComputerControlActive, isComputerLeaseTool, stopComputerControl } from "../../computer/control-guard.js";
@@ -242,10 +243,45 @@ async function maybeRecoverInterruptedContext(params) {
242
243
  return true;
243
244
  }
244
245
  async function runXopcEmbeddedTurn(params) {
245
- return traceRun("agent.run", {
246
+ const limitCreditMicro = isXopcDatabaseOpen() && getSessionMetadata(params.conversationId) ? resolveEffectiveAgentConfigForSession(params.conversationId).config.runtime.cloudCreditLimitPerRunMicro : void 0;
247
+ return withCloudCreditBudget({
246
248
  conversationId: params.conversationId,
247
- runId: params.runId
248
- }, () => runXopcEmbeddedTurnInner(params), params.userMessage);
249
+ runId: params.runId,
250
+ limitCreditMicro
251
+ }, async () => {
252
+ try {
253
+ const result = await traceRun("agent.run", {
254
+ conversationId: params.conversationId,
255
+ runId: params.runId
256
+ }, () => runXopcEmbeddedTurnInner(params), params.userMessage);
257
+ const stopped = cloudCreditBudgetStopMessage();
258
+ if (stopped) return {
259
+ ...result,
260
+ ok: false,
261
+ retryable: false,
262
+ errorMessage: stopped
263
+ };
264
+ if (result.errorMessage && isCloudCreditBudgetExhausted(result.errorMessage)) {
265
+ reportCloudCreditError(result.errorMessage);
266
+ return {
267
+ ...result,
268
+ retryable: false
269
+ };
270
+ }
271
+ return result;
272
+ } catch (error) {
273
+ const message = error instanceof Error ? error.message : String(error);
274
+ if (isCloudCreditBudgetExhausted(message)) {
275
+ reportCloudCreditError(message);
276
+ return {
277
+ ok: false,
278
+ retryable: false,
279
+ errorMessage: message
280
+ };
281
+ }
282
+ throw error;
283
+ }
284
+ });
249
285
  }
250
286
  async function runXopcEmbeddedTurnInner(params) {
251
287
  const { conversationId, runId, userMessage, model, tools: rawTools, systemPrompt, thinkingLevel, workspaceDir, sessionStore, onEvent } = params;
@@ -1,6 +1,8 @@
1
1
  import "../../providers/constants.js";
2
2
  import { init_providers } from "../../providers/index.js";
3
3
  import { createExtensionAwareStreamFn } from "../../providers/extension-stream-bridge.js";
4
+ import { withCloudUsageResponse } from "../../usage/cloud-receipts.js";
5
+ import { assertCloudCreditBudgetActive, cloudCreditBudgetHeaders, hasCloudCreditBudget, reportCloudCreditError } from "../../providers/xopc-cloud-credit-budget.js";
4
6
  import { preparePromptCacheContext, withPromptCachePayloadTransform } from "../../providers/prompt-cache-payload.js";
5
7
  import { getCurrentSystemPrompt, getCurrentTools, normalizeContext } from "@earendil-works/pi-ai";
6
8
  //#region src/agent/embedded/xopc-stream-bridge.ts
@@ -17,6 +19,8 @@ init_providers();
17
19
  function wrapStreamFnForXopcExtensions(originalStreamFn, promptCachePolicy) {
18
20
  const extensionStreamFn = createExtensionAwareStreamFn();
19
21
  return ((model, context, options) => {
22
+ assertCloudCreditBudgetActive();
23
+ if (model.provider === "xopc-cloud") options = withCloudUsageResponse(options);
20
24
  const promptContext = {
21
25
  systemPrompt: getCurrentSystemPrompt(context.messages),
22
26
  tools: getCurrentTools(context.messages)
@@ -28,6 +32,20 @@ function wrapStreamFnForXopcExtensions(originalStreamFn, promptCachePolicy) {
28
32
  messages: context.messages.filter((message) => message.role !== "system")
29
33
  });
30
34
  if (model.baseUrl === "extension://provider-plugin") return extensionStreamFn(model, providerContext, options);
35
+ if (model.provider === "xopc-cloud" && hasCloudCreditBudget()) return (async () => {
36
+ const headers = await cloudCreditBudgetHeaders();
37
+ const stream = await originalStreamFn(model, providerContext, withPromptCachePayloadTransform(model, promptContext, {
38
+ ...options,
39
+ headers: {
40
+ ...options?.headers,
41
+ ...headers
42
+ }
43
+ }, promptCachePolicy));
44
+ stream.result().then((message) => {
45
+ if (message.errorMessage) reportCloudCreditError(message.errorMessage);
46
+ }).catch(() => {});
47
+ return stream;
48
+ })();
31
49
  return originalStreamFn(model, providerContext, withPromptCachePayloadTransform(model, promptContext, options, promptCachePolicy));
32
50
  });
33
51
  }
@@ -35,6 +35,7 @@ export interface OpenAiImagesEndpointResolution {
35
35
  privateNetworkPolicy?: PrivateNetworkPolicy;
36
36
  }
37
37
  export interface OpenAiImagesProviderOptions {
38
+ onResponse?: (response: Response) => void;
38
39
  id: string;
39
40
  label: string;
40
41
  defaultModel: string;
@@ -45,7 +46,7 @@ export interface OpenAiImagesProviderOptions {
45
46
  /** Resolve API key for one request. May return null when using OAuth/header auth. */
46
47
  resolveApiKey: (req: ImageGenerationRequest) => string | null | undefined | Promise<string | null | undefined>;
47
48
  /** Resolve endpoint info per-request (region, baseUrl override, Azure deployment, …). */
48
- resolveEndpoint: (req: ImageGenerationRequest) => OpenAiImagesEndpointResolution;
49
+ resolveEndpoint: (req: ImageGenerationRequest) => OpenAiImagesEndpointResolution | Promise<OpenAiImagesEndpointResolution>;
49
50
  /** Default per-call timeout. Combined with provider-level config in provider-http. */
50
51
  defaultTimeoutMs?: number;
51
52
  /** Default image count. Provider may also enforce via `capabilities.generate.maxCount`. */
@@ -28,7 +28,7 @@ function createOpenAiImagesProvider(options) {
28
28
  isConfigured: options.isConfigured,
29
29
  async generateImage(req) {
30
30
  const apiKey = await options.resolveApiKey(req) ?? null;
31
- const endpoint = options.resolveEndpoint(req);
31
+ const endpoint = await options.resolveEndpoint(req);
32
32
  const httpDefaults = resolveProviderHttpRequestConfig({
33
33
  providerId: options.id,
34
34
  cfg: req.cfg,
@@ -75,7 +75,8 @@ function createOpenAiImagesProvider(options) {
75
75
  count,
76
76
  size,
77
77
  httpDefaults,
78
- ssrfGuardOptions
78
+ ssrfGuardOptions,
79
+ onResponse: options.onResponse
79
80
  }) : await postGenerateRequest({
80
81
  providerId: options.id,
81
82
  req,
@@ -84,7 +85,8 @@ function createOpenAiImagesProvider(options) {
84
85
  count,
85
86
  size,
86
87
  httpDefaults,
87
- ssrfGuardOptions
88
+ ssrfGuardOptions,
89
+ onResponse: options.onResponse
88
90
  }), {
89
91
  ...req,
90
92
  count
@@ -111,14 +113,16 @@ async function postGenerateRequest(params) {
111
113
  resolution: params.req.resolution
112
114
  } };
113
115
  const timeoutMs = pickTimeoutMsOrFallback(params.req.timeoutMs, params.httpDefaults.timeoutMs, DEFAULT_TIMEOUT_MS);
114
- return await readJsonResponseLimited(await postJsonRequest(params.url, {
116
+ const res = await postJsonRequest(params.url, {
115
117
  label: params.providerId,
116
118
  timeoutMs,
117
119
  signal: params.req.signal,
118
120
  body,
119
121
  headers: params.headers,
120
122
  ...params.ssrfGuardOptions
121
- }), MAX_RESPONSE_BYTES);
123
+ });
124
+ params.onResponse?.(res);
125
+ return await readJsonResponseLimited(res, MAX_RESPONSE_BYTES);
122
126
  }
123
127
  async function postEditRequest(params) {
124
128
  const inputImages = params.req.inputImages ?? [];
@@ -148,14 +152,16 @@ async function postEditRequest(params) {
148
152
  const headers = new Headers(params.headers);
149
153
  headers.delete("content-type");
150
154
  const timeoutMs = pickTimeoutMsOrFallback(params.req.timeoutMs, params.httpDefaults.timeoutMs, DEFAULT_TIMEOUT_MS);
151
- return await readJsonResponseLimited(await postMultipartRequest(params.url, {
155
+ const res = await postMultipartRequest(params.url, {
152
156
  label: params.providerId,
153
157
  timeoutMs,
154
158
  signal: params.req.signal,
155
159
  body: form,
156
160
  headers,
157
161
  ...params.ssrfGuardOptions
158
- }), MAX_RESPONSE_BYTES);
162
+ });
163
+ params.onResponse?.(res);
164
+ return await readJsonResponseLimited(res, MAX_RESPONSE_BYTES);
159
165
  }
160
166
  function mapOpenAiImagesResponse(raw, req) {
161
167
  if (!raw || typeof raw !== "object") return [];
@@ -1,7 +1,10 @@
1
1
  import { getModelCatalogStore, init_model_catalog_store } from "../../../../providers/model-catalog-store.js";
2
2
  import { init_xopc_cloud_config, resolveXopcModelRouterUrl } from "../../../../providers/xopc-cloud-config.js";
3
3
  import { getProviderAuthService, init_provider_auth_service } from "../../../../providers/provider-auth-service.js";
4
+ import { captureCloudUsageResponse } from "../../../../usage/cloud-receipts.js";
5
+ import { cloudCreditBudgetHeaders, reportCloudCreditError } from "../../../../providers/xopc-cloud-credit-budget.js";
4
6
  import { compareCatalogModels } from "../../../../providers/model-catalog-ranking.js";
7
+ import { trackCloudCapabilityUsage } from "../../../../usage/cloud-capability.js";
5
8
  import { createOpenAiImagesProvider } from "../openai-images-provider.js";
6
9
  //#region src/agent/image/generation/providers/xopc-cloud.ts
7
10
  init_model_catalog_store();
@@ -23,7 +26,11 @@ function buildXopcCloudImageGenerationProvider() {
23
26
  capabilities: modelCapabilities[model.id],
24
27
  isConfigured: () => true,
25
28
  resolveApiKey: (request) => getProviderAuthService().resolveApiKey("xopc-cloud", request.signal),
26
- resolveEndpoint: () => ({ baseUrl }),
29
+ resolveEndpoint: async () => ({
30
+ baseUrl,
31
+ headers: await cloudCreditBudgetHeaders()
32
+ }),
33
+ onResponse: captureCloudUsageResponse,
27
34
  ...model.imageGeneration?.geometry?.sizes?.[0] ? { defaultSize: model.imageGeneration.geometry.sizes[0] } : {}
28
35
  })]));
29
36
  return {
@@ -38,7 +45,12 @@ function buildXopcCloudImageGenerationProvider() {
38
45
  async generateImage(request) {
39
46
  const executor = executors.get(request.model);
40
47
  if (!executor) throw new Error(`Image model is not available from XOPC Model Service: ${request.model}`);
41
- return executor.generateImage(request);
48
+ try {
49
+ return await trackCloudCapabilityUsage(request.model, "images.generate", () => executor.generateImage(request));
50
+ } catch (error) {
51
+ reportCloudCreditError(error instanceof Error ? error.message : String(error));
52
+ throw error;
53
+ }
42
54
  }
43
55
  };
44
56
  }
@@ -1,7 +1,7 @@
1
1
  import { init_agent_scope, resolveDefaultAgentId } from "../agent-scope.js";
2
2
  import { getAgentDefaultImageModelConfig, getAgentDefaultModelRef, init_schema, parseModelRef } from "../../config/schema.js";
3
- import { resolveEffectiveAgentConfigForAgent } from "../../config/agent-profile.js";
4
3
  import { getDefaultModelSync, getModelsByProvider, init_providers, isProviderConfiguredSync, resolveModel } from "../../providers/index.js";
4
+ import { resolveEffectiveAgentConfigForAgent } from "../../config/agent-profile.js";
5
5
  import { resolveAgentModelFallbackValues, resolveAgentModelPrimaryValue } from "../../config/model-input.js";
6
6
  import { buildCapabilityPlansForConfig } from "../../capabilities/readiness/from-config.js";
7
7
  import "../../capabilities/readiness/index.js";
@@ -3,12 +3,12 @@ import { init_logger } from "../utils/logger.js";
3
3
  import { init_attachment_ref, parseNoteAttachmentTarget } from "../notes/attachment-ref.js";
4
4
  import { init_agent_scope, resolveAgentHomeDir, resolveDefaultAgentId } from "./agent-scope.js";
5
5
  import { extractTextContent } from "./context/workspace.js";
6
- import { configureTracing, flushTracing } from "../observability/runtime.js";
7
6
  import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
8
- import { applyConfigOverrides } from "../config/runtime-overrides.js";
9
7
  import { init_agent_session_key, resolveAgentIdFromConversationId } from "../routing/agent-session-key.js";
10
- import { extractProfileAgentId, resolveEffectiveAgentConfigForSession } from "../config/agent-profile.js";
11
8
  import { init_providers, resolveModel } from "../providers/index.js";
9
+ import { configureTracing, flushTracing } from "../observability/runtime.js";
10
+ import { applyConfigOverrides } from "../config/runtime-overrides.js";
11
+ import { extractProfileAgentId, resolveEffectiveAgentConfigForSession } from "../config/agent-profile.js";
12
12
  import { effectiveWorkspacePathForSession } from "../session/session-workspace.js";
13
13
  import { getProjectForSession } from "../projects/workspace.js";
14
14
  import { getUserTimezone } from "../user-model/repository.js";
@@ -1,8 +1,8 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { init_workspace_defaults, resolveDefaultAgentWorkspaceDir } from "../../config/workspace-defaults.js";
4
- import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
5
4
  import { init_providers, resolveModel } from "../../providers/index.js";
5
+ import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
6
6
  import { getExecutionEnvironmentForSession } from "../../execution-environments/subject.js";
7
7
  import { effectiveWorkspacePathForSession, projectWorkspacePath } from "../../session/session-workspace.js";
8
8
  import { getProjectForSession } from "../../projects/workspace.js";
@@ -2,13 +2,13 @@ import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { TaskRepository, init_task_repository } from "../../tasks/task-repository.js";
4
4
  import { TaskRunRepository, init_task_run_repository } from "../../tasks/task-run-repository.js";
5
+ import { extractAssistantText, getAssistantMessageErrorReason, stripCodeFences } from "../../providers/model-response.js";
5
6
  import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
6
- import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
7
7
  import { getApiKey, init_providers, resolveModel } from "../../providers/index.js";
8
+ import { completeWithResolvedCredentials } from "../../providers/model-call.js";
9
+ import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
8
10
  import { TaskConversationRepository } from "../../tasks/task-conversation-repository.js";
9
11
  import { readWorkspaceRevision } from "../coding/workspace-revision.js";
10
- import { completeWithResolvedCredentials } from "../../providers/model-call.js";
11
- import { extractAssistantText, getAssistantMessageErrorReason, stripCodeFences } from "../../providers/model-response.js";
12
12
  import { TaskApplicationService } from "../../tasks/task-application-service.js";
13
13
  //#region src/agent/tasks/task-judge-service.ts
14
14
  init_schema();
@@ -163,6 +163,7 @@ export declare const RuntimePolicySchema: z.ZodObject<{
163
163
  "read-write": "read-write";
164
164
  }>>;
165
165
  }, z.core.$strict>], "mode">>;
166
+ cloudCreditLimitPerRunMicro: z.ZodOptional<z.ZodString>;
166
167
  maxTurns: z.ZodOptional<z.ZodNumber>;
167
168
  timeoutMs: z.ZodOptional<z.ZodNumber>;
168
169
  maxToolFailuresPerTurn: z.ZodOptional<z.ZodNumber>;
@@ -258,6 +259,7 @@ export declare const AgentDefaultsSchema: z.ZodObject<{
258
259
  "read-write": "read-write";
259
260
  }>>;
260
261
  }, z.core.$strict>], "mode">>;
262
+ cloudCreditLimitPerRunMicro: z.ZodOptional<z.ZodString>;
261
263
  maxTurns: z.ZodOptional<z.ZodNumber>;
262
264
  timeoutMs: z.ZodOptional<z.ZodNumber>;
263
265
  maxToolFailuresPerTurn: z.ZodOptional<z.ZodNumber>;
@@ -476,6 +478,7 @@ export declare const AgentEntrySchema: z.ZodObject<{
476
478
  "read-write": "read-write";
477
479
  }>>;
478
480
  }, z.core.$strict>], "mode">>;
481
+ cloudCreditLimitPerRunMicro: z.ZodOptional<z.ZodString>;
479
482
  maxTurns: z.ZodOptional<z.ZodNumber>;
480
483
  timeoutMs: z.ZodOptional<z.ZodNumber>;
481
484
  maxToolFailuresPerTurn: z.ZodOptional<z.ZodNumber>;
@@ -620,6 +623,7 @@ export declare const EffectiveAgentConfigSchema: z.ZodObject<{
620
623
  "read-write": "read-write";
621
624
  }>>;
622
625
  }, z.core.$strict>], "mode">>;
626
+ cloudCreditLimitPerRunMicro: z.ZodOptional<z.ZodString>;
623
627
  maxTurns: z.ZodOptional<z.ZodNumber>;
624
628
  timeoutMs: z.ZodOptional<z.ZodNumber>;
625
629
  maxToolFailuresPerTurn: z.ZodOptional<z.ZodNumber>;
@@ -114,6 +114,7 @@ var init_schema = __esmMin((() => {
114
114
  network: z.boolean().default(false),
115
115
  workspaceAccess: z.enum(["read-only", "read-write"]).default("read-only")
116
116
  }).strict()]).optional(),
117
+ cloudCreditLimitPerRunMicro: z.string().regex(/^[1-9]\d{0,14}$/).optional(),
117
118
  maxTurns: z.number().int().positive().optional(),
118
119
  timeoutMs: z.number().int().positive().optional(),
119
120
  maxToolFailuresPerTurn: z.number().int().positive().optional(),
@@ -1,10 +1,10 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
+ import { getAssistantMessageErrorReason, stripCodeFences } from "../providers/model-response.js";
3
4
  import { getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
4
5
  import { createExtensionAwareStreamFn } from "../providers/extension-stream-bridge.js";
5
6
  import { trackAiUsageStream } from "../usage/recorder.js";
6
7
  import { isLocalModelBaseUrl, resolveModelCallApiKey, resolveModelCallOptions } from "../providers/model-call.js";
7
- import { getAssistantMessageErrorReason, stripCodeFences } from "../providers/model-response.js";
8
8
  import { normalizeContext } from "@earendil-works/pi-ai";
9
9
  //#region src/ai-assist/text-assist.ts
10
10
  init_providers();