@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
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bluerouter-app",
3
- "version": "2.0.63",
3
+ "version": "2.0.67",
4
4
  "description": "Router web dashboard",
5
5
  "private": false,
6
6
  "scripts": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jheavenknows/bluerouter",
3
- "version": "2.0.63",
3
+ "version": "2.0.67",
4
4
  "description": "Bluerouter CLI - Start and manage Bluerouter server",
5
5
  "bin": {
6
6
  "bluerouter": "./cli.js"
@@ -1,52 +0,0 @@
1
- exports.id=5087,exports.ids=[5087],exports.modules={490:(a,b,c)=>{"use strict";c.d(b,{Bu:()=>m,KS:()=>r,Tr:()=>n,bh:()=>s,is:()=>e,jQ:()=>l});let d=new Map,e=Object.freeze({enabled:!0,requestsPerMinute:20,promptCharsMax:12e4,forceThinkingOff:!0,allowedIpCidrs:[],expiresAt:""}),f=new Set(Object.keys(e));function g(a,b=0){let c=Number(a);return Number.isFinite(c)?Math.max(0,Math.floor(c)):b}function h(a,b=!0){if(null==a||""===a)return b;if("boolean"==typeof a)return a;if("number"==typeof a)return 0!==a;let c=String(a).trim().toLowerCase();return!["false","0","no","off"].includes(c)&&(!!["true","1","yes","on"].includes(c)||b)}function i(a){return a&&"object"==typeof a&&!Array.isArray(a)}function j(a){return Array.isArray(a)?[...new Set(a.map(a=>String(a||"").trim()).filter(Boolean))]:[]}function k(a){return!!i(a)&&Object.keys(a).some(a=>f.has(a))}function l(a={}){if(!k(a))return{};let b=i(a)?a:{};return{enabled:h(b.enabled,e.enabled),requestsPerMinute:g(b.requestsPerMinute,0),promptCharsMax:g(b.promptCharsMax,0),forceThinkingOff:h(b.forceThinkingOff,e.forceThinkingOff),allowedIpCidrs:j(b.allowedIpCidrs),expiresAt:String(b.expiresAt||"").trim()}}function m(a){let b=l(a?.limits||{});return k(b)&&!1!==b.enabled?b:null}function n(a){let b=a?.headers?.get?.("Authorization")||"";return b.startsWith("Bearer ")?b.slice(7).trim():a?.headers?.get?.("x-api-key")?.trim()||null}function o(a,b){return a?.headers?.get?.(b)||a?.headers?.get?.(b.toLowerCase())||""}function p(a){let b=String(a||"").trim().split(".");if(4!==b.length)return null;let c=0;for(let a of b){if(!/^\d+$/.test(a))return null;let b=Number(a);if(b<0||b>255)return null;c=(c<<8)+b}return c>>>0}function q(a){if(null==a)return 0;if("string"==typeof a)return a.length;if("number"==typeof a||"boolean"==typeof a)return String(a).length;if(Array.isArray(a))return a.reduce((a,b)=>a+q(b),0);if("object"==typeof a){let b=0;for(let[c,d]of Object.entries(a))b+=String(c).length,b+=q(d);return b}return String(a).length}function r({request:a,keyRecord:b,body:c}){let e=m(b);if(!e)return{ok:!0,applied:!1};if(!function(a){let b=String(a||"").trim();if(!b)return!0;let c=Date.parse(b);return!Number.isFinite(c)||Date.now()<=c}(e.expiresAt))return{ok:!1,status:403,message:"API key đ\xe3 hết hạn theo policy."};if(!function(a,b){let c,d=j(b);if(0===d.length)return!0;let e=(c=o(a,"x-forwarded-for"))?c.split(",")[0].trim():(o(a,"x-real-ip")||o(a,"cf-connecting-ip")||o(a,"x-client-ip")||"").trim();return!!e&&d.some(a=>(function(a,b){let c=String(b||"").trim();if(!c)return!1;if(!c.includes("/"))return a===c;let[d,e]=c.split("/"),f=Number(e);if(!Number.isInteger(f)||f<0||f>32)return!1;let g=p(a),h=p(d);if(null===g||null===h)return!1;let i=0===f?0:0xffffffff<<32-f>>>0;return(g&i)==(h&i)})(e,a))}(a,e.allowedIpCidrs))return{ok:!1,status:403,message:"API key kh\xf4ng được ph\xe9p gọi từ IP hiện tại."};let f=g(e.promptCharsMax,0);if(f>0){let a=function(a={}){return q(a.messages||[])+q(a.prompt||"")+q(a.input||"")}(c);if(a>f)return{ok:!1,status:413,message:`Prompt qu\xe1 d\xe0i: ${a} chars, giới hạn của API key l\xe0 ${f} chars.`}}let h=function({keyId:a,policy:b,now:c=Date.now()}){let e=g(b.requestsPerMinute,0);if(e<=0)return{ok:!0};let f=6e4*Math.floor(c/6e4),h=`${a}:minute:${f}`,i=d.get(h)||0;if(i>=e){let a=Math.max(1,Math.ceil((f+6e4-c)/1e3));return{ok:!1,status:429,message:`API key vượt giới hạn ${e} request/ph\xfat. Thử lại sau ${a}s.`,headers:{"Retry-After":String(a)}}}if(d.set(h,i+1),d.size>1e4){let a=c-6e5;for(let b of d.keys()){let c=Number(b.split(":").pop());Number.isFinite(c)&&c<a&&d.delete(b)}}return{ok:!0}}({keyId:b?.id||b?.key||"unknown",policy:e});return h.ok?{ok:!0,applied:!0}:h}function s(a){let b={"Access-Control-Allow-Origin":"*","Content-Type":"application/json",...a?.headers||{}};return new Response(JSON.stringify({error:{message:a?.message||"API key policy rejected this request.",type:"api_key_policy_error"}}),{status:a?.status||403,headers:b})}},644:(a,b,c)=>{"use strict";function d(a,b=null){if(null==a)return b;if("string"!=typeof a)return a;try{return JSON.parse(a)}catch{return b}}function e(a){return JSON.stringify(a??null)}c.d(b,{q:()=>d,s:()=>e})},5781:(a,b,c)=>{"use strict";c.d(b,{Mc:()=>k,fK:()=>o,getProviderConnections:()=>j,iE:()=>m,op:()=>p,rj:()=>n});var d=c(94755),e=c(36366),f=c(644);let g=["displayName","email","globalPriority","defaultModel","accessToken","refreshToken","expiresAt","tokenType","scope","projectId","apiKey","testStatus","lastTested","lastError","lastErrorAt","rateLimitedUntil","expiresIn","errorCode","consecutiveUseCount","schedule","healthCheck","healthStatus","healthConsecutiveFailures","healthConsecutiveSuccesses","healthLastCheckedAt","healthLastOkAt","healthLastError","healthLastLatencyMs","healthLastRecoveredAt"];function h(a){return a?{...(0,f.q)(a.data,{}),id:a.id,provider:a.provider,authType:a.authType,name:a.name,email:a.email,priority:a.priority,isActive:1===a.isActive||!0===a.isActive,createdAt:a.createdAt,updatedAt:a.updatedAt}:null}function i(a,b){let c=function(a){let{id:b,provider:c,authType:d,name:e,email:g,priority:h,isActive:i,createdAt:j,updatedAt:k,...l}=a;return{id:b,provider:c,authType:d,name:e??null,email:g??null,priority:h??null,isActive:+(!1!==i),data:(0,f.s)(l),createdAt:j,updatedAt:k}}(b);a.run(`INSERT INTO providerConnections(id, provider, authType, name, email, priority, isActive, data, createdAt, updatedAt)
2
- VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
3
- ON CONFLICT(id) DO UPDATE SET
4
- provider=excluded.provider, authType=excluded.authType, name=excluded.name,
5
- email=excluded.email, priority=excluded.priority, isActive=excluded.isActive,
6
- data=excluded.data, updatedAt=excluded.updatedAt`,[c.id,c.provider,c.authType,c.name,c.email,c.priority,c.isActive,c.data,c.createdAt,c.updatedAt])}async function j(a={}){let b=await (0,e.c)(),c=[],d=[];a.provider&&(c.push("provider = ?"),d.push(a.provider)),void 0!==a.isActive&&(c.push("isActive = ?"),d.push(+!!a.isActive));let f=`SELECT * FROM providerConnections${c.length?` WHERE ${c.join(" AND ")}`:""}`,g=b.all(f,d).map(h);return g.sort((a,b)=>(a.priority||999)-(b.priority||999)),g}async function k(a){return h((await (0,e.c)()).get("SELECT * FROM providerConnections WHERE id = ?",[a]))}function l(a,b){let c=a.all("SELECT * FROM providerConnections WHERE provider = ?",[b]).map(h);c.sort((a,b)=>{let c=(a.priority||0)-(b.priority||0);return 0!==c?c:new Date(b.updatedAt||0)-new Date(a.updatedAt||0)}),c.forEach((b,c)=>{a.run("UPDATE providerConnections SET priority = ? WHERE id = ?",[c+1,b.id])})}async function m(a){let b,c=await (0,e.c)(),f=new Date().toISOString();return c.transaction(()=>{let e=c.all("SELECT * FROM providerConnections WHERE provider = ?",[a.provider]).map(h),j=null;if("oauth"===a.authType&&a.email){let b=a.providerSpecificData?.chatgptAccountId;j=e.find(c=>{if("oauth"!==c.authType||c.email!==a.email)return!1;let d=c.providerSpecificData?.chatgptAccountId;return!b||!d||b===d})}else"apikey"===a.authType&&a.name&&(j=e.find(b=>"apikey"===b.authType&&b.name===a.name));if(j){let d={...j,...a,updatedAt:f};i(c,d),b=d;return}let k=a.name||null;k||"oauth"!==a.authType&&"access_token"!==a.authType||(k=a.email||`Account ${e.length+1}`);let m=a.priority;m||(m=e.reduce((a,b)=>Math.max(a,b.priority||0),0)+1);let n={id:(0,d.A)(),provider:a.provider,authType:a.authType||"oauth",name:k,priority:m,isActive:void 0===a.isActive||a.isActive,createdAt:f,updatedAt:f};for(let b of g)void 0!==a[b]&&null!==a[b]&&(n[b]=a[b]);a.providerSpecificData&&Object.keys(a.providerSpecificData).length>0&&(n.providerSpecificData=a.providerSpecificData),void 0!==a.email&&(n.email=a.email),i(c,n),l(c,a.provider),b=n}),b}async function n(a,b){let c,d=await (0,e.c)();return d.transaction(()=>{let e=d.get("SELECT * FROM providerConnections WHERE id = ?",[a]);if(!e){c=null;return}let f=h(e),g={...f,...b,updatedAt:new Date().toISOString()};i(d,g),void 0!==b.priority&&l(d,f.provider),c=g}),c}async function o(a){let b=await (0,e.c)(),c=!1;return b.transaction(()=>{let d=b.get("SELECT provider FROM providerConnections WHERE id = ?",[a]);d&&(b.run("DELETE FROM providerConnections WHERE id = ?",[a]),l(b,d.provider),c=!0)}),c}async function p(a){let b=await (0,e.c)(),c=b.get("SELECT COUNT(*) AS n FROM providerConnections WHERE provider = ?",[a]);return b.run("DELETE FROM providerConnections WHERE provider = ?",[a]),c?.n||0}},9460:(a,b,c)=>{"use strict";c.d(b,{L9:()=>r,OM:()=>j,S8:()=>o,fv:()=>l,getMitmAlias:()=>q,o5:()=>k,uL:()=>p,uv:()=>n});var d=c(36366),e=c(644),f=c(22846);let g=(0,f.U)("modelAliases"),h=(0,f.U)("customModels"),i=(0,f.U)("mitmAlias");async function j(){return await g.getAll()}async function k(a,b){await g.set(a,b)}async function l(a){await g.remove(a)}function m(a,b,c){return`${a}|${b}|${c}`}async function n(){return Object.values(await h.getAll())}async function o({providerAlias:a,id:b,type:c="llm",name:f}){let g=m(a,b,c),h=await (0,d.c)(),i=!1;return h.transaction(()=>{if(h.get("SELECT 1 FROM kv WHERE scope = 'customModels' AND key = ?",[g]))return;let d=(0,e.s)({providerAlias:a,id:b,type:c,name:f||b});h.run("INSERT INTO kv(scope, key, value) VALUES('customModels', ?, ?)",[g,d]),i=!0}),i}async function p({providerAlias:a,id:b,type:c="llm"}){await h.remove(m(a,b,c))}async function q(a){return a?await i.get(a)||{}:await i.getAll()}async function r(a,b){await i.set(a,b||{})}},22846:(a,b,c)=>{"use strict";c.d(b,{U:()=>f});var d=c(36366),e=c(644);function f(a){return{async get(b,c=null){let f=(await (0,d.c)()).get("SELECT value FROM kv WHERE scope = ? AND key = ?",[a,b]);return f?(0,e.q)(f.value,c):c},async getAll(){let b=(await (0,d.c)()).all("SELECT key, value FROM kv WHERE scope = ?",[a]),c={};for(let a of b)c[a.key]=(0,e.q)(a.value);return c},async set(b,c){(await (0,d.c)()).run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[a,b,(0,e.s)(c)])},async setMany(b){let c=await (0,d.c)();c.transaction(()=>{for(let[d,f]of Object.entries(b))c.run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[a,d,(0,e.s)(f)])})},async remove(b){(await (0,d.c)()).run("DELETE FROM kv WHERE scope = ? AND key = ?",[a,b])},async clear(){(await (0,d.c)()).run("DELETE FROM kv WHERE scope = ?",[a])}}}},36366:(a,b,c)=>{"use strict";c.d(b,{c:()=>k});var d=c(95658);global._dbAdapter||(global._dbAdapter={instance:null,initPromise:null,logged:!1});let e=global._dbAdapter;async function f(){if(!process.versions.bun)return null;try{let{createBunSqliteAdapter:a}=await c.e(4739).then(c.bind(c,24739));return await a(d.AL)}catch(a){return console.warn(`[DB] bun:sqlite unavailable: ${a.message}`),null}}async function g(){if(process.versions.bun)return null;try{let{createBetterSqliteAdapter:a}=await c.e(5258).then(c.bind(c,25258));return a(d.AL)}catch(a){return console.warn(`[DB] better-sqlite3 unavailable: ${a.message}`),null}}async function h(){if(process.versions.bun)return null;let[a,b]=process.versions.node.split(".").map(Number);if(a<22||22===a&&b<5)return null;try{let{createNodeSqliteAdapter:a}=await c.e(8520).then(c.bind(c,88520));return await a(d.AL)}catch(a){return console.warn(`[DB] node:sqlite unavailable: ${a.message}`),null}}async function i(){try{let{createSqlJsAdapter:a}=await c.e(3593).then(c.bind(c,53593));return await a(d.AL)}catch(a){return console.warn(`[DB] sql.js unavailable: ${a.message}`),null}}async function j(){(0,d.Jh)();let a=await f();if(a||(a=await g()),a||(a=await h()),a||(a=await i()),!a)throw Error("[DB] No SQLite driver available (bun/better/node/sql.js all failed)");e.logged||(console.log(`[DB] Driver: ${a.driver} | file: ${d.AL}`),e.logged=!0);let{runMigrationOnce:b}=await c.e(3941).then(c.bind(c,43941));return await b(a),a}async function k(){return e.instance?e.instance:(e.initPromise||(e.initPromise=j().then(a=>(e.instance=a,a))),e.initPromise)}},42655:(a,b,c)=>{"use strict";c.d(b,{Xx:()=>j,exportSettings:()=>k,getSettings:()=>i});var d=c(36366),e=c(644);let f={cloudEnabled:!1,tunnelEnabled:!1,tunnelUrl:"",tunnelProvider:"cloudflare",tailscaleEnabled:!1,tailscaleUrl:"",stickyRoundRobinLimit:3,providerStrategies:{},providerSchedules:{},providerHealthChecks:{},comboStrategy:"fallback",comboStickyRoundRobinLimit:1,comboStrategies:{},requireApiKey:!0,requireLogin:!0,tunnelDashboardAccess:!0,authMode:"password",oidcIssuerUrl:"",oidcClientId:"",oidcClientSecret:"",oidcScopes:"openid profile email",oidcLoginLabel:"Sign in with OIDC",ldapMonitorAdminGroupDn:"",enableObservability:!0,observabilityMaxRecords:1e3,observabilityBatchSize:20,observabilityFlushIntervalMs:5e3,observabilityMaxJsonSize:5,outboundProxyEnabled:!1,outboundProxyUrl:"",outboundNoProxy:"",mitmRouterBaseUrl:"http://localhost:20128",dnsToolEnabled:{},rtkEnabled:!0,cavemanEnabled:!1,cavemanLevel:"full",sidebarAdvancedToolsVisible:!0};async function g(){let a=(await (0,d.c)()).get("SELECT data FROM settings WHERE id = 1");return a?(0,e.q)(a.data,{}):{}}function h(a){let b={...f,...a||{}};for(let[a,c]of Object.entries(f))void 0===b[a]&&("outboundProxyEnabled"===a&&"string"==typeof b.outboundProxyUrl&&b.outboundProxyUrl.trim()?b[a]=!0:b[a]=c);return b.requireApiKey=!0,b.requireLogin=!0,b}async function i(){return h(await g())}async function j(a){let b,c=await (0,d.c)();return c.transaction(()=>{let d=c.get("SELECT data FROM settings WHERE id = 1");b={...d?(0,e.q)(d.data,{}):{},...a,requireApiKey:!0,requireLogin:!0},c.run("INSERT INTO settings(id, data) VALUES(1, ?) ON CONFLICT(id) DO UPDATE SET data = excluded.data",[(0,e.s)(b)])}),h(b)}async function k(){return await g()}},49120:(a,b,c)=>{"use strict";c.r(b),c.d(b,{DATA_DIR:()=>m,getDataDir:()=>l});var d=c(73024),e=c.n(d),f=c(33873),g=c.n(f),h=c(21820),i=c.n(h);let j="bluerouter";function k(){return"win32"===process.platform?g().join(process.env.APPDATA||g().join(i().homedir(),"AppData","Roaming"),j):g().join(i().homedir(),`.${j}`)}function l(){let a=process.env.DATA_DIR;if(!a)return k();try{return e().mkdirSync(a,{recursive:!0}),a}catch(b){if(b?.code==="EACCES"||b?.code==="EPERM")return console.warn(`[DATA_DIR] '${a}' not writable → fallback ~/.${j}`),k();throw b}}let m=l()},56403:(a,b,c)=>{"use strict";c.d(b,{S8:()=>E.S8,E5:()=>K.E5,Iq:()=>w.Iq,jd:()=>B,iE:()=>g.iE,i0:()=>m,ZO:()=>t,Lh:()=>w.Lh,CG:()=>D,uL:()=>E.uL,fv:()=>E.fv,fK:()=>g.fK,op:()=>g.op,Pc:()=>o,Yd:()=>v,tm:()=>I,oF:()=>J,zP:()=>W,rg:()=>K.rg,yg:()=>w.yg,mY:()=>w.getApiKeyByKey,PX:()=>w.PX,j$:()=>K.j$,L:()=>z,Dj:()=>A,Uv:()=>y,uv:()=>E.uv,vF:()=>H,c:()=>E.getMitmAlias,OM:()=>E.OM,r4:()=>F.r4,Mc:()=>g.Mc,P:()=>g.getProviderConnections,Qu:()=>l,Fh:()=>k,hr:()=>s,ui:()=>r,Zx:()=>K.Zx,SL:()=>U,mt:()=>f.getSettings,BY:()=>K.BY,K1:()=>X,VT:()=>F.VT,yF:()=>F.yF,ox:()=>T,sZ:()=>K.sZ,L9:()=>E.L9,o5:()=>E.o5,_V:()=>K._V,uw:()=>K.uw,XW:()=>w.XW,oG:()=>C,KJ:()=>F.KJ,rj:()=>g.rj,ho:()=>n,Q_:()=>u,Xx:()=>f.Xx,ek:()=>w.ek});var d=c(36366),e=c(644),f=c(42655),g=c(5781),h=c(94755);function i(a){return a?{...(0,e.q)(a.data,{}),id:a.id,type:a.type,name:a.name,createdAt:a.createdAt,updatedAt:a.updatedAt}:null}function j(a,b){let c=function(a){let{id:b,type:c,name:d,createdAt:f,updatedAt:g,...h}=a;return{id:b,type:c??null,name:d??null,data:(0,e.s)(h),createdAt:f,updatedAt:g}}(b);a.run(`INSERT INTO providerNodes(id, type, name, data, createdAt, updatedAt)
7
- VALUES(?, ?, ?, ?, ?, ?)
8
- ON CONFLICT(id) DO UPDATE SET
9
- type=excluded.type, name=excluded.name, data=excluded.data, updatedAt=excluded.updatedAt`,[c.id,c.type,c.name,c.data,c.createdAt,c.updatedAt])}async function k(a={}){let b=await (0,d.c)(),c=[],e=[];a.type&&(c.push("type = ?"),e.push(a.type));let f=`SELECT * FROM providerNodes${c.length?` WHERE ${c.join(" AND ")}`:""}`;return b.all(f,e).map(i)}async function l(a){return i((await (0,d.c)()).get("SELECT * FROM providerNodes WHERE id = ?",[a]))}async function m(a){let b=await (0,d.c)(),c=new Date().toISOString(),e={id:a.id||(0,h.A)(),type:a.type,name:a.name,prefix:a.prefix,apiType:a.apiType,baseUrl:a.baseUrl,openAICompatibleRuntime:a.openAICompatibleRuntime,createdAt:c,updatedAt:c};return j(b,e),e}async function n(a,b){let c=await (0,d.c)(),e=null;return c.transaction(()=>{let d=c.get("SELECT * FROM providerNodes WHERE id = ?",[a]);if(!d)return;let f={...i(d),...b,updatedAt:new Date().toISOString()};j(c,f),e=f}),e}async function o(a){let b=await (0,d.c)(),c=null;return b.transaction(()=>{let d=b.get("SELECT * FROM providerNodes WHERE id = ?",[a]);d&&(c=i(d),b.run("DELETE FROM providerNodes WHERE id = ?",[a]))}),c}function p(a){return a?{...(0,e.q)(a.data,{}),id:a.id,isActive:1===a.isActive||!0===a.isActive,testStatus:a.testStatus,createdAt:a.createdAt,updatedAt:a.updatedAt}:null}function q(a,b){let c=function(a){let{id:b,isActive:c,testStatus:d,createdAt:f,updatedAt:g,...h}=a;return{id:b,isActive:+(!1!==c),testStatus:d??null,data:(0,e.s)(h),createdAt:f,updatedAt:g}}(b);a.run(`INSERT INTO proxyPools(id, isActive, testStatus, data, createdAt, updatedAt)
10
- VALUES(?, ?, ?, ?, ?, ?)
11
- ON CONFLICT(id) DO UPDATE SET
12
- isActive=excluded.isActive, testStatus=excluded.testStatus,
13
- data=excluded.data, updatedAt=excluded.updatedAt`,[c.id,c.isActive,c.testStatus,c.data,c.createdAt,c.updatedAt])}async function r(a={}){let b=await (0,d.c)(),c=[],e=[];void 0!==a.isActive&&(c.push("isActive = ?"),e.push(+!!a.isActive)),a.testStatus&&(c.push("testStatus = ?"),e.push(a.testStatus));let f=`SELECT * FROM proxyPools${c.length?` WHERE ${c.join(" AND ")}`:""}`,g=b.all(f,e).map(p);return g.sort((a,b)=>new Date(b.updatedAt||0)-new Date(a.updatedAt||0)),g}async function s(a){return p((await (0,d.c)()).get("SELECT * FROM proxyPools WHERE id = ?",[a]))}async function t(a){let b=await (0,d.c)(),c=new Date().toISOString(),e={id:a.id||(0,h.A)(),name:a.name,proxyUrl:a.proxyUrl,noProxy:a.noProxy||"",type:a.type||"http",isActive:void 0===a.isActive||a.isActive,strictProxy:!0===a.strictProxy,testStatus:a.testStatus||"unknown",lastTestedAt:a.lastTestedAt||null,lastError:a.lastError||null,createdAt:c,updatedAt:c};return q(b,e),e}async function u(a,b){let c=await (0,d.c)(),e=null;return c.transaction(()=>{let d=c.get("SELECT * FROM proxyPools WHERE id = ?",[a]);if(!d)return;let f={...p(d),...b,updatedAt:new Date().toISOString()};q(c,f),e=f}),e}async function v(a){let b=await (0,d.c)(),c=null;return b.transaction(()=>{let d=b.get("SELECT * FROM proxyPools WHERE id = ?",[a]);d&&(c=p(d),b.run("DELETE FROM proxyPools WHERE id = ?",[a]))}),c}var w=c(74452);function x(a){return a?{id:a.id,name:a.name,kind:a.kind,models:(0,e.q)(a.models,[]),createdAt:a.createdAt,updatedAt:a.updatedAt}:null}async function y(){return(await (0,d.c)()).all("SELECT * FROM combos ORDER BY createdAt ASC").map(x)}async function z(a){return x((await (0,d.c)()).get("SELECT * FROM combos WHERE id = ?",[a]))}async function A(a){return x((await (0,d.c)()).get("SELECT * FROM combos WHERE name = ?",[a]))}async function B(a){let b=await (0,d.c)(),c=new Date().toISOString(),f={id:(0,h.A)(),name:a.name,kind:a.kind||null,models:a.models||[],createdAt:c,updatedAt:c};return b.run("INSERT INTO combos(id, name, kind, models, createdAt, updatedAt) VALUES(?, ?, ?, ?, ?, ?)",[f.id,f.name,f.kind,(0,e.s)(f.models),f.createdAt,f.updatedAt]),f}async function C(a,b){let c=await (0,d.c)(),f=null;return c.transaction(()=>{let d=c.get("SELECT * FROM combos WHERE id = ?",[a]);if(!d)return;let g={...x(d),...b,updatedAt:new Date().toISOString()};c.run("UPDATE combos SET name = ?, kind = ?, models = ?, updatedAt = ? WHERE id = ?",[g.name,g.kind,(0,e.s)(g.models||[]),g.updatedAt,a]),f=g}),f}async function D(a){let b=(await (0,d.c)()).run("DELETE FROM combos WHERE id = ?",[a]);return(b?.changes??0)>0}var E=c(9460),F=c(97914);let G="disabledModels";async function H(){let a=(await (0,d.c)()).all("SELECT key, value FROM kv WHERE scope = ?",[G]),b={};for(let c of a)b[c.key]=(0,e.q)(c.value,[]);return b}async function I(a,b){if(!a||!Array.isArray(b))return;let c=await (0,d.c)();c.transaction(()=>{let d=c.get("SELECT value FROM kv WHERE scope = ? AND key = ?",[G,a]),f=[...new Set([...d&&(0,e.q)(d.value,[])||[],...b])];c.run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[G,a,(0,e.s)(f)])})}async function J(a,b){if(!a)return;let c=await (0,d.c)();c.transaction(()=>{if(!Array.isArray(b)||0===b.length)return void c.run("DELETE FROM kv WHERE scope = ? AND key = ?",[G,a]);let d=c.get("SELECT value FROM kv WHERE scope = ? AND key = ?",[G,a]),f=d&&(0,e.q)(d.value,[])||[],g=new Set(b),h=f.filter(a=>!g.has(a));0===h.length?c.run("DELETE FROM kv WHERE scope = ? AND key = ?",[G,a]):c.run("INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[G,a,(0,e.s)(h)])})}var K=c(99703);let L=null,M=0;async function N(){if(L&&Date.now()-M<5e3)return L;try{let{getSettings:a}=await Promise.resolve().then(c.bind(c,42655)),b=await a(),d="false"!==process.env.OBSERVABILITY_ENABLED;L={enabled:"boolean"==typeof b.enableObservability?b.enableObservability:d,maxRecords:b.observabilityMaxRecords||parseInt(process.env.OBSERVABILITY_MAX_RECORDS||String(200),10),batchSize:b.observabilityBatchSize||parseInt(process.env.OBSERVABILITY_BATCH_SIZE||String(20),10),flushIntervalMs:b.observabilityFlushIntervalMs||parseInt(process.env.OBSERVABILITY_FLUSH_INTERVAL_MS||String(5e3),10),maxJsonSize:1024*(b.observabilityMaxJsonSize||parseInt(process.env.OBSERVABILITY_MAX_JSON_SIZE||"5",10))}}catch{L={enabled:!1,maxRecords:200,batchSize:20,flushIntervalMs:5e3,maxJsonSize:5120}}return M=Date.now(),L}let O=[],P=null,Q=!1;function R(a,b){let c=JSON.stringify(a||{});return c.length>b?{_truncated:!0,_originalSize:c.length,_preview:c.substring(0,200)}:a||{}}async function S(){if(!Q&&0!==O.length){Q=!0;try{for(;O.length>0;){let a=O.splice(0,O.length),b=await (0,d.c)(),c=await N();b.transaction(()=>{for(let d of a){d.id||(d.id=function(a){let b=new Date().toISOString(),c=Math.random().toString(36).substring(2,8),d=a?a.replace(/[^a-zA-Z0-9-]/g,"-"):"unknown";return`${b}-${c}-${d}`}(d.model)),d.timestamp||(d.timestamp=new Date().toISOString()),d.request?.headers&&(d.request.headers=function(a){if(!a||"object"!=typeof a)return{};let b=["authorization","x-api-key","cookie","token","api-key"],c={...a};for(let a of Object.keys(c))b.some(b=>a.toLowerCase().includes(b))&&delete c[a];return c}(d.request.headers));let a={id:d.id,provider:d.provider||null,model:d.model||null,connectionId:d.connectionId||null,timestamp:d.timestamp,status:d.status||null,latency:d.latency||{},tokens:d.tokens||{},request:R(d.request,c.maxJsonSize),providerRequest:R(d.providerRequest,c.maxJsonSize),providerResponse:R(d.providerResponse,c.maxJsonSize),response:R(d.response,c.maxJsonSize)};b.run("INSERT INTO requestDetails(id, timestamp, provider, model, connectionId, status, data) VALUES(?, ?, ?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET timestamp = excluded.timestamp, provider = excluded.provider, model = excluded.model, connectionId = excluded.connectionId, status = excluded.status, data = excluded.data",[a.id,a.timestamp,a.provider,a.model,a.connectionId,a.status,(0,e.s)(a)])}let d=b.get("SELECT COUNT(*) as c FROM requestDetails");d&&d.c>c.maxRecords&&b.run("DELETE FROM requestDetails WHERE id IN (SELECT id FROM requestDetails ORDER BY timestamp ASC LIMIT ?)",[d.c-c.maxRecords])})}}catch(a){console.error("[requestDetailsRepo] Batch write failed:",a)}finally{Q=!1}}}async function T(a){let b=await N();b.enabled&&(O.push(a),O.length>=b.batchSize?(P&&(clearTimeout(P),P=null),S().catch(a=>console.error("[requestDetailsRepo] flush err:",a))):P||(P=setTimeout(()=>{P=null,S().catch(()=>{})},b.flushIntervalMs)))}async function U(a={}){let b=await (0,d.c)(),c=[],f=[];a.provider&&(c.push("provider = ?"),f.push(a.provider)),a.model&&(c.push("model = ?"),f.push(a.model)),a.connectionId&&(c.push("connectionId = ?"),f.push(a.connectionId)),a.status&&(c.push("status = ?"),f.push(a.status)),a.startDate&&(c.push("timestamp >= ?"),f.push(new Date(a.startDate).toISOString())),a.endDate&&(c.push("timestamp <= ?"),f.push(new Date(a.endDate).toISOString()));let g=c.length?`WHERE ${c.join(" AND ")}`:"",h=b.get(`SELECT COUNT(*) as c FROM requestDetails ${g}`,f),i=h?h.c:0,j=a.page||1,k=a.pageSize||50,l=Math.ceil(i/k);return{details:b.all(`SELECT data FROM requestDetails ${g} ORDER BY timestamp DESC LIMIT ? OFFSET ?`,[...f,k,(j-1)*k]).map(a=>(0,e.q)(a.data,{})),pagination:{page:j,pageSize:k,totalItems:i,totalPages:l,hasNext:j<l,hasPrev:j>1}}}let V=async()=>{P&&(clearTimeout(P),P=null),O.length>0&&await S()};async function W(){let a=await (0,d.c)(),{exportSettings:b}=await Promise.resolve().then(c.bind(c,42655)),f={settings:await b(),providerConnections:a.all("SELECT * FROM providerConnections").map(a=>({...(0,e.q)(a.data,{}),id:a.id,provider:a.provider,authType:a.authType,name:a.name,email:a.email,priority:a.priority,isActive:1===a.isActive,createdAt:a.createdAt,updatedAt:a.updatedAt})),providerNodes:a.all("SELECT * FROM providerNodes").map(a=>({...(0,e.q)(a.data,{}),id:a.id,type:a.type,name:a.name,createdAt:a.createdAt,updatedAt:a.updatedAt})),proxyPools:a.all("SELECT * FROM proxyPools").map(a=>({...(0,e.q)(a.data,{}),id:a.id,isActive:1===a.isActive,testStatus:a.testStatus,createdAt:a.createdAt,updatedAt:a.updatedAt})),apiKeys:a.all("SELECT * FROM apiKeys").map(a=>({id:a.id,key:a.key,name:a.name,machineId:a.machineId,isActive:1===a.isActive,adminDisabled:1===a.adminDisabled,ownerUser:a.ownerUser||"",createdByUser:a.createdByUser||"",createdAt:a.createdAt,allowedModels:(0,e.q)(a.allowedModels,[]),limits:(0,e.q)(a.limits,{})})),combos:a.all("SELECT * FROM combos").map(a=>({id:a.id,name:a.name,kind:a.kind,models:(0,e.q)(a.models,[]),createdAt:a.createdAt,updatedAt:a.updatedAt})),modelAliases:{},customModels:[],mitmAlias:{},pricing:{}};for(let b of a.all("SELECT key, value FROM kv WHERE scope = 'modelAliases'"))f.modelAliases[b.key]=(0,e.q)(b.value);for(let b of a.all("SELECT key, value FROM kv WHERE scope = 'customModels'"))f.customModels.push((0,e.q)(b.value));for(let b of a.all("SELECT key, value FROM kv WHERE scope = 'mitmAlias'"))f.mitmAlias[b.key]=(0,e.q)(b.value);for(let b of a.all("SELECT key, value FROM kv WHERE scope = 'pricing'"))f.pricing[b.key]=(0,e.q)(b.value);return f}async function X(a){if(!a||"object"!=typeof a||Array.isArray(a))throw Error("Invalid database payload");let b=await (0,d.c)();return b.transaction(()=>{for(let c of(b.run("DELETE FROM settings"),b.run("DELETE FROM providerConnections"),b.run("DELETE FROM providerNodes"),b.run("DELETE FROM proxyPools"),b.run("DELETE FROM apiKeys"),b.run("DELETE FROM combos"),b.run("DELETE FROM kv WHERE scope IN ('modelAliases', 'customModels', 'mitmAlias', 'pricing')"),a.settings&&b.run(`INSERT INTO settings(id, data) VALUES(1, ?)
14
- ON CONFLICT(id) DO UPDATE SET data = excluded.data`,[(0,e.s)(a.settings)]),a.providerConnections||[])){let{id:a,provider:d,authType:f,name:g,email:h,priority:i,isActive:j,createdAt:k,updatedAt:l,...m}=c;b.run(`INSERT OR REPLACE INTO providerConnections(id, provider, authType, name, email, priority, isActive, data, createdAt, updatedAt)
15
- VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[a,d,f||"oauth",g||null,h||null,i||null,+(!1!==j),(0,e.s)(m),k||new Date().toISOString(),l||new Date().toISOString()])}for(let c of a.providerNodes||[]){let{id:a,type:d,name:f,createdAt:g,updatedAt:h,...i}=c;b.run(`INSERT OR REPLACE INTO providerNodes(id, type, name, data, createdAt, updatedAt)
16
- VALUES(?, ?, ?, ?, ?, ?)`,[a,d||null,f||null,(0,e.s)(i),g||new Date().toISOString(),h||new Date().toISOString()])}for(let c of a.proxyPools||[]){let{id:a,isActive:d,testStatus:f,createdAt:g,updatedAt:h,...i}=c;b.run(`INSERT OR REPLACE INTO proxyPools(id, isActive, testStatus, data, createdAt, updatedAt)
17
- VALUES(?, ?, ?, ?, ?, ?)`,[a,+(!1!==d),f||"unknown",(0,e.s)(i),g||new Date().toISOString(),h||new Date().toISOString()])}for(let c of a.apiKeys||[])b.run(`INSERT OR REPLACE INTO apiKeys(id, key, name, machineId, isActive, adminDisabled, createdAt, allowedModels, limits, ownerUser, createdByUser)
18
- VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[c.id,c.key,c.name||null,c.machineId||null,+(!1!==c.isActive),+(!0===c.adminDisabled),c.createdAt||new Date().toISOString(),(0,e.s)(Array.isArray(c.allowedModels)?c.allowedModels:[]),(0,e.s)(c.limits&&"object"==typeof c.limits&&!Array.isArray(c.limits)?c.limits:{}),String(c.ownerUser||"").trim().toLowerCase(),String(c.createdByUser||c.ownerUser||"").trim().toLowerCase()]);for(let c of a.combos||[])b.run(`INSERT OR REPLACE INTO combos(id, name, kind, models, createdAt, updatedAt)
19
- VALUES(?, ?, ?, ?, ?, ?)`,[c.id,c.name,c.kind||null,(0,e.s)(c.models||[]),c.createdAt||new Date().toISOString(),c.updatedAt||new Date().toISOString()]);for(let[c,d]of Object.entries(a.modelAliases||{}))b.run("INSERT OR REPLACE INTO kv(scope, key, value) VALUES('modelAliases', ?, ?)",[c,(0,e.s)(d)]);for(let c of a.customModels||[]){let a=`${c.providerAlias}|${c.id}|${c.type||"llm"}`;b.run("INSERT OR REPLACE INTO kv(scope, key, value) VALUES('customModels', ?, ?)",[a,(0,e.s)(c)])}for(let[c,d]of Object.entries(a.mitmAlias||{}))b.run("INSERT OR REPLACE INTO kv(scope, key, value) VALUES('mitmAlias', ?, ?)",[c,(0,e.s)(d||{})]);for(let[c,d]of Object.entries(a.pricing||{}))b.run("INSERT OR REPLACE INTO kv(scope, key, value) VALUES('pricing', ?, ?)",[c,(0,e.s)(d||{})])}),await W()}process.off("beforeExit",V),process.off("SIGINT",V),process.off("SIGTERM",V),process.off("exit",V),process.on("beforeExit",V),process.on("SIGINT",V),process.on("SIGTERM",V),process.on("exit",V)},62674:(a,b,c)=>{"use strict";function d(a,b,c=null){let e=a.get("SELECT value FROM _meta WHERE key = ?",[b]);return e?e.value:c}function e(a,b,c){a.run("INSERT INTO _meta(key, value) VALUES(?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value",[b,String(c)])}c.d(b,{dy:()=>d,np:()=>e}),c(36366)},74452:(a,b,c)=>{"use strict";c.d(b,{Iq:()=>r,Lh:()=>u,PX:()=>n,Pb:()=>t,XW:()=>s,ek:()=>v,getApiKeyByKey:()=>q,mI:()=>o,yg:()=>p});var d=c(94755),e=c(36366),f=c(644),g=c(490);let h=!1;function i(a){return Array.isArray(a)?[...new Set(a.map(a=>String(a||"").trim()).filter(Boolean))]:[]}function j(a){return String(a||"").trim().toLowerCase()}async function k(a){if(!h)try{let b=a.all("PRAGMA table_info(apiKeys)"),c=new Set(b.map(a=>a.name));c.has("allowedModels")||a.run("ALTER TABLE apiKeys ADD COLUMN allowedModels TEXT DEFAULT '[]'"),c.has("limits")||a.run("ALTER TABLE apiKeys ADD COLUMN limits TEXT DEFAULT '{}'"),c.has("ownerUser")||a.run("ALTER TABLE apiKeys ADD COLUMN ownerUser TEXT DEFAULT ''"),c.has("createdByUser")||a.run("ALTER TABLE apiKeys ADD COLUMN createdByUser TEXT DEFAULT ''"),c.has("adminDisabled")||a.run("ALTER TABLE apiKeys ADD COLUMN adminDisabled INTEGER DEFAULT 0");try{a.run("CREATE INDEX IF NOT EXISTS idx_ak_key ON apiKeys(key)"),a.run("CREATE INDEX IF NOT EXISTS idx_ak_owner ON apiKeys(ownerUser)"),a.run("CREATE INDEX IF NOT EXISTS idx_ak_created_by ON apiKeys(createdByUser)"),a.run("CREATE INDEX IF NOT EXISTS idx_ak_active ON apiKeys(isActive)"),a.run("CREATE INDEX IF NOT EXISTS idx_ak_admin_disabled ON apiKeys(adminDisabled)"),a.run("CREATE INDEX IF NOT EXISTS idx_ak_created_at ON apiKeys(createdAt)")}catch{}h=!0}catch(a){console.log("Could not ensure apiKeys columns:",a?.message||a)}}function l(a={}){let b=[],c=[],d=j(a.ownerUser),e=String(a.search||"").trim().toLowerCase();if(d&&(b.push("(lower(coalesce(ownerUser, '')) = ? OR lower(coalesce(createdByUser, '')) = ?)"),c.push(d,d)),!0===a.isActive?b.push("isActive = 1"):!1===a.isActive&&b.push("(isActive = 0 OR isActive IS NULL)"),e){let a=`%${e}%`;b.push(`(
20
- lower(coalesce(name, '')) LIKE ?
21
- OR lower(coalesce(key, '')) LIKE ?
22
- OR lower(coalesce(id, '')) LIKE ?
23
- OR lower(coalesce(machineId, '')) LIKE ?
24
- OR lower(coalesce(ownerUser, '')) LIKE ?
25
- OR lower(coalesce(createdByUser, '')) LIKE ?
26
- OR lower(coalesce(allowedModels, '')) LIKE ?
27
- )`),c.push(a,a,a,a,a,a,a)}return{where:b.length?`WHERE ${b.join(" AND ")}`:"",params:c}}function m(a){return a?{id:a.id,key:a.key,name:a.name,machineId:a.machineId,isActive:1===a.isActive||!0===a.isActive,adminDisabled:1===a.adminDisabled||!0===a.adminDisabled,allowedModels:i((0,f.q)(a.allowedModels,[])),limits:(0,g.jQ)((0,f.q)(a.limits,{})),ownerUser:j(a.ownerUser),createdByUser:j(a.createdByUser),createdAt:a.createdAt}:null}async function n(a={}){let b,c,d=await (0,e.c)();await k(d);let{where:f,params:g}=l(a),h="desc"===String(a.order||"asc").toLowerCase()?"DESC":"ASC",i=!Number.isFinite(b=Number(a.limit))||b<=0?null:Math.min(500,Math.max(1,Math.floor(b))),j=!Number.isFinite(c=Number(a.offset))||c<=0?0:Math.max(0,Math.floor(c)),o=`SELECT * FROM apiKeys ${f} ORDER BY createdAt ${h}`,p=[...g];return i&&(o+=" LIMIT ? OFFSET ?",p.push(i,j)),(p.length?d.all(o,p):d.all(o)).map(m)}async function o(a={}){let b=await (0,e.c)();await k(b);let{where:c,params:d}=l(a),f=`SELECT COUNT(*) AS count FROM apiKeys ${c}`,g=d.length?b.get(f,d):b.get(f);return Number(g?.count||0)}async function p(a){let b=await (0,e.c)();return await k(b),m(b.get("SELECT * FROM apiKeys WHERE id = ?",[a]))}async function q(a){if(!a)return null;let b=await (0,e.c)();return await k(b),m(b.get("SELECT * FROM apiKeys WHERE key = ?",[a]))}async function r(a,b,h={}){if(!b)throw Error("machineId is required");let l=await (0,e.c)();await k(l);let{generateApiKeyWithMachine:m}=await c.e(6844).then(c.bind(c,86844)),n=m(b),o=j(h.ownerUser||h.createdByUser),p=j(h.createdByUser||o),q={id:(0,d.A)(),name:a,key:n.key,machineId:b,isActive:!0,adminDisabled:!1,allowedModels:i(h.allowedModels),limits:(0,g.jQ)(h.limits||{}),ownerUser:o,createdByUser:p,createdAt:new Date().toISOString()};return l.run("INSERT INTO apiKeys(id, key, name, machineId, isActive, adminDisabled, allowedModels, limits, ownerUser, createdByUser, createdAt) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[q.id,q.key,q.name,q.machineId,1,0,(0,f.s)(q.allowedModels),(0,f.s)(q.limits),q.ownerUser,q.createdByUser,q.createdAt]),q}async function s(a,b={}){let c=await (0,e.c)();await k(c);let d=null;return c.transaction(()=>{let e=c.get("SELECT * FROM apiKeys WHERE id = ?",[a]);if(!e)return;let h={...m(e),...b};Object.prototype.hasOwnProperty.call(b,"allowedModels")&&(h.allowedModels=i(b.allowedModels)),Object.prototype.hasOwnProperty.call(b,"limits")&&(h.limits=(0,g.jQ)(b.limits||{})),Object.prototype.hasOwnProperty.call(b,"ownerUser")&&(h.ownerUser=j(b.ownerUser)),Object.prototype.hasOwnProperty.call(b,"createdByUser")&&(h.createdByUser=j(b.createdByUser)),c.run("UPDATE apiKeys SET key = ?, name = ?, machineId = ?, isActive = ?, adminDisabled = ?, allowedModels = ?, limits = ?, ownerUser = ?, createdByUser = ? WHERE id = ?",[h.key,h.name,h.machineId,+!!h.isActive,+!!h.adminDisabled,(0,f.s)(h.allowedModels||[]),(0,f.s)(h.limits||{}),h.ownerUser||"",h.createdByUser||"",a]),d=h}),d}async function t(a,b){if(!a)return null;if(!b)throw Error("machineId is required");let d=await (0,e.c)();if(await k(d),!d.get("SELECT * FROM apiKeys WHERE id = ?",[a]))return null;let{generateApiKeyWithMachine:f}=await c.e(6844).then(c.bind(c,86844));for(let c=0;c<5;c+=1){let e=f(b);try{return d.run("UPDATE apiKeys SET key = ?, machineId = ? WHERE id = ?",[e.key,b,a]),m(d.get("SELECT * FROM apiKeys WHERE id = ?",[a]))}catch(a){if(String(a?.message||a||"").toLowerCase().includes("unique")&&c<4)continue;throw a}}throw Error("Failed to generate a unique API key")}async function u(a){let b=await (0,e.c)();await k(b);let c=b.run("DELETE FROM apiKeys WHERE id = ?",[a]);return(c?.changes??0)>0}async function v(a){let b=await (0,e.c)();await k(b);let c=b.get("SELECT isActive FROM apiKeys WHERE key = ?",[a]);return!!c&&(1===c.isActive||!0===c.isActive)}},78335:()=>{},95658:(a,b,c)=>{"use strict";c.d(b,{AL:()=>j,HG:()=>i,Jh:()=>m,KQ:()=>k,Or:()=>l});var d=c(76760),e=c.n(d),f=c(73024),g=c.n(f),h=c(49120);let i=e().join(h.DATA_DIR,"db"),j=e().join(i,"data.sqlite"),k=e().join(i,"backups"),l={main:e().join(h.DATA_DIR,"db.json"),usage:e().join(h.DATA_DIR,"usage.json"),disabled:e().join(h.DATA_DIR,"disabledModels.json"),details:e().join(h.DATA_DIR,"request-details.json")};function m(){for(let a of[h.DATA_DIR,i,k])g().existsSync(a)||g().mkdirSync(a,{recursive:!0})}},96487:()=>{},97914:(a,b,c)=>{"use strict";c.d(b,{KJ:()=>l,VT:()=>n,getPricingForModel:()=>k,r4:()=>j,yF:()=>m});var d=c(36366),e=c(644);let f=(0,c(22846).U)("pricing"),g={value:null,expiresAt:0};function h(){g={value:null,expiresAt:0}}async function i(){return await f.getAll()}async function j(){let a=Date.now();if(g.value&&g.expiresAt>a)return g.value;let b=await i(),{PROVIDER_PRICING:d}=await c.e(7341).then(c.bind(c,57341)),e={};for(let[a,c]of Object.entries(d))if(e[a]={...c},b[a])for(let[c,d]of Object.entries(b[a]))e[a][c]=e[a][c]?{...e[a][c],...d}:d;for(let[a,c]of Object.entries(b))if(e[a])for(let[b,d]of Object.entries(c))e[a][b]||(e[a][b]=d);else e[a]={...c};return g={value:e,expiresAt:a+5e3},e}async function k(a,b){if(!b)return null;let d=await i();if(a&&d[a]?.[b])return d[a][b];let{getPricingForModel:e}=await c.e(7341).then(c.bind(c,57341));return e(a,b)}async function l(a){let b=await (0,d.c)();return b.transaction(()=>{for(let[c,d]of Object.entries(a)){let a=b.get("SELECT value FROM kv WHERE scope = 'pricing' AND key = ?",[c]),f={...a&&(0,e.q)(a.value,{})||{}};for(let[a,b]of Object.entries(d))f[a]=b;b.run("INSERT INTO kv(scope, key, value) VALUES('pricing', ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[c,(0,e.s)(f)])}}),h(),await i()}async function m(a,b){if(!a)return await i();let c=await (0,d.c)();return c.transaction(()=>{if(!b)return void c.run("DELETE FROM kv WHERE scope = 'pricing' AND key = ?",[a]);let d=c.get("SELECT value FROM kv WHERE scope = 'pricing' AND key = ?",[a]),f=d&&(0,e.q)(d.value,{})||{};delete f[b],0===Object.keys(f).length?c.run("DELETE FROM kv WHERE scope = 'pricing' AND key = ?",[a]):c.run("INSERT INTO kv(scope, key, value) VALUES('pricing', ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value",[a,(0,e.s)(f)])}),h(),await i()}async function n(){return await f.clear(),h(),{}}},99703:(a,b,c)=>{"use strict";c.d(b,{BY:()=>E,E5:()=>G,Py:()=>C,Zx:()=>H,_V:()=>l,j$:()=>F,rg:()=>B,sZ:()=>D,uw:()=>A});var d=c(94735),e=c(36366),f=c(644);c(62674);global._pendingRequests||(global._pendingRequests={byModel:{},byAccount:{}}),global._lastErrorProvider||(global._lastErrorProvider={provider:"",ts:0}),global._statsEmitter||(global._statsEmitter=new d.EventEmitter,global._statsEmitter.setMaxListeners(50)),global._pendingTimers||(global._pendingTimers={}),global._recentRing||(global._recentRing={items:[],initialized:!1}),global._connectionMapCache||(global._connectionMapCache={map:{},ts:0});let g=global._pendingRequests,h=global._lastErrorProvider,i=global._pendingTimers,j=global._recentRing,k=global._connectionMapCache,l=global._statsEmitter;function m(a){return String(a||"").trim()}function n(a){return m(a).toLowerCase()}function o(a,b=0){let c=Number(a);return Number.isFinite(c)?c:b}function p(a){let b=m(a);return b?b.length<=12?b:`${b.slice(0,8)}...${b.slice(-4)}`:"local-no-key"}function q(a,b){let c=n(a),d=Number(b);return Number.isFinite(d)&&d>=400?c||"error":c||(Number.isFinite(d),"ok")}function r(a){return["pending","running","in_progress","queued","processing"].includes(n(a))}function s(a,b){let c,d=n(a);if(c=n(d),/^(?:error|fail|failed|timeout|network|aborted|abort|rate_limited|provider_error|gateway_error|parse_error|model_error)(?:\b|[\s_-]|$)/.test(c))return!1;let e=Number(b);if(Number.isFinite(e))return e>=200&&e<300;let f=q(a);return!!["ok","success","succeeded","complete","completed","done","200"].includes(f)||/^(?:2\d\d|ok|success|succeeded|complete|completed|done)(?:\b|[\s_-]|$)/.test(f)}function t(a){let b=a?new Date(a):new Date;return`${b.getFullYear()}-${String(b.getMonth()+1).padStart(2,"0")}-${String(b.getDate()).padStart(2,"0")}`}function u(a,b,c){b&&(a[b]||(a[b]={requests:0,promptTokens:0,completionTokens:0,cost:0}),a[b].requests+=c.requests||1,a[b].promptTokens+=c.promptTokens||0,a[b].completionTokens+=c.completionTokens||0,a[b].cost+=c.cost||0,c.meta&&Object.assign(a[b],c.meta))}async function v(){if(Date.now()-k.ts<3e4)return k.map;try{let{getProviderConnections:a}=await Promise.resolve().then(c.bind(c,5781)),b=await a(),d={};for(let a of b)d[a.id]=a.name||a.email||a.id;k.map=d,k.ts=Date.now()}catch{}return k.map}async function w(){if(!j.initialized){j.initialized=!0;try{j.items=(await (0,e.c)()).all(`SELECT timestamp, provider, model, connectionId, apiKey, apiKeyFingerprint, endpoint, cost, status, statusCode, tokens
28
- FROM usageHistory ORDER BY id DESC LIMIT ?`,[50]).reverse().map(a=>({timestamp:a.timestamp,provider:a.provider,model:a.model,connectionId:a.connectionId,apiKey:a.apiKeyFingerprint||a.apiKey,endpoint:a.endpoint,cost:a.cost,status:a.status,statusCode:a.statusCode,tokens:(0,f.q)(a.tokens,{})}))}catch{}}}async function x(a,b,d){if(!d||!a||!b)return 0;try{let{getPricingForModel:e}=await Promise.resolve().then(c.bind(c,97914)),f=await e(a,b);if(!f)return 0;let g=0,h=d.prompt_tokens||d.input_tokens||0,i=d.cached_tokens||d.cache_read_input_tokens||0,j=Math.max(0,h-i);g+=j*(f.input/1e6),i>0&&(g+=i*((f.cached||f.input)/1e6));let k=d.completion_tokens||d.output_tokens||0;g+=k*(f.output/1e6);let l=d.reasoning_tokens||0;l>0&&(g+=l*((f.reasoning||f.output)/1e6));let m=d.cache_creation_input_tokens||0;return m>0&&(g+=m*((f.cache_creation||f.input)/1e6)),g}catch(a){return console.error("Error calculating cost:",a),0}}async function y(a){let b=m(a);if(!b)return{apiKeyId:"",apiKeyFingerprint:"local-no-key",apiKeyName:"Local / kh\xf4ng d\xf9ng API key",apiKeyOwner:""};let d=p(b);try{let{getApiKeyByKey:a}=await Promise.resolve().then(c.bind(c,74452)),e=await a(b);if(e)return{apiKeyId:e.id||"",apiKeyFingerprint:d,apiKeyName:e.name||d,apiKeyOwner:e.ownerUser||e.createdByUser||""}}catch{}return{apiKeyId:"",apiKeyFingerprint:d,apiKeyName:d,apiKeyOwner:""}}function z(a,b,c,d,e,f,g){a.run(`INSERT INTO ${b}(
29
- bucket, dimension, key, requests, success, errors, promptTokens, completionTokens,
30
- totalTokens, cachedTokens, reasoningTokens, cost, lastSeen
31
- ) VALUES(?, ?, ?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?)
32
- ON CONFLICT(bucket, dimension, key) DO UPDATE SET
33
- requests = requests + 1,
34
- success = success + excluded.success,
35
- errors = errors + excluded.errors,
36
- promptTokens = promptTokens + excluded.promptTokens,
37
- completionTokens = completionTokens + excluded.completionTokens,
38
- totalTokens = totalTokens + excluded.totalTokens,
39
- cachedTokens = cachedTokens + excluded.cachedTokens,
40
- reasoningTokens = reasoningTokens + excluded.reasoningTokens,
41
- cost = cost + excluded.cost,
42
- lastSeen = CASE WHEN excluded.lastSeen > COALESCE(lastSeen, '') THEN excluded.lastSeen ELSE lastSeen END`,[c,d,e,+!!g,+!g,f.promptTokens,f.completionTokens,f.totalTokens,f.cachedTokens,f.reasoningTokens,f.cost||0,f.timestamp])}function A(a,b,c,d,e=!1){let f=b?`${a} (${b})`:a,j=`${c}|${f}`;g.byModel[f]||(g.byModel[f]=0),g.byModel[f]=Math.max(0,g.byModel[f]+(d?1:-1)),0===g.byModel[f]&&delete g.byModel[f],c&&(g.byAccount[c]||(g.byAccount[c]={}),g.byAccount[c][f]||(g.byAccount[c][f]=0),g.byAccount[c][f]=Math.max(0,g.byAccount[c][f]+(d?1:-1)),0===g.byAccount[c][f]&&(delete g.byAccount[c][f],0===Object.keys(g.byAccount[c]).length&&delete g.byAccount[c])),d?(clearTimeout(i[j]),i[j]=setTimeout(()=>{delete i[j],g.byModel[f]>0&&(g.byModel[f]=0),c&&g.byAccount[c]?.[f]>0&&(g.byAccount[c][f]=0),l.emit("pending")},6e4)):(clearTimeout(i[j]),delete i[j]),!d&&e&&b&&(h.provider=b.toLowerCase(),h.ts=Date.now()),l.emit("pending")}async function B(){let a=[],b=await v();for(let[c,d]of Object.entries(g.byAccount))for(let[e,f]of Object.entries(d))if(f>0){let d=b[c]||`Account ${c.slice(0,8)}...`,g=e.match(/^(.*) \((.*)\)$/);a.push({model:g?g[1]:e,provider:g?g[2]:"unknown",account:d,count:f})}return await w(),{activeRequests:a,recentRequests:[...j.items].sort((a,b)=>new Date(b.timestamp)-new Date(a.timestamp)).map(a=>{let b=a.tokens||{};return{timestamp:a.timestamp,model:a.model,provider:a.provider||"",promptTokens:b.prompt_tokens||b.input_tokens||0,completionTokens:b.completion_tokens||b.output_tokens||0,status:a.status||"ok"}}).slice(0,20),errorProvider:Date.now()-h.ts<1e4?h.provider:""}}async function C(a={}){try{if(r(a?.status))return null;let b=await (0,e.c)(),c=await y(a.apiKey),d=function(a={},b={}){let c,d=a.timestamp||new Date().toISOString(),e=a.tokens&&"object"==typeof a.tokens?a.tokens:{},f=o(a.promptTokens,e.prompt_tokens??e.input_tokens??0),g=o(a.completionTokens,e.completion_tokens??e.output_tokens??0),h=o(a.cachedTokens,e.cached_tokens??e.cache_read_input_tokens??e.prompt_tokens_details?.cached_tokens??0),i=o(a.reasoningTokens,e.reasoning_tokens??e.completion_tokens_details?.reasoning_tokens??0),j=o(a.totalTokens,f+g),k=null==a.statusCode?null:o(a.statusCode,null),l=q(a.status,k),n=m(a.clientIp||a.sourceIp),r=(c=m(a.clientIpNormalized||n))?c.split(",")[0].trim().replace(/^::ffff:/,""):"",s=a.meta&&"object"==typeof a.meta?a.meta:{};return{timestamp:d,provider:m(a.provider)||"unknown",model:m(a.model)||"unknown",connectionId:m(a.connectionId),apiKey:b.apiKeyFingerprint||p(a.apiKey),apiKeyId:b.apiKeyId||m(a.apiKeyId),apiKeyFingerprint:b.apiKeyFingerprint||m(a.apiKeyFingerprint)||p(a.apiKey),apiKeyName:b.apiKeyName||m(a.apiKeyName),apiKeyOwner:b.apiKeyOwner||m(a.apiKeyOwner),endpoint:m(a.endpoint),requestId:m(a.requestId||s.requestId),sessionId:m(a.sessionId||s.sessionId),clientIp:n,clientIpNormalized:r,clientHost:m(a.clientHost||s.clientHost),clientUserAgent:m(a.clientUserAgent||s.clientUserAgent),sourceTool:m(a.sourceTool||s.sourceTool),sourceToolLabel:m(a.sourceToolLabel||s.sourceToolLabel),sourceHost:m(a.sourceHost||s.sourceHost),latencyMs:o(a.latencyMs??s.latencyMs,0),ttftMs:o(a.ttftMs??s.ttftMs,0),statusCode:k,errorCode:m(a.errorCode||s.errorCode),errorType:m(a.errorType||s.errorType),errorMessageShort:function(a,b=500){let c=m(a).replace(/\s+/g," ");return c.length>b?`${c.slice(0,b-1)}…`:c}(a.errorMessageShort||a.errorMessage||s.errorMessageShort||s.errorMessage),isStreaming:+!!a.isStreaming,isCombo:+!!a.isCombo,comboName:m(a.comboName||s.comboName),promptTokens:f,completionTokens:g,totalTokens:j,cachedTokens:h,reasoningTokens:i,cost:o(a.cost,0),status:l,tokens:{prompt_tokens:f,completion_tokens:g,cached_tokens:h,reasoning_tokens:i},meta:{...s,apiKeyFingerprint:b.apiKeyFingerprint||m(a.apiKeyFingerprint)||p(a.apiKey),apiKeyId:b.apiKeyId||m(a.apiKeyId)}}}(a,c);return d.cost||(d.cost=await x(d.provider,d.model,d.tokens)),b.transaction(()=>{let a,c,e,g,h,i,j,k,l;b.run(`INSERT INTO usageHistory(
43
- timestamp, provider, model, connectionId, apiKey, apiKeyId, apiKeyFingerprint, apiKeyName, apiKeyOwner,
44
- endpoint, requestId, sessionId, clientIp, clientIpNormalized, clientHost, clientUserAgent,
45
- sourceTool, sourceToolLabel, sourceHost, latencyMs, ttftMs, statusCode, errorCode,
46
- errorType, errorMessageShort, isStreaming, isCombo, comboName, promptTokens, completionTokens,
47
- totalTokens, cachedTokens, reasoningTokens, cost, status, tokens, meta
48
- ) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,[d.timestamp,d.provider||null,d.model||null,d.connectionId||null,d.apiKey||null,d.apiKeyId||null,d.apiKeyFingerprint||null,d.apiKeyName||null,d.apiKeyOwner||null,d.endpoint||null,d.requestId||null,d.sessionId||null,d.clientIp||null,d.clientIpNormalized||null,d.clientHost||null,d.clientUserAgent||null,d.sourceTool||null,d.sourceToolLabel||null,d.sourceHost||null,d.latencyMs||0,d.ttftMs||0,d.statusCode,d.errorCode||null,d.errorType||null,d.errorMessageShort||null,+!!d.isStreaming,+!!d.isCombo,d.comboName||null,d.promptTokens||0,d.completionTokens||0,d.totalTokens||0,d.cachedTokens||0,d.reasoningTokens||0,d.cost||0,d.status||"ok",(0,f.s)(d.tokens||{}),(0,f.s)(d.meta||{})]);let m=t(d.timestamp),n=b.get("SELECT data FROM usageDaily WHERE dateKey = ?",[m]),o=n?(0,f.q)(n.data,{}):{requests:0,promptTokens:0,completionTokens:0,cost:0,byProvider:{},byModel:{},byAccount:{},byApiKey:{},byEndpoint:{}};a=d.promptTokens||d.tokens?.prompt_tokens||d.tokens?.input_tokens||0,c=d.completionTokens||d.tokens?.completion_tokens||d.tokens?.output_tokens||0,e=d.cost||0,g={promptTokens:a,completionTokens:c,cost:e},o.requests=(o.requests||0)+1,o.promptTokens=(o.promptTokens||0)+a,o.completionTokens=(o.completionTokens||0)+c,o.cost=(o.cost||0)+e,o.byProvider||={},o.byModel||={},o.byAccount||={},o.byApiKey||={},o.byEndpoint||={},d.provider&&u(o.byProvider,d.provider,g),h=d.provider?`${d.model}|${d.provider}`:d.model,u(o.byModel,h,{...g,meta:{rawModel:d.model,provider:d.provider}}),d.connectionId&&u(o.byAccount,d.connectionId,{...g,meta:{rawModel:d.model,provider:d.provider}}),i=d.apiKeyFingerprint||d.apiKey||"local-no-key",j=`${i}|${d.model}|${d.provider||"unknown"}`,u(o.byApiKey,j,{...g,meta:{rawModel:d.model,provider:d.provider,apiKey:i,apiKeyFingerprint:i,apiKeyId:d.apiKeyId||""}}),k=d.endpoint||"Unknown",l=`${k}|${d.model}|${d.provider||"unknown"}`,u(o.byEndpoint,l,{...g,meta:{endpoint:k,rawModel:d.model,provider:d.provider}}),b.run("INSERT INTO usageDaily(dateKey, data) VALUES(?, ?) ON CONFLICT(dateKey) DO UPDATE SET data = excluded.data",[m,(0,f.s)(o)]),function(a,b){var c;let d,e,f=s(b.status,b.statusCode),g=((d=(c=b.timestamp)?new Date(c):new Date).setMinutes(0,0,0),d.toISOString()),h=t(b.timestamp);for(let[c,d]of(e=[["all","all"],["provider",b.provider||"unknown"],["model",b.model||"unknown"],["providerModel",`${b.provider||"unknown"}|${b.model||"unknown"}`],["connection",b.connectionId||"unknown"],["apiKey",b.apiKeyId||b.apiKeyFingerprint||"local-no-key"],["clientIp",b.clientIpNormalized||"unknown"],["sourceTool",b.sourceTool||b.sourceToolLabel||"unknown"],["session",b.sessionId||"unknown"],["endpoint",b.endpoint||"unknown"],["status",b.status||"unknown"]],b.errorType&&e.push(["errorType",b.errorType]),b.isCombo&&b.comboName&&e.push(["combo",b.comboName]),e.filter(([,a])=>!0)))z(a,"usageHourlyRollup",g,c,d,b,f),z(a,"usageDailyRollup",h,c,d,b,f)}(b,d);let p=b.get("SELECT value FROM _meta WHERE key = 'totalRequestsLifetime'"),q=(p?parseInt(p.value,10):0)+1;b.run("INSERT INTO _meta(key, value) VALUES('totalRequestsLifetime', ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value",[String(q)])}),j.items.push(d),j.items.length>50&&(j.items=j.items.slice(-50)),l.emit("update"),d}catch(a){return console.error("Failed to save request lifecycle:",a),null}}async function D(a){let b=q(a?.status,a?.statusCode);if(r(b))return null;let c=a?.tokens||{},d=c.prompt_tokens??c.input_tokens??a?.promptTokens??0,e=c.completion_tokens??c.output_tokens??a?.completionTokens??0;return(m(a?.status)||a?.statusCode!==void 0&&a?.statusCode!==null)&&!s(b,a?.statusCode)||0!==d||0!==e?C({...a,status:a?.status||"ok"}):null}async function E(a="all"){let b=await (0,e.c)(),c={totalRequests:0,totalPromptTokens:0,totalCompletionTokens:0,totalCost:0,byProvider:{},byModel:{},byAccount:{},byApiKey:{},byEndpoint:{},last10Minutes:[],pending:g,activeRequests:(await B()).activeRequests,recentRequests:(await B()).recentRequests,errorProvider:Date.now()-h.ts<1e4?h.provider:""},d="today"===a?new Date().setHours(0,0,0,0):"24h"===a?Date.now()-864e5:null,f=d?[new Date(d).toISOString()]:[];for(let a of b.all(`SELECT provider, model, connectionId, apiKeyFingerprint, endpoint, COUNT(*) AS requests,
49
- SUM(promptTokens) AS promptTokens, SUM(completionTokens) AS completionTokens, SUM(cost) AS cost, MAX(timestamp) AS lastUsed
50
- FROM usageHistory ${d?"WHERE timestamp >= ?":""}
51
- GROUP BY provider, model, connectionId, apiKeyFingerprint, endpoint`,f))c.totalRequests+=a.requests||0,c.totalPromptTokens+=a.promptTokens||0,c.totalCompletionTokens+=a.completionTokens||0,c.totalCost+=a.cost||0,u(c.byProvider,a.provider||"unknown",{requests:a.requests,promptTokens:a.promptTokens,completionTokens:a.completionTokens,cost:a.cost}),u(c.byModel,`${a.model||"unknown"} (${a.provider||"unknown"})`,{requests:a.requests,promptTokens:a.promptTokens,completionTokens:a.completionTokens,cost:a.cost,meta:{rawModel:a.model,provider:a.provider,lastUsed:a.lastUsed}}),a.connectionId&&u(c.byAccount,a.connectionId,{requests:a.requests,promptTokens:a.promptTokens,completionTokens:a.completionTokens,cost:a.cost,meta:{connectionId:a.connectionId,lastUsed:a.lastUsed}}),u(c.byApiKey,a.apiKeyFingerprint||"local-no-key",{requests:a.requests,promptTokens:a.promptTokens,completionTokens:a.completionTokens,cost:a.cost,meta:{apiKey:a.apiKeyFingerprint||"local-no-key",lastUsed:a.lastUsed}}),u(c.byEndpoint,a.endpoint||"Unknown",{requests:a.requests,promptTokens:a.promptTokens,completionTokens:a.completionTokens,cost:a.cost,meta:{endpoint:a.endpoint||"Unknown",lastUsed:a.lastUsed}});let i=new Date,j=new Date(6e4*Math.floor(i.getTime()/6e4)),k=new Date(j.getTime()-54e4),l={};for(let a=0;a<10;a++){let b=j.getTime()-(9-a)*6e4;l[b]={requests:0,promptTokens:0,completionTokens:0,cost:0},c.last10Minutes.push(l[b])}for(let a of b.all("SELECT timestamp, promptTokens, completionTokens, cost FROM usageHistory WHERE timestamp >= ? AND timestamp <= ?",[k.toISOString(),i.toISOString()])){let b=6e4*Math.floor(new Date(a.timestamp).getTime()/6e4);l[b]&&(l[b].requests++,l[b].promptTokens+=a.promptTokens||0,l[b].completionTokens+=a.completionTokens||0,l[b].cost+=a.cost||0)}return c}async function F(a="7d"){let b=await (0,e.c)(),c=Date.now(),d="today"===a||"24h"===a?24:"7d"===a?7:"30d"===a?30:60,f="today"===a||"24h"===a?36e5:864e5,g="today"===a?new Date(new Date().setHours(0,0,0,0)).getTime():c-d*f,h=b.all("SELECT timestamp, promptTokens, completionTokens, cost FROM usageHistory WHERE timestamp >= ?",[new Date(g).toISOString()]),i=Array.from({length:d},(a,b)=>{let c=g+b*f;return{label:36e5===f?new Date(c).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit",hour12:!1}):new Date(c).toLocaleDateString("en-US",{month:"short",day:"numeric"}),tokens:0,cost:0}});for(let a of h){let b=Math.min(d-1,Math.max(0,Math.floor((new Date(a.timestamp).getTime()-g)/f)));i[b].tokens+=(a.promptTokens||0)+(a.completionTokens||0),i[b].cost+=a.cost||0}return i}async function G(a={}){if(!a||!(a.tokens||a.status||a.error))return null;let b=a.error?"error":a.status||"ok";return r(b)||!a.error&&s(b,a.statusCode)?null:C({provider:a.provider||"unknown",model:a.model||"unknown",connectionId:a.connectionId,endpoint:a.endpoint,tokens:a.tokens||{},status:b,statusCode:a.statusCode,errorMessage:a.error||a.errorMessage,meta:a})}async function H(a=100){return(await (0,e.c)()).all(`SELECT timestamp, provider, model, connectionId, apiKeyFingerprint, endpoint, status, statusCode, errorMessageShort, promptTokens, completionTokens, cost
52
- FROM usageHistory ORDER BY id DESC LIMIT ?`,[Number(a)||100]).map(a=>({...a,apiKey:a.apiKeyFingerprint}))}}};
@@ -1 +0,0 @@
1
- "use strict";exports.id=5742,exports.ids=[5742],exports.modules={89718:(a,b,c)=>{c.d(b,{CG:()=>d.CG,Dj:()=>d.Dj,Fh:()=>d.Fh,Iq:()=>d.Iq,K1:()=>d.K1,KJ:()=>d.KJ,L:()=>d.L,L9:()=>d.L9,Lh:()=>d.Lh,Mc:()=>d.Mc,OM:()=>d.OM,PX:()=>d.PX,Pc:()=>d.Pc,Q_:()=>d.Q_,Qu:()=>d.Qu,S8:()=>d.S8,Uv:()=>d.Uv,VT:()=>d.VT,XW:()=>d.XW,Xx:()=>d.Xx,Yd:()=>d.Yd,ZO:()=>d.ZO,c:()=>d.c,ek:()=>d.ek,fK:()=>d.fK,fv:()=>d.fv,getProviderConnections:()=>d.P,ho:()=>d.ho,hr:()=>d.hr,i0:()=>d.i0,iE:()=>d.iE,jd:()=>d.jd,mY:()=>d.mY,mt:()=>d.mt,o5:()=>d.o5,oG:()=>d.oG,op:()=>d.op,r4:()=>d.r4,uL:()=>d.uL,ui:()=>d.ui,updateProviderConnection:()=>d.rj,uv:()=>d.uv,yF:()=>d.yF,yg:()=>d.yg,zP:()=>d.zP});var d=c(56403)},92825:(a,b,c)=>{c.d(b,{CO:()=>z,Qx:()=>C,cf:()=>D,ih:()=>B,sU:()=>E,uj:()=>A});var d=c(25060);let e="(|(sAMAccountName={{username}})(userPrincipalName={{username}})(mail={{username}}))",f=["dn","cn","displayName","mail","sAMAccountName","userPrincipalName","distinguishedName","memberOf"],g="1.2.840.113556.1.4.1941";function h(a){return String(a||"").trim()}function i(a){return Array.isArray(a)?a.map(a=>h(a)).filter(Boolean):String(a||"").split(/[,\n]/).map(a=>h(a)).filter(Boolean)}function j(a){return[...new Set(a.filter(Boolean))]}function k(a){return String(a||"").trim().toLowerCase()}function l(a){return String(a||"").replace(/[\\*()\u0000]/g,a=>{switch(a){case"\\":return"\\5c";case"*":return"\\2a";case"(":return"\\28";case")":return"\\29";case"\0":return"\\00";default:return a}})}function m(a={}){let b=h(a.ldapUserBaseDn||a.ldapBaseDn);return{enabled:!0===a.ldapEnabled,url:h(a.ldapUrl),bindDn:h(a.ldapBindDn),bindPassword:a.ldapBindPassword||"",baseDn:b,userBaseDn:b,userSearchFilter:h(a.ldapUserSearchFilter)||e,userNameAttribute:h(a.ldapUserNameAttribute)||"sAMAccountName",userDisplayAttribute:h(a.ldapUserDisplayAttribute)||"displayName",userEmailAttribute:h(a.ldapUserEmailAttribute)||"mail",allowedUsers:i(a.ldapAllowedUsers),allowAnyUser:!0===a.ldapAllowAnyUser,loginAllowedGroupDn:h(a.ldapLoginAllowedGroupDn),adminGroupDn:h(a.ldapAdminGroupDn),monitorAdminGroupDn:h(a.ldapMonitorAdminGroupDn),nestedGroups:!1!==a.ldapNestedGroups,tlsRejectUnauthorized:function(a,b=!1){return null==a||""===a?b:!0===a||"true"===a}(a.ldapTlsRejectUnauthorized,!0),connectTimeoutMs:Number(a.ldapConnectTimeoutMs||8e3)}}function n(a,{requirePassword:b=!0}={}){if(!a.enabled)throw Error("LDAP login is disabled.");if(!a.url)throw Error("LDAP URL is required.");if(!a.userBaseDn)throw Error("LDAP User Base DN is required.");if(!a.bindDn)throw Error("LDAP Bind DN is required.");if(b&&!a.bindPassword)throw Error("LDAP Bind password is required.")}async function o(a,b){let c=new d.Kj({url:a.url,timeout:a.connectTimeoutMs,connectTimeout:a.connectTimeoutMs,tlsOptions:{rejectUnauthorized:!1!==a.tlsRejectUnauthorized}});try{return await c.bind(a.bindDn,a.bindPassword||""),await b(c)}finally{try{await c.unbind()}catch{}}}function p(a,b){let c=a?.[b];return Array.isArray(c)?c[0]||"":c||""}function q(a,b){let c=a?.[b];return Array.isArray(c)?c.map(String).filter(Boolean):c?[String(c)]:[]}function r(a,b){let c=b.userNameAttribute||"sAMAccountName",d=b.userDisplayAttribute||"displayName",e=b.userEmailAttribute||"mail",f=p(a,c)||p(a,"sAMAccountName")||p(a,"userPrincipalName")||p(a,"mail")||a.dn;return{dn:a.dn,username:f,displayName:p(a,d)||p(a,"displayName")||p(a,"cn")||f,email:p(a,e)||p(a,"mail")||p(a,"userPrincipalName")||"",userPrincipalName:p(a,"userPrincipalName")||"",sAMAccountName:p(a,"sAMAccountName")||"",memberOf:q(a,"memberOf")}}function s(a,b={}){let c=a.allowedUsers.map(k).filter(Boolean);return 0!==c.length&&(function(a={}){return[a.username,a.email,a.displayName,a.userPrincipalName,a.sAMAccountName,a.dn].map(k).filter(Boolean)})(b).some(a=>c.includes(a))}async function t(a,b,c){var d;let g,i,k=(d=b.userSearchFilter,g=h(d)||e,i=l(c),g.replaceAll("{{username}}",i).replaceAll("{username}",i));return(await a.search(b.userBaseDn,{scope:"sub",filter:k,sizeLimit:1,attributes:j([...f,b.userNameAttribute,b.userDisplayAttribute,b.userEmailAttribute])})).searchEntries[0]||null}async function u(a,b,c,d){if(!b.nestedGroups)return!1;try{let e=`(&(distinguishedName=${l(c)})(memberOf:${g}:=${l(d)}))`;return(await a.search(b.userBaseDn,{scope:"sub",filter:e,sizeLimit:1,attributes:["dn"]})).searchEntries.length>0}catch{return!1}}async function v(a,b){try{let c=(await a.search(b,{scope:"base",filter:"(objectClass=*)",sizeLimit:1,attributes:["member","uniqueMember"]})).searchEntries[0]||{};return j([...q(c,"member"),...q(c,"uniqueMember")])}catch{return[]}}async function w(a,b,c,d){let e=h(d);if(!e)return!1;let f=h(c?.dn);return!!f&&(!!(q(c,"memberOf").map(k).includes(k(e))||await u(a,b,f,e))||(await v(a,e)).map(k).includes(k(f)))}async function x(a,b,c,d){let e=b.userNameAttribute||"sAMAccountName",h=b.userDisplayAttribute||"displayName",i=b.userEmailAttribute||"mail",k=String(c||"").trim(),m=l(k||"*"),n=k?`(|(${e}=*${m}*)(${h}=*${m}*)(${i}=*${m}*)(userPrincipalName=*${m}*)(sAMAccountName=*${m}*))`:"(|(sAMAccountName=*)(userPrincipalName=*)(mail=*))",o=b.nestedGroups?`(memberOf:${g}:=${l(d)})`:`(memberOf=${l(d)})`,p=`(&(&(objectCategory=person)(objectClass=user)(!(objectClass=computer))(!(userAccountControl:1.2.840.113556.1.4.803:=2)))${n}${o})`;return(await a.search(b.userBaseDn,{scope:"sub",filter:p,sizeLimit:100,attributes:j([...f,e,h,i])})).searchEntries.map(a=>r(a,b))}async function y(a,b,c,d){let e=await v(a,d),g=[];for(let d of e.slice(0,200))try{let e=(await a.search(d,{scope:"base",filter:"(objectClass=*)",sizeLimit:1,attributes:j([...f,b.userNameAttribute,b.userDisplayAttribute,b.userEmailAttribute])})).searchEntries[0];if(e?.dn){let a=r(e,b);(function(a,b){let c=k(b);return!c||[a.username,a.displayName,a.email,a.userPrincipalName,a.sAMAccountName,a.dn].map(k).some(a=>a.includes(c))})(a,c)&&g.push(a)}}catch{}return g}function z(a={}){let b=m(a);return!!(b.enabled&&b.url&&b.bindDn&&b.bindPassword&&b.userBaseDn)}function A(a={}){let b=m(a);return{ldapEnabled:b.enabled,ldapUrl:b.url,ldapBindDn:b.bindDn,ldapBaseDn:b.userBaseDn,ldapUserBaseDn:b.userBaseDn,ldapUserSearchFilter:b.userSearchFilter,ldapUserNameAttribute:b.userNameAttribute,ldapUserDisplayAttribute:b.userDisplayAttribute,ldapUserEmailAttribute:b.userEmailAttribute,ldapLoginAllowedGroupDn:b.loginAllowedGroupDn,ldapAdminGroupDn:b.adminGroupDn,ldapMonitorAdminGroupDn:b.monitorAdminGroupDn,ldapNestedGroups:b.nestedGroups,ldapAllowedUsers:b.allowedUsers,ldapAllowAnyUser:b.allowAnyUser,ldapTlsRejectUnauthorized:b.tlsRejectUnauthorized,ldapConnectTimeoutMs:b.connectTimeoutMs,ldapHasBindPassword:!!a.ldapBindPassword,ldapConfigured:z(a)}}function B(a={}){let b={};for(let c of["ldapUrl","ldapBindDn","ldapBaseDn","ldapUserBaseDn","ldapUserSearchFilter","ldapUserNameAttribute","ldapUserDisplayAttribute","ldapUserEmailAttribute","ldapLoginAllowedGroupDn","ldapAdminGroupDn","ldapMonitorAdminGroupDn"])Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=h(a[c]));if(Object.prototype.hasOwnProperty.call(b,"ldapUserBaseDn")&&(b.ldapBaseDn=b.ldapUserBaseDn),Object.prototype.hasOwnProperty.call(a,"ldapEnabled")&&(b.ldapEnabled=!0===a.ldapEnabled),Object.prototype.hasOwnProperty.call(a,"ldapBindPassword")){let c=String(a.ldapBindPassword||"");c&&(b.ldapBindPassword=c)}if(Object.prototype.hasOwnProperty.call(a,"ldapClearBindPassword")&&!0===a.ldapClearBindPassword&&(b.ldapBindPassword=""),Object.prototype.hasOwnProperty.call(a,"ldapAllowedUsers")&&(b.ldapAllowedUsers=i(a.ldapAllowedUsers)),Object.prototype.hasOwnProperty.call(a,"ldapAllowAnyUser")&&(b.ldapAllowAnyUser=!0===a.ldapAllowAnyUser),Object.prototype.hasOwnProperty.call(a,"ldapNestedGroups")&&(b.ldapNestedGroups=!1!==a.ldapNestedGroups),Object.prototype.hasOwnProperty.call(a,"ldapTlsRejectUnauthorized")&&(b.ldapTlsRejectUnauthorized=!1!==a.ldapTlsRejectUnauthorized),Object.prototype.hasOwnProperty.call(a,"ldapConnectTimeoutMs")){let c=Number(a.ldapConnectTimeoutMs);b.ldapConnectTimeoutMs=Number.isFinite(c)&&c>0?Math.min(c,3e4):8e3}return b}async function C(a={}){let b=m(a);return n(b),await o(b,async a=>{let c=await a.search(b.userBaseDn,{scope:"sub",filter:"(objectClass=*)",sizeLimit:1,attributes:["dn"]}),d=!0,e=!0,f=!0;return b.loginAllowedGroupDn&&(d=(await v(a,b.loginAllowedGroupDn)).length>=0),b.adminGroupDn&&(e=(await v(a,b.adminGroupDn)).length>=0),b.monitorAdminGroupDn&&(f=(await v(a,b.monitorAdminGroupDn)).length>=0),{ok:!0,message:`LDAP bind and user base search OK. Found ${c.searchEntries.length} object(s).${b.loginAllowedGroupDn?" Login group DN is readable.":""}${b.adminGroupDn?" Admin group DN is readable.":""}${b.monitorAdminGroupDn?" Monitor admin group DN is readable.":""}`,loginGroupOk:d,adminGroupOk:e,monitorAdminGroupOk:f}})}async function D(a={},b=""){let c=m(a);return n(c),await o(c,async a=>{if(c.loginAllowedGroupDn){let d=await x(a,c,b,c.loginAllowedGroupDn).catch(()=>[]);return d.length>0?d:await y(a,c,b,c.loginAllowedGroupDn)}let d=c.userNameAttribute||"sAMAccountName",e=c.userDisplayAttribute||"displayName",g=c.userEmailAttribute||"mail",h=String(b||"").trim(),i=l(h||"*"),k=h?`(|(${d}=*${i}*)(${e}=*${i}*)(${g}=*${i}*)(userPrincipalName=*${i}*)(sAMAccountName=*${i}*))`:"(|(sAMAccountName=*)(userPrincipalName=*)(mail=*))",m=`(&(&(objectCategory=person)(objectClass=user)(!(objectClass=computer))(!(userAccountControl:1.2.840.113556.1.4.803:=2)))${k})`;return(await a.search(c.userBaseDn,{scope:"sub",filter:m,sizeLimit:100,attributes:j([...f,d,e,g])})).searchEntries.map(a=>r(a,c))})}async function E(a={},b,c){let e=m(a);n(e);let f=h(b),g=String(c||"");if(!f)throw Error("LDAP username is required.");if(!g)throw Error("LDAP password is required.");return await o(e,async a=>{let b=await t(a,e,f);if(!b?.dn)throw Error("LDAP user was not found.");let c=new d.Kj({url:e.url,timeout:e.connectTimeoutMs,connectTimeout:e.connectTimeoutMs,tlsOptions:{rejectUnauthorized:!1!==e.tlsRejectUnauthorized}});try{await c.bind(b.dn,g)}finally{try{await c.unbind()}catch{}}let h=r(b,e),i=e.loginAllowedGroupDn;if(i){if(!await w(a,e,b,i))throw Error("This LDAP user is not a member of the allowed login group.")}else if(!e.allowAnyUser&&e.allowedUsers.length>0&&!s(e,h))throw Error("This LDAP user is not allowed to access the dashboard.");let j=!!e.adminGroupDn&&await w(a,e,b,e.adminGroupDn),k=s(e,h),l=j||k,m=!l&&!!e.monitorAdminGroupDn&&await w(a,e,b,e.monitorAdminGroupDn);return{...h,isLoginAllowed:!0,isAdmin:l,isMonitorAdmin:m,adminSource:j?"ldap-admin-group":k?"manual-admin-list":"none",monitorAdminSource:m?"ldap-monitor-admin-group":"none"}})}}};
@@ -1,81 +0,0 @@
1
- "use strict";exports.id=6663,exports.ids=[6663],exports.modules={50122:(a,b,c)=>{c.d(b,{k:()=>e});let d=[];for(let a=0;a<256;++a)d.push((a+256).toString(16).slice(1));function e(a,b=0){return(d[a[b+0]]+d[a[b+1]]+d[a[b+2]]+d[a[b+3]]+"-"+d[a[b+4]]+d[a[b+5]]+"-"+d[a[b+6]]+d[a[b+7]]+"-"+d[a[b+8]]+d[a[b+9]]+"-"+d[a[b+10]]+d[a[b+11]]+d[a[b+12]]+d[a[b+13]]+d[a[b+14]]+d[a[b+15]]).toLowerCase()}},89718:(a,b,c)=>{c.d(b,{CG:()=>d.CG,Dj:()=>d.Dj,Fh:()=>d.Fh,Iq:()=>d.Iq,K1:()=>d.K1,KJ:()=>d.KJ,L:()=>d.L,L9:()=>d.L9,Lh:()=>d.Lh,Mc:()=>d.Mc,OM:()=>d.OM,PX:()=>d.PX,Pc:()=>d.Pc,Q_:()=>d.Q_,Qu:()=>d.Qu,S8:()=>d.S8,Uv:()=>d.Uv,VT:()=>d.VT,XW:()=>d.XW,Xx:()=>d.Xx,Yd:()=>d.Yd,ZO:()=>d.ZO,c:()=>d.c,ek:()=>d.ek,fK:()=>d.fK,fv:()=>d.fv,getProviderConnections:()=>d.P,ho:()=>d.ho,hr:()=>d.hr,i0:()=>d.i0,iE:()=>d.iE,jd:()=>d.jd,mY:()=>d.mY,mt:()=>d.mt,o5:()=>d.o5,oG:()=>d.oG,op:()=>d.op,r4:()=>d.r4,uL:()=>d.uL,ui:()=>d.ui,updateProviderConnection:()=>d.rj,uv:()=>d.uv,yF:()=>d.yF,yg:()=>d.yg,zP:()=>d.zP});var d=c(56403)},94755:(a,b,c)=>{c.d(b,{A:()=>i});var d=c(77598);let e={randomUUID:d.randomUUID},f=new Uint8Array(256),g=f.length;var h=c(50122);let i=function(a,b,c){if(e.randomUUID&&!b&&!a)return e.randomUUID();var i=a,j=c;let k=(i=i||{}).random??i.rng?.()??(g>f.length-16&&((0,d.randomFillSync)(f),g=0),f.slice(g,g+=16));if(k.length<16)throw Error("Random bytes length must be >= 16");if(k[6]=15&k[6]|64,k[8]=63&k[8]|128,b){if((j=j||0)<0||j+16>b.length)throw RangeError(`UUID byte range ${j}:${j+15} is out of buffer bounds`);for(let a=0;a<16;++a)b[j+a]=k[a];return b}return(0,h.k)(k)}},97242:(a,b,c)=>{c.d(b,{DU:()=>y,Ws:()=>z,_3:()=>B,nv:()=>A});var d=c(29021),e=c.n(d),f=c(33873),g=c.n(f),h=c(45903);let i=new Set;function j(a,b,c=null){let d=Number(a);if(!Number.isFinite(d)||d<0)return b;let e=Math.floor(d);return c?Math.min(e,c):e}function k(a){return String(a||"").trim()}async function l(){let a=(0,h.I6)(await (0,h.L7)());return a.sqlitePath||(a.sqlitePath=g().join(process.env.DATA_DIR||"/var/lib/bluerouter","logs","promptLogs.sqlite")),a}async function m(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 n(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 o(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 p(a){if(!e().existsSync(a.sqlitePath))return;let b=await m(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_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 q(a){let b=await n(a);try{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_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)"])await b.exec(a)}finally{await b.close()}}async function r(a,b,c){let d=await a.queryOne("SELECT COUNT(1) AS count FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'prompt_logs' AND INDEX_NAME = ?",[b]);0===Number(d?.count||0)&&await a.exec(c)}async function s(a){let b=await o(a);try{let a=await b.queryOne("SELECT COUNT(1) AS count FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'prompt_logs'");if(0===Number(a?.count||0))return;for(let[a,c]of[["idx_prompt_logs_created_id","CREATE INDEX idx_prompt_logs_created_id ON prompt_logs (created_at DESC, id)"],["idx_prompt_logs_stage_created_at","CREATE INDEX idx_prompt_logs_stage_created_at ON prompt_logs (stage, created_at DESC)"],["idx_prompt_logs_model_created_at","CREATE INDEX idx_prompt_logs_model_created_at ON prompt_logs (model, created_at DESC)"],["idx_prompt_logs_display_model_created_at","CREATE INDEX idx_prompt_logs_display_model_created_at ON prompt_logs (display_model, created_at DESC)"],["idx_prompt_logs_session_created_at","CREATE INDEX idx_prompt_logs_session_created_at ON prompt_logs (session_id, created_at DESC)"],["idx_prompt_logs_client_ip_created_at","CREATE INDEX idx_prompt_logs_client_ip_created_at ON prompt_logs (client_ip, created_at DESC)"],["idx_prompt_logs_source_tool_created_at","CREATE INDEX idx_prompt_logs_source_tool_created_at ON prompt_logs (source_tool, created_at DESC)"],["idx_prompt_logs_connection_created_at","CREATE INDEX idx_prompt_logs_connection_created_at ON prompt_logs (connection_id, created_at DESC)"],["idx_prompt_logs_account_created_at","CREATE INDEX idx_prompt_logs_account_created_at ON prompt_logs (account_name, created_at DESC)"],["idx_prompt_logs_provider_created_at","CREATE INDEX idx_prompt_logs_provider_created_at ON prompt_logs (provider, created_at DESC)"],["idx_prompt_logs_status_created_at","CREATE INDEX idx_prompt_logs_status_created_at ON prompt_logs (status_code, created_at DESC)"]])await r(b,a,c)}finally{await b.close()}}async function t(a){if(!a.enabled)return;let b="sqlite"===a.type?`sqlite:${a.sqlitePath}`:`${a.type}:${a.host||""}:${a.port||""}:${a.database||""}`;if(!i.has(b))try{"sqlite"===a.type?await p(a):"postgres"===a.type?await q(a):"mysql"===a.type&&await s(a),i.add(b)}catch(a){console.warn("[prompt-logs] Unable to ensure query indexes:",a.message)}}async function u(a){if(!e().existsSync(a.sqlitePath))return{models:[],stages:[],missing:!0,dbInfo:{type:"sqlite",sqlitePath:a.sqlitePath}};let b=await m(a.sqlitePath);try{if(!b.get("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'prompt_logs'"))return{models:[],stages:[],missing:!0,dbInfo:{type:"sqlite",sqlitePath:a.sqlitePath}};let c=b.all("SELECT DISTINCT COALESCE(NULLIF(display_model, ''), model) AS model FROM prompt_logs WHERE model IS NOT NULL AND model <> '' ORDER BY model LIMIT 300").map(a=>a.model),d=b.all("SELECT DISTINCT stage FROM prompt_logs WHERE stage IS NOT NULL AND stage <> '' ORDER BY stage LIMIT 100").map(a=>a.stage);return{models:c,stages:d,dbInfo:{type:"sqlite",sqlitePath:a.sqlitePath}}}finally{b.close()}}async function v(a){let b="postgres"===a.type?await n(a):await o(a);try{let c=(await b.query("SELECT DISTINCT COALESCE(NULLIF(display_model, ''), model) AS model FROM prompt_logs WHERE model IS NOT NULL AND model <> '' ORDER BY model LIMIT 300")).map(a=>a.model),d=(await b.query("SELECT DISTINCT stage FROM prompt_logs WHERE stage IS NOT NULL AND stage <> '' ORDER BY stage LIMIT 100")).map(a=>a.stage);return{models:c,stages:d,dbInfo:{type:a.type,host:a.host,database:a.database}}}finally{await b.close()}}async function w(a,b){if(!e().existsSync(a.sqlitePath))return{rows:[],total:0,models:[],stages:[],missing:!0,dbInfo:{type:"sqlite",sqlitePath:a.sqlitePath}};let c=await m(a.sqlitePath);try{let d,e;if(!c.get("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'prompt_logs'"))return{rows:[],total:0,models:[],stages:[],missing:!0,dbInfo:{type:"sqlite",sqlitePath:a.sqlitePath}};let{clause:f,params:g}=(d=[],e={limit:b.limit,offset:b.offset},b.keyword&&(d.push(`(
2
- prompt_text LIKE @keyword OR
3
- response_text LIKE @keyword OR
4
- error_text LIKE @keyword OR
5
- model LIKE @keyword OR
6
- endpoint LIKE @keyword OR
7
- provider_url LIKE @keyword OR
8
- provider LIKE @keyword OR
9
- account_name LIKE @keyword OR
10
- connection_id LIKE @keyword OR
11
- display_model LIKE @keyword OR
12
- session_id LIKE @keyword OR
13
- client_ip LIKE @keyword OR
14
- client_host LIKE @keyword OR
15
- client_user_agent LIKE @keyword OR
16
- source_tool LIKE @keyword OR
17
- source_tool_label LIKE @keyword OR
18
- source_host LIKE @keyword
19
- )`),e.keyword=`%${b.keyword}%`),b.model&&(d.push("(model = @model OR display_model = @model)"),e.model=b.model),b.stage&&(d.push("stage = @stage"),e.stage=b.stage),b.sessionId&&(d.push("session_id = @sessionId"),e.sessionId=b.sessionId),b.clientIp&&(d.push("client_ip LIKE @clientIp"),e.clientIp=`%${b.clientIp}%`),b.sourceTool&&(d.push("(source_tool LIKE @sourceTool OR source_tool_label LIKE @sourceTool OR source_host LIKE @sourceTool)"),e.sourceTool=`%${b.sourceTool}%`),b.dateFrom&&(d.push("created_at >= @dateFrom"),e.dateFrom=b.dateFrom),b.dateTo&&(d.push("created_at <= @dateTo"),e.dateTo=b.dateTo),{clause:d.length?`WHERE ${d.join(" AND ")}`:"",params:e}),h=c.get(`SELECT COUNT(*) AS count FROM prompt_logs ${f}`,g)?.count||0,i=c.all(`
20
- SELECT
21
- id,
22
- created_at,
23
- session_id,
24
- source_format,
25
- target_format,
26
- model,
27
- endpoint,
28
- stage,
29
- provider_url,
30
- provider,
31
- account_name,
32
- connection_id,
33
- display_model,
34
- client_ip,
35
- client_port,
36
- client_user_agent,
37
- client_host,
38
- source_tool,
39
- source_tool_label,
40
- source_host,
41
- substr(coalesce(prompt_text,''), 1, 900) AS prompt_preview,
42
- length(coalesce(prompt_text,'')) AS prompt_length,
43
- substr(coalesce(response_text,''), 1, 400) AS response_preview,
44
- status_code,
45
- error_text
46
- FROM prompt_logs
47
- ${f}
48
- ORDER BY created_at DESC
49
- LIMIT @limit OFFSET @offset
50
- `,g),j=[],k=[];if(b.includeOptions){let b=await u(a);j=b.models,k=b.stages}return{rows:i,total:h,models:j,stages:k,dbInfo:{type:"sqlite",sqlitePath:a.sqlitePath}}}finally{c.close()}}async function x(a,b){let c=a.type,d="postgres"===c?await n(a):await o(a);try{let e=function(a,b){let c=[],d=[],e=a=>(d.push(a),"postgres"===b)?`$${d.length}`:"?",f="postgres"===b?"ILIKE":"LIKE";if(a.keyword){let b=`%${a.keyword}%`;c.push(`(${["prompt_text","response_text","error_text","model","endpoint","provider_url","provider","account_name","connection_id","display_model","session_id","client_ip","client_host","client_user_agent","source_tool","source_tool_label","source_host"].map(a=>`${a} ${f} ${e(b)}`).join(" OR ")})`)}if(a.model&&c.push(`(model = ${e(a.model)} OR display_model = ${e(a.model)})`),a.stage&&c.push(`stage = ${e(a.stage)}`),a.sessionId&&c.push(`session_id = ${e(a.sessionId)}`),a.clientIp&&c.push(`client_ip ${f} ${e(`%${a.clientIp}%`)}`),a.sourceTool){let b=`%${a.sourceTool}%`;c.push(`(source_tool ${f} ${e(b)} OR source_tool_label ${f} ${e(b)} OR source_host ${f} ${e(b)})`)}return a.dateFrom&&c.push(`created_at >= ${e(a.dateFrom)}`),a.dateTo&&c.push(`created_at <= ${e(a.dateTo)}`),{clause:c.length?`WHERE ${c.join(" AND ")}`:"",params:d,add:e}}(b,c),f=[...e.params],g=await d.queryOne(`SELECT COUNT(*) AS count FROM prompt_logs ${e.clause}`,f),h=e.add(b.limit),i=e.add(b.offset),j="postgres"===c?"LEFT(coalesce(prompt_text,''), 900)":"SUBSTRING(coalesce(prompt_text,''), 1, 900)",k="postgres"===c?"char_length(coalesce(prompt_text,''))":"CHAR_LENGTH(coalesce(prompt_text,''))",l="postgres"===c?"LEFT(coalesce(response_text,''), 400)":"SUBSTRING(coalesce(response_text,''), 1, 400)",m=await d.query(`
51
- SELECT
52
- id,
53
- created_at,
54
- session_id,
55
- source_format,
56
- target_format,
57
- model,
58
- endpoint,
59
- stage,
60
- provider_url,
61
- provider,
62
- account_name,
63
- connection_id,
64
- display_model,
65
- client_ip,
66
- client_port,
67
- client_user_agent,
68
- client_host,
69
- source_tool,
70
- source_tool_label,
71
- source_host,
72
- ${j} AS prompt_preview,
73
- ${k} AS prompt_length,
74
- ${l} AS response_preview,
75
- status_code,
76
- error_text
77
- FROM prompt_logs
78
- ${e.clause}
79
- ORDER BY created_at DESC
80
- LIMIT ${h} OFFSET ${i}
81
- `,e.params),n=[],o=[];if(b.includeOptions){let b=await v(a);n=b.models,o=b.stages}return{rows:m,total:Number(g?.count||0),models:n,stages:o,dbInfo:{type:a.type,host:a.host,database:a.database}}}finally{await d.close()}}async function y(){let a=await l();if(!a.enabled)return{disabled:!0,models:[],stages:[],dbInfo:{type:a.type}};if(await t(a),"sqlite"===a.type)return u(a);if("postgres"===a.type||"mysql"===a.type)return v(a);throw Error(`Unsupported prompt log database type: ${a.type}`)}async function z(a={}){let b=await l(),c=function(a={}){return{keyword:k(a.keyword),model:k(a.model),stage:k(a.stage),sessionId:k(a.sessionId),clientIp:k(a.clientIp),sourceTool:k(a.sourceTool),dateFrom:k(a.dateFrom),dateTo:k(a.dateTo),limit:j(a.limit,50,200),offset:j(a.offset,0),includeOptions:!0===a.includeOptions}}(a);if(!b.enabled)return{disabled:!0,rows:[],total:0,models:[],stages:[],dbInfo:{type:b.type}};if(await t(b),"sqlite"===b.type)return w(b,c);if("postgres"===b.type||"mysql"===b.type)return x(b,c);throw Error(`Unsupported prompt log database type: ${b.type}`)}async function A(a){let b=await l();if("sqlite"===b.type){if(!e().existsSync(b.sqlitePath))return null;let c=await m(b.sqlitePath);try{return c.get("SELECT * FROM prompt_logs WHERE id = @id",{id:a})||null}finally{c.close()}}if("postgres"===b.type){let c=await n(b);try{return await c.queryOne("SELECT * FROM prompt_logs WHERE id = $1",[a])}finally{await c.close()}}if("mysql"===b.type){let c=await o(b);try{return await c.queryOne("SELECT * FROM prompt_logs WHERE id = ?",[a])}finally{await c.close()}}throw Error(`Unsupported prompt log database type: ${b.type}`)}async function B(a){let b=await l();if("sqlite"===b.type){if(!e().existsSync(b.sqlitePath))return{changed:0};let c=await m(b.sqlitePath);try{return{changed:c.run("DELETE FROM prompt_logs WHERE id = @id",{id:a}).changes||0}}finally{c.close()}}if("postgres"===b.type){let c=await n(b);try{let b=await c.queryOne("SELECT COUNT(*) AS count FROM prompt_logs WHERE id = $1",[a]);return await c.exec("DELETE FROM prompt_logs WHERE id = $1",[a]),{changed:Number(b?.count||0)}}finally{await c.close()}}if("mysql"===b.type){let c=await o(b);try{return await c.exec("DELETE FROM prompt_logs WHERE id = ?",[a]),{changed:1}}finally{await c.close()}}throw Error(`Unsupported prompt log database type: ${b.type}`)}}};