@jheavenknows/bluerouter 5.4.19 → 5.4.20

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 (413) hide show
  1. package/app/.next-cli-build/BUILD_ID +1 -1
  2. package/app/.next-cli-build/app-path-routes-manifest.json +31 -31
  3. package/app/.next-cli-build/build-manifest.json +2 -2
  4. package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page_client-reference-manifest.js +1 -1
  5. package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
  6. package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
  7. package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page.js +2 -15
  8. package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page.js.nft.json +1 -1
  9. package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page_client-reference-manifest.js +1 -1
  10. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  11. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  12. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  13. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page_client-reference-manifest.js +1 -1
  14. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  15. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  16. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page_client-reference-manifest.js +1 -1
  17. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  18. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  19. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  20. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  21. package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/console/page_client-reference-manifest.js +1 -1
  22. package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
  23. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  24. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  25. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  26. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  27. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  28. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  29. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  30. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personal/page_client-reference-manifest.js +1 -1
  31. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page_client-reference-manifest.js +1 -1
  32. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page_client-reference-manifest.js +1 -1
  33. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page_client-reference-manifest.js +1 -1
  34. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  35. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
  36. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
  37. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  38. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  39. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  40. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/stt/page_client-reference-manifest.js +1 -1
  41. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/tts/page_client-reference-manifest.js +1 -1
  42. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  43. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  44. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page_client-reference-manifest.js +1 -1
  45. package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  46. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  47. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  48. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  49. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  50. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  51. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  52. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  53. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  54. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  55. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  56. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  57. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  58. package/app/.next-cli-build/server/app/_not-found.rsc +5 -5
  59. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +5 -5
  60. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -5
  61. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  62. package/app/.next-cli-build/server/app/api/audit-proxy/ca/route.js.nft.json +1 -1
  63. package/app/.next-cli-build/server/app/api/audit-proxy/me/route.js.nft.json +1 -1
  64. package/app/.next-cli-build/server/app/api/audit-proxy/route.js +1 -1
  65. package/app/.next-cli-build/server/app/api/audit-proxy/route.js.nft.json +1 -1
  66. package/app/.next-cli-build/server/app/api/audit-proxy/users/route.js.nft.json +1 -1
  67. package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
  68. package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
  69. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  70. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  71. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  72. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  73. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  74. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  75. package/app/.next-cli-build/server/app/api/auth/view-mode/route.js.nft.json +1 -1
  76. package/app/.next-cli-build/server/app/api/branding/[asset]/route.js.nft.json +1 -1
  77. package/app/.next-cli-build/server/app/api/branding/route.js.nft.json +1 -1
  78. package/app/.next-cli-build/server/app/api/branding/upload/route.js.nft.json +1 -1
  79. package/app/.next-cli-build/server/app/api/cli-model-profiles/cloud-models/route.js.nft.json +1 -1
  80. package/app/.next-cli-build/server/app/api/cli-model-profiles/model-catalog/route.js.nft.json +1 -1
  81. package/app/.next-cli-build/server/app/api/cli-model-profiles/route.js.nft.json +1 -1
  82. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  83. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  84. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
  85. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
  86. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
  87. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  88. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  89. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  90. package/app/.next-cli-build/server/app/api/cluster/config/route.js.nft.json +1 -1
  91. package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js.nft.json +1 -1
  92. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js.nft.json +1 -1
  93. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js.nft.json +1 -1
  94. package/app/.next-cli-build/server/app/api/cluster/peers/route.js.nft.json +1 -1
  95. package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js.nft.json +1 -1
  96. package/app/.next-cli-build/server/app/api/cluster/sync/route.js.nft.json +1 -1
  97. package/app/.next-cli-build/server/app/api/cluster/test/route.js.nft.json +1 -1
  98. package/app/.next-cli-build/server/app/api/codex-catalog/download/route.js.nft.json +1 -1
  99. package/app/.next-cli-build/server/app/api/codex-catalog/route.js.nft.json +1 -1
  100. package/app/.next-cli-build/server/app/api/codex-catalog/upload/route.js.nft.json +1 -1
  101. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  102. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  103. package/app/.next-cli-build/server/app/api/dashboard/ai-power-index/route.js.nft.json +1 -1
  104. package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js.nft.json +1 -1
  105. package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js.nft.json +1 -1
  106. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
  107. package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
  108. package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
  109. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
  110. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
  111. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
  112. package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js.nft.json +1 -1
  113. package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js.nft.json +1 -1
  114. package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
  115. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  116. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  117. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  118. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  119. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  120. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  121. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  122. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  123. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  124. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  126. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  127. package/app/.next-cli-build/server/app/api/models/route.js +1 -1
  128. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  129. package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  130. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  132. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  134. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  136. package/app/.next-cli-build/server/app/api/oauth/grok-cli/device-code/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/oauth/grok-cli/poll/route.js.nft.json +1 -1
  138. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  140. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js.nft.json +1 -1
  142. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js.nft.json +1 -1
  143. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js.nft.json +1 -1
  144. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/move/route.js.nft.json +1 -1
  145. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js.nft.json +1 -1
  146. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js.nft.json +1 -1
  147. package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js.nft.json +1 -1
  148. package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js.nft.json +1 -1
  150. package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js.nft.json +1 -1
  151. package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js.nft.json +1 -1
  152. package/app/.next-cli-build/server/app/api/personal-cloud-providers/shares/route.js.nft.json +1 -1
  153. package/app/.next-cli-build/server/app/api/personal-cloud-providers/visibility/route.js.nft.json +1 -1
  154. package/app/.next-cli-build/server/app/api/pricing/catalog/route.js.nft.json +1 -1
  155. package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js.nft.json +1 -1
  156. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  157. package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
  158. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  159. package/app/.next-cli-build/server/app/api/provider-nodes/openai-compatible/manage/route.js.nft.json +1 -1
  160. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  161. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  162. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  163. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  164. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  165. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  166. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  167. package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  168. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  169. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  170. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  171. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  172. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  173. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  174. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  175. package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  176. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  177. package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js.nft.json +1 -1
  178. package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js.nft.json +1 -1
  179. package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js.nft.json +1 -1
  180. package/app/.next-cli-build/server/app/api/resource-monitor/history/route.js.nft.json +1 -1
  181. package/app/.next-cli-build/server/app/api/resource-monitor/route.js.nft.json +1 -1
  182. package/app/.next-cli-build/server/app/api/settings/database/export/route.js.nft.json +1 -1
  183. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  184. package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  185. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  186. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  187. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  188. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  189. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  190. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  191. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  192. package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  193. package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  194. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  195. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  196. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  197. package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
  198. package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
  199. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  200. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  201. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  202. package/app/.next-cli-build/server/app/api/usage/logs/route.js.nft.json +1 -1
  203. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  204. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  205. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  206. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  207. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  208. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  209. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  210. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  211. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  212. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  213. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  214. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  215. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  216. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  217. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  218. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  219. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  220. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  221. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  222. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  223. package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  224. package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  225. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  226. package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  227. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  228. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  229. package/app/.next-cli-build/server/app/callback.html +1 -1
  230. package/app/.next-cli-build/server/app/callback.rsc +5 -5
  231. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +5 -5
  232. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  233. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +5 -5
  234. package/app/.next-cli-build/server/app/dashboard/ai-power-index.html +1 -1
  235. package/app/.next-cli-build/server/app/dashboard/ai-power-index.rsc +6 -6
  236. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard/ai-power-index/__PAGE__.segment.rsc +6 -6
  237. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_full.segment.rsc +6 -6
  238. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_tree.segment.rsc +1 -1
  239. package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
  240. package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +9 -9
  241. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +9 -9
  242. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +9 -9
  243. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +1 -1
  244. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  245. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +7 -7
  246. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +7 -7
  247. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +7 -7
  248. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  249. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.html +1 -1
  250. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.rsc +8 -8
  251. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/model-profiles/__PAGE__.segment.rsc +8 -8
  252. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_full.segment.rsc +8 -8
  253. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_tree.segment.rsc +1 -1
  254. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  255. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +7 -7
  256. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +7 -7
  257. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +7 -7
  258. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  259. package/app/.next-cli-build/server/app/dashboard/cluster.html +1 -1
  260. package/app/.next-cli-build/server/app/dashboard/cluster.rsc +6 -6
  261. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster/__PAGE__.segment.rsc +6 -6
  262. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_full.segment.rsc +6 -6
  263. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_tree.segment.rsc +1 -1
  264. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  265. package/app/.next-cli-build/server/app/dashboard/combos.rsc +7 -7
  266. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +7 -7
  267. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +7 -7
  268. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  269. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  270. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +7 -7
  271. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +7 -7
  272. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +7 -7
  273. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  274. package/app/.next-cli-build/server/app/dashboard/logs.html +1 -1
  275. package/app/.next-cli-build/server/app/dashboard/logs.rsc +6 -6
  276. package/app/.next-cli-build/server/app/dashboard/logs.segments/!KGRhc2hib2FyZCk/dashboard/logs/__PAGE__.segment.rsc +6 -6
  277. package/app/.next-cli-build/server/app/dashboard/logs.segments/_full.segment.rsc +6 -6
  278. package/app/.next-cli-build/server/app/dashboard/logs.segments/_tree.segment.rsc +1 -1
  279. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  280. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +7 -7
  281. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +7 -7
  282. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +7 -7
  283. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  284. package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  285. package/app/.next-cli-build/server/app/dashboard/mitm.rsc +7 -7
  286. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +7 -7
  287. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +7 -7
  288. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  289. package/app/.next-cli-build/server/app/dashboard/personal.html +1 -1
  290. package/app/.next-cli-build/server/app/dashboard/personal.rsc +7 -7
  291. package/app/.next-cli-build/server/app/dashboard/personal.segments/!KGRhc2hib2FyZCk/dashboard/personal/__PAGE__.segment.rsc +7 -7
  292. package/app/.next-cli-build/server/app/dashboard/personal.segments/_full.segment.rsc +7 -7
  293. package/app/.next-cli-build/server/app/dashboard/personal.segments/_tree.segment.rsc +1 -1
  294. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  295. package/app/.next-cli-build/server/app/dashboard/profile.rsc +7 -7
  296. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +7 -7
  297. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +7 -7
  298. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  299. package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
  300. package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +6 -6
  301. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +6 -6
  302. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +6 -6
  303. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +1 -1
  304. package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
  305. package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +6 -6
  306. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +6 -6
  307. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +6 -6
  308. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +1 -1
  309. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  310. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +7 -7
  311. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +7 -7
  312. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +7 -7
  313. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  314. package/app/.next-cli-build/server/app/dashboard/providers/stt.html +1 -1
  315. package/app/.next-cli-build/server/app/dashboard/providers/stt.rsc +7 -7
  316. package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/!KGRhc2hib2FyZCk/dashboard/providers/stt/__PAGE__.segment.rsc +7 -7
  317. package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_full.segment.rsc +7 -7
  318. package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_tree.segment.rsc +1 -1
  319. package/app/.next-cli-build/server/app/dashboard/providers/tts.html +1 -1
  320. package/app/.next-cli-build/server/app/dashboard/providers/tts.rsc +7 -7
  321. package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/!KGRhc2hib2FyZCk/dashboard/providers/tts/__PAGE__.segment.rsc +7 -7
  322. package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_full.segment.rsc +7 -7
  323. package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_tree.segment.rsc +1 -1
  324. package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  325. package/app/.next-cli-build/server/app/dashboard/providers.rsc +7 -7
  326. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +7 -7
  327. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +7 -7
  328. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  329. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  330. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +7 -7
  331. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +7 -7
  332. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +7 -7
  333. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  334. package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
  335. package/app/.next-cli-build/server/app/dashboard/quota.rsc +8 -8
  336. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +8 -8
  337. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +8 -8
  338. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  339. package/app/.next-cli-build/server/app/dashboard/resource-monitor.html +1 -1
  340. package/app/.next-cli-build/server/app/dashboard/resource-monitor.rsc +6 -6
  341. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor/__PAGE__.segment.rsc +6 -6
  342. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_full.segment.rsc +6 -6
  343. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_tree.segment.rsc +1 -1
  344. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  345. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +6 -6
  346. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing/__PAGE__.segment.rsc +6 -6
  347. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +6 -6
  348. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  349. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  350. package/app/.next-cli-build/server/app/dashboard/skills.rsc +7 -7
  351. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +7 -7
  352. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +7 -7
  353. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
  354. package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  355. package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
  356. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +6 -6
  357. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
  358. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
  359. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  360. package/app/.next-cli-build/server/app/dashboard/translator.rsc +7 -7
  361. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +7 -7
  362. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +7 -7
  363. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  364. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  365. package/app/.next-cli-build/server/app/dashboard/usage.rsc +7 -7
  366. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +7 -7
  367. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +7 -7
  368. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  369. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  370. package/app/.next-cli-build/server/app/dashboard.rsc +7 -7
  371. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +7 -7
  372. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +7 -7
  373. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  374. package/app/.next-cli-build/server/app/index.html +1 -1
  375. package/app/.next-cli-build/server/app/index.rsc +5 -5
  376. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +5 -5
  377. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +5 -5
  378. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  379. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  380. package/app/.next-cli-build/server/app/landing.html +1 -1
  381. package/app/.next-cli-build/server/app/landing.rsc +5 -5
  382. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
  383. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  384. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +5 -5
  385. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  386. package/app/.next-cli-build/server/app/login.html +1 -1
  387. package/app/.next-cli-build/server/app/login.rsc +6 -6
  388. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +6 -6
  389. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  390. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +6 -6
  391. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  392. package/app/.next-cli-build/server/app-paths-manifest.json +31 -31
  393. package/app/.next-cli-build/server/chunks/3096.js +2 -2
  394. package/app/.next-cli-build/server/chunks/3399.js +1 -1
  395. package/app/.next-cli-build/server/chunks/3958.js +6 -6
  396. package/app/.next-cli-build/server/chunks/4746.js +1 -1
  397. package/app/.next-cli-build/server/chunks/6328.js +1 -1
  398. package/app/.next-cli-build/server/chunks/6811.js +1 -1
  399. package/app/.next-cli-build/server/chunks/6992.js +1 -1
  400. package/app/.next-cli-build/server/chunks/9083.js +5 -5
  401. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  402. package/app/.next-cli-build/server/pages/404.html +1 -1
  403. package/app/.next-cli-build/server/pages/500.html +1 -1
  404. package/app/.next-cli-build/static/chunks/{5263-d7e8656d89b2ca10.js → 5263-cb8cc0ec36f08fec.js} +1 -1
  405. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/audit-proxy/page-f6b35e9db17b4607.js +8 -0
  406. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-shm +0 -0
  407. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-wal +0 -0
  408. package/app/package.json +1 -1
  409. package/package.json +1 -1
  410. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/audit-proxy/page-7e36c7d76547e65b.js +0 -21
  411. /package/app/.next-cli-build/static/{WM_Lgz-rTI3jjkU3E5GgA → z1Eao96Iq3r_h1r2CiZ6D}/_buildManifest.js +0 -0
  412. /package/app/.next-cli-build/static/{WM_Lgz-rTI3jjkU3E5GgA → z1Eao96Iq3r_h1r2CiZ6D}/_ssgManifest.js +0 -0
  413. /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.4.13-to-5.4.14-5.4.14-20260824-210858 → upgrade-5.4.17-to-5.4.18-5.4.18-20260824-221830}/data.sqlite +0 -0
@@ -4,7 +4,7 @@ ${f}Connection: close\r
4
4
  Content-Type: text/plain; charset=utf-8\r
5
5
  Content-Length: ${Buffer.byteLength(e)}\r
6
6
  \r
7
- ${e}`)}catch{try{a.destroy()}catch{}}}function N(a={}){let b={};for(let[c,d]of Object.entries(a||{}))b[c]=d;return b}async function O(a){let b=await a.requestCapture.finish(String(a.requestHeaders["content-type"]||""),String(a.requestHeaders["content-encoding"]||"")),c=String(a.responseHeaders?.["content-type"]||""),d=await a.responseCapture.finish(c,String(a.responseHeaders?.["content-encoding"]||"")),e=J(a.target.host),f=n(a.path),g=p({provider:e,body:d.body,contentType:c,path:f}),h=K(b.body)||g?.model||null;return{id:i.randomUUID(),timestamp:new Date().toISOString(),protocol:a.protocol||"http/1.1",client:{ip:a.clientIp||"",port:a.clientPort||null,userAgent:String(a.requestHeaders["user-agent"]||""),proxyUser:a.authUser||null},provider:e,host:C(a.target.host),port:a.target.port,method:a.method,path:f,model:h,usage:g,status:a.statusCode||null,durationMs:Date.now()-a.startedAt,error:a.error?o(a.error.message||a.error):null,denied:!0===a.denied,request:{headers:l(a.requestHeaders),...b},response:{headers:l(a.responseHeaders||{}),...d}}}a.exports={createAuditProxy:function(a={},b={}){let i={allowedHosts:[],passthroughUnknown:!0,captureBodies:!0,captureLimitBytes:2097152,verifyUpstreamTls:!0,allowedConnectPorts:[443],connectTimeoutMs:1e4,tlsHandshakeTimeoutMs:1e4,responseHeaderTimeoutMs:3e4,idleTimeoutMs:9e5,allowPlainHttp:!1,clientToolFilterEnabled:!1,allowedClientTools:[],proxyAuthEnabled:!1,proxyAuthUsers:[],clientAlpnProtocols:["http/1.1"],...a};if(!0!==i.verifyUpstreamTls)throw Error("Upstream TLS verification is mandatory in Audit Proxy mode");let j=b.certificateProvider;if("function"!=typeof j)throw Error("certificateProvider is required");let k="function"==typeof b.onAudit?b.onAudit:()=>{},l="function"==typeof b.onAuditJob?b.onAuditJob:null,m="function"==typeof b.resolveTarget?b.resolveTarget:(a,b)=>q(a,b,{allowedPorts:i.allowedConnectPorts}),n=b.upstreamCa,o=r(i.allowedClientTools),p=i.proxyAuthEnabled?u(i.proxyAuthUsers):null,w=i.proxyAuthEnabled?v():null,x=new Set,y=new Map,z=new WeakMap,A=new Set;function B(a){return!a||x.has(a)||(x.add(a),a.once?.("close",()=>x.delete(a))),a}function C(a,b){try{"function"==typeof a.destroy?a.destroy(b):"function"==typeof a.close&&a.close()}catch{}}function G(a){let b=()=>O(a);if(l){try{l(b)}catch(a){console.warn("[audit-proxy] audit enqueue failed:",a?.message||a)}return}setImmediate(()=>{Promise.resolve().then(b).then(k).catch(a=>console.warn("[audit-proxy] audit callback failed:",a?.message||a))})}function H({requestHeaders:a,method:b,path:c,target:d,requestCapture:e,responseCapture:f,responseHeaders:g,statusCode:h,startedAt:i,error:j,socket:k,protocol:l,authUser:m=null,denied:n=!1}){return{requestHeaders:N(a),method:b,path:c,target:d,requestCapture:e,responseCapture:f,responseHeaders:N(g),statusCode:h,startedAt:i,error:j,clientIp:L(k),clientPort:k?.remotePort||null,authUser:m,protocol:l,denied:n}}let J="This proxy does not support WebSocket connections. Use the HTTP streaming transport instead - most clients fall back to it automatically.";function K(a,b,c,d,{statusCode:e=403,authUser:f=null}={}){let g=String(a.url||""),h=c||{host:g.includes(":")?g.slice(0,g.lastIndexOf(":")):g||"unknown",port:443},j=new I(i.captureBodies?i.captureLimitBytes:0);j.add(Buffer.from(d)),G(H({requestHeaders:a.headers,method:"CONNECT",path:"",target:h,requestCapture:new I(0),responseCapture:j,responseHeaders:{"content-type":"text/plain; charset=utf-8",connection:"close"},statusCode:e,startedAt:Date.now(),error:d,socket:b,protocol:"http/1.1",authUser:f,denied:!0}))}let P=Symbol("refused");async function Q(a,b){if(!p)return null;let d=L(b),e=(c,d=null)=>(M(b,"407 Proxy Authentication Required",c,['Proxy-Authenticate: Basic realm="BlueRouter Audit Proxy", charset="UTF-8"']),K(a,b,void 0,c,{statusCode:407,authUser:d}),P);if(w.isLocked(d))return e("Too many failed proxy authentication attempts");let f=a.headers["proxy-authorization"],g=await p.authenticate(f);if(g.ok)return w.recordSuccess(d),g.username;let h=null;if(f){let{lockedNow:a}=w.recordFailure(d);a&&console.log(`[audit-proxy] proxy auth lockout for ${d||"unknown"}`);try{h=c(7566).parseBasicProxyAuthorization(f)?.username||null}catch{h=null}}return e(g.reason||"Proxy authentication required",h)}function R(a,b,c){if(!c)return;let d=new I(i.captureBodies?i.captureLimitBytes:0);d.add(Buffer.from(J)),G(H({requestHeaders:a.headers,method:a.method,path:a.url,target:c,requestCapture:new I(0),responseCapture:d,responseHeaders:{"content-type":"text/plain; charset=utf-8",connection:"close"},statusCode:501,startedAt:Date.now(),error:null,socket:b,protocol:"http/1.1",authUser:b?.__auditProxyUser||null,denied:!0}))}async function S(a,b,{expectContinue:c=!1}={}){let d=a.socket.__auditTarget,e=a.socket.__auditProxyUser||null;if(!d){b.writeHead(502,{"content-type":"text/plain"}),b.end("Audit target is missing");return}if(function(a={}){return"string"==typeof a.upgrade&&""!==a.upgrade.trim()}(a.headers)){b.writeHead(501,{"content-type":"text/plain; charset=utf-8",connection:"close"}),b.end(J),R(a,a.socket,d);return}let h=Date.now(),j=new I(i.captureBodies?i.captureLimitBytes:0),k=new I(i.captureBodies?i.captureLimitBytes:0),l=F(a.headers,{stripInternal:!0});l.host=443===d.port?d.host:`${d.host}:${d.port}`;let o=null,p=null,q={},r=null,s=!1,t=!1,u=null,v=(b=null)=>{s||(s=!0,u&&clearTimeout(u),G(H({requestHeaders:a.headers,method:a.method,path:a.url,target:d,requestCapture:j,responseCapture:k,responseHeaders:q,statusCode:r,startedAt:h,error:b,socket:a.socket,protocol:"http/1.1",authUser:e})))};try{let e,h,s=await m(d.host,d.port);(o=f.request({hostname:d.host,port:d.port,method:a.method,path:a.url,headers:l,rejectUnauthorized:!0,servername:g.isIP(d.host)?void 0:d.host,ca:n,ALPNProtocols:["http/1.1"],lookup:s.lookup,autoSelectFamily:!0,agent:(e=`${d.host}:${d.port}`,(h=y.get(e))||(h=new f.Agent({keepAlive:!0,maxSockets:32,maxFreeSockets:8,timeout:i.idleTimeoutMs}),y.set(e,h)),h)})).on("socket",a=>{if(B(a),a.setNoDelay(!0),a.setKeepAlive(!0,3e4),a.setTimeout(i.idleTimeoutMs,()=>a.destroy(Error("Upstream idle timeout"))),a.connecting){let b=setTimeout(()=>a.destroy(Error("Upstream TLS connect timeout")),i.connectTimeoutMs+i.tlsHandshakeTimeoutMs);b.unref?.();let c=()=>clearTimeout(b);a.once("secureConnect",c),a.once("error",c),a.once("close",c)}}),o.on("continue",()=>{c&&!b.headersSent&&b.writeContinue()}),o.on("information",a=>{102===a.statusCode&&"function"==typeof b.writeProcessing&&b.writeProcessing(),103===a.statusCode&&"function"==typeof b.writeEarlyHints&&b.writeEarlyHints(a.headers||{})}),o.on("response",a=>{p=a,u&&clearTimeout(u),r=a.statusCode||502,q=N(a.headers||{});let c=F(a.headers,{stripInternal:!1});b.writeHead(r,c),b.flushHeaders?.(),a.on("data",c=>{k.add(c),b.write(c)||a.pause()}),b.on("drain",()=>a.resume()),a.on("aborted",()=>{let a=Error("Upstream response aborted");b.destroyed||b.destroy(a),v(a)}),a.on("error",a=>{b.destroyed||b.destroy(a),v(a)}),a.on("end",()=>{if(a.trailers&&Object.keys(a.trailers).length)try{b.addTrailers(F(a.trailers,{stripInternal:!1}))}catch{}t=!0,b.end(),v(null)})}),o.on("error",a=>{b.headersSent?b.destroyed||b.destroy(a):(b.writeHead(502,{"content-type":"application/json"}),b.end(JSON.stringify({error:"Verified upstream TLS request failed"})),t=!0),v(a)}),a.on("data",b=>{j.add(b),o.write(b)||a.pause()}),o.on("drain",()=>a.resume()),a.on("end",()=>{if(a.trailers&&Object.keys(a.trailers).length)try{o.addTrailers(F(a.trailers,{stripInternal:!0}))}catch{}o.end(),u=setTimeout(()=>o.destroy(Error("Upstream response header timeout")),i.responseHeaderTimeoutMs),u.unref?.()}),a.on("aborted",()=>o.destroy(Error("Client request aborted"))),a.on("error",a=>o.destroy(a)),b.on("close",()=>{t||(p?.destroy(Error("Client response closed")),o?.destroy(Error("Client response closed")),v(Error("Client response closed")))})}catch(a){b.headersSent||(b.writeHead(502,{"content-type":"application/json"}),b.end(JSON.stringify({error:"Destination validation or connection failed"})),t=!0),v(a)}}let T=d.createServer((a,b)=>{S(a,b)});async function U(a){return a.upstreamPromise||(a.upstreamPromise=(async()=>{let b=a.target,c=await m(b.host,b.port),d=B(h.connect({host:b.host,port:b.port,servername:g.isIP(b.host)?void 0:b.host,rejectUnauthorized:!0,ca:n,ALPNProtocols:["h2"],lookup:c.lookup,autoSelectFamily:!0}));d.setNoDelay(!0),d.setKeepAlive(!0,3e4);let f=setTimeout(()=>d.destroy(Error("Upstream HTTP/2 TLS connect timeout")),i.connectTimeoutMs+i.tlsHandshakeTimeoutMs);f.unref?.(),d.once("secureConnect",()=>{clearTimeout(f),"h2"!==d.alpnProtocol&&d.destroy(Error("Upstream did not negotiate HTTP/2"))}),d.once("error",()=>clearTimeout(f)),d.once("close",()=>clearTimeout(f));let j=`https://${b.host}${443===b.port?"":`:${b.port}`}`,k=e.connect(j,{createConnection:()=>d,settings:{enablePush:!1}});return A.add(k),k.setTimeout(i.idleTimeoutMs,()=>k.destroy(Error("Upstream HTTP/2 idle timeout"))),k.once("close",()=>A.delete(k)),await new Promise((a,b)=>{let c=setTimeout(()=>b(Error("Upstream HTTP/2 session timeout")),i.connectTimeoutMs+i.tlsHandshakeTimeoutMs);c.unref?.();let d=(a,b)=>{clearTimeout(c),k.removeListener("connect",e),k.removeListener("error",f),a(b)},e=()=>d(a,k),f=a=>d(b,a);k.once("connect",e),k.once("error",f)}),k})().catch(b=>{throw a.upstreamPromise=null,b})),a.upstreamPromise}async function V(a,b){let c=z.get(a.session),d=c?.target;if(!c||!d){a.respond({":status":502,"content-type":"text/plain"}),a.end("Audit target is missing");return}a.pause();let f=Date.now(),g=new I(i.captureBodies?i.captureLimitBytes:0),h=new I(i.captureBodies?i.captureLimitBytes:0),j={},k=null,l=!1,m=!1,n=null,o=null,p=null,q=(e=null)=>{l||(l=!0,G(H({requestHeaders:b,method:b[":method"]||"GET",path:b[":path"]||"/",target:d,requestCapture:g,responseCapture:h,responseHeaders:j,statusCode:k,startedAt:f,error:e,socket:a.session.socket,protocol:"h2",authUser:c.authUser||null})))};try{(n=(await U(c)).request(function(a,b){let c=F(a,{stripInternal:!0}),d={":method":a[":method"]||"GET",":path":a[":path"]||"/",":scheme":"https",":authority":443===b.port?b.host:`${b.host}:${b.port}`};for(let[a,b]of Object.entries(c))a.startsWith(":")||(d[a.toLowerCase()]=b);return d}(b,d),{endStream:!1,waitForTrailers:!0})).setTimeout(i.idleTimeoutMs,()=>n.close(e.constants.NGHTTP2_CANCEL)),a.setTimeout(i.idleTimeoutMs,()=>a.close(e.constants.NGHTTP2_CANCEL)),n.on("response",b=>{j=N(b),k=Number(b[":status"]||502),a.respond(function(a){let b=F(a,{stripInternal:!1}),c={":status":Number(a[":status"]||502)};for(let[a,d]of Object.entries(b))a.startsWith(":")||(c[a.toLowerCase()]=d);return c}(b),{waitForTrailers:!0})}),n.on("trailers",a=>{p=F(a,{stripInternal:!1})}),a.on("wantTrailers",()=>{try{a.sendTrailers(p||{})}catch{}}),a.on("trailers",a=>{o=F(a,{stripInternal:!0})}),n.on("wantTrailers",()=>{try{n.sendTrailers(o||{})}catch{}}),a.on("data",b=>{g.add(b),n.write(b)||a.pause()}),n.on("drain",()=>a.resume()),a.on("end",()=>n.end()),n.on("data",b=>{h.add(b),a.write(b)||n.pause()}),a.on("drain",()=>n.resume()),n.on("end",()=>{m=!0,a.end(),q(null)}),n.on("aborted",()=>{let b=Error("Upstream HTTP/2 stream aborted");a.close(e.constants.NGHTTP2_INTERNAL_ERROR),q(b)}),n.on("error",b=>{a.closed||a.close(e.constants.NGHTTP2_INTERNAL_ERROR),q(b)}),a.on("aborted",()=>{n.close(e.constants.NGHTTP2_CANCEL),q(Error("Client HTTP/2 stream aborted"))}),a.on("error",a=>{n.close(e.constants.NGHTTP2_CANCEL),q(a)}),a.on("close",()=>{m||!n||n.closed||(n.close(e.constants.NGHTTP2_CANCEL),q(Error("Client HTTP/2 stream closed")))}),a.resume()}catch(b){a.headersSent||a.closed||a.respond({":status":502,"content-type":"application/json"}),a.closed||a.end(JSON.stringify({error:"Verified upstream HTTP/2 request failed"})),q(b)}}T.on("checkContinue",(a,b)=>{S(a,b,{expectContinue:!0})}),T.on("upgrade",(a,b)=>{M(b,"501 Not Implemented",J),R(a,b,b.__auditTarget)}),T.on("clientError",(a,b)=>C(b)),T.headersTimeout=i.responseHeaderTimeoutMs,T.requestTimeout=0,T.keepAliveTimeout=i.idleTimeoutMs;let W=e.createServer({settings:{enablePush:!1}});W.on("session",a=>{let b={target:a.socket.__auditTarget,authUser:a.socket.__auditProxyUser||null,upstreamPromise:null};z.set(a,b),a.setTimeout(i.idleTimeoutMs,()=>a.destroy(Error("Client HTTP/2 idle timeout"))),a.once("close",()=>{Promise.resolve(b.upstreamPromise).then(a=>a?.close()).catch(()=>{})})}),W.on("stream",(a,b)=>{V(a,b)}),W.on("sessionError",a=>{console.warn("[audit-proxy] HTTP/2 client session error:",a?.message||a)});let X=d.createServer((a,b)=>{b.writeHead(403,{"content-type":"text/plain; charset=utf-8",connection:"close"}),b.end("Audit Proxy accepts HTTPS CONNECT traffic only")});function Y(){o=r(i.allowedClientTools),p=i.proxyAuthEnabled?u(i.proxyAuthUsers):null,w=i.proxyAuthEnabled?v():null,X.headersTimeout=i.responseHeaderTimeoutMs,X.keepAliveTimeout=i.idleTimeoutMs,T.headersTimeout=i.responseHeaderTimeoutMs,T.keepAliveTimeout=i.idleTimeoutMs,X.auditCapabilities={http1:!0,http2:i.clientAlpnProtocols.includes("h2"),proxyAuth:!0===i.proxyAuthEnabled,plainHttp:!1,publicConnectPorts:[...i.allowedConnectPorts]}}return X.on("connect",(a,b,c)=>{(async()=>{let d,e;try{d=D(a.url,443)}catch(e){let c=e.message||"Invalid CONNECT authority";M(b,"400 Bad Request",c),K(a,b,d,c,{statusCode:400});return}let f=await Q(a,b);if(f===P)return;try{await m(d.host,d.port)}catch(e){let c=e.message||"Destination is not allowed";M(b,"403 Forbidden",c),K(a,b,d,c,{authUser:f});return}if(i.clientToolFilterEnabled&&s(a.headers["user-agent"],o)){let c=`Client tool is not allowed to use this proxy (${t(a.headers["user-agent"])})`;M(b,"403 Forbidden",c),K(a,b,d,c);return}if(!E(d.host,i.allowedHosts)){if(!i.passthroughUnknown){let c="Host is not in the audit allowlist";M(b,"403 Forbidden",c),K(a,b,d,c);return}let e=!1;try{let a=await m(d.host,d.port),f=B(g.connect({host:d.host,port:d.port,lookup:a.lookup,autoSelectFamily:!0})),h=setTimeout(()=>f.destroy(Error("TCP passthrough connect timeout")),i.connectTimeoutMs);h.unref?.(),f.setNoDelay(!0),f.setKeepAlive(!0,3e4),f.setTimeout(i.idleTimeoutMs,()=>f.destroy(Error("TCP passthrough idle timeout"))),f.once("connect",()=>{clearTimeout(h),e=!0,b.write("HTTP/1.1 200 Connection Established\r\nProxy-Agent: BlueRouter-Audit\r\n\r\n"),c?.length&&f.write(c),f.pipe(b),b.pipe(f)}),f.once("error",()=>{clearTimeout(h),e?C(b):M(b,"502 Bad Gateway","TCP passthrough failed")}),b.once("error",()=>C(f)),b.once("close",()=>C(f))}catch(a){M(b,"502 Bad Gateway",a.message||"TCP passthrough failed")}return}try{if(e=j(d.host),!e?.key||!e?.cert)throw Error("Certificate provider returned no certificate")}catch(a){M(b,"500 Internal Server Error",`Cannot issue audit certificate: ${a.message}`);return}b.write("HTTP/1.1 200 Connection Established\r\nProxy-Agent: BlueRouter-Audit\r\n\r\n"),c?.length&&b.unshift(c);let k=B(new h.TLSSocket(b,{isServer:!0,key:e.key,cert:e.cert,ALPNProtocols:i.clientAlpnProtocols}));k.__auditTarget=d,k.__auditProxyUser=f,k.setNoDelay(!0),k.setKeepAlive(!0,3e4),k.setTimeout(i.idleTimeoutMs,()=>k.destroy(Error("Client TLS idle timeout")));let l=setTimeout(()=>k.destroy(Error("Client TLS handshake timeout")),i.tlsHandshakeTimeoutMs);l.unref?.();let n=!1,p=()=>{n||(n=!0,clearTimeout(l),"h2"===k.alpnProtocol?W.emit("connection",k):T.emit("connection",k))};k.once("secure",p),k.once("secureConnect",p),k.once("error",()=>{clearTimeout(l),C(k)}),k.once("close",()=>clearTimeout(l))})().catch(a=>M(b,"500 Internal Server Error",a.message||"Audit CONNECT failed"))}),X.prependListener("connection",a=>{B(a),a.setNoDelay(!0),a.setKeepAlive(!0,3e4)}),X.on("upgrade",(a,b)=>M(b,"501 Not Implemented",J)),X.on("clientError",(a,b)=>C(b)),X.headersTimeout=i.responseHeaderTimeoutMs,X.requestTimeout=0,X.keepAliveTimeout=i.idleTimeoutMs,X.forceCloseAll=()=>{for(let a of A)try{a.destroy()}catch{}for(let a of y.values())try{a.destroy()}catch{}for(let a of[...x])C(a)},X.getActiveConnectionCount=()=>x.size,X.auditConfig=i,Y(),X.applyConfig=(a={})=>{let b={};for(let[c,d]of(a.bindHost&&String(a.bindHost)!==String(i.bindHost)&&(b.bindHost=String(a.bindHost)),Number(a.port)&&Number(a.port)!==Number(i.port)&&(b.port=Number(a.port)),Object.entries(a)))"bindHost"!==c&&"port"!==c&&(["verifyUpstreamTls","allowPlainHttp","allowedConnectPorts","clientAlpnProtocols"].includes(c)||(i[c]=d));return Y(),{rebindRequired:Object.keys(b).length>0,pending:b}},X},hostMatches:E,parseAuthority:D,stripHopByHop:F,CaptureBuffer:I,detectProvider:J,extractModel:K,decodeCapturedBuffer:G}},48350:a=>{let b=new Set(["authorization","proxy-authorization","x-api-key","api-key","cookie","set-cookie","x-auth-token","x-access-token","cf-access-jwt-assertion"]),c=/(^|[_-])(access[_-]?token|refresh[_-]?token|id[_-]?token|token|api[_-]?key|apikey|password|passwd|secret|authorization|cookie)($|[_-])/i;function d(a){let c=String(a||"").toLowerCase();return b.has(c)||/token|secret|password|credential/i.test(c)}function e(a,b=new WeakSet){if(null==a||"object"!=typeof a)return a;if(b.has(a))return"[CIRCULAR]";if(b.add(a),Array.isArray(a))return a.map(a=>e(a,b));let d={};for(let[f,g]of Object.entries(a))d[f]=c.test(f)?"[REDACTED]":e(g,b);return d}function f(a){if(null==a)return a;let b=String(a);return(b=(b=b.replace(/\bBearer\s+[A-Za-z0-9._~+\/-]+=*/gi,"Bearer [REDACTED]")).replace(/\b(sk-ant-[A-Za-z0-9_-]{8,}|sk-[A-Za-z0-9_-]{8,})\b/g,"[REDACTED]")).replace(/("(?:access_token|refresh_token|id_token|api_key|apikey|password|secret|authorization)"\s*:\s*")([^"]+)(")/gi,"$1[REDACTED]$3")}a.exports={redactHeaders:function(a={}){let b={};for(let[c,e]of Object.entries(a||{}))b[c]=d(c)?"[REDACTED]":e;return b},redactObject:e,redactBodyText:function(a,b=""){let c=String(a||"");if(/application\/(?:[^;]+\+)?json/i.test(b)||/^[\s\r\n]*[\[{]/.test(c))try{let a=JSON.parse(c);return JSON.stringify(e(a))}catch{}return f(c)},scrubString:f,redactUrlPath:function(a){let b=String(a||"");try{let a=new URL(b,"https://audit.invalid");for(let b of[...a.searchParams.keys()])if(/token|secret|key|password|credential|authorization|^code$/i.test(b))a.searchParams.set(b,"[REDACTED]");else{let c=a.searchParams.get(b);c&&a.searchParams.set(b,f(c))}return`${a.pathname}${a.search}`}catch{return f(b)}},containsLikelySecret:function(a){let b="string"==typeof a?a:JSON.stringify(a);return/Bearer\s+(?!\[REDACTED\])\S+|sk-ant-[A-Za-z0-9_-]{8,}|\bsk-[A-Za-z0-9_-]{8,}/i.test(b||"")},shouldRedactHeader:d}},49083:(a,b,c)=>{let{createAuditProxy:d}=c(45372),{loadConfig:e,saveConfig:f,validateConfig:g,CONFIG_PATH:h,AUDIT_LOG_PATH:i,AUDIT_LOG_DIR:j,PROXY_AUTH_FEATURE_ENABLED:k}=c(43096),{hashProxyPassword:l,isValidUsername:m,normalizeProxyUsers:n,redactProxyAuthUsers:o,PASSWORD_MAX_BYTES:p,PASSWORD_MIN_BYTES:q}=c(7566),{normalizeAllowedClientIps:r,normalizeIp:s}=c(5565),{attachClientIpGate:t,effectiveClientIpPolicy:u,normalizeAccessGrants:v,normalizeGrantUserId:w}=c(77407),{SETTINGS_KEY:x,extractAuditPolicy:y,mergeAuditPolicy:z,policyEquals:A}=c(85463),{enqueueAuditJob:B,readRecent:C,clearAudit:D,pruneExpired:E,startAuditMaintenance:F,stopAuditMaintenance:G,flushAuditQueue:H,getAuditStoreStats:I}=c(90173),{ensureAuditRootCA:J,createAuditCertificateProvider:K,validateRootCaPair:L}=c(85074),{readRootCAInfo:M}=c(8578),{runSelfTest:N}=c(85252);function O(){return globalThis.__blueRouterAuditProxyRuntime||(globalThis.__blueRouterAuditProxyRuntime={server:null,certificateProvider:null,ipPolicy:null,ipGate:null,startedAt:null,lastError:null,autostartPromise:null,lifecycle:Promise.resolve()}),globalThis.__blueRouterAuditProxyRuntime}function P(a){let b=O(),c=b.lifecycle.then(a,a);return b.lifecycle=c.catch(()=>{}),c}async function Q(a,b=1500){if(!a)return;let c=Math.max(0,Number(b)||0);await new Promise(b=>{let d=!1,e=()=>{d||(d=!0,b())};try{a.listening?a.close(e):e()}catch{e()}let f=setTimeout(()=>{try{a.forceCloseAll?.()}catch{}},c);f.unref?.();let g=setTimeout(e,c+2e3);g.unref?.()});try{a.forceCloseAll?.()}catch{}}function R(a){let b=e();return{...a,clientIpFilterEnabled:!0===b.clientIpFilterEnabled,allowedClientIps:[...b.allowedClientIps||[]],proxyAuthEnabled:!0===b.proxyAuthEnabled,proxyAuthUsers:[...b.proxyAuthUsers||[]],accessGrants:v(b.accessGrants)}}async function S(a=null){let b=O();if(b.server?.listening)return X();let c=a?f({...R(a),enabled:!1}):e();await J(),await E(),F();let g=K({maxEntries:128});g.prewarm(c.allowedHosts);let h=d(c,{certificateProvider:g,onAuditJob:B});b.ipPolicy=u(c),b.ipGate=t(h,()=>O().ipPolicy);try{let a=await new Promise((a,b)=>{let d=a=>{h.removeListener("listening",e),b(a)},e=()=>{h.removeListener("error",d),a(h.address())};h.once("error",d),h.once("listening",e),h.listen(c.port,c.bindHost)});return b.server=h,b.certificateProvider=g,b.startedAt=new Date().toISOString(),b.lastError=null,f({...c,enabled:!0}),{...await X(),address:a}}catch(a){b.lastError=a.message||String(a);try{h.forceCloseAll?.()}catch{}try{h.close()}catch{}throw g.clear?.(),a}}async function T({persist:a=!0}={}){let b=O(),c=b.server,d=e();return b.server=null,b.startedAt=null,await Q(c,d.shutdownGraceMs),b.certificateProvider?.clear?.(),b.certificateProvider=null,b.ipGate=null,await H(3e3),G(),a&&f({...d,enabled:!1}),X()}async function U(a=null){return await T({persist:!1}),a&&f({...R(a),enabled:!1}),S()}function V(a=null){return P(()=>S(a))}async function W(){let a=O();await ab();let b=e();return b.enabled?a.server?.listening?{started:!1,reason:"already-running",status:await X()}:(a.autostartPromise||(a.autostartPromise=(async()=>{try{let a=await V();return console.log(`[audit-proxy] autostarted on ${b.bindHost}:${b.port}`),{started:!0,status:a}}catch(b){return a.lastError=b?.message||String(b),console.log("[audit-proxy] autostart failed:",a.lastError),{started:!1,error:a.lastError}}finally{a.autostartPromise=null}})()),a.autostartPromise):{started:!1,reason:"disabled"}}async function X(){let a=O(),b=e(),c=u(b),d=!!a.server?.listening,f=M();try{let a=L();f={...f,validated:!0===a.exists,expiringSoon:!0===a.expiringSoon,autoRotation:!1}}catch(a){f={...f,validated:!1,autoRotation:!1,error:a.message||String(a)}}return{running:d,listening:d,startedAt:a.startedAt,lastError:a.lastError,address:d?a.server.address():null,pendingListenerRestart:d&&!function(a,b){if(!a)return!0;let c=String(b.bindHost||"").trim().toLowerCase(),d=s(a.address||""),e=s("localhost"===c?"127.0.0.1":c);return Number(a.port)===Number(b.port)&&d===e}(a.server.address(),b),activeConnections:d&&a.server.getActiveConnectionCount?.()||0,capabilities:d?a.server.auditCapabilities:{http1:!0,http2:!1,plainHttp:!1,publicConnectPorts:[443]},security:{clientIpFilterEnabled:c.enabled,clientIpFilterSource:c.source,enforcedClientIpCount:c.allowedClientIps.length,accessGrantCount:c.grants.length,clientToolFilterEnabled:!0===b.clientToolFilterEnabled,proxyAuthEnabled:!0===b.proxyAuthEnabled,proxyAuthFeatureEnabled:k,allowedClientToolCount:(b.allowedClientTools||[]).length,lanExposedWithoutIpFilter:!["127.0.0.1","::1","localhost"].includes(String(b.bindHost||"").trim().toLowerCase())&&!c.enabled,privateDestinationsBlocked:!0,plainHttpBlocked:!0,upstreamTlsVerified:!0},certificateCache:a.certificateProvider?.stats?.()||{entries:0},auditStore:I(),configPath:h,auditLogPath:i,auditLogDirectory:j,rootCA:f}}async function Y(a=50){let b=e(),[c,d]=await Promise.all([X(),C(a)]);return{config:Z(b),status:c,events:d}}function Z(a){return a?{...a,proxyAuthUsers:o(a.proxyAuthUsers)}:a}async function $(){return Promise.resolve().then(c.bind(c,89718))}async function _(){try{let{isClusterStandby:a}=await c.e(2763).then(c.bind(c,62763));return await a()===!0}catch{return!1}}async function aa(a){try{if(await _())return{mirrored:!1,reason:"standby"};let{getSettings:b,updateSettings:c}=await $(),d=y(a),e=await b();if(JSON.stringify(e?.[x]||null)===JSON.stringify(d))return{mirrored:!1,reason:"unchanged"};return await c({[x]:d}),{mirrored:!0}}catch(a){return console.warn("[audit-proxy] failed to mirror policy to settings:",a?.message||a),{mirrored:!1,error:a?.message||String(a)}}}async function ab({force:a=!1}={}){try{if(!a&&!await _())return{applied:!1,reason:"not-standby"};let{getSettings:b}=await $(),c=await b(),d=c?.[x];if(!d||"object"!=typeof d)return{applied:!1,reason:"no-policy"};let f=e();if(A(f,d))return{applied:!1,reason:"unchanged"};let g=z(f,d),h=await ac(g,{mirror:!1});return console.log("[audit-proxy] applied cluster policy from snapshot"),{applied:!0,restarted:!0===h.restarted,droppedConnections:h.droppedConnections||0}}catch(a){return console.warn("[audit-proxy] failed to apply cluster policy:",a?.message||a),{applied:!1,error:a?.message||String(a)}}}function ac(a,{mirror:b=!0}={}){return P(async()=>{let c=O(),d=!!c.server?.listening,e=f({...g(a),enabled:d});c.ipPolicy=u(e);let h=!1,i={},j=0;if(d){let a=c.server.applyConfig?.(e)||{};h=!0===a.rebindRequired,i=a.pending||{},j=c.ipGate?.dropRevoked()||0;try{c.certificateProvider?.prewarm?.(e.allowedHosts)}catch{}}return b&&await aa(e),{config:Z(e),status:await X(),restarted:!1,appliedInstantly:!0,rebindRequired:h,pendingListener:i,droppedConnections:j}})}a.exports={startProxy:V,ensureAuditProxyAutostart:W,stopProxy:function(a={}){return P(()=>T(a))},restartProxy:function(a=null){return P(()=>U(a))},getStatus:X,getSnapshot:Y,updateConfig:function(a){return ac(R(a))},updateClientProxyHost:function(a){return ac({...e(),clientProxyHost:String(a||"").trim()})},updateClientIpFilter:function({enabled:a,allowedClientIps:b}={}){return ac({...e(),clientIpFilterEnabled:!0===a,allowedClientIps:b})},updateProxyAuth:async function a({enabled:b,users:c}={}){if(!0===b&&!k)throw Error("Proxy authentication is turned off in this deployment (PROXY_AUTH_FEATURE_ENABLED in audit-gateway/config.js)");let d=e(),f=new Map(n(d.proxyAuthUsers).map(a=>[a.username.toLowerCase(),a])),g=new Set,h=[];for(let a of Array.isArray(c)?c:[]){let b=String(a?.username||"").trim();if(!m(b))throw Error(`Invalid username: ${b||"(empty)"}`);let c=b.toLowerCase();if(g.has(c))throw Error(`Duplicate username: ${b}`);g.add(c);let d="string"==typeof a?.password?a.password:"";if(d){let a=Buffer.byteLength(d,"utf8");if(a<q)throw Error(`Password for ${b} must be at least ${q} characters`);if(a>p)throw Error(`Password for ${b} must be at most ${p} bytes`);h.push({username:b,passwordHash:await l(d)});continue}let e=f.get(c);if(!e)throw Error(`Account ${b} requires a password`);h.push({username:b,passwordHash:e.passwordHash})}return ac({...d,proxyAuthEnabled:!0===b,proxyAuthUsers:h})},listAccessGrants:function(){return v(e().accessGrants)},applyAuditPolicyFromSettings:ab,upsertAccessGrant:function({userId:a,ips:b,note:c}={}){let d=w(a);if(!d)throw Error("Grant requires a dashboard username or email");let f=e(),g=v(f.accessGrants).filter(a=>a.userId!==d);return g.push({userId:d,ips:r(b),note:c}),ac({...f,accessGrants:g})},deleteAccessGrant:function(a){let b=w(a);if(!b)throw Error("Grant requires a dashboard username or email");let c=e(),d=v(c.accessGrants).filter(a=>a.userId!==b);return ac({...c,accessGrants:d})},clearAudit:D,runSelfTest:N}},78864:(a,b,c)=>{let d=c(14985).promises,e=c(91645),{normalizeIp:f,clientIpMatches:g}=c(5565),h=new Map,i=Object.freeze(["0.0.0.0/8","10.0.0.0/8","100.64.0.0/10","127.0.0.0/8","169.254.0.0/16","172.16.0.0/12","192.0.0.0/24","192.0.2.0/24","192.88.99.0/24","192.168.0.0/16","198.18.0.0/15","198.51.100.0/24","203.0.113.0/24","224.0.0.0/4","240.0.0.0/4","::/96","::1/128","100::/64","2001:2::/48","2001:db8::/32","fc00::/7","fe80::/10","ff00::/8"]),j=Object.freeze([".localhost",".local",".internal",".lan",".home.arpa"]);function k(a){return String(a||"").trim().replace(/^\[|\]$/g,"").replace(/\.$/,"").toLowerCase()}function l(a){let b=k(a);return!(!(!b||"localhost"===b||j.some(a=>b.endsWith(a)))&&(e.isIP(b)||b.includes(".")))}function m(a){let b=f(a);return!!e.isIP(b)&&!g(b,i)}function n(a){let b=[...new Set((Array.isArray(a)?a:[a]).map(a=>Number(a)).filter(a=>Number.isInteger(a)&&a>=1&&a<=65535))];return b.length?b:[443]}function o(a){let b=[...a?.addresses||[]];return function(c,d,e){let f=d,g=e;"function"==typeof d&&(g=d,f={});let h="number"==typeof f?f:Number(f?.family||0);if("object"==typeof f&&f?.all===!0){let c=4===h||6===h?b.filter(a=>a.family===h):b;if(!c.length){let b=Error(`No validated public address for ${a.host}`);b.code="ENOTFOUND",g(b);return}g(null,c.map(({address:a,family:b})=>({address:a,family:b})));return}let i=function(a,b=0){let c=Number(b||0);return 4===c||6===c?a.find(a=>a.family===c)||null:a.find(a=>4===a.family)||a[0]||null}(b,h);if(!i){let b=Error(`No validated public address for ${a.host}`);b.code="ENOTFOUND",g(b);return}g(null,i.address,i.family)}}async function p(a,b,c={}){let g=k(a),i=Number(b||443),j=n(c.allowedPorts||[443]);if(!g)throw Error("Destination host is empty");if(!Number.isInteger(i)||!j.includes(i))throw Error(`CONNECT destination port ${i||"unknown"} is not allowed`);if(l(g))throw Error(`Private or local destination hostname is not allowed: ${g}`);let q=e.isIP(f(g));if(q){let a=f(g);if(!m(a))throw Error(`Private or reserved destination address is not allowed: ${a}`);let b={host:g,port:i,addresses:[{address:a,family:q}]};return{...b,lookup:o(b)}}let r=Date.now(),s=h.get(g);if(!s||s.expiresAt<=r){let a=await d.lookup(g,{all:!0,verbatim:!0}),b=[],c=new Set;for(let d of a||[]){let a=f(d.address),g=e.isIP(a);if(!g||!m(a))continue;let h=`${g}:${a}`;c.has(h)||(c.add(h),b.push({address:a,family:g}))}if(!b.length)throw Error(`Destination did not resolve to a public address: ${g}`);s={addresses:b,expiresAt:r+6e4},h.set(g,s)}let t={host:g,port:i,addresses:[...s.addresses]};return{...t,lookup:o(t)}}a.exports={BLOCKED_ADDRESS_RANGES:i,normalizeTargetHost:k,normalizeAllowedPorts:n,isBlockedHostname:l,isPublicAddress:m,createPinnedLookup:o,resolvePublicTarget:p,clearDnsPolicyCache:function(){h.clear()}}},85252:(a,b,c)=>{let d=c(81630),e=c(73496),f=c(91645),g=c(34631),h=c(74075),i=c(55511),j=c(15296),{createAuditProxy:k,CaptureBuffer:l}=c(45372),{containsLikelySecret:m}=c(48350),{clientIpMatches:n,normalizeAllowedClientIps:o}=c(5565),{normalizeAllowedTools:p,clientToolMatches:q,shouldRefuseClientTool:r}=c(98586),{createProxyAuthenticator:s,createProxyAuthLimiter:t,hashProxyPassword:u,parseBasicProxyAuthorization:v}=c(7566),{isPublicAddress:w}=c(78864),{validateConfig:x,PROXY_AUTH_FEATURE_ENABLED:y}=c(43096),{normalizeAccessGrants:z,effectiveClientIpPolicy:A,attachClientIpGate:B,findAccessGrant:C}=c(77407),{promptLogMirrorDecision:D}=c(90173);function E(a){return i.createHash("sha256").update(a).digest("hex")}function F(a){let b=j.pki.rsa.generateKeyPair(2048),c=j.pki.createCertificate();c.publicKey=b.publicKey,c.serialNumber=String(Date.now()),c.validity.notBefore=new Date(Date.now()-6e4),c.validity.notAfter=new Date(Date.now()+864e5);let d=[{name:"commonName",value:a}];return c.setSubject(d),c.setIssuer(d),c.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,cRLSign:!0,critical:!0}]),c.sign(b.privateKey,j.md.sha256.create()),{cert:c,keys:b,certPem:j.pki.certificateToPem(c)}}function G(a,b){let c=j.pki.rsa.generateKeyPair(2048),d=j.pki.createCertificate();return d.publicKey=c.publicKey,d.serialNumber=`${Date.now()}${Math.floor(1e3*Math.random())}`,d.validity.notBefore=new Date(Date.now()-6e4),d.validity.notAfter=new Date(Date.now()+864e5),d.setSubject([{name:"commonName",value:b}]),d.setIssuer(a.cert.subject.attributes),d.setExtensions([{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0},{name:"extKeyUsage",serverAuth:!0},{name:"subjectAltName",altNames:[{type:2,value:b}]}]),d.sign(a.keys.privateKey,j.md.sha256.create()),{cert:j.pki.certificateToPem(d),key:j.pki.privateKeyToPem(c.privateKey)}}function H(a,b="127.0.0.1"){return new Promise((c,d)=>{a.once("error",d),a.listen(0,b,()=>{a.removeListener("error",d),c(a.address())})})}function I(a){return new Promise(b=>{if(!a)return b();try{a.forceCloseAll?.()}catch{}if(!a.listening)return b();a.close(()=>b()),setTimeout(b,1e3).unref?.()})}function J(a,b){let c="127.0.0.1";return Promise.resolve({host:a,port:b,addresses:[{address:c,family:4}],lookup:(a,b,d)=>{let e=b,f=d;"function"==typeof b&&(f=b,e={}),e?.all?f(null,[{address:c,family:4}]):f(null,c,4)}})}function K(a,b,c="",d=""){return new Promise((e,g)=>{let h=f.connect(a,"127.0.0.1"),i=Buffer.alloc(0),j=setTimeout(()=>g(Error("CONNECT timeout")),7e3);h.once("error",g),h.once("connect",()=>{let a=c?`User-Agent: ${c}\r
7
+ ${e}`)}catch{try{a.destroy()}catch{}}}function N(a={}){let b={};for(let[c,d]of Object.entries(a||{}))b[c]=d;return b}async function O(a){let b=await a.requestCapture.finish(String(a.requestHeaders["content-type"]||""),String(a.requestHeaders["content-encoding"]||"")),c=String(a.responseHeaders?.["content-type"]||""),d=await a.responseCapture.finish(c,String(a.responseHeaders?.["content-encoding"]||"")),e=J(a.target.host),f=n(a.path),g=p({provider:e,body:d.body,contentType:c,path:f}),h=K(b.body)||g?.model||null;return{id:i.randomUUID(),timestamp:new Date().toISOString(),protocol:a.protocol||"http/1.1",client:{ip:a.clientIp||"",port:a.clientPort||null,userAgent:String(a.requestHeaders["user-agent"]||""),proxyUser:a.authUser||null},provider:e,host:C(a.target.host),port:a.target.port,method:a.method,path:f,model:h,usage:g,status:a.statusCode||null,durationMs:Date.now()-a.startedAt,error:a.error?o(a.error.message||a.error):null,denied:!0===a.denied,request:{headers:l(a.requestHeaders),...b},response:{headers:l(a.responseHeaders||{}),...d}}}a.exports={createAuditProxy:function(a={},b={}){let i={allowedHosts:[],passthroughUnknown:!0,captureBodies:!0,captureLimitBytes:2097152,verifyUpstreamTls:!0,allowedConnectPorts:[443],connectTimeoutMs:1e4,tlsHandshakeTimeoutMs:1e4,responseHeaderTimeoutMs:3e4,idleTimeoutMs:9e5,allowPlainHttp:!1,clientToolFilterEnabled:!1,allowedClientTools:[],proxyAuthEnabled:!1,proxyAuthUsers:[],clientAlpnProtocols:["http/1.1"],...a};if(!0!==i.verifyUpstreamTls)throw Error("Upstream TLS verification is mandatory in Audit Proxy mode");let j=b.certificateProvider;if("function"!=typeof j)throw Error("certificateProvider is required");let k="function"==typeof b.onAudit?b.onAudit:()=>{},l="function"==typeof b.onAuditJob?b.onAuditJob:null,m="function"==typeof b.resolveTarget?b.resolveTarget:(a,b)=>q(a,b,{allowedPorts:i.allowedConnectPorts}),n=b.upstreamCa,o=r(i.allowedClientTools),p=i.proxyAuthEnabled?u(i.proxyAuthUsers):null,w=i.proxyAuthEnabled?v():null,x=new Set,y=new Map,z=new WeakMap,A=new Set;function B(a){return!a||x.has(a)||(x.add(a),a.once?.("close",()=>x.delete(a))),a}function C(a,b){try{"function"==typeof a.destroy?a.destroy(b):"function"==typeof a.close&&a.close()}catch{}}function G(a){let b=()=>O(a);if(l){try{l(b)}catch(a){console.warn("[audit-proxy] audit enqueue failed:",a?.message||a)}return}setImmediate(()=>{Promise.resolve().then(b).then(k).catch(a=>console.warn("[audit-proxy] audit callback failed:",a?.message||a))})}function H({requestHeaders:a,method:b,path:c,target:d,requestCapture:e,responseCapture:f,responseHeaders:g,statusCode:h,startedAt:i,error:j,socket:k,protocol:l,authUser:m=null,denied:n=!1}){return{requestHeaders:N(a),method:b,path:c,target:d,requestCapture:e,responseCapture:f,responseHeaders:N(g),statusCode:h,startedAt:i,error:j,clientIp:L(k),clientPort:k?.remotePort||null,authUser:m,protocol:l,denied:n}}let J="This proxy does not support WebSocket connections. Use the HTTP streaming transport instead - most clients fall back to it automatically.";function K(a,b,c,d,{statusCode:e=403,authUser:f=null}={}){let g=String(a.url||""),h=c||{host:g.includes(":")?g.slice(0,g.lastIndexOf(":")):g||"unknown",port:443},j=new I(i.captureBodies?i.captureLimitBytes:0);j.add(Buffer.from(d)),G(H({requestHeaders:a.headers,method:"CONNECT",path:"",target:h,requestCapture:new I(0),responseCapture:j,responseHeaders:{"content-type":"text/plain; charset=utf-8",connection:"close"},statusCode:e,startedAt:Date.now(),error:d,socket:b,protocol:"http/1.1",authUser:f,denied:!0}))}let P=Symbol("refused");async function Q(a,b){if(!p)return null;let d=L(b),e=(c,d=null)=>(M(b,"407 Proxy Authentication Required",c,['Proxy-Authenticate: Basic realm="BlueRouter Audit Proxy", charset="UTF-8"']),K(a,b,void 0,c,{statusCode:407,authUser:d}),P);if(w.isLocked(d))return e("Too many failed proxy authentication attempts");let f=a.headers["proxy-authorization"],g=await p.authenticate(f);if(g.ok)return w.recordSuccess(d),g.username;let h=null;if(f){let{lockedNow:a}=w.recordFailure(d);a&&console.log(`[audit-proxy] proxy auth lockout for ${d||"unknown"}`);try{h=c(7566).parseBasicProxyAuthorization(f)?.username||null}catch{h=null}}return e(g.reason||"Proxy authentication required",h)}function R(a,b,c){if(!c)return;let d=new I(i.captureBodies?i.captureLimitBytes:0);d.add(Buffer.from(J)),G(H({requestHeaders:a.headers,method:a.method,path:a.url,target:c,requestCapture:new I(0),responseCapture:d,responseHeaders:{"content-type":"text/plain; charset=utf-8",connection:"close"},statusCode:501,startedAt:Date.now(),error:null,socket:b,protocol:"http/1.1",authUser:b?.__auditProxyUser||null,denied:!0}))}async function S(a,b,{expectContinue:c=!1}={}){let d=a.socket.__auditTarget,e=a.socket.__auditProxyUser||null;if(!d){b.writeHead(502,{"content-type":"text/plain"}),b.end("Audit target is missing");return}if(function(a={}){return"string"==typeof a.upgrade&&""!==a.upgrade.trim()}(a.headers)){b.writeHead(501,{"content-type":"text/plain; charset=utf-8",connection:"close"}),b.end(J),R(a,a.socket,d);return}let h=Date.now(),j=new I(i.captureBodies?i.captureLimitBytes:0),k=new I(i.captureBodies?i.captureLimitBytes:0),l=F(a.headers,{stripInternal:!0});l.host=443===d.port?d.host:`${d.host}:${d.port}`;let o=null,p=null,q={},r=null,s=!1,t=!1,u=null,v=(b=null)=>{s||(s=!0,u&&clearTimeout(u),G(H({requestHeaders:a.headers,method:a.method,path:a.url,target:d,requestCapture:j,responseCapture:k,responseHeaders:q,statusCode:r,startedAt:h,error:b,socket:a.socket,protocol:"http/1.1",authUser:e})))};try{let e,h,s=await m(d.host,d.port);(o=f.request({hostname:d.host,port:d.port,method:a.method,path:a.url,headers:l,rejectUnauthorized:!0,servername:g.isIP(d.host)?void 0:d.host,ca:n,ALPNProtocols:["http/1.1"],lookup:s.lookup,autoSelectFamily:!0,agent:(e=`${d.host}:${d.port}`,(h=y.get(e))||(h=new f.Agent({keepAlive:!0,maxSockets:32,maxFreeSockets:8,timeout:i.idleTimeoutMs}),y.set(e,h)),h)})).on("socket",a=>{if(B(a),a.setNoDelay(!0),a.setKeepAlive(!0,3e4),a.setTimeout(i.idleTimeoutMs,()=>a.destroy(Error("Upstream idle timeout"))),a.connecting){let b=setTimeout(()=>a.destroy(Error("Upstream TLS connect timeout")),i.connectTimeoutMs+i.tlsHandshakeTimeoutMs);b.unref?.();let c=()=>clearTimeout(b);a.once("secureConnect",c),a.once("error",c),a.once("close",c)}}),o.on("continue",()=>{c&&!b.headersSent&&b.writeContinue()}),o.on("information",a=>{102===a.statusCode&&"function"==typeof b.writeProcessing&&b.writeProcessing(),103===a.statusCode&&"function"==typeof b.writeEarlyHints&&b.writeEarlyHints(a.headers||{})}),o.on("response",a=>{p=a,u&&clearTimeout(u),r=a.statusCode||502,q=N(a.headers||{});let c=F(a.headers,{stripInternal:!1});b.writeHead(r,c),b.flushHeaders?.(),a.on("data",c=>{k.add(c),b.write(c)||a.pause()}),b.on("drain",()=>a.resume()),a.on("aborted",()=>{let a=Error("Upstream response aborted");b.destroyed||b.destroy(a),v(a)}),a.on("error",a=>{b.destroyed||b.destroy(a),v(a)}),a.on("end",()=>{if(a.trailers&&Object.keys(a.trailers).length)try{b.addTrailers(F(a.trailers,{stripInternal:!1}))}catch{}t=!0,b.end(),v(null)})}),o.on("error",a=>{b.headersSent?b.destroyed||b.destroy(a):(b.writeHead(502,{"content-type":"application/json"}),b.end(JSON.stringify({error:"Verified upstream TLS request failed"})),t=!0),v(a)}),a.on("data",b=>{j.add(b),o.write(b)||a.pause()}),o.on("drain",()=>a.resume()),a.on("end",()=>{if(a.trailers&&Object.keys(a.trailers).length)try{o.addTrailers(F(a.trailers,{stripInternal:!0}))}catch{}o.end(),u=setTimeout(()=>o.destroy(Error("Upstream response header timeout")),i.responseHeaderTimeoutMs),u.unref?.()}),a.on("aborted",()=>o.destroy(Error("Client request aborted"))),a.on("error",a=>o.destroy(a)),b.on("close",()=>{t||(p?.destroy(Error("Client response closed")),o?.destroy(Error("Client response closed")),v(Error("Client response closed")))})}catch(a){b.headersSent||(b.writeHead(502,{"content-type":"application/json"}),b.end(JSON.stringify({error:"Destination validation or connection failed"})),t=!0),v(a)}}let T=d.createServer((a,b)=>{S(a,b)});async function U(a){return a.upstreamPromise||(a.upstreamPromise=(async()=>{let b=a.target,c=await m(b.host,b.port),d=B(h.connect({host:b.host,port:b.port,servername:g.isIP(b.host)?void 0:b.host,rejectUnauthorized:!0,ca:n,ALPNProtocols:["h2"],lookup:c.lookup,autoSelectFamily:!0}));d.setNoDelay(!0),d.setKeepAlive(!0,3e4);let f=setTimeout(()=>d.destroy(Error("Upstream HTTP/2 TLS connect timeout")),i.connectTimeoutMs+i.tlsHandshakeTimeoutMs);f.unref?.(),d.once("secureConnect",()=>{clearTimeout(f),"h2"!==d.alpnProtocol&&d.destroy(Error("Upstream did not negotiate HTTP/2"))}),d.once("error",()=>clearTimeout(f)),d.once("close",()=>clearTimeout(f));let j=`https://${b.host}${443===b.port?"":`:${b.port}`}`,k=e.connect(j,{createConnection:()=>d,settings:{enablePush:!1}});return A.add(k),k.setTimeout(i.idleTimeoutMs,()=>k.destroy(Error("Upstream HTTP/2 idle timeout"))),k.once("close",()=>A.delete(k)),await new Promise((a,b)=>{let c=setTimeout(()=>b(Error("Upstream HTTP/2 session timeout")),i.connectTimeoutMs+i.tlsHandshakeTimeoutMs);c.unref?.();let d=(a,b)=>{clearTimeout(c),k.removeListener("connect",e),k.removeListener("error",f),a(b)},e=()=>d(a,k),f=a=>d(b,a);k.once("connect",e),k.once("error",f)}),k})().catch(b=>{throw a.upstreamPromise=null,b})),a.upstreamPromise}async function V(a,b){let c=z.get(a.session),d=c?.target;if(!c||!d){a.respond({":status":502,"content-type":"text/plain"}),a.end("Audit target is missing");return}a.pause();let f=Date.now(),g=new I(i.captureBodies?i.captureLimitBytes:0),h=new I(i.captureBodies?i.captureLimitBytes:0),j={},k=null,l=!1,m=!1,n=null,o=null,p=null,q=(e=null)=>{l||(l=!0,G(H({requestHeaders:b,method:b[":method"]||"GET",path:b[":path"]||"/",target:d,requestCapture:g,responseCapture:h,responseHeaders:j,statusCode:k,startedAt:f,error:e,socket:a.session.socket,protocol:"h2",authUser:c.authUser||null})))};try{(n=(await U(c)).request(function(a,b){let c=F(a,{stripInternal:!0}),d={":method":a[":method"]||"GET",":path":a[":path"]||"/",":scheme":"https",":authority":443===b.port?b.host:`${b.host}:${b.port}`};for(let[a,b]of Object.entries(c))a.startsWith(":")||(d[a.toLowerCase()]=b);return d}(b,d),{endStream:!1,waitForTrailers:!0})).setTimeout(i.idleTimeoutMs,()=>n.close(e.constants.NGHTTP2_CANCEL)),a.setTimeout(i.idleTimeoutMs,()=>a.close(e.constants.NGHTTP2_CANCEL)),n.on("response",b=>{j=N(b),k=Number(b[":status"]||502),a.respond(function(a){let b=F(a,{stripInternal:!1}),c={":status":Number(a[":status"]||502)};for(let[a,d]of Object.entries(b))a.startsWith(":")||(c[a.toLowerCase()]=d);return c}(b),{waitForTrailers:!0})}),n.on("trailers",a=>{p=F(a,{stripInternal:!1})}),a.on("wantTrailers",()=>{try{a.sendTrailers(p||{})}catch{}}),a.on("trailers",a=>{o=F(a,{stripInternal:!0})}),n.on("wantTrailers",()=>{try{n.sendTrailers(o||{})}catch{}}),a.on("data",b=>{g.add(b),n.write(b)||a.pause()}),n.on("drain",()=>a.resume()),a.on("end",()=>n.end()),n.on("data",b=>{h.add(b),a.write(b)||n.pause()}),a.on("drain",()=>n.resume()),n.on("end",()=>{m=!0,a.end(),q(null)}),n.on("aborted",()=>{let b=Error("Upstream HTTP/2 stream aborted");a.close(e.constants.NGHTTP2_INTERNAL_ERROR),q(b)}),n.on("error",b=>{a.closed||a.close(e.constants.NGHTTP2_INTERNAL_ERROR),q(b)}),a.on("aborted",()=>{n.close(e.constants.NGHTTP2_CANCEL),q(Error("Client HTTP/2 stream aborted"))}),a.on("error",a=>{n.close(e.constants.NGHTTP2_CANCEL),q(a)}),a.on("close",()=>{m||!n||n.closed||(n.close(e.constants.NGHTTP2_CANCEL),q(Error("Client HTTP/2 stream closed")))}),a.resume()}catch(b){a.headersSent||a.closed||a.respond({":status":502,"content-type":"application/json"}),a.closed||a.end(JSON.stringify({error:"Verified upstream HTTP/2 request failed"})),q(b)}}T.on("checkContinue",(a,b)=>{S(a,b,{expectContinue:!0})}),T.on("upgrade",(a,b)=>{M(b,"501 Not Implemented",J),R(a,b,b.__auditTarget)}),T.on("clientError",(a,b)=>C(b)),T.headersTimeout=i.responseHeaderTimeoutMs,T.requestTimeout=0,T.keepAliveTimeout=i.idleTimeoutMs;let W=e.createServer({settings:{enablePush:!1}});W.on("session",a=>{let b={target:a.socket.__auditTarget,authUser:a.socket.__auditProxyUser||null,upstreamPromise:null};z.set(a,b),a.setTimeout(i.idleTimeoutMs,()=>a.destroy(Error("Client HTTP/2 idle timeout"))),a.once("close",()=>{Promise.resolve(b.upstreamPromise).then(a=>a?.close()).catch(()=>{})})}),W.on("stream",(a,b)=>{V(a,b)}),W.on("sessionError",a=>{console.warn("[audit-proxy] HTTP/2 client session error:",a?.message||a)});let X=d.createServer((a,b)=>{b.writeHead(403,{"content-type":"text/plain; charset=utf-8",connection:"close"}),b.end("Audit Proxy accepts HTTPS CONNECT traffic only")});function Y(){o=r(i.allowedClientTools),p=i.proxyAuthEnabled?u(i.proxyAuthUsers):null,w=i.proxyAuthEnabled?v():null,X.headersTimeout=i.responseHeaderTimeoutMs,X.keepAliveTimeout=i.idleTimeoutMs,T.headersTimeout=i.responseHeaderTimeoutMs,T.keepAliveTimeout=i.idleTimeoutMs,X.auditCapabilities={http1:!0,http2:i.clientAlpnProtocols.includes("h2"),proxyAuth:!0===i.proxyAuthEnabled,plainHttp:!1,publicConnectPorts:[...i.allowedConnectPorts]}}return X.on("connect",(a,b,c)=>{(async()=>{let d,e;try{d=D(a.url,443)}catch(e){let c=e.message||"Invalid CONNECT authority";M(b,"400 Bad Request",c),K(a,b,d,c,{statusCode:400});return}let f=await Q(a,b);if(f===P)return;try{await m(d.host,d.port)}catch(e){let c=e.message||"Destination is not allowed";M(b,"403 Forbidden",c),K(a,b,d,c,{authUser:f});return}if(i.clientToolFilterEnabled&&s(a.headers["user-agent"],o)){let c=`Client tool is not allowed to use this proxy (${t(a.headers["user-agent"])})`;M(b,"403 Forbidden",c),K(a,b,d,c);return}if(!E(d.host,i.allowedHosts)){if(!i.passthroughUnknown){let c="Host is not in the audit allowlist";M(b,"403 Forbidden",c),K(a,b,d,c);return}let e=!1;try{let a=await m(d.host,d.port),f=B(g.connect({host:d.host,port:d.port,lookup:a.lookup,autoSelectFamily:!0})),h=setTimeout(()=>f.destroy(Error("TCP passthrough connect timeout")),i.connectTimeoutMs);h.unref?.(),f.setNoDelay(!0),f.setKeepAlive(!0,3e4),f.setTimeout(i.idleTimeoutMs,()=>f.destroy(Error("TCP passthrough idle timeout"))),f.once("connect",()=>{clearTimeout(h),e=!0,b.write("HTTP/1.1 200 Connection Established\r\nProxy-Agent: BlueRouter-Audit\r\n\r\n"),c?.length&&f.write(c),f.pipe(b),b.pipe(f)}),f.once("error",()=>{clearTimeout(h),e?C(b):M(b,"502 Bad Gateway","TCP passthrough failed")}),b.once("error",()=>C(f)),b.once("close",()=>C(f))}catch(a){M(b,"502 Bad Gateway",a.message||"TCP passthrough failed")}return}try{if(e=j(d.host),!e?.key||!e?.cert)throw Error("Certificate provider returned no certificate")}catch(a){M(b,"500 Internal Server Error",`Cannot issue audit certificate: ${a.message}`);return}b.write("HTTP/1.1 200 Connection Established\r\nProxy-Agent: BlueRouter-Audit\r\n\r\n"),c?.length&&b.unshift(c);let k=B(new h.TLSSocket(b,{isServer:!0,key:e.key,cert:e.cert,ALPNProtocols:i.clientAlpnProtocols}));k.__auditTarget=d,k.__auditProxyUser=f,k.setNoDelay(!0),k.setKeepAlive(!0,3e4),k.setTimeout(i.idleTimeoutMs,()=>k.destroy(Error("Client TLS idle timeout")));let l=setTimeout(()=>k.destroy(Error("Client TLS handshake timeout")),i.tlsHandshakeTimeoutMs);l.unref?.();let n=!1,p=()=>{n||(n=!0,clearTimeout(l),"h2"===k.alpnProtocol?W.emit("connection",k):T.emit("connection",k))};k.once("secure",p),k.once("secureConnect",p),k.once("error",()=>{clearTimeout(l),C(k)}),k.once("close",()=>clearTimeout(l))})().catch(a=>M(b,"500 Internal Server Error",a.message||"Audit CONNECT failed"))}),X.prependListener("connection",a=>{B(a),a.setNoDelay(!0),a.setKeepAlive(!0,3e4)}),X.on("upgrade",(a,b)=>M(b,"501 Not Implemented",J)),X.on("clientError",(a,b)=>C(b)),X.headersTimeout=i.responseHeaderTimeoutMs,X.requestTimeout=0,X.keepAliveTimeout=i.idleTimeoutMs,X.forceCloseAll=()=>{for(let a of A)try{a.destroy()}catch{}for(let a of y.values())try{a.destroy()}catch{}for(let a of[...x])C(a)},X.getActiveConnectionCount=()=>x.size,X.auditConfig=i,Y(),X.applyConfig=(a={})=>{let b={};for(let[c,d]of(a.bindHost&&String(a.bindHost)!==String(i.bindHost)&&(b.bindHost=String(a.bindHost)),Number(a.port)&&Number(a.port)!==Number(i.port)&&(b.port=Number(a.port)),Object.entries(a)))"bindHost"!==c&&"port"!==c&&(["verifyUpstreamTls","allowPlainHttp","allowedConnectPorts","clientAlpnProtocols"].includes(c)||(i[c]=d));return Y(),{rebindRequired:Object.keys(b).length>0,pending:b}},X},hostMatches:E,parseAuthority:D,stripHopByHop:F,CaptureBuffer:I,detectProvider:J,extractModel:K,decodeCapturedBuffer:G}},48350:a=>{let b=new Set(["authorization","proxy-authorization","x-api-key","api-key","cookie","set-cookie","x-auth-token","x-access-token","cf-access-jwt-assertion"]),c=/(^|[_-])(access[_-]?token|refresh[_-]?token|id[_-]?token|token|api[_-]?key|apikey|password|passwd|secret|authorization|cookie)($|[_-])/i;function d(a){let c=String(a||"").toLowerCase();return b.has(c)||/token|secret|password|credential/i.test(c)}function e(a,b=new WeakSet){if(null==a||"object"!=typeof a)return a;if(b.has(a))return"[CIRCULAR]";if(b.add(a),Array.isArray(a))return a.map(a=>e(a,b));let d={};for(let[f,g]of Object.entries(a))d[f]=c.test(f)?"[REDACTED]":e(g,b);return d}function f(a){if(null==a)return a;let b=String(a);return(b=(b=b.replace(/\bBearer\s+[A-Za-z0-9._~+\/-]+=*/gi,"Bearer [REDACTED]")).replace(/\b(sk-ant-[A-Za-z0-9_-]{8,}|sk-[A-Za-z0-9_-]{8,})\b/g,"[REDACTED]")).replace(/("(?:access_token|refresh_token|id_token|api_key|apikey|password|secret|authorization)"\s*:\s*")([^"]+)(")/gi,"$1[REDACTED]$3")}a.exports={redactHeaders:function(a={}){let b={};for(let[c,e]of Object.entries(a||{}))b[c]=d(c)?"[REDACTED]":e;return b},redactObject:e,redactBodyText:function(a,b=""){let c=String(a||"");if(/application\/(?:[^;]+\+)?json/i.test(b)||/^[\s\r\n]*[\[{]/.test(c))try{let a=JSON.parse(c);return JSON.stringify(e(a))}catch{}return f(c)},scrubString:f,redactUrlPath:function(a){let b=String(a||"");try{let a=new URL(b,"https://audit.invalid");for(let b of[...a.searchParams.keys()])if(/token|secret|key|password|credential|authorization|^code$/i.test(b))a.searchParams.set(b,"[REDACTED]");else{let c=a.searchParams.get(b);c&&a.searchParams.set(b,f(c))}return`${a.pathname}${a.search}`}catch{return f(b)}},containsLikelySecret:function(a){let b="string"==typeof a?a:JSON.stringify(a);return/Bearer\s+(?!\[REDACTED\])\S+|sk-ant-[A-Za-z0-9_-]{8,}|\bsk-[A-Za-z0-9_-]{8,}/i.test(b||"")},shouldRedactHeader:d}},49083:(a,b,c)=>{let{createAuditProxy:d}=c(45372),{loadConfig:e,saveConfig:f,validateConfig:g,CONFIG_PATH:h,AUDIT_LOG_PATH:i,AUDIT_LOG_DIR:j,PROXY_AUTH_FEATURE_ENABLED:k}=c(43096),{hashProxyPassword:l,isValidUsername:m,normalizeProxyUsers:n,redactProxyAuthUsers:o,PASSWORD_MAX_BYTES:p,PASSWORD_MIN_BYTES:q}=c(7566),{normalizeAllowedClientIps:r,normalizeIp:s}=c(5565),{attachClientIpGate:t,effectiveClientIpPolicy:u,normalizeAccessGrants:v,normalizeGrantUserId:w}=c(77407),{SETTINGS_KEY:x,extractAuditPolicy:y,mergeAuditPolicy:z,policyEquals:A}=c(85463),{enqueueAuditJob:B,readRecent:C,clearAudit:D,pruneExpired:E,startAuditMaintenance:F,stopAuditMaintenance:G,flushAuditQueue:H,getAuditStoreStats:I}=c(90173),{ensureAuditRootCA:J,createAuditCertificateProvider:K,validateRootCaPair:L}=c(85074),{readRootCAInfo:M}=c(8578),{runSelfTest:N}=c(85252);function O(){return globalThis.__blueRouterAuditProxyRuntime||(globalThis.__blueRouterAuditProxyRuntime={server:null,certificateProvider:null,ipPolicy:null,ipGate:null,startedAt:null,lastError:null,autostartPromise:null,lifecycle:Promise.resolve()}),globalThis.__blueRouterAuditProxyRuntime}function P(a){let b=O(),c=b.lifecycle.then(a,a);return b.lifecycle=c.catch(()=>{}),c}async function Q(a,b=1500){if(!a)return;let c=Math.max(0,Number(b)||0);await new Promise(b=>{let d=!1,e=()=>{d||(d=!0,b())};try{a.listening?a.close(e):e()}catch{e()}let f=setTimeout(()=>{try{a.forceCloseAll?.()}catch{}},c);f.unref?.();let g=setTimeout(e,c+2e3);g.unref?.()});try{a.forceCloseAll?.()}catch{}}function R(a){let b=e();return{...a,proxyAuthEnabled:!0===b.proxyAuthEnabled,proxyAuthUsers:[...b.proxyAuthUsers||[]],accessGrants:v(b.accessGrants)}}async function S(a=null){let b=O();if(b.server?.listening)return X();let c=a?f({...R(a),enabled:!1}):e();await J(),await E(),F();let g=K({maxEntries:128});g.prewarm(c.allowedHosts);let h=d(c,{certificateProvider:g,onAuditJob:B});b.ipPolicy=u(c),b.ipGate=t(h,()=>O().ipPolicy);try{let a=await new Promise((a,b)=>{let d=a=>{h.removeListener("listening",e),b(a)},e=()=>{h.removeListener("error",d),a(h.address())};h.once("error",d),h.once("listening",e),h.listen(c.port,c.bindHost)});return b.server=h,b.certificateProvider=g,b.startedAt=new Date().toISOString(),b.lastError=null,f({...c,enabled:!0}),{...await X(),address:a}}catch(a){b.lastError=a.message||String(a);try{h.forceCloseAll?.()}catch{}try{h.close()}catch{}throw g.clear?.(),a}}async function T({persist:a=!0}={}){let b=O(),c=b.server,d=e();return b.server=null,b.startedAt=null,await Q(c,d.shutdownGraceMs),b.certificateProvider?.clear?.(),b.certificateProvider=null,b.ipGate=null,await H(3e3),G(),a&&f({...d,enabled:!1}),X()}async function U(a=null){return await T({persist:!1}),a&&f({...R(a),enabled:!1}),S()}function V(a=null){return P(()=>S(a))}async function W(){let a=O();await ab();let b=e();return b.enabled?a.server?.listening?{started:!1,reason:"already-running",status:await X()}:(a.autostartPromise||(a.autostartPromise=(async()=>{try{let a=await V();return console.log(`[audit-proxy] autostarted on ${b.bindHost}:${b.port}`),{started:!0,status:a}}catch(b){return a.lastError=b?.message||String(b),console.log("[audit-proxy] autostart failed:",a.lastError),{started:!1,error:a.lastError}}finally{a.autostartPromise=null}})()),a.autostartPromise):{started:!1,reason:"disabled"}}async function X(){let a=O(),b=e(),c=u(b),d=!!a.server?.listening,f=M();try{let a=L();f={...f,validated:!0===a.exists,expiringSoon:!0===a.expiringSoon,autoRotation:!1}}catch(a){f={...f,validated:!1,autoRotation:!1,error:a.message||String(a)}}return{running:d,listening:d,startedAt:a.startedAt,lastError:a.lastError,address:d?a.server.address():null,pendingListenerRestart:d&&!function(a,b){if(!a)return!0;let c=String(b.bindHost||"").trim().toLowerCase(),d=s(a.address||""),e=s("localhost"===c?"127.0.0.1":c);return Number(a.port)===Number(b.port)&&d===e}(a.server.address(),b),activeConnections:d&&a.server.getActiveConnectionCount?.()||0,capabilities:d?a.server.auditCapabilities:{http1:!0,http2:!1,plainHttp:!1,publicConnectPorts:[443]},security:{clientIpFilterEnabled:c.enabled,clientIpFilterSource:c.source,enforcedClientIpCount:c.allowedClientIps.length,accessGrantCount:c.grants.length,clientToolFilterEnabled:!0===b.clientToolFilterEnabled,proxyAuthEnabled:!0===b.proxyAuthEnabled,proxyAuthFeatureEnabled:k,allowedClientToolCount:(b.allowedClientTools||[]).length,privateDestinationsBlocked:!0,plainHttpBlocked:!0,upstreamTlsVerified:!0},certificateCache:a.certificateProvider?.stats?.()||{entries:0},auditStore:I(),configPath:h,auditLogPath:i,auditLogDirectory:j,rootCA:f}}async function Y(a=50){let b=e(),[c,d]=await Promise.all([X(),C(a)]);return{config:Z(b),status:c,events:d}}function Z(a){return a?{...a,proxyAuthUsers:o(a.proxyAuthUsers)}:a}async function $(){return Promise.resolve().then(c.bind(c,89718))}async function _(){try{let{isClusterStandby:a}=await c.e(2763).then(c.bind(c,62763));return await a()===!0}catch{return!1}}async function aa(a){try{if(await _())return{mirrored:!1,reason:"standby"};let{getSettings:b,updateSettings:c}=await $(),d=y(a),e=await b();if(JSON.stringify(e?.[x]||null)===JSON.stringify(d))return{mirrored:!1,reason:"unchanged"};return await c({[x]:d}),{mirrored:!0}}catch(a){return console.warn("[audit-proxy] failed to mirror policy to settings:",a?.message||a),{mirrored:!1,error:a?.message||String(a)}}}async function ab({force:a=!1}={}){try{if(!a&&!await _())return{applied:!1,reason:"not-standby"};let{getSettings:b}=await $(),c=await b(),d=c?.[x];if(!d||"object"!=typeof d)return{applied:!1,reason:"no-policy"};let f=e();if(A(f,d))return{applied:!1,reason:"unchanged"};let g=z(f,d),h=await ac(g,{mirror:!1});return console.log("[audit-proxy] applied cluster policy from snapshot"),{applied:!0,restarted:!0===h.restarted,droppedConnections:h.droppedConnections||0}}catch(a){return console.warn("[audit-proxy] failed to apply cluster policy:",a?.message||a),{applied:!1,error:a?.message||String(a)}}}function ac(a,{mirror:b=!0}={}){return P(async()=>{let c=O(),d=!!c.server?.listening,e=f({...g(a),enabled:d});c.ipPolicy=u(e);let h=!1,i={},j=0;if(d){let a=c.server.applyConfig?.(e)||{};h=!0===a.rebindRequired,i=a.pending||{},j=c.ipGate?.dropRevoked()||0;try{c.certificateProvider?.prewarm?.(e.allowedHosts)}catch{}}return b&&await aa(e),{config:Z(e),status:await X(),restarted:!1,appliedInstantly:!0,rebindRequired:h,pendingListener:i,droppedConnections:j}})}a.exports={startProxy:V,ensureAuditProxyAutostart:W,stopProxy:function(a={}){return P(()=>T(a))},restartProxy:function(a=null){return P(()=>U(a))},getStatus:X,getSnapshot:Y,updateConfig:function(a){return ac(R(a))},updateClientProxyHost:function(a){return ac({...e(),clientProxyHost:String(a||"").trim()})},updateProxyAuth:async function a({enabled:b,users:c}={}){if(!0===b&&!k)throw Error("Proxy authentication is turned off in this deployment (PROXY_AUTH_FEATURE_ENABLED in audit-gateway/config.js)");let d=e(),f=new Map(n(d.proxyAuthUsers).map(a=>[a.username.toLowerCase(),a])),g=new Set,h=[];for(let a of Array.isArray(c)?c:[]){let b=String(a?.username||"").trim();if(!m(b))throw Error(`Invalid username: ${b||"(empty)"}`);let c=b.toLowerCase();if(g.has(c))throw Error(`Duplicate username: ${b}`);g.add(c);let d="string"==typeof a?.password?a.password:"";if(d){let a=Buffer.byteLength(d,"utf8");if(a<q)throw Error(`Password for ${b} must be at least ${q} characters`);if(a>p)throw Error(`Password for ${b} must be at most ${p} bytes`);h.push({username:b,passwordHash:await l(d)});continue}let e=f.get(c);if(!e)throw Error(`Account ${b} requires a password`);h.push({username:b,passwordHash:e.passwordHash})}return ac({...d,proxyAuthEnabled:!0===b,proxyAuthUsers:h})},listAccessGrants:function(){return v(e().accessGrants)},applyAuditPolicyFromSettings:ab,upsertAccessGrant:function({userId:a,ips:b,note:c}={}){let d=w(a);if(!d)throw Error("Grant requires a dashboard username or email");let f=e(),g=v(f.accessGrants).filter(a=>a.userId!==d);return g.push({userId:d,ips:r(b),note:c}),ac({...f,accessGrants:g})},deleteAccessGrant:function(a){let b=w(a);if(!b)throw Error("Grant requires a dashboard username or email");let c=e(),d=v(c.accessGrants).filter(a=>a.userId!==b);return ac({...c,accessGrants:d})},clearAudit:D,runSelfTest:N}},78864:(a,b,c)=>{let d=c(14985).promises,e=c(91645),{normalizeIp:f,clientIpMatches:g}=c(5565),h=new Map,i=Object.freeze(["0.0.0.0/8","10.0.0.0/8","100.64.0.0/10","127.0.0.0/8","169.254.0.0/16","172.16.0.0/12","192.0.0.0/24","192.0.2.0/24","192.88.99.0/24","192.168.0.0/16","198.18.0.0/15","198.51.100.0/24","203.0.113.0/24","224.0.0.0/4","240.0.0.0/4","::/96","::1/128","100::/64","2001:2::/48","2001:db8::/32","fc00::/7","fe80::/10","ff00::/8"]),j=Object.freeze([".localhost",".local",".internal",".lan",".home.arpa"]);function k(a){return String(a||"").trim().replace(/^\[|\]$/g,"").replace(/\.$/,"").toLowerCase()}function l(a){let b=k(a);return!(!(!b||"localhost"===b||j.some(a=>b.endsWith(a)))&&(e.isIP(b)||b.includes(".")))}function m(a){let b=f(a);return!!e.isIP(b)&&!g(b,i)}function n(a){let b=[...new Set((Array.isArray(a)?a:[a]).map(a=>Number(a)).filter(a=>Number.isInteger(a)&&a>=1&&a<=65535))];return b.length?b:[443]}function o(a){let b=[...a?.addresses||[]];return function(c,d,e){let f=d,g=e;"function"==typeof d&&(g=d,f={});let h="number"==typeof f?f:Number(f?.family||0);if("object"==typeof f&&f?.all===!0){let c=4===h||6===h?b.filter(a=>a.family===h):b;if(!c.length){let b=Error(`No validated public address for ${a.host}`);b.code="ENOTFOUND",g(b);return}g(null,c.map(({address:a,family:b})=>({address:a,family:b})));return}let i=function(a,b=0){let c=Number(b||0);return 4===c||6===c?a.find(a=>a.family===c)||null:a.find(a=>4===a.family)||a[0]||null}(b,h);if(!i){let b=Error(`No validated public address for ${a.host}`);b.code="ENOTFOUND",g(b);return}g(null,i.address,i.family)}}async function p(a,b,c={}){let g=k(a),i=Number(b||443),j=n(c.allowedPorts||[443]);if(!g)throw Error("Destination host is empty");if(!Number.isInteger(i)||!j.includes(i))throw Error(`CONNECT destination port ${i||"unknown"} is not allowed`);if(l(g))throw Error(`Private or local destination hostname is not allowed: ${g}`);let q=e.isIP(f(g));if(q){let a=f(g);if(!m(a))throw Error(`Private or reserved destination address is not allowed: ${a}`);let b={host:g,port:i,addresses:[{address:a,family:q}]};return{...b,lookup:o(b)}}let r=Date.now(),s=h.get(g);if(!s||s.expiresAt<=r){let a=await d.lookup(g,{all:!0,verbatim:!0}),b=[],c=new Set;for(let d of a||[]){let a=f(d.address),g=e.isIP(a);if(!g||!m(a))continue;let h=`${g}:${a}`;c.has(h)||(c.add(h),b.push({address:a,family:g}))}if(!b.length)throw Error(`Destination did not resolve to a public address: ${g}`);s={addresses:b,expiresAt:r+6e4},h.set(g,s)}let t={host:g,port:i,addresses:[...s.addresses]};return{...t,lookup:o(t)}}a.exports={BLOCKED_ADDRESS_RANGES:i,normalizeTargetHost:k,normalizeAllowedPorts:n,isBlockedHostname:l,isPublicAddress:m,createPinnedLookup:o,resolvePublicTarget:p,clearDnsPolicyCache:function(){h.clear()}}},85252:(a,b,c)=>{let d=c(81630),e=c(73496),f=c(91645),g=c(34631),h=c(74075),i=c(55511),j=c(15296),{createAuditProxy:k,CaptureBuffer:l}=c(45372),{containsLikelySecret:m}=c(48350),{clientIpMatches:n,normalizeAllowedClientIps:o}=c(5565),{normalizeAllowedTools:p,clientToolMatches:q,shouldRefuseClientTool:r}=c(98586),{createProxyAuthenticator:s,createProxyAuthLimiter:t,hashProxyPassword:u,parseBasicProxyAuthorization:v}=c(7566),{isPublicAddress:w}=c(78864),{validateConfig:x,PROXY_AUTH_FEATURE_ENABLED:y}=c(43096),{normalizeAccessGrants:z,effectiveClientIpPolicy:A,attachClientIpGate:B,findAccessGrant:C}=c(77407),{promptLogMirrorDecision:D}=c(90173);function E(a){return i.createHash("sha256").update(a).digest("hex")}function F(a){let b=j.pki.rsa.generateKeyPair(2048),c=j.pki.createCertificate();c.publicKey=b.publicKey,c.serialNumber=String(Date.now()),c.validity.notBefore=new Date(Date.now()-6e4),c.validity.notAfter=new Date(Date.now()+864e5);let d=[{name:"commonName",value:a}];return c.setSubject(d),c.setIssuer(d),c.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,cRLSign:!0,critical:!0}]),c.sign(b.privateKey,j.md.sha256.create()),{cert:c,keys:b,certPem:j.pki.certificateToPem(c)}}function G(a,b){let c=j.pki.rsa.generateKeyPair(2048),d=j.pki.createCertificate();return d.publicKey=c.publicKey,d.serialNumber=`${Date.now()}${Math.floor(1e3*Math.random())}`,d.validity.notBefore=new Date(Date.now()-6e4),d.validity.notAfter=new Date(Date.now()+864e5),d.setSubject([{name:"commonName",value:b}]),d.setIssuer(a.cert.subject.attributes),d.setExtensions([{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0},{name:"extKeyUsage",serverAuth:!0},{name:"subjectAltName",altNames:[{type:2,value:b}]}]),d.sign(a.keys.privateKey,j.md.sha256.create()),{cert:j.pki.certificateToPem(d),key:j.pki.privateKeyToPem(c.privateKey)}}function H(a,b="127.0.0.1"){return new Promise((c,d)=>{a.once("error",d),a.listen(0,b,()=>{a.removeListener("error",d),c(a.address())})})}function I(a){return new Promise(b=>{if(!a)return b();try{a.forceCloseAll?.()}catch{}if(!a.listening)return b();a.close(()=>b()),setTimeout(b,1e3).unref?.()})}function J(a,b){let c="127.0.0.1";return Promise.resolve({host:a,port:b,addresses:[{address:c,family:4}],lookup:(a,b,d)=>{let e=b,f=d;"function"==typeof b&&(f=b,e={}),e?.all?f(null,[{address:c,family:4}]):f(null,c,4)}})}function K(a,b,c="",d=""){return new Promise((e,g)=>{let h=f.connect(a,"127.0.0.1"),i=Buffer.alloc(0),j=setTimeout(()=>g(Error("CONNECT timeout")),7e3);h.once("error",g),h.once("connect",()=>{let a=c?`User-Agent: ${c}\r
8
8
  `:"";h.write(`CONNECT ${b} HTTP/1.1\r
9
9
  Host: ${b}\r
10
10
  ${a}${d}Proxy-Connection: keep-alive\r
@@ -22,7 +22,7 @@ Content-Type: application/json\r
22
22
  Content-Length: ${e.length}\r
23
23
  Connection: close\r
24
24
  \r
25
- `),l.write(e)}),l.on("data",a=>m.push(Buffer.from(a))),l.on("end",()=>{clearTimeout(n),j(function(a){let b=a.indexOf("\r\n\r\n");if(b<0)throw Error("Invalid HTTP/1.1 response");let c=a.subarray(0,b).toString("latin1"),d={};for(let a of c.split("\r\n").slice(1)){let b=a.indexOf(":");b>0&&(d[a.slice(0,b).toLowerCase()]=a.slice(b+1).trim())}let e=Number(d["content-length"]||0);return{head:c,headers:d,body:a.subarray(b+4,e?b+4+e:void 0)}}(Buffer.concat(m)))})})}a.exports={runSelfTest:async function(){let a=Date.now(),b=[],c=(a,c,d="")=>b.push({name:a,ok:!!c,detail:d}),j=z([{userId:"Anh-TCT@Fujinet.net",ips:["172.16.253.2","172.16.253.2","172.16.6.0/24"],note:" Laptop "},{userId:"anh-tct@fujinet.net",ips:["10.9.9.9"]},{userId:"",ips:["10.0.0.1"]}]);c("Grant user id is normalised and duplicates merge",1===j.length&&"anh-tct@fujinet.net"===j[0].userId,JSON.stringify(j)),c("Grant addresses deduplicate and keep CIDR form",j[0]?.ips.join(",")==="172.16.253.2,172.16.6.0/24,10.9.9.9",j[0]?.ips.join(",")),c("Grant note is trimmed",j[0]?.note==="Laptop",j[0]?.note);let s=z([{userId:"anh-tct",ips:["10.1.1.1"]},{userId:"bob@fujinet.net",ips:["10.1.1.2"]}]);c("Grant lookup matches a bare username",C(s,"Anh-TCT")?.ips.join()==="10.1.1.1"),c("Grant lookup matches an email identity",C(s,"BOB@fujinet.net")?.ips.join()==="10.1.1.2"),c("Grant lookup refuses an unknown identity",null===C(s,"carol"));let t="";try{z([{userId:"u",ips:["not-an-ip"]}])}catch(a){t=a.message||String(a)}c("Grant with an invalid address is rejected",/Invalid client IP/.test(t),t);let v=A({accessGrants:[{userId:"u",ips:["10.9.9.9"]}],clientIpFilterEnabled:!1,allowedClientIps:["192.168.1.1"]});c("A grant enforces the allowlist and supersedes the manual list",!0===v.enabled&&"grants"===v.source&&n("10.9.9.9",v.allowedClientIps)&&!n("192.168.1.1",v.allowedClientIps),JSON.stringify(v.allowedClientIps));let P=A({accessGrants:[{userId:"u",ips:[]}],clientIpFilterEnabled:!0,allowedClientIps:["192.168.1.1"]});c("Grants without an address fall back to the manual filter","manual"===P.source&&!0===P.enabled&&"192.168.1.1"===P.allowedClientIps.join(),JSON.stringify(P)),c("No grant and no manual filter leaves the listener open",!1===A({accessGrants:[],clientIpFilterEnabled:!1,allowedClientIps:[]}).enabled);let Q=d.createServer((a,b)=>b.end("served"));try{let a=A({accessGrants:[{userId:"elsewhere",ips:["10.99.99.99"]}]}),b=B(Q,()=>a),d=await H(Q),e=await M(d.port);c("A client IP nobody was granted is hung up on",!1===e.served,JSON.stringify(e)),a=A({accessGrants:[{userId:"granted",ips:["127.0.0.1"]}]});let g=await M(d.port);c("Granting an address applies on the next connection, no restart",!0===g.served&&/served/.test(g.received)&&!0===Q.listening,JSON.stringify(g.received.slice(0,40)));let h=f.connect(d.port,"127.0.0.1");await new Promise(a=>h.once("connect",a)),a=A({accessGrants:[{userId:"elsewhere",ips:["10.99.99.99"]}]});let i=b.dropRevoked();await new Promise(a=>setTimeout(a,50)),c("Revoking closes the connection that address already held",1===i&&!0===h.destroyed,`dropped=${i} destroyed=${h.destroyed}`);let j=await M(d.port);c("And refuses it on the next attempt",!1===j.served&&!0===Q.listening,JSON.stringify(j.hungUp))}finally{await I(Q)}let R=o(["172.16.253.3","10.20.30.0/24","2001:db8::/64"]);c("Client IP exact allowlist match",n("::ffff:172.16.253.3",R)),c("Client IPv4 CIDR allowlist match",n("10.20.30.77",R)),c("Client IPv6 CIDR allowlist match",n("2001:db8::1234",R)),c("Client IP outside allowlist denied",!n("10.20.31.77",R)),c("Public destination accepted",w("1.1.1.1"));let S=x({proxyAuthEnabled:!0,proxyAuthUsers:[{username:"anh-tct",passwordHash:`$2b$10$${"x".repeat(53)}`}]});c("A parked proxy-auth flag is enforced, not just hidden",y?!0===S.proxyAuthEnabled:!1===S.proxyAuthEnabled,`feature=${y} enforced=${S.proxyAuthEnabled}`),c("Parking proxy auth keeps saved accounts for later",1===S.proxyAuthUsers.length,JSON.stringify(S.proxyAuthUsers.map(a=>a.username)));let T=p(["claude-code","codex"]);if(c("Preset expands to the tool's User-Agent patterns",q("claude-cli/2.0.1 (external, cli)",T)),c("Codex User-Agent matches its preset",q("codex_cli_rs/0.147.0 (Windows 10.0.26200; x86_64)",T)),c("A browser is refused",r("Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/131.0",T)),c("An allowed tool is not refused",!r("claude-cli/2.1.241 (external, cli)",T)),c("A CONNECT without a User-Agent is let through",!r("",T)),c("A free-text entry is matched verbatim",q("my-internal-agent/3",p(["my-internal-agent"]))),c("Private destination rejected",!w("127.0.0.1")&&!w("169.254.169.254")),"function"==typeof h.zstdCompressSync){let a=JSON.stringify({input:[{content:[{text:"zstd audit ok"}]}]}),b=new l(1048576);b.add(h.zstdCompressSync(Buffer.from(a)));let d=await b.finish("application/json","zstd");c("Zstd audit body decoded",!0===d.decoded&&d.body.includes("zstd audit ok")&&!d.decodeError,d.decodeError||"")}else c("Zstd audit body decoded",!1,`This runtime has no zlib zstd support (${process.version}); Codex request bodies cannot be decoded. Run Node 22.15 or newer.`);let U=JSON.stringify({type:"message",content:[{type:"text",text:"brotli audit ok"}]}),V=new l(1048576);V.add(h.brotliCompressSync(Buffer.from(U)));let W=await V.finish("application/json","br");c("Brotli audit body decoded",!0===W.decoded&&W.body.includes("brotli audit ok")&&!W.decodeError);let X=Buffer.from(`TRUNCATED-GZIP-PREFIX-OK${i.randomBytes(8192).toString("hex")}`),Y=h.gzipSync(X),Z=new l(Math.floor(.7*Y.length));Z.add(Y);let $=await Z.finish("application/json","gzip");c("Truncated gzip audit body partially decoded",!0===$.decodePartial&&!0===$.truncated&&$.body.includes("TRUNCATED-GZIP-PREFIX-OK"),$.decodeError||"");let _=F("BlueRouter Audit Self Test Upstream CA"),aa=G(_,"localhost"),ab=F("BlueRouter Audit Self Test Proxy CA"),ac=G(ab,"localhost"),ad=Buffer.from(JSON.stringify({type:"message",content:[{type:"text",text:"compressed response preserved"}]})),ae=h.brotliCompressSync(ad),af=[],ag=`event: message_start
25
+ `),l.write(e)}),l.on("data",a=>m.push(Buffer.from(a))),l.on("end",()=>{clearTimeout(n),j(function(a){let b=a.indexOf("\r\n\r\n");if(b<0)throw Error("Invalid HTTP/1.1 response");let c=a.subarray(0,b).toString("latin1"),d={};for(let a of c.split("\r\n").slice(1)){let b=a.indexOf(":");b>0&&(d[a.slice(0,b).toLowerCase()]=a.slice(b+1).trim())}let e=Number(d["content-length"]||0);return{head:c,headers:d,body:a.subarray(b+4,e?b+4+e:void 0)}}(Buffer.concat(m)))})})}a.exports={runSelfTest:async function(){let a=Date.now(),b=[],c=(a,c,d="")=>b.push({name:a,ok:!!c,detail:d}),j=z([{userId:"Anh-TCT@Fujinet.net",ips:["172.16.253.2","172.16.253.2","172.16.6.0/24"],note:" Laptop "},{userId:"anh-tct@fujinet.net",ips:["10.9.9.9"]},{userId:"",ips:["10.0.0.1"]}]);c("Grant user id is normalised and duplicates merge",1===j.length&&"anh-tct@fujinet.net"===j[0].userId,JSON.stringify(j)),c("Grant addresses deduplicate and keep CIDR form",j[0]?.ips.join(",")==="172.16.253.2,172.16.6.0/24,10.9.9.9",j[0]?.ips.join(",")),c("Grant note is trimmed",j[0]?.note==="Laptop",j[0]?.note);let s=z([{userId:"anh-tct",ips:["10.1.1.1"]},{userId:"bob@fujinet.net",ips:["10.1.1.2"]}]);c("Grant lookup matches a bare username",C(s,"Anh-TCT")?.ips.join()==="10.1.1.1"),c("Grant lookup matches an email identity",C(s,"BOB@fujinet.net")?.ips.join()==="10.1.1.2"),c("Grant lookup refuses an unknown identity",null===C(s,"carol"));let t="";try{z([{userId:"u",ips:["not-an-ip"]}])}catch(a){t=a.message||String(a)}c("Grant with an invalid address is rejected",/Invalid client IP/.test(t),t);let v=A({accessGrants:[{userId:"u",ips:["10.9.9.9"]}],clientIpFilterEnabled:!1,allowedClientIps:["192.168.1.1"]});c("Only a granted address is allowed",!0===v.enabled&&"grants"===v.source&&n("10.9.9.9",v.allowedClientIps)&&!n("192.168.1.1",v.allowedClientIps),JSON.stringify(v.allowedClientIps));let P=A({accessGrants:[{userId:"u",ips:[]}],clientIpFilterEnabled:!0,allowedClientIps:["192.168.1.1"]});c("Grants without addresses keep the listener fail-closed","grants"===P.source&&!0===P.enabled&&0===P.allowedClientIps.length&&!n("192.168.1.1",P.allowedClientIps),JSON.stringify(P));let Q=A({accessGrants:[]});c("No granted address means IP filtering is on with a deny-all allowlist",!0===Q.enabled&&"grants"===Q.source&&0===Q.allowedClientIps.length,JSON.stringify(Q));let R=d.createServer((a,b)=>b.end("served"));try{let a=A({accessGrants:[{userId:"elsewhere",ips:["10.99.99.99"]}]}),b=B(R,()=>a),d=await H(R),e=await M(d.port);c("A client IP nobody was granted is hung up on",!1===e.served,JSON.stringify(e)),a=A({accessGrants:[{userId:"granted",ips:["127.0.0.1"]}]});let g=await M(d.port);c("Granting an address applies on the next connection, no restart",!0===g.served&&/served/.test(g.received)&&!0===R.listening,JSON.stringify(g.received.slice(0,40)));let h=f.connect(d.port,"127.0.0.1");await new Promise(a=>h.once("connect",a)),a=A({accessGrants:[{userId:"elsewhere",ips:["10.99.99.99"]}]});let i=b.dropRevoked();await new Promise(a=>setTimeout(a,50)),c("Revoking closes the connection that address already held",1===i&&!0===h.destroyed,`dropped=${i} destroyed=${h.destroyed}`);let j=await M(d.port);c("And refuses it on the next attempt",!1===j.served&&!0===R.listening,JSON.stringify(j.hungUp))}finally{await I(R)}let S=o(["172.16.253.3","10.20.30.0/24","2001:db8::/64"]);c("Client IP exact allowlist match",n("::ffff:172.16.253.3",S)),c("Client IPv4 CIDR allowlist match",n("10.20.30.77",S)),c("Client IPv6 CIDR allowlist match",n("2001:db8::1234",S)),c("Client IP outside allowlist denied",!n("10.20.31.77",S)),c("Public destination accepted",w("1.1.1.1"));let T=x({proxyAuthEnabled:!0,proxyAuthUsers:[{username:"anh-tct",passwordHash:`$2b$10$${"x".repeat(53)}`}]});c("A parked proxy-auth flag is enforced, not just hidden",y?!0===T.proxyAuthEnabled:!1===T.proxyAuthEnabled,`feature=${y} enforced=${T.proxyAuthEnabled}`),c("Parking proxy auth keeps saved accounts for later",1===T.proxyAuthUsers.length,JSON.stringify(T.proxyAuthUsers.map(a=>a.username)));let U=p(["claude-code","codex"]);if(c("Preset expands to the tool's User-Agent patterns",q("claude-cli/2.0.1 (external, cli)",U)),c("Codex User-Agent matches its preset",q("codex_cli_rs/0.147.0 (Windows 10.0.26200; x86_64)",U)),c("A browser is refused",r("Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/131.0",U)),c("An allowed tool is not refused",!r("claude-cli/2.1.241 (external, cli)",U)),c("A CONNECT without a User-Agent is let through",!r("",U)),c("A free-text entry is matched verbatim",q("my-internal-agent/3",p(["my-internal-agent"]))),c("Private destination rejected",!w("127.0.0.1")&&!w("169.254.169.254")),"function"==typeof h.zstdCompressSync){let a=JSON.stringify({input:[{content:[{text:"zstd audit ok"}]}]}),b=new l(1048576);b.add(h.zstdCompressSync(Buffer.from(a)));let d=await b.finish("application/json","zstd");c("Zstd audit body decoded",!0===d.decoded&&d.body.includes("zstd audit ok")&&!d.decodeError,d.decodeError||"")}else c("Zstd audit body decoded",!1,`This runtime has no zlib zstd support (${process.version}); Codex request bodies cannot be decoded. Run Node 22.15 or newer.`);let V=JSON.stringify({type:"message",content:[{type:"text",text:"brotli audit ok"}]}),W=new l(1048576);W.add(h.brotliCompressSync(Buffer.from(V)));let X=await W.finish("application/json","br");c("Brotli audit body decoded",!0===X.decoded&&X.body.includes("brotli audit ok")&&!X.decodeError);let Y=Buffer.from(`TRUNCATED-GZIP-PREFIX-OK${i.randomBytes(8192).toString("hex")}`),Z=h.gzipSync(Y),$=new l(Math.floor(.7*Z.length));$.add(Z);let _=await $.finish("application/json","gzip");c("Truncated gzip audit body partially decoded",!0===_.decodePartial&&!0===_.truncated&&_.body.includes("TRUNCATED-GZIP-PREFIX-OK"),_.decodeError||"");let aa=F("BlueRouter Audit Self Test Upstream CA"),ab=G(aa,"localhost"),ac=F("BlueRouter Audit Self Test Proxy CA"),ad=G(ac,"localhost"),ae=Buffer.from(JSON.stringify({type:"message",content:[{type:"text",text:"compressed response preserved"}]})),af=h.brotliCompressSync(ae),ag=[],ah=`event: message_start
26
26
  data: ${JSON.stringify({type:"message_start",message:{id:"msg_selftest",type:"message",role:"assistant",model:"audit-self-test-stream-model",content:[],usage:{input_tokens:11,cache_creation_input_tokens:22,cache_read_input_tokens:33,output_tokens:1}}})}
27
27
 
28
28
  event: content_block_delta
@@ -33,7 +33,7 @@ data: ${JSON.stringify({type:"message_delta",delta:{stop_reason:"end_turn"},usag
33
33
 
34
34
  event: message_stop
35
35
  data: ${JSON.stringify({type:"message_stop"})}
36
- `,ah=h.gzipSync(Buffer.from(ag,"utf8")),ai=e.createSecureServer({key:aa.key,cert:aa.cert,allowHTTP1:!0});ai.on("request",(a,b)=>{let c=[];a.on("data",a=>c.push(Buffer.from(a))),a.on("end",()=>{if(af.push({proxyAuthorization:a.headers["proxy-authorization"]||null,protocol:2===a.httpVersionMajor?"h2":"http/1.1",path:a.url,authorization:a.headers.authorization,apiKey:a.headers["x-api-key"],internalHeader:a.headers["x-9r-source-tool"],body:Buffer.concat(c)}),String(a.url||"").includes("stream=1")){b.writeHead(200,{"content-type":"text/event-stream","content-encoding":"gzip","content-length":String(ah.length)}),b.end(ah);return}b.writeHead(200,{"content-type":"application/json","content-encoding":"br","content-length":String(ae.length)}),b.end(ae)})});let aj=[],ak=null,al=null;try{var am;let a=await H(ai);ak=k({allowedHosts:["localhost"],passthroughUnknown:!1,captureBodies:!0,captureLimitBytes:1048576,verifyUpstreamTls:!0,allowedConnectPorts:[a.port],connectTimeoutMs:5e3,tlsHandshakeTimeoutMs:5e3,responseHeaderTimeoutMs:5e3,idleTimeoutMs:3e4},{certificateProvider:()=>ac,upstreamCa:_.certPem,resolveTarget:J,onAudit:a=>aj.push(a)});let b=await H(ak),d=await (am=b.port,new Promise((a,b)=>{let c=f.connect(am,"127.0.0.1"),d=[],e=setTimeout(()=>b(Error("Plain HTTP rejection timeout")),5e3);c.once("connect",()=>c.end("GET http://example.com/ HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n")),c.on("data",a=>d.push(Buffer.from(a))),c.once("error",b),c.once("end",()=>{clearTimeout(e),a(Buffer.concat(d).toString("utf8"))})}));c("Plain HTTP forward proxy is disabled",d.startsWith("HTTP/1.1 403"));let e="";try{await K(b.port,`blocked.invalid:${a.port}`)}catch(a){e=a.message||String(a)}c("CONNECT to a non-allowlisted host is refused",e.includes("403"),e),await new Promise(a=>setTimeout(a,100));let h=aj.find(a=>"CONNECT"===a.method&&"blocked.invalid"===a.host);c("Refused CONNECT is audited with the blocked host",!!h,h?"":"no CONNECT event recorded"),c("Refused CONNECT records why it was blocked",/allowlist/i.test(h?.error||""),h?.error||""),c("Refused CONNECT is flagged as denied",h?.denied===!0,String(h?.denied));let j=D(h);c("Denied event is not mirrored into prompt_logs",!1===j.mirror&&"denied"===j.reason,JSON.stringify(j));let l=k({allowedHosts:["localhost"],passthroughUnknown:!1,captureBodies:!0,captureLimitBytes:1048576,verifyUpstreamTls:!0,allowedConnectPorts:[a.port],connectTimeoutMs:5e3,tlsHandshakeTimeoutMs:5e3,responseHeaderTimeoutMs:5e3,idleTimeoutMs:3e4,clientToolFilterEnabled:!0,allowedClientTools:["claude-code"]},{certificateProvider:()=>ac,upstreamCa:_.certPem,resolveTarget:J,onAudit:a=>aj.push(a)}),n=await H(l),o="";try{(await K(n.port,`localhost:${a.port}`,"claude-cli/2.0.1 (external, cli)")).destroy()}catch(a){o=a.message||String(a)}c("Allowed tool still opens a tunnel",""===o,o);let q="";try{await K(n.port,`localhost:${a.port}`,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/131.0")}catch(a){q=a.message||String(a)}c("Browser is turned away by the tool filter",q.includes("403"),q);let r="";try{(await K(n.port,`localhost:${a.port}`)).destroy()}catch(a){r=a.message||String(a)}c("A client sending no User-Agent still connects",""===r,r),await new Promise(a=>setTimeout(a,100));let s=aj.find(a=>/Client tool is not allowed/i.test(a.error||""));c("Refused tool is audited with the User-Agent that was rejected",/Chrome|no User-Agent/i.test(s?.error||""),s?.error||""),await I(l);let t="selftest-user",v="selftest:pass:with:colons",w=await u(v),x=0,y=k({allowedHosts:["localhost"],passthroughUnknown:!0,captureBodies:!0,captureLimitBytes:1048576,verifyUpstreamTls:!0,allowedConnectPorts:[a.port],connectTimeoutMs:5e3,tlsHandshakeTimeoutMs:5e3,responseHeaderTimeoutMs:5e3,idleTimeoutMs:3e4,proxyAuthEnabled:!0,proxyAuthUsers:[{username:t,passwordHash:w}]},{certificateProvider:()=>ac,upstreamCa:_.certPem,resolveTarget:(a,b)=>(x+=1,J(a,b)),onAudit:a=>aj.push(a)}),z=await H(y),A=`localhost:${a.port}`,B=await L(z.port,A);c("CONNECT without credentials is refused with 407",B.startsWith("HTTP/1.1 407 Proxy Authentication Required"),B.split("\r\n")[0]),c("407 carries a Basic challenge",/Proxy-Authenticate: Basic realm="BlueRouter Audit Proxy", charset="UTF-8"/.test(B)),c("407 closes the connection",/Connection: close/i.test(B));let C=await L(z.port,A,N(t,"wrong"));c("Wrong password is refused with 407",C.startsWith("HTTP/1.1 407"),C.split("\r\n")[0]);let F=await L(z.port,A,N("nobody",v));c("Unknown username is refused with 407",F.startsWith("HTTP/1.1 407"),F.split("\r\n")[0]);let G=await L(z.port,`blocked.invalid:${a.port}`);c("Unauthenticated client cannot use the passthrough tunnel",G.startsWith("HTTP/1.1 407"),G.split("\r\n")[0]),c("Unauthenticated client cannot tell an allowlisted host from a blocked one",B.split("\r\n")[0]===G.split("\r\n")[0]),c("Unauthenticated CONNECT does not resolve the destination",0===x,`resolver called ${x} times`);let M=Buffer.from(JSON.stringify({model:"audit-self-test-auth",messages:[]})),P=await K(z.port,A,"",N(t,v)),Q=await O({socket:P,ca:ab.certPem,servername:"localhost",port:a.port,body:M,path:"/v1/messages?auth=1"});c("Correct credentials open a working tunnel",Q.head.startsWith("HTTP/1.1 200"),Q.head.split("\r\n")[0]),c("Authenticated CONNECT does resolve the destination",x>0,`resolver called ${x} times`),await new Promise(a=>setTimeout(a,100));let R=aj.find(a=>String(a.path||"").includes("auth=1"));c("Authenticated tunnel attributes the username on the request event",R?.client?.proxyUser===t,R?.client?.proxyUser||"(none)");let S=aj.find(a=>407===a.status&&a.error&&/Invalid proxy credentials/.test(a.error));c("Failed proxy auth is audited",!!S,S?"":"no 407 event recorded");let T=Buffer.from(`${t}:${v}`).toString("base64"),U=aj.some(a=>{let b=JSON.stringify(a);return b.includes(v)||b.includes(T)});c("No audit event records the proxy credential",!U),c("Proxy-Authorization is redacted in audit events",aj.filter(a=>"proxy-authorization"in(a.request?.headers||{})).every(a=>"[REDACTED]"===a.request.headers["proxy-authorization"])),c("Proxy-Authorization never reaches the origin",af.every(a=>null==a.proxyAuthorization)),await I(y);let V=Buffer.from(JSON.stringify({model:"audit-self-test-h1",messages:[{role:"user",content:"hello h1 ✓"}]})),W="/v1/messages?beta=true&encoded=%2F",X=await K(b.port,`localhost:${a.port}`),Y=await O({socket:X,ca:ab.certPem,servername:"localhost",port:a.port,body:V,path:W});c("HTTP/1.1 CONNECT and TLS succeeded",Y.head.startsWith("HTTP/1.1 200")),c("HTTP/1.1 compressed response bytes preserved",E(Y.body)===E(ae));let Z=Buffer.from(JSON.stringify({model:"audit-self-test-h2-downgrade",messages:[{role:"user",content:"hello downgrade ✓"}]})),$="/v1/messages?beta=true&protocol=h2-preferred",aa=await K(b.port,`localhost:${a.port}`),ad=null,ag=await O({socket:aa,ca:ab.certPem,servername:"localhost",port:a.port,body:Z,path:$,alpnProtocols:["h2","http/1.1"],onAlpn:a=>{ad=a}});c("h2-preferring client is downgraded to HTTP/1.1","http/1.1"===ad,`negotiated ${ad||"none"}`),c("Downgraded client still gets a response",ag.head.startsWith("HTTP/1.1 200")),c("Downgraded compressed response bytes preserved",E(ag.body)===E(ae)),c("HTTP/2 is not advertised while the h2 path is unfixed",ak.auditCapabilities?.http2===!1);let ah=Buffer.from(JSON.stringify({model:"audit-self-test-stream-model",messages:[{role:"user",content:"x".repeat(1052672)}]})),an=await K(b.port,`localhost:${a.port}`),ao=await O({socket:an,ca:ab.certPem,servername:"localhost",port:a.port,body:ah,path:"/v1/messages?beta=true&stream=1"});c("Streaming response forwarded",ao.head.startsWith("HTTP/1.1 200")),await new Promise(a=>setTimeout(a,100));let ap=aj.find(a=>String(a.path||"").includes("stream=1"));c("Streaming audit event captured",!!ap),c("Token usage extracted from streamed response",ap?.usage?.inputTokens===11&&ap?.usage?.cacheCreationTokens===22&&ap?.usage?.cacheReadTokens===33&&ap?.usage?.outputTokens===44&&ap?.usage?.totalTokens===110,JSON.stringify(ap?.usage||null)),c("Streamed usage marked complete",ap?.usage?.complete===!0&&ap?.usage?.stopReason==="end_turn"),c("Model recovered from response when request body is truncated",ap?.request?.truncated===!0&&ap?.model==="audit-self-test-stream-model"),c("Exchange without token usage reports none",aj.some(a=>String(a.path||"").includes("encoded=")&&null==a.usage));let aq=await K(b.port,`localhost:${a.port}`),ar=await function({socket:a,ca:b,servername:c,port:d,path:e}){return new Promise((f,h)=>{let j=g.connect({socket:a,ca:b,servername:c,rejectUnauthorized:!0,ALPNProtocols:["http/1.1"]}),k=[],l=setTimeout(()=>h(Error("Upgrade test timeout")),1e4);j.once("error",h),j.once("secureConnect",()=>{j.write(`GET ${e} HTTP/1.1\r
36
+ `,ai=h.gzipSync(Buffer.from(ah,"utf8")),aj=e.createSecureServer({key:ab.key,cert:ab.cert,allowHTTP1:!0});aj.on("request",(a,b)=>{let c=[];a.on("data",a=>c.push(Buffer.from(a))),a.on("end",()=>{if(ag.push({proxyAuthorization:a.headers["proxy-authorization"]||null,protocol:2===a.httpVersionMajor?"h2":"http/1.1",path:a.url,authorization:a.headers.authorization,apiKey:a.headers["x-api-key"],internalHeader:a.headers["x-9r-source-tool"],body:Buffer.concat(c)}),String(a.url||"").includes("stream=1")){b.writeHead(200,{"content-type":"text/event-stream","content-encoding":"gzip","content-length":String(ai.length)}),b.end(ai);return}b.writeHead(200,{"content-type":"application/json","content-encoding":"br","content-length":String(af.length)}),b.end(af)})});let ak=[],al=null,am=null;try{var an;let a=await H(aj);al=k({allowedHosts:["localhost"],passthroughUnknown:!1,captureBodies:!0,captureLimitBytes:1048576,verifyUpstreamTls:!0,allowedConnectPorts:[a.port],connectTimeoutMs:5e3,tlsHandshakeTimeoutMs:5e3,responseHeaderTimeoutMs:5e3,idleTimeoutMs:3e4},{certificateProvider:()=>ad,upstreamCa:aa.certPem,resolveTarget:J,onAudit:a=>ak.push(a)});let b=await H(al),d=await (an=b.port,new Promise((a,b)=>{let c=f.connect(an,"127.0.0.1"),d=[],e=setTimeout(()=>b(Error("Plain HTTP rejection timeout")),5e3);c.once("connect",()=>c.end("GET http://example.com/ HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n")),c.on("data",a=>d.push(Buffer.from(a))),c.once("error",b),c.once("end",()=>{clearTimeout(e),a(Buffer.concat(d).toString("utf8"))})}));c("Plain HTTP forward proxy is disabled",d.startsWith("HTTP/1.1 403"));let e="";try{await K(b.port,`blocked.invalid:${a.port}`)}catch(a){e=a.message||String(a)}c("CONNECT to a non-allowlisted host is refused",e.includes("403"),e),await new Promise(a=>setTimeout(a,100));let h=ak.find(a=>"CONNECT"===a.method&&"blocked.invalid"===a.host);c("Refused CONNECT is audited with the blocked host",!!h,h?"":"no CONNECT event recorded"),c("Refused CONNECT records why it was blocked",/allowlist/i.test(h?.error||""),h?.error||""),c("Refused CONNECT is flagged as denied",h?.denied===!0,String(h?.denied));let j=D(h);c("Denied event is not mirrored into prompt_logs",!1===j.mirror&&"denied"===j.reason,JSON.stringify(j));let l=k({allowedHosts:["localhost"],passthroughUnknown:!1,captureBodies:!0,captureLimitBytes:1048576,verifyUpstreamTls:!0,allowedConnectPorts:[a.port],connectTimeoutMs:5e3,tlsHandshakeTimeoutMs:5e3,responseHeaderTimeoutMs:5e3,idleTimeoutMs:3e4,clientToolFilterEnabled:!0,allowedClientTools:["claude-code"]},{certificateProvider:()=>ad,upstreamCa:aa.certPem,resolveTarget:J,onAudit:a=>ak.push(a)}),n=await H(l),o="";try{(await K(n.port,`localhost:${a.port}`,"claude-cli/2.0.1 (external, cli)")).destroy()}catch(a){o=a.message||String(a)}c("Allowed tool still opens a tunnel",""===o,o);let q="";try{await K(n.port,`localhost:${a.port}`,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/131.0")}catch(a){q=a.message||String(a)}c("Browser is turned away by the tool filter",q.includes("403"),q);let r="";try{(await K(n.port,`localhost:${a.port}`)).destroy()}catch(a){r=a.message||String(a)}c("A client sending no User-Agent still connects",""===r,r),await new Promise(a=>setTimeout(a,100));let s=ak.find(a=>/Client tool is not allowed/i.test(a.error||""));c("Refused tool is audited with the User-Agent that was rejected",/Chrome|no User-Agent/i.test(s?.error||""),s?.error||""),await I(l);let t="selftest-user",v="selftest:pass:with:colons",w=await u(v),x=0,y=k({allowedHosts:["localhost"],passthroughUnknown:!0,captureBodies:!0,captureLimitBytes:1048576,verifyUpstreamTls:!0,allowedConnectPorts:[a.port],connectTimeoutMs:5e3,tlsHandshakeTimeoutMs:5e3,responseHeaderTimeoutMs:5e3,idleTimeoutMs:3e4,proxyAuthEnabled:!0,proxyAuthUsers:[{username:t,passwordHash:w}]},{certificateProvider:()=>ad,upstreamCa:aa.certPem,resolveTarget:(a,b)=>(x+=1,J(a,b)),onAudit:a=>ak.push(a)}),z=await H(y),A=`localhost:${a.port}`,B=await L(z.port,A);c("CONNECT without credentials is refused with 407",B.startsWith("HTTP/1.1 407 Proxy Authentication Required"),B.split("\r\n")[0]),c("407 carries a Basic challenge",/Proxy-Authenticate: Basic realm="BlueRouter Audit Proxy", charset="UTF-8"/.test(B)),c("407 closes the connection",/Connection: close/i.test(B));let C=await L(z.port,A,N(t,"wrong"));c("Wrong password is refused with 407",C.startsWith("HTTP/1.1 407"),C.split("\r\n")[0]);let F=await L(z.port,A,N("nobody",v));c("Unknown username is refused with 407",F.startsWith("HTTP/1.1 407"),F.split("\r\n")[0]);let G=await L(z.port,`blocked.invalid:${a.port}`);c("Unauthenticated client cannot use the passthrough tunnel",G.startsWith("HTTP/1.1 407"),G.split("\r\n")[0]),c("Unauthenticated client cannot tell an allowlisted host from a blocked one",B.split("\r\n")[0]===G.split("\r\n")[0]),c("Unauthenticated CONNECT does not resolve the destination",0===x,`resolver called ${x} times`);let M=Buffer.from(JSON.stringify({model:"audit-self-test-auth",messages:[]})),P=await K(z.port,A,"",N(t,v)),Q=await O({socket:P,ca:ac.certPem,servername:"localhost",port:a.port,body:M,path:"/v1/messages?auth=1"});c("Correct credentials open a working tunnel",Q.head.startsWith("HTTP/1.1 200"),Q.head.split("\r\n")[0]),c("Authenticated CONNECT does resolve the destination",x>0,`resolver called ${x} times`),await new Promise(a=>setTimeout(a,100));let R=ak.find(a=>String(a.path||"").includes("auth=1"));c("Authenticated tunnel attributes the username on the request event",R?.client?.proxyUser===t,R?.client?.proxyUser||"(none)");let S=ak.find(a=>407===a.status&&a.error&&/Invalid proxy credentials/.test(a.error));c("Failed proxy auth is audited",!!S,S?"":"no 407 event recorded");let T=Buffer.from(`${t}:${v}`).toString("base64"),U=ak.some(a=>{let b=JSON.stringify(a);return b.includes(v)||b.includes(T)});c("No audit event records the proxy credential",!U),c("Proxy-Authorization is redacted in audit events",ak.filter(a=>"proxy-authorization"in(a.request?.headers||{})).every(a=>"[REDACTED]"===a.request.headers["proxy-authorization"])),c("Proxy-Authorization never reaches the origin",ag.every(a=>null==a.proxyAuthorization)),await I(y);let V=Buffer.from(JSON.stringify({model:"audit-self-test-h1",messages:[{role:"user",content:"hello h1 ✓"}]})),W="/v1/messages?beta=true&encoded=%2F",X=await K(b.port,`localhost:${a.port}`),Y=await O({socket:X,ca:ac.certPem,servername:"localhost",port:a.port,body:V,path:W});c("HTTP/1.1 CONNECT and TLS succeeded",Y.head.startsWith("HTTP/1.1 200")),c("HTTP/1.1 compressed response bytes preserved",E(Y.body)===E(af));let Z=Buffer.from(JSON.stringify({model:"audit-self-test-h2-downgrade",messages:[{role:"user",content:"hello downgrade ✓"}]})),$="/v1/messages?beta=true&protocol=h2-preferred",_=await K(b.port,`localhost:${a.port}`),ab=null,ae=await O({socket:_,ca:ac.certPem,servername:"localhost",port:a.port,body:Z,path:$,alpnProtocols:["h2","http/1.1"],onAlpn:a=>{ab=a}});c("h2-preferring client is downgraded to HTTP/1.1","http/1.1"===ab,`negotiated ${ab||"none"}`),c("Downgraded client still gets a response",ae.head.startsWith("HTTP/1.1 200")),c("Downgraded compressed response bytes preserved",E(ae.body)===E(af)),c("HTTP/2 is not advertised while the h2 path is unfixed",al.auditCapabilities?.http2===!1);let ah=Buffer.from(JSON.stringify({model:"audit-self-test-stream-model",messages:[{role:"user",content:"x".repeat(1052672)}]})),ai=await K(b.port,`localhost:${a.port}`),ao=await O({socket:ai,ca:ac.certPem,servername:"localhost",port:a.port,body:ah,path:"/v1/messages?beta=true&stream=1"});c("Streaming response forwarded",ao.head.startsWith("HTTP/1.1 200")),await new Promise(a=>setTimeout(a,100));let ap=ak.find(a=>String(a.path||"").includes("stream=1"));c("Streaming audit event captured",!!ap),c("Token usage extracted from streamed response",ap?.usage?.inputTokens===11&&ap?.usage?.cacheCreationTokens===22&&ap?.usage?.cacheReadTokens===33&&ap?.usage?.outputTokens===44&&ap?.usage?.totalTokens===110,JSON.stringify(ap?.usage||null)),c("Streamed usage marked complete",ap?.usage?.complete===!0&&ap?.usage?.stopReason==="end_turn"),c("Model recovered from response when request body is truncated",ap?.request?.truncated===!0&&ap?.model==="audit-self-test-stream-model"),c("Exchange without token usage reports none",ak.some(a=>String(a.path||"").includes("encoded=")&&null==a.usage));let aq=await K(b.port,`localhost:${a.port}`),ar=await function({socket:a,ca:b,servername:c,port:d,path:e}){return new Promise((f,h)=>{let j=g.connect({socket:a,ca:b,servername:c,rejectUnauthorized:!0,ALPNProtocols:["http/1.1"]}),k=[],l=setTimeout(()=>h(Error("Upgrade test timeout")),1e4);j.once("error",h),j.once("secureConnect",()=>{j.write(`GET ${e} HTTP/1.1\r
37
37
  Host: localhost:${d}\r
38
38
  Upgrade: websocket\r
39
39
  Connection: Upgrade\r
@@ -42,10 +42,10 @@ x-api-key: sk-test-supersecret-123456789\r
42
42
  Sec-WebSocket-Key: ${i.randomBytes(16).toString("base64")}\r
43
43
  Sec-WebSocket-Version: 13\r
44
44
  \r
45
- `)});let m=()=>{clearTimeout(l),f(Buffer.concat(k).toString("latin1"))};j.on("data",a=>{k.push(Buffer.from(a)),Buffer.concat(k).indexOf("\r\n\r\n")>=0&&m()}),j.on("end",m),j.on("close",m)})}({socket:aq,ca:ab.certPem,servername:"localhost",port:a.port,path:"/v1/messages?transport=websocket"});c("Protocol upgrade is refused, not silently downgraded",ar.startsWith("HTTP/1.1 501"),ar.slice(0,40)),c("Upgrade refusal tells the client what to do instead",/HTTP streaming transport/i.test(ar)),c("Upgrade never reaches the origin",!af.some(a=>String(a.path||"").includes("transport=websocket"))),await new Promise(a=>setTimeout(a,100)),c("Refused upgrade is still audited",aj.some(a=>501===a.status&&String(a.path||"").includes("transport=websocket")));let as=aj.find(a=>501===a.status&&String(a.path||"").includes("transport=websocket"));c("Refused upgrade is flagged as denied",as?.denied===!0,String(as?.denied)),c("Refused upgrade is not mirrored into prompt_logs","denied"===D(as).reason);let at=af.find(a=>String(a.path||"").includes("encoded=")),au=af.find(a=>String(a.path||"").includes("h2-preferred"));c("HTTP/1.1 path/query preserved",at?.path===W),c("Downgraded path/query preserved",au?.path===$),c("HTTP/1.1 request body byte-identical",at&&E(at.body)===E(V)),c("Downgraded request body byte-identical",au&&E(au.body)===E(Z)),c("Authorization preserved on wire",af.every(a=>"Bearer test-secret-authorization-123456789"===a.authorization)),c("x-api-key preserved on wire",af.every(a=>"sk-test-supersecret-123456789"===a.apiKey)),c("Internal x-9r-* header stripped",af.every(a=>null==a.internalHeader));let av=aj.find(a=>String(a.path||"").includes("encoded=")),aw=aj.find(a=>String(a.path||"").includes("h2-preferred"));c("HTTP/1.1 audit event captured",!!av),c("Downgraded audit event captured",!!aw),c("Request wire SHA-256 recorded",av?.request?.wireSha256===E(V)&&aw?.request?.wireSha256===E(Z)),c("Response wire SHA-256 recorded",av?.response?.wireSha256===E(ae)&&aw?.response?.wireSha256===E(ae)),c("Compressed audit response decoded",av?.response?.body?.includes("compressed response preserved")&&aw?.response?.body?.includes("compressed response preserved"));let ax=D(av);c("Exchange with a prompt is mirrored with both halves",!0===ax.mirror&&ax.promptText?.includes("hello h1")&&ax.responseText?.includes("compressed response preserved"),JSON.stringify({mirror:ax.mirror,prompt:ax.promptText,response:ax.responseText}));let ay={...av,path:"/api/claude_code/telemetry",request:{...av.request,body:JSON.stringify({events:[{eventName:"tengu_api_success",metadata:{durationMs:120}}]})},response:{...av.response,body:JSON.stringify({accepted_count:17,rejected_count:0})}},az=D(ay);c("Telemetry exchange is not mirrored into prompt_logs",!1===az.mirror&&"not-inference"===az.reason,JSON.stringify(az));let aA={...av,path:"/backend-api/ps/plugins/list?scope=GLOBAL",request:{...av.request,body:""},response:{...av.response,body:JSON.stringify({items:[{text:"gmail@openai-curated-remote"}]})}};c("Plugin listing is not mirrored into prompt_logs","not-inference"===D(aA).reason);let aB={...av,request:{...av.request,body:""},response:{...av.response,body:"[br audit body capture truncated; decoded body unavailable]"}};c("Capture placeholder does not count as content","contentless"===D(aB).reason);let aC=aj.filter(a=>"authorization"in(a.request?.headers||{}));c("Authorization redacted in audit",aC.length>0&&aC.every(a=>"[REDACTED]"===a.request.headers.authorization));let aD=aj.filter(a=>"x-api-key"in(a.request?.headers||{}));c("x-api-key redacted in audit",aD.length>0&&aD.every(a=>"[REDACTED]"===a.request.headers["x-api-key"])),c("No likely API secret persisted",aj.length>=2&&aj.every(a=>!m(a)));let aE={allowedHosts:[...ak.auditConfig.allowedHosts],clientToolFilterEnabled:ak.auditConfig.clientToolFilterEnabled,allowedClientTools:[...ak.auditConfig.allowedClientTools||[]]},aF=ak.auditConfig.port,aG=ak.auditConfig.bindHost;try{let d=`localhost:${a.port}`;ak.applyConfig({...ak.auditConfig,allowedHosts:[]});let e=await function(a,b,c=""){return new Promise(d=>{let e=f.connect(a,"127.0.0.1"),g="",h=!1,i=()=>{if(!h){h=!0,clearTimeout(j);try{e.destroy()}catch{}d(g)}},j=setTimeout(i,3e3);e.once("error",i),e.once("connect",()=>e.write(`CONNECT ${b} HTTP/1.1\r
45
+ `)});let m=()=>{clearTimeout(l),f(Buffer.concat(k).toString("latin1"))};j.on("data",a=>{k.push(Buffer.from(a)),Buffer.concat(k).indexOf("\r\n\r\n")>=0&&m()}),j.on("end",m),j.on("close",m)})}({socket:aq,ca:ac.certPem,servername:"localhost",port:a.port,path:"/v1/messages?transport=websocket"});c("Protocol upgrade is refused, not silently downgraded",ar.startsWith("HTTP/1.1 501"),ar.slice(0,40)),c("Upgrade refusal tells the client what to do instead",/HTTP streaming transport/i.test(ar)),c("Upgrade never reaches the origin",!ag.some(a=>String(a.path||"").includes("transport=websocket"))),await new Promise(a=>setTimeout(a,100)),c("Refused upgrade is still audited",ak.some(a=>501===a.status&&String(a.path||"").includes("transport=websocket")));let as=ak.find(a=>501===a.status&&String(a.path||"").includes("transport=websocket"));c("Refused upgrade is flagged as denied",as?.denied===!0,String(as?.denied)),c("Refused upgrade is not mirrored into prompt_logs","denied"===D(as).reason);let at=ag.find(a=>String(a.path||"").includes("encoded=")),au=ag.find(a=>String(a.path||"").includes("h2-preferred"));c("HTTP/1.1 path/query preserved",at?.path===W),c("Downgraded path/query preserved",au?.path===$),c("HTTP/1.1 request body byte-identical",at&&E(at.body)===E(V)),c("Downgraded request body byte-identical",au&&E(au.body)===E(Z)),c("Authorization preserved on wire",ag.every(a=>"Bearer test-secret-authorization-123456789"===a.authorization)),c("x-api-key preserved on wire",ag.every(a=>"sk-test-supersecret-123456789"===a.apiKey)),c("Internal x-9r-* header stripped",ag.every(a=>null==a.internalHeader));let av=ak.find(a=>String(a.path||"").includes("encoded=")),aw=ak.find(a=>String(a.path||"").includes("h2-preferred"));c("HTTP/1.1 audit event captured",!!av),c("Downgraded audit event captured",!!aw),c("Request wire SHA-256 recorded",av?.request?.wireSha256===E(V)&&aw?.request?.wireSha256===E(Z)),c("Response wire SHA-256 recorded",av?.response?.wireSha256===E(af)&&aw?.response?.wireSha256===E(af)),c("Compressed audit response decoded",av?.response?.body?.includes("compressed response preserved")&&aw?.response?.body?.includes("compressed response preserved"));let ax=D(av);c("Exchange with a prompt is mirrored with both halves",!0===ax.mirror&&ax.promptText?.includes("hello h1")&&ax.responseText?.includes("compressed response preserved"),JSON.stringify({mirror:ax.mirror,prompt:ax.promptText,response:ax.responseText}));let ay={...av,path:"/api/claude_code/telemetry",request:{...av.request,body:JSON.stringify({events:[{eventName:"tengu_api_success",metadata:{durationMs:120}}]})},response:{...av.response,body:JSON.stringify({accepted_count:17,rejected_count:0})}},az=D(ay);c("Telemetry exchange is not mirrored into prompt_logs",!1===az.mirror&&"not-inference"===az.reason,JSON.stringify(az));let aA={...av,path:"/backend-api/ps/plugins/list?scope=GLOBAL",request:{...av.request,body:""},response:{...av.response,body:JSON.stringify({items:[{text:"gmail@openai-curated-remote"}]})}};c("Plugin listing is not mirrored into prompt_logs","not-inference"===D(aA).reason);let aB={...av,request:{...av.request,body:""},response:{...av.response,body:"[br audit body capture truncated; decoded body unavailable]"}};c("Capture placeholder does not count as content","contentless"===D(aB).reason);let aC=ak.filter(a=>"authorization"in(a.request?.headers||{}));c("Authorization redacted in audit",aC.length>0&&aC.every(a=>"[REDACTED]"===a.request.headers.authorization));let aD=ak.filter(a=>"x-api-key"in(a.request?.headers||{}));c("x-api-key redacted in audit",aD.length>0&&aD.every(a=>"[REDACTED]"===a.request.headers["x-api-key"])),c("No likely API secret persisted",ak.length>=2&&ak.every(a=>!m(a)));let aE={allowedHosts:[...al.auditConfig.allowedHosts],clientToolFilterEnabled:al.auditConfig.clientToolFilterEnabled,allowedClientTools:[...al.auditConfig.allowedClientTools||[]]},aF=al.auditConfig.port,aG=al.auditConfig.bindHost;try{let d=`localhost:${a.port}`;al.applyConfig({...al.auditConfig,allowedHosts:[]});let e=await function(a,b,c=""){return new Promise(d=>{let e=f.connect(a,"127.0.0.1"),g="",h=!1,i=()=>{if(!h){h=!0,clearTimeout(j);try{e.destroy()}catch{}d(g)}},j=setTimeout(i,3e3);e.once("error",i),e.once("connect",()=>e.write(`CONNECT ${b} HTTP/1.1\r
46
46
  Host: ${b}\r
47
47
  ${c}\r
48
- `)),e.on("data",a=>{g+=a.toString("utf8")}),e.on("close",i)})}(b.port,d);c("Removing a host from the allowlist applies with no restart",/HTTP\/1\.1 403\b/.test(e),JSON.stringify(e.slice(0,120))),ak.applyConfig({...ak.auditConfig,allowedHosts:["localhost"]});let g=await K(b.port,d).catch(a=>a);c("Re-adding it works on the next CONNECT",!(g instanceof Error),g instanceof Error?g.message:""),g?.destroy?.(),ak.applyConfig({...ak.auditConfig,clientToolFilterEnabled:!0,allowedClientTools:p(["claude-code"])});let h=await L(b.port,d,"User-Agent: Mozilla/5.0 Chrome/131.0\r\n");c("Turning the tool filter on applies with no restart",/HTTP\/1\.1 403\b/.test(h),JSON.stringify(h.slice(0,120))),ak.applyConfig({...ak.auditConfig,clientToolFilterEnabled:!1,allowedClientTools:[]});let i=await K(b.port,d,"Mozilla/5.0 Chrome/131.0").catch(a=>a);c("Turning it off applies with no restart",!(i instanceof Error),i instanceof Error?i.message:""),i?.destroy?.(),ak.applyConfig({...ak.auditConfig,captureLimitBytes:4096}),c("Capture limit is updated in place",4096===ak.auditConfig.captureLimitBytes);let j=ak.applyConfig({...ak.auditConfig,port:b.port+1,bindHost:"0.0.0.0"});c("A listener address/port change is reported as pending, not applied",!0===j.rebindRequired&&j.pending.port===b.port+1&&"0.0.0.0"===j.pending.bindHost,JSON.stringify(j.pending)),c("The bound listener is left alone by applyConfig",ak.auditConfig.port===aF&&ak.auditConfig.bindHost===aG&&!0===ak.listening,`${ak.auditConfig.port}/${ak.auditConfig.bindHost} vs ${aF}/${aG}`);let k=await K(b.port,d).catch(a=>a);c("Traffic keeps flowing on the address that is bound",!(k instanceof Error),k instanceof Error?k.message:""),k?.destroy?.()}finally{ak.applyConfig({...ak.auditConfig,...aE})}al=k({allowedHosts:["localhost"],passthroughUnknown:!1,captureBodies:!0,captureLimitBytes:1048576,verifyUpstreamTls:!0,allowedConnectPorts:[a.port],connectTimeoutMs:5e3,tlsHandshakeTimeoutMs:5e3,responseHeaderTimeoutMs:5e3,idleTimeoutMs:3e4},{certificateProvider:()=>ac,upstreamCa:_.certPem,resolveTarget:J,onAudit:()=>{throw Error("simulated audit sink failure")}});let aH=await H(al),aI=await K(aH.port,`localhost:${a.port}`),aJ=await O({socket:aI,ca:ab.certPem,servername:"localhost",port:a.port,body:V,path:W});c("Audit sink failure does not fail proxied request",aJ.head.startsWith("HTTP/1.1 200"))}catch(a){c("Self-test execution",!1,a.message||String(a))}finally{await I(al),await I(ak),await I(ai)}return{ok:b.length>0&&b.every(a=>a.ok),checks:b,passed:b.filter(a=>a.ok).length,total:b.length,durationMs:Date.now()-a}}}},85463:(a,b,c)=>{let{validateConfig:d}=c(43096),e=["accessGrants","allowedHosts","clientIpFilterEnabled","allowedClientIps","clientToolFilterEnabled","allowedClientTools","captureBodies","captureLimitBytes","passthroughUnknown","retentionDays"],f=["enabled","bindHost","port","clientProxyHost","proxyAuthEnabled","proxyAuthUsers"];function g(a={}){let b={};for(let c of e)void 0!==a[c]&&(b[c]=Array.isArray(a[c])?[...a[c]]:a[c]);return b}a.exports={POLICY_FIELDS:e,NODE_LOCAL_FIELDS:f,SETTINGS_KEY:"auditProxyPolicy",extractAuditPolicy:g,mergeAuditPolicy:function(a={},b={}){let c={...a};for(let a of e)void 0!==b[a]&&(c[a]=b[a]);for(let b of f)c[b]=a[b];return d(c)},policyEquals:function(a={},b={}){return JSON.stringify(g(a))===JSON.stringify(g(b))}}},86455:a=>{function b(a){let b=Number(a);return!Number.isFinite(b)||b<0?0:Math.round(b)}function c(){return{inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheCreationTokens:0,reasoningTokens:0,totalTokens:0,model:null,stopReason:null,streaming:!1,complete:!1,source:null}}function d(a){let b=String(a||"").trim();if(!b||"{"!==b[0])return null;try{let a=JSON.parse(b);return a&&"object"==typeof a&&!Array.isArray(a)?a:null}catch{return null}}function e(a,c){"string"==typeof c.model&&c.model&&!a.model&&(a.model=c.model);let d="response.completed"===c.type||"response.done"===c.type?c.response?.usage:null,e=d||c.usage;if(!e||"object"!=typeof e)return!1;d&&"string"==typeof c.response?.model&&c.response.model&&(a.model=c.response.model);let f=b(e.prompt_tokens??e.input_tokens),g=b(e.completion_tokens??e.output_tokens);if(!f&&!g)return!1;let h=b(e.prompt_tokens_details?.cached_tokens??e.input_tokens_details?.cached_tokens??e.cached_tokens??e.prompt_cache_hit_tokens);a.inputTokens=Math.max(0,f-h),a.cacheReadTokens=h,a.outputTokens=g,a.reasoningTokens=b(e.completion_tokens_details?.reasoning_tokens??e.output_tokens_details?.reasoning_tokens),a.complete=!0;let i=c.choices?.[0]?.finish_reason;return"string"==typeof i&&i&&(a.stopReason=i),!0}function f(a,f){let g=c();g.streaming=!0,g.source="sse";let h=!1;for(let c of function*(a){let b=String(a||""),c=0;for(;c<b.length;){let a=b.indexOf("\n",c);-1===a&&(a=b.length);let e=b.slice(c,a).trim();if(c=a+1,!e.startsWith("data:"))continue;let f=e.slice(5).trim();if(!f||"[DONE]"===f)continue;let g=d(f);g&&(yield g)}}(a)){if(("anthropic"===f||"message_start"===c.type||"message_delta"===c.type)&&function(a,c){let d=String(c.type||"");if("message_start"===d&&c.message&&"object"==typeof c.message){let d=c.message;"string"==typeof d.model&&d.model&&(a.model=d.model);let e=d.usage;return e&&"object"==typeof e&&(a.inputTokens=b(e.input_tokens)||a.inputTokens,a.cacheReadTokens=b(e.cache_read_input_tokens)||a.cacheReadTokens,a.cacheCreationTokens=b(e.cache_creation_input_tokens)||a.cacheCreationTokens),!0}if("message_delta"===d){let d=c.usage;d&&"object"==typeof d&&(a.outputTokens=b(d.output_tokens)||a.outputTokens,a.inputTokens=a.inputTokens||b(d.input_tokens),a.cacheReadTokens=a.cacheReadTokens||b(d.cache_read_input_tokens),a.cacheCreationTokens=a.cacheCreationTokens||b(d.cache_creation_input_tokens),a.complete=!0);let e=c.delta?.stop_reason;return"string"==typeof e&&e&&(a.stopReason=e),!0}return!1}(g,c)){h=!0;continue}e(g,c)&&(h=!0)}return h?g:null}function g(a){let f=d(a);if(!f)return null;let g=c();g.source="json","string"==typeof f.model&&f.model&&(g.model=f.model);let h=f.usage;return h&&"object"==typeof h?null!=h.input_tokens||null!=h.output_tokens?(g.inputTokens=b(h.input_tokens),g.outputTokens=b(h.output_tokens),g.cacheReadTokens=b(h.cache_read_input_tokens),g.cacheCreationTokens=b(h.cache_creation_input_tokens),g.complete=!0,"string"==typeof f.stop_reason&&(g.stopReason=f.stop_reason),g):e(g,f)?g:null:null}function h(a){return/\/count_tokens\b/.test(String(a||""))}function i(a){return a.inputTokens+a.cacheReadTokens+a.cacheCreationTokens}a.exports={extractUsageFromBody:function({provider:a,body:b,contentType:c="",path:d=""}={}){if("string"!=typeof b||!b||b.length>0x1000000||h(d))return null;let e=/event-stream/i.test(String(c||""))||b.includes("\ndata:")||b.startsWith("data:")?f(b,a)||g(b):g(b)||f(b,a);return e&&(e&&(e.inputTokens||e.outputTokens||e.cacheReadTokens||e.cacheCreationTokens)||e.model)?(e.totalTokens=e.inputTokens+e.outputTokens+e.cacheReadTokens+e.cacheCreationTokens,e):null},isTokenCountingEndpoint:h,toTokensJson:function(a){if(!a)return null;let b=i(a),c={input_tokens:a.inputTokens,output_tokens:a.outputTokens,prompt_tokens:b,completion_tokens:a.outputTokens,total_tokens:a.totalTokens,display_total_input_tokens:b,display_new_input_tokens:a.inputTokens,display_cached_input_tokens:a.cacheReadTokens,display_cache_creation_input_tokens:a.cacheCreationTokens,display_output_tokens:a.outputTokens};return a.cacheReadTokens&&(c.cache_read_input_tokens=a.cacheReadTokens),a.cacheCreationTokens&&(c.cache_creation_input_tokens=a.cacheCreationTokens),a.cacheReadTokens&&(c.cached_tokens=a.cacheReadTokens),a.reasoningTokens&&(c.reasoning_tokens=a.reasoningTokens),c},totalInputTokens:i}},90173:(a,b,c)=>{let d=c(29021),e=c(33873),f=c(4984),g=c(55511),{AUDIT_LOG_PATH:h,AUDIT_LOG_DIR:i,ensureAuditDir:j,loadConfig:k}=c(43096),{redactObject:l,scrubString:m}=c(48350),{toTokensJson:n,totalInputTokens:o}=c(86455),{publishRecentUsage:p}=c(87662),q="audit-proxy",r="client",s="provider_response",t=/\/(?:messages|responses|chat\/completions)$|generatecontent$/i,u={expiresAt:0,config:null},v=null,w=null,x=null,y=null,z=null,A="",B=Promise.resolve(),C=Promise.resolve(),D=0,E=null,F=new Map,G={queue:[],workers:new Set,activeWorkers:0,clearing:!1,enqueued:0,written:0,dropped:0,failed:0,mysqlWritten:0,mysqlFailed:0,mysqlSkipped:0,mysqlSkippedByReason:{},usageWritten:0,usageFailed:0,tokensSeen:0,lastError:null,lastWrittenAt:null};function H(a){let b=Date.now();b-D<6e4||(D=b,console.warn(`[AuditProxy][PromptDB] ${a}`))}function I(a){G.lastError=String(a||"Audit store failure"),console.warn(`[AuditProxy][Store] ${G.lastError}`)}async function J(){let a=Date.now();if(u.expiresAt>a)return u.config;v||(v=Promise.resolve().then(c.bind(c,45903)));let b=await v,d=await b.getPromptLogDbConfig();return u={expiresAt:a+5e3,config:d},d}async function K(a){let b=g.createHash("sha256").update(JSON.stringify({host:a.host,port:Number(a.port||3306),database:a.database,username:a.username,password:a.password,ssl:!!a.ssl})).digest("hex");if(z&&A===b)return z;let d=B.then(async()=>{if(z&&A===b)return z;if(z){try{await z.end()}catch{}z=null,A=""}let d=await c.e(8491).then(c.t.bind(c,38491,19)),e=(d.default||d).createPool({host:a.host,port:Number(a.port||3306),database:a.database,user:a.username,password:a.password,ssl:a.ssl?{rejectUnauthorized:!0}:void 0,connectTimeout:3e3,waitForConnections:!0,connectionLimit:4,maxIdle:4,idleTimeout:6e4,queueLimit:100,enableKeepAlive:!0,keepAliveInitialDelay:3e4});return z=e,A=b,e});return B=d.then(()=>void 0,()=>void 0),d}function L(a){let b=a?new Date(a):new Date;return(Number.isNaN(b.getTime())?new Date:b).toISOString().replace("T"," ").replace("Z","")}function M(a){if("string"!=typeof a)return a;let b=a.trim();if(!b||!b.startsWith("{")&&!b.startsWith("["))return a;try{return JSON.parse(b)}catch{return a}}function N(a,b=0,c=[]){if(null==a||b>12||c.join("\n").length>=2e5)return c;if("string"==typeof a)return a.trim()&&c.push(a.trim()),c;if(Array.isArray(a)){for(let d of a)N(d,b+1,c);return c}if("object"!=typeof a)return c;for(let[d,e]of Object.entries(a)){let a=d.toLowerCase();["content","text","prompt","input","message","output_text"].includes(a)?N(e,b+1,c):b<8&&["messages","contents","parts","body","request","payload","response","choices","output","item","items"].includes(a)&&N(e,b+1,c)}return c}function O(a){if("string"!=typeof a)return!1;let b=a.trim();return!!b&&!/^\[[^\]]*\]$/.test(b)}function P(a){let b=String(a||"").toLowerCase();return b.includes("claude")?{tool:"claude-code",label:"Claude Code"}:b.includes("codex")?{tool:"codex",label:"Codex"}:{tool:"audit-proxy",label:"Enterprise AI Audit Proxy"}}async function Q(a,b,c,d){if(!c)return null;let e=g.createHash("sha256").update(c).digest("hex"),f=Buffer.byteLength(String(c||""),"utf8");return await a.query(`INSERT INTO prompt_log_payloads (
48
+ `)),e.on("data",a=>{g+=a.toString("utf8")}),e.on("close",i)})}(b.port,d);c("Removing a host from the allowlist applies with no restart",/HTTP\/1\.1 403\b/.test(e),JSON.stringify(e.slice(0,120))),al.applyConfig({...al.auditConfig,allowedHosts:["localhost"]});let g=await K(b.port,d).catch(a=>a);c("Re-adding it works on the next CONNECT",!(g instanceof Error),g instanceof Error?g.message:""),g?.destroy?.(),al.applyConfig({...al.auditConfig,clientToolFilterEnabled:!0,allowedClientTools:p(["claude-code"])});let h=await L(b.port,d,"User-Agent: Mozilla/5.0 Chrome/131.0\r\n");c("Turning the tool filter on applies with no restart",/HTTP\/1\.1 403\b/.test(h),JSON.stringify(h.slice(0,120))),al.applyConfig({...al.auditConfig,clientToolFilterEnabled:!1,allowedClientTools:[]});let i=await K(b.port,d,"Mozilla/5.0 Chrome/131.0").catch(a=>a);c("Turning it off applies with no restart",!(i instanceof Error),i instanceof Error?i.message:""),i?.destroy?.(),al.applyConfig({...al.auditConfig,captureLimitBytes:4096}),c("Capture limit is updated in place",4096===al.auditConfig.captureLimitBytes);let j=al.applyConfig({...al.auditConfig,port:b.port+1,bindHost:"0.0.0.0"});c("A listener address/port change is reported as pending, not applied",!0===j.rebindRequired&&j.pending.port===b.port+1&&"0.0.0.0"===j.pending.bindHost,JSON.stringify(j.pending)),c("The bound listener is left alone by applyConfig",al.auditConfig.port===aF&&al.auditConfig.bindHost===aG&&!0===al.listening,`${al.auditConfig.port}/${al.auditConfig.bindHost} vs ${aF}/${aG}`);let k=await K(b.port,d).catch(a=>a);c("Traffic keeps flowing on the address that is bound",!(k instanceof Error),k instanceof Error?k.message:""),k?.destroy?.()}finally{al.applyConfig({...al.auditConfig,...aE})}am=k({allowedHosts:["localhost"],passthroughUnknown:!1,captureBodies:!0,captureLimitBytes:1048576,verifyUpstreamTls:!0,allowedConnectPorts:[a.port],connectTimeoutMs:5e3,tlsHandshakeTimeoutMs:5e3,responseHeaderTimeoutMs:5e3,idleTimeoutMs:3e4},{certificateProvider:()=>ad,upstreamCa:aa.certPem,resolveTarget:J,onAudit:()=>{throw Error("simulated audit sink failure")}});let aH=await H(am),aI=await K(aH.port,`localhost:${a.port}`),aJ=await O({socket:aI,ca:ac.certPem,servername:"localhost",port:a.port,body:V,path:W});c("Audit sink failure does not fail proxied request",aJ.head.startsWith("HTTP/1.1 200"))}catch(a){c("Self-test execution",!1,a.message||String(a))}finally{await I(am),await I(al),await I(aj)}return{ok:b.length>0&&b.every(a=>a.ok),checks:b,passed:b.filter(a=>a.ok).length,total:b.length,durationMs:Date.now()-a}}}},85463:(a,b,c)=>{let{validateConfig:d}=c(43096),e=["accessGrants","allowedHosts","clientToolFilterEnabled","allowedClientTools","captureBodies","captureLimitBytes","passthroughUnknown","retentionDays"],f=["enabled","bindHost","port","clientProxyHost","proxyAuthEnabled","proxyAuthUsers"];function g(a={}){let b={};for(let c of e)void 0!==a[c]&&(b[c]=Array.isArray(a[c])?[...a[c]]:a[c]);return b}a.exports={POLICY_FIELDS:e,NODE_LOCAL_FIELDS:f,SETTINGS_KEY:"auditProxyPolicy",extractAuditPolicy:g,mergeAuditPolicy:function(a={},b={}){let c={...a};for(let a of e)void 0!==b[a]&&(c[a]=b[a]);for(let b of f)c[b]=a[b];return d(c)},policyEquals:function(a={},b={}){return JSON.stringify(g(a))===JSON.stringify(g(b))}}},86455:a=>{function b(a){let b=Number(a);return!Number.isFinite(b)||b<0?0:Math.round(b)}function c(){return{inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheCreationTokens:0,reasoningTokens:0,totalTokens:0,model:null,stopReason:null,streaming:!1,complete:!1,source:null}}function d(a){let b=String(a||"").trim();if(!b||"{"!==b[0])return null;try{let a=JSON.parse(b);return a&&"object"==typeof a&&!Array.isArray(a)?a:null}catch{return null}}function e(a,c){"string"==typeof c.model&&c.model&&!a.model&&(a.model=c.model);let d="response.completed"===c.type||"response.done"===c.type?c.response?.usage:null,e=d||c.usage;if(!e||"object"!=typeof e)return!1;d&&"string"==typeof c.response?.model&&c.response.model&&(a.model=c.response.model);let f=b(e.prompt_tokens??e.input_tokens),g=b(e.completion_tokens??e.output_tokens);if(!f&&!g)return!1;let h=b(e.prompt_tokens_details?.cached_tokens??e.input_tokens_details?.cached_tokens??e.cached_tokens??e.prompt_cache_hit_tokens);a.inputTokens=Math.max(0,f-h),a.cacheReadTokens=h,a.outputTokens=g,a.reasoningTokens=b(e.completion_tokens_details?.reasoning_tokens??e.output_tokens_details?.reasoning_tokens),a.complete=!0;let i=c.choices?.[0]?.finish_reason;return"string"==typeof i&&i&&(a.stopReason=i),!0}function f(a,f){let g=c();g.streaming=!0,g.source="sse";let h=!1;for(let c of function*(a){let b=String(a||""),c=0;for(;c<b.length;){let a=b.indexOf("\n",c);-1===a&&(a=b.length);let e=b.slice(c,a).trim();if(c=a+1,!e.startsWith("data:"))continue;let f=e.slice(5).trim();if(!f||"[DONE]"===f)continue;let g=d(f);g&&(yield g)}}(a)){if(("anthropic"===f||"message_start"===c.type||"message_delta"===c.type)&&function(a,c){let d=String(c.type||"");if("message_start"===d&&c.message&&"object"==typeof c.message){let d=c.message;"string"==typeof d.model&&d.model&&(a.model=d.model);let e=d.usage;return e&&"object"==typeof e&&(a.inputTokens=b(e.input_tokens)||a.inputTokens,a.cacheReadTokens=b(e.cache_read_input_tokens)||a.cacheReadTokens,a.cacheCreationTokens=b(e.cache_creation_input_tokens)||a.cacheCreationTokens),!0}if("message_delta"===d){let d=c.usage;d&&"object"==typeof d&&(a.outputTokens=b(d.output_tokens)||a.outputTokens,a.inputTokens=a.inputTokens||b(d.input_tokens),a.cacheReadTokens=a.cacheReadTokens||b(d.cache_read_input_tokens),a.cacheCreationTokens=a.cacheCreationTokens||b(d.cache_creation_input_tokens),a.complete=!0);let e=c.delta?.stop_reason;return"string"==typeof e&&e&&(a.stopReason=e),!0}return!1}(g,c)){h=!0;continue}e(g,c)&&(h=!0)}return h?g:null}function g(a){let f=d(a);if(!f)return null;let g=c();g.source="json","string"==typeof f.model&&f.model&&(g.model=f.model);let h=f.usage;return h&&"object"==typeof h?null!=h.input_tokens||null!=h.output_tokens?(g.inputTokens=b(h.input_tokens),g.outputTokens=b(h.output_tokens),g.cacheReadTokens=b(h.cache_read_input_tokens),g.cacheCreationTokens=b(h.cache_creation_input_tokens),g.complete=!0,"string"==typeof f.stop_reason&&(g.stopReason=f.stop_reason),g):e(g,f)?g:null:null}function h(a){return/\/count_tokens\b/.test(String(a||""))}function i(a){return a.inputTokens+a.cacheReadTokens+a.cacheCreationTokens}a.exports={extractUsageFromBody:function({provider:a,body:b,contentType:c="",path:d=""}={}){if("string"!=typeof b||!b||b.length>0x1000000||h(d))return null;let e=/event-stream/i.test(String(c||""))||b.includes("\ndata:")||b.startsWith("data:")?f(b,a)||g(b):g(b)||f(b,a);return e&&(e&&(e.inputTokens||e.outputTokens||e.cacheReadTokens||e.cacheCreationTokens)||e.model)?(e.totalTokens=e.inputTokens+e.outputTokens+e.cacheReadTokens+e.cacheCreationTokens,e):null},isTokenCountingEndpoint:h,toTokensJson:function(a){if(!a)return null;let b=i(a),c={input_tokens:a.inputTokens,output_tokens:a.outputTokens,prompt_tokens:b,completion_tokens:a.outputTokens,total_tokens:a.totalTokens,display_total_input_tokens:b,display_new_input_tokens:a.inputTokens,display_cached_input_tokens:a.cacheReadTokens,display_cache_creation_input_tokens:a.cacheCreationTokens,display_output_tokens:a.outputTokens};return a.cacheReadTokens&&(c.cache_read_input_tokens=a.cacheReadTokens),a.cacheCreationTokens&&(c.cache_creation_input_tokens=a.cacheCreationTokens),a.cacheReadTokens&&(c.cached_tokens=a.cacheReadTokens),a.reasoningTokens&&(c.reasoning_tokens=a.reasoningTokens),c},totalInputTokens:i}},90173:(a,b,c)=>{let d=c(29021),e=c(33873),f=c(4984),g=c(55511),{AUDIT_LOG_PATH:h,AUDIT_LOG_DIR:i,ensureAuditDir:j,loadConfig:k}=c(43096),{redactObject:l,scrubString:m}=c(48350),{toTokensJson:n,totalInputTokens:o}=c(86455),{publishRecentUsage:p}=c(87662),q="audit-proxy",r="client",s="provider_response",t=/\/(?:messages|responses|chat\/completions)$|generatecontent$/i,u={expiresAt:0,config:null},v=null,w=null,x=null,y=null,z=null,A="",B=Promise.resolve(),C=Promise.resolve(),D=0,E=null,F=new Map,G={queue:[],workers:new Set,activeWorkers:0,clearing:!1,enqueued:0,written:0,dropped:0,failed:0,mysqlWritten:0,mysqlFailed:0,mysqlSkipped:0,mysqlSkippedByReason:{},usageWritten:0,usageFailed:0,tokensSeen:0,lastError:null,lastWrittenAt:null};function H(a){let b=Date.now();b-D<6e4||(D=b,console.warn(`[AuditProxy][PromptDB] ${a}`))}function I(a){G.lastError=String(a||"Audit store failure"),console.warn(`[AuditProxy][Store] ${G.lastError}`)}async function J(){let a=Date.now();if(u.expiresAt>a)return u.config;v||(v=Promise.resolve().then(c.bind(c,45903)));let b=await v,d=await b.getPromptLogDbConfig();return u={expiresAt:a+5e3,config:d},d}async function K(a){let b=g.createHash("sha256").update(JSON.stringify({host:a.host,port:Number(a.port||3306),database:a.database,username:a.username,password:a.password,ssl:!!a.ssl})).digest("hex");if(z&&A===b)return z;let d=B.then(async()=>{if(z&&A===b)return z;if(z){try{await z.end()}catch{}z=null,A=""}let d=await c.e(8491).then(c.t.bind(c,38491,19)),e=(d.default||d).createPool({host:a.host,port:Number(a.port||3306),database:a.database,user:a.username,password:a.password,ssl:a.ssl?{rejectUnauthorized:!0}:void 0,connectTimeout:3e3,waitForConnections:!0,connectionLimit:4,maxIdle:4,idleTimeout:6e4,queueLimit:100,enableKeepAlive:!0,keepAliveInitialDelay:3e4});return z=e,A=b,e});return B=d.then(()=>void 0,()=>void 0),d}function L(a){let b=a?new Date(a):new Date;return(Number.isNaN(b.getTime())?new Date:b).toISOString().replace("T"," ").replace("Z","")}function M(a){if("string"!=typeof a)return a;let b=a.trim();if(!b||!b.startsWith("{")&&!b.startsWith("["))return a;try{return JSON.parse(b)}catch{return a}}function N(a,b=0,c=[]){if(null==a||b>12||c.join("\n").length>=2e5)return c;if("string"==typeof a)return a.trim()&&c.push(a.trim()),c;if(Array.isArray(a)){for(let d of a)N(d,b+1,c);return c}if("object"!=typeof a)return c;for(let[d,e]of Object.entries(a)){let a=d.toLowerCase();["content","text","prompt","input","message","output_text"].includes(a)?N(e,b+1,c):b<8&&["messages","contents","parts","body","request","payload","response","choices","output","item","items"].includes(a)&&N(e,b+1,c)}return c}function O(a){if("string"!=typeof a)return!1;let b=a.trim();return!!b&&!/^\[[^\]]*\]$/.test(b)}function P(a){let b=String(a||"").toLowerCase();return b.includes("claude")?{tool:"claude-code",label:"Claude Code"}:b.includes("codex")?{tool:"codex",label:"Codex"}:{tool:"audit-proxy",label:"Enterprise AI Audit Proxy"}}async function Q(a,b,c,d){if(!c)return null;let e=g.createHash("sha256").update(c).digest("hex"),f=Buffer.byteLength(String(c||""),"utf8");return await a.query(`INSERT INTO prompt_log_payloads (
49
49
  payload_hash, created_at, last_seen_at, content_type, payload_size_bytes, ref_count, payload_json
50
50
  ) VALUES (?, ?, ?, ?, ?, 1, CAST(? AS JSON))
51
51
  ON DUPLICATE KEY UPDATE
@@ -1 +1 @@
1
- globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],lowPriorityFiles:["static/WM_Lgz-rTI3jjkU3E5GgA/_buildManifest.js","static/WM_Lgz-rTI3jjkU3E5GgA/_ssgManifest.js"],rootMainFiles:["static/chunks/webpack-7223ab98c3aee1a6.js","static/chunks/4bd1b696-8a4ab4fdf0ae305a.js","static/chunks/3794-d7cddff008311ab3.js","static/chunks/main-app-eacc433ef218cf40.js"],rootMainFilesTree:{},pages:{"/_app":[]}};
1
+ globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],lowPriorityFiles:["static/z1Eao96Iq3r_h1r2CiZ6D/_buildManifest.js","static/z1Eao96Iq3r_h1r2CiZ6D/_ssgManifest.js"],rootMainFiles:["static/chunks/webpack-7223ab98c3aee1a6.js","static/chunks/4bd1b696-8a4ab4fdf0ae305a.js","static/chunks/3794-d7cddff008311ab3.js","static/chunks/main-app-eacc433ef218cf40.js"],rootMainFilesTree:{},pages:{"/_app":[]}};
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/7a3e1568f247f3d0.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/94ed68d5c090ac3d.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-7223ab98c3aee1a6.js"/><script src="/_next/static/chunks/4bd1b696-8a4ab4fdf0ae305a.js" async=""></script><script src="/_next/static/chunks/3794-d7cddff008311ab3.js" async=""></script><script src="/_next/static/chunks/main-app-eacc433ef218cf40.js" async=""></script><script src="/_next/static/chunks/1a258343-a1c000c55ff2ed8c.js" async=""></script><script src="/_next/static/chunks/8500-01a63dafd809e317.js" async=""></script><script src="/_next/static/chunks/9893-065a17773674bd0a.js" async=""></script><script src="/_next/static/chunks/9959-ac64565001d4586c.js" async=""></script><script src="/_next/static/chunks/7050-a706e6827db952b3.js" async=""></script><script src="/_next/static/chunks/5564-f72b35ee73d33b9b.js" async=""></script><script src="/_next/static/chunks/5263-d7e8656d89b2ca10.js" async=""></script><script src="/_next/static/chunks/7033-c1289a2f17cb7185.js" async=""></script><script src="/_next/static/chunks/5497-c352fe8c48441441.js" async=""></script><script src="/_next/static/chunks/app/(dashboard)/layout-e5f8b9540dd02062.js" async=""></script><script src="/_next/static/chunks/1101-24e8a2ac5c831741.js" async=""></script><script src="/_next/static/chunks/app/layout-246e5f10ac28be17.js" async=""></script><meta name="robots" content="noindex"/><meta name="theme-color" content="#0a0a0a"/><title>AI Router Gateway - AI Infrastructure Management</title><meta name="description" content="One endpoint for all your AI providers. Manage keys, monitor usage, and scale effortlessly."/><link rel="manifest" href="/manifest.webmanifest"/><link rel="icon" href="/favicon.ico?d69b7278ea27dcf7" type="image/x-icon" sizes="32x32"/><link rel="icon" href="/favicon.svg"/><title>404: This page could not be found.</title><script>if(document.fonts&&document.fonts.ready){document.fonts.ready.then(function(){document.documentElement.classList.add('fonts-loaded')})}else{document.documentElement.classList.add('fonts-loaded')}</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__variable_f367f3 font-sans antialiased"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-7223ab98c3aee1a6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n3:I[57121,[],\"\"]\n4:I[74581,[],\"\"]\n5:I[90484,[],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n9:I[90484,[],\"ViewportBoundary\"]\nb:I[90484,[],\"MetadataBoundary\"]\nd:I[27123,[],\"default\",1]\n:HL[\"/_next/static/css/7a3e1568f247f3d0.css\",\"style\"]\n:HL[\"/_next/static/css/94ed68d5c090ac3d.css\",\"style\"]\n8:X\n0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_not-found\",{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/7a3e1568f247f3d0.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/94ed68d5c090ac3d.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],\"$L2\"]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,null]},null,false,\"$8\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"WM_Lgz-rTI3jjkU3E5GgA\"}\ne:I[44656,[\"3862\",\"static/chunks/1a258343-a1c000c55ff2ed8c.js\",\"8500\",\"static/chunks/8500-01a63dafd809e317.js\",\"9893\",\"static/chunks/9893-065a17773674bd0a.js\",\"9959\",\"static/chunks/9959-ac64565001d4586c.js\",\"7050\",\"static/chunks/7050-a706e6827db952b3.js\",\"5564\",\"static/chunks/5564-f72b35ee73d33b9b.js\",\"5263\",\"static/chunks/5263-d7e8656d89b2ca10.js\",\"7033\",\"static/chunks/7033-c1289a2f17cb7185.js\",\"5497\",\"static/chunks/5497-c352fe8c48441441.js\",\"9305\",\"static/chunks/app/(dashboard)/layout-e5f8b9540dd02062.js\"],\"BrandingProvider\"]\nf:I[70255,[\"3862\",\"static/chunks/1a258343-a1c000c55ff2ed8c.js\",\"8500\",\"static/chunks/8500-01a63dafd809e317.js\",\"9893\",\"static/chunks/9893-065a17773674bd0a.js\",\"9959\",\"static/chunks/9959-ac64565001d4586c.js\",\"7050\",\"static/chunks/7050-a706e6827db952b3.js\",\"5564\",\"static/chunks/5564-f72b35ee73d33b9b.js\",\"5263\",\"static/chunks/5263-d7e8656d89b2ca10.js\",\"7033\",\"static/chunks/7033-c1289a2f17cb7185.js\",\"5497\",\"static/chunks/5497-c352fe8c48441441.js\",\"9305\",\"static/chunks/app/(dashboard)/layout-e5f8b9540dd02062.js\"],\"default\"]\n10:I[21110,[\"3862\",\"static/chunks/1a258343-a1c000c55ff2ed8c.js\",\"8500\",\"static/chunks/8500-01a63dafd809e317.js\",\"9893\",\"static/chunks/9893-065a17773674bd0a.js\",\"9959\",\"static/chunks/9959-ac64565001d4586c.js\",\"7050\",\"static/chunks/7050-a706e6827db952b3.js\",\"5564\",\"static/chunks/5564-f72b35ee73d33b9b.js\",\"5263\",\"static/chunks/5263-d7e8656d89b2ca10.js\",\"7033\",\"static/chunks/7033-c1289a2f17cb7185.js\",\"5497\",\"static/chunks/5497-c352fe8c48441441.js\",\"9305\",\"static/chunks/app/(dashboard)/layout-e5f8b9540dd02062.js\"],\"ThemeProvider\"]\n11:I[94635,[\"1101\",\"static/chunks/1101-24e8a2ac5c831741.js\",\"5564\",\"static/chunks/5564-f72b35ee73d33b9b.js\",\"5263\",\"static/chunks/5263-d7e8656d89b2ca10.js\",\"7177\",\"static/chunks/app/layout-246e5f10ac28be17.js\"],\"RuntimeI18nProvider\"]\n8:C\n2:[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"if(document.fonts\u0026\u0026document.fonts.ready){document.fonts.ready.then(function(){document.documentElement.classList.add('fonts-loaded')})}else{document.documentElement.classList.add('fonts-loaded')}\"}}]}],[\"$\",\"body\",null,{\"className\":\"__variable_f367f3 font-sans antialiased\",\"children\":[\"$\",\"$Le\",null,{\"initialBranding\":{\"siteTitle\":\"\",\"siteShortName\":\"\",\"siteDescription\":\"\",\"logoUrl\":null,\"faviconUrl\":null,\"logoMime\":null,\"faviconMime\":null,\"hasLogo\":false,\"hasFavicon\":false},\"children\":[[\"$\",\"$Lf\",null,{}],[\"$\",\"$L10\",null,{\"children\":[\"$\",\"$L11\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]}]]}]\na:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#0a0a0a\"}]]\n12:I[86869,[],\"IconMark\"]\n7:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"AI Router Gateway - AI Infrastructure Management\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"One endpoint for all your AI providers. Manage keys, monitor usage, and scale effortlessly.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"manifest\",\"href\":\"/manifest.webmanifest\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?d69b7278ea27dcf7\",\"type\":\"image/x-icon\",\"sizes\":\"32x32\"}],[\"$\",\"link\",\"4\",{\"rel\":\"icon\",\"href\":\"/favicon.svg\"}],[\"$\",\"$L12\",\"5\",{}]]\n"])</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/7a3e1568f247f3d0.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/94ed68d5c090ac3d.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-7223ab98c3aee1a6.js"/><script src="/_next/static/chunks/4bd1b696-8a4ab4fdf0ae305a.js" async=""></script><script src="/_next/static/chunks/3794-d7cddff008311ab3.js" async=""></script><script src="/_next/static/chunks/main-app-eacc433ef218cf40.js" async=""></script><script src="/_next/static/chunks/1a258343-a1c000c55ff2ed8c.js" async=""></script><script src="/_next/static/chunks/8500-01a63dafd809e317.js" async=""></script><script src="/_next/static/chunks/9893-065a17773674bd0a.js" async=""></script><script src="/_next/static/chunks/9959-ac64565001d4586c.js" async=""></script><script src="/_next/static/chunks/7050-a706e6827db952b3.js" async=""></script><script src="/_next/static/chunks/5564-f72b35ee73d33b9b.js" async=""></script><script src="/_next/static/chunks/5263-cb8cc0ec36f08fec.js" async=""></script><script src="/_next/static/chunks/7033-c1289a2f17cb7185.js" async=""></script><script src="/_next/static/chunks/5497-c352fe8c48441441.js" async=""></script><script src="/_next/static/chunks/app/(dashboard)/layout-e5f8b9540dd02062.js" async=""></script><script src="/_next/static/chunks/1101-24e8a2ac5c831741.js" async=""></script><script src="/_next/static/chunks/app/layout-246e5f10ac28be17.js" async=""></script><meta name="robots" content="noindex"/><meta name="theme-color" content="#0a0a0a"/><title>AI Router Gateway - AI Infrastructure Management</title><meta name="description" content="One endpoint for all your AI providers. Manage keys, monitor usage, and scale effortlessly."/><link rel="manifest" href="/manifest.webmanifest"/><link rel="icon" href="/favicon.ico?d69b7278ea27dcf7" type="image/x-icon" sizes="32x32"/><link rel="icon" href="/favicon.svg"/><title>404: This page could not be found.</title><script>if(document.fonts&&document.fonts.ready){document.fonts.ready.then(function(){document.documentElement.classList.add('fonts-loaded')})}else{document.documentElement.classList.add('fonts-loaded')}</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__variable_f367f3 font-sans antialiased"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-7223ab98c3aee1a6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n3:I[57121,[],\"\"]\n4:I[74581,[],\"\"]\n5:I[90484,[],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n9:I[90484,[],\"ViewportBoundary\"]\nb:I[90484,[],\"MetadataBoundary\"]\nd:I[27123,[],\"default\",1]\n:HL[\"/_next/static/css/7a3e1568f247f3d0.css\",\"style\"]\n:HL[\"/_next/static/css/94ed68d5c090ac3d.css\",\"style\"]\n8:X\n0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_not-found\",{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4608]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/7a3e1568f247f3d0.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/94ed68d5c090ac3d.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],\"$L2\"]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,null]},null,false,\"$8\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"z1Eao96Iq3r_h1r2CiZ6D\"}\ne:I[44656,[\"3862\",\"static/chunks/1a258343-a1c000c55ff2ed8c.js\",\"8500\",\"static/chunks/8500-01a63dafd809e317.js\",\"9893\",\"static/chunks/9893-065a17773674bd0a.js\",\"9959\",\"static/chunks/9959-ac64565001d4586c.js\",\"7050\",\"static/chunks/7050-a706e6827db952b3.js\",\"5564\",\"static/chunks/5564-f72b35ee73d33b9b.js\",\"5263\",\"static/chunks/5263-cb8cc0ec36f08fec.js\",\"7033\",\"static/chunks/7033-c1289a2f17cb7185.js\",\"5497\",\"static/chunks/5497-c352fe8c48441441.js\",\"9305\",\"static/chunks/app/(dashboard)/layout-e5f8b9540dd02062.js\"],\"BrandingProvider\"]\nf:I[70255,[\"3862\",\"static/chunks/1a258343-a1c000c55ff2ed8c.js\",\"8500\",\"static/chunks/8500-01a63dafd809e317.js\",\"9893\",\"static/chunks/9893-065a17773674bd0a.js\",\"9959\",\"static/chunks/9959-ac64565001d4586c.js\",\"7050\",\"static/chunks/7050-a706e6827db952b3.js\",\"5564\",\"static/chunks/5564-f72b35ee73d33b9b.js\",\"5263\",\"static/chunks/5263-cb8cc0ec36f08fec.js\",\"7033\",\"static/chunks/7033-c1289a2f17cb7185.js\",\"5497\",\"static/chunks/5497-c352fe8c48441441.js\",\"9305\",\"static/chunks/app/(dashboard)/layout-e5f8b9540dd02062.js\"],\"default\"]\n10:I[21110,[\"3862\",\"static/chunks/1a258343-a1c000c55ff2ed8c.js\",\"8500\",\"static/chunks/8500-01a63dafd809e317.js\",\"9893\",\"static/chunks/9893-065a17773674bd0a.js\",\"9959\",\"static/chunks/9959-ac64565001d4586c.js\",\"7050\",\"static/chunks/7050-a706e6827db952b3.js\",\"5564\",\"static/chunks/5564-f72b35ee73d33b9b.js\",\"5263\",\"static/chunks/5263-cb8cc0ec36f08fec.js\",\"7033\",\"static/chunks/7033-c1289a2f17cb7185.js\",\"5497\",\"static/chunks/5497-c352fe8c48441441.js\",\"9305\",\"static/chunks/app/(dashboard)/layout-e5f8b9540dd02062.js\"],\"ThemeProvider\"]\n11:I[94635,[\"1101\",\"static/chunks/1101-24e8a2ac5c831741.js\",\"5564\",\"static/chunks/5564-f72b35ee73d33b9b.js\",\"5263\",\"static/chunks/5263-cb8cc0ec36f08fec.js\",\"7177\",\"static/chunks/app/layout-246e5f10ac28be17.js\"],\"RuntimeI18nProvider\"]\n8:C\n2:[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"if(document.fonts\u0026\u0026document.fonts.ready){document.fonts.ready.then(function(){document.documentElement.classList.add('fonts-loaded')})}else{document.documentElement.classList.add('fonts-loaded')}\"}}]}],[\"$\",\"body\",null,{\"className\":\"__variable_f367f3 font-sans antialiased\",\"children\":[\"$\",\"$Le\",null,{\"initialBranding\":{\"siteTitle\":\"\",\"siteShortName\":\"\",\"siteDescription\":\"\",\"logoUrl\":null,\"faviconUrl\":null,\"logoMime\":null,\"faviconMime\":null,\"hasLogo\":false,\"hasFavicon\":false},\"children\":[[\"$\",\"$Lf\",null,{}],[\"$\",\"$L10\",null,{\"children\":[\"$\",\"$L11\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]}]]}]\na:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#0a0a0a\"}]]\n12:I[86869,[],\"IconMark\"]\n7:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"AI Router Gateway - AI Infrastructure Management\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"One endpoint for all your AI providers. Manage keys, monitor usage, and scale effortlessly.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"manifest\",\"href\":\"/manifest.webmanifest\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?d69b7278ea27dcf7\",\"type\":\"image/x-icon\",\"sizes\":\"32x32\"}],[\"$\",\"link\",\"4\",{\"rel\":\"icon\",\"href\":\"/favicon.svg\"}],[\"$\",\"$L12\",\"5\",{}]]\n"])</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-7223ab98c3aee1a6.js"/><script src="/_next/static/chunks/4bd1b696-8a4ab4fdf0ae305a.js" async=""></script><script src="/_next/static/chunks/3794-d7cddff008311ab3.js" async=""></script><script src="/_next/static/chunks/main-app-eacc433ef218cf40.js" async=""></script><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-7223ab98c3aee1a6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57121,[],\"\"]\n3:I[74581,[],\"\"]\n4:I[90484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[90484,[],\"ViewportBoundary\"]\na:I[90484,[],\"MetadataBoundary\"]\nc:I[27123,[],\"default\",1]\n7:X\n0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4624]},\"$undefined\",\"$undefined\",4624]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$7\"]},null,false,\"$7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"WM_Lgz-rTI3jjkU3E5GgA\"}\n7:C\n9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n6:null\nb:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-7223ab98c3aee1a6.js"/><script src="/_next/static/chunks/4bd1b696-8a4ab4fdf0ae305a.js" async=""></script><script src="/_next/static/chunks/3794-d7cddff008311ab3.js" async=""></script><script src="/_next/static/chunks/main-app-eacc433ef218cf40.js" async=""></script><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-7223ab98c3aee1a6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[57121,[],\"\"]\n3:I[74581,[],\"\"]\n4:I[90484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[90484,[],\"ViewportBoundary\"]\na:I[90484,[],\"MetadataBoundary\"]\nc:I[27123,[],\"default\",1]\n7:X\n0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4624]},\"$undefined\",\"$undefined\",4624]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$7\"]},null,false,\"$7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"z1Eao96Iq3r_h1r2CiZ6D\"}\n7:C\n9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n6:null\nb:[]\n"])</script></body></html>