@xopcai/xopc 0.0.372 → 0.0.374

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 (241) 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-BrA20N2m.js} +1 -1
  5. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BZrOdxou.js +1 -0
  6. package/dist/gateway/static/root/assets/{agent-plugin-dialog-BYB0G2aF.js → agent-plugin-dialog-B3ux1AhY.js} +1 -1
  7. package/dist/gateway/static/root/assets/{agents-D0JBkZPV.js → agents-CXlXFU6M.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-BXahEVPm.js} +1 -1
  10. package/dist/gateway/static/root/assets/{appearance-settings-BfavIBbb.js → appearance-settings-CE2qJMkD.js} +1 -1
  11. package/dist/gateway/static/root/assets/{apps-page-CUS5S1qa.js → apps-page-DGVOnCxZ.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-BWL7eT4_.js} +1 -1
  14. package/dist/gateway/static/root/assets/{automations-workspace-LQsa5ohY.js → automations-workspace-BxIShhkZ.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-3n446-mX.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-BmTK7Gtn.js} +1 -1
  19. package/dist/gateway/static/root/assets/{browser-settings-page-CKlt_8IS.js → browser-settings-page-DBQ-WETQ.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-D-nQ6Zzi.js} +2 -2
  23. package/dist/gateway/static/root/assets/{capabilities-settings-panel-C9HIr2CZ.js → capabilities-settings-panel-Dx1fpBmH.js} +6 -6
  24. package/dist/gateway/static/root/assets/{capability-header-actions-uxIiW_2_.js → capability-header-actions-BRMqvQVb.js} +1 -1
  25. package/dist/gateway/static/root/assets/{channels-By3dmQ4Y.js → channels-DXfEP1FR.js} +1 -1
  26. package/dist/gateway/static/root/assets/{chat-terminal-dock-DeDTSl64.js → chat-terminal-dock-BRdzCjWO.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-BhCHMRpD.js} +1 -1
  29. package/dist/gateway/static/root/assets/{connector-service-page-D664WEhj.js → connector-service-page-BXE8Z-Ll.js} +1 -1
  30. package/dist/gateway/static/root/assets/{connectors-page-sjyjY7Fl.js → connectors-page-D9RZjhw8.js} +1 -1
  31. package/dist/gateway/static/root/assets/{date-picker-BVmFrPfX.js → date-picker-BJ7N92wm.js} +1 -1
  32. package/dist/gateway/static/root/assets/{dependency-picker-YIoP-e5-.js → dependency-picker-gyxCM-hb.js} +1 -1
  33. package/dist/gateway/static/root/assets/{desktop-pet-CzS468vR.js → desktop-pet-B-WM4l-L.js} +1 -1
  34. package/dist/gateway/static/root/assets/{desktop-pet-settings-BPcgZUcK.js → desktop-pet-settings-usJqcew5.js} +1 -1
  35. package/dist/gateway/static/root/assets/{device-pairing-wizard-Cgba-4m9.js → device-pairing-wizard-DoSR4DGk.js} +1 -1
  36. package/dist/gateway/static/root/assets/{directory-picker-path-field-_nHmZtnY.js → directory-picker-path-field-DqVlV2YH.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-CUule9SU.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-_OFukkEJ.js} +1 -1
  41. package/dist/gateway/static/root/assets/{fallback-models-CUHrPpGV.js → fallback-models-CiSc3h8i.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-qSUrpS1h.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-COjDsuzg.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-DdvIj-ZL.js} +1 -1
  50. package/dist/gateway/static/root/assets/{index-BWDK2eIj.js → index-DEaVabvo.js} +7 -7
  51. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DWazrDgz.js → keyboard-shortcuts-settings-DbqFlNsF.js} +1 -1
  52. package/dist/gateway/static/root/assets/{local-app-workbench-page-CkxDdlYU.js → local-app-workbench-page-REowUzkp.js} +1 -1
  53. package/dist/gateway/static/root/assets/{local-apps-page-BISZ4bi5.js → local-apps-page-DdCMNn_z.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-B_6fHDoi.js} +1 -1
  57. package/dist/gateway/static/root/assets/management-settings-D4vcSRE3.js +1 -0
  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-B7U6EbAi.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-BzHVaH8j.js} +1 -1
  65. package/dist/gateway/static/root/assets/{page-context-capture-button-Yt-BpPRh.js → page-context-capture-button-D7Y4vFRN.js} +1 -1
  66. package/dist/gateway/static/root/assets/personal-page-E6huhFk4.js +1 -0
  67. package/dist/gateway/static/root/assets/{product-open-page-etM6Ijfe.js → product-open-page-CK_czbBx.js} +1 -1
  68. package/dist/gateway/static/root/assets/{product-preview-content-C6aeRrWe.js → product-preview-content-CU6KlaVP.js} +1 -1
  69. package/dist/gateway/static/root/assets/{project-detail-page-K4ASOTki.js → project-detail-page-c3ye2bdq.js} +1 -1
  70. package/dist/gateway/static/root/assets/{projects-page-BssImjwl.js → projects-page-BA1UuuRF.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-D_FLVZAm.js} +1 -1
  73. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-BJAzqQik.js → runtime-tools-settings-panel-Cxjmwdyf.js} +1 -1
  74. package/dist/gateway/static/root/assets/{scenes-page-uZUXm03X.js → scenes-page-Av47PHdM.js} +1 -1
  75. package/dist/gateway/static/root/assets/{schema-form-SA3Ld7zf.js → schema-form-IM7QeSm3.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-Bol3ScEc.js} +1 -1
  80. package/dist/gateway/static/root/assets/settings-advanced-gate-DpCanqrD.js +1 -0
  81. package/dist/gateway/static/root/assets/{settings-page-CUJQMNF7.js → settings-page-BeVtwwVd.js} +1 -1
  82. package/dist/gateway/static/root/assets/{setup-status-panel-BGBWC0Bc.js → setup-status-panel-zTmrMwMm.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-Bkhkt_6M.js} +1 -1
  87. package/dist/gateway/static/root/assets/{skill-api-9XSn7R8L.js → skill-api-Dgwc707w.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-CFIte-vM.js} +1 -1
  90. package/dist/gateway/static/root/assets/{system-settings-panel-B6axBPLO.js → system-settings-panel-Ck6zGDHb.js} +1 -1
  91. package/dist/gateway/static/root/assets/{task-detail-page-ftCTqBDB.js → task-detail-page-C3ZPEZqw.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-CjxMpAm2.js} +1 -1
  96. package/dist/gateway/static/root/assets/usage-page-Dnhp9xQ4.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-sx1lNWKf.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-CVd_y3K2.js} +1 -1
  104. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BBwx-tUb.js → workflow-run-setup-panel-Dwg40uGK.js} +1 -1
  105. package/dist/gateway/static/root/assets/{workflows-page-BHigZn6E.js → workflows-page-BQR4JdXB.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-CaKc_J7j.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/packages/realtime-protocol/src/voice.js +11 -0
  113. package/dist/src/agent/client-error-format.d.ts +1 -1
  114. package/dist/src/agent/client-error-format.js +7 -0
  115. package/dist/src/agent/embedded/run-turn.js +39 -3
  116. package/dist/src/agent/embedded/xopc-stream-bridge.js +18 -0
  117. package/dist/src/agent/image/generation/openai-images-provider.d.ts +2 -1
  118. package/dist/src/agent/image/generation/openai-images-provider.js +13 -7
  119. package/dist/src/agent/image/generation/providers/xopc-cloud.js +14 -2
  120. package/dist/src/agent-config/schema.d.ts +13 -0
  121. package/dist/src/agent-config/schema.js +2 -0
  122. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  123. package/dist/src/cli/commands/gateway/shared.js +2 -1
  124. package/dist/src/cli/commands/models.js +41 -0
  125. package/dist/src/computer/runtime.js +3 -0
  126. package/dist/src/config/gateway-bind.js +2 -1
  127. package/dist/src/config/index.js +2 -2
  128. package/dist/src/config/models-json.d.ts +8 -8
  129. package/dist/src/config/schema.d.ts +13 -12
  130. package/dist/src/config/schema.js +7 -3
  131. package/dist/src/daemon/constants.js +14 -9
  132. package/dist/src/daemon/index.js +4 -1
  133. package/dist/src/daemon/install-plan.js +2 -1
  134. package/dist/src/daemon/launchd.js +2 -1
  135. package/dist/src/daemon/schtasks.js +2 -1
  136. package/dist/src/daemon/service-audit.js +2 -1
  137. package/dist/src/daemon/service.js +2 -1
  138. package/dist/src/daemon/systemd.js +2 -1
  139. package/dist/src/gateway/client-ip.js +2 -1
  140. package/dist/src/gateway/hono/app.js +2 -1
  141. package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -0
  142. package/dist/src/gateway/hono/middleware/auth.d.ts +3 -5
  143. package/dist/src/gateway/hono/middleware/auth.js +56 -14
  144. package/dist/src/gateway/hono/middleware/logger.js +2 -1
  145. package/dist/src/gateway/hono/middleware/public-device-rate-limit.d.ts +16 -0
  146. package/dist/src/gateway/hono/middleware/public-device-rate-limit.js +43 -0
  147. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +3 -2
  148. package/dist/src/gateway/hono/oauth-async.js +2 -1
  149. package/dist/src/gateway/hono/routes/browser.js +2 -1
  150. package/dist/src/gateway/hono/routes/config.js +2 -1
  151. package/dist/src/gateway/hono/routes/device-pairing-approval.d.ts +3 -8
  152. package/dist/src/gateway/hono/routes/device-pairing-approval.js +5 -20
  153. package/dist/src/gateway/hono/routes/devices.js +25 -9
  154. package/dist/src/gateway/hono/routes/endpoint-tools.js +1 -0
  155. package/dist/src/gateway/hono/routes/models.js +1 -1
  156. package/dist/src/gateway/hono/routes/personal-agent.js +3 -2
  157. package/dist/src/gateway/hono/routes/public-gateway.js +6 -6
  158. package/dist/src/gateway/hono/routes/shares.js +2 -1
  159. package/dist/src/gateway/hono/routes/usage.js +15 -5
  160. package/dist/src/gateway/hono/routes/voice.js +1 -0
  161. package/dist/src/gateway/host.js +9 -4
  162. package/dist/src/gateway/index.js +8 -4
  163. package/dist/src/gateway/listen.js +2 -1
  164. package/dist/src/gateway/rate-limit/auth-policy.js +7 -11
  165. package/dist/src/gateway/rate-limit/buckets.d.ts +6 -0
  166. package/dist/src/gateway/rate-limit/buckets.js +211 -189
  167. package/dist/src/gateway/rate-limit/env-flags.js +4 -1
  168. package/dist/src/gateway/rate-limit/index.js +13 -4
  169. package/dist/src/gateway/runtime-config.js +5 -3
  170. package/dist/src/gateway/security/audit.js +3 -2
  171. package/dist/src/gateway/security/browser-session.js +2 -1
  172. package/dist/src/gateway/security/device-request-proof.d.ts +28 -0
  173. package/dist/src/gateway/security/device-request-proof.js +122 -0
  174. package/dist/src/gateway/security/loopback.js +7 -6
  175. package/dist/src/gateway/service.js +8 -6
  176. package/dist/src/gateway/tailscale-auth.js +2 -1
  177. package/dist/src/gateway/ws-security.js +2 -1
  178. package/dist/src/infra/rate-limit/failure-limiter.js +78 -90
  179. package/dist/src/infra/rate-limit/index.js +11 -3
  180. package/dist/src/infra/rate-limit/keyed-store.js +52 -47
  181. package/dist/src/infra/rate-limit/rate-limiter.js +55 -58
  182. package/dist/src/infra/update-service-refresh.js +2 -1
  183. package/dist/src/personal-agent/repository.d.ts +3 -0
  184. package/dist/src/personal-agent/repository.js +1 -0
  185. package/dist/src/personal-agent/service.d.ts +6 -2
  186. package/dist/src/personal-agent/service.js +4 -3
  187. package/dist/src/platform/client.d.ts +2 -2
  188. package/dist/src/platform/contracts.d.ts +2 -2
  189. package/dist/src/providers/model-call.js +15 -1
  190. package/dist/src/providers/xopc-cloud-account-service.d.ts +7 -23
  191. package/dist/src/providers/xopc-cloud-account-service.js +49 -29
  192. package/dist/src/providers/xopc-cloud-credit-budget.d.ts +14 -0
  193. package/dist/src/providers/xopc-cloud-credit-budget.js +61 -0
  194. package/dist/src/realtime/runtime.js +6 -0
  195. package/dist/src/realtime/tickets.d.ts +1 -0
  196. package/dist/src/realtime/tickets.js +4 -0
  197. package/dist/src/remote-access/exposure-guards.js +2 -1
  198. package/dist/src/share/share-rate-limit.js +2 -1
  199. package/dist/src/share/share-url.js +2 -1
  200. package/dist/src/share/site-share-router.js +2 -1
  201. package/dist/src/storage/sqlite/ai-usage-repository.d.ts +9 -0
  202. package/dist/src/storage/sqlite/ai-usage-repository.js +94 -5
  203. package/dist/src/storage/sqlite/device-access-repository.d.ts +7 -0
  204. package/dist/src/storage/sqlite/device-access-repository.js +22 -4
  205. package/dist/src/storage/sqlite/migrations/242_cloud_usage_receipts.sql +5 -0
  206. package/dist/src/storage/sqlite/migrations/243_voice_opening_greetings.sql +12 -0
  207. package/dist/src/storage/sqlite/migrations/244_device_request_proofs.sql +8 -0
  208. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  209. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  210. package/dist/src/storage/sqlite/schema.js +1 -1
  211. package/dist/src/tunnel/broker-client.js +2 -0
  212. package/dist/src/tunnel/tunnel-config.js +2 -2
  213. package/dist/src/tunnel/tunnel-rate-limit.js +2 -1
  214. package/dist/src/usage/cloud-capability.d.ts +2 -0
  215. package/dist/src/usage/cloud-capability.js +34 -0
  216. package/dist/src/usage/cloud-receipts.d.ts +10 -0
  217. package/dist/src/usage/cloud-receipts.js +55 -0
  218. package/dist/src/usage/cost.js +1 -0
  219. package/dist/src/usage/recorder.js +3 -1
  220. package/dist/src/usage/scenario-registry.js +15 -0
  221. package/dist/src/utils/logger/redact.js +4 -1
  222. package/dist/src/voice/platform-streams.d.ts +6 -0
  223. package/dist/src/voice/platform-streams.js +43 -4
  224. package/dist/src/voice/realtime/agentEngine.js +138 -83
  225. package/dist/src/voice/realtime/engine.d.ts +6 -0
  226. package/dist/src/voice/realtime/opening-greeting.d.ts +12 -0
  227. package/dist/src/voice/realtime/opening-greeting.js +22 -0
  228. package/dist/src/voice/realtime/runtime.js +116 -22
  229. package/dist/src/voice/realtime/runtime.types.d.ts +4 -0
  230. package/dist/src/voice/stt/providers/xopc-cloud-transcription.js +28 -14
  231. package/dist/src/voice/tts/providers/xopc-cloud-speech.js +39 -29
  232. package/dist/src/voice/tts/speech-provider-types.d.ts +1 -0
  233. package/package.json +5 -5
  234. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BdxzGSiO.js +0 -1
  235. package/dist/gateway/static/root/assets/gateway-realtime-store-BheKaO6d.js +0 -1
  236. package/dist/gateway/static/root/assets/management-settings-GUpOcTqa.js +0 -1
  237. package/dist/gateway/static/root/assets/messages-Bb2GK-Nj.js +0 -3
  238. package/dist/gateway/static/root/assets/models-hub-cache-DyPPksMP.js +0 -1
  239. package/dist/gateway/static/root/assets/personal-page-C8SEQpEu.js +0 -1
  240. package/dist/gateway/static/root/assets/settings-advanced-gate-DmawLOHR.js +0 -1
  241. package/dist/gateway/static/root/assets/usage-page-BvPcpxTQ.js +0 -1
@@ -48,6 +48,7 @@ function toRecord(ownerId, agent, session) {
48
48
  userCallName: getUserProfileSnapshot().callName ?? null,
49
49
  appearance: appearanceFrom(agent),
50
50
  voicePreference: agent.profile?.voicePreference ?? null,
51
+ voiceCallPreferences: agent.profile?.voiceCallPreferences ?? { openingGreetingEnabled: true },
51
52
  preferences: agent.profile?.responsePreferences ?? DEFAULT_PERSONAL_PREFERENCES,
52
53
  revision: agent.revision,
53
54
  errorMessage: agent.provisioningError ?? null
@@ -63,9 +63,13 @@ export declare function patchPersonalProfile(service: PersonalAgentHost, ownerId
63
63
  provider: string;
64
64
  model: string;
65
65
  voice: string;
66
- } | null): Promise<PersonalAgentRecord | null>;
66
+ } | null, voiceCallPreferences?: {
67
+ openingGreetingEnabled: boolean;
68
+ }): Promise<PersonalAgentRecord | null>;
67
69
  export declare function updatePersonalProfileRecord(ownerId: string, revision: number, displayName: string, preferences: PersonalPreferences, appearance: PersonalAppearance, voicePreference?: {
68
70
  provider: string;
69
71
  model: string;
70
72
  voice: string;
71
- } | null): Promise<PersonalAgentRecord | null>;
73
+ } | null, voiceCallPreferences?: {
74
+ openingGreetingEnabled: boolean;
75
+ }): Promise<PersonalAgentRecord | null>;
@@ -159,14 +159,14 @@ async function provisionPersonalAgent(service, ownerId, requestedModel, availabl
159
159
  completePersonalOnboarding(ownerId);
160
160
  return getPersonalAgent(ownerId) ?? record;
161
161
  }
162
- async function patchPersonalProfile(service, ownerId, revision, displayName, preferences, appearance, voicePreference) {
163
- const updated = await updatePersonalProfileRecord(ownerId, revision, displayName, preferences, appearance, voicePreference);
162
+ async function patchPersonalProfile(service, ownerId, revision, displayName, preferences, appearance, voicePreference, voiceCallPreferences) {
163
+ const updated = await updatePersonalProfileRecord(ownerId, revision, displayName, preferences, appearance, voicePreference, voiceCallPreferences);
164
164
  if (!updated) return null;
165
165
  service.refreshAgentCatalog();
166
166
  service.agentService.evictSessionAgent(updated.conversationId);
167
167
  return updated;
168
168
  }
169
- async function updatePersonalProfileRecord(ownerId, revision, displayName, preferences, appearance, voicePreference) {
169
+ async function updatePersonalProfileRecord(ownerId, revision, displayName, preferences, appearance, voicePreference, voiceCallPreferences) {
170
170
  const current = new AgentCatalogRepository().get(personalAgentId(ownerId));
171
171
  if (!current || current.provisioningState !== "ready" || current.revision !== revision || getPersonalAgent(ownerId)?.state !== "ready") return null;
172
172
  const profile = {
@@ -175,6 +175,7 @@ async function updatePersonalProfileRecord(ownerId, revision, displayName, prefe
175
175
  emoji: appearanceEmoji(appearance),
176
176
  avatar: appearanceAvatar(appearance),
177
177
  ...voicePreference !== void 0 ? { voicePreference: voicePreference ?? void 0 } : {},
178
+ ...voiceCallPreferences ? { voiceCallPreferences } : {},
178
179
  responsePreferences: preferences,
179
180
  instructions: personalInstructions(preferences)
180
181
  };
@@ -66,10 +66,10 @@ export declare const RuntimeCommandSchema: z.ZodObject<{
66
66
  read: "read";
67
67
  write: "write";
68
68
  execute: "execute";
69
- admin: "admin";
70
- send: "send";
71
69
  purchase: "purchase";
70
+ send: "send";
72
71
  publish: "publish";
72
+ admin: "admin";
73
73
  }>>;
74
74
  }, z.core.$strict>;
75
75
  data: z.ZodObject<{
@@ -152,10 +152,10 @@ export declare const AgentManifestSchema: z.ZodObject<{
152
152
  read: "read";
153
153
  write: "write";
154
154
  execute: "execute";
155
- admin: "admin";
156
- send: "send";
157
155
  purchase: "purchase";
156
+ send: "send";
158
157
  publish: "publish";
158
+ admin: "admin";
159
159
  }>>;
160
160
  }, z.core.$strict>;
161
161
  data: z.ZodObject<{
@@ -1,7 +1,9 @@
1
1
  import { init_constants } from "./constants.js";
2
2
  import { getApiKey, init_providers } from "./index.js";
3
3
  import { createExtensionAwareStreamFn } from "./extension-stream-bridge.js";
4
+ import { withCloudUsageResponse } from "../usage/cloud-receipts.js";
4
5
  import { finishAiUsageFromMessage, observeAiUsageStream, startAiUsageCall } from "../usage/recorder.js";
6
+ import { assertCloudCreditBudgetActive, cloudCreditBudgetHeaders, reportCloudCreditError } from "./xopc-cloud-credit-budget.js";
5
7
  import { completeSimple, normalizeContext } from "@earendil-works/pi-ai/compat";
6
8
  //#region src/providers/model-call.ts
7
9
  init_constants();
@@ -25,12 +27,18 @@ async function resolveModelCallApiKey(model, credentialOptions) {
25
27
  return isLocalModelBaseUrl(model.baseUrl) ? "xopc-local" : void 0;
26
28
  }
27
29
  async function resolveModelCallOptions(model, options = {}, credentialOptions) {
30
+ assertCloudCreditBudgetActive();
31
+ if (model.provider === "xopc-cloud") options = withCloudUsageResponse(options);
28
32
  const apiKey = options.apiKey ?? await resolveModelCallApiKey(model, credentialOptions);
29
33
  if (!apiKey) throw new Error(`No API key for provider: ${model.provider}`);
30
34
  const { temperature, ...rest } = options;
31
35
  return {
32
36
  ...rest,
33
37
  apiKey,
38
+ ...model.provider === "xopc-cloud" ? { headers: {
39
+ ...options.headers,
40
+ ...await cloudCreditBudgetHeaders()
41
+ } } : {},
34
42
  ...temperature !== void 0 ? { temperature } : {}
35
43
  };
36
44
  }
@@ -54,9 +62,11 @@ async function completeWithResolvedCredentials(model, context, options, credenti
54
62
  return result;
55
63
  }
56
64
  const result = await usageCall.run(() => completeSimple(model, context, resolvedOptions));
65
+ if (result.errorMessage) reportCloudCreditError(result.errorMessage);
57
66
  finishAiUsageFromMessage(usageCall, result);
58
67
  return result;
59
68
  } catch (error) {
69
+ reportCloudCreditError(error instanceof Error ? error.message : String(error));
60
70
  usageCall?.finish({
61
71
  status: "failed",
62
72
  errorSummary: error instanceof Error ? error.message : String(error)
@@ -80,7 +90,11 @@ async function createResolvedModelStream(model, context, options, credentialOpti
80
90
  }
81
91
  });
82
92
  try {
83
- return observeAiUsageStream(await usageCall.run(() => createExtensionAwareStreamFn()(model, normalizeContext(context), resolvedOptions)), usageCall);
93
+ const stream = await usageCall.run(() => createExtensionAwareStreamFn()(model, normalizeContext(context), resolvedOptions));
94
+ stream.result().then((message) => {
95
+ if (message.errorMessage) reportCloudCreditError(message.errorMessage);
96
+ }).catch(() => {});
97
+ return observeAiUsageStream(stream, usageCall);
84
98
  } catch (error) {
85
99
  usageCall?.finish({
86
100
  status: "failed",
@@ -1,26 +1,6 @@
1
- import { z } from 'zod';
1
+ import { type CloudAccountSummary, type CloudCreditBudget, type CloudBillingReceipt } from '@xopcai/gateway-contract';
2
2
  import { type ProviderAuthService } from './provider-auth-service.js';
3
- declare const accountSummarySchema: z.ZodObject<{
4
- balance: z.ZodObject<{
5
- credits: z.ZodNumber;
6
- updatedAt: z.ZodString;
7
- }, z.core.$strip>;
8
- usage: z.ZodObject<{
9
- days: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<7>, z.ZodLiteral<30>]>;
10
- requests: z.ZodNumber;
11
- inputTokens: z.ZodNumber;
12
- outputTokens: z.ZodNumber;
13
- totalTokens: z.ZodNumber;
14
- errors: z.ZodNumber;
15
- averageLatencyMs: z.ZodNumber;
16
- chargedCredits: z.ZodNumber;
17
- }, z.core.$strip>;
18
- links: z.ZodObject<{
19
- details: z.ZodString;
20
- purchase: z.ZodString;
21
- }, z.core.$strip>;
22
- }, z.core.$strip>;
23
- export type XopcCloudAccountSummary = z.infer<typeof accountSummarySchema>;
3
+ export type XopcCloudAccountSummary = CloudAccountSummary;
24
4
  export declare class XopcCloudAccountError extends Error {
25
5
  readonly status: number;
26
6
  readonly code?: string;
@@ -35,6 +15,10 @@ export declare class XopcCloudAccountService {
35
15
  routerUrl?: string;
36
16
  credentials?: Pick<ProviderAuthService, 'resolveApiKey'>;
37
17
  });
18
+ private request;
19
+ private parse;
38
20
  getSummary(days?: 1 | 7 | 30): Promise<XopcCloudAccountSummary | null>;
21
+ createBudget(limitCreditMicro: string, key: string): Promise<CloudCreditBudget | null>;
22
+ getReceipt(requestId: string): Promise<CloudBillingReceipt | null>;
23
+ getBudget(id: string): Promise<CloudCreditBudget | null>;
39
24
  }
40
- export {};
@@ -1,33 +1,12 @@
1
+ import { cloudAccountSummarySchema, cloudBillingReceiptSchema, cloudCreditBudgetSchema, creditMicroSchema, creditUnitSchema } from "../../packages/gateway-contract/src/cloud-credits.js";
2
+ import { init_src } from "../../packages/gateway-contract/src/index.js";
1
3
  import { init_xopc_cloud_config, resolveXopcModelRouterUrl } from "./xopc-cloud-config.js";
2
4
  import { getProviderAuthService, init_provider_auth_service } from "./provider-auth-service.js";
3
5
  import { z } from "zod";
4
6
  //#region src/providers/xopc-cloud-account-service.ts
7
+ init_src();
5
8
  init_provider_auth_service();
6
9
  init_xopc_cloud_config();
7
- const accountSummarySchema = z.object({
8
- balance: z.object({
9
- credits: z.number().int().nonnegative(),
10
- updatedAt: z.string().datetime()
11
- }),
12
- usage: z.object({
13
- days: z.union([
14
- z.literal(1),
15
- z.literal(7),
16
- z.literal(30)
17
- ]),
18
- requests: z.number().int().nonnegative(),
19
- inputTokens: z.number().int().nonnegative(),
20
- outputTokens: z.number().int().nonnegative(),
21
- totalTokens: z.number().int().nonnegative(),
22
- errors: z.number().int().nonnegative(),
23
- averageLatencyMs: z.number().nonnegative(),
24
- chargedCredits: z.number().int().nonnegative()
25
- }),
26
- links: z.object({
27
- details: z.string().url(),
28
- purchase: z.string().url()
29
- })
30
- });
31
10
  var XopcCloudAccountError = class extends Error {
32
11
  constructor(message, status, code) {
33
12
  super(message);
@@ -45,22 +24,63 @@ var XopcCloudAccountService = class {
45
24
  this.routerUrl = resolveXopcModelRouterUrl(options.routerUrl);
46
25
  this.credentials = options.credentials ?? getProviderAuthService();
47
26
  }
48
- async getSummary(days = 7) {
27
+ async request(path, init) {
49
28
  const accessToken = await this.credentials.resolveApiKey("xopc-cloud");
50
29
  if (!accessToken) return null;
51
- const response = await this.fetchImpl(`${this.routerUrl}/account/summary?days=${days}`, {
30
+ const response = await this.fetchImpl(`${this.routerUrl}${path}`, {
31
+ ...init,
52
32
  headers: {
33
+ ...Object.fromEntries(new Headers(init?.headers)),
53
34
  authorization: `Bearer ${accessToken}`,
54
35
  accept: "application/json"
55
36
  },
56
- signal: AbortSignal.timeout(3e4)
37
+ signal: AbortSignal.timeout(3e4),
38
+ redirect: "error"
57
39
  });
58
40
  const body = await response.json().catch(() => null);
59
41
  if (!response.ok) throw new XopcCloudAccountError(typeof body?.error?.message === "string" ? body.error.message : `XOPC account summary failed (${response.status})`, response.status, typeof body?.error?.code === "string" ? body.error.code : void 0);
60
- const parsed = accountSummarySchema.safeParse(body);
61
- if (!parsed.success) throw new XopcCloudAccountError("XOPC account summary returned an invalid response", response.status, "invalid_response");
42
+ if (body === null) throw new XopcCloudAccountError("XOPC Cloud returned invalid JSON", 502, "invalid_response");
43
+ return body;
44
+ }
45
+ parse(schema, body) {
46
+ if (body === null) return null;
47
+ const parsed = schema.safeParse(body);
48
+ if (!parsed.success) throw new XopcCloudAccountError("XOPC Cloud returned an invalid Credit response", 502, "invalid_response");
62
49
  return parsed.data;
63
50
  }
51
+ async getSummary(days = 7) {
52
+ return this.parse(cloudAccountSummarySchema, await this.request(`/account/summary?version=2&days=${days}`));
53
+ }
54
+ async createBudget(limitCreditMicro, key) {
55
+ creditMicroSchema.parse(limitCreditMicro);
56
+ if (limitCreditMicro === "0" || limitCreditMicro.length > 15 || !/^[\w:.-]{8,128}$/.test(key)) throw new Error("Invalid Credit budget");
57
+ return this.parse(z.object({
58
+ creditUnit: creditUnitSchema,
59
+ budget: cloudCreditBudgetSchema
60
+ }), await this.request("/account/budgets", {
61
+ method: "POST",
62
+ headers: {
63
+ "content-type": "application/json",
64
+ "Idempotency-Key": key
65
+ },
66
+ body: JSON.stringify({ limitCreditMicro })
67
+ }))?.budget ?? null;
68
+ }
69
+ async getReceipt(requestId) {
70
+ z.string().min(1).max(128).parse(requestId);
71
+ return this.parse(z.object({
72
+ schemaVersion: z.literal(2),
73
+ creditUnit: creditUnitSchema,
74
+ receipt: cloudBillingReceiptSchema
75
+ }), await this.request(`/account/receipts/${encodeURIComponent(requestId)}`))?.receipt ?? null;
76
+ }
77
+ async getBudget(id) {
78
+ z.string().uuid().parse(id);
79
+ return this.parse(z.object({
80
+ creditUnit: creditUnitSchema,
81
+ budget: cloudCreditBudgetSchema
82
+ }), await this.request(`/account/budgets/${encodeURIComponent(id)}`))?.budget ?? null;
83
+ }
64
84
  };
65
85
  //#endregion
66
86
  export { XopcCloudAccountError, XopcCloudAccountService };
@@ -0,0 +1,14 @@
1
+ import { XopcCloudAccountService } from './xopc-cloud-account-service.js';
2
+ export declare function hasCloudCreditBudget(): boolean;
3
+ export declare function cloudCreditBudgetStopMessage(): string | undefined;
4
+ export declare function isCloudCreditBudgetExhausted(message: string): boolean;
5
+ export declare function reportCloudCreditError(message: string): void;
6
+ export declare function assertCloudCreditBudgetActive(): void;
7
+ /** Children inherit their parent's scope; repeated attempts use the same platform budget. */
8
+ export declare function withCloudCreditBudget<T>(options: {
9
+ conversationId: string;
10
+ runId: string;
11
+ limitCreditMicro?: string;
12
+ }, action: () => Promise<T>): Promise<T>;
13
+ export declare function cloudCreditBudgetHeaders(service?: Pick<XopcCloudAccountService, 'createBudget'>): Promise<Record<string, string>>;
14
+ export declare function rejectUnbudgetedCloudTransport(operation?: string): void;
@@ -0,0 +1,61 @@
1
+ import { createLogger } from "../utils/logger/index.js";
2
+ import { init_logger } from "../utils/logger.js";
3
+ import { XopcCloudAccountService } from "./xopc-cloud-account-service.js";
4
+ import { AsyncLocalStorage } from "node:async_hooks";
5
+ import { createHash } from "node:crypto";
6
+ //#region src/providers/xopc-cloud-credit-budget.ts
7
+ init_logger();
8
+ const log = createLogger("CloudCreditBudget");
9
+ const scopes = new AsyncLocalStorage();
10
+ const EXHAUSTED = /credit_budget_exhausted|(?:task Credit|Credit task) budget exhausted/i;
11
+ function hasCloudCreditBudget() {
12
+ return Boolean(scopes.getStore());
13
+ }
14
+ function cloudCreditBudgetStopMessage() {
15
+ return scopes.getStore()?.stopped;
16
+ }
17
+ function isCloudCreditBudgetExhausted(message) {
18
+ return EXHAUSTED.test(message);
19
+ }
20
+ function reportCloudCreditError(message) {
21
+ const scope = scopes.getStore();
22
+ if (scope && isCloudCreditBudgetExhausted(message)) scope.stopped = "credit_budget_exhausted: Credit task budget exhausted";
23
+ }
24
+ function assertCloudCreditBudgetActive() {
25
+ const stopped = scopes.getStore()?.stopped;
26
+ if (stopped) throw new Error(stopped);
27
+ }
28
+ /** Children inherit their parent's scope; repeated attempts use the same platform budget. */
29
+ async function withCloudCreditBudget(options, action) {
30
+ if (scopes.getStore() || !options.limitCreditMicro) return action();
31
+ const key = `xopc-run:${createHash("sha256").update(JSON.stringify([options.conversationId, options.runId])).digest("hex")}`;
32
+ return scopes.run({
33
+ key,
34
+ conversationId: options.conversationId,
35
+ runId: options.runId,
36
+ limitCreditMicro: options.limitCreditMicro
37
+ }, action);
38
+ }
39
+ async function cloudCreditBudgetHeaders(service) {
40
+ assertCloudCreditBudgetActive();
41
+ const scope = scopes.getStore();
42
+ if (!scope) return {};
43
+ scope.budget ??= (service ?? new XopcCloudAccountService()).createBudget(scope.limitCreditMicro, scope.key).then((budget) => {
44
+ if (budget) log.info({
45
+ conversationId: scope.conversationId,
46
+ runId: scope.runId,
47
+ creditBudgetId: budget.id,
48
+ limitCreditMicro: budget.limitCreditMicro
49
+ }, "Created Cloud run Credit budget");
50
+ return budget;
51
+ });
52
+ const budget = await scope.budget;
53
+ if (!budget) throw new Error("XOPC Cloud authorization is unavailable");
54
+ assertCloudCreditBudgetActive();
55
+ return { "x-xopc-credit-budget": budget.id };
56
+ }
57
+ function rejectUnbudgetedCloudTransport(operation = "realtime voice") {
58
+ if (scopes.getStore()) throw new Error(`Credit run budgets do not support ${operation} yet`);
59
+ }
60
+ //#endregion
61
+ export { assertCloudCreditBudgetActive, cloudCreditBudgetHeaders, cloudCreditBudgetStopMessage, hasCloudCreditBudget, isCloudCreditBudgetExhausted, rejectUnbudgetedCloudTransport, reportCloudCreditError, withCloudCreditBudget };
@@ -3,6 +3,7 @@ import { init_logger } from "../utils/logger.js";
3
3
  import { hasGatewayScope, init_gateway_scopes } from "../gateway/security/gateway-scopes.js";
4
4
  import { EndpointToolPolicyError } from "../endpoint-tools/policy.js";
5
5
  import { REALTIME_CAPABILITIES, REALTIME_HEARTBEAT_INTERVAL_MS, REALTIME_HEARTBEAT_TIMEOUT_MS, REALTIME_HELLO_TIMEOUT_MS, REALTIME_MAX_CLIENT_FRAME_BYTES, parseClientRealtimeJsonFrame, parseClientRealtimeMessage } from "../../packages/realtime-protocol/src/index.js";
6
+ import { verifyDeviceConnectionProof } from "../gateway/security/device-request-proof.js";
6
7
  import { compactRunEvent } from "./compact-run-event.js";
7
8
  import { createPreauthConnectionBudget } from "../gateway/security/preauth-connection-budget.js";
8
9
  import { RealtimeBroker } from "./broker.js";
@@ -221,6 +222,11 @@ var RealtimeRuntime = class {
221
222
  socket.close(4401, "First realtime message must be hello");
222
223
  return;
223
224
  }
225
+ const pendingClaim = this.tickets.peek(message.payload.ticket);
226
+ if (!pendingClaim || pendingClaim.deviceId && !verifyDeviceConnectionProof(pendingClaim.deviceId, message.payload.ticket, new URL(request.url, "http://localhost").pathname + new URL(request.url, "http://localhost").search, typeof request.headers["x-xopc-proof"] === "string" ? request.headers["x-xopc-proof"] : void 0)) {
227
+ socket.close(4401, "Realtime authentication failed");
228
+ return;
229
+ }
224
230
  const claim = this.tickets.consume(message.payload.ticket, message.payload.clientId, message.payload.clientKind);
225
231
  if (!claim || !this.isPrincipalActive(claim.principalId)) {
226
232
  socket.close(4401, "Realtime authentication failed");
@@ -15,6 +15,7 @@ export interface IssuedRealtimeTicket extends RealtimeTicketClaim {
15
15
  export declare class RealtimeTicketStore {
16
16
  private readonly claims;
17
17
  issue(clientId: string, clientKind: RealtimeClientKind, principal: Omit<RealtimeTicketClaim, 'clientId' | 'clientKind' | 'expiresAt'>, now?: number): IssuedRealtimeTicket;
18
+ peek(ticket: string, now?: number): RealtimeTicketClaim | undefined;
18
19
  consume(ticket: string, clientId: string, clientKind: RealtimeClientKind, now?: number): RealtimeTicketClaim | undefined;
19
20
  revokePrincipal(principalId: string): void;
20
21
  private prune;
@@ -23,6 +23,10 @@ var RealtimeTicketStore = class {
23
23
  ...claim
24
24
  };
25
25
  }
26
+ peek(ticket, now = Date.now()) {
27
+ const claim = this.claims.get(ticketKey(ticket));
28
+ return claim && claim.expiresAt >= now ? claim : void 0;
29
+ }
26
30
  consume(ticket, clientId, clientKind, now = Date.now()) {
27
31
  const key = ticketKey(ticket);
28
32
  const claim = this.claims.get(key);
@@ -1,7 +1,8 @@
1
- import { isLoopbackHost } from "../gateway/host.js";
1
+ import { init_host, isLoopbackHost } from "../gateway/host.js";
2
2
  import { resolveGatewayBindMode } from "../config/gateway-bind.js";
3
3
  import { resolveGatewayListenPlan } from "../gateway/listen.js";
4
4
  //#region src/remote-access/exposure-guards.ts
5
+ init_host();
5
6
  function collectExposureConflicts(cfg) {
6
7
  const conflicts = [];
7
8
  const tailscaleMode = cfg.gateway?.tailscale?.mode ?? "off";
@@ -1,8 +1,9 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { buckets } from "../gateway/rate-limit/buckets.js";
4
- import "../gateway/rate-limit/index.js";
4
+ import { init_rate_limit } from "../gateway/rate-limit/index.js";
5
5
  //#region src/share/share-rate-limit.ts
6
+ init_rate_limit();
6
7
  init_logger();
7
8
  const log = createLogger("ShareRateLimit");
8
9
  /**
@@ -1,6 +1,7 @@
1
- import { enumerateLanGatewayCandidates } from "../gateway/host.js";
1
+ import { enumerateLanGatewayCandidates, init_host } from "../gateway/host.js";
2
2
  import { getTunnelService } from "../tunnel/tunnel-service.js";
3
3
  //#region src/share/share-url.ts
4
+ init_host();
4
5
  function resolveShareUrl(token, ctx) {
5
6
  const tunnelPublicUrl = activeTunnelPublicUrl();
6
7
  const { gatewayHost, gatewayPort, reverseProxyPublicUrl } = ctx;
@@ -1,13 +1,14 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
+ import { getClientIpFromHeaders, init_loopback } from "../gateway/security/loopback.js";
3
4
  import { resolveSiteShareConfig } from "./site-share-config.js";
4
5
  import "./share-store.js";
5
6
  import { getSiteShareStore } from "./site-share-store.js";
6
- import { getClientIpFromHeaders } from "../gateway/security/loopback.js";
7
7
  import { serveStaticSiteRequest } from "./site-static-serve.js";
8
8
  import { forwardHttpRequest, handleProxyWebSocketUpgrade } from "./site-proxy.js";
9
9
  import { renderShareExpiredPage } from "./share-landing.js";
10
10
  //#region src/share/site-share-router.ts
11
+ init_loopback();
11
12
  init_logger();
12
13
  const log = createLogger("SiteShareRouter");
13
14
  const SITE_SUBPATH_PREFIX = "/site/";
@@ -1,4 +1,5 @@
1
1
  import type { AiUsageEvent, AiUsageFinish } from '../../usage/types.js';
2
+ import type { CloudBillingReceipt, UsageBilling, UsageTotals } from '@xopcai/gateway-contract';
2
3
  export declare const AI_USAGE_RETENTION_MS: number;
3
4
  export declare function insertAiUsageEvent(event: AiUsageEvent): void;
4
5
  export declare function finishAiUsageEvent(id: string, finish: AiUsageFinish & {
@@ -7,6 +8,8 @@ export declare function finishAiUsageEvent(id: string, finish: AiUsageFinish & {
7
8
  export declare function markStaleAiUsageEventsUnknown(cutoffMs: number, now?: number): number;
8
9
  export declare function pruneAiUsageEvents(cutoffMs: number): number;
9
10
  export declare function getAiUsageEvent(id: string): Record<string, unknown> | undefined;
11
+ export declare function setAiUsageCloudRequest(id: string, requestId: string): void;
12
+ export declare function setAiUsageCloudReceipt(id: string, receipt: CloudBillingReceipt): void;
10
13
  export type AiUsageQuery = {
11
14
  from: number;
12
15
  to: number;
@@ -16,6 +19,8 @@ export type AiUsageQuery = {
16
19
  agentId?: string;
17
20
  conversationId?: string;
18
21
  };
22
+ export declare function pendingAiUsageCloudReceiptIds(query: AiUsageQuery): string[];
23
+ export declare function markAiUsageCloudReceiptAttempt(id: string): void;
19
24
  export type AiUsageTotals = {
20
25
  calls: number;
21
26
  succeededCalls: number;
@@ -28,6 +33,7 @@ export type AiUsageTotals = {
28
33
  totalTokens: number;
29
34
  knownCostUsd: string;
30
35
  costCompleteness: 'complete' | 'partial' | 'unknown';
36
+ billing: NonNullable<UsageTotals['billing']>;
31
37
  };
32
38
  export type ConversationAiUsageTotals = Pick<AiUsageTotals, 'calls' | 'unknownCostCalls' | 'totalTokens' | 'knownCostUsd' | 'costCompleteness'>;
33
39
  /** Aggregate all retained AI usage records for the requested conversations. */
@@ -78,6 +84,7 @@ export declare function listAiUsageEvents(query: AiUsageQuery & {
78
84
  reasoningTokens: number;
79
85
  totalTokens: number;
80
86
  estimatedCostUsd: string;
87
+ billing: UsageBilling;
81
88
  costSource: string;
82
89
  pricingSnapshot: Record<string, number>;
83
90
  errorSummary: string;
@@ -110,6 +117,7 @@ export declare function getAiUsageEventView(id: string): {
110
117
  reasoningTokens: number;
111
118
  totalTokens: number;
112
119
  estimatedCostUsd: string;
120
+ billing: UsageBilling;
113
121
  costSource: string;
114
122
  pricingSnapshot: Record<string, number>;
115
123
  errorSummary: string;
@@ -140,6 +148,7 @@ export declare function listAiUsageTrace(traceId: string): {
140
148
  reasoningTokens: number;
141
149
  totalTokens: number;
142
150
  estimatedCostUsd: string;
151
+ billing: UsageBilling;
143
152
  costSource: string;
144
153
  pricingSnapshot: Record<string, number>;
145
154
  errorSummary: string;