@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.
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-BQ3PMp2q.js → activity-store-BeYLqqr8.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-D4iAZErG.js → agent-avatar-dicebear-BrA20N2m.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BZrOdxou.js +1 -0
- package/dist/gateway/static/root/assets/{agent-plugin-dialog-BYB0G2aF.js → agent-plugin-dialog-B3ux1AhY.js} +1 -1
- package/dist/gateway/static/root/assets/{agents-D0JBkZPV.js → agents-CXlXFU6M.js} +3 -3
- package/dist/gateway/static/root/assets/{agents-admin-api-HBZvVyzF.js → agents-admin-api-B4tgTbWG.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-C1tQxHaP.js → app-management-settings-panel-BXahEVPm.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-BfavIBbb.js → appearance-settings-CE2qJMkD.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-CUS5S1qa.js → apps-page-DGVOnCxZ.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-BO3I9zRP.js → archive-plugin-bI9OLnXj.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-iY0KMPSa.js → automations-page-BWL7eT4_.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-workspace-LQsa5ohY.js → automations-workspace-BxIShhkZ.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-gFD7vH9R.js → binary-plugins-dOwLzjeH.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-Cft0fd_O.js → block-editor-3n446-mX.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automation-inputs-DxRoKFun.js → browser-automation-inputs-i7h1Svpf.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-C6EWx_Y4.js → browser-automations-page-BmTK7Gtn.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-settings-page-CKlt_8IS.js → browser-settings-page-DBQ-WETQ.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-CY4SiHcP.js → capabilities-CquUV0DP.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-gjQtMhKu.js → capabilities-D4KFLtqM.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-page-UrQ8EY_o.js → capabilities-page-D-nQ6Zzi.js} +2 -2
- package/dist/gateway/static/root/assets/{capabilities-settings-panel-C9HIr2CZ.js → capabilities-settings-panel-Dx1fpBmH.js} +6 -6
- package/dist/gateway/static/root/assets/{capability-header-actions-uxIiW_2_.js → capability-header-actions-BRMqvQVb.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-By3dmQ4Y.js → channels-DXfEP1FR.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-terminal-dock-DeDTSl64.js → chat-terminal-dock-BRdzCjWO.js} +1 -1
- package/dist/gateway/static/root/assets/cloud-credits-BMYMiiNn.js +1 -0
- package/dist/gateway/static/root/assets/{computer-settings-page-Cw1Z1epy.js → computer-settings-page-BhCHMRpD.js} +1 -1
- package/dist/gateway/static/root/assets/{connector-service-page-D664WEhj.js → connector-service-page-BXE8Z-Ll.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-page-sjyjY7Fl.js → connectors-page-D9RZjhw8.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-BVmFrPfX.js → date-picker-BJ7N92wm.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-YIoP-e5-.js → dependency-picker-gyxCM-hb.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-CzS468vR.js → desktop-pet-B-WM4l-L.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-BPcgZUcK.js → desktop-pet-settings-usJqcew5.js} +1 -1
- package/dist/gateway/static/root/assets/{device-pairing-wizard-Cgba-4m9.js → device-pairing-wizard-DoSR4DGk.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-_nHmZtnY.js → directory-picker-path-field-DqVlV2YH.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-IIky9Iqr.js → extension-debug-page-CbgEonkK.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-C-7ngTTj.js → extension-page-CUule9SU.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-provider-VFWspV08.js → extension-provider-DxlAZ2iy.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-_hovFCWi.js → extension-settings-page-_OFukkEJ.js} +1 -1
- package/dist/gateway/static/root/assets/{fallback-models-CUHrPpGV.js → fallback-models-CiSc3h8i.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-7RKqgU_U.js → gateway-config-swr-BoRkBnsw.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-realtime-BwX_fHUS.js → gateway-realtime-C3WQQY10.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-cLCDEe4D.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-settings-sbaOzlEH.js → gateway-settings-qSUrpS1h.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-jiV5sbEX.js → gateway-startup-retry-TYSQEQcG.js} +1 -1
- package/dist/gateway/static/root/assets/{home-page-DjquRIFR.js → home-page-COjDsuzg.js} +1 -1
- package/dist/gateway/static/root/assets/{image-generation-api-DO4mXb6I.js → image-generation-api-_pKiNfSq.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-xWWIeT_t.js → imports-page-DdvIj-ZL.js} +1 -1
- package/dist/gateway/static/root/assets/{index-BWDK2eIj.js → index-DEaVabvo.js} +7 -7
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DWazrDgz.js → keyboard-shortcuts-settings-DbqFlNsF.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-CkxDdlYU.js → local-app-workbench-page-REowUzkp.js} +1 -1
- package/dist/gateway/static/root/assets/{local-apps-page-BISZ4bi5.js → local-apps-page-DdCMNn_z.js} +1 -1
- package/dist/gateway/static/root/assets/{local-session-drafts-pox8evDV.js → local-session-drafts-Cg9RdsNN.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-COVscAqC.js → locale-store-rWFLl-p4.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-GiCulc9k.js → logs-page-B_6fHDoi.js} +1 -1
- package/dist/gateway/static/root/assets/management-settings-D4vcSRE3.js +1 -0
- package/dist/gateway/static/root/assets/{markdown-view-B_qnAcW2.js → markdown-view-BHFFusQs.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-C0Pc-wSY.js → media-plugins-BVPTMWJI.js} +1 -1
- package/dist/gateway/static/root/assets/messages-C1SUo4gG.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-cache-Jj8dvYcv.js +1 -0
- package/dist/gateway/static/root/assets/{note-detail-panel-CqealmSc.js → note-detail-panel-B7U6EbAi.js} +3 -3
- package/dist/gateway/static/root/assets/{notes-api-sBgBcyLW.js → notes-api-CSLVCZBn.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-BtTU5mnS.js → notes-page-BzHVaH8j.js} +1 -1
- package/dist/gateway/static/root/assets/{page-context-capture-button-Yt-BpPRh.js → page-context-capture-button-D7Y4vFRN.js} +1 -1
- package/dist/gateway/static/root/assets/personal-page-E6huhFk4.js +1 -0
- package/dist/gateway/static/root/assets/{product-open-page-etM6Ijfe.js → product-open-page-CK_czbBx.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-content-C6aeRrWe.js → product-preview-content-CU6KlaVP.js} +1 -1
- package/dist/gateway/static/root/assets/{project-detail-page-K4ASOTki.js → project-detail-page-c3ye2bdq.js} +1 -1
- package/dist/gateway/static/root/assets/{projects-page-BssImjwl.js → projects-page-BA1UuuRF.js} +1 -1
- package/dist/gateway/static/root/assets/{registry-api-Bh9UBb-f.js → registry-api-CoMBYjHD.js} +1 -1
- package/dist/gateway/static/root/assets/{remote-access-hub-BznC_5H0.js → remote-access-hub-D_FLVZAm.js} +1 -1
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-BJAzqQik.js → runtime-tools-settings-panel-Cxjmwdyf.js} +1 -1
- package/dist/gateway/static/root/assets/{scenes-page-uZUXm03X.js → scenes-page-Av47PHdM.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-SA3Ld7zf.js → schema-form-IM7QeSm3.js} +1 -1
- package/dist/gateway/static/root/assets/{send-session-input-Di3Q846r.js → send-session-input-CLhR1uEp.js} +1 -1
- package/dist/gateway/static/root/assets/{session-api-yjpEz4pP.js → session-api-u_4_kFQt.js} +1 -1
- package/dist/gateway/static/root/assets/{session-manager-CWjhJxJs.js → session-manager-B06ZCie_.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-DdL8zVrF.js → sessions-page-Bol3ScEc.js} +1 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DpCanqrD.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-CUJQMNF7.js → settings-page-BeVtwwVd.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-BGBWC0Bc.js → setup-status-panel-zTmrMwMm.js} +1 -1
- package/dist/gateway/static/root/assets/{share-link-dialog-HCHM8qnf.js → share-link-dialog-XhiuPKF4.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-DJmyACyp.js → share-preview-page-Vc0TQuZ8.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-api-c0dfWz6h.js → shares-api-BVSb1vh4.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-settings-BzqcGh7W.js → shares-settings-Bkhkt_6M.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-api-9XSn7R8L.js → skill-api-Dgwc707w.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-reload-api-Ge5XymHa.js → skill-reload-api-BsLx_FXd.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-DwyDfh9g.js → skills-page-CFIte-vM.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-B6axBPLO.js → system-settings-panel-Ck6zGDHb.js} +1 -1
- package/dist/gateway/static/root/assets/{task-detail-page-ftCTqBDB.js → task-detail-page-C3ZPEZqw.js} +1 -1
- package/dist/gateway/static/root/assets/{task-expandable-content-hYcgCEE3.js → task-expandable-content-DxeBTJvh.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-BOfCKgl6.js → theme-store-KcQhCg1-.js} +1 -1
- package/dist/gateway/static/root/assets/{tracing-settings-page-DDWFXcST.js → tracing-settings-page-DJRAP3nb.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-BYU2v0im.js → tunnel-api-CjxMpAm2.js} +1 -1
- package/dist/gateway/static/root/assets/usage-page-Dnhp9xQ4.js +1 -0
- package/dist/gateway/static/root/assets/{use-autosave-CSckcjFx.js → use-autosave-C-IWxbzm.js} +1 -1
- package/dist/gateway/static/root/assets/{use-composer-attachments-OFlldkKg.js → use-composer-attachments-Dxphaxk-.js} +1 -1
- package/dist/gateway/static/root/assets/{use-file-preview-expanded-BF1TeNXP.js → use-file-preview-expanded-Du37Gofn.js} +2 -2
- package/dist/gateway/static/root/assets/{user-model-page-CqnGITYf.js → user-model-page-sx1lNWKf.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-GEw5x2fU.js → voice-api-key-field-7BImy8Jc.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-3yyVwXln.js → voice-config-api-6MINytQl.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-BDM7BEKH.js → work-discovery-overlay-CVd_y3K2.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BBwx-tUb.js → workflow-run-setup-panel-Dwg40uGK.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-BHigZn6E.js → workflows-page-BQR4JdXB.js} +1 -1
- package/dist/gateway/static/root/assets/{workspace-api-CTm8s6Jr.js → workspace-api-CXiyhTwv.js} +2 -2
- package/dist/gateway/static/root/assets/xopc-cloud-account-card-CaKc_J7j.js +1 -0
- package/dist/gateway/static/root/index.html +26 -26
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/cloud-credits.js +80 -0
- package/dist/packages/gateway-contract/src/index.js +2 -0
- package/dist/packages/realtime-protocol/src/voice.js +11 -0
- package/dist/src/agent/client-error-format.d.ts +1 -1
- package/dist/src/agent/client-error-format.js +7 -0
- package/dist/src/agent/embedded/run-turn.js +39 -3
- package/dist/src/agent/embedded/xopc-stream-bridge.js +18 -0
- package/dist/src/agent/image/generation/openai-images-provider.d.ts +2 -1
- package/dist/src/agent/image/generation/openai-images-provider.js +13 -7
- package/dist/src/agent/image/generation/providers/xopc-cloud.js +14 -2
- package/dist/src/agent-config/schema.d.ts +13 -0
- package/dist/src/agent-config/schema.js +2 -0
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/gateway/shared.js +2 -1
- package/dist/src/cli/commands/models.js +41 -0
- package/dist/src/computer/runtime.js +3 -0
- package/dist/src/config/gateway-bind.js +2 -1
- package/dist/src/config/index.js +2 -2
- package/dist/src/config/models-json.d.ts +8 -8
- package/dist/src/config/schema.d.ts +13 -12
- package/dist/src/config/schema.js +7 -3
- package/dist/src/daemon/constants.js +14 -9
- package/dist/src/daemon/index.js +4 -1
- package/dist/src/daemon/install-plan.js +2 -1
- package/dist/src/daemon/launchd.js +2 -1
- package/dist/src/daemon/schtasks.js +2 -1
- package/dist/src/daemon/service-audit.js +2 -1
- package/dist/src/daemon/service.js +2 -1
- package/dist/src/daemon/systemd.js +2 -1
- package/dist/src/gateway/client-ip.js +2 -1
- package/dist/src/gateway/hono/app.js +2 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -0
- package/dist/src/gateway/hono/middleware/auth.d.ts +3 -5
- package/dist/src/gateway/hono/middleware/auth.js +56 -14
- package/dist/src/gateway/hono/middleware/logger.js +2 -1
- package/dist/src/gateway/hono/middleware/public-device-rate-limit.d.ts +16 -0
- package/dist/src/gateway/hono/middleware/public-device-rate-limit.js +43 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js +3 -2
- package/dist/src/gateway/hono/oauth-async.js +2 -1
- package/dist/src/gateway/hono/routes/browser.js +2 -1
- package/dist/src/gateway/hono/routes/config.js +2 -1
- package/dist/src/gateway/hono/routes/device-pairing-approval.d.ts +3 -8
- package/dist/src/gateway/hono/routes/device-pairing-approval.js +5 -20
- package/dist/src/gateway/hono/routes/devices.js +25 -9
- package/dist/src/gateway/hono/routes/endpoint-tools.js +1 -0
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/personal-agent.js +3 -2
- package/dist/src/gateway/hono/routes/public-gateway.js +6 -6
- package/dist/src/gateway/hono/routes/shares.js +2 -1
- package/dist/src/gateway/hono/routes/usage.js +15 -5
- package/dist/src/gateway/hono/routes/voice.js +1 -0
- package/dist/src/gateway/host.js +9 -4
- package/dist/src/gateway/index.js +8 -4
- package/dist/src/gateway/listen.js +2 -1
- package/dist/src/gateway/rate-limit/auth-policy.js +7 -11
- package/dist/src/gateway/rate-limit/buckets.d.ts +6 -0
- package/dist/src/gateway/rate-limit/buckets.js +211 -189
- package/dist/src/gateway/rate-limit/env-flags.js +4 -1
- package/dist/src/gateway/rate-limit/index.js +13 -4
- package/dist/src/gateway/runtime-config.js +5 -3
- package/dist/src/gateway/security/audit.js +3 -2
- package/dist/src/gateway/security/browser-session.js +2 -1
- package/dist/src/gateway/security/device-request-proof.d.ts +28 -0
- package/dist/src/gateway/security/device-request-proof.js +122 -0
- package/dist/src/gateway/security/loopback.js +7 -6
- package/dist/src/gateway/service.js +8 -6
- package/dist/src/gateway/tailscale-auth.js +2 -1
- package/dist/src/gateway/ws-security.js +2 -1
- package/dist/src/infra/rate-limit/failure-limiter.js +78 -90
- package/dist/src/infra/rate-limit/index.js +11 -3
- package/dist/src/infra/rate-limit/keyed-store.js +52 -47
- package/dist/src/infra/rate-limit/rate-limiter.js +55 -58
- package/dist/src/infra/update-service-refresh.js +2 -1
- package/dist/src/personal-agent/repository.d.ts +3 -0
- package/dist/src/personal-agent/repository.js +1 -0
- package/dist/src/personal-agent/service.d.ts +6 -2
- package/dist/src/personal-agent/service.js +4 -3
- package/dist/src/platform/client.d.ts +2 -2
- package/dist/src/platform/contracts.d.ts +2 -2
- package/dist/src/providers/model-call.js +15 -1
- package/dist/src/providers/xopc-cloud-account-service.d.ts +7 -23
- package/dist/src/providers/xopc-cloud-account-service.js +49 -29
- package/dist/src/providers/xopc-cloud-credit-budget.d.ts +14 -0
- package/dist/src/providers/xopc-cloud-credit-budget.js +61 -0
- package/dist/src/realtime/runtime.js +6 -0
- package/dist/src/realtime/tickets.d.ts +1 -0
- package/dist/src/realtime/tickets.js +4 -0
- package/dist/src/remote-access/exposure-guards.js +2 -1
- package/dist/src/share/share-rate-limit.js +2 -1
- package/dist/src/share/share-url.js +2 -1
- package/dist/src/share/site-share-router.js +2 -1
- package/dist/src/storage/sqlite/ai-usage-repository.d.ts +9 -0
- package/dist/src/storage/sqlite/ai-usage-repository.js +94 -5
- package/dist/src/storage/sqlite/device-access-repository.d.ts +7 -0
- package/dist/src/storage/sqlite/device-access-repository.js +22 -4
- package/dist/src/storage/sqlite/migrations/242_cloud_usage_receipts.sql +5 -0
- package/dist/src/storage/sqlite/migrations/243_voice_opening_greetings.sql +12 -0
- package/dist/src/storage/sqlite/migrations/244_device_request_proofs.sql +8 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/tunnel/broker-client.js +2 -0
- package/dist/src/tunnel/tunnel-config.js +2 -2
- package/dist/src/tunnel/tunnel-rate-limit.js +2 -1
- package/dist/src/usage/cloud-capability.d.ts +2 -0
- package/dist/src/usage/cloud-capability.js +34 -0
- package/dist/src/usage/cloud-receipts.d.ts +10 -0
- package/dist/src/usage/cloud-receipts.js +55 -0
- package/dist/src/usage/cost.js +1 -0
- package/dist/src/usage/recorder.js +3 -1
- package/dist/src/usage/scenario-registry.js +15 -0
- package/dist/src/utils/logger/redact.js +4 -1
- package/dist/src/voice/platform-streams.d.ts +6 -0
- package/dist/src/voice/platform-streams.js +43 -4
- package/dist/src/voice/realtime/agentEngine.js +138 -83
- package/dist/src/voice/realtime/engine.d.ts +6 -0
- package/dist/src/voice/realtime/opening-greeting.d.ts +12 -0
- package/dist/src/voice/realtime/opening-greeting.js +22 -0
- package/dist/src/voice/realtime/runtime.js +116 -22
- package/dist/src/voice/realtime/runtime.types.d.ts +4 -0
- package/dist/src/voice/stt/providers/xopc-cloud-transcription.js +28 -14
- package/dist/src/voice/tts/providers/xopc-cloud-speech.js +39 -29
- package/dist/src/voice/tts/speech-provider-types.d.ts +1 -0
- package/package.json +5 -5
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BdxzGSiO.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-BheKaO6d.js +0 -1
- package/dist/gateway/static/root/assets/management-settings-GUpOcTqa.js +0 -1
- package/dist/gateway/static/root/assets/messages-Bb2GK-Nj.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-cache-DyPPksMP.js +0 -1
- package/dist/gateway/static/root/assets/personal-page-C8SEQpEu.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DmawLOHR.js +0 -1
- 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
|
|
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
|
|
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
|
-
|
|
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 {
|
|
1
|
+
import { type CloudAccountSummary, type CloudCreditBudget, type CloudBillingReceipt } from '@xopcai/gateway-contract';
|
|
2
2
|
import { type ProviderAuthService } from './provider-auth-service.js';
|
|
3
|
-
|
|
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
|
|
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}
|
|
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
|
-
|
|
61
|
-
|
|
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;
|