@jheavenknows/bluerouter 5.1.14 → 5.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (452) hide show
  1. package/app/.next-cli-build/BUILD_ID +1 -1
  2. package/app/.next-cli-build/app-path-routes-manifest.json +5 -5
  3. package/app/.next-cli-build/build-manifest.json +2 -2
  4. package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page.js +1 -1
  5. package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
  6. package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
  7. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  8. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  9. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  10. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  11. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  12. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  13. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  14. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  15. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  16. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  17. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  18. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  19. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  20. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  21. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  22. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  23. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page_client-reference-manifest.js +1 -1
  24. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page_client-reference-manifest.js +1 -1
  25. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page_client-reference-manifest.js +1 -1
  26. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  27. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
  28. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
  29. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  30. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  31. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  32. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  33. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  34. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  35. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  36. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  37. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  38. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  39. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  40. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  41. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  42. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  43. package/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  44. package/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  45. package/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  46. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  47. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  48. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  49. package/app/.next-cli-build/server/app/_not-found.rsc +5 -5
  50. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +5 -5
  51. package/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  52. package/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +5 -5
  53. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  54. package/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  55. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  56. package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
  57. package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
  58. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  59. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  60. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  61. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  62. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  63. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  64. package/app/.next-cli-build/server/app/api/branding/[asset]/route.js.nft.json +1 -1
  65. package/app/.next-cli-build/server/app/api/branding/route.js.nft.json +1 -1
  66. package/app/.next-cli-build/server/app/api/branding/upload/route.js.nft.json +1 -1
  67. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  68. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  69. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
  70. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
  71. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
  72. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  73. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  74. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  75. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  76. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  77. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js +85 -85
  78. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
  79. package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
  80. package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
  81. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
  82. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
  83. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
  84. package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js.nft.json +1 -1
  85. package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
  86. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  87. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  88. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  89. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  90. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  91. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  92. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  93. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  94. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  95. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  96. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  97. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  98. package/app/.next-cli-build/server/app/api/models/route.js +1 -1
  99. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  100. package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  101. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  102. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  103. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  104. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  105. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  106. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  107. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  108. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  109. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  110. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js.nft.json +1 -1
  111. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js.nft.json +1 -1
  112. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js.nft.json +1 -1
  113. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js.nft.json +1 -1
  114. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js.nft.json +1 -1
  115. package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js.nft.json +1 -1
  116. package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js.nft.json +1 -1
  117. package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js.nft.json +1 -1
  118. package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js.nft.json +1 -1
  119. package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js.nft.json +1 -1
  120. package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js.nft.json +1 -1
  121. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  122. package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
  123. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  124. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  126. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  127. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  128. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  129. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  130. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  132. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  134. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  136. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  138. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  140. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  142. package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  143. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  144. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  145. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  146. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  147. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  148. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  150. package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  151. package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  152. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  153. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  154. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  155. package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
  156. package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
  157. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  158. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  159. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  160. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  161. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  162. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  163. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  164. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  165. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  166. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  167. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  168. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  169. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  170. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  171. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  172. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  173. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  174. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  175. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  176. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  177. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  178. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  179. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  180. package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  181. package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  182. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  183. package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  184. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  185. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  186. package/app/.next-cli-build/server/app/callback.html +1 -1
  187. package/app/.next-cli-build/server/app/callback.rsc +5 -5
  188. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +5 -5
  189. package/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  190. package/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +5 -5
  191. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  192. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  193. package/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  194. package/app/.next-cli-build/server/app/dashboard/analytics.html +1 -1
  195. package/app/.next-cli-build/server/app/dashboard/analytics.rsc +7 -7
  196. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics/__PAGE__.segment.rsc +2 -2
  197. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics.segment.rsc +1 -1
  198. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  199. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  200. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_full.segment.rsc +7 -7
  201. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_head.segment.rsc +1 -1
  202. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_index.segment.rsc +5 -5
  203. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_tree.segment.rsc +1 -1
  204. package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
  205. package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +7 -7
  206. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +2 -2
  207. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys.segment.rsc +1 -1
  208. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  209. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  210. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +7 -7
  211. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_head.segment.rsc +1 -1
  212. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_index.segment.rsc +5 -5
  213. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +1 -1
  214. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  215. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +7 -7
  216. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  217. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  218. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  219. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  220. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +7 -7
  221. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  222. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +5 -5
  223. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  224. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  225. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +7 -7
  226. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  227. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  228. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  229. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  230. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +7 -7
  231. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  232. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +5 -5
  233. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  234. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  235. package/app/.next-cli-build/server/app/dashboard/combos.rsc +7 -7
  236. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  237. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  238. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  239. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  240. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +7 -7
  241. package/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  242. package/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +5 -5
  243. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  244. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  245. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +7 -7
  246. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  247. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  248. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  249. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  250. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +7 -7
  251. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  252. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +5 -5
  253. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  254. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  255. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +7 -7
  256. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  257. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  258. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  259. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  260. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  261. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +7 -7
  262. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  263. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +5 -5
  264. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  265. package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  266. package/app/.next-cli-build/server/app/dashboard/mitm.rsc +7 -7
  267. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  268. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  269. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  270. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  271. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +7 -7
  272. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  273. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +5 -5
  274. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  275. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  276. package/app/.next-cli-build/server/app/dashboard/profile.rsc +6 -6
  277. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +1 -1
  278. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  279. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  280. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  281. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
  282. package/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  283. package/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +5 -5
  284. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  285. package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
  286. package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +6 -6
  287. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +1 -1
  288. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs.segment.rsc +1 -1
  289. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  290. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  291. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +6 -6
  292. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_head.segment.rsc +1 -1
  293. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_index.segment.rsc +5 -5
  294. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +1 -1
  295. package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
  296. package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +6 -6
  297. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +1 -1
  298. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health.segment.rsc +1 -1
  299. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  300. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  301. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +6 -6
  302. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_head.segment.rsc +1 -1
  303. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_index.segment.rsc +5 -5
  304. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +1 -1
  305. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  306. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +7 -7
  307. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  308. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  309. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  310. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  311. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  312. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +7 -7
  313. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  314. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +5 -5
  315. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  316. package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  317. package/app/.next-cli-build/server/app/dashboard/providers.rsc +7 -7
  318. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  319. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  320. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  321. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  322. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +7 -7
  323. package/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  324. package/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +5 -5
  325. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  326. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  327. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +7 -7
  328. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  329. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  330. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  331. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  332. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +7 -7
  333. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  334. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +5 -5
  335. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  336. package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
  337. package/app/.next-cli-build/server/app/dashboard/quota.rsc +8 -8
  338. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  339. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  340. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  341. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  342. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +8 -8
  343. package/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  344. package/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +5 -5
  345. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  346. package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  347. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  348. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +5 -5
  349. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +5 -5
  350. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  351. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +5 -5
  352. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  353. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  354. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  355. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  356. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  357. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  358. package/app/.next-cli-build/server/app/dashboard/skills.rsc +7 -7
  359. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
  360. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
  361. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  362. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  363. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +7 -7
  364. package/app/.next-cli-build/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
  365. package/app/.next-cli-build/server/app/dashboard/skills.segments/_index.segment.rsc +5 -5
  366. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
  367. package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  368. package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
  369. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +1 -1
  370. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
  371. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  372. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  373. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
  374. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
  375. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +5 -5
  376. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
  377. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  378. package/app/.next-cli-build/server/app/dashboard/translator.rsc +7 -7
  379. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  380. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  381. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  382. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  383. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +7 -7
  384. package/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  385. package/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +5 -5
  386. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  387. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  388. package/app/.next-cli-build/server/app/dashboard/usage.rsc +7 -7
  389. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  390. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  391. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  392. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  393. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +7 -7
  394. package/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  395. package/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +5 -5
  396. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  397. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  398. package/app/.next-cli-build/server/app/dashboard.rsc +7 -7
  399. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  400. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  401. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  402. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +7 -7
  403. package/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  404. package/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +5 -5
  405. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  406. package/app/.next-cli-build/server/app/index.html +1 -1
  407. package/app/.next-cli-build/server/app/index.rsc +5 -5
  408. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  409. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +5 -5
  410. package/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  411. package/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +5 -5
  412. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  413. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  414. package/app/.next-cli-build/server/app/landing.html +1 -1
  415. package/app/.next-cli-build/server/app/landing.rsc +5 -5
  416. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
  417. package/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  418. package/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +5 -5
  419. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  420. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  421. package/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  422. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  423. package/app/.next-cli-build/server/app/login.html +1 -1
  424. package/app/.next-cli-build/server/app/login.rsc +6 -6
  425. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +6 -6
  426. package/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  427. package/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +5 -5
  428. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  429. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  430. package/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  431. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  432. package/app/.next-cli-build/server/app-paths-manifest.json +5 -5
  433. package/app/.next-cli-build/server/chunks/2338.js +1 -1
  434. package/app/.next-cli-build/server/chunks/3110.js +1 -1
  435. package/app/.next-cli-build/server/chunks/4746.js +1 -1
  436. package/app/.next-cli-build/server/chunks/6328.js +1 -1
  437. package/app/.next-cli-build/server/chunks/9434.js +1 -1
  438. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  439. package/app/.next-cli-build/server/pages/404.html +1 -1
  440. package/app/.next-cli-build/server/pages/500.html +1 -1
  441. package/app/.next-cli-build/static/chunks/{5263-fcdafa0e3f67a0a8.js → 5263-489c1a79cbf6bc5b.js} +1 -1
  442. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/analytics/page-6bd62c37019ccc73.js +1 -0
  443. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/upgrade-5.1.13-to-5.1.14-5.1.14-20260713-235658/data.sqlite +0 -0
  444. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/upgrade-5.1.14-to-5.1.13-5.1.13-20260714-154858/data.sqlite +0 -0
  445. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite +0 -0
  446. package/app/package.json +1 -1
  447. package/package.json +1 -1
  448. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/analytics/page-72c09fc9a8ff54df.js +0 -1
  449. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/upgrade-5.1.6-to-5.1.9-5.1.9-20260710-165928/data.sqlite +0 -0
  450. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/upgrade-5.1.9-to-5.1.10-5.1.10-20260710-170922/data.sqlite +0 -0
  451. /package/app/.next-cli-build/static/{Q371hBUMyonkErZzbbcC6 → yX474pvvu6obMtCTF4IML}/_buildManifest.js +0 -0
  452. /package/app/.next-cli-build/static/{Q371hBUMyonkErZzbbcC6 → yX474pvvu6obMtCTF4IML}/_ssgManifest.js +0 -0
@@ -1,4 +1,4 @@
1
- "use strict";(()=>{var a={};a.id=451,a.ids=[451,9614],a.modules={261:a=>{a.exports=require("next/dist/shared/lib/router/utils/app-paths")},1932:a=>{a.exports=require("url")},3295:a=>{a.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},4573:a=>{a.exports=require("node:buffer")},9588:(a,b,c)=>{c.d(b,{I8:()=>j,Tv:()=>u,UX:()=>o,aV:()=>n,bz:()=>q,hH:()=>t,oW:()=>s,s0:()=>l,ub:()=>m,vZ:()=>p});var d=c(65573),e=c(23211),f=c(89718),g=c(33792),h=c(90389);function i(a){return String(a||"").trim().toLowerCase()}function j(a){return i(a)}function k(a={}){return[a.ldapUsername,a.ldapEmail,a.ldapName,a.oidcEmail,a.oidcName,a.localUsername,a.username,a.email].map(i).filter(Boolean)}function l(a={}){let b=k(a),c=b[0]||"local",d=a.ldapName||a.ldapEmail||a.oidcName||a.oidcEmail||a.localUsername||c;return{userId:c,displayName:d,loginMethod:a.oidc?"OIDC":a.ldap?"LDAP":"Local",candidates:b}}function m(a={},b={}){var c;if(!b?.authenticated)return!1;if(b.local||!b.ldap&&!b.oidc||b.role===h.hS.ADMIN||!0===b.ldapIsAdmin)return!0;let d=Array.isArray(c=a.ldapAllowedUsers)?c.map(i).filter(Boolean):String(c||"").split(/[,\n]/).map(i).filter(Boolean);return 0!==d.length&&k(b).some(a=>d.includes(a))}function n(a={},b={}){return!(!b?.authenticated||m(a,b))&&(b.role===h.hS.MONITOR_ADMIN||!0===b.ldapIsMonitorAdmin)}function o(a={},b={}){return!(!b?.authenticated||m(a,b)||n(a,b))&&(b.role===h.hS.AI_GATEWAYS_MONITOR||!0===b.ldapIsAiGatewaysMonitor)}function p(a={},b={}){return b?.authenticated?m(a,b)?h.hS.ADMIN:n(a,b)?h.hS.MONITOR_ADMIN:o(a,b)?h.hS.AI_GATEWAYS_MONITOR:h.hS.USER:h.hS.GUEST}function q(a={}){return!0===a.isAdmin||!0===a.isMonitorAdmin}async function r(){let a=await (0,f.mt)(),b=await (0,d.UL)(),c=await (0,g.dY)(b.get("auth_token")?.value);if(!c?.authenticated)return{authenticated:!1,isAdmin:!1,isMonitorAdmin:!1,isAiGatewaysMonitor:!1,role:h.hS.GUEST,userId:"",displayName:"Guest",loginMethod:"None",settings:{...a,requireLogin:!0},session:null};let e=l(c||{}),i=p(a,c||{}),j=i===h.hS.ADMIN,k=i===h.hS.MONITOR_ADMIN,m=i===h.hS.AI_GATEWAYS_MONITOR;return{authenticated:!0,isAdmin:j,isMonitorAdmin:k,isAiGatewaysMonitor:m,role:i,canManageApiKeys:j||k,canUseMonitorAdminTabs:j||k,canViewAllAnalytics:j||k||m,...e,settings:{...a,requireLogin:!0},session:c}}async function s(){let a=await r();return a.authenticated?{access:a,response:null}:{access:a,response:e.NextResponse.json({error:"Authentication required"},{status:401})}}async function t(a={}){let{allowMonitorAdmin:b=!1}=a||{},{access:c,response:d}=await s();return d?{access:c,response:d}:c.isAdmin||b&&c.isMonitorAdmin?{access:c,response:null}:{access:c,response:e.NextResponse.json({error:"Admin access required"},{status:403})}}function u(a,b){if(!a?.authenticated||!b)return!1;if(q(a))return!0;let c=i(a.userId),d=i(b.ownerUser),e=i(b.createdByUser);return!!c&&(d===c||e===c)}},10846:a=>{a.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},19225:(a,b,c)=>{a.exports=c(44870)},19771:a=>{a.exports=require("process")},21820:a=>{a.exports=require("os")},27910:a=>{a.exports=require("stream")},28354:a=>{a.exports=require("util")},29294:a=>{a.exports=require("next/dist/server/app-render/work-async-storage.external.js")},33792:(a,b,c)=>{c.d(b,{Dc:()=>p,OZ:()=>s,YK:()=>n,dY:()=>q,tm:()=>r});var d=c(86935),e=c(69614),f=c(73024),g=c.n(f),h=c(76760),i=c.n(h),j=c(77598),k=c.n(j),l=c(49120);let m=new TextEncoder().encode(function(){if(process.env.JWT_SECRET)return process.env.JWT_SECRET;let a=i().join(l.DATA_DIR,"jwt-secret");try{return g().readFileSync(a,"utf8").trim()}catch{}g().mkdirSync(l.DATA_DIR,{recursive:!0});let b=k().randomBytes(32).toString("hex");return g().writeFileSync(a,b,{mode:384}),b}());function n(a){let b="true"===process.env.AUTH_COOKIE_SECURE,c=a?.headers?.get?.("x-forwarded-proto");return b||"https"===c}async function o(a={}){return new d.P({authenticated:!0,...a}).setProtectedHeader({alg:"HS256"}).setIssuedAt().setExpirationTime("86400s").sign(m)}async function p(a){if(!a)return!1;try{return await (0,e.V)(a,m),!0}catch{return!1}}async function q(a){if(!a)return null;try{let{payload:b}=await (0,e.V)(a,m);return b}catch{return null}}async function r(a,b,c={}){let d=await o(c);a.set("auth_token",d,{httpOnly:!0,secure:n(b),sameSite:"lax",path:"/",maxAge:86400})}function s(a){a.delete("auth_token")}},33873:a=>{a.exports=require("path")},34631:a=>{a.exports=require("tls")},41204:a=>{a.exports=require("string_decoder")},44870:a=>{a.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},46293:a=>{a.exports=require("sql.js")},50122:(a,b,c)=>{c.d(b,{k:()=>e});let d=[];for(let a=0;a<256;++a)d.push((a+256).toString(16).slice(1));function e(a,b=0){return(d[a[b+0]]+d[a[b+1]]+d[a[b+2]]+d[a[b+3]]+"-"+d[a[b+4]]+d[a[b+5]]+"-"+d[a[b+6]]+d[a[b+7]]+"-"+d[a[b+8]]+d[a[b+9]]+"-"+d[a[b+10]]+d[a[b+11]]+d[a[b+12]]+d[a[b+13]]+d[a[b+14]]+d[a[b+15]]).toLowerCase()}},53053:a=>{a.exports=require("node:diagnostics_channel")},53254:(a,b,c)=>{c.r(b),c.d(b,{handler:()=>bt,patchFetch:()=>bs,routeModule:()=>bo,serverHooks:()=>br,workAsyncStorage:()=>bp,workUnitAsyncStorage:()=>bq});var d={};c.r(d),c.d(d,{GET:()=>bn,dynamic:()=>bl});var e=c(19225),f=c(84006),g=c(8317),h=c(99373),i=c(34775),j=c(24235),k=c(261),l=c(54365),m=c(90771),n=c(73461),o=c(67798),p=c(92280),q=c(62018),r=c(45696),s=c(47929),t=c(86439),u=c(37527),v=c(23211),w=c(36366),x=c(644),y=c(45903),z=c(97242);let A=new Set;function B(a){return String(a||"").trim()}function C(a,b=0){let c=Number(a);return Number.isFinite(c)?c:b}async function D(){return(0,y.I6)(await (0,y.L7)())}async function E(a){let b=new(await Promise.resolve().then(c.bind(c,64939))).Client({host:a.host,port:Number(a.port||5432),database:a.database,user:a.username,password:a.password,ssl:!!a.ssl&&{rejectUnauthorized:!1}});return await b.connect(),{type:"postgres",query:async(a,c=[])=>(await b.query(a,c)).rows,queryOne:async(a,c=[])=>(await b.query(a,c)).rows[0]||null,async exec(a,c=[]){await b.query(a,c)},async close(){await b.end()}}}async function F(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,dateStrings:!0,connectTimeout:3e3});return{type:"mysql",async query(a,b=[]){let[c]=await d.query(a,b);return c},async queryOne(a,b=[]){let[c]=await d.query(a,b);return c[0]||null},async exec(a,b=[]){await d.query(a,b)},async close(){await d.end()}}}async function G(a){if("postgres"===a.type)return E(a);if("mysql"===a.type)return F(a);throw Error(`Unsupported prompt log database type: ${a.type}`)}async function H(){await (0,z.DU)().catch(()=>null)}async function I(a){if(!a.enabled)return;let b=`${a.type}:${a.host||""}:${a.port||""}:${a.database||""}`;if(!A.has(b))try{await H(a),A.add(b)}catch(a){console.warn("[prompt-log-analytics] Unable to ensure indexes:",a?.message||a)}}async function J(a,b,c,d,e=50){let f=Math.max(1,Math.min(500,Number(e)||50));return await a.query(`SELECT ${c},
1
+ "use strict";(()=>{var a={};a.id=451,a.ids=[451,9614],a.modules={261:a=>{a.exports=require("next/dist/shared/lib/router/utils/app-paths")},1932:a=>{a.exports=require("url")},3295:a=>{a.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},4573:a=>{a.exports=require("node:buffer")},9588:(a,b,c)=>{c.d(b,{I8:()=>j,Tv:()=>u,UX:()=>o,aV:()=>n,bz:()=>q,hH:()=>t,oW:()=>s,s0:()=>l,ub:()=>m,vZ:()=>p});var d=c(65573),e=c(23211),f=c(89718),g=c(33792),h=c(90389);function i(a){return String(a||"").trim().toLowerCase()}function j(a){return i(a)}function k(a={}){return[a.ldapUsername,a.ldapEmail,a.ldapName,a.oidcEmail,a.oidcName,a.localUsername,a.username,a.email].map(i).filter(Boolean)}function l(a={}){let b=k(a),c=b[0]||"local",d=a.ldapName||a.ldapEmail||a.oidcName||a.oidcEmail||a.localUsername||c;return{userId:c,displayName:d,loginMethod:a.oidc?"OIDC":a.ldap?"LDAP":"Local",candidates:b}}function m(a={},b={}){var c;if(!b?.authenticated)return!1;if(b.local||!b.ldap&&!b.oidc||b.role===h.hS.ADMIN||!0===b.ldapIsAdmin)return!0;let d=Array.isArray(c=a.ldapAllowedUsers)?c.map(i).filter(Boolean):String(c||"").split(/[,\n]/).map(i).filter(Boolean);return 0!==d.length&&k(b).some(a=>d.includes(a))}function n(a={},b={}){return!(!b?.authenticated||m(a,b))&&(b.role===h.hS.MONITOR_ADMIN||!0===b.ldapIsMonitorAdmin)}function o(a={},b={}){return!(!b?.authenticated||m(a,b)||n(a,b))&&(b.role===h.hS.AI_GATEWAYS_MONITOR||!0===b.ldapIsAiGatewaysMonitor)}function p(a={},b={}){return b?.authenticated?m(a,b)?h.hS.ADMIN:n(a,b)?h.hS.MONITOR_ADMIN:o(a,b)?h.hS.AI_GATEWAYS_MONITOR:h.hS.USER:h.hS.GUEST}function q(a={}){return!0===a.isAdmin||!0===a.isMonitorAdmin}async function r(){let a=await (0,f.mt)(),b=await (0,d.UL)(),c=await (0,g.dY)(b.get("auth_token")?.value);if(!c?.authenticated)return{authenticated:!1,isAdmin:!1,isMonitorAdmin:!1,isAiGatewaysMonitor:!1,role:h.hS.GUEST,userId:"",displayName:"Guest",loginMethod:"None",settings:{...a,requireLogin:!0},session:null};let e=l(c||{}),i=p(a,c||{}),j=i===h.hS.ADMIN,k=i===h.hS.MONITOR_ADMIN,m=i===h.hS.AI_GATEWAYS_MONITOR;return{authenticated:!0,isAdmin:j,isMonitorAdmin:k,isAiGatewaysMonitor:m,role:i,canManageApiKeys:j||k,canUseMonitorAdminTabs:j||k,canViewAllAnalytics:j||k||m,...e,settings:{...a,requireLogin:!0},session:c}}async function s(){let a=await r();return a.authenticated?{access:a,response:null}:{access:a,response:e.NextResponse.json({error:"Authentication required"},{status:401})}}async function t(a={}){let{allowMonitorAdmin:b=!1}=a||{},{access:c,response:d}=await s();return d?{access:c,response:d}:c.isAdmin||b&&c.isMonitorAdmin?{access:c,response:null}:{access:c,response:e.NextResponse.json({error:"Admin access required"},{status:403})}}function u(a,b){if(!a?.authenticated||!b)return!1;if(q(a))return!0;let c=i(a.userId),d=i(b.ownerUser),e=i(b.createdByUser);return!!c&&(d===c||e===c)}},10846:a=>{a.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},19225:(a,b,c)=>{a.exports=c(44870)},19771:a=>{a.exports=require("process")},21820:a=>{a.exports=require("os")},27910:a=>{a.exports=require("stream")},28354:a=>{a.exports=require("util")},29294:a=>{a.exports=require("next/dist/server/app-render/work-async-storage.external.js")},33792:(a,b,c)=>{c.d(b,{Dc:()=>p,OZ:()=>s,YK:()=>n,dY:()=>q,tm:()=>r});var d=c(86935),e=c(69614),f=c(73024),g=c.n(f),h=c(76760),i=c.n(h),j=c(77598),k=c.n(j),l=c(49120);let m=new TextEncoder().encode(function(){if(process.env.JWT_SECRET)return process.env.JWT_SECRET;let a=i().join(l.DATA_DIR,"jwt-secret");try{return g().readFileSync(a,"utf8").trim()}catch{}g().mkdirSync(l.DATA_DIR,{recursive:!0});let b=k().randomBytes(32).toString("hex");return g().writeFileSync(a,b,{mode:384}),b}());function n(a){let b="true"===process.env.AUTH_COOKIE_SECURE,c=a?.headers?.get?.("x-forwarded-proto");return b||"https"===c}async function o(a={}){return new d.P({authenticated:!0,...a}).setProtectedHeader({alg:"HS256"}).setIssuedAt().setExpirationTime("86400s").sign(m)}async function p(a){if(!a)return!1;try{return await (0,e.V)(a,m),!0}catch{return!1}}async function q(a){if(!a)return null;try{let{payload:b}=await (0,e.V)(a,m);return b}catch{return null}}async function r(a,b,c={}){let d=await o(c);a.set("auth_token",d,{httpOnly:!0,secure:n(b),sameSite:"lax",path:"/",maxAge:86400})}function s(a){a.delete("auth_token")}},33873:a=>{a.exports=require("path")},34631:a=>{a.exports=require("tls")},41204:a=>{a.exports=require("string_decoder")},44870:a=>{a.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},46293:a=>{a.exports=require("sql.js")},50122:(a,b,c)=>{c.d(b,{k:()=>e});let d=[];for(let a=0;a<256;++a)d.push((a+256).toString(16).slice(1));function e(a,b=0){return(d[a[b+0]]+d[a[b+1]]+d[a[b+2]]+d[a[b+3]]+"-"+d[a[b+4]]+d[a[b+5]]+"-"+d[a[b+6]]+d[a[b+7]]+"-"+d[a[b+8]]+d[a[b+9]]+"-"+d[a[b+10]]+d[a[b+11]]+d[a[b+12]]+d[a[b+13]]+d[a[b+14]]+d[a[b+15]]).toLowerCase()}},53053:a=>{a.exports=require("node:diagnostics_channel")},53254:(a,b,c)=>{c.r(b),c.d(b,{handler:()=>bn,patchFetch:()=>bm,routeModule:()=>bi,serverHooks:()=>bl,workAsyncStorage:()=>bj,workUnitAsyncStorage:()=>bk});var d={};c.r(d),c.d(d,{GET:()=>bh,dynamic:()=>bf});var e=c(19225),f=c(84006),g=c(8317),h=c(99373),i=c(34775),j=c(24235),k=c(261),l=c(54365),m=c(90771),n=c(73461),o=c(67798),p=c(92280),q=c(62018),r=c(45696),s=c(47929),t=c(86439),u=c(37527),v=c(23211),w=c(36366),x=c(644),y=c(45903),z=c(97242);let A=new Set;function B(a){return String(a||"").trim()}function C(a,b=0){let c=Number(a);return Number.isFinite(c)?c:b}async function D(){return(0,y.I6)(await (0,y.L7)())}async function E(a){let b=new(await Promise.resolve().then(c.bind(c,64939))).Client({host:a.host,port:Number(a.port||5432),database:a.database,user:a.username,password:a.password,ssl:!!a.ssl&&{rejectUnauthorized:!1}});return await b.connect(),{type:"postgres",query:async(a,c=[])=>(await b.query(a,c)).rows,queryOne:async(a,c=[])=>(await b.query(a,c)).rows[0]||null,async exec(a,c=[]){await b.query(a,c)},async close(){await b.end()}}}async function F(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,dateStrings:!0,connectTimeout:3e3});return{type:"mysql",async query(a,b=[]){let[c]=await d.query(a,b);return c},async queryOne(a,b=[]){let[c]=await d.query(a,b);return c[0]||null},async exec(a,b=[]){await d.query(a,b)},async close(){await d.end()}}}async function G(a){if("postgres"===a.type)return E(a);if("mysql"===a.type)return F(a);throw Error(`Unsupported prompt log database type: ${a.type}`)}async function H(){await (0,z.DU)().catch(()=>null)}async function I(a){if(!a.enabled)return;let b=`${a.type}:${a.host||""}:${a.port||""}:${a.database||""}`;if(!A.has(b))try{await H(a),A.add(b)}catch(a){console.warn("[prompt-log-analytics] Unable to ensure indexes:",a?.message||a)}}async function J(a,b,c,d,e=50){let f=Math.max(1,Math.min(500,Number(e)||50));return await a.query(`SELECT ${c},
2
2
  COUNT(*) AS requests,
3
3
  SUM(CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 1
4
4
  WHEN status_code IS NOT NULL AND CONCAT('', status_code) NOT LIKE '2%' THEN 1
@@ -9,59 +9,59 @@
9
9
  ${b.clause}
10
10
  GROUP BY ${d}
11
11
  ORDER BY requests DESC, errors DESC, lastSeen DESC
12
- LIMIT ${f}`,b.params)}function K(a,b=null){return(a||[]).map(a=>(function(a={},b={}){let c=C(a.requests,0),d=C(a.errors,0),e=C(a.success,Math.max(0,c-d));return{key:B(a.key??a.metric_key)||"unknown",label:B(a.label||a.key||a.metric_key)||"unknown",requests:c,success:e,errors:d,errorRate:c?d/c:0,promptTokens:0,completionTokens:0,totalTokens:0,cost:0,lastSeen:B(a.lastSeen),topModels:[],topTools:[],topIps:[],...b}})(a,b?b(a):{}))}async function L(a,b){let c=a.type,d=await G(a);try{let e=function(a={},b){let c=function(a={}){return{keyword:B(a.keyword),model:B(a.model),stage:B(a.stage),sessionId:B(a.sessionId),clientIp:B(a.clientIp||a.sourceIp),sourceTool:B(a.sourceTool),dateFrom:B(a.dateFrom||a.startStored||a.startIso),dateTo:B(a.dateTo||a.endStored||a.endIso),workingTimeRanges:Array.isArray(a.workingTimeRanges)?a.workingTimeRanges:[]}}(a),d=[],e=[],f=a=>(e.push(a),"postgres"===b?`$${e.length}`:"?"),g="postgres"===b?"ILIKE":"LIKE";if(c.keyword){let a=`%${c.keyword}%`;d.push(`(${["prompt_text","response_text","error_text","model","endpoint","provider","account_name","connection_id","display_model","session_id","client_ip","client_host","client_user_agent","source_tool","source_tool_label","source_host"].map(b=>`${b} ${g} ${f(a)}`).join(" OR ")})`)}if(c.model&&d.push(`(model = ${f(c.model)} OR display_model = ${f(c.model)})`),c.stage&&d.push(`stage = ${f(c.stage)}`),c.sessionId&&d.push(`session_id = ${f(c.sessionId)}`),c.clientIp&&d.push(`client_ip ${g} ${f(`%${c.clientIp}%`)}`),c.sourceTool){let a=`%${c.sourceTool}%`;d.push(`(source_tool ${g} ${f(a)} OR source_tool_label ${g} ${f(a)} OR source_host ${g} ${f(a)})`)}let h=c.workingTimeRanges.filter(a=>a?.startIso&&a?.endIso);return h.length?d.push(`(${h.map(a=>`(created_at >= ${f(a.startIso)} AND created_at < ${f(a.endIso)})`).join(" OR ")})`):(c.dateFrom&&d.push(`created_at >= ${f(c.dateFrom)}`),c.dateTo&&d.push(`created_at < ${f(c.dateTo)}`)),{clause:d.length?`WHERE ${d.join(" AND ")}`:"",params:e,add:f}}(b,c),f=await d.queryOne(`SELECT COUNT(*) AS count FROM prompt_logs ${e.clause}`,e.params),g=C(f?.count,0),h=K(await J(d,e,"COALESCE(NULLIF(client_ip, ''), 'unknown') AS metric_key, COALESCE(NULLIF(client_ip, ''), 'unknown') AS label","COALESCE(NULLIF(client_ip, ''), 'unknown')")),i=K(await J(d,e,"COALESCE(NULLIF(source_tool_label, ''), NULLIF(source_tool, ''), NULLIF(source_host, ''), 'unknown') AS metric_key, COALESCE(NULLIF(source_tool_label, ''), NULLIF(source_tool, ''), NULLIF(source_host, ''), 'unknown') AS label","COALESCE(NULLIF(source_tool_label, ''), NULLIF(source_tool, ''), NULLIF(source_host, ''), 'unknown')")),j=K(await J(d,e,"COALESCE(NULLIF(session_id, ''), 'unknown') AS metric_key, COALESCE(NULLIF(session_id, ''), 'unknown') AS label","COALESCE(NULLIF(session_id, ''), 'unknown')")),k=K(await J(d,e,"COALESCE(NULLIF(stage, ''), 'unknown') AS metric_key, COALESCE(NULLIF(stage, ''), 'unknown') AS label","COALESCE(NULLIF(stage, ''), 'unknown')")),l=K(await J(d,e,"COALESCE(NULLIF(display_model, ''), NULLIF(model, ''), 'unknown') AS metric_key, COALESCE(NULLIF(display_model, ''), NULLIF(model, ''), 'unknown') AS label","COALESCE(NULLIF(display_model, ''), NULLIF(model, ''), 'unknown')")),m=K(await J(d,e,"COALESCE(NULLIF(account_name, ''), NULLIF(connection_id, ''), NULLIF(provider, ''), 'unknown') AS metric_key, COALESCE(NULLIF(account_name, ''), NULLIF(connection_id, ''), NULLIF(provider, ''), 'unknown') AS label","COALESCE(NULLIF(account_name, ''), NULLIF(connection_id, ''), NULLIF(provider, ''), 'unknown')")),n=K(await J(d,e,"CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 'error' ELSE COALESCE(CONCAT('', status_code), 'ok') END AS metric_key, CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 'error' ELSE COALESCE(CONCAT('', status_code), 'ok') END AS label","CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 'error' ELSE COALESCE(CONCAT('', status_code), 'ok') END")),o=await (0,z.DU)().catch(()=>({models:[],stages:[]}));return{total:g,sampled:g,disabled:!1,missing:!1,dbInfo:{type:a.type,host:a.host,database:a.database},models:o.models||[],stages:o.stages||[],topClientIps:h,topSourceTools:i,topSessions:j,topStages:k,topModels:l,topAccounts:m,topStatuses:n}}finally{await d.close()}}async function M(a={}){let b=await D();if(!b.enabled)return{disabled:!0,missing:!1,total:0,sampled:0,dbInfo:{type:b.type},models:[],stages:[],topClientIps:[],topSourceTools:[],topSessions:[],topStages:[],topModels:[],topAccounts:[],topStatuses:[]};if(await I(b),"postgres"===b.type||"mysql"===b.type)return L(b,a);throw Error(`Unsupported prompt log database type: ${b.type}`)}var N=c(35901),O=c(77638);let P=new Set(["today","todayWorking","yesterday","yesterdayWorking","24h","thisWeek","lastWeek","7d","thisMonth","lastMonth","30d","60d","all","custom"]),Q=Math.max(6e4,Math.min(18e5,Number(process.env.DASHBOARD_ANALYTICS_CACHE_TTL_MS)||3e5)),R=Math.max(Q,Math.min(864e5,Number(process.env.DASHBOARD_ANALYTICS_STALE_IF_ERROR_MS)||18e5)),S="today",T=process.env.DASHBOARD_ANALYTICS_TIME_ZONE||"Asia/Saigon",U=["Token Destroyer","Context Monarch","Prompt Titan","Output Overlord","Quota Crusher"],V="lower(trim(COALESCE(CAST(status AS TEXT), '')))",W=`(
13
- ${V} GLOB 'error*'
14
- OR ${V} GLOB 'fail*'
15
- OR ${V} GLOB 'failed*'
16
- OR ${V} GLOB 'timeout*'
17
- OR ${V} GLOB 'network*'
18
- OR ${V} GLOB 'aborted*'
19
- OR ${V} GLOB 'abort*'
20
- OR ${V} GLOB 'rate_limited*'
21
- OR ${V} GLOB 'provider_error*'
22
- OR ${V} GLOB 'gateway_error*'
23
- OR ${V} GLOB 'parse_error*'
24
- OR ${V} GLOB 'model_error*'
25
- )`,X=`(
26
- (COALESCE(statusCode, 0) BETWEEN 200 AND 299 AND NOT ${W})
27
- OR ${V} = ''
28
- OR ${V} IN ('ok', 'success', 'succeeded', 'complete', 'completed', 'done', '200')
29
- OR ${V} GLOB '2[0-9][0-9]*'
30
- OR ${V} GLOB 'ok*'
31
- OR ${V} GLOB 'success*'
32
- OR ${V} GLOB 'succeeded*'
33
- OR ${V} GLOB 'complete*'
34
- OR ${V} GLOB 'completed*'
35
- OR ${V} GLOB 'done*'
36
- )`,Y=`(
37
- ${V} IN ('pending', 'running', 'in_progress', 'queued', 'processing')
38
- )`,Z=`(NOT ${Y})`,$=`
39
- SUM(CASE WHEN ${Z} THEN 1 ELSE 0 END) AS requests,
40
- SUM(CASE WHEN ${Z} AND ${X} THEN 1 ELSE 0 END) AS success,
41
- SUM(CASE WHEN ${Z} AND NOT ${X} THEN 1 ELSE 0 END) AS errors,
42
- SUM(CASE WHEN ${Y} THEN 1 ELSE 0 END) AS pending,
43
- COALESCE(SUM(CASE WHEN ${Z} THEN COALESCE(promptTokens, 0) ELSE 0 END), 0) AS promptTokens,
44
- COALESCE(SUM(CASE WHEN ${Z} THEN COALESCE(completionTokens, 0) ELSE 0 END), 0) AS completionTokens,
45
- COALESCE(SUM(CASE WHEN ${Z} THEN COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0) ELSE 0 END), 0) AS totalTokens,
46
- COALESCE(SUM(CASE WHEN ${Z} THEN COALESCE(cachedTokens, 0) ELSE 0 END), 0) AS cachedTokens,
47
- COALESCE(SUM(CASE WHEN ${Z} THEN COALESCE(reasoningTokens, 0) ELSE 0 END), 0) AS reasoningTokens,
48
- COALESCE(SUM(CASE WHEN ${Z} THEN COALESCE(cost, 0) ELSE 0 END), 0) AS cost,
12
+ LIMIT ${f}`,b.params)}function K(a,b=null){return(a||[]).map(a=>(function(a={},b={}){let c=C(a.requests,0),d=C(a.errors,0),e=C(a.success,Math.max(0,c-d));return{key:B(a.key??a.metric_key)||"unknown",label:B(a.label||a.key||a.metric_key)||"unknown",requests:c,success:e,errors:d,errorRate:c?d/c:0,promptTokens:0,completionTokens:0,totalTokens:0,cost:0,lastSeen:B(a.lastSeen),topModels:[],topTools:[],topIps:[],...b}})(a,b?b(a):{}))}async function L(a,b){let c=a.type,d=await G(a);try{let e=function(a={},b){let c=function(a={}){return{keyword:B(a.keyword),model:B(a.model),stage:B(a.stage),sessionId:B(a.sessionId),clientIp:B(a.clientIp||a.sourceIp),sourceTool:B(a.sourceTool),dateFrom:B(a.dateFrom||a.startStored||a.startIso),dateTo:B(a.dateTo||a.endStored||a.endIso),workingTimeRanges:Array.isArray(a.workingTimeRanges)?a.workingTimeRanges:[]}}(a),d=[],e=[],f=a=>(e.push(a),"postgres"===b?`$${e.length}`:"?"),g="postgres"===b?"ILIKE":"LIKE";if(c.keyword){let a=`%${c.keyword}%`;d.push(`(${["prompt_text","response_text","error_text","model","endpoint","provider","account_name","connection_id","display_model","session_id","client_ip","client_host","client_user_agent","source_tool","source_tool_label","source_host"].map(b=>`${b} ${g} ${f(a)}`).join(" OR ")})`)}if(c.model&&d.push(`(model = ${f(c.model)} OR display_model = ${f(c.model)})`),c.stage&&d.push(`stage = ${f(c.stage)}`),c.sessionId&&d.push(`session_id = ${f(c.sessionId)}`),c.clientIp&&d.push(`client_ip ${g} ${f(`%${c.clientIp}%`)}`),c.sourceTool){let a=`%${c.sourceTool}%`;d.push(`(source_tool ${g} ${f(a)} OR source_tool_label ${g} ${f(a)} OR source_host ${g} ${f(a)})`)}let h=c.workingTimeRanges.filter(a=>a?.startIso&&a?.endIso);return h.length?d.push(`(${h.map(a=>`(created_at >= ${f(a.startIso)} AND created_at < ${f(a.endIso)})`).join(" OR ")})`):(c.dateFrom&&d.push(`created_at >= ${f(c.dateFrom)}`),c.dateTo&&d.push(`created_at < ${f(c.dateTo)}`)),{clause:d.length?`WHERE ${d.join(" AND ")}`:"",params:e,add:f}}(b,c),f=await d.queryOne(`SELECT COUNT(*) AS count FROM prompt_logs ${e.clause}`,e.params),g=C(f?.count,0),h=K(await J(d,e,"COALESCE(NULLIF(client_ip, ''), 'unknown') AS metric_key, COALESCE(NULLIF(client_ip, ''), 'unknown') AS label","COALESCE(NULLIF(client_ip, ''), 'unknown')")),i=K(await J(d,e,"COALESCE(NULLIF(source_tool_label, ''), NULLIF(source_tool, ''), NULLIF(source_host, ''), 'unknown') AS metric_key, COALESCE(NULLIF(source_tool_label, ''), NULLIF(source_tool, ''), NULLIF(source_host, ''), 'unknown') AS label","COALESCE(NULLIF(source_tool_label, ''), NULLIF(source_tool, ''), NULLIF(source_host, ''), 'unknown')")),j=K(await J(d,e,"COALESCE(NULLIF(session_id, ''), 'unknown') AS metric_key, COALESCE(NULLIF(session_id, ''), 'unknown') AS label","COALESCE(NULLIF(session_id, ''), 'unknown')")),k=K(await J(d,e,"COALESCE(NULLIF(stage, ''), 'unknown') AS metric_key, COALESCE(NULLIF(stage, ''), 'unknown') AS label","COALESCE(NULLIF(stage, ''), 'unknown')")),l=K(await J(d,e,"COALESCE(NULLIF(display_model, ''), NULLIF(model, ''), 'unknown') AS metric_key, COALESCE(NULLIF(display_model, ''), NULLIF(model, ''), 'unknown') AS label","COALESCE(NULLIF(display_model, ''), NULLIF(model, ''), 'unknown')")),m=K(await J(d,e,"COALESCE(NULLIF(account_name, ''), NULLIF(connection_id, ''), NULLIF(provider, ''), 'unknown') AS metric_key, COALESCE(NULLIF(account_name, ''), NULLIF(connection_id, ''), NULLIF(provider, ''), 'unknown') AS label","COALESCE(NULLIF(account_name, ''), NULLIF(connection_id, ''), NULLIF(provider, ''), 'unknown')")),n=K(await J(d,e,"CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 'error' ELSE COALESCE(CONCAT('', status_code), 'ok') END AS metric_key, CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 'error' ELSE COALESCE(CONCAT('', status_code), 'ok') END AS label","CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 'error' ELSE COALESCE(CONCAT('', status_code), 'ok') END")),o=await (0,z.DU)().catch(()=>({models:[],stages:[]}));return{total:g,sampled:g,disabled:!1,missing:!1,dbInfo:{type:a.type,host:a.host,database:a.database},models:o.models||[],stages:o.stages||[],topClientIps:h,topSourceTools:i,topSessions:j,topStages:k,topModels:l,topAccounts:m,topStatuses:n}}finally{await d.close()}}async function M(a={}){let b=await D();if(!b.enabled)return{disabled:!0,missing:!1,total:0,sampled:0,dbInfo:{type:b.type},models:[],stages:[],topClientIps:[],topSourceTools:[],topSessions:[],topStages:[],topModels:[],topAccounts:[],topStatuses:[]};if(await I(b),"postgres"===b.type||"mysql"===b.type)return L(b,a);throw Error(`Unsupported prompt log database type: ${b.type}`)}var N=c(35901),O=c(77638);let P=new Set(["today","todayWorking","yesterday","yesterdayWorking","24h","thisWeek","lastWeek","7d","thisMonth","lastMonth","30d","60d","all","custom"]),Q="today",R=process.env.DASHBOARD_ANALYTICS_TIME_ZONE||"Asia/Saigon",S=["Token Destroyer","Context Monarch","Prompt Titan","Output Overlord","Quota Crusher"],T="lower(trim(COALESCE(CAST(status AS TEXT), '')))",U=`(
13
+ ${T} GLOB 'error*'
14
+ OR ${T} GLOB 'fail*'
15
+ OR ${T} GLOB 'failed*'
16
+ OR ${T} GLOB 'timeout*'
17
+ OR ${T} GLOB 'network*'
18
+ OR ${T} GLOB 'aborted*'
19
+ OR ${T} GLOB 'abort*'
20
+ OR ${T} GLOB 'rate_limited*'
21
+ OR ${T} GLOB 'provider_error*'
22
+ OR ${T} GLOB 'gateway_error*'
23
+ OR ${T} GLOB 'parse_error*'
24
+ OR ${T} GLOB 'model_error*'
25
+ )`,V=`(
26
+ (COALESCE(statusCode, 0) BETWEEN 200 AND 299 AND NOT ${U})
27
+ OR ${T} = ''
28
+ OR ${T} IN ('ok', 'success', 'succeeded', 'complete', 'completed', 'done', '200')
29
+ OR ${T} GLOB '2[0-9][0-9]*'
30
+ OR ${T} GLOB 'ok*'
31
+ OR ${T} GLOB 'success*'
32
+ OR ${T} GLOB 'succeeded*'
33
+ OR ${T} GLOB 'complete*'
34
+ OR ${T} GLOB 'completed*'
35
+ OR ${T} GLOB 'done*'
36
+ )`,W=`(
37
+ ${T} IN ('pending', 'running', 'in_progress', 'queued', 'processing')
38
+ )`,X=`(NOT ${W})`,Y=`
39
+ SUM(CASE WHEN ${X} THEN 1 ELSE 0 END) AS requests,
40
+ SUM(CASE WHEN ${X} AND ${V} THEN 1 ELSE 0 END) AS success,
41
+ SUM(CASE WHEN ${X} AND NOT ${V} THEN 1 ELSE 0 END) AS errors,
42
+ SUM(CASE WHEN ${W} THEN 1 ELSE 0 END) AS pending,
43
+ COALESCE(SUM(CASE WHEN ${X} THEN COALESCE(promptTokens, 0) ELSE 0 END), 0) AS promptTokens,
44
+ COALESCE(SUM(CASE WHEN ${X} THEN COALESCE(completionTokens, 0) ELSE 0 END), 0) AS completionTokens,
45
+ COALESCE(SUM(CASE WHEN ${X} THEN COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0) ELSE 0 END), 0) AS totalTokens,
46
+ COALESCE(SUM(CASE WHEN ${X} THEN COALESCE(cachedTokens, 0) ELSE 0 END), 0) AS cachedTokens,
47
+ COALESCE(SUM(CASE WHEN ${X} THEN COALESCE(reasoningTokens, 0) ELSE 0 END), 0) AS reasoningTokens,
48
+ COALESCE(SUM(CASE WHEN ${X} THEN COALESCE(cost, 0) ELSE 0 END), 0) AS cost,
49
49
  MAX(timestamp) AS lastSeen
50
- `;function _(a){return String(a||"").trim()}function aa(a){return _(a).toLowerCase()}function ab(a,b=0){let c=Number(a);return Number.isFinite(c)?c:b}function ac(a){let b=_(a);if(!b)return"";let c=new Date(b);return Number.isNaN(c.getTime())?"":c.toISOString()}function ad(a,b){let c=new Intl.DateTimeFormat("en-CA",{timeZone:b,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).formatToParts(a),d={};for(let a of c)"literal"!==a.type&&(d[a.type]=Number(a.value));return d}function ae(a,b){let c=ad(a,b);return Date.UTC(c.year,c.month-1,c.day,c.hour,c.minute,c.second||0)-a.getTime()}function af(a,b,c,d,e=0,f=0,g=0,h=0){let i=new Date(Date.UTC(b,c-1,d,e,f,g,h)),j=ae(i,a);return j=ae(i=new Date(i.getTime()-j),a),new Date(Date.UTC(b,c-1,d,e,f,g,h)-j)}function ag(a,b){let c=ad(a,b);return{year:c.year,month:c.month,day:c.day}}function ah(a,b){return[{from:[8,0],to:[12,0]},{from:[13,15],to:[17,15]}].map(c=>{let d=af(b,a.year,a.month,a.day,c.from[0],c.from[1]),e=af(b,a.year,a.month,a.day,c.to[0],c.to[1]);return{start:d,end:e,startIso:d.toISOString(),endIso:e.toISOString()}})}function ai(a=new Date){let b=new Date(a);return b.setHours(0,0,0,0),b}function aj(a,b){let c=new Date(a);return c.setDate(c.getDate()+b),c}function ak(a=new Date){let b=ai(a),c=b.getDay();return aj(b,0===c?-6:1-c)}function al(a=new Date){let b=new Date(a);return b.setDate(1),b.setHours(0,0,0,0),b}function am(a={},b={}){var c;return{...function(a={},b=null){let c=P.has(a.period)?a.period:"24h",d=function(a){let b=_(a);if(!b)return"UTC";try{return new Intl.DateTimeFormat("en-US",{timeZone:b}).format(new Date),b}catch{return"UTC"}}(a.timeZone),e=b?new Date(b):new Date,f=Number.isNaN(e.getTime())?new Date:e,g=null,h=f,i=[];if("custom"===c){let b=ac(a.dateFrom),c=ac(a.dateTo);g=new Date(b||f.getTime()-864e5),h=c?new Date(c):f}else if("today"===c)g=ai(f);else if("todayWorking"===c)i=ah(ag(f,d),d),g=i[0]?.start||ai(f),h=i[i.length-1]?.end||f;else if("yesterday"===c){let a=ai(f);g=aj(a,-1),h=a}else if("yesterdayWorking"===c)i=ah(function({year:a,month:b,day:c}){let d=new Date(Date.UTC(a,b-1,c));return d.setUTCDate(d.getUTCDate()+-1),{year:d.getUTCFullYear(),month:d.getUTCMonth()+1,day:d.getUTCDate()}}(ag(f,d)),d),g=i[0]?.start||aj(ai(f),-1),h=i[i.length-1]?.end||ai(f);else if("24h"===c)g=new Date(f.getTime()-864e5);else if("thisWeek"===c)g=ak(f);else if("lastWeek"===c){let a=ak(f);g=aj(a,-7),h=a}else if("7d"===c)g=new Date(f.getTime()-6048e5);else if("thisMonth"===c)g=al(f);else if("lastMonth"===c){let a=al(f);(g=new Date(a)).setMonth(g.getMonth()-1),h=a}else g="30d"===c?new Date(f.getTime()-2592e6):"60d"===c?new Date(f.getTime()-5184e6):null;if(g&&h&&g>h){let a=g;g=h,h=a}return{period:c,timeZone:d,start:g,end:h,startIso:g?g.toISOString():"",endIso:h?h.toISOString():"",workingTimeRanges:i}}(a,b.now),provider:_(a.provider),model:_(a.model),connectionId:_(a.connectionId),status:_(a.status),endpoint:_(a.endpoint),apiKey:_(a.apiKey),clientIp:_(a.clientIp||a.sourceIp),sourceTool:_(a.sourceTool),sessionId:_(a.sessionId),keyword:_(a.keyword),maxPromptLogRows:Math.max(200,Math.min(1500,Math.floor(ab(a.maxPromptLogRows,1500)))),userOwnedOnly:!0===a.userOwnedOnly||"1"===a.userOwnedOnly||"true"===a.userOwnedOnly,ownerCandidates:Array.isArray(c=a.ownerCandidates)?[...new Set(c.map(a=>aa(a)).filter(Boolean))].sort():[...new Set(String(c||"").split(/[,\s]+/).map(a=>aa(a)).filter(Boolean))].sort(),ownedAnyUserOnly:!0===a.ownedAnyUserOnly||"1"===a.ownedAnyUserOnly||"true"===a.ownedAnyUserOnly}}function an(a){let b,c=_(a);return c?(b=_(c))?b.length<=12?b:`${b.slice(0,8)}...${b.slice(-4)}`:"local-no-key":"local-no-key"}async function ao(a){try{let b=await a.all("SELECT * FROM apiKeys ORDER BY createdAt DESC")||[],c=new Map,d=new Map,e=[];for(let a of b){let b=function(a={}){let b=_(a.key),c=an(b);return{id:_(a.id),key:b,fingerprint:c,masked:c,name:_(a.name)||c,ownerUser:_(a.ownerUser||a.owner_user),createdByUser:_(a.createdByUser||a.created_by_user),machineId:_(a.machineId||a.machine_id),isActive:void 0===a.isActive||1===a.isActive||!0===a.isActive,createdAt:_(a.createdAt||a.created_at)}}(a);e.push(b),b.key&&c.set(b.key,b),d.set(b.fingerprint,b)}return{rows:b,all:e,byKey:c,byFingerprint:d}}catch{return{rows:[],all:[],byKey:new Map,byFingerprint:new Map}}}async function ap(a){let b=new Map;try{for(let c of await a.all("SELECT id, provider, name, email, isActive FROM providerConnections")||[])b.set(c.id,{id:c.id,provider:c.provider||"",name:c.name||c.email||c.id,email:c.email||"",isActive:1===c.isActive||!0===c.isActive})}catch{}try{for(let c of await a.all("SELECT id, type, name FROM providerNodes")||[]){let a=_(c.id);if(!a)continue;let d=_(c.name)||a;b.set(a,{id:a,provider:a,type:_(c.type),name:d,isProviderNode:!0})}}catch{}return b}function aq(a,b=new Map){let c=_(a);if(!c)return"unknown";let d=b.get(c);if(d?.name)return d.name;let e=[...b.values()].filter(a=>a.provider===c&&a.name&&a.name!==c);return 1===e.length?e[0].name:c}function ar(a){let b=ab(a.errors,0),c=ab(a.success,0),d=ab(a.pending,0),e=ab(a.requests,c+b),f=ab(a.promptTokens,0),g=ab(a.completionTokens,0),h=ab(a.totalTokens,f+g),i=c+b||e;return{...a,requests:e,success:c,errors:b,pending:d,totalTokens:h,errorRate:i?b/i:0,avgPromptTokens:e?f/e:0,avgCompletionTokens:e?g/e:0,avgTokens:e?h/e:0}}function as(a,b,c,d,e=!1){let f=Array.isArray(d.workingTimeRanges)?d.workingTimeRanges.filter(a=>a?.startIso&&a?.endIso):[];if(f.length){let d=e?"<=":"<";for(let e of(a.push(`(${f.map(()=>`(${c} >= ? AND ${c} ${d} ?)`).join(" OR ")})`),f))b.push(e.startIso,e.endIso);return}d.startIso&&(a.push(`${c} >= ?`),b.push(d.startIso)),d.endIso&&(a.push(`${c} ${e?"<=":"<"} ?`),b.push(d.endIso))}function at(a,b=null,c={}){let d=[],e=[];if(as(d,e,"timestamp",a,!1),a.provider&&"provider"!==c.skip&&(d.push("provider = ?"),e.push(a.provider)),a.model&&"model"!==c.skip&&(d.push("model = ?"),e.push(a.model)),a.connectionId&&"connectionId"!==c.skip&&(d.push("connectionId = ?"),e.push(a.connectionId)),a.status&&"status"!==c.skip&&(d.push("status = ?"),e.push(a.status)),a.endpoint&&"endpoint"!==c.skip&&(d.push("endpoint = ?"),e.push(a.endpoint)),b&&"apiKey"!==c.skip)if(b.noMatch)d.push("1 = 0");else{let a=[];if((b.keys||[]).length>0){let c=b.keys.map(()=>"?").join(", ");a.push(`(apiKey IN (${c}) OR apiKeyFingerprint IN (${c}) OR apiKeyId IN (${c}))`),e.push(...b.keys,...b.keys,...b.keys)}if(b.filter){a.push("(apiKeyFingerprint LIKE ? OR apiKeyName LIKE ? OR apiKeyOwner LIKE ? OR apiKeyId LIKE ?)");let c=`%${b.filter}%`;e.push(c,c,c,c)}b.includeLocal&&a.push("(apiKey IS NULL OR apiKey = '' OR apiKeyFingerprint = 'local-no-key')"),a.length&&d.push(`(${a.join(" OR ")})`)}let f=a.ownerScope;if(f?.enabled&&"apiKey"!==c.skip)if(f.noMatch)d.push("1 = 0");else{let a=[];if((f.identifiers||[]).length>0){let b=f.identifiers.map(()=>"?").join(", ");a.push(`(apiKey IN (${b}) OR apiKeyFingerprint IN (${b}) OR apiKeyId IN (${b}))`),e.push(...f.identifiers,...f.identifiers,...f.identifiers)}if((f.owners||[]).length>0){let b=f.owners.map(()=>"?").join(", ");a.push(`lower(COALESCE(apiKeyOwner, '')) IN (${b})`),e.push(...f.owners)}d.push(a.length?`(${a.join(" OR ")})`:"1 = 0")}if(a.clientIp&&"clientIp"!==c.skip&&(d.push("clientIpNormalized LIKE ?"),e.push(`%${a.clientIp}%`)),a.sourceTool&&"sourceTool"!==c.skip){d.push("(sourceTool LIKE ? OR sourceToolLabel LIKE ? OR sourceHost LIKE ?)");let b=`%${a.sourceTool}%`;e.push(b,b,b)}return a.sessionId&&"sessionId"!==c.skip&&(d.push("sessionId = ?"),e.push(a.sessionId)),{clause:d.length?`WHERE ${d.join(" AND ")}`:"",params:e}}function au(a,b){return Math.floor(a/b)*b}async function av(a,b,c){let d=at(b,c);return await a.get(`SELECT MIN(timestamp) AS minTs, MAX(timestamp) AS maxTs FROM usageHistory ${d.clause}`,d.params)||{}}async function aw(a,b,c){let d=at(b,c),e=await a.get(`SELECT
51
- ${$},
50
+ `;function Z(a){return String(a||"").trim()}function $(a){return Z(a).toLowerCase()}function _(a,b=0){let c=Number(a);return Number.isFinite(c)?c:b}function aa(a){let b=Z(a);if(!b)return"";let c=new Date(b);return Number.isNaN(c.getTime())?"":c.toISOString()}function ab(a,b){let c=new Intl.DateTimeFormat("en-CA",{timeZone:b,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).formatToParts(a),d={};for(let a of c)"literal"!==a.type&&(d[a.type]=Number(a.value));return d}function ac(a,b){let c=ab(a,b);return Date.UTC(c.year,c.month-1,c.day,c.hour,c.minute,c.second||0)-a.getTime()}function ad(a,b,c,d,e=0,f=0,g=0,h=0){let i=new Date(Date.UTC(b,c-1,d,e,f,g,h)),j=ac(i,a);return j=ac(i=new Date(i.getTime()-j),a),new Date(Date.UTC(b,c-1,d,e,f,g,h)-j)}function ae(a,b){let c=ab(a,b);return{year:c.year,month:c.month,day:c.day}}function af(a,b){return[{from:[8,0],to:[12,0]},{from:[13,15],to:[17,15]}].map(c=>{let d=ad(b,a.year,a.month,a.day,c.from[0],c.from[1]),e=ad(b,a.year,a.month,a.day,c.to[0],c.to[1]);return{start:d,end:e,startIso:d.toISOString(),endIso:e.toISOString()}})}function ag(a=new Date){let b=new Date(a);return b.setHours(0,0,0,0),b}function ah(a,b){let c=new Date(a);return c.setDate(c.getDate()+b),c}function ai(a=new Date){let b=ag(a),c=b.getDay();return ah(b,0===c?-6:1-c)}function aj(a=new Date){let b=new Date(a);return b.setDate(1),b.setHours(0,0,0,0),b}function ak(a={}){var b;return{...function(a={}){let b=P.has(a.period)?a.period:"24h",c=function(a){let b=Z(a);if(!b)return"UTC";try{return new Intl.DateTimeFormat("en-US",{timeZone:b}).format(new Date),b}catch{return"UTC"}}(a.timeZone),d=new Date,e=null,f=d,g=[];if("custom"===b){let b=aa(a.dateFrom),c=aa(a.dateTo);e=new Date(b||d.getTime()-864e5),f=c?new Date(c):d}else if("today"===b)e=ag(d);else if("todayWorking"===b)g=af(ae(d,c),c),e=g[0]?.start||ag(d),f=g[g.length-1]?.end||d;else if("yesterday"===b){let a=ag(d);e=ah(a,-1),f=a}else if("yesterdayWorking"===b)g=af(function({year:a,month:b,day:c}){let d=new Date(Date.UTC(a,b-1,c));return d.setUTCDate(d.getUTCDate()+-1),{year:d.getUTCFullYear(),month:d.getUTCMonth()+1,day:d.getUTCDate()}}(ae(d,c)),c),e=g[0]?.start||ah(ag(d),-1),f=g[g.length-1]?.end||ag(d);else if("24h"===b)e=new Date(d.getTime()-864e5);else if("thisWeek"===b)e=ai(d);else if("lastWeek"===b){let a=ai(d);e=ah(a,-7),f=a}else if("7d"===b)e=new Date(d.getTime()-6048e5);else if("thisMonth"===b)e=aj(d);else if("lastMonth"===b){let a=aj(d);(e=new Date(a)).setMonth(e.getMonth()-1),f=a}else e="30d"===b?new Date(d.getTime()-2592e6):"60d"===b?new Date(d.getTime()-5184e6):null;if(e&&f&&e>f){let a=e;e=f,f=a}return{period:b,timeZone:c,start:e,end:f,startIso:e?e.toISOString():"",endIso:f?f.toISOString():"",workingTimeRanges:g}}(a),provider:Z(a.provider),model:Z(a.model),connectionId:Z(a.connectionId),status:Z(a.status),endpoint:Z(a.endpoint),apiKey:Z(a.apiKey),clientIp:Z(a.clientIp||a.sourceIp),sourceTool:Z(a.sourceTool),sessionId:Z(a.sessionId),keyword:Z(a.keyword),maxPromptLogRows:Math.max(200,Math.min(1500,Math.floor(_(a.maxPromptLogRows,1500)))),userOwnedOnly:!0===a.userOwnedOnly||"1"===a.userOwnedOnly||"true"===a.userOwnedOnly,ownerCandidates:Array.isArray(b=a.ownerCandidates)?[...new Set(b.map(a=>$(a)).filter(Boolean))]:[...new Set(String(b||"").split(/[,\s]+/).map(a=>$(a)).filter(Boolean))],ownedAnyUserOnly:!0===a.ownedAnyUserOnly||"1"===a.ownedAnyUserOnly||"true"===a.ownedAnyUserOnly}}function al(a){let b,c=Z(a);return c?(b=Z(c))?b.length<=12?b:`${b.slice(0,8)}...${b.slice(-4)}`:"local-no-key":"local-no-key"}async function am(a){try{let b=await a.all("SELECT * FROM apiKeys ORDER BY createdAt DESC")||[],c=new Map,d=new Map,e=[];for(let a of b){let b=function(a={}){let b=Z(a.key),c=al(b);return{id:Z(a.id),key:b,fingerprint:c,masked:c,name:Z(a.name)||c,ownerUser:Z(a.ownerUser||a.owner_user),createdByUser:Z(a.createdByUser||a.created_by_user),machineId:Z(a.machineId||a.machine_id),isActive:void 0===a.isActive||1===a.isActive||!0===a.isActive,createdAt:Z(a.createdAt||a.created_at)}}(a);e.push(b),b.key&&c.set(b.key,b),d.set(b.fingerprint,b)}return{rows:b,all:e,byKey:c,byFingerprint:d}}catch{return{rows:[],all:[],byKey:new Map,byFingerprint:new Map}}}async function an(a){let b=new Map;try{for(let c of await a.all("SELECT id, provider, name, email, isActive FROM providerConnections")||[])b.set(c.id,{id:c.id,provider:c.provider||"",name:c.name||c.email||c.id,email:c.email||"",isActive:1===c.isActive||!0===c.isActive})}catch{}try{for(let c of await a.all("SELECT id, type, name FROM providerNodes")||[]){let a=Z(c.id);if(!a)continue;let d=Z(c.name)||a;b.set(a,{id:a,provider:a,type:Z(c.type),name:d,isProviderNode:!0})}}catch{}return b}function ao(a,b=new Map){let c=Z(a);if(!c)return"unknown";let d=b.get(c);if(d?.name)return d.name;let e=[...b.values()].filter(a=>a.provider===c&&a.name&&a.name!==c);return 1===e.length?e[0].name:c}function ap(a){let b=_(a.errors,0),c=_(a.success,0),d=_(a.pending,0),e=_(a.requests,c+b),f=_(a.promptTokens,0),g=_(a.completionTokens,0),h=_(a.totalTokens,f+g),i=c+b||e;return{...a,requests:e,success:c,errors:b,pending:d,totalTokens:h,errorRate:i?b/i:0,avgPromptTokens:e?f/e:0,avgCompletionTokens:e?g/e:0,avgTokens:e?h/e:0}}function aq(a,b,c,d,e=!1){let f=Array.isArray(d.workingTimeRanges)?d.workingTimeRanges.filter(a=>a?.startIso&&a?.endIso):[];if(f.length){let d=e?"<=":"<";for(let e of(a.push(`(${f.map(()=>`(${c} >= ? AND ${c} ${d} ?)`).join(" OR ")})`),f))b.push(e.startIso,e.endIso);return}d.startIso&&(a.push(`${c} >= ?`),b.push(d.startIso)),d.endIso&&(a.push(`${c} ${e?"<=":"<"} ?`),b.push(d.endIso))}function ar(a,b=null,c={}){let d=[],e=[];if(aq(d,e,"timestamp",a,!1),a.provider&&"provider"!==c.skip&&(d.push("provider = ?"),e.push(a.provider)),a.model&&"model"!==c.skip&&(d.push("model = ?"),e.push(a.model)),a.connectionId&&"connectionId"!==c.skip&&(d.push("connectionId = ?"),e.push(a.connectionId)),a.status&&"status"!==c.skip&&(d.push("status = ?"),e.push(a.status)),a.endpoint&&"endpoint"!==c.skip&&(d.push("endpoint = ?"),e.push(a.endpoint)),b&&"apiKey"!==c.skip)if(b.noMatch)d.push("1 = 0");else{let a=[];if((b.keys||[]).length>0){let c=b.keys.map(()=>"?").join(", ");a.push(`(apiKey IN (${c}) OR apiKeyFingerprint IN (${c}) OR apiKeyId IN (${c}))`),e.push(...b.keys,...b.keys,...b.keys)}if(b.filter){a.push("(apiKeyFingerprint LIKE ? OR apiKeyName LIKE ? OR apiKeyOwner LIKE ? OR apiKeyId LIKE ?)");let c=`%${b.filter}%`;e.push(c,c,c,c)}b.includeLocal&&a.push("(apiKey IS NULL OR apiKey = '' OR apiKeyFingerprint = 'local-no-key')"),a.length&&d.push(`(${a.join(" OR ")})`)}let f=a.ownerScope;if(f?.enabled&&"apiKey"!==c.skip)if(f.noMatch)d.push("1 = 0");else{let a=[];if((f.identifiers||[]).length>0){let b=f.identifiers.map(()=>"?").join(", ");a.push(`(apiKey IN (${b}) OR apiKeyFingerprint IN (${b}) OR apiKeyId IN (${b}))`),e.push(...f.identifiers,...f.identifiers,...f.identifiers)}if((f.owners||[]).length>0){let b=f.owners.map(()=>"?").join(", ");a.push(`lower(COALESCE(apiKeyOwner, '')) IN (${b})`),e.push(...f.owners)}d.push(a.length?`(${a.join(" OR ")})`:"1 = 0")}if(a.clientIp&&"clientIp"!==c.skip&&(d.push("clientIpNormalized LIKE ?"),e.push(`%${a.clientIp}%`)),a.sourceTool&&"sourceTool"!==c.skip){d.push("(sourceTool LIKE ? OR sourceToolLabel LIKE ? OR sourceHost LIKE ?)");let b=`%${a.sourceTool}%`;e.push(b,b,b)}return a.sessionId&&"sessionId"!==c.skip&&(d.push("sessionId = ?"),e.push(a.sessionId)),{clause:d.length?`WHERE ${d.join(" AND ")}`:"",params:e}}function as(a,b){return Math.floor(a/b)*b}async function at(a,b,c){let d=ar(b,c);return await a.get(`SELECT MIN(timestamp) AS minTs, MAX(timestamp) AS maxTs FROM usageHistory ${d.clause}`,d.params)||{}}async function au(a,b,c){let d=ar(b,c),e=await a.get(`SELECT
51
+ ${Y},
52
52
  COUNT(DISTINCT COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''))) AS activeApiKeys,
53
53
  COUNT(DISTINCT NULLIF(provider, '')) AS activeProviders,
54
54
  COUNT(DISTINCT NULLIF(model, '')) AS activeModels,
55
55
  COUNT(DISTINCT NULLIF(endpoint, '')) AS activeEndpoints
56
56
  FROM usageHistory
57
- ${d.clause}`,d.params)||{},f=function(a={}){return ar({requests:ab(a.requests,0),success:ab(a.success,0),errors:ab(a.errors,0),pending:ab(a.pending,0),promptTokens:ab(a.promptTokens,0),completionTokens:ab(a.completionTokens,0),totalTokens:ab(a.totalTokens,0),cachedTokens:ab(a.cachedTokens,0),reasoningTokens:ab(a.reasoningTokens,0),cost:ab(a.cost,0),lastSeen:a.lastSeen||""})}(e),g=b.start&&b.end?Math.max(1,(b.end.getTime()-b.start.getTime())/6e4):1;return{...f,activeApiKeys:ab(e.activeApiKeys,0),activeProviders:ab(e.activeProviders,0),activeModels:ab(e.activeModels,0),activeEndpoints:ab(e.activeEndpoints,0),requestsPerMinute:f.requests/g,tokensPerMinute:f.totalTokens/g,inputOutputRatio:f.completionTokens?f.promptTokens/f.completionTokens:f.promptTokens?null:0}}function ax(a,b={}){return ar({key:_(a.key)||"unknown",label:_(a.label||a.key)||"unknown",requests:ab(a.requests,0),success:ab(a.success,0),errors:ab(a.errors,0),pending:ab(a.pending,0),promptTokens:ab(a.promptTokens,0),completionTokens:ab(a.completionTokens,0),totalTokens:ab(a.totalTokens,0),cachedTokens:ab(a.cachedTokens,0),reasoningTokens:ab(a.reasoningTokens,0),cost:ab(a.cost,0),lastSeen:a.lastSeen||"",...b})}async function ay(a,b,c,d,e,f=[],g=50,h="requests DESC, totalTokens DESC"){let i=at(b,c);return await a.all(`SELECT
57
+ ${d.clause}`,d.params)||{},f=function(a={}){return ap({requests:_(a.requests,0),success:_(a.success,0),errors:_(a.errors,0),pending:_(a.pending,0),promptTokens:_(a.promptTokens,0),completionTokens:_(a.completionTokens,0),totalTokens:_(a.totalTokens,0),cachedTokens:_(a.cachedTokens,0),reasoningTokens:_(a.reasoningTokens,0),cost:_(a.cost,0),lastSeen:a.lastSeen||""})}(e),g=b.start&&b.end?Math.max(1,(b.end.getTime()-b.start.getTime())/6e4):1;return{...f,activeApiKeys:_(e.activeApiKeys,0),activeProviders:_(e.activeProviders,0),activeModels:_(e.activeModels,0),activeEndpoints:_(e.activeEndpoints,0),requestsPerMinute:f.requests/g,tokensPerMinute:f.totalTokens/g,inputOutputRatio:f.completionTokens?f.promptTokens/f.completionTokens:f.promptTokens?null:0}}function av(a,b={}){return ap({key:Z(a.key)||"unknown",label:Z(a.label||a.key)||"unknown",requests:_(a.requests,0),success:_(a.success,0),errors:_(a.errors,0),pending:_(a.pending,0),promptTokens:_(a.promptTokens,0),completionTokens:_(a.completionTokens,0),totalTokens:_(a.totalTokens,0),cachedTokens:_(a.cachedTokens,0),reasoningTokens:_(a.reasoningTokens,0),cost:_(a.cost,0),lastSeen:a.lastSeen||"",...b})}async function aw(a,b,c,d,e,f=[],g=50,h="requests DESC, totalTokens DESC"){let i=ar(b,c);return await a.all(`SELECT
58
58
  ${d},
59
- ${$}
59
+ ${Y}
60
60
  FROM usageHistory
61
61
  ${i.clause}
62
62
  GROUP BY ${e}
63
63
  ORDER BY ${h}
64
- LIMIT ?`,[...f,...i.params,g])||[]}async function az(a,b,c,d,e=new Map){let f=at(b,c),g=f.clause?`${f.clause} AND ${Z}`:`WHERE ${Z}`,h=`COALESCE(NULLIF(${d}, ''), 'unknown')`,i=await a.all(`SELECT
64
+ LIMIT ?`,[...f,...i.params,g])||[]}async function ax(a,b,c,d,e=new Map){let f=ar(b,c),g=f.clause?`${f.clause} AND ${X}`:`WHERE ${X}`,h=`COALESCE(NULLIF(${d}, ''), 'unknown')`,i=await a.all(`SELECT
65
65
  COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS apiKeyGroupKey,
66
66
  ${h} AS itemKey,
67
67
  COUNT(*) AS requests,
@@ -70,46 +70,46 @@
70
70
  FROM usageHistory
71
71
  ${g}
72
72
  GROUP BY COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key'), ${h}
73
- ORDER BY apiKeyGroupKey ASC, requests DESC, totalTokens DESC`,f.params)||[],j=new Map;for(let a of i){let b=_(a.itemKey)||"unknown",c="provider"===d?aq(b,e):b;!function(a,b,c,d=3){if(!b||!c?.key)return;let e=a.get(b)||[];e.push(c),e.sort((a,b)=>b.requests-a.requests||b.totalTokens-a.totalTokens||String(a.label).localeCompare(String(b.label))),a.set(b,e.slice(0,d))}(j,a.apiKeyGroupKey,{key:b,label:c,requests:ab(a.requests,0),totalTokens:ab(a.totalTokens,0),lastSeen:a.lastSeen||""})}return j}async function aA(a,b,c,d,e){let f=await ay(a,b,e,"COALESCE(NULLIF(provider, ''), 'unknown') AS key, COALESCE(NULLIF(provider, ''), 'unknown') AS label","COALESCE(NULLIF(provider, ''), 'unknown')"),g=await ay(a,b,e,`
73
+ ORDER BY apiKeyGroupKey ASC, requests DESC, totalTokens DESC`,f.params)||[],j=new Map;for(let a of i){let b=Z(a.itemKey)||"unknown",c="provider"===d?ao(b,e):b;!function(a,b,c,d=3){if(!b||!c?.key)return;let e=a.get(b)||[];e.push(c),e.sort((a,b)=>b.requests-a.requests||b.totalTokens-a.totalTokens||String(a.label).localeCompare(String(b.label))),a.set(b,e.slice(0,d))}(j,a.apiKeyGroupKey,{key:b,label:c,requests:_(a.requests,0),totalTokens:_(a.totalTokens,0),lastSeen:a.lastSeen||""})}return j}async function ay(a,b,c,d,e){let f=await aw(a,b,e,"COALESCE(NULLIF(provider, ''), 'unknown') AS key, COALESCE(NULLIF(provider, ''), 'unknown') AS label","COALESCE(NULLIF(provider, ''), 'unknown')"),g=await aw(a,b,e,`
74
74
  COALESCE(NULLIF(provider, ''), 'unknown') || '|' || COALESCE(NULLIF(model, ''), 'unknown') AS key,
75
75
  COALESCE(NULLIF(provider, ''), 'unknown') AS provider,
76
76
  COALESCE(NULLIF(model, ''), 'unknown') AS model,
77
77
  COALESCE(NULLIF(model, ''), 'unknown') || ' (' || COALESCE(NULLIF(provider, ''), 'unknown') || ')' AS label
78
- `,"COALESCE(NULLIF(provider, ''), 'unknown'), COALESCE(NULLIF(model, ''), 'unknown')"),h=await ay(a,b,e,`
78
+ `,"COALESCE(NULLIF(provider, ''), 'unknown'), COALESCE(NULLIF(model, ''), 'unknown')"),h=await aw(a,b,e,`
79
79
  COALESCE(NULLIF(connectionId, ''), 'unknown') AS key,
80
80
  COALESCE(NULLIF(connectionId, ''), 'unknown') AS connectionId,
81
81
  COALESCE(NULLIF(provider, ''), 'unknown') AS provider,
82
82
  COALESCE(NULLIF(connectionId, ''), 'unknown') AS label
83
- `,"COALESCE(NULLIF(connectionId, ''), 'unknown')"),i=await ay(a,b,e,"COALESCE(NULLIF(endpoint, ''), 'unknown') AS key, COALESCE(NULLIF(endpoint, ''), 'unknown') AS label","COALESCE(NULLIF(endpoint, ''), 'unknown')"),j=await ay(a,b,e,"COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS key, COALESCE(NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS rawApiKey, COALESCE(NULLIF(apiKeyName, ''), '') AS apiKeyName, COALESCE(NULLIF(apiKeyOwner, ''), '') AS apiKeyOwner, COALESCE(NULLIF(apiKeyId, ''), '') AS apiKeyId","COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key')"),k=await az(a,b,e,"model",d),l=await az(a,b,e,"provider",d),m=await az(a,b,e,"endpoint",d),n=await ay(a,b,e,"COALESCE(NULLIF(status, ''), 'ok') AS key, COALESCE(NULLIF(status, ''), 'ok') AS label","COALESCE(NULLIF(status, ''), 'ok')"),o=at(b,e),p=await a.all(`SELECT
83
+ `,"COALESCE(NULLIF(connectionId, ''), 'unknown')"),i=await aw(a,b,e,"COALESCE(NULLIF(endpoint, ''), 'unknown') AS key, COALESCE(NULLIF(endpoint, ''), 'unknown') AS label","COALESCE(NULLIF(endpoint, ''), 'unknown')"),j=await aw(a,b,e,"COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS key, COALESCE(NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS rawApiKey, COALESCE(NULLIF(apiKeyName, ''), '') AS apiKeyName, COALESCE(NULLIF(apiKeyOwner, ''), '') AS apiKeyOwner, COALESCE(NULLIF(apiKeyId, ''), '') AS apiKeyId","COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key')"),k=await ax(a,b,e,"model",d),l=await ax(a,b,e,"provider",d),m=await ax(a,b,e,"endpoint",d),n=await aw(a,b,e,"COALESCE(NULLIF(status, ''), 'ok') AS key, COALESCE(NULLIF(status, ''), 'ok') AS label","COALESCE(NULLIF(status, ''), 'ok')"),o=ar(b,e),p=await a.all(`SELECT
84
84
  COALESCE(NULLIF(status, ''), 'error') AS status,
85
85
  COALESCE(NULLIF(provider, ''), 'unknown') AS provider,
86
86
  COALESCE(NULLIF(model, ''), 'unknown') AS model,
87
87
  COALESCE(NULLIF(endpoint, ''), 'unknown') AS endpoint,
88
88
  COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS rawApiKey,
89
89
  COALESCE(NULLIF(status, ''), 'error') || '|' || COALESCE(NULLIF(provider, ''), 'unknown') || '|' || COALESCE(NULLIF(model, ''), 'unknown') || '|' || COALESCE(NULLIF(endpoint, ''), 'unknown') AS key,
90
- ${$}
90
+ ${Y}
91
91
  FROM usageHistory
92
- ${o.clause?`${o.clause} AND NOT ${X} AND NOT ${Y}`:`WHERE NOT ${X} AND NOT ${Y}`}
92
+ ${o.clause?`${o.clause} AND NOT ${V} AND NOT ${W}`:`WHERE NOT ${V} AND NOT ${W}`}
93
93
  GROUP BY COALESCE(NULLIF(status, ''), 'error'), COALESCE(NULLIF(provider, ''), 'unknown'), COALESCE(NULLIF(model, ''), 'unknown'), COALESCE(NULLIF(endpoint, ''), 'unknown'), COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key')
94
94
  ORDER BY errors DESC, requests DESC, lastSeen DESC
95
- LIMIT ?`,[...o.params,100])||[],q=f.map(a=>ax(a,{label:aq(a.key||a.label,d),provider:a.key||a.label||"unknown",topModels:[],topApiKeys:[]})),r=g.map(a=>ax(a,{provider:a.provider||"",providerLabel:aq(a.provider,d),model:a.model||"",label:`${a.model||"unknown"} (${aq(a.provider,d)})`,topApiKeys:[]})),s=h.map(a=>{let b=d.get(a.connectionId);return ax(a,{label:b?.name||a.connectionId||"unknown",provider:b?.provider||a.provider||"",providerLabel:aq(b?.provider||a.provider,d),connectionId:a.connectionId||"",topModels:[]})}),t=i.map(a=>ax(a)),u=j.map(a=>{let b="local-no-key"===a.rawApiKey?"":a.rawApiKey,d=c.byKey.get(b)||c.byFingerprint.get(b)||c.all.find(b=>b.id===a.apiKeyId||b.id===a.key),e=d?.fingerprint||an(b),f=a.apiKeyName||d?.name||(b?e:"Local / kh\xf4ng d\xf9ng API key");return ax(a,{key:a.apiKeyId||e,label:f,name:f,fingerprint:e,apiKeyId:a.apiKeyId||d?.id||"",ownerUser:a.apiKeyOwner||d?.ownerUser||"",createdByUser:d?.createdByUser||"",isActive:d?.isActive??null,topModels:k.get(a.key)||[],topProviders:l.get(a.key)||[],topEndpoints:m.get(a.key)||[]})});return{providers:q,models:r,providerAccounts:s,endpoints:t,apiKeys:u,statuses:n.map(a=>ax(a)),errors:p.map(a=>{let b="local-no-key"===a.rawApiKey?"":a.rawApiKey,e=c.byKey.get(b)||c.byFingerprint.get(b)||c.all.find(a=>a.id===b);return ax(a,{label:a.status||"error",status:a.status||"error",provider:a.provider||"unknown",providerLabel:aq(a.provider,d),model:a.model||"unknown",endpoint:a.endpoint||"unknown",apiKey:e?.fingerprint||an(b)})})}}async function aB(a,b,c,d={}){let e=function(a,b,c){let d=a.start?a.start.getTime():NaN,e=a.end?a.end.getTime():Date.now();if(!Number.isFinite(d)){let a=b?new Date(b).getTime():NaN,f=c?new Date(c).getTime():NaN;Number.isFinite(a)&&(d=a),Number.isFinite(f)&&(e=f)}Number.isFinite(d)||(d=e-864e5);let f=Math.max(1,e-d);return f<=216e5?3e5:f<=1296e5?36e5:f<=6912e5?216e5:f<=648e7?864e5:6048e5}(b,d.minTs,d.maxTs),f=Math.max(60,Math.floor(e/1e3)),g=b.start?b.start.getTime():new Date(d.minTs||Date.now()-864e5).getTime(),h=b.end?b.end.getTime():new Date(d.maxTs||Date.now()).getTime();Number.isFinite(g)||(g=Date.now()-864e5),Number.isFinite(h)||(h=Date.now());let i=Math.floor(((h=Math.max(g=au(g,e),h))-g)/e)+1,j=f*(i>240?Math.ceil(i/240):1),k=1e3*j,l=at(b,c),m=await a.all(`SELECT
95
+ LIMIT ?`,[...o.params,100])||[],q=f.map(a=>av(a,{label:ao(a.key||a.label,d),provider:a.key||a.label||"unknown",topModels:[],topApiKeys:[]})),r=g.map(a=>av(a,{provider:a.provider||"",providerLabel:ao(a.provider,d),model:a.model||"",label:`${a.model||"unknown"} (${ao(a.provider,d)})`,topApiKeys:[]})),s=h.map(a=>{let b=d.get(a.connectionId);return av(a,{label:b?.name||a.connectionId||"unknown",provider:b?.provider||a.provider||"",providerLabel:ao(b?.provider||a.provider,d),connectionId:a.connectionId||"",topModels:[]})}),t=i.map(a=>av(a)),u=j.map(a=>{let b="local-no-key"===a.rawApiKey?"":a.rawApiKey,d=c.byKey.get(b)||c.byFingerprint.get(b)||c.all.find(b=>b.id===a.apiKeyId||b.id===a.key),e=d?.fingerprint||al(b),f=a.apiKeyName||d?.name||(b?e:"Local / kh\xf4ng d\xf9ng API key");return av(a,{key:a.apiKeyId||e,label:f,name:f,fingerprint:e,apiKeyId:a.apiKeyId||d?.id||"",ownerUser:a.apiKeyOwner||d?.ownerUser||"",createdByUser:d?.createdByUser||"",isActive:d?.isActive??null,topModels:k.get(a.key)||[],topProviders:l.get(a.key)||[],topEndpoints:m.get(a.key)||[]})});return{providers:q,models:r,providerAccounts:s,endpoints:t,apiKeys:u,statuses:n.map(a=>av(a)),errors:p.map(a=>{let b="local-no-key"===a.rawApiKey?"":a.rawApiKey,e=c.byKey.get(b)||c.byFingerprint.get(b)||c.all.find(a=>a.id===b);return av(a,{label:a.status||"error",status:a.status||"error",provider:a.provider||"unknown",providerLabel:ao(a.provider,d),model:a.model||"unknown",endpoint:a.endpoint||"unknown",apiKey:e?.fingerprint||al(b)})})}}async function az(a,b,c,d={}){let e=function(a,b,c){let d=a.start?a.start.getTime():NaN,e=a.end?a.end.getTime():Date.now();if(!Number.isFinite(d)){let a=b?new Date(b).getTime():NaN,f=c?new Date(c).getTime():NaN;Number.isFinite(a)&&(d=a),Number.isFinite(f)&&(e=f)}Number.isFinite(d)||(d=e-864e5);let f=Math.max(1,e-d);return f<=216e5?3e5:f<=1296e5?36e5:f<=6912e5?216e5:f<=648e7?864e5:6048e5}(b,d.minTs,d.maxTs),f=Math.max(60,Math.floor(e/1e3)),g=b.start?b.start.getTime():new Date(d.minTs||Date.now()-864e5).getTime(),h=b.end?b.end.getTime():new Date(d.maxTs||Date.now()).getTime();Number.isFinite(g)||(g=Date.now()-864e5),Number.isFinite(h)||(h=Date.now());let i=Math.floor(((h=Math.max(g=as(g,e),h))-g)/e)+1,j=f*(i>240?Math.ceil(i/240):1),k=1e3*j,l=ar(b,c),m=await a.all(`SELECT
96
96
  ((CAST(strftime('%s', timestamp) AS INTEGER) / ?) * ?) AS bucketSec,
97
- ${$}
97
+ ${Y}
98
98
  FROM usageHistory
99
99
  ${l.clause}
100
100
  GROUP BY bucketSec
101
101
  HAVING bucketSec IS NOT NULL
102
- ORDER BY bucketSec ASC`,[j,j,...l.params])||[],n=new Map;for(let a=au(g,k);a<=h;a+=k)n.set(a,{ts:a,label:new Date(a).toISOString(),requests:0,success:0,errors:0,pending:0,promptTokens:0,completionTokens:0,totalTokens:0,cachedTokens:0,reasoningTokens:0,cost:0});for(let a of m){let b=1e3*ab(a.bucketSec,0);b&&n.set(b,{ts:b,label:new Date(b).toISOString(),requests:ab(a.requests,0),success:ab(a.success,0),errors:ab(a.errors,0),pending:ab(a.pending,0),promptTokens:ab(a.promptTokens,0),completionTokens:ab(a.completionTokens,0),totalTokens:ab(a.totalTokens,0),cachedTokens:ab(a.cachedTokens,0),reasoningTokens:ab(a.reasoningTokens,0),cost:ab(a.cost,0)})}return[...n.values()].sort((a,b)=>a.ts-b.ts)}function aC(a,b){if(!a.length)return null;let c=[...a].sort((a,b)=>a-b),d=Math.min(c.length-1,Math.max(0,Math.ceil(b/100*c.length)-1));return c[d]}async function aD(a,b,c){try{let d=at(b,c),e=d.clause?`${d.clause} AND`:"WHERE",f=[...d.params],g=await a.get(`SELECT COUNT(*) AS samples, AVG(latencyMs) AS avgMs
102
+ ORDER BY bucketSec ASC`,[j,j,...l.params])||[],n=new Map;for(let a=as(g,k);a<=h;a+=k)n.set(a,{ts:a,label:new Date(a).toISOString(),requests:0,success:0,errors:0,pending:0,promptTokens:0,completionTokens:0,totalTokens:0,cachedTokens:0,reasoningTokens:0,cost:0});for(let a of m){let b=1e3*_(a.bucketSec,0);b&&n.set(b,{ts:b,label:new Date(b).toISOString(),requests:_(a.requests,0),success:_(a.success,0),errors:_(a.errors,0),pending:_(a.pending,0),promptTokens:_(a.promptTokens,0),completionTokens:_(a.completionTokens,0),totalTokens:_(a.totalTokens,0),cachedTokens:_(a.cachedTokens,0),reasoningTokens:_(a.reasoningTokens,0),cost:_(a.cost,0)})}return[...n.values()].sort((a,b)=>a.ts-b.ts)}function aA(a,b){if(!a.length)return null;let c=[...a].sort((a,b)=>a-b),d=Math.min(c.length-1,Math.max(0,Math.ceil(b/100*c.length)-1));return c[d]}async function aB(a,b,c){try{let d=ar(b,c),e=d.clause?`${d.clause} AND`:"WHERE",f=[...d.params],g=await a.get(`SELECT COUNT(*) AS samples, AVG(latencyMs) AS avgMs
103
103
  FROM usageHistory
104
- ${e} latencyMs IS NOT NULL AND latencyMs > 0`,f)||{},h=ab(g.samples,0),i=async b=>{if(!h)return null;let c=Math.max(0,Math.min(h-1,Math.ceil(b/100*h)-1)),d=await a.get(`SELECT latencyMs
104
+ ${e} latencyMs IS NOT NULL AND latencyMs > 0`,f)||{},h=_(g.samples,0),i=async b=>{if(!h)return null;let c=Math.max(0,Math.min(h-1,Math.ceil(b/100*h)-1)),d=await a.get(`SELECT latencyMs
105
105
  FROM usageHistory
106
106
  ${e} latencyMs IS NOT NULL AND latencyMs > 0
107
107
  ORDER BY latencyMs ASC
108
- LIMIT 1 OFFSET ?`,[...f,c]);return d?ab(d.latencyMs,null):null};if(h>0)return{samples:h,avgMs:ab(g.avgMs,null),p50Ms:await i(50),p95Ms:await i(95),p99Ms:await i(99)}}catch{}let d=[];try{let c,e,f=(c=[],e=[],as(c,e,"timestamp",b,!1),b.provider&&(c.push("provider = ?"),e.push(b.provider)),b.model&&(c.push("model = ?"),e.push(b.model)),b.connectionId&&(c.push("connectionId = ?"),e.push(b.connectionId)),b.status&&(c.push("status = ?"),e.push(b.status)),{clause:c.length?`WHERE ${c.join(" AND ")}`:"",params:e});d=await a.all(`SELECT data FROM requestDetails ${f.clause} ORDER BY timestamp DESC LIMIT ?`,[...f.params,3e3])||[]}catch{d=[]}let e=[];for(let a of d){let b=function(a){let b=a?.latency||{};for(let c of[b.totalMs,b.total_ms,b.durationMs,b.duration_ms,b.elapsedMs,b.elapsed_ms,b.responseMs,b.response_ms,b.ms,b.total,a?.durationMs,a?.latencyMs]){let a=Number(c);if(Number.isFinite(a)&&a>=0)return a}return null}((0,x.q)(a.data,{})||{});Number.isFinite(b)&&e.push(b)}let f=e.reduce((a,b)=>a+b,0);return{samples:e.length,avgMs:e.length?f/e.length:null,p50Ms:aC(e,50),p95Ms:aC(e,95),p99Ms:aC(e,99)}}function aE(a,b,c={}){let d=at(a,b,c),e=[Z,X,"(COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)) > 0"];c.latencyOnly&&e.push("latencyMs IS NOT NULL AND latencyMs > 0"),c.ttftOnly&&e.push("ttftMs IS NOT NULL AND ttftMs > 0");let f=e.join(" AND ");return{clause:d.clause?`${d.clause} AND ${f}`:`WHERE ${f}`,params:d.params}}async function aF(a,b,c){try{let d=await a.get(`SELECT COUNT(*) AS samples FROM usageHistory ${b.clause} AND ${c}`,b.params)||{};return ab(d.samples,0)}catch{return 0}}async function aG(a,b,c,d,e,f){if(!f||!new Set(["latencyMs","ttftMs","promptTokens","completionTokens","totalTokens"]).has(c))return null;let g=Math.max(0,Math.min(f-1,Math.ceil(e/100*f)-1));try{let e=await a.get(`SELECT ${c} AS value
108
+ LIMIT 1 OFFSET ?`,[...f,c]);return d?_(d.latencyMs,null):null};if(h>0)return{samples:h,avgMs:_(g.avgMs,null),p50Ms:await i(50),p95Ms:await i(95),p99Ms:await i(99)}}catch{}let d=[];try{let c,e,f=(c=[],e=[],aq(c,e,"timestamp",b,!1),b.provider&&(c.push("provider = ?"),e.push(b.provider)),b.model&&(c.push("model = ?"),e.push(b.model)),b.connectionId&&(c.push("connectionId = ?"),e.push(b.connectionId)),b.status&&(c.push("status = ?"),e.push(b.status)),{clause:c.length?`WHERE ${c.join(" AND ")}`:"",params:e});d=await a.all(`SELECT data FROM requestDetails ${f.clause} ORDER BY timestamp DESC LIMIT ?`,[...f.params,3e3])||[]}catch{d=[]}let e=[];for(let a of d){let b=function(a){let b=a?.latency||{};for(let c of[b.totalMs,b.total_ms,b.durationMs,b.duration_ms,b.elapsedMs,b.elapsed_ms,b.responseMs,b.response_ms,b.ms,b.total,a?.durationMs,a?.latencyMs]){let a=Number(c);if(Number.isFinite(a)&&a>=0)return a}return null}((0,x.q)(a.data,{})||{});Number.isFinite(b)&&e.push(b)}let f=e.reduce((a,b)=>a+b,0);return{samples:e.length,avgMs:e.length?f/e.length:null,p50Ms:aA(e,50),p95Ms:aA(e,95),p99Ms:aA(e,99)}}function aC(a,b,c={}){let d=ar(a,b,c),e=[X,V,"(COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)) > 0"];c.latencyOnly&&e.push("latencyMs IS NOT NULL AND latencyMs > 0"),c.ttftOnly&&e.push("ttftMs IS NOT NULL AND ttftMs > 0");let f=e.join(" AND ");return{clause:d.clause?`${d.clause} AND ${f}`:`WHERE ${f}`,params:d.params}}async function aD(a,b,c){try{let d=await a.get(`SELECT COUNT(*) AS samples FROM usageHistory ${b.clause} AND ${c}`,b.params)||{};return _(d.samples,0)}catch{return 0}}async function aE(a,b,c,d,e,f){if(!f||!new Set(["latencyMs","ttftMs","promptTokens","completionTokens","totalTokens"]).has(c))return null;let g=Math.max(0,Math.min(f-1,Math.ceil(e/100*f)-1));try{let e=await a.get(`SELECT ${c} AS value
109
109
  FROM usageHistory
110
110
  ${b.clause} AND ${d}
111
111
  ORDER BY ${c} ASC
112
- LIMIT 1 OFFSET ?`,[...b.params,g]);return e?ab(e.value,null):null}catch{return null}}function aH({samples:a=0,p95LatencyMs:b=0,p95TtftMs:c=0,slowRequestRate:d=0,errorRate:e=0}={}){if(!a)return{level:"none",label:"Chưa c\xf3 mẫu",tone:"slate",score:null};if(a<10)return{level:"low_sample",label:"\xcdt mẫu",tone:"amber",score:null};let f=100;return(b>0&&(b>9e4?f-=35:b>45e3?f-=20:b>15e3&&(f-=8)),c>0&&(c>45e3?f-=30:c>2e4?f-=16:c>8e3&&(f-=6)),f-=Math.min(30,Math.round(100*d)),f-=Math.min(25,Math.round(100*e)),(f=Math.max(0,Math.min(100,f)))>=85)?{level:"fast",label:"Nhanh",tone:"green",score:f}:f>=70?{level:"ok",label:"Ổn",tone:"blue",score:f}:f>=50?{level:"slow",label:"Chậm",tone:"amber",score:f}:{level:"very_slow",label:"Rất chậm",tone:"red",score:f}}async function aI(a,b,c,d={}){let e=aE(b,c,{latencyOnly:!0}),f={};try{f=await a.get(`SELECT
112
+ LIMIT 1 OFFSET ?`,[...b.params,g]);return e?_(e.value,null):null}catch{return null}}function aF({samples:a=0,p95LatencyMs:b=0,p95TtftMs:c=0,slowRequestRate:d=0,errorRate:e=0}={}){if(!a)return{level:"none",label:"Chưa c\xf3 mẫu",tone:"slate",score:null};if(a<10)return{level:"low_sample",label:"\xcdt mẫu",tone:"amber",score:null};let f=100;return(b>0&&(b>9e4?f-=35:b>45e3?f-=20:b>15e3&&(f-=8)),c>0&&(c>45e3?f-=30:c>2e4?f-=16:c>8e3&&(f-=6)),f-=Math.min(30,Math.round(100*d)),f-=Math.min(25,Math.round(100*e)),(f=Math.max(0,Math.min(100,f)))>=85)?{level:"fast",label:"Nhanh",tone:"green",score:f}:f>=70?{level:"ok",label:"Ổn",tone:"blue",score:f}:f>=50?{level:"slow",label:"Chậm",tone:"amber",score:f}:{level:"very_slow",label:"Rất chậm",tone:"red",score:f}}async function aG(a,b,c,d={}){let e=aC(b,c,{latencyOnly:!0}),f={};try{f=await a.get(`SELECT
113
113
  COUNT(*) AS samples,
114
114
  AVG(latencyMs) AS avgLatencyMs,
115
115
  MIN(latencyMs) AS minLatencyMs,
@@ -136,7 +136,7 @@
136
136
  SUM(CASE WHEN promptTokens >= ? THEN 1 ELSE 0 END) AS hugeInputRequests,
137
137
  SUM(CASE WHEN promptTokens >= ? THEN 1 ELSE 0 END) AS extremeInputRequests
138
138
  FROM usageHistory
139
- ${e.clause}`,[45e3,9e4,2e4,3e4,5e4,7e4,...e.params])||{}}catch{f={}}let g=ab(f.samples,0),h=await aF(a,e,"ttftMs IS NOT NULL AND ttftMs > 0"),i=await aF(a,e,"promptTokens IS NOT NULL AND promptTokens > 0"),j=await aF(a,e,"completionTokens IS NOT NULL AND completionTokens > 0"),k=await aG(a,e,"latencyMs","latencyMs IS NOT NULL AND latencyMs > 0",50,g),l=await aG(a,e,"latencyMs","latencyMs IS NOT NULL AND latencyMs > 0",95,g),m=await aG(a,e,"latencyMs","latencyMs IS NOT NULL AND latencyMs > 0",99,g),n=await aG(a,e,"ttftMs","ttftMs IS NOT NULL AND ttftMs > 0",50,h),o=await aG(a,e,"ttftMs","ttftMs IS NOT NULL AND ttftMs > 0",95,h),p=await aG(a,e,"ttftMs","ttftMs IS NOT NULL AND ttftMs > 0",99,h),q=await aG(a,e,"promptTokens","promptTokens IS NOT NULL AND promptTokens > 0",50,i),r=await aG(a,e,"promptTokens","promptTokens IS NOT NULL AND promptTokens > 0",95,i),s=await aG(a,e,"promptTokens","promptTokens IS NOT NULL AND promptTokens > 0",99,i),t=await aG(a,e,"completionTokens","completionTokens IS NOT NULL AND completionTokens > 0",95,j),u=ab(f.slowRequests,0),v=ab(f.verySlowRequests,0),w=ab(f.slowTtftRequests,0),x=ab(f.longInputRequests,0),y=ab(f.hugeInputRequests,0),z=ab(f.extremeInputRequests,0),A=ab(f.totalPromptTokens,0),B=ab(f.totalLatencyMs,0),C=ab(f.totalTtftMs,0),D=ab(f.promptTokensWithTtft,0),E=ab(f.completionTokensWithLatency,0),F=ab(f.latencyMsWithOutput,0),G=ab(f.completionTokensAfterTtft,0),H=ab(f.decodeMs,0),I=g?u/g:0,J=g?v/g:0,K=h?w/h:0,L=g?x/g:0,M=g?y/g:0,N=g?z/g:0,O=aH({samples:g,p95LatencyMs:ab(l,0),p95TtftMs:ab(o,0),slowRequestRate:I,errorRate:ab(d.errorRate,0)});return{samples:g,ttftSamples:h,inputSamples:i,outputSamples:j,label:O.label,level:O.level,tone:O.tone,score:O.score,thresholds:{slowLatencyMs:45e3,verySlowLatencyMs:9e4,slowTtftMs:2e4,longInputTokens:3e4,hugeInputTokens:5e4,extremeInputTokens:7e4},avgLatencyMs:ab(f.avgLatencyMs,null),minLatencyMs:ab(f.minLatencyMs,null),maxLatencyMs:ab(f.maxLatencyMs,null),p50LatencyMs:k,p95LatencyMs:l,p99LatencyMs:m,avgTtftMs:ab(f.avgTtftMs,null),maxTtftMs:ab(f.maxTtftMs,null),p50TtftMs:n,p95TtftMs:o,p99TtftMs:p,avgPromptTokens:ab(f.avgPromptTokens,0),maxPromptTokens:ab(f.maxPromptTokens,0),p50PromptTokens:q,p95PromptTokens:r,p99PromptTokens:s,avgCompletionTokens:ab(f.avgCompletionTokens,0),maxCompletionTokens:ab(f.maxCompletionTokens,0),p95CompletionTokens:t,slowRequests:u,verySlowRequests:v,slowTtftRequests:w,longInputRequests:x,hugeInputRequests:y,extremeInputRequests:z,slowRequestRate:I,verySlowRequestRate:J,slowTtftRate:K,longInputRate:L,hugeInputRate:M,extremeInputRate:N,approxInputTokensPerSecond:C>0?D/(C/1e3):null,outputTokensPerSecond:F>0?E/(F/1e3):null,decodeTokensPerSecond:H>0?G/(H/1e3):null,latencyMsPer10kInputTokens:A>0?B/(A/1e4):null}}async function aJ(a,b,c,d=new Map){let e=aE(b,c,{latencyOnly:!0});try{return(await a.all(`WITH base AS (
139
+ ${e.clause}`,[45e3,9e4,2e4,3e4,5e4,7e4,...e.params])||{}}catch{f={}}let g=_(f.samples,0),h=await aD(a,e,"ttftMs IS NOT NULL AND ttftMs > 0"),i=await aD(a,e,"promptTokens IS NOT NULL AND promptTokens > 0"),j=await aD(a,e,"completionTokens IS NOT NULL AND completionTokens > 0"),k=await aE(a,e,"latencyMs","latencyMs IS NOT NULL AND latencyMs > 0",50,g),l=await aE(a,e,"latencyMs","latencyMs IS NOT NULL AND latencyMs > 0",95,g),m=await aE(a,e,"latencyMs","latencyMs IS NOT NULL AND latencyMs > 0",99,g),n=await aE(a,e,"ttftMs","ttftMs IS NOT NULL AND ttftMs > 0",50,h),o=await aE(a,e,"ttftMs","ttftMs IS NOT NULL AND ttftMs > 0",95,h),p=await aE(a,e,"ttftMs","ttftMs IS NOT NULL AND ttftMs > 0",99,h),q=await aE(a,e,"promptTokens","promptTokens IS NOT NULL AND promptTokens > 0",50,i),r=await aE(a,e,"promptTokens","promptTokens IS NOT NULL AND promptTokens > 0",95,i),s=await aE(a,e,"promptTokens","promptTokens IS NOT NULL AND promptTokens > 0",99,i),t=await aE(a,e,"completionTokens","completionTokens IS NOT NULL AND completionTokens > 0",95,j),u=_(f.slowRequests,0),v=_(f.verySlowRequests,0),w=_(f.slowTtftRequests,0),x=_(f.longInputRequests,0),y=_(f.hugeInputRequests,0),z=_(f.extremeInputRequests,0),A=_(f.totalPromptTokens,0),B=_(f.totalLatencyMs,0),C=_(f.totalTtftMs,0),D=_(f.promptTokensWithTtft,0),E=_(f.completionTokensWithLatency,0),F=_(f.latencyMsWithOutput,0),G=_(f.completionTokensAfterTtft,0),H=_(f.decodeMs,0),I=g?u/g:0,J=g?v/g:0,K=h?w/h:0,L=g?x/g:0,M=g?y/g:0,N=g?z/g:0,O=aF({samples:g,p95LatencyMs:_(l,0),p95TtftMs:_(o,0),slowRequestRate:I,errorRate:_(d.errorRate,0)});return{samples:g,ttftSamples:h,inputSamples:i,outputSamples:j,label:O.label,level:O.level,tone:O.tone,score:O.score,thresholds:{slowLatencyMs:45e3,verySlowLatencyMs:9e4,slowTtftMs:2e4,longInputTokens:3e4,hugeInputTokens:5e4,extremeInputTokens:7e4},avgLatencyMs:_(f.avgLatencyMs,null),minLatencyMs:_(f.minLatencyMs,null),maxLatencyMs:_(f.maxLatencyMs,null),p50LatencyMs:k,p95LatencyMs:l,p99LatencyMs:m,avgTtftMs:_(f.avgTtftMs,null),maxTtftMs:_(f.maxTtftMs,null),p50TtftMs:n,p95TtftMs:o,p99TtftMs:p,avgPromptTokens:_(f.avgPromptTokens,0),maxPromptTokens:_(f.maxPromptTokens,0),p50PromptTokens:q,p95PromptTokens:r,p99PromptTokens:s,avgCompletionTokens:_(f.avgCompletionTokens,0),maxCompletionTokens:_(f.maxCompletionTokens,0),p95CompletionTokens:t,slowRequests:u,verySlowRequests:v,slowTtftRequests:w,longInputRequests:x,hugeInputRequests:y,extremeInputRequests:z,slowRequestRate:I,verySlowRequestRate:J,slowTtftRate:K,longInputRate:L,hugeInputRate:M,extremeInputRate:N,approxInputTokensPerSecond:C>0?D/(C/1e3):null,outputTokensPerSecond:F>0?E/(F/1e3):null,decodeTokensPerSecond:H>0?G/(H/1e3):null,latencyMsPer10kInputTokens:A>0?B/(A/1e4):null}}async function aH(a,b,c,d=new Map){let e=aC(b,c,{latencyOnly:!0});try{return(await a.all(`WITH base AS (
140
140
  SELECT
141
141
  COALESCE(NULLIF(provider, ''), 'unknown') AS provider,
142
142
  COALESCE(NULLIF(model, ''), 'unknown') AS model,
@@ -184,38 +184,38 @@
184
184
  FROM ranked
185
185
  GROUP BY provider, model
186
186
  ORDER BY samples DESC, p95LatencyMs DESC
187
- LIMIT ?`,[...e.params,45e3,2e4,3e4,5e4,30])||[]).map(a=>{let b=ab(a.samples,0),c=b?ab(a.slowRequests,0)/b:0,e=b?ab(a.slowTtftRequests,0)/b:0,f=b?ab(a.longInputRequests,0)/b:0,g=b?ab(a.hugeInputRequests,0)/b:0,h=aH({samples:b,p95LatencyMs:ab(a.p95LatencyMs,0),p95TtftMs:ab(a.p95TtftMs,0),slowRequestRate:c});return{key:a.key,provider:a.provider,providerLabel:aq(a.provider,d),model:a.model,label:`${a.model} (${aq(a.provider,d)})`,samples:b,level:h.level,labelQuality:h.label,tone:h.tone,score:h.score,avgLatencyMs:ab(a.avgLatencyMs,null),p50LatencyMs:ab(a.p50LatencyMs,null),p95LatencyMs:ab(a.p95LatencyMs,null),maxLatencyMs:ab(a.maxLatencyMs,null),avgTtftMs:ab(a.avgTtftMs,null),p95TtftMs:ab(a.p95TtftMs,null),maxTtftMs:ab(a.maxTtftMs,null),avgPromptTokens:ab(a.avgPromptTokens,0),p95PromptTokens:ab(a.p95PromptTokensApprox,0),maxPromptTokens:ab(a.maxPromptTokens,0),avgCompletionTokens:ab(a.avgCompletionTokens,0),slowRequests:ab(a.slowRequests,0),slowRequestRate:c,slowTtftRate:e,longInputRate:f,hugeInputRate:g,outputTokensPerSecond:ab(a.totalLatencyMs,0)>0?ab(a.totalCompletionTokens,0)/(ab(a.totalLatencyMs,0)/1e3):null}})}catch(a){return console.error("[analytics] Failed to build model experience stats:",a?.message||a),[]}}async function aK(a,b,c,d,e){try{let f=aE(b,c,{latencyOnly:!0});return(await a.all(`SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, promptTokens, completionTokens, cachedTokens, reasoningTokens, cost, status, tokens
187
+ LIMIT ?`,[...e.params,45e3,2e4,3e4,5e4,30])||[]).map(a=>{let b=_(a.samples,0),c=b?_(a.slowRequests,0)/b:0,e=b?_(a.slowTtftRequests,0)/b:0,f=b?_(a.longInputRequests,0)/b:0,g=b?_(a.hugeInputRequests,0)/b:0,h=aF({samples:b,p95LatencyMs:_(a.p95LatencyMs,0),p95TtftMs:_(a.p95TtftMs,0),slowRequestRate:c});return{key:a.key,provider:a.provider,providerLabel:ao(a.provider,d),model:a.model,label:`${a.model} (${ao(a.provider,d)})`,samples:b,level:h.level,labelQuality:h.label,tone:h.tone,score:h.score,avgLatencyMs:_(a.avgLatencyMs,null),p50LatencyMs:_(a.p50LatencyMs,null),p95LatencyMs:_(a.p95LatencyMs,null),maxLatencyMs:_(a.maxLatencyMs,null),avgTtftMs:_(a.avgTtftMs,null),p95TtftMs:_(a.p95TtftMs,null),maxTtftMs:_(a.maxTtftMs,null),avgPromptTokens:_(a.avgPromptTokens,0),p95PromptTokens:_(a.p95PromptTokensApprox,0),maxPromptTokens:_(a.maxPromptTokens,0),avgCompletionTokens:_(a.avgCompletionTokens,0),slowRequests:_(a.slowRequests,0),slowRequestRate:c,slowTtftRate:e,longInputRate:f,hugeInputRate:g,outputTokensPerSecond:_(a.totalLatencyMs,0)>0?_(a.totalCompletionTokens,0)/(_(a.totalLatencyMs,0)/1e3):null}})}catch(a){return console.error("[analytics] Failed to build model experience stats:",a?.message||a),[]}}async function aI(a,b,c,d,e){try{let f=aC(b,c,{latencyOnly:!0});return(await a.all(`SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, promptTokens, completionTokens, cachedTokens, reasoningTokens, cost, status, tokens
188
188
  FROM usageHistory
189
189
  ${f.clause}
190
190
  ORDER BY latencyMs DESC
191
- LIMIT ?`,[...f.params,20])||[]).map(a=>aL(a,d,e))}catch{return[]}}function aL(a,b,c){let d=function(a={}){let b=(0,x.q)(a.tokens,{})||{},c=ab(a.promptTokens,0)||ab(b.prompt_tokens,0)||ab(b.input_tokens,0),d=ab(a.completionTokens,0)||ab(b.completion_tokens,0)||ab(b.output_tokens,0);return{promptTokens:c,completionTokens:d,totalTokens:c+d,cachedTokens:ab(a.cachedTokens,0)||ab(b.cached_tokens,0)||ab(b.cache_read_input_tokens,0)||ab(b.prompt_tokens_details?.cached_tokens,0),reasoningTokens:ab(a.reasoningTokens,0)||ab(b.reasoning_tokens,0)||ab(b.completion_tokens_details?.reasoning_tokens,0)||ab(b.output_tokens_details?.reasoning_tokens,0)}}(a),e=b.get(a.apiKey)||b.get(a.apiKeyFingerprint)||null,f=c.get(a.connectionId)||null;return{id:a.id,timestamp:a.timestamp,provider:a.provider||"",providerLabel:aq(a.provider,c),model:a.model||"",connectionId:a.connectionId||"",accountName:f?.name||a.connectionId||"",apiKeyName:a.apiKeyName||e?.name||(a.apiKeyFingerprint||a.apiKey?an(a.apiKeyFingerprint||a.apiKey):"Local"),apiKeyFingerprint:a.apiKeyFingerprint||e?.fingerprint||an(a.apiKey),apiKeyId:a.apiKeyId||e?.id||"",clientIp:a.clientIpNormalized||a.clientIp||"",sourceTool:a.sourceTool||a.sourceToolLabel||"",sessionId:a.sessionId||"",latencyMs:ab(a.latencyMs,0),ttftMs:ab(a.ttftMs,0),statusCode:a.statusCode||null,errorCode:a.errorCode||"",errorType:a.errorType||"",endpoint:a.endpoint||"",status:a.status||"ok",promptTokens:d.promptTokens,completionTokens:d.completionTokens,totalTokens:d.totalTokens,cachedTokens:d.cachedTokens,reasoningTokens:d.reasoningTokens,cost:ab(a.cost,0)}}async function aM(a,b,c,d,e){let f=at(b,c);return(await a.all(`SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, promptTokens, completionTokens, cachedTokens, reasoningTokens, cost, status, tokens
191
+ LIMIT ?`,[...f.params,20])||[]).map(a=>aJ(a,d,e))}catch{return[]}}function aJ(a,b,c){let d=function(a={}){let b=(0,x.q)(a.tokens,{})||{},c=_(a.promptTokens,0)||_(b.prompt_tokens,0)||_(b.input_tokens,0),d=_(a.completionTokens,0)||_(b.completion_tokens,0)||_(b.output_tokens,0);return{promptTokens:c,completionTokens:d,totalTokens:c+d,cachedTokens:_(a.cachedTokens,0)||_(b.cached_tokens,0)||_(b.cache_read_input_tokens,0)||_(b.prompt_tokens_details?.cached_tokens,0),reasoningTokens:_(a.reasoningTokens,0)||_(b.reasoning_tokens,0)||_(b.completion_tokens_details?.reasoning_tokens,0)||_(b.output_tokens_details?.reasoning_tokens,0)}}(a),e=b.get(a.apiKey)||b.get(a.apiKeyFingerprint)||null,f=c.get(a.connectionId)||null;return{id:a.id,timestamp:a.timestamp,provider:a.provider||"",providerLabel:ao(a.provider,c),model:a.model||"",connectionId:a.connectionId||"",accountName:f?.name||a.connectionId||"",apiKeyName:a.apiKeyName||e?.name||(a.apiKeyFingerprint||a.apiKey?al(a.apiKeyFingerprint||a.apiKey):"Local"),apiKeyFingerprint:a.apiKeyFingerprint||e?.fingerprint||al(a.apiKey),apiKeyId:a.apiKeyId||e?.id||"",clientIp:a.clientIpNormalized||a.clientIp||"",sourceTool:a.sourceTool||a.sourceToolLabel||"",sessionId:a.sessionId||"",latencyMs:_(a.latencyMs,0),ttftMs:_(a.ttftMs,0),statusCode:a.statusCode||null,errorCode:a.errorCode||"",errorType:a.errorType||"",endpoint:a.endpoint||"",status:a.status||"ok",promptTokens:d.promptTokens,completionTokens:d.completionTokens,totalTokens:d.totalTokens,cachedTokens:d.cachedTokens,reasoningTokens:d.reasoningTokens,cost:_(a.cost,0)}}async function aK(a,b,c,d,e){let f=ar(b,c);return(await a.all(`SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, promptTokens, completionTokens, cachedTokens, reasoningTokens, cost, status, tokens
192
192
  FROM usageHistory
193
193
  ${f.clause}
194
194
  ORDER BY timestamp DESC
195
- LIMIT ?`,[...f.params,50])||[]).map(a=>aL(a,d,e))}async function aN(a,b,c,d,e){let f=at(b,c);return(await a.all(`SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, promptTokens, completionTokens, cachedTokens, reasoningTokens, cost, status, tokens
195
+ LIMIT ?`,[...f.params,50])||[]).map(a=>aJ(a,d,e))}async function aL(a,b,c,d,e){let f=ar(b,c);return(await a.all(`SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, promptTokens, completionTokens, cachedTokens, reasoningTokens, cost, status, tokens
196
196
  FROM usageHistory
197
197
  ${f.clause}
198
198
  ORDER BY (COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)) DESC, timestamp DESC
199
- LIMIT ?`,[...f.params,20])||[]).map(a=>aL(a,d,e))}function aO(a,b,c=b){let d=function(a,b=a){let c=_(a);return c?{value:c,label:_(b)||c}:null}(b,c);return d&&(a.some(a=>a.value===d.value)||a.unshift(d)),a}function aP(a){return{...a,provider:"",model:"",connectionId:"",status:"",endpoint:"",apiKey:""}}async function aQ(a,b,c,d=500){let e=at(aP(b),null),f=e.clause?`${e.clause} AND`:"WHERE";return(await a.all(`SELECT DISTINCT ${c} AS value
199
+ LIMIT ?`,[...f.params,20])||[]).map(a=>aJ(a,d,e))}function aM(a,b,c=b){let d=function(a,b=a){let c=Z(a);return c?{value:c,label:Z(b)||c}:null}(b,c);return d&&(a.some(a=>a.value===d.value)||a.unshift(d)),a}function aN(a){return{...a,provider:"",model:"",connectionId:"",status:"",endpoint:"",apiKey:""}}async function aO(a,b,c,d=500){let e=ar(aN(b),null),f=e.clause?`${e.clause} AND`:"WHERE";return(await a.all(`SELECT DISTINCT ${c} AS value
200
200
  FROM usageHistory
201
201
  ${f} ${c} IS NOT NULL AND ${c} <> ''
202
202
  ORDER BY ${c} ASC
203
- LIMIT ?`,[...e.params,d])||[]).map(a=>_(a.value)).filter(Boolean)}async function aR(a,b){let c=at(aP(b),null),d=c.clause?`${c.clause} AND`:"WHERE";try{let b=await a.get(`SELECT 1 AS hasLocal
203
+ LIMIT ?`,[...e.params,d])||[]).map(a=>Z(a.value)).filter(Boolean)}async function aP(a,b){let c=ar(aN(b),null),d=c.clause?`${c.clause} AND`:"WHERE";try{let b=await a.get(`SELECT 1 AS hasLocal
204
204
  FROM usageHistory
205
205
  ${d} (apiKey IS NULL OR apiKey = '')
206
- LIMIT 1`,c.params);return!!b?.hasLocal}catch{return!1}}async function aS(a,b,c,d){let e=await aQ(a,b,"provider",500),f=await aQ(a,b,"model",1e3),g=await aQ(a,b,"endpoint",500),h=await aQ(a,b,"status",200),i=(await aQ(a,b,"connectionId",1e3)).map(a=>{let b=c.get(a),d=aq(b?.provider||a,c),e=b?.name?`${b.name}${d&&d!==b.name?` \xb7 ${d}`:""}`:d||a;return{value:a,label:e}}),j=[];for(let c of(await aR(a,b)&&j.push({value:"local-no-key",label:"Local / kh\xf4ng d\xf9ng API key"}),(function(a={},b={}){let c=a.all||[],d=b.ownerScope;if(!d?.enabled)return c;if(d.noMatch)return[];let e=new Set((d.identifiers||[]).map(a=>_(a)).filter(Boolean)),f=new Set((d.ids||[]).map(a=>_(a)).filter(Boolean)),g=new Set((d.fingerprints||[]).map(a=>_(a)).filter(Boolean)),h=new Set((d.owners||[]).map(a=>aa(a)).filter(Boolean));return c.filter(a=>!!a&&(a.key&&e.has(a.key)||a.id&&(e.has(a.id)||f.has(a.id))||a.fingerprint&&(e.has(a.fingerprint)||g.has(a.fingerprint))||a.ownerUser&&h.has(aa(a.ownerUser))))})(d,b).slice(0,500)))j.push({value:c.fingerprint,label:`${c.name||c.fingerprint}${c.ownerUser?` \xb7 ${c.ownerUser}`:""}`});aO(i,b.connectionId,b.connectionId),aO(j,b.apiKey,b.apiKey);let k=e.map(a=>({value:a,label:aq(a,c)})),l=f.map(a=>({value:a,label:a})),m=g.map(a=>({value:a,label:a})),n=h.map(a=>({value:a,label:a}));return aO(k,b.provider,b.provider),aO(l,b.model,b.model),aO(m,b.endpoint,b.endpoint),aO(n,b.status,b.status),{providers:k,models:l.map(a=>a.value),endpoints:m.map(a=>a.value),statuses:n.map(a=>a.value),connections:i,apiKeys:j,clientIps:[],sourceTools:[]}}async function aT(a,b,c,d,e,f,g=new Map){let h=await aS(a,b,g,e);return h.clientIps=(d.topClientIps||[]).map(a=>a.key).filter(Boolean),h.sourceTools=(d.topSourceTools||[]).map(a=>a.key).filter(Boolean),h}let aU="COALESCE(NULLIF(apiKeyOwner, ''), NULLIF(apiKeyName, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKeyId, ''), NULLIF(clientIpNormalized, ''), 'local-no-key')",aV="COALESCE(NULLIF(apiKeyOwner, ''), NULLIF(apiKeyName, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(clientIpNormalized, ''), 'Local / kh\xf4ng API key')",aW="COALESCE(NULLIF(clientIpNormalized, ''), NULLIF(clientIp, ''), 'unknown')";async function aX(a,b,c,d,e=new Map){if(!new Set(["model","provider","endpoint","clientIpNormalized","sourceTool"]).has(d))return new Map;let f=aE(b,c),g=`COALESCE(NULLIF(${d}, ''), 'unknown')`;try{let b=await a.all(`SELECT
207
- ${aU} AS clientKey,
206
+ LIMIT 1`,c.params);return!!b?.hasLocal}catch{return!1}}async function aQ(a,b,c,d){let e=await aO(a,b,"provider",500),f=await aO(a,b,"model",1e3),g=await aO(a,b,"endpoint",500),h=await aO(a,b,"status",200),i=(await aO(a,b,"connectionId",1e3)).map(a=>{let b=c.get(a),d=ao(b?.provider||a,c),e=b?.name?`${b.name}${d&&d!==b.name?` \xb7 ${d}`:""}`:d||a;return{value:a,label:e}}),j=[];for(let c of(await aP(a,b)&&j.push({value:"local-no-key",label:"Local / kh\xf4ng d\xf9ng API key"}),(function(a={},b={}){let c=a.all||[],d=b.ownerScope;if(!d?.enabled)return c;if(d.noMatch)return[];let e=new Set((d.identifiers||[]).map(a=>Z(a)).filter(Boolean)),f=new Set((d.ids||[]).map(a=>Z(a)).filter(Boolean)),g=new Set((d.fingerprints||[]).map(a=>Z(a)).filter(Boolean)),h=new Set((d.owners||[]).map(a=>$(a)).filter(Boolean));return c.filter(a=>!!a&&(a.key&&e.has(a.key)||a.id&&(e.has(a.id)||f.has(a.id))||a.fingerprint&&(e.has(a.fingerprint)||g.has(a.fingerprint))||a.ownerUser&&h.has($(a.ownerUser))))})(d,b).slice(0,500)))j.push({value:c.fingerprint,label:`${c.name||c.fingerprint}${c.ownerUser?` \xb7 ${c.ownerUser}`:""}`});aM(i,b.connectionId,b.connectionId),aM(j,b.apiKey,b.apiKey);let k=e.map(a=>({value:a,label:ao(a,c)})),l=f.map(a=>({value:a,label:a})),m=g.map(a=>({value:a,label:a})),n=h.map(a=>({value:a,label:a}));return aM(k,b.provider,b.provider),aM(l,b.model,b.model),aM(m,b.endpoint,b.endpoint),aM(n,b.status,b.status),{providers:k,models:l.map(a=>a.value),endpoints:m.map(a=>a.value),statuses:n.map(a=>a.value),connections:i,apiKeys:j,clientIps:[],sourceTools:[]}}async function aR(a,b,c,d,e,f,g=new Map){let h=await aQ(a,b,g,e);return h.clientIps=(d.topClientIps||[]).map(a=>a.key).filter(Boolean),h.sourceTools=(d.topSourceTools||[]).map(a=>a.key).filter(Boolean),h}let aS="COALESCE(NULLIF(apiKeyOwner, ''), NULLIF(apiKeyName, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKeyId, ''), NULLIF(clientIpNormalized, ''), 'local-no-key')",aT="COALESCE(NULLIF(apiKeyOwner, ''), NULLIF(apiKeyName, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(clientIpNormalized, ''), 'Local / kh\xf4ng API key')",aU="COALESCE(NULLIF(clientIpNormalized, ''), NULLIF(clientIp, ''), 'unknown')";async function aV(a,b,c,d,e=new Map){if(!new Set(["model","provider","endpoint","clientIpNormalized","sourceTool"]).has(d))return new Map;let f=aC(b,c),g=`COALESCE(NULLIF(${d}, ''), 'unknown')`;try{let b=await a.all(`SELECT
207
+ ${aS} AS clientKey,
208
208
  ${g} AS itemKey,
209
209
  COUNT(*) AS requests,
210
210
  COALESCE(SUM(COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)), 0) AS totalTokens,
211
211
  MAX(timestamp) AS lastSeen
212
212
  FROM usageHistory
213
213
  ${f.clause}
214
- GROUP BY ${aU}, ${g}
215
- ORDER BY clientKey ASC, requests DESC, totalTokens DESC`,f.params)||[],c=new Map;for(let a of b){let b=_(a.itemKey)||"unknown",f="provider"===d?aq(b,e):b;!function(a,b,c,d=3){if(!b||!c?.key)return;let e=a.get(b)||[];e.push(c),e.sort((a,b)=>b.requests-a.requests||b.totalTokens-a.totalTokens||String(a.label).localeCompare(String(b.label))),a.set(b,e.slice(0,d))}(c,a.clientKey,{key:b,label:f,requests:ab(a.requests,0),totalTokens:ab(a.totalTokens,0),lastSeen:a.lastSeen||""})}return c}catch(a){return console.error("[analytics] Failed to build client top usage map:",a?.message||a),new Map}}function aY(a={},b={}){let c=ab(a.requests,0),d=ab(a.success,c),e=ab(a.errors,0),f=ab(a.promptTokens,0),g=ab(a.completionTokens,0),h=ab(a.totalTokens,f+g),i=ab(a.p95PromptTokens,0),j=ab(a.p95LatencyMs,null),k=c?e/c:0,l=c?ab(a.longInputRequests,0)/c:0,m=c?ab(a.hugeInputRequests,0)/c:0,n=c?ab(a.extremeInputRequests,0)/c:0,o=c?ab(a.slowRequests,0)/c:0,p=function({requests:a=0,p95PromptTokens:b=0,p95LatencyMs:c=0,longInputRate:d=0,errorRate:e=0}={}){return a?b>=7e4||d>=.5||c>=9e4?{level:"critical",label:"Rất nặng",tone:"red"}:b>=5e4||d>=.3||c>=45e3||e>=.2?{level:"high",label:"Nặng",tone:"amber"}:b>=3e4||d>=.1||e>=.05?{level:"medium",label:"Cần theo d\xf5i",tone:"blue"}:{level:"normal",label:"Ổn",tone:"green"}:{level:"none",label:"Chưa c\xf3 mẫu",tone:"slate"}}({requests:c,p95PromptTokens:i,p95LatencyMs:ab(j,0),longInputRate:l,errorRate:k});return{key:_(a.clientKey)||"unknown",label:_(a.clientLabel||a.clientKey)||"unknown",ownerUser:_(a.ownerUser),apiKeyName:_(a.apiKeyName),apiKeyFingerprint:_(a.apiKeyFingerprint),primaryClientIp:_(a.primaryClientIp),primarySourceTool:_(a.primarySourceTool),apiKeyCount:ab(a.apiKeyCount,0),sourceIpCount:ab(a.sourceIpCount,0),sourceToolCount:ab(a.sourceToolCount,0),sessionCount:ab(a.sessionCount,0),requests:c,success:d,errors:e,errorRate:k,promptTokens:f,completionTokens:g,totalTokens:h,cost:ab(a.cost,0),avgPromptTokens:c?f/c:0,avgCompletionTokens:c?g/c:0,avgTokens:c?h/c:0,p50PromptTokens:ab(a.p50PromptTokens,0),p95PromptTokens:i,maxPromptTokens:ab(a.maxPromptTokens,0),avgLatencyMs:ab(a.avgLatencyMs,null),p95LatencyMs:j,maxLatencyMs:ab(a.maxLatencyMs,null),avgTtftMs:ab(a.avgTtftMs,null),p95TtftMs:ab(a.p95TtftMs,null),longInputRequests:ab(a.longInputRequests,0),hugeInputRequests:ab(a.hugeInputRequests,0),extremeInputRequests:ab(a.extremeInputRequests,0),slowRequests:ab(a.slowRequests,0),slowTtftRequests:ab(a.slowTtftRequests,0),longInputRate:l,hugeInputRate:m,extremeInputRate:n,slowRequestRate:o,slowTtftRate:c?ab(a.slowTtftRequests,0)/c:0,outputTokensPerSecond:ab(a.totalLatencyMs,0)>0?g/(ab(a.totalLatencyMs,0)/1e3):null,level:p.level,pressureLabel:p.label,tone:p.tone,lastSeen:a.lastSeen||"",...b}}async function aZ(a,b,c,{dimension:d="apiKey",order:e="tokens",limit:f=25}={}){let g=aE(b,c),h="sourceIp"===d;try{return(await a.all(`WITH base AS (
214
+ GROUP BY ${aS}, ${g}
215
+ ORDER BY clientKey ASC, requests DESC, totalTokens DESC`,f.params)||[],c=new Map;for(let a of b){let b=Z(a.itemKey)||"unknown",f="provider"===d?ao(b,e):b;!function(a,b,c,d=3){if(!b||!c?.key)return;let e=a.get(b)||[];e.push(c),e.sort((a,b)=>b.requests-a.requests||b.totalTokens-a.totalTokens||String(a.label).localeCompare(String(b.label))),a.set(b,e.slice(0,d))}(c,a.clientKey,{key:b,label:f,requests:_(a.requests,0),totalTokens:_(a.totalTokens,0),lastSeen:a.lastSeen||""})}return c}catch(a){return console.error("[analytics] Failed to build client top usage map:",a?.message||a),new Map}}function aW(a={},b={}){let c=_(a.requests,0),d=_(a.success,c),e=_(a.errors,0),f=_(a.promptTokens,0),g=_(a.completionTokens,0),h=_(a.totalTokens,f+g),i=_(a.p95PromptTokens,0),j=_(a.p95LatencyMs,null),k=c?e/c:0,l=c?_(a.longInputRequests,0)/c:0,m=c?_(a.hugeInputRequests,0)/c:0,n=c?_(a.extremeInputRequests,0)/c:0,o=c?_(a.slowRequests,0)/c:0,p=function({requests:a=0,p95PromptTokens:b=0,p95LatencyMs:c=0,longInputRate:d=0,errorRate:e=0}={}){return a?b>=7e4||d>=.5||c>=9e4?{level:"critical",label:"Rất nặng",tone:"red"}:b>=5e4||d>=.3||c>=45e3||e>=.2?{level:"high",label:"Nặng",tone:"amber"}:b>=3e4||d>=.1||e>=.05?{level:"medium",label:"Cần theo d\xf5i",tone:"blue"}:{level:"normal",label:"Ổn",tone:"green"}:{level:"none",label:"Chưa c\xf3 mẫu",tone:"slate"}}({requests:c,p95PromptTokens:i,p95LatencyMs:_(j,0),longInputRate:l,errorRate:k});return{key:Z(a.clientKey)||"unknown",label:Z(a.clientLabel||a.clientKey)||"unknown",ownerUser:Z(a.ownerUser),apiKeyName:Z(a.apiKeyName),apiKeyFingerprint:Z(a.apiKeyFingerprint),primaryClientIp:Z(a.primaryClientIp),primarySourceTool:Z(a.primarySourceTool),apiKeyCount:_(a.apiKeyCount,0),sourceIpCount:_(a.sourceIpCount,0),sourceToolCount:_(a.sourceToolCount,0),sessionCount:_(a.sessionCount,0),requests:c,success:d,errors:e,errorRate:k,promptTokens:f,completionTokens:g,totalTokens:h,cost:_(a.cost,0),avgPromptTokens:c?f/c:0,avgCompletionTokens:c?g/c:0,avgTokens:c?h/c:0,p50PromptTokens:_(a.p50PromptTokens,0),p95PromptTokens:i,maxPromptTokens:_(a.maxPromptTokens,0),avgLatencyMs:_(a.avgLatencyMs,null),p95LatencyMs:j,maxLatencyMs:_(a.maxLatencyMs,null),avgTtftMs:_(a.avgTtftMs,null),p95TtftMs:_(a.p95TtftMs,null),longInputRequests:_(a.longInputRequests,0),hugeInputRequests:_(a.hugeInputRequests,0),extremeInputRequests:_(a.extremeInputRequests,0),slowRequests:_(a.slowRequests,0),slowTtftRequests:_(a.slowTtftRequests,0),longInputRate:l,hugeInputRate:m,extremeInputRate:n,slowRequestRate:o,slowTtftRate:c?_(a.slowTtftRequests,0)/c:0,outputTokensPerSecond:_(a.totalLatencyMs,0)>0?g/(_(a.totalLatencyMs,0)/1e3):null,level:p.level,pressureLabel:p.label,tone:p.tone,lastSeen:a.lastSeen||"",...b}}async function aX(a,b,c,{dimension:d="apiKey",order:e="tokens",limit:f=25}={}){let g=aC(b,c),h="sourceIp"===d;try{return(await a.all(`WITH base AS (
216
216
  SELECT
217
- ${h?aW:"COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key')"} AS groupKey,
218
- ${h?aW:"COALESCE(NULLIF(apiKeyName, ''), NULLIF(apiKeyOwner, ''), NULLIF(apiKeyFingerprint, ''), 'Local / kh\xf4ng API key')"} AS groupLabel,
217
+ ${h?aU:"COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key')"} AS groupKey,
218
+ ${h?aU:"COALESCE(NULLIF(apiKeyName, ''), NULLIF(apiKeyOwner, ''), NULLIF(apiKeyFingerprint, ''), 'Local / kh\xf4ng API key')"} AS groupLabel,
219
219
  COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS apiKeyStable,
220
220
  COALESCE(NULLIF(apiKeyName, ''), '') AS apiKeyName,
221
221
  COALESCE(NULLIF(apiKeyOwner, ''), '') AS apiKeyOwner,
@@ -272,10 +272,10 @@
272
272
  GROUP BY groupKey
273
273
  HAVING groupKey <> 'unknown'
274
274
  ORDER BY ${"heavy"===e?"heavyRequests DESC, maxPromptTokens DESC, promptTokens DESC, totalTokens DESC, requests DESC":"totalTokens DESC, promptTokens DESC, requests DESC, maxPromptTokens DESC"}
275
- LIMIT ?`,[...g.params,3e4,5e4,7e4,3e4,3e4,f])||[]).map(a=>(function(a={},b={}){let c=ab(a.requests,0),d=ab(a.promptTokens,0),e=ab(a.completionTokens,0),f=ab(a.totalTokens,d+e);return{key:_(a.key||a.groupKey)||"unknown",label:_(a.label||a.groupLabel||a.key||a.groupKey)||"unknown",requests:c,promptTokens:d,completionTokens:e,totalTokens:f,cost:ab(a.cost,0),avgPromptTokens:c?d/c:0,avgCompletionTokens:c?e/c:0,avgTokens:c?f/c:0,p95PromptTokens:ab(a.p95PromptTokens,0),maxPromptTokens:ab(a.maxPromptTokens,0),p95TotalTokens:ab(a.p95TotalTokens,0),maxTotalTokens:ab(a.maxTotalTokens,0),longInputRequests:ab(a.longInputRequests,0),hugeInputRequests:ab(a.hugeInputRequests,0),extremeInputRequests:ab(a.extremeInputRequests,0),heavyRequests:ab(a.heavyRequests,0),longInputRate:c?ab(a.longInputRequests,0)/c:0,hugeInputRate:c?ab(a.hugeInputRequests,0)/c:0,extremeInputRate:c?ab(a.extremeInputRequests,0)/c:0,heavyRequestRate:c?ab(a.heavyRequests,0)/c:0,apiKeyCount:ab(a.apiKeyCount,0),sourceIpCount:ab(a.sourceIpCount,0),sourceToolCount:ab(a.sourceToolCount,0),modelCount:ab(a.modelCount,0),providerCount:ab(a.providerCount,0),lastSeen:a.lastSeen||"",...b}})(a,{apiKeyName:_(a.apiKeyName),apiKeyOwner:_(a.apiKeyOwner),apiKeyFingerprint:_(a.apiKeyFingerprint),primaryClientIp:_(a.primaryClientIp),primarySourceTool:_(a.primarySourceTool)}))}catch(a){return console.error(`[analytics] Failed to build top ${d} ${e} consumers:`,a?.message||a),[]}}async function a$(a,b,c){return await aZ(a,b,c,{dimension:"apiKey",order:"tokens",limit:25})}async function a_(a,b,c){return await aZ(a,b,c,{dimension:"sourceIp",order:"tokens",limit:25})}async function a0(a,b,c){return await aZ(a,b,c,{dimension:"sourceIp",order:"heavy",limit:25})}async function a1(a,b,c,d=new Map){let e=aE(b,c),f=await aX(a,b,c,"model",d),g=await aX(a,b,c,"provider",d),h=await aX(a,b,c,"endpoint",d),i=await aX(a,b,c,"clientIpNormalized",d),j=await aX(a,b,c,"sourceTool",d);try{return(await a.all(`WITH base AS (
275
+ LIMIT ?`,[...g.params,3e4,5e4,7e4,3e4,3e4,f])||[]).map(a=>(function(a={},b={}){let c=_(a.requests,0),d=_(a.promptTokens,0),e=_(a.completionTokens,0),f=_(a.totalTokens,d+e);return{key:Z(a.key||a.groupKey)||"unknown",label:Z(a.label||a.groupLabel||a.key||a.groupKey)||"unknown",requests:c,promptTokens:d,completionTokens:e,totalTokens:f,cost:_(a.cost,0),avgPromptTokens:c?d/c:0,avgCompletionTokens:c?e/c:0,avgTokens:c?f/c:0,p95PromptTokens:_(a.p95PromptTokens,0),maxPromptTokens:_(a.maxPromptTokens,0),p95TotalTokens:_(a.p95TotalTokens,0),maxTotalTokens:_(a.maxTotalTokens,0),longInputRequests:_(a.longInputRequests,0),hugeInputRequests:_(a.hugeInputRequests,0),extremeInputRequests:_(a.extremeInputRequests,0),heavyRequests:_(a.heavyRequests,0),longInputRate:c?_(a.longInputRequests,0)/c:0,hugeInputRate:c?_(a.hugeInputRequests,0)/c:0,extremeInputRate:c?_(a.extremeInputRequests,0)/c:0,heavyRequestRate:c?_(a.heavyRequests,0)/c:0,apiKeyCount:_(a.apiKeyCount,0),sourceIpCount:_(a.sourceIpCount,0),sourceToolCount:_(a.sourceToolCount,0),modelCount:_(a.modelCount,0),providerCount:_(a.providerCount,0),lastSeen:a.lastSeen||"",...b}})(a,{apiKeyName:Z(a.apiKeyName),apiKeyOwner:Z(a.apiKeyOwner),apiKeyFingerprint:Z(a.apiKeyFingerprint),primaryClientIp:Z(a.primaryClientIp),primarySourceTool:Z(a.primarySourceTool)}))}catch(a){return console.error(`[analytics] Failed to build top ${d} ${e} consumers:`,a?.message||a),[]}}async function aY(a,b,c){return await aX(a,b,c,{dimension:"apiKey",order:"tokens",limit:25})}async function aZ(a,b,c){return await aX(a,b,c,{dimension:"sourceIp",order:"tokens",limit:25})}async function a$(a,b,c){return await aX(a,b,c,{dimension:"sourceIp",order:"heavy",limit:25})}async function a_(a,b,c,d=new Map){let e=aC(b,c),f=await aV(a,b,c,"model",d),g=await aV(a,b,c,"provider",d),h=await aV(a,b,c,"endpoint",d),i=await aV(a,b,c,"clientIpNormalized",d),j=await aV(a,b,c,"sourceTool",d);try{return(await a.all(`WITH base AS (
276
276
  SELECT
277
- ${aU} AS clientKey,
278
- ${aV} AS clientLabel,
277
+ ${aS} AS clientKey,
278
+ ${aT} AS clientLabel,
279
279
  COALESCE(NULLIF(apiKeyOwner, ''), '') AS ownerUser,
280
280
  COALESCE(NULLIF(apiKeyName, ''), '') AS apiKeyName,
281
281
  COALESCE(NULLIF(apiKeyFingerprint, ''), '') AS apiKeyFingerprint,
@@ -339,27 +339,27 @@
339
339
  FROM ranked
340
340
  GROUP BY clientKey
341
341
  ORDER BY promptTokens DESC, totalTokens DESC, requests DESC
342
- LIMIT ?`,[...e.params,3e4,5e4,7e4,45e3,2e4,25])||[]).map(a=>aY(a,{topModels:f.get(a.clientKey)||[],topProviders:g.get(a.clientKey)||[],topEndpoints:h.get(a.clientKey)||[],topIps:i.get(a.clientKey)||[],topTools:j.get(a.clientKey)||[]}))}catch(a){return console.error("[analytics] Failed to build top heavy users:",a?.message||a),[]}}async function a2(a,b,c){let d=at(b,c);try{return(await a.all(`SELECT
343
- ${aU} AS clientKey,
344
- ${aV} AS clientLabel,
342
+ LIMIT ?`,[...e.params,3e4,5e4,7e4,45e3,2e4,25])||[]).map(a=>aW(a,{topModels:f.get(a.clientKey)||[],topProviders:g.get(a.clientKey)||[],topEndpoints:h.get(a.clientKey)||[],topIps:i.get(a.clientKey)||[],topTools:j.get(a.clientKey)||[]}))}catch(a){return console.error("[analytics] Failed to build top heavy users:",a?.message||a),[]}}async function a0(a,b,c){let d=ar(b,c);try{return(await a.all(`SELECT
343
+ ${aS} AS clientKey,
344
+ ${aT} AS clientLabel,
345
345
  COALESCE(NULLIF(apiKeyOwner, ''), '') AS ownerUser,
346
346
  COALESCE(NULLIF(apiKeyName, ''), '') AS apiKeyName,
347
347
  COALESCE(NULLIF(apiKeyFingerprint, ''), '') AS apiKeyFingerprint,
348
348
  MAX(clientIpNormalized) AS primaryClientIp,
349
349
  MAX(COALESCE(NULLIF(sourceTool, ''), NULLIF(sourceToolLabel, ''))) AS primarySourceTool,
350
- SUM(CASE WHEN ${Z} THEN 1 ELSE 0 END) AS requests,
351
- SUM(CASE WHEN ${Z} AND ${X} THEN 1 ELSE 0 END) AS success,
352
- SUM(CASE WHEN ${Z} AND NOT ${X} THEN 1 ELSE 0 END) AS errors,
353
- SUM(CASE WHEN ${Z} THEN COALESCE(promptTokens, 0) ELSE 0 END) AS promptTokens,
354
- SUM(CASE WHEN ${Z} THEN COALESCE(completionTokens, 0) ELSE 0 END) AS completionTokens,
355
- SUM(CASE WHEN ${Z} THEN COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0) ELSE 0 END) AS totalTokens,
350
+ SUM(CASE WHEN ${X} THEN 1 ELSE 0 END) AS requests,
351
+ SUM(CASE WHEN ${X} AND ${V} THEN 1 ELSE 0 END) AS success,
352
+ SUM(CASE WHEN ${X} AND NOT ${V} THEN 1 ELSE 0 END) AS errors,
353
+ SUM(CASE WHEN ${X} THEN COALESCE(promptTokens, 0) ELSE 0 END) AS promptTokens,
354
+ SUM(CASE WHEN ${X} THEN COALESCE(completionTokens, 0) ELSE 0 END) AS completionTokens,
355
+ SUM(CASE WHEN ${X} THEN COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0) ELSE 0 END) AS totalTokens,
356
356
  MAX(timestamp) AS lastSeen
357
357
  FROM usageHistory
358
358
  ${d.clause}
359
- GROUP BY ${aU}
359
+ GROUP BY ${aS}
360
360
  HAVING errors > 0
361
361
  ORDER BY errors DESC, requests DESC
362
- LIMIT ?`,[...d.params,25])||[]).map(a=>aY(a))}catch(a){return console.error("[analytics] Failed to build problem clients:",a?.message||a),[]}}async function a3(a,b,c){let d=aE(b,c);try{let b=await a.all(`WITH base AS (
362
+ LIMIT ?`,[...d.params,25])||[]).map(a=>aW(a))}catch(a){return console.error("[analytics] Failed to build problem clients:",a?.message||a),[]}}async function a1(a,b,c){let d=aC(b,c);try{let b=await a.all(`WITH base AS (
363
363
  SELECT
364
364
  CASE
365
365
  WHEN promptTokens < 2000 THEN 'lt2k'
@@ -417,7 +417,7 @@
417
417
  MIN(CASE WHEN ttftMs > 0 AND ttftRank >= ((cnt * 95 + 99) / 100) THEN ttftMs END) AS p95TtftMs
418
418
  FROM ranked
419
419
  GROUP BY bucketKey, label, sortOrder
420
- ORDER BY sortOrder ASC`,d.params)||[],c=b.reduce((a,b)=>a+ab(b.requests,0),0);return b.map(a=>({key:a.key,label:a.label,requests:ab(a.requests,0),share:c?ab(a.requests,0)/c:0,promptTokens:ab(a.promptTokens,0),completionTokens:ab(a.completionTokens,0),totalTokens:ab(a.totalTokens,0),avgPromptTokens:ab(a.avgPromptTokens,0),maxPromptTokens:ab(a.maxPromptTokens,0),avgLatencyMs:ab(a.avgLatencyMs,null),p95LatencyMs:ab(a.p95LatencyMs,null),maxLatencyMs:ab(a.maxLatencyMs,null),avgTtftMs:ab(a.avgTtftMs,null),p95TtftMs:ab(a.p95TtftMs,null)}))}catch(a){return console.error("[analytics] Failed to build input size buckets:",a?.message||a),[]}}async function a4(a,b,c){let d=at(b,c),e={clause:d.clause?`${d.clause} AND ${Z}`:`WHERE ${Z}`,params:d.params};try{let b=await a.get(`SELECT
420
+ ORDER BY sortOrder ASC`,d.params)||[],c=b.reduce((a,b)=>a+_(b.requests,0),0);return b.map(a=>({key:a.key,label:a.label,requests:_(a.requests,0),share:c?_(a.requests,0)/c:0,promptTokens:_(a.promptTokens,0),completionTokens:_(a.completionTokens,0),totalTokens:_(a.totalTokens,0),avgPromptTokens:_(a.avgPromptTokens,0),maxPromptTokens:_(a.maxPromptTokens,0),avgLatencyMs:_(a.avgLatencyMs,null),p95LatencyMs:_(a.p95LatencyMs,null),maxLatencyMs:_(a.maxLatencyMs,null),avgTtftMs:_(a.avgTtftMs,null),p95TtftMs:_(a.p95TtftMs,null)}))}catch(a){return console.error("[analytics] Failed to build input size buckets:",a?.message||a),[]}}async function a2(a,b,c){let d=ar(b,c),e={clause:d.clause?`${d.clause} AND ${X}`:`WHERE ${X}`,params:d.params};try{let b=await a.get(`SELECT
421
421
  COUNT(*) AS totalRequests,
422
422
  SUM(CASE WHEN thinkingEnabled = 1 THEN 1 ELSE 0 END) AS thinkingOnRequests,
423
423
  SUM(CASE WHEN thinkingEnabled = 0 THEN 1 ELSE 0 END) AS thinkingOffRequests,
@@ -448,7 +448,7 @@
448
448
  GROUP BY provider, model
449
449
  HAVING requests > 0
450
450
  ORDER BY autoOffRequests DESC, requests DESC
451
- LIMIT 20`,e.params)||[],f=ab(b.totalRequests,0),g=ab(b.autoOffRequests,0),h=ab(b.thinkingOnRequests,0),i=ab(b.thinkingOffRequests,0),j=ab(b.unknownRequests,0),k=ab(b.thresholdConfiguredRequests,0);return{totalRequests:f,thinkingOnRequests:h,thinkingOffRequests:i,unknownRequests:j,autoOffRequests:g,thresholdConfiguredRequests:k,thinkingOnRate:f?h/f:0,thinkingOffRate:f?i/f:0,unknownRate:f?j/f:0,autoOffRate:f?g/f:0,autoOffEligibleHitRate:k?g/k:0,avgPromptChars:ab(b.avgPromptChars,0),maxPromptChars:ab(b.maxPromptChars,0),avgAutoOffPromptChars:ab(b.avgAutoOffPromptChars,0),byReason:c.map(a=>({reason:a.reason||"unknown",requests:ab(a.requests,0),share:g?ab(a.requests,0)/g:0,avgPromptChars:ab(a.avgPromptChars,0),maxPromptChars:ab(a.maxPromptChars,0)})),byModel:d.map(a=>{let b=ab(a.requests,0),c=ab(a.autoOffRequests,0);return{provider:a.provider||"",model:a.model||"",requests:b,thinkingOnRequests:ab(a.thinkingOnRequests,0),thinkingOffRequests:ab(a.thinkingOffRequests,0),autoOffRequests:c,autoOffRate:b?c/b:0,avgPromptChars:ab(a.avgPromptChars,0),maxPromptChars:ab(a.maxPromptChars,0)}})}}catch(a){return console.error("[analytics] Failed to build thinking analytics:",a?.message||a),{totalRequests:0,thinkingOnRequests:0,thinkingOffRequests:0,unknownRequests:0,autoOffRequests:0,thresholdConfiguredRequests:0,thinkingOnRate:0,thinkingOffRate:0,unknownRate:0,autoOffRate:0,autoOffEligibleHitRate:0,byReason:[],byModel:[]}}}async function a5(a,b,c){let d=at(b,c),e={clause:d.clause?`${d.clause} AND ${Z}`:`WHERE ${Z}`,params:d.params},f="CASE WHEN COALESCE(promptChars, 0) > 0 THEN promptChars ELSE COALESCE(promptTokens, 0) END";try{let b=await a.get(`SELECT
451
+ LIMIT 20`,e.params)||[],f=_(b.totalRequests,0),g=_(b.autoOffRequests,0),h=_(b.thinkingOnRequests,0),i=_(b.thinkingOffRequests,0),j=_(b.unknownRequests,0),k=_(b.thresholdConfiguredRequests,0);return{totalRequests:f,thinkingOnRequests:h,thinkingOffRequests:i,unknownRequests:j,autoOffRequests:g,thresholdConfiguredRequests:k,thinkingOnRate:f?h/f:0,thinkingOffRate:f?i/f:0,unknownRate:f?j/f:0,autoOffRate:f?g/f:0,autoOffEligibleHitRate:k?g/k:0,avgPromptChars:_(b.avgPromptChars,0),maxPromptChars:_(b.maxPromptChars,0),avgAutoOffPromptChars:_(b.avgAutoOffPromptChars,0),byReason:c.map(a=>({reason:a.reason||"unknown",requests:_(a.requests,0),share:g?_(a.requests,0)/g:0,avgPromptChars:_(a.avgPromptChars,0),maxPromptChars:_(a.maxPromptChars,0)})),byModel:d.map(a=>{let b=_(a.requests,0),c=_(a.autoOffRequests,0);return{provider:a.provider||"",model:a.model||"",requests:b,thinkingOnRequests:_(a.thinkingOnRequests,0),thinkingOffRequests:_(a.thinkingOffRequests,0),autoOffRequests:c,autoOffRate:b?c/b:0,avgPromptChars:_(a.avgPromptChars,0),maxPromptChars:_(a.maxPromptChars,0)}})}}catch(a){return console.error("[analytics] Failed to build thinking analytics:",a?.message||a),{totalRequests:0,thinkingOnRequests:0,thinkingOffRequests:0,unknownRequests:0,autoOffRequests:0,thresholdConfiguredRequests:0,thinkingOnRate:0,thinkingOffRate:0,unknownRate:0,autoOffRate:0,autoOffEligibleHitRate:0,byReason:[],byModel:[]}}}async function a3(a,b,c){let d=ar(b,c),e={clause:d.clause?`${d.clause} AND ${X}`:`WHERE ${X}`,params:d.params},f="CASE WHEN COALESCE(promptChars, 0) > 0 THEN promptChars ELSE COALESCE(promptTokens, 0) END";try{let b=await a.get(`SELECT
452
452
  COUNT(*) AS totalRequests,
453
453
  SUM(CASE WHEN ${f} >= 30000 THEN 1 ELSE 0 END) AS gte30kRequests,
454
454
  SUM(CASE WHEN ${f} >= 50000 THEN 1 ELSE 0 END) AS gte50kRequests,
@@ -495,11 +495,11 @@
495
495
  SUM(CASE WHEN thinkingAutoOff = 1 THEN 1 ELSE 0 END) AS autoOffRequests
496
496
  FROM base
497
497
  GROUP BY label, sortOrder
498
- ORDER BY sortOrder ASC`,e.params)||[],d=ab(b.totalRequests,0),g=ab(b.gte30kRequests,0),h=ab(b.gte50kRequests,0),i=ab(b.gte100kRequests,0);return{totalRequests:d,gte30kRequests:g,gte50kRequests:h,gte100kRequests:i,gte30kRate:d?g/d:0,gte50kRate:d?h/d:0,gte100kRate:d?i/d:0,avgRequestSize:ab(b.avgRequestSize,0),maxRequestSize:ab(b.maxRequestSize,0),avgLargeLatencyMs:ab(b.avgLargeLatencyMs,null),avgLargeTtftMs:ab(b.avgLargeTtftMs,null),largePromptTokens:ab(b.largePromptTokens,0),largeCompletionTokens:ab(b.largeCompletionTokens,0),buckets:c.map(a=>{let b=ab(a.requests,0),c=ab(a.autoOffRequests,0);return{label:a.label,requests:b,share:d?b/d:0,avgRequestSize:ab(a.avgRequestSize,0),maxRequestSize:ab(a.maxRequestSize,0),avgLatencyMs:ab(a.avgLatencyMs,null),avgTtftMs:ab(a.avgTtftMs,null),promptTokens:ab(a.promptTokens,0),completionTokens:ab(a.completionTokens,0),autoOffRequests:c,autoOffRate:b?c/b:0}})}}catch(a){return console.error("[analytics] Failed to build large context analytics:",a?.message||a),{totalRequests:0,gte30kRequests:0,gte50kRequests:0,gte100kRequests:0,gte30kRate:0,gte50kRate:0,gte100kRate:0,buckets:[]}}}async function a6(a,b,c,d={},e=new Map){let f=await a1(a,b,c,e),g=await a2(a,b,c),h=await a$(a,b,c),i=await a_(a,b,c),j=await a0(a,b,c),k=await a3(a,b,c),l=f[0]||null,m=h[0]||null,n=i[0]||null,o=j[0]||null,p=f.reduce((a,b)=>a+ab(b.totalTokens,0),0),q=ab(d.totalTokens,0),r=l&&q?ab(l.totalTokens,0)/q:0,s=m&&q?ab(m.totalTokens,0)/q:0,t=n&&q?ab(n.totalTokens,0)/q:0,u=k.filter(a=>["30k-50k","50k-70k",">=70k"].includes(a.label)).reduce((a,b)=>a+ab(b.share,0),0),v=k.find(a=>">=70k"===a.label)||null;return{summary:{trackedUsers:f.length,topUserLabel:l?.label||"-",topUserTokens:l?.totalTokens||0,topUserTokenShare:r,topUsersTokenShare:q?p/q:0,topApiKeyLabel:m?.label||"-",topApiKeyTokens:m?.totalTokens||0,topApiKeyTokenShare:s,topSourceIpLabel:n?.label||"-",topSourceIpTokens:n?.totalTokens||0,topSourceIpTokenShare:t,topSourceIpHeavyLabel:o?.label||"-",topSourceIpHeavyRequests:o?.heavyRequests||0,longInputBucketShare:u,extremeInputShare:v?.share||0,problemClients:g.length},topHeavyUsers:f,topProblemClients:g,topApiKeysByTokens:h,topSourceIpsByTokens:i,topSourceIpsByHeavyRequests:j,inputBuckets:k}}function a7(a){let b=String(a??"");return/[",\n\r]/.test(b)?`"${b.replace(/"/g,'""')}"`:b}function a8(a){global._dashboardAnalyticsV4BuildQueue||(global._dashboardAnalyticsV4BuildQueue=Promise.resolve());let b=global._dashboardAnalyticsV4BuildQueue.catch(()=>{}).then(a);return global._dashboardAnalyticsV4BuildQueue=b.then(()=>void 0,()=>void 0),b}async function a9(a,b=4){let c=[a].filter(Boolean),d=Math.max(0,Math.max(1,Math.min(6,Number(b)||4))-c.length);if(d<=0)return c;for(let a of(await Promise.all(Array.from({length:d},async()=>{try{return await (0,O.d9)()}catch(a){return console.warn("[dashboardAnalytics] Extra MySQL analytics connection unavailable:",a?.message||a),null}}))))a&&c.push(a);return c}function ba(a,b=0){return Array.isArray(a)&&0!==a.length?a[Math.abs(b)%a.length]||a[0]:null}async function bb(a=[]){let b=[...new Set((a||[]).filter(Boolean))];await Promise.all(b.map(a=>a?.close?.().catch(()=>{})))}function bc(a={}){return{rows:[],generatedAt:"",nextRefreshAt:"",refreshEveryMs:Q,period:S,periodLabel:"H\xf4m nay",status:"warming",...a}}function bd(){return global._dashboardTokenLeaderboard||(global._dashboardTokenLeaderboard={data:bc(),refreshPromise:null,timerStarted:!1,lastError:""}),global._dashboardTokenLeaderboard}async function be(){let a=am({period:S,timeZone:T}),b=await (0,O.d9)(),c=[b];try{c=await a9(b,1);let d=ba(c,0),e=aE(a,null),f=await d.get(`SELECT
498
+ ORDER BY sortOrder ASC`,e.params)||[],d=_(b.totalRequests,0),g=_(b.gte30kRequests,0),h=_(b.gte50kRequests,0),i=_(b.gte100kRequests,0);return{totalRequests:d,gte30kRequests:g,gte50kRequests:h,gte100kRequests:i,gte30kRate:d?g/d:0,gte50kRate:d?h/d:0,gte100kRate:d?i/d:0,avgRequestSize:_(b.avgRequestSize,0),maxRequestSize:_(b.maxRequestSize,0),avgLargeLatencyMs:_(b.avgLargeLatencyMs,null),avgLargeTtftMs:_(b.avgLargeTtftMs,null),largePromptTokens:_(b.largePromptTokens,0),largeCompletionTokens:_(b.largeCompletionTokens,0),buckets:c.map(a=>{let b=_(a.requests,0),c=_(a.autoOffRequests,0);return{label:a.label,requests:b,share:d?b/d:0,avgRequestSize:_(a.avgRequestSize,0),maxRequestSize:_(a.maxRequestSize,0),avgLatencyMs:_(a.avgLatencyMs,null),avgTtftMs:_(a.avgTtftMs,null),promptTokens:_(a.promptTokens,0),completionTokens:_(a.completionTokens,0),autoOffRequests:c,autoOffRate:b?c/b:0}})}}catch(a){return console.error("[analytics] Failed to build large context analytics:",a?.message||a),{totalRequests:0,gte30kRequests:0,gte50kRequests:0,gte100kRequests:0,gte30kRate:0,gte50kRate:0,gte100kRate:0,buckets:[]}}}async function a4(a,b,c,d={},e=new Map){let f=await a_(a,b,c,e),g=await a0(a,b,c),h=await aY(a,b,c),i=await aZ(a,b,c),j=await a$(a,b,c),k=await a1(a,b,c),l=f[0]||null,m=h[0]||null,n=i[0]||null,o=j[0]||null,p=f.reduce((a,b)=>a+_(b.totalTokens,0),0),q=_(d.totalTokens,0),r=l&&q?_(l.totalTokens,0)/q:0,s=m&&q?_(m.totalTokens,0)/q:0,t=n&&q?_(n.totalTokens,0)/q:0,u=k.filter(a=>["30k-50k","50k-70k",">=70k"].includes(a.label)).reduce((a,b)=>a+_(b.share,0),0),v=k.find(a=>">=70k"===a.label)||null;return{summary:{trackedUsers:f.length,topUserLabel:l?.label||"-",topUserTokens:l?.totalTokens||0,topUserTokenShare:r,topUsersTokenShare:q?p/q:0,topApiKeyLabel:m?.label||"-",topApiKeyTokens:m?.totalTokens||0,topApiKeyTokenShare:s,topSourceIpLabel:n?.label||"-",topSourceIpTokens:n?.totalTokens||0,topSourceIpTokenShare:t,topSourceIpHeavyLabel:o?.label||"-",topSourceIpHeavyRequests:o?.heavyRequests||0,longInputBucketShare:u,extremeInputShare:v?.share||0,problemClients:g.length},topHeavyUsers:f,topProblemClients:g,topApiKeysByTokens:h,topSourceIpsByTokens:i,topSourceIpsByHeavyRequests:j,inputBuckets:k}}function a5(a){let b=String(a??"");return/[",\n\r]/.test(b)?`"${b.replace(/"/g,'""')}"`:b}async function a6(a,b=4){let c=[a].filter(Boolean),d=Math.max(0,Math.max(1,Math.min(6,Number(b)||4))-c.length);if(d<=0)return c;for(let a of(await Promise.all(Array.from({length:d},async()=>{try{return await (0,O.d9)()}catch(a){return console.warn("[dashboardAnalytics] Extra MySQL analytics connection unavailable:",a?.message||a),null}}))))a&&c.push(a);return c}function a7(a,b=0){return Array.isArray(a)&&0!==a.length?a[Math.abs(b)%a.length]||a[0]:null}async function a8(a=[]){let b=[...new Set((a||[]).filter(Boolean))];await Promise.all(b.map(a=>a?.close?.().catch(()=>{})))}function a9(a={}){return{rows:[],generatedAt:"",nextRefreshAt:"",refreshEveryMs:9e5,period:Q,periodLabel:"H\xf4m nay",status:"warming",...a}}function ba(){return global._dashboardTokenLeaderboard||(global._dashboardTokenLeaderboard={data:a9(),refreshPromise:null,timerStarted:!1,lastError:""}),global._dashboardTokenLeaderboard}async function bb(){let a=ak({period:Q,timeZone:R}),b=await (0,O.d9)(),c=[b];try{c=await a6(b,1);let d=a7(c,0),e=aC(a,null),f=await d.get(`SELECT
499
499
  SUM(COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)) AS totalTokens,
500
500
  COUNT(*) AS requests
501
501
  FROM usageHistory
502
- ${e.clause}`,e.params)||{},g=ab(f.totalTokens,0),h=await d.all(`WITH base AS (
502
+ ${e.clause}`,e.params)||{},g=_(f.totalTokens,0),h=await d.all(`WITH base AS (
503
503
  SELECT
504
504
  COALESCE(NULLIF(apiKeyOwner, ''), NULLIF(apiKeyName, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKeyId, ''), 'local-no-key') AS groupKey,
505
505
  COALESCE(NULLIF(apiKeyOwner, ''), '') AS ownerUser,
@@ -534,4 +534,4 @@
534
534
  FROM base
535
535
  GROUP BY groupKey
536
536
  ORDER BY totalTokens DESC, requests DESC
537
- LIMIT ?`,[...e.params,5])||[];return{rows:function(a=[],b=0){return a.map((a,c)=>{let d=c+1,e=ab(a.promptTokens,0),f=ab(a.completionTokens,0),g=ab(a.totalTokens,e+f),h=_(a.ownerUser),i=_(a.apiKeyName),j=_(a.apiKeyFingerprint);return{key:_(a.key)||`${d}`,rank:d,title:U[c]||"Token Royalty",ownerUser:h,label:h||i||j||"Local / kh\xf4ng API key",apiKeyName:i,apiKeyFingerprint:j,requests:ab(a.requests,0),promptTokens:e,completionTokens:f,totalTokens:g,cost:ab(a.cost,0),apiKeyCount:ab(a.apiKeyCount,0),modelCount:ab(a.modelCount,0),providerCount:ab(a.providerCount,0),sourceIpCount:ab(a.sourceIpCount,0),lastSeen:a.lastSeen||"",tokenShare:b?g/b:0}})}(h,g),generatedAt:new Date().toISOString(),nextRefreshAt:new Date(Date.now()+Q).toISOString(),refreshEveryMs:Q,period:S,periodLabel:"H\xf4m nay",status:"ready",totalTokens:g,totalRequests:ab(f.requests,0)}}finally{await bb(c)}}async function bf({serialize:a=!0}={}){let b=bd();return b.refreshPromise||(b.refreshPromise=(a?a8(()=>be()):be()).then(a=>(b.data=a,b.lastError="",a)).catch(a=>{let c=a?.message||String(a);return b.lastError=c,b.data=b.data?.rows?.length?{...b.data,status:"stale",error:c}:bc({status:"error",error:c}),console.error("[analytics] Failed to refresh token leaderboard:",c),b.data}).finally(()=>{b.refreshPromise=null})),b.refreshPromise}function bg(){let a=bd();if(a.timerStarted)return;if(a.timerStarted=!0,a.data?.status!=="ready"&&!a.data?.rows?.length){let a=setTimeout(()=>{bf().catch(()=>{})},1e3);a.unref?.()}let b=setInterval(()=>{bf().catch(()=>{})},Q);b.unref?.()}async function bh(){let a=bd();if(a.data?.status==="ready"||a.data?.rows?.length)return bg(),a.data;let b=await bf({serialize:!1});return bg(),b}async function bi(a){let b=await (0,w.c)(),c=await (0,O.d9)().catch(a=>(console.error("[dashboardAnalytics] MySQL observability query adapter unavailable; SQLite fallback is disabled:",a?.message||a),null));if(!c)throw Error("MySQL observability is not configured or unavailable; SQLite analytics fallback is disabled.");let d=[c];try{d=await a9(c,3);let e=ba(d,0),[f,g]=await Promise.all([ao(b),ap(b)]),h=a.userOwnedOnly?function(a=[],b={}){let c=[...new Set((a||[]).map(a=>aa(a)).filter(Boolean))];if(0===c.length)return{enabled:!0,noMatch:!0,owners:[],identifiers:[],ids:[],fingerprints:[]};let d=new Set(c),e=new Set,f=new Set,g=new Set;for(let a of b.all||[]){let b=aa(a.ownerUser);b&&d.has(b)&&(a.key&&e.add(a.key),a.id&&(e.add(a.id),f.add(a.id)),a.fingerprint&&(e.add(a.fingerprint),g.add(a.fingerprint)))}return{enabled:!0,noMatch:0===e.size,owners:c,identifiers:[...e],ids:[...f],fingerprints:[...g]}}(a.ownerCandidates,f):a.ownedAnyUserOnly?function(a={}){let b=new Set,c=new Set,d=new Set,e=new Set;for(let f of a.all||[]){let a=aa(f.ownerUser);a&&(b.add(a),f.key&&c.add(f.key),f.id&&(c.add(f.id),d.add(f.id)),f.fingerprint&&(c.add(f.fingerprint),e.add(f.fingerprint)))}return{enabled:!0,noMatch:0===c.size&&0===b.size,owners:[...b],identifiers:[...c],ids:[...d],fingerprints:[...e]}}(f):null,i=h?{...a,ownerScope:h}:a,j=function(a,b){let c=aa(a);if(!c)return null;let d=[],e=!1;for(let a of(["local","local-no-key","no-key","khong-key","kh\xf4ng-key","kh\xf4ng d\xf9ng api key"].some(a=>a.includes(c)||c.includes(a))&&(e=!0),b.all||[]))[a.key,a.id,a.name,a.ownerUser,a.createdByUser,a.machineId,a.fingerprint,a.masked].some(a=>aa(a).includes(c))&&a.key&&d.push(a.key);return a.length>=16&&!d.includes(a)&&d.push(a),{keys:[...new Set(d)],includeLocal:e,noMatch:0===d.length&&!e,filter:c}}(i.apiKey,f),k=i.userOwnedOnly||i.ownedAnyUserOnly?Promise.resolve(function(a="disabled"){return{disabled:!0,reason:a,missing:!1,total:0,sampled:0,dbInfo:{},models:[],stages:[],topClientIps:[],topSourceTools:[],topSessions:[],topStages:[],topModels:[],topAccounts:[],topStatuses:[]}}("user_owned_scope_no_api_key_columns")):M({keyword:i.keyword,model:i.model,sourceTool:i.sourceTool,clientIp:i.clientIp,sessionId:i.sessionId,dateFrom:i.startIso,dateTo:i.endIso,workingTimeRanges:i.workingTimeRanges}),l=(0,N.Wl)({keyword:i.keyword,provider:i.provider,model:i.model,connectionId:i.connectionId,endpoint:i.endpoint,apiKey:i.apiKey,apiKeyScope:h,status:i.status,sourceTool:i.sourceTool,clientIp:i.clientIp,sessionId:i.sessionId,dateFrom:i.startIso,dateTo:i.endIso,workingTimeRanges:i.workingTimeRanges}),[m,n,o,p,q,r]=await Promise.all([av(ba(d,0),i,j),aw(ba(d,1),i,j),aA(ba(d,2),i,f,g,j),aD(ba(d,3),i,j),k,l]),s=function(a={},b=new Map){if(!a||"object"!=typeof a)return a;let c=a=>Array.isArray(a)?a.map(a=>(function(a={},b=new Map){if(!a||"object"!=typeof a)return a;let c=_(a.provider||a.errorSource||a.providerId),d=_(a.providerLabel)||aq(c,b),e={...a};for(let a of["sample","sampleMessage","errorMessage","errorMessageShort","message","details"])"string"==typeof e[a]&&(e[a]=function(a,b,c){let d="string"==typeof a?a:"";return d&&b&&c&&b!==c?d.split(b).join(c):a}(e[a],c,d));return{...e,provider:c,providerLabel:d,label:_(e.label)||d||c||"unknown"}})(a,b)):[];return{...a,topErrors:c(a.topErrors),topServerErrors:c(a.topServerErrors),topClientErrors:c(a.topClientErrors),topRateLimitErrors:c(a.topRateLimitErrors),errorDistribution:c(a.errorDistribution),byFaultOwner:c(a.byFaultOwner),byProvider:c(a.byProvider)}}(r,g),t=s?.summary||{};n.rawErrorEvents=ab(s?.total,0),n.serverErrorEvents=ab(t.serverImpacting,0),n.gatewayErrorEvents=ab(t.gateway,0),n.upstreamErrorEvents=ab(t.upstream,0),n.clientErrorEvents=ab(t.client,0),n.rateLimitErrorEvents=ab(t.rateLimit,0),n.unknownErrorEvents=ab(t.unknown,0),n.serverErrorRate=n.requests?n.serverErrorEvents/n.requests:0,n.clientErrorRate=n.requests?n.clientErrorEvents/n.requests:0,n.rateLimitErrorRate=n.requests?n.rateLimitErrorEvents/n.requests:0,s?.topErrors?.length&&(o.errors=s.topErrors);let u=new Map([...f.byKey.entries(),...f.byFingerprint.entries()]),[v,w,x,y,z,A,B]=await Promise.all([aI(ba(d,0),i,j,n),a6(ba(d,1),i,j,n,g),a4(ba(d,2),i,j),a5(ba(d,3),i,j),aB(ba(d,2),i,j,m),aM(ba(d,3),i,j,u,g),aN(ba(d,0),i,j,u,g)]),[C,D]=await Promise.all([aJ(ba(d,1),i,j,g),aK(ba(d,2),i,j,u,g)]);v.byModel=C,v.slowestRequests=D,n.userExperienceScore=v.score,n.userExperienceLabel=v.label,n.slowRequestRate=v.slowRequestRate,n.longInputRate=v.longInputRate,n.thinkingAutoOffRate=x.autoOffRate||0,n.largeContextRate=y.gte50kRate||0,n.topHeavyUser=w.summary?.topUserLabel||"",n.topHeavyUserTokenShare=w.summary?.topUserTokenShare||0,n.extremeInputShare=w.summary?.extremeInputShare||0;let E=await aT(e,i,o,q,f,j,g),F=function({overview:a,groups:b,promptLogStats:c,requestErrorStats:d,experience:e,clientRequests:f}){let g=[],h=d?.summary||{},i=ab(h.serverImpacting,0),j=ab(h.client,0),k=ab(h.rateLimit,0),l=ab(a.serverErrorRate,a.requests?i/a.requests:0),m=ab(a.clientErrorRate,a.requests?j/a.requests:0);a.requests>=10&&i>=3&&l>=.05?g.push({level:l>=.15?"danger":"warning",title:"Tỷ lệ lỗi server/provider cao",detail:`${i.toLocaleString("vi-VN")} lỗi server-impacting (${(100*l).toFixed(1)}% request) trong khoảng thời gian đang lọc. Ưu ti\xean kiểm tra upstream/provider, gateway, timeout v\xe0 5xx.`}):a.requests>=10&&a.errorRate>=.2&&m>=.1?g.push({level:"warning",title:"Nhiều lỗi do client/request",detail:`${j.toLocaleString("vi-VN")} lỗi được ph\xe2n loại l\xe0 client-side (${(100*m).toFixed(1)}% request): sai endpoint/model/auth/body/context. Kh\xf4ng n\xean t\xednh nh\xf3m n\xe0y như lỗi server.`}):a.requests>=10&&a.errorRate>=.2&&g.push({level:"warning",title:"Tỷ lệ lỗi tổng cao",detail:`Tổng lỗi usage l\xe0 ${(100*a.errorRate).toFixed(1)}%, nhưng lỗi server-impacting chỉ ${(100*l).toFixed(1)}%. Xem ph\xe2n loại client/server b\xean dưới trước khi kết luận provider hỏng.`}),k>=5&&a.requests>0&&k/a.requests>=.05&&g.push({level:"warning",title:"Rate limit / quota đ\xe1ng ch\xfa \xfd",detail:`${k.toLocaleString("vi-VN")} lỗi rate-limit/quota trong khoảng lọc. Kiểm tra policy API key, quota provider hoặc ph\xe2n tải model.`});let n=b.apiKeys?.[0];n&&a.totalTokens>0&&n.totalTokens/a.totalTokens>=.5&&g.push({level:"warning",title:"Một API key d\xf9ng phần lớn token",detail:`${n.name||n.fingerprint} đang d\xf9ng ${(n.totalTokens/a.totalTokens*100).toFixed(1)}% tổng token.`});let o=c?.topClientIps?.[0];o&&c.total>0&&o.requests/c.total>=.5&&o.requests>=20&&g.push({level:"warning",title:"Một IP chiếm phần lớn request prompt log",detail:`${o.label} chiếm ${(o.requests/c.total*100).toFixed(1)}% prompt logs trong to\xe0n bộ dữ liệu khớp bộ lọc.`});let p=d?.topServerErrors?.[0];return p&&p.requests>=5&&g.push({level:p.requests>=20?"danger":"warning",title:"Provider/Gateway c\xf3 lỗi cần xử l\xfd",detail:`${p.providerLabel||p.provider||p.errorSource||"unknown"}/${p.model||"unknown"} c\xf3 ${p.requests.toLocaleString("vi-VN")} lỗi ${p.errorType||p.status||"server-impacting"}.`}),e?.samples>=10&&ab(e.slowRequestRate,0)>=.2&&g.push({level:e.slowRequestRate>=.4?"danger":"warning",title:"Nhiều request phản hồi chậm",detail:`${(100*e.slowRequestRate).toFixed(1)}% request th\xe0nh c\xf4ng c\xf3 latency >= 45s. Kiểm tra request input d\xe0i, chờ slot/upstream queue v\xe0 tải model server.`}),e?.samples>=10&&ab(e.longInputRate,0)>=.3&&g.push({level:"warning",title:"Tỷ lệ request input d\xe0i cao",detail:`${(100*e.longInputRate).toFixed(1)}% request c\xf3 input >= 30k token. Với VS Code/agent, P95/P99 latency cao c\xf3 thể chủ yếu do prompt eval v\xe0 chờ slot, kh\xf4ng phải do output chậm.`}),f?.summary?.topUserTokenShare>=.35&&g.push({level:f.summary.topUserTokenShare>=.6?"danger":"warning",title:"Token usage tập trung v\xe0o một user/API key",detail:`${f.summary.topUserLabel||"Một client"} đang chiếm ${(100*f.summary.topUserTokenShare).toFixed(1)}% tổng token trong khoảng lọc. N\xean kiểm tra quota, workflow VS Code/agent v\xe0 request input d\xe0i của client n\xe0y.`}),f?.summary?.extremeInputShare>=.1&&g.push({level:f.summary.extremeInputShare>=.25?"danger":"warning",title:"Nhiều request cực d\xe0i >=70k token",detail:`${(100*f.summary.extremeInputShare).toFixed(1)}% request th\xe0nh c\xf4ng c\xf3 input >=70k token. Đ\xe2y l\xe0 nh\xf3m dễ k\xe9o TTFT/P95/P99 l\xean cao v\xe0 l\xe0m request nhỏ phải chờ slot.`}),g}({overview:n,groups:o,promptLogStats:q,requestErrorStats:s,experience:v,clientRequests:w}),G=await bh(),H={generatedAt:new Date().toISOString(),analyticsVersion:"v3.7-token-leaderboard-cache",filters:{period:i.period,startIso:i.startIso,endIso:i.endIso,provider:i.provider,model:i.model,connectionId:i.connectionId,status:i.status,endpoint:i.endpoint,apiKey:i.apiKey,clientIp:i.clientIp,sourceTool:i.sourceTool,sessionId:i.sessionId,keyword:i.keyword,userOwnedOnly:i.userOwnedOnly,ownedAnyUserOnly:i.ownedAnyUserOnly},overview:n,latency:p,experience:v,clientRequests:w,tokenLeaderboard:G,thinkingAnalytics:x,largeContextAnalytics:y,timeSeries:z,groups:o,promptLogs:q,requestErrors:s,anomalies:F,recentUsage:A,heavyRequests:B,options:E,qualityNotes:[]};return await bb(d),H}catch(a){throw await bb(d),console.error("[dashboardAnalytics] MySQL observability query failed; SQLite fallback is disabled:",a?.message||a),a}}async function bj(a={}){var b;let c,d=Date.now(),e=(c={...b=am(a,{now:new Date(d)})},delete c.start,delete c.end,delete c.workingTimeRanges,"custom"!==b.period&&(c.startIso="",c.endIso=""),JSON.stringify(c)),f=(global._dashboardAnalyticsV4Cache||(global._dashboardAnalyticsV4Cache=new Map),global._dashboardAnalyticsV4Cache),g=f.get(e);if(g&&d-g.createdAt<Q)return g.lastAccessedAt=d,g.data;let h=(global._dashboardAnalyticsV4InFlight||(global._dashboardAnalyticsV4InFlight=new Map),global._dashboardAnalyticsV4InFlight),i=h.get(e);if(i)return g&&d-g.createdAt<R?(g.lastAccessedAt=d,g.data):await i;let j=a8(async()=>{let b=f.get(e),c=Date.now();if(b&&c-b.createdAt<Q)return b.lastAccessedAt=c,b.data;try{let b=am(a,{now:new Date(c)}),d=await bi(b),g=Date.now();return f.set(e,{createdAt:g,lastAccessedAt:g,data:d}),!function(a,b=Date.now()){for(let[c,d]of a)b-d.createdAt>R&&a.delete(c);if(!(a.size<=50))for(let[b]of[...a.entries()].sort((a,b)=>(a[1].lastAccessedAt||a[1].createdAt)-(b[1].lastAccessedAt||b[1].createdAt))){if(a.size<=50)break;a.delete(b)}}(f,g),d}catch(b){let a=f.get(e);if(a&&Date.now()-a.createdAt<R)return a.lastAccessedAt=Date.now(),console.warn("[dashboardAnalytics] Refresh failed; serving the last complete analytics snapshot:",b?.message||b),a.data;throw b}}).finally(()=>{h.get(e)===j&&h.delete(e)});return(h.set(e,j),g&&d-g.createdAt<R)?(g.lastAccessedAt=d,j.catch(a=>{console.error("[dashboardAnalytics] Background refresh failed:",a?.message||a)}),g.data):await j}var bk=c(9588);let bl="force-dynamic",bm=["period","dateFrom","dateTo","provider","model","connectionId","status","endpoint","apiKey","clientIp","sourceIp","sourceTool","sessionId","keyword","maxPromptLogRows","timeZone"];async function bn(a){try{let b,{access:c,response:d}=await (0,bk.oW)();if(d)return d;let{searchParams:e}=new URL(a.url),f=function(a){let b={};for(let c of bm){let d=a.get(c);null!==d&&""!==String(d).trim()&&(b[c]=d)}return b}(e);b=c.isAdmin||c.isMonitorAdmin?f:c.isAiGatewaysMonitor?{...f,ownedAnyUserOnly:!0}:{...f,userOwnedOnly:!0,ownerCandidates:[...new Set([...c.candidates||[],c.userId].map(bk.I8).filter(Boolean))]};let g=await bj(b);if("csv"===e.get("format")){let a=(function(a){let b=[];for(let[c,d]of(b.push(["section","key","label","requests","success","errors","errorRate","inputTokens","outputTokens","totalTokens","cost","lastSeen"]),[["providers",a.groups.providers],["models",a.groups.models],["providerAccounts",a.groups.providerAccounts],["apiKeys",a.groups.apiKeys],["endpoints",a.groups.endpoints],["clientIps",a.promptLogs.topClientIps],["sourceTools",a.promptLogs.topSourceTools],["requestErrors",a.requestErrors?.topErrors||a.groups.errors],["modelExperience",a.experience?.byModel||[]],["clientHeavyUsers",a.clientRequests?.topHeavyUsers||[]],["clientTopApiKeysByTokens",a.clientRequests?.topApiKeysByTokens||[]],["clientTopSourceIpsByTokens",a.clientRequests?.topSourceIpsByTokens||[]],["clientTopSourceIpsByHeavyRequests",a.clientRequests?.topSourceIpsByHeavyRequests||[]],["clientProblemClients",a.clientRequests?.topProblemClients||[]],["inputBuckets",a.clientRequests?.inputBuckets||[]]]))for(let a of d||[])b.push([c,a.key||"",a.label||a.name||"",a.requests||0,a.success||0,a.errors||0,a.errorRate||0,a.promptTokens||0,a.completionTokens||0,a.totalTokens||0,a.cost||0,a.lastSeen||""]);return b})(g).map(a=>a.map(a7).join(",")).join("\n");return new Response(a,{status:200,headers:{"Content-Type":"text/csv; charset=utf-8","Content-Disposition":`attachment; filename="bluerouter-analytics-${new Date().toISOString().slice(0,10)}.csv"`,"Cache-Control":"no-store"}})}return v.NextResponse.json(g,{headers:{"Cache-Control":"no-store"}})}catch(a){return console.error("[analytics] Failed to build dashboard analytics:",a),v.NextResponse.json({error:a?.message||"Failed to build dashboard analytics"},{status:500})}}let bo=new e.AppRouteRouteModule({definition:{kind:f.RouteKind.APP_ROUTE,page:"/api/dashboard/analytics/route",pathname:"/api/dashboard/analytics",filename:"route",bundlePath:"app/api/dashboard/analytics/route"},distDir:".next-cli-build",relativeProjectDir:"",resolvedPagePath:"D:\\bluerouter\\src\\app\\api\\dashboard\\analytics\\route.js",nextConfigOutput:"standalone",userland:d,...{}}),{workAsyncStorage:bp,workUnitAsyncStorage:bq,serverHooks:br}=bo;function bs(){return(0,g.patchFetch)({workAsyncStorage:bp,workUnitAsyncStorage:bq})}async function bt(a,b,c){c.requestMeta&&(0,h.setRequestMeta)(a,c.requestMeta),bo.isDev&&(0,h.addRequestMeta)(a,"devRequestTimingInternalsEnd",process.hrtime.bigint());let d="/api/dashboard/analytics/route";"/index"===d&&(d="/");let e=await bo.prepare(a,b,{srcPage:d,multiZoneDraftMode:!1});if(!e)return b.statusCode=400,b.end("Bad Request"),null==c.waitUntil||c.waitUntil.call(c,Promise.resolve()),null;let{buildId:g,deploymentId:v,params:w,nextConfig:x,parsedUrl:y,isDraftMode:z,prerenderManifest:A,routerServerContext:B,isOnDemandRevalidate:C,revalidateOnlyGenerated:D,resolvedPathname:E,clientReferenceManifest:F,serverActionsManifest:G}=e,H=(0,k.normalizeAppPath)(d),I=!!(A.dynamicRoutes[H]||A.routes[E]),J=async()=>((null==B?void 0:B.render404)?await B.render404(a,b,y,!1):b.end("This page could not be found"),null);if(I&&!z){let a=!!A.routes[E],b=A.dynamicRoutes[H];if(b&&!1===b.fallback&&!a){if(x.adapterPath)return await J();throw new t.NoFallbackError}}let K=null;!I||bo.isDev||z||(K="/index"===(K=E)?"/":K);let L=!0===bo.isDev||!I,M=I&&!L;G&&F&&(0,j.setManifestsSingleton)({page:d,clientReferenceManifest:F,serverActionsManifest:G});let N=a.method||"GET",O=(0,i.getTracer)(),P=O.getActiveScopeSpan(),Q=!!(null==B?void 0:B.isWrappedByNextServer),R=!!(0,h.getRequestMeta)(a,"minimalMode"),S=(0,h.getRequestMeta)(a,"incrementalCache")||await bo.getIncrementalCache(a,x,A,R);null==S||S.resetRequestCache(),globalThis.__incrementalCache=S;let T={params:w,previewProps:A.preview,renderOpts:{experimental:{authInterrupts:!!x.experimental.authInterrupts},cacheComponents:!!x.cacheComponents,supportsDynamicResponse:L,incrementalCache:S,cacheLifeProfiles:x.cacheLife,waitUntil:c.waitUntil,onClose:a=>{b.on("close",a)},onAfterTaskError:void 0,onInstrumentationRequestError:(b,c,d,e)=>bo.onRequestError(a,b,d,e,B)},sharedContext:{buildId:g,deploymentId:v}},U=new l.NodeNextRequest(a),V=new l.NodeNextResponse(b),W=m.NextRequestAdapter.fromNodeNextRequest(U,(0,m.signalFromNodeResponse)(b));try{let e,g=async a=>bo.handle(W,T).finally(()=>{if(!a)return;a.setAttributes({"http.status_code":b.statusCode,"next.rsc":!1});let c=O.getRootSpanAttributes();if(!c)return;if(c.get("next.span_type")!==n.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${c.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let f=c.get("next.route");if(f){let b=`${N} ${f}`;a.setAttributes({"next.route":f,"http.route":f,"next.span_name":b}),a.updateName(b),e&&e!==a&&(e.setAttribute("http.route",f),e.updateName(b))}else a.updateName(`${N} ${d}`)}),h=async e=>{var h,i;let j=async({previousCacheEntry:f})=>{try{if(!R&&C&&D&&!f)return b.statusCode=404,b.setHeader("x-nextjs-cache","REVALIDATED"),b.end("This page could not be found"),null;let d=await g(e);a.fetchMetrics=T.renderOpts.fetchMetrics;let h=T.renderOpts.pendingWaitUntil;h&&c.waitUntil&&(c.waitUntil(h),h=void 0);let i=T.renderOpts.collectedTags;if(!I)return await (0,p.I)(U,V,d,T.renderOpts.pendingWaitUntil),null;{let a=await d.blob(),b=(0,q.toNodeOutgoingHttpHeaders)(d.headers);i&&(b[s.NEXT_CACHE_TAGS_HEADER]=i),!b["content-type"]&&a.type&&(b["content-type"]=a.type);let c=void 0!==T.renderOpts.collectedRevalidate&&!(T.renderOpts.collectedRevalidate>=s.INFINITE_CACHE)&&T.renderOpts.collectedRevalidate,e=void 0===T.renderOpts.collectedExpire||T.renderOpts.collectedExpire>=s.INFINITE_CACHE?void 0:T.renderOpts.collectedExpire;return{value:{kind:u.CachedRouteKind.APP_ROUTE,status:d.status,body:Buffer.from(await a.arrayBuffer()),headers:b},cacheControl:{revalidate:c,expire:e}}}}catch(b){throw(null==f?void 0:f.isStale)&&await bo.onRequestError(a,b,{routerKind:"App Router",routePath:d,routeType:"route",revalidateReason:(0,o.c)({isStaticGeneration:M,isOnDemandRevalidate:C})},!1,B),b}},k=await bo.handleResponse({req:a,nextConfig:x,cacheKey:K,routeKind:f.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:A,isRoutePPREnabled:!1,isOnDemandRevalidate:C,revalidateOnlyGenerated:D,responseGenerator:j,waitUntil:c.waitUntil,isMinimalMode:R});if(!I)return null;if((null==k||null==(h=k.value)?void 0:h.kind)!==u.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==k||null==(i=k.value)?void 0:i.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});R||b.setHeader("x-nextjs-cache",C?"REVALIDATED":k.isMiss?"MISS":k.isStale?"STALE":"HIT"),z&&b.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let l=(0,q.fromNodeOutgoingHttpHeaders)(k.value.headers);return R&&I||l.delete(s.NEXT_CACHE_TAGS_HEADER),!k.cacheControl||b.getHeader("Cache-Control")||l.get("Cache-Control")||l.set("Cache-Control",(0,r.getCacheControlHeader)(k.cacheControl)),await (0,p.I)(U,V,new Response(k.value.body,{headers:l,status:k.value.status||200})),null};Q&&P?await h(P):(e=O.getActiveScopeSpan(),await O.withPropagatedContext(a.headers,()=>O.trace(n.BaseServerSpan.handleRequest,{spanName:`${N} ${d}`,kind:i.SpanKind.SERVER,attributes:{"http.method":N,"http.target":a.url}},h),void 0,!Q))}catch(b){if(b instanceof t.NoFallbackError||await bo.onRequestError(a,b,{routerKind:"App Router",routePath:H,routeType:"route",revalidateReason:(0,o.c)({isStaticGeneration:M,isOnDemandRevalidate:C})},!1,B),I)throw b;return await (0,p.I)(U,V,new Response(null,{status:500})),null}}},55511:a=>{a.exports=require("crypto")},63033:a=>{a.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},64939:a=>{a.exports=import("pg")},66136:a=>{a.exports=require("timers")},69614:(a,b,c)=>{c.d(b,{V:()=>p});var d=c(88888),e=c(91356),f=c(99129),g=c(73575),h=c(41570),i=c(19035),j=c(24762),k=c(80308),l=c(11980);async function m(a,b,c){if(!(0,i.Gv)(a))throw new f.Ye("Flattened JWS must be an object");if(void 0===a.protected&&void 0===a.header)throw new f.Ye('Flattened JWS must have either of the "protected" or "header" members');if(void 0!==a.protected&&"string"!=typeof a.protected)throw new f.Ye("JWS Protected Header incorrect type");if(void 0===a.payload)throw new f.Ye("JWS Payload missing");if("string"!=typeof a.signature)throw new f.Ye("JWS Signature missing or incorrect type");if(void 0!==a.header&&!(0,i.Gv)(a.header))throw new f.Ye("JWS Unprotected Header incorrect type");let m={};if(a.protected)try{let b=(0,d.D)(a.protected);m=JSON.parse(g.D0.decode(b))}catch{throw new f.Ye("JWS Protected Header is invalid")}if(!(0,i.fz)(m,a.header))throw new f.Ye("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");let n={...m,...a.header},o=(0,k.n)(f.Ye,new Map([["b64",!0]]),c?.crit,m,n),p=!0;if(o.has("b64")&&"boolean"!=typeof(p=m.b64))throw new f.Ye('The "b64" (base64url-encode payload) Header Parameter must be a boolean');let{alg:q}=n;if("string"!=typeof q||!q)throw new f.Ye('JWS "alg" (Algorithm) Header Parameter missing or invalid');let r=c&&function(a,b){if(void 0!==b&&(!Array.isArray(b)||b.some(a=>"string"!=typeof a)))throw TypeError(`"${a}" option must be an array of strings`);if(b)return new Set(b)}("algorithms",c.algorithms);if(r&&!r.has(q))throw new f.Rb('"alg" (Algorithm) Header Parameter value not allowed');if(p){if("string"!=typeof a.payload)throw new f.Ye("JWS Payload must be a string")}else if("string"!=typeof a.payload&&!(a.payload instanceof Uint8Array))throw new f.Ye("JWS Payload must be a string or an Uint8Array instance");let s=!1;"function"==typeof b&&(b=await b(m,a),s=!0),(0,j.y)(q,b,"verify");let t=(0,g.xW)(void 0!==a.protected?(0,g.lF)(a.protected):new Uint8Array,(0,g.lF)("."),"string"==typeof a.payload?p?(0,g.lF)(a.payload):g.Rd.encode(a.payload):a.payload),u=(0,h.h2)(a.signature,"signature",f.Ye),v=await (0,l.l)(b,q);if(!await (0,e.MX)(q,v,u,t))throw new f.h2;let w={payload:p?(0,h.h2)(a.payload,"payload",f.Ye):"string"==typeof a.payload?g.Rd.encode(a.payload):a.payload};return(void 0!==a.protected&&(w.protectedHeader=m),void 0!==a.header&&(w.unprotectedHeader=a.header),s)?{...w,key:v}:w}async function n(a,b,c){if(a instanceof Uint8Array&&(a=g.D0.decode(a)),"string"!=typeof a)throw new f.Ye("Compact JWS must be a string or Uint8Array");let{0:d,1:e,2:h,length:i}=a.split(".");if(3!==i)throw new f.Ye("Invalid Compact JWS");let j=await m({payload:e,protected:d,signature:h},b,c),k={payload:j.payload,protectedHeader:j.protectedHeader};return"function"==typeof b?{...k,key:j.key}:k}var o=c(17347);async function p(a,b,c){let d=await n(a,b,c);if(d.protectedHeader.crit?.includes("b64")&&!1===d.protectedHeader.b64)throw new f.Dp("JWTs MUST NOT use unencoded payload");let e={payload:(0,o.k6)(d.protectedHeader,d.payload,c),protectedHeader:d.protectedHeader};return"function"==typeof b?{...e,key:d.key}:e}},73024:a=>{a.exports=require("node:fs")},74075:a=>{a.exports=require("zlib")},76760:a=>{a.exports=require("node:path")},77598:a=>{a.exports=require("node:crypto")},79428:a=>{a.exports=require("buffer")},80099:a=>{a.exports=require("node:sqlite")},81787:a=>{a.exports=require("bun:sqlite")},86439:a=>{a.exports=require("next/dist/shared/lib/no-fallback-error.external")},87550:a=>{a.exports=require("better-sqlite3")},90389:(a,b,c)=>{c.d(b,{hS:()=>d});let d=Object.freeze({ADMIN:"admin",MONITOR_ADMIN:"monitor_admin",AI_GATEWAYS_MONITOR:"ai_gateways_monitor",USER:"user",GUEST:"guest"});Object.freeze([{href:"/dashboard/endpoint",label:"Endpoint",icon:"api"},{href:"/dashboard/api-keys",label:"API Keys",icon:"vpn_key"},{href:"/dashboard/usage",label:"Usage",icon:"bar_chart"},{href:"/dashboard/analytics",label:"Analytics",icon:"monitoring"},{href:"/dashboard/quota",label:"Quota Tracker",icon:"data_usage"},{href:"/dashboard/prompt-logs",label:"Prompt Logs",icon:"manage_search"}]),Object.freeze(["/dashboard","/dashboard/endpoint","/dashboard/api-keys","/dashboard/usage","/dashboard/analytics","/dashboard/quota","/dashboard/prompt-logs"])},91645:a=>{a.exports=require("net")},92280:(a,b,c)=>{Object.defineProperty(b,"I",{enumerable:!0,get:function(){return g}});let d=c(28208),e=c(47617),f=c(62018);async function g(a,b,c,g){if((0,d.isNodeNextResponse)(b)){var h;b.statusCode=c.status,b.statusMessage=c.statusText;let d=["set-cookie","www-authenticate","proxy-authenticate","vary"];null==(h=c.headers)||h.forEach((a,c)=>{if("x-middleware-set-cookie"!==c.toLowerCase())if("set-cookie"===c.toLowerCase())for(let d of(0,f.splitCookiesString)(a))b.appendHeader(c,d);else{let e=void 0!==b.getHeader(c);(d.includes(c.toLowerCase())||!e)&&b.appendHeader(c,a)}});let{originalResponse:i}=b;c.body&&"HEAD"!==a.method?await (0,e.pipeToNodeResponse)(c.body,i,g):i.end()}}},94735:a=>{a.exports=require("events")},94755:(a,b,c)=>{c.d(b,{A:()=>i});var d=c(77598);let e={randomUUID:d.randomUUID},f=new Uint8Array(256),g=f.length;var h=c(50122);let i=function(a,b,c){if(e.randomUUID&&!b&&!a)return e.randomUUID();var i=a,j=c;let k=(i=i||{}).random??i.rng?.()??(g>f.length-16&&((0,d.randomFillSync)(f),g=0),f.slice(g,g+=16));if(k.length<16)throw Error("Random bytes length must be >= 16");if(k[6]=15&k[6]|64,k[8]=63&k[8]|128,b){if((j=j||0)<0||j+16>b.length)throw RangeError(`UUID byte range ${j}:${j+15} is out of buffer bounds`);for(let a=0;a<16;++a)b[j+a]=k[a];return b}return(0,h.k)(k)}}};var b=require("../../../../webpack-runtime.js");b.C(a);var c=b.X(0,[4741,5592,5573,6935,402,5901,7242],()=>b(b.s=53254));module.exports=c})();
537
+ LIMIT ?`,[...e.params,5])||[];return{rows:function(a=[],b=0){return a.map((a,c)=>{let d=c+1,e=_(a.promptTokens,0),f=_(a.completionTokens,0),g=_(a.totalTokens,e+f),h=Z(a.ownerUser),i=Z(a.apiKeyName),j=Z(a.apiKeyFingerprint);return{key:Z(a.key)||`${d}`,rank:d,title:S[c]||"Token Royalty",ownerUser:h,label:h||i||j||"Local / kh\xf4ng API key",apiKeyName:i,apiKeyFingerprint:j,requests:_(a.requests,0),promptTokens:e,completionTokens:f,totalTokens:g,cost:_(a.cost,0),apiKeyCount:_(a.apiKeyCount,0),modelCount:_(a.modelCount,0),providerCount:_(a.providerCount,0),sourceIpCount:_(a.sourceIpCount,0),lastSeen:a.lastSeen||"",tokenShare:b?g/b:0}})}(h,g),generatedAt:new Date().toISOString(),nextRefreshAt:new Date(Date.now()+9e5).toISOString(),refreshEveryMs:9e5,period:Q,periodLabel:"H\xf4m nay",status:"ready",totalTokens:g,totalRequests:_(f.requests,0)}}finally{await a8(c)}}async function bc(){let a=ba();return a.refreshPromise||(a.refreshPromise=bb().then(b=>(a.data=b,a.lastError="",b)).catch(b=>{let c=b?.message||String(b);return a.lastError=c,a.data=a9({status:a.data?.rows?.length?"stale":"error",error:c}),console.error("[analytics] Failed to refresh token leaderboard:",c),a.data}).finally(()=>{a.refreshPromise=null})),a.refreshPromise}async function bd(a={}){let b=JSON.stringify(ak(a)),c=(global._dashboardAnalyticsV2Cache||(global._dashboardAnalyticsV2Cache=new Map),global._dashboardAnalyticsV2Cache),d=c.get(b);if(d&&Date.now()-d.createdAt<15e3)return d.data;let e=ak(a),f=await (0,w.c)(),g=await (0,O.d9)().catch(a=>(console.error("[dashboardAnalytics] MySQL observability query adapter unavailable; SQLite fallback is disabled:",a?.message||a),null));if(!g)throw Error("MySQL observability is not configured or unavailable; SQLite analytics fallback is disabled.");let h=[g];try{h=await a6(g,3);let a=a7(h,0),[d,i]=await Promise.all([am(f),an(f)]),j=e.userOwnedOnly?function(a=[],b={}){let c=[...new Set((a||[]).map(a=>$(a)).filter(Boolean))];if(0===c.length)return{enabled:!0,noMatch:!0,owners:[],identifiers:[],ids:[],fingerprints:[]};let d=new Set(c),e=new Set,f=new Set,g=new Set;for(let a of b.all||[]){let b=$(a.ownerUser);b&&d.has(b)&&(a.key&&e.add(a.key),a.id&&(e.add(a.id),f.add(a.id)),a.fingerprint&&(e.add(a.fingerprint),g.add(a.fingerprint)))}return{enabled:!0,noMatch:0===e.size,owners:c,identifiers:[...e],ids:[...f],fingerprints:[...g]}}(e.ownerCandidates,d):e.ownedAnyUserOnly?function(a={}){let b=new Set,c=new Set,d=new Set,e=new Set;for(let f of a.all||[]){let a=$(f.ownerUser);a&&(b.add(a),f.key&&c.add(f.key),f.id&&(c.add(f.id),d.add(f.id)),f.fingerprint&&(c.add(f.fingerprint),e.add(f.fingerprint)))}return{enabled:!0,noMatch:0===c.size&&0===b.size,owners:[...b],identifiers:[...c],ids:[...d],fingerprints:[...e]}}(d):null,k=j?{...e,ownerScope:j}:e,l=function(a,b){let c=$(a);if(!c)return null;let d=[],e=!1;for(let a of(["local","local-no-key","no-key","khong-key","kh\xf4ng-key","kh\xf4ng d\xf9ng api key"].some(a=>a.includes(c)||c.includes(a))&&(e=!0),b.all||[]))[a.key,a.id,a.name,a.ownerUser,a.createdByUser,a.machineId,a.fingerprint,a.masked].some(a=>$(a).includes(c))&&a.key&&d.push(a.key);return a.length>=16&&!d.includes(a)&&d.push(a),{keys:[...new Set(d)],includeLocal:e,noMatch:0===d.length&&!e,filter:c}}(k.apiKey,d),m=k.userOwnedOnly||k.ownedAnyUserOnly?Promise.resolve(function(a="disabled"){return{disabled:!0,reason:a,missing:!1,total:0,sampled:0,dbInfo:{},models:[],stages:[],topClientIps:[],topSourceTools:[],topSessions:[],topStages:[],topModels:[],topAccounts:[],topStatuses:[]}}("user_owned_scope_no_api_key_columns")):M({keyword:k.keyword,model:k.model,sourceTool:k.sourceTool,clientIp:k.clientIp,sessionId:k.sessionId,dateFrom:k.startIso,dateTo:k.endIso,workingTimeRanges:k.workingTimeRanges}),n=(0,N.Wl)({keyword:k.keyword,provider:k.provider,model:k.model,connectionId:k.connectionId,endpoint:k.endpoint,apiKey:k.apiKey,apiKeyScope:j,status:k.status,sourceTool:k.sourceTool,clientIp:k.clientIp,sessionId:k.sessionId,dateFrom:k.startIso,dateTo:k.endIso,workingTimeRanges:k.workingTimeRanges}),[o,p,q,r,s,t]=await Promise.all([at(a7(h,0),k,l),au(a7(h,1),k,l),ay(a7(h,2),k,d,i,l),aB(a7(h,3),k,l),m,n]),u=function(a={},b=new Map){if(!a||"object"!=typeof a)return a;let c=a=>Array.isArray(a)?a.map(a=>(function(a={},b=new Map){if(!a||"object"!=typeof a)return a;let c=Z(a.provider||a.errorSource||a.providerId),d=Z(a.providerLabel)||ao(c,b),e={...a};for(let a of["sample","sampleMessage","errorMessage","errorMessageShort","message","details"])"string"==typeof e[a]&&(e[a]=function(a,b,c){let d="string"==typeof a?a:"";return d&&b&&c&&b!==c?d.split(b).join(c):a}(e[a],c,d));return{...e,provider:c,providerLabel:d,label:Z(e.label)||d||c||"unknown"}})(a,b)):[];return{...a,topErrors:c(a.topErrors),topServerErrors:c(a.topServerErrors),topClientErrors:c(a.topClientErrors),topRateLimitErrors:c(a.topRateLimitErrors),errorDistribution:c(a.errorDistribution),byFaultOwner:c(a.byFaultOwner),byProvider:c(a.byProvider)}}(t,i),v=u?.summary||{};p.rawErrorEvents=_(u?.total,0),p.serverErrorEvents=_(v.serverImpacting,0),p.gatewayErrorEvents=_(v.gateway,0),p.upstreamErrorEvents=_(v.upstream,0),p.clientErrorEvents=_(v.client,0),p.rateLimitErrorEvents=_(v.rateLimit,0),p.unknownErrorEvents=_(v.unknown,0),p.serverErrorRate=p.requests?p.serverErrorEvents/p.requests:0,p.clientErrorRate=p.requests?p.clientErrorEvents/p.requests:0,p.rateLimitErrorRate=p.requests?p.rateLimitErrorEvents/p.requests:0,u?.topErrors?.length&&(q.errors=u.topErrors);let w=new Map([...d.byKey.entries(),...d.byFingerprint.entries()]),[x,y,z,A,B,C,D]=await Promise.all([aG(a7(h,0),k,l,p),a4(a7(h,1),k,l,p,i),a2(a7(h,2),k,l),a3(a7(h,3),k,l),az(a7(h,2),k,l,o),aK(a7(h,3),k,l,w,i),aL(a7(h,0),k,l,w,i)]),[E,F]=await Promise.all([aH(a7(h,1),k,l,i),aI(a7(h,2),k,l,w,i)]);x.byModel=E,x.slowestRequests=F,p.userExperienceScore=x.score,p.userExperienceLabel=x.label,p.slowRequestRate=x.slowRequestRate,p.longInputRate=x.longInputRate,p.thinkingAutoOffRate=z.autoOffRate||0,p.largeContextRate=A.gte50kRate||0,p.topHeavyUser=y.summary?.topUserLabel||"",p.topHeavyUserTokenShare=y.summary?.topUserTokenShare||0,p.extremeInputShare=y.summary?.extremeInputShare||0;let G=await aR(a,k,q,s,d,l,i),H=function({overview:a,groups:b,promptLogStats:c,requestErrorStats:d,experience:e,clientRequests:f}){let g=[],h=d?.summary||{},i=_(h.serverImpacting,0),j=_(h.client,0),k=_(h.rateLimit,0),l=_(a.serverErrorRate,a.requests?i/a.requests:0),m=_(a.clientErrorRate,a.requests?j/a.requests:0);a.requests>=10&&i>=3&&l>=.05?g.push({level:l>=.15?"danger":"warning",title:"Tỷ lệ lỗi server/provider cao",detail:`${i.toLocaleString("vi-VN")} lỗi server-impacting (${(100*l).toFixed(1)}% request) trong khoảng thời gian đang lọc. Ưu ti\xean kiểm tra upstream/provider, gateway, timeout v\xe0 5xx.`}):a.requests>=10&&a.errorRate>=.2&&m>=.1?g.push({level:"warning",title:"Nhiều lỗi do client/request",detail:`${j.toLocaleString("vi-VN")} lỗi được ph\xe2n loại l\xe0 client-side (${(100*m).toFixed(1)}% request): sai endpoint/model/auth/body/context. Kh\xf4ng n\xean t\xednh nh\xf3m n\xe0y như lỗi server.`}):a.requests>=10&&a.errorRate>=.2&&g.push({level:"warning",title:"Tỷ lệ lỗi tổng cao",detail:`Tổng lỗi usage l\xe0 ${(100*a.errorRate).toFixed(1)}%, nhưng lỗi server-impacting chỉ ${(100*l).toFixed(1)}%. Xem ph\xe2n loại client/server b\xean dưới trước khi kết luận provider hỏng.`}),k>=5&&a.requests>0&&k/a.requests>=.05&&g.push({level:"warning",title:"Rate limit / quota đ\xe1ng ch\xfa \xfd",detail:`${k.toLocaleString("vi-VN")} lỗi rate-limit/quota trong khoảng lọc. Kiểm tra policy API key, quota provider hoặc ph\xe2n tải model.`});let n=b.apiKeys?.[0];n&&a.totalTokens>0&&n.totalTokens/a.totalTokens>=.5&&g.push({level:"warning",title:"Một API key d\xf9ng phần lớn token",detail:`${n.name||n.fingerprint} đang d\xf9ng ${(n.totalTokens/a.totalTokens*100).toFixed(1)}% tổng token.`});let o=c?.topClientIps?.[0];o&&c.total>0&&o.requests/c.total>=.5&&o.requests>=20&&g.push({level:"warning",title:"Một IP chiếm phần lớn request prompt log",detail:`${o.label} chiếm ${(o.requests/c.total*100).toFixed(1)}% prompt logs trong to\xe0n bộ dữ liệu khớp bộ lọc.`});let p=d?.topServerErrors?.[0];return p&&p.requests>=5&&g.push({level:p.requests>=20?"danger":"warning",title:"Provider/Gateway c\xf3 lỗi cần xử l\xfd",detail:`${p.providerLabel||p.provider||p.errorSource||"unknown"}/${p.model||"unknown"} c\xf3 ${p.requests.toLocaleString("vi-VN")} lỗi ${p.errorType||p.status||"server-impacting"}.`}),e?.samples>=10&&_(e.slowRequestRate,0)>=.2&&g.push({level:e.slowRequestRate>=.4?"danger":"warning",title:"Nhiều request phản hồi chậm",detail:`${(100*e.slowRequestRate).toFixed(1)}% request th\xe0nh c\xf4ng c\xf3 latency >= 45s. Kiểm tra request input d\xe0i, chờ slot/upstream queue v\xe0 tải model server.`}),e?.samples>=10&&_(e.longInputRate,0)>=.3&&g.push({level:"warning",title:"Tỷ lệ request input d\xe0i cao",detail:`${(100*e.longInputRate).toFixed(1)}% request c\xf3 input >= 30k token. Với VS Code/agent, P95/P99 latency cao c\xf3 thể chủ yếu do prompt eval v\xe0 chờ slot, kh\xf4ng phải do output chậm.`}),f?.summary?.topUserTokenShare>=.35&&g.push({level:f.summary.topUserTokenShare>=.6?"danger":"warning",title:"Token usage tập trung v\xe0o một user/API key",detail:`${f.summary.topUserLabel||"Một client"} đang chiếm ${(100*f.summary.topUserTokenShare).toFixed(1)}% tổng token trong khoảng lọc. N\xean kiểm tra quota, workflow VS Code/agent v\xe0 request input d\xe0i của client n\xe0y.`}),f?.summary?.extremeInputShare>=.1&&g.push({level:f.summary.extremeInputShare>=.25?"danger":"warning",title:"Nhiều request cực d\xe0i >=70k token",detail:`${(100*f.summary.extremeInputShare).toFixed(1)}% request th\xe0nh c\xf4ng c\xf3 input >=70k token. Đ\xe2y l\xe0 nh\xf3m dễ k\xe9o TTFT/P95/P99 l\xean cao v\xe0 l\xe0m request nhỏ phải chờ slot.`}),g}({overview:p,groups:q,promptLogStats:s,requestErrorStats:u,experience:x,clientRequests:y}),I={generatedAt:new Date().toISOString(),analyticsVersion:"v3.6-token-leaderboard",filters:{period:k.period,startIso:k.startIso,endIso:k.endIso,provider:k.provider,model:k.model,connectionId:k.connectionId,status:k.status,endpoint:k.endpoint,apiKey:k.apiKey,clientIp:k.clientIp,sourceTool:k.sourceTool,sessionId:k.sessionId,keyword:k.keyword,userOwnedOnly:k.userOwnedOnly,ownedAnyUserOnly:k.ownedAnyUserOnly},overview:p,latency:r,experience:x,clientRequests:y,tokenLeaderboard:(!function(){let a=ba();if(a.timerStarted)return;a.timerStarted=!0;let b=setTimeout(()=>{bc().catch(()=>{})},1e3);b.unref?.();let c=setInterval(()=>{bc().catch(()=>{})},9e5);c.unref?.()}(),ba().data||a9()),thinkingAnalytics:z,largeContextAnalytics:A,timeSeries:B,groups:q,promptLogs:s,requestErrors:u,anomalies:H,recentUsage:C,heavyRequests:D,options:G,qualityNotes:[]};if(await a8(h),c.set(b,{createdAt:Date.now(),data:I}),c.size>100){for(let[a,b]of c)if(Date.now()-b.createdAt>15e3&&c.delete(a),c.size<=100)break}return I}catch(a){throw await a8(h),console.error("[dashboardAnalytics] MySQL observability query failed; SQLite fallback is disabled:",a?.message||a),a}}var be=c(9588);let bf="force-dynamic",bg=["period","dateFrom","dateTo","provider","model","connectionId","status","endpoint","apiKey","clientIp","sourceIp","sourceTool","sessionId","keyword","maxPromptLogRows","timeZone"];async function bh(a){try{let b,{access:c,response:d}=await (0,be.oW)();if(d)return d;let{searchParams:e}=new URL(a.url),f=function(a){let b={};for(let c of bg){let d=a.get(c);null!==d&&""!==String(d).trim()&&(b[c]=d)}return b}(e);b=c.isAdmin||c.isMonitorAdmin?f:c.isAiGatewaysMonitor?{...f,ownedAnyUserOnly:!0}:{...f,userOwnedOnly:!0,ownerCandidates:[...new Set([...c.candidates||[],c.userId].map(be.I8).filter(Boolean))]};let g=await bd(b);if("csv"===e.get("format")){let a=(function(a){let b=[];for(let[c,d]of(b.push(["section","key","label","requests","success","errors","errorRate","inputTokens","outputTokens","totalTokens","cost","lastSeen"]),[["providers",a.groups.providers],["models",a.groups.models],["providerAccounts",a.groups.providerAccounts],["apiKeys",a.groups.apiKeys],["endpoints",a.groups.endpoints],["clientIps",a.promptLogs.topClientIps],["sourceTools",a.promptLogs.topSourceTools],["requestErrors",a.requestErrors?.topErrors||a.groups.errors],["modelExperience",a.experience?.byModel||[]],["clientHeavyUsers",a.clientRequests?.topHeavyUsers||[]],["clientTopApiKeysByTokens",a.clientRequests?.topApiKeysByTokens||[]],["clientTopSourceIpsByTokens",a.clientRequests?.topSourceIpsByTokens||[]],["clientTopSourceIpsByHeavyRequests",a.clientRequests?.topSourceIpsByHeavyRequests||[]],["clientProblemClients",a.clientRequests?.topProblemClients||[]],["inputBuckets",a.clientRequests?.inputBuckets||[]]]))for(let a of d||[])b.push([c,a.key||"",a.label||a.name||"",a.requests||0,a.success||0,a.errors||0,a.errorRate||0,a.promptTokens||0,a.completionTokens||0,a.totalTokens||0,a.cost||0,a.lastSeen||""]);return b})(g).map(a=>a.map(a5).join(",")).join("\n");return new Response(a,{status:200,headers:{"Content-Type":"text/csv; charset=utf-8","Content-Disposition":`attachment; filename="bluerouter-analytics-${new Date().toISOString().slice(0,10)}.csv"`,"Cache-Control":"no-store"}})}return v.NextResponse.json(g,{headers:{"Cache-Control":"no-store"}})}catch(a){return console.error("[analytics] Failed to build dashboard analytics:",a),v.NextResponse.json({error:a?.message||"Failed to build dashboard analytics"},{status:500})}}let bi=new e.AppRouteRouteModule({definition:{kind:f.RouteKind.APP_ROUTE,page:"/api/dashboard/analytics/route",pathname:"/api/dashboard/analytics",filename:"route",bundlePath:"app/api/dashboard/analytics/route"},distDir:".next-cli-build",relativeProjectDir:"",resolvedPagePath:"D:\\bluerouter\\src\\app\\api\\dashboard\\analytics\\route.js",nextConfigOutput:"standalone",userland:d,...{}}),{workAsyncStorage:bj,workUnitAsyncStorage:bk,serverHooks:bl}=bi;function bm(){return(0,g.patchFetch)({workAsyncStorage:bj,workUnitAsyncStorage:bk})}async function bn(a,b,c){c.requestMeta&&(0,h.setRequestMeta)(a,c.requestMeta),bi.isDev&&(0,h.addRequestMeta)(a,"devRequestTimingInternalsEnd",process.hrtime.bigint());let d="/api/dashboard/analytics/route";"/index"===d&&(d="/");let e=await bi.prepare(a,b,{srcPage:d,multiZoneDraftMode:!1});if(!e)return b.statusCode=400,b.end("Bad Request"),null==c.waitUntil||c.waitUntil.call(c,Promise.resolve()),null;let{buildId:g,deploymentId:v,params:w,nextConfig:x,parsedUrl:y,isDraftMode:z,prerenderManifest:A,routerServerContext:B,isOnDemandRevalidate:C,revalidateOnlyGenerated:D,resolvedPathname:E,clientReferenceManifest:F,serverActionsManifest:G}=e,H=(0,k.normalizeAppPath)(d),I=!!(A.dynamicRoutes[H]||A.routes[E]),J=async()=>((null==B?void 0:B.render404)?await B.render404(a,b,y,!1):b.end("This page could not be found"),null);if(I&&!z){let a=!!A.routes[E],b=A.dynamicRoutes[H];if(b&&!1===b.fallback&&!a){if(x.adapterPath)return await J();throw new t.NoFallbackError}}let K=null;!I||bi.isDev||z||(K="/index"===(K=E)?"/":K);let L=!0===bi.isDev||!I,M=I&&!L;G&&F&&(0,j.setManifestsSingleton)({page:d,clientReferenceManifest:F,serverActionsManifest:G});let N=a.method||"GET",O=(0,i.getTracer)(),P=O.getActiveScopeSpan(),Q=!!(null==B?void 0:B.isWrappedByNextServer),R=!!(0,h.getRequestMeta)(a,"minimalMode"),S=(0,h.getRequestMeta)(a,"incrementalCache")||await bi.getIncrementalCache(a,x,A,R);null==S||S.resetRequestCache(),globalThis.__incrementalCache=S;let T={params:w,previewProps:A.preview,renderOpts:{experimental:{authInterrupts:!!x.experimental.authInterrupts},cacheComponents:!!x.cacheComponents,supportsDynamicResponse:L,incrementalCache:S,cacheLifeProfiles:x.cacheLife,waitUntil:c.waitUntil,onClose:a=>{b.on("close",a)},onAfterTaskError:void 0,onInstrumentationRequestError:(b,c,d,e)=>bi.onRequestError(a,b,d,e,B)},sharedContext:{buildId:g,deploymentId:v}},U=new l.NodeNextRequest(a),V=new l.NodeNextResponse(b),W=m.NextRequestAdapter.fromNodeNextRequest(U,(0,m.signalFromNodeResponse)(b));try{let e,g=async a=>bi.handle(W,T).finally(()=>{if(!a)return;a.setAttributes({"http.status_code":b.statusCode,"next.rsc":!1});let c=O.getRootSpanAttributes();if(!c)return;if(c.get("next.span_type")!==n.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${c.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let f=c.get("next.route");if(f){let b=`${N} ${f}`;a.setAttributes({"next.route":f,"http.route":f,"next.span_name":b}),a.updateName(b),e&&e!==a&&(e.setAttribute("http.route",f),e.updateName(b))}else a.updateName(`${N} ${d}`)}),h=async e=>{var h,i;let j=async({previousCacheEntry:f})=>{try{if(!R&&C&&D&&!f)return b.statusCode=404,b.setHeader("x-nextjs-cache","REVALIDATED"),b.end("This page could not be found"),null;let d=await g(e);a.fetchMetrics=T.renderOpts.fetchMetrics;let h=T.renderOpts.pendingWaitUntil;h&&c.waitUntil&&(c.waitUntil(h),h=void 0);let i=T.renderOpts.collectedTags;if(!I)return await (0,p.I)(U,V,d,T.renderOpts.pendingWaitUntil),null;{let a=await d.blob(),b=(0,q.toNodeOutgoingHttpHeaders)(d.headers);i&&(b[s.NEXT_CACHE_TAGS_HEADER]=i),!b["content-type"]&&a.type&&(b["content-type"]=a.type);let c=void 0!==T.renderOpts.collectedRevalidate&&!(T.renderOpts.collectedRevalidate>=s.INFINITE_CACHE)&&T.renderOpts.collectedRevalidate,e=void 0===T.renderOpts.collectedExpire||T.renderOpts.collectedExpire>=s.INFINITE_CACHE?void 0:T.renderOpts.collectedExpire;return{value:{kind:u.CachedRouteKind.APP_ROUTE,status:d.status,body:Buffer.from(await a.arrayBuffer()),headers:b},cacheControl:{revalidate:c,expire:e}}}}catch(b){throw(null==f?void 0:f.isStale)&&await bi.onRequestError(a,b,{routerKind:"App Router",routePath:d,routeType:"route",revalidateReason:(0,o.c)({isStaticGeneration:M,isOnDemandRevalidate:C})},!1,B),b}},k=await bi.handleResponse({req:a,nextConfig:x,cacheKey:K,routeKind:f.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:A,isRoutePPREnabled:!1,isOnDemandRevalidate:C,revalidateOnlyGenerated:D,responseGenerator:j,waitUntil:c.waitUntil,isMinimalMode:R});if(!I)return null;if((null==k||null==(h=k.value)?void 0:h.kind)!==u.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==k||null==(i=k.value)?void 0:i.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});R||b.setHeader("x-nextjs-cache",C?"REVALIDATED":k.isMiss?"MISS":k.isStale?"STALE":"HIT"),z&&b.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let l=(0,q.fromNodeOutgoingHttpHeaders)(k.value.headers);return R&&I||l.delete(s.NEXT_CACHE_TAGS_HEADER),!k.cacheControl||b.getHeader("Cache-Control")||l.get("Cache-Control")||l.set("Cache-Control",(0,r.getCacheControlHeader)(k.cacheControl)),await (0,p.I)(U,V,new Response(k.value.body,{headers:l,status:k.value.status||200})),null};Q&&P?await h(P):(e=O.getActiveScopeSpan(),await O.withPropagatedContext(a.headers,()=>O.trace(n.BaseServerSpan.handleRequest,{spanName:`${N} ${d}`,kind:i.SpanKind.SERVER,attributes:{"http.method":N,"http.target":a.url}},h),void 0,!Q))}catch(b){if(b instanceof t.NoFallbackError||await bi.onRequestError(a,b,{routerKind:"App Router",routePath:H,routeType:"route",revalidateReason:(0,o.c)({isStaticGeneration:M,isOnDemandRevalidate:C})},!1,B),I)throw b;return await (0,p.I)(U,V,new Response(null,{status:500})),null}}},55511:a=>{a.exports=require("crypto")},63033:a=>{a.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},64939:a=>{a.exports=import("pg")},66136:a=>{a.exports=require("timers")},69614:(a,b,c)=>{c.d(b,{V:()=>p});var d=c(88888),e=c(91356),f=c(99129),g=c(73575),h=c(41570),i=c(19035),j=c(24762),k=c(80308),l=c(11980);async function m(a,b,c){if(!(0,i.Gv)(a))throw new f.Ye("Flattened JWS must be an object");if(void 0===a.protected&&void 0===a.header)throw new f.Ye('Flattened JWS must have either of the "protected" or "header" members');if(void 0!==a.protected&&"string"!=typeof a.protected)throw new f.Ye("JWS Protected Header incorrect type");if(void 0===a.payload)throw new f.Ye("JWS Payload missing");if("string"!=typeof a.signature)throw new f.Ye("JWS Signature missing or incorrect type");if(void 0!==a.header&&!(0,i.Gv)(a.header))throw new f.Ye("JWS Unprotected Header incorrect type");let m={};if(a.protected)try{let b=(0,d.D)(a.protected);m=JSON.parse(g.D0.decode(b))}catch{throw new f.Ye("JWS Protected Header is invalid")}if(!(0,i.fz)(m,a.header))throw new f.Ye("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");let n={...m,...a.header},o=(0,k.n)(f.Ye,new Map([["b64",!0]]),c?.crit,m,n),p=!0;if(o.has("b64")&&"boolean"!=typeof(p=m.b64))throw new f.Ye('The "b64" (base64url-encode payload) Header Parameter must be a boolean');let{alg:q}=n;if("string"!=typeof q||!q)throw new f.Ye('JWS "alg" (Algorithm) Header Parameter missing or invalid');let r=c&&function(a,b){if(void 0!==b&&(!Array.isArray(b)||b.some(a=>"string"!=typeof a)))throw TypeError(`"${a}" option must be an array of strings`);if(b)return new Set(b)}("algorithms",c.algorithms);if(r&&!r.has(q))throw new f.Rb('"alg" (Algorithm) Header Parameter value not allowed');if(p){if("string"!=typeof a.payload)throw new f.Ye("JWS Payload must be a string")}else if("string"!=typeof a.payload&&!(a.payload instanceof Uint8Array))throw new f.Ye("JWS Payload must be a string or an Uint8Array instance");let s=!1;"function"==typeof b&&(b=await b(m,a),s=!0),(0,j.y)(q,b,"verify");let t=(0,g.xW)(void 0!==a.protected?(0,g.lF)(a.protected):new Uint8Array,(0,g.lF)("."),"string"==typeof a.payload?p?(0,g.lF)(a.payload):g.Rd.encode(a.payload):a.payload),u=(0,h.h2)(a.signature,"signature",f.Ye),v=await (0,l.l)(b,q);if(!await (0,e.MX)(q,v,u,t))throw new f.h2;let w={payload:p?(0,h.h2)(a.payload,"payload",f.Ye):"string"==typeof a.payload?g.Rd.encode(a.payload):a.payload};return(void 0!==a.protected&&(w.protectedHeader=m),void 0!==a.header&&(w.unprotectedHeader=a.header),s)?{...w,key:v}:w}async function n(a,b,c){if(a instanceof Uint8Array&&(a=g.D0.decode(a)),"string"!=typeof a)throw new f.Ye("Compact JWS must be a string or Uint8Array");let{0:d,1:e,2:h,length:i}=a.split(".");if(3!==i)throw new f.Ye("Invalid Compact JWS");let j=await m({payload:e,protected:d,signature:h},b,c),k={payload:j.payload,protectedHeader:j.protectedHeader};return"function"==typeof b?{...k,key:j.key}:k}var o=c(17347);async function p(a,b,c){let d=await n(a,b,c);if(d.protectedHeader.crit?.includes("b64")&&!1===d.protectedHeader.b64)throw new f.Dp("JWTs MUST NOT use unencoded payload");let e={payload:(0,o.k6)(d.protectedHeader,d.payload,c),protectedHeader:d.protectedHeader};return"function"==typeof b?{...e,key:d.key}:e}},73024:a=>{a.exports=require("node:fs")},74075:a=>{a.exports=require("zlib")},76760:a=>{a.exports=require("node:path")},77598:a=>{a.exports=require("node:crypto")},79428:a=>{a.exports=require("buffer")},80099:a=>{a.exports=require("node:sqlite")},81787:a=>{a.exports=require("bun:sqlite")},86439:a=>{a.exports=require("next/dist/shared/lib/no-fallback-error.external")},87550:a=>{a.exports=require("better-sqlite3")},90389:(a,b,c)=>{c.d(b,{hS:()=>d});let d=Object.freeze({ADMIN:"admin",MONITOR_ADMIN:"monitor_admin",AI_GATEWAYS_MONITOR:"ai_gateways_monitor",USER:"user",GUEST:"guest"});Object.freeze([{href:"/dashboard/endpoint",label:"Endpoint",icon:"api"},{href:"/dashboard/api-keys",label:"API Keys",icon:"vpn_key"},{href:"/dashboard/usage",label:"Usage",icon:"bar_chart"},{href:"/dashboard/analytics",label:"Analytics",icon:"monitoring"},{href:"/dashboard/quota",label:"Quota Tracker",icon:"data_usage"},{href:"/dashboard/prompt-logs",label:"Prompt Logs",icon:"manage_search"}]),Object.freeze(["/dashboard","/dashboard/endpoint","/dashboard/api-keys","/dashboard/usage","/dashboard/analytics","/dashboard/quota","/dashboard/prompt-logs"])},91645:a=>{a.exports=require("net")},92280:(a,b,c)=>{Object.defineProperty(b,"I",{enumerable:!0,get:function(){return g}});let d=c(28208),e=c(47617),f=c(62018);async function g(a,b,c,g){if((0,d.isNodeNextResponse)(b)){var h;b.statusCode=c.status,b.statusMessage=c.statusText;let d=["set-cookie","www-authenticate","proxy-authenticate","vary"];null==(h=c.headers)||h.forEach((a,c)=>{if("x-middleware-set-cookie"!==c.toLowerCase())if("set-cookie"===c.toLowerCase())for(let d of(0,f.splitCookiesString)(a))b.appendHeader(c,d);else{let e=void 0!==b.getHeader(c);(d.includes(c.toLowerCase())||!e)&&b.appendHeader(c,a)}});let{originalResponse:i}=b;c.body&&"HEAD"!==a.method?await (0,e.pipeToNodeResponse)(c.body,i,g):i.end()}}},94735:a=>{a.exports=require("events")},94755:(a,b,c)=>{c.d(b,{A:()=>i});var d=c(77598);let e={randomUUID:d.randomUUID},f=new Uint8Array(256),g=f.length;var h=c(50122);let i=function(a,b,c){if(e.randomUUID&&!b&&!a)return e.randomUUID();var i=a,j=c;let k=(i=i||{}).random??i.rng?.()??(g>f.length-16&&((0,d.randomFillSync)(f),g=0),f.slice(g,g+=16));if(k.length<16)throw Error("Random bytes length must be >= 16");if(k[6]=15&k[6]|64,k[8]=63&k[8]|128,b){if((j=j||0)<0||j+16>b.length)throw RangeError(`UUID byte range ${j}:${j+15} is out of buffer bounds`);for(let a=0;a<16;++a)b[j+a]=k[a];return b}return(0,h.k)(k)}}};var b=require("../../../../webpack-runtime.js");b.C(a);var c=b.X(0,[4741,5592,5573,6935,402,5901,7242],()=>b(b.s=53254));module.exports=c})();