watchbell 1.0.0 → 1.1.0

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 (678) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +123 -84
  3. package/bin/watchbell.mjs +593 -23
  4. package/package.json +1 -1
  5. package/server/.next/BUILD_ID +1 -1
  6. package/server/.next/build-manifest.json +3 -3
  7. package/server/.next/prerender-manifest.json +3 -3
  8. package/server/.next/server/app/(console)/(private)/ai/agents/page/server-reference-manifest.json +11 -11
  9. package/server/.next/server/app/(console)/(private)/ai/agents/page.js +38 -37
  10. package/server/.next/server/app/(console)/(private)/ai/agents/page.js.nft.json +1 -1
  11. package/server/.next/server/app/(console)/(private)/ai/agents/page_client-reference-manifest.js +1 -1
  12. package/server/.next/server/app/(console)/(private)/ai/ask/page/server-reference-manifest.json +10 -10
  13. package/server/.next/server/app/(console)/(private)/ai/ask/page.js +38 -37
  14. package/server/.next/server/app/(console)/(private)/ai/ask/page.js.nft.json +1 -1
  15. package/server/.next/server/app/(console)/(private)/ai/ask/page_client-reference-manifest.js +1 -1
  16. package/server/.next/server/app/(console)/(private)/ai/connect/page/server-reference-manifest.json +9 -9
  17. package/server/.next/server/app/(console)/(private)/ai/connect/page.js +38 -37
  18. package/server/.next/server/app/(console)/(private)/ai/connect/page.js.nft.json +1 -1
  19. package/server/.next/server/app/(console)/(private)/ai/connect/page_client-reference-manifest.js +1 -1
  20. package/server/.next/server/app/(console)/(private)/ai/keys/page/server-reference-manifest.json +12 -12
  21. package/server/.next/server/app/(console)/(private)/ai/keys/page.js +38 -37
  22. package/server/.next/server/app/(console)/(private)/ai/keys/page.js.nft.json +1 -1
  23. package/server/.next/server/app/(console)/(private)/ai/keys/page_client-reference-manifest.js +1 -1
  24. package/server/.next/server/app/(console)/(private)/ai/logs/page/server-reference-manifest.json +10 -10
  25. package/server/.next/server/app/(console)/(private)/ai/logs/page.js +38 -37
  26. package/server/.next/server/app/(console)/(private)/ai/logs/page.js.nft.json +1 -1
  27. package/server/.next/server/app/(console)/(private)/ai/logs/page_client-reference-manifest.js +1 -1
  28. package/server/.next/server/app/(console)/(private)/ai/models/page/server-reference-manifest.json +19 -19
  29. package/server/.next/server/app/(console)/(private)/ai/models/page.js +38 -37
  30. package/server/.next/server/app/(console)/(private)/ai/models/page.js.nft.json +1 -1
  31. package/server/.next/server/app/(console)/(private)/ai/models/page_client-reference-manifest.js +1 -1
  32. package/server/.next/server/app/(console)/(private)/ai/page/server-reference-manifest.json +9 -9
  33. package/server/.next/server/app/(console)/(private)/ai/page.js +38 -37
  34. package/server/.next/server/app/(console)/(private)/ai/page.js.nft.json +1 -1
  35. package/server/.next/server/app/(console)/(private)/ai/page_client-reference-manifest.js +1 -1
  36. package/server/.next/server/app/(console)/(private)/ai/playground/page/server-reference-manifest.json +12 -12
  37. package/server/.next/server/app/(console)/(private)/ai/playground/page.js +38 -37
  38. package/server/.next/server/app/(console)/(private)/ai/playground/page.js.nft.json +1 -1
  39. package/server/.next/server/app/(console)/(private)/ai/playground/page_client-reference-manifest.js +1 -1
  40. package/server/.next/server/app/(console)/(private)/ai/providers/page/server-reference-manifest.json +15 -15
  41. package/server/.next/server/app/(console)/(private)/ai/providers/page.js +38 -37
  42. package/server/.next/server/app/(console)/(private)/ai/providers/page.js.nft.json +1 -1
  43. package/server/.next/server/app/(console)/(private)/ai/providers/page_client-reference-manifest.js +1 -1
  44. package/server/.next/server/app/(console)/(private)/ai/quota/page/server-reference-manifest.json +10 -10
  45. package/server/.next/server/app/(console)/(private)/ai/quota/page.js +38 -37
  46. package/server/.next/server/app/(console)/(private)/ai/quota/page.js.nft.json +1 -1
  47. package/server/.next/server/app/(console)/(private)/ai/quota/page_client-reference-manifest.js +1 -1
  48. package/server/.next/server/app/(console)/(private)/ai/usage/page/server-reference-manifest.json +10 -10
  49. package/server/.next/server/app/(console)/(private)/ai/usage/page.js +38 -37
  50. package/server/.next/server/app/(console)/(private)/ai/usage/page.js.nft.json +1 -1
  51. package/server/.next/server/app/(console)/(private)/ai/usage/page_client-reference-manifest.js +1 -1
  52. package/server/.next/server/app/(console)/(private)/api-docs/[[...op]]/page/server-reference-manifest.json +9 -9
  53. package/server/.next/server/app/(console)/(private)/api-docs/[[...op]]/page.js +38 -37
  54. package/server/.next/server/app/(console)/(private)/api-docs/[[...op]]/page.js.nft.json +1 -1
  55. package/server/.next/server/app/(console)/(private)/api-docs/[[...op]]/page_client-reference-manifest.js +1 -1
  56. package/server/.next/server/app/(console)/(private)/auto-actions/page/server-reference-manifest.json +10 -10
  57. package/server/.next/server/app/(console)/(private)/auto-actions/page.js +38 -37
  58. package/server/.next/server/app/(console)/(private)/auto-actions/page.js.nft.json +1 -1
  59. package/server/.next/server/app/(console)/(private)/auto-actions/page_client-reference-manifest.js +1 -1
  60. package/server/.next/server/app/(console)/[...slug]/page/server-reference-manifest.json +9 -9
  61. package/server/.next/server/app/(console)/[...slug]/page.js +38 -37
  62. package/server/.next/server/app/(console)/[...slug]/page.js.nft.json +1 -1
  63. package/server/.next/server/app/(console)/[...slug]/page_client-reference-manifest.js +1 -1
  64. package/server/.next/server/app/(console)/alerts/page/server-reference-manifest.json +22 -22
  65. package/server/.next/server/app/(console)/alerts/page.js +38 -37
  66. package/server/.next/server/app/(console)/alerts/page.js.nft.json +1 -1
  67. package/server/.next/server/app/(console)/alerts/page_client-reference-manifest.js +1 -1
  68. package/server/.next/server/app/(console)/apps/[id]/page/server-reference-manifest.json +23 -23
  69. package/server/.next/server/app/(console)/apps/[id]/page.js +38 -37
  70. package/server/.next/server/app/(console)/apps/[id]/page.js.nft.json +1 -1
  71. package/server/.next/server/app/(console)/apps/[id]/page_client-reference-manifest.js +1 -1
  72. package/server/.next/server/app/(console)/apps/page/server-reference-manifest.json +11 -11
  73. package/server/.next/server/app/(console)/apps/page.js +38 -37
  74. package/server/.next/server/app/(console)/apps/page.js.nft.json +1 -1
  75. package/server/.next/server/app/(console)/apps/page_client-reference-manifest.js +1 -1
  76. package/server/.next/server/app/(console)/backups/page/server-reference-manifest.json +12 -12
  77. package/server/.next/server/app/(console)/backups/page.js +38 -37
  78. package/server/.next/server/app/(console)/backups/page.js.nft.json +1 -1
  79. package/server/.next/server/app/(console)/backups/page_client-reference-manifest.js +1 -1
  80. package/server/.next/server/app/(console)/catalog/page/server-reference-manifest.json +9 -9
  81. package/server/.next/server/app/(console)/catalog/page.js +38 -37
  82. package/server/.next/server/app/(console)/catalog/page.js.nft.json +1 -1
  83. package/server/.next/server/app/(console)/catalog/page_client-reference-manifest.js +1 -1
  84. package/server/.next/server/app/(console)/connections/page/server-reference-manifest.json +20 -20
  85. package/server/.next/server/app/(console)/connections/page.js +38 -37
  86. package/server/.next/server/app/(console)/connections/page.js.nft.json +1 -1
  87. package/server/.next/server/app/(console)/connections/page_client-reference-manifest.js +1 -1
  88. package/server/.next/server/app/(console)/d1/page/server-reference-manifest.json +9 -9
  89. package/server/.next/server/app/(console)/d1/page.js +38 -37
  90. package/server/.next/server/app/(console)/d1/page.js.nft.json +1 -1
  91. package/server/.next/server/app/(console)/d1/page_client-reference-manifest.js +1 -1
  92. package/server/.next/server/app/(console)/deployments/page/server-reference-manifest.json +14 -14
  93. package/server/.next/server/app/(console)/deployments/page.js +38 -37
  94. package/server/.next/server/app/(console)/deployments/page.js.nft.json +1 -1
  95. package/server/.next/server/app/(console)/deployments/page_client-reference-manifest.js +1 -1
  96. package/server/.next/server/app/(console)/dns/page/server-reference-manifest.json +16 -16
  97. package/server/.next/server/app/(console)/dns/page.js +38 -37
  98. package/server/.next/server/app/(console)/dns/page.js.nft.json +1 -1
  99. package/server/.next/server/app/(console)/dns/page_client-reference-manifest.js +1 -1
  100. package/server/.next/server/app/(console)/domains/page/server-reference-manifest.json +11 -11
  101. package/server/.next/server/app/(console)/domains/page.js +38 -37
  102. package/server/.next/server/app/(console)/domains/page.js.nft.json +1 -1
  103. package/server/.next/server/app/(console)/domains/page_client-reference-manifest.js +1 -1
  104. package/server/.next/server/app/(console)/events/page/server-reference-manifest.json +9 -9
  105. package/server/.next/server/app/(console)/events/page.js +38 -37
  106. package/server/.next/server/app/(console)/events/page.js.nft.json +1 -1
  107. package/server/.next/server/app/(console)/events/page_client-reference-manifest.js +1 -1
  108. package/server/.next/server/app/(console)/firebase/page/server-reference-manifest.json +15 -15
  109. package/server/.next/server/app/(console)/firebase/page.js +38 -37
  110. package/server/.next/server/app/(console)/firebase/page.js.nft.json +1 -1
  111. package/server/.next/server/app/(console)/firebase/page_client-reference-manifest.js +1 -1
  112. package/server/.next/server/app/(console)/logs/page/server-reference-manifest.json +10 -10
  113. package/server/.next/server/app/(console)/logs/page.js +38 -37
  114. package/server/.next/server/app/(console)/logs/page.js.nft.json +1 -1
  115. package/server/.next/server/app/(console)/logs/page_client-reference-manifest.js +1 -1
  116. package/server/.next/server/app/(console)/neon/page/server-reference-manifest.json +20 -20
  117. package/server/.next/server/app/(console)/neon/page.js +38 -37
  118. package/server/.next/server/app/(console)/neon/page.js.nft.json +1 -1
  119. package/server/.next/server/app/(console)/neon/page_client-reference-manifest.js +1 -1
  120. package/server/.next/server/app/(console)/overview/page/server-reference-manifest.json +18 -18
  121. package/server/.next/server/app/(console)/overview/page.js +38 -37
  122. package/server/.next/server/app/(console)/overview/page.js.nft.json +1 -1
  123. package/server/.next/server/app/(console)/overview/page_client-reference-manifest.js +1 -1
  124. package/server/.next/server/app/(console)/repos/[id]/page/server-reference-manifest.json +10 -10
  125. package/server/.next/server/app/(console)/repos/[id]/page.js +38 -37
  126. package/server/.next/server/app/(console)/repos/[id]/page.js.nft.json +1 -1
  127. package/server/.next/server/app/(console)/repos/[id]/page_client-reference-manifest.js +1 -1
  128. package/server/.next/server/app/(console)/repos/page/server-reference-manifest.json +9 -9
  129. package/server/.next/server/app/(console)/repos/page.js +38 -37
  130. package/server/.next/server/app/(console)/repos/page.js.nft.json +1 -1
  131. package/server/.next/server/app/(console)/repos/page_client-reference-manifest.js +1 -1
  132. package/server/.next/server/app/(console)/settings/page/server-reference-manifest.json +19 -19
  133. package/server/.next/server/app/(console)/settings/page.js +38 -37
  134. package/server/.next/server/app/(console)/settings/page.js.nft.json +1 -1
  135. package/server/.next/server/app/(console)/settings/page_client-reference-manifest.js +1 -1
  136. package/server/.next/server/app/(console)/sql/page/server-reference-manifest.json +16 -16
  137. package/server/.next/server/app/(console)/sql/page.js +38 -37
  138. package/server/.next/server/app/(console)/sql/page.js.nft.json +1 -1
  139. package/server/.next/server/app/(console)/sql/page_client-reference-manifest.js +1 -1
  140. package/server/.next/server/app/(console)/status/page/server-reference-manifest.json +9 -9
  141. package/server/.next/server/app/(console)/status/page.js +38 -37
  142. package/server/.next/server/app/(console)/status/page.js.nft.json +1 -1
  143. package/server/.next/server/app/(console)/status/page_client-reference-manifest.js +1 -1
  144. package/server/.next/server/app/(console)/supabase/page/server-reference-manifest.json +29 -29
  145. package/server/.next/server/app/(console)/supabase/page.js +38 -37
  146. package/server/.next/server/app/(console)/supabase/page.js.nft.json +1 -1
  147. package/server/.next/server/app/(console)/supabase/page_client-reference-manifest.js +1 -1
  148. package/server/.next/server/app/(console)/topology/page/server-reference-manifest.json +9 -9
  149. package/server/.next/server/app/(console)/topology/page.js +38 -37
  150. package/server/.next/server/app/(console)/topology/page.js.nft.json +1 -1
  151. package/server/.next/server/app/(console)/topology/page_client-reference-manifest.js +1 -1
  152. package/server/.next/server/app/(console)/turso/page/server-reference-manifest.json +9 -9
  153. package/server/.next/server/app/(console)/turso/page.js +38 -37
  154. package/server/.next/server/app/(console)/turso/page.js.nft.json +1 -1
  155. package/server/.next/server/app/(console)/turso/page_client-reference-manifest.js +1 -1
  156. package/server/.next/server/app/(console)/upstash/page/server-reference-manifest.json +9 -9
  157. package/server/.next/server/app/(console)/upstash/page.js +38 -37
  158. package/server/.next/server/app/(console)/upstash/page.js.nft.json +1 -1
  159. package/server/.next/server/app/(console)/upstash/page_client-reference-manifest.js +1 -1
  160. package/server/.next/server/app/(console)/uptime/page/server-reference-manifest.json +22 -22
  161. package/server/.next/server/app/(console)/uptime/page.js +38 -37
  162. package/server/.next/server/app/(console)/uptime/page.js.nft.json +1 -1
  163. package/server/.next/server/app/(console)/uptime/page_client-reference-manifest.js +1 -1
  164. package/server/.next/server/app/(console)/welcome/page/server-reference-manifest.json +14 -14
  165. package/server/.next/server/app/(console)/welcome/page.js +38 -37
  166. package/server/.next/server/app/(console)/welcome/page.js.nft.json +1 -1
  167. package/server/.next/server/app/(console)/welcome/page_client-reference-manifest.js +1 -1
  168. package/server/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  169. package/server/.next/server/app/_global-error/page.js.nft.json +1 -1
  170. package/server/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  171. package/server/.next/server/app/_global-error.html +1 -1
  172. package/server/.next/server/app/_global-error.rsc +2 -2
  173. package/server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  174. package/server/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
  175. package/server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  176. package/server/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  177. package/server/.next/server/app/_not-found/page.js.nft.json +1 -1
  178. package/server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  179. package/server/.next/server/app/_not-found.html +1 -1
  180. package/server/.next/server/app/_not-found.rsc +3 -3
  181. package/server/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  182. package/server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  183. package/server/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  184. package/server/.next/server/app/account/password/page/server-reference-manifest.json +2 -2
  185. package/server/.next/server/app/account/password/page.js.nft.json +1 -1
  186. package/server/.next/server/app/account/password/page_client-reference-manifest.js +1 -1
  187. package/server/.next/server/app/api/collect/route/server-reference-manifest.json +7 -7
  188. package/server/.next/server/app/api/collect/route.js +48 -46
  189. package/server/.next/server/app/api/collect/route.js.nft.json +1 -1
  190. package/server/.next/server/app/api/daily/route/server-reference-manifest.json +7 -7
  191. package/server/.next/server/app/api/daily/route.js +52 -50
  192. package/server/.next/server/app/api/daily/route.js.nft.json +1 -1
  193. package/server/.next/server/app/api/ping/[...parts]/route.js.nft.json +1 -1
  194. package/server/.next/server/app/api/status/route.js.nft.json +1 -1
  195. package/server/.next/server/app/api/telegram/webhook/route/server-reference-manifest.json +7 -7
  196. package/server/.next/server/app/api/telegram/webhook/route.js +48 -46
  197. package/server/.next/server/app/api/telegram/webhook/route.js.nft.json +1 -1
  198. package/server/.next/server/app/api/v1/advice/route.js +19 -18
  199. package/server/.next/server/app/api/v1/advice/route.js.nft.json +1 -1
  200. package/server/.next/server/app/api/v1/ai/chat/completions/route.js.nft.json +1 -1
  201. package/server/.next/server/app/api/v1/ai/models/route.js.nft.json +1 -1
  202. package/server/.next/server/app/api/v1/ai/questions/[id]/route.js.nft.json +1 -1
  203. package/server/.next/server/app/api/v1/ai/questions/route.js +22 -21
  204. package/server/.next/server/app/api/v1/ai/questions/route.js.nft.json +1 -1
  205. package/server/.next/server/app/api/v1/mcp/route.js +20 -19
  206. package/server/.next/server/app/api/v1/mcp/route.js.nft.json +1 -1
  207. package/server/.next/server/app/api/v1/me/route.js.nft.json +1 -1
  208. package/server/.next/server/app/api/v1/openapi.json/route.js +9 -8
  209. package/server/.next/server/app/api/v1/openapi.json/route.js.nft.json +1 -1
  210. package/server/.next/server/app/api/v1/status/apps/[app]/route.js +18 -17
  211. package/server/.next/server/app/api/v1/status/apps/[app]/route.js.nft.json +1 -1
  212. package/server/.next/server/app/api/v1/status/route.js +18 -17
  213. package/server/.next/server/app/api/v1/status/route.js.nft.json +1 -1
  214. package/server/.next/server/app/api/watchdog/route.js +19 -18
  215. package/server/.next/server/app/api/watchdog/route.js.nft.json +1 -1
  216. package/server/.next/server/app/auth/confirm/route.js.nft.json +1 -1
  217. package/server/.next/server/app/auth/google/callback/route.js +18 -17
  218. package/server/.next/server/app/auth/google/callback/route.js.nft.json +1 -1
  219. package/server/.next/server/app/auth/google/create/callback/route.js.nft.json +1 -1
  220. package/server/.next/server/app/auth/not-member/route.js.nft.json +1 -1
  221. package/server/.next/server/app/auth/session-ended/route.js.nft.json +1 -1
  222. package/server/.next/server/app/invite/page/server-reference-manifest.json +2 -2
  223. package/server/.next/server/app/invite/page.js +4 -3
  224. package/server/.next/server/app/invite/page.js.nft.json +1 -1
  225. package/server/.next/server/app/invite/page_client-reference-manifest.js +1 -1
  226. package/server/.next/server/app/mfa/page/server-reference-manifest.json +2 -2
  227. package/server/.next/server/app/mfa/page.js.nft.json +1 -1
  228. package/server/.next/server/app/mfa/page_client-reference-manifest.js +1 -1
  229. package/server/.next/server/app/mfa/setup/page/server-reference-manifest.json +3 -3
  230. package/server/.next/server/app/mfa/setup/page.js.nft.json +1 -1
  231. package/server/.next/server/app/mfa/setup/page_client-reference-manifest.js +1 -1
  232. package/server/.next/server/app/page/server-reference-manifest.json +1 -1
  233. package/server/.next/server/app/page.js.nft.json +1 -1
  234. package/server/.next/server/app/page_client-reference-manifest.js +1 -1
  235. package/server/.next/server/app/s/[slug]/badge/[file]/route.js +9 -8
  236. package/server/.next/server/app/s/[slug]/badge/[file]/route.js.nft.json +1 -1
  237. package/server/.next/server/app/s/[slug]/page/server-reference-manifest.json +1 -1
  238. package/server/.next/server/app/s/[slug]/page.js +8 -8
  239. package/server/.next/server/app/s/[slug]/page.js.nft.json +1 -1
  240. package/server/.next/server/app/s/[slug]/page_client-reference-manifest.js +1 -1
  241. package/server/.next/server/app/setup/page/server-reference-manifest.json +2 -2
  242. package/server/.next/server/app/setup/page.js.nft.json +1 -1
  243. package/server/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  244. package/server/.next/server/app/signin/page/server-reference-manifest.json +3 -3
  245. package/server/.next/server/app/signin/page.js.nft.json +1 -1
  246. package/server/.next/server/app/signin/page_client-reference-manifest.js +1 -1
  247. package/server/.next/server/chunks/{[root-of-the-server]__09qqv-zsz9qhr._.js → [root-of-the-server]__00hb7hqa7qktx._.js} +1 -1
  248. package/server/.next/server/chunks/[root-of-the-server]__03276vwi4jgvk._.js +1 -1
  249. package/server/.next/server/chunks/[root-of-the-server]__049ykc067tlsv._.js +1 -1
  250. package/server/.next/server/chunks/[root-of-the-server]__06f9e4kpi0mw8._.js +1 -1
  251. package/server/.next/server/chunks/[root-of-the-server]__0_rfeg3389imx._.js +1 -1
  252. package/server/.next/server/chunks/{[root-of-the-server]__1n32c8l_j8jt4._.js → [root-of-the-server]__0abdjgj-muln9._.js} +2 -2
  253. package/server/.next/server/chunks/{[root-of-the-server]__1jrqehmo6kq8x._.js → [root-of-the-server]__0alnp_0qkhzze._.js} +2 -2
  254. package/server/.next/server/chunks/[root-of-the-server]__0b2hzo6nez0we._.js +1 -1
  255. package/server/.next/server/chunks/[root-of-the-server]__0c5w5y-db0jkb._.js +3 -0
  256. package/server/.next/server/chunks/{[root-of-the-server]__0znb_m_wygjdc._.js → [root-of-the-server]__0erdelc9_06nk._.js} +2 -2
  257. package/server/.next/server/chunks/{[root-of-the-server]__0u66-8g4ql645._.js → [root-of-the-server]__0grtjjr51j6xe._.js} +1 -1
  258. package/server/.next/server/chunks/{[root-of-the-server]__0-ok-3r9xtz0y._.js → [root-of-the-server]__0hpdrg-m0n6ty._.js} +2 -2
  259. package/server/.next/server/chunks/{[root-of-the-server]__1z3-s7wc9-uc6._.js → [root-of-the-server]__0m7_0rarf_x86._.js} +2 -2
  260. package/server/.next/server/chunks/[root-of-the-server]__0m7i0l3nkbdfm._.js +1 -1
  261. package/server/.next/server/chunks/[root-of-the-server]__0mwiq4mkf8pc5._.js +1 -1
  262. package/server/.next/server/chunks/[root-of-the-server]__0p3lnkpxf2-xz._.js +1 -1
  263. package/server/.next/server/chunks/{[root-of-the-server]__08n3x1x850wqc._.js → [root-of-the-server]__0qmkpydmx3ljf._.js} +2 -2
  264. package/server/.next/server/chunks/{[root-of-the-server]__0_6eq1806attx._.js → [root-of-the-server]__0r-zdzq6ki5gr._.js} +1 -1
  265. package/server/.next/server/chunks/{[root-of-the-server]__157yb_wl7w4ly._.js → [root-of-the-server]__0rak0ce6prxwp._.js} +1 -1
  266. package/server/.next/server/chunks/{[root-of-the-server]__081ywec7cjq3d._.js → [root-of-the-server]__0rxrv00e5e6fj._.js} +2 -2
  267. package/server/.next/server/chunks/{[root-of-the-server]__1_5q9zgl6p5_3._.js → [root-of-the-server]__0sivlmcvkc1uq._.js} +1 -1
  268. package/server/.next/server/chunks/{[root-of-the-server]__1x9tt_2yhozwe._.js → [root-of-the-server]__0vp-x4ifpr3p9._.js} +2 -2
  269. package/server/.next/server/chunks/{[root-of-the-server]__0j0medewrv95l._.js → [root-of-the-server]__0z-41cwvkliev._.js} +2 -2
  270. package/server/.next/server/chunks/{[root-of-the-server]__06iz-tlpv7pqm._.js → [root-of-the-server]__0zd61mh-juh2i._.js} +1 -1
  271. package/server/.next/server/chunks/{[root-of-the-server]__0mtlynfv-vklo._.js → [root-of-the-server]__1-q6_msattgcu._.js} +1 -1
  272. package/server/.next/server/chunks/{[root-of-the-server]__018ux7xja83l6._.js → [root-of-the-server]__1-rqermjb77se._.js} +2 -2
  273. package/server/.next/server/chunks/[root-of-the-server]__110c-t3wz3nzm._.js +1 -1
  274. package/server/.next/server/chunks/[root-of-the-server]__11k46kam6tbia._.js +1 -1
  275. package/server/.next/server/chunks/{[root-of-the-server]__0mhtnnebbepzx._.js → [root-of-the-server]__11kfkk5yxz4ge._.js} +2 -2
  276. package/server/.next/server/chunks/{[root-of-the-server]__0ymon9r-17xe_._.js → [root-of-the-server]__13be7gbo81td4._.js} +1 -1
  277. package/server/.next/server/chunks/{[root-of-the-server]__0uyagcs61c0t_._.js → [root-of-the-server]__13scfgchwlitx._.js} +2 -2
  278. package/server/.next/server/chunks/[root-of-the-server]__14zpwd7xntffk._.js +3 -0
  279. package/server/.next/server/chunks/[root-of-the-server]__15tt645jfx-br._.js +3 -0
  280. package/server/.next/server/chunks/{[root-of-the-server]__08801yoxfe_os._.js → [root-of-the-server]__15zbj_ehkvv-n._.js} +2 -2
  281. package/server/.next/server/chunks/[root-of-the-server]__16sp8qurcwsnf._.js +3 -0
  282. package/server/.next/server/chunks/[root-of-the-server]__19kwj690b37xf._.js +1 -1
  283. package/server/.next/server/chunks/[root-of-the-server]__1_1-jgxiadvs0._.js +3 -0
  284. package/server/.next/server/chunks/[root-of-the-server]__1_2akhn6c9eqq._.js +3 -0
  285. package/server/.next/server/chunks/[root-of-the-server]__1c2u-bg524-_w._.js +3 -0
  286. package/server/.next/server/chunks/[root-of-the-server]__1c8_e0jqh_8na._.js +3 -0
  287. package/server/.next/server/chunks/{[root-of-the-server]__0qpf0qusq792k._.js → [root-of-the-server]__1flvcyht5uk7h._.js} +2 -2
  288. package/server/.next/server/chunks/[root-of-the-server]__1g-be2zoiz2tf._.js +3 -0
  289. package/server/.next/server/chunks/[root-of-the-server]__1h96ebyza_vlh._.js +3 -0
  290. package/server/.next/server/chunks/{[root-of-the-server]__02ihdvnmhshoe._.js → [root-of-the-server]__1hw6s0e7p2-6g._.js} +2 -2
  291. package/server/.next/server/chunks/[root-of-the-server]__1j26i51ankv-z._.js +3 -0
  292. package/server/.next/server/chunks/[root-of-the-server]__1ldcwvd42rpuz._.js +3 -0
  293. package/server/.next/server/chunks/{[root-of-the-server]__0q691wec2busx._.js → [root-of-the-server]__1objhlwwrjfjk._.js} +2 -2
  294. package/server/.next/server/chunks/{[root-of-the-server]__0wt74rsaz-308._.js → [root-of-the-server]__1qzor1nqajuyp._.js} +2 -2
  295. package/server/.next/server/chunks/{[root-of-the-server]__18mztbxkzaxjs._.js → [root-of-the-server]__1rf3slum5swk2._.js} +2 -2
  296. package/server/.next/server/chunks/[root-of-the-server]__1sj7uwyq1gpet._.js +3 -0
  297. package/server/.next/server/chunks/{[root-of-the-server]__0tb-63ts77gqd._.js → [root-of-the-server]__1tefe1f5835t_._.js} +2 -2
  298. package/server/.next/server/chunks/[root-of-the-server]__1u1b3a58anm3f._.js +3 -0
  299. package/server/.next/server/chunks/{[root-of-the-server]__132wlw6sbwt1d._.js → [root-of-the-server]__1vi0u2vkv3tk0._.js} +2 -2
  300. package/server/.next/server/chunks/[root-of-the-server]__1w_73psnce1dd._.js +3 -0
  301. package/server/.next/server/chunks/[root-of-the-server]__202r0hxhr5bnu._.js +3 -0
  302. package/server/.next/server/chunks/[root-of-the-server]__2196hxm-s7u6e._.js +3 -0
  303. package/server/.next/server/chunks/{_076dwl7r_5vcl._.js → _061mqfu1rkl7g._.js} +4 -4
  304. package/server/.next/server/chunks/{_0594j_bb0l80e._.js → _0c_vrxu6rin-k._.js} +2 -2
  305. package/server/.next/server/chunks/_0ejcrge5k4quv._.js +9 -9
  306. package/server/.next/server/chunks/_0n-wbmmvp4omq._.js +3 -0
  307. package/server/.next/server/chunks/_0qawxzcf--lyq._.js +2 -2
  308. package/server/.next/server/chunks/_0qmi54vmnlwdv._.js +3 -3
  309. package/server/.next/server/chunks/{_0m49djgc1t4wg._.js → _0qrn1v02iivm8._.js} +2 -2
  310. package/server/.next/server/chunks/_0vgojnnkcf1vu._.js +2 -2
  311. package/server/.next/server/chunks/_0vz0de4gz70-e._.js +1 -1
  312. package/server/.next/server/chunks/_103ai6ybnpq1k._.js +1 -1
  313. package/server/.next/server/chunks/_108e86rhye0o1._.js +1 -1
  314. package/server/.next/server/chunks/_1476vtrt9101m._.js +1 -1
  315. package/server/.next/server/chunks/{_0r4am1mgz4dg_._.js → _1b63jfweu0o04._.js} +2 -2
  316. package/server/.next/server/chunks/_1b7pc6ohhqxs3._.js +9 -9
  317. package/server/.next/server/chunks/_1g_prqb_u33e3._.js +3 -3
  318. package/server/.next/server/chunks/{_08tppw9ujlpke._.js → _1i57ar6zvd7yb._.js} +4 -4
  319. package/server/.next/server/chunks/{_11p2ejgai2a78._.js → _1k2cwp1_wt6qm._.js} +2 -2
  320. package/server/.next/server/chunks/_1kcmwgs544mo-._.js +1 -1
  321. package/server/.next/server/chunks/{_0n5m3o7at0adm._.js → _1kj2yv4-wk2kp._.js} +4 -4
  322. package/server/.next/server/chunks/_1lq5m27p-ilrw._.js +1 -1
  323. package/server/.next/server/chunks/_1mnwzh3z9y4th._.js +3 -0
  324. package/server/.next/server/chunks/_1nuf-l7izvfl_._.js +1 -1
  325. package/server/.next/server/chunks/{_1rw6_0nf-3sxs._.js → _1ozrnl_on86u7._.js} +4 -4
  326. package/server/.next/server/chunks/_1ptcxyn1tzm9r._.js +1 -1
  327. package/server/.next/server/chunks/_1xeuk6g48m3_1._.js +3 -0
  328. package/server/.next/server/chunks/{src_0uxqs7150nhx2._.js → src_014zbodp4djeb._.js} +2 -2
  329. package/server/.next/server/chunks/{src_0n42os1q41rha._.js → src_04pgj--n_d4w5._.js} +2 -2
  330. package/server/.next/server/chunks/src_063xvouojxyoa._.js +1 -1
  331. package/server/.next/server/chunks/{src_01wdnb4skk1wz._.js → src_08bzavsfds295._.js} +2 -2
  332. package/server/.next/server/chunks/src_0c-owt8q0lyj3._.js +3 -0
  333. package/server/.next/server/chunks/{src_1-r51arho90p7._.js → src_0k78ifotuztod._.js} +2 -2
  334. package/server/.next/server/chunks/src_0o4-snj7wkaav._.js +1 -1
  335. package/server/.next/server/chunks/{src_0d-zi077mzm6v._.js → src_0xqorb3-ef3ub._.js} +2 -2
  336. package/server/.next/server/chunks/src_1a5yibsjcy1ga._.js +1 -1
  337. package/server/.next/server/chunks/src_1zo6so07lgcdj._.js +1 -1
  338. package/server/.next/server/chunks/src_db_rows_ts_15b286wn1kn1e._.js +1 -1
  339. package/server/.next/server/chunks/src_instrumentation-node_ts_1c--sr1k7_8k2._.js +3 -0
  340. package/server/.next/server/chunks/src_lib_0485hz-c7h7dr._.js +6 -6
  341. package/server/.next/server/chunks/src_lib_08u7n7-yunfvd._.js +2 -2
  342. package/server/.next/server/chunks/src_lib_0cbs2jlrw1qbh._.js +3 -0
  343. package/server/.next/server/chunks/src_lib_0glcfed-uogyd._.js +1 -1
  344. package/server/.next/server/chunks/src_lib_0qcyomi01xvf1._.js +6 -6
  345. package/server/.next/server/chunks/src_lib_0vl2-zp4wzw7n._.js +3 -0
  346. package/server/.next/server/chunks/src_lib_0x4n8swwa3zn7._.js +1 -1
  347. package/server/.next/server/chunks/src_lib_10vqn6q0h8kls._.js +2 -2
  348. package/server/.next/server/chunks/src_lib_13g9xjx8ci00z._.js +3 -0
  349. package/server/.next/server/chunks/src_lib_1ryt-36ohhnm6._.js +6 -6
  350. package/server/.next/server/chunks/src_lib_1tzoqx44yogsk._.js +2 -2
  351. package/server/.next/server/chunks/src_lib_1yd94hta5y1hx._.js +3 -0
  352. package/server/.next/server/chunks/src_lib_brand-env_ts_1wcm1bjuismq_._.js +3 -0
  353. package/server/.next/server/chunks/src_lib_collector_runners_ts_12z4gtgikss74._.js +6 -6
  354. package/server/.next/server/chunks/src_lib_data_0ask_rbmgwlf3._.js +1 -1
  355. package/server/.next/server/chunks/src_lib_data_0e155tkqeoojm._.js +1 -1
  356. package/server/.next/server/chunks/src_lib_data_backup-db_ts_19rtzbv84xz_h._.js +2 -2
  357. package/server/.next/server/chunks/src_lib_data_logs-db_ts_1ddw07do12mmk._.js +2 -2
  358. package/server/.next/server/chunks/src_lib_demo_pool_ts_0fpn8acsdk64i._.js +9 -9
  359. package/server/.next/server/chunks/src_lib_demo_pool_ts_14rjvkgozh1d4._.js +9 -9
  360. package/server/.next/server/chunks/src_lib_demo_pool_ts_17xz9bk-d5uic._.js +13 -13
  361. package/server/.next/server/chunks/src_lib_demo_pool_ts_210g_on8zx_-n._.js +9 -9
  362. package/server/.next/server/chunks/src_lib_time_ts_1__07rt8x18k-._.js +3 -0
  363. package/server/.next/server/chunks/src_lib_time_ts_1a27wp71yhgti._.js +3 -0
  364. package/server/.next/server/chunks/src_lib_time_ts_1qlwgp7nprvbi._.js +3 -0
  365. package/server/.next/server/chunks/src_private_ai_gateway_ts_04_5ao9914d0p._.js +1 -1
  366. package/server/.next/server/chunks/src_private_notes_notes-actions_ts_1g63g8u965fhc._.js +1 -1
  367. package/server/.next/server/chunks/ssr/1oeh_server_app_(console)_(private)_ai_agents_page_actions_1q6nc5chwn5k4.js +1 -1
  368. package/server/.next/server/chunks/ssr/1oeh_server_app_(console)_(private)_ai_models_page_actions_0n_anax2l1jpu.js +1 -1
  369. package/server/.next/server/chunks/ssr/1oeh_server_app_(console)_(private)_ai_playground_page_actions_1kyng_xuojdtb.js +1 -1
  370. package/server/.next/server/chunks/ssr/1oeh_server_app_(console)_(private)_ai_quota_page_actions_04r4ro6x7-p7p.js +1 -1
  371. package/server/.next/server/chunks/ssr/1oeh_server_app_(console)_(private)_ai_usage_page_actions_1fq9uugdpqa_l.js +1 -1
  372. package/server/.next/server/chunks/ssr/1oeh_server_app_(console)_(private)_auto-actions_page_actions_0mhtiq_5szpe0.js +1 -1
  373. package/server/.next/server/chunks/ssr/{[externals]__1u-jgivpw0_oh._.js → [externals]__0vbbz7arebnub._.js} +1 -1
  374. package/server/.next/server/chunks/ssr/[root-of-the-server]__02cq5r26w4itc._.js +1 -1
  375. package/server/.next/server/chunks/ssr/[root-of-the-server]__02qyxz9eh8_eh._.js +1 -1
  376. package/server/.next/server/chunks/ssr/[root-of-the-server]__04a21b9fkrqs3._.js +3 -0
  377. package/server/.next/server/chunks/ssr/{[root-of-the-server]__0ijk9z1ot_xi4._.js → [root-of-the-server]__07n1hb3mk44lt._.js} +2 -2
  378. package/server/.next/server/chunks/ssr/[root-of-the-server]__09-0oydof-7uw._.js +1 -1
  379. package/server/.next/server/chunks/ssr/[root-of-the-server]__0ct71emqfru3b._.js +1 -1
  380. package/server/.next/server/chunks/ssr/{[root-of-the-server]__1fdzriy6yyu5d._.js → [root-of-the-server]__0hbk3gqja86zp._.js} +1 -1
  381. package/server/.next/server/chunks/ssr/[root-of-the-server]__0ksvf4x4zcbpb._.js +1 -1
  382. package/server/.next/server/chunks/ssr/[root-of-the-server]__0n7cj-oti5wct._.js +2 -2
  383. package/server/.next/server/chunks/ssr/[root-of-the-server]__0op0kqh43wd-a._.js +3 -0
  384. package/server/.next/server/chunks/ssr/{[root-of-the-server]__1tkmutq84zkeh._.js → [root-of-the-server]__0ryl_hnreck66._.js} +2 -2
  385. package/server/.next/server/chunks/ssr/[root-of-the-server]__0wcnxr_g-bd3r._.js +1 -1
  386. package/server/.next/server/chunks/ssr/[root-of-the-server]__0wf8q7-o-4n8y._.js +3 -0
  387. package/server/.next/server/chunks/ssr/[root-of-the-server]__10bkg3o65q6r4._.js +1 -1
  388. package/server/.next/server/chunks/ssr/{[root-of-the-server]__0ryb947ux5cq7._.js → [root-of-the-server]__11y6b96ofb-c5._.js} +2 -2
  389. package/server/.next/server/chunks/ssr/[root-of-the-server]__13oi70jo-u731._.js +2 -2
  390. package/server/.next/server/chunks/ssr/{[root-of-the-server]__0aahjz4fnt4c_._.js → [root-of-the-server]__13rgl1h4g39l-._.js} +2 -2
  391. package/server/.next/server/chunks/ssr/{[root-of-the-server]__1csz822qejxk-._.js → [root-of-the-server]__168ahi_n-kf90._.js} +2 -2
  392. package/server/.next/server/chunks/ssr/[root-of-the-server]__17kocbnwlcw6d._.js +1 -1
  393. package/server/.next/server/chunks/ssr/{[root-of-the-server]__11-ssp_43878t._.js → [root-of-the-server]__18b1wk6-2gq4x._.js} +2 -2
  394. package/server/.next/server/chunks/ssr/[root-of-the-server]__1_f7nip9age3d._.js +1 -1
  395. package/server/.next/server/chunks/ssr/{[root-of-the-server]__0lks-6wz-rmk5._.js → [root-of-the-server]__1drr27jyyhw7p._.js} +2 -2
  396. package/server/.next/server/chunks/ssr/[root-of-the-server]__1e-xqsuqsd4ub._.js +3 -0
  397. package/server/.next/server/chunks/ssr/[root-of-the-server]__1gw6334w8y2my._.js +1 -1
  398. package/server/.next/server/chunks/ssr/[root-of-the-server]__1i69oli51is1u._.js +1 -1
  399. package/server/.next/server/chunks/ssr/[root-of-the-server]__1lx2k37wgre3d._.js +1 -1
  400. package/server/.next/server/chunks/ssr/[root-of-the-server]__1n1pq5j5p4_qn._.js +3 -0
  401. package/server/.next/server/chunks/ssr/[root-of-the-server]__1qltiqn0htqnx._.js +1 -1
  402. package/server/.next/server/chunks/ssr/[root-of-the-server]__1w1472ukyh58r._.js +1 -1
  403. package/server/.next/server/chunks/ssr/[root-of-the-server]__1xa91qls2i3j4._.js +3 -0
  404. package/server/.next/server/chunks/ssr/[root-of-the-server]__204_t7bzma353._.js +3 -0
  405. package/server/.next/server/chunks/ssr/[root-of-the-server]__20ht054m5-_d6._.js +1 -1
  406. package/server/.next/server/chunks/ssr/_0-uwh2rwm_dic._.js +2 -2
  407. package/server/.next/server/chunks/ssr/_026w_ig6vy9bt._.js +1 -1
  408. package/server/.next/server/chunks/ssr/_06kwu83_fmex9._.js +2 -2
  409. package/server/.next/server/chunks/ssr/{_14bz_443syxhi._.js → _06sp8cllu_ljh._.js} +2 -2
  410. package/server/.next/server/chunks/ssr/{_18t7ov64ycb-w._.js → _08u2qnetu4ghm._.js} +2 -2
  411. package/server/.next/server/chunks/ssr/_0_oc9q0vqkynd._.js +1 -1
  412. package/server/.next/server/chunks/ssr/_0_tr9fol2yq33._.js +1 -1
  413. package/server/.next/server/chunks/ssr/_0_ul4mlc_pj5i._.js +2 -2
  414. package/server/.next/server/chunks/ssr/_0a22b7zsckifp._.js +1 -1
  415. package/server/.next/server/chunks/ssr/_0azq3ml4gbn1d._.js +1 -1
  416. package/server/.next/server/chunks/ssr/_0cukja7zcxh7e._.js +1 -1
  417. package/server/.next/server/chunks/ssr/_0cw4kz3d6kmb1._.js +1 -1
  418. package/server/.next/server/chunks/ssr/_0d702k82llasi._.js +1 -1
  419. package/server/.next/server/chunks/ssr/_0fnl7z-saj7nc._.js +1 -1
  420. package/server/.next/server/chunks/ssr/_0hykblvnwc2ar._.js +1 -1
  421. package/server/.next/server/chunks/ssr/_0i-e824vtomvg._.js +2 -2
  422. package/server/.next/server/chunks/ssr/_0jjoot3rhbde3._.js +2 -2
  423. package/server/.next/server/chunks/ssr/_0kn710rrv_o2t._.js +2 -2
  424. package/server/.next/server/chunks/ssr/_0mgclon6_oh87._.js +2 -2
  425. package/server/.next/server/chunks/ssr/_0oovfx_t_-u0k._.js +1 -1
  426. package/server/.next/server/chunks/ssr/_0qnv1uc1_yv28._.js +2 -2
  427. package/server/.next/server/chunks/ssr/_0sotiqakj-6ci._.js +1 -1
  428. package/server/.next/server/chunks/ssr/_0tcmsw8hszixv._.js +1 -1
  429. package/server/.next/server/chunks/ssr/_0uogspz6zrvwk._.js +2 -2
  430. package/server/.next/server/chunks/ssr/_1-6d1tm3r_qwg._.js +1 -1
  431. package/server/.next/server/chunks/ssr/_10bven6gb1vj0._.js +1 -1
  432. package/server/.next/server/chunks/ssr/_10pz3ggun9s5i._.js +2 -2
  433. package/server/.next/server/chunks/ssr/_11o43qq2eyx_r._.js +3 -0
  434. package/server/.next/server/chunks/ssr/{_06_f735j-1i20._.js → _12348a3ug1-wo._.js} +2 -2
  435. package/server/.next/server/chunks/ssr/_12ddramfkd6o1._.js +2 -2
  436. package/server/.next/server/chunks/ssr/_1476vtrt9101m._.js +1 -1
  437. package/server/.next/server/chunks/ssr/_15ft896zgt02e._.js +2 -2
  438. package/server/.next/server/chunks/ssr/_16t9k9e5cjvas._.js +1 -1
  439. package/server/.next/server/chunks/ssr/_18lgd6o04ugow._.js +2 -2
  440. package/server/.next/server/chunks/ssr/_19-3vzkc6rk97._.js +1 -1
  441. package/server/.next/server/chunks/ssr/_1_-o2s48aj4i7._.js +1 -1
  442. package/server/.next/server/chunks/ssr/{_08y82qdosn7ga._.js → _1_ojvke28lw3y._.js} +2 -2
  443. package/server/.next/server/chunks/ssr/_1b1ano88ar-gi._.js +2 -2
  444. package/server/.next/server/chunks/ssr/_1boia2p3_0nsz._.js +2 -2
  445. package/server/.next/server/chunks/ssr/_1c28jitsyufnt._.js +1 -1
  446. package/server/.next/server/chunks/ssr/_1cl55h_h3q-b_._.js +1 -1
  447. package/server/.next/server/chunks/ssr/_1dx207la592b7._.js +2 -2
  448. package/server/.next/server/chunks/ssr/_1e24cpw3g7njr._.js +2 -2
  449. package/server/.next/server/chunks/ssr/{_0o0-2ela2_qqd._.js → _1exwj9ou5yh71._.js} +2 -2
  450. package/server/.next/server/chunks/ssr/_1flla16o7o9ba._.js +1 -1
  451. package/server/.next/server/chunks/ssr/_1g2zbl_-4z_hg._.js +1 -1
  452. package/server/.next/server/chunks/ssr/_1i77n2n-wb98v._.js +2 -2
  453. package/server/.next/server/chunks/ssr/_1ibagew7zj8y6._.js +3 -0
  454. package/server/.next/server/chunks/ssr/_1j9cka-44jd65._.js +1 -1
  455. package/server/.next/server/chunks/ssr/_1jh_o2i8hj2g5._.js +1 -1
  456. package/server/.next/server/chunks/ssr/_1nir32qtr99-r._.js +1 -1
  457. package/server/.next/server/chunks/ssr/_1qt1czw3w8dww._.js +3 -0
  458. package/server/.next/server/chunks/ssr/_1sq12-1_02tzt._.js +2 -2
  459. package/server/.next/server/chunks/ssr/_1ybhu25y38395._.js +2 -2
  460. package/server/.next/server/chunks/ssr/_1ykxf4mi60jog._.js +2 -2
  461. package/server/.next/server/chunks/ssr/_1z6dy1k48mskn._.js +1 -1
  462. package/server/.next/server/chunks/ssr/_20ln-4gu85-yt._.js +3 -0
  463. package/server/.next/server/chunks/ssr/_210edglbxmcb3._.js +2 -2
  464. package/server/.next/server/chunks/ssr/{_0i6y4bkm-0cm3._.js → _216rrmkts392q._.js} +2 -2
  465. package/server/.next/server/chunks/ssr/_next-internal_server_app_(console)_(private)_ai_keys_page_actions_1910ocjt__nlh.js +1 -1
  466. package/server/.next/server/chunks/ssr/_next-internal_server_app_(console)_(private)_ai_logs_page_actions_136-s4sxl6nra.js +1 -1
  467. package/server/.next/server/chunks/ssr/_next-internal_server_app_(console)_alerts_page_actions_0f7cxitw-svnl.js +1 -1
  468. package/server/.next/server/chunks/ssr/_next-internal_server_app_(console)_apps_[id]_page_actions_14l8--w36mywn.js +1 -1
  469. package/server/.next/server/chunks/ssr/_next-internal_server_app_(console)_apps_page_actions_1uaicj0j8stji.js +1 -1
  470. package/server/.next/server/chunks/ssr/_next-internal_server_app_(console)_connections_page_actions_03amng1-xhfd1.js +1 -1
  471. package/server/.next/server/chunks/ssr/_next-internal_server_app_(console)_dns_page_actions_1p2deebbgom7b.js +1 -1
  472. package/server/.next/server/chunks/ssr/_next-internal_server_app_(console)_domains_page_actions_0-wg58qcvu_rv.js +1 -1
  473. package/server/.next/server/chunks/ssr/_next-internal_server_app_(console)_firebase_page_actions_215m-kkv06r4z.js +1 -1
  474. package/server/.next/server/chunks/ssr/_next-internal_server_app_(console)_logs_page_actions_11-8xinblaop_.js +1 -1
  475. package/server/.next/server/chunks/ssr/_next-internal_server_app_(console)_settings_page_actions_1z3l1p4keed3m.js +1 -1
  476. package/server/.next/server/chunks/ssr/_next-internal_server_app_(console)_supabase_page_actions_1evatil08dntl.js +1 -1
  477. package/server/.next/server/chunks/ssr/_next-internal_server_app_(console)_uptime_page_actions_0k1237d-q3oc4.js +1 -1
  478. package/server/.next/server/chunks/ssr/_next-internal_server_app_account_password_page_actions_1v4e71_oifbx9.js +1 -1
  479. package/server/.next/server/chunks/ssr/_next-internal_server_app_signin_page_actions_11wzk446p6_zi.js +1 -1
  480. package/server/.next/server/chunks/ssr/src_00ze92e3aolj8._.js +1 -1
  481. package/server/.next/server/chunks/ssr/src_06tjy8wljego8._.js +1 -1
  482. package/server/.next/server/chunks/ssr/src_084tdkx3c_yqi._.js +1 -1
  483. package/server/.next/server/chunks/ssr/src_0abts6wp5ucc0._.js +1 -1
  484. package/server/.next/server/chunks/ssr/src_0f_ip1ke7i9r7._.js +3 -0
  485. package/server/.next/server/chunks/ssr/src_0iefnjvaszvw_._.js +1 -1
  486. package/server/.next/server/chunks/ssr/src_0ph020gy78gi9._.js +1 -1
  487. package/server/.next/server/chunks/ssr/src_0qu78tivj78-x._.js +3 -0
  488. package/server/.next/server/chunks/ssr/src_0t6-d5hmzrbp1._.js +1 -1
  489. package/server/.next/server/chunks/ssr/src_0xh3xicmff6ws._.js +1 -1
  490. package/server/.next/server/chunks/ssr/src_10zavgy86u3us._.js +1 -1
  491. package/server/.next/server/chunks/ssr/{src_1eermasnm2cgy._.js → src_11_hakxhnybdd._.js} +2 -2
  492. package/server/.next/server/chunks/ssr/src_1sdwdnblbiq_g._.js +1 -1
  493. package/server/.next/server/chunks/ssr/src_app_(console)_(private)_ai_agents_1fyhh1ldgm23z._.js +1 -1
  494. package/server/.next/server/chunks/ssr/src_app_(console)_(private)_ai_ask_06n-9cjmbb-vu._.js +1 -1
  495. package/server/.next/server/chunks/ssr/src_app_(console)_(private)_ai_ask_ask-form_tsx_18ttm9nna_9y6._.js +1 -1
  496. package/server/.next/server/chunks/ssr/src_app_(console)_(private)_ai_connect_connect-view_tsx_04abz05n7hdsd._.js +15 -15
  497. package/server/.next/server/chunks/ssr/src_app_(console)_(private)_ai_logs_export-button_tsx_1k-crb88n1za_._.js +1 -1
  498. package/server/.next/server/chunks/ssr/src_app_(console)_(private)_ai_models_0ayzqn062pnv5._.js +1 -1
  499. package/server/.next/server/chunks/ssr/src_app_(console)_(private)_ai_models_0hla-5y3iresx._.js +1 -1
  500. package/server/.next/server/chunks/ssr/src_app_(console)_(private)_ai_playground_playground-view_tsx_18ua5zn_a0mar._.js +1 -1
  501. package/server/.next/server/chunks/ssr/src_app_(console)_(private)_ai_providers_0jamu-nm6x-dh._.js +1 -1
  502. package/server/.next/server/chunks/ssr/src_app_(console)_(private)_ai_providers_1ru-30x6-uwu4._.js +1 -1
  503. package/server/.next/server/chunks/ssr/src_app_(console)_(private)_ai_quota_1kor9sy67qpiw._.js +1 -1
  504. package/server/.next/server/chunks/ssr/src_app_(console)_(private)_ai_quota_limits-form_tsx_1vouaaf560z_x._.js +1 -1
  505. package/server/.next/server/chunks/ssr/src_app_(console)_(private)_ai_usage_1v003vrkwk19w._.js +1 -1
  506. package/server/.next/server/chunks/ssr/src_app_(console)_(private)_ai_usage_limits-form_tsx_0sfk3ver58rqw._.js +1 -1
  507. package/server/.next/server/chunks/ssr/{src_app_(console)_1ppp9j5e2rtqf._.js → src_app_(console)_1olpa0osy74mq._.js} +2 -2
  508. package/server/.next/server/chunks/ssr/src_app_(console)_alerts_0j5xlt68kwg8x._.js +1 -1
  509. package/server/.next/server/chunks/ssr/src_app_(console)_alerts_1t61z2wktki-v._.js +1 -1
  510. package/server/.next/server/chunks/ssr/src_app_(console)_apps_[id]_088bs149wsgca._.js +1 -1
  511. package/server/.next/server/chunks/ssr/src_app_(console)_apps_[id]_1sfvku9ui1le-._.js +1 -1
  512. package/server/.next/server/chunks/ssr/src_app_(console)_backups_actions_ts_1vpytsdh0wc1f._.js +1 -1
  513. package/server/.next/server/chunks/ssr/src_app_(console)_backups_drive-buttons_tsx_00cku5r_z3jkg._.js +1 -1
  514. package/server/.next/server/chunks/ssr/src_app_(console)_backups_page_tsx_0o082iagq_14b._.js +1 -1
  515. package/server/.next/server/chunks/ssr/src_app_(console)_connections_1fahc65-97qla._.js +1 -1
  516. package/server/.next/server/chunks/ssr/src_app_(console)_connections_1qigx20w8bk53._.js +1 -1
  517. package/server/.next/server/chunks/ssr/src_app_(console)_connections_actions_ts_103blv4gzq76z._.js +1 -1
  518. package/server/.next/server/chunks/ssr/src_app_(console)_create_actions_ts_05-86qr6kfjey._.js +1 -1
  519. package/server/.next/server/chunks/ssr/src_app_(console)_dns_actions_ts_1jzn58xzwbukz._.js +1 -1
  520. package/server/.next/server/chunks/ssr/src_app_(console)_dns_record-actions_tsx_0cqmz51zcuebv._.js +1 -1
  521. package/server/.next/server/chunks/ssr/src_app_(console)_logs_log-viewer_tsx_0v3e4cflfk14w._.js +1 -1
  522. package/server/.next/server/chunks/ssr/src_app_(console)_monitor-actions_ts_10w3h7myk2ppi._.js +1 -1
  523. package/server/.next/server/chunks/ssr/src_app_(console)_palette-action_ts_0zyw9a9imev6p._.js +1 -1
  524. package/server/.next/server/chunks/ssr/src_app_(console)_repos_repo-list_tsx_1n1gcm4qfrfdt._.js +1 -1
  525. package/server/.next/server/chunks/ssr/src_app_(console)_sql_1icfsti04djqe._.js +2 -2
  526. package/server/.next/server/chunks/ssr/src_app_(console)_sql_actions_ts_1oqco02hw-3vp._.js +1 -1
  527. package/server/.next/server/chunks/ssr/src_app_(console)_supabase_0ib3m2ch9gu-4._.js +1 -1
  528. package/server/.next/server/chunks/ssr/src_app_(console)_supabase_pool-actions_ts_0nzd4vwy_9zzx._.js +1 -1
  529. package/server/.next/server/chunks/ssr/src_app_(console)_uptime_148phfjye0539._.js +1 -1
  530. package/server/.next/server/chunks/ssr/src_app_(console)_uptime_1mnnkfi-2zv-k._.js +1 -1
  531. package/server/.next/server/chunks/ssr/src_app_(console)_vercel-actions_ts_0wpk1yo9v632d._.js +1 -1
  532. package/server/.next/server/chunks/ssr/src_app_mfa_setup_setup-flow_tsx_1fpwygr2vdgnh._.js +1 -1
  533. package/server/.next/server/chunks/ssr/src_app_s_[slug]_page_tsx_0jjqe6py82mpb._.js +1 -1
  534. package/server/.next/server/chunks/ssr/src_app_setup_setup-form_tsx_0izoagdur96e1._.js +1 -1
  535. package/server/.next/server/chunks/ssr/{src_app_signin_124xn9wb2fasu._.js → src_app_signin_1y1xla7bcc5a1._.js} +2 -2
  536. package/server/.next/server/chunks/ssr/src_components_11x625pqq9ovs._.js +3 -0
  537. package/server/.next/server/chunks/ssr/src_components_create_create-dialog_tsx_1s_9clly_m1ru._.js +1 -1
  538. package/server/.next/server/chunks/ssr/src_lib_005l0kcpyu43o._.js +3 -3
  539. package/server/.next/server/chunks/ssr/src_lib_05ai1oj91p9w2._.js +2 -2
  540. package/server/.next/server/chunks/ssr/{src_lib_1l8ej-zoyyegd._.js → src_lib_0vl2-zp4wzw7n._.js} +2 -2
  541. package/server/.next/server/chunks/ssr/src_lib_0x4n8swwa3zn7._.js +1 -1
  542. package/server/.next/server/chunks/ssr/src_lib_1nkahiclbn55q._.js +1 -1
  543. package/server/.next/server/chunks/ssr/src_lib_collector_run_ts_0-q8is8s0y9cq._.js +1 -1
  544. package/server/.next/server/chunks/ssr/src_lib_data_logs-db_ts_1ddw07do12mmk._.js +2 -2
  545. package/server/.next/server/chunks/ssr/{src_lib_demo_20hj85e_64pp1._.js → src_lib_demo_20zjotuzm1lm8._.js} +2 -2
  546. package/server/.next/server/chunks/ssr/src_lib_demo_pool_ts_0fpn8acsdk64i._.js +9 -9
  547. package/server/.next/server/chunks/ssr/src_lib_time_ts_1qlwgp7nprvbi._.js +3 -0
  548. package/server/.next/server/chunks/ssr/src_lib_time_ts_1ualgyi3irm1z._.js +3 -0
  549. package/server/.next/server/chunks/ssr/src_private_0iy_wyg2p1jkn._.js +1 -1
  550. package/server/.next/server/chunks/ssr/src_private_actions_decide-form_tsx_1hngtxpyle3v8._.js +1 -1
  551. package/server/.next/server/chunks/ssr/src_private_ai_gateway_ts_04_5ao9914d0p._.js +1 -1
  552. package/server/.next/server/chunks/ssr/src_private_ai_providers_actions_ts_0wxa36ai6s5nn._.js +1 -1
  553. package/server/.next/server/chunks/ssr/src_private_ai_usage-analytics_ts_1bxba3xarzol0._.js +1 -1
  554. package/server/.next/server/chunks/ssr/src_private_ai_views-db_ts_1jbnr41mskha2._.js +1 -1
  555. package/server/.next/server/chunks/ssr/src_private_assist_advisor-notes_ts_0qkpm5c3la7fo._.js +4 -4
  556. package/server/.next/server/chunks/ssr/src_private_explorer_explorer_tsx_04m_tdottspjs._.js +1 -1
  557. package/server/.next/server/chunks/ssr/src_private_notes_notes-actions_ts_1g63g8u965fhc._.js +1 -1
  558. package/server/.next/server/middleware-build-manifest.js +3 -3
  559. package/server/.next/server/pages/404.html +1 -1
  560. package/server/.next/server/pages/500.html +1 -1
  561. package/server/.next/server/preview-props.json +3 -3
  562. package/server/.next/server/server-reference-manifest.js +1 -1
  563. package/server/.next/server/server-reference-manifest.json +133 -133
  564. package/server/.next/static/chunks/0-7by9f00qb4d.js +1 -0
  565. package/server/.next/static/chunks/{2k9ytb8jmg14_.js → 010bc8dzhxd_0.js} +1 -1
  566. package/server/.next/static/chunks/01oee9tptcjdb.js +1 -0
  567. package/server/.next/static/chunks/02uvde7i-78p5.js +1 -0
  568. package/server/.next/static/chunks/{2rdmebof0d_c4.js → 03fjh6klyhqv4.js} +1 -1
  569. package/server/.next/static/chunks/{1o_q7_4ulcq9x.js → 06lmwdlx-fkr8.js} +1 -1
  570. package/server/.next/static/chunks/{1ieazx9t3vl5p.js → 08w0t5q93_9mu.js} +1 -1
  571. package/server/.next/static/chunks/{1mlvn70-zqjvi.js → 0anet8wttkax1.js} +1 -1
  572. package/server/.next/static/chunks/0ao7kjrp6bp3l.js +1 -0
  573. package/server/.next/static/chunks/0b0rwd99q942r.js +1 -0
  574. package/server/.next/static/chunks/{1ts_fd_r1kcrv.js → 0dhgqjjm0zj6_.js} +1 -1
  575. package/server/.next/static/chunks/{2jlv5ekbb0wu2.js → 0dnjs3de2e_d1.js} +1 -1
  576. package/server/.next/static/chunks/{29p15vj15jcsb.js → 0ilml-p3iktnr.js} +1 -1
  577. package/server/.next/static/chunks/{43_va15lk2zc1.js → 0j_5norjm-kef.js} +1 -1
  578. package/server/.next/static/chunks/0nx0h-723nd_u.js +7 -0
  579. package/server/.next/static/chunks/0unx038_2rfsp.js +1 -0
  580. package/server/.next/static/chunks/0y_0w1ek5fakj.js +1 -0
  581. package/server/.next/static/chunks/1483hxa9hair1.js +1 -0
  582. package/server/.next/static/chunks/{1gmof0n5nswkk.js → 18gwem_5y9wnt.js} +1 -1
  583. package/server/.next/static/chunks/1aoqsoecu-fy_.js +1 -0
  584. package/server/.next/static/chunks/1endj3d7bewa1.js +1 -0
  585. package/server/.next/static/chunks/1j18pg23fzwv_.js +1 -0
  586. package/server/.next/static/chunks/{0wlc502815llk.js → 1k01h6men2hvb.js} +1 -1
  587. package/server/.next/static/chunks/{158-i6phe17yl.js → 1mdaf7mwcfafr.js} +1 -1
  588. package/server/.next/static/chunks/{0li9-xjc40g51.js → 1o4mdgq5lu1g_.js} +1 -1
  589. package/server/.next/static/chunks/{3dokgd9nungcr.js → 1t2iu6ufyxecz.js} +1 -1
  590. package/server/.next/static/chunks/{0wtboeftyamyk.js → 1vi8tyc1ou2o3.js} +1 -1
  591. package/server/.next/static/chunks/1xy80z39ducub.js +1 -0
  592. package/server/.next/static/chunks/1yb4_s_96v9tf.js +1 -0
  593. package/server/.next/static/chunks/{2v14aqfx8wv9o.js → 2-8ra6gmaw_pb.js} +1 -1
  594. package/server/.next/static/chunks/{1-1hfgat2l_o9.js → 2cmw27buw9oce.js} +1 -1
  595. package/server/.next/static/chunks/{3f5sxz8awpdog.js → 2lv5qmgi8nm4h.js} +1 -1
  596. package/server/.next/static/chunks/2mj8z5a9dz7bh.js +1 -0
  597. package/server/.next/static/chunks/{1gb8jvw-g7fr7.js → 2n-h6_0i3mpxo.js} +1 -1
  598. package/server/.next/static/chunks/{2cjfogw85k3h-.js → 2pbnh717ldzfl.js} +1 -1
  599. package/server/.next/static/chunks/2qltilq3pn4ia.js +1 -0
  600. package/server/.next/static/chunks/{30fczssqw6xys.js → 2ufr23d_eyosj.js} +1 -1
  601. package/server/.next/static/chunks/2wqgz94tksucm.js +1 -0
  602. package/server/.next/static/chunks/{3tqh7fwtd_k_l.js → 2z6a725ntvlr6.js} +2 -2
  603. package/server/.next/static/chunks/{2fo6iuxb0ec7f.js → 2zdjxqgm-44u1.js} +1 -1
  604. package/server/.next/static/chunks/{026asl66kuq3f.js → 340ecjh1jzqjd.js} +15 -15
  605. package/server/.next/static/chunks/{2z1xy8l4s3usi.js → 3alfhqlczff2s.js} +1 -1
  606. package/server/.next/static/chunks/{36ureqoyz5e06.js → 3col9buetdxvh.js} +2 -2
  607. package/server/.next/static/chunks/{1zi37go-xtasg.js → 3o45i7xbzm0w-.js} +1 -1
  608. package/server/.next/static/chunks/{0cannaigw8lhi.js → 3o7se0ypyiqmz.js} +1 -1
  609. package/server/.next/static/chunks/{1c4fx4kipvnqz.js → 3oe302ug_esoe.js} +1 -1
  610. package/server/.next/static/chunks/3s7hj7g12rmuh.js +1 -0
  611. package/server/.next/static/chunks/{2fj4o7-stsvht.js → 3uujo4bht1tqo.js} +1 -1
  612. package/server/.next/static/chunks/3w445wy3mpp2f.js +1 -0
  613. package/server/.next/static/chunks/{2kmerzslng988.js → 3ypdfkwyovory.js} +1 -1
  614. package/server/.next/server/chunks/[root-of-the-server]__0grnl7ncqcjft._.js +0 -3
  615. package/server/.next/server/chunks/[root-of-the-server]__0m8w2-7618scn._.js +0 -3
  616. package/server/.next/server/chunks/[root-of-the-server]__0p_b0m2cstlrl._.js +0 -3
  617. package/server/.next/server/chunks/[root-of-the-server]__0zxjft8y2r575._.js +0 -3
  618. package/server/.next/server/chunks/[root-of-the-server]__114vjjaqb2wyv._.js +0 -3
  619. package/server/.next/server/chunks/[root-of-the-server]__12uyws-qe6wxs._.js +0 -3
  620. package/server/.next/server/chunks/[root-of-the-server]__139pgc0wpc7kg._.js +0 -3
  621. package/server/.next/server/chunks/[root-of-the-server]__1bwgi7nn5-hc3._.js +0 -3
  622. package/server/.next/server/chunks/[root-of-the-server]__1k8s02gwythps._.js +0 -3
  623. package/server/.next/server/chunks/[root-of-the-server]__1lf_lo1wqcbcg._.js +0 -3
  624. package/server/.next/server/chunks/[root-of-the-server]__1niiijc82bgoj._.js +0 -3
  625. package/server/.next/server/chunks/[root-of-the-server]__1on_3p53yn6fs._.js +0 -3
  626. package/server/.next/server/chunks/[root-of-the-server]__1q90luznbe9-l._.js +0 -3
  627. package/server/.next/server/chunks/[root-of-the-server]__1r15vmrh2r06l._.js +0 -3
  628. package/server/.next/server/chunks/[root-of-the-server]__1woerg3tb4ls3._.js +0 -3
  629. package/server/.next/server/chunks/[root-of-the-server]__1zaomh_4901_f._.js +0 -3
  630. package/server/.next/server/chunks/[root-of-the-server]__20lwsd6a4wnpe._.js +0 -3
  631. package/server/.next/server/chunks/_03bua_9n4apok._.js +0 -3
  632. package/server/.next/server/chunks/_08y82qdosn7ga._.js +0 -3
  633. package/server/.next/server/chunks/_1bcsmpznxhk9h._.js +0 -3
  634. package/server/.next/server/chunks/_1he3nioua8ee5._.js +0 -3
  635. package/server/.next/server/chunks/_1lpcbqj4uzrsh._.js +0 -3
  636. package/server/.next/server/chunks/src_0l-no1yc1_izn._.js +0 -3
  637. package/server/.next/server/chunks/src_156ewlek-4a4z._.js +0 -3
  638. package/server/.next/server/chunks/src_lib_0-ylqsh7whlj2._.js +0 -3
  639. package/server/.next/server/chunks/src_lib_0f0p6-l5vvduu._.js +0 -3
  640. package/server/.next/server/chunks/src_lib_15a3m-j_urkkp._.js +0 -3
  641. package/server/.next/server/chunks/ssr/[root-of-the-server]__06s-dfcfuperv._.js +0 -3
  642. package/server/.next/server/chunks/ssr/[root-of-the-server]__07or1m2vwon1m._.js +0 -3
  643. package/server/.next/server/chunks/ssr/[root-of-the-server]__0d9lwldljqtvx._.js +0 -3
  644. package/server/.next/server/chunks/ssr/[root-of-the-server]__0uklr553mp86_._.js +0 -3
  645. package/server/.next/server/chunks/ssr/[root-of-the-server]__1cykncw1_xcno._.js +0 -3
  646. package/server/.next/server/chunks/ssr/[root-of-the-server]__1ih2a_fbqu7ko._.js +0 -3
  647. package/server/.next/server/chunks/ssr/[root-of-the-server]__1j7_a902k_8es._.js +0 -3
  648. package/server/.next/server/chunks/ssr/[root-of-the-server]__1ofzjllv-b0o0._.js +0 -3
  649. package/server/.next/server/chunks/ssr/_040ixxsgfs0vi._.js +0 -3
  650. package/server/.next/server/chunks/ssr/_0ux6eo_w1x155._.js +0 -3
  651. package/server/.next/server/chunks/ssr/_12o9qqjoik4q4._.js +0 -3
  652. package/server/.next/server/chunks/ssr/_1k2q3yt1h6cfs._.js +0 -3
  653. package/server/.next/server/chunks/ssr/_1zhtvg8t3jtxe._.js +0 -3
  654. package/server/.next/server/chunks/ssr/_200p6me5_kp2j._.js +0 -3
  655. package/server/.next/server/chunks/ssr/src_00s82lfm2ga7-._.js +0 -3
  656. package/server/.next/server/chunks/ssr/src_13hsrg6rdvh-d._.js +0 -3
  657. package/server/.next/server/chunks/ssr/src_1xgsz_do2xpr2._.js +0 -3
  658. package/server/.next/server/chunks/ssr/src_components_shell_shell_tsx_1cpq-hbch_dvj._.js +0 -3
  659. package/server/.next/server/chunks/ssr/src_lib_0y40wht-o-oc2._.js +0 -3
  660. package/server/.next/static/chunks/03qto0oyf2r1n.js +0 -1
  661. package/server/.next/static/chunks/0c7pskzfstcdh.js +0 -1
  662. package/server/.next/static/chunks/0n_l4a3za5-q8.js +0 -1
  663. package/server/.next/static/chunks/0t96fqp1vsmrp.js +0 -1
  664. package/server/.next/static/chunks/1sm8wxvlpowwg.js +0 -1
  665. package/server/.next/static/chunks/1teh52nh5dujq.js +0 -1
  666. package/server/.next/static/chunks/1v4hl1z0y1npd.js +0 -1
  667. package/server/.next/static/chunks/1vh2psoqw3ddc.js +0 -1
  668. package/server/.next/static/chunks/1xau8pf40_upi.js +0 -7
  669. package/server/.next/static/chunks/1z2rcngn3-7i5.js +0 -1
  670. package/server/.next/static/chunks/210qrsqvmgaet.js +0 -1
  671. package/server/.next/static/chunks/2llric-1orr3y.js +0 -1
  672. package/server/.next/static/chunks/2wb9a1xth0yhf.js +0 -1
  673. package/server/.next/static/chunks/34gs6c2dsgtqy.js +0 -1
  674. package/server/.next/static/chunks/3ag6t3ta58rih.js +0 -1
  675. package/server/.next/static/chunks/3gkta99h3_5i2.js +0 -1
  676. /package/server/.next/static/{xCga6YpZus71dK3aq8Q4H → n3Kt7dFNHr9KDw7DgGz0m}/_buildManifest.js +0 -0
  677. /package/server/.next/static/{xCga6YpZus71dK3aq8Q4H → n3Kt7dFNHr9KDw7DgGz0m}/_clientMiddlewareManifest.js +0 -0
  678. /package/server/.next/static/{xCga6YpZus71dK3aq8Q4H → n3Kt7dFNHr9KDw7DgGz0m}/_ssgManifest.js +0 -0
@@ -1,21 +1,21 @@
1
1
  module.exports=[380167,e=>{"use strict";var t=e.i(533102),a=e.i(406212),r=e.i(200123),n=e.i(595262);async function s(){let e=await (0,a.db)().execute(t.sql`
2
2
  select pid, state, extract(epoch from now() - state_change)::int as idle_s,
3
3
  coalesce(extract(epoch from now() - query_start)::int, 0) as run_s, left(query, 400) as query
4
- from pg_stat_activity where usename = current_user and pid <> pg_backend_pid()`);return(0,r.f)(e).map(e=>{var t;let a;return{pid:Number(e.pid),state:e.state,idleS:Number(e.idle_s),runS:Number(e.run_s),table:(t=e.query,(a=/(?:from|into|update|join)\s+"?ops"?\."?([a-z_]+)"?/i.exec(t??""))?a[1]:null)}})}async function o(e=10,i=10){let l=await s(),u=function(e,t=10,a=10){let r=function(e){let t=new Set,a=[];for(let r of e.filter(e=>"idle"===e.state&&e.table).sort((e,t)=>e.idleS-t.idleS))t.has(r.table)?r.idleS>=60&&a.push(r):t.add(r.table);return a}(e),n=e.filter(e=>!r.includes(e)),s=Math.max(0,n.length+1-t);return s?[...r,...[...n.filter(e=>"idle"===e.state&&e.idleS>=a).sort((e,t)=>t.idleS-e.idleS),...n.filter(e=>"idle"!==e.state&&e.runS>60).sort((e,t)=>t.runS-e.runS)].slice(0,s)]:r}(l,e,i),d=0;if(u.length){let e=u.map(e=>e.pid).filter(e=>Number.isInteger(e)&&e>0),n=await (0,a.db)().execute(t.sql`select pg_terminate_backend(pid) as ok from unnest(array[${t.sql.raw(e.join(","))}]::int[]) as pid`);d=(0,r.f)(n).filter(e=>e.ok).length}let c=function(e){let t=new Map;for(let a of e)t.set(a.table??"unknown",(t.get(a.table??"unknown")??0)+1);return[...t.entries()].sort((e,t)=>t[1]-e[1]).map(([e,t])=>`${e} \xd7${t}`)}(u);return d>0&&(console.info(`pool guard: ${l.length+1} connections, closed ${d} (${c.join(", ")})`),await (0,n.f)({kind:"ok",message:`Pool guard: closed ${d} of ${l.length+1} database connections`,detail:c.join(", ").slice(0,300),resourceId:null,actorUserId:null}).catch(()=>void 0)),{total:l.length+1,trimmed:d,culprits:c}}var i=e.i(90879),l=e.i(366171);let u=[{name:"pool-guard",run:async()=>{(0,i.isCloud)()&&await o().catch(e=>console.warn("pool guard failed:",e instanceof Error?e.message.slice(0,160):"error"))}},{name:"supabase-metrics",run:async(e,t)=>{await (0,l.E)(e,t?.deadline??e.getTime()+3e4)}}];var d=e.i(336763),c=e.i(157406),p=e.i(668304);function f(e){if((0,i.isCloud)())for(let t of new Set(e))try{let e;e=t,(0,p.revalidateTag)(e,{expire:0})}catch(e){console.warn(`cache: couldn't expire ${t}: ${e instanceof Error?e.message.slice(0,120):"unknown"}`)}}var m=e.i(188477),h=e.i(530298),w=e.i(396918),g=e.i(727028),b=e.i(760859);let k="Watchbell backups",y="Watchpost backups",v=["Overview","Applications","Incidents","Databases","Domains"],I=["January","February","March","April","May","June","July","August","September","October","November","December"];function $(e){let t=new Date(e.getTime()+252e5);return`${t.getUTCFullYear()}-${String(t.getUTCMonth()+1).padStart(2,"0")}`}function A(e){let[t,a]=e.split("-").map(Number);return{start:new Date(Date.UTC(t,a-1,1)-252e5),end:new Date(Date.UTC(t,a,1)-252e5)}}function S(e){let[t,a]=e.split("-").map(Number);return 1===a?`${t-1}-12`:`${t}-${String(a-1).padStart(2,"0")}`}function D(e){let[t,a]=e.split("-").map(Number);return`${I[a-1]} ${t}`}let T=e=>`Watchbell \xb7 ${e}`;function E(e){if(!e)return"";let t=new Date(e.getTime()+252e5),a=e=>String(e).padStart(2,"0");return`${t.getUTCFullYear()}-${a(t.getUTCMonth()+1)}-${a(t.getUTCDate())} ${a(t.getUTCHours())}:${a(t.getUTCMinutes())}`}let x=(e,t)=>e>0?Math.round((e-t)/e*1e5)/1e3:"",z=e=>{if(!e.length)return null;let t=[...e].sort((e,t)=>e-t),a=Math.floor(t.length/2);return t.length%2?t[a]:Math.round((t[a-1]+t[a])/2)},R=e=>e.reduce((e,t)=>e+t,0),M=e=>"production"===e.target,j=e=>"ERROR"===e.state,_={supabase_project:"Supabase",neon_project:"Neon",firestore:"Firebase"};function C(e,t){if(!e)return"";let a=Date.parse(e);return Number.isFinite(a)?Math.floor((a-t.getTime())/864e5):""}let q=e=>null===e?"":Math.round(e/1048576*10)/10;function P(e){if(null===e)return"";if("number"==typeof e||"boolean"==typeof e)return String(e);let t=/^[=+\-@\t\r]/.test(e)?`'${e}`:e;return/[",\r\n]/.test(t)?`"${t.replace(/"/g,'""')}"`:t}let N=["record","at","subject","resource_id","checks","failures","p50_ms","p95_ms","max_ms","status_5xx","maintenance","type","kind","reason","count","message","detail"];var O=e.i(803237),U=e.i(788264),B=e.i(93387),F=e.i(857799),G=e.i(503313),W=e.i(827439);let L="backup.folder";async function H(){let[e]=await (0,a.db)().select().from(h.accounts).where((0,d.eq)(h.accounts.provider,"drive")).orderBy((0,w.asc)(h.accounts.createdAt)).limit(1);if(!e)return null;let t=(0,O.V)({ciphertext:e.credentialCiphertext,iv:e.credentialIv},(0,B.serverEnv)().OPS_ENCRYPTION_KEY);return{id:e.id,status:e.status,lastError:e.lastError,lastTestAt:e.lastTestAt,refreshToken:t}}async function V(e,t){let r=new Date;await (0,a.db)().update(h.accounts).set({...t,lastTestAt:r,updatedAt:r}).where((0,d.eq)(h.accounts.id,e))}async function J(){return(0,a.db)().select().from(h.backups).orderBy((0,w.desc)(h.backups.month)).limit(120)}async function Y(e){let[t]=await (0,a.db)().select().from(h.backups).where((0,d.eq)(h.backups.month,e)).limit(1);return t??null}async function K(e,t){let r=new Date;await (0,a.db)().insert(h.backups).values({month:e,...t,updatedAt:r}).onConflictDoUpdate({target:h.backups.month,set:{...t,updatedAt:r}})}async function X(){let[e]=await (0,a.db)().select().from(h.settings).where((0,d.eq)(h.settings.key,L)).limit(1),t=e?.value;return"string"==typeof t?.id&&t.id?{id:t.id,name:"string"==typeof t.name&&t.name?t.name:null}:null}async function Q(e,t){let r=t?{id:e,name:t}:{id:e};await (0,a.db)().insert(h.settings).values({key:L,value:r}).onConflictDoUpdate({target:h.settings.key,set:{value:r,updatedAt:new Date}})}let Z=e=>"number"==typeof e&&Number.isFinite(e)?e:null;async function ee(e,t,r){let{start:n,end:s}=A(e),o=t&&r<s?r:s,[i,l,u,c,p,f,m,g]=await Promise.all([(0,G.f)(),(0,a.db)().select({id:h.resources.id,name:h.resources.name}).from(h.resources).where((0,d.and)((0,d.eq)(h.resources.kind,"app"),(0,d.eq)(h.resources.monitored,!0),(0,d.isNull)(h.resources.goneAt))).orderBy((0,w.asc)(h.resources.name)).limit(500),(0,a.db)().select({r:h.rollupsHourly,appId:h.monitors.resourceId,app:h.resources.name,url:h.monitors.url,kind:h.monitors.kind,name:h.monitors.name}).from(h.rollupsHourly).innerJoin(h.monitors,(0,d.eq)(h.monitors.id,h.rollupsHourly.monitorId)).innerJoin(h.resources,(0,d.eq)(h.resources.id,h.monitors.resourceId)).where((0,d.and)((0,d.gte)(h.rollupsHourly.hour,n),(0,d.lt)(h.rollupsHourly.hour,o))).orderBy((0,w.asc)(h.rollupsHourly.hour)).limit(5e4),(0,a.db)().select({e:h.events,resource:h.resources.name}).from(h.events).leftJoin(h.resources,(0,d.eq)(h.resources.id,h.events.resourceId)).where((0,d.and)((0,d.gte)(h.events.at,n),(0,d.lt)(h.events.at,o))).orderBy((0,w.asc)(h.events.at)).limit(5e4),(0,a.db)().select().from(h.alerts).where((0,d.and)((0,d.gte)(h.alerts.startedAt,n),(0,d.lt)(h.alerts.startedAt,o))).orderBy((0,w.asc)(h.alerts.startedAt)).limit(5e3),(0,a.db)().select({appId:h.deployments.resourceId,target:h.deployments.target,state:h.deployments.state,createdAt:h.deployments.createdAtProvider}).from(h.deployments).where((0,d.and)((0,d.gte)(h.deployments.createdAtProvider,n),(0,d.lt)(h.deployments.createdAtProvider,o))).limit(1e4),(0,a.db)().select({r:h.resources,s:h.snapshots,account:h.accounts.label}).from(h.resources).innerJoin(h.accounts,(0,d.eq)(h.accounts.id,h.resources.accountId)).leftJoin(h.snapshots,(0,d.eq)(h.snapshots.resourceId,h.resources.id)).where((0,d.and)((0,d.inArray)(h.resources.kind,[...F.H]),(0,d.eq)(h.resources.monitored,!0),(0,d.isNull)(h.resources.goneAt))).limit(500),(0,W.p)()]),b=m.map(({r:e,s:t,account:a})=>{let r=t?.data??{},n=e.kind,s="neon_project"===n?(0,U.k)(U.s,r):null,o="supabase_project"===n?Z((0,U.k)(U.B,r).sizeBytes):s?(s.branches??[]).reduce((e,t)=>null===t.logicalSize?e:(e??0)+t.logicalSize,null):null;return{id:e.id,kind:n,account:a,state:t?.state??"unknown",sizeBytes:o,cuHours:s&&null!==Z(s.computeSeconds)?Math.round(s.computeSeconds/3600*10)/10:null,reads:"firestore"===n?Z((0,U.k)(U.w,r).reads):null}}),k=g.map(e=>({name:e.name,app:e.appName,tlsExpires:e.tls?.notAfter??null,domainExpires:e.rdap?.expiresAt??null,registrar:e.rdap?.registrar??null}));return{month:e,partial:t,generatedAt:r,book:i,apps:l,rollups:u.map(({r:e,appId:t,app:a,url:r,kind:n,name:s})=>({monitorId:e.monitorId,appId:t,app:a,path:(e=>{if("heartbeat"===e.kind)return` heartbeat ${e.name??""}`.trimEnd();try{return new URL(e.url).pathname}catch{return e.url}})({kind:n,name:s,url:r}),hour:e.hour,checks:e.checks,failures:e.failures,p50Ms:e.p50Ms,p95Ms:e.p95Ms,maxMs:e.maxMs,status5xx:e.status5xx,maintenance:e.maintenance})),events:c.map(({e,resource:t})=>({at:e.at,resourceId:e.resourceId,resource:t,type:e.type,kind:e.kind,reason:e.reason,count:e.count,message:e.message,detail:e.detail})),alerts:p.map(e=>({ruleKey:e.ruleKey,severity:e.severity,title:e.title,message:e.message,resourceId:e.resourceId,startedAt:e.startedAt,resolvedAt:e.resolvedAt})),deployments:f,databases:b,domains:k}}var et=e.i(75064),ea=e.i(909592),er=e.i(684330),en=e.i(492973),es=e.i(246517),eo=e.i(260417),ei=e.i(978071);let el="application/vnd.google-apps.folder",eu="https://www.googleapis.com/drive/v3/files",ed="https://www.googleapis.com/upload/drive/v3/files",ec="https://sheets.googleapis.com/v4/spreadsheets",ep=et.z.object({error:et.z.object({errors:ea.z.array(er.z.looseObject({reason:en.z.string().optional()})).optional(),status:en.z.string().optional()})});async function ef(e,t,a,r,n){let s,o,i=n.timeoutMs??1e4,l={Authorization:`Bearer ${a}`,Accept:"application/json"};r?.raw?(l["Content-Type"]=r.contentType??"application/octet-stream",s=new Uint8Array(r.raw)):r&&void 0!==r.json&&(l["Content-Type"]="application/json",s=JSON.stringify(r.json));try{o=await (n.fetch??fetch)(t,{method:e,headers:l,body:s,signal:AbortSignal.timeout(i),cache:"no-store"})}catch(e){return{ok:!1,kind:"transient",error:e instanceof DOMException&&("TimeoutError"===e.name||"AbortError"===e.name)?`Google Drive didn't answer within ${Math.round(i/1e3)} seconds.`:"Couldn't reach Google Drive."}}let u=await o.json().catch(()=>null);if(o.ok)return{ok:!0,data:u};let d=ep.safeParse(u),c=d.success?d.data.error.errors?.find(e=>e.reason)?.reason??d.data.error.status:void 0;return 401===o.status?{ok:!1,kind:"auth",status:401,error:"Google Drive rejected the access token (401)."}:404===o.status?{ok:!1,kind:"missing",status:404,error:"Google Drive doesn't know this file (404)."}:403===o.status&&"storageQuotaExceeded"===c?{ok:!1,kind:"full",status:403,error:"Your Google Drive is full. Free some space; the next run tries again."}:429===o.status||o.status>=500||403===o.status&&/rateLimit/i.test(c??"")?{ok:!1,kind:"transient",status:o.status,error:`Google Drive is busy (${o.status}). The next run tries again.`}:{ok:!1,kind:"format",status:o.status,error:`Google Drive refused the request (${o.status}${c?` ${c}`:""}).`}}let em=et.z.object({id:en.z.string().min(1)}),eh=e=>({ok:!1,kind:"format",error:`Google Drive answered ${e} in a format the console doesn't recognise.`});function ew(e,t){if(!e.ok)return e;let a=em.safeParse(e.data);return a.success?{ok:!0,data:a.data.id}:eh(t)}async function eg(e,t,a={}){let r=`name = '${t.replace(/['\\]/g,"\\$&")}' and mimeType = '${el}' and trashed = false`,n=await ef("GET",`${eu}?${new URLSearchParams({q:r,fields:"files(id,name)",spaces:"drive",pageSize:"10"})}`,e,null,a);if(!n.ok)return n;let s=et.z.object({files:ea.z.array(em)}).safeParse(n.data);return s.success?{ok:!0,data:s.data.files[0]?.id??null}:eh("the folder search")}async function eb(e,t,a={}){let r=await ef("GET",`${eu}/${encodeURIComponent(t)}?fields=id,trashed,name`,e,null,a);if(!r.ok)return"missing"===r.kind?{ok:!0,data:{usable:!1,name:null}}:r;let n=et.z.object({id:en.z.string(),trashed:es.z.boolean().optional(),name:en.z.string().optional()}).safeParse(r.data);return n.success?{ok:!0,data:{usable:!n.data.trashed,name:n.data.name?.trim()||null}}:eh("the folder")}async function ek(e,t,a={}){return ew(await ef("POST",`${eu}?fields=id`,e,{json:{name:t,mimeType:el}},a),"the new folder")}async function ey(e,t,a,r={}){return ew(await ef("POST",`${eu}?fields=id`,e,{json:{name:t,mimeType:"application/vnd.google-apps.spreadsheet",parents:[a]}},r),"the new spreadsheet")}let ev=e=>`'${e.replace(/'/g,"''")}'`;async function eI(e,t,a,r={}){let n=await ef("GET",`${ec}/${encodeURIComponent(t)}?fields=sheets.properties(sheetId,title)`,e,null,r);if(!n.ok)return n;let s=et.z.object({sheets:ea.z.array(et.z.object({properties:et.z.object({sheetId:eo.z.number(),title:en.z.string()})})).default([])}).safeParse(n.data);if(!s.success)return eh("the spreadsheet's tabs");let o=s.data.sheets.map(e=>e.properties),i=new Set(o.map(e=>e.title)),l=[],u=a.filter(e=>!i.has(e)),d=o[0];for(let e of(d&&u.length&&!a.includes(d.title)&&(l.push({updateSheetProperties:{properties:{sheetId:d.sheetId,title:u[0]},fields:"title"}}),u.shift()),u))l.push({addSheet:{properties:{title:e}}});if(!l.length)return{ok:!0,data:void 0};let c=await ef("POST",`${ec}/${encodeURIComponent(t)}:batchUpdate`,e,{json:{requests:l}},r);return c.ok?{ok:!0,data:void 0}:c}async function e$(e,t,a,r={}){let n=encodeURIComponent(t),s=await ef("POST",`${ec}/${n}/values:batchClear`,e,{json:{ranges:a.map(e=>ev(e.title))}},r);if(!s.ok)return s;let o=a.map(e=>({range:`${ev(e.title)}!A1`,majorDimension:"ROWS",values:e.rows.map(e=>e.map(e=>e??""))})),i=await ef("POST",`${ec}/${n}/values:batchUpdate`,e,{json:{valueInputOption:"RAW",data:o}},r);return i.ok?{ok:!0,data:void 0}:i}let eA="watchbell-backup-part";function eS(e,t,a){return Buffer.concat([Buffer.from(`--${eA}\r
4
+ from pg_stat_activity where usename = current_user and pid <> pg_backend_pid()`);return(0,r.f)(e).map(e=>{var t;let a;return{pid:Number(e.pid),state:e.state,idleS:Number(e.idle_s),runS:Number(e.run_s),table:(t=e.query,(a=/(?:from|into|update|join)\s+"?ops"?\."?([a-z_]+)"?/i.exec(t??""))?a[1]:null)}})}async function o(e=10,i=10){let l=await s(),u=function(e,t=10,a=10){let r=function(e){let t=new Set,a=[];for(let r of e.filter(e=>"idle"===e.state&&e.table).sort((e,t)=>e.idleS-t.idleS))t.has(r.table)?r.idleS>=60&&a.push(r):t.add(r.table);return a}(e),n=e.filter(e=>!r.includes(e)),s=Math.max(0,n.length+1-t);return s?[...r,...[...n.filter(e=>"idle"===e.state&&e.idleS>=a).sort((e,t)=>t.idleS-e.idleS),...n.filter(e=>"idle"!==e.state&&e.runS>60).sort((e,t)=>t.runS-e.runS)].slice(0,s)]:r}(l,e,i),d=0;if(u.length){let e=u.map(e=>e.pid).filter(e=>Number.isInteger(e)&&e>0),n=await (0,a.db)().execute(t.sql`select pg_terminate_backend(pid) as ok from unnest(array[${t.sql.raw(e.join(","))}]::int[]) as pid`);d=(0,r.f)(n).filter(e=>e.ok).length}let c=function(e){let t=new Map;for(let a of e)t.set(a.table??"unknown",(t.get(a.table??"unknown")??0)+1);return[...t.entries()].sort((e,t)=>t[1]-e[1]).map(([e,t])=>`${e} \xd7${t}`)}(u);return d>0&&(console.info(`pool guard: ${l.length+1} connections, closed ${d} (${c.join(", ")})`),await (0,n.f)({kind:"ok",message:`Pool guard: closed ${d} of ${l.length+1} database connections`,detail:c.join(", ").slice(0,300),resourceId:null,actorUserId:null}).catch(()=>void 0)),{total:l.length+1,trimmed:d,culprits:c}}var i=e.i(90879),l=e.i(366171);let u=[{name:"pool-guard",run:async()=>{(0,i.isCloud)()&&await o().catch(e=>console.warn("pool guard failed:",e instanceof Error?e.message.slice(0,160):"error"))}},{name:"supabase-metrics",run:async(e,t)=>{await (0,l.E)(e,t?.deadline??e.getTime()+3e4)}}];var d=e.i(336763),c=e.i(157406),p=e.i(668304);function f(e){if((0,i.isCloud)())for(let t of new Set(e))try{let e;e=t,(0,p.revalidateTag)(e,{expire:0})}catch(e){console.warn(`cache: couldn't expire ${t}: ${e instanceof Error?e.message.slice(0,120):"unknown"}`)}}var m=e.i(188477),h=e.i(530298),w=e.i(396918),g=e.i(727028),b=e.i(728335),k=e.i(760859);let y="Watchbell backups",v="Watchpost backups",I=["Overview","Applications","Incidents","Databases","Domains"],$=["January","February","March","April","May","June","July","August","September","October","November","December"];function A(e){let t=(0,b.zonedParts)(e);return`${t.year}-${String(t.month).padStart(2,"0")}`}function S(e){return{start:(0,b.dayStart)(`${e}-01`),end:(0,b.dayStart)(`${function(e){let[t,a]=e.split("-").map(Number);return 12===a?`${t+1}-01`:`${t}-${String(a+1).padStart(2,"0")}`}(e)}-01`)}}function D(e){let[t,a]=e.split("-").map(Number);return 1===a?`${t-1}-12`:`${t}-${String(a-1).padStart(2,"0")}`}function T(e){let[t,a]=e.split("-").map(Number);return`${$[a-1]} ${t}`}let E=e=>`Watchbell \xb7 ${e}`;function x(e){if(!e)return"";let t=(0,b.zonedParts)(e),a=e=>String(e).padStart(2,"0");return`${t.year}-${a(t.month)}-${a(t.day)} ${a(t.hour)}:${a(t.minute)}`}let z=(e,t)=>e>0?Math.round((e-t)/e*1e5)/1e3:"",R=e=>{if(!e.length)return null;let t=[...e].sort((e,t)=>e-t),a=Math.floor(t.length/2);return t.length%2?t[a]:Math.round((t[a-1]+t[a])/2)},j=e=>e.reduce((e,t)=>e+t,0),_=e=>"production"===e.target,M=e=>"ERROR"===e.state,q={supabase_project:"Supabase",neon_project:"Neon",firestore:"Firebase"};function N(e,t){if(!e)return"";let a=Date.parse(e);return Number.isFinite(a)?Math.floor((a-t.getTime())/864e5):""}let P=e=>null===e?"":Math.round(e/1048576*10)/10;function C(e){if(null===e)return"";if("number"==typeof e||"boolean"==typeof e)return String(e);let t=/^[=+\-@\t\r]/.test(e)?`'${e}`:e;return/[",\r\n]/.test(t)?`"${t.replace(/"/g,'""')}"`:t}let O=["record","at","subject","resource_id","checks","failures","p50_ms","p95_ms","max_ms","status_5xx","maintenance","type","kind","reason","count","message","detail"];var B=e.i(803237),F=e.i(788264),G=e.i(93387),U=e.i(857799),L=e.i(503313),W=e.i(827439);let H="backup.folder";async function V(){let[e]=await (0,a.db)().select().from(h.accounts).where((0,d.eq)(h.accounts.provider,"drive")).orderBy((0,w.asc)(h.accounts.createdAt)).limit(1);if(!e)return null;let t=(0,B.V)({ciphertext:e.credentialCiphertext,iv:e.credentialIv},(0,G.serverEnv)().OPS_ENCRYPTION_KEY);return{id:e.id,status:e.status,lastError:e.lastError,lastTestAt:e.lastTestAt,refreshToken:t}}async function J(e,t){let r=new Date;await (0,a.db)().update(h.accounts).set({...t,lastTestAt:r,updatedAt:r}).where((0,d.eq)(h.accounts.id,e))}async function K(){return(0,a.db)().select().from(h.backups).orderBy((0,w.desc)(h.backups.month)).limit(120)}async function Y(e){let[t]=await (0,a.db)().select().from(h.backups).where((0,d.eq)(h.backups.month,e)).limit(1);return t??null}async function X(e,t){let r=new Date;await (0,a.db)().insert(h.backups).values({month:e,...t,updatedAt:r}).onConflictDoUpdate({target:h.backups.month,set:{...t,updatedAt:r}})}async function Q(){let[e]=await (0,a.db)().select().from(h.settings).where((0,d.eq)(h.settings.key,H)).limit(1),t=e?.value;return"string"==typeof t?.id&&t.id?{id:t.id,name:"string"==typeof t.name&&t.name?t.name:null}:null}async function Z(e,t){let r=t?{id:e,name:t}:{id:e};await (0,a.db)().insert(h.settings).values({key:H,value:r}).onConflictDoUpdate({target:h.settings.key,set:{value:r,updatedAt:new Date}})}let ee=e=>"number"==typeof e&&Number.isFinite(e)?e:null;async function et(e,t,r){let{start:n,end:s}=S(e),o=t&&r<s?r:s,[i,l,u,c,p,f,m,g]=await Promise.all([(0,L.f)(),(0,a.db)().select({id:h.resources.id,name:h.resources.name}).from(h.resources).where((0,d.and)((0,d.eq)(h.resources.kind,"app"),(0,d.eq)(h.resources.monitored,!0),(0,d.isNull)(h.resources.goneAt))).orderBy((0,w.asc)(h.resources.name)).limit(500),(0,a.db)().select({r:h.rollupsHourly,appId:h.monitors.resourceId,app:h.resources.name,url:h.monitors.url,kind:h.monitors.kind,name:h.monitors.name}).from(h.rollupsHourly).innerJoin(h.monitors,(0,d.eq)(h.monitors.id,h.rollupsHourly.monitorId)).innerJoin(h.resources,(0,d.eq)(h.resources.id,h.monitors.resourceId)).where((0,d.and)((0,d.gte)(h.rollupsHourly.hour,n),(0,d.lt)(h.rollupsHourly.hour,o))).orderBy((0,w.asc)(h.rollupsHourly.hour)).limit(5e4),(0,a.db)().select({e:h.events,resource:h.resources.name}).from(h.events).leftJoin(h.resources,(0,d.eq)(h.resources.id,h.events.resourceId)).where((0,d.and)((0,d.gte)(h.events.at,n),(0,d.lt)(h.events.at,o))).orderBy((0,w.asc)(h.events.at)).limit(5e4),(0,a.db)().select().from(h.alerts).where((0,d.and)((0,d.gte)(h.alerts.startedAt,n),(0,d.lt)(h.alerts.startedAt,o))).orderBy((0,w.asc)(h.alerts.startedAt)).limit(5e3),(0,a.db)().select({appId:h.deployments.resourceId,target:h.deployments.target,state:h.deployments.state,createdAt:h.deployments.createdAtProvider}).from(h.deployments).where((0,d.and)((0,d.gte)(h.deployments.createdAtProvider,n),(0,d.lt)(h.deployments.createdAtProvider,o))).limit(1e4),(0,a.db)().select({r:h.resources,s:h.snapshots,account:h.accounts.label}).from(h.resources).innerJoin(h.accounts,(0,d.eq)(h.accounts.id,h.resources.accountId)).leftJoin(h.snapshots,(0,d.eq)(h.snapshots.resourceId,h.resources.id)).where((0,d.and)((0,d.inArray)(h.resources.kind,[...U.H]),(0,d.eq)(h.resources.monitored,!0),(0,d.isNull)(h.resources.goneAt))).limit(500),(0,W.p)()]),b=m.map(({r:e,s:t,account:a})=>{let r=t?.data??{},n=e.kind,s="neon_project"===n?(0,F.k)(F.s,r):null,o="supabase_project"===n?ee((0,F.k)(F.B,r).sizeBytes):s?(s.branches??[]).reduce((e,t)=>null===t.logicalSize?e:(e??0)+t.logicalSize,null):null;return{id:e.id,kind:n,account:a,state:t?.state??"unknown",sizeBytes:o,cuHours:s&&null!==ee(s.computeSeconds)?Math.round(s.computeSeconds/3600*10)/10:null,reads:"firestore"===n?ee((0,F.k)(F.w,r).reads):null}}),k=g.map(e=>({name:e.name,app:e.appName,tlsExpires:e.tls?.notAfter??null,domainExpires:e.rdap?.expiresAt??null,registrar:e.rdap?.registrar??null}));return{month:e,partial:t,generatedAt:r,book:i,apps:l,rollups:u.map(({r:e,appId:t,app:a,url:r,kind:n,name:s})=>({monitorId:e.monitorId,appId:t,app:a,path:(e=>{if("heartbeat"===e.kind)return` heartbeat ${e.name??""}`.trimEnd();try{return new URL(e.url).pathname}catch{return e.url}})({kind:n,name:s,url:r}),hour:e.hour,checks:e.checks,failures:e.failures,p50Ms:e.p50Ms,p95Ms:e.p95Ms,maxMs:e.maxMs,status5xx:e.status5xx,maintenance:e.maintenance})),events:c.map(({e,resource:t})=>({at:e.at,resourceId:e.resourceId,resource:t,type:e.type,kind:e.kind,reason:e.reason,count:e.count,message:e.message,detail:e.detail})),alerts:p.map(e=>({ruleKey:e.ruleKey,severity:e.severity,title:e.title,message:e.message,resourceId:e.resourceId,startedAt:e.startedAt,resolvedAt:e.resolvedAt})),deployments:f,databases:b,domains:k}}var ea=e.i(75064),er=e.i(909592),en=e.i(684330),es=e.i(492973),eo=e.i(246517),ei=e.i(260417),el=e.i(978071);let eu="application/vnd.google-apps.folder",ed="https://www.googleapis.com/drive/v3/files",ec="https://www.googleapis.com/upload/drive/v3/files",ep="https://sheets.googleapis.com/v4/spreadsheets",ef=ea.z.object({error:ea.z.object({errors:er.z.array(en.z.looseObject({reason:es.z.string().optional()})).optional(),status:es.z.string().optional()})});async function em(e,t,a,r,n){let s,o,i=n.timeoutMs??1e4,l={Authorization:`Bearer ${a}`,Accept:"application/json"};r?.raw?(l["Content-Type"]=r.contentType??"application/octet-stream",s=new Uint8Array(r.raw)):r&&void 0!==r.json&&(l["Content-Type"]="application/json",s=JSON.stringify(r.json));try{o=await (n.fetch??fetch)(t,{method:e,headers:l,body:s,signal:AbortSignal.timeout(i),cache:"no-store"})}catch(e){return{ok:!1,kind:"transient",error:e instanceof DOMException&&("TimeoutError"===e.name||"AbortError"===e.name)?`Google Drive didn't answer within ${Math.round(i/1e3)} seconds.`:"Couldn't reach Google Drive."}}let u=await o.json().catch(()=>null);if(o.ok)return{ok:!0,data:u};let d=ef.safeParse(u),c=d.success?d.data.error.errors?.find(e=>e.reason)?.reason??d.data.error.status:void 0;return 401===o.status?{ok:!1,kind:"auth",status:401,error:"Google Drive rejected the access token (401)."}:404===o.status?{ok:!1,kind:"missing",status:404,error:"Google Drive doesn't know this file (404)."}:403===o.status&&"storageQuotaExceeded"===c?{ok:!1,kind:"full",status:403,error:"Your Google Drive is full. Free some space; the next run tries again."}:429===o.status||o.status>=500||403===o.status&&/rateLimit/i.test(c??"")?{ok:!1,kind:"transient",status:o.status,error:`Google Drive is busy (${o.status}). The next run tries again.`}:{ok:!1,kind:"format",status:o.status,error:`Google Drive refused the request (${o.status}${c?` ${c}`:""}).`}}let eh=ea.z.object({id:es.z.string().min(1)}),ew=e=>({ok:!1,kind:"format",error:`Google Drive answered ${e} in a format the console doesn't recognise.`});function eg(e,t){if(!e.ok)return e;let a=eh.safeParse(e.data);return a.success?{ok:!0,data:a.data.id}:ew(t)}async function eb(e,t,a={}){let r=`name = '${t.replace(/['\\]/g,"\\$&")}' and mimeType = '${eu}' and trashed = false`,n=await em("GET",`${ed}?${new URLSearchParams({q:r,fields:"files(id,name)",spaces:"drive",pageSize:"10"})}`,e,null,a);if(!n.ok)return n;let s=ea.z.object({files:er.z.array(eh)}).safeParse(n.data);return s.success?{ok:!0,data:s.data.files[0]?.id??null}:ew("the folder search")}async function ek(e,t,a={}){let r=await em("GET",`${ed}/${encodeURIComponent(t)}?fields=id,trashed,name`,e,null,a);if(!r.ok)return"missing"===r.kind?{ok:!0,data:{usable:!1,name:null}}:r;let n=ea.z.object({id:es.z.string(),trashed:eo.z.boolean().optional(),name:es.z.string().optional()}).safeParse(r.data);return n.success?{ok:!0,data:{usable:!n.data.trashed,name:n.data.name?.trim()||null}}:ew("the folder")}async function ey(e,t,a={}){return eg(await em("POST",`${ed}?fields=id`,e,{json:{name:t,mimeType:eu}},a),"the new folder")}async function ev(e,t,a,r={}){return eg(await em("POST",`${ed}?fields=id`,e,{json:{name:t,mimeType:"application/vnd.google-apps.spreadsheet",parents:[a]}},r),"the new spreadsheet")}let eI=e=>`'${e.replace(/'/g,"''")}'`;async function e$(e,t,a,r={}){let n=await em("GET",`${ep}/${encodeURIComponent(t)}?fields=sheets.properties(sheetId,title)`,e,null,r);if(!n.ok)return n;let s=ea.z.object({sheets:er.z.array(ea.z.object({properties:ea.z.object({sheetId:ei.z.number(),title:es.z.string()})})).default([])}).safeParse(n.data);if(!s.success)return ew("the spreadsheet's tabs");let o=s.data.sheets.map(e=>e.properties),i=new Set(o.map(e=>e.title)),l=[],u=a.filter(e=>!i.has(e)),d=o[0];for(let e of(d&&u.length&&!a.includes(d.title)&&(l.push({updateSheetProperties:{properties:{sheetId:d.sheetId,title:u[0]},fields:"title"}}),u.shift()),u))l.push({addSheet:{properties:{title:e}}});if(!l.length)return{ok:!0,data:void 0};let c=await em("POST",`${ep}/${encodeURIComponent(t)}:batchUpdate`,e,{json:{requests:l}},r);return c.ok?{ok:!0,data:void 0}:c}async function eA(e,t,a,r={}){let n=encodeURIComponent(t),s=await em("POST",`${ep}/${n}/values:batchClear`,e,{json:{ranges:a.map(e=>eI(e.title))}},r);if(!s.ok)return s;let o=a.map(e=>({range:`${eI(e.title)}!A1`,majorDimension:"ROWS",values:e.rows.map(e=>e.map(e=>e??""))})),i=await em("POST",`${ep}/${n}/values:batchUpdate`,e,{json:{valueInputOption:"RAW",data:o}},r);return i.ok?{ok:!0,data:void 0}:i}let eS="watchbell-backup-part";function eD(e,t,a){return Buffer.concat([Buffer.from(`--${eS}\r
5
5
  Content-Type: application/json; charset=UTF-8\r
6
6
  \r
7
7
  ${JSON.stringify(e)}\r
8
- --${eA}\r
8
+ --${eS}\r
9
9
  Content-Type: ${a}\r
10
10
  \r
11
11
  `),t,Buffer.from(`\r
12
- --${eA}--`)])}async function eD(e,t,a={}){let r=`multipart/related; boundary=${eA}`,n=e=>{if(!e.ok)return e;let a=et.z.object({id:en.z.string().min(1),size:ei.z.union([en.z.string(),eo.z.number()]).optional()}).safeParse(e.data);return a.success?{ok:!0,data:{id:a.data.id,size:Number(a.data.size??t.content.length)||t.content.length}}:eh("the upload")};if(t.fileId){let s=eS({name:t.name,mimeType:t.mimeType},t.content,t.mimeType),o=await ef("PATCH",`${ed}/${encodeURIComponent(t.fileId)}?uploadType=multipart&fields=id,size`,e,{raw:s,contentType:r},a);if(o.ok||"missing"!==o.kind)return n(o)}let s=eS({name:t.name,mimeType:t.mimeType,parents:[t.folderId]},t.content,t.mimeType);return n(await ef("POST",`${ed}?uploadType=multipart&fields=id,size`,e,{raw:s,contentType:r},a))}async function eT(e,t,a={}){let r=await ef("PATCH",`${eu}/${encodeURIComponent(t)}?fields=id,trashed`,e,{json:{trashed:!0}},a);return r.ok||"missing"===r.kind?{ok:!0,data:void 0}:r}var eE=e.i(666680),ex=e.i(547963);let ez=ex.n.notSet("GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET",!0),eR="invalid_grant: Google Drive access was removed or has expired. Reconnect Google Drive.",eM=et.z.object({error:en.z.string()});async function ej(e,t){let a,r=t.timeoutMs??1e4;try{a=await (t.fetch??fetch)("https://oauth2.googleapis.com/token",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded"},body:e.toString(),signal:AbortSignal.timeout(r),cache:"no-store"})}catch(e){return{ok:!1,kind:"transient",error:e instanceof DOMException&&("TimeoutError"===e.name||"AbortError"===e.name)?`Google didn't answer within ${Math.round(r/1e3)} seconds.`:"Couldn't reach Google."}}let n=await a.json().catch(()=>null);if(a.ok)return{ok:!0,body:n};let s=eM.safeParse(n).success?n.error:null;return"invalid_grant"===s?{ok:!1,kind:"revoked",error:eR}:"invalid_client"===s||"unauthorized_client"===s?{ok:!1,kind:"client",error:`Google refused the OAuth client. Check GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET ${ex.n.checkWhere}.`}:429===a.status||a.status>=500?{ok:!1,kind:"transient",error:`Google returned an error (${a.status}). The next run tries again.`}:{ok:!1,kind:"format",error:`Google refused the request (${s??a.status}).`}}et.z.object({refresh_token:en.z.string().min(1),scope:en.z.string().optional()});let e_=et.z.object({access_token:en.z.string().min(1)});async function eC(e,t,a={}){let r=await ej(new URLSearchParams({grant_type:"refresh_token",refresh_token:t,client_id:e.clientId,client_secret:e.clientSecret}),a);if(!r.ok)return r;let n=e_.safeParse(r.body);return n.success?{ok:!0,accessToken:n.data.access_token}:{ok:!1,kind:"format",error:"Google answered the token request in a format the console doesn't recognise."}}class eq extends Error{kind;constructor(e,t){super(t),this.kind=e}}async function eP(e){let{month:t,partial:a,now:r}=e,n=function(e=process.env){let t=e.GOOGLE_CLIENT_ID?.trim()??"",a=e.GOOGLE_CLIENT_SECRET?.trim()??"";return a&&/^[\w.-]+\.apps\.googleusercontent\.com$/.test(t)?{clientId:t,clientSecret:a}:null}();if(!n)return{ok:!1,month:t,kind:"env",error:ez};let s=await H();if(!s)return{ok:!1,month:t,kind:"not-connected",error:"Google Drive isn't connected."};if(!s.refreshToken){let e="The stored Google Drive token can't be read (the encryption key changed). Reconnect Google Drive.";return await V(s.id,{status:"error",lastError:e}),{ok:!1,month:t,kind:"failed",error:e}}let o=await Y(t),i={sheetFileId:o?.sheetFileId??null,csvFileId:o?.csvFileId??null,driveFolderId:o?.driveFolderId??null},l=o?.status??"error";await K(t,{status:l,attempts:(o?.attempts??0)+1,startedAt:r});let u=e=>(i={...i,...e},K(t,{status:l,...e})),d={fetch:e.fetch},c=()=>{if(Date.now()>e.deadline)throw new eq("time","Stopped at the daily job's time budget; the next daily run continues where this one stopped.")},p=e=>{if(!e.ok)throw new eq("failed",e.error);return e.data};try{let o,l=await eC(n,s.refreshToken,d);if(!l.ok){if("revoked"===l.kind)throw await V(s.id,{status:"error",lastError:eR}),new eq("revoked",eR);throw new eq("failed",l.error)}"error"===s.status&&await V(s.id,{status:"ok",lastError:null});let f=l.accessToken;c();let m=await X(),h=m?.id??null;if(m){let e=p(await eb(f,m.id,d));e.usable?e.name&&e.name!==m.name&&await Q(m.id,e.name):h=null}if(!h){c();let e=p(await eg(f,k,d)),t=e?null:p(await eg(f,y,d));h=e??t??p(await ek(f,k,d)),await Q(h,t?y:k)}let w=await ee(t,a,r);c(),i.sheetFileId||await u({sheetFileId:p(await ey(f,T(t),h,d)),driveFolderId:h}),c();let I=await eI(f,i.sheetFileId,v,d);I.ok||"missing"!==I.kind||(await u({sheetFileId:p(await ey(f,T(t),h,d)),driveFolderId:h}),c(),I=await eI(f,i.sheetFileId,v,d)),p(I),c(),p(await e$(f,i.sheetFileId,function(e){let{start:t,end:a}=A(e.month),r=e.partial&&e.generatedAt<a?e.generatedAt:a,n=e.deployments.filter(M),s=R(e.rollups.map(e=>e.checks)),o=R(e.rollups.map(e=>e.failures)),i=e=>(0,b.G)(e),l=[["Watchbell backup",e.month],["Covers",`${E(t)} to ${E(r)} WIB${e.partial?" (month so far)":""}`],["Kind",e.partial?"Partial: Back up now":"Full month"],["Generated",`${E(e.generatedAt)} WIB`],[],["Applications watched",e.apps.length],["Uptime, all monitors (%)",x(s,o)],["Checks (rolled-up hours)",s],["Failed checks",o],["Incidents (alerts opened)",e.alerts.length],["Critical incidents",e.alerts.filter(e=>"critical"===e.severity).length],["Production deployments",n.length],["Failed production deployments",n.filter(j).length],["Events",R(e.events.map(e=>e.count))]],u=[["Application","Monitors","Checks","Uptime (%)","p95 response, typical hour (ms)","p95 response, worst hour (ms)","5xx responses","Production deploys","Failed production deploys"]];for(let t of[...e.apps].sort((e,t)=>e.name.localeCompare(t.name))){let a=e.rollups.filter(e=>e.appId===t.id),r=a.map(e=>e.p95Ms).filter(e=>null!==e),s=n.filter(e=>e.appId===t.id);u.push([i(t.name),new Set(a.map(e=>e.monitorId)).size,R(a.map(e=>e.checks)),x(R(a.map(e=>e.checks)),R(a.map(e=>e.failures))),z(r),r.length?Math.max(...r):null,R(a.map(e=>e.status5xx)),s.length,s.filter(j).length])}let d=[["Rule","Severity","Subject","Started (WIB)","Resolved (WIB)","Duration","Message"]];for(let t of[...e.alerts].sort((e,t)=>e.startedAt.getTime()-t.startedAt.getTime())){let a=(0,b.o)({title:t.title,message:t.message,causedBy:null,resourceId:t.resourceId},e.book);d.push([t.ruleKey,t.severity,a.title,E(t.startedAt),E(t.resolvedAt),function(e,t,a){let r=Math.max(0,Math.round(((t??a).getTime()-e.getTime())/6e4)),n=r<60?`${r} min`:r<2880?`${Math.floor(r/60)} h ${r%60} min`:`${Math.round(r/1440)} days`;return t?n:`${n} (still open)`}(t.startedAt,t.resolvedAt,r),a.message])}let c=[["Database","Provider","Account","State at backup","Status changes this month","Size (MB)","Neon CU-hours this period","Firestore reads (last reading)"]];for(let t of[...e.databases].sort((t,a)=>(0,b.X)(e.book,t.id).localeCompare((0,b.X)(e.book,a.id)))){let a=R(e.events.filter(e=>"database"===e.type&&e.resourceId===t.id).map(e=>e.count));c.push([(0,b.X)(e.book,t.id),_[t.kind],i(t.account),t.state,a,q(t.sizeBytes),t.cuHours,t.reads])}let p=[["Domain","Application","TLS certificate expires","TLS days left at month end","Domain expires (RDAP)","Domain days left at month end","Registrar"]];for(let t of[...e.domains].sort((e,t)=>e.name.localeCompare(t.name)))p.push([t.name,t.app?i(t.app):"",t.tlsExpires??"",C(t.tlsExpires,r),t.domainExpires??"",C(t.domainExpires,r),t.registrar??""]);return[{title:"Overview",rows:l},{title:"Applications",rows:u},{title:"Incidents",rows:d},{title:"Databases",rows:c},{title:"Domains",rows:p}]}(w),d)),c();let $=(o=function(e){let t=[N.join(",")];for(let a of[...e.rollups].sort((e,t)=>e.hour.getTime()-t.hour.getTime()||e.monitorId.localeCompare(t.monitorId)))t.push(["rollup",a.hour.toISOString(),(0,b.G)(`${a.app}${a.path}`),a.appId,a.checks,a.failures,a.p50Ms,a.p95Ms,a.maxMs,a.status5xx,a.maintenance,null,null,null,null,null,null].map(P).join(","));for(let a of[...e.events].sort((e,t)=>e.at.getTime()-t.at.getTime())){let r=a.resourceId&&e.book.db.some(e=>e.id===a.resourceId)?(0,b.X)(e.book,a.resourceId):(0,b.J)(a.resource??"",e.book);t.push(["event",a.at.toISOString(),r,a.resourceId,null,null,null,null,null,null,null,a.type,a.kind,a.reason,a.count,(0,b.J)(a.message,e.book,a.resourceId),(0,b.J)(a.detail,e.book,a.resourceId)].map(P).join(","))}return`${t.join("\r\n")}\r
13
- `}(w),(0,g.gzipSync)(Buffer.from(o,"utf8"),{level:9})),S=p(await eD(f,{name:`watchbell-${t}-raw.csv.gz`,mimeType:"application/gzip",folderId:h,content:$,fileId:i.csvFileId},d));await u({csvFileId:S.id}),await K(t,{status:a?"partial":"ok",sizeBytes:S.size,error:null,finishedAt:new Date});let O=a?null:await eN(f,r,e.deadline,d);return{ok:!0,month:t,retention:O,message:`${D(t)}${a?" so far":""} saved to Google Drive.`}}catch(n){let e=n instanceof eq?n:new eq("failed","The backup failed. The next daily run tries again.");n instanceof eq||console.error("backup failed:",n instanceof Error?n.name:"unknown");let r=a&&"partial"===l?"partial":"error";return await K(t,{status:r,error:e.message.slice(0,500),finishedAt:new Date}).catch(()=>void 0),{ok:!1,month:t,kind:e.kind,error:e.message}}}async function eN(e,t,a,r){let n=function(e,t){let a=$(t),r=e.filter(e=>"ok"===e.status&&e.month<a).map(e=>e.month).sort().reverse().slice(0,3);if(r.length<3)return[];let n=r[r.length-1];return e.filter(e=>!e.trashedAt&&e.month<n&&(e.sheetFileId||e.csvFileId))}(await J(),t),s=[];for(let o of n){if(Date.now()>a)break;let n=!0;for(let t of[o.sheetFileId,o.csvFileId])t&&((await eT(e,t,r)).ok||(n=!1));n&&(await K(o.month,{status:o.status,trashedAt:t}),s.push(D(o.month)))}return s.length?`Moved to Drive trash: ${s.join(", ")}.`:null}async function eO(e,t,a={}){let r=await H();if(!r||"error"===r.status&&r.lastError?.startsWith("invalid_grant"))return null;let n=function(e,t){let a=S($(t)),r=new Map(e.map(e=>[e.month,e.status]));if("ok"!==r.get(a))return a;let n=a;for(let e=1;e<3;e++)if(n=S(n),"error"===r.get(n))return n;return null}(await J(),e);if(!n)return null;let s=await eP({month:n,partial:!1,now:e,deadline:t,...a});return s.ok?null:`${D(n)}: ${s.error}`}var eU=e.i(455891),eB=e.i(889234),eF=e.i(328586),eG=e.i(333407),eW=e.i(459702),eL=e.i(200346),eH=e.i(368230),eV=e.i(584820),eJ=e.i(902509),eY=e.i(668141),eK=e.i(242960),eX=e.i(112515),eQ=e.i(185890);function eZ(e){if(!e)return null;if("unknown"!==e.state)return e.state;let t=e.data?.lastGoodState;return"string"==typeof t&&eQ.f.includes(t)?t:null}let e0={turso_database:"Turso database",upstash_redis:"Upstash Redis",d1_database:"D1 database"};function e1(e,t){return"auth"===e.kind?"auth":"scope"===e.kind?t?"auth":"column":"missing"===e.kind?t?"unknown":"column":"unknown"}var e5=e.i(35048),e3=e.i(516464),e4=e.i(88316),e2=e.i(437122),e6=e.i(319718),e8=e.i(941536),e9=e.i(686454),e7=e.i(122603);let te="skipped the rest, time budget used";function tt(e){let t=e.deadline-Date.now()-500;if(t<250)throw Error(te);return{timeoutMs:Math.min(5e3,t)}}async function ta(e,t,a){let r=!1;return{out:await (0,e7.P)(t,3,async t=>{let n;try{n=tt(e)}catch{r=!0;return}return a(t,n)}),skipped:r}}function tr(e){if(e)throw Error(te)}async function tn(e){let t=await (0,a.db)().select().from(h.accounts).where((0,d.and)((0,d.eq)(h.accounts.provider,e),(0,d.eq)(h.accounts.status,"ok"))),r=(0,B.serverEnv)().OPS_ENCRYPTION_KEY;return t.map(e=>({acc:e,credential:(0,O.V)({ciphertext:e.credentialCiphertext,iv:e.credentialIv},r)}))}function ts(e,t){return(0,a.db)().select({r:h.resources,s:h.snapshots}).from(h.resources).leftJoin(h.snapshots,(0,d.eq)(h.snapshots.resourceId,h.resources.id)).where((0,d.and)((0,d.eq)(h.resources.accountId,e),(0,d.eq)(h.resources.kind,t),(0,d.eq)(h.resources.monitored,!0),(0,d.isNull)(h.resources.goneAt))).limit(100)}let to=e=>t.sql`${h.snapshots.data} || ${JSON.stringify(e)}::jsonb`;async function ti(e,t,r){let n=eZ(e.s?{state:e.s.state,data:e.s.data}:null),s="unknown"===t.state,o=s?n?{lastGoodState:n}:{}:{...t.patch,lastGoodState:t.state},i=!s&&n!==t.state;return await (0,a.db)().insert(h.snapshots).values({resourceId:e.r.id,state:t.state,data:o,collectedAt:r,stateSince:r}).onConflictDoUpdate({target:h.snapshots.resourceId,set:{state:t.state,data:to(o),...s?{}:{collectedAt:r},...i?{stateSince:r}:{}}}),s?null:function(e){let{prev:t,next:a}=e;if(null===t||"unknown"===t||"unknown"===a||t===a)return null;let r={resourceId:e.resourceId,type:"database",at:e.at};if("supabase_project"===e.kind)return"paused"===a?{...r,reason:"DatabasePaused",kind:"paused",message:"Supabase project paused",detail:"Status changed to INACTIVE"}:"ok"===a?{...r,reason:"DatabaseRestored",kind:"ok",message:"Supabase project active again",detail:"Status changed to ACTIVE_HEALTHY"}:"warn"===a?{...r,reason:"DatabaseUnhealthy",kind:"warn",message:"Supabase project unhealthy",detail:e.label}:"err"===a?{...r,reason:"DatabaseFailed",kind:"err",message:`Supabase project: ${e.label.toLowerCase()}`,detail:e.label}:null;if("neon_project"===e.kind)return"err"===a?{...r,reason:"NeonSuspended",kind:"err",message:"Neon compute suspended",detail:e.label}:"err"===t&&("ok"===a||"idle"===a)?{...r,reason:"NeonAvailable",kind:"ok",message:"Neon compute available again",detail:e.label}:null;let n=e0[e.kind];if(n)return"err"===a?{...r,reason:"DatabaseFailed",kind:"err",message:`${n}: ${e.label.toLowerCase()}`,detail:e.label}:"off"===a?{...r,reason:"DatabaseMissing",kind:"off",message:`${n} missing`,detail:e.label}:"ok"===a&&("err"===t||"off"===t)?{...r,reason:"DatabaseRestored",kind:"ok",message:`${n} available again`,detail:e.label}:null;if("err"===a){let t="Daily quota used up"===e.label;return{...r,reason:t?"FirestoreQuotaUsedUp":"FirestoreUnreachable",kind:"err",message:t?"Firestore daily quota used up":"Firestore not reachable",detail:e.label}}return"off"===a?{...r,reason:"FirestoreMissing",kind:"off",message:"Firestore database missing",detail:e.label}:"ok"===a&&("err"===t||"off"===t)?{...r,reason:"FirestoreReachable",kind:"ok",message:"Firestore reachable again",detail:e.label}:null}({kind:e.r.kind,resourceId:e.r.id,prev:n,next:t.state,label:t.label,at:r})}async function tl(e,t){await (0,a.db)().update(h.snapshots).set({data:to(t)}).where((0,d.eq)(h.snapshots.resourceId,e.r.id))}let tu=e=>(0,eG.f)(e);async function td(e,t,r,n,s){if("auth"===e1(n,!0)){let e=(0,eX.E)({ok:!1,kind:"auth",error:n.error});e&&await (0,a.db)().update(h.accounts).set({...e,updatedAt:s.now}).where((0,d.eq)(h.accounts.id,t.id))}for(let e of r)await ti(e,{state:"unknown",label:"Unknown",patch:{}},s.now);s.errors.push(`${e}/${t.label}: ${n.error}`)}let tc=e=>e.toISOString();async function tp(e){return e.length?new Set((await (0,a.db)().select({app:h.links.fromResourceId,state:h.snapshots.state,data:h.snapshots.data}).from(h.links).innerJoin(h.resources,(0,d.eq)(h.resources.id,h.links.toResourceId)).innerJoin(h.snapshots,(0,d.eq)(h.snapshots.resourceId,h.resources.id)).where((0,d.and)((0,d.eq)(h.links.kind,"uses_db"),(0,d.inArray)(h.links.fromResourceId,e),(0,d.eq)(h.resources.monitored,!0),(0,d.isNull)(h.resources.goneAt)))).filter(e=>"paused"===e.state||"unknown"===e.state&&"paused"===e.data.lastGoodState).map(e=>e.app)):new Set}async function tf(e){for(let{acc:t,credential:a}of(await tn("supabase"))){if(tt(e),!a){e.errors.push(`supabase/${t.label}: credential can't be read`);continue}let r=await ts(t.id,"supabase_project");if(!r.length)continue;let n=await (0,e9.W)(a,tt(e));if(!n.ok){await td("supabase",t,r,n,e);continue}let s=new Map(n.data.map(e=>[e.ref,e])),o=[];for(let t of r){let a=s.get(t.r.externalId);if(!a){o.push(await ti(t,{state:"off",label:"Not found",patch:{status:"REMOVED"}},e.now));continue}let r=(0,e4.P)(a.status),n=eZ(t.s?{state:t.s.state,data:t.s.data}:null),i={status:a.status,region:a.region,pgVersion:a.pgVersion,orgSlug:a.orgSlug};"paused"===r.state&&"paused"!==n&&(i.pausedBeforeSeen=null===n),o.push(await ti(t,{state:r.state,label:r.label,patch:i},e.now))}await tu(o);let i=new Map(r.map(e=>[e.r.externalId,e.r.id])),l=n.data.map(e=>({resourceId:i.get(e.ref)??null,accountId:t.id,status:e.status,orgSlug:e.orgSlug}));await (0,eL.z)(e.now,l,e.deadline).catch(()=>{console.warn("auto-restore failed"),e.errors.push("auto-restore failed")})}}async function tm(e){for(let{acc:t,credential:a}of(await tn("supabase"))){if(tt(e),!a)continue;let r=await ts(t.id,"supabase_project");if(!r.length)continue;let n=new Map(r.map(e=>[e.r.id,(0,U.k)(U.B,e.s?.data)])),s=new Map;for(let r of new Set([...n.values()].map(e=>e.orgSlug).filter(e=>!!e))){let n=await (0,e9.K)(a,r,tt(e));s.set(r,n.ok&&null!==n.data?"free"===n.data:null),n.ok||"scope"===n.kind||e.errors.push(`supabase/${t.label} plan: ${n.error}`)}let{skipped:o}=await ta(e,r,async(t,r)=>{let o=n.get(t.r.id),i={freeOrg:o.orgSlug?s.get(o.orgSlug)??null:null};if((o.status??"").startsWith("ACTIVE_")){let[n,s]=await Promise.all([(0,e9.F)(a,t.r.externalId,r),(0,e9.Z)(a,t.r.externalId,r)]);n.ok?Object.assign(i,{health:n.data.map(({name:e,status:t})=>({name:e,status:t})),healthAt:tc(e.now),healthError:null}):"column"===e1(n,!1)?i.healthError=n.error:e.errors.push(`supabase/${t.r.name} health: ${n.error}`),s.ok?Object.assign(i,{lastTrafficAt:(0,e4.H)(s.data)?.toISOString()??null,trafficAt:tc(e.now),trafficError:null}):"column"===e1(s,!1)?i.trafficError=s.error:e.errors.push(`supabase/${t.r.name} traffic: ${s.error}`)}await tl(t,i)});tr(o)}}async function th(e){for(let{acc:t,credential:a}of(await tn("neon"))){if(tt(e),!a){e.errors.push(`neon/${t.label}: credential can't be read`);continue}let r=await ts(t.id,"neon_project");if(!r.length)continue;let{out:n,skipped:s}=await ta(e,r,(e,t)=>Promise.all([(0,e8.Z)(a,e.r.externalId,t),(0,e8.k)(a,e.r.externalId,t),(0,e8.e)(a,e.r.externalId,t)])),o=n.flat().find(e=>void 0!==e&&!e.ok&&"auth"===e.kind);if(o){await td("neon",t,r,o,e);continue}let i=[];for(let[t,a]of r.entries()){let r=n[t];if(!r)continue;let[s,o,l]=r;if(!s.ok||!o.ok||!l.ok){let t=[s,o,l].find(e=>!e.ok);"missing"===t.kind?i.push(await ti(a,{state:"off",label:"Not found",patch:{}},e.now)):(await ti(a,{state:"unknown",label:"Unknown",patch:{}},e.now),e.errors.push(`neon/${a.r.name}: ${t.error}`));continue}let u=(0,e3.p)({endpoints:o.data,computeSeconds:s.data.computeSeconds});i.push(await ti(a,{state:u.state,label:u.label,patch:{region:s.data.region,pgVersion:s.data.pgVersion,computeSeconds:s.data.computeSeconds,transferBytes:s.data.transferBytes,activeSeconds:s.data.activeSeconds,periodStart:s.data.periodStart,periodEnd:s.data.periodEnd,endpoints:o.data,branches:l.data}},e.now))}await tu(i),tr(s)}}async function tw(e){for(let{acc:t,credential:a}of(await tn("firebase"))){tt(e);let r=a?(0,e6.p)(a):null;if(!r){e.errors.push(`firebase/${t.label}: credential can't be read`);continue}let n=await ts(t.id,"firestore");if(!n.length)continue;let s=await (0,e6.X)(r,tt(e));if(!s.ok){await td("firebase",t,n,s,e);continue}let{out:o,skipped:i}=await ta(e,n,(e,t)=>(0,e2.G)(s.data,e.r.externalId,t)),l=[];for(let[t,a]of n.entries()){let r=o[t];if(!r)continue;let n=(0,e5.g)(r);"unknown"!==n.state||r.ok||e.errors.push(`firebase/${a.r.name}: ${r.error}`);let s=r.ok?{latencyMs:r.data.latencyMs,pingError:null,pingReason:null,pingKind:null}:{pingError:r.error,pingReason:r.reason??null,pingKind:r.kind};l.push(await ti(a,{...n,patch:s},e.now))}await tu(l),tr(i)}}async function tg(e){for(let{acc:t,credential:a}of(await tn("firebase"))){tt(e);let r=a?(0,e6.p)(a):null;if(!r)continue;let n=(await ts(t.id,"firestore")).filter(e=>e.s?.state!=="off");if(!n.length)continue;let s=await (0,e6.X)(r,tt(e));if(!s.ok){e.errors.push(`firebase/${t.label}: ${s.error}`);continue}let o=(0,e5.a)(e.now),{skipped:i}=await ta(e,n,async(t,a)=>{let r=await (0,e2.W)(s.data,t.r.externalId,o,e.now,a);r.ok?await tl(t,{...r.data,opsAt:tc(e.now),opsError:null}):"column"===e1(r,!1)?await tl(t,{reads:null,writes:null,deletes:null,opsAt:tc(e.now),opsError:/requires billing/i.test(r.message??"")?"Not available on Spark: Firestore usage needs billing (Blaze plan)":"SERVICE_DISABLED"===r.reason?"Not readable: the Cloud Monitoring API is off in this project":"Not readable: the service account needs monitoring.viewer"}):e.errors.push(`firebase/${t.r.name} usage: ${r.error}`)});tr(i)}}async function tb(e){let t=Date.now()+2*Math.max(0,e.deadline-Date.now())/3,a=await tk(()=>ty({...e,deadline:t})),r=await tk(()=>tv(e));if(a)throw a;if(r)throw r}async function tk(e){try{return await e(),null}catch(e){return e instanceof Error?e:Error(String(e))}}async function ty(e){for(let{acc:t,credential:a}of(await tn("supabase")))if(tt(e),a)for(let r of(await ts(t.id,"supabase_project"))){let t=(0,U.k)(U.B,r.s?.data);if(!(0,e4.z)({status:t.status??"",lastTrafficAt:t.lastTrafficAt?new Date(t.lastTrafficAt):null,sizeAt:t.sizeAt?new Date(t.sizeAt):null,now:e.now}))continue;let n=await (0,e9.r)(a,r.r.externalId,tt(e));n.ok?await tl(r,{sizeBytes:n.data,sizeAt:tc(e.now),sizeError:null}):"column"===e1(n,!1)?await tl(r,{sizeError:n.error}):e.errors.push(`supabase/${r.r.name} size: ${n.error}`)}}async function tv(e){for(let{acc:t,credential:a}of(await tn("firebase"))){tt(e);let r=a?(0,e6.p)(a):null;if(!r)continue;let n=(await ts(t.id,"firestore")).filter(e=>e.s?.state!=="off");if(!n.length)continue;let s=await (0,e6.X)(r,tt(e));if(!s.ok){e.errors.push(`firebase/${t.label}: ${s.error}`);continue}let{skipped:o}=await ta(e,n,async(t,a)=>{let r=await (0,e2.q)(s.data,t.r.externalId,a);r.ok?await tl(t,{authUsers:r.data,authAt:tc(e.now),authError:null}):"column"===e1(r,!1)?await tl(t,{authError:"Not readable: the service account needs firebaseauth.viewer"}):e.errors.push(`firebase/${t.r.name} users: ${r.error}`)});tr(o)}}var tI=e.i(369179),t$=e.i(476866),tA=e.i(649297),tS=e.i(541211);async function tD(e){let[t]=await (0,a.db)().select({hour:(0,c.max)(h.rollupsHourly.hour)}).from(h.rollupsHourly),r=(0,tA.r)(t?.hour??null,e),n=await (0,a.db)().select().from(h.checks).where((0,d.and)((0,d.gte)(h.checks.at,r),(0,d.lt)(h.checks.at,(0,tA.b)(e)))).orderBy(h.checks.at),s=new Map;for(let e of n){let t=`${e.monitorId}|${(0,tA.b)(e.at).toISOString()}`,a=s.get(t);a?a.push(e):s.set(t,[e])}for(let[e,t]of s){let[r,n]=e.split("|"),s=(0,tA.z)(t);await (0,a.db)().insert(h.rollupsHourly).values({monitorId:r,hour:new Date(n),...s}).onConflictDoUpdate({target:[h.rollupsHourly.monitorId,h.rollupsHourly.hour],set:s})}}async function tT(e){let t=await (0,t$.J)().catch(()=>tI.f);await (0,a.db)().delete(h.checks).where((0,d.lt)(h.checks.at,new Date(e.getTime()-864e5*t.checks))),await (0,a.db)().delete(h.rollupsHourly).where((0,d.lt)(h.rollupsHourly.hour,new Date(e.getTime()-864e5*t.rollupsHourly))),await (0,a.db)().delete(h.deployments).where((0,d.and)((0,d.lt)(h.deployments.createdAtProvider,new Date(e.getTime()-864e5*t.deployments)),(0,d.eq)(h.deployments.isCurrent,!1),(0,d.eq)(h.deployments.isPreviousProduction,!1))),await (0,a.db)().delete(h.events).where((0,d.lt)(h.events.at,new Date(e.getTime()-864e5*t.events))),await (0,a.db)().delete(h.alerts).where((0,d.and)((0,d.isNotNull)(h.alerts.resolvedAt),(0,d.lt)(h.alerts.resolvedAt,new Date(e.getTime()-864e5*t.alerts)))),await (0,a.db)().delete(h.collectorRuns).where((0,d.lt)(h.collectorRuns.startedAt,new Date(e.getTime()-864e5*t.collectorRuns))),await (0,a.db)().delete(h.storedLogs).where((0,d.lt)(h.storedLogs.at,new Date(e.getTime()-864e5*t.storedLogs))),await (0,a.db)().delete(h.recommendationDismissals).where((0,d.lt)(h.recommendationDismissals.dismissedAt,new Date(e.getTime()-864e5*t.recommendationDismissals)))}async function tE(){let e=new Date,[t]=await (0,a.db)().insert(h.collectorRuns).values({startedAt:e,trigger:"vercel_cron"}).returning({id:h.collectorRuns.id}),r=[],n=[["rollups",()=>tD(e)],["backup",async()=>{let t=await eO(e,e.getTime()+2e4);t&&r.push(`backup: ${t}`)}],["retention",()=>tT(e)],["sync",async()=>{let t=await (0,a.db)().select({id:h.accounts.id,label:h.accounts.label,provider:h.accounts.provider}).from(h.accounts).where((0,d.inArray)(h.accounts.provider,eY.I));for(let[a,n]of t.entries()){if(Date.now()>e.getTime()+25e3){r.push(`sync: ${t.length-a} account${t.length-a>1?"s":""} left for the next run, time budget used`);break}let s=await (0,eK.k)(n.id);s.ok?(s.skippedTeams.length&&r.push(`sync ${n.provider}/${n.label}: skipped teams ${s.skippedTeams.join(", ")} (no access)`),s.overLimit&&r.push(`sync ${n.provider}/${n.label}: ${s.overLimit}`)):r.push(`sync ${n.provider}/${n.label}: ${s.error}`)}}],["github",async()=>{let t=await (0,eF.D)(Math.min(Date.now()+6e3,e.getTime()+35e3));t&&r.push(`github: ${t}`)}],["deps",async()=>{let t=await (0,eB.e)(Math.min(Date.now()+eB.o,e.getTime()+eB.R));t&&r.push(`deps: ${t}`)}],["databases",()=>tb({now:e,deadline:Math.min(Date.now()+15e3,e.getTime()+5e4),errors:r})],["keep-active",()=>(0,eL.V)(e,Math.min(Date.now()+5e3,e.getTime()+5e4),r)],["security",async()=>{for(let t of(await (0,eV.h)((0,eJ.F)(e.getTime(),Date.now()))).failed)r.push(`security ${t}`)}],["advisor",async()=>{await (0,eU.O)(e)}]],s=[];try{for(let[e,t]of n)try{await t(),s.push(e)}catch(t){r.push(`${e}: ${(0,tS.safeError)(t)}`)}await (0,eG.f)([{type:"system",kind:r.length?"warn":"info",message:r.length?"Daily jobs finished with problems":"Daily jobs finished",detail:"Rollups, the monthly backup when due, retention, a sync of every account, database sizes, the Next.js security check and the Advisor",resourceId:null}])}catch(e){r.push(`events: ${(0,tS.safeError)(e)}`)}finally{f(m.t),await (0,a.db)().update(h.collectorRuns).set({finishedAt:new Date,ok:0===r.length,errorSummary:r.join("\n").slice(0,2e3)||null,durationMs:Date.now()-e.getTime(),tasks:s}).where((0,d.eq)(h.collectorRuns.id,t.id)).catch(()=>void 0)}await tx(r.length>0);let o=Date.now()-e.getTime();return{skipped:!1,ok:0===r.length,tasks:s,checks:0,durationMs:o,errors:r}}async function tx(e){let t=process.env.DAILY_HEARTBEAT_TOKEN;if(!t)return;let a=(0,eH.i)(t);if(!a)return void console.warn("daily heartbeat: DAILY_HEARTBEAT_TOKEN holds no single hb_ token; set it to the heartbeat's token");let r=await (0,eW._)(a,e?"fail":"ok",new Date).catch(e=>(console.warn("daily heartbeat: the ping couldn't be stored:",e instanceof Error?e.name:"error"),null));r?.status==="unknown"?console.warn("daily heartbeat: DAILY_HEARTBEAT_TOKEN matches no heartbeat monitor (was it regenerated?)"):r?.status==="limited"&&console.warn("daily heartbeat: the ping was rate limited")}async function tz(e,t,a=new Date){if(e.skipped||0===t.length)return e;let r=[...e.tasks],n=[...e.errors];for(let e of t)try{await e.run(a),r.push(e.name)}catch(t){n.push(`${e.name}: ${(0,tS.safeError)(t)}`)}return{...e,tasks:r,errors:n,ok:0===n.length}}var tR=e.i(234195),tM=e.i(706959),tj=e.i(451682),t_=e.i(373200),tC=e.i(753535),tq=e.i(932378),tP=e.i(313903);let tN=/not enabled/i,tO=(e,t,a={})=>({ok:!1,kind:e,error:t,...a}),tU="Vercel Web Analytics answered in a format the console doesn't recognise.",tB=et.z.object({data:et.z.object({pageviews:eo.z.number().finite().nonnegative(),visitors:eo.z.number().finite().nonnegative()})}),tF=et.z.object({data:ea.z.array(tq.z.unknown())}),tG=et.z.object({timestamp:en.z.string().transform((e,t)=>{let a=Date.parse(e);return Number.isNaN(a)?(t.addIssue({code:"custom",message:"bad timestamp"}),tP.z.NEVER):a}),pageviews:eo.z.number().finite().nonnegative().nullish().catch(null)});async function tW(e,t,a,r){let n=r.since.toISOString(),s=r.until.toISOString(),o=r.fetch??fetch,i=new AbortController,l=setTimeout(()=>i.abort(new DOMException("window","TimeoutError")),r.timeoutMs??8e3),u=r.signal?AbortSignal.any([i.signal,r.signal]):i.signal,d=(0,e7.X)(u);async function c(l,c){let p=new URLSearchParams({projectId:a,teamId:t,...c,since:n,until:s});try{let t=await Promise.race([o(`https://api.vercel.com/v1/query/web-analytics/visits/${l}?${p}`,{headers:{Authorization:`Bearer ${e}`,Accept:"application/json"},signal:u,cache:"no-store"}),d]),a=null,r=!1;if(401===t.status||403===t.status)a=tO("auth",`Vercel rejected this credential (${t.status}).`,{status:t.status});else if(429===t.status){let e=Number(t.headers.get("Retry-After"));a=tO("transient","Vercel says there were too many requests.",{status:429,retryAfterS:Number.isFinite(e)&&e>0?e:60})}else if(400===t.status){let e=await Promise.race([t.text(),d]).catch(()=>"");tN.test(e)?r=!0:a=tO("transient","Vercel Web Analytics rejected the request (400).",{status:400})}else t.ok||(a=tO("transient",`Vercel Web Analytics returned an error (${t.status}).`,{status:t.status}));if(r)return{kind:"off"};if(a)return await t.body?.cancel().catch(()=>void 0),{kind:"fail",fail:a};try{return{kind:"body",body:await Promise.race([t.json(),d])}}catch(e){if(u.aborted)throw e;return{kind:"fail",fail:tO("format",tU)}}}catch{return{kind:"fail",fail:u.aborted?i.signal.aborted&&!r.signal?.aborted?tO("transient","Vercel Web Analytics didn't answer in time."):tO("transient","Reading Vercel Web Analytics was cancelled."):tO("transient","Couldn't reach Vercel Web Analytics.")}}}try{let[e,t]=await Promise.all([c("count",{}),c("aggregate",{by:"hour"})]);if("off"===e.kind||"off"===t.kind)return{ok:!0,enabled:!1};let a=[e,t].flatMap(e=>"fail"===e.kind?[e.fail]:[]),r=a.find(e=>"auth"===e.kind);if(r)return r;let n="body"===t.kind?tF.safeParse(t.body):null,s="fail"===t.kind?t.fail:n?.success?null:tO("format",tU),o=a.find(e=>"transient"===e.kind);if(o)return o;if(s)return s;if(!n?.success)return tO("format",tU);let i="body"===e.kind?tB.safeParse(e.body):null,l=n.data.data.flatMap(e=>{let t=tG.safeParse(e);return t.success?[t.data]:[]});if(l.length>0&&l.every(e=>null==e.pageviews))return tO("format",tU);let u=new Map;for(let e of l){let t=36e5*Math.floor(e.timestamp/36e5);u.set(t,(u.get(t)??0)+(e.pageviews??0))}let d=[...u].sort((e,t)=>e[0]-t[0]).slice(-24).map(([e,t])=>({at:new Date(e),views:t}));if(i?.success)return{ok:!0,enabled:!0,total:i.data.data.pageviews,visitors:i.data.data.visitors,hourly:d};return{ok:!0,enabled:!0,total:d.reduce((e,t)=>e+t.views,0),visitors:null,hourly:d}}finally{clearTimeout(l),i.abort()}}var tL=e.i(178233);async function tH(e,t,a){let r=await (0,tj.g)(null);if(!r.length)return;let n=new Date(36e5*Math.floor(e.getTime()/36e5)-828e5);await (0,e7.P)(r,3,async r=>{if(Date.now()+8500>t)return;let s=await tW(r.token,r.teamId,r.projectId,{since:n,until:e});if(!s.ok)return void a.push(`pageviews/${r.appName}: ${s.error}`);try{await (0,tC.r)(r.appId,{pageviews:(0,tL.Z)(s,e)},e)}catch{a.push(`pageviews/${r.appName}: couldn't save the page views`)}})}var tV=e.i(147100),tJ=e.i(764266),tY=e.i(198552),tK=e.i(27479),tX=e.i(707866),tQ=e.i(392710),tZ=e.i(582888),t0=e.i(811539),t1=e.i(725321);async function t5(e){let t=[await tk(()=>t4(e)),await tk(()=>t6(e)),await tk(()=>t8(e))].find(e=>null!==e);if(t)throw t}let t3=e=>e.toISOString();async function t4(e){for(let{acc:t,credential:a}of(await tn("turso"))){if(tt(e),!a){e.errors.push(`turso/${t.label}: credential can't be read`);continue}let r=await ts(t.id,"turso_database");if(!r.length)continue;let n=await (0,tZ.u)(a,tt(e));if(!n.ok){await td("turso",t,r,n,e);continue}let s=new Set(r.map(e=>String(e.r.meta.org??""))),o=[];for(let i of n.data.filter(e=>s.has(e.slug))){let[n,s]=await Promise.all([(0,tZ.X)(a,i.slug,tt(e)),(0,tZ.d)(a,i.slug,tt(e))]),l=r.filter(e=>e.r.meta.org===i.slug);if(!n.ok){for(let t of l)await ti(t,{state:"unknown",label:"Unknown",patch:{}},e.now);e.errors.push(`turso/${t.label}: ${n.error}`);continue}let u=new Map(n.data.map(e=>[e.id,e]));for(let t of l)o.push(await t2(t,u.get(t.r.externalId),i,s,e))}let i=new Set(n.data.map(e=>e.slug));for(let t of r.filter(e=>!i.has(String(e.r.meta.org??""))))o.push(await ti(t,{state:"off",label:"Organization not visible to this token",patch:{}},e.now));await tu(o)}}async function t2(e,t,a,r,n){if(!t)return ti(e,{state:"off",label:"Not found",patch:{}},n.now);let s=(0,tX.h)({blockReads:t.blockReads,blockWrites:t.blockWrites,orgBlockedReads:a.blockedReads,orgBlockedWrites:a.blockedWrites}),o={org:a.slug,group:t.group,primaryRegion:t.primaryRegion,plan:a.plan,blockReads:t.blockReads,blockWrites:t.blockWrites};if(r.ok){let e=r.data.byDb.get(t.id);Object.assign(o,{rowsRead:e?.rowsRead??null,rowsWritten:e?.rowsWritten??null,storageBytes:e?.storageBytes??null,orgRowsRead:r.data.org.rowsRead,orgRowsWritten:r.data.org.rowsWritten,orgStorageBytes:r.data.org.storageBytes,orgDatabases:r.data.org.databases,usageAt:t3(n.now),usageError:null})}else"column"===e1(r,!1)?o.usageError=r.error:n.errors.push(`turso/${e.r.name} usage: ${r.error}`);return ti(e,{...s,patch:o},n.now)}async function t6(e){for(let{acc:t,credential:a}of(await tn("upstash"))){tt(e);let r=a?(0,t0.L)(a):null;if(!r){e.errors.push(`upstash/${t.label}: credential can't be read`);continue}let n=await ts(t.id,"upstash_redis");if(!n.length)continue;let s=await (0,t0.M)(r,tt(e));if(!s.ok){await td("upstash",t,n,s,e);continue}let o=new Map(s.data.map(e=>[e.id,e])),{out:i,skipped:l}=await ta(e,n,(e,t)=>o.has(e.r.externalId)?(0,t0.Z)(r,e.r.externalId,t):Promise.resolve(null)),u=[];for(let[t,a]of n.entries()){let r=o.get(a.r.externalId);if(!r){u.push(await ti(a,{state:"off",label:"Not found",patch:{}},e.now));continue}let n=(0,tX.t)(r.state),s={region:r.region,status:r.state,type:r.type},l=i[t];l?.ok?Object.assign(s,{...l.data,statsAt:t3(e.now),statsError:null}):l&&"column"===e1(l,!1)?s.statsError=l.error:l&&e.errors.push(`upstash/${a.r.name} stats: ${l.error}`),u.push(await ti(a,{...n,patch:s},e.now))}await tu(u),tr(l)}}async function t8(e){let t={};for(let{acc:a,credential:r}of(await tn("cloudflare"))){if(tt(e),!r)continue;let n=await t7(a.id,r,e);if(!n.length){t[a.id]={d1:"error",analytics:null,at:t3(e.now),note:"No Cloudflare account found for this token"};continue}let s="ok",o=null;for(let t of n){let n=await (0,tQ.L)(r,t,tt(e));if(!n.ok){"error"==(s="scope"===n.kind||"auth"===n.kind?"missing":"error")&&e.errors.push(`d1/${a.label}: ${n.error}`);continue}await ae(a.id,t,n.data,e.now);let i=(await ts(a.id,"d1_database")).filter(e=>e.r.meta.accountId===t);if(!i.length)continue;let l=await (0,tQ.t)(r,t,(0,tQ.Y)(e.now),tt(e));o=l.ok?o??"ok":"scope"===l.kind?"missing":o??"error",l.ok||"scope"===l.kind||e.errors.push(`d1/${a.label} analytics: ${l.error}`);let{out:u,skipped:d}=await ta(e,i,(e,a)=>(0,tQ.m)(r,t,e.r.externalId,a)),c=new Map((l.ok?l.data:[]).map(e=>[e.databaseId,e])),p=u.map(e=>e?.ok?e.data.sizeBytes??0:0),f={accountRowsRead:l.ok?l.data.reduce((e,t)=>e+t.rowsRead,0):null,accountRowsWritten:l.ok?l.data.reduce((e,t)=>e+t.rowsWritten,0):null,accountSizeBytes:u.every(e=>e?.ok)?p.reduce((e,t)=>e+t,0):null,accountDatabases:n.data.length},m=[];for(let[t,a]of i.entries()){let r=u[t];void 0!==r&&m.push(await t9(a,r,c.get(a.r.externalId)??null,l.ok,l.ok?null:l.error,f,e))}await tu(m),tr(d)}t[a.id]={d1:s,analytics:o,at:t3(e.now),note:null}}await (0,a.db)().insert(h.settings).values({key:t1.f,value:t}).onConflictDoUpdate({target:h.settings.key,set:{value:t,updatedAt:e.now}})}async function t9(e,t,a,r,n,s,o){let i={accountId:e.r.meta.accountId??null,createdAt:e.r.meta.createdAt??null,accountDatabases:s.accountDatabases};return(t.ok?Object.assign(i,{sizeBytes:t.data.sizeBytes,numTables:t.data.numTables,readReplication:t.data.readReplication,detailsAt:t3(o.now),detailsError:null}):"scope"===t.kind?i.detailsError=t.error:o.errors.push(`d1/${e.r.name}: ${t.error}`),r?Object.assign(i,{rowsRead:a?.rowsRead??0,rowsWritten:a?.rowsWritten??0,readQueries:a?.readQueries??0,writeQueries:a?.writeQueries??0,accountRowsRead:s.accountRowsRead,accountRowsWritten:s.accountRowsWritten,usageDay:(0,tQ.Y)(o.now),usageAt:t3(o.now),usageError:null}):i.usageError=n,null!==s.accountSizeBytes&&(i.accountSizeBytes=s.accountSizeBytes),t.ok||"transient"!==t.kind)?ti(e,{...(0,tX.c)(r?s:{accountRowsRead:null,accountRowsWritten:null}),patch:i},o.now):ti(e,{state:"unknown",label:"Unknown",patch:{}},o.now)}async function t7(e,t,r){let n=new Set,s=await (0,tQ.N)(t,tt(r));if(s.ok)for(let e of s.data)n.add(e.id);for(let t of(await (0,a.db)().select({meta:h.resources.meta}).from(h.resources).where((0,d.and)((0,d.eq)(h.resources.accountId,e),(0,d.eq)(h.resources.kind,"zone"),(0,d.isNull)(h.resources.goneAt))).limit(200)))"string"==typeof t.meta.accountId&&/^[0-9a-f]{32}$/i.test(t.meta.accountId)&&n.add(t.meta.accountId);return[...n].slice(0,5)}async function ae(e,t,r,n){let s=(await (0,a.db)().select({id:h.resources.id,externalId:h.resources.externalId,meta:h.resources.meta,goneAt:h.resources.goneAt}).from(h.resources).where((0,d.and)((0,d.eq)(h.resources.accountId,e),(0,d.eq)(h.resources.kind,"d1_database")))).filter(e=>e.meta.accountId===t),o=new Map(s.map(e=>[e.externalId,e])),i=new Set(r.map(e=>e.uuid));await (0,a.db)().transaction(async a=>{for(let s of r){let r={accountId:t,createdAt:s.createdAt},i=o.get(s.uuid);i?await a.update(h.resources).set({name:s.name,meta:r,lastSeenAt:n,goneAt:null,updatedAt:n}).where((0,d.eq)(h.resources.id,i.id)):await a.insert(h.resources).values({accountId:e,kind:"d1_database",externalId:s.uuid,name:s.name,meta:r,monitored:!0,lastSeenAt:n}).onConflictDoNothing({target:[h.resources.accountId,h.resources.kind,h.resources.externalId]})}let l=s.filter(e=>!i.has(e.externalId)&&!e.goneAt).map(e=>e.id);l.length&&await a.update(h.resources).set({goneAt:n,updatedAt:n}).where((0,d.inArray)(h.resources.id,l))})}var at=e.i(628852);async function aa(e=new Date){let n=(0,eE.randomUUID)(),s=new Date(e.getTime()+at.d).toISOString(),o=await (0,a.db)().execute(t.sql`
12
+ --${eS}--`)])}async function eT(e,t,a={}){let r=`multipart/related; boundary=${eS}`,n=e=>{if(!e.ok)return e;let a=ea.z.object({id:es.z.string().min(1),size:el.z.union([es.z.string(),ei.z.number()]).optional()}).safeParse(e.data);return a.success?{ok:!0,data:{id:a.data.id,size:Number(a.data.size??t.content.length)||t.content.length}}:ew("the upload")};if(t.fileId){let s=eD({name:t.name,mimeType:t.mimeType},t.content,t.mimeType),o=await em("PATCH",`${ec}/${encodeURIComponent(t.fileId)}?uploadType=multipart&fields=id,size`,e,{raw:s,contentType:r},a);if(o.ok||"missing"!==o.kind)return n(o)}let s=eD({name:t.name,mimeType:t.mimeType,parents:[t.folderId]},t.content,t.mimeType);return n(await em("POST",`${ec}?uploadType=multipart&fields=id,size`,e,{raw:s,contentType:r},a))}async function eE(e,t,a={}){let r=await em("PATCH",`${ed}/${encodeURIComponent(t)}?fields=id,trashed`,e,{json:{trashed:!0}},a);return r.ok||"missing"===r.kind?{ok:!0,data:void 0}:r}var ex=e.i(666680),ez=e.i(547963);let eR=ez.n.notSet("GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET",!0),ej="invalid_grant: Google Drive access was removed or has expired. Reconnect Google Drive.",e_=ea.z.object({error:es.z.string()});async function eM(e,t){let a,r=t.timeoutMs??1e4;try{a=await (t.fetch??fetch)("https://oauth2.googleapis.com/token",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded"},body:e.toString(),signal:AbortSignal.timeout(r),cache:"no-store"})}catch(e){return{ok:!1,kind:"transient",error:e instanceof DOMException&&("TimeoutError"===e.name||"AbortError"===e.name)?`Google didn't answer within ${Math.round(r/1e3)} seconds.`:"Couldn't reach Google."}}let n=await a.json().catch(()=>null);if(a.ok)return{ok:!0,body:n};let s=e_.safeParse(n).success?n.error:null;return"invalid_grant"===s?{ok:!1,kind:"revoked",error:ej}:"invalid_client"===s||"unauthorized_client"===s?{ok:!1,kind:"client",error:`Google refused the OAuth client. Check GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET ${ez.n.checkWhere}.`}:429===a.status||a.status>=500?{ok:!1,kind:"transient",error:`Google returned an error (${a.status}). The next run tries again.`}:{ok:!1,kind:"format",error:`Google refused the request (${s??a.status}).`}}ea.z.object({refresh_token:es.z.string().min(1),scope:es.z.string().optional()});let eq=ea.z.object({access_token:es.z.string().min(1)});async function eN(e,t,a={}){let r=await eM(new URLSearchParams({grant_type:"refresh_token",refresh_token:t,client_id:e.clientId,client_secret:e.clientSecret}),a);if(!r.ok)return r;let n=eq.safeParse(r.body);return n.success?{ok:!0,accessToken:n.data.access_token}:{ok:!1,kind:"format",error:"Google answered the token request in a format the console doesn't recognise."}}class eP extends Error{kind;constructor(e,t){super(t),this.kind=e}}async function eC(e){let{month:t,partial:a,now:r}=e,n=function(e=process.env){let t=e.GOOGLE_CLIENT_ID?.trim()??"",a=e.GOOGLE_CLIENT_SECRET?.trim()??"";return a&&/^[\w.-]+\.apps\.googleusercontent\.com$/.test(t)?{clientId:t,clientSecret:a}:null}();if(!n)return{ok:!1,month:t,kind:"env",error:eR};let s=await V();if(!s)return{ok:!1,month:t,kind:"not-connected",error:"Google Drive isn't connected."};if(!s.refreshToken){let e="The stored Google Drive token can't be read (the encryption key changed). Reconnect Google Drive.";return await J(s.id,{status:"error",lastError:e}),{ok:!1,month:t,kind:"failed",error:e}}let o=await Y(t),i={sheetFileId:o?.sheetFileId??null,csvFileId:o?.csvFileId??null,driveFolderId:o?.driveFolderId??null},l=o?.status??"error";await X(t,{status:l,attempts:(o?.attempts??0)+1,startedAt:r});let u=e=>(i={...i,...e},X(t,{status:l,...e})),d={fetch:e.fetch},c=()=>{if(Date.now()>e.deadline)throw new eP("time","Stopped at the daily job's time budget; the next daily run continues where this one stopped.")},p=e=>{if(!e.ok)throw new eP("failed",e.error);return e.data};try{let o,l=await eN(n,s.refreshToken,d);if(!l.ok){if("revoked"===l.kind)throw await J(s.id,{status:"error",lastError:ej}),new eP("revoked",ej);throw new eP("failed",l.error)}"error"===s.status&&await J(s.id,{status:"ok",lastError:null});let f=l.accessToken;c();let m=await Q(),h=m?.id??null;if(m){let e=p(await ek(f,m.id,d));e.usable?e.name&&e.name!==m.name&&await Z(m.id,e.name):h=null}if(!h){c();let e=p(await eb(f,y,d)),t=e?null:p(await eb(f,v,d));h=e??t??p(await ey(f,y,d)),await Z(h,t?v:y)}let w=await et(t,a,r);c(),i.sheetFileId||await u({sheetFileId:p(await ev(f,E(t),h,d)),driveFolderId:h}),c();let $=await e$(f,i.sheetFileId,I,d);$.ok||"missing"!==$.kind||(await u({sheetFileId:p(await ev(f,E(t),h,d)),driveFolderId:h}),c(),$=await e$(f,i.sheetFileId,I,d)),p($),c(),p(await eA(f,i.sheetFileId,function(e){let{start:t,end:a}=S(e.month),r=e.partial&&e.generatedAt<a?e.generatedAt:a,n=e.deployments.filter(_),s=j(e.rollups.map(e=>e.checks)),o=j(e.rollups.map(e=>e.failures)),i=e=>(0,k.G)(e),l=[["Watchbell backup",e.month],["Covers",`${x(t)} to ${x(r)} ${(0,b.zoneName)()}${e.partial?" (month so far)":""}`],["Kind",e.partial?"Partial: Back up now":"Full month"],["Generated",`${x(e.generatedAt)} ${(0,b.zoneName)()}`],[],["Applications watched",e.apps.length],["Uptime, all monitors (%)",z(s,o)],["Checks (rolled-up hours)",s],["Failed checks",o],["Incidents (alerts opened)",e.alerts.length],["Critical incidents",e.alerts.filter(e=>"critical"===e.severity).length],["Production deployments",n.length],["Failed production deployments",n.filter(M).length],["Events",j(e.events.map(e=>e.count))]],u=[["Application","Monitors","Checks","Uptime (%)","p95 response, typical hour (ms)","p95 response, worst hour (ms)","5xx responses","Production deploys","Failed production deploys"]];for(let t of[...e.apps].sort((e,t)=>e.name.localeCompare(t.name))){let a=e.rollups.filter(e=>e.appId===t.id),r=a.map(e=>e.p95Ms).filter(e=>null!==e),s=n.filter(e=>e.appId===t.id);u.push([i(t.name),new Set(a.map(e=>e.monitorId)).size,j(a.map(e=>e.checks)),z(j(a.map(e=>e.checks)),j(a.map(e=>e.failures))),R(r),r.length?Math.max(...r):null,j(a.map(e=>e.status5xx)),s.length,s.filter(M).length])}let d=[["Rule","Severity","Subject",`Started (${(0,b.zoneName)()})`,`Resolved (${(0,b.zoneName)()})`,"Duration","Message"]];for(let t of[...e.alerts].sort((e,t)=>e.startedAt.getTime()-t.startedAt.getTime())){let a=(0,k.o)({title:t.title,message:t.message,causedBy:null,resourceId:t.resourceId},e.book);d.push([t.ruleKey,t.severity,a.title,x(t.startedAt),x(t.resolvedAt),function(e,t,a){let r=Math.max(0,Math.round(((t??a).getTime()-e.getTime())/6e4)),n=r<60?`${r} min`:r<2880?`${Math.floor(r/60)} h ${r%60} min`:`${Math.round(r/1440)} days`;return t?n:`${n} (still open)`}(t.startedAt,t.resolvedAt,r),a.message])}let c=[["Database","Provider","Account","State at backup","Status changes this month","Size (MB)","Neon CU-hours this period","Firestore reads (last reading)"]];for(let t of[...e.databases].sort((t,a)=>(0,k.X)(e.book,t.id).localeCompare((0,k.X)(e.book,a.id)))){let a=j(e.events.filter(e=>"database"===e.type&&e.resourceId===t.id).map(e=>e.count));c.push([(0,k.X)(e.book,t.id),q[t.kind],i(t.account),t.state,a,P(t.sizeBytes),t.cuHours,t.reads])}let p=[["Domain","Application","TLS certificate expires","TLS days left at month end","Domain expires (RDAP)","Domain days left at month end","Registrar"]];for(let t of[...e.domains].sort((e,t)=>e.name.localeCompare(t.name)))p.push([t.name,t.app?i(t.app):"",t.tlsExpires??"",N(t.tlsExpires,r),t.domainExpires??"",N(t.domainExpires,r),t.registrar??""]);return[{title:"Overview",rows:l},{title:"Applications",rows:u},{title:"Incidents",rows:d},{title:"Databases",rows:c},{title:"Domains",rows:p}]}(w),d)),c();let A=(o=function(e){let t=[O.join(",")];for(let a of[...e.rollups].sort((e,t)=>e.hour.getTime()-t.hour.getTime()||e.monitorId.localeCompare(t.monitorId)))t.push(["rollup",a.hour.toISOString(),(0,k.G)(`${a.app}${a.path}`),a.appId,a.checks,a.failures,a.p50Ms,a.p95Ms,a.maxMs,a.status5xx,a.maintenance,null,null,null,null,null,null].map(C).join(","));for(let a of[...e.events].sort((e,t)=>e.at.getTime()-t.at.getTime())){let r=a.resourceId&&e.book.db.some(e=>e.id===a.resourceId)?(0,k.X)(e.book,a.resourceId):(0,k.J)(a.resource??"",e.book);t.push(["event",a.at.toISOString(),r,a.resourceId,null,null,null,null,null,null,null,a.type,a.kind,a.reason,a.count,(0,k.J)(a.message,e.book,a.resourceId),(0,k.J)(a.detail,e.book,a.resourceId)].map(C).join(","))}return`${t.join("\r\n")}\r
13
+ `}(w),(0,g.gzipSync)(Buffer.from(o,"utf8"),{level:9})),D=p(await eT(f,{name:`watchbell-${t}-raw.csv.gz`,mimeType:"application/gzip",folderId:h,content:A,fileId:i.csvFileId},d));await u({csvFileId:D.id}),await X(t,{status:a?"partial":"ok",sizeBytes:D.size,error:null,finishedAt:new Date});let B=a?null:await eO(f,r,e.deadline,d);return{ok:!0,month:t,retention:B,message:`${T(t)}${a?" so far":""} saved to Google Drive.`}}catch(n){let e=n instanceof eP?n:new eP("failed","The backup failed. The next daily run tries again.");n instanceof eP||console.error("backup failed:",n instanceof Error?n.name:"unknown");let r=a&&"partial"===l?"partial":"error";return await X(t,{status:r,error:e.message.slice(0,500),finishedAt:new Date}).catch(()=>void 0),{ok:!1,month:t,kind:e.kind,error:e.message}}}async function eO(e,t,a,r){let n=function(e,t){let a=A(t),r=e.filter(e=>"ok"===e.status&&e.month<a).map(e=>e.month).sort().reverse().slice(0,3);if(r.length<3)return[];let n=r[r.length-1];return e.filter(e=>!e.trashedAt&&e.month<n&&(e.sheetFileId||e.csvFileId))}(await K(),t),s=[];for(let o of n){if(Date.now()>a)break;let n=!0;for(let t of[o.sheetFileId,o.csvFileId])t&&((await eE(e,t,r)).ok||(n=!1));n&&(await X(o.month,{status:o.status,trashedAt:t}),s.push(T(o.month)))}return s.length?`Moved to Drive trash: ${s.join(", ")}.`:null}async function eB(e,t,a={}){let r=await V();if(!r||"error"===r.status&&r.lastError?.startsWith("invalid_grant"))return null;let n=function(e,t){let a=D(A(t)),r=new Map(e.map(e=>[e.month,e.status]));if("ok"!==r.get(a))return a;let n=a;for(let e=1;e<3;e++)if(n=D(n),"error"===r.get(n))return n;return null}(await K(),e);if(!n)return null;let s=await eC({month:n,partial:!1,now:e,deadline:t,...a});return s.ok?null:`${T(n)}: ${s.error}`}var eF=e.i(455891),eG=e.i(889234),eU=e.i(328586),eL=e.i(333407),eW=e.i(459702),eH=e.i(200346),eV=e.i(368230),eJ=e.i(584820),eK=e.i(902509),eY=e.i(668141),eX=e.i(242960),eQ=e.i(112515),eZ=e.i(185890);function e0(e){if(!e)return null;if("unknown"!==e.state)return e.state;let t=e.data?.lastGoodState;return"string"==typeof t&&eZ.f.includes(t)?t:null}let e1={turso_database:"Turso database",upstash_redis:"Upstash Redis",d1_database:"D1 database"};function e3(e,t){return"auth"===e.kind?"auth":"scope"===e.kind?t?"auth":"column":"missing"===e.kind?t?"unknown":"column":"unknown"}var e5=e.i(35048),e4=e.i(516464),e6=e.i(88316),e2=e.i(437122),e8=e.i(319718),e9=e.i(941536),e7=e.i(686454),te=e.i(122603);let tt="skipped the rest, time budget used";function ta(e){let t=e.deadline-Date.now()-500;if(t<250)throw Error(tt);return{timeoutMs:Math.min(5e3,t)}}async function tr(e,t,a){let r=!1;return{out:await (0,te.P)(t,3,async t=>{let n;try{n=ta(e)}catch{r=!0;return}return a(t,n)}),skipped:r}}function tn(e){if(e)throw Error(tt)}async function ts(e){let t=await (0,a.db)().select().from(h.accounts).where((0,d.and)((0,d.eq)(h.accounts.provider,e),(0,d.eq)(h.accounts.status,"ok"))),r=(0,G.serverEnv)().OPS_ENCRYPTION_KEY;return t.map(e=>({acc:e,credential:(0,B.V)({ciphertext:e.credentialCiphertext,iv:e.credentialIv},r)}))}function to(e,t){return(0,a.db)().select({r:h.resources,s:h.snapshots}).from(h.resources).leftJoin(h.snapshots,(0,d.eq)(h.snapshots.resourceId,h.resources.id)).where((0,d.and)((0,d.eq)(h.resources.accountId,e),(0,d.eq)(h.resources.kind,t),(0,d.eq)(h.resources.monitored,!0),(0,d.isNull)(h.resources.goneAt))).limit(100)}let ti=e=>t.sql`${h.snapshots.data} || ${JSON.stringify(e)}::jsonb`;async function tl(e,t,r){let n=e0(e.s?{state:e.s.state,data:e.s.data}:null),s="unknown"===t.state,o=s?n?{lastGoodState:n}:{}:{...t.patch,lastGoodState:t.state},i=!s&&n!==t.state;return await (0,a.db)().insert(h.snapshots).values({resourceId:e.r.id,state:t.state,data:o,collectedAt:r,stateSince:r}).onConflictDoUpdate({target:h.snapshots.resourceId,set:{state:t.state,data:ti(o),...s?{}:{collectedAt:r},...i?{stateSince:r}:{}}}),s?null:function(e){let{prev:t,next:a}=e;if(null===t||"unknown"===t||"unknown"===a||t===a)return null;let r={resourceId:e.resourceId,type:"database",at:e.at};if("supabase_project"===e.kind)return"paused"===a?{...r,reason:"DatabasePaused",kind:"paused",message:"Supabase project paused",detail:"Status changed to INACTIVE"}:"ok"===a?{...r,reason:"DatabaseRestored",kind:"ok",message:"Supabase project active again",detail:"Status changed to ACTIVE_HEALTHY"}:"warn"===a?{...r,reason:"DatabaseUnhealthy",kind:"warn",message:"Supabase project unhealthy",detail:e.label}:"err"===a?{...r,reason:"DatabaseFailed",kind:"err",message:`Supabase project: ${e.label.toLowerCase()}`,detail:e.label}:null;if("neon_project"===e.kind)return"err"===a?{...r,reason:"NeonSuspended",kind:"err",message:"Neon compute suspended",detail:e.label}:"err"===t&&("ok"===a||"idle"===a)?{...r,reason:"NeonAvailable",kind:"ok",message:"Neon compute available again",detail:e.label}:null;let n=e1[e.kind];if(n)return"err"===a?{...r,reason:"DatabaseFailed",kind:"err",message:`${n}: ${e.label.toLowerCase()}`,detail:e.label}:"off"===a?{...r,reason:"DatabaseMissing",kind:"off",message:`${n} missing`,detail:e.label}:"ok"===a&&("err"===t||"off"===t)?{...r,reason:"DatabaseRestored",kind:"ok",message:`${n} available again`,detail:e.label}:null;if("err"===a){let t="Daily quota used up"===e.label;return{...r,reason:t?"FirestoreQuotaUsedUp":"FirestoreUnreachable",kind:"err",message:t?"Firestore daily quota used up":"Firestore not reachable",detail:e.label}}return"off"===a?{...r,reason:"FirestoreMissing",kind:"off",message:"Firestore database missing",detail:e.label}:"ok"===a&&("err"===t||"off"===t)?{...r,reason:"FirestoreReachable",kind:"ok",message:"Firestore reachable again",detail:e.label}:null}({kind:e.r.kind,resourceId:e.r.id,prev:n,next:t.state,label:t.label,at:r})}async function tu(e,t){await (0,a.db)().update(h.snapshots).set({data:ti(t)}).where((0,d.eq)(h.snapshots.resourceId,e.r.id))}let td=e=>(0,eL.f)(e);async function tc(e,t,r,n,s){if("auth"===e3(n,!0)){let e=(0,eQ.E)({ok:!1,kind:"auth",error:n.error});e&&await (0,a.db)().update(h.accounts).set({...e,updatedAt:s.now}).where((0,d.eq)(h.accounts.id,t.id))}for(let e of r)await tl(e,{state:"unknown",label:"Unknown",patch:{}},s.now);s.errors.push(`${e}/${t.label}: ${n.error}`)}let tp=e=>e.toISOString();async function tf(e){return e.length?new Set((await (0,a.db)().select({app:h.links.fromResourceId,state:h.snapshots.state,data:h.snapshots.data}).from(h.links).innerJoin(h.resources,(0,d.eq)(h.resources.id,h.links.toResourceId)).innerJoin(h.snapshots,(0,d.eq)(h.snapshots.resourceId,h.resources.id)).where((0,d.and)((0,d.eq)(h.links.kind,"uses_db"),(0,d.inArray)(h.links.fromResourceId,e),(0,d.eq)(h.resources.monitored,!0),(0,d.isNull)(h.resources.goneAt)))).filter(e=>"paused"===e.state||"unknown"===e.state&&"paused"===e.data.lastGoodState).map(e=>e.app)):new Set}async function tm(e){for(let{acc:t,credential:a}of(await ts("supabase"))){if(ta(e),!a){e.errors.push(`supabase/${t.label}: credential can't be read`);continue}let r=await to(t.id,"supabase_project");if(!r.length)continue;let n=await (0,e7.W)(a,ta(e));if(!n.ok){await tc("supabase",t,r,n,e);continue}let s=new Map(n.data.map(e=>[e.ref,e])),o=[];for(let t of r){let a=s.get(t.r.externalId);if(!a){o.push(await tl(t,{state:"off",label:"Not found",patch:{status:"REMOVED"}},e.now));continue}let r=(0,e6.P)(a.status),n=e0(t.s?{state:t.s.state,data:t.s.data}:null),i={status:a.status,region:a.region,pgVersion:a.pgVersion,orgSlug:a.orgSlug};"paused"===r.state&&"paused"!==n&&(i.pausedBeforeSeen=null===n),o.push(await tl(t,{state:r.state,label:r.label,patch:i},e.now))}await td(o);let i=new Map(r.map(e=>[e.r.externalId,e.r.id])),l=n.data.map(e=>({resourceId:i.get(e.ref)??null,accountId:t.id,status:e.status,orgSlug:e.orgSlug}));await (0,eH.z)(e.now,l,e.deadline).catch(()=>{console.warn("auto-restore failed"),e.errors.push("auto-restore failed")})}}async function th(e){for(let{acc:t,credential:a}of(await ts("supabase"))){if(ta(e),!a)continue;let r=await to(t.id,"supabase_project");if(!r.length)continue;let n=new Map(r.map(e=>[e.r.id,(0,F.k)(F.B,e.s?.data)])),s=new Map;for(let r of new Set([...n.values()].map(e=>e.orgSlug).filter(e=>!!e))){let n=await (0,e7.K)(a,r,ta(e));s.set(r,n.ok&&null!==n.data?"free"===n.data:null),n.ok||"scope"===n.kind||e.errors.push(`supabase/${t.label} plan: ${n.error}`)}let{skipped:o}=await tr(e,r,async(t,r)=>{let o=n.get(t.r.id),i={freeOrg:o.orgSlug?s.get(o.orgSlug)??null:null};if((o.status??"").startsWith("ACTIVE_")){let[n,s]=await Promise.all([(0,e7.F)(a,t.r.externalId,r),(0,e7.Z)(a,t.r.externalId,r)]);n.ok?Object.assign(i,{health:n.data.map(({name:e,status:t})=>({name:e,status:t})),healthAt:tp(e.now),healthError:null}):"column"===e3(n,!1)?i.healthError=n.error:e.errors.push(`supabase/${t.r.name} health: ${n.error}`),s.ok?Object.assign(i,{lastTrafficAt:(0,e6.H)(s.data)?.toISOString()??null,trafficAt:tp(e.now),trafficError:null}):"column"===e3(s,!1)?i.trafficError=s.error:e.errors.push(`supabase/${t.r.name} traffic: ${s.error}`)}await tu(t,i)});tn(o)}}async function tw(e){for(let{acc:t,credential:a}of(await ts("neon"))){if(ta(e),!a){e.errors.push(`neon/${t.label}: credential can't be read`);continue}let r=await to(t.id,"neon_project");if(!r.length)continue;let{out:n,skipped:s}=await tr(e,r,(e,t)=>Promise.all([(0,e9.Z)(a,e.r.externalId,t),(0,e9.k)(a,e.r.externalId,t),(0,e9.e)(a,e.r.externalId,t)])),o=n.flat().find(e=>void 0!==e&&!e.ok&&"auth"===e.kind);if(o){await tc("neon",t,r,o,e);continue}let i=[];for(let[t,a]of r.entries()){let r=n[t];if(!r)continue;let[s,o,l]=r;if(!s.ok||!o.ok||!l.ok){let t=[s,o,l].find(e=>!e.ok);"missing"===t.kind?i.push(await tl(a,{state:"off",label:"Not found",patch:{}},e.now)):(await tl(a,{state:"unknown",label:"Unknown",patch:{}},e.now),e.errors.push(`neon/${a.r.name}: ${t.error}`));continue}let u=(0,e4.p)({endpoints:o.data,computeSeconds:s.data.computeSeconds});i.push(await tl(a,{state:u.state,label:u.label,patch:{region:s.data.region,pgVersion:s.data.pgVersion,computeSeconds:s.data.computeSeconds,transferBytes:s.data.transferBytes,activeSeconds:s.data.activeSeconds,periodStart:s.data.periodStart,periodEnd:s.data.periodEnd,endpoints:o.data,branches:l.data}},e.now))}await td(i),tn(s)}}async function tg(e){for(let{acc:t,credential:a}of(await ts("firebase"))){ta(e);let r=a?(0,e8.p)(a):null;if(!r){e.errors.push(`firebase/${t.label}: credential can't be read`);continue}let n=await to(t.id,"firestore");if(!n.length)continue;let s=await (0,e8.X)(r,ta(e));if(!s.ok){await tc("firebase",t,n,s,e);continue}let{out:o,skipped:i}=await tr(e,n,(e,t)=>(0,e2.G)(s.data,e.r.externalId,t)),l=[];for(let[t,a]of n.entries()){let r=o[t];if(!r)continue;let n=(0,e5.g)(r);"unknown"!==n.state||r.ok||e.errors.push(`firebase/${a.r.name}: ${r.error}`);let s=r.ok?{latencyMs:r.data.latencyMs,pingError:null,pingReason:null,pingKind:null}:{pingError:r.error,pingReason:r.reason??null,pingKind:r.kind};l.push(await tl(a,{...n,patch:s},e.now))}await td(l),tn(i)}}async function tb(e){for(let{acc:t,credential:a}of(await ts("firebase"))){ta(e);let r=a?(0,e8.p)(a):null;if(!r)continue;let n=(await to(t.id,"firestore")).filter(e=>e.s?.state!=="off");if(!n.length)continue;let s=await (0,e8.X)(r,ta(e));if(!s.ok){e.errors.push(`firebase/${t.label}: ${s.error}`);continue}let o=(0,e5.a)(e.now),{skipped:i}=await tr(e,n,async(t,a)=>{let r=await (0,e2.W)(s.data,t.r.externalId,o,e.now,a);r.ok?await tu(t,{...r.data,opsAt:tp(e.now),opsError:null}):"column"===e3(r,!1)?await tu(t,{reads:null,writes:null,deletes:null,opsAt:tp(e.now),opsError:/requires billing/i.test(r.message??"")?"Not available on Spark: Firestore usage needs billing (Blaze plan)":"SERVICE_DISABLED"===r.reason?"Not readable: the Cloud Monitoring API is off in this project":"Not readable: the service account needs monitoring.viewer"}):e.errors.push(`firebase/${t.r.name} usage: ${r.error}`)});tn(i)}}async function tk(e){let t=Date.now()+2*Math.max(0,e.deadline-Date.now())/3,a=await ty(()=>tv({...e,deadline:t})),r=await ty(()=>tI(e));if(a)throw a;if(r)throw r}async function ty(e){try{return await e(),null}catch(e){return e instanceof Error?e:Error(String(e))}}async function tv(e){for(let{acc:t,credential:a}of(await ts("supabase")))if(ta(e),a)for(let r of(await to(t.id,"supabase_project"))){let t=(0,F.k)(F.B,r.s?.data);if(!(0,e6.z)({status:t.status??"",lastTrafficAt:t.lastTrafficAt?new Date(t.lastTrafficAt):null,sizeAt:t.sizeAt?new Date(t.sizeAt):null,now:e.now}))continue;let n=await (0,e7.r)(a,r.r.externalId,ta(e));n.ok?await tu(r,{sizeBytes:n.data,sizeAt:tp(e.now),sizeError:null}):"column"===e3(n,!1)?await tu(r,{sizeError:n.error}):e.errors.push(`supabase/${r.r.name} size: ${n.error}`)}}async function tI(e){for(let{acc:t,credential:a}of(await ts("firebase"))){ta(e);let r=a?(0,e8.p)(a):null;if(!r)continue;let n=(await to(t.id,"firestore")).filter(e=>e.s?.state!=="off");if(!n.length)continue;let s=await (0,e8.X)(r,ta(e));if(!s.ok){e.errors.push(`firebase/${t.label}: ${s.error}`);continue}let{skipped:o}=await tr(e,n,async(t,a)=>{let r=await (0,e2.q)(s.data,t.r.externalId,a);r.ok?await tu(t,{authUsers:r.data,authAt:tp(e.now),authError:null}):"column"===e3(r,!1)?await tu(t,{authError:"Not readable: the service account needs firebaseauth.viewer"}):e.errors.push(`firebase/${t.r.name} users: ${r.error}`)});tn(o)}}var t$=e.i(369179),tA=e.i(476866),tS=e.i(649297),tD=e.i(541211);async function tT(e){let[t]=await (0,a.db)().select({hour:(0,c.max)(h.rollupsHourly.hour)}).from(h.rollupsHourly),r=(0,tS.r)(t?.hour??null,e),n=await (0,a.db)().select().from(h.checks).where((0,d.and)((0,d.gte)(h.checks.at,r),(0,d.lt)(h.checks.at,(0,tS.b)(e)))).orderBy(h.checks.at),s=new Map;for(let e of n){let t=`${e.monitorId}|${(0,tS.b)(e.at).toISOString()}`,a=s.get(t);a?a.push(e):s.set(t,[e])}for(let[e,t]of s){let[r,n]=e.split("|"),s=(0,tS.z)(t);await (0,a.db)().insert(h.rollupsHourly).values({monitorId:r,hour:new Date(n),...s}).onConflictDoUpdate({target:[h.rollupsHourly.monitorId,h.rollupsHourly.hour],set:s})}}async function tE(e){let t=await (0,tA.J)().catch(()=>t$.f);await (0,a.db)().delete(h.checks).where((0,d.lt)(h.checks.at,new Date(e.getTime()-864e5*t.checks))),await (0,a.db)().delete(h.rollupsHourly).where((0,d.lt)(h.rollupsHourly.hour,new Date(e.getTime()-864e5*t.rollupsHourly))),await (0,a.db)().delete(h.deployments).where((0,d.and)((0,d.lt)(h.deployments.createdAtProvider,new Date(e.getTime()-864e5*t.deployments)),(0,d.eq)(h.deployments.isCurrent,!1),(0,d.eq)(h.deployments.isPreviousProduction,!1))),await (0,a.db)().delete(h.events).where((0,d.lt)(h.events.at,new Date(e.getTime()-864e5*t.events))),await (0,a.db)().delete(h.alerts).where((0,d.and)((0,d.isNotNull)(h.alerts.resolvedAt),(0,d.lt)(h.alerts.resolvedAt,new Date(e.getTime()-864e5*t.alerts)))),await (0,a.db)().delete(h.collectorRuns).where((0,d.lt)(h.collectorRuns.startedAt,new Date(e.getTime()-864e5*t.collectorRuns))),await (0,a.db)().delete(h.storedLogs).where((0,d.lt)(h.storedLogs.at,new Date(e.getTime()-864e5*t.storedLogs))),await (0,a.db)().delete(h.recommendationDismissals).where((0,d.lt)(h.recommendationDismissals.dismissedAt,new Date(e.getTime()-864e5*t.recommendationDismissals)))}async function tx(){let e=new Date,[t]=await (0,a.db)().insert(h.collectorRuns).values({startedAt:e,trigger:"vercel_cron"}).returning({id:h.collectorRuns.id}),r=[],n=[["rollups",()=>tT(e)],["backup",async()=>{let t=await eB(e,e.getTime()+2e4);t&&r.push(`backup: ${t}`)}],["retention",()=>tE(e)],["sync",async()=>{let t=await (0,a.db)().select({id:h.accounts.id,label:h.accounts.label,provider:h.accounts.provider}).from(h.accounts).where((0,d.inArray)(h.accounts.provider,eY.I));for(let[a,n]of t.entries()){if(Date.now()>e.getTime()+25e3){r.push(`sync: ${t.length-a} account${t.length-a>1?"s":""} left for the next run, time budget used`);break}let s=await (0,eX.k)(n.id);s.ok?(s.skippedTeams.length&&r.push(`sync ${n.provider}/${n.label}: skipped teams ${s.skippedTeams.join(", ")} (no access)`),s.overLimit&&r.push(`sync ${n.provider}/${n.label}: ${s.overLimit}`)):r.push(`sync ${n.provider}/${n.label}: ${s.error}`)}}],["github",async()=>{let t=await (0,eU.D)(Math.min(Date.now()+6e3,e.getTime()+35e3));t&&r.push(`github: ${t}`)}],["deps",async()=>{let t=await (0,eG.e)(Math.min(Date.now()+eG.o,e.getTime()+eG.R));t&&r.push(`deps: ${t}`)}],["databases",()=>tk({now:e,deadline:Math.min(Date.now()+15e3,e.getTime()+5e4),errors:r})],["keep-active",()=>(0,eH.V)(e,Math.min(Date.now()+5e3,e.getTime()+5e4),r)],["security",async()=>{for(let t of(await (0,eJ.h)((0,eK.F)(e.getTime(),Date.now()))).failed)r.push(`security ${t}`)}],["advisor",async()=>{await (0,eF.O)(e)}]],s=[];try{for(let[e,t]of n)try{await t(),s.push(e)}catch(t){r.push(`${e}: ${(0,tD.safeError)(t)}`)}await (0,eL.f)([{type:"system",kind:r.length?"warn":"info",message:r.length?"Daily jobs finished with problems":"Daily jobs finished",detail:"Rollups, the monthly backup when due, retention, a sync of every account, database sizes, the Next.js security check and the Advisor",resourceId:null}])}catch(e){r.push(`events: ${(0,tD.safeError)(e)}`)}finally{f(m.t),await (0,a.db)().update(h.collectorRuns).set({finishedAt:new Date,ok:0===r.length,errorSummary:r.join("\n").slice(0,2e3)||null,durationMs:Date.now()-e.getTime(),tasks:s}).where((0,d.eq)(h.collectorRuns.id,t.id)).catch(()=>void 0)}await tz(r.length>0);let o=Date.now()-e.getTime();return{skipped:!1,ok:0===r.length,tasks:s,checks:0,durationMs:o,errors:r}}async function tz(e){let t=process.env.DAILY_HEARTBEAT_TOKEN;if(!t)return;let a=(0,eV.i)(t);if(!a)return void console.warn("daily heartbeat: DAILY_HEARTBEAT_TOKEN holds no single hb_ token; set it to the heartbeat's token");let r=await (0,eW._)(a,e?"fail":"ok",new Date).catch(e=>(console.warn("daily heartbeat: the ping couldn't be stored:",e instanceof Error?e.name:"error"),null));r?.status==="unknown"?console.warn("daily heartbeat: DAILY_HEARTBEAT_TOKEN matches no heartbeat monitor (was it regenerated?)"):r?.status==="limited"&&console.warn("daily heartbeat: the ping was rate limited")}async function tR(e,t,a=new Date){if(e.skipped||0===t.length)return e;let r=[...e.tasks],n=[...e.errors];for(let e of t)try{await e.run(a),r.push(e.name)}catch(t){n.push(`${e.name}: ${(0,tD.safeError)(t)}`)}return{...e,tasks:r,errors:n,ok:0===n.length}}var tj=e.i(234195),t_=e.i(706959),tM=e.i(451682),tq=e.i(373200),tN=e.i(753535),tP=e.i(932378),tC=e.i(313903);let tO=/not enabled/i,tB=(e,t,a={})=>({ok:!1,kind:e,error:t,...a}),tF="Vercel Web Analytics answered in a format the console doesn't recognise.",tG=ea.z.object({data:ea.z.object({pageviews:ei.z.number().finite().nonnegative(),visitors:ei.z.number().finite().nonnegative()})}),tU=ea.z.object({data:er.z.array(tP.z.unknown())}),tL=ea.z.object({timestamp:es.z.string().transform((e,t)=>{let a=Date.parse(e);return Number.isNaN(a)?(t.addIssue({code:"custom",message:"bad timestamp"}),tC.z.NEVER):a}),pageviews:ei.z.number().finite().nonnegative().nullish().catch(null)});async function tW(e,t,a,r){let n=r.since.toISOString(),s=r.until.toISOString(),o=r.fetch??fetch,i=new AbortController,l=setTimeout(()=>i.abort(new DOMException("window","TimeoutError")),r.timeoutMs??8e3),u=r.signal?AbortSignal.any([i.signal,r.signal]):i.signal,d=(0,te.X)(u);async function c(l,c){let p=new URLSearchParams({projectId:a,teamId:t,...c,since:n,until:s});try{let t=await Promise.race([o(`https://api.vercel.com/v1/query/web-analytics/visits/${l}?${p}`,{headers:{Authorization:`Bearer ${e}`,Accept:"application/json"},signal:u,cache:"no-store"}),d]),a=null,r=!1;if(401===t.status||403===t.status)a=tB("auth",`Vercel rejected this credential (${t.status}).`,{status:t.status});else if(429===t.status){let e=Number(t.headers.get("Retry-After"));a=tB("transient","Vercel says there were too many requests.",{status:429,retryAfterS:Number.isFinite(e)&&e>0?e:60})}else if(400===t.status){let e=await Promise.race([t.text(),d]).catch(()=>"");tO.test(e)?r=!0:a=tB("transient","Vercel Web Analytics rejected the request (400).",{status:400})}else t.ok||(a=tB("transient",`Vercel Web Analytics returned an error (${t.status}).`,{status:t.status}));if(r)return{kind:"off"};if(a)return await t.body?.cancel().catch(()=>void 0),{kind:"fail",fail:a};try{return{kind:"body",body:await Promise.race([t.json(),d])}}catch(e){if(u.aborted)throw e;return{kind:"fail",fail:tB("format",tF)}}}catch{return{kind:"fail",fail:u.aborted?i.signal.aborted&&!r.signal?.aborted?tB("transient","Vercel Web Analytics didn't answer in time."):tB("transient","Reading Vercel Web Analytics was cancelled."):tB("transient","Couldn't reach Vercel Web Analytics.")}}}try{let[e,t]=await Promise.all([c("count",{}),c("aggregate",{by:"hour"})]);if("off"===e.kind||"off"===t.kind)return{ok:!0,enabled:!1};let a=[e,t].flatMap(e=>"fail"===e.kind?[e.fail]:[]),r=a.find(e=>"auth"===e.kind);if(r)return r;let n="body"===t.kind?tU.safeParse(t.body):null,s="fail"===t.kind?t.fail:n?.success?null:tB("format",tF),o=a.find(e=>"transient"===e.kind);if(o)return o;if(s)return s;if(!n?.success)return tB("format",tF);let i="body"===e.kind?tG.safeParse(e.body):null,l=n.data.data.flatMap(e=>{let t=tL.safeParse(e);return t.success?[t.data]:[]});if(l.length>0&&l.every(e=>null==e.pageviews))return tB("format",tF);let u=new Map;for(let e of l){let t=36e5*Math.floor(e.timestamp/36e5);u.set(t,(u.get(t)??0)+(e.pageviews??0))}let d=[...u].sort((e,t)=>e[0]-t[0]).slice(-24).map(([e,t])=>({at:new Date(e),views:t}));if(i?.success)return{ok:!0,enabled:!0,total:i.data.data.pageviews,visitors:i.data.data.visitors,hourly:d};return{ok:!0,enabled:!0,total:d.reduce((e,t)=>e+t.views,0),visitors:null,hourly:d}}finally{clearTimeout(l),i.abort()}}var tH=e.i(178233);async function tV(e,t,a){let r=await (0,tM.g)(null);if(!r.length)return;let n=new Date(36e5*Math.floor(e.getTime()/36e5)-828e5);await (0,te.P)(r,3,async r=>{if(Date.now()+8500>t)return;let s=await tW(r.token,r.teamId,r.projectId,{since:n,until:e});if(!s.ok)return void a.push(`pageviews/${r.appName}: ${s.error}`);try{await (0,tN.r)(r.appId,{pageviews:(0,tH.Z)(s,e)},e)}catch{a.push(`pageviews/${r.appName}: couldn't save the page views`)}})}var tJ=e.i(147100),tK=e.i(764266),tY=e.i(198552),tX=e.i(27479),tQ=e.i(707866),tZ=e.i(392710),t0=e.i(582888),t1=e.i(811539),t3=e.i(725321);async function t5(e){let t=[await ty(()=>t6(e)),await ty(()=>t8(e)),await ty(()=>t9(e))].find(e=>null!==e);if(t)throw t}let t4=e=>e.toISOString();async function t6(e){for(let{acc:t,credential:a}of(await ts("turso"))){if(ta(e),!a){e.errors.push(`turso/${t.label}: credential can't be read`);continue}let r=await to(t.id,"turso_database");if(!r.length)continue;let n=await (0,t0.u)(a,ta(e));if(!n.ok){await tc("turso",t,r,n,e);continue}let s=new Set(r.map(e=>String(e.r.meta.org??""))),o=[];for(let i of n.data.filter(e=>s.has(e.slug))){let[n,s]=await Promise.all([(0,t0.X)(a,i.slug,ta(e)),(0,t0.d)(a,i.slug,ta(e))]),l=r.filter(e=>e.r.meta.org===i.slug);if(!n.ok){for(let t of l)await tl(t,{state:"unknown",label:"Unknown",patch:{}},e.now);e.errors.push(`turso/${t.label}: ${n.error}`);continue}let u=new Map(n.data.map(e=>[e.id,e]));for(let t of l)o.push(await t2(t,u.get(t.r.externalId),i,s,e))}let i=new Set(n.data.map(e=>e.slug));for(let t of r.filter(e=>!i.has(String(e.r.meta.org??""))))o.push(await tl(t,{state:"off",label:"Organization not visible to this token",patch:{}},e.now));await td(o)}}async function t2(e,t,a,r,n){if(!t)return tl(e,{state:"off",label:"Not found",patch:{}},n.now);let s=(0,tQ.h)({blockReads:t.blockReads,blockWrites:t.blockWrites,orgBlockedReads:a.blockedReads,orgBlockedWrites:a.blockedWrites}),o={org:a.slug,group:t.group,primaryRegion:t.primaryRegion,plan:a.plan,blockReads:t.blockReads,blockWrites:t.blockWrites};if(r.ok){let e=r.data.byDb.get(t.id);Object.assign(o,{rowsRead:e?.rowsRead??null,rowsWritten:e?.rowsWritten??null,storageBytes:e?.storageBytes??null,orgRowsRead:r.data.org.rowsRead,orgRowsWritten:r.data.org.rowsWritten,orgStorageBytes:r.data.org.storageBytes,orgDatabases:r.data.org.databases,usageAt:t4(n.now),usageError:null})}else"column"===e3(r,!1)?o.usageError=r.error:n.errors.push(`turso/${e.r.name} usage: ${r.error}`);return tl(e,{...s,patch:o},n.now)}async function t8(e){for(let{acc:t,credential:a}of(await ts("upstash"))){ta(e);let r=a?(0,t1.L)(a):null;if(!r){e.errors.push(`upstash/${t.label}: credential can't be read`);continue}let n=await to(t.id,"upstash_redis");if(!n.length)continue;let s=await (0,t1.M)(r,ta(e));if(!s.ok){await tc("upstash",t,n,s,e);continue}let o=new Map(s.data.map(e=>[e.id,e])),{out:i,skipped:l}=await tr(e,n,(e,t)=>o.has(e.r.externalId)?(0,t1.Z)(r,e.r.externalId,t):Promise.resolve(null)),u=[];for(let[t,a]of n.entries()){let r=o.get(a.r.externalId);if(!r){u.push(await tl(a,{state:"off",label:"Not found",patch:{}},e.now));continue}let n=(0,tQ.t)(r.state),s={region:r.region,status:r.state,type:r.type},l=i[t];l?.ok?Object.assign(s,{...l.data,statsAt:t4(e.now),statsError:null}):l&&"column"===e3(l,!1)?s.statsError=l.error:l&&e.errors.push(`upstash/${a.r.name} stats: ${l.error}`),u.push(await tl(a,{...n,patch:s},e.now))}await td(u),tn(l)}}async function t9(e){let t={};for(let{acc:a,credential:r}of(await ts("cloudflare"))){if(ta(e),!r)continue;let n=await ae(a.id,r,e);if(!n.length){t[a.id]={d1:"error",analytics:null,at:t4(e.now),note:"No Cloudflare account found for this token"};continue}let s="ok",o=null;for(let t of n){let n=await (0,tZ.L)(r,t,ta(e));if(!n.ok){"error"==(s="scope"===n.kind||"auth"===n.kind?"missing":"error")&&e.errors.push(`d1/${a.label}: ${n.error}`);continue}await at(a.id,t,n.data,e.now);let i=(await to(a.id,"d1_database")).filter(e=>e.r.meta.accountId===t);if(!i.length)continue;let l=await (0,tZ.t)(r,t,(0,tZ.Y)(e.now),ta(e));o=l.ok?o??"ok":"scope"===l.kind?"missing":o??"error",l.ok||"scope"===l.kind||e.errors.push(`d1/${a.label} analytics: ${l.error}`);let{out:u,skipped:d}=await tr(e,i,(e,a)=>(0,tZ.m)(r,t,e.r.externalId,a)),c=new Map((l.ok?l.data:[]).map(e=>[e.databaseId,e])),p=u.map(e=>e?.ok?e.data.sizeBytes??0:0),f={accountRowsRead:l.ok?l.data.reduce((e,t)=>e+t.rowsRead,0):null,accountRowsWritten:l.ok?l.data.reduce((e,t)=>e+t.rowsWritten,0):null,accountSizeBytes:u.every(e=>e?.ok)?p.reduce((e,t)=>e+t,0):null,accountDatabases:n.data.length},m=[];for(let[t,a]of i.entries()){let r=u[t];void 0!==r&&m.push(await t7(a,r,c.get(a.r.externalId)??null,l.ok,l.ok?null:l.error,f,e))}await td(m),tn(d)}t[a.id]={d1:s,analytics:o,at:t4(e.now),note:null}}await (0,a.db)().insert(h.settings).values({key:t3.f,value:t}).onConflictDoUpdate({target:h.settings.key,set:{value:t,updatedAt:e.now}})}async function t7(e,t,a,r,n,s,o){let i={accountId:e.r.meta.accountId??null,createdAt:e.r.meta.createdAt??null,accountDatabases:s.accountDatabases};return(t.ok?Object.assign(i,{sizeBytes:t.data.sizeBytes,numTables:t.data.numTables,readReplication:t.data.readReplication,detailsAt:t4(o.now),detailsError:null}):"scope"===t.kind?i.detailsError=t.error:o.errors.push(`d1/${e.r.name}: ${t.error}`),r?Object.assign(i,{rowsRead:a?.rowsRead??0,rowsWritten:a?.rowsWritten??0,readQueries:a?.readQueries??0,writeQueries:a?.writeQueries??0,accountRowsRead:s.accountRowsRead,accountRowsWritten:s.accountRowsWritten,usageDay:(0,tZ.Y)(o.now),usageAt:t4(o.now),usageError:null}):i.usageError=n,null!==s.accountSizeBytes&&(i.accountSizeBytes=s.accountSizeBytes),t.ok||"transient"!==t.kind)?tl(e,{...(0,tQ.c)(r?s:{accountRowsRead:null,accountRowsWritten:null}),patch:i},o.now):tl(e,{state:"unknown",label:"Unknown",patch:{}},o.now)}async function ae(e,t,r){let n=new Set,s=await (0,tZ.N)(t,ta(r));if(s.ok)for(let e of s.data)n.add(e.id);for(let t of(await (0,a.db)().select({meta:h.resources.meta}).from(h.resources).where((0,d.and)((0,d.eq)(h.resources.accountId,e),(0,d.eq)(h.resources.kind,"zone"),(0,d.isNull)(h.resources.goneAt))).limit(200)))"string"==typeof t.meta.accountId&&/^[0-9a-f]{32}$/i.test(t.meta.accountId)&&n.add(t.meta.accountId);return[...n].slice(0,5)}async function at(e,t,r,n){let s=(await (0,a.db)().select({id:h.resources.id,externalId:h.resources.externalId,meta:h.resources.meta,goneAt:h.resources.goneAt}).from(h.resources).where((0,d.and)((0,d.eq)(h.resources.accountId,e),(0,d.eq)(h.resources.kind,"d1_database")))).filter(e=>e.meta.accountId===t),o=new Map(s.map(e=>[e.externalId,e])),i=new Set(r.map(e=>e.uuid));await (0,a.db)().transaction(async a=>{for(let s of r){let r={accountId:t,createdAt:s.createdAt},i=o.get(s.uuid);i?await a.update(h.resources).set({name:s.name,meta:r,lastSeenAt:n,goneAt:null,updatedAt:n}).where((0,d.eq)(h.resources.id,i.id)):await a.insert(h.resources).values({accountId:e,kind:"d1_database",externalId:s.uuid,name:s.name,meta:r,monitored:!0,lastSeenAt:n}).onConflictDoNothing({target:[h.resources.accountId,h.resources.kind,h.resources.externalId]})}let l=s.filter(e=>!i.has(e.externalId)&&!e.goneAt).map(e=>e.id);l.length&&await a.update(h.resources).set({goneAt:n,updatedAt:n}).where((0,d.inArray)(h.resources.id,l))})}var aa=e.i(628852);async function ar(e=new Date){let n=(0,ex.randomUUID)(),s=new Date(e.getTime()+aa.d).toISOString(),o=await (0,a.db)().execute(t.sql`
14
14
  insert into ops.settings (key, value) values ('collector.lease', ${JSON.stringify({until:s,owner:n})}::jsonb)
15
15
  on conflict (key) do update set value = excluded.value, updated_at = now()
16
16
  where (ops.settings.value->>'until')::timestamptz < ${e.toISOString()}::timestamptz
17
- returning key`);return(0,r.f)(o).length>0?n:null}async function ar(e){await (0,a.db)().execute(t.sql`
17
+ returning key`);return(0,r.f)(o).length>0?n:null}async function an(e){await (0,a.db)().execute(t.sql`
18
18
  update ops.settings set value = jsonb_build_object('until', '1970-01-01T00:00:00Z'), updated_at = now()
19
- where key = 'collector.lease' and value->>'owner' = ${e}`)}var an=e.i(991219),as=e.i(149398),ao=e.i(467404),ai=e.i(816173);e.i(247714);let al="collector.lastRun",au="vercel.backoffUntil",ad="vercel.currentMiss",ac={supabase:tf,supabaseUsage:tm,neon:th,firebase:tw,firebaseUsage:tg,extraDbs:t5};async function ap(){let[e]=await (0,a.db)().select().from(h.settings).where((0,d.eq)(h.settings.key,al)).limit(1);return e?.value??{}}async function af(e){await (0,a.db)().insert(h.settings).values({key:al,value:e}).onConflictDoUpdate({target:h.settings.key,set:{value:e,updatedAt:new Date}})}let am=e=>(0,eG.f)(e);async function ah(e,r,n,s,o=[]){let i=(await (0,a.db)().select({m:h.monitors,app:h.resources}).from(h.monitors).innerJoin(h.resources,(0,d.eq)(h.resources.id,h.monitors.resourceId)).where((0,d.and)((0,d.eq)(h.monitors.kind,"http"),(0,d.eq)(h.monitors.paused,!1),(0,d.eq)(h.monitors.ownerPaused,!1),(0,d.eq)(h.resources.monitored,!0),(0,d.isNull)(h.resources.goneAt))).orderBy(t.sql`${h.monitors.lastCheckedAt} asc nulls first`,h.monitors.id)).filter(({m:t})=>(0,at.B)(t.lastCheckedAt,e,s));if(!i.length)return 0;let l=await (0,e7.P)(i,6,({m:e})=>{let t=(0,at.P)(e.timeoutMs,r,Date.now());return null===t?Promise.resolve(null):(0,e7.b)(e.url,{expectedStatus:e.expectedStatus,timeoutMs:t,body:(0,as.C)(e)})}),u=i.flatMap((e,t)=>l[t]?[{...e,r:l[t]}]:[]);if(u.length<i.length&&n.push(`checks: ${i.length-u.length} monitors skipped, time budget used`),!u.length)return 0;let c=[];for(let t of u)await (0,ao.f)(t.m,t.r,e)&&c.push(t);return c.length?(await (0,a.db)().insert(h.checks).values(c.map(({m:t,app:a,r})=>({monitorId:t.id,at:e,ok:r.ok,statusCode:r.statusCode,latencyMs:r.latencyMs,error:r.error,inMaintenance:null!==(0,tJ.x)(o,{monitorId:t.id,appId:a.id},e)}))),await am(c.map(({m:t,app:a,r})=>(0,ai.F)({resourceId:a.id,path:(0,tK.K)(t.url),prev:t.state,next:(0,ai.G)(t.failStreak,r).state,code:r.statusCode,error:r.error,at:e}))),c.length):0}let aw=["checks","heartbeats"];async function ag(e,t,a=tM.f){if(!aw.some(t=>e.includes(t)))return[];try{return await a()}catch(e){return t.push(`maintenance: ${(0,tS.safeError)(e)}`),[]}}async function ab(e){let[t]=await (0,a.db)().select().from(h.settings).where((0,d.eq)(h.settings.key,au)).limit(1),r=t?.value?.until;return!!r&&e.getTime()<new Date(r).getTime()}async function ak(e,t){if("transient"!==e.kind||!e.retryAfterS)return!1;let r={until:new Date(t.getTime()+1e3*Math.min(e.retryAfterS,3600)).toISOString()};return await (0,a.db)().insert(h.settings).values({key:au,value:r}).onConflictDoUpdate({target:h.settings.key,set:{value:r,updatedAt:t}}),!0}let ay=e=>t.sql`coalesce(${h.deployments.externalId} = ${e}::text, false)`;async function av(e,r,n){if(await ab(e))return;let s=(0,B.serverEnv)().OPS_ENCRYPTION_KEY;for(let o of(await (0,a.db)().select().from(h.accounts).where((0,d.and)((0,d.eq)(h.accounts.provider,"vercel"),(0,d.eq)(h.accounts.status,"ok"))))){let i=(0,O.V)({ciphertext:o.credentialCiphertext,iv:o.credentialIv},s);if((0,eX.A)(i)||!i){n.push(`vercel/${o.label}: credential can't be read`);continue}let l=await (0,a.db)().select().from(h.resources).where((0,d.and)((0,d.eq)(h.resources.accountId,o.id),(0,d.eq)(h.resources.kind,"app"),(0,d.eq)(h.resources.monitored,!0),(0,d.isNull)(h.resources.goneAt)));if(!l.length)continue;let u=new Map(l.map(e=>[e.externalId,e])),c=await (0,tY.X)(i);if(!c.ok){let t=(0,eX.E)({ok:!1,kind:c.kind,error:c.error});if(t&&await (0,a.db)().update(h.accounts).set({...t,updatedAt:e}).where((0,d.eq)(h.accounts.id,o.id)),n.push(`vercel/${o.label}: ${c.error}`),await ak(c,e))return;continue}let p=new Set(l.map(e=>String(e.meta.teamId)));for(let s of c.data.filter(e=>p.has(e.id))){if(Date.now()>r)return void n.push("vercel: skipped remaining teams, time budget used");let[o,c]=await Promise.all([(0,tY.W)(i,s),(0,tY.K)(i,s,{since:e.getTime()-6048e5,limit:100})]);if(!o.ok||!c.ok){let t=o.ok?c:o;if(n.push(`vercel/${s.name}: ${t.error}`),await ak(t,e))return;continue}let p=new Map(o.data.map(e=>[e.id,e.currentDeploymentId])),f=c.data.filter(e=>u.has(e.projectId)),m=new Map((f.length?await (0,a.db)().select({externalId:h.deployments.externalId,state:h.deployments.state,target:h.deployments.target,branch:h.deployments.branch,commitSha:h.deployments.commitSha,commitMessage:h.deployments.commitMessage,source:h.deployments.source,url:h.deployments.url,buildingAt:h.deployments.buildingAt,readyAt:h.deployments.readyAt}).from(h.deployments).where((0,d.inArray)(h.deployments.externalId,f.map(e=>e.id))):[]).map(e=>[e.externalId,e])),w=[];for(let t of f){let r=u.get(t.projectId),n=m.get(t.id),s={state:t.state,target:t.target,branch:t.branch,commitSha:t.sha,commitMessage:t.message,source:t.source,url:t.url,buildingAt:t.buildingAt,readyAt:t.readyAt};if((0,tK.E)(n,s)){let n={resourceId:r.id,externalId:t.id,...s,createdAtProvider:t.createdAt,updatedAt:e};await (0,a.db)().insert(h.deployments).values(n).onConflictDoUpdate({target:h.deployments.externalId,set:n})}w.push((0,ai.L)(n?.state,t,r.id,e))}await am(w);let g=l.filter(e=>String(e.meta.teamId)===s.id),b=await (0,a.db)().select({resourceId:h.deployments.resourceId,id:h.deployments.externalId,createdAt:h.deployments.createdAtProvider}).from(h.deployments).where((0,d.and)((0,d.inArray)(h.deployments.resourceId,g.map(e=>e.id)),(0,d.eq)(h.deployments.target,"production"),(0,d.eq)(h.deployments.state,"ready"))),[k]=await (0,a.db)().select().from(h.settings).where((0,d.eq)(h.settings.key,ad)).limit(1),y=[],v=()=>y.length?(0,a.db)().insert(h.settings).values({key:ad,value:(0,tK.Y)(k?.value,y,e)}).onConflictDoUpdate({target:h.settings.key,set:{value:(0,tK.Y)(k?.value,y,e),updatedAt:e}}):Promise.resolve();for(let t of(0,tK.Q)(g,p,b,(0,tK.S)(k?.value,e))){if(Date.now()>r)break;let o=await (0,tY.S)(i,s,t.deploymentId);if(!o.ok){if(n.push(`vercel/${s.name}: current deployment: ${o.error}`),await ak(o,e))return void await v();y.push(t.deploymentId);continue}let l=o.data,u={resourceId:t.appId,externalId:l.id,state:l.state,target:l.target,branch:l.branch,commitSha:l.sha,commitMessage:l.message,source:l.source,url:l.url,buildingAt:l.buildingAt,readyAt:l.readyAt,createdAtProvider:l.createdAt,updatedAt:e};await (0,a.db)().insert(h.deployments).values(u).onConflictDoUpdate({target:h.deployments.externalId,set:u}),"ready"===l.state&&"production"===l.target?b.push({resourceId:t.appId,id:l.id,createdAt:l.createdAt}):y.push(t.deploymentId)}for(let r of(await v(),g)){let{currentId:n,previousId:s}=(0,tK.a)(b.filter(e=>e.resourceId===r.id),p.get(r.externalId)??null);await (0,a.db)().update(h.deployments).set({isCurrent:ay(n),isPreviousProduction:ay(s),updatedAt:e}).where((0,d.and)((0,d.eq)(h.deployments.resourceId,r.id),(0,d.or)(t.sql`${h.deployments.isCurrent} is distinct from ${ay(n)}`,t.sql`${h.deployments.isPreviousProduction} is distinct from ${ay(s)}`)))}}}}async function aI(e){let r=await (0,a.db)().select().from(h.resources).where((0,d.and)((0,d.eq)(h.resources.kind,"app"),(0,d.eq)(h.resources.monitored,!0),(0,d.isNull)(h.resources.goneAt)));if(!r.length)return;let n=await (0,a.db)().select().from(h.monitors).where((0,d.and)((0,d.inArray)(h.monitors.resourceId,r.map(e=>e.id)),(0,d.eq)(h.monitors.paused,!1),(0,d.eq)(h.monitors.ownerPaused,!1))),s=new Set((await (0,a.db)().select({r:h.deployments.resourceId}).from(h.deployments).where((0,d.and)((0,d.inArray)(h.deployments.resourceId,r.map(e=>e.id)),(0,d.eq)(h.deployments.target,"production"),(0,d.eq)(h.deployments.state,"building"),(0,d.gte)(h.deployments.createdAtProvider,new Date(e.getTime()-36e5))))).map(e=>e.r)),o=await tp(r.map(e=>e.id)),i=new Map((await (0,a.db)().select().from(h.snapshots).where((0,d.inArray)(h.snapshots.resourceId,r.map(e=>e.id)))).map(e=>[e.resourceId,e]));for(let l of r){let r=n.filter(e=>e.resourceId===l.id),u=(0,ai.V)({monitors:r.map(e=>e.state),building:s.has(l.id),dbPaused:o.has(l.id)}),d=r.find(e=>"err"===e.state)??r.find(e=>"warn"===e.state),c={code:d?.lastStatus??null,latencyMs:r.find(e=>"heartbeat"!==e.kind)?.lastLatencyMs??null,dbPaused:o.has(l.id)},p=i.get(l.id);await (0,a.db)().insert(h.snapshots).values({resourceId:l.id,state:u,data:c,collectedAt:e,stateSince:e}).onConflictDoUpdate({target:h.snapshots.resourceId,set:{state:u,data:t.sql`${h.snapshots.data} || ${JSON.stringify(c)}::jsonb`,collectedAt:e,...p?.state!==u?{stateSince:e}:{}}})}}async function a$(e,t={}){let a={writeLastRun:af,refreshApps:aI,refreshNetwork:an.x,invalidate:f,...t};try{await a.writeLastRun({...e.lastRun,...Object.fromEntries(e.done.map(t=>[t,e.started.toISOString()]))});try{await a.refreshApps(new Date)}catch(t){e.errors.push(`app-snapshots: ${(0,tS.safeError)(t)}`)}if(e.done.some(e=>an.p.includes(e)))try{await a.refreshNetwork(new Date)}catch(t){e.errors.push(`network-states: ${(0,tS.safeError)(t)}`)}}finally{a.invalidate((0,m.o)(e.tried??e.done))}}async function aA(e,t,a,r={evaluate:tR.$,deliver:t_.q,digest:t_.J}){let n=[];if(e.includes("alerts"))if(Date.now()>t)a.push("alerts: skipped, time budget used");else{let e=!0;try{await r.evaluate(new Date),console.info("collector alerts evaluated")}catch(t){e=!1,a.push(`alerts: ${(0,tS.safeError)(t)}`)}try{await r.deliver(new Date,t),console.info("collector notifications delivered")}catch(t){e=!1,a.push(`notify: ${(0,tS.safeError)(t)}`)}e&&n.push("alerts")}if(e.includes("digest")&&(0,at.z)("digest",t,Date.now()))try{await r.digest(new Date),console.info("collector digest done"),n.push("digest")}catch(e){a.push(`digest: ${(0,tS.safeError)(e)}`)}return n}async function aS(e,t,a,r){let n=[],s=[];for(let o of e){if(Date.now()>t){a.push(`${o}: skipped, time budget used`);continue}if((0,at.z)(o,t,Date.now())){s.push(o);try{await r(o),n.push(o)}catch(e){a.push(`${o}: ${(0,tS.safeError)(e)}`)}}}return{done:n,tried:s}}async function aD(e){let t,r=new Date,n=await aa(r);if(!n)return{skipped:!0,ok:!0,tasks:[],checks:0,durationMs:0,errors:[]};try{[t]=await (0,a.db)().insert(h.collectorRuns).values({startedAt:r,trigger:"builtin"===e?"manual":e}).returning({id:h.collectorRuns.id})}catch(e){throw await ar(n).catch(()=>void 0),e}let s=[],o=[],i=0,l=r.getTime()+at.p,u=e=>console.info(`collector ${e} +${Date.now()-r.getTime()}ms`);try{u("start");let t=await ap(),a="cron_job_org"!==e&&"builtin"!==e,n=(0,at.S)(t,r,a),d=n.filter(e=>at.u.includes(e)),c=d.includes("alerts")?l-at.X:l,p=await ag(n,s);u(`due ${n.join(",")}`);let{done:f,tried:m}=await aS(n.filter(e=>!at.u.includes(e)),c,s,async e=>{if(u(`task ${e}`),"heartbeats"===e){let e=new Date;i+=await (0,eW.r)(e,(t,a)=>null!==(0,tJ.x)(p,{monitorId:t,appId:a},e),a)}"checks"===e&&(i+=await ah(new Date,c,s,a,p)),"vercel"===e&&await av(new Date,c,s);let t=ac[e];t&&await t({now:new Date,deadline:c,errors:s}),"cloudflare"===e&&await (0,an.h)(new Date,c,s),"domains"===e&&await (0,an.H)(new Date,c,s),"tls"===e&&await (0,an.V)(new Date,c,s),"rdap"===e&&await (0,an.W)(new Date,c,s),"eol"===e&&await (0,an.i)(new Date,c,s),"status"===e&&await (0,tV.i)(new Date),"logs"===e&&await (0,tj._)(new Date,c,s),"pageviews"===e&&await tH(new Date,c,s)});o.push(...f),u("main done"),await a$({lastRun:t,done:o,tried:m,started:r,errors:s}),u("settled");let h=await aA(d,l,s);u("post done"),h.length&&await af({...t,...Object.fromEntries([...o,...h].map(e=>[e,r.toISOString()]))}),o.push(...h)}catch(e){s.push(`run: ${(0,tS.safeError)(e)}`)}finally{let e=Date.now()-r.getTime();await (0,a.db)().update(h.collectorRuns).set({finishedAt:new Date,ok:0===s.length,errorSummary:s.join("\n").slice(0,2e3)||null,durationMs:e,tasks:o,checks:i}).where((0,d.eq)(h.collectorRuns.id,t.id)).catch(()=>void 0),await ar(n).catch(()=>void 0)}return{skipped:!1,ok:0===s.length,tasks:o,checks:i,durationMs:Date.now()-r.getTime(),errors:s}}var aT=e.i(486118);async function aE(e){let t=[...u,...aT.extensions.minuteSteps??[]];if(!t.length)return;let a=new Date,r={deadline:e+6e4-5e3};for(let e of t)try{await e.run(a,r)}catch{console.warn(`minute step ${e.name} failed`)}}async function ax(e,t=Date.now()){let a=await aD(e);return await aE(t),a}async function az(){return tz(await tE(),aT.extensions.dailySteps??[])}e.s(["runDailyAll",0,az,"runMinute",0,ax],380167)}];
19
+ where key = 'collector.lease' and value->>'owner' = ${e}`)}var as=e.i(991219),ao=e.i(149398),ai=e.i(467404),al=e.i(816173);e.i(247714);let au="collector.lastRun",ad="vercel.backoffUntil",ac="vercel.currentMiss",ap={supabase:tm,supabaseUsage:th,neon:tw,firebase:tg,firebaseUsage:tb,extraDbs:t5};async function af(){let[e]=await (0,a.db)().select().from(h.settings).where((0,d.eq)(h.settings.key,au)).limit(1);return e?.value??{}}async function am(e){await (0,a.db)().insert(h.settings).values({key:au,value:e}).onConflictDoUpdate({target:h.settings.key,set:{value:e,updatedAt:new Date}})}let ah=e=>(0,eL.f)(e);async function aw(e,r,n,s,o=[]){let i=(await (0,a.db)().select({m:h.monitors,app:h.resources}).from(h.monitors).innerJoin(h.resources,(0,d.eq)(h.resources.id,h.monitors.resourceId)).where((0,d.and)((0,d.eq)(h.monitors.kind,"http"),(0,d.eq)(h.monitors.paused,!1),(0,d.eq)(h.monitors.ownerPaused,!1),(0,d.eq)(h.resources.monitored,!0),(0,d.isNull)(h.resources.goneAt))).orderBy(t.sql`${h.monitors.lastCheckedAt} asc nulls first`,h.monitors.id)).filter(({m:t})=>(0,aa.B)(t.lastCheckedAt,e,s));if(!i.length)return 0;let l=await (0,te.P)(i,6,({m:e})=>{let t=(0,aa.P)(e.timeoutMs,r,Date.now());return null===t?Promise.resolve(null):(0,te.b)(e.url,{expectedStatus:e.expectedStatus,timeoutMs:t,body:(0,ao.C)(e)})}),u=i.flatMap((e,t)=>l[t]?[{...e,r:l[t]}]:[]);if(u.length<i.length&&n.push(`checks: ${i.length-u.length} monitors skipped, time budget used`),!u.length)return 0;let c=[];for(let t of u)await (0,ai.f)(t.m,t.r,e)&&c.push(t);return c.length?(await (0,a.db)().insert(h.checks).values(c.map(({m:t,app:a,r})=>({monitorId:t.id,at:e,ok:r.ok,statusCode:r.statusCode,latencyMs:r.latencyMs,error:r.error,inMaintenance:null!==(0,tK.x)(o,{monitorId:t.id,appId:a.id},e)}))),await ah(c.map(({m:t,app:a,r})=>(0,al.F)({resourceId:a.id,path:(0,tX.K)(t.url),prev:t.state,next:(0,al.G)(t.failStreak,r).state,code:r.statusCode,error:r.error,at:e}))),c.length):0}let ag=["checks","heartbeats"];async function ab(e,t,a=t_.f){if(!ag.some(t=>e.includes(t)))return[];try{return await a()}catch(e){return t.push(`maintenance: ${(0,tD.safeError)(e)}`),[]}}async function ak(e){let[t]=await (0,a.db)().select().from(h.settings).where((0,d.eq)(h.settings.key,ad)).limit(1),r=t?.value?.until;return!!r&&e.getTime()<new Date(r).getTime()}async function ay(e,t){if("transient"!==e.kind||!e.retryAfterS)return!1;let r={until:new Date(t.getTime()+1e3*Math.min(e.retryAfterS,3600)).toISOString()};return await (0,a.db)().insert(h.settings).values({key:ad,value:r}).onConflictDoUpdate({target:h.settings.key,set:{value:r,updatedAt:t}}),!0}let av=e=>t.sql`coalesce(${h.deployments.externalId} = ${e}::text, false)`;async function aI(e,r,n){if(await ak(e))return;let s=(0,G.serverEnv)().OPS_ENCRYPTION_KEY;for(let o of(await (0,a.db)().select().from(h.accounts).where((0,d.and)((0,d.eq)(h.accounts.provider,"vercel"),(0,d.eq)(h.accounts.status,"ok"))))){let i=(0,B.V)({ciphertext:o.credentialCiphertext,iv:o.credentialIv},s);if((0,eQ.A)(i)||!i){n.push(`vercel/${o.label}: credential can't be read`);continue}let l=await (0,a.db)().select().from(h.resources).where((0,d.and)((0,d.eq)(h.resources.accountId,o.id),(0,d.eq)(h.resources.kind,"app"),(0,d.eq)(h.resources.monitored,!0),(0,d.isNull)(h.resources.goneAt)));if(!l.length)continue;let u=new Map(l.map(e=>[e.externalId,e])),c=await (0,tY.X)(i);if(!c.ok){let t=(0,eQ.E)({ok:!1,kind:c.kind,error:c.error});if(t&&await (0,a.db)().update(h.accounts).set({...t,updatedAt:e}).where((0,d.eq)(h.accounts.id,o.id)),n.push(`vercel/${o.label}: ${c.error}`),await ay(c,e))return;continue}let p=new Set(l.map(e=>String(e.meta.teamId)));for(let s of c.data.filter(e=>p.has(e.id))){if(Date.now()>r)return void n.push("vercel: skipped remaining teams, time budget used");let[o,c]=await Promise.all([(0,tY.W)(i,s),(0,tY.K)(i,s,{since:e.getTime()-6048e5,limit:100})]);if(!o.ok||!c.ok){let t=o.ok?c:o;if(n.push(`vercel/${s.name}: ${t.error}`),await ay(t,e))return;continue}let p=new Map(o.data.map(e=>[e.id,e.currentDeploymentId])),f=c.data.filter(e=>u.has(e.projectId)),m=new Map((f.length?await (0,a.db)().select({externalId:h.deployments.externalId,state:h.deployments.state,target:h.deployments.target,branch:h.deployments.branch,commitSha:h.deployments.commitSha,commitMessage:h.deployments.commitMessage,source:h.deployments.source,url:h.deployments.url,buildingAt:h.deployments.buildingAt,readyAt:h.deployments.readyAt}).from(h.deployments).where((0,d.inArray)(h.deployments.externalId,f.map(e=>e.id))):[]).map(e=>[e.externalId,e])),w=[];for(let t of f){let r=u.get(t.projectId),n=m.get(t.id),s={state:t.state,target:t.target,branch:t.branch,commitSha:t.sha,commitMessage:t.message,source:t.source,url:t.url,buildingAt:t.buildingAt,readyAt:t.readyAt};if((0,tX.E)(n,s)){let n={resourceId:r.id,externalId:t.id,...s,createdAtProvider:t.createdAt,updatedAt:e};await (0,a.db)().insert(h.deployments).values(n).onConflictDoUpdate({target:h.deployments.externalId,set:n})}w.push((0,al.L)(n?.state,t,r.id,e))}await ah(w);let g=l.filter(e=>String(e.meta.teamId)===s.id),b=await (0,a.db)().select({resourceId:h.deployments.resourceId,id:h.deployments.externalId,createdAt:h.deployments.createdAtProvider}).from(h.deployments).where((0,d.and)((0,d.inArray)(h.deployments.resourceId,g.map(e=>e.id)),(0,d.eq)(h.deployments.target,"production"),(0,d.eq)(h.deployments.state,"ready"))),[k]=await (0,a.db)().select().from(h.settings).where((0,d.eq)(h.settings.key,ac)).limit(1),y=[],v=()=>y.length?(0,a.db)().insert(h.settings).values({key:ac,value:(0,tX.Y)(k?.value,y,e)}).onConflictDoUpdate({target:h.settings.key,set:{value:(0,tX.Y)(k?.value,y,e),updatedAt:e}}):Promise.resolve();for(let t of(0,tX.Q)(g,p,b,(0,tX.S)(k?.value,e))){if(Date.now()>r)break;let o=await (0,tY.S)(i,s,t.deploymentId);if(!o.ok){if(n.push(`vercel/${s.name}: current deployment: ${o.error}`),await ay(o,e))return void await v();y.push(t.deploymentId);continue}let l=o.data,u={resourceId:t.appId,externalId:l.id,state:l.state,target:l.target,branch:l.branch,commitSha:l.sha,commitMessage:l.message,source:l.source,url:l.url,buildingAt:l.buildingAt,readyAt:l.readyAt,createdAtProvider:l.createdAt,updatedAt:e};await (0,a.db)().insert(h.deployments).values(u).onConflictDoUpdate({target:h.deployments.externalId,set:u}),"ready"===l.state&&"production"===l.target?b.push({resourceId:t.appId,id:l.id,createdAt:l.createdAt}):y.push(t.deploymentId)}for(let r of(await v(),g)){let{currentId:n,previousId:s}=(0,tX.a)(b.filter(e=>e.resourceId===r.id),p.get(r.externalId)??null);await (0,a.db)().update(h.deployments).set({isCurrent:av(n),isPreviousProduction:av(s),updatedAt:e}).where((0,d.and)((0,d.eq)(h.deployments.resourceId,r.id),(0,d.or)(t.sql`${h.deployments.isCurrent} is distinct from ${av(n)}`,t.sql`${h.deployments.isPreviousProduction} is distinct from ${av(s)}`)))}}}}async function a$(e){let r=await (0,a.db)().select().from(h.resources).where((0,d.and)((0,d.eq)(h.resources.kind,"app"),(0,d.eq)(h.resources.monitored,!0),(0,d.isNull)(h.resources.goneAt)));if(!r.length)return;let n=await (0,a.db)().select().from(h.monitors).where((0,d.and)((0,d.inArray)(h.monitors.resourceId,r.map(e=>e.id)),(0,d.eq)(h.monitors.paused,!1),(0,d.eq)(h.monitors.ownerPaused,!1))),s=new Set((await (0,a.db)().select({r:h.deployments.resourceId}).from(h.deployments).where((0,d.and)((0,d.inArray)(h.deployments.resourceId,r.map(e=>e.id)),(0,d.eq)(h.deployments.target,"production"),(0,d.eq)(h.deployments.state,"building"),(0,d.gte)(h.deployments.createdAtProvider,new Date(e.getTime()-36e5))))).map(e=>e.r)),o=await tf(r.map(e=>e.id)),i=new Map((await (0,a.db)().select().from(h.snapshots).where((0,d.inArray)(h.snapshots.resourceId,r.map(e=>e.id)))).map(e=>[e.resourceId,e]));for(let l of r){let r=n.filter(e=>e.resourceId===l.id),u=(0,al.V)({monitors:r.map(e=>e.state),building:s.has(l.id),dbPaused:o.has(l.id)}),d=r.find(e=>"err"===e.state)??r.find(e=>"warn"===e.state),c={code:d?.lastStatus??null,latencyMs:r.find(e=>"heartbeat"!==e.kind)?.lastLatencyMs??null,dbPaused:o.has(l.id)},p=i.get(l.id);await (0,a.db)().insert(h.snapshots).values({resourceId:l.id,state:u,data:c,collectedAt:e,stateSince:e}).onConflictDoUpdate({target:h.snapshots.resourceId,set:{state:u,data:t.sql`${h.snapshots.data} || ${JSON.stringify(c)}::jsonb`,collectedAt:e,...p?.state!==u?{stateSince:e}:{}}})}}async function aA(e,t={}){let a={writeLastRun:am,refreshApps:a$,refreshNetwork:as.x,invalidate:f,...t};try{await a.writeLastRun({...e.lastRun,...Object.fromEntries(e.done.map(t=>[t,e.started.toISOString()]))});try{await a.refreshApps(new Date)}catch(t){e.errors.push(`app-snapshots: ${(0,tD.safeError)(t)}`)}if(e.done.some(e=>as.p.includes(e)))try{await a.refreshNetwork(new Date)}catch(t){e.errors.push(`network-states: ${(0,tD.safeError)(t)}`)}}finally{a.invalidate((0,m.o)(e.tried??e.done))}}async function aS(e,t,a,r={evaluate:tj.$,deliver:tq.q,digest:tq.J}){let n=[];if(e.includes("alerts"))if(Date.now()>t)a.push("alerts: skipped, time budget used");else{let e=!0;try{await r.evaluate(new Date),console.info("collector alerts evaluated")}catch(t){e=!1,a.push(`alerts: ${(0,tD.safeError)(t)}`)}try{await r.deliver(new Date,t),console.info("collector notifications delivered")}catch(t){e=!1,a.push(`notify: ${(0,tD.safeError)(t)}`)}e&&n.push("alerts")}if(e.includes("digest")&&(0,aa.z)("digest",t,Date.now()))try{await r.digest(new Date),console.info("collector digest done"),n.push("digest")}catch(e){a.push(`digest: ${(0,tD.safeError)(e)}`)}return n}async function aD(e,t,a,r){let n=[],s=[];for(let o of e){if(Date.now()>t){a.push(`${o}: skipped, time budget used`);continue}if((0,aa.z)(o,t,Date.now())){s.push(o);try{await r(o),n.push(o)}catch(e){a.push(`${o}: ${(0,tD.safeError)(e)}`)}}}return{done:n,tried:s}}async function aT(e){let t,r=new Date,n=await ar(r);if(!n)return{skipped:!0,ok:!0,tasks:[],checks:0,durationMs:0,errors:[]};try{[t]=await (0,a.db)().insert(h.collectorRuns).values({startedAt:r,trigger:"builtin"===e?"manual":e}).returning({id:h.collectorRuns.id})}catch(e){throw await an(n).catch(()=>void 0),e}let s=[],o=[],i=0,l=r.getTime()+aa.p,u=e=>console.info(`collector ${e} +${Date.now()-r.getTime()}ms`);try{u("start");let t=await af(),a="cron_job_org"!==e&&"builtin"!==e,n=(0,aa.S)(t,r,a),d=n.filter(e=>aa.u.includes(e)),c=d.includes("alerts")?l-aa.X:l,p=await ab(n,s);u(`due ${n.join(",")}`);let{done:f,tried:m}=await aD(n.filter(e=>!aa.u.includes(e)),c,s,async e=>{if(u(`task ${e}`),"heartbeats"===e){let e=new Date;i+=await (0,eW.r)(e,(t,a)=>null!==(0,tK.x)(p,{monitorId:t,appId:a},e),a)}"checks"===e&&(i+=await aw(new Date,c,s,a,p)),"vercel"===e&&await aI(new Date,c,s);let t=ap[e];t&&await t({now:new Date,deadline:c,errors:s}),"cloudflare"===e&&await (0,as.h)(new Date,c,s),"domains"===e&&await (0,as.H)(new Date,c,s),"tls"===e&&await (0,as.V)(new Date,c,s),"rdap"===e&&await (0,as.W)(new Date,c,s),"eol"===e&&await (0,as.i)(new Date,c,s),"status"===e&&await (0,tJ.i)(new Date),"logs"===e&&await (0,tM._)(new Date,c,s),"pageviews"===e&&await tV(new Date,c,s)});o.push(...f),u("main done"),await aA({lastRun:t,done:o,tried:m,started:r,errors:s}),u("settled");let h=await aS(d,l,s);u("post done"),h.length&&await am({...t,...Object.fromEntries([...o,...h].map(e=>[e,r.toISOString()]))}),o.push(...h)}catch(e){s.push(`run: ${(0,tD.safeError)(e)}`)}finally{let e=Date.now()-r.getTime();await (0,a.db)().update(h.collectorRuns).set({finishedAt:new Date,ok:0===s.length,errorSummary:s.join("\n").slice(0,2e3)||null,durationMs:e,tasks:o,checks:i}).where((0,d.eq)(h.collectorRuns.id,t.id)).catch(()=>void 0),await an(n).catch(()=>void 0)}return{skipped:!1,ok:0===s.length,tasks:o,checks:i,durationMs:Date.now()-r.getTime(),errors:s}}var aE=e.i(486118);async function ax(e){let t=[...u,...aE.extensions.minuteSteps??[]];if(!t.length)return;let a=new Date,r={deadline:e+6e4-5e3};for(let e of t)try{await e.run(a,r)}catch{console.warn(`minute step ${e.name} failed`)}}async function az(e,t=Date.now()){let a=await aT(e);return await ax(t),a}async function aR(){return tR(await tx(),aE.extensions.dailySteps??[])}e.s(["runDailyAll",0,aR,"runMinute",0,az],380167)}];
20
20
 
21
21
  //# sourceMappingURL=src_lib_collector_runners_ts_12z4gtgikss74._.js.map
@@ -1,3 +1,3 @@
1
- (()=>{"use strict";module.exports=[426099,e=>{var t=e.i(875225),r=e.i(971724),s=e.i(105954),a=e.i(604147),n=e.i(455744),i=e.i(924924),o=e.i(618916),l=e.i(61926),u=e.i(218331);let c=e=>{let t=(0,u.C)(e);return`${t.day} ${t.month} ${t.year}`},d=e=>e.toLocaleDateString("en-CA",{timeZone:u.h});var p=e.i(122143),m=e.i(775843),f=e.i(146394),h=e.i(69679),g=e.i(145647);let y="advisor.latest",w=r.z.object({key:s.z.string(),severity:a.z.enum(["warning","info"]),appId:s.z.string().nullable(),subject:s.z.string(),title:s.z.string(),why:s.z.string(),fix:s.z.string(),href:s.z.string()}),k=r.z.object({at:s.z.string(),items:n.z.array(w)});async function b(e){let r=(0,t.b)((0,t.u)(o.resources.kind,"app"),(0,t.u)(o.resources.monitored,!0),(0,t.M)(o.resources.goneAt)),s=await (0,g.P)(),a=await (0,h.V)(),[n,u,c,d,y]=await Promise.all([(0,i.f)().select({id:o.monitors.id,appId:o.monitors.resourceId,appName:o.resources.name,url:o.monitors.url,kind:o.monitors.kind,name:o.monitors.name,paused:o.monitors.paused,ownerPaused:o.monitors.ownerPaused,lastStatus:o.monitors.lastStatus,expectedStatus:o.monitors.expectedStatus,lastPingAt:o.monitors.lastPingAt,createdAt:o.monitors.createdAt}).from(o.monitors).innerJoin(o.resources,(0,t.u)(o.resources.id,o.monitors.resourceId)).where(r).orderBy(o.resources.name,o.monitors.url).limit(f.O.monitors),(0,i.f)().select({id:o.resources.id,name:o.resources.name,version:o.appSecurity.version}).from(o.resources).innerJoin(o.appSecurity,(0,t.u)(o.appSecurity.resourceId,o.resources.id)).where(r).orderBy(o.resources.name).limit(f.O.apps),(0,i.f)().select({id:o.resources.id,name:o.resources.name,kind:o.resources.kind,accountId:o.resources.accountId,accountLabel:o.accounts.label,state:o.snapshots.state}).from(o.resources).innerJoin(o.accounts,(0,t.u)(o.accounts.id,o.resources.accountId)).leftJoin(o.snapshots,(0,t.u)(o.snapshots.resourceId,o.resources.id)).where((0,t.b)((0,t.y)(o.resources.kind,[...p.H]),(0,t.u)(o.resources.monitored,!0),(0,t.M)(o.resources.goneAt))).orderBy(o.resources.name).limit(f.O.databases),(0,i.f)().select({appId:o.links.fromResourceId,dbId:o.links.toResourceId}).from(o.links).where((0,t.u)(o.links.kind,"uses_db")).limit(f.O.apps),(0,i.f)().select({id:o.accounts.id,provider:o.accounts.provider,label:o.accounts.label,expiresAt:o.accounts.expiresAt,scopeNote:o.accounts.scopeNote}).from(o.accounts).orderBy(o.accounts.label).limit(200)]);return{now:e,monitors:n.map(e=>({id:e.id,appId:e.appId,appName:e.appName,path:"heartbeat"===e.kind?e.url:(0,l.K)(e.url),kind:e.kind,name:e.name,paused:e.paused||e.ownerPaused,lastStatus:e.lastStatus,expectedStatus:e.expectedStatus,lastPingAt:e.lastPingAt,createdAt:e.createdAt})),eol:function(e,t){if(!t)return null;let r=t.cycles.find(e=>!e.isEol)?.latest??null,s=[];for(let a of e){let e=a.version?.split(".")[0],n=e?t.cycles.find(t=>t.name===e):void 0;n&&s.push({appId:a.id,appName:a.name,cycle:n.name,eolFrom:n.eolFrom?new Date(`${n.eolFrom}T00:00:00Z`):null,latest:r})}return s}(u,s),headers:null,dbs:c.map(e=>({id:e.id,name:e.name,provider:(0,p.Z)(e.kind),accountId:e.accountId,accountLabel:e.accountLabel,state:e.state??"unknown"})),slots:(0,m.f)(a).map(e=>({account:e.account,used:e.used,total:e.total,planUnknown:e.planUnknown})),links:d,accounts:y}}async function v(e){let t=function(e){let t=[];for(let r of e.eol??[]){if(!r.eolFrom||r.eolFrom.getTime()-e.now.getTime()>2592e6)continue;let s=r.eolFrom.getTime()<=e.now.getTime(),a=r.latest?.split(".")[0];t.push({key:`next-eol:${r.appId}:${r.cycle}`,severity:"warning",appId:r.appId,subject:r.appName,title:`Next.js ${r.cycle} ${s?"reached":"reaches"} end of life on ${c(r.eolFrom)}`,why:`No security fixes after that date.${r.latest?` Latest is ${r.latest}.`:""}`,fix:a?`Upgrade to Next.js ${a}.`:"Upgrade Next.js.",href:"https://endoflife.date/nextjs"})}for(let r of e.monitors)!r.paused&&("heartbeat"===r.kind&&!r.lastPingAt&&e.now.getTime()-r.createdAt.getTime()>864e5&&t.push({key:`hb-silent:${r.id}`,severity:"warning",appId:r.appId,subject:r.appName,title:`${r.name??"A heartbeat"} has never pinged`,why:"It was added more than a day ago and no job has called its URL.",fix:"Add the ping to the job, or delete the monitor.",href:"/uptime"}),"http"===r.kind&&"/"===r.path&&200===r.expectedStatus&&null!==r.lastStatus&&[401,403,404].includes(r.lastStatus)&&t.push({key:`monitor-root:${r.id}:${r.lastStatus}`,severity:"info",appId:r.appId,subject:r.appName,title:`The monitor on / answers ${r.lastStatus}`,why:`A login or missing page answering ${r.lastStatus} makes the monitor look down.`,fix:`Point the monitor at a public health route, or expect ${r.lastStatus}.`,href:"/uptime"}));for(let r of e.headers??[]){if(!r.missing.length)continue;let e=[...r.missing].sort();t.push({key:`headers:${r.appId}:${e.join(",")}`,severity:"info",appId:r.appId,subject:r.appName,title:`Missing security headers: ${e.join(", ")}`,why:"Browsers use them to block clickjacking, sniffing and downgrade attacks.",fix:"Add them in next.config headers().",href:"https://developer.mozilla.org/en-US/observatory"})}for(let r of e.slots??[])r.used<r.total||t.push({key:`no-slot:${r.account}`,severity:"warning",appId:null,subject:`supabase \xb7 ${r.account}`,title:`Account ${r.account} has no free slot`,why:r.planUnknown?"Two projects are active. If this account is on the free plan (it couldn't be read), a paused one can't be restored here.":"Both free projects are active, so a paused one can't be restored here.",fix:"Pause one project, or move one to another account.",href:"/supabase"});if(e.dbs&&e.links){let r=new Set(e.links.map(e=>e.dbId));for(let s of e.dbs.filter(e=>!r.has(e.id)))t.push({key:`db-unlinked:${s.id}`,severity:"info",appId:null,subject:s.name,title:"Database isn't linked to any app",why:"Topology and the app status can't use it.",fix:"Link it from the app page.",href:"/apps"})}for(let r of e.accounts)"supabase"===r.provider&&r.scopeNote&&/all[- ]access/i.test(r.scopeNote)&&t.push({key:`broad-cred:${r.id}`,severity:"info",appId:null,subject:`supabase \xb7 ${r.label}`,title:`${r.label} uses an all-access token`,why:"The console only reads; a broader token is a bigger risk if it ever leaks.",fix:"Replace it with a read-only token in Connections, then revoke the old one in Supabase.",href:"/connections"});for(let r of e.accounts){if(!r.expiresAt)continue;let s=r.expiresAt.getTime()-e.now.getTime();s>=12096e5&&s<=5184e6&&t.push({key:`cred-60:${r.id}:${d(r.expiresAt)}`,severity:"info",appId:null,subject:`${r.provider} \xb7 ${r.label}`,title:`The ${r.provider} credential ${r.label} expires on ${(0,u.L)(r.expiresAt)}`,why:"An expired credential stops every reading from that account.",fix:"Create a new one and use Replace credential in Connections.",href:"/connections"})}return t.map((e,t)=>({r:e,i:t})).sort((e,t)=>("warning"!==e.r.severity)-("warning"!==t.r.severity)||e.i-t.i).map(({r:e})=>e).slice(0,50)}(await b(e)),r={at:e.toISOString(),items:t};return await (0,i.f)().insert(o.settings).values({key:y,value:r}).onConflictDoUpdate({target:o.settings.key,set:{value:r,updatedAt:e}}),t}async function A(e){let[r]=await (0,i.f)().select({value:o.settings.value}).from(o.settings).where((0,t.u)(o.settings.key,y)).limit(1),s=k.safeParse(r?.value);return s.success?s.data.items:v(e)}async function x(e,r){var s;let a=await A(e);if(!a.length)return[];let n=await (0,i.f)().select({key:o.recommendationDismissals.key,dismissedAt:o.recommendationDismissals.dismissedAt}).from(o.recommendationDismissals).where((0,t.y)(o.recommendationDismissals.key,a.map(e=>e.key))).limit(50),l=(s=new Map(n.map(e=>[e.key,e.dismissedAt])),a.filter(t=>{let r=s.get(t.key);return!r||e.getTime()-r.getTime()>=2592e6}));return r?l.filter(e=>e.appId===r):l}e.s(["T",0,x,"O",0,v],426099)},367114,489099,505657,e=>{var t=e.i(875225),r=e.i(349129),s=e.i(924924),a=e.i(618916),n=e.i(195191),i=e.i(943816),o=e.i(46574),l=e.i(146394),u=e.i(69679),c=e.i(275426),d=e.i(703724);e.i(656083);var p=e.i(739886),m=e.i(890948),f=e.i(309055),h=e.i(800523);let g=e=>"string"==typeof e&&e?e:null;async function y(e,y){let w=await (0,s.f)().select({r:a.resources,s:a.snapshots,sec:a.appSecurity,accStatus:a.accounts.status}).from(a.resources).leftJoin(a.accounts,(0,t.u)(a.accounts.id,a.resources.accountId)).leftJoin(a.snapshots,(0,t.u)(a.snapshots.resourceId,a.resources.id)).leftJoin(a.appSecurity,(0,t.u)(a.appSecurity.resourceId,a.resources.id)).where((0,t.b)((0,t.u)(a.resources.kind,"app"),(0,t.u)(a.resources.monitored,!0),y?(0,t.u)(a.resources.id,y):void 0)).orderBy(a.resources.name).limit(l.O.apps);if(!w.length)return[];let k=w.map(e=>e.r.id),b=(await (0,s.f)().select().from(a.monitors).where((0,t.y)(a.monitors.resourceId,k)).orderBy(a.monitors.createdAt).limit(l.O.monitors)).map(f.M),v=await (0,s.f)().selectDistinctOn([a.deployments.resourceId]).from(a.deployments).where((0,t.b)((0,t.y)(a.deployments.resourceId,k),(0,t.u)(a.deployments.target,"production"))).orderBy(a.deployments.resourceId,(0,r.A)(a.deployments.createdAtProvider)),A=await (0,m._)(b.map(e=>e.id),e),x=await (0,m.P)(k,e),$=await (0,u.F)(k),I=b.length?await (0,p.f)():[];return w.map(({r:t,s:r,sec:s,accStatus:a})=>{let u=b.filter(e=>e.appId===t.id).map(t=>({...t,maintUntil:(0,c.x)(I,{monitorId:t.id,appId:t.appId},e)?.end??null})),p=g(t.meta.createdAt),m=v.find(e=>e.resourceId===t.id);return{id:t.id,name:t.name,gone:null!==t.goneAt,state:r?.state??"unknown",stateSince:r?.stateSince??null,domain:(0,n.m)(t.name,u.map(e=>e.url)),framework:g(t.meta.framework),productionBranch:g(t.meta.productionBranch),createdAt:p?new Date(p):null,teamName:g(t.meta.teamName),teamSlug:g(t.meta.teamSlug),repo:g(t.meta.repo),repoType:g(t.meta.repoType),functionRegions:Array.isArray(t.meta.functionRegions)?t.meta.functionRegions.filter(e=>"string"==typeof e):[],monitors:u,lastDeploy:m?(0,d.f)(m):null,uptime30:(0,o.Y)(u.flatMap(t=>(0,o.w)(A.get(t.id),e,o.I))),response:x.get(t.id)??{hourly:Array.from({length:l.A.responseHours},()=>null),p95:null,p50:null},days:new Map(u.flatMap(e=>{let t=A.get(e.id);return t?[[e.id,t]]:[]})),security:s?(0,h.Z)(s):null,database:$.get(t.id)??null,dbPaused:r?.data.dbPaused===!0,pageViews:(0,i.G)(r?.data),pageViewsNote:(0,i.R)({gone:null!==t.goneAt,teamId:g(t.meta.teamId),accountOk:"ok"===a,hasProductionDeploy:void 0!==m})}})}async function w(e,t){return(await y(t,e))[0]??null}e.s(["Z",0,w,"G",0,y],367114);var k=e.i(518899),b=e.i(165788);let v=k.B`coalesce(${a.events.lastAt}, ${a.events.at})`;async function A(e=l.O.events,n={}){return(await (0,s.f)().select({e:a.events,name:a.resources.name}).from(a.events).leftJoin(a.resources,(0,t.u)(a.resources.id,a.events.resourceId)).where(n.excludeActions?(0,t.c)(a.events.type,"action"):void 0).orderBy((0,r.A)(v)).limit(Math.max(1,Math.min(Number.isFinite(e)?Math.floor(e):l.O.events,l.O.events)))).map(({e,name:t})=>({id:e.id,at:e.at,lastAt:e.lastAt??null,count:e.count??1,reason:e.reason??null,type:e.type,kind:e.kind,message:e.message,detail:e.detail,resourceId:e.resourceId??null,resource:(0,b.L)({type:e.type,reason:e.reason??null,message:e.message,resource:t})}))}e.s(["f",0,A],489099);var x=e.i(959408),$=e.i(122143);e.i(358660);let I=e=>"heartbeat"===e.kind?e.lastError?e.lastError.replace(/^(Down|Late) · /,""):"warn"===e.state?"Late":"No ping":(0,x.H)(e)??(e.lastStatus?`HTTP ${e.lastStatus}`:e.lastError||"No answer");e.s(["f",0,function(e,t){if(e.gone)return[];let r=[],s=e.monitors.filter(e=>(0,x.i)(e)&&!e.maintUntil&&("err"===e.state||"warn"===e.state)),a=e=>2*("heartbeat"===e.kind)+ +("err"!==e.state);for(let e of[...s].sort((e,t)=>a(e)-a(t))){let t="heartbeat"===e.kind,s=t?e.name??e.path:e.path;r.push({kind:"monitor",where:t?`Monitor ${s} (heartbeat)`:`Monitor ${s}`,subject:s,state:e.state,reason:I(e),since:e.stateSince??(t?e.lastPingAt??null:null),href:"/uptime",remedies:t?function(e){let t=(e.lastError??"").toLowerCase();return t.includes("failure")?["The job reported a failure: open its logs","Fix and re-run the job; the next OK ping clears it"]:t.includes("didn't finish")||t.includes("started")?["The job started but never finished: it may have hung or hit its timeout","Check the job's own logs for where it stopped","Raise the job's timeout, or fix what it waits on; the next OK ping clears it"]:["Check that the job's scheduler ran (cron, Vercel Cron, GitHub Actions)","Check the job's own logs for errors before the ping line","Make sure the job calls the ping URL at the end (curl -fsS -m 10 <url>)","If the job is retired, pause or delete the heartbeat"]}(e):function(e){let t=e.lastError??"";if(/blocked address/i.test(t))return["The monitor's URL resolves to a private address; fix the URL in Edit monitor"];let r=(0,x.H)(e);if(r&&/keyword|json|body|content/i.test(r))return["The page answered but its content changed: check the keyword or JSON path in Edit monitor, or the page itself"];let s=e.lastStatus;return null!==s&&s>=500?["Open Logs (last hour) for errors","Check the latest deployment; roll back if it started after the deploy"]:null!==s&&s>=300?["Check the expected status and path in Edit monitor","The route may need sign-in or moved"]:null===s||r?["Check the domain, DNS and the provider status page","Cold start or overload: retry with Check now"]:["Open Logs (last hour) for errors","Check the latest deployment; roll back if it started after the deploy"]}(e)})}e.dbPaused&&e.database&&r.push({kind:"database",where:`Database ${e.database.name}`,subject:e.database.name,state:"warn",reason:"Paused",since:e.stateSince??null,href:(0,$.N)(e.database.kind),remedies:["Restore the database from its provider (Supabase restore)"]});let i=e.lastDeploy;if(i&&"error"===i.state){let e=(0,n._)(i.commitSha);r.push({kind:"deployment",where:`Production deployment ${e}`,subject:e,state:"fail",reason:"Build failed",since:i.readyAt??i.createdAt,href:"/deployments",remedies:["Open the deployment's build logs; redeploy after fixing"]})}return r}],505657)},703724,e=>{e.i(924924),e.i(618916),e.s(["f",0,function(e){return{id:e.id,externalId:e.externalId,state:e.state,target:e.target,branch:e.branch,commitSha:e.commitSha,commitMessage:e.commitMessage,url:e.url,createdAt:e.createdAtProvider,buildingAt:e.buildingAt,readyAt:e.readyAt,isCurrent:e.isCurrent,isPreviousProduction:e.isPreviousProduction}}])},800523,970465,e=>{var t=e.i(875225),r=e.i(518899),s=e.i(924924),a=e.i(618916),n=e.i(442473),i=e.i(751762),o=e.i(656083);let l=String.raw`\d+\.\d+\.\d+(?:-[0-9A-Za-z.]+)?`,u="[\"'`]";function c(e){let t=/^(\d+)\.\d+\.\d+(?:-[0-9A-Za-z.]+)?$/.exec(e);return null!==t&&Number(t[1])>=9&&1e3>Number(t[1])}let d={"&amp;":"&","&quot;":'"',"&#39;":"'","&#x27;":"'","&#x2F;":"/","&#47;":"/"},p=e=>e.replace(/&(?:amp|quot|#39|#x27|#x2F|#47);/gi,e=>d[e]??d[e.toLowerCase()]??e),m=RegExp(String.raw`\bnext\s*=\s*\{\s*version\s*:\s*${u}(${l})${u}`,"g"),f=RegExp(String.raw`version\s*:\s*${u}(${l})${u}\s*,\s*appDir\s*:`,"g"),h=RegExp(String.raw`appDir\s*:\s*[^,{}()]{1,16},\s*version\s*:\s*${u}(${l})${u}`,"g"),g=/\bnext\s*=\s*\{\s*version\s*(?::\s*([A-Za-z_$][\w$]*)\s*)?[,}]/g,y=e=>e.replace(/[$]/g,"\\$");var w=e.i(267485);async function k(e,t,r={}){let s=r.deadline??1/0,a=r.now??(()=>new Date),i=e=>Math.floor(Math.min(e,s)-Date.now()),o=Date.now()+15e3;if(0>=i(o))return null;let d=(e,r)=>({version:t?.version??null,status:e,findings:t?.findings??[],reason:r,checkedAt:a()}),b=(e,t)=>(0,n.K)(e,{maxBytes:3145728,timeoutMs:i(o),lookup:r.lookup,fetch:r.fetch,userAgent:"OpsConsole-Security/1.0 (+https://west-solutions.web.id)",sameOrigin:t}),v=await b(`https://${e}/`,"www");if(!v.ok&&v.error===n.l)return d("unknown","the site redirects to another host");if(!v.ok||200!==v.status)return Date.now()>=s?null:d("error",`Couldn't load the site: ${v.ok?`HTTP ${v.status}`:v.error}`);let A=(function(e,t){let r;try{r=new URL(t)}catch{return[]}let s=new Set,a=[];for(let t of e.matchAll(/<script\b[^>]*?\ssrc\s*=\s*(["'])(.*?)\1/gi)){let e;try{e=new URL(p(t[2].trim()),r)}catch{continue}if("https:"===e.protocol&&e.origin===r.origin&&e.pathname.startsWith("/_next/static/")&&(e.hash="",!s.has(e.href))){var n;s.add(e.href),a.push({href:e.href,rank:(n=e.pathname,/\/main-app[-.]/.test(n)?0:/\/(main|app-index)[-.]/.test(n)?1:/\/(webpack|polyfills|framework)[-.]/.test(n)?3:2),i:a.length})}}return a.sort((e,t)=>e.rank-t.rank||e.i-t.i).map(e=>e.href)})(v.body,v.url).slice(0,12);if(0===A.length)return d("unknown",v.body.includes("/_next/")?"version not exposed":"not a Next.js site");let x=null,$=0,I=!1;for(let e of A){if(0>=i(o)){I=!0;break}let t=await b(e,!0);if(t.ok&&200===t.status&&($++,x=function(e){for(let t of e.matchAll(m))if(c(t[1]))return t[1];for(let t of[f,h])for(let r of e.matchAll(t))if(c(r[1]))return r[1];for(let t of e.matchAll(g)){let r=t[1]??"version",s=RegExp(String.raw`(?:^|[^\w$.])${y(r)}\s*=\s*${u}(${l})${u}`,"g"),a=null;for(let r of e.matchAll(s)){if((r.index??0)>=(t.index??0))break;a=r[1]}if(a&&c(a))return a}return null}(t.body)))break}if(!x)return Date.now()>=s?null:I||0>=i(o)?d("error","Reading the site's scripts took longer than 15 s"):0===$?d("error","Couldn't load the site's scripts"):d("unknown","version not exposed");let S=i(Date.now()+1e4);if(S<=0)return null;let j=await (0,w.y)(x,{timeoutMs:S,fetch:r.fetch});return j.ok?{version:x,status:j.findings.length?"vulnerable":"ok",findings:j.findings,reason:null,checkedAt:a()}:Date.now()>=s?null:d("error",j.error)}e.s(["P",0,k,"F",0,function(e,t){return Math.min(t+35e3,e+55e3)}],970465);var b=e.i(7494),v=e.i(195191),A=e.i(146394);function x(e){return{version:e.version,status:e.status,findings:Array.isArray(e.findings)?e.findings:[],reason:e.reason,checkedAt:e.checkedAt}}async function $(e){let n=await (0,s.f)().select({id:a.resources.id,name:a.resources.name,sec:a.appSecurity}).from(a.resources).leftJoin(a.appSecurity,(0,t.u)(a.appSecurity.resourceId,a.resources.id)).where((0,t.b)((0,t.u)(a.resources.kind,"app"),(0,t.u)(a.resources.monitored,!0),(0,t.M)(a.resources.goneAt),e?(0,t.u)(a.resources.id,e):void 0)).orderBy(r.B`${a.appSecurity.checkedAt} asc nulls first`,a.resources.name).limit(A.O.apps);if(!n.length)return[];let i=await (0,s.f)().select({resourceId:a.monitors.resourceId,url:a.monitors.url}).from(a.monitors).where((0,t.y)(a.monitors.resourceId,n.map(e=>e.id))).orderBy(a.monitors.createdAt).limit(A.O.monitors);return n.map(e=>({id:e.id,name:e.name,prev:e.sec?x(e.sec):null,host:(0,v.m)(e.name,i.filter(t=>t.resourceId===e.id).map(e=>e.url))}))}async function I(e,n){await (0,s.f)().transaction(async s=>{await s.execute(r.B`select pg_advisory_xact_lock(hashtext(${`app_security:${e.id}`}))`);let[i]=await s.select().from(a.appSecurity).where((0,t.u)(a.appSecurity.resourceId,e.id)).limit(1),l=i?x(i):null;if(l&&l.checkedAt.getTime()>=n.checkedAt.getTime())return;let u="unknown"===n.status||"error"===n.status?{...n,version:l?l.version:n.version,findings:l?l.findings:n.findings}:n,c={framework:"next",version:u.version,status:u.status,findings:u.findings,reason:u.reason,checkedAt:u.checkedAt};await s.insert(a.appSecurity).values({resourceId:e.id,...c}).onConflictDoUpdate({target:a.appSecurity.resourceId,set:c,setWhere:r.B`${a.appSecurity.checkedAt} < excluded.checked_at`});let d=(0,b.t)(e.name,l,u);d&&await (0,o.f)([{type:"system",kind:d.kind,message:d.message,detail:d.detail,resourceId:e.id,at:u.checkedAt,reason:"ok"===d.kind?"NextClean":"NextVulnerable"}],s)})}async function S(e){let t=await $(),r=0,s=0,a=[];return await (0,n.P)(t,3,async t=>{if(e-Date.now()<3e3)return void s++;try{let a=await k(t.host,t.prev,{deadline:e});if(!a)return void s++;await I(t,a),r++}catch(e){a.push(`${t.name}: ${(0,i.f)(e)}`)}}),{checked:r,skipped:s,failed:a}}e.s(["h",0,S,"Z",0,x],800523)}]})();
1
+ (()=>{"use strict";module.exports=[426099,e=>{var t=e.i(875225),r=e.i(971724),s=e.i(105954),a=e.i(604147),n=e.i(455744),i=e.i(924924),o=e.i(618916),l=e.i(61926),u=e.i(218331);let c=e=>{let t=(0,u.e)(e);return`${t.day} ${t.month} ${t.year}`},d=u.x;var p=e.i(122143),m=e.i(775843),f=e.i(146394),h=e.i(69679),g=e.i(145647);let y="advisor.latest",w=r.z.object({key:s.z.string(),severity:a.z.enum(["warning","info"]),appId:s.z.string().nullable(),subject:s.z.string(),title:s.z.string(),why:s.z.string(),fix:s.z.string(),href:s.z.string()}),k=r.z.object({at:s.z.string(),items:n.z.array(w)});async function b(e){let r=(0,t.b)((0,t.u)(o.resources.kind,"app"),(0,t.u)(o.resources.monitored,!0),(0,t.M)(o.resources.goneAt)),s=await (0,g.P)(),a=await (0,h.V)(),[n,u,c,d,y]=await Promise.all([(0,i.f)().select({id:o.monitors.id,appId:o.monitors.resourceId,appName:o.resources.name,url:o.monitors.url,kind:o.monitors.kind,name:o.monitors.name,paused:o.monitors.paused,ownerPaused:o.monitors.ownerPaused,lastStatus:o.monitors.lastStatus,expectedStatus:o.monitors.expectedStatus,lastPingAt:o.monitors.lastPingAt,createdAt:o.monitors.createdAt}).from(o.monitors).innerJoin(o.resources,(0,t.u)(o.resources.id,o.monitors.resourceId)).where(r).orderBy(o.resources.name,o.monitors.url).limit(f.O.monitors),(0,i.f)().select({id:o.resources.id,name:o.resources.name,version:o.appSecurity.version}).from(o.resources).innerJoin(o.appSecurity,(0,t.u)(o.appSecurity.resourceId,o.resources.id)).where(r).orderBy(o.resources.name).limit(f.O.apps),(0,i.f)().select({id:o.resources.id,name:o.resources.name,kind:o.resources.kind,accountId:o.resources.accountId,accountLabel:o.accounts.label,state:o.snapshots.state}).from(o.resources).innerJoin(o.accounts,(0,t.u)(o.accounts.id,o.resources.accountId)).leftJoin(o.snapshots,(0,t.u)(o.snapshots.resourceId,o.resources.id)).where((0,t.b)((0,t.y)(o.resources.kind,[...p.H]),(0,t.u)(o.resources.monitored,!0),(0,t.M)(o.resources.goneAt))).orderBy(o.resources.name).limit(f.O.databases),(0,i.f)().select({appId:o.links.fromResourceId,dbId:o.links.toResourceId}).from(o.links).where((0,t.u)(o.links.kind,"uses_db")).limit(f.O.apps),(0,i.f)().select({id:o.accounts.id,provider:o.accounts.provider,label:o.accounts.label,expiresAt:o.accounts.expiresAt,scopeNote:o.accounts.scopeNote}).from(o.accounts).orderBy(o.accounts.label).limit(200)]);return{now:e,monitors:n.map(e=>({id:e.id,appId:e.appId,appName:e.appName,path:"heartbeat"===e.kind?e.url:(0,l.K)(e.url),kind:e.kind,name:e.name,paused:e.paused||e.ownerPaused,lastStatus:e.lastStatus,expectedStatus:e.expectedStatus,lastPingAt:e.lastPingAt,createdAt:e.createdAt})),eol:function(e,t){if(!t)return null;let r=t.cycles.find(e=>!e.isEol)?.latest??null,s=[];for(let a of e){let e=a.version?.split(".")[0],n=e?t.cycles.find(t=>t.name===e):void 0;n&&s.push({appId:a.id,appName:a.name,cycle:n.name,eolFrom:n.eolFrom?new Date(`${n.eolFrom}T00:00:00Z`):null,latest:r})}return s}(u,s),headers:null,dbs:c.map(e=>({id:e.id,name:e.name,provider:(0,p.Z)(e.kind),accountId:e.accountId,accountLabel:e.accountLabel,state:e.state??"unknown"})),slots:(0,m.f)(a).map(e=>({account:e.account,used:e.used,total:e.total,planUnknown:e.planUnknown})),links:d,accounts:y}}async function v(e){let t=function(e){let t=[];for(let r of e.eol??[]){if(!r.eolFrom||r.eolFrom.getTime()-e.now.getTime()>2592e6)continue;let s=r.eolFrom.getTime()<=e.now.getTime(),a=r.latest?.split(".")[0];t.push({key:`next-eol:${r.appId}:${r.cycle}`,severity:"warning",appId:r.appId,subject:r.appName,title:`Next.js ${r.cycle} ${s?"reached":"reaches"} end of life on ${c(r.eolFrom)}`,why:`No security fixes after that date.${r.latest?` Latest is ${r.latest}.`:""}`,fix:a?`Upgrade to Next.js ${a}.`:"Upgrade Next.js.",href:"https://endoflife.date/nextjs"})}for(let r of e.monitors)!r.paused&&("heartbeat"===r.kind&&!r.lastPingAt&&e.now.getTime()-r.createdAt.getTime()>864e5&&t.push({key:`hb-silent:${r.id}`,severity:"warning",appId:r.appId,subject:r.appName,title:`${r.name??"A heartbeat"} has never pinged`,why:"It was added more than a day ago and no job has called its URL.",fix:"Add the ping to the job, or delete the monitor.",href:"/uptime"}),"http"===r.kind&&"/"===r.path&&200===r.expectedStatus&&null!==r.lastStatus&&[401,403,404].includes(r.lastStatus)&&t.push({key:`monitor-root:${r.id}:${r.lastStatus}`,severity:"info",appId:r.appId,subject:r.appName,title:`The monitor on / answers ${r.lastStatus}`,why:`A login or missing page answering ${r.lastStatus} makes the monitor look down.`,fix:`Point the monitor at a public health route, or expect ${r.lastStatus}.`,href:"/uptime"}));for(let r of e.headers??[]){if(!r.missing.length)continue;let e=[...r.missing].sort();t.push({key:`headers:${r.appId}:${e.join(",")}`,severity:"info",appId:r.appId,subject:r.appName,title:`Missing security headers: ${e.join(", ")}`,why:"Browsers use them to block clickjacking, sniffing and downgrade attacks.",fix:"Add them in next.config headers().",href:"https://developer.mozilla.org/en-US/observatory"})}for(let r of e.slots??[])r.used<r.total||t.push({key:`no-slot:${r.account}`,severity:"warning",appId:null,subject:`supabase \xb7 ${r.account}`,title:`Account ${r.account} has no free slot`,why:r.planUnknown?"Two projects are active. If this account is on the free plan (it couldn't be read), a paused one can't be restored here.":"Both free projects are active, so a paused one can't be restored here.",fix:"Pause one project, or move one to another account.",href:"/supabase"});if(e.dbs&&e.links){let r=new Set(e.links.map(e=>e.dbId));for(let s of e.dbs.filter(e=>!r.has(e.id)))t.push({key:`db-unlinked:${s.id}`,severity:"info",appId:null,subject:s.name,title:"Database isn't linked to any app",why:"Topology and the app status can't use it.",fix:"Link it from the app page.",href:"/apps"})}for(let r of e.accounts)"supabase"===r.provider&&r.scopeNote&&/all[- ]access/i.test(r.scopeNote)&&t.push({key:`broad-cred:${r.id}`,severity:"info",appId:null,subject:`supabase \xb7 ${r.label}`,title:`${r.label} uses an all-access token`,why:"The console only reads; a broader token is a bigger risk if it ever leaks.",fix:"Replace it with a read-only token in Connections, then revoke the old one in Supabase.",href:"/connections"});for(let r of e.accounts){if(!r.expiresAt)continue;let s=r.expiresAt.getTime()-e.now.getTime();s>=12096e5&&s<=5184e6&&t.push({key:`cred-60:${r.id}:${d(r.expiresAt)}`,severity:"info",appId:null,subject:`${r.provider} \xb7 ${r.label}`,title:`The ${r.provider} credential ${r.label} expires on ${(0,u.L)(r.expiresAt)}`,why:"An expired credential stops every reading from that account.",fix:"Create a new one and use Replace credential in Connections.",href:"/connections"})}return t.map((e,t)=>({r:e,i:t})).sort((e,t)=>("warning"!==e.r.severity)-("warning"!==t.r.severity)||e.i-t.i).map(({r:e})=>e).slice(0,50)}(await b(e)),r={at:e.toISOString(),items:t};return await (0,i.f)().insert(o.settings).values({key:y,value:r}).onConflictDoUpdate({target:o.settings.key,set:{value:r,updatedAt:e}}),t}async function A(e){let[r]=await (0,i.f)().select({value:o.settings.value}).from(o.settings).where((0,t.u)(o.settings.key,y)).limit(1),s=k.safeParse(r?.value);return s.success?s.data.items:v(e)}async function x(e,r){var s;let a=await A(e);if(!a.length)return[];let n=await (0,i.f)().select({key:o.recommendationDismissals.key,dismissedAt:o.recommendationDismissals.dismissedAt}).from(o.recommendationDismissals).where((0,t.y)(o.recommendationDismissals.key,a.map(e=>e.key))).limit(50),l=(s=new Map(n.map(e=>[e.key,e.dismissedAt])),a.filter(t=>{let r=s.get(t.key);return!r||e.getTime()-r.getTime()>=2592e6}));return r?l.filter(e=>e.appId===r):l}e.s(["T",0,x,"O",0,v],426099)},367114,489099,505657,e=>{var t=e.i(875225),r=e.i(349129),s=e.i(924924),a=e.i(618916),n=e.i(195191),i=e.i(943816),o=e.i(46574),l=e.i(146394),u=e.i(69679),c=e.i(275426),d=e.i(703724);e.i(656083);var p=e.i(739886),m=e.i(890948),f=e.i(309055),h=e.i(800523);let g=e=>"string"==typeof e&&e?e:null;async function y(e,y){let w=await (0,s.f)().select({r:a.resources,s:a.snapshots,sec:a.appSecurity,accStatus:a.accounts.status}).from(a.resources).leftJoin(a.accounts,(0,t.u)(a.accounts.id,a.resources.accountId)).leftJoin(a.snapshots,(0,t.u)(a.snapshots.resourceId,a.resources.id)).leftJoin(a.appSecurity,(0,t.u)(a.appSecurity.resourceId,a.resources.id)).where((0,t.b)((0,t.u)(a.resources.kind,"app"),(0,t.u)(a.resources.monitored,!0),y?(0,t.u)(a.resources.id,y):void 0)).orderBy(a.resources.name).limit(l.O.apps);if(!w.length)return[];let k=w.map(e=>e.r.id),b=(await (0,s.f)().select().from(a.monitors).where((0,t.y)(a.monitors.resourceId,k)).orderBy(a.monitors.createdAt).limit(l.O.monitors)).map(f.M),v=await (0,s.f)().selectDistinctOn([a.deployments.resourceId]).from(a.deployments).where((0,t.b)((0,t.y)(a.deployments.resourceId,k),(0,t.u)(a.deployments.target,"production"))).orderBy(a.deployments.resourceId,(0,r.A)(a.deployments.createdAtProvider)),A=await (0,m._)(b.map(e=>e.id),e),x=await (0,m.P)(k,e),$=await (0,u.F)(k),I=b.length?await (0,p.f)():[];return w.map(({r:t,s:r,sec:s,accStatus:a})=>{let u=b.filter(e=>e.appId===t.id).map(t=>({...t,maintUntil:(0,c.x)(I,{monitorId:t.id,appId:t.appId},e)?.end??null})),p=g(t.meta.createdAt),m=v.find(e=>e.resourceId===t.id);return{id:t.id,name:t.name,gone:null!==t.goneAt,state:r?.state??"unknown",stateSince:r?.stateSince??null,domain:(0,n.m)(t.name,u.map(e=>e.url)),framework:g(t.meta.framework),productionBranch:g(t.meta.productionBranch),createdAt:p?new Date(p):null,teamName:g(t.meta.teamName),teamSlug:g(t.meta.teamSlug),repo:g(t.meta.repo),repoType:g(t.meta.repoType),functionRegions:Array.isArray(t.meta.functionRegions)?t.meta.functionRegions.filter(e=>"string"==typeof e):[],monitors:u,lastDeploy:m?(0,d.f)(m):null,uptime30:(0,o.Y)(u.flatMap(t=>(0,o.w)(A.get(t.id),e,o.I))),response:x.get(t.id)??{hourly:Array.from({length:l.A.responseHours},()=>null),p95:null,p50:null},days:new Map(u.flatMap(e=>{let t=A.get(e.id);return t?[[e.id,t]]:[]})),security:s?(0,h.Z)(s):null,database:$.get(t.id)??null,dbPaused:r?.data.dbPaused===!0,pageViews:(0,i.G)(r?.data),pageViewsNote:(0,i.R)({gone:null!==t.goneAt,teamId:g(t.meta.teamId),accountOk:"ok"===a,hasProductionDeploy:void 0!==m})}})}async function w(e,t){return(await y(t,e))[0]??null}e.s(["Z",0,w,"G",0,y],367114);var k=e.i(518899),b=e.i(165788);let v=k.B`coalesce(${a.events.lastAt}, ${a.events.at})`;async function A(e=l.O.events,n={}){return(await (0,s.f)().select({e:a.events,name:a.resources.name}).from(a.events).leftJoin(a.resources,(0,t.u)(a.resources.id,a.events.resourceId)).where(n.excludeActions?(0,t.c)(a.events.type,"action"):void 0).orderBy((0,r.A)(v)).limit(Math.max(1,Math.min(Number.isFinite(e)?Math.floor(e):l.O.events,l.O.events)))).map(({e,name:t})=>({id:e.id,at:e.at,lastAt:e.lastAt??null,count:e.count??1,reason:e.reason??null,type:e.type,kind:e.kind,message:e.message,detail:e.detail,resourceId:e.resourceId??null,resource:(0,b.L)({type:e.type,reason:e.reason??null,message:e.message,resource:t})}))}e.s(["f",0,A],489099);var x=e.i(959408),$=e.i(122143);e.i(358660);let I=e=>"heartbeat"===e.kind?e.lastError?e.lastError.replace(/^(Down|Late) · /,""):"warn"===e.state?"Late":"No ping":(0,x.H)(e)??(e.lastStatus?`HTTP ${e.lastStatus}`:e.lastError||"No answer");e.s(["f",0,function(e,t){if(e.gone)return[];let r=[],s=e.monitors.filter(e=>(0,x.i)(e)&&!e.maintUntil&&("err"===e.state||"warn"===e.state)),a=e=>2*("heartbeat"===e.kind)+ +("err"!==e.state);for(let e of[...s].sort((e,t)=>a(e)-a(t))){let t="heartbeat"===e.kind,s=t?e.name??e.path:e.path;r.push({kind:"monitor",where:t?`Monitor ${s} (heartbeat)`:`Monitor ${s}`,subject:s,state:e.state,reason:I(e),since:e.stateSince??(t?e.lastPingAt??null:null),href:"/uptime",remedies:t?function(e){let t=(e.lastError??"").toLowerCase();return t.includes("failure")?["The job reported a failure: open its logs","Fix and re-run the job; the next OK ping clears it"]:t.includes("didn't finish")||t.includes("started")?["The job started but never finished: it may have hung or hit its timeout","Check the job's own logs for where it stopped","Raise the job's timeout, or fix what it waits on; the next OK ping clears it"]:["Check that the job's scheduler ran (cron, Vercel Cron, GitHub Actions)","Check the job's own logs for errors before the ping line","Make sure the job calls the ping URL at the end (curl -fsS -m 10 <url>)","If the job is retired, pause or delete the heartbeat"]}(e):function(e){let t=e.lastError??"";if(/blocked address/i.test(t))return["The monitor's URL resolves to a private address; fix the URL in Edit monitor"];let r=(0,x.H)(e);if(r&&/keyword|json|body|content/i.test(r))return["The page answered but its content changed: check the keyword or JSON path in Edit monitor, or the page itself"];let s=e.lastStatus;return null!==s&&s>=500?["Open Logs (last hour) for errors","Check the latest deployment; roll back if it started after the deploy"]:null!==s&&s>=300?["Check the expected status and path in Edit monitor","The route may need sign-in or moved"]:null===s||r?["Check the domain, DNS and the provider status page","Cold start or overload: retry with Check now"]:["Open Logs (last hour) for errors","Check the latest deployment; roll back if it started after the deploy"]}(e)})}e.dbPaused&&e.database&&r.push({kind:"database",where:`Database ${e.database.name}`,subject:e.database.name,state:"warn",reason:"Paused",since:e.stateSince??null,href:(0,$.N)(e.database.kind),remedies:["Restore the database from its provider (Supabase restore)"]});let i=e.lastDeploy;if(i&&"error"===i.state){let e=(0,n._)(i.commitSha);r.push({kind:"deployment",where:`Production deployment ${e}`,subject:e,state:"fail",reason:"Build failed",since:i.readyAt??i.createdAt,href:"/deployments",remedies:["Open the deployment's build logs; redeploy after fixing"]})}return r}],505657)},703724,e=>{e.i(924924),e.i(618916),e.s(["f",0,function(e){return{id:e.id,externalId:e.externalId,state:e.state,target:e.target,branch:e.branch,commitSha:e.commitSha,commitMessage:e.commitMessage,url:e.url,createdAt:e.createdAtProvider,buildingAt:e.buildingAt,readyAt:e.readyAt,isCurrent:e.isCurrent,isPreviousProduction:e.isPreviousProduction}}])},800523,970465,e=>{var t=e.i(875225),r=e.i(518899),s=e.i(924924),a=e.i(618916),n=e.i(442473),i=e.i(751762),o=e.i(656083);let l=String.raw`\d+\.\d+\.\d+(?:-[0-9A-Za-z.]+)?`,u="[\"'`]";function c(e){let t=/^(\d+)\.\d+\.\d+(?:-[0-9A-Za-z.]+)?$/.exec(e);return null!==t&&Number(t[1])>=9&&1e3>Number(t[1])}let d={"&amp;":"&","&quot;":'"',"&#39;":"'","&#x27;":"'","&#x2F;":"/","&#47;":"/"},p=e=>e.replace(/&(?:amp|quot|#39|#x27|#x2F|#47);/gi,e=>d[e]??d[e.toLowerCase()]??e),m=RegExp(String.raw`\bnext\s*=\s*\{\s*version\s*:\s*${u}(${l})${u}`,"g"),f=RegExp(String.raw`version\s*:\s*${u}(${l})${u}\s*,\s*appDir\s*:`,"g"),h=RegExp(String.raw`appDir\s*:\s*[^,{}()]{1,16},\s*version\s*:\s*${u}(${l})${u}`,"g"),g=/\bnext\s*=\s*\{\s*version\s*(?::\s*([A-Za-z_$][\w$]*)\s*)?[,}]/g,y=e=>e.replace(/[$]/g,"\\$");var w=e.i(267485);async function k(e,t,r={}){let s=r.deadline??1/0,a=r.now??(()=>new Date),i=e=>Math.floor(Math.min(e,s)-Date.now()),o=Date.now()+15e3;if(0>=i(o))return null;let d=(e,r)=>({version:t?.version??null,status:e,findings:t?.findings??[],reason:r,checkedAt:a()}),b=(e,t)=>(0,n.K)(e,{maxBytes:3145728,timeoutMs:i(o),lookup:r.lookup,fetch:r.fetch,userAgent:"OpsConsole-Security/1.0 (+https://west-solutions.web.id)",sameOrigin:t}),v=await b(`https://${e}/`,"www");if(!v.ok&&v.error===n.l)return d("unknown","the site redirects to another host");if(!v.ok||200!==v.status)return Date.now()>=s?null:d("error",`Couldn't load the site: ${v.ok?`HTTP ${v.status}`:v.error}`);let A=(function(e,t){let r;try{r=new URL(t)}catch{return[]}let s=new Set,a=[];for(let t of e.matchAll(/<script\b[^>]*?\ssrc\s*=\s*(["'])(.*?)\1/gi)){let e;try{e=new URL(p(t[2].trim()),r)}catch{continue}if("https:"===e.protocol&&e.origin===r.origin&&e.pathname.startsWith("/_next/static/")&&(e.hash="",!s.has(e.href))){var n;s.add(e.href),a.push({href:e.href,rank:(n=e.pathname,/\/main-app[-.]/.test(n)?0:/\/(main|app-index)[-.]/.test(n)?1:/\/(webpack|polyfills|framework)[-.]/.test(n)?3:2),i:a.length})}}return a.sort((e,t)=>e.rank-t.rank||e.i-t.i).map(e=>e.href)})(v.body,v.url).slice(0,12);if(0===A.length)return d("unknown",v.body.includes("/_next/")?"version not exposed":"not a Next.js site");let x=null,$=0,I=!1;for(let e of A){if(0>=i(o)){I=!0;break}let t=await b(e,!0);if(t.ok&&200===t.status&&($++,x=function(e){for(let t of e.matchAll(m))if(c(t[1]))return t[1];for(let t of[f,h])for(let r of e.matchAll(t))if(c(r[1]))return r[1];for(let t of e.matchAll(g)){let r=t[1]??"version",s=RegExp(String.raw`(?:^|[^\w$.])${y(r)}\s*=\s*${u}(${l})${u}`,"g"),a=null;for(let r of e.matchAll(s)){if((r.index??0)>=(t.index??0))break;a=r[1]}if(a&&c(a))return a}return null}(t.body)))break}if(!x)return Date.now()>=s?null:I||0>=i(o)?d("error","Reading the site's scripts took longer than 15 s"):0===$?d("error","Couldn't load the site's scripts"):d("unknown","version not exposed");let S=i(Date.now()+1e4);if(S<=0)return null;let j=await (0,w.y)(x,{timeoutMs:S,fetch:r.fetch});return j.ok?{version:x,status:j.findings.length?"vulnerable":"ok",findings:j.findings,reason:null,checkedAt:a()}:Date.now()>=s?null:d("error",j.error)}e.s(["P",0,k,"F",0,function(e,t){return Math.min(t+35e3,e+55e3)}],970465);var b=e.i(7494),v=e.i(195191),A=e.i(146394);function x(e){return{version:e.version,status:e.status,findings:Array.isArray(e.findings)?e.findings:[],reason:e.reason,checkedAt:e.checkedAt}}async function $(e){let n=await (0,s.f)().select({id:a.resources.id,name:a.resources.name,sec:a.appSecurity}).from(a.resources).leftJoin(a.appSecurity,(0,t.u)(a.appSecurity.resourceId,a.resources.id)).where((0,t.b)((0,t.u)(a.resources.kind,"app"),(0,t.u)(a.resources.monitored,!0),(0,t.M)(a.resources.goneAt),e?(0,t.u)(a.resources.id,e):void 0)).orderBy(r.B`${a.appSecurity.checkedAt} asc nulls first`,a.resources.name).limit(A.O.apps);if(!n.length)return[];let i=await (0,s.f)().select({resourceId:a.monitors.resourceId,url:a.monitors.url}).from(a.monitors).where((0,t.y)(a.monitors.resourceId,n.map(e=>e.id))).orderBy(a.monitors.createdAt).limit(A.O.monitors);return n.map(e=>({id:e.id,name:e.name,prev:e.sec?x(e.sec):null,host:(0,v.m)(e.name,i.filter(t=>t.resourceId===e.id).map(e=>e.url))}))}async function I(e,n){await (0,s.f)().transaction(async s=>{await s.execute(r.B`select pg_advisory_xact_lock(hashtext(${`app_security:${e.id}`}))`);let[i]=await s.select().from(a.appSecurity).where((0,t.u)(a.appSecurity.resourceId,e.id)).limit(1),l=i?x(i):null;if(l&&l.checkedAt.getTime()>=n.checkedAt.getTime())return;let u="unknown"===n.status||"error"===n.status?{...n,version:l?l.version:n.version,findings:l?l.findings:n.findings}:n,c={framework:"next",version:u.version,status:u.status,findings:u.findings,reason:u.reason,checkedAt:u.checkedAt};await s.insert(a.appSecurity).values({resourceId:e.id,...c}).onConflictDoUpdate({target:a.appSecurity.resourceId,set:c,setWhere:r.B`${a.appSecurity.checkedAt} < excluded.checked_at`});let d=(0,b.t)(e.name,l,u);d&&await (0,o.f)([{type:"system",kind:d.kind,message:d.message,detail:d.detail,resourceId:e.id,at:u.checkedAt,reason:"ok"===d.kind?"NextClean":"NextVulnerable"}],s)})}async function S(e){let t=await $(),r=0,s=0,a=[];return await (0,n.P)(t,3,async t=>{if(e-Date.now()<3e3)return void s++;try{let a=await k(t.host,t.prev,{deadline:e});if(!a)return void s++;await I(t,a),r++}catch(e){a.push(`${t.name}: ${(0,i.f)(e)}`)}}),{checked:r,skipped:s,failed:a}}e.s(["h",0,S,"Z",0,x],800523)}]})();
2
2
 
3
3
  //# sourceMappingURL=src_lib_data_0ask_rbmgwlf3._.js.map
@@ -1,3 +1,3 @@
1
- (()=>{"use strict";module.exports=[426099,e=>{var t=e.i(875225),r=e.i(971724),s=e.i(105954),a=e.i(604147),n=e.i(455744),i=e.i(924924),o=e.i(618916),l=e.i(61926),u=e.i(218331);let c=e=>{let t=(0,u.C)(e);return`${t.day} ${t.month} ${t.year}`},d=e=>e.toLocaleDateString("en-CA",{timeZone:u.h});var p=e.i(122143),m=e.i(775843),f=e.i(146394),h=e.i(69679),g=e.i(145647);let y="advisor.latest",w=r.z.object({key:s.z.string(),severity:a.z.enum(["warning","info"]),appId:s.z.string().nullable(),subject:s.z.string(),title:s.z.string(),why:s.z.string(),fix:s.z.string(),href:s.z.string()}),k=r.z.object({at:s.z.string(),items:n.z.array(w)});async function b(e){let r=(0,t.b)((0,t.u)(o.resources.kind,"app"),(0,t.u)(o.resources.monitored,!0),(0,t.M)(o.resources.goneAt)),s=await (0,g.P)(),a=await (0,h.V)(),[n,u,c,d,y]=await Promise.all([(0,i.f)().select({id:o.monitors.id,appId:o.monitors.resourceId,appName:o.resources.name,url:o.monitors.url,kind:o.monitors.kind,name:o.monitors.name,paused:o.monitors.paused,ownerPaused:o.monitors.ownerPaused,lastStatus:o.monitors.lastStatus,expectedStatus:o.monitors.expectedStatus,lastPingAt:o.monitors.lastPingAt,createdAt:o.monitors.createdAt}).from(o.monitors).innerJoin(o.resources,(0,t.u)(o.resources.id,o.monitors.resourceId)).where(r).orderBy(o.resources.name,o.monitors.url).limit(f.O.monitors),(0,i.f)().select({id:o.resources.id,name:o.resources.name,version:o.appSecurity.version}).from(o.resources).innerJoin(o.appSecurity,(0,t.u)(o.appSecurity.resourceId,o.resources.id)).where(r).orderBy(o.resources.name).limit(f.O.apps),(0,i.f)().select({id:o.resources.id,name:o.resources.name,kind:o.resources.kind,accountId:o.resources.accountId,accountLabel:o.accounts.label,state:o.snapshots.state}).from(o.resources).innerJoin(o.accounts,(0,t.u)(o.accounts.id,o.resources.accountId)).leftJoin(o.snapshots,(0,t.u)(o.snapshots.resourceId,o.resources.id)).where((0,t.b)((0,t.y)(o.resources.kind,[...p.H]),(0,t.u)(o.resources.monitored,!0),(0,t.M)(o.resources.goneAt))).orderBy(o.resources.name).limit(f.O.databases),(0,i.f)().select({appId:o.links.fromResourceId,dbId:o.links.toResourceId}).from(o.links).where((0,t.u)(o.links.kind,"uses_db")).limit(f.O.apps),(0,i.f)().select({id:o.accounts.id,provider:o.accounts.provider,label:o.accounts.label,expiresAt:o.accounts.expiresAt,scopeNote:o.accounts.scopeNote}).from(o.accounts).orderBy(o.accounts.label).limit(200)]);return{now:e,monitors:n.map(e=>({id:e.id,appId:e.appId,appName:e.appName,path:"heartbeat"===e.kind?e.url:(0,l.K)(e.url),kind:e.kind,name:e.name,paused:e.paused||e.ownerPaused,lastStatus:e.lastStatus,expectedStatus:e.expectedStatus,lastPingAt:e.lastPingAt,createdAt:e.createdAt})),eol:function(e,t){if(!t)return null;let r=t.cycles.find(e=>!e.isEol)?.latest??null,s=[];for(let a of e){let e=a.version?.split(".")[0],n=e?t.cycles.find(t=>t.name===e):void 0;n&&s.push({appId:a.id,appName:a.name,cycle:n.name,eolFrom:n.eolFrom?new Date(`${n.eolFrom}T00:00:00Z`):null,latest:r})}return s}(u,s),headers:null,dbs:c.map(e=>({id:e.id,name:e.name,provider:(0,p.Z)(e.kind),accountId:e.accountId,accountLabel:e.accountLabel,state:e.state??"unknown"})),slots:(0,m.f)(a).map(e=>({account:e.account,used:e.used,total:e.total,planUnknown:e.planUnknown})),links:d,accounts:y}}async function v(e){let t=function(e){let t=[];for(let r of e.eol??[]){if(!r.eolFrom||r.eolFrom.getTime()-e.now.getTime()>2592e6)continue;let s=r.eolFrom.getTime()<=e.now.getTime(),a=r.latest?.split(".")[0];t.push({key:`next-eol:${r.appId}:${r.cycle}`,severity:"warning",appId:r.appId,subject:r.appName,title:`Next.js ${r.cycle} ${s?"reached":"reaches"} end of life on ${c(r.eolFrom)}`,why:`No security fixes after that date.${r.latest?` Latest is ${r.latest}.`:""}`,fix:a?`Upgrade to Next.js ${a}.`:"Upgrade Next.js.",href:"https://endoflife.date/nextjs"})}for(let r of e.monitors)!r.paused&&("heartbeat"===r.kind&&!r.lastPingAt&&e.now.getTime()-r.createdAt.getTime()>864e5&&t.push({key:`hb-silent:${r.id}`,severity:"warning",appId:r.appId,subject:r.appName,title:`${r.name??"A heartbeat"} has never pinged`,why:"It was added more than a day ago and no job has called its URL.",fix:"Add the ping to the job, or delete the monitor.",href:"/uptime"}),"http"===r.kind&&"/"===r.path&&200===r.expectedStatus&&null!==r.lastStatus&&[401,403,404].includes(r.lastStatus)&&t.push({key:`monitor-root:${r.id}:${r.lastStatus}`,severity:"info",appId:r.appId,subject:r.appName,title:`The monitor on / answers ${r.lastStatus}`,why:`A login or missing page answering ${r.lastStatus} makes the monitor look down.`,fix:`Point the monitor at a public health route, or expect ${r.lastStatus}.`,href:"/uptime"}));for(let r of e.headers??[]){if(!r.missing.length)continue;let e=[...r.missing].sort();t.push({key:`headers:${r.appId}:${e.join(",")}`,severity:"info",appId:r.appId,subject:r.appName,title:`Missing security headers: ${e.join(", ")}`,why:"Browsers use them to block clickjacking, sniffing and downgrade attacks.",fix:"Add them in next.config headers().",href:"https://developer.mozilla.org/en-US/observatory"})}for(let r of e.slots??[])r.used<r.total||t.push({key:`no-slot:${r.account}`,severity:"warning",appId:null,subject:`supabase \xb7 ${r.account}`,title:`Account ${r.account} has no free slot`,why:r.planUnknown?"Two projects are active. If this account is on the free plan (it couldn't be read), a paused one can't be restored here.":"Both free projects are active, so a paused one can't be restored here.",fix:"Pause one project, or move one to another account.",href:"/supabase"});if(e.dbs&&e.links){let r=new Set(e.links.map(e=>e.dbId));for(let s of e.dbs.filter(e=>!r.has(e.id)))t.push({key:`db-unlinked:${s.id}`,severity:"info",appId:null,subject:s.name,title:"Database isn't linked to any app",why:"Topology and the app status can't use it.",fix:"Link it from the app page.",href:"/apps"})}for(let r of e.accounts)"supabase"===r.provider&&r.scopeNote&&/all[- ]access/i.test(r.scopeNote)&&t.push({key:`broad-cred:${r.id}`,severity:"info",appId:null,subject:`supabase \xb7 ${r.label}`,title:`${r.label} uses an all-access token`,why:"The console only reads; a broader token is a bigger risk if it ever leaks.",fix:"Replace it with a read-only token in Connections, then revoke the old one in Supabase.",href:"/connections"});for(let r of e.accounts){if(!r.expiresAt)continue;let s=r.expiresAt.getTime()-e.now.getTime();s>=12096e5&&s<=5184e6&&t.push({key:`cred-60:${r.id}:${d(r.expiresAt)}`,severity:"info",appId:null,subject:`${r.provider} \xb7 ${r.label}`,title:`The ${r.provider} credential ${r.label} expires on ${(0,u.L)(r.expiresAt)}`,why:"An expired credential stops every reading from that account.",fix:"Create a new one and use Replace credential in Connections.",href:"/connections"})}return t.map((e,t)=>({r:e,i:t})).sort((e,t)=>("warning"!==e.r.severity)-("warning"!==t.r.severity)||e.i-t.i).map(({r:e})=>e).slice(0,50)}(await b(e)),r={at:e.toISOString(),items:t};return await (0,i.f)().insert(o.settings).values({key:y,value:r}).onConflictDoUpdate({target:o.settings.key,set:{value:r,updatedAt:e}}),t}async function A(e){let[r]=await (0,i.f)().select({value:o.settings.value}).from(o.settings).where((0,t.u)(o.settings.key,y)).limit(1),s=k.safeParse(r?.value);return s.success?s.data.items:v(e)}async function x(e,r){var s;let a=await A(e);if(!a.length)return[];let n=await (0,i.f)().select({key:o.recommendationDismissals.key,dismissedAt:o.recommendationDismissals.dismissedAt}).from(o.recommendationDismissals).where((0,t.y)(o.recommendationDismissals.key,a.map(e=>e.key))).limit(50),l=(s=new Map(n.map(e=>[e.key,e.dismissedAt])),a.filter(t=>{let r=s.get(t.key);return!r||e.getTime()-r.getTime()>=2592e6}));return r?l.filter(e=>e.appId===r):l}e.s(["T",0,x,"O",0,v],426099)},367114,489099,505657,e=>{var t=e.i(875225),r=e.i(349129),s=e.i(924924),a=e.i(618916),n=e.i(195191),i=e.i(943816),o=e.i(46574),l=e.i(146394),u=e.i(69679),c=e.i(275426),d=e.i(703724);e.i(656083);var p=e.i(739886),m=e.i(890948),f=e.i(309055),h=e.i(800523);let g=e=>"string"==typeof e&&e?e:null;async function y(e,y){let w=await (0,s.f)().select({r:a.resources,s:a.snapshots,sec:a.appSecurity,accStatus:a.accounts.status}).from(a.resources).leftJoin(a.accounts,(0,t.u)(a.accounts.id,a.resources.accountId)).leftJoin(a.snapshots,(0,t.u)(a.snapshots.resourceId,a.resources.id)).leftJoin(a.appSecurity,(0,t.u)(a.appSecurity.resourceId,a.resources.id)).where((0,t.b)((0,t.u)(a.resources.kind,"app"),(0,t.u)(a.resources.monitored,!0),y?(0,t.u)(a.resources.id,y):void 0)).orderBy(a.resources.name).limit(l.O.apps);if(!w.length)return[];let k=w.map(e=>e.r.id),b=(await (0,s.f)().select().from(a.monitors).where((0,t.y)(a.monitors.resourceId,k)).orderBy(a.monitors.createdAt).limit(l.O.monitors)).map(f.M),v=await (0,s.f)().selectDistinctOn([a.deployments.resourceId]).from(a.deployments).where((0,t.b)((0,t.y)(a.deployments.resourceId,k),(0,t.u)(a.deployments.target,"production"))).orderBy(a.deployments.resourceId,(0,r.A)(a.deployments.createdAtProvider)),A=await (0,m._)(b.map(e=>e.id),e),x=await (0,m.P)(k,e),$=await (0,u.F)(k),I=b.length?await (0,p.f)():[];return w.map(({r:t,s:r,sec:s,accStatus:a})=>{let u=b.filter(e=>e.appId===t.id).map(t=>({...t,maintUntil:(0,c.x)(I,{monitorId:t.id,appId:t.appId},e)?.end??null})),p=g(t.meta.createdAt),m=v.find(e=>e.resourceId===t.id);return{id:t.id,name:t.name,gone:null!==t.goneAt,state:r?.state??"unknown",stateSince:r?.stateSince??null,domain:(0,n.m)(t.name,u.map(e=>e.url)),framework:g(t.meta.framework),productionBranch:g(t.meta.productionBranch),createdAt:p?new Date(p):null,teamName:g(t.meta.teamName),teamSlug:g(t.meta.teamSlug),repo:g(t.meta.repo),repoType:g(t.meta.repoType),functionRegions:Array.isArray(t.meta.functionRegions)?t.meta.functionRegions.filter(e=>"string"==typeof e):[],monitors:u,lastDeploy:m?(0,d.f)(m):null,uptime30:(0,o.Y)(u.flatMap(t=>(0,o.w)(A.get(t.id),e,o.I))),response:x.get(t.id)??{hourly:Array.from({length:l.A.responseHours},()=>null),p95:null,p50:null},days:new Map(u.flatMap(e=>{let t=A.get(e.id);return t?[[e.id,t]]:[]})),security:s?(0,h.Z)(s):null,database:$.get(t.id)??null,dbPaused:r?.data.dbPaused===!0,pageViews:(0,i.G)(r?.data),pageViewsNote:(0,i.R)({gone:null!==t.goneAt,teamId:g(t.meta.teamId),accountOk:"ok"===a,hasProductionDeploy:void 0!==m})}})}async function w(e,t){return(await y(t,e))[0]??null}e.s(["Z",0,w,"G",0,y],367114);var k=e.i(518899),b=e.i(165788);let v=k.B`coalesce(${a.events.lastAt}, ${a.events.at})`;async function A(e=l.O.events,n={}){return(await (0,s.f)().select({e:a.events,name:a.resources.name}).from(a.events).leftJoin(a.resources,(0,t.u)(a.resources.id,a.events.resourceId)).where(n.excludeActions?(0,t.c)(a.events.type,"action"):void 0).orderBy((0,r.A)(v)).limit(Math.max(1,Math.min(Number.isFinite(e)?Math.floor(e):l.O.events,l.O.events)))).map(({e,name:t})=>({id:e.id,at:e.at,lastAt:e.lastAt??null,count:e.count??1,reason:e.reason??null,type:e.type,kind:e.kind,message:e.message,detail:e.detail,resourceId:e.resourceId??null,resource:(0,b.L)({type:e.type,reason:e.reason??null,message:e.message,resource:t})}))}e.s(["f",0,A],489099);var x=e.i(959408),$=e.i(122143);e.i(358660);let I=e=>"heartbeat"===e.kind?e.lastError?e.lastError.replace(/^(Down|Late) · /,""):"warn"===e.state?"Late":"No ping":(0,x.H)(e)??(e.lastStatus?`HTTP ${e.lastStatus}`:e.lastError||"No answer");e.s(["f",0,function(e,t){if(e.gone)return[];let r=[],s=e.monitors.filter(e=>(0,x.i)(e)&&!e.maintUntil&&("err"===e.state||"warn"===e.state)),a=e=>2*("heartbeat"===e.kind)+ +("err"!==e.state);for(let e of[...s].sort((e,t)=>a(e)-a(t))){let t="heartbeat"===e.kind,s=t?e.name??e.path:e.path;r.push({kind:"monitor",where:t?`Monitor ${s} (heartbeat)`:`Monitor ${s}`,subject:s,state:e.state,reason:I(e),since:e.stateSince??(t?e.lastPingAt??null:null),href:"/uptime",remedies:t?function(e){let t=(e.lastError??"").toLowerCase();return t.includes("failure")?["The job reported a failure: open its logs","Fix and re-run the job; the next OK ping clears it"]:t.includes("didn't finish")||t.includes("started")?["The job started but never finished: it may have hung or hit its timeout","Check the job's own logs for where it stopped","Raise the job's timeout, or fix what it waits on; the next OK ping clears it"]:["Check that the job's scheduler ran (cron, Vercel Cron, GitHub Actions)","Check the job's own logs for errors before the ping line","Make sure the job calls the ping URL at the end (curl -fsS -m 10 <url>)","If the job is retired, pause or delete the heartbeat"]}(e):function(e){let t=e.lastError??"";if(/blocked address/i.test(t))return["The monitor's URL resolves to a private address; fix the URL in Edit monitor"];let r=(0,x.H)(e);if(r&&/keyword|json|body|content/i.test(r))return["The page answered but its content changed: check the keyword or JSON path in Edit monitor, or the page itself"];let s=e.lastStatus;return null!==s&&s>=500?["Open Logs (last hour) for errors","Check the latest deployment; roll back if it started after the deploy"]:null!==s&&s>=300?["Check the expected status and path in Edit monitor","The route may need sign-in or moved"]:null===s||r?["Check the domain, DNS and the provider status page","Cold start or overload: retry with Check now"]:["Open Logs (last hour) for errors","Check the latest deployment; roll back if it started after the deploy"]}(e)})}e.dbPaused&&e.database&&r.push({kind:"database",where:`Database ${e.database.name}`,subject:e.database.name,state:"warn",reason:"Paused",since:e.stateSince??null,href:(0,$.N)(e.database.kind),remedies:["Restore the database from its provider (Supabase restore)"]});let i=e.lastDeploy;if(i&&"error"===i.state){let e=(0,n._)(i.commitSha);r.push({kind:"deployment",where:`Production deployment ${e}`,subject:e,state:"fail",reason:"Build failed",since:i.readyAt??i.createdAt,href:"/deployments",remedies:["Open the deployment's build logs; redeploy after fixing"]})}return r}],505657)},703724,e=>{e.i(924924),e.i(618916),e.s(["f",0,function(e){return{id:e.id,externalId:e.externalId,state:e.state,target:e.target,branch:e.branch,commitSha:e.commitSha,commitMessage:e.commitMessage,url:e.url,createdAt:e.createdAtProvider,buildingAt:e.buildingAt,readyAt:e.readyAt,isCurrent:e.isCurrent,isPreviousProduction:e.isPreviousProduction}}])},800523,970465,e=>{var t=e.i(875225),r=e.i(518899),s=e.i(924924),a=e.i(618916),n=e.i(442473),i=e.i(751762),o=e.i(656083);let l=String.raw`\d+\.\d+\.\d+(?:-[0-9A-Za-z.]+)?`,u="[\"'`]";function c(e){let t=/^(\d+)\.\d+\.\d+(?:-[0-9A-Za-z.]+)?$/.exec(e);return null!==t&&Number(t[1])>=9&&1e3>Number(t[1])}let d={"&amp;":"&","&quot;":'"',"&#39;":"'","&#x27;":"'","&#x2F;":"/","&#47;":"/"},p=e=>e.replace(/&(?:amp|quot|#39|#x27|#x2F|#47);/gi,e=>d[e]??d[e.toLowerCase()]??e),m=RegExp(String.raw`\bnext\s*=\s*\{\s*version\s*:\s*${u}(${l})${u}`,"g"),f=RegExp(String.raw`version\s*:\s*${u}(${l})${u}\s*,\s*appDir\s*:`,"g"),h=RegExp(String.raw`appDir\s*:\s*[^,{}()]{1,16},\s*version\s*:\s*${u}(${l})${u}`,"g"),g=/\bnext\s*=\s*\{\s*version\s*(?::\s*([A-Za-z_$][\w$]*)\s*)?[,}]/g,y=e=>e.replace(/[$]/g,"\\$");var w=e.i(267485);async function k(e,t,r={}){let s=r.deadline??1/0,a=r.now??(()=>new Date),i=e=>Math.floor(Math.min(e,s)-Date.now()),o=Date.now()+15e3;if(0>=i(o))return null;let d=(e,r)=>({version:t?.version??null,status:e,findings:t?.findings??[],reason:r,checkedAt:a()}),b=(e,t)=>(0,n.K)(e,{maxBytes:3145728,timeoutMs:i(o),lookup:r.lookup,fetch:r.fetch,userAgent:"OpsConsole-Security/1.0 (+https://west-solutions.web.id)",sameOrigin:t}),v=await b(`https://${e}/`,"www");if(!v.ok&&v.error===n.l)return d("unknown","the site redirects to another host");if(!v.ok||200!==v.status)return Date.now()>=s?null:d("error",`Couldn't load the site: ${v.ok?`HTTP ${v.status}`:v.error}`);let A=(function(e,t){let r;try{r=new URL(t)}catch{return[]}let s=new Set,a=[];for(let t of e.matchAll(/<script\b[^>]*?\ssrc\s*=\s*(["'])(.*?)\1/gi)){let e;try{e=new URL(p(t[2].trim()),r)}catch{continue}if("https:"===e.protocol&&e.origin===r.origin&&e.pathname.startsWith("/_next/static/")&&(e.hash="",!s.has(e.href))){var n;s.add(e.href),a.push({href:e.href,rank:(n=e.pathname,/\/main-app[-.]/.test(n)?0:/\/(main|app-index)[-.]/.test(n)?1:/\/(webpack|polyfills|framework)[-.]/.test(n)?3:2),i:a.length})}}return a.sort((e,t)=>e.rank-t.rank||e.i-t.i).map(e=>e.href)})(v.body,v.url).slice(0,12);if(0===A.length)return d("unknown",v.body.includes("/_next/")?"version not exposed":"not a Next.js site");let x=null,$=0,I=!1;for(let e of A){if(0>=i(o)){I=!0;break}let t=await b(e,!0);if(t.ok&&200===t.status&&($++,x=function(e){for(let t of e.matchAll(m))if(c(t[1]))return t[1];for(let t of[f,h])for(let r of e.matchAll(t))if(c(r[1]))return r[1];for(let t of e.matchAll(g)){let r=t[1]??"version",s=RegExp(String.raw`(?:^|[^\w$.])${y(r)}\s*=\s*${u}(${l})${u}`,"g"),a=null;for(let r of e.matchAll(s)){if((r.index??0)>=(t.index??0))break;a=r[1]}if(a&&c(a))return a}return null}(t.body)))break}if(!x)return Date.now()>=s?null:I||0>=i(o)?d("error","Reading the site's scripts took longer than 15 s"):0===$?d("error","Couldn't load the site's scripts"):d("unknown","version not exposed");let S=i(Date.now()+1e4);if(S<=0)return null;let j=await (0,w.y)(x,{timeoutMs:S,fetch:r.fetch});return j.ok?{version:x,status:j.findings.length?"vulnerable":"ok",findings:j.findings,reason:null,checkedAt:a()}:Date.now()>=s?null:d("error",j.error)}e.s(["P",0,k,"F",0,function(e,t){return Math.min(t+35e3,e+55e3)}],970465);var b=e.i(7494),v=e.i(195191),A=e.i(146394);function x(e){return{version:e.version,status:e.status,findings:Array.isArray(e.findings)?e.findings:[],reason:e.reason,checkedAt:e.checkedAt}}async function $(e){let n=await (0,s.f)().select({id:a.resources.id,name:a.resources.name,sec:a.appSecurity}).from(a.resources).leftJoin(a.appSecurity,(0,t.u)(a.appSecurity.resourceId,a.resources.id)).where((0,t.b)((0,t.u)(a.resources.kind,"app"),(0,t.u)(a.resources.monitored,!0),(0,t.M)(a.resources.goneAt),e?(0,t.u)(a.resources.id,e):void 0)).orderBy(r.B`${a.appSecurity.checkedAt} asc nulls first`,a.resources.name).limit(A.O.apps);if(!n.length)return[];let i=await (0,s.f)().select({resourceId:a.monitors.resourceId,url:a.monitors.url}).from(a.monitors).where((0,t.y)(a.monitors.resourceId,n.map(e=>e.id))).orderBy(a.monitors.createdAt).limit(A.O.monitors);return n.map(e=>({id:e.id,name:e.name,prev:e.sec?x(e.sec):null,host:(0,v.m)(e.name,i.filter(t=>t.resourceId===e.id).map(e=>e.url))}))}async function I(e,n){await (0,s.f)().transaction(async s=>{await s.execute(r.B`select pg_advisory_xact_lock(hashtext(${`app_security:${e.id}`}))`);let[i]=await s.select().from(a.appSecurity).where((0,t.u)(a.appSecurity.resourceId,e.id)).limit(1),l=i?x(i):null;if(l&&l.checkedAt.getTime()>=n.checkedAt.getTime())return;let u="unknown"===n.status||"error"===n.status?{...n,version:l?l.version:n.version,findings:l?l.findings:n.findings}:n,c={framework:"next",version:u.version,status:u.status,findings:u.findings,reason:u.reason,checkedAt:u.checkedAt};await s.insert(a.appSecurity).values({resourceId:e.id,...c}).onConflictDoUpdate({target:a.appSecurity.resourceId,set:c,setWhere:r.B`${a.appSecurity.checkedAt} < excluded.checked_at`});let d=(0,b.t)(e.name,l,u);d&&await (0,o.f)([{type:"system",kind:d.kind,message:d.message,detail:d.detail,resourceId:e.id,at:u.checkedAt,reason:"ok"===d.kind?"NextClean":"NextVulnerable"}],s)})}async function S(e){let t=await $(),r=0,s=0,a=[];return await (0,n.P)(t,3,async t=>{if(e-Date.now()<3e3)return void s++;try{let a=await k(t.host,t.prev,{deadline:e});if(!a)return void s++;await I(t,a),r++}catch(e){a.push(`${t.name}: ${(0,i.f)(e)}`)}}),{checked:r,skipped:s,failed:a}}e.s(["h",0,S,"Z",0,x],800523)}]})();
1
+ (()=>{"use strict";module.exports=[426099,e=>{var t=e.i(875225),r=e.i(971724),s=e.i(105954),a=e.i(604147),n=e.i(455744),i=e.i(924924),o=e.i(618916),l=e.i(61926),u=e.i(218331);let c=e=>{let t=(0,u.e)(e);return`${t.day} ${t.month} ${t.year}`},d=u.x;var p=e.i(122143),m=e.i(775843),f=e.i(146394),h=e.i(69679),g=e.i(145647);let y="advisor.latest",w=r.z.object({key:s.z.string(),severity:a.z.enum(["warning","info"]),appId:s.z.string().nullable(),subject:s.z.string(),title:s.z.string(),why:s.z.string(),fix:s.z.string(),href:s.z.string()}),k=r.z.object({at:s.z.string(),items:n.z.array(w)});async function b(e){let r=(0,t.b)((0,t.u)(o.resources.kind,"app"),(0,t.u)(o.resources.monitored,!0),(0,t.M)(o.resources.goneAt)),s=await (0,g.P)(),a=await (0,h.V)(),[n,u,c,d,y]=await Promise.all([(0,i.f)().select({id:o.monitors.id,appId:o.monitors.resourceId,appName:o.resources.name,url:o.monitors.url,kind:o.monitors.kind,name:o.monitors.name,paused:o.monitors.paused,ownerPaused:o.monitors.ownerPaused,lastStatus:o.monitors.lastStatus,expectedStatus:o.monitors.expectedStatus,lastPingAt:o.monitors.lastPingAt,createdAt:o.monitors.createdAt}).from(o.monitors).innerJoin(o.resources,(0,t.u)(o.resources.id,o.monitors.resourceId)).where(r).orderBy(o.resources.name,o.monitors.url).limit(f.O.monitors),(0,i.f)().select({id:o.resources.id,name:o.resources.name,version:o.appSecurity.version}).from(o.resources).innerJoin(o.appSecurity,(0,t.u)(o.appSecurity.resourceId,o.resources.id)).where(r).orderBy(o.resources.name).limit(f.O.apps),(0,i.f)().select({id:o.resources.id,name:o.resources.name,kind:o.resources.kind,accountId:o.resources.accountId,accountLabel:o.accounts.label,state:o.snapshots.state}).from(o.resources).innerJoin(o.accounts,(0,t.u)(o.accounts.id,o.resources.accountId)).leftJoin(o.snapshots,(0,t.u)(o.snapshots.resourceId,o.resources.id)).where((0,t.b)((0,t.y)(o.resources.kind,[...p.H]),(0,t.u)(o.resources.monitored,!0),(0,t.M)(o.resources.goneAt))).orderBy(o.resources.name).limit(f.O.databases),(0,i.f)().select({appId:o.links.fromResourceId,dbId:o.links.toResourceId}).from(o.links).where((0,t.u)(o.links.kind,"uses_db")).limit(f.O.apps),(0,i.f)().select({id:o.accounts.id,provider:o.accounts.provider,label:o.accounts.label,expiresAt:o.accounts.expiresAt,scopeNote:o.accounts.scopeNote}).from(o.accounts).orderBy(o.accounts.label).limit(200)]);return{now:e,monitors:n.map(e=>({id:e.id,appId:e.appId,appName:e.appName,path:"heartbeat"===e.kind?e.url:(0,l.K)(e.url),kind:e.kind,name:e.name,paused:e.paused||e.ownerPaused,lastStatus:e.lastStatus,expectedStatus:e.expectedStatus,lastPingAt:e.lastPingAt,createdAt:e.createdAt})),eol:function(e,t){if(!t)return null;let r=t.cycles.find(e=>!e.isEol)?.latest??null,s=[];for(let a of e){let e=a.version?.split(".")[0],n=e?t.cycles.find(t=>t.name===e):void 0;n&&s.push({appId:a.id,appName:a.name,cycle:n.name,eolFrom:n.eolFrom?new Date(`${n.eolFrom}T00:00:00Z`):null,latest:r})}return s}(u,s),headers:null,dbs:c.map(e=>({id:e.id,name:e.name,provider:(0,p.Z)(e.kind),accountId:e.accountId,accountLabel:e.accountLabel,state:e.state??"unknown"})),slots:(0,m.f)(a).map(e=>({account:e.account,used:e.used,total:e.total,planUnknown:e.planUnknown})),links:d,accounts:y}}async function v(e){let t=function(e){let t=[];for(let r of e.eol??[]){if(!r.eolFrom||r.eolFrom.getTime()-e.now.getTime()>2592e6)continue;let s=r.eolFrom.getTime()<=e.now.getTime(),a=r.latest?.split(".")[0];t.push({key:`next-eol:${r.appId}:${r.cycle}`,severity:"warning",appId:r.appId,subject:r.appName,title:`Next.js ${r.cycle} ${s?"reached":"reaches"} end of life on ${c(r.eolFrom)}`,why:`No security fixes after that date.${r.latest?` Latest is ${r.latest}.`:""}`,fix:a?`Upgrade to Next.js ${a}.`:"Upgrade Next.js.",href:"https://endoflife.date/nextjs"})}for(let r of e.monitors)!r.paused&&("heartbeat"===r.kind&&!r.lastPingAt&&e.now.getTime()-r.createdAt.getTime()>864e5&&t.push({key:`hb-silent:${r.id}`,severity:"warning",appId:r.appId,subject:r.appName,title:`${r.name??"A heartbeat"} has never pinged`,why:"It was added more than a day ago and no job has called its URL.",fix:"Add the ping to the job, or delete the monitor.",href:"/uptime"}),"http"===r.kind&&"/"===r.path&&200===r.expectedStatus&&null!==r.lastStatus&&[401,403,404].includes(r.lastStatus)&&t.push({key:`monitor-root:${r.id}:${r.lastStatus}`,severity:"info",appId:r.appId,subject:r.appName,title:`The monitor on / answers ${r.lastStatus}`,why:`A login or missing page answering ${r.lastStatus} makes the monitor look down.`,fix:`Point the monitor at a public health route, or expect ${r.lastStatus}.`,href:"/uptime"}));for(let r of e.headers??[]){if(!r.missing.length)continue;let e=[...r.missing].sort();t.push({key:`headers:${r.appId}:${e.join(",")}`,severity:"info",appId:r.appId,subject:r.appName,title:`Missing security headers: ${e.join(", ")}`,why:"Browsers use them to block clickjacking, sniffing and downgrade attacks.",fix:"Add them in next.config headers().",href:"https://developer.mozilla.org/en-US/observatory"})}for(let r of e.slots??[])r.used<r.total||t.push({key:`no-slot:${r.account}`,severity:"warning",appId:null,subject:`supabase \xb7 ${r.account}`,title:`Account ${r.account} has no free slot`,why:r.planUnknown?"Two projects are active. If this account is on the free plan (it couldn't be read), a paused one can't be restored here.":"Both free projects are active, so a paused one can't be restored here.",fix:"Pause one project, or move one to another account.",href:"/supabase"});if(e.dbs&&e.links){let r=new Set(e.links.map(e=>e.dbId));for(let s of e.dbs.filter(e=>!r.has(e.id)))t.push({key:`db-unlinked:${s.id}`,severity:"info",appId:null,subject:s.name,title:"Database isn't linked to any app",why:"Topology and the app status can't use it.",fix:"Link it from the app page.",href:"/apps"})}for(let r of e.accounts)"supabase"===r.provider&&r.scopeNote&&/all[- ]access/i.test(r.scopeNote)&&t.push({key:`broad-cred:${r.id}`,severity:"info",appId:null,subject:`supabase \xb7 ${r.label}`,title:`${r.label} uses an all-access token`,why:"The console only reads; a broader token is a bigger risk if it ever leaks.",fix:"Replace it with a read-only token in Connections, then revoke the old one in Supabase.",href:"/connections"});for(let r of e.accounts){if(!r.expiresAt)continue;let s=r.expiresAt.getTime()-e.now.getTime();s>=12096e5&&s<=5184e6&&t.push({key:`cred-60:${r.id}:${d(r.expiresAt)}`,severity:"info",appId:null,subject:`${r.provider} \xb7 ${r.label}`,title:`The ${r.provider} credential ${r.label} expires on ${(0,u.L)(r.expiresAt)}`,why:"An expired credential stops every reading from that account.",fix:"Create a new one and use Replace credential in Connections.",href:"/connections"})}return t.map((e,t)=>({r:e,i:t})).sort((e,t)=>("warning"!==e.r.severity)-("warning"!==t.r.severity)||e.i-t.i).map(({r:e})=>e).slice(0,50)}(await b(e)),r={at:e.toISOString(),items:t};return await (0,i.f)().insert(o.settings).values({key:y,value:r}).onConflictDoUpdate({target:o.settings.key,set:{value:r,updatedAt:e}}),t}async function A(e){let[r]=await (0,i.f)().select({value:o.settings.value}).from(o.settings).where((0,t.u)(o.settings.key,y)).limit(1),s=k.safeParse(r?.value);return s.success?s.data.items:v(e)}async function x(e,r){var s;let a=await A(e);if(!a.length)return[];let n=await (0,i.f)().select({key:o.recommendationDismissals.key,dismissedAt:o.recommendationDismissals.dismissedAt}).from(o.recommendationDismissals).where((0,t.y)(o.recommendationDismissals.key,a.map(e=>e.key))).limit(50),l=(s=new Map(n.map(e=>[e.key,e.dismissedAt])),a.filter(t=>{let r=s.get(t.key);return!r||e.getTime()-r.getTime()>=2592e6}));return r?l.filter(e=>e.appId===r):l}e.s(["T",0,x,"O",0,v],426099)},367114,489099,505657,e=>{var t=e.i(875225),r=e.i(349129),s=e.i(924924),a=e.i(618916),n=e.i(195191),i=e.i(943816),o=e.i(46574),l=e.i(146394),u=e.i(69679),c=e.i(275426),d=e.i(703724);e.i(656083);var p=e.i(739886),m=e.i(890948),f=e.i(309055),h=e.i(800523);let g=e=>"string"==typeof e&&e?e:null;async function y(e,y){let w=await (0,s.f)().select({r:a.resources,s:a.snapshots,sec:a.appSecurity,accStatus:a.accounts.status}).from(a.resources).leftJoin(a.accounts,(0,t.u)(a.accounts.id,a.resources.accountId)).leftJoin(a.snapshots,(0,t.u)(a.snapshots.resourceId,a.resources.id)).leftJoin(a.appSecurity,(0,t.u)(a.appSecurity.resourceId,a.resources.id)).where((0,t.b)((0,t.u)(a.resources.kind,"app"),(0,t.u)(a.resources.monitored,!0),y?(0,t.u)(a.resources.id,y):void 0)).orderBy(a.resources.name).limit(l.O.apps);if(!w.length)return[];let k=w.map(e=>e.r.id),b=(await (0,s.f)().select().from(a.monitors).where((0,t.y)(a.monitors.resourceId,k)).orderBy(a.monitors.createdAt).limit(l.O.monitors)).map(f.M),v=await (0,s.f)().selectDistinctOn([a.deployments.resourceId]).from(a.deployments).where((0,t.b)((0,t.y)(a.deployments.resourceId,k),(0,t.u)(a.deployments.target,"production"))).orderBy(a.deployments.resourceId,(0,r.A)(a.deployments.createdAtProvider)),A=await (0,m._)(b.map(e=>e.id),e),x=await (0,m.P)(k,e),$=await (0,u.F)(k),I=b.length?await (0,p.f)():[];return w.map(({r:t,s:r,sec:s,accStatus:a})=>{let u=b.filter(e=>e.appId===t.id).map(t=>({...t,maintUntil:(0,c.x)(I,{monitorId:t.id,appId:t.appId},e)?.end??null})),p=g(t.meta.createdAt),m=v.find(e=>e.resourceId===t.id);return{id:t.id,name:t.name,gone:null!==t.goneAt,state:r?.state??"unknown",stateSince:r?.stateSince??null,domain:(0,n.m)(t.name,u.map(e=>e.url)),framework:g(t.meta.framework),productionBranch:g(t.meta.productionBranch),createdAt:p?new Date(p):null,teamName:g(t.meta.teamName),teamSlug:g(t.meta.teamSlug),repo:g(t.meta.repo),repoType:g(t.meta.repoType),functionRegions:Array.isArray(t.meta.functionRegions)?t.meta.functionRegions.filter(e=>"string"==typeof e):[],monitors:u,lastDeploy:m?(0,d.f)(m):null,uptime30:(0,o.Y)(u.flatMap(t=>(0,o.w)(A.get(t.id),e,o.I))),response:x.get(t.id)??{hourly:Array.from({length:l.A.responseHours},()=>null),p95:null,p50:null},days:new Map(u.flatMap(e=>{let t=A.get(e.id);return t?[[e.id,t]]:[]})),security:s?(0,h.Z)(s):null,database:$.get(t.id)??null,dbPaused:r?.data.dbPaused===!0,pageViews:(0,i.G)(r?.data),pageViewsNote:(0,i.R)({gone:null!==t.goneAt,teamId:g(t.meta.teamId),accountOk:"ok"===a,hasProductionDeploy:void 0!==m})}})}async function w(e,t){return(await y(t,e))[0]??null}e.s(["Z",0,w,"G",0,y],367114);var k=e.i(518899),b=e.i(165788);let v=k.B`coalesce(${a.events.lastAt}, ${a.events.at})`;async function A(e=l.O.events,n={}){return(await (0,s.f)().select({e:a.events,name:a.resources.name}).from(a.events).leftJoin(a.resources,(0,t.u)(a.resources.id,a.events.resourceId)).where(n.excludeActions?(0,t.c)(a.events.type,"action"):void 0).orderBy((0,r.A)(v)).limit(Math.max(1,Math.min(Number.isFinite(e)?Math.floor(e):l.O.events,l.O.events)))).map(({e,name:t})=>({id:e.id,at:e.at,lastAt:e.lastAt??null,count:e.count??1,reason:e.reason??null,type:e.type,kind:e.kind,message:e.message,detail:e.detail,resourceId:e.resourceId??null,resource:(0,b.L)({type:e.type,reason:e.reason??null,message:e.message,resource:t})}))}e.s(["f",0,A],489099);var x=e.i(959408),$=e.i(122143);e.i(358660);let I=e=>"heartbeat"===e.kind?e.lastError?e.lastError.replace(/^(Down|Late) · /,""):"warn"===e.state?"Late":"No ping":(0,x.H)(e)??(e.lastStatus?`HTTP ${e.lastStatus}`:e.lastError||"No answer");e.s(["f",0,function(e,t){if(e.gone)return[];let r=[],s=e.monitors.filter(e=>(0,x.i)(e)&&!e.maintUntil&&("err"===e.state||"warn"===e.state)),a=e=>2*("heartbeat"===e.kind)+ +("err"!==e.state);for(let e of[...s].sort((e,t)=>a(e)-a(t))){let t="heartbeat"===e.kind,s=t?e.name??e.path:e.path;r.push({kind:"monitor",where:t?`Monitor ${s} (heartbeat)`:`Monitor ${s}`,subject:s,state:e.state,reason:I(e),since:e.stateSince??(t?e.lastPingAt??null:null),href:"/uptime",remedies:t?function(e){let t=(e.lastError??"").toLowerCase();return t.includes("failure")?["The job reported a failure: open its logs","Fix and re-run the job; the next OK ping clears it"]:t.includes("didn't finish")||t.includes("started")?["The job started but never finished: it may have hung or hit its timeout","Check the job's own logs for where it stopped","Raise the job's timeout, or fix what it waits on; the next OK ping clears it"]:["Check that the job's scheduler ran (cron, Vercel Cron, GitHub Actions)","Check the job's own logs for errors before the ping line","Make sure the job calls the ping URL at the end (curl -fsS -m 10 <url>)","If the job is retired, pause or delete the heartbeat"]}(e):function(e){let t=e.lastError??"";if(/blocked address/i.test(t))return["The monitor's URL resolves to a private address; fix the URL in Edit monitor"];let r=(0,x.H)(e);if(r&&/keyword|json|body|content/i.test(r))return["The page answered but its content changed: check the keyword or JSON path in Edit monitor, or the page itself"];let s=e.lastStatus;return null!==s&&s>=500?["Open Logs (last hour) for errors","Check the latest deployment; roll back if it started after the deploy"]:null!==s&&s>=300?["Check the expected status and path in Edit monitor","The route may need sign-in or moved"]:null===s||r?["Check the domain, DNS and the provider status page","Cold start or overload: retry with Check now"]:["Open Logs (last hour) for errors","Check the latest deployment; roll back if it started after the deploy"]}(e)})}e.dbPaused&&e.database&&r.push({kind:"database",where:`Database ${e.database.name}`,subject:e.database.name,state:"warn",reason:"Paused",since:e.stateSince??null,href:(0,$.N)(e.database.kind),remedies:["Restore the database from its provider (Supabase restore)"]});let i=e.lastDeploy;if(i&&"error"===i.state){let e=(0,n._)(i.commitSha);r.push({kind:"deployment",where:`Production deployment ${e}`,subject:e,state:"fail",reason:"Build failed",since:i.readyAt??i.createdAt,href:"/deployments",remedies:["Open the deployment's build logs; redeploy after fixing"]})}return r}],505657)},703724,e=>{e.i(924924),e.i(618916),e.s(["f",0,function(e){return{id:e.id,externalId:e.externalId,state:e.state,target:e.target,branch:e.branch,commitSha:e.commitSha,commitMessage:e.commitMessage,url:e.url,createdAt:e.createdAtProvider,buildingAt:e.buildingAt,readyAt:e.readyAt,isCurrent:e.isCurrent,isPreviousProduction:e.isPreviousProduction}}])},800523,970465,e=>{var t=e.i(875225),r=e.i(518899),s=e.i(924924),a=e.i(618916),n=e.i(442473),i=e.i(751762),o=e.i(656083);let l=String.raw`\d+\.\d+\.\d+(?:-[0-9A-Za-z.]+)?`,u="[\"'`]";function c(e){let t=/^(\d+)\.\d+\.\d+(?:-[0-9A-Za-z.]+)?$/.exec(e);return null!==t&&Number(t[1])>=9&&1e3>Number(t[1])}let d={"&amp;":"&","&quot;":'"',"&#39;":"'","&#x27;":"'","&#x2F;":"/","&#47;":"/"},p=e=>e.replace(/&(?:amp|quot|#39|#x27|#x2F|#47);/gi,e=>d[e]??d[e.toLowerCase()]??e),m=RegExp(String.raw`\bnext\s*=\s*\{\s*version\s*:\s*${u}(${l})${u}`,"g"),f=RegExp(String.raw`version\s*:\s*${u}(${l})${u}\s*,\s*appDir\s*:`,"g"),h=RegExp(String.raw`appDir\s*:\s*[^,{}()]{1,16},\s*version\s*:\s*${u}(${l})${u}`,"g"),g=/\bnext\s*=\s*\{\s*version\s*(?::\s*([A-Za-z_$][\w$]*)\s*)?[,}]/g,y=e=>e.replace(/[$]/g,"\\$");var w=e.i(267485);async function k(e,t,r={}){let s=r.deadline??1/0,a=r.now??(()=>new Date),i=e=>Math.floor(Math.min(e,s)-Date.now()),o=Date.now()+15e3;if(0>=i(o))return null;let d=(e,r)=>({version:t?.version??null,status:e,findings:t?.findings??[],reason:r,checkedAt:a()}),b=(e,t)=>(0,n.K)(e,{maxBytes:3145728,timeoutMs:i(o),lookup:r.lookup,fetch:r.fetch,userAgent:"OpsConsole-Security/1.0 (+https://west-solutions.web.id)",sameOrigin:t}),v=await b(`https://${e}/`,"www");if(!v.ok&&v.error===n.l)return d("unknown","the site redirects to another host");if(!v.ok||200!==v.status)return Date.now()>=s?null:d("error",`Couldn't load the site: ${v.ok?`HTTP ${v.status}`:v.error}`);let A=(function(e,t){let r;try{r=new URL(t)}catch{return[]}let s=new Set,a=[];for(let t of e.matchAll(/<script\b[^>]*?\ssrc\s*=\s*(["'])(.*?)\1/gi)){let e;try{e=new URL(p(t[2].trim()),r)}catch{continue}if("https:"===e.protocol&&e.origin===r.origin&&e.pathname.startsWith("/_next/static/")&&(e.hash="",!s.has(e.href))){var n;s.add(e.href),a.push({href:e.href,rank:(n=e.pathname,/\/main-app[-.]/.test(n)?0:/\/(main|app-index)[-.]/.test(n)?1:/\/(webpack|polyfills|framework)[-.]/.test(n)?3:2),i:a.length})}}return a.sort((e,t)=>e.rank-t.rank||e.i-t.i).map(e=>e.href)})(v.body,v.url).slice(0,12);if(0===A.length)return d("unknown",v.body.includes("/_next/")?"version not exposed":"not a Next.js site");let x=null,$=0,I=!1;for(let e of A){if(0>=i(o)){I=!0;break}let t=await b(e,!0);if(t.ok&&200===t.status&&($++,x=function(e){for(let t of e.matchAll(m))if(c(t[1]))return t[1];for(let t of[f,h])for(let r of e.matchAll(t))if(c(r[1]))return r[1];for(let t of e.matchAll(g)){let r=t[1]??"version",s=RegExp(String.raw`(?:^|[^\w$.])${y(r)}\s*=\s*${u}(${l})${u}`,"g"),a=null;for(let r of e.matchAll(s)){if((r.index??0)>=(t.index??0))break;a=r[1]}if(a&&c(a))return a}return null}(t.body)))break}if(!x)return Date.now()>=s?null:I||0>=i(o)?d("error","Reading the site's scripts took longer than 15 s"):0===$?d("error","Couldn't load the site's scripts"):d("unknown","version not exposed");let S=i(Date.now()+1e4);if(S<=0)return null;let j=await (0,w.y)(x,{timeoutMs:S,fetch:r.fetch});return j.ok?{version:x,status:j.findings.length?"vulnerable":"ok",findings:j.findings,reason:null,checkedAt:a()}:Date.now()>=s?null:d("error",j.error)}e.s(["P",0,k,"F",0,function(e,t){return Math.min(t+35e3,e+55e3)}],970465);var b=e.i(7494),v=e.i(195191),A=e.i(146394);function x(e){return{version:e.version,status:e.status,findings:Array.isArray(e.findings)?e.findings:[],reason:e.reason,checkedAt:e.checkedAt}}async function $(e){let n=await (0,s.f)().select({id:a.resources.id,name:a.resources.name,sec:a.appSecurity}).from(a.resources).leftJoin(a.appSecurity,(0,t.u)(a.appSecurity.resourceId,a.resources.id)).where((0,t.b)((0,t.u)(a.resources.kind,"app"),(0,t.u)(a.resources.monitored,!0),(0,t.M)(a.resources.goneAt),e?(0,t.u)(a.resources.id,e):void 0)).orderBy(r.B`${a.appSecurity.checkedAt} asc nulls first`,a.resources.name).limit(A.O.apps);if(!n.length)return[];let i=await (0,s.f)().select({resourceId:a.monitors.resourceId,url:a.monitors.url}).from(a.monitors).where((0,t.y)(a.monitors.resourceId,n.map(e=>e.id))).orderBy(a.monitors.createdAt).limit(A.O.monitors);return n.map(e=>({id:e.id,name:e.name,prev:e.sec?x(e.sec):null,host:(0,v.m)(e.name,i.filter(t=>t.resourceId===e.id).map(e=>e.url))}))}async function I(e,n){await (0,s.f)().transaction(async s=>{await s.execute(r.B`select pg_advisory_xact_lock(hashtext(${`app_security:${e.id}`}))`);let[i]=await s.select().from(a.appSecurity).where((0,t.u)(a.appSecurity.resourceId,e.id)).limit(1),l=i?x(i):null;if(l&&l.checkedAt.getTime()>=n.checkedAt.getTime())return;let u="unknown"===n.status||"error"===n.status?{...n,version:l?l.version:n.version,findings:l?l.findings:n.findings}:n,c={framework:"next",version:u.version,status:u.status,findings:u.findings,reason:u.reason,checkedAt:u.checkedAt};await s.insert(a.appSecurity).values({resourceId:e.id,...c}).onConflictDoUpdate({target:a.appSecurity.resourceId,set:c,setWhere:r.B`${a.appSecurity.checkedAt} < excluded.checked_at`});let d=(0,b.t)(e.name,l,u);d&&await (0,o.f)([{type:"system",kind:d.kind,message:d.message,detail:d.detail,resourceId:e.id,at:u.checkedAt,reason:"ok"===d.kind?"NextClean":"NextVulnerable"}],s)})}async function S(e){let t=await $(),r=0,s=0,a=[];return await (0,n.P)(t,3,async t=>{if(e-Date.now()<3e3)return void s++;try{let a=await k(t.host,t.prev,{deadline:e});if(!a)return void s++;await I(t,a),r++}catch(e){a.push(`${t.name}: ${(0,i.f)(e)}`)}}),{checked:r,skipped:s,failed:a}}e.s(["h",0,S,"Z",0,x],800523)}]})();
2
2
 
3
3
  //# sourceMappingURL=src_lib_data_0e155tkqeoojm._.js.map