@jheavenknows/bluerouter 2.0.63 → 2.0.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (619) hide show
  1. package/app/.next-cli-build/BUILD_ID +1 -1
  2. package/app/.next-cli-build/app-path-routes-manifest.json +2 -2
  3. package/app/.next-cli-build/build-manifest.json +2 -2
  4. package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page.js +2 -2
  5. package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page.js.nft.json +1 -1
  6. package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
  7. package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page.js +3 -3
  8. package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page.js.nft.json +1 -1
  9. package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
  10. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js +2 -2
  11. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  12. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  13. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +3 -3
  14. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  15. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  16. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js +2 -2
  17. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  18. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  19. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js +2 -2
  20. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  21. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  22. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js +2 -2
  23. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
  24. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  25. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js +2 -2
  26. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  27. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  28. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +3 -3
  29. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
  30. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  31. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js +2 -2
  32. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
  33. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  34. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +3 -3
  35. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
  36. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  37. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js +2 -2
  38. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
  39. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  40. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js +2 -2
  41. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  42. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  43. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js +2 -2
  44. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  45. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  46. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js +2 -2
  47. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  48. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  49. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page.js +2 -2
  50. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page.js.nft.json +1 -1
  51. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
  52. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page.js +2 -2
  53. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page.js.nft.json +1 -1
  54. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
  55. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js +2 -2
  56. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  57. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  58. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js +1 -1
  59. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  60. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  61. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js +2 -2
  62. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  63. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  64. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js +2 -2
  65. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
  66. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  67. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js +2 -2
  68. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  69. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  70. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js +2 -2
  71. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
  72. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  73. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js +2 -2
  74. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  75. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  76. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js +2 -2
  77. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  78. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  79. package/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
  80. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  81. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  82. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  83. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  84. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  85. package/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  86. package/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  87. package/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  88. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  89. package/app/.next-cli-build/server/app/_not-found/page.js +2 -2
  90. package/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
  91. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  92. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  93. package/app/.next-cli-build/server/app/_not-found.rsc +3 -3
  94. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +3 -3
  95. package/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  96. package/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +3 -3
  97. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  98. package/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  99. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  100. package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js +1 -1
  101. package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
  102. package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js +1 -1
  103. package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
  104. package/app/.next-cli-build/server/app/api/auth/login/route.js +2 -2
  105. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  106. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  107. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js +1 -1
  108. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  109. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js +1 -1
  110. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  111. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js +1 -1
  112. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  113. package/app/.next-cli-build/server/app/api/auth/status/route.js +1 -1
  114. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  115. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  116. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
  117. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  118. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js +1 -1
  119. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
  120. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js +1 -162
  121. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
  122. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
  123. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
  124. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
  126. package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
  127. package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
  128. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  129. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
  130. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  132. package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
  134. package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
  136. package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
  138. package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/combos/[id]/route.js +1 -1
  140. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/combos/route.js +1 -1
  142. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  143. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js +168 -168
  144. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
  145. package/app/.next-cli-build/server/app/api/dashboard/combos/route.js +1 -1
  146. package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
  147. package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js +1 -1
  148. package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js +1 -162
  150. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
  151. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js +1 -162
  152. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
  153. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js +1 -162
  154. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
  155. package/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
  156. package/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
  157. package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js +1 -1
  158. package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
  159. package/app/.next-cli-build/server/app/api/keys/[id]/route.js +1 -1
  160. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  161. package/app/.next-cli-build/server/app/api/keys/route.js +2 -2
  162. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  163. package/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
  164. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  165. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  166. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js +1 -1
  167. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  168. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js +1 -1
  169. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  170. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js +1 -1
  171. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  172. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js +1 -1
  173. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  174. package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
  175. package/app/.next-cli-build/server/app/api/models/alias/route.js +1 -1
  176. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  177. package/app/.next-cli-build/server/app/api/models/availability/route.js +1 -1
  178. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  179. package/app/.next-cli-build/server/app/api/models/custom/route.js +1 -1
  180. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  181. package/app/.next-cli-build/server/app/api/models/disabled/route.js +1 -1
  182. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  183. package/app/.next-cli-build/server/app/api/models/route.js +1 -1
  184. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  185. package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  186. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  187. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js +1 -1
  188. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  189. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js +1 -1
  190. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  191. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  192. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js +1 -1
  193. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  194. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js +1 -1
  195. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  196. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js +1 -1
  197. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  198. package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
  199. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js +1 -1
  200. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  201. package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
  202. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js +1 -1
  203. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  204. package/app/.next-cli-build/server/app/api/pricing/route.js +1 -1
  205. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  206. package/app/.next-cli-build/server/app/api/provider-health/route.js +1 -1
  207. package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
  208. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js +1 -1
  209. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  210. package/app/.next-cli-build/server/app/api/provider-nodes/route.js +1 -1
  211. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  212. package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
  213. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js +1 -1
  214. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  215. package/app/.next-cli-build/server/app/api/providers/[id]/route.js +1 -1
  216. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  217. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js +1 -1
  218. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  219. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  220. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  221. package/app/.next-cli-build/server/app/api/providers/client/route.js +1 -1
  222. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  223. package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
  224. package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  225. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  226. package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
  227. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js +1 -1
  228. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  229. package/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
  230. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  231. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js +1 -1
  232. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  233. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js +1 -1
  234. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  235. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js +2 -2
  236. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  237. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js +2 -2
  238. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  239. package/app/.next-cli-build/server/app/api/proxy-pools/route.js +1 -1
  240. package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  241. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js +2 -2
  242. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  243. package/app/.next-cli-build/server/app/api/settings/database/route.js +1 -1
  244. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  245. package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
  246. package/app/.next-cli-build/server/app/api/settings/require-login/route.js +1 -1
  247. package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  248. package/app/.next-cli-build/server/app/api/settings/route.js +1 -1
  249. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  250. package/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
  251. package/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
  252. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  253. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
  254. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  255. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
  256. package/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
  257. package/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
  258. package/app/.next-cli-build/server/app/api/translator/send/route.js +1 -1
  259. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  260. package/app/.next-cli-build/server/app/api/translator/translate/route.js +1 -1
  261. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  262. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js +1 -1
  263. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  264. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js +1 -1
  265. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  266. package/app/.next-cli-build/server/app/api/tunnel/status/route.js +1 -1
  267. package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  268. package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  269. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js +1 -1
  270. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  271. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js +1 -1
  272. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  273. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js +3 -3
  274. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  275. package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
  276. package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js +2 -2
  277. package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
  278. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js +1 -1
  279. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  280. package/app/.next-cli-build/server/app/api/usage/chart/route.js +1 -1
  281. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  282. package/app/.next-cli-build/server/app/api/usage/history/route.js +1 -1
  283. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  284. package/app/.next-cli-build/server/app/api/usage/providers/route.js +1 -1
  285. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  286. package/app/.next-cli-build/server/app/api/usage/request-details/route.js +1 -1
  287. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  288. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js +1 -1
  289. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  290. package/app/.next-cli-build/server/app/api/usage/stats/route.js +1 -1
  291. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  292. package/app/.next-cli-build/server/app/api/usage/stream/route.js +2 -2
  293. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  294. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js +1 -1
  295. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  296. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js +1 -1
  297. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  298. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js +1 -1
  299. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  300. package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
  301. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js +1 -1
  302. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  303. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js +1 -1
  304. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  305. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js +1 -1
  306. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  307. package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
  308. package/app/.next-cli-build/server/app/api/v1/messages/route.js +1 -1
  309. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  310. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js +1 -1
  311. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  312. package/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
  313. package/app/.next-cli-build/server/app/api/v1/models/route.js +1 -1
  314. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  315. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js +1 -1
  316. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  317. package/app/.next-cli-build/server/app/api/v1/responses/route.js +1 -1
  318. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  319. package/app/.next-cli-build/server/app/api/v1/route.js +1 -1
  320. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  321. package/app/.next-cli-build/server/app/api/v1/search/route.js +1 -1
  322. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  323. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js +1 -1
  324. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  325. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js +1 -1
  326. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  327. package/app/.next-cli-build/server/app/api/v1beta/models/route.js +1 -1
  328. package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  329. package/app/.next-cli-build/server/app/api/version/restart/route.js.nft.json +1 -1
  330. package/app/.next-cli-build/server/app/api/version/route.js +1 -1
  331. package/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
  332. package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  333. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  334. package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  335. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  336. package/app/.next-cli-build/server/app/callback/page.js +2 -2
  337. package/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
  338. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  339. package/app/.next-cli-build/server/app/callback.html +1 -1
  340. package/app/.next-cli-build/server/app/callback.rsc +3 -3
  341. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
  342. package/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  343. package/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +3 -3
  344. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  345. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  346. package/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  347. package/app/.next-cli-build/server/app/dashboard/analytics.html +1 -1
  348. package/app/.next-cli-build/server/app/dashboard/analytics.rsc +4 -4
  349. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics/__PAGE__.segment.rsc +1 -1
  350. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard/analytics.segment.rsc +1 -1
  351. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  352. package/app/.next-cli-build/server/app/dashboard/analytics.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  353. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_full.segment.rsc +4 -4
  354. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_head.segment.rsc +1 -1
  355. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_index.segment.rsc +3 -3
  356. package/app/.next-cli-build/server/app/dashboard/analytics.segments/_tree.segment.rsc +1 -1
  357. package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
  358. package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +5 -5
  359. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +2 -2
  360. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys.segment.rsc +1 -1
  361. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  362. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  363. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +5 -5
  364. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_head.segment.rsc +1 -1
  365. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_index.segment.rsc +3 -3
  366. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +1 -1
  367. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  368. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +5 -5
  369. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  370. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  371. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  372. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  373. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
  374. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  375. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
  376. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  377. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  378. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +5 -5
  379. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  380. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  381. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  382. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  383. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
  384. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  385. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
  386. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  387. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  388. package/app/.next-cli-build/server/app/dashboard/combos.rsc +5 -5
  389. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  390. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  391. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  392. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  393. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
  394. package/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  395. package/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
  396. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  397. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  398. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +5 -5
  399. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  400. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  401. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  402. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  403. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
  404. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  405. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
  406. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  407. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  408. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +5 -5
  409. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  410. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  411. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  412. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  413. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  414. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
  415. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  416. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
  417. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  418. package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  419. package/app/.next-cli-build/server/app/dashboard/mitm.rsc +5 -5
  420. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  421. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  422. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  423. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  424. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
  425. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  426. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
  427. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  428. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  429. package/app/.next-cli-build/server/app/dashboard/profile.rsc +4 -4
  430. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +1 -1
  431. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  432. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  433. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  434. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +4 -4
  435. package/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  436. package/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
  437. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  438. package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
  439. package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +4 -4
  440. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +1 -1
  441. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs.segment.rsc +1 -1
  442. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  443. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  444. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +4 -4
  445. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_head.segment.rsc +1 -1
  446. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_index.segment.rsc +3 -3
  447. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +1 -1
  448. package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
  449. package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +4 -4
  450. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +1 -1
  451. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health.segment.rsc +1 -1
  452. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  453. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  454. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +4 -4
  455. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_head.segment.rsc +1 -1
  456. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_index.segment.rsc +3 -3
  457. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +1 -1
  458. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  459. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +5 -5
  460. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  461. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  462. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  463. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  464. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  465. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
  466. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  467. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
  468. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  469. package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  470. package/app/.next-cli-build/server/app/dashboard/providers.rsc +5 -5
  471. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  472. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  473. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  474. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  475. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
  476. package/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  477. package/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
  478. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  479. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  480. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +5 -5
  481. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  482. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  483. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  484. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  485. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
  486. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  487. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
  488. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  489. package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
  490. package/app/.next-cli-build/server/app/dashboard/quota.rsc +6 -6
  491. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  492. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  493. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  494. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  495. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
  496. package/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  497. package/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
  498. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  499. package/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js +2 -2
  500. package/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
  501. package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  502. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  503. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
  504. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
  505. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  506. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
  507. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  508. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  509. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  510. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  511. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  512. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  513. package/app/.next-cli-build/server/app/dashboard/skills.rsc +5 -5
  514. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
  515. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
  516. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  517. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  518. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +5 -5
  519. package/app/.next-cli-build/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
  520. package/app/.next-cli-build/server/app/dashboard/skills.segments/_index.segment.rsc +3 -3
  521. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
  522. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  523. package/app/.next-cli-build/server/app/dashboard/translator.rsc +5 -5
  524. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  525. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  526. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  527. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  528. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
  529. package/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  530. package/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
  531. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  532. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  533. package/app/.next-cli-build/server/app/dashboard/usage.rsc +5 -5
  534. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  535. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  536. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  537. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  538. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
  539. package/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  540. package/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
  541. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  542. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  543. package/app/.next-cli-build/server/app/dashboard.rsc +5 -5
  544. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  545. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  546. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  547. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +5 -5
  548. package/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  549. package/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +3 -3
  550. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  551. package/app/.next-cli-build/server/app/favicon.ico/route.js.nft.json +1 -1
  552. package/app/.next-cli-build/server/app/index.html +1 -1
  553. package/app/.next-cli-build/server/app/index.rsc +3 -3
  554. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  555. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +3 -3
  556. package/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  557. package/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +3 -3
  558. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  559. package/app/.next-cli-build/server/app/landing/page.js +2 -2
  560. package/app/.next-cli-build/server/app/landing/page.js.nft.json +1 -1
  561. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  562. package/app/.next-cli-build/server/app/landing.html +1 -1
  563. package/app/.next-cli-build/server/app/landing.rsc +3 -3
  564. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +3 -3
  565. package/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  566. package/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +3 -3
  567. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  568. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  569. package/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  570. package/app/.next-cli-build/server/app/login/page.js +2 -2
  571. package/app/.next-cli-build/server/app/login/page.js.nft.json +1 -1
  572. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  573. package/app/.next-cli-build/server/app/login.html +1 -1
  574. package/app/.next-cli-build/server/app/login.rsc +3 -3
  575. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +3 -3
  576. package/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  577. package/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +3 -3
  578. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  579. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  580. package/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  581. package/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  582. package/app/.next-cli-build/server/app/page.js +2 -2
  583. package/app/.next-cli-build/server/app/page.js.nft.json +1 -1
  584. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  585. package/app/.next-cli-build/server/app-paths-manifest.json +2 -2
  586. package/app/.next-cli-build/server/chunks/{7795.js → 2338.js} +133 -3
  587. package/app/.next-cli-build/server/chunks/{4657.js → 2680.js} +1 -1
  588. package/app/.next-cli-build/server/chunks/3104.js +1 -1
  589. package/app/.next-cli-build/server/chunks/3110.js +1 -1
  590. package/app/.next-cli-build/server/chunks/3801.js +1 -1
  591. package/app/.next-cli-build/server/chunks/402.js +419 -0
  592. package/app/.next-cli-build/server/chunks/4746.js +1 -1
  593. package/app/.next-cli-build/server/chunks/4790.js +5 -0
  594. package/app/.next-cli-build/server/chunks/5199.js +62 -22
  595. package/app/.next-cli-build/server/chunks/5206.js +1 -0
  596. package/app/.next-cli-build/server/chunks/5901.js +1 -162
  597. package/app/.next-cli-build/server/chunks/6050.js +81 -0
  598. package/app/.next-cli-build/server/chunks/7130.js +1 -1
  599. package/app/.next-cli-build/server/chunks/7153.js +1 -1
  600. package/app/.next-cli-build/server/chunks/8352.js +5 -0
  601. package/app/.next-cli-build/server/instrumentation.js +1 -1
  602. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  603. package/app/.next-cli-build/server/middleware.js +134 -4
  604. package/app/.next-cli-build/server/pages/404.html +1 -1
  605. package/app/.next-cli-build/server/pages/500.html +1 -1
  606. package/app/.next-cli-build/static/chunks/{1321-5887c84ec4e6f189.js → 1321-3617d2ecab3c3e4a.js} +1 -1
  607. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-shm +0 -0
  608. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-wal +0 -0
  609. package/app/package.json +1 -1
  610. package/package.json +1 -1
  611. package/app/.next-cli-build/server/chunks/5087.js +0 -52
  612. package/app/.next-cli-build/server/chunks/5742.js +0 -1
  613. package/app/.next-cli-build/server/chunks/6663.js +0 -81
  614. /package/app/.next-cli-build/static/{TJPd1NLRFwZE7Wlgv7-0W → bR9icFlQc1LSGldh-TjFH}/_buildManifest.js +0 -0
  615. /package/app/.next-cli-build/static/{TJPd1NLRFwZE7Wlgv7-0W → bR9icFlQc1LSGldh-TjFH}/_ssgManifest.js +0 -0
  616. /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-2.0.58-to-2.0.59-2.0.59-20260615-092907 → upgrade-2.0.63-to-2.0.64-2.0.64-20260615-134136}/data.sqlite +0 -0
  617. /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-2.0.59-to-2.0.60-2.0.60-20260615-094124 → upgrade-2.0.64-to-2.0.65-2.0.65-20260615-134351}/data.sqlite +0 -0
  618. /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-2.0.60-to-2.0.61-2.0.61-20260615-100723 → upgrade-2.0.65-to-2.0.66-2.0.66-20260615-134832}/data.sqlite +0 -0
  619. /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-2.0.61-to-2.0.62-2.0.62-20260615-101342 → upgrade-2.0.66-to-2.0.67-2.0.67-20260615-160706}/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:()=>aU,patchFetch:()=>aT,routeModule:()=>aP,serverHooks:()=>aS,workAsyncStorage:()=>aQ,workUnitAsyncStorage:()=>aR});var d={};c.r(d),c.d(d,{GET:()=>aO,dynamic:()=>aM});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:()=>bd,patchFetch:()=>bc,routeModule:()=>a8,serverHooks:()=>bb,workAsyncStorage:()=>a9,workUnitAsyncStorage:()=>ba});var d={};c.r(d),c.d(d,{GET:()=>a7,dynamic:()=>a5});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,50 +26,57 @@
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","yesterday","24h","thisWeek","lastWeek","7d","thisMonth","lastMonth","30d","60d","all","custom"]),X="lower(trim(COALESCE(CAST(status AS TEXT), '')))",Y=`(
30
- ${X} GLOB 'error*'
31
- OR ${X} GLOB 'fail*'
32
- OR ${X} GLOB 'failed*'
33
- OR ${X} GLOB 'timeout*'
34
- OR ${X} GLOB 'network*'
35
- OR ${X} GLOB 'aborted*'
36
- OR ${X} GLOB 'abort*'
37
- OR ${X} GLOB 'rate_limited*'
38
- OR ${X} GLOB 'provider_error*'
39
- OR ${X} GLOB 'gateway_error*'
40
- OR ${X} GLOB 'parse_error*'
41
- OR ${X} GLOB 'model_error*'
42
- )`,Z=`(
43
- (COALESCE(statusCode, 0) BETWEEN 200 AND 299 AND NOT ${Y})
44
- OR ${X} = ''
45
- OR ${X} IN ('ok', 'success', 'succeeded', 'complete', 'completed', 'done', '200')
46
- OR ${X} GLOB '2[0-9][0-9]*'
47
- OR ${X} GLOB 'ok*'
48
- OR ${X} GLOB 'success*'
49
- OR ${X} GLOB 'succeeded*'
50
- OR ${X} GLOB 'complete*'
51
- OR ${X} GLOB 'completed*'
52
- OR ${X} GLOB 'done*'
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),W=c(77638);let X=new Set(["today","yesterday","24h","thisWeek","lastWeek","7d","thisMonth","lastMonth","30d","60d","all","custom"]),Y="lower(trim(COALESCE(CAST(status AS TEXT), '')))",Z=`(
30
+ ${Y} GLOB 'error*'
31
+ OR ${Y} GLOB 'fail*'
32
+ OR ${Y} GLOB 'failed*'
33
+ OR ${Y} GLOB 'timeout*'
34
+ OR ${Y} GLOB 'network*'
35
+ OR ${Y} GLOB 'aborted*'
36
+ OR ${Y} GLOB 'abort*'
37
+ OR ${Y} GLOB 'rate_limited*'
38
+ OR ${Y} GLOB 'provider_error*'
39
+ OR ${Y} GLOB 'gateway_error*'
40
+ OR ${Y} GLOB 'parse_error*'
41
+ OR ${Y} GLOB 'model_error*'
53
42
  )`,$=`(
54
- ${X} IN ('pending', 'running', 'in_progress', 'queued', 'processing')
55
- )`,_=`(NOT ${$})`,aa=`
56
- SUM(CASE WHEN ${_} THEN 1 ELSE 0 END) AS requests,
57
- SUM(CASE WHEN ${_} AND ${Z} THEN 1 ELSE 0 END) AS success,
58
- SUM(CASE WHEN ${_} AND NOT ${Z} THEN 1 ELSE 0 END) AS errors,
59
- SUM(CASE WHEN ${$} THEN 1 ELSE 0 END) AS pending,
60
- COALESCE(SUM(CASE WHEN ${_} THEN COALESCE(promptTokens, 0) ELSE 0 END), 0) AS promptTokens,
61
- COALESCE(SUM(CASE WHEN ${_} THEN COALESCE(completionTokens, 0) ELSE 0 END), 0) AS completionTokens,
62
- COALESCE(SUM(CASE WHEN ${_} THEN COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0) ELSE 0 END), 0) AS totalTokens,
63
- COALESCE(SUM(CASE WHEN ${_} THEN COALESCE(cost, 0) ELSE 0 END), 0) AS cost,
43
+ (COALESCE(statusCode, 0) BETWEEN 200 AND 299 AND NOT ${Z})
44
+ OR ${Y} = ''
45
+ OR ${Y} IN ('ok', 'success', 'succeeded', 'complete', 'completed', 'done', '200')
46
+ OR ${Y} GLOB '2[0-9][0-9]*'
47
+ OR ${Y} GLOB 'ok*'
48
+ OR ${Y} GLOB 'success*'
49
+ OR ${Y} GLOB 'succeeded*'
50
+ OR ${Y} GLOB 'complete*'
51
+ OR ${Y} GLOB 'completed*'
52
+ OR ${Y} GLOB 'done*'
53
+ )`,_=`(
54
+ ${Y} IN ('pending', 'running', 'in_progress', 'queued', 'processing')
55
+ )`,aa=`(NOT ${_})`,ab=`
56
+ SUM(CASE WHEN ${aa} THEN 1 ELSE 0 END) AS requests,
57
+ SUM(CASE WHEN ${aa} AND ${$} THEN 1 ELSE 0 END) AS success,
58
+ SUM(CASE WHEN ${aa} AND NOT ${$} THEN 1 ELSE 0 END) AS errors,
59
+ SUM(CASE WHEN ${_} THEN 1 ELSE 0 END) AS pending,
60
+ COALESCE(SUM(CASE WHEN ${aa} THEN COALESCE(promptTokens, 0) ELSE 0 END), 0) AS promptTokens,
61
+ COALESCE(SUM(CASE WHEN ${aa} THEN COALESCE(completionTokens, 0) ELSE 0 END), 0) AS completionTokens,
62
+ COALESCE(SUM(CASE WHEN ${aa} THEN COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0) ELSE 0 END), 0) AS totalTokens,
63
+ COALESCE(SUM(CASE WHEN ${aa} 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=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
65
+ `;function ac(a){return String(a||"").trim()}function ad(a){return ac(a).toLowerCase()}function ae(a,b=0){let c=Number(a);return Number.isFinite(c)?c:b}function af(a){let b=ac(a);if(!b)return"";let c=new Date(b);return Number.isNaN(c.getTime())?"":c.toISOString()}function ag(a=new Date){let b=new Date(a);return b.setHours(0,0,0,0),b}function ah(a,b){let c=new Date(a);return c.setDate(c.getDate()+b),c}function ai(a=new Date){let b=ag(a),c=b.getDay();return ah(b,0===c?-6:1-c)}function aj(a=new Date){let b=new Date(a);return b.setDate(1),b.setHours(0,0,0,0),b}function ak(a={}){return{...function(a={}){let b=X.has(a.period)?a.period:"24h",c=new Date,d=null,e=c;if("custom"===b){let b=af(a.dateFrom),f=af(a.dateTo);d=new Date(b||c.getTime()-864e5),e=f?new Date(f):c}else if("today"===b)d=ag(c);else if("yesterday"===b){let a=ag(c);d=ah(a,-1),e=a}else if("24h"===b)d=new Date(c.getTime()-864e5);else if("thisWeek"===b)d=ai(c);else if("lastWeek"===b){let a=ai(c);d=ah(a,-7),e=a}else if("7d"===b)d=new Date(c.getTime()-6048e5);else if("thisMonth"===b)d=aj(c);else if("lastMonth"===b){let a=aj(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:ac(a.provider),model:ac(a.model),connectionId:ac(a.connectionId),status:ac(a.status),endpoint:ac(a.endpoint),apiKey:ac(a.apiKey),clientIp:ac(a.clientIp||a.sourceIp),sourceTool:ac(a.sourceTool),sessionId:ac(a.sessionId),keyword:ac(a.keyword),maxPromptLogRows:Math.max(200,Math.min(1500,Math.floor(ae(a.maxPromptLogRows,1500))))}}function al(a){let b,c=ac(a);return c?(b=ac(c))?b.length<=12?b:`${b.slice(0,8)}...${b.slice(-4)}`:"local-no-key":"local-no-key"}async function am(a){try{let b=await a.all("SELECT * FROM apiKeys ORDER BY createdAt DESC")||[],c=new Map,d=new Map,e=[];for(let a of b){let b=function(a={}){let b=ac(a.key),c=al(b);return{id:ac(a.id),key:b,fingerprint:c,masked:c,name:ac(a.name)||c,ownerUser:ac(a.ownerUser||a.owner_user),createdByUser:ac(a.createdByUser||a.created_by_user),machineId:ac(a.machineId||a.machine_id),isActive:void 0===a.isActive||1===a.isActive||!0===a.isActive,createdAt:ac(a.createdAt||a.created_at)}}(a);e.push(b),b.key&&c.set(b.key,b),d.set(b.fingerprint,b)}return{rows:b,all:e,byKey:c,byFingerprint:d}}catch{return{rows:[],all:[],byKey:new Map,byFingerprint:new Map}}}async function an(a){let b=new Map;try{for(let c of await a.all("SELECT id, provider, name, email, isActive FROM providerConnections")||[])b.set(c.id,{id:c.id,provider:c.provider||"",name:c.name||c.email||c.id,email:c.email||"",isActive:1===c.isActive||!0===c.isActive})}catch{}return b}function ao(a,b=new Map){let c=ac(a);if(!c)return"unknown";let d=b.get(c);if(d?.name)return d.name;let e=[...b.values()].filter(a=>a.provider===c&&a.name&&a.name!==c);return 1===e.length?e[0].name:c}function ap(a){let b=ae(a.errors,0),c=ae(a.success,0),d=ae(a.pending,0),e=ae(a.requests,c+b),f=ae(a.promptTokens,0),g=ae(a.completionTokens,0),h=ae(a.totalTokens,f+g),i=c+b||e;return{...a,requests:e,success:c,errors:b,pending:d,totalTokens:h,errorRate:i?b/i:0,avgPromptTokens:e?f/e:0,avgCompletionTokens:e?g/e:0,avgTokens:e?h/e:0}}function aq(a,b=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 ar(a,b){return Math.floor(a/b)*b}async function as(a,b,c){let d=aq(b,c);return await a.get(`SELECT MIN(timestamp) AS minTs, MAX(timestamp) AS maxTs FROM usageHistory ${d.clause}`,d.params)||{}}async function at(a,b,c){let d=aq(b,c),e=await a.get(`SELECT
66
+ ${ab},
67
+ COUNT(DISTINCT COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''))) AS activeApiKeys,
68
+ COUNT(DISTINCT NULLIF(provider, '')) AS activeProviders,
69
+ COUNT(DISTINCT NULLIF(model, '')) AS activeModels,
70
+ COUNT(DISTINCT NULLIF(endpoint, '')) AS activeEndpoints
71
+ FROM usageHistory
72
+ ${d.clause}`,d.params)||{},f=function(a={}){return ap({requests:ae(a.requests,0),success:ae(a.success,0),errors:ae(a.errors,0),pending:ae(a.pending,0),promptTokens:ae(a.promptTokens,0),completionTokens:ae(a.completionTokens,0),totalTokens:ae(a.totalTokens,0),cachedTokens:ae(a.cachedTokens,0),reasoningTokens:ae(a.reasoningTokens,0),cost:ae(a.cost,0),lastSeen:a.lastSeen||""})}(e),g=b.start&&b.end?Math.max(1,(b.end.getTime()-b.start.getTime())/6e4):1;return{...f,activeApiKeys:ae(e.activeApiKeys,0),activeProviders:ae(e.activeProviders,0),activeModels:ae(e.activeModels,0),activeEndpoints:ae(e.activeEndpoints,0),requestsPerMinute:f.requests/g,tokensPerMinute:f.totalTokens/g,inputOutputRatio:f.completionTokens?f.promptTokens/f.completionTokens:f.promptTokens?null:0}}function au(a,b={}){return ap({key:ac(a.key)||"unknown",label:ac(a.label||a.key)||"unknown",requests:ae(a.requests,0),success:ae(a.success,0),errors:ae(a.errors,0),pending:ae(a.pending,0),promptTokens:ae(a.promptTokens,0),completionTokens:ae(a.completionTokens,0),totalTokens:ae(a.totalTokens,0),cachedTokens:0,reasoningTokens:0,cost:ae(a.cost,0),lastSeen:a.lastSeen||"",...b})}async function av(a,b,c,d,e,f=[],g=50,h="requests DESC, totalTokens DESC"){let i=aq(b,c);return await a.all(`SELECT
66
73
  ${d},
67
- ${aa}
74
+ ${ab}
68
75
  FROM usageHistory
69
76
  ${i.clause}
70
77
  GROUP BY ${e}
71
78
  ORDER BY ${h}
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
79
+ LIMIT ?`,[...f,...i.params,g])||[]}async function aw(a,b,c,d,e=new Map){let f=aq(b,c),g=f.clause?`${f.clause} AND ${aa}`:`WHERE ${aa}`,h=`COALESCE(NULLIF(${d}, ''), 'unknown')`,i=await a.all(`SELECT
73
80
  COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS apiKeyGroupKey,
74
81
  ${h} AS itemKey,
75
82
  COUNT(*) AS requests,
@@ -78,119 +85,46 @@
78
85
  FROM usageHistory
79
86
  ${g}
80
87
  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?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
- FROM usageHistory
83
- ${b.clause} AND ${d}
84
- ORDER BY ${c} ASC
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
- FROM usageHistory
87
- ${f} ${c} IS NOT NULL AND ${c} <> ''
88
- ORDER BY ${c} ASC
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')",aF="COALESCE(NULLIF(clientIpNormalized, ''), NULLIF(clientIp, ''), 'unknown')";function aG(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
- ${g} AS itemKey,
92
- COUNT(*) AS requests,
93
- COALESCE(SUM(COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)), 0) AS totalTokens,
94
- MAX(timestamp) AS lastSeen
95
- FROM usageHistory
96
- ${f.clause}
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 aH(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 aI(a,b,c,{dimension:d="apiKey",order:e="tokens",limit:f=25}={}){let g=av(b,c),h="sourceIp"===d;try{return(a.all(`WITH base AS (
99
- SELECT
100
- ${h?aF:"COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key')"} AS groupKey,
101
- ${h?aF:"COALESCE(NULLIF(apiKeyName, ''), NULLIF(apiKeyOwner, ''), NULLIF(apiKeyFingerprint, ''), 'Local / kh\xf4ng API key')"} AS groupLabel,
102
- COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS apiKeyStable,
103
- COALESCE(NULLIF(apiKeyName, ''), '') AS apiKeyName,
104
- COALESCE(NULLIF(apiKeyOwner, ''), '') AS apiKeyOwner,
105
- COALESCE(NULLIF(apiKeyFingerprint, ''), '') AS apiKeyFingerprint,
106
- COALESCE(NULLIF(clientIpNormalized, ''), NULLIF(clientIp, ''), '') AS clientIpStable,
107
- COALESCE(NULLIF(sourceTool, ''), NULLIF(sourceToolLabel, ''), '') AS sourceToolStable,
108
- COALESCE(NULLIF(provider, ''), 'unknown') AS providerStable,
109
- COALESCE(NULLIF(model, ''), 'unknown') AS modelStable,
110
- timestamp,
111
- COALESCE(promptTokens, 0) AS promptTokens,
112
- COALESCE(completionTokens, 0) AS completionTokens,
113
- COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0) AS totalTokens,
114
- COALESCE(cost, 0) AS cost
115
- FROM usageHistory
116
- ${g.clause}
117
- ), ranked AS (
118
- SELECT
119
- base.*,
120
- COUNT(*) OVER (PARTITION BY groupKey) AS cnt,
121
- ROW_NUMBER() OVER (PARTITION BY groupKey ORDER BY promptTokens ASC) AS promptRank,
122
- ROW_NUMBER() OVER (PARTITION BY groupKey ORDER BY totalTokens ASC) AS totalRank
123
- FROM base
124
- )
125
- SELECT
126
- groupKey AS key,
127
- MAX(groupLabel) AS label,
128
- MAX(apiKeyName) AS apiKeyName,
129
- MAX(apiKeyOwner) AS apiKeyOwner,
130
- MAX(apiKeyFingerprint) AS apiKeyFingerprint,
131
- MAX(clientIpStable) AS primaryClientIp,
132
- MAX(sourceToolStable) AS primarySourceTool,
133
- COUNT(*) AS requests,
134
- COUNT(*) AS success,
135
- 0 AS errors,
136
- SUM(promptTokens) AS promptTokens,
137
- SUM(completionTokens) AS completionTokens,
138
- SUM(totalTokens) AS totalTokens,
139
- SUM(cost) AS cost,
140
- MIN(CASE WHEN promptRank >= ((cnt * 95 + 99) / 100) THEN promptTokens END) AS p95PromptTokens,
141
- MAX(promptTokens) AS maxPromptTokens,
142
- MIN(CASE WHEN totalRank >= ((cnt * 95 + 99) / 100) THEN totalTokens END) AS p95TotalTokens,
143
- MAX(totalTokens) AS maxTotalTokens,
144
- SUM(CASE WHEN promptTokens >= ? THEN 1 ELSE 0 END) AS longInputRequests,
145
- SUM(CASE WHEN promptTokens >= ? THEN 1 ELSE 0 END) AS hugeInputRequests,
146
- SUM(CASE WHEN promptTokens >= ? THEN 1 ELSE 0 END) AS extremeInputRequests,
147
- SUM(CASE WHEN promptTokens >= ? OR totalTokens >= ? THEN 1 ELSE 0 END) AS heavyRequests,
148
- COUNT(DISTINCT NULLIF(apiKeyStable, '')) AS apiKeyCount,
149
- COUNT(DISTINCT NULLIF(clientIpStable, '')) AS sourceIpCount,
150
- COUNT(DISTINCT NULLIF(sourceToolStable, '')) AS sourceToolCount,
151
- COUNT(DISTINCT NULLIF(providerStable, '')) AS providerCount,
152
- COUNT(DISTINCT NULLIF(modelStable, '')) AS modelCount,
153
- MAX(timestamp) AS lastSeen
154
- FROM ranked
155
- GROUP BY groupKey
156
- HAVING groupKey <> 'unknown'
157
- ORDER BY ${"heavy"===e?"heavyRequests DESC, maxPromptTokens DESC, promptTokens DESC, totalTokens DESC, requests DESC":"totalTokens DESC, promptTokens DESC, requests DESC, maxPromptTokens DESC"}
158
- LIMIT ?`,[...g.params,3e4,5e4,7e4,3e4,3e4,f])||[]).map(a=>(function(a={},b={}){let c=ad(a.requests,0),d=ad(a.promptTokens,0),e=ad(a.completionTokens,0),f=ad(a.totalTokens,d+e);return{key:ab(a.key||a.groupKey)||"unknown",label:ab(a.label||a.groupLabel||a.key||a.groupKey)||"unknown",requests:c,promptTokens:d,completionTokens:e,totalTokens:f,cost:ad(a.cost,0),avgPromptTokens:c?d/c:0,avgCompletionTokens:c?e/c:0,avgTokens:c?f/c:0,p95PromptTokens:ad(a.p95PromptTokens,0),maxPromptTokens:ad(a.maxPromptTokens,0),p95TotalTokens:ad(a.p95TotalTokens,0),maxTotalTokens:ad(a.maxTotalTokens,0),longInputRequests:ad(a.longInputRequests,0),hugeInputRequests:ad(a.hugeInputRequests,0),extremeInputRequests:ad(a.extremeInputRequests,0),heavyRequests:ad(a.heavyRequests,0),longInputRate:c?ad(a.longInputRequests,0)/c:0,hugeInputRate:c?ad(a.hugeInputRequests,0)/c:0,extremeInputRate:c?ad(a.extremeInputRequests,0)/c:0,heavyRequestRate:c?ad(a.heavyRequests,0)/c:0,apiKeyCount:ad(a.apiKeyCount,0),sourceIpCount:ad(a.sourceIpCount,0),sourceToolCount:ad(a.sourceToolCount,0),modelCount:ad(a.modelCount,0),providerCount:ad(a.providerCount,0),lastSeen:a.lastSeen||"",...b}})(a,{apiKeyName:ab(a.apiKeyName),apiKeyOwner:ab(a.apiKeyOwner),apiKeyFingerprint:ab(a.apiKeyFingerprint),primaryClientIp:ab(a.primaryClientIp),primarySourceTool:ab(a.primarySourceTool)}))}catch(a){return console.error(`[analytics] Failed to build top ${d} ${e} consumers:`,a?.message||a),[]}}function aJ(a){let b=String(a??"");return/[",\n\r]/.test(b)?`"${b.replace(/"/g,'""')}"`:b}async function aK(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
159
- ${aa},
160
- COUNT(DISTINCT COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''))) AS activeApiKeys,
161
- COUNT(DISTINCT NULLIF(provider, '')) AS activeProviders,
162
- COUNT(DISTINCT NULLIF(model, '')) AS activeModels,
163
- COUNT(DISTINCT NULLIF(endpoint, '')) AS activeEndpoints
164
- FROM usageHistory
165
- ${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,`
88
+ ORDER BY apiKeyGroupKey ASC, requests DESC, totalTokens DESC`,f.params)||[],j=new Map;for(let a of i){let b=ac(a.itemKey)||"unknown",c="provider"===d?ao(b,e):b;!function(a,b,c,d=3){if(!b||!c?.key)return;let e=a.get(b)||[];e.push(c),e.sort((a,b)=>b.requests-a.requests||b.totalTokens-a.totalTokens||String(a.label).localeCompare(String(b.label))),a.set(b,e.slice(0,d))}(j,a.apiKeyGroupKey,{key:b,label:c,requests:ae(a.requests,0),totalTokens:ae(a.totalTokens,0),lastSeen:a.lastSeen||""})}return j}async function ax(a,b,c,d,e){let f=await av(a,b,e,"COALESCE(NULLIF(provider, ''), 'unknown') AS key, COALESCE(NULLIF(provider, ''), 'unknown') AS label","COALESCE(NULLIF(provider, ''), 'unknown')"),g=await av(a,b,e,`
166
89
  COALESCE(NULLIF(provider, ''), 'unknown') || '|' || COALESCE(NULLIF(model, ''), 'unknown') AS key,
167
90
  COALESCE(NULLIF(provider, ''), 'unknown') AS provider,
168
91
  COALESCE(NULLIF(model, ''), 'unknown') AS model,
169
92
  COALESCE(NULLIF(model, ''), 'unknown') || ' (' || COALESCE(NULLIF(provider, ''), 'unknown') || ')' AS label
170
- `,"COALESCE(NULLIF(provider, ''), 'unknown'), COALESCE(NULLIF(model, ''), 'unknown')"),i=as(E,D,H,`
93
+ `,"COALESCE(NULLIF(provider, ''), 'unknown'), COALESCE(NULLIF(model, ''), 'unknown')"),h=await av(a,b,e,`
171
94
  COALESCE(NULLIF(connectionId, ''), 'unknown') AS key,
172
95
  COALESCE(NULLIF(connectionId, ''), 'unknown') AS connectionId,
173
96
  COALESCE(NULLIF(provider, ''), 'unknown') AS provider,
174
97
  COALESCE(NULLIF(connectionId, ''), 'unknown') AS label
175
- `,"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
98
+ `,"COALESCE(NULLIF(connectionId, ''), 'unknown')"),i=await av(a,b,e,"COALESCE(NULLIF(endpoint, ''), 'unknown') AS key, COALESCE(NULLIF(endpoint, ''), 'unknown') AS label","COALESCE(NULLIF(endpoint, ''), 'unknown')"),j=await av(a,b,e,"COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS key, COALESCE(NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS rawApiKey, COALESCE(NULLIF(apiKeyName, ''), '') AS apiKeyName, COALESCE(NULLIF(apiKeyOwner, ''), '') AS apiKeyOwner, COALESCE(NULLIF(apiKeyId, ''), '') AS apiKeyId","COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key')"),k=await aw(a,b,e,"model",d),l=await aw(a,b,e,"provider",d),m=await aw(a,b,e,"endpoint",d),n=await av(a,b,e,"COALESCE(NULLIF(status, ''), 'ok') AS key, COALESCE(NULLIF(status, ''), 'ok') AS label","COALESCE(NULLIF(status, ''), 'ok')"),o=aq(b,e),p=await a.all(`SELECT
176
99
  COALESCE(NULLIF(status, ''), 'error') AS status,
177
100
  COALESCE(NULLIF(provider, ''), 'unknown') AS provider,
178
101
  COALESCE(NULLIF(model, ''), 'unknown') AS model,
179
102
  COALESCE(NULLIF(endpoint, ''), 'unknown') AS endpoint,
180
103
  COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS rawApiKey,
181
104
  COALESCE(NULLIF(status, ''), 'error') || '|' || COALESCE(NULLIF(provider, ''), 'unknown') || '|' || COALESCE(NULLIF(model, ''), 'unknown') || '|' || COALESCE(NULLIF(endpoint, ''), 'unknown') AS key,
182
- ${aa}
105
+ ${ab}
183
106
  FROM usageHistory
184
- ${p.clause?`${p.clause} AND NOT ${Z} AND NOT ${$}`:`WHERE NOT ${Z} AND NOT ${$}`}
107
+ ${o.clause?`${o.clause} AND NOT ${$} AND NOT ${_}`:`WHERE NOT ${$} AND NOT ${_}`}
185
108
  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')
186
109
  ORDER BY errors DESC, requests DESC, lastSeen DESC
187
- 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
110
+ LIMIT ?`,[...o.params,100])||[],q=f.map(a=>au(a,{label:ao(a.key||a.label,d),provider:a.key||a.label||"unknown",topModels:[],topApiKeys:[]})),r=g.map(a=>au(a,{provider:a.provider||"",providerLabel:ao(a.provider,d),model:a.model||"",label:`${a.model||"unknown"} (${ao(a.provider,d)})`,topApiKeys:[]})),s=h.map(a=>{let b=d.get(a.connectionId);return au(a,{label:b?.name||a.connectionId||"unknown",provider:b?.provider||a.provider||"",providerLabel:ao(b?.provider||a.provider,d),connectionId:a.connectionId||"",topModels:[]})}),t=i.map(a=>au(a)),u=j.map(a=>{let b="local-no-key"===a.rawApiKey?"":a.rawApiKey,d=c.byKey.get(b)||c.byFingerprint.get(b)||c.all.find(b=>b.id===a.apiKeyId||b.id===a.key),e=d?.fingerprint||al(b),f=a.apiKeyName||d?.name||(b?e:"Local / kh\xf4ng d\xf9ng API key");return au(a,{key:a.apiKeyId||e,label:f,name:f,fingerprint:e,apiKeyId:a.apiKeyId||d?.id||"",ownerUser:a.apiKeyOwner||d?.ownerUser||"",createdByUser:d?.createdByUser||"",isActive:d?.isActive??null,topModels:k.get(a.key)||[],topProviders:l.get(a.key)||[],topEndpoints:m.get(a.key)||[]})});return{providers:q,models:r,providerAccounts:s,endpoints:t,apiKeys:u,statuses:n.map(a=>au(a)),errors:p.map(a=>{let b="local-no-key"===a.rawApiKey?"":a.rawApiKey,e=c.byKey.get(b)||c.byFingerprint.get(b)||c.all.find(a=>a.id===b);return au(a,{label:a.status||"error",status:a.status||"error",provider:a.provider||"unknown",providerLabel:ao(a.provider,d),model:a.model||"unknown",endpoint:a.endpoint||"unknown",apiKey:e?.fingerprint||al(b)})})}}async function ay(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=ar(g,e),h))-g)/e)+1,j=f*(i>240?Math.ceil(i/240):1),k=1e3*j,l=aq(b,c),m=await a.all(`SELECT
111
+ ((CAST(strftime('%s', timestamp) AS INTEGER) / ?) * ?) AS bucketSec,
112
+ ${ab}
113
+ FROM usageHistory
114
+ ${l.clause}
115
+ GROUP BY bucketSec
116
+ HAVING bucketSec IS NOT NULL
117
+ ORDER BY bucketSec ASC`,[j,j,...l.params])||[],n=new Map;for(let a=ar(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*ae(a.bucketSec,0);b&&n.set(b,{ts:b,label:new Date(b).toISOString(),requests:ae(a.requests,0),success:ae(a.success,0),errors:ae(a.errors,0),pending:ae(a.pending,0),promptTokens:ae(a.promptTokens,0),completionTokens:ae(a.completionTokens,0),totalTokens:ae(a.totalTokens,0),cost:ae(a.cost,0)})}return[...n.values()].sort((a,b)=>a.ts-b.ts)}function az(a,b){if(!a.length)return null;let c=[...a].sort((a,b)=>a-b),d=Math.min(c.length-1,Math.max(0,Math.ceil(b/100*c.length)-1));return c[d]}async function aA(a,b,c){try{let d=aq(b,c),e=d.clause?`${d.clause} AND`:"WHERE",f=[...d.params],g=await a.get(`SELECT COUNT(*) AS samples, AVG(latencyMs) AS avgMs
188
118
  FROM usageHistory
189
- ${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
119
+ ${e} latencyMs IS NOT NULL AND latencyMs > 0`,f)||{},h=ae(g.samples,0),i=async b=>{if(!h)return null;let c=Math.max(0,Math.min(h-1,Math.ceil(b/100*h)-1)),d=await a.get(`SELECT latencyMs
190
120
  FROM usageHistory
191
121
  ${e} latencyMs IS NOT NULL AND latencyMs > 0
192
122
  ORDER BY latencyMs ASC
193
- 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
123
+ LIMIT 1 OFFSET ?`,[...f,c]);return d?ae(d.latencyMs,null):null};if(h>0)return{samples:h,avgMs:ae(g.avgMs,null),p50Ms:await i(50),p95Ms:await i(95),p99Ms:await i(99)}}catch{}let d=[];try{let c,e,f=(c=[],e=[],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=await a.all(`SELECT data FROM requestDetails ${f.clause} ORDER BY timestamp DESC LIMIT ?`,[...f.params,3e3])||[]}catch{d=[]}let e=[];for(let a of d){let b=function(a){let b=a?.latency||{};for(let c of[b.totalMs,b.total_ms,b.durationMs,b.duration_ms,b.elapsedMs,b.elapsed_ms,b.responseMs,b.response_ms,b.ms,b.total,a?.durationMs,a?.latencyMs]){let a=Number(c);if(Number.isFinite(a)&&a>=0)return a}return null}((0,x.q)(a.data,{})||{});Number.isFinite(b)&&e.push(b)}let f=e.reduce((a,b)=>a+b,0);return{samples:e.length,avgMs:e.length?f/e.length:null,p50Ms:az(e,50),p95Ms:az(e,95),p99Ms:az(e,99)}}function aB(a,b,c={}){let d=aq(a,b,c),e=[aa,$,"(COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)) > 0"];c.latencyOnly&&e.push("latencyMs IS NOT NULL AND latencyMs > 0"),c.ttftOnly&&e.push("ttftMs IS NOT NULL AND ttftMs > 0");let f=e.join(" AND ");return{clause:d.clause?`${d.clause} AND ${f}`:`WHERE ${f}`,params:d.params}}async function aC(a,b,c){try{let d=await a.get(`SELECT COUNT(*) AS samples FROM usageHistory ${b.clause} AND ${c}`,b.params)||{};return ae(d.samples,0)}catch{return 0}}async function aD(a,b,c,d,e,f){if(!f||!new Set(["latencyMs","ttftMs","promptTokens","completionTokens","totalTokens"]).has(c))return null;let g=Math.max(0,Math.min(f-1,Math.ceil(e/100*f)-1));try{let e=await a.get(`SELECT ${c} AS value
124
+ FROM usageHistory
125
+ ${b.clause} AND ${d}
126
+ ORDER BY ${c} ASC
127
+ LIMIT 1 OFFSET ?`,[...b.params,g]);return e?ae(e.value,null):null}catch{return null}}function aE({samples:a=0,p95LatencyMs:b=0,p95TtftMs:c=0,slowRequestRate:d=0,errorRate:e=0}={}){if(!a)return{level:"none",label:"Chưa c\xf3 mẫu",tone:"slate",score:null};if(a<10)return{level:"low_sample",label:"\xcdt mẫu",tone:"amber",score:null};let f=100;return(b>0&&(b>9e4?f-=35:b>45e3?f-=20:b>15e3&&(f-=8)),c>0&&(c>45e3?f-=30:c>2e4?f-=16:c>8e3&&(f-=6)),f-=Math.min(30,Math.round(100*d)),f-=Math.min(25,Math.round(100*e)),(f=Math.max(0,Math.min(100,f)))>=85)?{level:"fast",label:"Nhanh",tone:"green",score:f}:f>=70?{level:"ok",label:"Ổn",tone:"blue",score:f}:f>=50?{level:"slow",label:"Chậm",tone:"amber",score:f}:{level:"very_slow",label:"Rất chậm",tone:"red",score:f}}async function aF(a,b,c,d={}){let e=aB(b,c,{latencyOnly:!0}),f={};try{f=await a.get(`SELECT
194
128
  COUNT(*) AS samples,
195
129
  AVG(latencyMs) AS avgLatencyMs,
196
130
  MIN(latencyMs) AS minLatencyMs,
@@ -217,7 +151,7 @@
217
151
  SUM(CASE WHEN promptTokens >= ? THEN 1 ELSE 0 END) AS hugeInputRequests,
218
152
  SUM(CASE WHEN promptTokens >= ? THEN 1 ELSE 0 END) AS extremeInputRequests
219
153
  FROM usageHistory
220
- ${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 (
154
+ ${e.clause}`,[45e3,9e4,2e4,3e4,5e4,7e4,...e.params])||{}}catch{f={}}let g=ae(f.samples,0),h=await aC(a,e,"ttftMs IS NOT NULL AND ttftMs > 0"),i=await aC(a,e,"promptTokens IS NOT NULL AND promptTokens > 0"),j=await aC(a,e,"completionTokens IS NOT NULL AND completionTokens > 0"),k=await aD(a,e,"latencyMs","latencyMs IS NOT NULL AND latencyMs > 0",50,g),l=await aD(a,e,"latencyMs","latencyMs IS NOT NULL AND latencyMs > 0",95,g),m=await aD(a,e,"latencyMs","latencyMs IS NOT NULL AND latencyMs > 0",99,g),n=await aD(a,e,"ttftMs","ttftMs IS NOT NULL AND ttftMs > 0",50,h),o=await aD(a,e,"ttftMs","ttftMs IS NOT NULL AND ttftMs > 0",95,h),p=await aD(a,e,"ttftMs","ttftMs IS NOT NULL AND ttftMs > 0",99,h),q=await aD(a,e,"promptTokens","promptTokens IS NOT NULL AND promptTokens > 0",50,i),r=await aD(a,e,"promptTokens","promptTokens IS NOT NULL AND promptTokens > 0",95,i),s=await aD(a,e,"promptTokens","promptTokens IS NOT NULL AND promptTokens > 0",99,i),t=await aD(a,e,"completionTokens","completionTokens IS NOT NULL AND completionTokens > 0",95,j),u=ae(f.slowRequests,0),v=ae(f.verySlowRequests,0),w=ae(f.slowTtftRequests,0),x=ae(f.longInputRequests,0),y=ae(f.hugeInputRequests,0),z=ae(f.extremeInputRequests,0),A=ae(f.totalPromptTokens,0),B=ae(f.totalLatencyMs,0),C=ae(f.totalTtftMs,0),D=ae(f.promptTokensWithTtft,0),E=ae(f.completionTokensWithLatency,0),F=ae(f.latencyMsWithOutput,0),G=ae(f.completionTokensAfterTtft,0),H=ae(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=aE({samples:g,p95LatencyMs:ae(l,0),p95TtftMs:ae(o,0),slowRequestRate:I,errorRate:ae(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:ae(f.avgLatencyMs,null),minLatencyMs:ae(f.minLatencyMs,null),maxLatencyMs:ae(f.maxLatencyMs,null),p50LatencyMs:k,p95LatencyMs:l,p99LatencyMs:m,avgTtftMs:ae(f.avgTtftMs,null),maxTtftMs:ae(f.maxTtftMs,null),p50TtftMs:n,p95TtftMs:o,p99TtftMs:p,avgPromptTokens:ae(f.avgPromptTokens,0),maxPromptTokens:ae(f.maxPromptTokens,0),p50PromptTokens:q,p95PromptTokens:r,p99PromptTokens:s,avgCompletionTokens:ae(f.avgCompletionTokens,0),maxCompletionTokens:ae(f.maxCompletionTokens,0),p95CompletionTokens:t,slowRequests:u,verySlowRequests:v,slowTtftRequests:w,longInputRequests:x,hugeInputRequests:y,extremeInputRequests:z,slowRequestRate:I,verySlowRequestRate:J,slowTtftRate:K,longInputRate:L,hugeInputRate:M,extremeInputRate:N,approxInputTokensPerSecond:C>0?D/(C/1e3):null,outputTokensPerSecond:F>0?E/(F/1e3):null,decodeTokensPerSecond:H>0?G/(H/1e3):null,latencyMsPer10kInputTokens:A>0?B/(A/1e4):null}}async function aG(a,b,c,d=new Map){let e=aB(b,c,{latencyOnly:!0});try{return(await a.all(`WITH base AS (
221
155
  SELECT
222
156
  COALESCE(NULLIF(provider, ''), 'unknown') AS provider,
223
157
  COALESCE(NULLIF(model, ''), 'unknown') AS model,
@@ -265,10 +199,98 @@
265
199
  FROM ranked
266
200
  GROUP BY provider, model
267
201
  ORDER BY samples DESC, p95LatencyMs DESC
268
- 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=aG(a,b,c,"model",d),g=aG(a,b,c,"provider",d),h=aG(a,b,c,"endpoint",d),i=aG(a,b,c,"clientIpNormalized",d),j=aG(a,b,c,"sourceTool",d);try{return(a.all(`WITH base AS (
202
+ LIMIT ?`,[...e.params,45e3,2e4,3e4,5e4,30])||[]).map(a=>{let b=ae(a.samples,0),c=b?ae(a.slowRequests,0)/b:0,e=b?ae(a.slowTtftRequests,0)/b:0,f=b?ae(a.longInputRequests,0)/b:0,g=b?ae(a.hugeInputRequests,0)/b:0,h=aE({samples:b,p95LatencyMs:ae(a.p95LatencyMs,0),p95TtftMs:ae(a.p95TtftMs,0),slowRequestRate:c});return{key:a.key,provider:a.provider,providerLabel:ao(a.provider,d),model:a.model,label:`${a.model} (${ao(a.provider,d)})`,samples:b,level:h.level,labelQuality:h.label,tone:h.tone,score:h.score,avgLatencyMs:ae(a.avgLatencyMs,null),p50LatencyMs:ae(a.p50LatencyMs,null),p95LatencyMs:ae(a.p95LatencyMs,null),maxLatencyMs:ae(a.maxLatencyMs,null),avgTtftMs:ae(a.avgTtftMs,null),p95TtftMs:ae(a.p95TtftMs,null),maxTtftMs:ae(a.maxTtftMs,null),avgPromptTokens:ae(a.avgPromptTokens,0),p95PromptTokens:ae(a.p95PromptTokensApprox,0),maxPromptTokens:ae(a.maxPromptTokens,0),avgCompletionTokens:ae(a.avgCompletionTokens,0),slowRequests:ae(a.slowRequests,0),slowRequestRate:c,slowTtftRate:e,longInputRate:f,hugeInputRate:g,outputTokensPerSecond:ae(a.totalLatencyMs,0)>0?ae(a.totalCompletionTokens,0)/(ae(a.totalLatencyMs,0)/1e3):null}})}catch(a){return console.error("[analytics] Failed to build model experience stats:",a?.message||a),[]}}async function aH(a,b,c,d,e){try{let f=aB(b,c,{latencyOnly:!0});return(await a.all(`SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, promptTokens, completionTokens, cost, status, tokens
203
+ FROM usageHistory
204
+ ${f.clause}
205
+ ORDER BY latencyMs DESC
206
+ LIMIT ?`,[...f.params,20])||[]).map(a=>aI(a,d,e))}catch{return[]}}function aI(a,b,c){let d=function(a={}){let b=(0,x.q)(a.tokens,{})||{},c=ae(a.promptTokens,0)||ae(b.prompt_tokens,0)||ae(b.input_tokens,0),d=ae(a.completionTokens,0)||ae(b.completion_tokens,0)||ae(b.output_tokens,0);return{promptTokens:c,completionTokens:d,totalTokens:c+d,cachedTokens:ae(b.cached_tokens,0)||ae(b.cache_read_input_tokens,0)||ae(b.prompt_tokens_details?.cached_tokens,0),reasoningTokens:ae(b.reasoning_tokens,0)||ae(b.completion_tokens_details?.reasoning_tokens,0)||ae(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?al(a.apiKeyFingerprint||a.apiKey):"Local"),apiKeyFingerprint:a.apiKeyFingerprint||e?.fingerprint||al(a.apiKey),apiKeyId:a.apiKeyId||e?.id||"",clientIp:a.clientIpNormalized||a.clientIp||"",sourceTool:a.sourceTool||a.sourceToolLabel||"",sessionId:a.sessionId||"",latencyMs:ae(a.latencyMs,0),ttftMs:ae(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:ae(a.cost,0)}}async function aJ(a,b,c,d,e){let f=aq(b,c);return(await a.all(`SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, promptTokens, completionTokens, cost, status, tokens
207
+ FROM usageHistory
208
+ ${f.clause}
209
+ ORDER BY timestamp DESC
210
+ LIMIT ?`,[...f.params,50])||[]).map(a=>aI(a,d,e))}async function aK(a,b,c,d,e){let f=aq(b,c);return(await a.all(`SELECT id, timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, endpoint, clientIp, clientIpNormalized, sourceTool, sourceToolLabel, sessionId, latencyMs, ttftMs, statusCode, errorCode, errorType, promptTokens, completionTokens, cost, status, tokens
211
+ FROM usageHistory
212
+ ${f.clause}
213
+ ORDER BY (COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)) DESC, timestamp DESC
214
+ LIMIT ?`,[...f.params,20])||[]).map(a=>aI(a,d,e))}function aL(a,b,c=b){let d=function(a,b=a){let c=ac(a);return c?{value:c,label:ac(b)||c}:null}(b,c);return d&&(a.some(a=>a.value===d.value)||a.unshift(d)),a}function aM(a){return{...a,provider:"",model:"",connectionId:"",status:"",endpoint:"",apiKey:""}}async function aN(a,b,c,d=500){let e=aq(aM(b),null),f=e.clause?`${e.clause} AND`:"WHERE";return(await a.all(`SELECT DISTINCT ${c} AS value
215
+ FROM usageHistory
216
+ ${f} ${c} IS NOT NULL AND ${c} <> ''
217
+ ORDER BY ${c} ASC
218
+ LIMIT ?`,[...e.params,d])||[]).map(a=>ac(a.value)).filter(Boolean)}async function aO(a,b){let c=aq(aM(b),null),d=c.clause?`${c.clause} AND`:"WHERE";try{let b=await a.get(`SELECT 1 AS hasLocal
219
+ FROM usageHistory
220
+ ${d} (apiKey IS NULL OR apiKey = '')
221
+ LIMIT 1`,c.params);return!!b?.hasLocal}catch{return!1}}async function aP(a,b,c,d){let e=await aN(a,b,"provider",500),f=await aN(a,b,"model",1e3),g=await aN(a,b,"endpoint",500),h=await aN(a,b,"status",200),i=(await aN(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(await aO(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}`:""}`});aL(i,b.connectionId,b.connectionId),aL(j,b.apiKey,b.apiKey);let k=e.map(a=>({value:a,label:ao(a,c)})),l=f.map(a=>({value:a,label:a})),m=g.map(a=>({value:a,label:a})),n=h.map(a=>({value:a,label:a}));return aL(k,b.provider,b.provider),aL(l,b.model,b.model),aL(m,b.endpoint,b.endpoint),aL(n,b.status,b.status),{providers:k,models:l.map(a=>a.value),endpoints:m.map(a=>a.value),statuses:n.map(a=>a.value),connections:i,apiKeys:j,clientIps:[],sourceTools:[]}}async function aQ(a,b,c,d,e,f,g=new Map){let h=await aP(a,b,g,e);return h.clientIps=(d.topClientIps||[]).map(a=>a.key).filter(Boolean),h.sourceTools=(d.topSourceTools||[]).map(a=>a.key).filter(Boolean),h}let aR="COALESCE(NULLIF(apiKeyOwner, ''), NULLIF(apiKeyName, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKeyId, ''), NULLIF(clientIpNormalized, ''), 'local-no-key')",aS="COALESCE(NULLIF(apiKeyOwner, ''), NULLIF(apiKeyName, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(clientIpNormalized, ''), 'Local / kh\xf4ng API key')",aT="COALESCE(NULLIF(clientIpNormalized, ''), NULLIF(clientIp, ''), 'unknown')";async function aU(a,b,c,d,e=new Map){if(!new Set(["model","provider","endpoint","clientIpNormalized","sourceTool"]).has(d))return new Map;let f=aB(b,c),g=`COALESCE(NULLIF(${d}, ''), 'unknown')`;try{let b=await a.all(`SELECT
222
+ ${aR} AS clientKey,
223
+ ${g} AS itemKey,
224
+ COUNT(*) AS requests,
225
+ COALESCE(SUM(COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)), 0) AS totalTokens,
226
+ MAX(timestamp) AS lastSeen
227
+ FROM usageHistory
228
+ ${f.clause}
229
+ GROUP BY ${aR}, ${g}
230
+ ORDER BY clientKey ASC, requests DESC, totalTokens DESC`,f.params)||[],c=new Map;for(let a of b){let b=ac(a.itemKey)||"unknown",f="provider"===d?ao(b,e):b;!function(a,b,c,d=3){if(!b||!c?.key)return;let e=a.get(b)||[];e.push(c),e.sort((a,b)=>b.requests-a.requests||b.totalTokens-a.totalTokens||String(a.label).localeCompare(String(b.label))),a.set(b,e.slice(0,d))}(c,a.clientKey,{key:b,label:f,requests:ae(a.requests,0),totalTokens:ae(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 aV(a={},b={}){let c=ae(a.requests,0),d=ae(a.success,c),e=ae(a.errors,0),f=ae(a.promptTokens,0),g=ae(a.completionTokens,0),h=ae(a.totalTokens,f+g),i=ae(a.p95PromptTokens,0),j=ae(a.p95LatencyMs,null),k=c?e/c:0,l=c?ae(a.longInputRequests,0)/c:0,m=c?ae(a.hugeInputRequests,0)/c:0,n=c?ae(a.extremeInputRequests,0)/c:0,o=c?ae(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:ae(j,0),longInputRate:l,errorRate:k});return{key:ac(a.clientKey)||"unknown",label:ac(a.clientLabel||a.clientKey)||"unknown",ownerUser:ac(a.ownerUser),apiKeyName:ac(a.apiKeyName),apiKeyFingerprint:ac(a.apiKeyFingerprint),primaryClientIp:ac(a.primaryClientIp),primarySourceTool:ac(a.primarySourceTool),apiKeyCount:ae(a.apiKeyCount,0),sourceIpCount:ae(a.sourceIpCount,0),sourceToolCount:ae(a.sourceToolCount,0),sessionCount:ae(a.sessionCount,0),requests:c,success:d,errors:e,errorRate:k,promptTokens:f,completionTokens:g,totalTokens:h,cost:ae(a.cost,0),avgPromptTokens:c?f/c:0,avgCompletionTokens:c?g/c:0,avgTokens:c?h/c:0,p50PromptTokens:ae(a.p50PromptTokens,0),p95PromptTokens:i,maxPromptTokens:ae(a.maxPromptTokens,0),avgLatencyMs:ae(a.avgLatencyMs,null),p95LatencyMs:j,maxLatencyMs:ae(a.maxLatencyMs,null),avgTtftMs:ae(a.avgTtftMs,null),p95TtftMs:ae(a.p95TtftMs,null),longInputRequests:ae(a.longInputRequests,0),hugeInputRequests:ae(a.hugeInputRequests,0),extremeInputRequests:ae(a.extremeInputRequests,0),slowRequests:ae(a.slowRequests,0),slowTtftRequests:ae(a.slowTtftRequests,0),longInputRate:l,hugeInputRate:m,extremeInputRate:n,slowRequestRate:o,slowTtftRate:c?ae(a.slowTtftRequests,0)/c:0,outputTokensPerSecond:ae(a.totalLatencyMs,0)>0?g/(ae(a.totalLatencyMs,0)/1e3):null,level:p.level,pressureLabel:p.label,tone:p.tone,lastSeen:a.lastSeen||"",...b}}async function aW(a,b,c,{dimension:d="apiKey",order:e="tokens",limit:f=25}={}){let g=aB(b,c),h="sourceIp"===d;try{return(await a.all(`WITH base AS (
269
231
  SELECT
270
- ${aD} AS clientKey,
271
- ${aE} AS clientLabel,
232
+ ${h?aT:"COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key')"} AS groupKey,
233
+ ${h?aT:"COALESCE(NULLIF(apiKeyName, ''), NULLIF(apiKeyOwner, ''), NULLIF(apiKeyFingerprint, ''), 'Local / kh\xf4ng API key')"} AS groupLabel,
234
+ COALESCE(NULLIF(apiKeyId, ''), NULLIF(apiKeyFingerprint, ''), NULLIF(apiKey, ''), 'local-no-key') AS apiKeyStable,
235
+ COALESCE(NULLIF(apiKeyName, ''), '') AS apiKeyName,
236
+ COALESCE(NULLIF(apiKeyOwner, ''), '') AS apiKeyOwner,
237
+ COALESCE(NULLIF(apiKeyFingerprint, ''), '') AS apiKeyFingerprint,
238
+ COALESCE(NULLIF(clientIpNormalized, ''), NULLIF(clientIp, ''), '') AS clientIpStable,
239
+ COALESCE(NULLIF(sourceTool, ''), NULLIF(sourceToolLabel, ''), '') AS sourceToolStable,
240
+ COALESCE(NULLIF(provider, ''), 'unknown') AS providerStable,
241
+ COALESCE(NULLIF(model, ''), 'unknown') AS modelStable,
242
+ timestamp,
243
+ COALESCE(promptTokens, 0) AS promptTokens,
244
+ COALESCE(completionTokens, 0) AS completionTokens,
245
+ COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0) AS totalTokens,
246
+ COALESCE(cost, 0) AS cost
247
+ FROM usageHistory
248
+ ${g.clause}
249
+ ), ranked AS (
250
+ SELECT
251
+ base.*,
252
+ COUNT(*) OVER (PARTITION BY groupKey) AS cnt,
253
+ ROW_NUMBER() OVER (PARTITION BY groupKey ORDER BY promptTokens ASC) AS promptRank,
254
+ ROW_NUMBER() OVER (PARTITION BY groupKey ORDER BY totalTokens ASC) AS totalRank
255
+ FROM base
256
+ )
257
+ SELECT
258
+ groupKey AS key,
259
+ MAX(groupLabel) AS label,
260
+ MAX(apiKeyName) AS apiKeyName,
261
+ MAX(apiKeyOwner) AS apiKeyOwner,
262
+ MAX(apiKeyFingerprint) AS apiKeyFingerprint,
263
+ MAX(clientIpStable) AS primaryClientIp,
264
+ MAX(sourceToolStable) AS primarySourceTool,
265
+ COUNT(*) AS requests,
266
+ COUNT(*) AS success,
267
+ 0 AS errors,
268
+ SUM(promptTokens) AS promptTokens,
269
+ SUM(completionTokens) AS completionTokens,
270
+ SUM(totalTokens) AS totalTokens,
271
+ SUM(cost) AS cost,
272
+ MIN(CASE WHEN promptRank >= ((cnt * 95 + 99) / 100) THEN promptTokens END) AS p95PromptTokens,
273
+ MAX(promptTokens) AS maxPromptTokens,
274
+ MIN(CASE WHEN totalRank >= ((cnt * 95 + 99) / 100) THEN totalTokens END) AS p95TotalTokens,
275
+ MAX(totalTokens) AS maxTotalTokens,
276
+ SUM(CASE WHEN promptTokens >= ? THEN 1 ELSE 0 END) AS longInputRequests,
277
+ SUM(CASE WHEN promptTokens >= ? THEN 1 ELSE 0 END) AS hugeInputRequests,
278
+ SUM(CASE WHEN promptTokens >= ? THEN 1 ELSE 0 END) AS extremeInputRequests,
279
+ SUM(CASE WHEN promptTokens >= ? OR totalTokens >= ? THEN 1 ELSE 0 END) AS heavyRequests,
280
+ COUNT(DISTINCT NULLIF(apiKeyStable, '')) AS apiKeyCount,
281
+ COUNT(DISTINCT NULLIF(clientIpStable, '')) AS sourceIpCount,
282
+ COUNT(DISTINCT NULLIF(sourceToolStable, '')) AS sourceToolCount,
283
+ COUNT(DISTINCT NULLIF(providerStable, '')) AS providerCount,
284
+ COUNT(DISTINCT NULLIF(modelStable, '')) AS modelCount,
285
+ MAX(timestamp) AS lastSeen
286
+ FROM ranked
287
+ GROUP BY groupKey
288
+ HAVING groupKey <> 'unknown'
289
+ ORDER BY ${"heavy"===e?"heavyRequests DESC, maxPromptTokens DESC, promptTokens DESC, totalTokens DESC, requests DESC":"totalTokens DESC, promptTokens DESC, requests DESC, maxPromptTokens DESC"}
290
+ LIMIT ?`,[...g.params,3e4,5e4,7e4,3e4,3e4,f])||[]).map(a=>(function(a={},b={}){let c=ae(a.requests,0),d=ae(a.promptTokens,0),e=ae(a.completionTokens,0),f=ae(a.totalTokens,d+e);return{key:ac(a.key||a.groupKey)||"unknown",label:ac(a.label||a.groupLabel||a.key||a.groupKey)||"unknown",requests:c,promptTokens:d,completionTokens:e,totalTokens:f,cost:ae(a.cost,0),avgPromptTokens:c?d/c:0,avgCompletionTokens:c?e/c:0,avgTokens:c?f/c:0,p95PromptTokens:ae(a.p95PromptTokens,0),maxPromptTokens:ae(a.maxPromptTokens,0),p95TotalTokens:ae(a.p95TotalTokens,0),maxTotalTokens:ae(a.maxTotalTokens,0),longInputRequests:ae(a.longInputRequests,0),hugeInputRequests:ae(a.hugeInputRequests,0),extremeInputRequests:ae(a.extremeInputRequests,0),heavyRequests:ae(a.heavyRequests,0),longInputRate:c?ae(a.longInputRequests,0)/c:0,hugeInputRate:c?ae(a.hugeInputRequests,0)/c:0,extremeInputRate:c?ae(a.extremeInputRequests,0)/c:0,heavyRequestRate:c?ae(a.heavyRequests,0)/c:0,apiKeyCount:ae(a.apiKeyCount,0),sourceIpCount:ae(a.sourceIpCount,0),sourceToolCount:ae(a.sourceToolCount,0),modelCount:ae(a.modelCount,0),providerCount:ae(a.providerCount,0),lastSeen:a.lastSeen||"",...b}})(a,{apiKeyName:ac(a.apiKeyName),apiKeyOwner:ac(a.apiKeyOwner),apiKeyFingerprint:ac(a.apiKeyFingerprint),primaryClientIp:ac(a.primaryClientIp),primarySourceTool:ac(a.primarySourceTool)}))}catch(a){return console.error(`[analytics] Failed to build top ${d} ${e} consumers:`,a?.message||a),[]}}async function aX(a,b,c){return await aW(a,b,c,{dimension:"apiKey",order:"tokens",limit:25})}async function aY(a,b,c){return await aW(a,b,c,{dimension:"sourceIp",order:"tokens",limit:25})}async function aZ(a,b,c){return await aW(a,b,c,{dimension:"sourceIp",order:"heavy",limit:25})}async function a$(a,b,c,d=new Map){let e=aB(b,c),f=await aU(a,b,c,"model",d),g=await aU(a,b,c,"provider",d),h=await aU(a,b,c,"endpoint",d),i=await aU(a,b,c,"clientIpNormalized",d),j=await aU(a,b,c,"sourceTool",d);try{return(await a.all(`WITH base AS (
291
+ SELECT
292
+ ${aR} AS clientKey,
293
+ ${aS} AS clientLabel,
272
294
  COALESCE(NULLIF(apiKeyOwner, ''), '') AS ownerUser,
273
295
  COALESCE(NULLIF(apiKeyName, ''), '') AS apiKeyName,
274
296
  COALESCE(NULLIF(apiKeyFingerprint, ''), '') AS apiKeyFingerprint,
@@ -332,27 +354,27 @@
332
354
  FROM ranked
333
355
  GROUP BY clientKey
334
356
  ORDER BY promptTokens DESC, totalTokens DESC, requests DESC
335
- LIMIT ?`,[...e.params,3e4,5e4,7e4,45e3,2e4,25])||[]).map(a=>aH(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
336
- ${aD} AS clientKey,
337
- ${aE} AS clientLabel,
357
+ LIMIT ?`,[...e.params,3e4,5e4,7e4,45e3,2e4,25])||[]).map(a=>aV(a,{topModels:f.get(a.clientKey)||[],topProviders:g.get(a.clientKey)||[],topEndpoints:h.get(a.clientKey)||[],topIps:i.get(a.clientKey)||[],topTools:j.get(a.clientKey)||[]}))}catch(a){return console.error("[analytics] Failed to build top heavy users:",a?.message||a),[]}}async function a_(a,b,c){let d=aq(b,c);try{return(await a.all(`SELECT
358
+ ${aR} AS clientKey,
359
+ ${aS} AS clientLabel,
338
360
  COALESCE(NULLIF(apiKeyOwner, ''), '') AS ownerUser,
339
361
  COALESCE(NULLIF(apiKeyName, ''), '') AS apiKeyName,
340
362
  COALESCE(NULLIF(apiKeyFingerprint, ''), '') AS apiKeyFingerprint,
341
363
  MAX(clientIpNormalized) AS primaryClientIp,
342
364
  MAX(COALESCE(NULLIF(sourceTool, ''), NULLIF(sourceToolLabel, ''))) AS primarySourceTool,
343
- SUM(CASE WHEN ${_} THEN 1 ELSE 0 END) AS requests,
344
- SUM(CASE WHEN ${_} AND ${Z} THEN 1 ELSE 0 END) AS success,
345
- SUM(CASE WHEN ${_} AND NOT ${Z} THEN 1 ELSE 0 END) AS errors,
346
- SUM(CASE WHEN ${_} THEN COALESCE(promptTokens, 0) ELSE 0 END) AS promptTokens,
347
- SUM(CASE WHEN ${_} THEN COALESCE(completionTokens, 0) ELSE 0 END) AS completionTokens,
348
- SUM(CASE WHEN ${_} THEN COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0) ELSE 0 END) AS totalTokens,
365
+ SUM(CASE WHEN ${aa} THEN 1 ELSE 0 END) AS requests,
366
+ SUM(CASE WHEN ${aa} AND ${$} THEN 1 ELSE 0 END) AS success,
367
+ SUM(CASE WHEN ${aa} AND NOT ${$} THEN 1 ELSE 0 END) AS errors,
368
+ SUM(CASE WHEN ${aa} THEN COALESCE(promptTokens, 0) ELSE 0 END) AS promptTokens,
369
+ SUM(CASE WHEN ${aa} THEN COALESCE(completionTokens, 0) ELSE 0 END) AS completionTokens,
370
+ SUM(CASE WHEN ${aa} THEN COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0) ELSE 0 END) AS totalTokens,
349
371
  MAX(timestamp) AS lastSeen
350
372
  FROM usageHistory
351
373
  ${d.clause}
352
- GROUP BY ${aD}
374
+ GROUP BY ${aR}
353
375
  HAVING errors > 0
354
376
  ORDER BY errors DESC, requests DESC
355
- LIMIT ?`,[...d.params,25])||[]).map(a=>aH(a))}catch(a){return console.error("[analytics] Failed to build problem clients:",a?.message||a),[]}}(a,b,c),h=aI(a,b,c,{dimension:"apiKey",order:"tokens",limit:25}),i=aI(a,b,c,{dimension:"sourceIp",order:"tokens",limit:25}),j=aI(a,b,c,{dimension:"sourceIp",order:"heavy",limit:25}),k=function(a,b,c){let d=av(b,c);try{let b=a.all(`WITH base AS (
377
+ LIMIT ?`,[...d.params,25])||[]).map(a=>aV(a))}catch(a){return console.error("[analytics] Failed to build problem clients:",a?.message||a),[]}}async function a0(a,b,c){let d=aB(b,c);try{let b=await a.all(`WITH base AS (
356
378
  SELECT
357
379
  CASE
358
380
  WHEN promptTokens < 2000 THEN 'lt2k'
@@ -410,26 +432,4 @@
410
432
  MIN(CASE WHEN ttftMs > 0 AND ttftRank >= ((cnt * 95 + 99) / 100) THEN ttftMs END) AS p95TtftMs
411
433
  FROM ranked
412
434
  GROUP BY bucketKey, label, sortOrder
413
- 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),l=f[0]||null,m=h[0]||null,n=i[0]||null,o=j[0]||null,p=f.reduce((a,b)=>a+ad(b.totalTokens,0),0),q=ad(d.totalTokens,0),r=l&&q?ad(l.totalTokens,0)/q:0,s=m&&q?ad(m.totalTokens,0)/q:0,t=n&&q?ad(n.totalTokens,0)/q:0,u=k.filter(a=>["30k-50k","50k-70k",">=70k"].includes(a.label)).reduce((a,b)=>a+ad(b.share,0),0),v=k.find(a=>">=70k"===a.label)||null;return{summary:{trackedUsers:f.length,topUserLabel:l?.label||"-",topUserTokens:l?.totalTokens||0,topUserTokenShare:r,topUsersTokenShare:q?p/q:0,topApiKeyLabel:m?.label||"-",topApiKeyTokens:m?.totalTokens||0,topApiKeyTokenShare:s,topSourceIpLabel:n?.label||"-",topSourceIpTokens:n?.totalTokens||0,topSourceIpTokenShare:t,topSourceIpHeavyLabel:o?.label||"-",topSourceIpHeavyRequests:o?.heavyRequests||0,longInputBucketShare:u,extremeInputShare:v?.share||0,problemClients:g.length},topHeavyUsers:f,topProblemClients:g,topApiKeysByTokens:h,topSourceIpsByTokens:i,topSourceIpsByHeavyRequests:j,inputBuckets:k}}(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
414
- ((CAST(strftime('%s', timestamp) AS INTEGER) / ?) * ?) AS bucketSec,
415
- ${aa}
416
- FROM usageHistory
417
- ${l.clause}
418
- GROUP BY bucketSec
419
- HAVING bucketSec IS NOT NULL
420
- 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
421
- FROM usageHistory
422
- ${y.clause}
423
- ORDER BY timestamp DESC
424
- 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
425
- FROM usageHistory
426
- ${z.clause}
427
- ORDER BY (COALESCE(promptTokens, 0) + COALESCE(completionTokens, 0)) DESC, timestamp DESC
428
- 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
429
- FROM usageHistory
430
- ${f.clause}
431
- ORDER BY latencyMs DESC
432
- 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
433
- FROM usageHistory
434
- ${d} (apiKey IS NULL OR apiKey = '')
435
- 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, top API key/IP d\xf9ng nhiều token nhất, top IP c\xf3 nhiều request nặng, 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.5-token-consumer-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 aL=c(9588);let aM="force-dynamic",aN=["period","dateFrom","dateTo","provider","model","connectionId","status","endpoint","apiKey","clientIp","sourceIp","sourceTool","sessionId","keyword","maxPromptLogRows"];async function aO(a){try{let{response:b}=await (0,aL.hH)({allowMonitorAdmin:!0});if(b)return b;let{searchParams:c}=new URL(a.url),d=function(a){let b={};for(let c of aN){let d=a.get(c);null!==d&&""!==String(d).trim()&&(b[c]=d)}return b}(c),e=await aK(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||[]],["clientTopApiKeysByTokens",a.clientRequests?.topApiKeysByTokens||[]],["clientTopSourceIpsByTokens",a.clientRequests?.topSourceIpsByTokens||[]],["clientTopSourceIpsByHeavyRequests",a.clientRequests?.topSourceIpsByHeavyRequests||[]],["clientProblemClients",a.clientRequests?.topProblemClients||[]],["inputBuckets",a.clientRequests?.inputBuckets||[]]]))for(let a of d||[])b.push([c,a.key||"",a.label||a.name||"",a.requests||0,a.success||0,a.errors||0,a.errorRate||0,a.promptTokens||0,a.completionTokens||0,a.totalTokens||0,a.cost||0,a.lastSeen||""]);return b})(e).map(a=>a.map(aJ).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 aP=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:aQ,workUnitAsyncStorage:aR,serverHooks:aS}=aP;function aT(){return(0,g.patchFetch)({workAsyncStorage:aQ,workUnitAsyncStorage:aR})}async function aU(a,b,c){c.requestMeta&&(0,h.setRequestMeta)(a,c.requestMeta),aP.isDev&&(0,h.addRequestMeta)(a,"devRequestTimingInternalsEnd",process.hrtime.bigint());let d="/api/dashboard/analytics/route";"/index"===d&&(d="/");let e=await aP.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||aP.isDev||z||(K="/index"===(K=E)?"/":K);let L=!0===aP.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 aP.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)=>aP.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=>aP.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 aP.onRequestError(a,b,{routerKind:"App Router",routePath:d,routeType:"route",revalidateReason:(0,o.c)({isStaticGeneration:M,isOnDemandRevalidate:C})},!1,B),b}},k=await aP.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 aP.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})();
435
+ ORDER BY sortOrder ASC`,d.params)||[],c=b.reduce((a,b)=>a+ae(b.requests,0),0);return b.map(a=>({key:a.key,label:a.label,requests:ae(a.requests,0),share:c?ae(a.requests,0)/c:0,promptTokens:ae(a.promptTokens,0),completionTokens:ae(a.completionTokens,0),totalTokens:ae(a.totalTokens,0),avgPromptTokens:ae(a.avgPromptTokens,0),maxPromptTokens:ae(a.maxPromptTokens,0),avgLatencyMs:ae(a.avgLatencyMs,null),p95LatencyMs:ae(a.p95LatencyMs,null),maxLatencyMs:ae(a.maxLatencyMs,null),avgTtftMs:ae(a.avgTtftMs,null),p95TtftMs:ae(a.p95TtftMs,null)}))}catch(a){return console.error("[analytics] Failed to build input size buckets:",a?.message||a),[]}}async function a1(a,b,c,d={},e=new Map){let f=await a$(a,b,c,e),g=await a_(a,b,c),h=await aX(a,b,c),i=await aY(a,b,c),j=await aZ(a,b,c),k=await a0(a,b,c),l=f[0]||null,m=h[0]||null,n=i[0]||null,o=j[0]||null,p=f.reduce((a,b)=>a+ae(b.totalTokens,0),0),q=ae(d.totalTokens,0),r=l&&q?ae(l.totalTokens,0)/q:0,s=m&&q?ae(m.totalTokens,0)/q:0,t=n&&q?ae(n.totalTokens,0)/q:0,u=k.filter(a=>["30k-50k","50k-70k",">=70k"].includes(a.label)).reduce((a,b)=>a+ae(b.share,0),0),v=k.find(a=>">=70k"===a.label)||null;return{summary:{trackedUsers:f.length,topUserLabel:l?.label||"-",topUserTokens:l?.totalTokens||0,topUserTokenShare:r,topUsersTokenShare:q?p/q:0,topApiKeyLabel:m?.label||"-",topApiKeyTokens:m?.totalTokens||0,topApiKeyTokenShare:s,topSourceIpLabel:n?.label||"-",topSourceIpTokens:n?.totalTokens||0,topSourceIpTokenShare:t,topSourceIpHeavyLabel:o?.label||"-",topSourceIpHeavyRequests:o?.heavyRequests||0,longInputBucketShare:u,extremeInputShare:v?.share||0,problemClients:g.length},topHeavyUsers:f,topProblemClients:g,topApiKeysByTokens:h,topSourceIpsByTokens:i,topSourceIpsByHeavyRequests:j,inputBuckets:k}}function a2(a){let b=String(a??"");return/[",\n\r]/.test(b)?`"${b.replace(/"/g,'""')}"`:b}async function a3(a={}){let b=JSON.stringify(ak(a)),c=(global._dashboardAnalyticsV2Cache||(global._dashboardAnalyticsV2Cache=new Map),global._dashboardAnalyticsV2Cache),d=c.get(b);if(d&&Date.now()-d.createdAt<15e3)return d.data;let e=ak(a),f=await (0,w.c)(),g=await (0,W.d9)().catch(()=>null),h=g||f,[i,j]=await Promise.all([am(f),an(f)]),k=function(a,b){let c=ad(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=>ad(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}}(e.apiKey,i),l=await as(h,e,k),[m,n]=await Promise.all([U({keyword:e.keyword,model:e.model,sourceTool:e.sourceTool,clientIp:e.clientIp,sessionId:e.sessionId,dateFrom:e.startIso,dateTo:e.endIso}),(0,V.Wl)({keyword:e.keyword,provider:e.provider,model:e.model,connectionId:e.connectionId,endpoint:e.endpoint,apiKey:e.apiKey,status:e.status,sourceTool:e.sourceTool,clientIp:e.clientIp,sessionId:e.sessionId,dateFrom:e.startIso,dateTo:e.endIso})]),o=await at(h,e,k),p=n?.summary||{};o.rawErrorEvents=ae(n?.total,0),o.serverErrorEvents=ae(p.serverImpacting,0),o.gatewayErrorEvents=ae(p.gateway,0),o.upstreamErrorEvents=ae(p.upstream,0),o.clientErrorEvents=ae(p.client,0),o.rateLimitErrorEvents=ae(p.rateLimit,0),o.unknownErrorEvents=ae(p.unknown,0),o.serverErrorRate=o.requests?o.serverErrorEvents/o.requests:0,o.clientErrorRate=o.requests?o.clientErrorEvents/o.requests:0,o.rateLimitErrorRate=o.requests?o.rateLimitErrorEvents/o.requests:0;let q=await ax(h,e,i,j,k);n?.topErrors?.length&&(q.errors=n.topErrors);let r=await aA(h,e,k),s=await aF(h,e,k,o);s.byModel=await aG(h,e,k,j);let t=await a1(h,e,k,o,j),u=await ay(h,e,k,l),v=new Map([...i.byKey.entries(),...i.byFingerprint.entries()]),x=await aJ(h,e,k,v,j),y=await aK(h,e,k,v,j);s.slowestRequests=await aH(h,e,k,v,j),o.userExperienceScore=s.score,o.userExperienceLabel=s.label,o.slowRequestRate=s.slowRequestRate,o.longInputRate=s.longInputRate,o.topHeavyUser=t.summary?.topUserLabel||"",o.topHeavyUserTokenShare=t.summary?.topUserTokenShare||0,o.extremeInputShare=t.summary?.extremeInputShare||0;let z=await aQ(h,e,q,m,i,k,j),A=function({overview:a,groups:b,promptLogStats:c,requestErrorStats:d,experience:e,clientRequests:f}){let g=[],h=d?.summary||{},i=ae(h.serverImpacting,0),j=ae(h.client,0),k=ae(h.rateLimit,0),l=ae(a.serverErrorRate,a.requests?i/a.requests:0),m=ae(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&&ae(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&&ae(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:o,groups:q,promptLogStats:m,requestErrorStats:n,experience:s,clientRequests:t}),B=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, top API key/IP d\xf9ng nhiều token nhất, top IP c\xf3 nhiều request nặng, 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 ${ae(b.serverImpacting,0).toLocaleString("vi-VN")} lỗi được ph\xe2n loại l\xe0 server/provider-impacting v\xe0 ${ae(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}(e,m,k,n,s,t),C={generatedAt:new Date().toISOString(),analyticsVersion:"v3.5-token-consumer-monitor",filters:{period:e.period,startIso:e.startIso,endIso:e.endIso,provider:e.provider,model:e.model,connectionId:e.connectionId,status:e.status,endpoint:e.endpoint,apiKey:e.apiKey,clientIp:e.clientIp,sourceTool:e.sourceTool,sessionId:e.sessionId,keyword:e.keyword},overview:o,latency:r,experience:s,clientRequests:t,timeSeries:u,groups:q,promptLogs:m,requestErrors:n,anomalies:A,recentUsage:x,heavyRequests:y,options:z,qualityNotes:B};if(g?.close&&await g.close().catch(()=>{}),c.set(b,{createdAt:Date.now(),data:C}),c.size>100){for(let[a,b]of c)if(Date.now()-b.createdAt>15e3&&c.delete(a),c.size<=100)break}return C}var a4=c(9588);let a5="force-dynamic",a6=["period","dateFrom","dateTo","provider","model","connectionId","status","endpoint","apiKey","clientIp","sourceIp","sourceTool","sessionId","keyword","maxPromptLogRows"];async function a7(a){try{let{response:b}=await (0,a4.hH)({allowMonitorAdmin:!0});if(b)return b;let{searchParams:c}=new URL(a.url),d=function(a){let b={};for(let c of a6){let d=a.get(c);null!==d&&""!==String(d).trim()&&(b[c]=d)}return b}(c),e=await a3(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||[]],["clientTopApiKeysByTokens",a.clientRequests?.topApiKeysByTokens||[]],["clientTopSourceIpsByTokens",a.clientRequests?.topSourceIpsByTokens||[]],["clientTopSourceIpsByHeavyRequests",a.clientRequests?.topSourceIpsByHeavyRequests||[]],["clientProblemClients",a.clientRequests?.topProblemClients||[]],["inputBuckets",a.clientRequests?.inputBuckets||[]]]))for(let a of d||[])b.push([c,a.key||"",a.label||a.name||"",a.requests||0,a.success||0,a.errors||0,a.errorRate||0,a.promptTokens||0,a.completionTokens||0,a.totalTokens||0,a.cost||0,a.lastSeen||""]);return b})(e).map(a=>a.map(a2).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 a8=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:a9,workUnitAsyncStorage:ba,serverHooks:bb}=a8;function bc(){return(0,g.patchFetch)({workAsyncStorage:a9,workUnitAsyncStorage:ba})}async function bd(a,b,c){c.requestMeta&&(0,h.setRequestMeta)(a,c.requestMeta),a8.isDev&&(0,h.addRequestMeta)(a,"devRequestTimingInternalsEnd",process.hrtime.bigint());let d="/api/dashboard/analytics/route";"/index"===d&&(d="/");let e=await a8.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||a8.isDev||z||(K="/index"===(K=E)?"/":K);let L=!0===a8.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 a8.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)=>a8.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=>a8.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 a8.onRequestError(a,b,{routerKind:"App Router",routePath:d,routeType:"route",revalidateReason:(0,o.c)({isStaticGeneration:M,isOnDemandRevalidate:C})},!1,B),b}},k=await a8.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 a8.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,402,5901,6050],()=>b(b.s=61066));module.exports=c})();