@jheavenknows/bluerouter 5.3.65 → 5.3.67
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/app/.next-cli-build/BUILD_ID +1 -1
- package/app/.next-cli-build/app-path-routes-manifest.json +4 -4
- package/app/.next-cli-build/build-manifest.json +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/local-ai-report/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/local-ai-report/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/console/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/console/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personal/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personal/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/stt/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/stt/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/tts/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/tts/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/routing-topology/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/routing-topology/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/app/.next-cli-build/server/app/_not-found.rsc +6 -6
- package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/api/audit-proxy/ca/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/audit-proxy/route.js +29 -17
- package/app/.next-cli-build/server/app/api/audit-proxy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/view-mode/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/branding/[asset]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/branding/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/branding/upload/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-model-profiles/cloud-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-model-profiles/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/qwen-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/config/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/peers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/sync/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cluster/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/ai-power-index/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/local-ai-report/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/routing-topology/config/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/routing-topology/live/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/routing-topology/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js +1 -1
- package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/grok-cli/device-code/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/grok-cli/poll/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/move/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/shares/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/personal-cloud-providers/visibility/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/catalog/route.js +2 -2
- package/app/.next-cli-build/server/app/api/pricing/catalog/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/openai-compatible/manage/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/history/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/resource-monitor/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/restart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/callback.html +1 -1
- package/app/.next-cli-build/server/app/callback.rsc +6 -6
- package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard/ai-power-index/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +10 -10
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +10 -10
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +10 -10
- package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/model-profiles/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/cluster.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cluster.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/cluster.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/!KGRhc2hib2FyZCk/dashboard/local-ai-report/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/local-ai-report.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/logs.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/logs.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/logs.segments/!KGRhc2hib2FyZCk/dashboard/logs/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/logs.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/logs.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/personal.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/personal.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/personal.segments/!KGRhc2hib2FyZCk/dashboard/personal/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/personal.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/personal.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/stt.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/stt.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/!KGRhc2hib2FyZCk/dashboard/providers/stt/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/tts.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/tts.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/!KGRhc2hib2FyZCk/dashboard/providers/tts/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +9 -9
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/routing-topology.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/routing-topology.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/!KGRhc2hib2FyZCk/dashboard/routing-topology/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/routing-topology.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard.html +1 -1
- package/app/.next-cli-build/server/app/dashboard.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +8 -8
- package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/favicon.ico/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/index.html +1 -1
- package/app/.next-cli-build/server/app/index.rsc +6 -6
- package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/landing/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/landing.html +1 -1
- package/app/.next-cli-build/server/app/landing.rsc +6 -6
- package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/login/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/login.html +1 -1
- package/app/.next-cli-build/server/app/login.rsc +7 -7
- package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +7 -7
- package/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app-paths-manifest.json +4 -4
- package/app/.next-cli-build/server/chunks/181.js +1 -0
- package/app/.next-cli-build/server/chunks/2731.js +2 -2
- package/app/.next-cli-build/server/chunks/3958.js +27 -16
- package/app/.next-cli-build/server/chunks/402.js +13 -10
- package/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/app/.next-cli-build/server/chunks/476.js +1 -1
- package/app/.next-cli-build/server/chunks/6328.js +1 -1
- package/app/.next-cli-build/server/chunks/6811.js +1 -1
- package/app/.next-cli-build/server/chunks/689.js +84 -6
- package/app/.next-cli-build/server/chunks/6992.js +1 -1
- package/app/.next-cli-build/server/chunks/7341.js +1 -1
- package/app/.next-cli-build/server/chunks/7464.js +1 -1
- package/app/.next-cli-build/server/chunks/7639.js +1 -1
- package/app/.next-cli-build/server/chunks/8360.js +2 -2
- package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/app/.next-cli-build/server/pages/404.html +1 -1
- package/app/.next-cli-build/server/pages/500.html +1 -1
- package/app/.next-cli-build/static/chunks/{5263-032eff9b931cc73b.js → 5263-5b4c74f04af4fa0d.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/audit-proxy/page-4b68d696dd8d9a37.js +1 -0
- package/app/.next-cli-build/static/css/36a9de29db802d2a.css +1 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.3.59-to-5.3.60-5.3.60-20260823-094447 → upgrade-5.3.64-to-5.3.65-5.3.65-20260823-112911}/data.sqlite +0 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.3.60-to-5.3.61-5.3.61-20260823-100135 → upgrade-5.3.65-to-5.3.66-5.3.66-20260823-122225}/data.sqlite +0 -0
- package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite +0 -0
- package/app/package.json +1 -1
- package/package.json +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/audit-proxy/page-6ed8392f835a28e2.js +0 -1
- package/app/.next-cli-build/static/css/2efd59dd4cc5acfe.css +0 -1
- /package/app/.next-cli-build/static/{6dTLAa-pms7CttZOuREkg → WG3mGLsoLrg1NnPZ3XNsf}/_buildManifest.js +0 -0
- /package/app/.next-cli-build/static/{6dTLAa-pms7CttZOuREkg → WG3mGLsoLrg1NnPZ3XNsf}/_ssgManifest.js +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
exports.id=402,exports.ids=[402],exports.modules={490:(a,b,c)=>{"use strict";c.d(b,{Bu:()=>m,KS:()=>s,Tr:()=>n,bh:()=>v,eC:()=>u,is:()=>e,iz:()=>r,jQ:()=>l});let d=new Map,e=Object.freeze({enabled:!0,requestsPerMinute:20,promptCharsMax:12e4,maxOutputTokens:0,forceThinkingOff:!0,allowedIpCidrs:[],expiresAt:""}),f=new Set(Object.keys(e));function g(a,b=0){let c=Number(a);return Number.isFinite(c)?Math.max(0,Math.floor(c)):b}function h(a,b=!0){if(null==a||""===a)return b;if("boolean"==typeof a)return a;if("number"==typeof a)return 0!==a;let c=String(a).trim().toLowerCase();return!["false","0","no","off"].includes(c)&&(!!["true","1","yes","on"].includes(c)||b)}function i(a){return a&&"object"==typeof a&&!Array.isArray(a)}function j(a){return Array.isArray(a)?[...new Set(a.map(a=>String(a||"").trim()).filter(Boolean))]:[]}function k(a){return!!i(a)&&Object.keys(a).some(a=>f.has(a))}function l(a={}){if(!k(a))return{};let b=i(a)?a:{};return{enabled:h(b.enabled,e.enabled),requestsPerMinute:g(b.requestsPerMinute,0),promptCharsMax:g(b.promptCharsMax,0),maxOutputTokens:g(b.maxOutputTokens??b.outputTokensMax??b.maxTokens??b.max_tokens??b.max_completion_tokens,0),forceThinkingOff:h(b.forceThinkingOff,e.forceThinkingOff),allowedIpCidrs:j(b.allowedIpCidrs),expiresAt:String(b.expiresAt||"").trim()}}function m(a){let b=l(a?.limits||{});return k(b)&&!1!==b.enabled?b:null}function n(a){let b=a?.headers?.get?.("Authorization")||"";return b.startsWith("Bearer ")?b.slice(7).trim():a?.headers?.get?.("x-api-key")?.trim()||null}function o(a,b){return a?.headers?.get?.(b)||a?.headers?.get?.(b.toLowerCase())||""}function p(a){let b=String(a||"").trim().split(".");if(4!==b.length)return null;let c=0;for(let a of b){if(!/^\d+$/.test(a))return null;let b=Number(a);if(b<0||b>255)return null;c=(c<<8)+b}return c>>>0}function q(a){if(null==a)return 0;if("string"==typeof a)return a.length;if("number"==typeof a||"boolean"==typeof a)return String(a).length;if(Array.isArray(a))return a.reduce((a,b)=>a+q(b),0);if("object"==typeof a){let b=0;for(let[c,d]of Object.entries(a))b+=String(c).length,b+=q(d);return b}return String(a).length}function r(a={}){return q(a.messages||[])+q(a.prompt||"")+q(a.input||"")}function s({request:a,keyRecord:b,body:c}){let e=m(b);if(!e)return{ok:!0,applied:!1};if(!function(a){let b=String(a||"").trim();if(!b)return!0;let c=Date.parse(b);return!Number.isFinite(c)||Date.now()<=c}(e.expiresAt))return{ok:!1,status:403,message:"API key đ\xe3 hết hạn theo policy."};if(!function(a,b){let c,d=j(b);if(0===d.length)return!0;let e=(c=o(a,"x-forwarded-for"))?c.split(",")[0].trim():(o(a,"x-real-ip")||o(a,"cf-connecting-ip")||o(a,"x-client-ip")||"").trim();return!!e&&d.some(a=>(function(a,b){let c=String(b||"").trim();if(!c)return!1;if(!c.includes("/"))return a===c;let[d,e]=c.split("/"),f=Number(e);if(!Number.isInteger(f)||f<0||f>32)return!1;let g=p(a),h=p(d);if(null===g||null===h)return!1;let i=0===f?0:0xffffffff<<32-f>>>0;return(g&i)==(h&i)})(e,a))}(a,e.allowedIpCidrs))return{ok:!1,status:403,message:"API key kh\xf4ng được ph\xe9p gọi từ IP hiện tại."};let f=g(e.promptCharsMax,0);if(f>0){let a=r(c);if(a>f)return{ok:!1,status:413,message:`Prompt qu\xe1 d\xe0i: ${a} chars, giới hạn của API key l\xe0 ${f} chars.`}}let h=function({keyId:a,policy:b,now:c=Date.now()}){let e=g(b.requestsPerMinute,0);if(e<=0)return{ok:!0};let f=6e4*Math.floor(c/6e4),h=`${a}:minute:${f}`,i=d.get(h)||0;if(i>=e){let a=Math.max(1,Math.ceil((f+6e4-c)/1e3));return{ok:!1,status:429,message:`API key vượt giới hạn ${e} request/ph\xfat. Thử lại sau ${a}s.`,headers:{"Retry-After":String(a)}}}if(d.set(h,i+1),d.size>1e4){let a=c-6e5;for(let b of d.keys()){let c=Number(b.split(":").pop());Number.isFinite(c)&&c<a&&d.delete(b)}}return{ok:!0}}({keyId:b?.id||b?.key||"unknown",policy:e});return h.ok?{ok:!0,applied:!0}:h}function t(a){let b=Number(a);if(Number.isFinite(b)&&!(b<=0))return Math.floor(b)}function u(a={},b){let c=m(b);if(!c)return a;let d=g(c.maxOutputTokens,0);if(d<=0)return a;let e=Math.min(function(a={}){let b=[a.max_tokens,a.max_completion_tokens,a.max_output_tokens].map(t).filter(a=>void 0!==a);if(0!==b.length)return Math.min(...b)}(a)||d,d),f={...a||{}};return f.max_tokens=e,Object.prototype.hasOwnProperty.call(f,"max_completion_tokens")&&delete f.max_completion_tokens,Object.prototype.hasOwnProperty.call(f,"max_output_tokens")&&delete f.max_output_tokens,f}function v(a){let b={"Access-Control-Allow-Origin":"*","Content-Type":"application/json",...a?.headers||{}};return new Response(JSON.stringify({error:{message:a?.message||"API key policy rejected this request.",type:"api_key_policy_error"}}),{status:a?.status||403,headers:b})}},644:(a,b,c)=>{"use strict";function d(a,b=null){if(null==a)return b;if("string"!=typeof a)return a;try{return JSON.parse(a)}catch{return b}}function e(a){return JSON.stringify(a??null)}c.d(b,{q:()=>d,s:()=>e})},9460:(a,b,c)=>{"use strict";c.d(b,{L9:()=>r,OM:()=>j,S8:()=>o,fv:()=>l,getMitmAlias:()=>q,o5:()=>k,uL:()=>p,uv:()=>n});var d=c(36366),e=c(644),f=c(22846);let g=(0,f.U)("modelAliases"),h=(0,f.U)("customModels"),i=(0,f.U)("mitmAlias");async function j(){return await g.getAll()}async function k(a,b){await g.set(a,b)}async function l(a){await g.remove(a)}function m(a,b,c){return`${a}|${b}|${c}`}async function n(){return Object.values(await h.getAll())}async function o({providerAlias:a,id:b,type:c="llm",name:f}){let g=m(a,b,c),h=await (0,d.c)(),i=!1;return h.transaction(()=>{if(h.get("SELECT 1 FROM kv WHERE scope = 'customModels' AND key = ?",[g]))return;let d=(0,e.s)({providerAlias:a,id:b,type:c,name:f||b});h.run("INSERT INTO kv(scope, key, value) VALUES('customModels', ?, ?)",[g,d]),i=!0}),i}async function p({providerAlias:a,id:b,type:c="llm"}){await h.remove(m(a,b,c))}async function q(a){return a?await i.get(a)||{}:await i.getAll()}async function r(a,b){await i.set(a,b||{})}},11728:(a,b,c)=>{"use strict";c.d(b,{i0:()=>s,Pc:()=>u,zc:()=>r,Qu:()=>q,Fh:()=>p,ho:()=>t});var d=c(94755),e=c(36366),f=c(644);let g=["model","modelStr","model_name","rawModel","raw_model","value","id"],h=["label","displayName"],i=["modelTagRules","modelTags","tagRules"];function j(a){return String(a||"").trim().replace(/\/+$/,"")}function k(a,b,c){if("string"!=typeof a)return a;let d=`${b}/`;return a.startsWith(d)?`${c}/${a.slice(d.length)}`:a}var l=c(67769);let m="providerDeploymentHistory";function n(a){return a?{...(0,f.q)(a.data,{}),id:a.id,type:a.type,name:a.name,createdAt:a.createdAt,updatedAt:a.updatedAt}:null}function o(a,b){let c=function(a){let{id:b,type:c,name:d,createdAt:e,updatedAt:g,...h}=a;return{id:b,type:c??null,name:d??null,data:(0,f.s)(h),createdAt:e,updatedAt:g}}(b);a.run(`INSERT INTO providerNodes(id, type, name, data, createdAt, updatedAt)
|
|
2
2
|
VALUES(?, ?, ?, ?, ?, ?)
|
|
3
3
|
ON CONFLICT(id) DO UPDATE SET
|
|
4
|
-
type=excluded.type, name=excluded.name, data=excluded.data, updatedAt=excluded.updatedAt`,[c.id,c.type,c.name,c.data,c.createdAt,c.updatedAt])}async function p(a={}){let b=await (0,e.c)(),c=[],d=[];a.type&&(c.push("type = ?"),d.push(a.type));let f=`SELECT * FROM providerNodes${c.length?` WHERE ${c.join(" AND ")}`:""}`;return b.all(f,d).map(n)}async function q(a){return n((await (0,e.c)()).get("SELECT * FROM providerNodes WHERE id = ?",[a]))}async function r(){return Object.fromEntries((await (0,e.c)()).all("SELECT key, value FROM kv WHERE scope = ?",[m]).map(a=>[a.key,(0,f.q)(a.value,null)]).filter(([,a])=>a&&"object"==typeof a))}async function s(a){let b=await (0,e.c)(),c=new Date().toISOString(),{id:f,type:g,name:h,prefix:i,apiType:j,baseUrl:k,openAICompatibleRuntime:l,...n}=a,p={...n,id:f||(0,d.A)(),type:g,name:h,prefix:i,apiType:j,baseUrl:k,openAICompatibleRuntime:l,createdAt:c,updatedAt:c};return o(b,p),b.run("DELETE FROM kv WHERE scope = ? AND key = ?",[m,p.id]),p}async function t(a,b){let c=await (0,e.c)(),d=null;return c.transaction(()=>{let e=c.get("SELECT * FROM providerNodes WHERE id = ?",[a]);if(!e)return;let l=n(e),m={...l,...b,updatedAt:new Date().toISOString()};"openai-compatible"===l.type&&"string"==typeof b.prefix&&l.prefix!==m.prefix&&function(a,b,c,d){let e=j(b),l=j(c);if(!e||!l||e===l)return;for(let b of a.all("SELECT id, models FROM combos")){let c=function(a,b,c){let d=j(b),e=j(c);if(!Array.isArray(a)||!d||!e||d===e)return{value:a,changed:!1};let f=!1,i=a.map(a=>{let b=function(a,b,c){if("string"==typeof a){let d=k(a,b,c);return{value:d,changed:d!==a}}if(!a||"object"!=typeof a||Array.isArray(a))return{value:a,changed:!1};let d=!1,e={...a};for(let f of[...g,...h]){if(!Object.prototype.hasOwnProperty.call(a,f))continue;let g=k(a[f],b,c);g!==a[f]&&(e[f]=g,d=!0)}return a.provider===b&&(e.provider=c,d=!0),{value:d?e:a,changed:d}}(a,d,e);return f||=b.changed,b.value});return{value:f?i:a,changed:f}}((0,f.q)(b.models,[]),e,l);c.changed&&a.run("UPDATE combos SET models = ?, updatedAt = ? WHERE id = ?",[(0,f.s)(c.value),d,b.id])}let m=a.get("SELECT data FROM settings WHERE id = 1");if(!m)return;let n=(0,f.q)(m.data,{}),o=function(a,b,c){let d=j(b),e=j(c);if(!a||"object"!=typeof a||Array.isArray(a)||!d||!e||d===e)return{value:a,changed:!1};let f=!1,g={};for(let[b,c]of Object.entries(a)){let a=function(a,b,c){if(!a||"object"!=typeof a||Array.isArray(a))return{value:a,changed:!1};let d=!1,e={...a};if(Array.isArray(a.disabledModels)){let f=[...new Set(a.disabledModels.map(a=>k(a,b,c)))];(f.some((b,c)=>b!==a.disabledModels[c])||f.length!==a.disabledModels.length)&&(e.disabledModels=f,d=!0)}for(let f of i){if(!Object.prototype.hasOwnProperty.call(a,f))continue;let g=function(a,b,c){if(!a||"object"!=typeof a||Array.isArray(a))return{value:a,changed:!1};let d=!1,e={};for(let[g,h]of Object.entries(a)){var f;let a=k(g,b,c);d||=a!==g,e[a]=(f=e[a],void 0===f?h:Array.isArray(f)&&Array.isArray(h)?[...new Set([...f,...h])]:f)}return{value:d?e:a,changed:d}}(a[f],b,c);g.changed&&(e[f]=g.value,d=!0)}return{value:d?e:a,changed:d}}(c,d,e);g[b]=a.value,f||=a.changed}return{value:f?g:a,changed:f}}(n.comboStrategies,e,l);o.changed&&a.run("UPDATE settings SET data = ? WHERE id = 1",[(0,f.s)({...n,comboStrategies:o.value})])}(c,l.prefix,m.prefix,m.updatedAt),o(c,m),d=m}),d}async function u(a){let b=await (0,e.c)(),c=null;return b.transaction(()=>{let d=b.get("SELECT * FROM providerNodes WHERE id = ?",[a]);d&&(!function(a,b){if(!b?.id)return;let c=(0,l.P7)({configured:b.deploymentType,providerId:b.id,baseUrl:b.baseUrl});("local"===c||"cloud"===c)&&a.run("INSERT OR REPLACE INTO kv(scope, key, value) VALUES(?, ?, ?)",[m,b.id,(0,f.s)({providerId:b.id,deploymentType:c,baseUrl:b.baseUrl||"",type:b.type||"",name:b.name||"",deletedAt:new Date().toISOString()})])}(b,c=n(d)),b.run("DELETE FROM providerNodes WHERE id = ?",[a]))}),c}},22846:(a,b,c)=>{"use strict";c.d(b,{U:()=>f});var d=c(36366),e=c(644);function f(a){return{async get(b,c=null){let f=(await (0,d.c)()).get("SELECT value FROM kv WHERE scope = ? AND key = ?",[a,b]);return f?(0,e.q)(f.value,c):c},async getAll(){let b=(await (0,d.c)()).all("SELECT key, value FROM kv WHERE scope = ?",[a]),c={};for(let a of b)c[a.key]=(0,e.q)(a.value);return c},async set(b,c){(await (0,d.c)()).run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[a,b,(0,e.s)(c)])},async setMany(b){let c=await (0,d.c)();c.transaction(()=>{for(let[d,f]of Object.entries(b))c.run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[a,d,(0,e.s)(f)])})},async remove(b){(await (0,d.c)()).run("DELETE FROM kv WHERE scope = ? AND key = ?",[a,b])},async clear(){(await (0,d.c)()).run("DELETE FROM kv WHERE scope = ?",[a])}}}},27513:(a,b,c)=>{"use strict";c.d(b,{Bz:()=>g,Tu:()=>h,ev:()=>e,wX:()=>f});let d=Object.freeze(["inherit","on","off"]),e=Object.freeze(["lite","full","ultra"]);function f(a){let b=String(a||"inherit").trim().toLowerCase();return d.includes(b)?b:"inherit"}function g(a,b="lite"){let c=String(a||b).trim().toLowerCase();return e.includes(c)?c:b}function h({apiKeyMode:a,apiKeyLevel:b,globalEnabled:c,globalLevel:d}){let e=f(a),i="on"===e?g(b,"lite"):g(d,"full");return{mode:e,enabled:"on"===e||"off"!==e&&!0===c,level:i}}},28919:(a,b,c)=>{"use strict";c.d(b,{F3:()=>w,HI:()=>t,Lx:()=>x,Mm:()=>v,QP:()=>u,cF:()=>y,jT:()=>s,x8:()=>z});var d=c(55511),e=c.n(d),f=c(79748),g=c.n(f),h=c(21820),i=c.n(h),j=c(33873),k=c.n(j);let l=process.env.DATA_DIR||process.env.BLUEROUTER_DATA_DIR||k().join(i().homedir(),".bluerouter"),m=k().join(l,"resource-monitor-servers.json");async function n(){await g().mkdir(l,{recursive:!0});try{let a=JSON.parse(await g().readFile(m,"utf8"));return{servers:Array.isArray(a?.servers)?a.servers:[]}}catch{return{servers:[]}}}async function o(a){await g().mkdir(l,{recursive:!0});let b=`${m}.${process.pid}.${e().randomUUID()}.tmp`;try{await g().writeFile(b,JSON.stringify({servers:a.servers||[]},null,2)),await g().rename(b,m)}catch(a){throw await g().unlink(b).catch(()=>{}),a}}function p(){return new Date().toISOString()}function q(a,b,c,d=null){return Object.prototype.hasOwnProperty.call(a,c)?a[c]:Object.prototype.hasOwnProperty.call(b,c)?b[c]:d}function r(a={},b={}){let c=String(a.host??b.host??"").trim();return{id:b.id||a.id||e().randomUUID(),name:String(a.name??b.name??c??"Linux server").trim()||c||"Linux server",host:c,sshPort:Math.max(1,Number(a.sshPort??b.sshPort??22)||22),sshUser:String(a.sshUser??b.sshUser??"root").trim()||"root",useSudo:a.useSudo??b.useSudo??!0,agentPort:Math.max(1,Number(a.agentPort??b.agentPort??19998)||19998),agentToken:String(a.agentToken??b.agentToken??e().randomBytes(24).toString("hex")),enabled:a.enabled??b.enabled??!0,notes:String(a.notes??b.notes??"").trim(),lastStatus:q(a,b,"lastStatus"),lastStatusAt:q(a,b,"lastStatusAt"),lastError:q(a,b,"lastError"),lastErrorAt:q(a,b,"lastErrorAt"),lastInstallAt:q(a,b,"lastInstallAt"),lastInstallOk:q(a,b,"lastInstallOk",!1),lastInstallLog:q(a,b,"lastInstallLog",""),createdAt:b.createdAt||p(),updatedAt:p()}}function s(a){if(!a)return null;let{agentToken:b,...c}=a;return c}async function t({includeSecrets:a=!1}={}){let b=(await n()).servers.map(a=>r(a,a));return a?b:b.map(s)}async function u(a){let b=(await n()).servers.find(b=>b.id===a);return b?r(b,b):null}async function v(a){let b=await n(),c=r(a);return b.servers.push(c),await o(b),c}async function w(a,b){let c=await n(),d=c.servers.findIndex(b=>b.id===a);return d<0?null:(c.servers[d]=r(b,c.servers[d]),await o(c),c.servers[d])}async function x(a){let b=await n(),c=b.servers.length;return b.servers=b.servers.filter(b=>b.id!==a),await o(b),b.servers.length!==c}async function y(a){if(!Array.isArray(a))throw Error("Invalid resource monitor server order payload");let b=a.map(a=>String(a||"").trim()).filter(Boolean);if(new Set(b).size!==b.length)throw Error("Resource monitor server order contains duplicate IDs");let c=await n(),d=new Map(c.servers.map(a=>[String(a.id),a]));for(let a of b)if(!d.has(a))throw Error(`Unknown resource monitor server ID: ${a}`);let e=new Set(b);return c.servers=[...b.map(a=>d.get(a)),...c.servers.filter(a=>!e.has(String(a.id)))],await o(c),c.servers.map(a=>r(a,a))}async function z(a){if(!Array.isArray(a))throw Error("Invalid resource monitor servers payload");let b=new Set,c=a.map(a=>{if(!a||"object"!=typeof a||Array.isArray(a))throw Error("Invalid resource monitor server entry");let c=String(a.id||"").trim();if(!c)throw Error("Resource monitor server ID is required");if(b.has(c))throw Error(`Duplicate resource monitor server ID: ${c}`);return b.add(c),r({...a,id:c},{...a,id:c})});return await o({servers:c}),c}},36366:(a,b,c)=>{"use strict";c.d(b,{c:()=>k});var d=c(95658);global._dbAdapter||(global._dbAdapter={instance:null,initPromise:null,logged:!1});let e=global._dbAdapter;async function f(){if(!process.versions.bun)return null;try{let{createBunSqliteAdapter:a}=await c.e(4739).then(c.bind(c,24739));return await a(d.AL)}catch(a){return console.warn(`[DB] bun:sqlite unavailable: ${a.message}`),null}}async function g(){if(process.versions.bun||"1"===process.env.BLUEROUTER_SKIP_NATIVE_SQLITE)return null;try{let{createBetterSqliteAdapter:a}=await c.e(5258).then(c.bind(c,25258));return a(d.AL)}catch(a){return console.warn(`[DB] better-sqlite3 unavailable: ${a.message}`),null}}async function h(){if(process.versions.bun)return null;let[a,b]=process.versions.node.split(".").map(Number);if(a<22||22===a&&b<5)return null;try{let{createNodeSqliteAdapter:a}=await c.e(8520).then(c.bind(c,88520));return await a(d.AL)}catch(a){return console.warn(`[DB] node:sqlite unavailable: ${a.message}`),null}}async function i(){try{let{createSqlJsAdapter:a}=await c.e(3593).then(c.bind(c,53593));return await a(d.AL)}catch(a){return console.warn(`[DB] sql.js unavailable: ${a.message}`),null}}async function j(){(0,d.Jh)();let a=await f();if(a||(a=await g()),a||(a=await h()),a||(a=await i()),!a)throw Error("[DB] No SQLite driver available (bun/better/node/sql.js all failed)");e.logged||(console.log(`[DB] Driver: ${a.driver} | file: ${d.AL}`),e.logged=!0);let{runMigrationOnce:b}=await c.e(4017).then(c.bind(c,84017));return await b(a),a}async function k(){return e.instance?e.instance:(e.initPromise||(e.initPromise=j().then(a=>(e.instance=a,a))),e.initPromise)}},39422:(a,b,c)=>{"use strict";c.d(b,{S8:()=>z.S8,E5:()=>F.E5,Iq:()=>r.Iq,jd:()=>w,iE:()=>h.iE,i0:()=>i.i0,ZO:()=>o,Lh:()=>r.Lh,CG:()=>y,uL:()=>z.uL,fv:()=>z.fv,fK:()=>h.fK,op:()=>h.op,Pc:()=>i.Pc,Yd:()=>q,tm:()=>D,oF:()=>E,zP:()=>V,rg:()=>F.rg,yg:()=>r.yg,mY:()=>r.getApiKeyByKey,PX:()=>r.PX,j$:()=>F.j$,L:()=>u,Dj:()=>v,Uv:()=>t,uv:()=>z.uv,vF:()=>C,c:()=>z.getMitmAlias,OM:()=>z.OM,nv:()=>h.nv,r4:()=>A.r4,Mc:()=>h.Mc,P:()=>h.getProviderConnections,Qu:()=>i.Qu,Fh:()=>i.Fh,hr:()=>n,ui:()=>m,Zx:()=>F.Zx,SL:()=>T,mt:()=>g.getSettings,BY:()=>F.BY,K1:()=>W,VT:()=>A.VT,yF:()=>A.yF,ox:()=>S,sZ:()=>F.sZ,L9:()=>z.L9,o5:()=>z.o5,_V:()=>F._V,uw:()=>F.uw,XW:()=>r.XW,oG:()=>x,KJ:()=>A.KJ,rj:()=>h.rj,ho:()=>i.ho,Q_:()=>p,Xx:()=>g.Xx,ek:()=>r.ek});var d=c(36366),e=c(644),f=c(28919),g=c(42655),h=c(46709),i=c(11728),j=c(94755);function k(a){return a?{...(0,e.q)(a.data,{}),id:a.id,isActive:1===a.isActive||!0===a.isActive,testStatus:a.testStatus,createdAt:a.createdAt,updatedAt:a.updatedAt}:null}function l(a,b){let c=function(a){let{id:b,isActive:c,testStatus:d,createdAt:f,updatedAt:g,...h}=a;return{id:b,isActive:+(!1!==c),testStatus:d??null,data:(0,e.s)(h),createdAt:f,updatedAt:g}}(b);a.run(`INSERT INTO proxyPools(id, isActive, testStatus, data, createdAt, updatedAt)
|
|
4
|
+
type=excluded.type, name=excluded.name, data=excluded.data, updatedAt=excluded.updatedAt`,[c.id,c.type,c.name,c.data,c.createdAt,c.updatedAt])}async function p(a={}){let b=await (0,e.c)(),c=[],d=[];a.type&&(c.push("type = ?"),d.push(a.type));let f=`SELECT * FROM providerNodes${c.length?` WHERE ${c.join(" AND ")}`:""}`;return b.all(f,d).map(n)}async function q(a){return n((await (0,e.c)()).get("SELECT * FROM providerNodes WHERE id = ?",[a]))}async function r(){return Object.fromEntries((await (0,e.c)()).all("SELECT key, value FROM kv WHERE scope = ?",[m]).map(a=>[a.key,(0,f.q)(a.value,null)]).filter(([,a])=>a&&"object"==typeof a))}async function s(a){let b=await (0,e.c)(),c=new Date().toISOString(),{id:f,type:g,name:h,prefix:i,apiType:j,baseUrl:k,openAICompatibleRuntime:l,...n}=a,p={...n,id:f||(0,d.A)(),type:g,name:h,prefix:i,apiType:j,baseUrl:k,openAICompatibleRuntime:l,createdAt:c,updatedAt:c};return o(b,p),b.run("DELETE FROM kv WHERE scope = ? AND key = ?",[m,p.id]),p}async function t(a,b){let c=await (0,e.c)(),d=null;return c.transaction(()=>{let e=c.get("SELECT * FROM providerNodes WHERE id = ?",[a]);if(!e)return;let l=n(e),m={...l,...b,updatedAt:new Date().toISOString()};"openai-compatible"===l.type&&"string"==typeof b.prefix&&l.prefix!==m.prefix&&function(a,b,c,d){let e=j(b),l=j(c);if(!e||!l||e===l)return;for(let b of a.all("SELECT id, models FROM combos")){let c=function(a,b,c){let d=j(b),e=j(c);if(!Array.isArray(a)||!d||!e||d===e)return{value:a,changed:!1};let f=!1,i=a.map(a=>{let b=function(a,b,c){if("string"==typeof a){let d=k(a,b,c);return{value:d,changed:d!==a}}if(!a||"object"!=typeof a||Array.isArray(a))return{value:a,changed:!1};let d=!1,e={...a};for(let f of[...g,...h]){if(!Object.prototype.hasOwnProperty.call(a,f))continue;let g=k(a[f],b,c);g!==a[f]&&(e[f]=g,d=!0)}return a.provider===b&&(e.provider=c,d=!0),{value:d?e:a,changed:d}}(a,d,e);return f||=b.changed,b.value});return{value:f?i:a,changed:f}}((0,f.q)(b.models,[]),e,l);c.changed&&a.run("UPDATE combos SET models = ?, updatedAt = ? WHERE id = ?",[(0,f.s)(c.value),d,b.id])}let m=a.get("SELECT data FROM settings WHERE id = 1");if(!m)return;let n=(0,f.q)(m.data,{}),o=function(a,b,c){let d=j(b),e=j(c);if(!a||"object"!=typeof a||Array.isArray(a)||!d||!e||d===e)return{value:a,changed:!1};let f=!1,g={};for(let[b,c]of Object.entries(a)){let a=function(a,b,c){if(!a||"object"!=typeof a||Array.isArray(a))return{value:a,changed:!1};let d=!1,e={...a};if(Array.isArray(a.disabledModels)){let f=[...new Set(a.disabledModels.map(a=>k(a,b,c)))];(f.some((b,c)=>b!==a.disabledModels[c])||f.length!==a.disabledModels.length)&&(e.disabledModels=f,d=!0)}for(let f of i){if(!Object.prototype.hasOwnProperty.call(a,f))continue;let g=function(a,b,c){if(!a||"object"!=typeof a||Array.isArray(a))return{value:a,changed:!1};let d=!1,e={};for(let[g,h]of Object.entries(a)){var f;let a=k(g,b,c);d||=a!==g,e[a]=(f=e[a],void 0===f?h:Array.isArray(f)&&Array.isArray(h)?[...new Set([...f,...h])]:f)}return{value:d?e:a,changed:d}}(a[f],b,c);g.changed&&(e[f]=g.value,d=!0)}return{value:d?e:a,changed:d}}(c,d,e);g[b]=a.value,f||=a.changed}return{value:f?g:a,changed:f}}(n.comboStrategies,e,l);o.changed&&a.run("UPDATE settings SET data = ? WHERE id = 1",[(0,f.s)({...n,comboStrategies:o.value})])}(c,l.prefix,m.prefix,m.updatedAt),o(c,m),d=m}),d}async function u(a){let b=await (0,e.c)(),c=null;return b.transaction(()=>{let d=b.get("SELECT * FROM providerNodes WHERE id = ?",[a]);d&&(!function(a,b){if(!b?.id)return;let c=(0,l.P7)({configured:b.deploymentType,providerId:b.id,baseUrl:b.baseUrl});("local"===c||"cloud"===c)&&a.run("INSERT OR REPLACE INTO kv(scope, key, value) VALUES(?, ?, ?)",[m,b.id,(0,f.s)({providerId:b.id,deploymentType:c,baseUrl:b.baseUrl||"",type:b.type||"",name:b.name||"",deletedAt:new Date().toISOString()})])}(b,c=n(d)),b.run("DELETE FROM providerNodes WHERE id = ?",[a]))}),c}},22846:(a,b,c)=>{"use strict";c.d(b,{U:()=>f});var d=c(36366),e=c(644);function f(a){return{async get(b,c=null){let f=(await (0,d.c)()).get("SELECT value FROM kv WHERE scope = ? AND key = ?",[a,b]);return f?(0,e.q)(f.value,c):c},async getAll(){let b=(await (0,d.c)()).all("SELECT key, value FROM kv WHERE scope = ?",[a]),c={};for(let a of b)c[a.key]=(0,e.q)(a.value);return c},async set(b,c){(await (0,d.c)()).run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[a,b,(0,e.s)(c)])},async setMany(b){let c=await (0,d.c)();c.transaction(()=>{for(let[d,f]of Object.entries(b))c.run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[a,d,(0,e.s)(f)])})},async remove(b){(await (0,d.c)()).run("DELETE FROM kv WHERE scope = ? AND key = ?",[a,b])},async clear(){(await (0,d.c)()).run("DELETE FROM kv WHERE scope = ?",[a])}}}},27513:(a,b,c)=>{"use strict";c.d(b,{Bz:()=>g,Tu:()=>h,ev:()=>e,wX:()=>f});let d=Object.freeze(["inherit","on","off"]),e=Object.freeze(["lite","full","ultra"]);function f(a){let b=String(a||"inherit").trim().toLowerCase();return d.includes(b)?b:"inherit"}function g(a,b="lite"){let c=String(a||b).trim().toLowerCase();return e.includes(c)?c:b}function h({apiKeyMode:a,apiKeyLevel:b,globalEnabled:c,globalLevel:d}){let e=f(a),i="on"===e?g(b,"lite"):g(d,"full");return{mode:e,enabled:"on"===e||"off"!==e&&!0===c,level:i}}},28919:(a,b,c)=>{"use strict";c.d(b,{F3:()=>w,HI:()=>t,Lx:()=>x,Mm:()=>v,QP:()=>u,cF:()=>y,jT:()=>s,x8:()=>z});var d=c(55511),e=c.n(d),f=c(79748),g=c.n(f),h=c(21820),i=c.n(h),j=c(33873),k=c.n(j);let l=process.env.DATA_DIR||process.env.BLUEROUTER_DATA_DIR||k().join(i().homedir(),".bluerouter"),m=k().join(l,"resource-monitor-servers.json");async function n(){await g().mkdir(l,{recursive:!0});try{let a=JSON.parse(await g().readFile(m,"utf8"));return{servers:Array.isArray(a?.servers)?a.servers:[]}}catch{return{servers:[]}}}async function o(a){await g().mkdir(l,{recursive:!0});let b=`${m}.${process.pid}.${e().randomUUID()}.tmp`;try{await g().writeFile(b,JSON.stringify({servers:a.servers||[]},null,2)),await g().rename(b,m)}catch(a){throw await g().unlink(b).catch(()=>{}),a}}function p(){return new Date().toISOString()}function q(a,b,c,d=null){return Object.prototype.hasOwnProperty.call(a,c)?a[c]:Object.prototype.hasOwnProperty.call(b,c)?b[c]:d}function r(a={},b={}){let c=String(a.host??b.host??"").trim();return{id:b.id||a.id||e().randomUUID(),name:String(a.name??b.name??c??"Linux server").trim()||c||"Linux server",host:c,sshPort:Math.max(1,Number(a.sshPort??b.sshPort??22)||22),sshUser:String(a.sshUser??b.sshUser??"root").trim()||"root",useSudo:a.useSudo??b.useSudo??!0,agentPort:Math.max(1,Number(a.agentPort??b.agentPort??19998)||19998),agentToken:String(a.agentToken??b.agentToken??e().randomBytes(24).toString("hex")),enabled:a.enabled??b.enabled??!0,notes:String(a.notes??b.notes??"").trim(),lastStatus:q(a,b,"lastStatus"),lastStatusAt:q(a,b,"lastStatusAt"),lastError:q(a,b,"lastError"),lastErrorAt:q(a,b,"lastErrorAt"),lastInstallAt:q(a,b,"lastInstallAt"),lastInstallOk:q(a,b,"lastInstallOk",!1),lastInstallLog:q(a,b,"lastInstallLog",""),createdAt:b.createdAt||p(),updatedAt:p()}}function s(a){if(!a)return null;let{agentToken:b,...c}=a;return c}async function t({includeSecrets:a=!1}={}){let b=(await n()).servers.map(a=>r(a,a));return a?b:b.map(s)}async function u(a){let b=(await n()).servers.find(b=>b.id===a);return b?r(b,b):null}async function v(a){let b=await n(),c=r(a);return b.servers.push(c),await o(b),c}async function w(a,b){let c=await n(),d=c.servers.findIndex(b=>b.id===a);return d<0?null:(c.servers[d]=r(b,c.servers[d]),await o(c),c.servers[d])}async function x(a){let b=await n(),c=b.servers.length;return b.servers=b.servers.filter(b=>b.id!==a),await o(b),b.servers.length!==c}async function y(a){if(!Array.isArray(a))throw Error("Invalid resource monitor server order payload");let b=a.map(a=>String(a||"").trim()).filter(Boolean);if(new Set(b).size!==b.length)throw Error("Resource monitor server order contains duplicate IDs");let c=await n(),d=new Map(c.servers.map(a=>[String(a.id),a]));for(let a of b)if(!d.has(a))throw Error(`Unknown resource monitor server ID: ${a}`);let e=new Set(b);return c.servers=[...b.map(a=>d.get(a)),...c.servers.filter(a=>!e.has(String(a.id)))],await o(c),c.servers.map(a=>r(a,a))}async function z(a){if(!Array.isArray(a))throw Error("Invalid resource monitor servers payload");let b=new Set,c=a.map(a=>{if(!a||"object"!=typeof a||Array.isArray(a))throw Error("Invalid resource monitor server entry");let c=String(a.id||"").trim();if(!c)throw Error("Resource monitor server ID is required");if(b.has(c))throw Error(`Duplicate resource monitor server ID: ${c}`);return b.add(c),r({...a,id:c},{...a,id:c})});return await o({servers:c}),c}},36366:(a,b,c)=>{"use strict";c.d(b,{c:()=>k});var d=c(95658);global._dbAdapter||(global._dbAdapter={instance:null,initPromise:null,logged:!1});let e=global._dbAdapter;async function f(){if(!process.versions.bun)return null;try{let{createBunSqliteAdapter:a}=await c.e(4739).then(c.bind(c,24739));return await a(d.AL)}catch(a){return console.warn(`[DB] bun:sqlite unavailable: ${a.message}`),null}}async function g(){if(process.versions.bun||"1"===process.env.BLUEROUTER_SKIP_NATIVE_SQLITE)return null;try{let{createBetterSqliteAdapter:a}=await c.e(5258).then(c.bind(c,25258));return a(d.AL)}catch(a){return console.warn(`[DB] better-sqlite3 unavailable: ${a.message}`),null}}async function h(){if(process.versions.bun)return null;let[a,b]=process.versions.node.split(".").map(Number);if(a<22||22===a&&b<5)return null;try{let{createNodeSqliteAdapter:a}=await c.e(8520).then(c.bind(c,88520));return await a(d.AL)}catch(a){return console.warn(`[DB] node:sqlite unavailable: ${a.message}`),null}}async function i(){try{let{createSqlJsAdapter:a}=await c.e(3593).then(c.bind(c,53593));return await a(d.AL)}catch(a){return console.warn(`[DB] sql.js unavailable: ${a.message}`),null}}async function j(){(0,d.Jh)();let a=await f();if(a||(a=await g()),a||(a=await h()),a||(a=await i()),!a)throw Error("[DB] No SQLite driver available (bun/better/node/sql.js all failed)");e.logged||(console.log(`[DB] Driver: ${a.driver} | file: ${d.AL}`),e.logged=!0);let{runMigrationOnce:b}=await c.e(4017).then(c.bind(c,84017));return await b(a),a}async function k(){return e.instance?e.instance:(e.initPromise||(e.initPromise=j().then(a=>(e.instance=a,a))),e.initPromise)}},39422:(a,b,c)=>{"use strict";c.d(b,{S8:()=>z.S8,E5:()=>F.E5,Iq:()=>r.Iq,jd:()=>w,iE:()=>h.iE,i0:()=>i.i0,ZO:()=>o,Lh:()=>r.Lh,CG:()=>y,uL:()=>z.uL,fv:()=>z.fv,fK:()=>h.fK,op:()=>h.op,Pc:()=>i.Pc,Yd:()=>q,tm:()=>D,oF:()=>E,zP:()=>V,rg:()=>F.rg,yg:()=>r.yg,mY:()=>r.getApiKeyByKey,PX:()=>r.PX,j$:()=>F.j$,L:()=>u,Dj:()=>v,Uv:()=>t,uv:()=>z.uv,vF:()=>C,c:()=>z.getMitmAlias,OM:()=>z.OM,nv:()=>h.nv,r4:()=>A.getPricing,Mc:()=>h.Mc,P:()=>h.getProviderConnections,Qu:()=>i.Qu,Fh:()=>i.Fh,hr:()=>n,ui:()=>m,Zx:()=>F.Zx,SL:()=>T,mt:()=>g.getSettings,BY:()=>F.BY,K1:()=>W,VT:()=>A.resetAllPricing,yF:()=>A.resetPricing,ox:()=>S,sZ:()=>F.sZ,L9:()=>z.L9,o5:()=>z.o5,_V:()=>F._V,uw:()=>F.uw,XW:()=>r.XW,oG:()=>x,KJ:()=>A.updatePricing,rj:()=>h.rj,ho:()=>i.ho,Q_:()=>p,Xx:()=>g.Xx,ek:()=>r.ek});var d=c(36366),e=c(644),f=c(28919),g=c(42655),h=c(46709),i=c(11728),j=c(94755);function k(a){return a?{...(0,e.q)(a.data,{}),id:a.id,isActive:1===a.isActive||!0===a.isActive,testStatus:a.testStatus,createdAt:a.createdAt,updatedAt:a.updatedAt}:null}function l(a,b){let c=function(a){let{id:b,isActive:c,testStatus:d,createdAt:f,updatedAt:g,...h}=a;return{id:b,isActive:+(!1!==c),testStatus:d??null,data:(0,e.s)(h),createdAt:f,updatedAt:g}}(b);a.run(`INSERT INTO proxyPools(id, isActive, testStatus, data, createdAt, updatedAt)
|
|
5
5
|
VALUES(?, ?, ?, ?, ?, ?)
|
|
6
6
|
ON CONFLICT(id) DO UPDATE SET
|
|
7
7
|
isActive=excluded.isActive, testStatus=excluded.testStatus,
|
|
8
|
-
data=excluded.data, updatedAt=excluded.updatedAt`,[c.id,c.isActive,c.testStatus,c.data,c.createdAt,c.updatedAt])}async function m(a={}){let b=await (0,d.c)(),c=[],e=[];void 0!==a.isActive&&(c.push("isActive = ?"),e.push(+!!a.isActive)),a.testStatus&&(c.push("testStatus = ?"),e.push(a.testStatus));let f=`SELECT * FROM proxyPools${c.length?` WHERE ${c.join(" AND ")}`:""}`,g=b.all(f,e).map(k);return g.sort((a,b)=>new Date(b.updatedAt||0)-new Date(a.updatedAt||0)),g}async function n(a){return k((await (0,d.c)()).get("SELECT * FROM proxyPools WHERE id = ?",[a]))}async function o(a){let b=await (0,d.c)(),c=new Date().toISOString(),e={id:a.id||(0,j.A)(),name:a.name,proxyUrl:a.proxyUrl,noProxy:a.noProxy||"",type:a.type||"http",isActive:void 0===a.isActive||a.isActive,strictProxy:!0===a.strictProxy,testStatus:a.testStatus||"unknown",lastTestedAt:a.lastTestedAt||null,lastError:a.lastError||null,createdAt:c,updatedAt:c};return l(b,e),e}async function p(a,b){let c=await (0,d.c)(),e=null;return c.transaction(()=>{let d=c.get("SELECT * FROM proxyPools WHERE id = ?",[a]);if(!d)return;let f={...k(d),...b,updatedAt:new Date().toISOString()};l(c,f),e=f}),e}async function q(a){let b=await (0,d.c)(),c=null;return b.transaction(()=>{let d=b.get("SELECT * FROM proxyPools WHERE id = ?",[a]);d&&(c=k(d),b.run("DELETE FROM proxyPools WHERE id = ?",[a]))}),c}var r=c(74452);function s(a){return a?{id:a.id,name:a.name,kind:a.kind,models:(0,e.q)(a.models,[]),createdAt:a.createdAt,updatedAt:a.updatedAt}:null}async function t(){return(await (0,d.c)()).all("SELECT * FROM combos ORDER BY createdAt ASC").map(s)}async function u(a){return s((await (0,d.c)()).get("SELECT * FROM combos WHERE id = ?",[a]))}async function v(a){return s((await (0,d.c)()).get("SELECT * FROM combos WHERE name = ?",[a]))}async function w(a){let b=await (0,d.c)(),c=new Date().toISOString(),f={id:(0,j.A)(),name:a.name,kind:a.kind||null,models:a.models||[],createdAt:c,updatedAt:c};return b.run("INSERT INTO combos(id, name, kind, models, createdAt, updatedAt) VALUES(?, ?, ?, ?, ?, ?)",[f.id,f.name,f.kind,(0,e.s)(f.models),f.createdAt,f.updatedAt]),f}async function x(a,b){let c=await (0,d.c)(),f=null;return c.transaction(()=>{let d=c.get("SELECT * FROM combos WHERE id = ?",[a]);if(!d)return;let g={...s(d),...b,updatedAt:new Date().toISOString()};c.run("UPDATE combos SET name = ?, kind = ?, models = ?, updatedAt = ? WHERE id = ?",[g.name,g.kind,(0,e.s)(g.models||[]),g.updatedAt,a]),f=g}),f}async function y(a){let b=(await (0,d.c)()).run("DELETE FROM combos WHERE id = ?",[a]);return(b?.changes??0)>0}var z=c(9460),A=c(97914);let B="disabledModels";async function C(){let a=(await (0,d.c)()).all("SELECT key, value FROM kv WHERE scope = ?",[B]),b={};for(let c of a)b[c.key]=(0,e.q)(c.value,[]);return b}async function D(a,b){if(!a||!Array.isArray(b))return;let c=await (0,d.c)();c.transaction(()=>{let d=c.get("SELECT value FROM kv WHERE scope = ? AND key = ?",[B,a]),f=[...new Set([...d&&(0,e.q)(d.value,[])||[],...b])];c.run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[B,a,(0,e.s)(f)])})}async function E(a,b){if(!a)return;let c=await (0,d.c)();c.transaction(()=>{if(!Array.isArray(b)||0===b.length)return void c.run("DELETE FROM kv WHERE scope = ? AND key = ?",[B,a]);let d=c.get("SELECT value FROM kv WHERE scope = ? AND key = ?",[B,a]),f=d&&(0,e.q)(d.value,[])||[],g=new Set(b),h=f.filter(a=>!g.has(a));0===h.length?c.run("DELETE FROM kv WHERE scope = ? AND key = ?",[B,a]):c.run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[B,a,(0,e.s)(h)])})}var F=c(52549),G=c(77638);let H=null,I=0;async function J(){if(H&&Date.now()-I<5e3)return H;try{let{getSettings:a}=await Promise.resolve().then(c.bind(c,42655)),b=await a(),d="false"!==process.env.OBSERVABILITY_ENABLED;H={enabled:"boolean"==typeof b.enableObservability?b.enableObservability:d,maxRecords:b.observabilityMaxRecords||parseInt(process.env.OBSERVABILITY_MAX_RECORDS||String(200),10),batchSize:b.observabilityBatchSize||parseInt(process.env.OBSERVABILITY_BATCH_SIZE||String(20),10),flushIntervalMs:b.observabilityFlushIntervalMs||parseInt(process.env.OBSERVABILITY_FLUSH_INTERVAL_MS||String(5e3),10),maxJsonSize:1024*(b.observabilityMaxJsonSize||parseInt(process.env.OBSERVABILITY_MAX_JSON_SIZE||"5",10))}}catch{H={enabled:!1,maxRecords:200,batchSize:20,flushIntervalMs:5e3,maxJsonSize:5120}}return I=Date.now(),H}let K=[],L=null,M=!1,N=!1,O=!1;function P(a,b){if("write"===a){if(N)return;N=!0}else{if(O)return;O=!0}console.error(`[requestDetailsRepo] MySQL observability ${a} unavailable; SQLite fallback is disabled.`,b?.message||b||"")}function Q(a,b){let c=JSON.stringify(a||{});return c.length>b?{_truncated:!0,_originalSize:c.length,_preview:c.substring(0,200)}:a||{}}async function R(){if(!M&&0!==K.length){M=!0;try{for(;K.length>0;){let a=K.splice(0,K.length),b=await J(),c=[];for(let d of a){d.id||(d.id=function(a){let b=new Date().toISOString(),c=Math.random().toString(36).substring(2,8),d=a?a.replace(/[^a-zA-Z0-9-]/g,"-"):"unknown";return`${b}-${c}-${d}`}(d.model)),d.timestamp||(d.timestamp=new Date().toISOString()),d.request?.headers&&(d.request.headers=function(a){if(!a||"object"!=typeof a)return{};let b=["authorization","x-api-key","cookie","token","api-key"],c={...a};for(let a of Object.keys(c))b.some(b=>a.toLowerCase().includes(b))&&delete c[a];return c}(d.request.headers));let a={id:d.id,provider:d.provider||null,model:d.model||null,connectionId:d.connectionId||null,timestamp:d.timestamp,status:d.status||null,requestId:d.requestId||d.id||null,endpoint:d.endpoint||d.request?.endpoint||null,rtkStats:d.rtkStats||null,latency:d.latency||{},tokens:d.tokens||{},request:Q(d.request,b.maxJsonSize),providerRequest:Q(d.providerRequest,b.maxJsonSize),providerResponse:Q(d.providerResponse,b.maxJsonSize),response:Q(d.response,b.maxJsonSize)};c.push(a)}if(!(c.length>0)||await (0,G.RT)(c).catch(a=>(P("write",a),!1))){let a=await J();(0,G.Nn)(a.maxRecords).catch(()=>{})}else P("write","request_details write returned false")}}catch(a){console.error("[requestDetailsRepo] Batch write failed:",a)}finally{M=!1}}}async function S(a){let b=await J();b.enabled&&(K.push(a),K.length>=b.batchSize?(L&&(clearTimeout(L),L=null),R().catch(a=>console.error("[requestDetailsRepo] flush err:",a))):L||(L=setTimeout(()=>{L=null,R().catch(()=>{})},b.flushIntervalMs)))}async function T(a={}){let b=Math.max(1,Number(a.page)||1),c=Math.max(1,Math.min(100,Number(a.pageSize)||50)),d=await (0,G.Y4)(a).catch(a=>(P("read",a),null));return d||(P("read","request_details read returned null"),{details:[],pagination:{page:b,pageSize:c,totalItems:0,totalPages:0,hasNext:!1,hasPrev:b>1},dbInfo:{type:"mysql",unavailable:!0,sqliteFallback:!1}})}let U=async()=>{L&&(clearTimeout(L),L=null),K.length>0&&await R()};async function V(){let a=await (0,d.c)(),{exportSettings:b}=await Promise.resolve().then(c.bind(c,42655)),{exportBrandingAssets:g}=await c.e(6404).then(c.bind(c,16404)),h={backup:{formatVersion:2,exportedAt:new Date().toISOString()},settings:await b(),providerConnections:a.all("SELECT * FROM providerConnections").map(a=>({...(0,e.q)(a.data,{}),id:a.id,provider:a.provider,authType:a.authType,name:a.name,email:a.email,priority:a.priority,isActive:1===a.isActive,scope:a.scope||"system",ownerUser:String(a.ownerUser||"").trim().toLowerCase(),createdByUser:String(a.createdByUser||"").trim().toLowerCase(),visibility:a.visibility||("personal"===a.scope?"private":"system"),createdAt:a.createdAt,updatedAt:a.updatedAt})),providerNodes:a.all("SELECT * FROM providerNodes").map(a=>({...(0,e.q)(a.data,{}),id:a.id,type:a.type,name:a.name,createdAt:a.createdAt,updatedAt:a.updatedAt})),proxyPools:a.all("SELECT * FROM proxyPools").map(a=>({...(0,e.q)(a.data,{}),id:a.id,isActive:1===a.isActive,testStatus:a.testStatus,createdAt:a.createdAt,updatedAt:a.updatedAt})),apiKeys:a.all("SELECT * FROM apiKeys").map(a=>({id:a.id,key:a.key,name:a.name,machineId:a.machineId,isActive:1===a.isActive,adminDisabled:1===a.adminDisabled,ownerUser:a.ownerUser||"",createdByUser:a.createdByUser||"",cavemanMode:a.cavemanMode||"inherit",cavemanLevel:a.cavemanLevel||"lite",createdAt:a.createdAt,allowedModels:(0,e.q)(a.allowedModels,[]),limits:(0,e.q)(a.limits,{})})),combos:a.all("SELECT * FROM combos").map(a=>({id:a.id,name:a.name,kind:a.kind,models:(0,e.q)(a.models,[]),createdAt:a.createdAt,updatedAt:a.updatedAt})),modelAliases:{},customModels:[],mitmAlias:{},pricing:{},resourceMonitor:{servers:await (0,f.HI)({includeSecrets:!0}),history:a.all("SELECT * FROM resourceMonitorHistory ORDER BY serverId, sampledAt").map(a=>({...a,gpus:(0,e.q)(a.gpus,[])}))},branding:await g()};for(let b of a.all("SELECT key, value FROM kv WHERE scope = 'modelAliases'"))h.modelAliases[b.key]=(0,e.q)(b.value);for(let b of a.all("SELECT key, value FROM kv WHERE scope = 'customModels'"))h.customModels.push((0,e.q)(b.value));for(let b of a.all("SELECT key, value FROM kv WHERE scope = 'mitmAlias'"))h.mitmAlias[b.key]=(0,e.q)(b.value);for(let b of a.all("SELECT key, value FROM kv WHERE scope = 'pricing'"))h.pricing[b.key]=(0,e.q)(b.value);return h}async function W(a,{returnExport:b=!0}={}){if(!a||"object"!=typeof a||Array.isArray(a))throw Error("Invalid database payload");let g=await (0,d.c)(),{exportSettings:h}=await Promise.resolve().then(c.bind(c,42655)),{exportBrandingAssets:i,restoreBrandingAssets:j,validateBrandingBackup:k}=await c.e(6404).then(c.bind(c,16404)),l=Object.prototype.hasOwnProperty.call(a,"branding");l&&k(a.branding);let m=await h(),n=l?await i():null,o=a.settings&&"object"==typeof a.settings?{...a.settings}:a.settings;!l&&o&&(o.brandingLogo=m.brandingLogo||null,o.brandingFavicon=m.brandingFavicon||null);let p=Object.prototype.hasOwnProperty.call(a,"resourceMonitor"),q=p?a.resourceMonitor:null;if(p&&(!q||"object"!=typeof q||Array.isArray(q)||!Array.isArray(q.servers)||!Array.isArray(q.history)))throw Error("Invalid resource monitor backup payload");let r=p?q.history.map(a=>{if(!a||"object"!=typeof a||Array.isArray(a))throw Error("Invalid resource monitor history entry");let b=String(a.serverId||"").trim(),c=Number(a.sampledAt);if(!b||!Number.isFinite(c))throw Error("Invalid resource monitor history entry");return{serverId:b,sampledAt:c,cpuUsage:Number(a.cpuUsage)||0,memoryUsage:Number(a.memoryUsage)||0,diskUsage:Number(a.diskUsage)||0,diskUsedBytes:Number(a.diskUsedBytes)||0,networkRxBps:Number(a.networkRxBps)||0,networkTxBps:Number(a.networkTxBps)||0,gpus:Array.isArray(a.gpus)?a.gpus:[]}}):[],s=null;p&&(s=await (0,f.HI)({includeSecrets:!0}),await (0,f.x8)(q.servers));try{g.transaction(()=>{for(let b of(g.run("DELETE FROM settings"),g.run("DELETE FROM providerConnections"),g.run("DELETE FROM providerNodes"),g.run("DELETE FROM proxyPools"),g.run("DELETE FROM apiKeys"),g.run("DELETE FROM combos"),g.run("DELETE FROM kv WHERE scope IN ('modelAliases', 'customModels', 'mitmAlias', 'pricing')"),p&&g.run("DELETE FROM resourceMonitorHistory"),o&&g.run(`INSERT INTO settings(id, data) VALUES(1, ?)
|
|
8
|
+
data=excluded.data, updatedAt=excluded.updatedAt`,[c.id,c.isActive,c.testStatus,c.data,c.createdAt,c.updatedAt])}async function m(a={}){let b=await (0,d.c)(),c=[],e=[];void 0!==a.isActive&&(c.push("isActive = ?"),e.push(+!!a.isActive)),a.testStatus&&(c.push("testStatus = ?"),e.push(a.testStatus));let f=`SELECT * FROM proxyPools${c.length?` WHERE ${c.join(" AND ")}`:""}`,g=b.all(f,e).map(k);return g.sort((a,b)=>new Date(b.updatedAt||0)-new Date(a.updatedAt||0)),g}async function n(a){return k((await (0,d.c)()).get("SELECT * FROM proxyPools WHERE id = ?",[a]))}async function o(a){let b=await (0,d.c)(),c=new Date().toISOString(),e={id:a.id||(0,j.A)(),name:a.name,proxyUrl:a.proxyUrl,noProxy:a.noProxy||"",type:a.type||"http",isActive:void 0===a.isActive||a.isActive,strictProxy:!0===a.strictProxy,testStatus:a.testStatus||"unknown",lastTestedAt:a.lastTestedAt||null,lastError:a.lastError||null,createdAt:c,updatedAt:c};return l(b,e),e}async function p(a,b){let c=await (0,d.c)(),e=null;return c.transaction(()=>{let d=c.get("SELECT * FROM proxyPools WHERE id = ?",[a]);if(!d)return;let f={...k(d),...b,updatedAt:new Date().toISOString()};l(c,f),e=f}),e}async function q(a){let b=await (0,d.c)(),c=null;return b.transaction(()=>{let d=b.get("SELECT * FROM proxyPools WHERE id = ?",[a]);d&&(c=k(d),b.run("DELETE FROM proxyPools WHERE id = ?",[a]))}),c}var r=c(74452);function s(a){return a?{id:a.id,name:a.name,kind:a.kind,models:(0,e.q)(a.models,[]),createdAt:a.createdAt,updatedAt:a.updatedAt}:null}async function t(){return(await (0,d.c)()).all("SELECT * FROM combos ORDER BY createdAt ASC").map(s)}async function u(a){return s((await (0,d.c)()).get("SELECT * FROM combos WHERE id = ?",[a]))}async function v(a){return s((await (0,d.c)()).get("SELECT * FROM combos WHERE name = ?",[a]))}async function w(a){let b=await (0,d.c)(),c=new Date().toISOString(),f={id:(0,j.A)(),name:a.name,kind:a.kind||null,models:a.models||[],createdAt:c,updatedAt:c};return b.run("INSERT INTO combos(id, name, kind, models, createdAt, updatedAt) VALUES(?, ?, ?, ?, ?, ?)",[f.id,f.name,f.kind,(0,e.s)(f.models),f.createdAt,f.updatedAt]),f}async function x(a,b){let c=await (0,d.c)(),f=null;return c.transaction(()=>{let d=c.get("SELECT * FROM combos WHERE id = ?",[a]);if(!d)return;let g={...s(d),...b,updatedAt:new Date().toISOString()};c.run("UPDATE combos SET name = ?, kind = ?, models = ?, updatedAt = ? WHERE id = ?",[g.name,g.kind,(0,e.s)(g.models||[]),g.updatedAt,a]),f=g}),f}async function y(a){let b=(await (0,d.c)()).run("DELETE FROM combos WHERE id = ?",[a]);return(b?.changes??0)>0}var z=c(9460),A=c(97914);let B="disabledModels";async function C(){let a=(await (0,d.c)()).all("SELECT key, value FROM kv WHERE scope = ?",[B]),b={};for(let c of a)b[c.key]=(0,e.q)(c.value,[]);return b}async function D(a,b){if(!a||!Array.isArray(b))return;let c=await (0,d.c)();c.transaction(()=>{let d=c.get("SELECT value FROM kv WHERE scope = ? AND key = ?",[B,a]),f=[...new Set([...d&&(0,e.q)(d.value,[])||[],...b])];c.run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[B,a,(0,e.s)(f)])})}async function E(a,b){if(!a)return;let c=await (0,d.c)();c.transaction(()=>{if(!Array.isArray(b)||0===b.length)return void c.run("DELETE FROM kv WHERE scope = ? AND key = ?",[B,a]);let d=c.get("SELECT value FROM kv WHERE scope = ? AND key = ?",[B,a]),f=d&&(0,e.q)(d.value,[])||[],g=new Set(b),h=f.filter(a=>!g.has(a));0===h.length?c.run("DELETE FROM kv WHERE scope = ? AND key = ?",[B,a]):c.run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[B,a,(0,e.s)(h)])})}var F=c(52549),G=c(77638);let H=null,I=0;async function J(){if(H&&Date.now()-I<5e3)return H;try{let{getSettings:a}=await Promise.resolve().then(c.bind(c,42655)),b=await a(),d="false"!==process.env.OBSERVABILITY_ENABLED;H={enabled:"boolean"==typeof b.enableObservability?b.enableObservability:d,maxRecords:b.observabilityMaxRecords||parseInt(process.env.OBSERVABILITY_MAX_RECORDS||String(200),10),batchSize:b.observabilityBatchSize||parseInt(process.env.OBSERVABILITY_BATCH_SIZE||String(20),10),flushIntervalMs:b.observabilityFlushIntervalMs||parseInt(process.env.OBSERVABILITY_FLUSH_INTERVAL_MS||String(5e3),10),maxJsonSize:1024*(b.observabilityMaxJsonSize||parseInt(process.env.OBSERVABILITY_MAX_JSON_SIZE||"5",10))}}catch{H={enabled:!1,maxRecords:200,batchSize:20,flushIntervalMs:5e3,maxJsonSize:5120}}return I=Date.now(),H}let K=[],L=null,M=!1,N=!1,O=!1;function P(a,b){if("write"===a){if(N)return;N=!0}else{if(O)return;O=!0}console.error(`[requestDetailsRepo] MySQL observability ${a} unavailable; SQLite fallback is disabled.`,b?.message||b||"")}function Q(a,b){let c=JSON.stringify(a||{});return c.length>b?{_truncated:!0,_originalSize:c.length,_preview:c.substring(0,200)}:a||{}}async function R(){if(!M&&0!==K.length){M=!0;try{for(;K.length>0;){let a=K.splice(0,K.length),b=await J(),c=[];for(let d of a){d.id||(d.id=function(a){let b=new Date().toISOString(),c=Math.random().toString(36).substring(2,8),d=a?a.replace(/[^a-zA-Z0-9-]/g,"-"):"unknown";return`${b}-${c}-${d}`}(d.model)),d.timestamp||(d.timestamp=new Date().toISOString()),d.request?.headers&&(d.request.headers=function(a){if(!a||"object"!=typeof a)return{};let b=["authorization","x-api-key","cookie","token","api-key"],c={...a};for(let a of Object.keys(c))b.some(b=>a.toLowerCase().includes(b))&&delete c[a];return c}(d.request.headers));let a={id:d.id,provider:d.provider||null,model:d.model||null,connectionId:d.connectionId||null,timestamp:d.timestamp,status:d.status||null,requestId:d.requestId||d.id||null,endpoint:d.endpoint||d.request?.endpoint||null,rtkStats:d.rtkStats||null,latency:d.latency||{},tokens:d.tokens||{},request:Q(d.request,b.maxJsonSize),providerRequest:Q(d.providerRequest,b.maxJsonSize),providerResponse:Q(d.providerResponse,b.maxJsonSize),response:Q(d.response,b.maxJsonSize)};c.push(a)}if(!(c.length>0)||await (0,G.saveMysqlRequestDetails)(c).catch(a=>(P("write",a),!1))){let a=await J();(0,G.purgeMysqlRequestDetails)(a.maxRecords).catch(()=>{})}else P("write","request_details write returned false")}}catch(a){console.error("[requestDetailsRepo] Batch write failed:",a)}finally{M=!1}}}async function S(a){let b=await J();b.enabled&&(K.push(a),K.length>=b.batchSize?(L&&(clearTimeout(L),L=null),R().catch(a=>console.error("[requestDetailsRepo] flush err:",a))):L||(L=setTimeout(()=>{L=null,R().catch(()=>{})},b.flushIntervalMs)))}async function T(a={}){let b=Math.max(1,Number(a.page)||1),c=Math.max(1,Math.min(100,Number(a.pageSize)||50)),d=await (0,G.getMysqlRequestDetails)(a).catch(a=>(P("read",a),null));return d||(P("read","request_details read returned null"),{details:[],pagination:{page:b,pageSize:c,totalItems:0,totalPages:0,hasNext:!1,hasPrev:b>1},dbInfo:{type:"mysql",unavailable:!0,sqliteFallback:!1}})}let U=async()=>{L&&(clearTimeout(L),L=null),K.length>0&&await R()};async function V(){let a=await (0,d.c)(),{exportSettings:b}=await Promise.resolve().then(c.bind(c,42655)),{exportBrandingAssets:g}=await c.e(6404).then(c.bind(c,16404)),h={backup:{formatVersion:2,exportedAt:new Date().toISOString()},settings:await b(),providerConnections:a.all("SELECT * FROM providerConnections").map(a=>({...(0,e.q)(a.data,{}),id:a.id,provider:a.provider,authType:a.authType,name:a.name,email:a.email,priority:a.priority,isActive:1===a.isActive,scope:a.scope||"system",ownerUser:String(a.ownerUser||"").trim().toLowerCase(),createdByUser:String(a.createdByUser||"").trim().toLowerCase(),visibility:a.visibility||("personal"===a.scope?"private":"system"),createdAt:a.createdAt,updatedAt:a.updatedAt})),providerNodes:a.all("SELECT * FROM providerNodes").map(a=>({...(0,e.q)(a.data,{}),id:a.id,type:a.type,name:a.name,createdAt:a.createdAt,updatedAt:a.updatedAt})),proxyPools:a.all("SELECT * FROM proxyPools").map(a=>({...(0,e.q)(a.data,{}),id:a.id,isActive:1===a.isActive,testStatus:a.testStatus,createdAt:a.createdAt,updatedAt:a.updatedAt})),apiKeys:a.all("SELECT * FROM apiKeys").map(a=>({id:a.id,key:a.key,name:a.name,machineId:a.machineId,isActive:1===a.isActive,adminDisabled:1===a.adminDisabled,ownerUser:a.ownerUser||"",createdByUser:a.createdByUser||"",cavemanMode:a.cavemanMode||"inherit",cavemanLevel:a.cavemanLevel||"lite",createdAt:a.createdAt,allowedModels:(0,e.q)(a.allowedModels,[]),limits:(0,e.q)(a.limits,{})})),combos:a.all("SELECT * FROM combos").map(a=>({id:a.id,name:a.name,kind:a.kind,models:(0,e.q)(a.models,[]),createdAt:a.createdAt,updatedAt:a.updatedAt})),modelAliases:{},customModels:[],mitmAlias:{},pricing:{},resourceMonitor:{servers:await (0,f.HI)({includeSecrets:!0}),history:a.all("SELECT * FROM resourceMonitorHistory ORDER BY serverId, sampledAt").map(a=>({...a,gpus:(0,e.q)(a.gpus,[])}))},branding:await g()};for(let b of a.all("SELECT key, value FROM kv WHERE scope = 'modelAliases'"))h.modelAliases[b.key]=(0,e.q)(b.value);for(let b of a.all("SELECT key, value FROM kv WHERE scope = 'customModels'"))h.customModels.push((0,e.q)(b.value));for(let b of a.all("SELECT key, value FROM kv WHERE scope = 'mitmAlias'"))h.mitmAlias[b.key]=(0,e.q)(b.value);for(let b of a.all("SELECT key, value FROM kv WHERE scope = 'pricing'"))h.pricing[b.key]=(0,e.q)(b.value);return h}async function W(a,{returnExport:b=!0}={}){if(!a||"object"!=typeof a||Array.isArray(a))throw Error("Invalid database payload");let g=await (0,d.c)(),{exportSettings:h}=await Promise.resolve().then(c.bind(c,42655)),{exportBrandingAssets:i,restoreBrandingAssets:j,validateBrandingBackup:k}=await c.e(6404).then(c.bind(c,16404)),l=Object.prototype.hasOwnProperty.call(a,"branding");l&&k(a.branding);let m=await h(),n=l?await i():null,o=a.settings&&"object"==typeof a.settings?{...a.settings}:a.settings;!l&&o&&(o.brandingLogo=m.brandingLogo||null,o.brandingFavicon=m.brandingFavicon||null);let p=Object.prototype.hasOwnProperty.call(a,"resourceMonitor"),q=p?a.resourceMonitor:null;if(p&&(!q||"object"!=typeof q||Array.isArray(q)||!Array.isArray(q.servers)||!Array.isArray(q.history)))throw Error("Invalid resource monitor backup payload");let r=p?q.history.map(a=>{if(!a||"object"!=typeof a||Array.isArray(a))throw Error("Invalid resource monitor history entry");let b=String(a.serverId||"").trim(),c=Number(a.sampledAt);if(!b||!Number.isFinite(c))throw Error("Invalid resource monitor history entry");return{serverId:b,sampledAt:c,cpuUsage:Number(a.cpuUsage)||0,memoryUsage:Number(a.memoryUsage)||0,diskUsage:Number(a.diskUsage)||0,diskUsedBytes:Number(a.diskUsedBytes)||0,networkRxBps:Number(a.networkRxBps)||0,networkTxBps:Number(a.networkTxBps)||0,gpus:Array.isArray(a.gpus)?a.gpus:[]}}):[],s=null;p&&(s=await (0,f.HI)({includeSecrets:!0}),await (0,f.x8)(q.servers));try{g.transaction(()=>{for(let b of(g.run("DELETE FROM settings"),g.run("DELETE FROM providerConnections"),g.run("DELETE FROM providerNodes"),g.run("DELETE FROM proxyPools"),g.run("DELETE FROM apiKeys"),g.run("DELETE FROM combos"),g.run("DELETE FROM kv WHERE scope IN ('modelAliases', 'customModels', 'mitmAlias', 'pricing')"),p&&g.run("DELETE FROM resourceMonitorHistory"),o&&g.run(`INSERT INTO settings(id, data) VALUES(1, ?)
|
|
9
9
|
ON CONFLICT(id) DO UPDATE SET data = excluded.data`,[(0,e.s)(o)]),a.providerConnections||[])){let{id:a,provider:c,authType:d,name:f,email:h,priority:i,isActive:j,scope:k,ownerUser:l,createdByUser:m,visibility:n,createdAt:o,updatedAt:p,...q}=b,r="personal"===k?"personal":"system";g.run(`INSERT OR REPLACE INTO providerConnections(id, provider, authType, name, email, priority, isActive, scope, ownerUser, createdByUser, visibility, data, createdAt, updatedAt)
|
|
10
10
|
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[a,c,d||"oauth",f||null,h||null,i||null,+(!1!==j),r,String(l||"").trim().toLowerCase(),String(m||l||"").trim().toLowerCase(),n||("personal"===r?"private":"system"),(0,e.s)(q),o||new Date().toISOString(),p||new Date().toISOString()])}for(let b of a.providerNodes||[]){let{id:a,type:c,name:d,createdAt:f,updatedAt:h,...i}=b;g.run(`INSERT OR REPLACE INTO providerNodes(id, type, name, data, createdAt, updatedAt)
|
|
11
11
|
VALUES(?, ?, ?, ?, ?, ?)`,[a,c||null,d||null,(0,e.s)(i),f||new Date().toISOString(),h||new Date().toISOString()])}for(let b of a.proxyPools||[]){let{id:a,isActive:c,testStatus:d,createdAt:f,updatedAt:h,...i}=b;g.run(`INSERT OR REPLACE INTO proxyPools(id, isActive, testStatus, data, createdAt, updatedAt)
|
|
@@ -215,7 +215,7 @@ exports.id=402,exports.ids=[402],exports.modules={490:(a,b,c)=>{"use strict";c.d
|
|
|
215
215
|
WHERE provider = ?
|
|
216
216
|
AND (scope = 'personal'
|
|
217
217
|
OR visibility = 'private'
|
|
218
|
-
OR length(trim(coalesce(ownerUser, ''))) > 0)`,[a.provider]).map(G):l).find(b=>!!E(b.authType)&&(n?function(a={},b={}){let c=D(a);if(0===c.size)return!1;let d=D(b);if(0===d.size)return!1;for(let a of c)if(d.has(a))return!0;return!1}(b,a):C(b)===o));if(b)throw function(a,{global:b=!1}={}){let c=a?.email||a?.displayName||a?.name||a?.id||"account n\xe0y",d=function(a={}){let b=x(a.ownerUser||a.createdByUser);return b||"kh\xf4ng x\xe1c định"}(a),e=Error(b?`Account n\xe0y đ\xe3 được li\xean kết trong hệ thống bởi user: ${d}. Vui l\xf2ng d\xf9ng account kh\xe1c hoặc x\xf3a connection cũ trước khi add lại.`:`Account ${c} đ\xe3 được th\xeam trước đ\xf3 bởi user: ${d}. Vui l\xf2ng d\xf9ng account kh\xe1c hoặc x\xf3a connection cũ trước khi add lại.`);return e.code="DUPLICATE_PERSONAL_ACCOUNT",e.status=409,e.connectionId=a?.id,e.ownerUser=d,e}(b,{global:r})}if("oauth"===a.authType&&a.email){let b=a.providerSpecificData?.workspaceId||a.providerSpecificData?.chatgptAccountId||a.providerSpecificData?.accountId;m=l.find(c=>{if("oauth"!==c.authType||c.email!==a.email)return!1;let d=c.providerSpecificData?.workspaceId||c.providerSpecificData?.chatgptAccountId||c.providerSpecificData?.accountId;return"codex"===a.provider?!!(b&&d&&b===d):!b||!d||b===d})}else"apikey"===a.authType&&a.name&&(m=l.find(b=>"apikey"===b.authType&&b.name===a.name));if(m){let d={...m,...a,updatedAt:f};H(c,d),b=d;return}let s=a.name||null;s||"oauth"!==a.authType&&"access_token"!==a.authType||(s=a.email||`Account ${l.length+1}`);let t=a.priority;t||(t=l.reduce((a,b)=>Math.max(a,b.priority||0),0)+1);let u={id:(0,d.A)(),provider:a.provider,authType:a.authType||"oauth",name:s,priority:t,isActive:void 0===a.isActive||a.isActive,scope:h,ownerUser:i,createdByUser:x(a.createdByUser||i),visibility:a.visibility||("personal"===h?"private":"system"),createdAt:f,updatedAt:f};for(let b of v)void 0!==a[b]&&null!==a[b]&&(u[b]=a[b]);a.providerSpecificData&&Object.keys(a.providerSpecificData).length>0&&(u.providerSpecificData=a.providerSpecificData),void 0!==a.email&&(u.email=a.email),H(c,u),L(c,a.provider,h,i),b=u}),b}async function N(a,b){let c,d=await (0,e.c)();return d.transaction(()=>{let e=d.get("SELECT * FROM providerConnections WHERE id = ?",[a]);if(!e){c=null;return}let g=G(e),h={...g,...b,updatedAt:new Date().toISOString()},i=new Set(w.filter(a=>Object.prototype.hasOwnProperty.call(b,a)));H(d,h,{storedData:(0,f.q)(e.data,{}),encryptFields:i}),void 0!==b.priority&&L(d,g.provider,h.scope,h.ownerUser),c=h}),c}async function O(a){let b=await (0,e.c)(),c=!1;return b.transaction(()=>{let d=b.get("SELECT provider, scope, ownerUser FROM providerConnections WHERE id = ?",[a]);d&&(b.run("DELETE FROM providerConnections WHERE id = ?",[a]),L(b,d.provider,d.scope,d.ownerUser),c=!0)}),c}async function P(a){let b=await (0,e.c)(),c=b.get("SELECT COUNT(*) AS n FROM providerConnections WHERE provider = ? AND scope = 'system' AND coalesce(visibility, 'system') <> 'private' AND length(trim(coalesce(ownerUser, ''))) = 0",[a]);return b.run("DELETE FROM providerConnections WHERE provider = ? AND scope = 'system' AND coalesce(visibility, 'system') <> 'private' AND length(trim(coalesce(ownerUser, ''))) = 0",[a]),c?.n||0}},49120:(a,b,c)=>{"use strict";c.r(b),c.d(b,{DATA_DIR:()=>m,getDataDir:()=>l});var d=c(73024),e=c.n(d),f=c(33873),g=c.n(f),h=c(21820),i=c.n(h);let j="bluerouter";function k(){return"win32"===process.platform?g().join(process.env.APPDATA||g().join(i().homedir(),"AppData","Roaming"),j):g().join(i().homedir(),`.${j}`)}function l(){let a=process.env.DATA_DIR;if(!a)return k();try{return e().mkdirSync(a,{recursive:!0}),a}catch(b){if(b?.code==="EACCES"||b?.code==="EPERM")return console.warn(`[DATA_DIR] '${a}' not writable → fallback ~/.${j}`),k();throw b}}let m=l()},52549:(a,b,c)=>{"use strict";c.d(b,{E5:()=>L,rg:()=>E,j$:()=>K,Zx:()=>M,BY:()=>H,aX:()=>B,Py:()=>F,sZ:()=>G,_V:()=>m,uw:()=>D});var d=c(94735),e=c(644),f=c(77638);global._pendingRequests||(global._pendingRequests={byModel:{},byAccount:{}}),global._lastErrorProvider||(global._lastErrorProvider={provider:"",ts:0}),global._statsEmitter||(global._statsEmitter=new d.EventEmitter,global._statsEmitter.setMaxListeners(50)),global._pendingTimers||(global._pendingTimers={}),global._usageStatsCache||(global._usageStatsCache=new Map),global._recentRing||(global._recentRing={items:[],initialized:!1}),global._connectionMapCache||(global._connectionMapCache={map:{},ts:0});let g=global._pendingRequests,h=global._usageStatsCache,i=global._lastErrorProvider,j=global._pendingTimers,k=global._recentRing,l=global._connectionMapCache,m=global._statsEmitter;function n(a){return String(a||"").trim()}function o(a){return n(a).toLowerCase()}function p(a,b=0){let c=Number(a);return Number.isFinite(c)?c:b}let q=["openai-compatible-","anthropic-compatible-"];function r(a){if(!0===a||1===a||"1"===a)return!0;if(!1===a||0===a||"0"===a)return!1;if("string"==typeof a){let b=a.trim().toLowerCase();if(["true","yes","on","enabled"].includes(b))return!0;if(["false","no","off","disabled"].includes(b))return!1}return null}function s(a){let b=n(a);return b?b.length<=12?b:`${b.slice(0,8)}...${b.slice(-4)}`:"local-no-key"}function t(a,b){let c=o(a),d=Number(b);return Number.isFinite(d)&&d>=400?c||"error":c||(Number.isFinite(d),"ok")}function u(a){return["pending","running","in_progress","queued","processing"].includes(o(a))}function v(a,b){let c,d=o(a);if(c=o(d),/^(?:error|fail|failed|timeout|network|aborted|abort|rate_limited|provider_error|gateway_error|parse_error|model_error)(?:\b|[\s_-]|$)/.test(c))return!1;let e=Number(b);if(Number.isFinite(e))return e>=200&&e<300;let f=t(a);return!!["ok","success","succeeded","complete","completed","done","200"].includes(f)||/^(?:2\d\d|ok|success|succeeded|complete|completed|done)(?:\b|[\s_-]|$)/.test(f)}function w(a,b,c){if(b&&(a[b]||(a[b]={requests:0,promptTokens:0,completionTokens:0,cost:0}),a[b].requests+=c.requests||1,a[b].promptTokens+=c.promptTokens||0,a[b].completionTokens+=c.completionTokens||0,a[b].cost+=c.cost||0,c.meta)){let d=a[b].lastUsed;Object.assign(a[b],c.meta),d&&c.meta.lastUsed&&new Date(d).getTime()>new Date(c.meta.lastUsed).getTime()&&(a[b].lastUsed=d)}}async function x(){if(Date.now()-l.ts<3e4)return l.map;try{let{getProviderConnections:a}=await Promise.resolve().then(c.bind(c,46709)),b=await a({includePersonal:!0}),d={};for(let a of b)d[a.id]={name:a.displayName||a.name||a.email||a.id,displayName:a.displayName||a.name||"",email:a.email||"",provider:a.provider||"",ownerUser:a.ownerUser||"",isPersonal:"personal"===a.scope||"private"===a.visibility||!!a.ownerUser};l.map=d,l.ts=Date.now()}catch{}return l.map}let y=0;async function z(){if((!k.initialized||!(k.items.length>=50))&&!(Date.now()-y<3e4)){y=Date.now();try{let a=await (0,f.
|
|
218
|
+
OR length(trim(coalesce(ownerUser, ''))) > 0)`,[a.provider]).map(G):l).find(b=>!!E(b.authType)&&(n?function(a={},b={}){let c=D(a);if(0===c.size)return!1;let d=D(b);if(0===d.size)return!1;for(let a of c)if(d.has(a))return!0;return!1}(b,a):C(b)===o));if(b)throw function(a,{global:b=!1}={}){let c=a?.email||a?.displayName||a?.name||a?.id||"account n\xe0y",d=function(a={}){let b=x(a.ownerUser||a.createdByUser);return b||"kh\xf4ng x\xe1c định"}(a),e=Error(b?`Account n\xe0y đ\xe3 được li\xean kết trong hệ thống bởi user: ${d}. Vui l\xf2ng d\xf9ng account kh\xe1c hoặc x\xf3a connection cũ trước khi add lại.`:`Account ${c} đ\xe3 được th\xeam trước đ\xf3 bởi user: ${d}. Vui l\xf2ng d\xf9ng account kh\xe1c hoặc x\xf3a connection cũ trước khi add lại.`);return e.code="DUPLICATE_PERSONAL_ACCOUNT",e.status=409,e.connectionId=a?.id,e.ownerUser=d,e}(b,{global:r})}if("oauth"===a.authType&&a.email){let b=a.providerSpecificData?.workspaceId||a.providerSpecificData?.chatgptAccountId||a.providerSpecificData?.accountId;m=l.find(c=>{if("oauth"!==c.authType||c.email!==a.email)return!1;let d=c.providerSpecificData?.workspaceId||c.providerSpecificData?.chatgptAccountId||c.providerSpecificData?.accountId;return"codex"===a.provider?!!(b&&d&&b===d):!b||!d||b===d})}else"apikey"===a.authType&&a.name&&(m=l.find(b=>"apikey"===b.authType&&b.name===a.name));if(m){let d={...m,...a,updatedAt:f};H(c,d),b=d;return}let s=a.name||null;s||"oauth"!==a.authType&&"access_token"!==a.authType||(s=a.email||`Account ${l.length+1}`);let t=a.priority;t||(t=l.reduce((a,b)=>Math.max(a,b.priority||0),0)+1);let u={id:(0,d.A)(),provider:a.provider,authType:a.authType||"oauth",name:s,priority:t,isActive:void 0===a.isActive||a.isActive,scope:h,ownerUser:i,createdByUser:x(a.createdByUser||i),visibility:a.visibility||("personal"===h?"private":"system"),createdAt:f,updatedAt:f};for(let b of v)void 0!==a[b]&&null!==a[b]&&(u[b]=a[b]);a.providerSpecificData&&Object.keys(a.providerSpecificData).length>0&&(u.providerSpecificData=a.providerSpecificData),void 0!==a.email&&(u.email=a.email),H(c,u),L(c,a.provider,h,i),b=u}),b}async function N(a,b){let c,d=await (0,e.c)();return d.transaction(()=>{let e=d.get("SELECT * FROM providerConnections WHERE id = ?",[a]);if(!e){c=null;return}let g=G(e),h={...g,...b,updatedAt:new Date().toISOString()},i=new Set(w.filter(a=>Object.prototype.hasOwnProperty.call(b,a)));H(d,h,{storedData:(0,f.q)(e.data,{}),encryptFields:i}),void 0!==b.priority&&L(d,g.provider,h.scope,h.ownerUser),c=h}),c}async function O(a){let b=await (0,e.c)(),c=!1;return b.transaction(()=>{let d=b.get("SELECT provider, scope, ownerUser FROM providerConnections WHERE id = ?",[a]);d&&(b.run("DELETE FROM providerConnections WHERE id = ?",[a]),L(b,d.provider,d.scope,d.ownerUser),c=!0)}),c}async function P(a){let b=await (0,e.c)(),c=b.get("SELECT COUNT(*) AS n FROM providerConnections WHERE provider = ? AND scope = 'system' AND coalesce(visibility, 'system') <> 'private' AND length(trim(coalesce(ownerUser, ''))) = 0",[a]);return b.run("DELETE FROM providerConnections WHERE provider = ? AND scope = 'system' AND coalesce(visibility, 'system') <> 'private' AND length(trim(coalesce(ownerUser, ''))) = 0",[a]),c?.n||0}},49120:(a,b,c)=>{"use strict";c.r(b),c.d(b,{DATA_DIR:()=>m,getDataDir:()=>l});var d=c(73024),e=c.n(d),f=c(33873),g=c.n(f),h=c(21820),i=c.n(h);let j="bluerouter";function k(){return"win32"===process.platform?g().join(process.env.APPDATA||g().join(i().homedir(),"AppData","Roaming"),j):g().join(i().homedir(),`.${j}`)}function l(){let a=process.env.DATA_DIR;if(!a)return k();try{return e().mkdirSync(a,{recursive:!0}),a}catch(b){if(b?.code==="EACCES"||b?.code==="EPERM")return console.warn(`[DATA_DIR] '${a}' not writable → fallback ~/.${j}`),k();throw b}}let m=l()},52549:(a,b,c)=>{"use strict";c.d(b,{E5:()=>L,rg:()=>E,j$:()=>K,Zx:()=>M,BY:()=>H,aX:()=>B,Py:()=>F,sZ:()=>G,_V:()=>m,uw:()=>D});var d=c(94735),e=c(644),f=c(77638);global._pendingRequests||(global._pendingRequests={byModel:{},byAccount:{}}),global._lastErrorProvider||(global._lastErrorProvider={provider:"",ts:0}),global._statsEmitter||(global._statsEmitter=new d.EventEmitter,global._statsEmitter.setMaxListeners(50)),global._pendingTimers||(global._pendingTimers={}),global._usageStatsCache||(global._usageStatsCache=new Map),global._recentRing||(global._recentRing={items:[],initialized:!1}),global._connectionMapCache||(global._connectionMapCache={map:{},ts:0});let g=global._pendingRequests,h=global._usageStatsCache,i=global._lastErrorProvider,j=global._pendingTimers,k=global._recentRing,l=global._connectionMapCache,m=global._statsEmitter;function n(a){return String(a||"").trim()}function o(a){return n(a).toLowerCase()}function p(a,b=0){let c=Number(a);return Number.isFinite(c)?c:b}let q=["openai-compatible-","anthropic-compatible-"];function r(a){if(!0===a||1===a||"1"===a)return!0;if(!1===a||0===a||"0"===a)return!1;if("string"==typeof a){let b=a.trim().toLowerCase();if(["true","yes","on","enabled"].includes(b))return!0;if(["false","no","off","disabled"].includes(b))return!1}return null}function s(a){let b=n(a);return b?b.length<=12?b:`${b.slice(0,8)}...${b.slice(-4)}`:"local-no-key"}function t(a,b){let c=o(a),d=Number(b);return Number.isFinite(d)&&d>=400?c||"error":c||(Number.isFinite(d),"ok")}function u(a){return["pending","running","in_progress","queued","processing"].includes(o(a))}function v(a,b){let c,d=o(a);if(c=o(d),/^(?:error|fail|failed|timeout|network|aborted|abort|rate_limited|provider_error|gateway_error|parse_error|model_error)(?:\b|[\s_-]|$)/.test(c))return!1;let e=Number(b);if(Number.isFinite(e))return e>=200&&e<300;let f=t(a);return!!["ok","success","succeeded","complete","completed","done","200"].includes(f)||/^(?:2\d\d|ok|success|succeeded|complete|completed|done)(?:\b|[\s_-]|$)/.test(f)}function w(a,b,c){if(b&&(a[b]||(a[b]={requests:0,promptTokens:0,completionTokens:0,cost:0}),a[b].requests+=c.requests||1,a[b].promptTokens+=c.promptTokens||0,a[b].completionTokens+=c.completionTokens||0,a[b].cost+=c.cost||0,c.meta)){let d=a[b].lastUsed;Object.assign(a[b],c.meta),d&&c.meta.lastUsed&&new Date(d).getTime()>new Date(c.meta.lastUsed).getTime()&&(a[b].lastUsed=d)}}async function x(){if(Date.now()-l.ts<3e4)return l.map;try{let{getProviderConnections:a}=await Promise.resolve().then(c.bind(c,46709)),b=await a({includePersonal:!0}),d={};for(let a of b)d[a.id]={name:a.displayName||a.name||a.email||a.id,displayName:a.displayName||a.name||"",email:a.email||"",provider:a.provider||"",ownerUser:a.ownerUser||"",isPersonal:"personal"===a.scope||"private"===a.visibility||!!a.ownerUser};l.map=d,l.ts=Date.now()}catch{}return l.map}let y=0;async function z(){if((!k.initialized||!(k.items.length>=50))&&!(Date.now()-y<3e4)){y=Date.now();try{let a=await (0,f.getMysqlRecentUsageLogs)(50);if(!Array.isArray(a)||0===a.length)return;let b=a.reverse().map(a=>{let b=(0,e.q)(a.tokens,{});return{timestamp:a.timestamp,provider:a.provider,model:a.model,connectionId:a.connectionId,apiKey:a.apiKeyFingerprint||a.apiKey,apiKeyOwner:a.apiKeyOwner,accountName:a.accountName,accountEmail:a.accountEmail,accountDisplayName:a.accountDisplayName,ownerUser:a.ownerUser,connectionScope:a.connectionScope,visibility:a.visibility,endpoint:a.endpoint,cost:p(a.cost,0),status:a.status,statusCode:a.statusCode,tokens:{...b,prompt_tokens:p(a.promptTokens,b.prompt_tokens??0),completion_tokens:p(a.completionTokens,b.completion_tokens??0),cached_tokens:p(a.cachedTokens,b.cached_tokens??0),reasoning_tokens:p(a.reasoningTokens,b.reasoning_tokens??0)}}}),c=new Set(k.items.map(a=>`${a.timestamp}|${a.model}|${a.provider}|${a.connectionId||""}`)),d=b.filter(a=>!c.has(`${a.timestamp}|${a.model}|${a.provider}|${a.connectionId||""}`)),g=[...k.items,...d].sort((a,b)=>new Date(b.timestamp)-new Date(a.timestamp)).slice(0,50);k.items=g,k.initialized=!0}catch(a){console.error(`[usageRepo] Failed to backfill recent requests from MySQL: ${a?.message||a||"unknown error"}`)}}}async function A(a,b,d){if(!d||!a||!b)return 0;try{let{getPricingForModel:e}=await Promise.resolve().then(c.bind(c,97914)),f=await e(a,b);if(!f)return 0;return function(a,b){if(!a||!b)return 0;let c=0,d=p(b.prompt_tokens??b.input_tokens,0),e=p(b.display_cached_input_tokens??b.cached_tokens??b.cache_read_input_tokens??b.input_tokens_details?.cached_tokens??b.prompt_tokens_details?.cached_tokens,0),f=p(b.display_cache_creation_input_tokens??b.cache_creation_input_tokens??b.input_tokens_details?.cache_creation_tokens??b.prompt_tokens_details?.cache_creation_tokens,0),g=null!=b.cache_read_input_tokens||null!=b.cache_creation_input_tokens,h=!!(b.input_tokens_details||b.prompt_tokens_details),i=null!=b.prompt_tokens&&null!=b.input_tokens&&Number(b.prompt_tokens)!==Number(b.input_tokens),j=!g||h||i?Math.max(0,d-e-f):d;c+=(null!=b.display_new_input_tokens?p(b.display_new_input_tokens,j):j)*((a.input??0)/1e6),e>0&&(c+=e*((a.cached??a.input??0)/1e6)),f>0&&(c+=f*((a.cache_creation??a.input??0)/1e6)),c+=p(b.completion_tokens??b.output_tokens,0)*((a.output??0)/1e6);let k=p(b.reasoning_tokens,0);return k>0&&(c+=k*((a.reasoning??a.output??0)/1e6)),c}(f,d)}catch(a){return console.error("Error calculating cost:",a),0}}async function B({provider:a=null,model:b=null}={}){let d=await (0,f.getMysqlObservabilityAdapter)();if(!d)return console.error("[usageRepo] MySQL adapter unavailable for recalculateUsageCost"),{groupsUpdated:0,rowsUpdated:0,skippedNoPricing:0};try{let{getPricingForModel:e}=await Promise.resolve().then(c.bind(c,97914)),f=[],g=[];a&&(f.push("provider = ?"),g.push(a)),b&&(f.push("model = ?"),g.push(b));let h=f.length?`WHERE ${f.join(" AND ")}`:"",i=await d.all(`SELECT provider, model, COUNT(*) AS rowCount
|
|
219
219
|
FROM usage_events ${h}
|
|
220
220
|
GROUP BY provider, model`,g),j=0,k=0,l=0;for(let a of i){let b=await e(a.provider,a.model);if(!b){l+=Number(a.rowCount)||0;continue}let c=(b.input??0)/1e6,f=(b.cached??b.input??0)/1e6,g=(b.cache_creation??b.input??0)/1e6,h=(b.output??0)/1e6,i=(b.reasoning??b.output??0)/1e6,m=await d.run(`UPDATE usage_events
|
|
221
221
|
SET cost = (
|
|
@@ -257,14 +257,14 @@ exports.id=402,exports.ids=[402],exports.modules={490:(a,b,c)=>{"use strict";c.d
|
|
|
257
257
|
+ COALESCE(completion_tokens, 0) * ?
|
|
258
258
|
+ COALESCE(reasoning_tokens, 0) * ?
|
|
259
259
|
)
|
|
260
|
-
WHERE provider = ? AND model = ?`,[c,f,g,h,i,a.provider,a.model]),n=Number(m?.affectedRows??m?.changes??0);n>0&&(j+=1,k+=n)}return{groupsUpdated:j,rowsUpdated:k,skippedNoPricing:l}}finally{await d.close?.()}}async function C(a){let b=n(a);if(!b)return{apiKeyId:"",apiKeyFingerprint:"local-no-key",apiKeyName:"Local / kh\xf4ng d\xf9ng API key",apiKeyOwner:""};let d=s(b);try{let{getApiKeyByKey:a}=await Promise.resolve().then(c.bind(c,74452)),e=await a(b);if(e)return{apiKeyId:e.id||"",apiKeyFingerprint:d,apiKeyName:e.name||d,apiKeyOwner:e.ownerUser||e.createdByUser||""}}catch{}return{apiKeyId:"",apiKeyFingerprint:d,apiKeyName:d,apiKeyOwner:""}}function D(a,b,c,d,e=!1){let f=b?`${a} (${b})`:a,h=`${c}|${f}`;g.byModel[f]||(g.byModel[f]=0),g.byModel[f]=Math.max(0,g.byModel[f]+(d?1:-1)),0===g.byModel[f]&&delete g.byModel[f],c&&(g.byAccount[c]||(g.byAccount[c]={}),g.byAccount[c][f]||(g.byAccount[c][f]=0),g.byAccount[c][f]=Math.max(0,g.byAccount[c][f]+(d?1:-1)),0===g.byAccount[c][f]&&(delete g.byAccount[c][f],0===Object.keys(g.byAccount[c]).length&&delete g.byAccount[c])),d?(clearTimeout(j[h]),j[h]=setTimeout(()=>{delete j[h],g.byModel[f]>0&&(g.byModel[f]=0),c&&g.byAccount[c]?.[f]>0&&(g.byAccount[c][f]=0),m.emit("pending")},6e4)):(clearTimeout(j[h]),delete j[h]),!d&&e&&b&&(i.provider=b.toLowerCase(),i.ts=Date.now()),m.emit("pending")}async function E(a={}){let b,c=n(a.apiKeyOwner).toLowerCase(),d=[],h=await x();if(!c){for(let[a,b]of Object.entries(g.byAccount))for(let[c,e]of Object.entries(b))if(e>0){let b=h[a],f=("string"==typeof b?b:b?.name)||`Account ${a.slice(0,8)}...`,g=c.match(/^(.*) \((.*)\)$/);d.push({model:g?g[1]:c,provider:g?g[2]:"unknown",account:f,count:e})}}if(c)try{let a=await (0,f.Kc)(50,{apiKeyOwner:c});b=(Array.isArray(a)?a:[]).map(a=>{let b=(0,e.q)(a.tokens,{});return{timestamp:a.timestamp,provider:a.provider,model:a.model,connectionId:a.connectionId,apiKey:a.apiKeyFingerprint||a.apiKey,apiKeyOwner:a.apiKeyOwner,accountName:a.accountName,accountEmail:a.accountEmail,accountDisplayName:a.accountDisplayName,ownerUser:a.ownerUser,connectionScope:a.connectionScope,visibility:a.visibility,endpoint:a.endpoint,cost:p(a.cost,0),status:a.status,statusCode:a.statusCode,tokens:{...b,prompt_tokens:p(a.promptTokens,b.prompt_tokens??0),completion_tokens:p(a.completionTokens,b.completion_tokens??0),cached_tokens:p(a.cachedTokens,b.cached_tokens??0),reasoning_tokens:p(a.reasoningTokens,b.reasoning_tokens??0)}}})}catch(a){console.error(`[usageRepo] Failed to load owner-scoped recent requests: ${a?.message||a||"unknown error"}`),b=[]}else await z(),b=k.items;return{activeRequests:d,recentRequests:[...b].sort((a,b)=>new Date(b.timestamp)-new Date(a.timestamp)).map(a=>{let b=a.tokens||{},c=h[a.connectionId],d="object"==typeof c?c:null,e=a.accountName||d?.name||("string"==typeof c?c:""),f=a.accountEmail||d?.email||"",g=a.accountDisplayName||d?.displayName||"",i=a.ownerUser||d?.ownerUser||"",j="personal"===a.connectionScope||"private"===a.visibility||!!a.ownerUser||!!d?.isPersonal;return{timestamp:a.timestamp,model:a.model,provider:a.provider||"",connectionId:a.connectionId||"",accountName:e,accountEmail:f,accountDisplayName:g,ownerUser:i,apiKeyOwner:a.apiKeyOwner||i||"",isPersonalOAuth:j,promptTokens:b.prompt_tokens||b.input_tokens||0,cachedTokens:b.cache_read_input_tokens||b.cached_tokens||0,cacheCreationTokens:b.cache_creation_input_tokens||0,completionTokens:b.completion_tokens||b.output_tokens||0,displayTotalInputTokens:b.display_total_input_tokens??b.prompt_tokens??b.input_tokens??0,displayNewInputTokens:b.display_new_input_tokens??Math.max(0,(b.display_total_input_tokens??b.prompt_tokens??b.input_tokens??0)-(b.display_cached_input_tokens??b.cache_read_input_tokens??b.cached_tokens??0)-(b.display_cache_creation_input_tokens??b.cache_creation_input_tokens??0)),displayCachedInputTokens:b.display_cached_input_tokens??b.cache_read_input_tokens??b.cached_tokens??0,displayCacheCreationInputTokens:b.display_cache_creation_input_tokens??b.cache_creation_input_tokens??0,displayReasoningTokens:b.display_reasoning_tokens??b.reasoning_tokens??0,displayOutputTokens:b.display_output_tokens??b.completion_tokens??b.output_tokens??0,sourceTool:a.sourceTool||"",sourceToolLabel:a.sourceToolLabel||"",status:a.status||"ok"}}).slice(0,20),pending:c?{byModel:{},byAccount:{}}:{byModel:{...g.byModel},byAccount:Object.fromEntries(Object.entries(g.byAccount).map(([a,b])=>[a,{...b}]))},errorProvider:c?"":Date.now()-i.ts<1e4?i.provider:""}}async function F(a={}){try{if(u(a?.status))return null;let b=await C(a.apiKey),c=function(a={},b={}){var c;let d,e=a.timestamp||new Date().toISOString(),f=a.tokens&&"object"==typeof a.tokens?a.tokens:{},g=p(a.promptTokens,f.prompt_tokens??f.input_tokens??0),h=p(a.completionTokens,f.completion_tokens??f.output_tokens??0),i=p(a.cachedTokens,f.cached_tokens??f.cache_read_input_tokens??f.input_tokens_details?.cached_tokens??f.prompt_tokens_details?.cached_tokens??0),j=p(a.cacheCreationTokens,f.display_cache_creation_input_tokens??f.cache_creation_input_tokens??f.input_tokens_details?.cache_creation_tokens??f.prompt_tokens_details?.cache_creation_tokens??0),k=p(a.reasoningTokens,f.reasoning_tokens??f.completion_tokens_details?.reasoning_tokens??0),l=p(a.totalTokens,g+h),m=p(a.displayTotalInputTokens,f.display_total_input_tokens??g),o=p(a.displayNewInputTokens,f.display_new_input_tokens??Math.max(0,m-i-j)),q=p(a.displayCachedInputTokens,f.display_cached_input_tokens??i),u=p(a.displayCacheCreationInputTokens,f.display_cache_creation_input_tokens??j),v=p(a.displayReasoningTokens,f.display_reasoning_tokens??k),w=p(a.displayOutputTokens,f.display_output_tokens??h),x=null==a.statusCode?null:p(a.statusCode,null),y=t(a.status,x),z=n(a.clientIp||a.sourceIp),A=(d=n(a.clientIpNormalized||z))?d.split(",")[0].trim().replace(/^::ffff:/,""):"",B=a.meta&&"object"==typeof a.meta?a.meta:{},C=a.requestPolicyMeta&&"object"==typeof a.requestPolicyMeta?a.requestPolicyMeta:B.requestPolicyMeta&&"object"==typeof B.requestPolicyMeta?B.requestPolicyMeta:{},D=a.routingMeta&&"object"==typeof a.routingMeta?a.routingMeta:B.routingMeta&&"object"==typeof B.routingMeta?B.routingMeta:B,E=r(a.thinkingEnabled??C.thinkingEnabled),F=!0===r(a.thinkingAutoOff??C.thinkingAutoOff),G=p(a.promptChars??C.promptChars,0),H=p(a.forceThinkingOffAboveChars??C.forceThinkingOffAboveChars,0),I=n(a.thinkingAutoOffReason||C.thinkingAutoOffReason);return{timestamp:e,provider:n(a.provider)||"unknown",model:n(a.model)||"unknown",connectionId:n(a.connectionId),accountName:n(a.accountName||a.connectionName||B.accountName||B.connectionName),accountEmail:n(a.accountEmail||a.account_email||B.accountEmail||B.account_email),accountDisplayName:n(a.accountDisplayName||a.account_display_name||B.accountDisplayName||B.account_display_name),ownerUser:n(a.ownerUser||a.owner_user||B.ownerUser||B.owner_user),connectionScope:n(a.connectionScope||a.connection_scope||B.connectionScope||B.connection_scope),visibility:n(a.visibility||B.visibility),apiKey:b.apiKeyFingerprint||s(a.apiKey),apiKeyId:b.apiKeyId||n(a.apiKeyId),apiKeyFingerprint:b.apiKeyFingerprint||n(a.apiKeyFingerprint)||s(a.apiKey),apiKeyName:b.apiKeyName||n(a.apiKeyName),apiKeyOwner:b.apiKeyOwner||n(a.apiKeyOwner),endpoint:"string"==typeof(c=n(a.endpoint))&&c?c.replace(/^\/api\/v1\/v1(\/|$)/,"/api/v1$1").replace(/^\/v1\/v1(\/|$)/,"/v1$1").replace(/^\/v1beta\/v1beta(\/|$)/,"/v1beta$1"):c,requestId:n(a.requestId||B.requestId),sessionId:n(a.sessionId||B.sessionId),clientIp:z,clientIpNormalized:A,clientHost:n(a.clientHost||B.clientHost),clientUserAgent:n(a.clientUserAgent||B.clientUserAgent),sourceTool:n(a.sourceTool||B.sourceTool),sourceToolLabel:n(a.sourceToolLabel||B.sourceToolLabel),sourceHost:n(a.sourceHost||B.sourceHost),latencyMs:p(a.latencyMs??B.latencyMs,0),ttftMs:p(a.ttftMs??B.ttftMs,0),statusCode:x,errorCode:n(a.errorCode||B.errorCode),errorType:n(a.errorType||B.errorType),errorMessageShort:function(a,b=500){let c=n(a).replace(/\s+/g," ");return c.length>b?`${c.slice(0,b-1)}…`:c}(a.errorMessageShort||a.errorMessage||B.errorMessageShort||B.errorMessage),isStreaming:+!!a.isStreaming,isCombo:a.isCombo?1:+("combo"===n(a.routeType||a.route_type||D.routeType||D.route_type)),comboName:n(a.comboName||a.combo_name||D.comboName||D.combo_name||B.comboName||B.combo_name),promptTokens:g,completionTokens:h,totalTokens:l,cachedTokens:i,cacheCreationTokens:j,reasoningTokens:k,displayTotalInputTokens:m,displayNewInputTokens:o,displayCachedInputTokens:q,displayCacheCreationInputTokens:u,displayReasoningTokens:v,displayOutputTokens:w,thinkingEnabled:E,thinkingAutoOff:F,thinkingAutoOffReason:I,promptChars:G,forceThinkingOffAboveChars:H,cost:p(a.cost,0),status:y,tokens:{prompt_tokens:g,completion_tokens:h,cached_tokens:i,cache_read_input_tokens:i,cache_creation_input_tokens:j,reasoning_tokens:k,display_total_input_tokens:m,display_new_input_tokens:o,display_cached_input_tokens:q,display_cache_creation_input_tokens:u,display_reasoning_tokens:v,display_output_tokens:w},meta:{...B,accountName:n(a.accountName||a.connectionName||B.accountName||B.connectionName),accountEmail:n(a.accountEmail||a.account_email||B.accountEmail||B.account_email),accountDisplayName:n(a.accountDisplayName||a.account_display_name||B.accountDisplayName||B.account_display_name),ownerUser:n(a.ownerUser||a.owner_user||B.ownerUser||B.owner_user),connectionScope:n(a.connectionScope||a.connection_scope||B.connectionScope||B.connection_scope),visibility:n(a.visibility||B.visibility),apiKeyFingerprint:b.apiKeyFingerprint||n(a.apiKeyFingerprint)||s(a.apiKey),apiKeyId:b.apiKeyId||n(a.apiKeyId),routingMeta:{...D||{},combo_name:n(a.combo_name||D.combo_name||D.comboName),combo_target:n(a.combo_target||D.combo_target||D.comboTarget),combo_strategy:n(a.combo_strategy||D.combo_strategy||D.comboStrategy),route_type:n(a.route_type||D.route_type||D.routeType),selected_provider_id:n(a.selected_provider_id||D.selected_provider_id||D.selectedProviderId),selected_model:n(a.selected_model||D.selected_model||D.selectedModel),request_overrides_applied:a.request_overrides_applied??D.request_overrides_applied??D.requestOverridesApplied??!1,auto_off_applied:a.auto_off_applied??D.auto_off_applied??D.autoOffApplied??!1},requestPolicyMeta:{...C||{},thinkingEnabled:E,thinkingAutoOff:F,thinkingAutoOffReason:I,promptChars:G,forceThinkingOffAboveChars:H}}}}(a,b);if(c.cost||(c.cost=await A(c.provider,c.model,c.tokens)),!await (0,f.zW)(c).catch(a=>(console.error(`[usageRepo] Failed to write MySQL usage_events: ${a?.message||a||"unknown error"}`),!1)))return console.error("[usageRepo] MySQL usage_events write returned false",{requestId:c.requestId,provider:c.provider,model:c.model,status:c.status}),null;return k.items.push(c),k.items.length>50&&(k.items=k.items.slice(-50)),h.clear(),m.emit("update"),c}catch(a){return console.error("Failed to save request lifecycle:",a),null}}async function G(a){let b=t(a?.status,a?.statusCode);if(u(b))return null;let c=a?.tokens||{},d=c.prompt_tokens??c.input_tokens??a?.promptTokens??0,e=c.completion_tokens??c.output_tokens??a?.completionTokens??0;return(n(a?.status)||a?.statusCode!==void 0&&a?.statusCode!==null)&&!v(b,a?.statusCode)||0!==d||0!==e?F({...a,status:a?.status||"ok"}):null}async function H(a="all",b={}){let c=n(b.apiKeyOwner).toLowerCase(),d=await E({apiKeyOwner:c});return{...await I(a,{apiKeyOwner:c}),...d}}async function I(a,{apiKeyOwner:b=""}={}){let c=b?`${a}owner:${b}`:a,d=h.get(c);if(d){if(d.promise)return d.promise;if(Date.now()-d.ts<12e3)return d.data}let e=J(a,{apiKeyOwner:b}).then(a=>(h.set(c,{data:a,ts:Date.now()}),a)).catch(a=>{throw h.delete(c),a});return h.set(c,{promise:e}),e}async function J(a,{apiKeyOwner:b=""}={}){let c={totalRequests:0,totalPromptTokens:0,totalCompletionTokens:0,totalCost:0,totalCachedInputTokens:0,totalCacheCreationInputTokens:0,totalNewInputTokens:0,cloudVsLocal:{cloud:{requests:0,promptTokens:0,completionTokens:0,cachedInputTokens:0,cost:0},local:{requests:0,promptTokens:0,completionTokens:0,cachedInputTokens:0,cost:0}},byProvider:{},byModel:{},byAccount:{},byApiKey:{},byEndpoint:{},last10Minutes:[]},d=await (0,f.d9)();if(!d)return console.error("[usageRepo] MySQL usage_events adapter unavailable for getUsageStats"),c;try{let e="today"===a?new Date().setHours(0,0,0,0):"24h"===a?Date.now()-864e5:null,f=[],g=[];e&&(f.push("timestamp >= ?"),g.push(new Date(e).toISOString())),b&&(f.push("apiKeyOwner = ?"),g.push(b));let h=f.length?`WHERE ${f.join(" AND ")}`:"",i=await x();for(let a of(await d.all(`SELECT provider, model, connectionId, apiKeyFingerprint, endpoint, COUNT(*) AS requests,
|
|
260
|
+
WHERE provider = ? AND model = ?`,[c,f,g,h,i,a.provider,a.model]),n=Number(m?.affectedRows??m?.changes??0);n>0&&(j+=1,k+=n)}return{groupsUpdated:j,rowsUpdated:k,skippedNoPricing:l}}finally{await d.close?.()}}async function C(a){let b=n(a);if(!b)return{apiKeyId:"",apiKeyFingerprint:"local-no-key",apiKeyName:"Local / kh\xf4ng d\xf9ng API key",apiKeyOwner:""};let d=s(b);try{let{getApiKeyByKey:a}=await Promise.resolve().then(c.bind(c,74452)),e=await a(b);if(e)return{apiKeyId:e.id||"",apiKeyFingerprint:d,apiKeyName:e.name||d,apiKeyOwner:e.ownerUser||e.createdByUser||""}}catch{}return{apiKeyId:"",apiKeyFingerprint:d,apiKeyName:d,apiKeyOwner:""}}function D(a,b,c,d,e=!1){let f=b?`${a} (${b})`:a,h=`${c}|${f}`;g.byModel[f]||(g.byModel[f]=0),g.byModel[f]=Math.max(0,g.byModel[f]+(d?1:-1)),0===g.byModel[f]&&delete g.byModel[f],c&&(g.byAccount[c]||(g.byAccount[c]={}),g.byAccount[c][f]||(g.byAccount[c][f]=0),g.byAccount[c][f]=Math.max(0,g.byAccount[c][f]+(d?1:-1)),0===g.byAccount[c][f]&&(delete g.byAccount[c][f],0===Object.keys(g.byAccount[c]).length&&delete g.byAccount[c])),d?(clearTimeout(j[h]),j[h]=setTimeout(()=>{delete j[h],g.byModel[f]>0&&(g.byModel[f]=0),c&&g.byAccount[c]?.[f]>0&&(g.byAccount[c][f]=0),m.emit("pending")},6e4)):(clearTimeout(j[h]),delete j[h]),!d&&e&&b&&(i.provider=b.toLowerCase(),i.ts=Date.now()),m.emit("pending")}async function E(a={}){let b,c=n(a.apiKeyOwner).toLowerCase(),d=[],h=await x();if(!c){for(let[a,b]of Object.entries(g.byAccount))for(let[c,e]of Object.entries(b))if(e>0){let b=h[a],f=("string"==typeof b?b:b?.name)||`Account ${a.slice(0,8)}...`,g=c.match(/^(.*) \((.*)\)$/);d.push({model:g?g[1]:c,provider:g?g[2]:"unknown",account:f,count:e})}}if(c)try{let a=await (0,f.getMysqlRecentUsageLogs)(50,{apiKeyOwner:c});b=(Array.isArray(a)?a:[]).map(a=>{let b=(0,e.q)(a.tokens,{});return{timestamp:a.timestamp,provider:a.provider,model:a.model,connectionId:a.connectionId,apiKey:a.apiKeyFingerprint||a.apiKey,apiKeyOwner:a.apiKeyOwner,accountName:a.accountName,accountEmail:a.accountEmail,accountDisplayName:a.accountDisplayName,ownerUser:a.ownerUser,connectionScope:a.connectionScope,visibility:a.visibility,endpoint:a.endpoint,cost:p(a.cost,0),status:a.status,statusCode:a.statusCode,tokens:{...b,prompt_tokens:p(a.promptTokens,b.prompt_tokens??0),completion_tokens:p(a.completionTokens,b.completion_tokens??0),cached_tokens:p(a.cachedTokens,b.cached_tokens??0),reasoning_tokens:p(a.reasoningTokens,b.reasoning_tokens??0)}}})}catch(a){console.error(`[usageRepo] Failed to load owner-scoped recent requests: ${a?.message||a||"unknown error"}`),b=[]}else await z(),b=k.items;return{activeRequests:d,recentRequests:[...b].sort((a,b)=>new Date(b.timestamp)-new Date(a.timestamp)).map(a=>{let b=a.tokens||{},c=h[a.connectionId],d="object"==typeof c?c:null,e=a.accountName||d?.name||("string"==typeof c?c:""),f=a.accountEmail||d?.email||"",g=a.accountDisplayName||d?.displayName||"",i=a.ownerUser||d?.ownerUser||"",j="personal"===a.connectionScope||"private"===a.visibility||!!a.ownerUser||!!d?.isPersonal;return{timestamp:a.timestamp,model:a.model,provider:a.provider||"",connectionId:a.connectionId||"",accountName:e,accountEmail:f,accountDisplayName:g,ownerUser:i,apiKeyOwner:a.apiKeyOwner||i||"",isPersonalOAuth:j,promptTokens:b.prompt_tokens||b.input_tokens||0,cachedTokens:b.cache_read_input_tokens||b.cached_tokens||0,cacheCreationTokens:b.cache_creation_input_tokens||0,completionTokens:b.completion_tokens||b.output_tokens||0,displayTotalInputTokens:b.display_total_input_tokens??b.prompt_tokens??b.input_tokens??0,displayNewInputTokens:b.display_new_input_tokens??Math.max(0,(b.display_total_input_tokens??b.prompt_tokens??b.input_tokens??0)-(b.display_cached_input_tokens??b.cache_read_input_tokens??b.cached_tokens??0)-(b.display_cache_creation_input_tokens??b.cache_creation_input_tokens??0)),displayCachedInputTokens:b.display_cached_input_tokens??b.cache_read_input_tokens??b.cached_tokens??0,displayCacheCreationInputTokens:b.display_cache_creation_input_tokens??b.cache_creation_input_tokens??0,displayReasoningTokens:b.display_reasoning_tokens??b.reasoning_tokens??0,displayOutputTokens:b.display_output_tokens??b.completion_tokens??b.output_tokens??0,sourceTool:a.sourceTool||"",sourceToolLabel:a.sourceToolLabel||"",status:a.status||"ok"}}).slice(0,20),pending:c?{byModel:{},byAccount:{}}:{byModel:{...g.byModel},byAccount:Object.fromEntries(Object.entries(g.byAccount).map(([a,b])=>[a,{...b}]))},errorProvider:c?"":Date.now()-i.ts<1e4?i.provider:""}}async function F(a={}){try{if(u(a?.status))return null;let b=await C(a.apiKey),c=function(a={},b={}){var c;let d,e=a.timestamp||new Date().toISOString(),f=a.tokens&&"object"==typeof a.tokens?a.tokens:{},g=p(a.promptTokens,f.prompt_tokens??f.input_tokens??0),h=p(a.completionTokens,f.completion_tokens??f.output_tokens??0),i=p(a.cachedTokens,f.cached_tokens??f.cache_read_input_tokens??f.input_tokens_details?.cached_tokens??f.prompt_tokens_details?.cached_tokens??0),j=p(a.cacheCreationTokens,f.display_cache_creation_input_tokens??f.cache_creation_input_tokens??f.input_tokens_details?.cache_creation_tokens??f.prompt_tokens_details?.cache_creation_tokens??0),k=p(a.reasoningTokens,f.reasoning_tokens??f.completion_tokens_details?.reasoning_tokens??0),l=p(a.totalTokens,g+h),m=p(a.displayTotalInputTokens,f.display_total_input_tokens??g),o=p(a.displayNewInputTokens,f.display_new_input_tokens??Math.max(0,m-i-j)),q=p(a.displayCachedInputTokens,f.display_cached_input_tokens??i),u=p(a.displayCacheCreationInputTokens,f.display_cache_creation_input_tokens??j),v=p(a.displayReasoningTokens,f.display_reasoning_tokens??k),w=p(a.displayOutputTokens,f.display_output_tokens??h),x=null==a.statusCode?null:p(a.statusCode,null),y=t(a.status,x),z=n(a.clientIp||a.sourceIp),A=(d=n(a.clientIpNormalized||z))?d.split(",")[0].trim().replace(/^::ffff:/,""):"",B=a.meta&&"object"==typeof a.meta?a.meta:{},C=a.requestPolicyMeta&&"object"==typeof a.requestPolicyMeta?a.requestPolicyMeta:B.requestPolicyMeta&&"object"==typeof B.requestPolicyMeta?B.requestPolicyMeta:{},D=a.routingMeta&&"object"==typeof a.routingMeta?a.routingMeta:B.routingMeta&&"object"==typeof B.routingMeta?B.routingMeta:B,E=r(a.thinkingEnabled??C.thinkingEnabled),F=!0===r(a.thinkingAutoOff??C.thinkingAutoOff),G=p(a.promptChars??C.promptChars,0),H=p(a.forceThinkingOffAboveChars??C.forceThinkingOffAboveChars,0),I=n(a.thinkingAutoOffReason||C.thinkingAutoOffReason);return{timestamp:e,provider:n(a.provider)||"unknown",model:n(a.model)||"unknown",connectionId:n(a.connectionId),accountName:n(a.accountName||a.connectionName||B.accountName||B.connectionName),accountEmail:n(a.accountEmail||a.account_email||B.accountEmail||B.account_email),accountDisplayName:n(a.accountDisplayName||a.account_display_name||B.accountDisplayName||B.account_display_name),ownerUser:n(a.ownerUser||a.owner_user||B.ownerUser||B.owner_user),connectionScope:n(a.connectionScope||a.connection_scope||B.connectionScope||B.connection_scope),visibility:n(a.visibility||B.visibility),apiKey:b.apiKeyFingerprint||s(a.apiKey),apiKeyId:b.apiKeyId||n(a.apiKeyId),apiKeyFingerprint:b.apiKeyFingerprint||n(a.apiKeyFingerprint)||s(a.apiKey),apiKeyName:b.apiKeyName||n(a.apiKeyName),apiKeyOwner:b.apiKeyOwner||n(a.apiKeyOwner),endpoint:"string"==typeof(c=n(a.endpoint))&&c?c.replace(/^\/api\/v1\/v1(\/|$)/,"/api/v1$1").replace(/^\/v1\/v1(\/|$)/,"/v1$1").replace(/^\/v1beta\/v1beta(\/|$)/,"/v1beta$1"):c,requestId:n(a.requestId||B.requestId),sessionId:n(a.sessionId||B.sessionId),clientIp:z,clientIpNormalized:A,clientHost:n(a.clientHost||B.clientHost),clientUserAgent:n(a.clientUserAgent||B.clientUserAgent),sourceTool:n(a.sourceTool||B.sourceTool),sourceToolLabel:n(a.sourceToolLabel||B.sourceToolLabel),sourceHost:n(a.sourceHost||B.sourceHost),latencyMs:p(a.latencyMs??B.latencyMs,0),ttftMs:p(a.ttftMs??B.ttftMs,0),statusCode:x,errorCode:n(a.errorCode||B.errorCode),errorType:n(a.errorType||B.errorType),errorMessageShort:function(a,b=500){let c=n(a).replace(/\s+/g," ");return c.length>b?`${c.slice(0,b-1)}…`:c}(a.errorMessageShort||a.errorMessage||B.errorMessageShort||B.errorMessage),isStreaming:+!!a.isStreaming,isCombo:a.isCombo?1:+("combo"===n(a.routeType||a.route_type||D.routeType||D.route_type)),comboName:n(a.comboName||a.combo_name||D.comboName||D.combo_name||B.comboName||B.combo_name),promptTokens:g,completionTokens:h,totalTokens:l,cachedTokens:i,cacheCreationTokens:j,reasoningTokens:k,displayTotalInputTokens:m,displayNewInputTokens:o,displayCachedInputTokens:q,displayCacheCreationInputTokens:u,displayReasoningTokens:v,displayOutputTokens:w,thinkingEnabled:E,thinkingAutoOff:F,thinkingAutoOffReason:I,promptChars:G,forceThinkingOffAboveChars:H,cost:p(a.cost,0),status:y,tokens:{prompt_tokens:g,completion_tokens:h,cached_tokens:i,cache_read_input_tokens:i,cache_creation_input_tokens:j,reasoning_tokens:k,display_total_input_tokens:m,display_new_input_tokens:o,display_cached_input_tokens:q,display_cache_creation_input_tokens:u,display_reasoning_tokens:v,display_output_tokens:w},meta:{...B,accountName:n(a.accountName||a.connectionName||B.accountName||B.connectionName),accountEmail:n(a.accountEmail||a.account_email||B.accountEmail||B.account_email),accountDisplayName:n(a.accountDisplayName||a.account_display_name||B.accountDisplayName||B.account_display_name),ownerUser:n(a.ownerUser||a.owner_user||B.ownerUser||B.owner_user),connectionScope:n(a.connectionScope||a.connection_scope||B.connectionScope||B.connection_scope),visibility:n(a.visibility||B.visibility),apiKeyFingerprint:b.apiKeyFingerprint||n(a.apiKeyFingerprint)||s(a.apiKey),apiKeyId:b.apiKeyId||n(a.apiKeyId),routingMeta:{...D||{},combo_name:n(a.combo_name||D.combo_name||D.comboName),combo_target:n(a.combo_target||D.combo_target||D.comboTarget),combo_strategy:n(a.combo_strategy||D.combo_strategy||D.comboStrategy),route_type:n(a.route_type||D.route_type||D.routeType),selected_provider_id:n(a.selected_provider_id||D.selected_provider_id||D.selectedProviderId),selected_model:n(a.selected_model||D.selected_model||D.selectedModel),request_overrides_applied:a.request_overrides_applied??D.request_overrides_applied??D.requestOverridesApplied??!1,auto_off_applied:a.auto_off_applied??D.auto_off_applied??D.autoOffApplied??!1},requestPolicyMeta:{...C||{},thinkingEnabled:E,thinkingAutoOff:F,thinkingAutoOffReason:I,promptChars:G,forceThinkingOffAboveChars:H}}}}(a,b);if(c.cost||(c.cost=await A(c.provider,c.model,c.tokens)),!await (0,f.saveMysqlUsageEvent)(c).catch(a=>(console.error(`[usageRepo] Failed to write MySQL usage_events: ${a?.message||a||"unknown error"}`),!1)))return console.error("[usageRepo] MySQL usage_events write returned false",{requestId:c.requestId,provider:c.provider,model:c.model,status:c.status}),null;return k.items.push(c),k.items.length>50&&(k.items=k.items.slice(-50)),h.clear(),m.emit("update"),c}catch(a){return console.error("Failed to save request lifecycle:",a),null}}async function G(a){let b=t(a?.status,a?.statusCode);if(u(b))return null;let c=a?.tokens||{},d=c.prompt_tokens??c.input_tokens??a?.promptTokens??0,e=c.completion_tokens??c.output_tokens??a?.completionTokens??0;return(n(a?.status)||a?.statusCode!==void 0&&a?.statusCode!==null)&&!v(b,a?.statusCode)||0!==d||0!==e?F({...a,status:a?.status||"ok"}):null}async function H(a="all",b={}){let c=n(b.apiKeyOwner).toLowerCase(),d=await E({apiKeyOwner:c});return{...await I(a,{apiKeyOwner:c}),...d}}async function I(a,{apiKeyOwner:b=""}={}){let c=b?`${a}owner:${b}`:a,d=h.get(c);if(d){if(d.promise)return d.promise;if(Date.now()-d.ts<12e3)return d.data}let e=J(a,{apiKeyOwner:b}).then(a=>(h.set(c,{data:a,ts:Date.now()}),a)).catch(a=>{throw h.delete(c),a});return h.set(c,{promise:e}),e}async function J(a,{apiKeyOwner:b=""}={}){let c={totalRequests:0,totalPromptTokens:0,totalCompletionTokens:0,totalCost:0,totalCachedInputTokens:0,totalCacheCreationInputTokens:0,totalNewInputTokens:0,cloudVsLocal:{cloud:{requests:0,promptTokens:0,completionTokens:0,cachedInputTokens:0,cost:0},local:{requests:0,promptTokens:0,completionTokens:0,cachedInputTokens:0,cost:0}},byProvider:{},byModel:{},byAccount:{},byApiKey:{},byEndpoint:{},last10Minutes:[]},d=await (0,f.getMysqlObservabilityAdapter)();if(!d)return console.error("[usageRepo] MySQL usage_events adapter unavailable for getUsageStats"),c;try{let e="today"===a?new Date().setHours(0,0,0,0):"24h"===a?Date.now()-864e5:null,f=[],g=[];e&&(f.push("timestamp >= ?"),g.push(new Date(e).toISOString())),b&&(f.push("apiKeyOwner = ?"),g.push(b));let h=f.length?`WHERE ${f.join(" AND ")}`:"",i=await x();for(let a of(await d.all(`SELECT provider, model, connectionId, apiKeyFingerprint, endpoint, COUNT(*) AS requests,
|
|
261
261
|
SUM(displayTotalInputTokens) AS promptTokens, SUM(completionTokens) AS completionTokens,
|
|
262
262
|
SUM(displayCachedInputTokens) AS cachedInputTokens,
|
|
263
263
|
SUM(displayCacheCreationInputTokens) AS cacheCreationInputTokens,
|
|
264
264
|
SUM(displayNewInputTokens) AS newInputTokens,
|
|
265
265
|
SUM(cost) AS cost, MAX(timestamp) AS lastUsed
|
|
266
266
|
FROM usageHistory ${h}
|
|
267
|
-
GROUP BY provider, model, connectionId, apiKeyFingerprint, endpoint`,g))){let b=p(a.requests,0),d=p(a.promptTokens,0),e=p(a.completionTokens,0),f=p(a.cost,0),g=p(a.cachedInputTokens,0),h=p(a.cacheCreationInputTokens,0),j=p(a.newInputTokens,0);c.totalRequests+=b,c.totalPromptTokens+=d,c.totalCompletionTokens+=e,c.totalCost+=f,c.totalCachedInputTokens+=g,c.totalCacheCreationInputTokens+=h,c.totalNewInputTokens+=j;let k=!function(a){if("string"!=typeof a)return!1;let b=a.trim().toLowerCase();return q.some(a=>b.startsWith(a))}(a.provider)?c.cloudVsLocal.cloud:c.cloudVsLocal.local;if(k.requests+=b,k.promptTokens+=d,k.completionTokens+=e,k.cachedInputTokens+=g,k.cost+=f,w(c.byProvider,a.provider||"unknown",{requests:b,promptTokens:d,completionTokens:e,cost:f}),w(c.byModel,`${a.model||"unknown"} (${a.provider||"unknown"})`,{requests:b,promptTokens:d,completionTokens:e,cost:f,meta:{rawModel:a.model,provider:a.provider,lastUsed:a.lastUsed}}),a.connectionId){let g=i[a.connectionId],h=("string"==typeof g?g:g?.name)||`Account ${String(a.connectionId).slice(0,8)}...`,j=`${a.connectionId}\u001f${a.provider||"unknown"}\u001f${a.model||"unknown"}`;w(c.byAccount,j,{requests:b,promptTokens:d,completionTokens:e,cost:f,meta:{connectionId:a.connectionId,accountName:h,rawModel:a.model||"unknown",provider:a.provider||"unknown",ownerUser:"object"==typeof g&&g?.ownerUser||"",isPersonalOAuth:"object"==typeof g&&g?.isPersonal===!0,lastUsed:a.lastUsed}})}w(c.byApiKey,a.apiKeyFingerprint||"local-no-key",{requests:b,promptTokens:d,completionTokens:e,cost:f,meta:{apiKey:a.apiKeyFingerprint||"local-no-key",lastUsed:a.lastUsed}}),w(c.byEndpoint,a.endpoint||"Unknown",{requests:b,promptTokens:d,completionTokens:e,cost:f,meta:{endpoint:a.endpoint||"Unknown",lastUsed:a.lastUsed}})}let j=new Date,k=new Date(6e4*Math.floor(j.getTime()/6e4)),l=new Date(k.getTime()-54e4),m={};for(let a=0;a<10;a++){let b=k.getTime()-(9-a)*6e4;m[b]={requests:0,promptTokens:0,completionTokens:0,cost:0},c.last10Minutes.push(m[b])}let n=["timestamp >= ?","timestamp <= ?"],o=[l.toISOString(),j.toISOString()];for(let a of(b&&(n.push("apiKeyOwner = ?"),o.push(b)),await d.all(`SELECT timestamp, displayTotalInputTokens AS promptTokens, completionTokens, cost FROM usageHistory WHERE ${n.join(" AND ")}`,o))){let b=6e4*Math.floor(new Date(a.timestamp).getTime()/6e4);m[b]&&(m[b].requests++,m[b].promptTokens+=p(a.promptTokens,0),m[b].completionTokens+=p(a.completionTokens,0),m[b].cost+=p(a.cost,0))}return c}finally{await d.close?.()}}async function K(a="7d",b={}){let c=n(b.apiKeyOwner).toLowerCase(),d=Date.now(),e="today"===a||"24h"===a?24:"7d"===a?7:"30d"===a?30:60,g="today"===a||"24h"===a?36e5:864e5,h="today"===a?new Date(new Date().setHours(0,0,0,0)).getTime():d-e*g,i=Array.from({length:e},(a,b)=>{let c=h+b*g;return{label:36e5===g?new Date(c).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit",hour12:!1}):new Date(c).toLocaleDateString("en-US",{month:"short",day:"numeric"}),tokens:0,cost:0}}),j=await (0,f.
|
|
267
|
+
GROUP BY provider, model, connectionId, apiKeyFingerprint, endpoint`,g))){let b=p(a.requests,0),d=p(a.promptTokens,0),e=p(a.completionTokens,0),f=p(a.cost,0),g=p(a.cachedInputTokens,0),h=p(a.cacheCreationInputTokens,0),j=p(a.newInputTokens,0);c.totalRequests+=b,c.totalPromptTokens+=d,c.totalCompletionTokens+=e,c.totalCost+=f,c.totalCachedInputTokens+=g,c.totalCacheCreationInputTokens+=h,c.totalNewInputTokens+=j;let k=!function(a){if("string"!=typeof a)return!1;let b=a.trim().toLowerCase();return q.some(a=>b.startsWith(a))}(a.provider)?c.cloudVsLocal.cloud:c.cloudVsLocal.local;if(k.requests+=b,k.promptTokens+=d,k.completionTokens+=e,k.cachedInputTokens+=g,k.cost+=f,w(c.byProvider,a.provider||"unknown",{requests:b,promptTokens:d,completionTokens:e,cost:f}),w(c.byModel,`${a.model||"unknown"} (${a.provider||"unknown"})`,{requests:b,promptTokens:d,completionTokens:e,cost:f,meta:{rawModel:a.model,provider:a.provider,lastUsed:a.lastUsed}}),a.connectionId){let g=i[a.connectionId],h=("string"==typeof g?g:g?.name)||`Account ${String(a.connectionId).slice(0,8)}...`,j=`${a.connectionId}\u001f${a.provider||"unknown"}\u001f${a.model||"unknown"}`;w(c.byAccount,j,{requests:b,promptTokens:d,completionTokens:e,cost:f,meta:{connectionId:a.connectionId,accountName:h,rawModel:a.model||"unknown",provider:a.provider||"unknown",ownerUser:"object"==typeof g&&g?.ownerUser||"",isPersonalOAuth:"object"==typeof g&&g?.isPersonal===!0,lastUsed:a.lastUsed}})}w(c.byApiKey,a.apiKeyFingerprint||"local-no-key",{requests:b,promptTokens:d,completionTokens:e,cost:f,meta:{apiKey:a.apiKeyFingerprint||"local-no-key",lastUsed:a.lastUsed}}),w(c.byEndpoint,a.endpoint||"Unknown",{requests:b,promptTokens:d,completionTokens:e,cost:f,meta:{endpoint:a.endpoint||"Unknown",lastUsed:a.lastUsed}})}let j=new Date,k=new Date(6e4*Math.floor(j.getTime()/6e4)),l=new Date(k.getTime()-54e4),m={};for(let a=0;a<10;a++){let b=k.getTime()-(9-a)*6e4;m[b]={requests:0,promptTokens:0,completionTokens:0,cost:0},c.last10Minutes.push(m[b])}let n=["timestamp >= ?","timestamp <= ?"],o=[l.toISOString(),j.toISOString()];for(let a of(b&&(n.push("apiKeyOwner = ?"),o.push(b)),await d.all(`SELECT timestamp, displayTotalInputTokens AS promptTokens, completionTokens, cost FROM usageHistory WHERE ${n.join(" AND ")}`,o))){let b=6e4*Math.floor(new Date(a.timestamp).getTime()/6e4);m[b]&&(m[b].requests++,m[b].promptTokens+=p(a.promptTokens,0),m[b].completionTokens+=p(a.completionTokens,0),m[b].cost+=p(a.cost,0))}return c}finally{await d.close?.()}}async function K(a="7d",b={}){let c=n(b.apiKeyOwner).toLowerCase(),d=Date.now(),e="today"===a||"24h"===a?24:"7d"===a?7:"30d"===a?30:60,g="today"===a||"24h"===a?36e5:864e5,h="today"===a?new Date(new Date().setHours(0,0,0,0)).getTime():d-e*g,i=Array.from({length:e},(a,b)=>{let c=h+b*g;return{label:36e5===g?new Date(c).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit",hour12:!1}):new Date(c).toLocaleDateString("en-US",{month:"short",day:"numeric"}),tokens:0,cost:0}}),j=await (0,f.getMysqlObservabilityAdapter)();if(!j)return console.error("[usageRepo] MySQL usage_events adapter unavailable for getChartData"),i;try{let a=["timestamp >= ?"],b=[new Date(h).toISOString()];for(let d of(c&&(a.push("apiKeyOwner = ?"),b.push(c)),await j.all(`SELECT timestamp, displayTotalInputTokens AS promptTokens, completionTokens, cost FROM usageHistory WHERE ${a.join(" AND ")}`,b))){let a=Math.min(e-1,Math.max(0,Math.floor((new Date(d.timestamp).getTime()-h)/g)));i[a].tokens+=p(d.promptTokens,0)+p(d.completionTokens,0),i[a].cost+=p(d.cost,0)}return i}finally{await j.close?.()}}async function L(a={}){if(!a||!(a.tokens||a.status||a.error))return null;let b=a.error?"error":a.status||"ok";return u(b)||!a.error&&v(b,a.statusCode)?null:F({provider:a.provider||"unknown",model:a.model||"unknown",connectionId:a.connectionId,endpoint:a.endpoint,tokens:a.tokens||{},status:b,statusCode:a.statusCode,errorMessage:a.error||a.errorMessage,meta:a})}async function M(a=100,b={}){let c=n(b.apiKeyOwner).toLowerCase(),d=await (0,f.getMysqlRecentUsageLogs)(a,c?{apiKeyOwner:c}:{});return Array.isArray(d)?d.map(a=>{let b=p(a.promptTokens,0),c=p(a.displayTotalInputTokens,b),d=p(a.displayNewInputTokens,b),f=p(a.displayCachedInputTokens,p(a.cachedTokens,0)),g=p(a.displayCacheCreationInputTokens,0),h=(0,e.q)(a.tokens,{}),i={...h&&"object"==typeof h?h:{},display_total_input_tokens:c,display_new_input_tokens:d,display_cached_input_tokens:f,display_cache_creation_input_tokens:g};return{...a,apiKey:a.apiKeyFingerprint||a.apiKey,cost:p(a.cost,0),rawPromptTokens:b,promptTokens:c,displayTotalInputTokens:c,displayNewInputTokens:d,displayCachedInputTokens:f,displayCacheCreationInputTokens:g,completionTokens:p(a.completionTokens,0),tokens:i}}):(console.error("[usageRepo] MySQL usage_events read returned null for getRecentLogs"),[])}},67769:(a,b,c)=>{"use strict";c.d(b,{P7:()=>l,lR:()=>j,t9:()=>i,tW:()=>k});let d="local",e="cloud",f="unknown",g=["openai-compatible-","anthropic-compatible-"];function h(a){return String(a??"").trim()}function i(a,b=f){let c=h(a).toLowerCase();return c===d?d:c===e?e:c===f?f:b}function j(a){let b=h(a).toLowerCase();return g.some(a=>b.startsWith(a))}function k(a,b=f){let c,g=h(a);if(!g)return b;try{c=new URL(g.includes("://")?g:`http://${g}`)}catch{return b}let i=h(c.hostname).replace(/^\[|\]$/g,"").toLowerCase();return i?"localhost"===i||"::1"===i||"0.0.0.0"===i||i.endsWith(".localhost")||i.endsWith(".local")||function(a){let b=a.split(".").map(a=>Number(a));if(4!==b.length||b.some(a=>!Number.isInteger(a)||a<0||a>255))return!1;let[c,d]=b;return 10===c||127===c||169===c&&254===d||172===c&&!!(d>=16)&&!!(d<=31)||192===c&&168===d}(i)?d:e:b}function l({snapshot:a,configured:b,providerId:c,endpoint:d,baseUrl:g}={}){let m=i(a,"");if(m)return m;let n=i(b,"");if(n)return n;let o=k(g||d,"");return o||(h(c)&&!j(c)?e:f)}},74452:(a,b,c)=>{"use strict";c.d(b,{Iq:()=>s,Lh:()=>v,PX:()=>o,Pb:()=>u,XW:()=>t,ek:()=>w,getApiKeyByKey:()=>r,mI:()=>p,yg:()=>q});var d=c(94755),e=c(36366),f=c(644),g=c(490),h=c(27513);let i=!1;function j(a){return Array.isArray(a)?[...new Set(a.map(a=>String(a||"").trim()).filter(Boolean))]:[]}function k(a){return String(a||"").trim().toLowerCase()}async function l(a){if(!i)try{let b=a.all("PRAGMA table_info(apiKeys)"),c=new Set(b.map(a=>a.name));c.has("allowedModels")||a.run("ALTER TABLE apiKeys ADD COLUMN allowedModels TEXT DEFAULT '[]'"),c.has("limits")||a.run("ALTER TABLE apiKeys ADD COLUMN limits TEXT DEFAULT '{}'"),c.has("ownerUser")||a.run("ALTER TABLE apiKeys ADD COLUMN ownerUser TEXT DEFAULT ''"),c.has("createdByUser")||a.run("ALTER TABLE apiKeys ADD COLUMN createdByUser TEXT DEFAULT ''"),c.has("adminDisabled")||a.run("ALTER TABLE apiKeys ADD COLUMN adminDisabled INTEGER DEFAULT 0"),c.has("cavemanMode")||a.run("ALTER TABLE apiKeys ADD COLUMN cavemanMode TEXT DEFAULT 'inherit'"),c.has("cavemanLevel")||a.run("ALTER TABLE apiKeys ADD COLUMN cavemanLevel TEXT DEFAULT 'lite'");try{a.run("CREATE INDEX IF NOT EXISTS idx_ak_key ON apiKeys(key)"),a.run("CREATE INDEX IF NOT EXISTS idx_ak_owner ON apiKeys(ownerUser)"),a.run("CREATE INDEX IF NOT EXISTS idx_ak_created_by ON apiKeys(createdByUser)"),a.run("CREATE INDEX IF NOT EXISTS idx_ak_active ON apiKeys(isActive)"),a.run("CREATE INDEX IF NOT EXISTS idx_ak_admin_disabled ON apiKeys(adminDisabled)"),a.run("CREATE INDEX IF NOT EXISTS idx_ak_created_at ON apiKeys(createdAt)")}catch{}i=!0}catch(a){console.log("Could not ensure apiKeys columns:",a?.message||a)}}function m(a={}){let b=[],c=[],d=k(a.ownerUser),e=String(a.search||"").trim().toLowerCase();if(d&&(b.push("(lower(coalesce(ownerUser, '')) = ? OR lower(coalesce(createdByUser, '')) = ?)"),c.push(d,d)),!0===a.isActive?b.push("isActive = 1"):!1===a.isActive&&b.push("(isActive = 0 OR isActive IS NULL)"),e){let a=`%${e}%`;b.push(`(
|
|
268
268
|
lower(coalesce(name, '')) LIKE ?
|
|
269
269
|
OR lower(coalesce(key, '')) LIKE ?
|
|
270
270
|
OR lower(coalesce(id, '')) LIKE ?
|
|
@@ -272,7 +272,7 @@ exports.id=402,exports.ids=[402],exports.modules={490:(a,b,c)=>{"use strict";c.d
|
|
|
272
272
|
OR lower(coalesce(ownerUser, '')) LIKE ?
|
|
273
273
|
OR lower(coalesce(createdByUser, '')) LIKE ?
|
|
274
274
|
OR lower(coalesce(allowedModels, '')) LIKE ?
|
|
275
|
-
)`),c.push(a,a,a,a,a,a,a)}return{where:b.length?`WHERE ${b.join(" AND ")}`:"",params:c}}function n(a){return a?{id:a.id,key:a.key,name:a.name,machineId:a.machineId,isActive:1===a.isActive||!0===a.isActive,adminDisabled:1===a.adminDisabled||!0===a.adminDisabled,allowedModels:j((0,f.q)(a.allowedModels,[])),limits:(0,g.jQ)((0,f.q)(a.limits,{})),ownerUser:k(a.ownerUser),createdByUser:k(a.createdByUser),cavemanMode:(0,h.wX)(a.cavemanMode),cavemanLevel:(0,h.Bz)(a.cavemanLevel,"lite"),createdAt:a.createdAt}:null}async function o(a={}){let b,c,d=await (0,e.c)();await l(d);let{where:f,params:g}=m(a),h="desc"===String(a.order||"asc").toLowerCase()?"DESC":"ASC",i=!Number.isFinite(b=Number(a.limit))||b<=0?null:Math.min(500,Math.max(1,Math.floor(b))),j=!Number.isFinite(c=Number(a.offset))||c<=0?0:Math.max(0,Math.floor(c)),k=`SELECT * FROM apiKeys ${f} ORDER BY createdAt ${h}`,p=[...g];return i&&(k+=" LIMIT ? OFFSET ?",p.push(i,j)),(p.length?d.all(k,p):d.all(k)).map(n)}async function p(a={}){let b=await (0,e.c)();await l(b);let{where:c,params:d}=m(a),f=`SELECT COUNT(*) AS count FROM apiKeys ${c}`,g=d.length?b.get(f,d):b.get(f);return Number(g?.count||0)}async function q(a){let b=await (0,e.c)();return await l(b),n(b.get("SELECT * FROM apiKeys WHERE id = ?",[a]))}async function r(a){if(!a)return null;let b=await (0,e.c)();return await l(b),n(b.get("SELECT * FROM apiKeys WHERE key = ?",[a]))}async function s(a,b,i={}){if(!b)throw Error("machineId is required");let m=await (0,e.c)();await l(m);let{generateApiKeyWithMachine:n}=await c.e(6844).then(c.bind(c,86844)),o=n(b),p=k(i.ownerUser||i.createdByUser),q=k(i.createdByUser||p),r={id:(0,d.A)(),name:a,key:o.key,machineId:b,isActive:!0,adminDisabled:!1,allowedModels:j(i.allowedModels),limits:(0,g.jQ)(i.limits||{}),ownerUser:p,createdByUser:q,cavemanMode:(0,h.wX)(i.cavemanMode),cavemanLevel:(0,h.Bz)(i.cavemanLevel,"lite"),createdAt:new Date().toISOString()};return m.run("INSERT INTO apiKeys(id, key, name, machineId, isActive, adminDisabled, allowedModels, limits, ownerUser, createdByUser, cavemanMode, cavemanLevel, createdAt) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[r.id,r.key,r.name,r.machineId,1,0,(0,f.s)(r.allowedModels),(0,f.s)(r.limits),r.ownerUser,r.createdByUser,r.cavemanMode,r.cavemanLevel,r.createdAt]),r}async function t(a,b={}){let c=await (0,e.c)();await l(c);let d=null;return c.transaction(()=>{let e=c.get("SELECT * FROM apiKeys WHERE id = ?",[a]);if(!e)return;let i={...n(e),...b};Object.prototype.hasOwnProperty.call(b,"allowedModels")&&(i.allowedModels=j(b.allowedModels)),Object.prototype.hasOwnProperty.call(b,"limits")&&(i.limits=(0,g.jQ)(b.limits||{})),Object.prototype.hasOwnProperty.call(b,"ownerUser")&&(i.ownerUser=k(b.ownerUser)),Object.prototype.hasOwnProperty.call(b,"createdByUser")&&(i.createdByUser=k(b.createdByUser)),Object.prototype.hasOwnProperty.call(b,"cavemanMode")&&(i.cavemanMode=(0,h.wX)(b.cavemanMode)),Object.prototype.hasOwnProperty.call(b,"cavemanLevel")&&(i.cavemanLevel=(0,h.Bz)(b.cavemanLevel,"lite")),c.run("UPDATE apiKeys SET key = ?, name = ?, machineId = ?, isActive = ?, adminDisabled = ?, allowedModels = ?, limits = ?, ownerUser = ?, createdByUser = ?, cavemanMode = ?, cavemanLevel = ? WHERE id = ?",[i.key,i.name,i.machineId,+!!i.isActive,+!!i.adminDisabled,(0,f.s)(i.allowedModels||[]),(0,f.s)(i.limits||{}),i.ownerUser||"",i.createdByUser||"",(0,h.wX)(i.cavemanMode),(0,h.Bz)(i.cavemanLevel,"lite"),a]),d=i}),d}async function u(a,b){if(!a)return null;if(!b)throw Error("machineId is required");let d=await (0,e.c)();if(await l(d),!d.get("SELECT * FROM apiKeys WHERE id = ?",[a]))return null;let{generateApiKeyWithMachine:f}=await c.e(6844).then(c.bind(c,86844));for(let c=0;c<5;c+=1){let e=f(b);try{return d.run("UPDATE apiKeys SET key = ?, machineId = ? WHERE id = ?",[e.key,b,a]),n(d.get("SELECT * FROM apiKeys WHERE id = ?",[a]))}catch(a){if(String(a?.message||a||"").toLowerCase().includes("unique")&&c<4)continue;throw a}}throw Error("Failed to generate a unique API key")}async function v(a){let b=await (0,e.c)();await l(b);let c=b.run("DELETE FROM apiKeys WHERE id = ?",[a]);return(c?.changes??0)>0}async function w(a){let b=await (0,e.c)();await l(b);let c=b.get("SELECT isActive FROM apiKeys WHERE key = ?",[a]);return!!c&&(1===c.isActive||!0===c.isActive)}},77638:(a,b,c)=>{"use strict";c.d(b,{Kc:()=>M,Nn:()=>E,RT:()=>C,Y4:()=>F,d9:()=>L,zW:()=>B});var d=c(55511),e=c.n(d),f=c(45903),g=c(644);let h=Number(process.env.OBSERVABILITY_MYSQL_MAX_JSON_BYTES||262144),i={expiresAt:0,value:null},j=!1,k=new Set;function l(a,b){k.has(a)||(k.add(a),console.warn(b))}function m(a){if(!a)return"";let b=[];return a.code&&b.push(`code=${a.code}`),a.errno&&b.push(`errno=${a.errno}`),a.sqlState&&b.push(`sqlState=${a.sqlState}`),a.sqlMessage?b.push(a.sqlMessage):a.message&&b.push(a.message),b.filter(Boolean).join(" | ")||String(a)}let n=new Set(["ER_NO_SUCH_TABLE","ER_BAD_FIELD_ERROR","ER_BAD_TABLE_ERROR","ER_CANT_DROP_FIELD_OR_KEY"]);async function o(a,b){let[c]=await a.query("SELECT COLUMN_NAME AS name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[b]);return new Set((c||[]).map(a=>String(a.name||a.COLUMN_NAME||"")))}async function p(a,b){let[c]=await a.query("SELECT INDEX_NAME AS name FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[b]);return new Set((c||[]).map(a=>String(a.name||a.INDEX_NAME||"")))}async function q(a,b,c){let d=await o(a,b);for(let[e,f]of c)d.has(e)||(await a.query(`ALTER TABLE ${b} ADD COLUMN ${f}`),d.add(e))}async function r(a,b,c){let d=await p(a,b);for(let[e,f]of c)d.has(e)||(await a.query(`ALTER TABLE ${b} ADD ${f}`),d.add(e))}async function s(a){await q(a,"usage_events",[["dedupe_key","dedupe_key VARCHAR(96) NULL"],["created_at","created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)"],["timestamp","timestamp DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)"],["provider","provider VARCHAR(120) NULL"],["model","model VARCHAR(255) NULL"],["connection_id","connection_id VARCHAR(120) NULL"],["api_key_fingerprint","api_key_fingerprint VARCHAR(120) NULL"],["api_key_id","api_key_id VARCHAR(120) NULL"],["api_key_name","api_key_name VARCHAR(255) NULL"],["api_key_owner","api_key_owner VARCHAR(255) NULL"],["endpoint","endpoint TEXT NULL"],["request_id","request_id VARCHAR(120) NULL"],["session_id","session_id VARCHAR(255) NULL"],["client_ip","client_ip VARCHAR(64) NULL"],["client_ip_normalized","client_ip_normalized VARCHAR(64) NULL"],["client_host","client_host TEXT NULL"],["client_user_agent","client_user_agent TEXT NULL"],["source_tool","source_tool VARCHAR(80) NULL"],["source_tool_label","source_tool_label VARCHAR(120) NULL"],["source_host","source_host VARCHAR(255) NULL"],["latency_ms","latency_ms INT DEFAULT 0"],["ttft_ms","ttft_ms INT DEFAULT 0"],["status_code","status_code INT NULL"],["error_code","error_code VARCHAR(160) NULL"],["error_type","error_type VARCHAR(120) NULL"],["error_message_short","error_message_short TEXT NULL"],["is_streaming","is_streaming TINYINT DEFAULT 0"],["is_combo","is_combo TINYINT DEFAULT 0"],["combo_name","combo_name VARCHAR(255) NULL"],["prompt_tokens","prompt_tokens BIGINT DEFAULT 0"],["completion_tokens","completion_tokens BIGINT DEFAULT 0"],["total_tokens","total_tokens BIGINT DEFAULT 0"],["cached_tokens","cached_tokens BIGINT DEFAULT 0"],["reasoning_tokens","reasoning_tokens BIGINT DEFAULT 0"],["thinking_enabled","thinking_enabled TINYINT NULL"],["thinking_auto_off","thinking_auto_off TINYINT DEFAULT 0"],["thinking_auto_off_reason","thinking_auto_off_reason VARCHAR(120) NULL"],["prompt_chars","prompt_chars BIGINT DEFAULT 0"],["force_thinking_off_above_chars","force_thinking_off_above_chars BIGINT DEFAULT 0"],["cost","cost DECIMAL(18,8) DEFAULT 0"],["status","status VARCHAR(80) NULL"],["tokens_json","tokens_json JSON NULL"],["meta_json","meta_json JSON NULL"]]),await a.query("UPDATE usage_events SET dedupe_key = CONCAT('legacy:', id) WHERE dedupe_key IS NULL OR dedupe_key = ''").catch(()=>{}),await a.query("ALTER TABLE usage_events MODIFY COLUMN dedupe_key VARCHAR(96) NOT NULL").catch(()=>{}),await r(a,"usage_events",[["uq_usage_events_dedupe","UNIQUE KEY uq_usage_events_dedupe (dedupe_key)"],["idx_usage_events_ts","INDEX idx_usage_events_ts (timestamp)"],["idx_usage_events_provider_model","INDEX idx_usage_events_provider_model (provider, model, timestamp)"],["idx_usage_events_status","INDEX idx_usage_events_status (status, status_code, timestamp)"],["idx_usage_events_api_key","INDEX idx_usage_events_api_key (api_key_id, api_key_fingerprint, timestamp)"],["idx_usage_owner_time","INDEX idx_usage_owner_time (api_key_owner, timestamp, id)"],["idx_usage_events_client_ip","INDEX idx_usage_events_client_ip (client_ip_normalized, timestamp)"],["idx_usage_events_source_tool","INDEX idx_usage_events_source_tool (source_tool, timestamp)"],["idx_usage_events_session","INDEX idx_usage_events_session (session_id, timestamp)"],["idx_usage_events_thinking_auto_off","INDEX idx_usage_events_thinking_auto_off (thinking_auto_off, timestamp)"],["idx_usage_events_prompt_chars","INDEX idx_usage_events_prompt_chars (prompt_chars, timestamp)"]]),await q(a,"request_details",[["created_at","created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)"],["timestamp","timestamp DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)"],["provider","provider VARCHAR(120) NULL"],["model","model VARCHAR(255) NULL"],["connection_id","connection_id VARCHAR(120) NULL"],["status","status VARCHAR(80) NULL"],["data_json","data_json JSON NULL"],["data_size_bytes","data_size_bytes BIGINT DEFAULT 0"]]),await r(a,"request_details",[["idx_request_details_ts","INDEX idx_request_details_ts (timestamp)"],["idx_request_details_provider","INDEX idx_request_details_provider (provider, timestamp)"],["idx_request_details_model","INDEX idx_request_details_model (model, timestamp)"],["idx_request_details_connection","INDEX idx_request_details_connection (connection_id, timestamp)"],["idx_request_details_status","INDEX idx_request_details_status (status, timestamp)"]])}function t(a){return String(a??"").trim()}function u(a,b=0){let c=Number(a);return Number.isFinite(c)?c:b}function v(a){let b=a?new Date(a):new Date;return(Number.isNaN(b.getTime())?new Date().toISOString():b.toISOString()).replace("T"," ").replace("Z","")}function w(a){if(null==a)return null;if("string"==typeof a)try{return JSON.parse(a),a}catch{return JSON.stringify(a)}return(0,g.s)(a)}function x(a){if(null==a)return{};let b=w(a)||"{}";return Buffer.byteLength(b,"utf8")<=h?a:{_truncated:!0,_originalSizeBytes:Buffer.byteLength(b,"utf8"),_preview:b.slice(0,1e3)}}async function y(){let a=Date.now();if(i.value&&i.expiresAt>a)return i.value;try{let b=(0,f.normalizeConfig)(await (0,f.getPromptLogDbConfig)());i={value:!0===b.enabled&&"mysql"===b.type&&"false"!==process.env.OBSERVABILITY_MYSQL_ENABLED?b:null,expiresAt:a+5e3}}catch(b){l("config",`[observability-mysql] Unable to read MySQL log config: ${b?.message||b}`),i={value:null,expiresAt:a+5e3}}return i.value}async function z(a){let b=await c.e(8491).then(c.t.bind(c,38491,19)),d=await b.createConnection({host:a.host,port:Number(a.port||3306),database:a.database,user:a.username,password:a.password,ssl:a.ssl?{}:void 0,multipleStatements:!0,dateStrings:!0,connectTimeout:3e3,timezone:"Z"});return await d.query("SET time_zone = '+00:00'"),d}async function A(a){j||(await a.query(`
|
|
275
|
+
)`),c.push(a,a,a,a,a,a,a)}return{where:b.length?`WHERE ${b.join(" AND ")}`:"",params:c}}function n(a){return a?{id:a.id,key:a.key,name:a.name,machineId:a.machineId,isActive:1===a.isActive||!0===a.isActive,adminDisabled:1===a.adminDisabled||!0===a.adminDisabled,allowedModels:j((0,f.q)(a.allowedModels,[])),limits:(0,g.jQ)((0,f.q)(a.limits,{})),ownerUser:k(a.ownerUser),createdByUser:k(a.createdByUser),cavemanMode:(0,h.wX)(a.cavemanMode),cavemanLevel:(0,h.Bz)(a.cavemanLevel,"lite"),createdAt:a.createdAt}:null}async function o(a={}){let b,c,d=await (0,e.c)();await l(d);let{where:f,params:g}=m(a),h="desc"===String(a.order||"asc").toLowerCase()?"DESC":"ASC",i=!Number.isFinite(b=Number(a.limit))||b<=0?null:Math.min(500,Math.max(1,Math.floor(b))),j=!Number.isFinite(c=Number(a.offset))||c<=0?0:Math.max(0,Math.floor(c)),k=`SELECT * FROM apiKeys ${f} ORDER BY createdAt ${h}`,p=[...g];return i&&(k+=" LIMIT ? OFFSET ?",p.push(i,j)),(p.length?d.all(k,p):d.all(k)).map(n)}async function p(a={}){let b=await (0,e.c)();await l(b);let{where:c,params:d}=m(a),f=`SELECT COUNT(*) AS count FROM apiKeys ${c}`,g=d.length?b.get(f,d):b.get(f);return Number(g?.count||0)}async function q(a){let b=await (0,e.c)();return await l(b),n(b.get("SELECT * FROM apiKeys WHERE id = ?",[a]))}async function r(a){if(!a)return null;let b=await (0,e.c)();return await l(b),n(b.get("SELECT * FROM apiKeys WHERE key = ?",[a]))}async function s(a,b,i={}){if(!b)throw Error("machineId is required");let m=await (0,e.c)();await l(m);let{generateApiKeyWithMachine:n}=await c.e(6844).then(c.bind(c,86844)),o=n(b),p=k(i.ownerUser||i.createdByUser),q=k(i.createdByUser||p),r={id:(0,d.A)(),name:a,key:o.key,machineId:b,isActive:!0,adminDisabled:!1,allowedModels:j(i.allowedModels),limits:(0,g.jQ)(i.limits||{}),ownerUser:p,createdByUser:q,cavemanMode:(0,h.wX)(i.cavemanMode),cavemanLevel:(0,h.Bz)(i.cavemanLevel,"lite"),createdAt:new Date().toISOString()};return m.run("INSERT INTO apiKeys(id, key, name, machineId, isActive, adminDisabled, allowedModels, limits, ownerUser, createdByUser, cavemanMode, cavemanLevel, createdAt) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[r.id,r.key,r.name,r.machineId,1,0,(0,f.s)(r.allowedModels),(0,f.s)(r.limits),r.ownerUser,r.createdByUser,r.cavemanMode,r.cavemanLevel,r.createdAt]),r}async function t(a,b={}){let c=await (0,e.c)();await l(c);let d=null;return c.transaction(()=>{let e=c.get("SELECT * FROM apiKeys WHERE id = ?",[a]);if(!e)return;let i={...n(e),...b};Object.prototype.hasOwnProperty.call(b,"allowedModels")&&(i.allowedModels=j(b.allowedModels)),Object.prototype.hasOwnProperty.call(b,"limits")&&(i.limits=(0,g.jQ)(b.limits||{})),Object.prototype.hasOwnProperty.call(b,"ownerUser")&&(i.ownerUser=k(b.ownerUser)),Object.prototype.hasOwnProperty.call(b,"createdByUser")&&(i.createdByUser=k(b.createdByUser)),Object.prototype.hasOwnProperty.call(b,"cavemanMode")&&(i.cavemanMode=(0,h.wX)(b.cavemanMode)),Object.prototype.hasOwnProperty.call(b,"cavemanLevel")&&(i.cavemanLevel=(0,h.Bz)(b.cavemanLevel,"lite")),c.run("UPDATE apiKeys SET key = ?, name = ?, machineId = ?, isActive = ?, adminDisabled = ?, allowedModels = ?, limits = ?, ownerUser = ?, createdByUser = ?, cavemanMode = ?, cavemanLevel = ? WHERE id = ?",[i.key,i.name,i.machineId,+!!i.isActive,+!!i.adminDisabled,(0,f.s)(i.allowedModels||[]),(0,f.s)(i.limits||{}),i.ownerUser||"",i.createdByUser||"",(0,h.wX)(i.cavemanMode),(0,h.Bz)(i.cavemanLevel,"lite"),a]),d=i}),d}async function u(a,b){if(!a)return null;if(!b)throw Error("machineId is required");let d=await (0,e.c)();if(await l(d),!d.get("SELECT * FROM apiKeys WHERE id = ?",[a]))return null;let{generateApiKeyWithMachine:f}=await c.e(6844).then(c.bind(c,86844));for(let c=0;c<5;c+=1){let e=f(b);try{return d.run("UPDATE apiKeys SET key = ?, machineId = ? WHERE id = ?",[e.key,b,a]),n(d.get("SELECT * FROM apiKeys WHERE id = ?",[a]))}catch(a){if(String(a?.message||a||"").toLowerCase().includes("unique")&&c<4)continue;throw a}}throw Error("Failed to generate a unique API key")}async function v(a){let b=await (0,e.c)();await l(b);let c=b.run("DELETE FROM apiKeys WHERE id = ?",[a]);return(c?.changes??0)>0}async function w(a){let b=await (0,e.c)();await l(b);let c=b.get("SELECT isActive FROM apiKeys WHERE key = ?",[a]);return!!c&&(1===c.isActive||!0===c.isActive)}},77638:(a,b,c)=>{"use strict";c.r(b),c.d(b,{getMysqlObservabilityAdapter:()=>N,getMysqlRecentUsageLogs:()=>P,getMysqlRequestDetailById:()=>H,getMysqlRequestDetails:()=>G,getMysqlTotalRequestsLifetime:()=>Q,getMysqlUsageHistoryRows:()=>O,isMysqlObservabilityEnabled:()=>B,purgeMysqlRequestDetails:()=>F,saveMysqlRequestDetails:()=>D,saveMysqlUsageEvent:()=>C});var d=c(55511),e=c.n(d),f=c(45903),g=c(644);let h=Number(process.env.OBSERVABILITY_MYSQL_MAX_JSON_BYTES||262144),i={expiresAt:0,value:null},j=!1,k=new Set;function l(a,b){k.has(a)||(k.add(a),console.warn(b))}function m(a){if(!a)return"";let b=[];return a.code&&b.push(`code=${a.code}`),a.errno&&b.push(`errno=${a.errno}`),a.sqlState&&b.push(`sqlState=${a.sqlState}`),a.sqlMessage?b.push(a.sqlMessage):a.message&&b.push(a.message),b.filter(Boolean).join(" | ")||String(a)}let n=new Set(["ER_NO_SUCH_TABLE","ER_BAD_FIELD_ERROR","ER_BAD_TABLE_ERROR","ER_CANT_DROP_FIELD_OR_KEY"]);async function o(a,b){let[c]=await a.query("SELECT COLUMN_NAME AS name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[b]);return new Set((c||[]).map(a=>String(a.name||a.COLUMN_NAME||"")))}async function p(a,b){let[c]=await a.query("SELECT INDEX_NAME AS name FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?",[b]);return new Set((c||[]).map(a=>String(a.name||a.INDEX_NAME||"")))}async function q(a,b,c){let d=await o(a,b);for(let[e,f]of c)d.has(e)||(await a.query(`ALTER TABLE ${b} ADD COLUMN ${f}`),d.add(e))}async function r(a,b,c){let d=await p(a,b);for(let[e,f]of c)d.has(e)||(await a.query(`ALTER TABLE ${b} ADD ${f}`),d.add(e))}async function s(a){await q(a,"usage_events",[["dedupe_key","dedupe_key VARCHAR(96) NULL"],["created_at","created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)"],["timestamp","timestamp DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)"],["provider","provider VARCHAR(120) NULL"],["model","model VARCHAR(255) NULL"],["connection_id","connection_id VARCHAR(120) NULL"],["api_key_fingerprint","api_key_fingerprint VARCHAR(120) NULL"],["api_key_id","api_key_id VARCHAR(120) NULL"],["api_key_name","api_key_name VARCHAR(255) NULL"],["api_key_owner","api_key_owner VARCHAR(255) NULL"],["endpoint","endpoint TEXT NULL"],["request_id","request_id VARCHAR(120) NULL"],["session_id","session_id VARCHAR(255) NULL"],["client_ip","client_ip VARCHAR(64) NULL"],["client_ip_normalized","client_ip_normalized VARCHAR(64) NULL"],["client_host","client_host TEXT NULL"],["client_user_agent","client_user_agent TEXT NULL"],["source_tool","source_tool VARCHAR(80) NULL"],["source_tool_label","source_tool_label VARCHAR(120) NULL"],["source_host","source_host VARCHAR(255) NULL"],["latency_ms","latency_ms INT DEFAULT 0"],["ttft_ms","ttft_ms INT DEFAULT 0"],["status_code","status_code INT NULL"],["error_code","error_code VARCHAR(160) NULL"],["error_type","error_type VARCHAR(120) NULL"],["error_message_short","error_message_short TEXT NULL"],["is_streaming","is_streaming TINYINT DEFAULT 0"],["is_combo","is_combo TINYINT DEFAULT 0"],["combo_name","combo_name VARCHAR(255) NULL"],["prompt_tokens","prompt_tokens BIGINT DEFAULT 0"],["completion_tokens","completion_tokens BIGINT DEFAULT 0"],["total_tokens","total_tokens BIGINT DEFAULT 0"],["cached_tokens","cached_tokens BIGINT DEFAULT 0"],["reasoning_tokens","reasoning_tokens BIGINT DEFAULT 0"],["thinking_enabled","thinking_enabled TINYINT NULL"],["thinking_auto_off","thinking_auto_off TINYINT DEFAULT 0"],["thinking_auto_off_reason","thinking_auto_off_reason VARCHAR(120) NULL"],["prompt_chars","prompt_chars BIGINT DEFAULT 0"],["force_thinking_off_above_chars","force_thinking_off_above_chars BIGINT DEFAULT 0"],["cost","cost DECIMAL(18,8) DEFAULT 0"],["status","status VARCHAR(80) NULL"],["tokens_json","tokens_json JSON NULL"],["meta_json","meta_json JSON NULL"]]),await a.query("UPDATE usage_events SET dedupe_key = CONCAT('legacy:', id) WHERE dedupe_key IS NULL OR dedupe_key = ''").catch(()=>{}),await a.query("ALTER TABLE usage_events MODIFY COLUMN dedupe_key VARCHAR(96) NOT NULL").catch(()=>{}),await r(a,"usage_events",[["uq_usage_events_dedupe","UNIQUE KEY uq_usage_events_dedupe (dedupe_key)"],["idx_usage_events_ts","INDEX idx_usage_events_ts (timestamp)"],["idx_usage_events_provider_model","INDEX idx_usage_events_provider_model (provider, model, timestamp)"],["idx_usage_events_status","INDEX idx_usage_events_status (status, status_code, timestamp)"],["idx_usage_events_api_key","INDEX idx_usage_events_api_key (api_key_id, api_key_fingerprint, timestamp)"],["idx_usage_owner_time","INDEX idx_usage_owner_time (api_key_owner, timestamp, id)"],["idx_usage_events_client_ip","INDEX idx_usage_events_client_ip (client_ip_normalized, timestamp)"],["idx_usage_events_source_tool","INDEX idx_usage_events_source_tool (source_tool, timestamp)"],["idx_usage_events_session","INDEX idx_usage_events_session (session_id, timestamp)"],["idx_usage_events_thinking_auto_off","INDEX idx_usage_events_thinking_auto_off (thinking_auto_off, timestamp)"],["idx_usage_events_prompt_chars","INDEX idx_usage_events_prompt_chars (prompt_chars, timestamp)"]]),await q(a,"request_details",[["created_at","created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)"],["timestamp","timestamp DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)"],["provider","provider VARCHAR(120) NULL"],["model","model VARCHAR(255) NULL"],["connection_id","connection_id VARCHAR(120) NULL"],["status","status VARCHAR(80) NULL"],["data_json","data_json JSON NULL"],["data_size_bytes","data_size_bytes BIGINT DEFAULT 0"]]),await r(a,"request_details",[["idx_request_details_ts","INDEX idx_request_details_ts (timestamp)"],["idx_request_details_provider","INDEX idx_request_details_provider (provider, timestamp)"],["idx_request_details_model","INDEX idx_request_details_model (model, timestamp)"],["idx_request_details_connection","INDEX idx_request_details_connection (connection_id, timestamp)"],["idx_request_details_status","INDEX idx_request_details_status (status, timestamp)"]])}function t(a){return String(a??"").trim()}function u(a,b=0){let c=Number(a);return Number.isFinite(c)?c:b}function v(a){let b=a?new Date(a):new Date;return(Number.isNaN(b.getTime())?new Date().toISOString():b.toISOString()).replace("T"," ").replace("Z","")}function w(a){if(null==a)return null;if("string"==typeof a)try{return JSON.parse(a),a}catch{return JSON.stringify(a)}return(0,g.s)(a)}function x(a){if(null==a)return{};let b=w(a)||"{}";return Buffer.byteLength(b,"utf8")<=h?a:{_truncated:!0,_originalSizeBytes:Buffer.byteLength(b,"utf8"),_preview:b.slice(0,1e3)}}async function y(){let a=Date.now();if(i.value&&i.expiresAt>a)return i.value;try{let b=(0,f.normalizeConfig)(await (0,f.getPromptLogDbConfig)());i={value:!0===b.enabled&&"mysql"===b.type&&"false"!==process.env.OBSERVABILITY_MYSQL_ENABLED?b:null,expiresAt:a+5e3}}catch(b){l("config",`[observability-mysql] Unable to read MySQL log config: ${b?.message||b}`),i={value:null,expiresAt:a+5e3}}return i.value}async function z(a){let b=await c.e(8491).then(c.t.bind(c,38491,19)),d=await b.createConnection({host:a.host,port:Number(a.port||3306),database:a.database,user:a.username,password:a.password,ssl:a.ssl?{}:void 0,multipleStatements:!0,dateStrings:!0,connectTimeout:3e3,timezone:"Z"});return await d.query("SET time_zone = '+00:00'"),d}async function A(a){j||(await a.query(`
|
|
276
276
|
CREATE TABLE IF NOT EXISTS usage_events (
|
|
277
277
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
278
278
|
dedupe_key VARCHAR(96) NOT NULL,
|
|
@@ -452,7 +452,7 @@ exports.id=402,exports.ids=[402],exports.modules={490:(a,b,c)=>{"use strict";c.d
|
|
|
452
452
|
status,
|
|
453
453
|
data_json AS data
|
|
454
454
|
FROM request_details;
|
|
455
|
-
`).catch(a=>{l("compat-views",`[observability-mysql] Unable to create compatibility views usageHistory/requestDetails: ${a?.message||a}`)}),j=!0)}async function B(a={}){var b;let c,d=await y();if(!d)return!1;try{let f;c=await z(d),await A(c);let h=function(a={}){let b=a.tokens&&"object"==typeof a.tokens&&!Array.isArray(a.tokens)?a.tokens:"string"==typeof a.tokens?(0,g.q)(a.tokens,{}):{},c={...b},d=u(a.promptTokens,b.prompt_tokens??b.input_tokens??0),e=u(a.completionTokens,b.completion_tokens??b.output_tokens??0),f=u(a.totalTokens,b.total_tokens??d+e),h=u(a.cachedTokens,b.cached_tokens??b.cache_read_input_tokens??b.input_tokens_details?.cached_tokens??b.prompt_tokens_details?.cached_tokens??0),i=u(a.cacheCreationTokens,b.display_cache_creation_input_tokens??b.cache_creation_input_tokens??b.input_tokens_details?.cache_creation_tokens??b.prompt_tokens_details?.cache_creation_tokens??0),j=u(a.reasoningTokens,b.reasoning_tokens??b.completion_tokens_details?.reasoning_tokens??b.output_tokens_details?.reasoning_tokens??0);return c.prompt_tokens=d,c.input_tokens=b.input_tokens??d,c.completion_tokens=e,c.output_tokens=b.output_tokens??e,c.total_tokens=f||d+e,c.cached_tokens=h,null!=b.cache_read_input_tokens&&(c.cache_read_input_tokens=b.cache_read_input_tokens),(null!=b.cache_creation_input_tokens||null!=b.display_cache_creation_input_tokens||b.input_tokens_details?.cache_creation_tokens!=null||b.prompt_tokens_details?.cache_creation_tokens!=null)&&(c.cache_creation_input_tokens=i),c.reasoning_tokens=j,{promptTokens:d,completionTokens:e,totalTokens:c.total_tokens,cachedTokens:h,cacheCreationTokens:i,reasoningTokens:j,tokens:c}}(a),i=(b=a.requestId?{requestId:a.requestId,provider:a.provider,model:a.model,status:a.status}:{timestamp:a.timestamp,provider:a.provider,model:a.model,connectionId:a.connectionId,status:a.status,tokens:h.tokens},f=w(b)||"",`usage:${e().createHash("sha256").update(f).digest("hex")}`);return await c.query(`INSERT INTO usage_events (
|
|
455
|
+
`).catch(a=>{l("compat-views",`[observability-mysql] Unable to create compatibility views usageHistory/requestDetails: ${a?.message||a}`)}),j=!0)}async function B(){return!!await y()}async function C(a={}){var b;let c,d=await y();if(!d)return!1;try{let f;c=await z(d),await A(c);let h=function(a={}){let b=a.tokens&&"object"==typeof a.tokens&&!Array.isArray(a.tokens)?a.tokens:"string"==typeof a.tokens?(0,g.q)(a.tokens,{}):{},c={...b},d=u(a.promptTokens,b.prompt_tokens??b.input_tokens??0),e=u(a.completionTokens,b.completion_tokens??b.output_tokens??0),f=u(a.totalTokens,b.total_tokens??d+e),h=u(a.cachedTokens,b.cached_tokens??b.cache_read_input_tokens??b.input_tokens_details?.cached_tokens??b.prompt_tokens_details?.cached_tokens??0),i=u(a.cacheCreationTokens,b.display_cache_creation_input_tokens??b.cache_creation_input_tokens??b.input_tokens_details?.cache_creation_tokens??b.prompt_tokens_details?.cache_creation_tokens??0),j=u(a.reasoningTokens,b.reasoning_tokens??b.completion_tokens_details?.reasoning_tokens??b.output_tokens_details?.reasoning_tokens??0);return c.prompt_tokens=d,c.input_tokens=b.input_tokens??d,c.completion_tokens=e,c.output_tokens=b.output_tokens??e,c.total_tokens=f||d+e,c.cached_tokens=h,null!=b.cache_read_input_tokens&&(c.cache_read_input_tokens=b.cache_read_input_tokens),(null!=b.cache_creation_input_tokens||null!=b.display_cache_creation_input_tokens||b.input_tokens_details?.cache_creation_tokens!=null||b.prompt_tokens_details?.cache_creation_tokens!=null)&&(c.cache_creation_input_tokens=i),c.reasoning_tokens=j,{promptTokens:d,completionTokens:e,totalTokens:c.total_tokens,cachedTokens:h,cacheCreationTokens:i,reasoningTokens:j,tokens:c}}(a),i=(b=a.requestId?{requestId:a.requestId,provider:a.provider,model:a.model,status:a.status}:{timestamp:a.timestamp,provider:a.provider,model:a.model,connectionId:a.connectionId,status:a.status,tokens:h.tokens},f=w(b)||"",`usage:${e().createHash("sha256").update(f).digest("hex")}`);return await c.query(`INSERT INTO usage_events (
|
|
456
456
|
dedupe_key, created_at, timestamp, provider, model, connection_id,
|
|
457
457
|
api_key_fingerprint, api_key_id, api_key_name, api_key_owner,
|
|
458
458
|
endpoint, request_id, session_id, client_ip, client_ip_normalized, client_host, client_user_agent,
|
|
@@ -498,7 +498,7 @@ exports.id=402,exports.ids=[402],exports.modules={490:(a,b,c)=>{"use strict";c.d
|
|
|
498
498
|
cost = VALUES(cost),
|
|
499
499
|
status = VALUES(status),
|
|
500
500
|
tokens_json = VALUES(tokens_json),
|
|
501
|
-
meta_json = VALUES(meta_json)`,[i,v(a.timestamp),t(a.provider)||null,t(a.model)||null,t(a.connectionId)||null,t(a.apiKeyFingerprint||a.apiKey)||null,t(a.apiKeyId)||null,t(a.apiKeyName)||null,t(a.apiKeyOwner)||null,t(a.endpoint)||null,t(a.requestId)||null,t(a.sessionId)||null,t(a.clientIp)||null,t(a.clientIpNormalized)||null,t(a.clientHost)||null,t(a.clientUserAgent)||null,t(a.sourceTool)||null,t(a.sourceToolLabel)||null,t(a.sourceHost)||null,u(a.latencyMs,0),u(a.ttftMs,0),null==a.statusCode?null:u(a.statusCode,null),t(a.errorCode)||null,t(a.errorType)||null,t(a.errorMessageShort)||null,+!!a.isStreaming,+!!a.isCombo,t(a.comboName)||null,h.promptTokens,h.completionTokens,h.totalTokens,h.cachedTokens,h.reasoningTokens,null===a.thinkingEnabled||void 0===a.thinkingEnabled?null:+!!a.thinkingEnabled,+!!a.thinkingAutoOff,t(a.thinkingAutoOffReason)||null,u(a.promptChars,0),u(a.forceThinkingOffAboveChars,0),u(a.cost,0),t(a.status)||null,w(h.tokens),w(a.meta||{})]),!0}catch(b){let a=m(b);return l("usage-write",`[observability-mysql] Failed to write usage_events: ${a}`),n.has(b?.code)&&(j=!1),!1}finally{c&&await c.end().catch(()=>{})}}async function
|
|
501
|
+
meta_json = VALUES(meta_json)`,[i,v(a.timestamp),t(a.provider)||null,t(a.model)||null,t(a.connectionId)||null,t(a.apiKeyFingerprint||a.apiKey)||null,t(a.apiKeyId)||null,t(a.apiKeyName)||null,t(a.apiKeyOwner)||null,t(a.endpoint)||null,t(a.requestId)||null,t(a.sessionId)||null,t(a.clientIp)||null,t(a.clientIpNormalized)||null,t(a.clientHost)||null,t(a.clientUserAgent)||null,t(a.sourceTool)||null,t(a.sourceToolLabel)||null,t(a.sourceHost)||null,u(a.latencyMs,0),u(a.ttftMs,0),null==a.statusCode?null:u(a.statusCode,null),t(a.errorCode)||null,t(a.errorType)||null,t(a.errorMessageShort)||null,+!!a.isStreaming,+!!a.isCombo,t(a.comboName)||null,h.promptTokens,h.completionTokens,h.totalTokens,h.cachedTokens,h.reasoningTokens,null===a.thinkingEnabled||void 0===a.thinkingEnabled?null:+!!a.thinkingEnabled,+!!a.thinkingAutoOff,t(a.thinkingAutoOffReason)||null,u(a.promptChars,0),u(a.forceThinkingOffAboveChars,0),u(a.cost,0),t(a.status)||null,w(h.tokens),w(a.meta||{})]),!0}catch(b){let a=m(b);return l("usage-write",`[observability-mysql] Failed to write usage_events: ${a}`),n.has(b?.code)&&(j=!1),!1}finally{c&&await c.end().catch(()=>{})}}async function D(a=[]){let b,c=await y();if(!c||!Array.isArray(a)||0===a.length)return!1;try{for(let d of(b=await z(c),await A(b),a)){let a={...d,request:x(d.request),providerRequest:x(d.providerRequest),providerResponse:x(d.providerResponse),response:x(d.response)},c=w(a)||"{}";await b.query(`INSERT INTO request_details (
|
|
502
502
|
id, created_at, timestamp, provider, model, connection_id, status, data_json, data_size_bytes
|
|
503
503
|
) VALUES (?, UTC_TIMESTAMP(3), ?, ?, ?, ?, ?, ?, ?)
|
|
504
504
|
ON DUPLICATE KEY UPDATE
|
|
@@ -508,7 +508,10 @@ exports.id=402,exports.ids=[402],exports.modules={490:(a,b,c)=>{"use strict";c.d
|
|
|
508
508
|
connection_id = VALUES(connection_id),
|
|
509
509
|
status = VALUES(status),
|
|
510
510
|
data_json = VALUES(data_json),
|
|
511
|
-
data_size_bytes = VALUES(data_size_bytes)`,[t(a.id),v(a.timestamp),t(a.provider)||null,t(a.model)||null,t(a.connectionId)||null,t(a.status)||null,c,Buffer.byteLength(c,"utf8")])}return!0}catch(a){return l("request-details-write",`[observability-mysql] Failed to write request_details: ${m(a)}`),!1}finally{b&&await b.end().catch(()=>{})}}let
|
|
511
|
+
data_size_bytes = VALUES(data_size_bytes)`,[t(a.id),v(a.timestamp),t(a.provider)||null,t(a.model)||null,t(a.connectionId)||null,t(a.status)||null,c,Buffer.byteLength(c,"utf8")])}return!0}catch(a){return l("request-details-write",`[observability-mysql] Failed to write request_details: ${m(a)}`),!1}finally{b&&await b.end().catch(()=>{})}}let E=0;async function F(a=1e3){let b;if(Date.now()-E<6e4)return;E=Date.now();let c=await y();if(c)try{b=await z(c);let[[d]]=await b.query("SELECT COUNT(*) AS c FROM request_details"),e=Number(d?.c||0)-a;if(e<=0)return;await b.query("DELETE FROM request_details ORDER BY created_at ASC LIMIT ?",[e])}catch(a){l("request-details-purge",`[observability-mysql] Failed to purge request_details: ${m(a)}`)}finally{b&&await b.end().catch(()=>{})}}async function G(a={}){let b,c=await y();if(!c)return null;try{b=await z(c),await A(b);let d=[],e=[];a.provider&&(d.push("rd.provider = ?"),e.push(a.provider)),a.model&&(d.push("rd.model = ?"),e.push(a.model)),a.connectionId&&(d.push("rd.connection_id = ?"),e.push(a.connectionId)),a.status&&(d.push("rd.status = ?"),e.push(a.status)),a.startDate&&(d.push("rd.timestamp >= ?"),e.push(v(a.startDate))),a.endDate&&(d.push("rd.timestamp <= ?"),e.push(v(a.endDate)));let f=a.apiKeyOwner?"INNER JOIN usage_events ue ON ue.request_id = JSON_UNQUOTE(JSON_EXTRACT(rd.data_json, '$.requestId')) AND ue.api_key_owner = ?":"",h=a.apiKeyOwner?[a.apiKeyOwner]:[],i=d.length?`WHERE ${d.join(" AND ")}`:"",[[j]]=await b.query(`SELECT COUNT(*) AS c FROM request_details rd ${f} ${i}`,[...h,...e]),k=Number(j?.c||0),l=Math.max(1,Number(a.page)||1),m=Math.max(1,Math.min(100,Number(a.pageSize)||50)),n=Math.ceil(k/m),[o]=await b.query(`SELECT rd.data_json FROM request_details rd ${f} ${i} ORDER BY rd.timestamp DESC LIMIT ? OFFSET ?`,[...h,...e,m,(l-1)*m]);return{details:o.map(a=>(0,g.q)("string"==typeof a.data_json?a.data_json:(0,g.s)(a.data_json),{})),pagination:{page:l,pageSize:m,totalItems:k,totalPages:n,hasNext:l<n,hasPrev:l>1},dbInfo:{type:"mysql",host:c.host,database:c.database}}}catch(a){return l("request-details-read",`[observability-mysql] Failed to read request_details: ${a?.message||a}`),null}finally{b&&await b.end().catch(()=>{})}}async function H(a){let b,c=await y();if(!c||!a)return null;try{b=await z(c),await A(b);let[d]=await b.query("SELECT data_json FROM request_details WHERE id = ? LIMIT 1",[a]);if(!d?.length)return null;let e=d[0].data_json;return(0,g.q)("string"==typeof e?e:(0,g.s)(e),null)}catch(a){return l("request-detail-read",`[observability-mysql] Failed to read request_detail: ${a?.message||a}`),null}finally{b&&await b.end().catch(()=>{})}}let I=new Set(["requests","requestCount","totalRequests","successRequests","errorRequests","pendingRequests","promptTokens","completionTokens","totalTokens","cachedTokens","reasoningTokens","inputTokens","outputTokens","cost","totalCost","inputCost","outputCost","avgCost","latencyMs","ttftMs","avgLatencyMs","p50LatencyMs","p95LatencyMs","p99LatencyMs","statusCode","httpStatus","count","total","totalItems","totalPages","page","pageSize","errors","success","failures","errorRate","successRate","slowRequestRate","longInputRate","payloadSizeBytes","dataSizeBytes","sizeBytes"]),J=new Set(["timestamp","created_at","createdAt","created","updated_at","updatedAt","updated","lastUsed","lastSeen","firstSeen","minTs","maxTs"]);function K(a){return"string"!=typeof a?a:/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(a)?v(a):a}function L(a){let b=String(a||"");return(b=(b=(b=(b=b.replace(/CAST\(status AS TEXT\)/g,"CAST(status AS CHAR)")).replace(/CAST\(strftime\('%s',\s*timestamp\) AS INTEGER\)/g,"UNIX_TIMESTAMP(timestamp)")).replace(/GLOB\s+'2\[0-9\]\[0-9\]\*'/g,"REGEXP '^2[0-9][0-9].*'")).replace(/GLOB\s+'([^']*)\*'/g,(a,b)=>`LIKE '${String(b).replace(/'/g,"''")}%'`)).replace(/\bAS\s+key\b/gi,"AS `key`")}async function M(a){let b=await z(a);return await A(b),await b.query("SET SESSION sql_mode = CONCAT_WS(',', REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''), 'PIPES_AS_CONCAT')").catch(()=>{}),b}async function N(){let a=await y();if(!a)return null;let b=await M(a);try{await b.query("SELECT 1 FROM usage_events LIMIT 1")}catch(a){return l("usage-events-read",`[observability-mysql] MySQL usage_events table is not readable: ${a?.message||a}`),await b.end().catch(()=>{}),null}let c=async(a,c=[])=>{let d;if((d=String(a||"").replace(/\s+/g," ").trim()).startsWith("SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, displayTotalInputTokens AS promptTokens, completionTokens, cachedTokens, reasoningTokens, cost, status, tokens FROM usageHistory")&&(d.includes("ORDER BY timestamp DESC LIMIT ?")||d.includes("ORDER BY (COALESCE(displayTotalInputTokens, 0) + COALESCE(completionTokens, 0)) DESC, timestamp DESC LIMIT ?")))return[];let[e]=await b.query(L(a),(c||[]).map(K));return Array.isArray(e)?e.map(a=>{if(!a||"object"!=typeof a||Array.isArray(a))return a;let b={...a};for(let a of Object.keys(b))b[a]=function(a,b){let c;if(null==b)return b;let d=function(a,b){if(!J.has(String(a||""))||"string"!=typeof b)return b;let c=b.trim();return/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}(?:\.\d{1,6})?$/.test(c)?`${c.replace(" ","T")}Z`:b}(a,b);if(d!==b)return d;if("number"==typeof b)return Number.isFinite(b)?b:0;if("bigint"==typeof b)return Number(b);if("string"==typeof b&&(c=String(a||""),I.has(c)||/(?:Requests|Tokens|Cost|LatencyMs|Rate|Count|Bytes|SizeBytes|Items|Pages|Ms)$/i.test(c)||/^(?:p50|p95|p99|avg|min|max|sum|total|count)$/i.test(c))){let a=b.trim();if(/^-?\d+(?:\.\d+)?$/.test(a)){let b=Number(a);return Number.isFinite(b)?b:0}}return b}(a,b[a]);return b}):e};return{type:"mysql",all:async(a,b=[])=>await c(a,b),async get(a,b=[]){let d=await c(a,b);return d?.[0]||null},async run(a,c=[]){let[d]=await b.query(L(a),(c||[]).map(K));return d},async close(){await b.end().catch(()=>{})}}}async function O(a={}){let b=await N();if(!b)return null;try{let c=[],d=[];a.provider&&(c.push("provider = ?"),d.push(a.provider)),a.model&&(c.push("model = ?"),d.push(a.model)),a.startDate&&(c.push("timestamp >= ?"),d.push(a.startDate)),a.endDate&&(c.push("timestamp <= ?"),d.push(a.endDate)),a.apiKeyOwner&&(c.push("apiKeyOwner = ?"),d.push(a.apiKeyOwner));let e=c.length?`WHERE ${c.join(" AND ")}`:"";return await b.all(`SELECT timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyOwner, endpoint, cost, status, statusCode,
|
|
512
|
+
promptTokens, displayTotalInputTokens, displayNewInputTokens, displayCachedInputTokens,
|
|
513
|
+
displayCacheCreationInputTokens, completionTokens, totalTokens, cachedTokens, reasoningTokens, tokens
|
|
514
|
+
FROM usageHistory ${e} ORDER BY timestamp ASC, id ASC`,d)}finally{await b.close()}}async function P(a=100,b={}){let c=await N();if(!c)return null;try{let d=[],e=[];b.apiKeyOwner&&(d.push("apiKeyOwner = ?"),e.push(b.apiKeyOwner));let f=d.length?`WHERE ${d.join(" AND ")}`:"";return await c.all(`SELECT timestamp, provider, model, connectionId, apiKeyFingerprint, apiKeyOwner,
|
|
512
515
|
COALESCE(
|
|
513
516
|
JSON_UNQUOTE(JSON_EXTRACT(meta, '$.accountName')),
|
|
514
517
|
JSON_UNQUOTE(JSON_EXTRACT(meta, '$.requestContext.accountName')),
|
|
@@ -537,4 +540,4 @@ exports.id=402,exports.ids=[402],exports.modules={490:(a,b,c)=>{"use strict";c.d
|
|
|
537
540
|
endpoint, status, statusCode, errorMessageShort,
|
|
538
541
|
promptTokens, displayTotalInputTokens, displayNewInputTokens, displayCachedInputTokens,
|
|
539
542
|
displayCacheCreationInputTokens, completionTokens, totalTokens, cachedTokens, reasoningTokens, tokens, cost
|
|
540
|
-
FROM usageHistory ${f} ORDER BY timestamp DESC, id DESC LIMIT ?`,[...e,Number(a)||100])}finally{await c.close()}}},78335:()=>{},89718:(a,b,c)=>{"use strict";c.d(b,{CG:()=>d.CG,Dj:()=>d.Dj,Fh:()=>d.Fh,Iq:()=>d.Iq,K1:()=>d.K1,KJ:()=>d.KJ,L:()=>d.L,L9:()=>d.L9,Lh:()=>d.Lh,Mc:()=>d.Mc,OM:()=>d.OM,PX:()=>d.PX,Pc:()=>d.Pc,Q_:()=>d.Q_,Qu:()=>d.Qu,S8:()=>d.S8,Uv:()=>d.Uv,VT:()=>d.VT,XW:()=>d.XW,Xx:()=>d.Xx,Yd:()=>d.Yd,ZO:()=>d.ZO,c:()=>d.c,ek:()=>d.ek,fK:()=>d.fK,fv:()=>d.fv,getProviderConnections:()=>d.P,ho:()=>d.ho,hr:()=>d.hr,i0:()=>d.i0,iE:()=>d.iE,jd:()=>d.jd,mY:()=>d.mY,mt:()=>d.mt,nv:()=>d.nv,o5:()=>d.o5,oG:()=>d.oG,op:()=>d.op,r4:()=>d.r4,uL:()=>d.uL,ui:()=>d.ui,updateProviderConnection:()=>d.rj,uv:()=>d.uv,yF:()=>d.yF,yg:()=>d.yg,zP:()=>d.zP});var d=c(39422)},95658:(a,b,c)=>{"use strict";c.d(b,{AL:()=>j,HG:()=>i,Jh:()=>m,KQ:()=>k,Or:()=>l});var d=c(76760),e=c.n(d),f=c(73024),g=c.n(f),h=c(49120);let i=e().join(h.DATA_DIR,"db"),j=e().join(i,"data.sqlite"),k=e().join(i,"backups"),l={main:e().join(h.DATA_DIR,"db.json"),usage:e().join(h.DATA_DIR,"usage.json"),disabled:e().join(h.DATA_DIR,"disabledModels.json"),details:e().join(h.DATA_DIR,"request-details.json")};function m(){for(let a of[h.DATA_DIR,i,k])g().existsSync(a)||g().mkdirSync(a,{recursive:!0})}},96487:()=>{},97914:(a,b,c)=>{"use strict";c.d(b,{
|
|
543
|
+
FROM usageHistory ${f} ORDER BY timestamp DESC, id DESC LIMIT ?`,[...e,Number(a)||100])}finally{await c.close()}}async function Q(){let a=await N();if(!a)return null;try{let b=await a.get("SELECT COUNT(*) AS c FROM usageHistory");return Number(b?.c||0)}finally{await a.close()}}},78335:()=>{},89718:(a,b,c)=>{"use strict";c.d(b,{CG:()=>d.CG,Dj:()=>d.Dj,Fh:()=>d.Fh,Iq:()=>d.Iq,K1:()=>d.K1,KJ:()=>d.KJ,L:()=>d.L,L9:()=>d.L9,Lh:()=>d.Lh,Mc:()=>d.Mc,OM:()=>d.OM,PX:()=>d.PX,Pc:()=>d.Pc,Q_:()=>d.Q_,Qu:()=>d.Qu,S8:()=>d.S8,Uv:()=>d.Uv,VT:()=>d.VT,XW:()=>d.XW,Xx:()=>d.Xx,Yd:()=>d.Yd,ZO:()=>d.ZO,c:()=>d.c,ek:()=>d.ek,fK:()=>d.fK,fv:()=>d.fv,getProviderConnections:()=>d.P,ho:()=>d.ho,hr:()=>d.hr,i0:()=>d.i0,iE:()=>d.iE,jd:()=>d.jd,mY:()=>d.mY,mt:()=>d.mt,nv:()=>d.nv,o5:()=>d.o5,oG:()=>d.oG,op:()=>d.op,r4:()=>d.r4,uL:()=>d.uL,ui:()=>d.ui,updateProviderConnection:()=>d.rj,uv:()=>d.uv,yF:()=>d.yF,yg:()=>d.yg,zP:()=>d.zP});var d=c(39422)},95658:(a,b,c)=>{"use strict";c.d(b,{AL:()=>j,HG:()=>i,Jh:()=>m,KQ:()=>k,Or:()=>l});var d=c(76760),e=c.n(d),f=c(73024),g=c.n(f),h=c(49120);let i=e().join(h.DATA_DIR,"db"),j=e().join(i,"data.sqlite"),k=e().join(i,"backups"),l={main:e().join(h.DATA_DIR,"db.json"),usage:e().join(h.DATA_DIR,"usage.json"),disabled:e().join(h.DATA_DIR,"disabledModels.json"),details:e().join(h.DATA_DIR,"request-details.json")};function m(){for(let a of[h.DATA_DIR,i,k])g().existsSync(a)||g().mkdirSync(a,{recursive:!0})}},96487:()=>{},97914:(a,b,c)=>{"use strict";c.r(b),c.d(b,{CANONICAL_PRICING_KEY:()=>g,getPricing:()=>o,getPricingForModel:()=>q,resetAllPricing:()=>t,resetPricing:()=>s,updatePricing:()=>r});var d=c(36366),e=c(644);let f=(0,c(22846).U)("pricing"),g="canonical",h=Object.freeze(["input","output","cached","reasoning","cache_creation"]);function i(a,b=0){let c=Number(a);return Number.isFinite(c)?Math.max(0,c):b}function j(a){if(!a||"object"!=typeof a||Array.isArray(a))return null;let b=i(a.input,0),c=i(a.output,0),d=i(a.cached??a.cached_input??a.cached_input_price,b),e=i(a.reasoning,c),f=i(a.cache_creation??a.cache_creation_5m??a.cache_write_5m??a.cache_creation_5m_price,b),g={input:b,output:c,cached:d,reasoning:e,cache_creation:f};return Object.fromEntries(h.map(a=>[a,g[a]]))}function k(a){let b={};if(!a||"object"!=typeof a||Array.isArray(a))return b;for(let[c,d]of Object.entries(a)){if(!d||"object"!=typeof d||Array.isArray(d))continue;let a={};for(let[b,c]of Object.entries(d)){let d=j(c);d&&(a[b]=d)}Object.keys(a).length>0&&(b[c]=a)}return b}let l={value:null,expiresAt:0};function m(){l={value:null,expiresAt:0}}async function n(){return k(await f.getAll())}async function o(){let a=Date.now();if(l.value&&l.expiresAt>a)return l.value;let b=await n(),{PROVIDER_PRICING:d}=await c.e(7341).then(c.bind(c,57341)),e={};for(let[a,c]of Object.entries(d))if(e[a]={...c},b[a])for(let[c,d]of Object.entries(b[a]))e[a][c]=e[a][c]?{...e[a][c],...d}:d;for(let[a,c]of Object.entries(b))if(e[a])for(let[b,d]of Object.entries(c))e[a][b]||(e[a][b]=d);else e[a]={...c};return l={value:e,expiresAt:a+5e3},e}function p(a,b){if(!a||!b)return null;if(a[b])return a[b];let c=String(b).toLowerCase();for(let b of Object.keys(a))if(b.toLowerCase()===c)return a[b];return null}async function q(a,b){if(!b)return null;let d=await n();if(a){let c=p(d,a);if(c){let a=p(c,b);if(a)return a}}let e=p(d,g);if(e){let a=String(b).includes("/")?String(b).split("/").pop():b,c=p(e,b)||p(e,a);if(c)return c}let{getPricingForModel:f}=await c.e(7341).then(c.bind(c,57341));return f(a,b)}async function r(a){let b=await (0,d.c)();return b.transaction(()=>{for(let[c,d]of Object.entries(a)){let a=b.get("SELECT value FROM kv WHERE scope = 'pricing' AND key = ?",[c]),f={...k({[c]:a&&(0,e.q)(a.value,{})||{}})[c]||{}};for(let[a,b]of Object.entries(d)){let c=j(b);c&&(f[a]=c)}b.run("INSERT INTO kv(scope, key, value) VALUES('pricing', ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[c,(0,e.s)(f)])}}),m(),await n()}async function s(a,b){if(!a)return await n();let c=await (0,d.c)();return c.transaction(()=>{if(!b)return void c.run("DELETE FROM kv WHERE scope = 'pricing' AND key = ?",[a]);let d=c.get("SELECT value FROM kv WHERE scope = 'pricing' AND key = ?",[a]),f=k({[a]:d&&(0,e.q)(d.value,{})||{}})[a]||{};delete f[b],0===Object.keys(f).length?c.run("DELETE FROM kv WHERE scope = 'pricing' AND key = ?",[a]):c.run("INSERT INTO kv(scope, key, value) VALUES('pricing', ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[a,(0,e.s)(f)])}),m(),await n()}async function t(){return await f.clear(),m(),{}}}};
|