@jheavenknows/bluerouter 2.0.45 → 2.0.46

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 (422) hide show
  1. package/app/.next-cli-build/BUILD_ID +1 -1
  2. package/app/.next-cli-build/app-path-routes-manifest.json +4 -4
  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/profile/page_client-reference-manifest.js +1 -1
  24. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
  25. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
  26. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  27. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  28. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  29. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  30. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  31. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  32. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  33. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  34. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  35. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  36. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  37. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  38. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  39. package/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  40. package/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  41. package/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  42. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  43. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  44. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  45. package/app/.next-cli-build/server/app/_not-found.rsc +3 -3
  46. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +3 -3
  47. package/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  48. package/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +3 -3
  49. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  50. package/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  51. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  52. package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
  53. package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
  54. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  55. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  56. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  57. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  58. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  59. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  60. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  61. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  62. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
  63. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
  64. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
  65. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  66. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  67. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  68. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  69. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  70. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js +30 -30
  71. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
  72. package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
  73. package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
  74. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
  75. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
  76. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
  77. package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
  78. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  79. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  80. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  81. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  82. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  83. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  84. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  85. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  86. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  87. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  88. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  89. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  90. package/app/.next-cli-build/server/app/api/models/route.js +1 -1
  91. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  92. package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  93. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  94. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  95. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  96. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  97. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  98. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  99. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  100. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  101. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  102. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  103. package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
  104. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  105. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  106. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  107. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  108. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  109. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  110. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  111. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  112. package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  113. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  114. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  115. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  116. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  117. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  118. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  119. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  120. package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  121. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  122. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  123. package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  124. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  126. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  127. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  128. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  129. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  130. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  132. package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  134. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  136. package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
  138. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  140. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  142. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  143. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  144. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  145. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  146. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  147. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  148. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  150. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  151. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  152. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  153. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  154. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  155. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  156. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  157. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  158. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  159. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  160. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  161. package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  162. package/app/.next-cli-build/server/app/api/version/route.js +1 -1
  163. package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  164. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  165. package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  166. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  167. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  168. package/app/.next-cli-build/server/app/callback.html +1 -1
  169. package/app/.next-cli-build/server/app/callback.rsc +3 -3
  170. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
  171. package/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  172. package/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +3 -3
  173. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  174. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  175. package/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  176. package/app/.next-cli-build/server/app/dashboard/analytics.html +1 -1
  177. package/app/.next-cli-build/server/app/dashboard/analytics.rsc +5 -5
  178. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics/__PAGE__.segment.rsc +2 -2
  179. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics.segment.rsc +1 -1
  180. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  181. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  182. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_full.segment.rsc +5 -5
  183. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_head.segment.rsc +1 -1
  184. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_index.segment.rsc +3 -3
  185. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_tree.segment.rsc +1 -1
  186. package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
  187. package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +5 -5
  188. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +2 -2
  189. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys.segment.rsc +1 -1
  190. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  191. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  192. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +5 -5
  193. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_head.segment.rsc +1 -1
  194. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_index.segment.rsc +3 -3
  195. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +1 -1
  196. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  197. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +5 -5
  198. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  199. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  200. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  201. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  202. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
  203. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  204. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
  205. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  206. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  207. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +5 -5
  208. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  209. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  210. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  211. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  212. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
  213. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  214. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
  215. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  216. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  217. package/app/.next-cli-build/server/app/dashboard/combos.rsc +5 -5
  218. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  219. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  220. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  221. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  222. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
  223. package/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  224. package/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
  225. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  226. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  227. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +5 -5
  228. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  229. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  230. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  231. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  232. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
  233. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  234. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
  235. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  236. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  237. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +5 -5
  238. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  239. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  240. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  241. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  242. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  243. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
  244. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  245. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
  246. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  247. package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  248. package/app/.next-cli-build/server/app/dashboard/mitm.rsc +5 -5
  249. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  250. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  251. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  252. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  253. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
  254. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  255. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
  256. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  257. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  258. package/app/.next-cli-build/server/app/dashboard/profile.rsc +4 -4
  259. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +1 -1
  260. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  261. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  262. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  263. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +4 -4
  264. package/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  265. package/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
  266. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  267. package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
  268. package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +4 -4
  269. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +1 -1
  270. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs.segment.rsc +1 -1
  271. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  272. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  273. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +4 -4
  274. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_head.segment.rsc +1 -1
  275. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_index.segment.rsc +3 -3
  276. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +1 -1
  277. package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
  278. package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +4 -4
  279. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +1 -1
  280. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health.segment.rsc +1 -1
  281. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  282. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  283. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +4 -4
  284. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_head.segment.rsc +1 -1
  285. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_index.segment.rsc +3 -3
  286. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +1 -1
  287. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  288. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +5 -5
  289. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  290. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  291. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  292. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  293. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  294. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
  295. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  296. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
  297. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  298. package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  299. package/app/.next-cli-build/server/app/dashboard/providers.rsc +5 -5
  300. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  301. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  302. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  303. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  304. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
  305. package/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  306. package/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
  307. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  308. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  309. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +5 -5
  310. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  311. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  312. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  313. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  314. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
  315. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  316. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
  317. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  318. package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
  319. package/app/.next-cli-build/server/app/dashboard/quota.rsc +6 -6
  320. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  321. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  322. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  323. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  324. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
  325. package/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  326. package/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
  327. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  328. package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  329. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  330. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
  331. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
  332. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  333. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
  334. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  335. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  336. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  337. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  338. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  339. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  340. package/app/.next-cli-build/server/app/dashboard/skills.rsc +5 -5
  341. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
  342. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
  343. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  344. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  345. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +5 -5
  346. package/app/.next-cli-build/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
  347. package/app/.next-cli-build/server/app/dashboard/skills.segments/_index.segment.rsc +3 -3
  348. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
  349. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  350. package/app/.next-cli-build/server/app/dashboard/translator.rsc +5 -5
  351. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  352. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  353. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  354. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  355. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
  356. package/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  357. package/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
  358. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  359. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  360. package/app/.next-cli-build/server/app/dashboard/usage.rsc +5 -5
  361. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  362. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  363. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  364. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  365. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
  366. package/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  367. package/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
  368. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  369. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  370. package/app/.next-cli-build/server/app/dashboard.rsc +5 -5
  371. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  372. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  373. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  374. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +5 -5
  375. package/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  376. package/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +3 -3
  377. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  378. package/app/.next-cli-build/server/app/index.html +1 -1
  379. package/app/.next-cli-build/server/app/index.rsc +3 -3
  380. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  381. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +3 -3
  382. package/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  383. package/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +3 -3
  384. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  385. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  386. package/app/.next-cli-build/server/app/landing.html +1 -1
  387. package/app/.next-cli-build/server/app/landing.rsc +3 -3
  388. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +3 -3
  389. package/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  390. package/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +3 -3
  391. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  392. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  393. package/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  394. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  395. package/app/.next-cli-build/server/app/login.html +1 -1
  396. package/app/.next-cli-build/server/app/login.rsc +3 -3
  397. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +3 -3
  398. package/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  399. package/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +3 -3
  400. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  401. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  402. package/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  403. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  404. package/app/.next-cli-build/server/app-paths-manifest.json +4 -4
  405. package/app/.next-cli-build/server/chunks/3110.js +1 -1
  406. package/app/.next-cli-build/server/chunks/4746.js +1 -1
  407. package/app/.next-cli-build/server/chunks/7130.js +1 -1
  408. package/app/.next-cli-build/server/chunks/7153.js +1 -1
  409. package/app/.next-cli-build/server/chunks/7795.js +1 -1
  410. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  411. package/app/.next-cli-build/server/pages/404.html +1 -1
  412. package/app/.next-cli-build/server/pages/500.html +1 -1
  413. package/app/.next-cli-build/static/chunks/{1321-3369c70040871f84.js → 1321-387020f59e1bb897.js} +1 -1
  414. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/analytics/page-39cb7cea97e6c2d2.js +1 -0
  415. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-shm +0 -0
  416. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-wal +0 -0
  417. package/app/package.json +1 -1
  418. package/package.json +1 -1
  419. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/analytics/page-384800732cf3912f.js +0 -1
  420. /package/app/.next-cli-build/static/{EezFPT6xsT31rfvNt7X3q → U73peQtUnXeRVNv_kInCI}/_buildManifest.js +0 -0
  421. /package/app/.next-cli-build/static/{EezFPT6xsT31rfvNt7X3q → U73peQtUnXeRVNv_kInCI}/_ssgManifest.js +0 -0
  422. /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-2.0.40-to-2.0.41-2.0.41-20260612-225242 → upgrade-2.0.45-to-2.0.46-2.0.46-20260613-081022}/data.sqlite +0 -0
@@ -1,4 +1,4 @@
1
- "use strict";(()=>{var a={};a.id=451,a.ids=[451],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:()=>t,aV:()=>n,bz:()=>p,hH:()=>s,oW:()=>r,s0:()=>l,ub:()=>m,vZ:()=>o});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)?h.hS.ADMIN:n(a,b)?h.hS.MONITOR_ADMIN:h.hS.USER:h.hS.GUEST}function p(a={}){return!0===a.isAdmin||!0===a.isMonitorAdmin}async function q(){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,role:h.hS.GUEST,userId:"",displayName:"Guest",loginMethod:"None",settings:{...a,requireLogin:!0},session:null};let e=l(c||{}),i=o(a,c||{}),j=i===h.hS.ADMIN,k=i===h.hS.MONITOR_ADMIN;return{authenticated:!0,isAdmin:j,isMonitorAdmin:k,role:i,canManageApiKeys:j||k,canUseMonitorAdminTabs:j||k,...e,settings:{...a,requireLogin:!0},session:c}}async function r(){let a=await q();return a.authenticated?{access:a,response:null}:{access:a,response:e.NextResponse.json({error:"Authentication required"},{status:401})}}async function s(a={}){let{allowMonitorAdmin:b=!1}=a||{},{access:c,response:d}=await r();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 t(a,b){if(!a?.authenticated||!b)return!1;if(p(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")},19771:a=>{a.exports=require("process")},21820:a=>{a.exports=require("os")},27910:a=>{a.exports=require("stream")},28354:a=>{a.exports=require("util")},29021:a=>{a.exports=require("fs")},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("24h").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:"/"})}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")},53053:a=>{a.exports=require("node:diagnostics_channel")},55511:a=>{a.exports=require("crypto")},61066:(a,b,c)=>{c.r(b),c.d(b,{handler:()=>aO,patchFetch:()=>aN,routeModule:()=>aJ,serverHooks:()=>aM,workAsyncStorage:()=>aK,workUnitAsyncStorage:()=>aL});var d={};c.r(d),c.d(d,{GET:()=>aI,dynamic:()=>aG});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(29021),z=c.n(y),A=c(33873),B=c.n(A),C=c(45903),D=c(97242);let E=new Set;function F(a){return String(a||"").trim()}function G(a,b=0){let c=Number(a);return Number.isFinite(c)?c:b}async function H(){let a=(0,C.I6)(await (0,C.L7)());return a.sqlitePath||(a.sqlitePath=B().join(process.env.DATA_DIR||"/var/lib/bluerouter","logs","promptLogs.sqlite")),a}async function I(a){try{let b=await Promise.resolve().then(c.t.bind(c,87550,23)),d=new(b.default||b)(a);return d.pragma("busy_timeout = 5000"),{all:(a,b={})=>d.prepare(a).all(b),get:(a,b={})=>d.prepare(a).get(b),run:(a,b={})=>d.prepare(a).run(b),close:()=>d.close()}}catch{let b=new(await Promise.resolve().then(c.t.bind(c,80099,23))).DatabaseSync(a);return b.exec("PRAGMA busy_timeout = 5000"),{all:(a,c={})=>b.prepare(a).all(c),get:(a,c={})=>b.prepare(a).get(c),run:(a,c={})=>b.prepare(a).run(c),close:()=>b.close()}}}async function J(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(),{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 K(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});return{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 L(a){if(!z().existsSync(a.sqlitePath))return;let b=await I(a.sqlitePath);try{if(!b.get("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'prompt_logs'"))return;for(let a of["CREATE INDEX IF NOT EXISTS idx_prompt_logs_created_id ON prompt_logs(created_at DESC, id)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_stage_created_at ON prompt_logs(stage, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_model_created_at ON prompt_logs(model, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_display_model_created_at ON prompt_logs(display_model, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_session_created_at ON prompt_logs(session_id, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_client_ip_created_at ON prompt_logs(client_ip, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_source_tool_created_at ON prompt_logs(source_tool, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_source_tool_label_created_at ON prompt_logs(source_tool_label, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_connection_created_at ON prompt_logs(connection_id, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_account_created_at ON prompt_logs(account_name, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_provider_created_at ON prompt_logs(provider, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_status_created_at ON prompt_logs(status_code, created_at DESC)"])b.run(a)}finally{b.close()}}async function M(a){await (0,D.DU)().catch(()=>null)}async function N(a){if(!a.enabled)return;let b="sqlite"===a.type?`sqlite:${a.sqlitePath}`:`${a.type}:${a.host||""}:${a.port||""}:${a.database||""}`;if(!E.has(b))try{"sqlite"===a.type?await L(a):await M(a),E.add(b)}catch(a){console.warn("[prompt-log-analytics] Unable to ensure indexes:",a?.message||a)}}function O(a={}){return{keyword:F(a.keyword),model:F(a.model),stage:F(a.stage),sessionId:F(a.sessionId),clientIp:F(a.clientIp||a.sourceIp),sourceTool:F(a.sourceTool),dateFrom:F(a.dateFrom||a.startIso),dateTo:F(a.dateTo||a.endIso)}}function P(a,b,c,d,e=50){return a.all(`SELECT ${c},
1
+ "use strict";(()=>{var a={};a.id=451,a.ids=[451],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:()=>t,aV:()=>n,bz:()=>p,hH:()=>s,oW:()=>r,s0:()=>l,ub:()=>m,vZ:()=>o});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)?h.hS.ADMIN:n(a,b)?h.hS.MONITOR_ADMIN:h.hS.USER:h.hS.GUEST}function p(a={}){return!0===a.isAdmin||!0===a.isMonitorAdmin}async function q(){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,role:h.hS.GUEST,userId:"",displayName:"Guest",loginMethod:"None",settings:{...a,requireLogin:!0},session:null};let e=l(c||{}),i=o(a,c||{}),j=i===h.hS.ADMIN,k=i===h.hS.MONITOR_ADMIN;return{authenticated:!0,isAdmin:j,isMonitorAdmin:k,role:i,canManageApiKeys:j||k,canUseMonitorAdminTabs:j||k,...e,settings:{...a,requireLogin:!0},session:c}}async function r(){let a=await q();return a.authenticated?{access:a,response:null}:{access:a,response:e.NextResponse.json({error:"Authentication required"},{status:401})}}async function s(a={}){let{allowMonitorAdmin:b=!1}=a||{},{access:c,response:d}=await r();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 t(a,b){if(!a?.authenticated||!b)return!1;if(p(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")},19771:a=>{a.exports=require("process")},21820:a=>{a.exports=require("os")},27910:a=>{a.exports=require("stream")},28354:a=>{a.exports=require("util")},29021:a=>{a.exports=require("fs")},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("24h").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:"/"})}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")},53053:a=>{a.exports=require("node:diagnostics_channel")},55511:a=>{a.exports=require("crypto")},61066:(a,b,c)=>{c.r(b),c.d(b,{handler:()=>aS,patchFetch:()=>aR,routeModule:()=>aN,serverHooks:()=>aQ,workAsyncStorage:()=>aO,workUnitAsyncStorage:()=>aP});var d={};c.r(d),c.d(d,{GET:()=>aM,dynamic:()=>aK});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(29021),z=c.n(y),A=c(33873),B=c.n(A),C=c(45903),D=c(97242);let E=new Set;function F(a){return String(a||"").trim()}function G(a,b=0){let c=Number(a);return Number.isFinite(c)?c:b}async function H(){let a=(0,C.I6)(await (0,C.L7)());return a.sqlitePath||(a.sqlitePath=B().join(process.env.DATA_DIR||"/var/lib/bluerouter","logs","promptLogs.sqlite")),a}async function I(a){try{let b=await Promise.resolve().then(c.t.bind(c,87550,23)),d=new(b.default||b)(a);return d.pragma("busy_timeout = 5000"),{all:(a,b={})=>d.prepare(a).all(b),get:(a,b={})=>d.prepare(a).get(b),run:(a,b={})=>d.prepare(a).run(b),close:()=>d.close()}}catch{let b=new(await Promise.resolve().then(c.t.bind(c,80099,23))).DatabaseSync(a);return b.exec("PRAGMA busy_timeout = 5000"),{all:(a,c={})=>b.prepare(a).all(c),get:(a,c={})=>b.prepare(a).get(c),run:(a,c={})=>b.prepare(a).run(c),close:()=>b.close()}}}async function J(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(),{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 K(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});return{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 L(a){if(!z().existsSync(a.sqlitePath))return;let b=await I(a.sqlitePath);try{if(!b.get("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'prompt_logs'"))return;for(let a of["CREATE INDEX IF NOT EXISTS idx_prompt_logs_created_id ON prompt_logs(created_at DESC, id)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_stage_created_at ON prompt_logs(stage, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_model_created_at ON prompt_logs(model, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_display_model_created_at ON prompt_logs(display_model, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_session_created_at ON prompt_logs(session_id, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_client_ip_created_at ON prompt_logs(client_ip, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_source_tool_created_at ON prompt_logs(source_tool, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_source_tool_label_created_at ON prompt_logs(source_tool_label, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_connection_created_at ON prompt_logs(connection_id, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_account_created_at ON prompt_logs(account_name, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_provider_created_at ON prompt_logs(provider, created_at DESC)","CREATE INDEX IF NOT EXISTS idx_prompt_logs_status_created_at ON prompt_logs(status_code, created_at DESC)"])b.run(a)}finally{b.close()}}async function M(a){await (0,D.DU)().catch(()=>null)}async function N(a){if(!a.enabled)return;let b="sqlite"===a.type?`sqlite:${a.sqlitePath}`:`${a.type}:${a.host||""}:${a.port||""}:${a.database||""}`;if(!E.has(b))try{"sqlite"===a.type?await L(a):await M(a),E.add(b)}catch(a){console.warn("[prompt-log-analytics] Unable to ensure indexes:",a?.message||a)}}function O(a={}){return{keyword:F(a.keyword),model:F(a.model),stage:F(a.stage),sessionId:F(a.sessionId),clientIp:F(a.clientIp||a.sourceIp),sourceTool:F(a.sourceTool),dateFrom:F(a.dateFrom||a.startIso),dateTo:F(a.dateTo||a.endIso)}}function P(a,b,c,d,e=50){return a.all(`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 CAST(status_code AS TEXT) NOT LIKE '2%' THEN 1
@@ -26,7 +26,7 @@
26
26
  connection_id LIKE @keyword OR display_model LIKE @keyword OR session_id LIKE @keyword OR
27
27
  client_ip LIKE @keyword OR client_host LIKE @keyword OR client_user_agent LIKE @keyword OR
28
28
  source_tool LIKE @keyword OR source_tool_label LIKE @keyword OR source_host LIKE @keyword
29
- )`),d.keyword=`%${b.keyword}%`),b.model&&(c.push("(model = @model OR display_model = @model)"),d.model=b.model),b.stage&&(c.push("stage = @stage"),d.stage=b.stage),b.sessionId&&(c.push("session_id = @sessionId"),d.sessionId=b.sessionId),b.clientIp&&(c.push("client_ip LIKE @clientIp"),d.clientIp=`%${b.clientIp}%`),b.sourceTool&&(c.push("(source_tool LIKE @sourceTool OR source_tool_label LIKE @sourceTool OR source_host LIKE @sourceTool)"),d.sourceTool=`%${b.sourceTool}%`),b.dateFrom&&(c.push("created_at >= @dateFrom"),d.dateFrom=b.dateFrom),b.dateTo&&(c.push("created_at <= @dateTo"),d.dateTo=b.dateTo),{clause:c.length?`WHERE ${c.join(" AND ")}`:"",params:d}}(b),e=G(c.get(`SELECT COUNT(*) AS count FROM prompt_logs ${d.clause}`,d.params)?.count,0),f=R(P(c,d,"COALESCE(NULLIF(client_ip, ''), 'unknown') AS key, COALESCE(NULLIF(client_ip, ''), 'unknown') AS label","COALESCE(NULLIF(client_ip, ''), 'unknown')")),g=R(P(c,d,"COALESCE(NULLIF(source_tool_label, ''), NULLIF(source_tool, ''), NULLIF(source_host, ''), 'unknown') AS 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')")),h=R(P(c,d,"COALESCE(NULLIF(session_id, ''), 'unknown') AS key, COALESCE(NULLIF(session_id, ''), 'unknown') AS label","COALESCE(NULLIF(session_id, ''), 'unknown')")),i=R(P(c,d,"COALESCE(NULLIF(stage, ''), 'unknown') AS key, COALESCE(NULLIF(stage, ''), 'unknown') AS label","COALESCE(NULLIF(stage, ''), 'unknown')")),j=R(P(c,d,"COALESCE(NULLIF(display_model, ''), NULLIF(model, ''), 'unknown') AS key, COALESCE(NULLIF(display_model, ''), NULLIF(model, ''), 'unknown') AS label","COALESCE(NULLIF(display_model, ''), NULLIF(model, ''), 'unknown')")),k=R(P(c,d,"COALESCE(NULLIF(account_name, ''), NULLIF(connection_id, ''), NULLIF(provider, ''), 'unknown') AS key, COALESCE(NULLIF(account_name, ''), NULLIF(connection_id, ''), NULLIF(provider, ''), 'unknown') AS label","COALESCE(NULLIF(account_name, ''), NULLIF(connection_id, ''), NULLIF(provider, ''), 'unknown')")),l=R(P(c,d,"CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 'error' ELSE COALESCE(CAST(status_code AS TEXT), 'ok') END AS key, CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 'error' ELSE COALESCE(CAST(status_code AS TEXT), 'ok') END AS label","CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 'error' ELSE COALESCE(CAST(status_code AS TEXT), 'ok') END")),m=await (0,D.DU)().catch(()=>({models:[],stages:[]}));return{total:e,sampled:e,disabled:!1,missing:!1,dbInfo:{type:"sqlite",sqlitePath:a.sqlitePath},models:m.models||[],stages:m.stages||[],topClientIps:f,topSourceTools:g,topSessions:h,topStages:i,topModels:j,topAccounts:k,topStatuses:l}}finally{c.close()}}async function T(a,b){let c=a.type,d="postgres"===c?await J(a):await K(a);try{let e=function(a={},b){let c=O(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)})`)}return 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=G(f?.count,0),h=R(await Q(d,e,"COALESCE(NULLIF(client_ip, ''), 'unknown') AS metric_key, COALESCE(NULLIF(client_ip, ''), 'unknown') AS label","COALESCE(NULLIF(client_ip, ''), 'unknown')")),i=R(await Q(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=R(await Q(d,e,"COALESCE(NULLIF(session_id, ''), 'unknown') AS metric_key, COALESCE(NULLIF(session_id, ''), 'unknown') AS label","COALESCE(NULLIF(session_id, ''), 'unknown')")),k=R(await Q(d,e,"COALESCE(NULLIF(stage, ''), 'unknown') AS metric_key, COALESCE(NULLIF(stage, ''), 'unknown') AS label","COALESCE(NULLIF(stage, ''), 'unknown')")),l=R(await Q(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=R(await Q(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=R(await Q(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,D.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 U(a={}){let b=await H();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 N(b),"sqlite"===b.type)return S(b,a);if("postgres"===b.type||"mysql"===b.type)return T(b,a);throw Error(`Unsupported prompt log database type: ${b.type}`)}var V=c(35901);let W=new Set(["today","24h","7d","30d","60d","all","custom"]),X="lower(trim(COALESCE(CAST(status AS TEXT), '')))",Y=`(
29
+ )`),d.keyword=`%${b.keyword}%`),b.model&&(c.push("(model = @model OR display_model = @model)"),d.model=b.model),b.stage&&(c.push("stage = @stage"),d.stage=b.stage),b.sessionId&&(c.push("session_id = @sessionId"),d.sessionId=b.sessionId),b.clientIp&&(c.push("client_ip LIKE @clientIp"),d.clientIp=`%${b.clientIp}%`),b.sourceTool&&(c.push("(source_tool LIKE @sourceTool OR source_tool_label LIKE @sourceTool OR source_host LIKE @sourceTool)"),d.sourceTool=`%${b.sourceTool}%`),b.dateFrom&&(c.push("created_at >= @dateFrom"),d.dateFrom=b.dateFrom),b.dateTo&&(c.push("created_at <= @dateTo"),d.dateTo=b.dateTo),{clause:c.length?`WHERE ${c.join(" AND ")}`:"",params:d}}(b),e=G(c.get(`SELECT COUNT(*) AS count FROM prompt_logs ${d.clause}`,d.params)?.count,0),f=R(P(c,d,"COALESCE(NULLIF(client_ip, ''), 'unknown') AS key, COALESCE(NULLIF(client_ip, ''), 'unknown') AS label","COALESCE(NULLIF(client_ip, ''), 'unknown')")),g=R(P(c,d,"COALESCE(NULLIF(source_tool_label, ''), NULLIF(source_tool, ''), NULLIF(source_host, ''), 'unknown') AS 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')")),h=R(P(c,d,"COALESCE(NULLIF(session_id, ''), 'unknown') AS key, COALESCE(NULLIF(session_id, ''), 'unknown') AS label","COALESCE(NULLIF(session_id, ''), 'unknown')")),i=R(P(c,d,"COALESCE(NULLIF(stage, ''), 'unknown') AS key, COALESCE(NULLIF(stage, ''), 'unknown') AS label","COALESCE(NULLIF(stage, ''), 'unknown')")),j=R(P(c,d,"COALESCE(NULLIF(display_model, ''), NULLIF(model, ''), 'unknown') AS key, COALESCE(NULLIF(display_model, ''), NULLIF(model, ''), 'unknown') AS label","COALESCE(NULLIF(display_model, ''), NULLIF(model, ''), 'unknown')")),k=R(P(c,d,"COALESCE(NULLIF(account_name, ''), NULLIF(connection_id, ''), NULLIF(provider, ''), 'unknown') AS key, COALESCE(NULLIF(account_name, ''), NULLIF(connection_id, ''), NULLIF(provider, ''), 'unknown') AS label","COALESCE(NULLIF(account_name, ''), NULLIF(connection_id, ''), NULLIF(provider, ''), 'unknown')")),l=R(P(c,d,"CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 'error' ELSE COALESCE(CAST(status_code AS TEXT), 'ok') END AS key, CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 'error' ELSE COALESCE(CAST(status_code AS TEXT), 'ok') END AS label","CASE WHEN error_text IS NOT NULL AND error_text <> '' THEN 'error' ELSE COALESCE(CAST(status_code AS TEXT), 'ok') END")),m=await (0,D.DU)().catch(()=>({models:[],stages:[]}));return{total:e,sampled:e,disabled:!1,missing:!1,dbInfo:{type:"sqlite",sqlitePath:a.sqlitePath},models:m.models||[],stages:m.stages||[],topClientIps:f,topSourceTools:g,topSessions:h,topStages:i,topModels:j,topAccounts:k,topStatuses:l}}finally{c.close()}}async function T(a,b){let c=a.type,d="postgres"===c?await J(a):await K(a);try{let e=function(a={},b){let c=O(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)})`)}return 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=G(f?.count,0),h=R(await Q(d,e,"COALESCE(NULLIF(client_ip, ''), 'unknown') AS metric_key, COALESCE(NULLIF(client_ip, ''), 'unknown') AS label","COALESCE(NULLIF(client_ip, ''), 'unknown')")),i=R(await Q(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=R(await Q(d,e,"COALESCE(NULLIF(session_id, ''), 'unknown') AS metric_key, COALESCE(NULLIF(session_id, ''), 'unknown') AS label","COALESCE(NULLIF(session_id, ''), 'unknown')")),k=R(await Q(d,e,"COALESCE(NULLIF(stage, ''), 'unknown') AS metric_key, COALESCE(NULLIF(stage, ''), 'unknown') AS label","COALESCE(NULLIF(stage, ''), 'unknown')")),l=R(await Q(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=R(await Q(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=R(await Q(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,D.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 U(a={}){let b=await H();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 N(b),"sqlite"===b.type)return S(b,a);if("postgres"===b.type||"mysql"===b.type)return T(b,a);throw Error(`Unsupported prompt log database type: ${b.type}`)}var V=c(35901);let W=new Set(["today","yesterday","24h","thisWeek","lastWeek","7d","thisMonth","lastMonth","30d","60d","all","custom"]),X="lower(trim(COALESCE(CAST(status AS TEXT), '')))",Y=`(
30
30
  ${X} GLOB 'error*'
31
31
  OR ${X} GLOB 'fail*'
32
32
  OR ${X} GLOB 'failed*'
@@ -62,14 +62,14 @@
62
62
  COALESCE(SUM(CASE WHEN ${_} THEN COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0) ELSE 0 END), 0) AS totalTokens,
63
63
  COALESCE(SUM(CASE WHEN ${_} THEN COALESCE(cost, 0) ELSE 0 END), 0) AS cost,
64
64
  MAX(timestamp) AS lastSeen
65
- `;function ab(a){return String(a||"").trim()}function ac(a){return ab(a).toLowerCase()}function ad(a,b=0){let c=Number(a);return Number.isFinite(c)?c:b}function ae(a){let b=ab(a);if(!b)return"";let c=new Date(b);return Number.isNaN(c.getTime())?"":c.toISOString()}function af(a={}){return{...function(a={}){let b=W.has(a.period)?a.period:"24h",c=new Date,d=null,e=c;if("custom"===b){let b=ae(a.dateFrom),f=ae(a.dateTo);d=new Date(b||c.getTime()-864e5),e=f?new Date(f):c}else d="today"===b?function(a=new Date){let b=new Date(a);return b.setHours(0,0,0,0),b}(c):"24h"===b?new Date(c.getTime()-864e5):"7d"===b?new Date(c.getTime()-6048e5):"30d"===b?new Date(c.getTime()-2592e6):"60d"===b?new Date(c.getTime()-5184e6):null;if(d&&e&&d>e){let a=d;d=e,e=a}return{period:b,start:d,end:e,startIso:d?d.toISOString():"",endIso:e?e.toISOString():""}}(a),provider:ab(a.provider),model:ab(a.model),connectionId:ab(a.connectionId),status:ab(a.status),endpoint:ab(a.endpoint),apiKey:ab(a.apiKey),clientIp:ab(a.clientIp||a.sourceIp),sourceTool:ab(a.sourceTool),sessionId:ab(a.sessionId),keyword:ab(a.keyword),maxPromptLogRows:Math.max(200,Math.min(1500,Math.floor(ad(a.maxPromptLogRows,1500))))}}function ag(a){let b,c=ab(a);return c?(b=ab(c))?b.length<=12?b:`${b.slice(0,8)}...${b.slice(-4)}`:"local-no-key":"local-no-key"}async function ah(a){try{let b=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=ab(a.key),c=ag(b);return{id:ab(a.id),key:b,fingerprint:c,masked:c,name:ab(a.name)||c,ownerUser:ab(a.ownerUser||a.owner_user),createdByUser:ab(a.createdByUser||a.created_by_user),machineId:ab(a.machineId||a.machine_id),isActive:void 0===a.isActive||1===a.isActive||!0===a.isActive,createdAt:ab(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 ai(a){let b=new Map;try{for(let c of 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{}return b}function aj(a,b=new Map){let c=ab(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 ak(a){let b=ad(a.errors,0),c=ad(a.success,0),d=ad(a.pending,0),e=ad(a.requests,c+b),f=ad(a.promptTokens,0),g=ad(a.completionTokens,0),h=ad(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 al(a,b=null,c={}){let d=[],e=[];if(a.startIso&&(d.push("timestamp >= ?"),e.push(a.startIso)),a.endIso&&(d.push("timestamp <= ?"),e.push(a.endIso)),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 ")})`)}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 am(a,b){return Math.floor(a/b)*b}function an(a,b={}){return ak({key:ab(a.key)||"unknown",label:ab(a.label||a.key)||"unknown",requests:ad(a.requests,0),success:ad(a.success,0),errors:ad(a.errors,0),pending:ad(a.pending,0),promptTokens:ad(a.promptTokens,0),completionTokens:ad(a.completionTokens,0),totalTokens:ad(a.totalTokens,0),cachedTokens:0,reasoningTokens:0,cost:ad(a.cost,0),lastSeen:a.lastSeen||"",...b})}function ao(a,b,c,d,e,f=[],g=50,h="requests DESC, totalTokens DESC"){let i=al(b,c);return a.all(`SELECT
65
+ `;function ab(a){return String(a||"").trim()}function ac(a){return ab(a).toLowerCase()}function ad(a,b=0){let c=Number(a);return Number.isFinite(c)?c:b}function ae(a){let b=ab(a);if(!b)return"";let c=new Date(b);return Number.isNaN(c.getTime())?"":c.toISOString()}function af(a=new Date){let b=new Date(a);return b.setHours(0,0,0,0),b}function ag(a,b){let c=new Date(a);return c.setDate(c.getDate()+b),c}function ah(a=new Date){let b=af(a),c=b.getDay();return ag(b,0===c?-6:1-c)}function ai(a=new Date){let b=new Date(a);return b.setDate(1),b.setHours(0,0,0,0),b}function aj(a={}){return{...function(a={}){let b=W.has(a.period)?a.period:"24h",c=new Date,d=null,e=c;if("custom"===b){let b=ae(a.dateFrom),f=ae(a.dateTo);d=new Date(b||c.getTime()-864e5),e=f?new Date(f):c}else if("today"===b)d=af(c);else if("yesterday"===b){let a=af(c);d=ag(a,-1),e=a}else if("24h"===b)d=new Date(c.getTime()-864e5);else if("thisWeek"===b)d=ah(c);else if("lastWeek"===b){let a=ah(c);d=ag(a,-7),e=a}else if("7d"===b)d=new Date(c.getTime()-6048e5);else if("thisMonth"===b)d=ai(c);else if("lastMonth"===b){let a=ai(c);(d=new Date(a)).setMonth(d.getMonth()-1),e=a}else d="30d"===b?new Date(c.getTime()-2592e6):"60d"===b?new Date(c.getTime()-5184e6):null;if(d&&e&&d>e){let a=d;d=e,e=a}return{period:b,start:d,end:e,startIso:d?d.toISOString():"",endIso:e?e.toISOString():""}}(a),provider:ab(a.provider),model:ab(a.model),connectionId:ab(a.connectionId),status:ab(a.status),endpoint:ab(a.endpoint),apiKey:ab(a.apiKey),clientIp:ab(a.clientIp||a.sourceIp),sourceTool:ab(a.sourceTool),sessionId:ab(a.sessionId),keyword:ab(a.keyword),maxPromptLogRows:Math.max(200,Math.min(1500,Math.floor(ad(a.maxPromptLogRows,1500))))}}function ak(a){let b,c=ab(a);return c?(b=ab(c))?b.length<=12?b:`${b.slice(0,8)}...${b.slice(-4)}`:"local-no-key":"local-no-key"}async function al(a){try{let b=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=ab(a.key),c=ak(b);return{id:ab(a.id),key:b,fingerprint:c,masked:c,name:ab(a.name)||c,ownerUser:ab(a.ownerUser||a.owner_user),createdByUser:ab(a.createdByUser||a.created_by_user),machineId:ab(a.machineId||a.machine_id),isActive:void 0===a.isActive||1===a.isActive||!0===a.isActive,createdAt:ab(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 am(a){let b=new Map;try{for(let c of 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{}return b}function an(a,b=new Map){let c=ab(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 ao(a){let b=ad(a.errors,0),c=ad(a.success,0),d=ad(a.pending,0),e=ad(a.requests,c+b),f=ad(a.promptTokens,0),g=ad(a.completionTokens,0),h=ad(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 ap(a,b=null,c={}){let d=[],e=[];if(a.startIso&&(d.push("timestamp >= ?"),e.push(a.startIso)),a.endIso&&(d.push("timestamp <= ?"),e.push(a.endIso)),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 ")})`)}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 aq(a,b){return Math.floor(a/b)*b}function ar(a,b={}){return ao({key:ab(a.key)||"unknown",label:ab(a.label||a.key)||"unknown",requests:ad(a.requests,0),success:ad(a.success,0),errors:ad(a.errors,0),pending:ad(a.pending,0),promptTokens:ad(a.promptTokens,0),completionTokens:ad(a.completionTokens,0),totalTokens:ad(a.totalTokens,0),cachedTokens:0,reasoningTokens:0,cost:ad(a.cost,0),lastSeen:a.lastSeen||"",...b})}function as(a,b,c,d,e,f=[],g=50,h="requests DESC, totalTokens DESC"){let i=ap(b,c);return a.all(`SELECT
66
66
  ${d},
67
67
  ${aa}
68
68
  FROM usageHistory
69
69
  ${i.clause}
70
70
  GROUP BY ${e}
71
71
  ORDER BY ${h}
72
- LIMIT ?`,[...f,...i.params,g])||[]}function ap(a,b,c,d,e=new Map){let f=al(b,c),g=f.clause?`${f.clause} AND ${_}`:`WHERE ${_}`,h=`COALESCE(NULLIF(${d}, ''), 'unknown')`,i=a.all(`SELECT
72
+ LIMIT ?`,[...f,...i.params,g])||[]}function at(a,b,c,d,e=new Map){let f=ap(b,c),g=f.clause?`${f.clause} AND ${_}`:`WHERE ${_}`,h=`COALESCE(NULLIF(${d}, ''), 'unknown')`,i=a.all(`SELECT
73
73
  COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS apiKeyGroupKey,
74
74
  ${h} AS itemKey,
75
75
  COUNT(*) AS requests,
@@ -78,41 +78,41 @@
78
78
  FROM usageHistory
79
79
  ${g}
80
80
  GROUP BY COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key'), ${h}
81
- ORDER BY apiKeyGroupKey ASC, requests DESC, totalTokens DESC`,f.params)||[],j=new Map;for(let a of i){let b=ab(a.itemKey)||"unknown",c="provider"===d?aj(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:ad(a.requests,0),totalTokens:ad(a.totalTokens,0),lastSeen:a.lastSeen||""})}return j}function aq(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]}function ar(a,b,c={}){let d=al(a,b,c),e=[_,Z,"(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}}function as(a,b,c){try{let d=a.get(`SELECT COUNT(*) AS samples FROM usageHistory ${b.clause} AND ${c}`,b.params)||{};return ad(d.samples,0)}catch{return 0}}function at(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=a.get(`SELECT ${c} AS value
81
+ ORDER BY apiKeyGroupKey ASC, requests DESC, totalTokens DESC`,f.params)||[],j=new Map;for(let a of i){let b=ab(a.itemKey)||"unknown",c="provider"===d?an(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:ad(a.requests,0),totalTokens:ad(a.totalTokens,0),lastSeen:a.lastSeen||""})}return j}function au(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]}function av(a,b,c={}){let d=ap(a,b,c),e=[_,Z,"(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}}function aw(a,b,c){try{let d=a.get(`SELECT COUNT(*) AS samples FROM usageHistory ${b.clause} AND ${c}`,b.params)||{};return ad(d.samples,0)}catch{return 0}}function ax(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=a.get(`SELECT ${c} AS value
82
82
  FROM usageHistory
83
83
  ${b.clause} AND ${d}
84
84
  ORDER BY ${c} ASC
85
- LIMIT 1 OFFSET ?`,[...b.params,g]);return e?ad(e.value,null):null}catch{return null}}function au({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}}function av(a,b,c){let d=function(a={}){let b=(0,x.q)(a.tokens,{})||{},c=ad(a.promptTokens,0)||ad(b.prompt_tokens,0)||ad(b.input_tokens,0),d=ad(a.completionTokens,0)||ad(b.completion_tokens,0)||ad(b.output_tokens,0);return{promptTokens:c,completionTokens:d,totalTokens:c+d,cachedTokens:ad(b.cached_tokens,0)||ad(b.cache_read_input_tokens,0)||ad(b.prompt_tokens_details?.cached_tokens,0),reasoningTokens:ad(b.reasoning_tokens,0)||ad(b.completion_tokens_details?.reasoning_tokens,0)||ad(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||"",model:a.model||"",connectionId:a.connectionId||"",accountName:f?.name||a.connectionId||"",apiKeyName:a.apiKeyName||e?.name||(a.apiKeyFingerprint||a.apiKey?ag(a.apiKeyFingerprint||a.apiKey):"Local"),apiKeyFingerprint:a.apiKeyFingerprint||e?.fingerprint||ag(a.apiKey),apiKeyId:a.apiKeyId||e?.id||"",clientIp:a.clientIpNormalized||a.clientIp||"",sourceTool:a.sourceTool||a.sourceToolLabel||"",sessionId:a.sessionId||"",latencyMs:ad(a.latencyMs,0),ttftMs:ad(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:ad(a.cost,0)}}function aw(a,b,c=b){let d=function(a,b=a){let c=ab(a);return c?{value:c,label:ab(b)||c}:null}(b,c);return d&&(a.some(a=>a.value===d.value)||a.unshift(d)),a}function ax(a){return{...a,provider:"",model:"",connectionId:"",status:"",endpoint:"",apiKey:""}}function ay(a,b,c,d=500){let e=al(ax(b),null),f=e.clause?`${e.clause} AND`:"WHERE";return(a.all(`SELECT DISTINCT ${c} AS value
85
+ LIMIT 1 OFFSET ?`,[...b.params,g]);return e?ad(e.value,null):null}catch{return null}}function ay({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}}function az(a,b,c){let d=function(a={}){let b=(0,x.q)(a.tokens,{})||{},c=ad(a.promptTokens,0)||ad(b.prompt_tokens,0)||ad(b.input_tokens,0),d=ad(a.completionTokens,0)||ad(b.completion_tokens,0)||ad(b.output_tokens,0);return{promptTokens:c,completionTokens:d,totalTokens:c+d,cachedTokens:ad(b.cached_tokens,0)||ad(b.cache_read_input_tokens,0)||ad(b.prompt_tokens_details?.cached_tokens,0),reasoningTokens:ad(b.reasoning_tokens,0)||ad(b.completion_tokens_details?.reasoning_tokens,0)||ad(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||"",model:a.model||"",connectionId:a.connectionId||"",accountName:f?.name||a.connectionId||"",apiKeyName:a.apiKeyName||e?.name||(a.apiKeyFingerprint||a.apiKey?ak(a.apiKeyFingerprint||a.apiKey):"Local"),apiKeyFingerprint:a.apiKeyFingerprint||e?.fingerprint||ak(a.apiKey),apiKeyId:a.apiKeyId||e?.id||"",clientIp:a.clientIpNormalized||a.clientIp||"",sourceTool:a.sourceTool||a.sourceToolLabel||"",sessionId:a.sessionId||"",latencyMs:ad(a.latencyMs,0),ttftMs:ad(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:ad(a.cost,0)}}function aA(a,b,c=b){let d=function(a,b=a){let c=ab(a);return c?{value:c,label:ab(b)||c}:null}(b,c);return d&&(a.some(a=>a.value===d.value)||a.unshift(d)),a}function aB(a){return{...a,provider:"",model:"",connectionId:"",status:"",endpoint:"",apiKey:""}}function aC(a,b,c,d=500){let e=ap(aB(b),null),f=e.clause?`${e.clause} AND`:"WHERE";return(a.all(`SELECT DISTINCT ${c} AS value
86
86
  FROM usageHistory
87
87
  ${f} ${c} IS NOT NULL AND ${c} <> ''
88
88
  ORDER BY ${c} ASC
89
- LIMIT ?`,[...e.params,d])||[]).map(a=>ab(a.value)).filter(Boolean)}let az="COALESCE(NULLIF(apiKeyOwner, ''), NULLIF(apiKeyName, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKeyId, ''), NULLIF(clientIpNormalized, ''), 'local-no-key')",aA="COALESCE(NULLIF(apiKeyOwner, ''), NULLIF(apiKeyName, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(clientIpNormalized, ''), 'Local / kh\xf4ng API key')";function aB(a,b,c,d,e=new Map){if(!new Set(["model","provider","endpoint","clientIpNormalized","sourceTool"]).has(d))return new Map;let f=ar(b,c),g=`COALESCE(NULLIF(${d}, ''), 'unknown')`;try{let b=a.all(`SELECT
90
- ${az} AS clientKey,
89
+ LIMIT ?`,[...e.params,d])||[]).map(a=>ab(a.value)).filter(Boolean)}let aD="COALESCE(NULLIF(apiKeyOwner, ''), NULLIF(apiKeyName, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKeyId, ''), NULLIF(clientIpNormalized, ''), 'local-no-key')",aE="COALESCE(NULLIF(apiKeyOwner, ''), NULLIF(apiKeyName, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(clientIpNormalized, ''), 'Local / kh\xf4ng API key')";function aF(a,b,c,d,e=new Map){if(!new Set(["model","provider","endpoint","clientIpNormalized","sourceTool"]).has(d))return new Map;let f=av(b,c),g=`COALESCE(NULLIF(${d}, ''), 'unknown')`;try{let b=a.all(`SELECT
90
+ ${aD} AS clientKey,
91
91
  ${g} AS itemKey,
92
92
  COUNT(*) AS requests,
93
93
  COALESCE(SUM(COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)), 0) AS totalTokens,
94
94
  MAX(timestamp) AS lastSeen
95
95
  FROM usageHistory
96
96
  ${f.clause}
97
- GROUP BY ${az}, ${g}
98
- ORDER BY clientKey ASC, requests DESC, totalTokens DESC`,f.params)||[],c=new Map;for(let a of b){let b=ab(a.itemKey)||"unknown",f="provider"===d?aj(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:ad(a.requests,0),totalTokens:ad(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 aC(a={},b={}){let c=ad(a.requests,0),d=ad(a.success,c),e=ad(a.errors,0),f=ad(a.promptTokens,0),g=ad(a.completionTokens,0),h=ad(a.totalTokens,f+g),i=ad(a.p95PromptTokens,0),j=ad(a.p95LatencyMs,null),k=c?e/c:0,l=c?ad(a.longInputRequests,0)/c:0,m=c?ad(a.hugeInputRequests,0)/c:0,n=c?ad(a.extremeInputRequests,0)/c:0,o=c?ad(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:ad(j,0),longInputRate:l,errorRate:k});return{key:ab(a.clientKey)||"unknown",label:ab(a.clientLabel||a.clientKey)||"unknown",ownerUser:ab(a.ownerUser),apiKeyName:ab(a.apiKeyName),apiKeyFingerprint:ab(a.apiKeyFingerprint),primaryClientIp:ab(a.primaryClientIp),primarySourceTool:ab(a.primarySourceTool),apiKeyCount:ad(a.apiKeyCount,0),sourceIpCount:ad(a.sourceIpCount,0),sourceToolCount:ad(a.sourceToolCount,0),sessionCount:ad(a.sessionCount,0),requests:c,success:d,errors:e,errorRate:k,promptTokens:f,completionTokens:g,totalTokens:h,cost:ad(a.cost,0),avgPromptTokens:c?f/c:0,avgCompletionTokens:c?g/c:0,avgTokens:c?h/c:0,p50PromptTokens:ad(a.p50PromptTokens,0),p95PromptTokens:i,maxPromptTokens:ad(a.maxPromptTokens,0),avgLatencyMs:ad(a.avgLatencyMs,null),p95LatencyMs:j,maxLatencyMs:ad(a.maxLatencyMs,null),avgTtftMs:ad(a.avgTtftMs,null),p95TtftMs:ad(a.p95TtftMs,null),longInputRequests:ad(a.longInputRequests,0),hugeInputRequests:ad(a.hugeInputRequests,0),extremeInputRequests:ad(a.extremeInputRequests,0),slowRequests:ad(a.slowRequests,0),slowTtftRequests:ad(a.slowTtftRequests,0),longInputRate:l,hugeInputRate:m,extremeInputRate:n,slowRequestRate:o,slowTtftRate:c?ad(a.slowTtftRequests,0)/c:0,outputTokensPerSecond:ad(a.totalLatencyMs,0)>0?g/(ad(a.totalLatencyMs,0)/1e3):null,level:p.level,pressureLabel:p.label,tone:p.tone,lastSeen:a.lastSeen||"",...b}}function aD(a){let b=String(a??"");return/[",\n\r]/.test(b)?`"${b.replace(/"/g,'""')}"`:b}async function aE(a={}){let b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,y,z,A=JSON.stringify(af(a)),B=(global._dashboardAnalyticsV2Cache||(global._dashboardAnalyticsV2Cache=new Map),global._dashboardAnalyticsV2Cache),C=B.get(A);if(C&&Date.now()-C.createdAt<15e3)return C.data;let D=af(a),E=await (0,w.c)(),[F,G]=await Promise.all([ah(E),ai(E)]),H=function(a,b){let c=ac(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=>ac(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}}(D.apiKey,F),I=(b=al(D,H),E.get(`SELECT MIN(timestamp) AS minTs, MAX(timestamp) AS maxTs FROM usageHistory ${b.clause}`,b.params)||{}),[J,K]=await Promise.all([U({keyword:D.keyword,model:D.model,sourceTool:D.sourceTool,clientIp:D.clientIp,sessionId:D.sessionId,dateFrom:D.startIso,dateTo:D.endIso}),(0,V.Wl)({keyword:D.keyword,provider:D.provider,model:D.model,connectionId:D.connectionId,endpoint:D.endpoint,apiKey:D.apiKey,status:D.status,sourceTool:D.sourceTool,clientIp:D.clientIp,sessionId:D.sessionId,dateFrom:D.startIso,dateTo:D.endIso})]),L=(c=al(D,H),e=function(a={}){return ak({requests:ad(a.requests,0),success:ad(a.success,0),errors:ad(a.errors,0),pending:ad(a.pending,0),promptTokens:ad(a.promptTokens,0),completionTokens:ad(a.completionTokens,0),totalTokens:ad(a.totalTokens,0),cachedTokens:ad(a.cachedTokens,0),reasoningTokens:ad(a.reasoningTokens,0),cost:ad(a.cost,0),lastSeen:a.lastSeen||""})}(d=E.get(`SELECT
97
+ GROUP BY ${aD}, ${g}
98
+ ORDER BY clientKey ASC, requests DESC, totalTokens DESC`,f.params)||[],c=new Map;for(let a of b){let b=ab(a.itemKey)||"unknown",f="provider"===d?an(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:ad(a.requests,0),totalTokens:ad(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 aG(a={},b={}){let c=ad(a.requests,0),d=ad(a.success,c),e=ad(a.errors,0),f=ad(a.promptTokens,0),g=ad(a.completionTokens,0),h=ad(a.totalTokens,f+g),i=ad(a.p95PromptTokens,0),j=ad(a.p95LatencyMs,null),k=c?e/c:0,l=c?ad(a.longInputRequests,0)/c:0,m=c?ad(a.hugeInputRequests,0)/c:0,n=c?ad(a.extremeInputRequests,0)/c:0,o=c?ad(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:ad(j,0),longInputRate:l,errorRate:k});return{key:ab(a.clientKey)||"unknown",label:ab(a.clientLabel||a.clientKey)||"unknown",ownerUser:ab(a.ownerUser),apiKeyName:ab(a.apiKeyName),apiKeyFingerprint:ab(a.apiKeyFingerprint),primaryClientIp:ab(a.primaryClientIp),primarySourceTool:ab(a.primarySourceTool),apiKeyCount:ad(a.apiKeyCount,0),sourceIpCount:ad(a.sourceIpCount,0),sourceToolCount:ad(a.sourceToolCount,0),sessionCount:ad(a.sessionCount,0),requests:c,success:d,errors:e,errorRate:k,promptTokens:f,completionTokens:g,totalTokens:h,cost:ad(a.cost,0),avgPromptTokens:c?f/c:0,avgCompletionTokens:c?g/c:0,avgTokens:c?h/c:0,p50PromptTokens:ad(a.p50PromptTokens,0),p95PromptTokens:i,maxPromptTokens:ad(a.maxPromptTokens,0),avgLatencyMs:ad(a.avgLatencyMs,null),p95LatencyMs:j,maxLatencyMs:ad(a.maxLatencyMs,null),avgTtftMs:ad(a.avgTtftMs,null),p95TtftMs:ad(a.p95TtftMs,null),longInputRequests:ad(a.longInputRequests,0),hugeInputRequests:ad(a.hugeInputRequests,0),extremeInputRequests:ad(a.extremeInputRequests,0),slowRequests:ad(a.slowRequests,0),slowTtftRequests:ad(a.slowTtftRequests,0),longInputRate:l,hugeInputRate:m,extremeInputRate:n,slowRequestRate:o,slowTtftRate:c?ad(a.slowTtftRequests,0)/c:0,outputTokensPerSecond:ad(a.totalLatencyMs,0)>0?g/(ad(a.totalLatencyMs,0)/1e3):null,level:p.level,pressureLabel:p.label,tone:p.tone,lastSeen:a.lastSeen||"",...b}}function aH(a){let b=String(a??"");return/[",\n\r]/.test(b)?`"${b.replace(/"/g,'""')}"`:b}async function aI(a={}){let b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,y,z,A=JSON.stringify(aj(a)),B=(global._dashboardAnalyticsV2Cache||(global._dashboardAnalyticsV2Cache=new Map),global._dashboardAnalyticsV2Cache),C=B.get(A);if(C&&Date.now()-C.createdAt<15e3)return C.data;let D=aj(a),E=await (0,w.c)(),[F,G]=await Promise.all([al(E),am(E)]),H=function(a,b){let c=ac(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=>ac(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}}(D.apiKey,F),I=(b=ap(D,H),E.get(`SELECT MIN(timestamp) AS minTs, MAX(timestamp) AS maxTs FROM usageHistory ${b.clause}`,b.params)||{}),[J,K]=await Promise.all([U({keyword:D.keyword,model:D.model,sourceTool:D.sourceTool,clientIp:D.clientIp,sessionId:D.sessionId,dateFrom:D.startIso,dateTo:D.endIso}),(0,V.Wl)({keyword:D.keyword,provider:D.provider,model:D.model,connectionId:D.connectionId,endpoint:D.endpoint,apiKey:D.apiKey,status:D.status,sourceTool:D.sourceTool,clientIp:D.clientIp,sessionId:D.sessionId,dateFrom:D.startIso,dateTo:D.endIso})]),L=(c=ap(D,H),e=function(a={}){return ao({requests:ad(a.requests,0),success:ad(a.success,0),errors:ad(a.errors,0),pending:ad(a.pending,0),promptTokens:ad(a.promptTokens,0),completionTokens:ad(a.completionTokens,0),totalTokens:ad(a.totalTokens,0),cachedTokens:ad(a.cachedTokens,0),reasoningTokens:ad(a.reasoningTokens,0),cost:ad(a.cost,0),lastSeen:a.lastSeen||""})}(d=E.get(`SELECT
99
99
  ${aa},
100
100
  COUNT(DISTINCT COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''))) AS activeApiKeys,
101
101
  COUNT(DISTINCT NULLIF(provider, '')) AS activeProviders,
102
102
  COUNT(DISTINCT NULLIF(model, '')) AS activeModels,
103
103
  COUNT(DISTINCT NULLIF(endpoint, '')) AS activeEndpoints
104
104
  FROM usageHistory
105
- ${c.clause}`,c.params)||{}),f=D.start&&D.end?Math.max(1,(D.end.getTime()-D.start.getTime())/6e4):1,{...e,activeApiKeys:ad(d.activeApiKeys,0),activeProviders:ad(d.activeProviders,0),activeModels:ad(d.activeModels,0),activeEndpoints:ad(d.activeEndpoints,0),requestsPerMinute:e.requests/f,tokensPerMinute:e.totalTokens/f,inputOutputRatio:e.completionTokens?e.promptTokens/e.completionTokens:e.promptTokens?null:0}),M=K?.summary||{};L.rawErrorEvents=ad(K?.total,0),L.serverErrorEvents=ad(M.serverImpacting,0),L.gatewayErrorEvents=ad(M.gateway,0),L.upstreamErrorEvents=ad(M.upstream,0),L.clientErrorEvents=ad(M.client,0),L.rateLimitErrorEvents=ad(M.rateLimit,0),L.unknownErrorEvents=ad(M.unknown,0),L.serverErrorRate=L.requests?L.serverErrorEvents/L.requests:0,L.clientErrorRate=L.requests?L.clientErrorEvents/L.requests:0,L.rateLimitErrorRate=L.requests?L.rateLimitErrorEvents/L.requests:0;let N=(g=ao(E,D,H,"COALESCE(NULLIF(provider, ''), 'unknown') AS key, COALESCE(NULLIF(provider, ''), 'unknown') AS label","COALESCE(NULLIF(provider, ''), 'unknown')"),h=ao(E,D,H,`
105
+ ${c.clause}`,c.params)||{}),f=D.start&&D.end?Math.max(1,(D.end.getTime()-D.start.getTime())/6e4):1,{...e,activeApiKeys:ad(d.activeApiKeys,0),activeProviders:ad(d.activeProviders,0),activeModels:ad(d.activeModels,0),activeEndpoints:ad(d.activeEndpoints,0),requestsPerMinute:e.requests/f,tokensPerMinute:e.totalTokens/f,inputOutputRatio:e.completionTokens?e.promptTokens/e.completionTokens:e.promptTokens?null:0}),M=K?.summary||{};L.rawErrorEvents=ad(K?.total,0),L.serverErrorEvents=ad(M.serverImpacting,0),L.gatewayErrorEvents=ad(M.gateway,0),L.upstreamErrorEvents=ad(M.upstream,0),L.clientErrorEvents=ad(M.client,0),L.rateLimitErrorEvents=ad(M.rateLimit,0),L.unknownErrorEvents=ad(M.unknown,0),L.serverErrorRate=L.requests?L.serverErrorEvents/L.requests:0,L.clientErrorRate=L.requests?L.clientErrorEvents/L.requests:0,L.rateLimitErrorRate=L.requests?L.rateLimitErrorEvents/L.requests:0;let N=(g=as(E,D,H,"COALESCE(NULLIF(provider, ''), 'unknown') AS key, COALESCE(NULLIF(provider, ''), 'unknown') AS label","COALESCE(NULLIF(provider, ''), 'unknown')"),h=as(E,D,H,`
106
106
  COALESCE(NULLIF(provider, ''), 'unknown') || '|' || COALESCE(NULLIF(model, ''), 'unknown') AS key,
107
107
  COALESCE(NULLIF(provider, ''), 'unknown') AS provider,
108
108
  COALESCE(NULLIF(model, ''), 'unknown') AS model,
109
109
  COALESCE(NULLIF(model, ''), 'unknown') || ' (' || COALESCE(NULLIF(provider, ''), 'unknown') || ')' AS label
110
- `,"COALESCE(NULLIF(provider, ''), 'unknown'), COALESCE(NULLIF(model, ''), 'unknown')"),i=ao(E,D,H,`
110
+ `,"COALESCE(NULLIF(provider, ''), 'unknown'), COALESCE(NULLIF(model, ''), 'unknown')"),i=as(E,D,H,`
111
111
  COALESCE(NULLIF(connectionId, ''), 'unknown') AS key,
112
112
  COALESCE(NULLIF(connectionId, ''), 'unknown') AS connectionId,
113
113
  COALESCE(NULLIF(provider, ''), 'unknown') AS provider,
114
114
  COALESCE(NULLIF(connectionId, ''), 'unknown') AS label
115
- `,"COALESCE(NULLIF(connectionId, ''), 'unknown')"),j=ao(E,D,H,"COALESCE(NULLIF(endpoint, ''), 'unknown') AS key, COALESCE(NULLIF(endpoint, ''), 'unknown') AS label","COALESCE(NULLIF(endpoint, ''), 'unknown')"),k=ao(E,D,H,"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')"),l=ap(E,D,H,"model",G),m=ap(E,D,H,"provider",G),n=ap(E,D,H,"endpoint",G),o=ao(E,D,H,"COALESCE(NULLIF(status, ''), 'ok') AS key, COALESCE(NULLIF(status, ''), 'ok') AS label","COALESCE(NULLIF(status, ''), 'ok')"),p=al(D,H),q=E.all(`SELECT
115
+ `,"COALESCE(NULLIF(connectionId, ''), 'unknown')"),j=as(E,D,H,"COALESCE(NULLIF(endpoint, ''), 'unknown') AS key, COALESCE(NULLIF(endpoint, ''), 'unknown') AS label","COALESCE(NULLIF(endpoint, ''), 'unknown')"),k=as(E,D,H,"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')"),l=at(E,D,H,"model",G),m=at(E,D,H,"provider",G),n=at(E,D,H,"endpoint",G),o=as(E,D,H,"COALESCE(NULLIF(status, ''), 'ok') AS key, COALESCE(NULLIF(status, ''), 'ok') AS label","COALESCE(NULLIF(status, ''), 'ok')"),p=ap(D,H),q=E.all(`SELECT
116
116
  COALESCE(NULLIF(status, ''), 'error') AS status,
117
117
  COALESCE(NULLIF(provider, ''), 'unknown') AS provider,
118
118
  COALESCE(NULLIF(model, ''), 'unknown') AS model,
@@ -124,13 +124,13 @@
124
124
  ${p.clause?`${p.clause} AND NOT ${Z} AND NOT ${$}`:`WHERE NOT ${Z} AND NOT ${$}`}
125
125
  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')
126
126
  ORDER BY errors DESC, requests DESC, lastSeen DESC
127
- LIMIT ?`,[...p.params,100])||[],r=g.map(a=>an(a,{label:aj(a.key||a.label,G),provider:a.key||a.label||"unknown",topModels:[],topApiKeys:[]})),s=h.map(a=>an(a,{provider:a.provider||"",providerLabel:aj(a.provider,G),model:a.model||"",label:`${a.model||"unknown"} (${aj(a.provider,G)})`,topApiKeys:[]})),t=i.map(a=>{let b=G.get(a.connectionId);return an(a,{label:b?.name||a.connectionId||"unknown",provider:b?.provider||a.provider||"",providerLabel:aj(b?.provider||a.provider,G),connectionId:a.connectionId||"",topModels:[]})}),u=j.map(a=>an(a)),v=k.map(a=>{let b="local-no-key"===a.rawApiKey?"":a.rawApiKey,c=F.byKey.get(b)||F.byFingerprint.get(b)||F.all.find(b=>b.id===a.apiKeyId||b.id===a.key),d=c?.fingerprint||ag(b),e=a.apiKeyName||c?.name||(b?d:"Local / kh\xf4ng d\xf9ng API key");return an(a,{key:a.apiKeyId||d,label:e,name:e,fingerprint:d,apiKeyId:a.apiKeyId||c?.id||"",ownerUser:a.apiKeyOwner||c?.ownerUser||"",createdByUser:c?.createdByUser||"",isActive:c?.isActive??null,topModels:l.get(a.key)||[],topProviders:m.get(a.key)||[],topEndpoints:n.get(a.key)||[]})}),{providers:r,models:s,providerAccounts:t,endpoints:u,apiKeys:v,statuses:o.map(a=>an(a)),errors:q.map(a=>{let b="local-no-key"===a.rawApiKey?"":a.rawApiKey,c=F.byKey.get(b)||F.byFingerprint.get(b)||F.all.find(a=>a.id===b);return an(a,{label:a.status||"error",status:a.status||"error",provider:a.provider||"unknown",providerLabel:aj(a.provider,G),model:a.model||"unknown",endpoint:a.endpoint||"unknown",apiKey:c?.fingerprint||ag(b)})})});K?.topErrors?.length&&(N.errors=K.topErrors);let O=function(a,b,c){try{let d=al(b,c),e=d.clause?`${d.clause} AND`:"WHERE",f=[...d.params],g=a.get(`SELECT COUNT(*) AS samples, AVG(latencyMs) AS avgMs
127
+ LIMIT ?`,[...p.params,100])||[],r=g.map(a=>ar(a,{label:an(a.key||a.label,G),provider:a.key||a.label||"unknown",topModels:[],topApiKeys:[]})),s=h.map(a=>ar(a,{provider:a.provider||"",providerLabel:an(a.provider,G),model:a.model||"",label:`${a.model||"unknown"} (${an(a.provider,G)})`,topApiKeys:[]})),t=i.map(a=>{let b=G.get(a.connectionId);return ar(a,{label:b?.name||a.connectionId||"unknown",provider:b?.provider||a.provider||"",providerLabel:an(b?.provider||a.provider,G),connectionId:a.connectionId||"",topModels:[]})}),u=j.map(a=>ar(a)),v=k.map(a=>{let b="local-no-key"===a.rawApiKey?"":a.rawApiKey,c=F.byKey.get(b)||F.byFingerprint.get(b)||F.all.find(b=>b.id===a.apiKeyId||b.id===a.key),d=c?.fingerprint||ak(b),e=a.apiKeyName||c?.name||(b?d:"Local / kh\xf4ng d\xf9ng API key");return ar(a,{key:a.apiKeyId||d,label:e,name:e,fingerprint:d,apiKeyId:a.apiKeyId||c?.id||"",ownerUser:a.apiKeyOwner||c?.ownerUser||"",createdByUser:c?.createdByUser||"",isActive:c?.isActive??null,topModels:l.get(a.key)||[],topProviders:m.get(a.key)||[],topEndpoints:n.get(a.key)||[]})}),{providers:r,models:s,providerAccounts:t,endpoints:u,apiKeys:v,statuses:o.map(a=>ar(a)),errors:q.map(a=>{let b="local-no-key"===a.rawApiKey?"":a.rawApiKey,c=F.byKey.get(b)||F.byFingerprint.get(b)||F.all.find(a=>a.id===b);return ar(a,{label:a.status||"error",status:a.status||"error",provider:a.provider||"unknown",providerLabel:an(a.provider,G),model:a.model||"unknown",endpoint:a.endpoint||"unknown",apiKey:c?.fingerprint||ak(b)})})});K?.topErrors?.length&&(N.errors=K.topErrors);let O=function(a,b,c){try{let d=ap(b,c),e=d.clause?`${d.clause} AND`:"WHERE",f=[...d.params],g=a.get(`SELECT COUNT(*) AS samples, AVG(latencyMs) AS avgMs
128
128
  FROM usageHistory
129
129
  ${e} latencyMs IS NOT NULL AND latencyMs > 0`,f)||{},h=ad(g.samples,0),i=b=>{if(!h)return null;let c=Math.max(0,Math.min(h-1,Math.ceil(b/100*h)-1)),d=a.get(`SELECT latencyMs
130
130
  FROM usageHistory
131
131
  ${e} latencyMs IS NOT NULL AND latencyMs > 0
132
132
  ORDER BY latencyMs ASC
133
- LIMIT 1 OFFSET ?`,[...f,c]);return d?ad(d.latencyMs,null):null};if(h>0)return{samples:h,avgMs:ad(g.avgMs,null),p50Ms:i(50),p95Ms:i(95),p99Ms:i(99)}}catch{}let d=[];try{let c,e,f=(c=[],e=[],b.startIso&&(c.push("timestamp >= ?"),e.push(b.startIso)),b.endIso&&(c.push("timestamp <= ?"),e.push(b.endIso)),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=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:aq(e,50),p95Ms:aq(e,95),p99Ms:aq(e,99)}}(E,D,H),P=function(a,b,c,d={}){let e=ar(b,c,{latencyOnly:!0}),f={};try{f=a.get(`SELECT
133
+ LIMIT 1 OFFSET ?`,[...f,c]);return d?ad(d.latencyMs,null):null};if(h>0)return{samples:h,avgMs:ad(g.avgMs,null),p50Ms:i(50),p95Ms:i(95),p99Ms:i(99)}}catch{}let d=[];try{let c,e,f=(c=[],e=[],b.startIso&&(c.push("timestamp >= ?"),e.push(b.startIso)),b.endIso&&(c.push("timestamp <= ?"),e.push(b.endIso)),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=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:au(e,50),p95Ms:au(e,95),p99Ms:au(e,99)}}(E,D,H),P=function(a,b,c,d={}){let e=av(b,c,{latencyOnly:!0}),f={};try{f=a.get(`SELECT
134
134
  COUNT(*) AS samples,
135
135
  AVG(latencyMs) AS avgLatencyMs,
136
136
  MIN(latencyMs) AS minLatencyMs,
@@ -157,7 +157,7 @@
157
157
  SUM(CASE WHEN promptTokens >= ? THEN 1 ELSE 0 END) AS hugeInputRequests,
158
158
  SUM(CASE WHEN promptTokens >= ? THEN 1 ELSE 0 END) AS extremeInputRequests
159
159
  FROM usageHistory
160
- ${e.clause}`,[45e3,9e4,2e4,3e4,5e4,7e4,...e.params])||{}}catch{f={}}let g=ad(f.samples,0),h=as(a,e,"ttftMs IS NOT NULL AND ttftMs > 0"),i=as(a,e,"promptTokens IS NOT NULL AND promptTokens > 0"),j=as(a,e,"completionTokens IS NOT NULL AND completionTokens > 0"),k=at(a,e,"latencyMs","latencyMs IS NOT NULL AND latencyMs > 0",50,g),l=at(a,e,"latencyMs","latencyMs IS NOT NULL AND latencyMs > 0",95,g),m=at(a,e,"latencyMs","latencyMs IS NOT NULL AND latencyMs > 0",99,g),n=at(a,e,"ttftMs","ttftMs IS NOT NULL AND ttftMs > 0",50,h),o=at(a,e,"ttftMs","ttftMs IS NOT NULL AND ttftMs > 0",95,h),p=at(a,e,"ttftMs","ttftMs IS NOT NULL AND ttftMs > 0",99,h),q=at(a,e,"promptTokens","promptTokens IS NOT NULL AND promptTokens > 0",50,i),r=at(a,e,"promptTokens","promptTokens IS NOT NULL AND promptTokens > 0",95,i),s=at(a,e,"promptTokens","promptTokens IS NOT NULL AND promptTokens > 0",99,i),t=at(a,e,"completionTokens","completionTokens IS NOT NULL AND completionTokens > 0",95,j),u=ad(f.slowRequests,0),v=ad(f.verySlowRequests,0),w=ad(f.slowTtftRequests,0),x=ad(f.longInputRequests,0),y=ad(f.hugeInputRequests,0),z=ad(f.extremeInputRequests,0),A=ad(f.totalPromptTokens,0),B=ad(f.totalLatencyMs,0),C=ad(f.totalTtftMs,0),D=ad(f.promptTokensWithTtft,0),E=ad(f.completionTokensWithLatency,0),F=ad(f.latencyMsWithOutput,0),G=ad(f.completionTokensAfterTtft,0),H=ad(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=au({samples:g,p95LatencyMs:ad(l,0),p95TtftMs:ad(o,0),slowRequestRate:I,errorRate:ad(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:ad(f.avgLatencyMs,null),minLatencyMs:ad(f.minLatencyMs,null),maxLatencyMs:ad(f.maxLatencyMs,null),p50LatencyMs:k,p95LatencyMs:l,p99LatencyMs:m,avgTtftMs:ad(f.avgTtftMs,null),maxTtftMs:ad(f.maxTtftMs,null),p50TtftMs:n,p95TtftMs:o,p99TtftMs:p,avgPromptTokens:ad(f.avgPromptTokens,0),maxPromptTokens:ad(f.maxPromptTokens,0),p50PromptTokens:q,p95PromptTokens:r,p99PromptTokens:s,avgCompletionTokens:ad(f.avgCompletionTokens,0),maxCompletionTokens:ad(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}}(E,D,H,L);P.byModel=function(a,b,c,d=new Map){let e=ar(b,c,{latencyOnly:!0});try{return(a.all(`WITH base AS (
160
+ ${e.clause}`,[45e3,9e4,2e4,3e4,5e4,7e4,...e.params])||{}}catch{f={}}let g=ad(f.samples,0),h=aw(a,e,"ttftMs IS NOT NULL AND ttftMs > 0"),i=aw(a,e,"promptTokens IS NOT NULL AND promptTokens > 0"),j=aw(a,e,"completionTokens IS NOT NULL AND completionTokens > 0"),k=ax(a,e,"latencyMs","latencyMs IS NOT NULL AND latencyMs > 0",50,g),l=ax(a,e,"latencyMs","latencyMs IS NOT NULL AND latencyMs > 0",95,g),m=ax(a,e,"latencyMs","latencyMs IS NOT NULL AND latencyMs > 0",99,g),n=ax(a,e,"ttftMs","ttftMs IS NOT NULL AND ttftMs > 0",50,h),o=ax(a,e,"ttftMs","ttftMs IS NOT NULL AND ttftMs > 0",95,h),p=ax(a,e,"ttftMs","ttftMs IS NOT NULL AND ttftMs > 0",99,h),q=ax(a,e,"promptTokens","promptTokens IS NOT NULL AND promptTokens > 0",50,i),r=ax(a,e,"promptTokens","promptTokens IS NOT NULL AND promptTokens > 0",95,i),s=ax(a,e,"promptTokens","promptTokens IS NOT NULL AND promptTokens > 0",99,i),t=ax(a,e,"completionTokens","completionTokens IS NOT NULL AND completionTokens > 0",95,j),u=ad(f.slowRequests,0),v=ad(f.verySlowRequests,0),w=ad(f.slowTtftRequests,0),x=ad(f.longInputRequests,0),y=ad(f.hugeInputRequests,0),z=ad(f.extremeInputRequests,0),A=ad(f.totalPromptTokens,0),B=ad(f.totalLatencyMs,0),C=ad(f.totalTtftMs,0),D=ad(f.promptTokensWithTtft,0),E=ad(f.completionTokensWithLatency,0),F=ad(f.latencyMsWithOutput,0),G=ad(f.completionTokensAfterTtft,0),H=ad(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=ay({samples:g,p95LatencyMs:ad(l,0),p95TtftMs:ad(o,0),slowRequestRate:I,errorRate:ad(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:ad(f.avgLatencyMs,null),minLatencyMs:ad(f.minLatencyMs,null),maxLatencyMs:ad(f.maxLatencyMs,null),p50LatencyMs:k,p95LatencyMs:l,p99LatencyMs:m,avgTtftMs:ad(f.avgTtftMs,null),maxTtftMs:ad(f.maxTtftMs,null),p50TtftMs:n,p95TtftMs:o,p99TtftMs:p,avgPromptTokens:ad(f.avgPromptTokens,0),maxPromptTokens:ad(f.maxPromptTokens,0),p50PromptTokens:q,p95PromptTokens:r,p99PromptTokens:s,avgCompletionTokens:ad(f.avgCompletionTokens,0),maxCompletionTokens:ad(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}}(E,D,H,L);P.byModel=function(a,b,c,d=new Map){let e=av(b,c,{latencyOnly:!0});try{return(a.all(`WITH base AS (
161
161
  SELECT
162
162
  COALESCE(NULLIF(provider, ''), 'unknown') AS provider,
163
163
  COALESCE(NULLIF(model, ''), 'unknown') AS model,
@@ -205,10 +205,10 @@
205
205
  FROM ranked
206
206
  GROUP BY provider, model
207
207
  ORDER BY samples DESC, p95LatencyMs DESC
208
- LIMIT ?`,[...e.params,45e3,2e4,3e4,5e4,30])||[]).map(a=>{let b=ad(a.samples,0),c=b?ad(a.slowRequests,0)/b:0,e=b?ad(a.slowTtftRequests,0)/b:0,f=b?ad(a.longInputRequests,0)/b:0,g=b?ad(a.hugeInputRequests,0)/b:0,h=au({samples:b,p95LatencyMs:ad(a.p95LatencyMs,0),p95TtftMs:ad(a.p95TtftMs,0),slowRequestRate:c});return{key:a.key,provider:a.provider,providerLabel:aj(a.provider,d),model:a.model,label:`${a.model} (${aj(a.provider,d)})`,samples:b,level:h.level,labelQuality:h.label,tone:h.tone,score:h.score,avgLatencyMs:ad(a.avgLatencyMs,null),p50LatencyMs:ad(a.p50LatencyMs,null),p95LatencyMs:ad(a.p95LatencyMs,null),maxLatencyMs:ad(a.maxLatencyMs,null),avgTtftMs:ad(a.avgTtftMs,null),p95TtftMs:ad(a.p95TtftMs,null),maxTtftMs:ad(a.maxTtftMs,null),avgPromptTokens:ad(a.avgPromptTokens,0),p95PromptTokens:ad(a.p95PromptTokensApprox,0),maxPromptTokens:ad(a.maxPromptTokens,0),avgCompletionTokens:ad(a.avgCompletionTokens,0),slowRequests:ad(a.slowRequests,0),slowRequestRate:c,slowTtftRate:e,longInputRate:f,hugeInputRate:g,outputTokensPerSecond:ad(a.totalLatencyMs,0)>0?ad(a.totalCompletionTokens,0)/(ad(a.totalLatencyMs,0)/1e3):null}})}catch(a){return console.error("[analytics] Failed to build model experience stats:",a?.message||a),[]}}(E,D,H,G);let Q=function(a,b,c,d={},e=new Map){let f=function(a,b,c,d=new Map){let e=ar(b,c),f=aB(a,b,c,"model",d),g=aB(a,b,c,"provider",d),h=aB(a,b,c,"endpoint",d),i=aB(a,b,c,"clientIpNormalized",d),j=aB(a,b,c,"sourceTool",d);try{return(a.all(`WITH base AS (
208
+ LIMIT ?`,[...e.params,45e3,2e4,3e4,5e4,30])||[]).map(a=>{let b=ad(a.samples,0),c=b?ad(a.slowRequests,0)/b:0,e=b?ad(a.slowTtftRequests,0)/b:0,f=b?ad(a.longInputRequests,0)/b:0,g=b?ad(a.hugeInputRequests,0)/b:0,h=ay({samples:b,p95LatencyMs:ad(a.p95LatencyMs,0),p95TtftMs:ad(a.p95TtftMs,0),slowRequestRate:c});return{key:a.key,provider:a.provider,providerLabel:an(a.provider,d),model:a.model,label:`${a.model} (${an(a.provider,d)})`,samples:b,level:h.level,labelQuality:h.label,tone:h.tone,score:h.score,avgLatencyMs:ad(a.avgLatencyMs,null),p50LatencyMs:ad(a.p50LatencyMs,null),p95LatencyMs:ad(a.p95LatencyMs,null),maxLatencyMs:ad(a.maxLatencyMs,null),avgTtftMs:ad(a.avgTtftMs,null),p95TtftMs:ad(a.p95TtftMs,null),maxTtftMs:ad(a.maxTtftMs,null),avgPromptTokens:ad(a.avgPromptTokens,0),p95PromptTokens:ad(a.p95PromptTokensApprox,0),maxPromptTokens:ad(a.maxPromptTokens,0),avgCompletionTokens:ad(a.avgCompletionTokens,0),slowRequests:ad(a.slowRequests,0),slowRequestRate:c,slowTtftRate:e,longInputRate:f,hugeInputRate:g,outputTokensPerSecond:ad(a.totalLatencyMs,0)>0?ad(a.totalCompletionTokens,0)/(ad(a.totalLatencyMs,0)/1e3):null}})}catch(a){return console.error("[analytics] Failed to build model experience stats:",a?.message||a),[]}}(E,D,H,G);let Q=function(a,b,c,d={},e=new Map){let f=function(a,b,c,d=new Map){let e=av(b,c),f=aF(a,b,c,"model",d),g=aF(a,b,c,"provider",d),h=aF(a,b,c,"endpoint",d),i=aF(a,b,c,"clientIpNormalized",d),j=aF(a,b,c,"sourceTool",d);try{return(a.all(`WITH base AS (
209
209
  SELECT
210
- ${az} AS clientKey,
211
- ${aA} AS clientLabel,
210
+ ${aD} AS clientKey,
211
+ ${aE} AS clientLabel,
212
212
  COALESCE(NULLIF(apiKeyOwner, ''), '') AS ownerUser,
213
213
  COALESCE(NULLIF(apiKeyName, ''), '') AS apiKeyName,
214
214
  COALESCE(NULLIF(apiKeyFingerprint, ''), '') AS apiKeyFingerprint,
@@ -272,9 +272,9 @@
272
272
  FROM ranked
273
273
  GROUP BY clientKey
274
274
  ORDER BY promptTokens DESC, totalTokens DESC, requests DESC
275
- LIMIT ?`,[...e.params,3e4,5e4,7e4,45e3,2e4,25])||[]).map(a=>aC(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),[]}}(a,b,c,e),g=function(a,b,c){let d=al(b,c);try{return(a.all(`SELECT
276
- ${az} AS clientKey,
277
- ${aA} AS clientLabel,
275
+ LIMIT ?`,[...e.params,3e4,5e4,7e4,45e3,2e4,25])||[]).map(a=>aG(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),[]}}(a,b,c,e),g=function(a,b,c){let d=ap(b,c);try{return(a.all(`SELECT
276
+ ${aD} AS clientKey,
277
+ ${aE} AS clientLabel,
278
278
  COALESCE(NULLIF(apiKeyOwner, ''), '') AS ownerUser,
279
279
  COALESCE(NULLIF(apiKeyName, ''), '') AS apiKeyName,
280
280
  COALESCE(NULLIF(apiKeyFingerprint, ''), '') AS apiKeyFingerprint,
@@ -289,10 +289,10 @@
289
289
  MAX(timestamp) AS lastSeen
290
290
  FROM usageHistory
291
291
  ${d.clause}
292
- GROUP BY ${az}
292
+ GROUP BY ${aD}
293
293
  HAVING errors > 0
294
294
  ORDER BY errors DESC, requests DESC
295
- LIMIT ?`,[...d.params,25])||[]).map(a=>aC(a))}catch(a){return console.error("[analytics] Failed to build problem clients:",a?.message||a),[]}}(a,b,c),h=function(a,b,c){let d=ar(b,c);try{let b=a.all(`WITH base AS (
295
+ LIMIT ?`,[...d.params,25])||[]).map(a=>aG(a))}catch(a){return console.error("[analytics] Failed to build problem clients:",a?.message||a),[]}}(a,b,c),h=function(a,b,c){let d=av(b,c);try{let b=a.all(`WITH base AS (
296
296
  SELECT
297
297
  CASE
298
298
  WHEN promptTokens < 2000 THEN 'lt2k'
@@ -350,26 +350,26 @@
350
350
  MIN(CASE WHEN ttftMs > 0 AND ttftRank >= ((cnt * 95 + 99) / 100) THEN ttftMs END) AS p95TtftMs
351
351
  FROM ranked
352
352
  GROUP BY bucketKey, label, sortOrder
353
- ORDER BY sortOrder ASC`,d.params)||[],c=b.reduce((a,b)=>a+ad(b.requests,0),0);return b.map(a=>({key:a.key,label:a.label,requests:ad(a.requests,0),share:c?ad(a.requests,0)/c:0,promptTokens:ad(a.promptTokens,0),completionTokens:ad(a.completionTokens,0),totalTokens:ad(a.totalTokens,0),avgPromptTokens:ad(a.avgPromptTokens,0),maxPromptTokens:ad(a.maxPromptTokens,0),avgLatencyMs:ad(a.avgLatencyMs,null),p95LatencyMs:ad(a.p95LatencyMs,null),maxLatencyMs:ad(a.maxLatencyMs,null),avgTtftMs:ad(a.avgTtftMs,null),p95TtftMs:ad(a.p95TtftMs,null)}))}catch(a){return console.error("[analytics] Failed to build input size buckets:",a?.message||a),[]}}(a,b,c),i=f[0]||null,j=f.reduce((a,b)=>a+ad(b.totalTokens,0),0),k=ad(d.totalTokens,0),l=i&&k?ad(i.totalTokens,0)/k:0,m=h.filter(a=>["30k-50k","50k-70k",">=70k"].includes(a.label)).reduce((a,b)=>a+ad(b.share,0),0),n=h.find(a=>">=70k"===a.label)||null;return{summary:{trackedUsers:f.length,topUserLabel:i?.label||"-",topUserTokens:i?.totalTokens||0,topUserTokenShare:l,topUsersTokenShare:k?j/k:0,longInputBucketShare:m,extremeInputShare:n?.share||0,problemClients:g.length},topHeavyUsers:f,topProblemClients:g,inputBuckets:h}}(E,D,H,L,G),R=function(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=am(g,e),h))-g)/e)+1,j=f*(i>240?Math.ceil(i/240):1),k=1e3*j,l=al(b,c),m=a.all(`SELECT
353
+ ORDER BY sortOrder ASC`,d.params)||[],c=b.reduce((a,b)=>a+ad(b.requests,0),0);return b.map(a=>({key:a.key,label:a.label,requests:ad(a.requests,0),share:c?ad(a.requests,0)/c:0,promptTokens:ad(a.promptTokens,0),completionTokens:ad(a.completionTokens,0),totalTokens:ad(a.totalTokens,0),avgPromptTokens:ad(a.avgPromptTokens,0),maxPromptTokens:ad(a.maxPromptTokens,0),avgLatencyMs:ad(a.avgLatencyMs,null),p95LatencyMs:ad(a.p95LatencyMs,null),maxLatencyMs:ad(a.maxLatencyMs,null),avgTtftMs:ad(a.avgTtftMs,null),p95TtftMs:ad(a.p95TtftMs,null)}))}catch(a){return console.error("[analytics] Failed to build input size buckets:",a?.message||a),[]}}(a,b,c),i=f[0]||null,j=f.reduce((a,b)=>a+ad(b.totalTokens,0),0),k=ad(d.totalTokens,0),l=i&&k?ad(i.totalTokens,0)/k:0,m=h.filter(a=>["30k-50k","50k-70k",">=70k"].includes(a.label)).reduce((a,b)=>a+ad(b.share,0),0),n=h.find(a=>">=70k"===a.label)||null;return{summary:{trackedUsers:f.length,topUserLabel:i?.label||"-",topUserTokens:i?.totalTokens||0,topUserTokenShare:l,topUsersTokenShare:k?j/k:0,longInputBucketShare:m,extremeInputShare:n?.share||0,problemClients:g.length},topHeavyUsers:f,topProblemClients:g,inputBuckets:h}}(E,D,H,L,G),R=function(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=aq(g,e),h))-g)/e)+1,j=f*(i>240?Math.ceil(i/240):1),k=1e3*j,l=ap(b,c),m=a.all(`SELECT
354
354
  ((CAST(strftime('%s', timestamp) AS INTEGER) / ?) * ?) AS bucketSec,
355
355
  ${aa}
356
356
  FROM usageHistory
357
357
  ${l.clause}
358
358
  GROUP BY bucketSec
359
359
  HAVING bucketSec IS NOT NULL
360
- ORDER BY bucketSec ASC`,[j,j,...l.params])||[],n=new Map;for(let a=am(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,cost:0});for(let a of m){let b=1e3*ad(a.bucketSec,0);b&&n.set(b,{ts:b,label:new Date(b).toISOString(),requests:ad(a.requests,0),success:ad(a.success,0),errors:ad(a.errors,0),pending:ad(a.pending,0),promptTokens:ad(a.promptTokens,0),completionTokens:ad(a.completionTokens,0),totalTokens:ad(a.totalTokens,0),cost:ad(a.cost,0)})}return[...n.values()].sort((a,b)=>a.ts-b.ts)}(E,D,H,I),S=new Map([...F.byKey.entries(),...F.byFingerprint.entries()]),T=(y=al(D,H),(E.all(`SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, promptTokens, completionTokens, cost, status, tokens
360
+ ORDER BY bucketSec ASC`,[j,j,...l.params])||[],n=new Map;for(let a=aq(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,cost:0});for(let a of m){let b=1e3*ad(a.bucketSec,0);b&&n.set(b,{ts:b,label:new Date(b).toISOString(),requests:ad(a.requests,0),success:ad(a.success,0),errors:ad(a.errors,0),pending:ad(a.pending,0),promptTokens:ad(a.promptTokens,0),completionTokens:ad(a.completionTokens,0),totalTokens:ad(a.totalTokens,0),cost:ad(a.cost,0)})}return[...n.values()].sort((a,b)=>a.ts-b.ts)}(E,D,H,I),S=new Map([...F.byKey.entries(),...F.byFingerprint.entries()]),T=(y=ap(D,H),(E.all(`SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, promptTokens, completionTokens, cost, status, tokens
361
361
  FROM usageHistory
362
362
  ${y.clause}
363
363
  ORDER BY timestamp DESC
364
- LIMIT ?`,[...y.params,50])||[]).map(a=>av(a,S,G))),W=(z=al(D,H),(E.all(`SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, promptTokens, completionTokens, cost, status, tokens
364
+ LIMIT ?`,[...y.params,50])||[]).map(a=>az(a,S,G))),W=(z=ap(D,H),(E.all(`SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, promptTokens, completionTokens, cost, status, tokens
365
365
  FROM usageHistory
366
366
  ${z.clause}
367
367
  ORDER BY (COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)) DESC, timestamp DESC
368
- LIMIT ?`,[...z.params,20])||[]).map(a=>av(a,S,G)));P.slowestRequests=function(a,b,c,d,e){try{let f=ar(b,c,{latencyOnly:!0});return(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, cost, status, tokens
368
+ LIMIT ?`,[...z.params,20])||[]).map(a=>az(a,S,G)));P.slowestRequests=function(a,b,c,d,e){try{let f=av(b,c,{latencyOnly:!0});return(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, cost, status, tokens
369
369
  FROM usageHistory
370
370
  ${f.clause}
371
371
  ORDER BY latencyMs DESC
372
- LIMIT ?`,[...f.params,20])||[]).map(a=>av(a,d,e))}catch{return[]}}(E,D,H,S,G),L.userExperienceScore=P.score,L.userExperienceLabel=P.label,L.slowRequestRate=P.slowRequestRate,L.longInputRate=P.longInputRate,L.topHeavyUser=Q.summary?.topUserLabel||"",L.topHeavyUserTokenShare=Q.summary?.topUserTokenShare||0,L.extremeInputShare=Q.summary?.extremeInputShare||0;let X=function(a,b,c,d,e=new Map){let f=function(a,b,c,d){let e=ay(a,b,"provider",500),f=ay(a,b,"model",1e3),g=ay(a,b,"endpoint",500),h=ay(a,b,"status",200),i=ay(a,b,"connectionId",1e3).map(a=>{let b=c.get(a),d=b?.name?`${b.name}${b.provider?` \xb7 ${b.provider}`:""}`:a;return{value:a,label:d}}),j=[];for(let c of(function(a,b){let c=al(ax(b),null),d=c.clause?`${c.clause} AND`:"WHERE";try{let b=a.get(`SELECT 1 AS hasLocal
372
+ LIMIT ?`,[...f.params,20])||[]).map(a=>az(a,d,e))}catch{return[]}}(E,D,H,S,G),L.userExperienceScore=P.score,L.userExperienceLabel=P.label,L.slowRequestRate=P.slowRequestRate,L.longInputRate=P.longInputRate,L.topHeavyUser=Q.summary?.topUserLabel||"",L.topHeavyUserTokenShare=Q.summary?.topUserTokenShare||0,L.extremeInputShare=Q.summary?.extremeInputShare||0;let X=function(a,b,c,d,e=new Map){let f=function(a,b,c,d){let e=aC(a,b,"provider",500),f=aC(a,b,"model",1e3),g=aC(a,b,"endpoint",500),h=aC(a,b,"status",200),i=aC(a,b,"connectionId",1e3).map(a=>{let b=c.get(a),d=b?.name?`${b.name}${b.provider?` \xb7 ${b.provider}`:""}`:a;return{value:a,label:d}}),j=[];for(let c of(function(a,b){let c=ap(aB(b),null),d=c.clause?`${c.clause} AND`:"WHERE";try{let b=a.get(`SELECT 1 AS hasLocal
373
373
  FROM usageHistory
374
374
  ${d} (apiKey IS NULL OR apiKey = '')
375
- LIMIT 1`,c.params);return!!b?.hasLocal}catch{return!1}}(a,b)&&j.push({value:"local-no-key",label:"Local / kh\xf4ng d\xf9ng API key"}),d.all.slice(0,500)))j.push({value:c.fingerprint,label:`${c.name||c.fingerprint}${c.ownerUser?` \xb7 ${c.ownerUser}`:""}`});aw(i,b.connectionId,b.connectionId),aw(j,b.apiKey,b.apiKey);let k=e.map(a=>({value:a,label:aj(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 aw(k,b.provider,b.provider),aw(l,b.model,b.model),aw(m,b.endpoint,b.endpoint),aw(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:[]}}(a,b,e,d);return f.clientIps=(c.topClientIps||[]).map(a=>a.key).filter(Boolean),f.sourceTools=(c.topSourceTools||[]).map(a=>a.key).filter(Boolean),f}(E,D,J,F,G),Y=function({overview:a,groups:b,promptLogStats:c,requestErrorStats:d,experience:e,clientRequests:f}){let g=[],h=d?.summary||{},i=ad(h.serverImpacting,0),j=ad(h.client,0),k=ad(h.rateLimit,0),l=ad(a.serverErrorRate,a.requests?i/a.requests:0),m=ad(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.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&&ad(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&&ad(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:L,groups:N,promptLogStats:J,requestErrorStats:K,experience:P,clientRequests:Q}),ab=function(a,b,c,d,e,f){let g=["Analytics v3 đang d\xf9ng SQL aggregate tr\xean usageHistory v\xe0 Prompt Logs: KPI, group, time-series, top request/IP/tool/session được tổng hợp ở DB thay v\xec k\xe9o h\xe0ng chục ngh\xecn raw rows về Node.js."];if(c?.noMatch&&g.push("Bộ lọc API key kh\xf4ng khớp API key n\xe0o đang c\xf3, n\xean usage metrics trả về rỗng để tr\xe1nh scan to\xe0n bộ usageHistory bằng LIKE."),b.total>0&&g.push(`Prompt log analytics đang d\xf9ng SQL aggregate tr\xean to\xe0n bộ ${b.total.toLocaleString("vi-VN")} d\xf2ng khớp bộ lọc.`),e?.samples>0&&g.push(`User experience metrics đang t\xednh tr\xean ${e.samples.toLocaleString("vi-VN")} request th\xe0nh c\xf4ng c\xf3 token v\xe0 latency > 0; success 0-token, pending v\xe0 error được loại khỏi nh\xf3m trải nghiệm để kh\xf4ng l\xe0m sai đ\xe1nh gi\xe1 tốc độ model.`),f?.topHeavyUsers?.length&&g.push("Client request monitor bổ sung top user/API key gửi request nặng nhất, ph\xe2n bố input token theo bucket v\xe0 client c\xf3 lỗi nhiều; c\xe1c bảng n\xe0y chỉ hiển thị API key fingerprint/masked metadata, kh\xf4ng lộ full bearer token."),arguments.length>=4){let a=arguments[3];if(a?.total>0){let b=a.summary||{};g.push(`Request error events đang d\xf9ng SQL aggregate tr\xean to\xe0n bộ ${a.total.toLocaleString("vi-VN")} lỗi khớp bộ lọc trong Prompt Log DB; trong đ\xf3 ${ad(b.serverImpacting,0).toLocaleString("vi-VN")} lỗi được ph\xe2n loại l\xe0 server/provider-impacting v\xe0 ${ad(b.client,0).toLocaleString("vi-VN")} lỗi do client/request.`)}}return(a.clientIp||a.sourceTool||a.sessionId||a.keyword)&&g.push("Bộ lọc Source IP / Source tool / Session / Keyword \xe1p dụng cho Prompt Logs bằng SQL aggregate. Với request mới sau migration v3, UsageHistory cũng lưu clientIp/sourceTool/session để token/cost c\xf3 thể lọc ch\xednh x\xe1c hơn; dữ liệu cũ trước migration c\xf3 thể chưa c\xf3 c\xe1c field n\xe0y."),b.disabled&&g.push("Prompt Log Database đang tắt, phần thống k\xea Source IP / tool / session sẽ kh\xf4ng c\xf3 dữ liệu."),g}(D,J,H,K,P,Q),ae={generatedAt:new Date().toISOString(),analyticsVersion:"v3.4-client-request-monitor",filters:{period:D.period,startIso:D.startIso,endIso:D.endIso,provider:D.provider,model:D.model,connectionId:D.connectionId,status:D.status,endpoint:D.endpoint,apiKey:D.apiKey,clientIp:D.clientIp,sourceTool:D.sourceTool,sessionId:D.sessionId,keyword:D.keyword},overview:L,latency:O,experience:P,clientRequests:Q,timeSeries:R,groups:N,promptLogs:J,requestErrors:K,anomalies:Y,recentUsage:T,heavyRequests:W,options:X,qualityNotes:ab};if(B.set(A,{createdAt:Date.now(),data:ae}),B.size>100){for(let[a,b]of B)if(Date.now()-b.createdAt>15e3&&B.delete(a),B.size<=100)break}return ae}var aF=c(9588);let aG="force-dynamic",aH=["period","dateFrom","dateTo","provider","model","connectionId","status","endpoint","apiKey","clientIp","sourceIp","sourceTool","sessionId","keyword","maxPromptLogRows"];async function aI(a){try{let{response:b}=await (0,aF.hH)({allowMonitorAdmin:!0});if(b)return b;let{searchParams:c}=new URL(a.url),d=function(a){let b={};for(let c of aH){let d=a.get(c);null!==d&&""!==String(d).trim()&&(b[c]=d)}return b}(c),e=await aE(d);if("csv"===c.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||[]],["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})(e).map(a=>a.map(aD).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(e,{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 aJ=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:aK,workUnitAsyncStorage:aL,serverHooks:aM}=aJ;function aN(){return(0,g.patchFetch)({workAsyncStorage:aK,workUnitAsyncStorage:aL})}async function aO(a,b,c){c.requestMeta&&(0,h.setRequestMeta)(a,c.requestMeta),aJ.isDev&&(0,h.addRequestMeta)(a,"devRequestTimingInternalsEnd",process.hrtime.bigint());let d="/api/dashboard/analytics/route";"/index"===d&&(d="/");let e=await aJ.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||aJ.isDev||z||(K="/index"===(K=E)?"/":K);let L=!0===aJ.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 aJ.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)=>aJ.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=>aJ.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 aJ.onRequestError(a,b,{routerKind:"App Router",routePath:d,routeType:"route",revalidateReason:(0,o.c)({isStaticGeneration:M,isOnDemandRevalidate:C})},!1,B),b}},k=await aJ.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 aJ.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}}},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",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")},94735:a=>{a.exports=require("events")}};var b=require("../../../../webpack-runtime.js");b.C(a);var c=b.X(0,[4741,1813,5573,6935,5087,5901,6663],()=>b(b.s=61066));module.exports=c})();
375
+ LIMIT 1`,c.params);return!!b?.hasLocal}catch{return!1}}(a,b)&&j.push({value:"local-no-key",label:"Local / kh\xf4ng d\xf9ng API key"}),d.all.slice(0,500)))j.push({value:c.fingerprint,label:`${c.name||c.fingerprint}${c.ownerUser?` \xb7 ${c.ownerUser}`:""}`});aA(i,b.connectionId,b.connectionId),aA(j,b.apiKey,b.apiKey);let k=e.map(a=>({value:a,label:an(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 aA(k,b.provider,b.provider),aA(l,b.model,b.model),aA(m,b.endpoint,b.endpoint),aA(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:[]}}(a,b,e,d);return f.clientIps=(c.topClientIps||[]).map(a=>a.key).filter(Boolean),f.sourceTools=(c.topSourceTools||[]).map(a=>a.key).filter(Boolean),f}(E,D,J,F,G),Y=function({overview:a,groups:b,promptLogStats:c,requestErrorStats:d,experience:e,clientRequests:f}){let g=[],h=d?.summary||{},i=ad(h.serverImpacting,0),j=ad(h.client,0),k=ad(h.rateLimit,0),l=ad(a.serverErrorRate,a.requests?i/a.requests:0),m=ad(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.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&&ad(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&&ad(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:L,groups:N,promptLogStats:J,requestErrorStats:K,experience:P,clientRequests:Q}),ab=function(a,b,c,d,e,f){let g=["Analytics v3 đang d\xf9ng SQL aggregate tr\xean usageHistory v\xe0 Prompt Logs: KPI, group, time-series, top request/IP/tool/session được tổng hợp ở DB thay v\xec k\xe9o h\xe0ng chục ngh\xecn raw rows về Node.js."];if(c?.noMatch&&g.push("Bộ lọc API key kh\xf4ng khớp API key n\xe0o đang c\xf3, n\xean usage metrics trả về rỗng để tr\xe1nh scan to\xe0n bộ usageHistory bằng LIKE."),b.total>0&&g.push(`Prompt log analytics đang d\xf9ng SQL aggregate tr\xean to\xe0n bộ ${b.total.toLocaleString("vi-VN")} d\xf2ng khớp bộ lọc.`),e?.samples>0&&g.push(`User experience metrics đang t\xednh tr\xean ${e.samples.toLocaleString("vi-VN")} request th\xe0nh c\xf4ng c\xf3 token v\xe0 latency > 0; success 0-token, pending v\xe0 error được loại khỏi nh\xf3m trải nghiệm để kh\xf4ng l\xe0m sai đ\xe1nh gi\xe1 tốc độ model.`),f?.topHeavyUsers?.length&&g.push("Client request monitor bổ sung top user/API key gửi request nặng nhất, ph\xe2n bố input token theo bucket v\xe0 client c\xf3 lỗi nhiều; c\xe1c bảng n\xe0y chỉ hiển thị API key fingerprint/masked metadata, kh\xf4ng lộ full bearer token."),arguments.length>=4){let a=arguments[3];if(a?.total>0){let b=a.summary||{};g.push(`Request error events đang d\xf9ng SQL aggregate tr\xean to\xe0n bộ ${a.total.toLocaleString("vi-VN")} lỗi khớp bộ lọc trong Prompt Log DB; trong đ\xf3 ${ad(b.serverImpacting,0).toLocaleString("vi-VN")} lỗi được ph\xe2n loại l\xe0 server/provider-impacting v\xe0 ${ad(b.client,0).toLocaleString("vi-VN")} lỗi do client/request.`)}}return(a.clientIp||a.sourceTool||a.sessionId||a.keyword)&&g.push("Bộ lọc Source IP / Source tool / Session / Keyword \xe1p dụng cho Prompt Logs bằng SQL aggregate. Với request mới sau migration v3, UsageHistory cũng lưu clientIp/sourceTool/session để token/cost c\xf3 thể lọc ch\xednh x\xe1c hơn; dữ liệu cũ trước migration c\xf3 thể chưa c\xf3 c\xe1c field n\xe0y."),b.disabled&&g.push("Prompt Log Database đang tắt, phần thống k\xea Source IP / tool / session sẽ kh\xf4ng c\xf3 dữ liệu."),g}(D,J,H,K,P,Q),ae={generatedAt:new Date().toISOString(),analyticsVersion:"v3.4-client-request-monitor",filters:{period:D.period,startIso:D.startIso,endIso:D.endIso,provider:D.provider,model:D.model,connectionId:D.connectionId,status:D.status,endpoint:D.endpoint,apiKey:D.apiKey,clientIp:D.clientIp,sourceTool:D.sourceTool,sessionId:D.sessionId,keyword:D.keyword},overview:L,latency:O,experience:P,clientRequests:Q,timeSeries:R,groups:N,promptLogs:J,requestErrors:K,anomalies:Y,recentUsage:T,heavyRequests:W,options:X,qualityNotes:ab};if(B.set(A,{createdAt:Date.now(),data:ae}),B.size>100){for(let[a,b]of B)if(Date.now()-b.createdAt>15e3&&B.delete(a),B.size<=100)break}return ae}var aJ=c(9588);let aK="force-dynamic",aL=["period","dateFrom","dateTo","provider","model","connectionId","status","endpoint","apiKey","clientIp","sourceIp","sourceTool","sessionId","keyword","maxPromptLogRows"];async function aM(a){try{let{response:b}=await (0,aJ.hH)({allowMonitorAdmin:!0});if(b)return b;let{searchParams:c}=new URL(a.url),d=function(a){let b={};for(let c of aL){let d=a.get(c);null!==d&&""!==String(d).trim()&&(b[c]=d)}return b}(c),e=await aI(d);if("csv"===c.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||[]],["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})(e).map(a=>a.map(aH).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(e,{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 aN=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:aO,workUnitAsyncStorage:aP,serverHooks:aQ}=aN;function aR(){return(0,g.patchFetch)({workAsyncStorage:aO,workUnitAsyncStorage:aP})}async function aS(a,b,c){c.requestMeta&&(0,h.setRequestMeta)(a,c.requestMeta),aN.isDev&&(0,h.addRequestMeta)(a,"devRequestTimingInternalsEnd",process.hrtime.bigint());let d="/api/dashboard/analytics/route";"/index"===d&&(d="/");let e=await aN.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||aN.isDev||z||(K="/index"===(K=E)?"/":K);let L=!0===aN.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 aN.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)=>aN.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=>aN.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 aN.onRequestError(a,b,{routerKind:"App Router",routePath:d,routeType:"route",revalidateReason:(0,o.c)({isStaticGeneration:M,isOnDemandRevalidate:C})},!1,B),b}},k=await aN.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 aN.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}}},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",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")},94735:a=>{a.exports=require("events")}};var b=require("../../../../webpack-runtime.js");b.C(a);var c=b.X(0,[4741,1813,5573,6935,5087,5901,6663],()=>b(b.s=61066));module.exports=c})();