@jheavenknows/bluerouter 5.4.49 → 5.4.50

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 (590) hide show
  1. package/app/.next-cli-build/BUILD_ID +1 -1
  2. package/app/.next-cli-build/app-path-routes-manifest.json +4 -4
  3. package/app/.next-cli-build/build-manifest.json +2 -2
  4. package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page.js.nft.json +1 -1
  5. package/app/.next-cli-build/server/app/(dashboard)/dashboard/ai-power-index/page_client-reference-manifest.js +1 -1
  6. package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page.js.nft.json +1 -1
  7. package/app/.next-cli-build/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
  8. package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page.js.nft.json +1 -1
  9. package/app/.next-cli-build/server/app/(dashboard)/dashboard/api-keys/page_client-reference-manifest.js +1 -1
  10. package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page.js +1 -1
  11. package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page.js.nft.json +1 -1
  12. package/app/.next-cli-build/server/app/(dashboard)/dashboard/audit-proxy/page_client-reference-manifest.js +1 -1
  13. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  14. package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  15. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  16. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  17. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page.js.nft.json +1 -1
  18. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/model-profiles/page_client-reference-manifest.js +1 -1
  19. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  20. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  21. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page.js.nft.json +1 -1
  22. package/app/.next-cli-build/server/app/(dashboard)/dashboard/cluster/page_client-reference-manifest.js +1 -1
  23. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  24. package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  25. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
  26. package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  27. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  28. package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  29. package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/console/page.js.nft.json +1 -1
  30. package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/console/page_client-reference-manifest.js +1 -1
  31. package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/page.js.nft.json +1 -1
  32. package/app/.next-cli-build/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
  33. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
  34. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  35. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
  36. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  37. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
  38. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  39. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
  40. package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  41. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  42. package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  43. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  44. package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  45. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personal/page.js.nft.json +1 -1
  46. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personal/page_client-reference-manifest.js +1 -1
  47. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page.js.nft.json +1 -1
  48. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovider/page_client-reference-manifest.js +1 -1
  49. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page.js.nft.json +1 -1
  50. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalcloudprovidermonitor/page_client-reference-manifest.js +1 -1
  51. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page.js.nft.json +1 -1
  52. package/app/.next-cli-build/server/app/(dashboard)/dashboard/personalquota/page_client-reference-manifest.js +1 -1
  53. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  54. package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  55. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page.js.nft.json +1 -1
  56. package/app/.next-cli-build/server/app/(dashboard)/dashboard/prompt-logs/page_client-reference-manifest.js +1 -1
  57. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page.js.nft.json +1 -1
  58. package/app/.next-cli-build/server/app/(dashboard)/dashboard/provider-health/page_client-reference-manifest.js +1 -1
  59. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  60. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  61. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  62. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  63. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  64. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  65. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/stt/page.js.nft.json +1 -1
  66. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/stt/page_client-reference-manifest.js +1 -1
  67. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/tts/page.js.nft.json +1 -1
  68. package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/tts/page_client-reference-manifest.js +1 -1
  69. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
  70. package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  71. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  72. package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  73. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page.js.nft.json +1 -1
  74. package/app/.next-cli-build/server/app/(dashboard)/dashboard/resource-monitor/page_client-reference-manifest.js +1 -1
  75. package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page.js.nft.json +1 -1
  76. package/app/.next-cli-build/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  77. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
  78. package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  79. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
  80. package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  81. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  82. package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  83. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  84. package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  85. package/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
  86. package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  87. package/app/.next-cli-build/server/app/_global-error.html +1 -1
  88. package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  89. package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  90. package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  91. package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  92. package/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
  93. package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  94. package/app/.next-cli-build/server/app/_not-found.html +1 -1
  95. package/app/.next-cli-build/server/app/_not-found.rsc +5 -5
  96. package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +5 -5
  97. package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -5
  98. package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  99. package/app/.next-cli-build/server/app/api/audit-proxy/ca/route.js +1 -1
  100. package/app/.next-cli-build/server/app/api/audit-proxy/ca/route.js.nft.json +1 -1
  101. package/app/.next-cli-build/server/app/api/audit-proxy/me/route.js +1 -1
  102. package/app/.next-cli-build/server/app/api/audit-proxy/me/route.js.nft.json +1 -1
  103. package/app/.next-cli-build/server/app/api/audit-proxy/route.js +2 -2
  104. package/app/.next-cli-build/server/app/api/audit-proxy/route.js.nft.json +1 -1
  105. package/app/.next-cli-build/server/app/api/audit-proxy/users/route.js +1 -1
  106. package/app/.next-cli-build/server/app/api/audit-proxy/users/route.js.nft.json +1 -1
  107. package/app/.next-cli-build/server/app/api/auth/ldap/test/route.js.nft.json +1 -1
  108. package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js +1 -1
  109. package/app/.next-cli-build/server/app/api/auth/ldap/users/route.js.nft.json +1 -1
  110. package/app/.next-cli-build/server/app/api/auth/login/route.js +4 -4
  111. package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  112. package/app/.next-cli-build/server/app/api/auth/logout/route.js +1 -1
  113. package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  114. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js +1 -1
  115. package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  116. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js +1 -1
  117. package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  118. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js +1 -1
  119. package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  120. package/app/.next-cli-build/server/app/api/auth/status/route.js +1 -1
  121. package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  122. package/app/.next-cli-build/server/app/api/auth/view-mode/route.js +1 -1
  123. package/app/.next-cli-build/server/app/api/auth/view-mode/route.js.nft.json +1 -1
  124. package/app/.next-cli-build/server/app/api/branding/[asset]/route.js.nft.json +1 -1
  125. package/app/.next-cli-build/server/app/api/branding/route.js +1 -1
  126. package/app/.next-cli-build/server/app/api/branding/route.js.nft.json +1 -1
  127. package/app/.next-cli-build/server/app/api/branding/upload/route.js +1 -1
  128. package/app/.next-cli-build/server/app/api/branding/upload/route.js.nft.json +1 -1
  129. package/app/.next-cli-build/server/app/api/cli-model-profiles/cloud-models/route.js +1 -1
  130. package/app/.next-cli-build/server/app/api/cli-model-profiles/cloud-models/route.js.nft.json +1 -1
  131. package/app/.next-cli-build/server/app/api/cli-model-profiles/model-catalog/route.js +1 -1
  132. package/app/.next-cli-build/server/app/api/cli-model-profiles/model-catalog/route.js.nft.json +1 -1
  133. package/app/.next-cli-build/server/app/api/cli-model-profiles/route.js +1 -1
  134. package/app/.next-cli-build/server/app/api/cli-model-profiles/route.js.nft.json +1 -1
  135. package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  136. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  137. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/autostart/route.js.nft.json +1 -1
  138. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/prompt-log-db/route.js.nft.json +1 -1
  139. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/root-ca/route.js.nft.json +1 -1
  140. package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  141. package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
  142. package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
  143. package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
  144. package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  145. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
  146. package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
  147. package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  148. package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
  149. package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
  150. package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
  151. package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
  152. package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
  153. package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
  154. package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
  155. package/app/.next-cli-build/server/app/api/cli-tools/qwen-settings/route.js.nft.json +1 -1
  156. package/app/.next-cli-build/server/app/api/cluster/config/route.js +1 -1
  157. package/app/.next-cli-build/server/app/api/cluster/config/route.js.nft.json +1 -1
  158. package/app/.next-cli-build/server/app/api/cluster/heartbeat/route.js.nft.json +1 -1
  159. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js +1 -1
  160. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/command/route.js.nft.json +1 -1
  161. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js +1 -1
  162. package/app/.next-cli-build/server/app/api/cluster/peers/[id]/route.js.nft.json +1 -1
  163. package/app/.next-cli-build/server/app/api/cluster/peers/route.js +1 -1
  164. package/app/.next-cli-build/server/app/api/cluster/peers/route.js.nft.json +1 -1
  165. package/app/.next-cli-build/server/app/api/cluster/snapshot/route.js.nft.json +1 -1
  166. package/app/.next-cli-build/server/app/api/cluster/sync/route.js +1 -1
  167. package/app/.next-cli-build/server/app/api/cluster/sync/route.js.nft.json +1 -1
  168. package/app/.next-cli-build/server/app/api/cluster/test/route.js +1 -1
  169. package/app/.next-cli-build/server/app/api/cluster/test/route.js.nft.json +1 -1
  170. package/app/.next-cli-build/server/app/api/codex-catalog/download/route.js +1 -1
  171. package/app/.next-cli-build/server/app/api/codex-catalog/download/route.js.nft.json +1 -1
  172. package/app/.next-cli-build/server/app/api/codex-catalog/route.js +1 -1
  173. package/app/.next-cli-build/server/app/api/codex-catalog/route.js.nft.json +1 -1
  174. package/app/.next-cli-build/server/app/api/codex-catalog/upload/route.js +1 -1
  175. package/app/.next-cli-build/server/app/api/codex-catalog/upload/route.js.nft.json +1 -1
  176. package/app/.next-cli-build/server/app/api/combos/[id]/route.js +2 -2
  177. package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  178. package/app/.next-cli-build/server/app/api/combos/route.js +1 -1
  179. package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  180. package/app/.next-cli-build/server/app/api/dashboard/ai-power-index/route.js +1 -1
  181. package/app/.next-cli-build/server/app/api/dashboard/ai-power-index/route.js.nft.json +1 -1
  182. package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js +1 -1
  183. package/app/.next-cli-build/server/app/api/dashboard/analytics/ai-models/route.js.nft.json +1 -1
  184. package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js +1 -1
  185. package/app/.next-cli-build/server/app/api/dashboard/analytics/analyze/route.js.nft.json +1 -1
  186. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js +1 -1
  187. package/app/.next-cli-build/server/app/api/dashboard/analytics/route.js.nft.json +1 -1
  188. package/app/.next-cli-build/server/app/api/dashboard/combos/route.js.nft.json +1 -1
  189. package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js +1 -1
  190. package/app/.next-cli-build/server/app/api/dashboard/endpoint/route.js.nft.json +1 -1
  191. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/[id]/route.js.nft.json +1 -1
  192. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/options/route.js.nft.json +1 -1
  193. package/app/.next-cli-build/server/app/api/dashboard/prompt-logs/route.js.nft.json +1 -1
  194. package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js +2 -2
  195. package/app/.next-cli-build/server/app/api/dashboard/token-saver/route.js.nft.json +1 -1
  196. package/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
  197. package/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
  198. package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js +1 -1
  199. package/app/.next-cli-build/server/app/api/keys/[id]/caveman-test/route.js.nft.json +1 -1
  200. package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js +1 -1
  201. package/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
  202. package/app/.next-cli-build/server/app/api/keys/[id]/route.js +1 -1
  203. package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  204. package/app/.next-cli-build/server/app/api/keys/route.js +2 -2
  205. package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  206. package/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
  207. package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  208. package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  209. package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  210. package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  211. package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  212. package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  213. package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
  214. package/app/.next-cli-build/server/app/api/models/alias/route.js +1 -1
  215. package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  216. package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  217. package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  218. package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  219. package/app/.next-cli-build/server/app/api/models/route.js +1 -1
  220. package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  221. package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  222. package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  223. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js +1 -1
  224. package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  225. package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  226. package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  227. package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  228. package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  229. package/app/.next-cli-build/server/app/api/oauth/grok-cli/device-code/route.js +1 -1
  230. package/app/.next-cli-build/server/app/api/oauth/grok-cli/device-code/route.js.nft.json +1 -1
  231. package/app/.next-cli-build/server/app/api/oauth/grok-cli/poll/route.js +1 -1
  232. package/app/.next-cli-build/server/app/api/oauth/grok-cli/poll/route.js.nft.json +1 -1
  233. package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  234. package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
  235. package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  236. package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
  237. package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  238. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js +1 -1
  239. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/api-key-models/route.js.nft.json +1 -1
  240. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js +1 -1
  241. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/import-models/route.js.nft.json +1 -1
  242. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js +1 -1
  243. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/models/[...routeModel]/route.js.nft.json +1 -1
  244. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/move/route.js +1 -1
  245. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/move/route.js.nft.json +1 -1
  246. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js +1 -1
  247. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/route.js.nft.json +1 -1
  248. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js +1 -1
  249. package/app/.next-cli-build/server/app/api/personal-cloud-providers/[id]/usage/route.js.nft.json +1 -1
  250. package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js +1 -1
  251. package/app/.next-cli-build/server/app/api/personal-cloud-providers/client/route.js.nft.json +1 -1
  252. package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js +1 -1
  253. package/app/.next-cli-build/server/app/api/personal-cloud-providers/monitor/route.js.nft.json +1 -1
  254. package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js +1 -1
  255. package/app/.next-cli-build/server/app/api/personal-cloud-providers/permissions/route.js.nft.json +1 -1
  256. package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js +1 -1
  257. package/app/.next-cli-build/server/app/api/personal-cloud-providers/route.js.nft.json +1 -1
  258. package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js +1 -1
  259. package/app/.next-cli-build/server/app/api/personal-cloud-providers/routing/route.js.nft.json +1 -1
  260. package/app/.next-cli-build/server/app/api/personal-cloud-providers/shares/route.js +1 -1
  261. package/app/.next-cli-build/server/app/api/personal-cloud-providers/shares/route.js.nft.json +1 -1
  262. package/app/.next-cli-build/server/app/api/personal-cloud-providers/visibility/route.js +1 -1
  263. package/app/.next-cli-build/server/app/api/personal-cloud-providers/visibility/route.js.nft.json +1 -1
  264. package/app/.next-cli-build/server/app/api/pricing/catalog/route.js.nft.json +1 -1
  265. package/app/.next-cli-build/server/app/api/pricing/recalculate/route.js.nft.json +1 -1
  266. package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  267. package/app/.next-cli-build/server/app/api/provider-health/route.js.nft.json +1 -1
  268. package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  269. package/app/.next-cli-build/server/app/api/provider-nodes/openai-compatible/manage/route.js.nft.json +1 -1
  270. package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  271. package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
  272. package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  273. package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  274. package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  275. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  276. package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  277. package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  278. package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
  279. package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  280. package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  281. package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
  282. package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  283. package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  284. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  285. package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  286. package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  287. package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  288. package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  289. package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  290. package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js +1 -1
  291. package/app/.next-cli-build/server/app/api/resource-monitor/[id]/route.js.nft.json +1 -1
  292. package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js +1 -1
  293. package/app/.next-cli-build/server/app/api/resource-monitor/ai-models/route.js.nft.json +1 -1
  294. package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js +1 -1
  295. package/app/.next-cli-build/server/app/api/resource-monitor/analyze/route.js.nft.json +1 -1
  296. package/app/.next-cli-build/server/app/api/resource-monitor/history/route.js +1 -1
  297. package/app/.next-cli-build/server/app/api/resource-monitor/history/route.js.nft.json +1 -1
  298. package/app/.next-cli-build/server/app/api/resource-monitor/route.js +1 -1
  299. package/app/.next-cli-build/server/app/api/resource-monitor/route.js.nft.json +1 -1
  300. package/app/.next-cli-build/server/app/api/settings/database/export/route.js +1 -1
  301. package/app/.next-cli-build/server/app/api/settings/database/export/route.js.nft.json +1 -1
  302. package/app/.next-cli-build/server/app/api/settings/database/route.js +1 -1
  303. package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  304. package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
  305. package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  306. package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  307. package/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
  308. package/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
  309. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  310. package/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
  311. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  312. package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
  313. package/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
  314. package/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
  315. package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  316. package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  317. package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  318. package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  319. package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  320. package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  321. package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  322. package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  323. package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  324. package/app/.next-cli-build/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
  325. package/app/.next-cli-build/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
  326. package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  327. package/app/.next-cli-build/server/app/api/usage/chart/route.js +1 -1
  328. package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  329. package/app/.next-cli-build/server/app/api/usage/history/route.js +1 -1
  330. package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  331. package/app/.next-cli-build/server/app/api/usage/logs/route.js +1 -1
  332. package/app/.next-cli-build/server/app/api/usage/logs/route.js.nft.json +1 -1
  333. package/app/.next-cli-build/server/app/api/usage/providers/route.js +1 -1
  334. package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  335. package/app/.next-cli-build/server/app/api/usage/request-details/route.js +1 -1
  336. package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  337. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js +1 -1
  338. package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  339. package/app/.next-cli-build/server/app/api/usage/stats/route.js +1 -1
  340. package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  341. package/app/.next-cli-build/server/app/api/usage/stream/route.js +2 -2
  342. package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  343. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js +1 -1
  344. package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  345. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js +1 -1
  346. package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  347. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js +1 -1
  348. package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  349. package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
  350. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js +1 -1
  351. package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  352. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js +1 -1
  353. package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  354. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js +1 -1
  355. package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  356. package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
  357. package/app/.next-cli-build/server/app/api/v1/messages/route.js +1 -1
  358. package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  359. package/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  360. package/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
  361. package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  362. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js +1 -1
  363. package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  364. package/app/.next-cli-build/server/app/api/v1/responses/route.js +1 -1
  365. package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  366. package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  367. package/app/.next-cli-build/server/app/api/v1/search/route.js +1 -1
  368. package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  369. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js +1 -1
  370. package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  371. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js +1 -1
  372. package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  373. package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  374. package/app/.next-cli-build/server/app/api/version/restart/route.js.nft.json +1 -1
  375. package/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
  376. package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  377. package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  378. package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  379. package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  380. package/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
  381. package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  382. package/app/.next-cli-build/server/app/callback.html +1 -1
  383. package/app/.next-cli-build/server/app/callback.rsc +5 -5
  384. package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +5 -5
  385. package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  386. package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +5 -5
  387. package/app/.next-cli-build/server/app/dashboard/ai-power-index.html +1 -1
  388. package/app/.next-cli-build/server/app/dashboard/ai-power-index.rsc +6 -6
  389. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/!KGRhc2hib2FyZCk/dashboard/ai-power-index/__PAGE__.segment.rsc +6 -6
  390. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_full.segment.rsc +6 -6
  391. package/app/.next-cli-build/server/app/dashboard/ai-power-index.segments/_tree.segment.rsc +1 -1
  392. package/app/.next-cli-build/server/app/dashboard/api-keys.html +1 -1
  393. package/app/.next-cli-build/server/app/dashboard/api-keys.rsc +9 -9
  394. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/!KGRhc2hib2FyZCk/dashboard/api-keys/__PAGE__.segment.rsc +9 -9
  395. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_full.segment.rsc +9 -9
  396. package/app/.next-cli-build/server/app/dashboard/api-keys.segments/_tree.segment.rsc +1 -1
  397. package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  398. package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +7 -7
  399. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +7 -7
  400. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +7 -7
  401. package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  402. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.html +1 -1
  403. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.rsc +8 -8
  404. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/model-profiles/__PAGE__.segment.rsc +8 -8
  405. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_full.segment.rsc +8 -8
  406. package/app/.next-cli-build/server/app/dashboard/cli-tools/model-profiles.segments/_tree.segment.rsc +1 -1
  407. package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  408. package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +7 -7
  409. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +7 -7
  410. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +7 -7
  411. package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  412. package/app/.next-cli-build/server/app/dashboard/cluster.html +1 -1
  413. package/app/.next-cli-build/server/app/dashboard/cluster.rsc +6 -6
  414. package/app/.next-cli-build/server/app/dashboard/cluster.segments/!KGRhc2hib2FyZCk/dashboard/cluster/__PAGE__.segment.rsc +6 -6
  415. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_full.segment.rsc +6 -6
  416. package/app/.next-cli-build/server/app/dashboard/cluster.segments/_tree.segment.rsc +1 -1
  417. package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  418. package/app/.next-cli-build/server/app/dashboard/combos.rsc +7 -7
  419. package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +7 -7
  420. package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +7 -7
  421. package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  422. package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  423. package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +7 -7
  424. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +7 -7
  425. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +7 -7
  426. package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  427. package/app/.next-cli-build/server/app/dashboard/logs.html +1 -1
  428. package/app/.next-cli-build/server/app/dashboard/logs.rsc +6 -6
  429. package/app/.next-cli-build/server/app/dashboard/logs.segments/!KGRhc2hib2FyZCk/dashboard/logs/__PAGE__.segment.rsc +6 -6
  430. package/app/.next-cli-build/server/app/dashboard/logs.segments/_full.segment.rsc +6 -6
  431. package/app/.next-cli-build/server/app/dashboard/logs.segments/_tree.segment.rsc +1 -1
  432. package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  433. package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +7 -7
  434. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +7 -7
  435. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +7 -7
  436. package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  437. package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  438. package/app/.next-cli-build/server/app/dashboard/mitm.rsc +7 -7
  439. package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +7 -7
  440. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +7 -7
  441. package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  442. package/app/.next-cli-build/server/app/dashboard/personal.html +1 -1
  443. package/app/.next-cli-build/server/app/dashboard/personal.rsc +7 -7
  444. package/app/.next-cli-build/server/app/dashboard/personal.segments/!KGRhc2hib2FyZCk/dashboard/personal/__PAGE__.segment.rsc +7 -7
  445. package/app/.next-cli-build/server/app/dashboard/personal.segments/_full.segment.rsc +7 -7
  446. package/app/.next-cli-build/server/app/dashboard/personal.segments/_tree.segment.rsc +1 -1
  447. package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  448. package/app/.next-cli-build/server/app/dashboard/profile.rsc +7 -7
  449. package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +7 -7
  450. package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +7 -7
  451. package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  452. package/app/.next-cli-build/server/app/dashboard/prompt-logs.html +1 -1
  453. package/app/.next-cli-build/server/app/dashboard/prompt-logs.rsc +6 -6
  454. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/!KGRhc2hib2FyZCk/dashboard/prompt-logs/__PAGE__.segment.rsc +6 -6
  455. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_full.segment.rsc +6 -6
  456. package/app/.next-cli-build/server/app/dashboard/prompt-logs.segments/_tree.segment.rsc +1 -1
  457. package/app/.next-cli-build/server/app/dashboard/provider-health.html +1 -1
  458. package/app/.next-cli-build/server/app/dashboard/provider-health.rsc +6 -6
  459. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/!KGRhc2hib2FyZCk/dashboard/provider-health/__PAGE__.segment.rsc +6 -6
  460. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_full.segment.rsc +6 -6
  461. package/app/.next-cli-build/server/app/dashboard/provider-health.segments/_tree.segment.rsc +1 -1
  462. package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  463. package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +7 -7
  464. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +7 -7
  465. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +7 -7
  466. package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  467. package/app/.next-cli-build/server/app/dashboard/providers/stt.html +1 -1
  468. package/app/.next-cli-build/server/app/dashboard/providers/stt.rsc +7 -7
  469. package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/!KGRhc2hib2FyZCk/dashboard/providers/stt/__PAGE__.segment.rsc +7 -7
  470. package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_full.segment.rsc +7 -7
  471. package/app/.next-cli-build/server/app/dashboard/providers/stt.segments/_tree.segment.rsc +1 -1
  472. package/app/.next-cli-build/server/app/dashboard/providers/tts.html +1 -1
  473. package/app/.next-cli-build/server/app/dashboard/providers/tts.rsc +7 -7
  474. package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/!KGRhc2hib2FyZCk/dashboard/providers/tts/__PAGE__.segment.rsc +7 -7
  475. package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_full.segment.rsc +7 -7
  476. package/app/.next-cli-build/server/app/dashboard/providers/tts.segments/_tree.segment.rsc +1 -1
  477. package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  478. package/app/.next-cli-build/server/app/dashboard/providers.rsc +7 -7
  479. package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +7 -7
  480. package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +7 -7
  481. package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  482. package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  483. package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +7 -7
  484. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +7 -7
  485. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +7 -7
  486. package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  487. package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
  488. package/app/.next-cli-build/server/app/dashboard/quota.rsc +8 -8
  489. package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +8 -8
  490. package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +8 -8
  491. package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  492. package/app/.next-cli-build/server/app/dashboard/resource-monitor.html +1 -1
  493. package/app/.next-cli-build/server/app/dashboard/resource-monitor.rsc +6 -6
  494. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/!KGRhc2hib2FyZCk/dashboard/resource-monitor/__PAGE__.segment.rsc +6 -6
  495. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_full.segment.rsc +6 -6
  496. package/app/.next-cli-build/server/app/dashboard/resource-monitor.segments/_tree.segment.rsc +1 -1
  497. package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  498. package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +6 -6
  499. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/!KGRhc2hib2FyZCk/dashboard/settings/pricing/__PAGE__.segment.rsc +6 -6
  500. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +6 -6
  501. package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  502. package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  503. package/app/.next-cli-build/server/app/dashboard/skills.rsc +7 -7
  504. package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +7 -7
  505. package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +7 -7
  506. package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
  507. package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  508. package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
  509. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +6 -6
  510. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
  511. package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
  512. package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  513. package/app/.next-cli-build/server/app/dashboard/translator.rsc +7 -7
  514. package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +7 -7
  515. package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +7 -7
  516. package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  517. package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  518. package/app/.next-cli-build/server/app/dashboard/usage.rsc +7 -7
  519. package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +7 -7
  520. package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +7 -7
  521. package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  522. package/app/.next-cli-build/server/app/dashboard.html +1 -1
  523. package/app/.next-cli-build/server/app/dashboard.rsc +7 -7
  524. package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +7 -7
  525. package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +7 -7
  526. package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  527. package/app/.next-cli-build/server/app/favicon.ico/route.js.nft.json +1 -1
  528. package/app/.next-cli-build/server/app/index.html +1 -1
  529. package/app/.next-cli-build/server/app/index.rsc +5 -5
  530. package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +5 -5
  531. package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +5 -5
  532. package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  533. package/app/.next-cli-build/server/app/landing/page.js.nft.json +1 -1
  534. package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  535. package/app/.next-cli-build/server/app/landing.html +1 -1
  536. package/app/.next-cli-build/server/app/landing.rsc +5 -5
  537. package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
  538. package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  539. package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +5 -5
  540. package/app/.next-cli-build/server/app/login/page.js.nft.json +1 -1
  541. package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  542. package/app/.next-cli-build/server/app/login.html +1 -1
  543. package/app/.next-cli-build/server/app/login.rsc +6 -6
  544. package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +6 -6
  545. package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  546. package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +6 -6
  547. package/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  548. package/app/.next-cli-build/server/app/page.js.nft.json +1 -1
  549. package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  550. package/app/.next-cli-build/server/app-paths-manifest.json +4 -4
  551. package/app/.next-cli-build/server/chunks/1893.js +1 -0
  552. package/app/.next-cli-build/server/chunks/2428.js +1 -1
  553. package/app/.next-cli-build/server/chunks/2947.js +2 -0
  554. package/app/.next-cli-build/server/chunks/3104.js +1 -1
  555. package/app/.next-cli-build/server/chunks/3399.js +1 -1
  556. package/app/.next-cli-build/server/chunks/3792.js +2 -0
  557. package/app/.next-cli-build/server/chunks/3958.js +9 -10
  558. package/app/.next-cli-build/server/chunks/427.js +1 -1
  559. package/app/.next-cli-build/server/chunks/4432.js +1 -0
  560. package/app/.next-cli-build/server/chunks/4746.js +1 -1
  561. package/app/.next-cli-build/server/chunks/4778.js +1 -1
  562. package/app/.next-cli-build/server/chunks/5019.js +1 -0
  563. package/app/.next-cli-build/server/chunks/541.js +1 -1
  564. package/app/.next-cli-build/server/chunks/607.js +1 -1
  565. package/app/.next-cli-build/server/chunks/6811.js +1 -1
  566. package/app/.next-cli-build/server/chunks/6992.js +1 -1
  567. package/app/.next-cli-build/server/chunks/7307.js +1 -1
  568. package/app/.next-cli-build/server/chunks/8049.js +1 -1
  569. package/app/.next-cli-build/server/chunks/9083.js +8 -8
  570. package/app/.next-cli-build/server/chunks/9905.js +1 -1
  571. package/app/.next-cli-build/server/instrumentation.js +1 -1
  572. package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  573. package/app/.next-cli-build/server/middleware.js +7 -6
  574. package/app/.next-cli-build/server/pages/404.html +1 -1
  575. package/app/.next-cli-build/server/pages/500.html +1 -1
  576. package/app/.next-cli-build/static/chunks/{5263-b519926aaf536479.js → 5263-53a5c688033e07a0.js} +1 -1
  577. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/audit-proxy/page-196a57c390e33e8e.js +8 -0
  578. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-shm +0 -0
  579. package/app/cli/.build-home/AppData/Roaming/bluerouter/db/data.sqlite-wal +0 -0
  580. package/app/package.json +1 -1
  581. package/package.json +1 -1
  582. package/app/.next-cli-build/server/chunks/1370.js +0 -1
  583. package/app/.next-cli-build/server/chunks/3096.js +0 -2
  584. package/app/.next-cli-build/server/chunks/3503.js +0 -1
  585. package/app/.next-cli-build/server/chunks/7812.js +0 -1
  586. package/app/.next-cli-build/server/chunks/9471.js +0 -1
  587. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/audit-proxy/page-dae70e675a844e74.js +0 -8
  588. /package/app/.next-cli-build/static/{ugqmbHNAbXl3X-KWhDFgO → IGu6MyMQCf_NSW_h6RfYZ}/_buildManifest.js +0 -0
  589. /package/app/.next-cli-build/static/{ugqmbHNAbXl3X-KWhDFgO → IGu6MyMQCf_NSW_h6RfYZ}/_ssgManifest.js +0 -0
  590. /package/app/cli/.build-home/AppData/Roaming/bluerouter/db/backups/{upgrade-5.4.41-to-5.4.44-5.4.44-20260915-162643 → upgrade-5.4.47-to-5.4.48-5.4.48-20260915-174715}/data.sqlite +0 -0
@@ -0,0 +1,2 @@
1
+ "use strict";exports.id=3792,exports.ids=[3792],exports.modules={5565:(a,b,c)=>{let d=c(91645);function e(a){let b=String(a||"").trim().toLowerCase();b.startsWith("[")&&b.endsWith("]")&&(b=b.slice(1,-1));let c=b.indexOf("%");return c>=0&&(b=b.slice(0,c)),b.startsWith("::ffff:")&&4===d.isIP(b.slice(7))&&(b=b.slice(7)),b}function f(a){return Buffer.from(a.split(".").map(a=>Number(a)))}function g(a,b){return 4===b?f(a):function(a){let b=e(a),c=b.lastIndexOf(":");if(c>=0){let a=b.slice(c+1);if(4===d.isIP(a)){let d=f(a),e=(d[0]<<8|d[1]).toString(16),g=(d[2]<<8|d[3]).toString(16);b=`${b.slice(0,c)}:${e}:${g}`}}let g=b.split("::");if(g.length>2)throw Error("Invalid IPv6 address");let h=g[0]?g[0].split(":").filter(Boolean):[],i=2===g.length&&g[1]?g[1].split(":").filter(Boolean):[],j=8-h.length-i.length;if(1===g.length&&0!==j||j<0)throw Error("Invalid IPv6 address");let k=2===g.length?[...h,...Array(j).fill("0"),...i]:h;if(8!==k.length)throw Error("Invalid IPv6 address");let l=Buffer.alloc(16);return k.forEach((a,b)=>{let c=Number.parseInt(a||"0",16);if(!Number.isInteger(c)||c<0||c>65535)throw Error("Invalid IPv6 address");l[2*b]=c>>8&255,l[2*b+1]=255&c}),l}(a)}function h(a){let b=String(a||"").trim();if(!b)throw Error("Empty IP rule");let c=b.indexOf("/"),f=e(c>=0?b.slice(0,c):b),g=d.isIP(f);if(!g)throw Error(`Invalid client IP/CIDR: ${b}`);let h=4===g?32:128,i=c>=0?Number(b.slice(c+1)):h;if(!Number.isInteger(i)||i<0||i>h)throw Error(`Invalid CIDR prefix: ${b}`);return{text:c>=0?`${f}/${i}`:f,ip:f,family:g,prefix:i}}a.exports={normalizeIp:e,parseIpRule:h,normalizeAllowedClientIps:function(a){let b=Array.isArray(a)?a:String(a||"").split(/[\r\n,]+/),c=[],d=new Set;for(let a of b){let b=String(a||"").trim();if(!b)continue;let e=h(b);d.has(e.text)||(d.add(e.text),c.push(e.text))}return c},clientIpMatches:function(a,b=[]){let c=e(a),f=d.isIP(c);if(!f)return!1;let i=g(c,f);for(let a of b||[]){let b;try{b=h(a)}catch{continue}if(b.family===f&&function(a,b,c){let d=Math.floor(c/8),e=c%8;for(let c=0;c<d;c+=1)if(a[c]!==b[c])return!1;if(!e)return!0;let f=255<<8-e&255;return(a[d]&f)==(b[d]&f)}(i,g(b.ip,b.family),b.prefix))return!0}return!1}}},7566:(a,b,c)=>{let d=c(55511),e=/^[a-z0-9][a-z0-9._-]{0,63}$/i,f=null;function g(){return f||(f=c(81370)),f}function h(a){return String(a||"").trim()}function i(a){let b=Array.isArray(a)?a:[],c=new Set,d=[];for(let a of b){if(!a||"object"!=typeof a)continue;let b=h(a.username),f=String(a.passwordHash||"");if(!e.test(b)||!f.startsWith("$2"))continue;let g=b.toLowerCase();c.has(g)||(c.add(g),d.push({username:b,passwordHash:f}))}return d}function j(a){if(Array.isArray(a))return null;let b=String(a||"").trim();if(!b||b.length>1024)return null;let c=b.indexOf(" ");if(c<0||"basic"!==b.slice(0,c).toLowerCase())return null;let d=b.slice(c+1).trim();if(!d||!/^[A-Za-z0-9+/]+={0,2}$/.test(d))return null;let e="";try{e=Buffer.from(d,"base64").toString("utf8")}catch{return null}let f=e.indexOf(":");return f<0?null:{username:e.slice(0,f),password:e.slice(f+1)}}a.exports={CACHE_TTL_MS:3e5,PASSWORD_MAX_BYTES:72,PASSWORD_MIN_BYTES:8,createProxyAuthLimiter:function({maxFailures:a=10,windowMs:b=6e4,cooldownMs:c=3e4,maxCooldownMs:d=3e5,maxEntries:e=1024}={}){let f=new Map;return{isLocked(a){let b=f.get(a);return!!b&&b.lockedUntil>Date.now()},recordFailure(g){let h=Date.now();!function(a){if(f.size<e)return;for(let[c,d]of f)if(d.lockedUntil<=a&&a-d.lastFailAt>b&&f.delete(c),f.size<e)return;let c=f.keys().next();c.done||f.delete(c.value)}(h);let i=f.get(g)||{failures:0,lastFailAt:0,lockedUntil:0,cooldownMs:c};h-i.lastFailAt>b&&(i.failures=0),i.failures+=1,i.lastFailAt=h;let j=!1;return i.failures>=a&&(i.lockedUntil=h+i.cooldownMs,i.cooldownMs=Math.min(2*i.cooldownMs,d),i.failures=0,j=!0),f.set(g,i),{lockedNow:j}},recordSuccess(a){f.delete(a)}}},createProxyAuthenticator:function(a){let b=new Map(i(a).map(a=>[a.username.toLowerCase(),a])),c=new Map,e=new Map;return{get accountCount(){return b.size},async authenticate(a){let f,h=j(a);if(!h)return{ok:!1,username:null,reason:a?"Unsupported proxy credentials":"Proxy authentication required"};let{username:i,password:k}=h,l=d.createHash("sha256").update(`${i}\0${k}`).digest("hex"),m=(f=c.get(l))?f.expiresAt<=Date.now()?(c.delete(l),null):f.username:null;if(m)return{ok:!0,username:m,reason:null};let n=b.get(i.trim().toLowerCase()),o=n?n.passwordHash:"$2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy",p=e.get(l);p||(p=g().compare(k,o).catch(()=>!1),e.set(l,p),p.finally(()=>e.delete(l)));let q=await p;if(!n||!q)return{ok:!1,username:null,reason:"Invalid proxy credentials"};var r=n.username;if(c.size>=256){let a=c.keys().next();a.done||c.delete(a.value)}return c.set(l,{username:r,expiresAt:Date.now()+3e5}),{ok:!0,username:n.username,reason:null}}}},hashProxyPassword:async function a(a){let b=await g().genSalt(10);return g().hash(String(a),b)},isValidUsername:function(a){return e.test(h(a))},normalizeProxyUsers:i,parseBasicProxyAuthorization:j,redactProxyAuthUsers:function(a){return i(a).map(a=>({username:a.username,hasPassword:!0}))}}},8303:(a,b,c)=>{c.d(b,{B3:()=>j,T1:()=>k,im:()=>i,sv:()=>h});let d=[3e4,12e4,6e5,18e5],e=new Map;function f(){return Date.now()}function g(a){let b=e.get(a);return b?b.lastFailAt&&f()-b.lastFailAt>36e5&&(!b.lockUntil||f()>=b.lockUntil)?(e.delete(a),null):b:null}function h(a){let b=g(a);if(!b||!b.lockUntil)return{locked:!1};let c=b.lockUntil-f();return c<=0?{locked:!1}:{locked:!0,retryAfter:Math.ceil(c/1e3)}}function i(a){let b=g(a)||{fails:0,lockUntil:0,lockLevel:0,lastFailAt:0};if(b.fails+=1,b.lastFailAt=f(),b.fails>=5){let a=d[Math.min(b.lockLevel,d.length-1)];b.lockUntil=f()+a,b.lockLevel+=1,b.fails=0}return e.set(a,b),{remainingBeforeLock:Math.max(0,5-b.fails)}}function j(a){e.delete(a)}function k(a){let b=a.headers.get("x-forwarded-for");return b?b.split(",")[0].trim():a.headers.get("x-real-ip")||"unknown"}},33792:(a,b,c)=>{c.d(b,{Dc:()=>s,OZ:()=>w,YK:()=>q,dY:()=>t,tm:()=>v});var d=c(84433),e=c(17509),f=c(73024),g=c.n(f),h=c(76760),i=c.n(h),j=c(77598),k=c.n(j),l=c(49120),m=c(8303),n=c(77407),o=c(43096);let p=new TextEncoder().encode(function(){if(process.env.JWT_SECRET)return process.env.JWT_SECRET;let a=i().join(l.DATA_DIR,"jwt-secret");try{return g().readFileSync(a,"utf8").trim()}catch{}g().mkdirSync(l.DATA_DIR,{recursive:!0});let b=k().randomBytes(32).toString("hex");return g().writeFileSync(a,b,{mode:384}),b}());function q(a){let b="true"===process.env.AUTH_COOKIE_SECURE,c=a?.headers?.get?.("x-forwarded-proto");return b||"https"===c}async function r(a={}){return new d.P({authenticated:!0,...a}).setProtectedHeader({alg:"HS256"}).setIssuedAt().setExpirationTime("86400s").sign(p)}async function s(a){if(!a)return!1;try{return await (0,e.V)(a,p),!0}catch{return!1}}async function t(a){if(!a)return null;try{let{payload:b}=await (0,e.V)(a,p);return b}catch{return null}}async function u(a,b){try{let c=function(a={}){return[a.ldapUsername,a.ldapEmail,a.ldapName,a.oidcEmail,a.oidcName,a.localUsername,a.username,a.email].map(a=>String(a||"").trim().toLowerCase()).filter(Boolean)}(b);if(!c.length)return;let d=(0,m.T1)(a);if(!d||"unknown"===d)return;let e=(0,o.loadConfig)(),f=function(a={}){return a.ldapName||a.ldapEmail||a.oidcName||a.oidcEmail||a.localUsername||""}(b);for(let a of c)if((0,n.activateProxySessionOnLogin)({userId:a,displayName:f,ip:d,config:e}))break}catch(a){console.log("Audit Proxy session activation skipped:",a?.message||a)}}async function v(a,b,c={}){let d=await r(c);a.set("auth_token",d,{httpOnly:!0,secure:q(b),sameSite:"lax",path:"/",maxAge:86400}),await u(b,c)}function w(a){a.delete("auth_token")}},43096:(a,b,c)=>{let d=c(29021),e=c(33873),{DATA_DIR:f}=c(82193),{normalizeAllowedClientIps:g}=c(5565),{normalizeAllowedToolsInput:h}=c(98586),{normalizeProxyUsers:i}=c(7566),{normalizeAccessGrants:j}=c(77407),k=e.join(f,"audit-gateway"),l=e.join(k,"config.json"),m=e.join(k,"audit.jsonl"),n=e.join(k,"logs"),o=Object.freeze({enabled:!1,bindHost:"127.0.0.1",port:3128,clientProxyHost:"",clientToolFilterEnabled:!1,allowedClientTools:[],proxyAuthEnabled:!1,proxyAuthUsers:[],accessGrants:[],allowedHosts:["api.anthropic.com","*.anthropic.com","claude.ai","*.claude.ai","api.openai.com","*.openai.com","chatgpt.com","*.chatgpt.com","api.githubcopilot.com","*.githubcopilot.com","api.github.com","q.us-east-1.amazonaws.com","codewhisperer.us-east-1.amazonaws.com","oidc.us-east-1.amazonaws.com","*.auth.desktop.kiro.dev"],passthroughUnknown:!0,captureBodies:!0,captureLimitBytes:2097152,retentionDays:7,verifyUpstreamTls:!0,connectTimeoutMs:1e4,tlsHandshakeTimeoutMs:1e4,responseHeaderTimeoutMs:3e4,idleTimeoutMs:9e5,shutdownGraceMs:1500,sessionIdleTimeoutMs:36e5,allowPlainHttp:!1,allowedConnectPorts:[443]});function p(){return{...o,allowedClientTools:[...o.allowedClientTools],proxyAuthUsers:[...o.proxyAuthUsers],accessGrants:[],allowedHosts:[...o.allowedHosts],allowedConnectPorts:[...o.allowedConnectPorts]}}function q(){d.mkdirSync(k,{recursive:!0}),d.mkdirSync(n,{recursive:!0})}function r(a){return[...new Set((Array.isArray(a)?a:String(a||"").split(/[\r\n,]+/)).map(a=>String(a||"").trim().toLowerCase()).filter(Boolean).filter(a=>!a.includes("://")&&/^[*a-z0-9._-]+$/.test(a)))]}function s(a,b,c,d,e){let f=null==a?b:Number(a);if(!Number.isInteger(f)||f<c||f>d)throw Error(`${e} must be between ${c} and ${d}`);return f}function t(a={}){let b={...o,...a},c=s(b.port,o.port,1,65535,"Proxy port"),d=Number(b.captureLimitBytes);if(!Number.isFinite(d)||d<0||d>0x1000000)throw Error("Capture limit must be between 0 and 16 MB");let e=s(b.retentionDays,o.retentionDays,1,365,"Retention days"),f=s(b.connectTimeoutMs,o.connectTimeoutMs,1e3,12e4,"Connect timeout"),g=s(b.tlsHandshakeTimeoutMs,o.tlsHandshakeTimeoutMs,1e3,12e4,"TLS handshake timeout"),k=s(b.responseHeaderTimeoutMs,o.responseHeaderTimeoutMs,1e3,3e5,"Response header timeout"),l=s(b.idleTimeoutMs,o.idleTimeoutMs,3e4,36e5,"Idle timeout"),m=s(b.shutdownGraceMs,o.shutdownGraceMs,0,3e4,"Shutdown grace period"),n=s(b.sessionIdleTimeoutMs,o.sessionIdleTimeoutMs,3e5,864e5,"Session idle timeout"),p=String(b.bindHost||"127.0.0.1").trim();if(!p||/\s/.test(p))throw Error("Invalid bind address");let q=String(b.clientProxyHost||"").trim();if(/\s/.test(q)||q.includes("://"))throw Error("Client proxy host must be a hostname or IP without protocol");let u=i(b.proxyAuthUsers);0;let v=j(b.accessGrants),w=!0===b.clientToolFilterEnabled,x=h(b.allowedClientTools);if(w&&0===x.length)throw Error("Client tool filter requires at least one allowed tool");return{enabled:!0===b.enabled,bindHost:p,port:c,clientProxyHost:q,clientToolFilterEnabled:w,allowedClientTools:x,proxyAuthEnabled:!1,proxyAuthUsers:u,accessGrants:v,allowedHosts:r(b.allowedHosts),passthroughUnknown:!1!==b.passthroughUnknown,captureBodies:!1!==b.captureBodies,captureLimitBytes:Math.round(d),retentionDays:e,verifyUpstreamTls:!0,connectTimeoutMs:f,tlsHandshakeTimeoutMs:g,responseHeaderTimeoutMs:k,idleTimeoutMs:l,shutdownGraceMs:m,sessionIdleTimeoutMs:n,allowPlainHttp:!1,allowedConnectPorts:[443]}}a.exports={PROXY_AUTH_FEATURE_ENABLED:!1,AUDIT_DIR:k,CONFIG_PATH:l,AUDIT_LOG_PATH:m,AUDIT_LOG_DIR:n,DEFAULT_CONFIG:o,ensureAuditDir:q,loadConfig:function(){if(q(),!d.existsSync(l))return p();try{return t(JSON.parse(d.readFileSync(l,"utf8")))}catch(a){return console.warn(`[audit-proxy] invalid config ignored: ${a.message||a}`),p()}},saveConfig:function(a){q();let b=t(a),c=`${l}.tmp`;return d.writeFileSync(c,`${JSON.stringify(b,null,2)}
2
+ `,{mode:384}),d.renameSync(c,l),b},validateConfig:t,normalizeAllowedHosts:r,normalizeAllowedClientIps:g}},68257:(a,b,c)=>{let{normalizeIp:d}=c(5565),e=new Map;function f(a){let b=Number(a);return Number.isFinite(b)&&b>=6e4?b:36e5}a.exports={DEFAULT_IDLE_TIMEOUT_MS:36e5,MIN_IDLE_TIMEOUT_MS:6e4,activateProxySession:function({userId:a,displayName:b,ip:c,idleTimeoutMs:g}={}){let h=String(a||"").trim().toLowerCase(),i=d(c);if(!h||!i)return null;let j=Date.now(),k=f(g),l=e.get(i);l&&l.userId!==h&&console.log(`[audit-proxy] session for ${i} reassigned from ${l.userId} to ${h}`);let m={userId:h,displayName:String(b||"").trim()||h,activatedAt:l?.userId===h?l.activatedAt:j,expiresAt:j+k};return e.set(i,m),{ip:i,...m}},touchProxySession:function(a,b){let c=d(a),g=e.get(c);return g?(g.expiresAt=Date.now()+f(b),{ip:c,...g}):null},getProxySession:function(a){let b=d(a),c=e.get(b);return c?c.expiresAt<=Date.now()?(e.delete(b),null):{ip:b,...c}:null},listActiveProxySessions:function(){let a=Date.now(),b=[];for(let[c,d]of e){if(d.expiresAt<=a){e.delete(c);continue}b.push({ip:c,...d})}return b.sort((a,b)=>b.expiresAt-a.expiresAt)},pruneExpiredProxySessions:function(){let a=Date.now(),b=0;for(let[c,d]of e)d.expiresAt<=a&&(e.delete(c),b+=1);return b},revokeProxySession:function(a){return e.delete(d(a))},revokeProxySessionsForUser:function(a){let b=String(a||"").trim().toLowerCase();if(!b)return 0;let c=0;for(let[a,d]of e)d.userId===b&&(e.delete(a),c+=1);return c},clearAllProxySessions:function(){let a=e.size;return e.clear(),a}}},77407:(a,b,c)=>{let{normalizeIp:d,clientIpMatches:e}=c(5565),{activateProxySession:f,touchProxySession:g,listActiveProxySessions:h}=c(68257);function i(a){return String(a||"").trim().toLowerCase()}function j(a){let b=Array.isArray(a)?a:a&&"object"==typeof a?Object.entries(a).map(([a,b])=>({userId:a,note:b})):[],c=new Map;for(let a of b){let b=i(a?.userId??a?.user??a?.id);b&&c.set(b,{userId:b,note:String((a?.note??c.get(b)?.note)||"").trim().slice(0,200)})}if(c.size>500)throw Error("At most 500 Audit Proxy access grants are supported");return[...c.values()].sort((a,b)=>a.userId.localeCompare(b.userId))}function k(a=[],b=""){let c=i(b);return c&&a.find(a=>a.userId===c)||null}function l(a={}){let b=a.grants||[],c=new Set(b.map(a=>a.userId)),d=h().filter(a=>c.has(a.userId));return{...a,enabled:!0,allowedClientIps:d.map(a=>a.ip),source:"sessions",grants:b,sessions:d}}a.exports={MAX_GRANTS:500,normalizeGrantUserId:i,normalizeAccessGrants:j,findAccessGrant:k,effectiveClientIpPolicy:function(a={}){return l({grants:j(a.accessGrants),sessionIdleTimeoutMs:a.sessionIdleTimeoutMs})},attachClientIpGate:function(a,b){let c=new Map;return a.prependListener("connection",a=>{let f=d(a?.remoteAddress||""),h=l(b()||{});if(h.enabled&&!e(f,h.allowedClientIps||[])){console.log(`[audit-proxy] denied client IP ${f||"unknown"} (${h.source||"manual"} allowlist)`);try{a.destroy()}catch{}return}g(f,h.sessionIdleTimeoutMs),c.set(a,f),a.once("close",()=>c.delete(a))}),{dropRevoked(){let a=l(b()||{});if(!a.enabled)return 0;let d=0;for(let[b,f]of[...c])if(!e(f,a.allowedClientIps||[])){console.log(`[audit-proxy] closing connection from revoked client IP ${f||"unknown"}`);try{b.destroy()}catch{}c.delete(b),d+=1}return d},connectionCount:()=>c.size}},activateProxySessionOnLogin:function({userId:a,displayName:b,ip:c,config:d}={}){let e=i(a);return e&&k(j(d?.accessGrants),e)?f({userId:e,displayName:b,ip:c,idleTimeoutMs:d?.sessionIdleTimeoutMs}):null}}},82193:(a,b,c)=>{let d=c(29021),e=c(33873),f=c(21820),g="bluerouter";function h(){return"win32"===process.platform?e.join(process.env.APPDATA||e.join(f.homedir(),"AppData","Roaming"),g):e.join(f.homedir(),`.${g}`)}let i=function(){let a=process.env.DATA_DIR;if(!a)return h();try{return d.mkdirSync(a,{recursive:!0}),a}catch(b){if(b?.code==="EACCES"||b?.code==="EPERM")return console.warn(`[DATA_DIR] '${a}' not writable → fallback ~/.${g}`),h();throw b}}(),j=e.join(i,"mitm");a.exports={DATA_DIR:i,MITM_DIR:j}},98586:a=>{let b=[{id:"claude-code",label:"Claude Code",patterns:["claude-cli","claude-code","anthropic"]},{id:"codex",label:"OpenAI Codex",patterns:["codex_cli","codex-cli","codex"]},{id:"gemini-cli",label:"Gemini CLI",patterns:["gemini-cli","google-genai"]},{id:"cursor",label:"Cursor",patterns:["cursor"]},{id:"copilot",label:"GitHub Copilot",patterns:["copilot","githubcopilot"]},{id:"kiro",label:"Kiro",patterns:["kiro","aws-sdk-js"]},{id:"curl",label:"curl / scripts",patterns:["curl","wget","httpie"]}];function c(a){return String(a||"").trim().toLowerCase()}function d(a,b=[]){let e=c(a);return!!e&&!!b.length&&b.some(a=>a&&e.includes(a))}a.exports={TOOL_PRESETS:b,normalizeAllowedTools:function(a){let d=Array.isArray(a)?a:String(a||"").split(/[\r\n,]+/),e=[];for(let a of d){let d=c(a);if(!d)continue;let f=b.find(a=>a.id===d);f?e.push(...f.patterns):e.push(d)}return[...new Set(e)]},normalizeAllowedToolsInput:function(a){return[...new Set((Array.isArray(a)?a:String(a||"").split(/[\r\n,]+/)).map(c).filter(Boolean))]},clientToolMatches:d,shouldRefuseClientTool:function(a,b=[]){return!!c(a)&&!d(a,b)},describeUserAgent:function(a){let b=String(a||"").trim();return b?b.length>120?`${b.slice(0,119)}…`:b:"no User-Agent"}}}};
@@ -21,8 +21,7 @@ ${f}Connection: close\r
21
21
  Content-Type: text/plain; charset=utf-8\r
22
22
  Content-Length: ${Buffer.byteLength(e)}\r
23
23
  \r
24
- ${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(99721).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}},37436:(a,b,c)=>{let d=c(29021),e=c(33873),f=c(21820),g="bluerouter";function h(){return"win32"===process.platform?e.join(process.env.APPDATA||e.join(f.homedir(),"AppData","Roaming"),g):e.join(f.homedir(),`.${g}`)}let i=function(){let a=process.env.DATA_DIR;if(!a)return h();try{return d.mkdirSync(a,{recursive:!0}),a}catch(b){if(b?.code==="EACCES"||b?.code==="EPERM")return console.warn(`[DATA_DIR] '${a}' not writable → fallback ~/.${g}`),h();throw b}}(),j=e.join(i,"mitm");a.exports={DATA_DIR:i,MITM_DIR:j}},42947:(a,b,c)=>{let d=c(29021),e=c(33873),{DATA_DIR:f}=c(37436),{normalizeAllowedClientIps:g}=c(54584),{normalizeAllowedToolsInput:h}=c(47141),{normalizeProxyUsers:i}=c(99721),{normalizeAccessGrants:j}=c(68370),k=e.join(f,"audit-gateway"),l=e.join(k,"config.json"),m=e.join(k,"audit.jsonl"),n=e.join(k,"logs"),o=Object.freeze({enabled:!1,bindHost:"127.0.0.1",port:3128,clientProxyHost:"",clientToolFilterEnabled:!1,allowedClientTools:[],proxyAuthEnabled:!1,proxyAuthUsers:[],accessGrants:[],allowedHosts:["api.anthropic.com","*.anthropic.com","claude.ai","*.claude.ai","api.openai.com","*.openai.com","chatgpt.com","*.chatgpt.com","api.githubcopilot.com","*.githubcopilot.com","api.github.com","q.us-east-1.amazonaws.com","codewhisperer.us-east-1.amazonaws.com","oidc.us-east-1.amazonaws.com","*.auth.desktop.kiro.dev"],passthroughUnknown:!0,captureBodies:!0,captureLimitBytes:2097152,retentionDays:7,verifyUpstreamTls:!0,connectTimeoutMs:1e4,tlsHandshakeTimeoutMs:1e4,responseHeaderTimeoutMs:3e4,idleTimeoutMs:9e5,shutdownGraceMs:1500,allowPlainHttp:!1,allowedConnectPorts:[443]});function p(){return{...o,allowedClientTools:[...o.allowedClientTools],proxyAuthUsers:[...o.proxyAuthUsers],accessGrants:[],allowedHosts:[...o.allowedHosts],allowedConnectPorts:[...o.allowedConnectPorts]}}function q(){d.mkdirSync(k,{recursive:!0}),d.mkdirSync(n,{recursive:!0})}function r(a){return[...new Set((Array.isArray(a)?a:String(a||"").split(/[\r\n,]+/)).map(a=>String(a||"").trim().toLowerCase()).filter(Boolean).filter(a=>!a.includes("://")&&/^[*a-z0-9._-]+$/.test(a)))]}function s(a,b,c,d,e){let f=null==a?b:Number(a);if(!Number.isInteger(f)||f<c||f>d)throw Error(`${e} must be between ${c} and ${d}`);return f}function t(a={}){let b={...o,...a},c=s(b.port,o.port,1,65535,"Proxy port"),d=Number(b.captureLimitBytes);if(!Number.isFinite(d)||d<0||d>0x1000000)throw Error("Capture limit must be between 0 and 16 MB");let e=s(b.retentionDays,o.retentionDays,1,365,"Retention days"),f=s(b.connectTimeoutMs,o.connectTimeoutMs,1e3,12e4,"Connect timeout"),g=s(b.tlsHandshakeTimeoutMs,o.tlsHandshakeTimeoutMs,1e3,12e4,"TLS handshake timeout"),k=s(b.responseHeaderTimeoutMs,o.responseHeaderTimeoutMs,1e3,3e5,"Response header timeout"),l=s(b.idleTimeoutMs,o.idleTimeoutMs,3e4,36e5,"Idle timeout"),m=s(b.shutdownGraceMs,o.shutdownGraceMs,0,3e4,"Shutdown grace period"),n=String(b.bindHost||"127.0.0.1").trim();if(!n||/\s/.test(n))throw Error("Invalid bind address");let p=String(b.clientProxyHost||"").trim();if(/\s/.test(p)||p.includes("://"))throw Error("Client proxy host must be a hostname or IP without protocol");let q=i(b.proxyAuthUsers);0;let u=j(b.accessGrants),v=!0===b.clientToolFilterEnabled,w=h(b.allowedClientTools);if(v&&0===w.length)throw Error("Client tool filter requires at least one allowed tool");return{enabled:!0===b.enabled,bindHost:n,port:c,clientProxyHost:p,clientToolFilterEnabled:v,allowedClientTools:w,proxyAuthEnabled:!1,proxyAuthUsers:q,accessGrants:u,allowedHosts:r(b.allowedHosts),passthroughUnknown:!1!==b.passthroughUnknown,captureBodies:!1!==b.captureBodies,captureLimitBytes:Math.round(d),retentionDays:e,verifyUpstreamTls:!0,connectTimeoutMs:f,tlsHandshakeTimeoutMs:g,responseHeaderTimeoutMs:k,idleTimeoutMs:l,shutdownGraceMs:m,allowPlainHttp:!1,allowedConnectPorts:[443]}}a.exports={PROXY_AUTH_FEATURE_ENABLED:!1,AUDIT_DIR:k,CONFIG_PATH:l,AUDIT_LOG_PATH:m,AUDIT_LOG_DIR:n,DEFAULT_CONFIG:o,ensureAuditDir:q,loadConfig:function(){if(q(),!d.existsSync(l))return p();try{return t(JSON.parse(d.readFileSync(l,"utf8")))}catch(a){return console.warn(`[audit-proxy] invalid config ignored: ${a.message||a}`),p()}},saveConfig:function(a){q();let b=t(a),c=`${l}.tmp`;return d.writeFileSync(c,`${JSON.stringify(b,null,2)}
25
- `,{mode:384}),d.renameSync(c,l),b},validateConfig:t,normalizeAllowedHosts:r,normalizeAllowedClientIps:g}},47141:a=>{let b=[{id:"claude-code",label:"Claude Code",patterns:["claude-cli","claude-code","anthropic"]},{id:"codex",label:"OpenAI Codex",patterns:["codex_cli","codex-cli","codex"]},{id:"gemini-cli",label:"Gemini CLI",patterns:["gemini-cli","google-genai"]},{id:"cursor",label:"Cursor",patterns:["cursor"]},{id:"copilot",label:"GitHub Copilot",patterns:["copilot","githubcopilot"]},{id:"kiro",label:"Kiro",patterns:["kiro","aws-sdk-js"]},{id:"curl",label:"curl / scripts",patterns:["curl","wget","httpie"]}];function c(a){return String(a||"").trim().toLowerCase()}function d(a,b=[]){let e=c(a);return!!e&&!!b.length&&b.some(a=>a&&e.includes(a))}a.exports={TOOL_PRESETS:b,normalizeAllowedTools:function(a){let d=Array.isArray(a)?a:String(a||"").split(/[\r\n,]+/),e=[];for(let a of d){let d=c(a);if(!d)continue;let f=b.find(a=>a.id===d);f?e.push(...f.patterns):e.push(d)}return[...new Set(e)]},normalizeAllowedToolsInput:function(a){return[...new Set((Array.isArray(a)?a:String(a||"").split(/[\r\n,]+/)).map(c).filter(Boolean))]},clientToolMatches:d,shouldRefuseClientTool:function(a,b=[]){return!!c(a)&&!d(a,b)},describeUserAgent:function(a){let b=String(a||"").trim();return b?b.length>120?`${b.slice(0,119)}…`:b:"no User-Agent"}}},54584:(a,b,c)=>{let d=c(91645);function e(a){let b=String(a||"").trim().toLowerCase();b.startsWith("[")&&b.endsWith("]")&&(b=b.slice(1,-1));let c=b.indexOf("%");return c>=0&&(b=b.slice(0,c)),b.startsWith("::ffff:")&&4===d.isIP(b.slice(7))&&(b=b.slice(7)),b}function f(a){return Buffer.from(a.split(".").map(a=>Number(a)))}function g(a,b){return 4===b?f(a):function(a){let b=e(a),c=b.lastIndexOf(":");if(c>=0){let a=b.slice(c+1);if(4===d.isIP(a)){let d=f(a),e=(d[0]<<8|d[1]).toString(16),g=(d[2]<<8|d[3]).toString(16);b=`${b.slice(0,c)}:${e}:${g}`}}let g=b.split("::");if(g.length>2)throw Error("Invalid IPv6 address");let h=g[0]?g[0].split(":").filter(Boolean):[],i=2===g.length&&g[1]?g[1].split(":").filter(Boolean):[],j=8-h.length-i.length;if(1===g.length&&0!==j||j<0)throw Error("Invalid IPv6 address");let k=2===g.length?[...h,...Array(j).fill("0"),...i]:h;if(8!==k.length)throw Error("Invalid IPv6 address");let l=Buffer.alloc(16);return k.forEach((a,b)=>{let c=Number.parseInt(a||"0",16);if(!Number.isInteger(c)||c<0||c>65535)throw Error("Invalid IPv6 address");l[2*b]=c>>8&255,l[2*b+1]=255&c}),l}(a)}function h(a){let b=String(a||"").trim();if(!b)throw Error("Empty IP rule");let c=b.indexOf("/"),f=e(c>=0?b.slice(0,c):b),g=d.isIP(f);if(!g)throw Error(`Invalid client IP/CIDR: ${b}`);let h=4===g?32:128,i=c>=0?Number(b.slice(c+1)):h;if(!Number.isInteger(i)||i<0||i>h)throw Error(`Invalid CIDR prefix: ${b}`);return{text:c>=0?`${f}/${i}`:f,ip:f,family:g,prefix:i}}a.exports={normalizeIp:e,parseIpRule:h,normalizeAllowedClientIps:function(a){let b=Array.isArray(a)?a:String(a||"").split(/[\r\n,]+/),c=[],d=new Set;for(let a of b){let b=String(a||"").trim();if(!b)continue;let e=h(b);d.has(e.text)||(d.add(e.text),c.push(e.text))}return c},clientIpMatches:function(a,b=[]){let c=e(a),f=d.isIP(c);if(!f)return!1;let i=g(c,f);for(let a of b||[]){let b;try{b=h(a)}catch{continue}if(b.family===f&&function(a,b,c){let d=Math.floor(c/8),e=c%8;for(let c=0;c<d;c+=1)if(a[c]!==b[c])return!1;if(!e)return!0;let f=255<<8-e&255;return(a[d]&f)==(b[d]&f)}(i,g(b.ip,b.family),b.prefix))return!0}return!1}}},62952:(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(42947),{redactObject:l,scrubString:m}=c(14681),{toTokensJson:n,totalInputTokens:o}=c(11562),{publishRecentUsage:p}=c(79841),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=null,B="",C=Promise.resolve(),D=Promise.resolve(),E=0,F=null,G=new Map,H={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 I(a){let b=Date.now();b-E<6e4||(E=b,console.warn(`[AuditProxy][PromptDB] ${a}`))}function J(a){H.lastError=String(a||"Audit store failure"),console.warn(`[AuditProxy][Store] ${H.lastError}`)}async function K(){let a=Date.now();if(u.expiresAt>a)return u.config;v||(v=Promise.all([c.e(689),c.e(3960)]).then(c.bind(c,41170)));let b=await v,d=await b.getPromptLogDbConfig();return u={expiresAt:a+5e3,config:d},d}async function L(){return w||(w=c.e(3056).then(c.bind(c,93056))),w}async function M(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(A&&B===b)return A;let d=C.then(async()=>{if(A&&B===b)return A;if(A){try{await A.end()}catch{}A=null,B=""}let d=await c.e(4790).then(c.t.bind(c,94790,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 A=e,B=b,e});return C=d.then(()=>void 0,()=>void 0),d}function N(a){let b=a?new Date(a):new Date;return(Number.isNaN(b.getTime())?new Date:b).toISOString().replace("T"," ").replace("Z","")}function O(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 P(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)P(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)?P(e,b+1,c):b<8&&["messages","contents","parts","body","request","payload","response","choices","output","item","items"].includes(a)&&P(e,b+1,c)}return c}function Q(a){if("string"!=typeof a)return!1;let b=a.trim();return!!b&&!/^\[[^\]]*\]$/.test(b)}function R(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 S(a){if(!a)return null;let b=g.createHash("sha256").update(a).digest("hex"),c=Buffer.byteLength(String(a||""),"utf8"),d=await L();return await d.writePayloadFile(b,a),{payloadHash:b,payloadSizeBytes:c}}async function T(a,b,c,d){if(!c)return null;let{payloadHash:e,payloadSizeBytes:f}=c;return await a.query(`INSERT INTO prompt_log_payloads (
24
+ ${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(99721).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}},62952:(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(42947),{redactObject:l,scrubString:m}=c(14681),{toTokensJson:n,totalInputTokens:o}=c(11562),{publishRecentUsage:p}=c(79841),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=null,B="",C=Promise.resolve(),D=Promise.resolve(),E=0,F=null,G=new Map,H={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 I(a){let b=Date.now();b-E<6e4||(E=b,console.warn(`[AuditProxy][PromptDB] ${a}`))}function J(a){H.lastError=String(a||"Audit store failure"),console.warn(`[AuditProxy][Store] ${H.lastError}`)}async function K(){let a=Date.now();if(u.expiresAt>a)return u.config;v||(v=Promise.all([c.e(689),c.e(3960)]).then(c.bind(c,41170)));let b=await v,d=await b.getPromptLogDbConfig();return u={expiresAt:a+5e3,config:d},d}async function L(){return w||(w=c.e(3056).then(c.bind(c,93056))),w}async function M(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(A&&B===b)return A;let d=C.then(async()=>{if(A&&B===b)return A;if(A){try{await A.end()}catch{}A=null,B=""}let d=await c.e(4790).then(c.t.bind(c,94790,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 A=e,B=b,e});return C=d.then(()=>void 0,()=>void 0),d}function N(a){let b=a?new Date(a):new Date;return(Number.isNaN(b.getTime())?new Date:b).toISOString().replace("T"," ").replace("Z","")}function O(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 P(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)P(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)?P(e,b+1,c):b<8&&["messages","contents","parts","body","request","payload","response","choices","output","item","items"].includes(a)&&P(e,b+1,c)}return c}function Q(a){if("string"!=typeof a)return!1;let b=a.trim();return!!b&&!/^\[[^\]]*\]$/.test(b)}function R(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 S(a){if(!a)return null;let b=g.createHash("sha256").update(a).digest("hex"),c=Buffer.byteLength(String(a||""),"utf8"),d=await L();return await d.writePayloadFile(b,a),{payloadHash:b,payloadSizeBytes:c}}async function T(a,b,c,d){if(!c)return null;let{payloadHash:e,payloadSizeBytes:f}=c;return await a.query(`INSERT INTO prompt_log_payloads (
26
25
  payload_hash, created_at, last_seen_at, content_type, payload_size_bytes, ref_count, payload_json
27
26
  ) VALUES (?, ?, ?, ?, ?, 1, NULL)
28
27
  ON DUPLICATE KEY UPDATE
@@ -46,16 +45,16 @@ ${e}`)}catch{try{a.destroy()}catch{}}}function N(a={}){let b={};for(let[c,d]of O
46
45
  WHERE p.payload_hash = ?
47
46
  AND p.last_seen_at < UTC_TIMESTAMP(3) - INTERVAL 5 MINUTE
48
47
  AND NOT EXISTS (SELECT 1 FROM prompt_logs r WHERE r.payload_hash = p.payload_hash)
49
- AND NOT EXISTS (SELECT 1 FROM prompt_logs r WHERE r.response_payload_hash = p.payload_hash)`,[b]);d?.affectedRows&&g.push(b)}await a.commit();let h=await L();await Promise.all(g.map(a=>h.deletePayloadFile(a).catch(()=>{})))}catch(b){if(a)try{await a.rollback()}catch{}I(`Failed to clear mirrored audit rows: ${b.message||b}`)}finally{try{a?.release()}catch{}}}a.exports={appendAudit:function(a){return ae(async()=>a)},enqueueAuditJob:ae,readRecent:ah,clearAudit:async function a(){H.clearing=!0,H.queue.length=0,H.workers.size&&await Promise.allSettled([...H.workers]),j();let a=await d.promises.readdir(i).catch(()=>[]);await Promise.all(a.filter(a=>a.endsWith(".jsonl")).map(a=>d.promises.unlink(e.join(i,a)).catch(()=>{}))),await d.promises.writeFile(h,"",{mode:384}).catch(()=>{}),G.clear(),await al(),H.clearing=!1,H.queue.length&&setImmediate(ad)},pruneExpired:aj,startAuditMaintenance:function(){F||(F=setInterval(()=>void aj(),36e5),F.unref?.())},stopAuditMaintenance:function(){F&&clearInterval(F),F=null},flushAuditQueue:ak,getAuditStoreStats:function(){return{queueDepth:H.queue.length,queueLimit:1e3,workerRunning:H.activeWorkers>0,workerConcurrency:4,activeWorkers:H.activeWorkers,mysqlPoolConnections:4,enqueued:H.enqueued,written:H.written,dropped:H.dropped,failed:H.failed,mysqlWritten:H.mysqlWritten,mysqlFailed:H.mysqlFailed,mysqlSkipped:H.mysqlSkipped,mysqlSkippedByReason:{...H.mysqlSkippedByReason},usageWritten:H.usageWritten,usageFailed:H.usageFailed,tokensSeen:H.tokensSeen,lastError:H.lastError,lastWrittenAt:H.lastWrittenAt,logDirectory:i}},appendPromptLog:X,appendUsageEvent:$,promptLogMirrorDecision:W}},68370:(a,b,c)=>{let{normalizeAllowedClientIps:d,clientIpMatches:e,normalizeIp:f}=c(54584);function g(a){return String(a||"").trim().toLowerCase()}function h(a){let b=Array.isArray(a)?a:a&&"object"==typeof a?Object.entries(a).map(([a,b])=>({userId:a,ips:b})):[],c=new Map;for(let a of b){let b=g(a?.userId??a?.user??a?.id);if(!b)continue;let e=d(a?.ips??a?.allowedClientIps??[]);if(e.length>64)throw Error(`Grant for ${b} exceeds 64 IP entries`);let f=c.get(b);c.set(b,{userId:b,ips:f?d([...f.ips,...e]):e,note:String((a?.note??f?.note)||"").trim().slice(0,200)})}if(c.size>500)throw Error("At most 500 Audit Proxy access grants are supported");return[...c.values()].sort((a,b)=>a.userId.localeCompare(b.userId))}function i(a=[]){return d(a.flatMap(a=>a?.ips||[]))}a.exports={MAX_GRANTS:500,MAX_IPS_PER_GRANT:64,normalizeGrantUserId:g,normalizeAccessGrants:h,grantedIps:i,findAccessGrant:function(a=[],b=""){let c=g(b);return c&&a.find(a=>a.userId===c)||null},effectiveClientIpPolicy:function(a={}){let b=h(a.accessGrants);return{enabled:!0,allowedClientIps:i(b),source:"grants",grants:b}},attachClientIpGate:function(a,b){let c=new Map;return a.prependListener("connection",a=>{let d=f(a?.remoteAddress||""),g=b()||{};if(g.enabled&&!e(d,g.allowedClientIps||[])){console.log(`[audit-proxy] denied client IP ${d||"unknown"} (${g.source||"manual"} allowlist)`);try{a.destroy()}catch{}return}c.set(a,d),a.once("close",()=>c.delete(a))}),{dropRevoked(){let a=b()||{};if(!a.enabled)return 0;let d=0;for(let[b,f]of[...c])if(!e(f,a.allowedClientIps||[])){console.log(`[audit-proxy] closing connection from revoked client IP ${f||"unknown"}`);try{b.destroy()}catch{}c.delete(b),d+=1}return d},connectionCount:()=>c.size}}}},77051:(a,b,c)=>{let d=c(14985).promises,e=c(91645),{normalizeIp:f,clientIpMatches:g}=c(54584),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()}}},93599:(a,b,c)=>{let d=c(81630),e=c(73496),f=c(91645),g=c(34631),h=c(74075),i=c(55511),j=c(5019),{createAuditProxy:k,CaptureBuffer:l}=c(33575),{containsLikelySecret:m}=c(14681),{clientIpMatches:n,normalizeAllowedClientIps:o}=c(54584),{normalizeAllowedTools:p,clientToolMatches:q,shouldRefuseClientTool:r}=c(47141),{createProxyAuthenticator:s,createProxyAuthLimiter:t,hashProxyPassword:u,parseBasicProxyAuthorization:v}=c(99721),{isPublicAddress:w}=c(77051),{validateConfig:x,PROXY_AUTH_FEATURE_ENABLED:y}=c(42947),{normalizeAccessGrants:z,effectiveClientIpPolicy:A,attachClientIpGate:B,findAccessGrant:C}=c(68370),{promptLogMirrorDecision:D}=c(62952);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
48
+ AND NOT EXISTS (SELECT 1 FROM prompt_logs r WHERE r.response_payload_hash = p.payload_hash)`,[b]);d?.affectedRows&&g.push(b)}await a.commit();let h=await L();await Promise.all(g.map(a=>h.deletePayloadFile(a).catch(()=>{})))}catch(b){if(a)try{await a.rollback()}catch{}I(`Failed to clear mirrored audit rows: ${b.message||b}`)}finally{try{a?.release()}catch{}}}a.exports={appendAudit:function(a){return ae(async()=>a)},enqueueAuditJob:ae,readRecent:ah,clearAudit:async function a(){H.clearing=!0,H.queue.length=0,H.workers.size&&await Promise.allSettled([...H.workers]),j();let a=await d.promises.readdir(i).catch(()=>[]);await Promise.all(a.filter(a=>a.endsWith(".jsonl")).map(a=>d.promises.unlink(e.join(i,a)).catch(()=>{}))),await d.promises.writeFile(h,"",{mode:384}).catch(()=>{}),G.clear(),await al(),H.clearing=!1,H.queue.length&&setImmediate(ad)},pruneExpired:aj,startAuditMaintenance:function(){F||(F=setInterval(()=>void aj(),36e5),F.unref?.())},stopAuditMaintenance:function(){F&&clearInterval(F),F=null},flushAuditQueue:ak,getAuditStoreStats:function(){return{queueDepth:H.queue.length,queueLimit:1e3,workerRunning:H.activeWorkers>0,workerConcurrency:4,activeWorkers:H.activeWorkers,mysqlPoolConnections:4,enqueued:H.enqueued,written:H.written,dropped:H.dropped,failed:H.failed,mysqlWritten:H.mysqlWritten,mysqlFailed:H.mysqlFailed,mysqlSkipped:H.mysqlSkipped,mysqlSkippedByReason:{...H.mysqlSkippedByReason},usageWritten:H.usageWritten,usageFailed:H.usageFailed,tokensSeen:H.tokensSeen,lastError:H.lastError,lastWrittenAt:H.lastWrittenAt,logDirectory:i}},appendPromptLog:X,appendUsageEvent:$,promptLogMirrorDecision:W}},77051:(a,b,c)=>{let d=c(14985).promises,e=c(91645),{normalizeIp:f,clientIpMatches:g}=c(54584),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()}}},93599:(a,b,c)=>{let d=c(81630),e=c(73496),f=c(91645),g=c(34631),h=c(74075),i=c(55511),j=c(5019),{createAuditProxy:k,CaptureBuffer:l}=c(33575),{containsLikelySecret:m}=c(14681),{clientIpMatches:n,normalizeAllowedClientIps:o}=c(54584),{normalizeAllowedTools:p,clientToolMatches:q,shouldRefuseClientTool:r}=c(47141),{createProxyAuthenticator:s,createProxyAuthLimiter:t,hashProxyPassword:u,parseBasicProxyAuthorization:v}=c(99721),{isPublicAddress:w}=c(77051),{validateConfig:x,PROXY_AUTH_FEATURE_ENABLED:y}=c(42947),{normalizeAccessGrants:z,effectiveClientIpPolicy:A,attachClientIpGate:B,findAccessGrant:C}=c(68370),{activateProxySession:D,touchProxySession:E,getProxySession:F,revokeProxySession:G,clearAllProxySessions:H}=c(60484),{promptLogMirrorDecision:I}=c(62952);function J(a){return i.createHash("sha256").update(a).digest("hex")}function K(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 L(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 M(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 N(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 O(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 P(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
50
49
  `:"";h.write(`CONNECT ${b} HTTP/1.1\r
51
50
  Host: ${b}\r
52
51
  ${a}${d}Proxy-Connection: keep-alive\r
53
52
  \r
54
- `)});let k=a=>{let b=(i=Buffer.concat([i,a])).indexOf("\r\n\r\n");if(b<0)return;h.removeListener("data",k),clearTimeout(j);let c=i.subarray(0,b).toString("utf8"),d=i.subarray(b+4);if(!/^HTTP\/1\.1 200\b/.test(c)){h.destroy(),g(Error(`CONNECT failed: ${c.split("\r\n")[0]}`));return}d.length&&h.unshift(d),e(h)};h.on("data",k)})}function L(a,b,c=""){return new Promise((d,e)=>{let g=f.connect(a,"127.0.0.1"),h=Buffer.alloc(0),i=setTimeout(()=>e(Error("CONNECT raw timeout")),7e3);g.once("error",e),g.once("connect",()=>{g.write(`CONNECT ${b} HTTP/1.1\r
53
+ `)});let k=a=>{let b=(i=Buffer.concat([i,a])).indexOf("\r\n\r\n");if(b<0)return;h.removeListener("data",k),clearTimeout(j);let c=i.subarray(0,b).toString("utf8"),d=i.subarray(b+4);if(!/^HTTP\/1\.1 200\b/.test(c)){h.destroy(),g(Error(`CONNECT failed: ${c.split("\r\n")[0]}`));return}d.length&&h.unshift(d),e(h)};h.on("data",k)})}function Q(a,b,c=""){return new Promise((d,e)=>{let g=f.connect(a,"127.0.0.1"),h=Buffer.alloc(0),i=setTimeout(()=>e(Error("CONNECT raw timeout")),7e3);g.once("error",e),g.once("connect",()=>{g.write(`CONNECT ${b} HTTP/1.1\r
55
54
  Host: ${b}\r
56
55
  ${c}\r
57
- `)}),g.on("data",a=>{let b=(h=Buffer.concat([h,a])).indexOf("\r\n\r\n");if(b<0)return;clearTimeout(i);let c=h.subarray(0,b).toString("utf8");try{g.destroy()}catch{}d(c)}),g.on("close",()=>{clearTimeout(i),d(h.toString("utf8"))})})}function M(a){return new Promise(b=>{let c=f.connect(a,"127.0.0.1"),d="",e=!1,g=a=>{if(!e){e=!0,clearTimeout(h);try{c.destroy()}catch{}b(a)}},h=setTimeout(()=>g({served:d.length>0,hungUp:!1,received:d}),1500);c.on("connect",()=>c.write("GET / HTTP/1.1\r\nHost: gate.test\r\nConnection: close\r\n\r\n")),c.on("data",a=>{d+=a.toString("utf8")}),c.on("error",()=>g({served:!1,hungUp:!0,received:d})),c.on("close",()=>g({served:d.length>0,hungUp:0===d.length,received:d}))})}function N(a,b){return`Proxy-Authorization: Basic ${Buffer.from(`${a}:${b}`).toString("base64")}\r
58
- `}function O({socket:a,ca:b,servername:c,port:d,body:e,path:f,alpnProtocols:h=["http/1.1"],onAlpn:i}){return new Promise((j,k)=>{let l=g.connect({socket:a,ca:b,servername:c,rejectUnauthorized:!0,ALPNProtocols:h}),m=[],n=setTimeout(()=>k(Error("TLS HTTP/1.1 test timeout")),1e4);l.once("error",k),l.once("secureConnect",()=>{i?.(l.alpnProtocol),l.write(`POST ${f} HTTP/1.1\r
56
+ `)}),g.on("data",a=>{let b=(h=Buffer.concat([h,a])).indexOf("\r\n\r\n");if(b<0)return;clearTimeout(i);let c=h.subarray(0,b).toString("utf8");try{g.destroy()}catch{}d(c)}),g.on("close",()=>{clearTimeout(i),d(h.toString("utf8"))})})}function R(a){return new Promise(b=>{let c=f.connect(a,"127.0.0.1"),d="",e=!1,g=a=>{if(!e){e=!0,clearTimeout(h);try{c.destroy()}catch{}b(a)}},h=setTimeout(()=>g({served:d.length>0,hungUp:!1,received:d}),1500);c.on("connect",()=>c.write("GET / HTTP/1.1\r\nHost: gate.test\r\nConnection: close\r\n\r\n")),c.on("data",a=>{d+=a.toString("utf8")}),c.on("error",()=>g({served:!1,hungUp:!0,received:d})),c.on("close",()=>g({served:d.length>0,hungUp:0===d.length,received:d}))})}function S(a,b){return`Proxy-Authorization: Basic ${Buffer.from(`${a}:${b}`).toString("base64")}\r
57
+ `}function T({socket:a,ca:b,servername:c,port:d,body:e,path:f,alpnProtocols:h=["http/1.1"],onAlpn:i}){return new Promise((j,k)=>{let l=g.connect({socket:a,ca:b,servername:c,rejectUnauthorized:!0,ALPNProtocols:h}),m=[],n=setTimeout(()=>k(Error("TLS HTTP/1.1 test timeout")),1e4);l.once("error",k),l.once("secureConnect",()=>{i?.(l.alpnProtocol),l.write(`POST ${f} HTTP/1.1\r
59
58
  Host: localhost:${d}\r
60
59
  Authorization: Bearer test-secret-authorization-123456789\r
61
60
  x-api-key: sk-test-supersecret-123456789\r
@@ -64,7 +63,7 @@ Content-Type: application/json\r
64
63
  Content-Length: ${e.length}\r
65
64
  Connection: close\r
66
65
  \r
67
- `),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
66
+ `),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});H();try{let a=z([{userId:"Anh-TCT@Fujinet.net",note:" Laptop "},{userId:"anh-tct@fujinet.net",note:"kept"},{userId:"",note:"dropped: no userId"}]);c("Grant user id is normalised and duplicates merge",1===a.length&&"anh-tct@fujinet.net"===a[0].userId,JSON.stringify(a)),c("A later duplicate's note wins",a[0]?.note==="kept",a[0]?.note);let b=z([{userId:"anh-tct",note:" Laptop "}]);c("Grant note is trimmed",b[0]?.note==="Laptop",b[0]?.note);let e=z([{userId:"anh-tct"},{userId:"bob@fujinet.net"}]);c("Grant lookup matches a bare username",C(e,"Anh-TCT")?.userId==="anh-tct"),c("Grant lookup matches an email identity",C(e,"BOB@fujinet.net")?.userId==="bob@fujinet.net"),c("Grant lookup refuses an unknown identity",null===C(e,"carol")),D({userId:"u",ip:"10.9.9.9",idleTimeoutMs:6e4});let g=A({accessGrants:[{userId:"u"}]});c("A session for a permitted user is allowed",!0===g.enabled&&"sessions"===g.source&&n("10.9.9.9",g.allowedClientIps),JSON.stringify(g.allowedClientIps));let h=A({accessGrants:[{userId:"someone-else"}]});c("That same session is ignored once its user is no longer granted",!0===h.enabled&&0===h.allowedClientIps.length&&!n("10.9.9.9",h.allowedClientIps),JSON.stringify(h.allowedClientIps));let i=A({accessGrants:[]});c("No grant at all means IP filtering is on with a deny-all allowlist",!0===i.enabled&&"sessions"===i.source&&0===i.allowedClientIps.length,JSON.stringify(i)),G("10.9.9.9"),c("The session is gone from the active list once revoked",null===F("10.9.9.9")),D({userId:"u",ip:"10.5.5.5",idleTimeoutMs:6e4});let j=F("10.5.5.5")?.expiresAt;await new Promise(a=>setTimeout(a,5)),E("10.5.5.5",12e4);let k=F("10.5.5.5")?.expiresAt;c("Touching a session slides its expiry forward",Number.isFinite(k)&&k>j,`${j} -> ${k}`),G("10.5.5.5");let l=d.createServer((a,b)=>b.end("served"));try{let a=A({accessGrants:[{userId:"granted"}]}),b=B(l,()=>a),d=await M(l),e=await R(d.port);c("A client IP with no active session is hung up on",!1===e.served,JSON.stringify(e)),D({userId:"granted",ip:"127.0.0.1",idleTimeoutMs:6e4});let g=await R(d.port);c("Logging in applies on the next connection, no restart",!0===g.served&&/served/.test(g.received)&&!0===l.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)),G("127.0.0.1");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 R(d.port);c("And refuses it on the next attempt",!1===j.served&&!0===l.listening,JSON.stringify(j.hungUp))}finally{await N(l)}}finally{H()}let j=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",j)),c("Client IPv4 CIDR allowlist match",n("10.20.30.77",j)),c("Client IPv6 CIDR allowlist match",n("2001:db8::1234",j)),c("Client IP outside allowlist denied",!n("10.20.31.77",j)),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 v=JSON.stringify({type:"message",content:[{type:"text",text:"brotli audit ok"}]}),U=new l(1048576);U.add(h.brotliCompressSync(Buffer.from(v)));let V=await U.finish("application/json","br");c("Brotli audit body decoded",!0===V.decoded&&V.body.includes("brotli audit ok")&&!V.decodeError);let W=Buffer.from(`TRUNCATED-GZIP-PREFIX-OK${i.randomBytes(8192).toString("hex")}`),X=h.gzipSync(W),Y=new l(Math.floor(.7*X.length));Y.add(X);let Z=await Y.finish("application/json","gzip");c("Truncated gzip audit body partially decoded",!0===Z.decodePartial&&!0===Z.truncated&&Z.body.includes("TRUNCATED-GZIP-PREFIX-OK"),Z.decodeError||"");let $=K("BlueRouter Audit Self Test Upstream CA"),_=L($,"localhost"),aa=K("BlueRouter Audit Self Test Proxy CA"),ab=L(aa,"localhost"),ac=Buffer.from(JSON.stringify({type:"message",content:[{type:"text",text:"compressed response preserved"}]})),ad=h.brotliCompressSync(ac),ae=[],af=`event: message_start
68
67
  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}}})}
69
68
 
70
69
  event: content_block_delta
@@ -75,7 +74,7 @@ data: ${JSON.stringify({type:"message_delta",delta:{stop_reason:"end_turn"},usag
75
74
 
76
75
  event: message_stop
77
76
  data: ${JSON.stringify({type:"message_stop"})}
78
- `,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
77
+ `,ag=h.gzipSync(Buffer.from(af,"utf8")),ah=e.createSecureServer({key:_.key,cert:_.cert,allowHTTP1:!0});ah.on("request",(a,b)=>{let c=[];a.on("data",a=>c.push(Buffer.from(a))),a.on("end",()=>{if(ae.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(ag.length)}),b.end(ag);return}b.writeHead(200,{"content-type":"application/json","content-encoding":"br","content-length":String(ad.length)}),b.end(ad)})});let ai=[],aj=null,ak=null;try{var al;let a=await M(ah);aj=k({allowedHosts:["localhost"],passthroughUnknown:!1,captureBodies:!0,captureLimitBytes:1048576,verifyUpstreamTls:!0,allowedConnectPorts:[a.port],connectTimeoutMs:5e3,tlsHandshakeTimeoutMs:5e3,responseHeaderTimeoutMs:5e3,idleTimeoutMs:3e4},{certificateProvider:()=>ab,upstreamCa:$.certPem,resolveTarget:O,onAudit:a=>ai.push(a)});let b=await M(aj),d=await (al=b.port,new Promise((a,b)=>{let c=f.connect(al,"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 P(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=ai.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=I(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:()=>ab,upstreamCa:$.certPem,resolveTarget:O,onAudit:a=>ai.push(a)}),n=await M(l),o="";try{(await P(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 P(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 P(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=ai.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 N(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:()=>ab,upstreamCa:$.certPem,resolveTarget:(a,b)=>(x+=1,O(a,b)),onAudit:a=>ai.push(a)}),z=await M(y),A=`localhost:${a.port}`,B=await Q(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 Q(z.port,A,S(t,"wrong"));c("Wrong password is refused with 407",C.startsWith("HTTP/1.1 407"),C.split("\r\n")[0]);let D=await Q(z.port,A,S("nobody",v));c("Unknown username is refused with 407",D.startsWith("HTTP/1.1 407"),D.split("\r\n")[0]);let E=await Q(z.port,`blocked.invalid:${a.port}`);c("Unauthenticated client cannot use the passthrough tunnel",E.startsWith("HTTP/1.1 407"),E.split("\r\n")[0]),c("Unauthenticated client cannot tell an allowlisted host from a blocked one",B.split("\r\n")[0]===E.split("\r\n")[0]),c("Unauthenticated CONNECT does not resolve the destination",0===x,`resolver called ${x} times`);let F=Buffer.from(JSON.stringify({model:"audit-self-test-auth",messages:[]})),G=await P(z.port,A,"",S(t,v)),H=await T({socket:G,ca:aa.certPem,servername:"localhost",port:a.port,body:F,path:"/v1/messages?auth=1"});c("Correct credentials open a working tunnel",H.head.startsWith("HTTP/1.1 200"),H.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 K=ai.find(a=>String(a.path||"").includes("auth=1"));c("Authenticated tunnel attributes the username on the request event",K?.client?.proxyUser===t,K?.client?.proxyUser||"(none)");let L=ai.find(a=>407===a.status&&a.error&&/Invalid proxy credentials/.test(a.error));c("Failed proxy auth is audited",!!L,L?"":"no 407 event recorded");let R=Buffer.from(`${t}:${v}`).toString("base64"),U=ai.some(a=>{let b=JSON.stringify(a);return b.includes(v)||b.includes(R)});c("No audit event records the proxy credential",!U),c("Proxy-Authorization is redacted in audit events",ai.filter(a=>"proxy-authorization"in(a.request?.headers||{})).every(a=>"[REDACTED]"===a.request.headers["proxy-authorization"])),c("Proxy-Authorization never reaches the origin",ae.every(a=>null==a.proxyAuthorization)),await N(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 P(b.port,`localhost:${a.port}`),Y=await T({socket:X,ca:aa.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",J(Y.body)===J(ad));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",ac=await P(b.port,`localhost:${a.port}`),af=null,ag=await T({socket:ac,ca:aa.certPem,servername:"localhost",port:a.port,body:Z,path:_,alpnProtocols:["h2","http/1.1"],onAlpn:a=>{af=a}});c("h2-preferring client is downgraded to HTTP/1.1","http/1.1"===af,`negotiated ${af||"none"}`),c("Downgraded client still gets a response",ag.head.startsWith("HTTP/1.1 200")),c("Downgraded compressed response bytes preserved",J(ag.body)===J(ad)),c("HTTP/2 is not advertised while the h2 path is unfixed",aj.auditCapabilities?.http2===!1);let am=Buffer.from(JSON.stringify({model:"audit-self-test-stream-model",messages:[{role:"user",content:"x".repeat(1052672)}]})),an=await P(b.port,`localhost:${a.port}`),ao=await T({socket:an,ca:aa.certPem,servername:"localhost",port:a.port,body:am,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=ai.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",ai.some(a=>String(a.path||"").includes("encoded=")&&null==a.usage));let aq=await P(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
79
78
  Host: localhost:${d}\r
80
79
  Upgrade: websocket\r
81
80
  Connection: Upgrade\r
@@ -84,7 +83,7 @@ x-api-key: sk-test-supersecret-123456789\r
84
83
  Sec-WebSocket-Key: ${i.randomBytes(16).toString("base64")}\r
85
84
  Sec-WebSocket-Version: 13\r
86
85
  \r
87
- `)});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
86
+ `)});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:aa.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",!ae.some(a=>String(a.path||"").includes("transport=websocket"))),await new Promise(a=>setTimeout(a,100)),c("Refused upgrade is still audited",ai.some(a=>501===a.status&&String(a.path||"").includes("transport=websocket")));let as=ai.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"===I(as).reason);let at=ae.find(a=>String(a.path||"").includes("encoded=")),au=ae.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&&J(at.body)===J(V)),c("Downgraded request body byte-identical",au&&J(au.body)===J(Z)),c("Authorization preserved on wire",ae.every(a=>"Bearer test-secret-authorization-123456789"===a.authorization)),c("x-api-key preserved on wire",ae.every(a=>"sk-test-supersecret-123456789"===a.apiKey)),c("Internal x-9r-* header stripped",ae.every(a=>null==a.internalHeader));let av=ai.find(a=>String(a.path||"").includes("encoded=")),aw=ai.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===J(V)&&aw?.request?.wireSha256===J(Z)),c("Response wire SHA-256 recorded",av?.response?.wireSha256===J(ad)&&aw?.response?.wireSha256===J(ad)),c("Compressed audit response decoded",av?.response?.body?.includes("compressed response preserved")&&aw?.response?.body?.includes("compressed response preserved"));let ax=I(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=I(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"===I(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"===I(aB).reason);let aC=ai.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=ai.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",ai.length>=2&&ai.every(a=>!m(a)));let aE={allowedHosts:[...aj.auditConfig.allowedHosts],clientToolFilterEnabled:aj.auditConfig.clientToolFilterEnabled,allowedClientTools:[...aj.auditConfig.allowedClientTools||[]]},aF=aj.auditConfig.port,aG=aj.auditConfig.bindHost;try{let d=`localhost:${a.port}`;aj.applyConfig({...aj.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
88
87
  Host: ${b}\r
89
88
  ${c}\r
90
- `)),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}}}},93958:(a,b,c)=>{let{createAuditProxy:d}=c(33575),{loadConfig:e,saveConfig:f,validateConfig:g,CONFIG_PATH:h,AUDIT_LOG_PATH:i,AUDIT_LOG_DIR:j,PROXY_AUTH_FEATURE_ENABLED:k}=c(42947),{hashProxyPassword:l,isValidUsername:m,normalizeProxyUsers:n,redactProxyAuthUsers:o,PASSWORD_MAX_BYTES:p,PASSWORD_MIN_BYTES:q}=c(99721),{normalizeAllowedClientIps:r,normalizeIp:s}=c(54584),{attachClientIpGate:t,effectiveClientIpPolicy:u,normalizeAccessGrants:v,normalizeGrantUserId:w}=c(68370),{SETTINGS_KEY:x,extractAuditPolicy:y,mergeAuditPolicy:z,policyEquals:A}=c(96402),{enqueueAuditJob:B,readRecent:C,clearAudit:D,pruneExpired:E,startAuditMaintenance:F,stopAuditMaintenance:G,flushAuditQueue:H,getAuditStoreStats:I}=c(62952),{ensureAuditRootCA:J,createAuditCertificateProvider:K,getStatusRootCaValidation:L}=c(5541),{readRootCAInfo:M}=c(1653),{runSelfTest:N}=c(93599);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.all([c.e(689),c.e(3960)]).then(c.bind(c,70321))}async function _(){try{let{isClusterStandby:a}=await c.e(5870).then(c.bind(c,75870));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}},96402:(a,b,c)=>{let{validateConfig:d}=c(42947),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))}}},99721:(a,b,c)=>{let d=c(55511),e=/^[a-z0-9][a-z0-9._-]{0,63}$/i,f=null;function g(){return f||(f=c(1893)),f}function h(a){return String(a||"").trim()}function i(a){let b=Array.isArray(a)?a:[],c=new Set,d=[];for(let a of b){if(!a||"object"!=typeof a)continue;let b=h(a.username),f=String(a.passwordHash||"");if(!e.test(b)||!f.startsWith("$2"))continue;let g=b.toLowerCase();c.has(g)||(c.add(g),d.push({username:b,passwordHash:f}))}return d}function j(a){if(Array.isArray(a))return null;let b=String(a||"").trim();if(!b||b.length>1024)return null;let c=b.indexOf(" ");if(c<0||"basic"!==b.slice(0,c).toLowerCase())return null;let d=b.slice(c+1).trim();if(!d||!/^[A-Za-z0-9+/]+={0,2}$/.test(d))return null;let e="";try{e=Buffer.from(d,"base64").toString("utf8")}catch{return null}let f=e.indexOf(":");return f<0?null:{username:e.slice(0,f),password:e.slice(f+1)}}a.exports={CACHE_TTL_MS:3e5,PASSWORD_MAX_BYTES:72,PASSWORD_MIN_BYTES:8,createProxyAuthLimiter:function({maxFailures:a=10,windowMs:b=6e4,cooldownMs:c=3e4,maxCooldownMs:d=3e5,maxEntries:e=1024}={}){let f=new Map;return{isLocked(a){let b=f.get(a);return!!b&&b.lockedUntil>Date.now()},recordFailure(g){let h=Date.now();!function(a){if(f.size<e)return;for(let[c,d]of f)if(d.lockedUntil<=a&&a-d.lastFailAt>b&&f.delete(c),f.size<e)return;let c=f.keys().next();c.done||f.delete(c.value)}(h);let i=f.get(g)||{failures:0,lastFailAt:0,lockedUntil:0,cooldownMs:c};h-i.lastFailAt>b&&(i.failures=0),i.failures+=1,i.lastFailAt=h;let j=!1;return i.failures>=a&&(i.lockedUntil=h+i.cooldownMs,i.cooldownMs=Math.min(2*i.cooldownMs,d),i.failures=0,j=!0),f.set(g,i),{lockedNow:j}},recordSuccess(a){f.delete(a)}}},createProxyAuthenticator:function(a){let b=new Map(i(a).map(a=>[a.username.toLowerCase(),a])),c=new Map,e=new Map;return{get accountCount(){return b.size},async authenticate(a){let f,h=j(a);if(!h)return{ok:!1,username:null,reason:a?"Unsupported proxy credentials":"Proxy authentication required"};let{username:i,password:k}=h,l=d.createHash("sha256").update(`${i}\0${k}`).digest("hex"),m=(f=c.get(l))?f.expiresAt<=Date.now()?(c.delete(l),null):f.username:null;if(m)return{ok:!0,username:m,reason:null};let n=b.get(i.trim().toLowerCase()),o=n?n.passwordHash:"$2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy",p=e.get(l);p||(p=g().compare(k,o).catch(()=>!1),e.set(l,p),p.finally(()=>e.delete(l)));let q=await p;if(!n||!q)return{ok:!1,username:null,reason:"Invalid proxy credentials"};var r=n.username;if(c.size>=256){let a=c.keys().next();a.done||c.delete(a.value)}return c.set(l,{username:r,expiresAt:Date.now()+3e5}),{ok:!0,username:n.username,reason:null}}}},hashProxyPassword:async function a(a){let b=await g().genSalt(10);return g().hash(String(a),b)},isValidUsername:function(a){return e.test(h(a))},normalizeProxyUsers:i,parseBasicProxyAuthorization:j,redactProxyAuthUsers:function(a){return i(a).map(a=>({username:a.username,hasPassword:!0}))}}}};
89
+ `)),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))),aj.applyConfig({...aj.auditConfig,allowedHosts:["localhost"]});let g=await P(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?.(),aj.applyConfig({...aj.auditConfig,clientToolFilterEnabled:!0,allowedClientTools:p(["claude-code"])});let h=await Q(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))),aj.applyConfig({...aj.auditConfig,clientToolFilterEnabled:!1,allowedClientTools:[]});let i=await P(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?.(),aj.applyConfig({...aj.auditConfig,captureLimitBytes:4096}),c("Capture limit is updated in place",4096===aj.auditConfig.captureLimitBytes);let j=aj.applyConfig({...aj.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",aj.auditConfig.port===aF&&aj.auditConfig.bindHost===aG&&!0===aj.listening,`${aj.auditConfig.port}/${aj.auditConfig.bindHost} vs ${aF}/${aG}`);let k=await P(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{aj.applyConfig({...aj.auditConfig,...aE})}ak=k({allowedHosts:["localhost"],passthroughUnknown:!1,captureBodies:!0,captureLimitBytes:1048576,verifyUpstreamTls:!0,allowedConnectPorts:[a.port],connectTimeoutMs:5e3,tlsHandshakeTimeoutMs:5e3,responseHeaderTimeoutMs:5e3,idleTimeoutMs:3e4},{certificateProvider:()=>ab,upstreamCa:$.certPem,resolveTarget:O,onAudit:()=>{throw Error("simulated audit sink failure")}});let aH=await M(ak),aI=await P(aH.port,`localhost:${a.port}`),aJ=await T({socket:aI,ca:aa.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 N(ak),await N(aj),await N(ah)}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}}}},93958:(a,b,c)=>{let{createAuditProxy:d}=c(33575),{loadConfig:e,saveConfig:f,validateConfig:g,CONFIG_PATH:h,AUDIT_LOG_PATH:i,AUDIT_LOG_DIR:j,PROXY_AUTH_FEATURE_ENABLED:k}=c(42947),{hashProxyPassword:l,isValidUsername:m,normalizeProxyUsers:n,redactProxyAuthUsers:o,PASSWORD_MAX_BYTES:p,PASSWORD_MIN_BYTES:q}=c(99721),{normalizeIp:r}=c(54584),{attachClientIpGate:s,effectiveClientIpPolicy:t,normalizeAccessGrants:u,normalizeGrantUserId:v}=c(68370),{getProxySession:w,pruneExpiredProxySessions:x,revokeProxySession:y,revokeProxySessionsForUser:z}=c(60484),{SETTINGS_KEY:A,extractAuditPolicy:B,mergeAuditPolicy:C,policyEquals:D}=c(96402),{enqueueAuditJob:E,readRecent:F,clearAudit:G,pruneExpired:H,startAuditMaintenance:I,stopAuditMaintenance:J,flushAuditQueue:K,getAuditStoreStats:L}=c(62952),{ensureAuditRootCA:M,createAuditCertificateProvider:N,getStatusRootCaValidation:O}=c(5541),{readRootCAInfo:P}=c(1653),{runSelfTest:Q}=c(93599);function R(){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 S(a){let b=R(),c=b.lifecycle.then(a,a);return b.lifecycle=c.catch(()=>{}),c}async function T(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 U(a){let b=e();return{...a,proxyAuthEnabled:!0===b.proxyAuthEnabled,proxyAuthUsers:[...b.proxyAuthUsers||[]],accessGrants:u(b.accessGrants)}}let V=null;function W(){let a=x();if(0===a)return;let b=R();if(!b.server?.listening)return;let c=b.ipGate?.dropRevoked()||0;console.log(`[audit-proxy] session sweep: ${a} session(s) expired, ${c} connection(s) closed`)}async function X(a=null){let b=R();if(b.server?.listening)return aa();let c=a?f({...U(a),enabled:!1}):e();await M(),await H(),I(),V||(V=setInterval(W,3e4),V.unref?.());let g=N({maxEntries:128});g.prewarm(c.allowedHosts);let h=d(c,{certificateProvider:g,onAuditJob:E});b.ipPolicy=t(c),b.ipGate=s(h,()=>R().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 aa(),address:a}}catch(a){b.lastError=a.message||String(a);try{h.forceCloseAll?.()}catch{}try{h.close()}catch{}throw g.clear?.(),a}}async function Y({persist:a=!0}={}){let b=R(),c=b.server,d=e();return b.server=null,b.startedAt=null,await T(c,d.shutdownGraceMs),b.certificateProvider?.clear?.(),b.certificateProvider=null,b.ipGate=null,await K(3e3),J(),V&&clearInterval(V),V=null,a&&f({...d,enabled:!1}),aa()}async function Z(a=null){return await Y({persist:!1}),a&&f({...U(a),enabled:!1}),X()}function $(a=null){return S(()=>X(a))}async function _(){let a=R();await ag();let b=e();return b.enabled?a.server?.listening?{started:!1,reason:"already-running",status:await aa()}:(a.autostartPromise||(a.autostartPromise=(async()=>{try{let a=await $();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 aa(){let a=R(),b=e(),c=t(b),d=!!a.server?.listening,f=P();try{let a=O();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=r(a.address||""),e=r("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,sessionIdleTimeoutMs:b.sessionIdleTimeoutMs,activeSessionCount:c.sessions.length,clientToolFilterEnabled:!0===b.clientToolFilterEnabled,proxyAuthEnabled:!0===b.proxyAuthEnabled,proxyAuthFeatureEnabled:k,allowedClientToolCount:(b.allowedClientTools||[]).length,privateDestinationsBlocked:!0,plainHttpBlocked:!0,upstreamTlsVerified:!0},activeSessions:c.sessions.map(a=>({ip:a.ip,userId:a.userId,displayName:a.displayName,activatedAt:new Date(a.activatedAt).toISOString(),expiresAt:new Date(a.expiresAt).toISOString()})),certificateCache:a.certificateProvider?.stats?.()||{entries:0},auditStore:L(),configPath:h,auditLogPath:i,auditLogDirectory:j,rootCA:f}}async function ab(a=50){let b=e(),[c,d]=await Promise.all([aa(),F(a)]);return{config:ac(b),status:c,events:d}}function ac(a){return a?{...a,proxyAuthUsers:o(a.proxyAuthUsers)}:a}async function ad(){return Promise.all([c.e(689),c.e(3960)]).then(c.bind(c,70321))}async function ae(){try{let{isClusterStandby:a}=await c.e(5870).then(c.bind(c,75870));return await a()===!0}catch{return!1}}async function af(a){try{if(await ae())return{mirrored:!1,reason:"standby"};let{getSettings:b,updateSettings:c}=await ad(),d=B(a),e=await b();if(JSON.stringify(e?.[A]||null)===JSON.stringify(d))return{mirrored:!1,reason:"unchanged"};return await c({[A]: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 ag({force:a=!1}={}){try{if(!a&&!await ae())return{applied:!1,reason:"not-standby"};let{getSettings:b}=await ad(),c=await b(),d=c?.[A];if(!d||"object"!=typeof d)return{applied:!1,reason:"no-policy"};let f=e();if(D(f,d))return{applied:!1,reason:"unchanged"};let g=C(f,d),h=await ah(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 ah(a,{mirror:b=!0}={}){return S(async()=>{let c=R(),d=!!c.server?.listening,e=f({...g(a),enabled:d});c.ipPolicy=t(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 af(e),{config:ac(e),status:await aa(),restarted:!1,appliedInstantly:!0,rebindRequired:h,pendingListener:i,droppedConnections:j}})}a.exports={startProxy:$,ensureAuditProxyAutostart:_,stopProxy:function(a={}){return S(()=>Y(a))},restartProxy:function(a=null){return S(()=>Z(a))},getStatus:aa,getSnapshot:ab,updateConfig:function(a){return ah(U(a))},updateClientProxyHost:function(a){return ah({...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 ah({...d,proxyAuthEnabled:!0===b,proxyAuthUsers:h})},listAccessGrants:function(){return u(e().accessGrants)},applyAuditPolicyFromSettings:ag,upsertAccessGrant:function({userId:a,note:b}={}){let c=v(a);if(!c)throw Error("Grant requires a dashboard username or email");let d=e(),f=u(d.accessGrants).filter(a=>a.userId!==c);return f.push({userId:c,note:b}),ah({...d,accessGrants:f})},deleteAccessGrant:function(a){let b=v(a);if(!b)throw Error("Grant requires a dashboard username or email");let c=e(),d=u(c.accessGrants).filter(a=>a.userId!==b);return z(b),ah({...c,accessGrants:d})},getOwnProxySession:function(a){return w(a)},revokeSession:function({ip:a,userId:b}={}){let c=a?+!!y(a):z(b);if(0===c)return{removed:0,droppedConnections:0};let d=R();return d.server?.listening?{removed:c,droppedConnections:d.ipGate?.dropRevoked()||0}:{removed:c,droppedConnections:0}},clearAudit:G,runSelfTest:Q}},96402:(a,b,c)=>{let{validateConfig:d}=c(42947),e=["accessGrants","allowedHosts","clientToolFilterEnabled","allowedClientTools","captureBodies","captureLimitBytes","passthroughUnknown","retentionDays","sessionIdleTimeoutMs"],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))}}}};
@@ -1,4 +1,4 @@
1
- "use strict";exports.id=427,exports.ids=[427],exports.modules={9588:(a,b,c)=>{c.d(b,{Cy:()=>i,Gk:()=>l,I8:()=>k,Tv:()=>v,UX:()=>p,aV:()=>o,bz:()=>r,hH:()=>u,ny:()=>s,oW:()=>t,s0:()=>m,ub:()=>n,vZ:()=>q});var d=c(65573),e=c(23211),f=c(89718),g=c(33792),h=c(90389);let i="dashboard_view_mode";function j(a){return String(a||"").trim().toLowerCase()}function k(a){return j(a)}function l(a={}){return[a.ldapUsername,a.ldapEmail,a.ldapName,a.oidcEmail,a.oidcName,a.localUsername,a.username,a.email].map(j).filter(Boolean)}function m(a={}){let b=l(a),c=b[0]||"local",d=a.ldapName||a.ldapEmail||a.oidcName||a.oidcEmail||a.localUsername||c;return{userId:c,displayName:d,loginMethod:a.oidc?"OIDC":a.ldap?"LDAP":"Local",candidates:b}}function n(a={},b={}){var c;if(!b?.authenticated)return!1;if(b.local||!b.ldap&&!b.oidc||b.role===h.hS.ADMIN||!0===b.ldapIsAdmin)return!0;let d=Array.isArray(c=a.ldapAllowedUsers)?c.map(j).filter(Boolean):String(c||"").split(/[,\n]/).map(j).filter(Boolean);return 0!==d.length&&l(b).some(a=>d.includes(a))}function o(a={},b={}){return!(!b?.authenticated||n(a,b))&&(b.role===h.hS.MONITOR_ADMIN||!0===b.ldapIsMonitorAdmin)}function p(a={},b={}){return!(!b?.authenticated||n(a,b)||o(a,b))&&(b.role===h.hS.AI_GATEWAYS_MONITOR||!0===b.ldapIsAiGatewaysMonitor)}function q(a={},b={}){return b?.authenticated?n(a,b)?h.hS.ADMIN:o(a,b)?h.hS.MONITOR_ADMIN:p(a,b)?h.hS.AI_GATEWAYS_MONITOR:h.hS.USER:h.hS.GUEST}function r(a={}){return!0===a.isAdmin||!0===a.isMonitorAdmin}async function s(){let a=await (0,f.getSettings)(),b=await (0,d.UL)(),c=await (0,g.dY)(b.get("auth_token")?.value);if(!c?.authenticated)return{authenticated:!1,isAdmin:!1,actualIsAdmin:!1,showAsUser:!1,canToggleUserMode:!1,isMonitorAdmin:!1,isAiGatewaysMonitor:!1,role:h.hS.GUEST,actualRole:h.hS.GUEST,userId:"",displayName:"Guest",loginMethod:"None",settings:{...a,requireLogin:!0},session:null};let e=m(c||{}),j=q(a,c||{}),k=j===h.hS.ADMIN,l=k&&b.get(i)?.value==="user",n=l?h.hS.USER:j,o=n===h.hS.ADMIN,p=n===h.hS.MONITOR_ADMIN,r=n===h.hS.AI_GATEWAYS_MONITOR;return{authenticated:!0,isAdmin:o,actualIsAdmin:k,showAsUser:l,canToggleUserMode:k,isMonitorAdmin:p,isAiGatewaysMonitor:r,role:n,actualRole:j,canManageApiKeys:o||p,canUseMonitorAdminTabs:o||p,canViewAllAnalytics:o||p||r,...e,settings:{...a,requireLogin:!0},session:c}}async function t(){let a=await s();return a.authenticated?{access:a,response:null}:{access:a,response:e.NextResponse.json({error:"Authentication required"},{status:401})}}async function u(a={}){let{allowMonitorAdmin:b=!1}=a||{},{access:c,response:d}=await t();return d?{access:c,response:d}:c.isAdmin||b&&c.isMonitorAdmin?{access:c,response:null}:{access:c,response:e.NextResponse.json({error:"Admin access required"},{status:403})}}function v(a,b){if(!a?.authenticated||!b)return!1;if(r(a))return!0;let c=j(a.userId),d=j(b.ownerUser),e=j(b.createdByUser);return!!c&&(d===c||e===c)}},17509:(a,b,c)=>{c.d(b,{V:()=>o});var d=c(91356),e=c(80700),f=c(99129),g=c(73575),h=c(41570),i=c(19035),j=c(44893),k=c(69052);async function l(a,b,c){let l,{protected:m,header:n,payload:o}=a,p={};if(m&&(p=(0,h.OX)(m,f.Ye,"JWS Protected Header is invalid")),void 0!==n){if(!(0,i.fz)(p,n))throw new f.Ye("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");l={...p,...n}}else l=p;let q=(0,j.nI)(f.Ye,j.qc,b[1],p,l),r=!0;if(q.includes("b64")&&"boolean"!=typeof(r=p.b64))throw new f.Ye('The "b64" (base64url-encode payload) Header Parameter must be a boolean');let{alg:s}=l;if("string"!=typeof s||!s)throw new f.Ye('JWS "alg" (Algorithm) Header Parameter missing or invalid');if(b[0]&&!b[0].has(s))throw new f.Rb('"alg" (Algorithm) Header Parameter value not allowed');if(r){if("string"!=typeof o)throw new f.Ye("JWS Payload must be a string")}else if("string"!=typeof o&&!(o instanceof Uint8Array))throw new f.Ye("JWS Payload must be a string or an Uint8Array instance");let t=!1;"function"==typeof c&&(c=await c(p,a),t=!0);let u=(0,e.q)(s),v=(0,g.xW)(void 0!==m?(0,g.lF)(m):new Uint8Array,(0,g.lF)("."),"string"==typeof o?r?b[2]??=(0,h.Fo)(o,"payload",f.Ye):g.Rd.encode(o):o),w=(0,h.h2)(a.signature,"signature",f.Ye),x=await (0,k.d)(u,c,"verify");if(!await (0,d.M)(u,x,w,v))throw new f.h2;return[r?(0,h.h2)(o,"payload",f.Ye):"string"==typeof o?g.Rd.encode(o):o,p,r,x,t]}async function m(a,b,c){if(a instanceof Uint8Array&&(a=g.D0.decode(a)),"string"!=typeof a)throw new f.Ye("Compact JWS must be a string or Uint8Array");let{0:d,1:e,2:h,length:i}=a.split(".");if(3!==i)throw new f.Ye("Invalid Compact JWS");return l({payload:e,protected:d,signature:h},b,c)}var n=c(17347);async function o(a,b,c){let d=await m(a,[c&&(0,j.Fw)("algorithms",c.algorithms),c?.crit],b);if(!d[2])throw new f.Dp("JWTs MUST NOT use unencoded payload");let e={payload:(0,n.k6)(d[1],d[0],c),protectedHeader:d[1]};return"function"==typeof b?{...e,key:d[3]}:e}},19225:(a,b,c)=>{a.exports=c(44870)},33792:(a,b,c)=>{c.d(b,{Dc:()=>p,OZ:()=>s,YK:()=>n,dY:()=>q,tm:()=>r});var d=c(84433),e=c(17509),f=c(73024),g=c.n(f),h=c(76760),i=c.n(h),j=c(77598),k=c.n(j),l=c(49120);let m=new TextEncoder().encode(function(){if(process.env.JWT_SECRET)return process.env.JWT_SECRET;let a=i().join(l.DATA_DIR,"jwt-secret");try{return g().readFileSync(a,"utf8").trim()}catch{}g().mkdirSync(l.DATA_DIR,{recursive:!0});let b=k().randomBytes(32).toString("hex");return g().writeFileSync(a,b,{mode:384}),b}());function n(a){let b="true"===process.env.AUTH_COOKIE_SECURE,c=a?.headers?.get?.("x-forwarded-proto");return b||"https"===c}async function o(a={}){return new d.P({authenticated:!0,...a}).setProtectedHeader({alg:"HS256"}).setIssuedAt().setExpirationTime("86400s").sign(m)}async function p(a){if(!a)return!1;try{return await (0,e.V)(a,m),!0}catch{return!1}}async function q(a){if(!a)return null;try{let{payload:b}=await (0,e.V)(a,m);return b}catch{return null}}async function r(a,b,c={}){let d=await o(c);a.set("auth_token",d,{httpOnly:!0,secure:n(b),sameSite:"lax",path:"/",maxAge:86400})}function s(a){a.delete("auth_token")}},50122:(a,b,c)=>{c.d(b,{k:()=>e});let d=[];for(let a=0;a<256;++a)d.push((a+256).toString(16).slice(1));function e(a,b=0){return(d[a[b+0]]+d[a[b+1]]+d[a[b+2]]+d[a[b+3]]+"-"+d[a[b+4]]+d[a[b+5]]+"-"+d[a[b+6]]+d[a[b+7]]+"-"+d[a[b+8]]+d[a[b+9]]+"-"+d[a[b+10]]+d[a[b+11]]+d[a[b+12]]+d[a[b+13]]+d[a[b+14]]+d[a[b+15]]).toLowerCase()}},64183:(a,b,c)=>{c.d(b,{F0:()=>r,M4:()=>t,Qg:()=>o,vY:()=>s});var d=c(45903);let e={"1h":{durationMs:36e5,bucketMinutes:1},"6h":{durationMs:216e5,bucketMinutes:1},"24h":{durationMs:864e5,bucketMinutes:1},"7d":{durationMs:6048e5,bucketMinutes:5},"30d":{durationMs:2592e6,bucketMinutes:15}},f="__blueRouterResourceMonitorHistoryMysql";function g(){return globalThis[f]||(globalThis[f]={pool:null,fingerprint:null,schemaReady:null,lastPruneAt:0}),globalThis[f]}function h(a){let b=Number(a);return Number.isFinite(b)?b:0}function i(a){if(Array.isArray(a))return a;if(!a)return[];if("string"==typeof a)try{let b=JSON.parse(a);return Array.isArray(b)?b:[]}catch{}return[]}function j(a){return(Array.isArray(a)?a:[]).map(a=>({id:String(a?.uuid||`index-${a?.index??0}`),uuid:String(a?.uuid||""),index:h(a?.index),name:String(a?.name||`NVIDIA GPU ${a?.index??0}`),usagePercent:h(a?.usagePercent),memoryUsagePercent:h(a?.memoryUsagePercent),temperatureC:a?.temperatureC==null?null:h(a.temperatureC),powerDrawW:a?.powerDrawW==null?null:h(a.powerDrawW)}))}async function k(){let a=await (0,d.getPromptLogDbConfig)(),b=(0,d.normalizeConfig)(a,a);if("mysql"!==b.type)throw Error("Resource Monitor history requires Prompt Log Database type MySQL.");if(!b.host||!b.database||!b.username)throw Error("Resource Monitor history requires the MySQL host, database, and username from Prompt Log Database settings.");return b}async function l(a){return(await c.e(8491).then(c.t.bind(c,38491,19))).createPool({host:a.host,port:Number(a.port||3306),database:a.database,user:a.username,password:a.password,ssl:a.ssl?{}:void 0,waitForConnections:!0,connectionLimit:4,maxIdle:4,idleTimeout:6e4,queueLimit:0,enableKeepAlive:!0,keepAliveInitialDelay:0,connectTimeout:5e3,supportBigNumbers:!0,bigNumberStrings:!1})}async function m(a){await a.query(`
1
+ "use strict";exports.id=427,exports.ids=[427],exports.modules={9588:(a,b,c)=>{c.d(b,{Cy:()=>i,Gk:()=>l,I8:()=>k,Tv:()=>v,UX:()=>p,aV:()=>o,bz:()=>r,hH:()=>u,ny:()=>s,oW:()=>t,s0:()=>m,ub:()=>n,vZ:()=>q});var d=c(65573),e=c(23211),f=c(89718),g=c(33792),h=c(90389);let i="dashboard_view_mode";function j(a){return String(a||"").trim().toLowerCase()}function k(a){return j(a)}function l(a={}){return[a.ldapUsername,a.ldapEmail,a.ldapName,a.oidcEmail,a.oidcName,a.localUsername,a.username,a.email].map(j).filter(Boolean)}function m(a={}){let b=l(a),c=b[0]||"local",d=a.ldapName||a.ldapEmail||a.oidcName||a.oidcEmail||a.localUsername||c;return{userId:c,displayName:d,loginMethod:a.oidc?"OIDC":a.ldap?"LDAP":"Local",candidates:b}}function n(a={},b={}){var c;if(!b?.authenticated)return!1;if(b.local||!b.ldap&&!b.oidc||b.role===h.hS.ADMIN||!0===b.ldapIsAdmin)return!0;let d=Array.isArray(c=a.ldapAllowedUsers)?c.map(j).filter(Boolean):String(c||"").split(/[,\n]/).map(j).filter(Boolean);return 0!==d.length&&l(b).some(a=>d.includes(a))}function o(a={},b={}){return!(!b?.authenticated||n(a,b))&&(b.role===h.hS.MONITOR_ADMIN||!0===b.ldapIsMonitorAdmin)}function p(a={},b={}){return!(!b?.authenticated||n(a,b)||o(a,b))&&(b.role===h.hS.AI_GATEWAYS_MONITOR||!0===b.ldapIsAiGatewaysMonitor)}function q(a={},b={}){return b?.authenticated?n(a,b)?h.hS.ADMIN:o(a,b)?h.hS.MONITOR_ADMIN:p(a,b)?h.hS.AI_GATEWAYS_MONITOR:h.hS.USER:h.hS.GUEST}function r(a={}){return!0===a.isAdmin||!0===a.isMonitorAdmin}async function s(){let a=await (0,f.getSettings)(),b=await (0,d.UL)(),c=await (0,g.dY)(b.get("auth_token")?.value);if(!c?.authenticated)return{authenticated:!1,isAdmin:!1,actualIsAdmin:!1,showAsUser:!1,canToggleUserMode:!1,isMonitorAdmin:!1,isAiGatewaysMonitor:!1,role:h.hS.GUEST,actualRole:h.hS.GUEST,userId:"",displayName:"Guest",loginMethod:"None",settings:{...a,requireLogin:!0},session:null};let e=m(c||{}),j=q(a,c||{}),k=j===h.hS.ADMIN,l=k&&b.get(i)?.value==="user",n=l?h.hS.USER:j,o=n===h.hS.ADMIN,p=n===h.hS.MONITOR_ADMIN,r=n===h.hS.AI_GATEWAYS_MONITOR;return{authenticated:!0,isAdmin:o,actualIsAdmin:k,showAsUser:l,canToggleUserMode:k,isMonitorAdmin:p,isAiGatewaysMonitor:r,role:n,actualRole:j,canManageApiKeys:o||p,canUseMonitorAdminTabs:o||p,canViewAllAnalytics:o||p||r,...e,settings:{...a,requireLogin:!0},session:c}}async function t(){let a=await s();return a.authenticated?{access:a,response:null}:{access:a,response:e.NextResponse.json({error:"Authentication required"},{status:401})}}async function u(a={}){let{allowMonitorAdmin:b=!1}=a||{},{access:c,response:d}=await t();return d?{access:c,response:d}:c.isAdmin||b&&c.isMonitorAdmin?{access:c,response:null}:{access:c,response:e.NextResponse.json({error:"Admin access required"},{status:403})}}function v(a,b){if(!a?.authenticated||!b)return!1;if(r(a))return!0;let c=j(a.userId),d=j(b.ownerUser),e=j(b.createdByUser);return!!c&&(d===c||e===c)}},19225:(a,b,c)=>{a.exports=c(44870)},50122:(a,b,c)=>{c.d(b,{k:()=>e});let d=[];for(let a=0;a<256;++a)d.push((a+256).toString(16).slice(1));function e(a,b=0){return(d[a[b+0]]+d[a[b+1]]+d[a[b+2]]+d[a[b+3]]+"-"+d[a[b+4]]+d[a[b+5]]+"-"+d[a[b+6]]+d[a[b+7]]+"-"+d[a[b+8]]+d[a[b+9]]+"-"+d[a[b+10]]+d[a[b+11]]+d[a[b+12]]+d[a[b+13]]+d[a[b+14]]+d[a[b+15]]).toLowerCase()}},64183:(a,b,c)=>{c.d(b,{F0:()=>r,M4:()=>t,Qg:()=>o,vY:()=>s});var d=c(45903);let e={"1h":{durationMs:36e5,bucketMinutes:1},"6h":{durationMs:216e5,bucketMinutes:1},"24h":{durationMs:864e5,bucketMinutes:1},"7d":{durationMs:6048e5,bucketMinutes:5},"30d":{durationMs:2592e6,bucketMinutes:15}},f="__blueRouterResourceMonitorHistoryMysql";function g(){return globalThis[f]||(globalThis[f]={pool:null,fingerprint:null,schemaReady:null,lastPruneAt:0}),globalThis[f]}function h(a){let b=Number(a);return Number.isFinite(b)?b:0}function i(a){if(Array.isArray(a))return a;if(!a)return[];if("string"==typeof a)try{let b=JSON.parse(a);return Array.isArray(b)?b:[]}catch{}return[]}function j(a){return(Array.isArray(a)?a:[]).map(a=>({id:String(a?.uuid||`index-${a?.index??0}`),uuid:String(a?.uuid||""),index:h(a?.index),name:String(a?.name||`NVIDIA GPU ${a?.index??0}`),usagePercent:h(a?.usagePercent),memoryUsagePercent:h(a?.memoryUsagePercent),temperatureC:a?.temperatureC==null?null:h(a.temperatureC),powerDrawW:a?.powerDrawW==null?null:h(a.powerDrawW)}))}async function k(){let a=await (0,d.getPromptLogDbConfig)(),b=(0,d.normalizeConfig)(a,a);if("mysql"!==b.type)throw Error("Resource Monitor history requires Prompt Log Database type MySQL.");if(!b.host||!b.database||!b.username)throw Error("Resource Monitor history requires the MySQL host, database, and username from Prompt Log Database settings.");return b}async function l(a){return(await c.e(8491).then(c.t.bind(c,38491,19))).createPool({host:a.host,port:Number(a.port||3306),database:a.database,user:a.username,password:a.password,ssl:a.ssl?{}:void 0,waitForConnections:!0,connectionLimit:4,maxIdle:4,idleTimeout:6e4,queueLimit:0,enableKeepAlive:!0,keepAliveInitialDelay:0,connectTimeout:5e3,supportBigNumbers:!0,bigNumberStrings:!1})}async function m(a){await a.query(`
2
2
  CREATE TABLE IF NOT EXISTS resource_monitor_history (
3
3
  server_id VARCHAR(120) NOT NULL,
4
4
  sampled_at BIGINT UNSIGNED NOT NULL,
@@ -0,0 +1 @@
1
+ exports.id=4432,exports.ids=[4432],exports.modules={17509:(a,b,c)=>{"use strict";c.d(b,{V:()=>o});var d=c(91356),e=c(80700),f=c(99129),g=c(73575),h=c(41570),i=c(19035),j=c(44893),k=c(69052);async function l(a,b,c){let l,{protected:m,header:n,payload:o}=a,p={};if(m&&(p=(0,h.OX)(m,f.Ye,"JWS Protected Header is invalid")),void 0!==n){if(!(0,i.fz)(p,n))throw new f.Ye("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");l={...p,...n}}else l=p;let q=(0,j.nI)(f.Ye,j.qc,b[1],p,l),r=!0;if(q.includes("b64")&&"boolean"!=typeof(r=p.b64))throw new f.Ye('The "b64" (base64url-encode payload) Header Parameter must be a boolean');let{alg:s}=l;if("string"!=typeof s||!s)throw new f.Ye('JWS "alg" (Algorithm) Header Parameter missing or invalid');if(b[0]&&!b[0].has(s))throw new f.Rb('"alg" (Algorithm) Header Parameter value not allowed');if(r){if("string"!=typeof o)throw new f.Ye("JWS Payload must be a string")}else if("string"!=typeof o&&!(o instanceof Uint8Array))throw new f.Ye("JWS Payload must be a string or an Uint8Array instance");let t=!1;"function"==typeof c&&(c=await c(p,a),t=!0);let u=(0,e.q)(s),v=(0,g.xW)(void 0!==m?(0,g.lF)(m):new Uint8Array,(0,g.lF)("."),"string"==typeof o?r?b[2]??=(0,h.Fo)(o,"payload",f.Ye):g.Rd.encode(o):o),w=(0,h.h2)(a.signature,"signature",f.Ye),x=await (0,k.d)(u,c,"verify");if(!await (0,d.M)(u,x,w,v))throw new f.h2;return[r?(0,h.h2)(o,"payload",f.Ye):"string"==typeof o?g.Rd.encode(o):o,p,r,x,t]}async function m(a,b,c){if(a instanceof Uint8Array&&(a=g.D0.decode(a)),"string"!=typeof a)throw new f.Ye("Compact JWS must be a string or Uint8Array");let{0:d,1:e,2:h,length:i}=a.split(".");if(3!==i)throw new f.Ye("Invalid Compact JWS");return l({payload:e,protected:d,signature:h},b,c)}var n=c(17347);async function o(a,b,c){let d=await m(a,[c&&(0,j.Fw)("algorithms",c.algorithms),c?.crit],b);if(!d[2])throw new f.Dp("JWTs MUST NOT use unencoded payload");let e={payload:(0,n.k6)(d[1],d[0],c),protectedHeader:d[1]};return"function"==typeof b?{...e,key:d[3]}:e}},81370:function(a,b,c){var d,e;"u">typeof globalThis||"u">typeof self&&self,e=function(a,b){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.compare=l,a.compareSync=k,a.decodeBase64=G,a.default=void 0,a.encodeBase64=F,a.genSalt=g,a.genSaltSync=f,a.getRounds=m,a.getSalt=n,a.hash=i,a.hashSync=h,a.setRandomFallback=e,a.truncates=o,b=(c=b)&&c.__esModule?c:{default:c};var c,d=null;function e(a){d=a}function f(a,c){if("number"!=typeof(a=a||w))throw Error("Illegal arguments: "+typeof a+", "+typeof c);a<4?a=4:a>31&&(a=31);var e=[];return e.push("$2b$"),a<10&&e.push("0"),e.push(a.toString()),e.push("$"),e.push(t(function(a){try{return crypto.getRandomValues(new Uint8Array(a))}catch{}try{return b.default.randomBytes(a)}catch{}if(!d)throw Error("Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative");return d(a)}(v),v)),e.join("")}function g(a,b,c){if("function"==typeof b&&(c=b,b=void 0),"function"==typeof a&&(c=a,a=void 0),void 0===a)a=w;else if("number"!=typeof a)throw Error("illegal arguments: "+typeof a);function d(b){p(function(){try{b(null,f(a))}catch(a){b(a)}})}if(!c)return new Promise(function(a,b){d(function(c,d){c?b(c):a(d)})});if("function"!=typeof c)throw Error("Illegal callback: "+typeof c);d(c)}function h(a,b){if(void 0===b&&(b=w),"number"==typeof b&&(b=f(b)),"string"!=typeof a||"string"!=typeof b)throw Error("Illegal arguments: "+typeof a+", "+typeof b);return E(a,b)}function i(a,b,c,d){function e(c){"string"==typeof a&&"number"==typeof b?g(b,function(b,e){E(a,e,c,d)}):"string"==typeof a&&"string"==typeof b?E(a,b,c,d):p(c.bind(this,Error("Illegal arguments: "+typeof a+", "+typeof b)))}if(!c)return new Promise(function(a,b){e(function(c,d){c?b(c):a(d)})});if("function"!=typeof c)throw Error("Illegal callback: "+typeof c);e(c)}function j(a,b){for(var c=a.length^b.length,d=0;d<a.length;++d)c|=a.charCodeAt(d)^b.charCodeAt(d);return 0===c}function k(a,b){if("string"!=typeof a||"string"!=typeof b)throw Error("Illegal arguments: "+typeof a+", "+typeof b);return 60===b.length&&j(h(a,b.substring(0,b.length-31)),b)}function l(a,b,c,d){function e(c){"string"!=typeof a||"string"!=typeof b?p(c.bind(this,Error("Illegal arguments: "+typeof a+", "+typeof b))):60!==b.length?p(c.bind(this,null,!1)):i(a,b.substring(0,29),function(a,d){a?c(a):c(null,j(d,b))},d)}if(!c)return new Promise(function(a,b){e(function(c,d){c?b(c):a(d)})});if("function"!=typeof c)throw Error("Illegal callback: "+typeof c);e(c)}function m(a){if("string"!=typeof a)throw Error("Illegal arguments: "+typeof a);return parseInt(a.split("$")[2],10)}function n(a){if("string"!=typeof a)throw Error("Illegal arguments: "+typeof a);if(60!==a.length)throw Error("Illegal hash length: "+a.length+" != 60");return a.substring(0,29)}function o(a){if("string"!=typeof a)throw Error("Illegal arguments: "+typeof a);return q(a)>72}var p="function"==typeof setImmediate?setImmediate:"object"==typeof scheduler&&"function"==typeof scheduler.postTask?scheduler.postTask.bind(scheduler):setTimeout;function q(a){for(var b=0,c=0,d=0;d<a.length;++d)(c=a.charCodeAt(d))<128?b+=1:c<2048?b+=2:(64512&c)==55296&&(64512&a.charCodeAt(d+1))==56320?(++d,b+=4):b+=3;return b}var r="./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),s=[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,54,55,56,57,58,59,60,61,62,63,-1,-1,-1,-1,-1,-1,-1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,-1,-1,-1,-1,-1,-1,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,-1,-1,-1,-1,-1];function t(a,b){var c,d,e=0,f=[];if(b<=0||b>a.length)throw Error("Illegal len: "+b);for(;e<b;){if(c=255&a[e++],f.push(r[c>>2&63]),c=(3&c)<<4,e>=b||(c|=(d=255&a[e++])>>4&15,f.push(r[63&c]),c=(15&d)<<2,e>=b)){f.push(r[63&c]);break}c|=(d=255&a[e++])>>6&3,f.push(r[63&c]),f.push(r[63&d])}return f.join("")}function u(a,b){var c,d,e,f,g,h=0,i=a.length,j=0,k=[];if(b<=0)throw Error("Illegal len: "+b);for(;h<i-1&&j<b&&(c=(g=a.charCodeAt(h++))<s.length?s[g]:-1,d=(g=a.charCodeAt(h++))<s.length?s[g]:-1,-1!=c&&-1!=d)&&(f=c<<2>>>0|(48&d)>>4,k.push(String.fromCharCode(f)),!(++j>=b||h>=i||-1==(e=(g=a.charCodeAt(h++))<s.length?s[g]:-1)||(f=(15&d)<<4>>>0|(60&e)>>2,k.push(String.fromCharCode(f)),++j>=b||h>=i)));){;f=(3&e)<<6>>>0|((g=a.charCodeAt(h++))<s.length?s[g]:-1),k.push(String.fromCharCode(f)),++j}var l=[];for(h=0;h<j;h++)l.push(k[h].charCodeAt(0));return l}var v=16,w=10,x=[0x243f6a88,0x85a308d3,0x13198a2e,0x3707344,0xa4093822,0x299f31d0,0x82efa98,0xec4e6c89,0x452821e6,0x38d01377,0xbe5466cf,0x34e90c6c,0xc0ac29b7,0xc97c50dd,0x3f84d5b5,0xb5470917,0x9216d5d9,0x8979fb1b],y=[0xd1310ba6,0x98dfb5ac,0x2ffd72db,0xd01adfb7,0xb8e1afed,0x6a267e96,0xba7c9045,0xf12c7f99,0x24a19947,0xb3916cf7,0x801f2e2,0x858efc16,0x636920d8,0x71574e69,0xa458fea3,0xf4933d7e,0xd95748f,0x728eb658,0x718bcd58,0x82154aee,0x7b54a41d,0xc25a59b5,0x9c30d539,0x2af26013,0xc5d1b023,0x286085f0,0xca417918,0xb8db38ef,0x8e79dcb0,0x603a180e,0x6c9e0e8b,0xb01e8a3e,0xd71577c1,0xbd314b27,0x78af2fda,0x55605c60,0xe65525f3,0xaa55ab94,0x57489862,0x63e81440,0x55ca396a,0x2aab10b6,0xb4cc5c34,0x1141e8ce,0xa15486af,0x7c72e993,0xb3ee1411,0x636fbc2a,0x2ba9c55d,0x741831f6,0xce5c3e16,0x9b87931e,0xafd6ba33,0x6c24cf5c,0x7a325381,0x28958677,0x3b8f4898,0x6b4bb9af,0xc4bfe81b,0x66282193,0x61d809cc,0xfb21a991,0x487cac60,0x5dec8032,0xef845d5d,0xe98575b1,0xdc262302,0xeb651b88,0x23893e81,0xd396acc5,0xf6d6ff3,0x83f44239,0x2e0b4482,0xa4842004,0x69c8f04a,0x9e1f9b5e,0x21c66842,0xf6e96c9a,0x670c9c61,0xabd388f0,0x6a51a0d2,0xd8542f68,0x960fa728,0xab5133a3,0x6eef0b6c,0x137a3be4,0xba3bf050,0x7efb2a98,0xa1f1651d,0x39af0176,0x66ca593e,0x82430e88,0x8cee8619,0x456f9fb4,0x7d84a5c3,0x3b8b5ebe,0xe06f75d8,0x85c12073,0x401a449f,0x56c16aa6,0x4ed3aa62,0x363f7706,0x1bfedf72,0x429b023d,0x37d0d724,0xd00a1248,0xdb0fead3,0x49f1c09b,0x75372c9,0x80991b7b,0x25d479d8,0xf6e8def7,0xe3fe501a,0xb6794c3b,0x976ce0bd,0x4c006ba,0xc1a94fb6,0x409f60c4,0x5e5c9ec2,0x196a2463,0x68fb6faf,0x3e6c53b5,0x1339b2eb,0x3b52ec6f,0x6dfc511f,0x9b30952c,0xcc814544,0xaf5ebd09,0xbee3d004,0xde334afd,0x660f2807,0x192e4bb3,0xc0cba857,0x45c8740f,0xd20b5f39,0xb9d3fbdb,0x5579c0bd,0x1a60320a,0xd6a100c6,0x402c7279,0x679f25fe,0xfb1fa3cc,0x8ea5e9f8,0xdb3222f8,0x3c7516df,0xfd616b15,0x2f501ec8,0xad0552ab,0x323db5fa,0xfd238760,0x53317b48,0x3e00df82,0x9e5c57bb,0xca6f8ca0,0x1a87562e,0xdf1769db,0xd542a8f6,0x287effc3,0xac6732c6,0x8c4f5573,0x695b27b0,0xbbca58c8,0xe1ffa35d,0xb8f011a0,0x10fa3d98,0xfd2183b8,0x4afcb56c,0x2dd1d35b,0x9a53e479,0xb6f84565,0xd28e49bc,0x4bfb9790,0xe1ddf2da,0xa4cb7e33,0x62fb1341,0xcee4c6e8,0xef20cada,0x36774c01,0xd07e9efe,0x2bf11fb4,0x95dbda4d,0xae909198,0xeaad8e71,0x6b93d5a0,0xd08ed1d0,0xafc725e0,0x8e3c5b2f,0x8e7594b7,0x8ff6e2fb,0xf2122b64,0x8888b812,0x900df01c,0x4fad5ea0,0x688fc31c,0xd1cff191,0xb3a8c1ad,0x2f2f2218,0xbe0e1777,0xea752dfe,0x8b021fa1,0xe5a0cc0f,0xb56f74e8,0x18acf3d6,0xce89e299,0xb4a84fe0,0xfd13e0b7,0x7cc43b81,0xd2ada8d9,0x165fa266,0x80957705,0x93cc7314,0x211a1477,0xe6ad2065,0x77b5fa86,0xc75442f5,0xfb9d35cf,0xebcdaf0c,0x7b3e89a0,0xd6411bd3,0xae1e7e49,2428461,0x2071b35e,0x226800bb,0x57b8e0af,0x2464369b,0xf009b91e,0x5563911d,0x59dfa6aa,0x78c14389,0xd95a537f,0x207d5ba2,0x2e5b9c5,0x83260376,0x6295cfa9,0x11c81968,0x4e734a41,0xb3472dca,0x7b14a94a,0x1b510052,0x9a532915,0xd60f573f,0xbc9bc6e4,0x2b60a476,0x81e67400,0x8ba6fb5,0x571be91f,0xf296ec6b,0x2a0dd915,0xb6636521,0xe7b9f9b6,0xff34052e,0xc5855664,0x53b02d5d,0xa99f8fa1,0x8ba4799,0x6e85076a,0x4b7a70e9,0xb5b32944,0xdb75092e,0xc4192623,290971e4,0x49a7df7d,0x9cee60b8,0x8fedb266,0xecaa8c71,0x699a17ff,0x5664526c,0xc2b19ee1,0x193602a5,0x75094c29,0xa0591340,0xe4183a3e,0x3f54989a,0x5b429d65,0x6b8fe4d6,0x99f73fd6,0xa1d29c07,0xefe830f5,0x4d2d38e6,0xf0255dc1,0x4cdd2086,0x8470eb26,0x6382e9c6,0x21ecc5e,0x9686b3f,0x3ebaefc9,0x3c971814,0x6b6a70a1,0x687f3584,0x52a0e286,0xb79c5305,0xaa500737,0x3e07841c,0x7fdeae5c,0x8e7d44ec,0x5716f2b8,0xb03ada37,0xf0500c0d,0xf01c1f04,0x200b3ff,0xae0cf51a,0x3cb574b2,0x25837a58,0xdc0921bd,0xd19113f9,0x7ca92ff6,0x94324773,0x22f54701,0x3ae5e581,0x37c2dadc,0xc8b57634,0x9af3dda7,0xa9446146,0xfd0030e,0xecc8c73e,0xa4751e41,0xe238cd99,0x3bea0e2f,0x3280bba1,0x183eb331,0x4e548b38,0x4f6db908,0x6f420d03,0xf60a04bf,0x2cb81290,0x24977c79,0x5679b072,0xbcaf89af,0xde9a771f,0xd9930810,0xb38bae12,0xdccf3f2e,0x5512721f,0x2e6b7124,0x501adde6,0x9f84cd87,0x7a584718,0x7408da17,0xbc9f9abc,0xe94b7d8c,0xec7aec3a,0xdb851dfa,0x63094366,0xc464c3d2,0xef1c1847,0x3215d908,0xdd433b37,0x24c2ba16,0x12a14d43,0x2a65c451,0x50940002,0x133ae4dd,0x71dff89e,0x10314e55,0x81ac77d6,0x5f11199b,0x43556f1,0xd7a3c76b,0x3c11183b,0x5924a509,0xf28fe6ed,0x97f1fbfa,0x9ebabf2c,0x1e153c6e,0x86e34570,0xeae96fb1,0x860e5e0a,0x5a3e2ab3,0x771fe71c,0x4e3d06fa,0x2965dcb9,0x99e71d0f,0x803e89d6,0x5266c825,0x2e4cc978,0x9c10b36a,0xc6150eba,0x94e2ea78,0xa5fc3c53,0x1e0a2df4,0xf2f74ea7,0x361d2b3d,0x1939260f,0x19c27960,0x5223a708,0xf71312b6,0xebadfe6e,0xeac31f66,0xe3bc4595,0xa67bc883,0xb17f37d1,0x18cff28,0xc332ddef,0xbe6c5aa5,0x65582185,0x68ab9802,0xeecea50f,0xdb2f953b,0x2aef7dad,0x5b6e2f84,0x1521b628,0x29076170,0xecdd4775,0x619f1510,0x13cca830,0xeb61bd96,0x334fe1e,0xaa0363cf,0xb5735c90,0x4c70a239,0xd59e9e0b,0xcbaade14,0xeecc86bc,0x60622ca7,0x9cab5cab,0xb2f3846e,0x648b1eaf,0x19bdf0ca,0xa02369b9,0x655abb50,0x40685a32,0x3c2ab4b3,0x319ee9d5,0xc021b8f7,0x9b540b19,0x875fa099,0x95f7997e,0x623d7da8,0xf837889a,0x97e32d77,0x11ed935f,0x16681281,0xe358829,0xc7e61fd6,0x96dedfa1,0x7858ba99,0x57f584a5,0x1b227263,0x9b83c3ff,0x1ac24696,0xcdb30aeb,0x532e3054,0x8fd948e4,0x6dbc3128,0x58ebf2ef,0x34c6ffea,0xfe28ed61,0xee7c3c73,0x5d4a14d9,0xe864b7e3,0x42105d14,0x203e13e0,0x45eee2b6,0xa3aaabea,0xdb6c4f15,0xfacb4fd0,0xc742f442,0xef6abbb5,0x654f3b1d,0x41cd2105,0xd81e799e,0x86854dc7,0xe44b476a,0x3d816250,0xcf62a1f2,0x5b8d2646,0xfc8883a0,0xc1c7b6a3,0x7f1524c3,0x69cb7492,0x47848a0b,0x5692b285,0x95bbf00,0xad19489d,0x1462b174,0x23820e00,0x58428d2a,0xc55f5ea,0x1dadf43e,0x233f7061,0x3372f092,0x8d937e41,0xd65fecf1,0x6c223bdb,0x7cde3759,0xcbee7460,0x4085f2a7,0xce77326e,0xa6078084,0x19f8509e,0xe8efd855,0x61d99735,0xa969a7aa,0xc50c06c2,0x5a04abfc,0x800bcadc,0x9e447a2e,0xc3453484,0xfdd56705,0xe1e9ec9,0xdb73dbd3,0x105588cd,0x675fda79,0xe3674340,0xc5c43465,0x713e38d8,0x3d28f89e,0xf16dff20,0x153e21e7,0x8fb03d4a,0xe6e39f2b,0xdb83adf7,0xe93d5a68,0x948140f7,0xf64c261c,0x94692934,0x411520f7,0x7602d4f7,0xbcf46b2e,0xd4a20068,0xd4082471,0x3320f46a,0x43b7d4b7,0x500061af,0x1e39f62e,0x97244546,0x14214f74,0xbf8b8840,0x4d95fc1d,0x96b591af,0x70f4ddd3,0x66a02f45,0xbfbc09ec,0x3bd9785,0x7fac6dd0,0x31cb8504,0x96eb27b3,0x55fd3941,0xda2547e6,0xabca0a9a,0x28507825,0x530429f4,0xa2c86da,0xe9b66dfb,0x68dc1462,0xd7486900,0x680ec0a4,0x27a18dee,0x4f3ffea2,0xe887ad8c,0xb58ce006,0x7af4d6b6,0xaace1e7c,0xd3375fec,0xce78a399,0x406b2a42,0x20fe9e35,0xd9f385b9,0xee39d7ab,0x3b124e8b,0x1dc9faf7,0x4b6d1856,0x26a36631,0xeae397b2,0x3a6efa74,0xdd5b4332,0x6841e7f7,0xca7820fb,0xfb0af54e,0xd8feb397,0x454056ac,0xba489527,0x55533a3a,0x20838d87,0xfe6ba9b7,0xd096954b,0x55a867bc,0xa1159a58,0xcca92963,0x99e1db33,0xa62a4a56,0x3f3125f9,0x5ef47e1c,0x9029317c,0xfdf8e802,0x4272f70,0x80bb155c,0x5282ce3,0x95c11548,0xe4c66d22,0x48c1133f,0xc70f86dc,0x7f9c9ee,0x41041f0f,0x404779a4,0x5d886e17,0x325f51eb,0xd59bc0d1,0xf2bcc18f,0x41113564,0x257b7834,0x602a9c60,0xdff8e8a3,0x1f636c1b,0xe12b4c2,0x2e1329e,0xaf664fd1,0xcad18115,0x6b2395e0,0x333e92e1,0x3b240b62,0xeebeb922,0x85b2a20e,0xe6ba0d99,0xde720c8c,0x2da2f728,0xd0127845,0x95b794fd,0x647d0862,0xe7ccf5f0,0x5449a36f,0x877d48fa,0xc39dfd27,0xf33e8d1e,0xa476341,0x992eff74,0x3a6f6eab,0xf4f8fd37,0xa812dc60,0xa1ebddf8,0x991be14c,0xdb6e6b0d,0xc67b5510,0x6d672c37,0x2765d43b,0xdcd0e804,0xf1290dc7,0xcc00ffa3,0xb5390f92,0x690fed0b,0x667b9ffb,0xcedb7d9c,0xa091cf0b,0xd9155ea3,0xbb132f88,0x515bad24,0x7b9479bf,0x763bd6eb,0x37392eb3,0xcc115979,0x8026e297,0xf42e312d,0x6842ada7,0xc66a2b3b,0x12754ccc,0x782ef11c,0x6a124237,0xb79251e7,0x6a1bbe6,0x4bfb6350,0x1a6b1018,0x11caedfa,0x3d25bdd8,0xe2e1c3c9,0x44421659,0xa121386,0xd90cec6e,0xd5abea2a,0x64af674e,0xda86a85f,0xbebfe988,0x64e4c3fe,0x9dbc8057,0xf0f7c086,0x60787bf8,0x6003604d,0xd1fd8346,0xf6381fb0,0x7745ae04,0xd736fccc,0x83426b33,0xf01eab71,0xb0804187,0x3c005e5f,0x77a057be,0xbde8ae24,0x55464299,0xbf582e61,0x4e58f48f,0xf2ddfda2,0xf474ef38,0x8789bdc2,0x5366f9c3,0xc8b38e74,0xb475f255,0x46fcd9b9,0x7aeb2661,0x8b1ddf84,0x846a0e79,0x915f95e2,0x466e598e,0x20b45770,0x8cd55591,0xc902de4c,0xb90bace1,0xbb8205d0,0x11a86248,0x7574a99e,0xb77f19b6,0xe0a9dc09,0x662d09a1,0xc4324633,0xe85a1f02,0x9f0be8c,0x4a99a025,0x1d6efe10,0x1ab93d1d,0xba5a4df,0xa186f20f,0x2868f169,0xdcb7da83,0x573906fe,0xa1e2ce9b,0x4fcd7f52,0x50115e01,0xa70683fa,0xa002b5c4,0xde6d027,0x9af88c27,0x773f8641,0xc3604c06,0x61a806b5,0xf0177a28,0xc0f586e0,6314154,0x30dc7d62,0x11e69ed7,0x2338ea63,0x53c2dd94,0xc2c21634,0xbbcbee56,0x90bcb6de,0xebfc7da1,0xce591d76,0x6f05e409,0x4b7c0188,0x39720a3d,0x7c927c24,0x86e3725f,0x724d9db9,0x1ac15bb4,0xd39eb8fc,0xed545578,0x8fca5b5,0xd83d7cd3,0x4dad0fc4,0x1e50ef5e,0xb161e6f8,0xa28514d9,0x6c51133c,0x6fd5c7e7,0x56e14ec4,0x362abfce,0xddc6c837,0xd79a3234,0x92638212,0x670efa8e,0x406000e0,0x3a39ce37,0xd3faf5cf,0xabc27737,0x5ac52d1b,0x5cb0679e,0x4fa33742,0xd3822740,0x99bc9bbe,0xd5118e9d,0xbf0f7315,0xd62d1c7e,0xc700c47b,0xb78c1b6b,0x21a19045,0xb26eb1be,0x6a366eb4,0x5748ab2f,0xbc946e79,0xc6a376d2,0x6549c2c8,0x530ff8ee,0x468dde7d,0xd5730a1d,0x4cd04dc6,0x2939bbdb,0xa9ba4650,0xac9526e8,0xbe5ee304,0xa1fad5f0,0x6a2d519a,0x63ef8ce2,0x9a86ee22,0xc089c2b8,0x43242ef6,0xa51e03aa,0x9cf2d0a4,0x83c061ba,0x9be96a4d,0x8fe51550,0xba645bd6,0x2826a2f9,0xa73a3ae1,0x4ba99586,0xef5562e9,0xc72fefd3,0xf752f7da,0x3f046f69,0x77fa0a59,0x80e4a915,0x87b08601,0x9b09e6ad,0x3b3ee593,0xe990fd5a,0x9e34d797,0x2cf0b7d9,0x22b8b51,0x96d5ac3a,0x17da67d,0xd1cf3ed6,0x7c7d2d28,0x1f9f25cf,0xadf2b89b,0x5ad6b472,0x5a88f54c,0xe029ac71,0xe019a5e6,0x47b0acfd,0xed93fa9b,0xe8d3c48d,0x283b57cc,0xf8d56629,0x79132e28,0x785f0191,0xed756055,0xf7960e44,0xe3d35e8c,0x15056dd4,0x88f46dba,0x3a16125,0x564f0bd,0xc3eb9e15,0x3c9057a2,0x97271aec,0xa93a072a,0x1b3f6d9b,0x1e6321f5,0xf59c66fb,0x26dcf319,0x7533d928,0xb155fdf5,0x3563482,0x8aba3cbb,0x28517711,0xc20ad9f8,0xabcc5167,0xccad925f,0x4de81751,0x3830dc8e,0x379d5862,0x9320f991,0xea7a90c2,0xfb3e7bce,0x5121ce64,0x774fbe32,0xa8b6e37e,0xc3293d46,0x48de5369,0x6413e680,0xa2ae0810,0xdd6db224,0x69852dfd,0x9072166,0xb39a460a,0x6445c0dd,0x586cdecf,0x1c20c8ae,0x5bbef7dd,0x1b588d40,0xccd2017f,0x6bb4e3bb,0xdda26a7e,0x3a59ff45,0x3e350a44,0xbcb4cdd5,0x72eacea8,0xfa6484bb,0x8d6612ae,0xbf3c6f47,0xd29be463,0x542f5d9e,0xaec2771b,0xf64e6370,0x740e0d8d,0xe75b1357,0xf8721671,0xaf537d5d,0x4040cb08,0x4eb4e2cc,0x34d2466a,0x115af84,3786409e3,0x95983a1d,0x6b89fb4,0xce6ea048,0x6f3f3b82,0x3520ab82,0x11a1d4b,0x277227f8,0x611560b1,0xe7933fdc,0xbb3a792b,0x344525bd,0xa08839e1,0x51ce794b,0x2f32c9b7,0xa01fbac9,0xe01cc87e,0xbcc7d1f6,0xcf0111c3,0xa1e8aac7,0x1a908749,0xd44fbd9a,0xd0dadecb,0xd50ada38,0x339c32a,0xc6913667,0x8df9317c,0xe0b12b4f,0xf79e59b7,0x43f5bb3a,0xf2d519ff,0x27d9459c,0xbf97222c,0x15e6fc2a,0xf91fc71,0x9b941525,0xfae59361,0xceb69ceb,0xc2a86459,0x12baa8d1,0xb6c1075e,0xe3056a0c,0x10d25065,0xcb03a442,0xe0ec6e0e,0x1698db3b,0x4c98a0be,0x3278e964,0x9f1f9532,0xe0d392df,0xd3a0342b,0x8971f21e,0x1b0a7441,0x4ba3348c,0xc5be7120,0xc37632d8,0xdf359f8d,0x9b992f2e,0xe60b6f47,0xfe3f11d,0xe54cda54,0x1edad891,0xce6279cf,0xcd3e7e6f,0x1618b166,0xfd2c1d05,0x848fd2c5,0xf6fb2299,0xf523f357,0xa6327623,0x93a83531,0x56cccd02,0xacf08162,0x5a75ebb5,0x6e163697,0x88d273cc,0xde966292,0x81b949d0,0x4c50901b,0x71c65614,0xe6c6c7bd,0x327a140a,0x45e1d006,0xc3f27b9a,0xc9aa53fd,0x62a80f00,0xbb25bfe2,0x35bdd2f6,0x71126905,0xb2040222,0xb6cbcf7c,0xcd769c2b,0x53113ec0,0x1640e3d3,0x38abbd60,0x2547adf0,0xba38209c,0xf746ce76,0x77afa1c5,0x20756060,0x85cbfe4e,0x8ae88dd8,0x7aaaf9b0,0x4cf9aa7e,0x1948c25c,0x2fb8a8c,0x1c36ae4,0xd6ebe1f9,0x90d4f869,0xa65cdea0,0x3f09252d,0xc208e69f,0xb74e6132,0xce77e25b,0x578fdfe3,0x3ac372e6],z=[0x4f727068,0x65616e42,0x65686f6c,0x64657253,0x63727944,0x6f756274];function A(a,b,c,d){var e=a[b],f=a[b+1];return e^=c[0],f^=(d[e>>>24]+d[256|e>>16&255]^d[512|e>>8&255])+d[768|255&e]^c[1],e^=(d[f>>>24]+d[256|f>>16&255]^d[512|f>>8&255])+d[768|255&f]^c[2],f^=(d[e>>>24]+d[256|e>>16&255]^d[512|e>>8&255])+d[768|255&e]^c[3],e^=(d[f>>>24]+d[256|f>>16&255]^d[512|f>>8&255])+d[768|255&f]^c[4],f^=(d[e>>>24]+d[256|e>>16&255]^d[512|e>>8&255])+d[768|255&e]^c[5],e^=(d[f>>>24]+d[256|f>>16&255]^d[512|f>>8&255])+d[768|255&f]^c[6],f^=(d[e>>>24]+d[256|e>>16&255]^d[512|e>>8&255])+d[768|255&e]^c[7],e^=(d[f>>>24]+d[256|f>>16&255]^d[512|f>>8&255])+d[768|255&f]^c[8],f^=(d[e>>>24]+d[256|e>>16&255]^d[512|e>>8&255])+d[768|255&e]^c[9],e^=(d[f>>>24]+d[256|f>>16&255]^d[512|f>>8&255])+d[768|255&f]^c[10],f^=(d[e>>>24]+d[256|e>>16&255]^d[512|e>>8&255])+d[768|255&e]^c[11],e^=(d[f>>>24]+d[256|f>>16&255]^d[512|f>>8&255])+d[768|255&f]^c[12],f^=(d[e>>>24]+d[256|e>>16&255]^d[512|e>>8&255])+d[768|255&e]^c[13],e^=(d[f>>>24]+d[256|f>>16&255]^d[512|f>>8&255])+d[768|255&f]^c[14],f^=(d[e>>>24]+d[256|e>>16&255]^d[512|e>>8&255])+d[768|255&e]^c[15],e^=(d[f>>>24]+d[256|f>>16&255]^d[512|f>>8&255])+d[768|255&f]^c[16],a[b]=f^c[17],a[b+1]=e,a}function B(a,b){for(var c=0,d=0;c<4;++c)d=d<<8|255&a[b],b=(b+1)%a.length;return{key:d,offp:b}}function C(a,b,c){for(var d,e=0,f=[0,0],g=b.length,h=c.length,i=0;i<g;i++)e=(d=B(a,e)).offp,b[i]=b[i]^d.key;for(i=0;i<g;i+=2)f=A(f,0,b,c),b[i]=f[0],b[i+1]=f[1];for(i=0;i<h;i+=2)f=A(f,0,b,c),c[i]=f[0],c[i+1]=f[1]}function D(a,b,c,d,e){var f,g,h=z.slice(),i=h.length;if(c<4||c>31){if(g=Error("Illegal number of rounds (4-31): "+c),d)return void p(d.bind(this,g));throw g}if(b.length!==v){if(g=Error("Illegal salt length: "+b.length+" != "+v),d)return void p(d.bind(this,g));throw g}c=1<<c>>>0;var j,k,l,m=0;function n(){if(e&&e(m/c),m<c)for(var f=Date.now();m<c&&(m+=1,C(a,j,k),C(b,j,k),!(Date.now()-f>100)););else{for(m=0;m<64;m++)for(l=0;l<i>>1;l++)A(h,l<<1,j,k);var g=[];for(m=0;m<i;m++)g.push((h[m]>>24&255)>>>0),g.push((h[m]>>16&255)>>>0),g.push((h[m]>>8&255)>>>0),g.push((255&h[m])>>>0);return d?void d(null,g):g}d&&p(n)}if("function"==typeof Int32Array?(j=new Int32Array(x),k=new Int32Array(y)):(j=x.slice(),k=y.slice()),!function(a,b,c,d){for(var e,f=0,g=[0,0],h=c.length,i=d.length,j=0;j<h;j++)f=(e=B(b,f)).offp,c[j]=c[j]^e.key;for(j=0,f=0;j<h;j+=2)f=(e=B(a,f)).offp,g[0]^=e.key,f=(e=B(a,f)).offp,g[1]^=e.key,g=A(g,0,c,d),c[j]=g[0],c[j+1]=g[1];for(j=0;j<i;j+=2)f=(e=B(a,f)).offp,g[0]^=e.key,f=(e=B(a,f)).offp,g[1]^=e.key,g=A(g,0,c,d),d[j]=g[0],d[j+1]=g[1]}(b,a,j,k),void 0!==d)n();else for(;;)if(void 0!==(f=n()))return f||[]}function E(a,b,c,d){if("string"!=typeof a||"string"!=typeof b){if(e=Error("Invalid string / salt: Not a string"),c)return void p(c.bind(this,e));throw e}if("$"!==b.charAt(0)||"2"!==b.charAt(1)){if(e=Error("Invalid salt version: "+b.substring(0,2)),c)return void p(c.bind(this,e));throw e}if("$"===b.charAt(2))f="\0",g=3;else{if("a"!==(f=b.charAt(2))&&"b"!==f&&"y"!==f||"$"!==b.charAt(3)){if(e=Error("Invalid salt revision: "+b.substring(2,4)),c)return void p(c.bind(this,e));throw e}g=4}if(b.charAt(g+2)>"$"){if(e=Error("Missing salt rounds"),c)return void p(c.bind(this,e));throw e}var e,f,g,h=10*parseInt(b.substring(g,g+1),10)+parseInt(b.substring(g+1,g+2),10),i=b.substring(g+3,g+25),j=function(a){for(var b,c,d=0,e=Array(q(a)),f=0,g=a.length;f<g;++f)(b=a.charCodeAt(f))<128?e[d++]=b:(b<2048?e[d++]=b>>6|192:((64512&b)==55296&&(64512&(c=a.charCodeAt(f+1)))==56320?(b=65536+((1023&b)<<10)+(1023&c),++f,e[d++]=b>>18|240,e[d++]=b>>12&63|128):e[d++]=b>>12|224,e[d++]=b>>6&63|128),e[d++]=63&b|128);return e}(a+=f>="a"?"\0":""),k=u(i,v);function l(a){var b=[];return b.push("$2"),f>="a"&&b.push(f),b.push("$"),h<10&&b.push("0"),b.push(h.toString()),b.push("$"),b.push(t(k,k.length)),b.push(t(a,4*z.length-1)),b.join("")}if(void 0===c)return l(D(j,k,h));D(j,k,h,function(a,b){a?c(a,null):c(null,l(b))},d)}function F(a,b){return t(a,b)}function G(a,b){return u(a,b)}a.default={setRandomFallback:e,genSaltSync:f,genSalt:g,hashSync:h,hash:i,compareSync:k,compare:l,getRounds:m,getSalt:n,truncates:o,encodeBase64:F,decodeBase64:G}},void 0===(d=(function(a){var b={};return e(b,a),b.default||b}).apply(b,[c(55511)]))||(a.exports=d)}};