@posthog/wizard 1.36.1 → 2.0.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 (464) hide show
  1. package/README.md +79 -0
  2. package/dist/bin.js +199 -12
  3. package/dist/bin.js.map +1 -1
  4. package/dist/src/__tests__/cli.test.js +7 -18
  5. package/dist/src/__tests__/cli.test.js.map +1 -1
  6. package/dist/src/__tests__/run.test.js +50 -5
  7. package/dist/src/__tests__/run.test.js.map +1 -1
  8. package/dist/src/__tests__/wizard-abort.test.js +127 -0
  9. package/dist/src/__tests__/wizard-abort.test.js.map +1 -0
  10. package/dist/src/{android → frameworks/android}/android-wizard-agent.d.ts +1 -1
  11. package/dist/src/{android → frameworks/android}/android-wizard-agent.js +2 -2
  12. package/dist/src/frameworks/android/android-wizard-agent.js.map +1 -0
  13. package/dist/src/{android → frameworks/android}/utils.d.ts +1 -1
  14. package/dist/src/{android → frameworks/android}/utils.js +1 -1
  15. package/dist/src/frameworks/android/utils.js.map +1 -0
  16. package/dist/src/{angular → frameworks/angular}/angular-wizard-agent.d.ts +1 -1
  17. package/dist/src/{angular → frameworks/angular}/angular-wizard-agent.js +9 -7
  18. package/dist/src/frameworks/angular/angular-wizard-agent.js.map +1 -0
  19. package/dist/src/{angular → frameworks/angular}/utils.js +1 -1
  20. package/dist/src/frameworks/angular/utils.js.map +1 -0
  21. package/dist/src/{astro → frameworks/astro}/astro-wizard-agent.d.ts +1 -1
  22. package/dist/src/{astro → frameworks/astro}/astro-wizard-agent.js +9 -7
  23. package/dist/src/frameworks/astro/astro-wizard-agent.js.map +1 -0
  24. package/dist/src/{astro → frameworks/astro}/utils.d.ts +2 -5
  25. package/dist/src/{astro → frameworks/astro}/utils.js +3 -52
  26. package/dist/src/frameworks/astro/utils.js.map +1 -0
  27. package/dist/src/{django → frameworks/django}/django-wizard-agent.d.ts +1 -1
  28. package/dist/src/{django → frameworks/django}/django-wizard-agent.js +3 -3
  29. package/dist/src/frameworks/django/django-wizard-agent.js.map +1 -0
  30. package/dist/src/{django → frameworks/django}/utils.d.ts +1 -1
  31. package/dist/src/{django → frameworks/django}/utils.js +6 -6
  32. package/dist/src/frameworks/django/utils.js.map +1 -0
  33. package/dist/src/frameworks/fastapi/fastapi-wizard-agent.d.ts +5 -0
  34. package/dist/src/{fastapi → frameworks/fastapi}/fastapi-wizard-agent.js +3 -32
  35. package/dist/src/frameworks/fastapi/fastapi-wizard-agent.js.map +1 -0
  36. package/dist/src/{fastapi → frameworks/fastapi}/utils.d.ts +1 -1
  37. package/dist/src/{fastapi → frameworks/fastapi}/utils.js +4 -4
  38. package/dist/src/frameworks/fastapi/utils.js.map +1 -0
  39. package/dist/src/{flask → frameworks/flask}/flask-wizard-agent.d.ts +1 -1
  40. package/dist/src/{flask → frameworks/flask}/flask-wizard-agent.js +3 -3
  41. package/dist/src/frameworks/flask/flask-wizard-agent.js.map +1 -0
  42. package/dist/src/{flask → frameworks/flask}/utils.d.ts +1 -1
  43. package/dist/src/{flask → frameworks/flask}/utils.js +7 -7
  44. package/dist/src/frameworks/flask/utils.js.map +1 -0
  45. package/dist/src/{javascript-node → frameworks/javascript-node}/javascript-node-wizard-agent.d.ts +1 -1
  46. package/dist/src/{javascript-node → frameworks/javascript-node}/javascript-node-wizard-agent.js +4 -4
  47. package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js.map +1 -0
  48. package/dist/src/{javascript-web → frameworks/javascript-web}/javascript-web-wizard-agent.d.ts +1 -1
  49. package/dist/src/{javascript-web → frameworks/javascript-web}/javascript-web-wizard-agent.js +16 -14
  50. package/dist/src/frameworks/javascript-web/javascript-web-wizard-agent.js.map +1 -0
  51. package/dist/src/{javascript-web → frameworks/javascript-web}/utils.d.ts +6 -1
  52. package/dist/src/{javascript-web → frameworks/javascript-web}/utils.js +49 -1
  53. package/dist/src/frameworks/javascript-web/utils.js.map +1 -0
  54. package/dist/src/{laravel → frameworks/laravel}/laravel-wizard-agent.d.ts +1 -1
  55. package/dist/src/{laravel → frameworks/laravel}/laravel-wizard-agent.js +2 -2
  56. package/dist/src/frameworks/laravel/laravel-wizard-agent.js.map +1 -0
  57. package/dist/src/{laravel → frameworks/laravel}/utils.d.ts +1 -1
  58. package/dist/src/{laravel → frameworks/laravel}/utils.js +5 -5
  59. package/dist/src/frameworks/laravel/utils.js.map +1 -0
  60. package/dist/src/{nextjs → frameworks/nextjs}/nextjs-wizard-agent.d.ts +1 -1
  61. package/dist/src/{nextjs → frameworks/nextjs}/nextjs-wizard-agent.js +30 -8
  62. package/dist/src/frameworks/nextjs/nextjs-wizard-agent.js.map +1 -0
  63. package/dist/src/{nextjs → frameworks/nextjs}/utils.d.ts +5 -2
  64. package/dist/src/{nextjs → frameworks/nextjs}/utils.js +6 -20
  65. package/dist/src/frameworks/nextjs/utils.js.map +1 -0
  66. package/dist/src/{nuxt → frameworks/nuxt}/nuxt-wizard-agent.d.ts +1 -1
  67. package/dist/src/{nuxt → frameworks/nuxt}/nuxt-wizard-agent.js +11 -9
  68. package/dist/src/frameworks/nuxt/nuxt-wizard-agent.js.map +1 -0
  69. package/dist/src/{python → frameworks/python}/python-wizard-agent.d.ts +1 -1
  70. package/dist/src/{python → frameworks/python}/python-wizard-agent.js +3 -3
  71. package/dist/src/frameworks/python/python-wizard-agent.js.map +1 -0
  72. package/dist/src/{python → frameworks/python}/utils.d.ts +1 -1
  73. package/dist/src/frameworks/python/utils.js.map +1 -0
  74. package/dist/src/{rails → frameworks/rails}/rails-wizard-agent.d.ts +1 -1
  75. package/dist/src/{rails → frameworks/rails}/rails-wizard-agent.js +2 -2
  76. package/dist/src/frameworks/rails/rails-wizard-agent.js.map +1 -0
  77. package/dist/src/{rails → frameworks/rails}/utils.d.ts +1 -1
  78. package/dist/src/{rails → frameworks/rails}/utils.js +4 -4
  79. package/dist/src/frameworks/rails/utils.js.map +1 -0
  80. package/dist/src/{react-native → frameworks/react-native}/react-native-wizard-agent.d.ts +1 -1
  81. package/dist/src/{react-native → frameworks/react-native}/react-native-wizard-agent.js +9 -7
  82. package/dist/src/frameworks/react-native/react-native-wizard-agent.js.map +1 -0
  83. package/dist/src/{react-native → frameworks/react-native}/utils.d.ts +1 -1
  84. package/dist/src/{react-native → frameworks/react-native}/utils.js +7 -10
  85. package/dist/src/frameworks/react-native/utils.js.map +1 -0
  86. package/dist/src/{react-router → frameworks/react-router}/react-router-wizard-agent.d.ts +1 -1
  87. package/dist/src/{react-router → frameworks/react-router}/react-router-wizard-agent.js +15 -8
  88. package/dist/src/frameworks/react-router/react-router-wizard-agent.js.map +1 -0
  89. package/dist/src/frameworks/react-router/utils.d.ts +13 -0
  90. package/dist/src/{react-router → frameworks/react-router}/utils.js +14 -111
  91. package/dist/src/frameworks/react-router/utils.js.map +1 -0
  92. package/dist/src/{ruby → frameworks/ruby}/ruby-wizard-agent.d.ts +1 -1
  93. package/dist/src/{ruby → frameworks/ruby}/ruby-wizard-agent.js +2 -2
  94. package/dist/src/frameworks/ruby/ruby-wizard-agent.js.map +1 -0
  95. package/dist/src/{ruby → frameworks/ruby}/utils.d.ts +1 -1
  96. package/dist/src/{ruby → frameworks/ruby}/utils.js +1 -1
  97. package/dist/src/frameworks/ruby/utils.js.map +1 -0
  98. package/dist/src/{svelte → frameworks/svelte}/svelte-wizard-agent.d.ts +1 -1
  99. package/dist/src/{svelte → frameworks/svelte}/svelte-wizard-agent.js +5 -5
  100. package/dist/src/frameworks/svelte/svelte-wizard-agent.js.map +1 -0
  101. package/dist/src/{swift → frameworks/swift}/swift-wizard-agent.d.ts +1 -1
  102. package/dist/src/{swift → frameworks/swift}/swift-wizard-agent.js +2 -2
  103. package/dist/src/frameworks/swift/swift-wizard-agent.js.map +1 -0
  104. package/dist/src/{swift → frameworks/swift}/utils.d.ts +1 -1
  105. package/dist/src/frameworks/swift/utils.js.map +1 -0
  106. package/dist/src/{tanstack-router → frameworks/tanstack-router}/tanstack-router-wizard-agent.d.ts +1 -1
  107. package/dist/src/{tanstack-router → frameworks/tanstack-router}/tanstack-router-wizard-agent.js +15 -8
  108. package/dist/src/frameworks/tanstack-router/tanstack-router-wizard-agent.js.map +1 -0
  109. package/dist/src/frameworks/tanstack-router/utils.d.ts +11 -0
  110. package/dist/src/{tanstack-router → frameworks/tanstack-router}/utils.js +4 -47
  111. package/dist/src/frameworks/tanstack-router/utils.js.map +1 -0
  112. package/dist/src/{tanstack-start → frameworks/tanstack-start}/tanstack-start-wizard-agent.d.ts +1 -1
  113. package/dist/src/{tanstack-start → frameworks/tanstack-start}/tanstack-start-wizard-agent.js +9 -7
  114. package/dist/src/frameworks/tanstack-start/tanstack-start-wizard-agent.js.map +1 -0
  115. package/dist/src/{tanstack-start → frameworks/tanstack-start}/utils.js +1 -1
  116. package/dist/src/frameworks/tanstack-start/utils.js.map +1 -0
  117. package/dist/src/{vue → frameworks/vue}/vue-wizard-agent.d.ts +1 -1
  118. package/dist/src/{vue → frameworks/vue}/vue-wizard-agent.js +8 -8
  119. package/dist/src/frameworks/vue/vue-wizard-agent.js.map +1 -0
  120. package/dist/src/lib/__tests__/agent-interface.test.js +91 -19
  121. package/dist/src/lib/__tests__/agent-interface.test.js.map +1 -1
  122. package/dist/src/lib/agent-interface.d.ts +49 -2
  123. package/dist/src/lib/agent-interface.js +254 -40
  124. package/dist/src/lib/agent-interface.js.map +1 -1
  125. package/dist/src/lib/agent-runner.d.ts +4 -2
  126. package/dist/src/lib/agent-runner.js +132 -126
  127. package/dist/src/lib/agent-runner.js.map +1 -1
  128. package/dist/src/lib/api.d.ts +4 -4
  129. package/dist/src/lib/commandments.js +1 -0
  130. package/dist/src/lib/commandments.js.map +1 -1
  131. package/dist/src/lib/constants.d.ts +22 -9
  132. package/dist/src/lib/constants.js +35 -11
  133. package/dist/src/lib/constants.js.map +1 -1
  134. package/dist/src/lib/framework-config.d.ts +26 -0
  135. package/dist/src/lib/framework-config.js.map +1 -1
  136. package/dist/src/lib/health-checks/__tests__/health-checks.test.d.ts +18 -0
  137. package/dist/src/lib/health-checks/__tests__/health-checks.test.js +752 -0
  138. package/dist/src/lib/health-checks/__tests__/health-checks.test.js.map +1 -0
  139. package/dist/src/lib/health-checks/endpoints.d.ts +3 -0
  140. package/dist/src/lib/health-checks/endpoints.js +46 -0
  141. package/dist/src/lib/health-checks/endpoints.js.map +1 -0
  142. package/dist/src/lib/health-checks/index.d.ts +4 -0
  143. package/dist/src/lib/health-checks/index.js +23 -0
  144. package/dist/src/lib/health-checks/index.js.map +1 -0
  145. package/dist/src/lib/health-checks/readiness.d.ts +24 -0
  146. package/dist/src/lib/health-checks/readiness.js +119 -0
  147. package/dist/src/lib/health-checks/readiness.js.map +1 -0
  148. package/dist/src/lib/health-checks/statuspage.d.ts +9 -0
  149. package/dist/src/lib/health-checks/statuspage.js +105 -0
  150. package/dist/src/lib/health-checks/statuspage.js.map +1 -0
  151. package/dist/src/lib/health-checks/types.d.ts +31 -0
  152. package/dist/src/lib/health-checks/types.js +10 -0
  153. package/dist/src/lib/health-checks/types.js.map +1 -0
  154. package/dist/src/lib/middleware/benchmark.d.ts +2 -2
  155. package/dist/src/lib/middleware/benchmark.js +3 -3
  156. package/dist/src/lib/middleware/benchmark.js.map +1 -1
  157. package/dist/src/lib/middleware/benchmarks/json-writer.js +2 -2
  158. package/dist/src/lib/middleware/benchmarks/json-writer.js.map +1 -1
  159. package/dist/src/lib/middleware/benchmarks/summary.d.ts +2 -2
  160. package/dist/src/lib/middleware/benchmarks/summary.js +9 -9
  161. package/dist/src/lib/middleware/benchmarks/summary.js.map +1 -1
  162. package/dist/src/lib/middleware/types.d.ts +2 -2
  163. package/dist/src/lib/middleware/types.js.map +1 -1
  164. package/dist/src/lib/package-manager-detection.js +1 -1
  165. package/dist/src/lib/package-manager-detection.js.map +1 -1
  166. package/dist/src/lib/registry.js +21 -21
  167. package/dist/src/lib/registry.js.map +1 -1
  168. package/dist/src/lib/version.d.ts +1 -1
  169. package/dist/src/lib/version.js +1 -1
  170. package/dist/src/lib/version.js.map +1 -1
  171. package/dist/src/lib/wizard-session.d.ts +115 -0
  172. package/dist/src/lib/wizard-session.js +104 -0
  173. package/dist/src/lib/wizard-session.js.map +1 -0
  174. package/dist/src/lib/wizard-tools.js +13 -0
  175. package/dist/src/lib/wizard-tools.js.map +1 -1
  176. package/dist/src/run.d.ts +3 -1
  177. package/dist/src/run.js +73 -55
  178. package/dist/src/run.js.map +1 -1
  179. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.js +18 -22
  180. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.js.map +1 -1
  181. package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.d.ts +6 -6
  182. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +6 -6
  183. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.d.ts +7 -7
  184. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js +8 -9
  185. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js.map +1 -1
  186. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +6 -6
  187. package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.d.ts +6 -6
  188. package/dist/src/steps/add-mcp-server-to-clients/clients/zed.d.ts +6 -6
  189. package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +6 -6
  190. package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +5 -2
  191. package/dist/src/steps/add-mcp-server-to-clients/index.js +24 -107
  192. package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -1
  193. package/dist/src/steps/add-or-update-environment-variables.js +15 -20
  194. package/dist/src/steps/add-or-update-environment-variables.js.map +1 -1
  195. package/dist/src/steps/index.d.ts +0 -1
  196. package/dist/src/steps/index.js +0 -1
  197. package/dist/src/steps/index.js.map +1 -1
  198. package/dist/src/steps/run-prettier.js +9 -11
  199. package/dist/src/steps/run-prettier.js.map +1 -1
  200. package/dist/src/steps/upload-environment-variables/EnvironmentProvider.d.ts +6 -3
  201. package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js.map +1 -1
  202. package/dist/src/steps/upload-environment-variables/index.d.ts +3 -3
  203. package/dist/src/steps/upload-environment-variables/index.js +7 -35
  204. package/dist/src/steps/upload-environment-variables/index.js.map +1 -1
  205. package/dist/src/steps/upload-environment-variables/providers/vercel.d.ts +3 -2
  206. package/dist/src/steps/upload-environment-variables/providers/vercel.js +2 -2
  207. package/dist/src/steps/upload-environment-variables/providers/vercel.js.map +1 -1
  208. package/dist/src/ui/index.d.ts +8 -0
  209. package/dist/src/ui/index.js +17 -0
  210. package/dist/src/ui/index.js.map +1 -0
  211. package/dist/src/ui/logging-ui.d.ts +44 -0
  212. package/dist/src/ui/logging-ui.js +103 -0
  213. package/dist/src/ui/logging-ui.js.map +1 -0
  214. package/dist/src/ui/tui/App.d.ts +6 -0
  215. package/dist/src/ui/tui/App.js +10 -0
  216. package/dist/src/ui/tui/App.js.map +1 -0
  217. package/dist/src/ui/tui/__tests__/layout-helpers.test.js +68 -0
  218. package/dist/src/ui/tui/__tests__/layout-helpers.test.js.map +1 -0
  219. package/dist/src/ui/tui/__tests__/store.test.d.ts +1 -0
  220. package/dist/src/ui/tui/__tests__/store.test.js +723 -0
  221. package/dist/src/ui/tui/__tests__/store.test.js.map +1 -0
  222. package/dist/src/ui/tui/components/LearnCard.d.ts +10 -0
  223. package/dist/src/ui/tui/components/LearnCard.js +217 -0
  224. package/dist/src/ui/tui/components/LearnCard.js.map +1 -0
  225. package/dist/src/ui/tui/components/TipsCard.d.ts +9 -0
  226. package/dist/src/ui/tui/components/TipsCard.js +55 -0
  227. package/dist/src/ui/tui/components/TipsCard.js.map +1 -0
  228. package/dist/src/ui/tui/components/TitleBar.d.ts +6 -0
  229. package/dist/src/ui/tui/components/TitleBar.js +17 -0
  230. package/dist/src/ui/tui/components/TitleBar.js.map +1 -0
  231. package/dist/src/ui/tui/flows.d.ts +38 -0
  232. package/dist/src/ui/tui/flows.js +82 -0
  233. package/dist/src/ui/tui/flows.js.map +1 -0
  234. package/dist/src/ui/tui/hooks/useStdoutDimensions.d.ts +9 -0
  235. package/dist/src/ui/tui/hooks/useStdoutDimensions.js +37 -0
  236. package/dist/src/ui/tui/hooks/useStdoutDimensions.js.map +1 -0
  237. package/dist/src/ui/tui/ink-ui.d.ts +50 -0
  238. package/dist/src/ui/tui/ink-ui.js +108 -0
  239. package/dist/src/ui/tui/ink-ui.js.map +1 -0
  240. package/dist/src/ui/tui/package.json +1 -0
  241. package/dist/src/ui/tui/playground/PlaygroundApp.d.ts +12 -0
  242. package/dist/src/ui/tui/playground/PlaygroundApp.js +32 -0
  243. package/dist/src/ui/tui/playground/PlaygroundApp.js.map +1 -0
  244. package/dist/src/ui/tui/playground/demos/InputDemo.d.ts +4 -0
  245. package/dist/src/ui/tui/playground/demos/InputDemo.js +53 -0
  246. package/dist/src/ui/tui/playground/demos/InputDemo.js.map +1 -0
  247. package/dist/src/ui/tui/playground/demos/LayoutDemo.d.ts +5 -0
  248. package/dist/src/ui/tui/playground/demos/LayoutDemo.js +25 -0
  249. package/dist/src/ui/tui/playground/demos/LayoutDemo.js.map +1 -0
  250. package/dist/src/ui/tui/playground/demos/LogDemo.d.ts +5 -0
  251. package/dist/src/ui/tui/playground/demos/LogDemo.js +53 -0
  252. package/dist/src/ui/tui/playground/demos/LogDemo.js.map +1 -0
  253. package/dist/src/ui/tui/playground/demos/ProgressDemo.d.ts +5 -0
  254. package/dist/src/ui/tui/playground/demos/ProgressDemo.js +58 -0
  255. package/dist/src/ui/tui/playground/demos/ProgressDemo.js.map +1 -0
  256. package/dist/src/ui/tui/playground/demos/RunScreenDemo.d.ts +11 -0
  257. package/dist/src/ui/tui/playground/demos/RunScreenDemo.js +159 -0
  258. package/dist/src/ui/tui/playground/demos/RunScreenDemo.js.map +1 -0
  259. package/dist/src/ui/tui/playground/demos/WelcomeDemo.d.ts +9 -0
  260. package/dist/src/ui/tui/playground/demos/WelcomeDemo.js +15 -0
  261. package/dist/src/ui/tui/playground/demos/WelcomeDemo.js.map +1 -0
  262. package/dist/src/ui/tui/playground/start-playground.d.ts +4 -0
  263. package/dist/src/ui/tui/playground/start-playground.js +24 -0
  264. package/dist/src/ui/tui/playground/start-playground.js.map +1 -0
  265. package/dist/src/ui/tui/primitives/CardLayout.d.ts +12 -0
  266. package/dist/src/ui/tui/primitives/CardLayout.js +10 -0
  267. package/dist/src/ui/tui/primitives/CardLayout.js.map +1 -0
  268. package/dist/src/ui/tui/primitives/ConfirmationInput.d.ts +13 -0
  269. package/dist/src/ui/tui/primitives/ConfirmationInput.js +35 -0
  270. package/dist/src/ui/tui/primitives/ConfirmationInput.js.map +1 -0
  271. package/dist/src/ui/tui/primitives/ContentSequencer.d.ts +42 -0
  272. package/dist/src/ui/tui/primitives/ContentSequencer.js +137 -0
  273. package/dist/src/ui/tui/primitives/ContentSequencer.js.map +1 -0
  274. package/dist/src/ui/tui/primitives/DissolveTransition.d.ts +21 -0
  275. package/dist/src/ui/tui/primitives/DissolveTransition.js +149 -0
  276. package/dist/src/ui/tui/primitives/DissolveTransition.js.map +1 -0
  277. package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +9 -0
  278. package/dist/src/ui/tui/primitives/EventPlanViewer.js +9 -0
  279. package/dist/src/ui/tui/primitives/EventPlanViewer.js.map +1 -0
  280. package/dist/src/ui/tui/primitives/HNViewer.d.ts +7 -0
  281. package/dist/src/ui/tui/primitives/HNViewer.js +63 -0
  282. package/dist/src/ui/tui/primitives/HNViewer.js.map +1 -0
  283. package/dist/src/ui/tui/primitives/LinesBlock.d.ts +16 -0
  284. package/dist/src/ui/tui/primitives/LinesBlock.js +37 -0
  285. package/dist/src/ui/tui/primitives/LinesBlock.js.map +1 -0
  286. package/dist/src/ui/tui/primitives/LoadingBox.d.ts +8 -0
  287. package/dist/src/ui/tui/primitives/LoadingBox.js +10 -0
  288. package/dist/src/ui/tui/primitives/LoadingBox.js.map +1 -0
  289. package/dist/src/ui/tui/primitives/LogViewer.d.ts +11 -0
  290. package/dist/src/ui/tui/primitives/LogViewer.js +55 -0
  291. package/dist/src/ui/tui/primitives/LogViewer.js.map +1 -0
  292. package/dist/src/ui/tui/primitives/NodeBlock.d.ts +13 -0
  293. package/dist/src/ui/tui/primitives/NodeBlock.js +17 -0
  294. package/dist/src/ui/tui/primitives/NodeBlock.js.map +1 -0
  295. package/dist/src/ui/tui/primitives/PickerMenu.d.ts +20 -0
  296. package/dist/src/ui/tui/primitives/PickerMenu.js +134 -0
  297. package/dist/src/ui/tui/primitives/PickerMenu.js.map +1 -0
  298. package/dist/src/ui/tui/primitives/ProgressList.d.ts +15 -0
  299. package/dist/src/ui/tui/primitives/ProgressList.js +30 -0
  300. package/dist/src/ui/tui/primitives/ProgressList.js.map +1 -0
  301. package/dist/src/ui/tui/primitives/PromptLabel.d.ts +11 -0
  302. package/dist/src/ui/tui/primitives/PromptLabel.js +13 -0
  303. package/dist/src/ui/tui/primitives/PromptLabel.js.map +1 -0
  304. package/dist/src/ui/tui/primitives/ScreenContainer.d.ts +16 -0
  305. package/dist/src/ui/tui/primitives/ScreenContainer.js +36 -0
  306. package/dist/src/ui/tui/primitives/ScreenContainer.js.map +1 -0
  307. package/dist/src/ui/tui/primitives/ScreenErrorBoundary.d.ts +22 -0
  308. package/dist/src/ui/tui/primitives/ScreenErrorBoundary.js +35 -0
  309. package/dist/src/ui/tui/primitives/ScreenErrorBoundary.js.map +1 -0
  310. package/dist/src/ui/tui/primitives/SplitView.d.ts +11 -0
  311. package/dist/src/ui/tui/primitives/SplitView.js +9 -0
  312. package/dist/src/ui/tui/primitives/SplitView.js.map +1 -0
  313. package/dist/src/ui/tui/primitives/TabContainer.d.ts +23 -0
  314. package/dist/src/ui/tui/primitives/TabContainer.js +45 -0
  315. package/dist/src/ui/tui/primitives/TabContainer.js.map +1 -0
  316. package/dist/src/ui/tui/primitives/TextBlock.d.ts +41 -0
  317. package/dist/src/ui/tui/primitives/TextBlock.js +144 -0
  318. package/dist/src/ui/tui/primitives/TextBlock.js.map +1 -0
  319. package/dist/src/ui/tui/primitives/content-types.d.ts +37 -0
  320. package/dist/src/ui/tui/primitives/content-types.js +19 -0
  321. package/dist/src/ui/tui/primitives/content-types.js.map +1 -0
  322. package/dist/src/ui/tui/primitives/index.d.ts +24 -0
  323. package/dist/src/ui/tui/primitives/index.js +21 -0
  324. package/dist/src/ui/tui/primitives/index.js.map +1 -0
  325. package/dist/src/ui/tui/primitives/layout-helpers.d.ts +36 -0
  326. package/dist/src/ui/tui/primitives/layout-helpers.js +95 -0
  327. package/dist/src/ui/tui/primitives/layout-helpers.js.map +1 -0
  328. package/dist/src/ui/tui/primitives/text-helpers.d.ts +10 -0
  329. package/dist/src/ui/tui/primitives/text-helpers.js +43 -0
  330. package/dist/src/ui/tui/primitives/text-helpers.js.map +1 -0
  331. package/dist/src/ui/tui/router.d.ts +56 -0
  332. package/dist/src/ui/tui/router.js +94 -0
  333. package/dist/src/ui/tui/router.js.map +1 -0
  334. package/dist/src/ui/tui/screen-registry.d.ts +19 -0
  335. package/dist/src/ui/tui/screen-registry.js +34 -0
  336. package/dist/src/ui/tui/screen-registry.js.map +1 -0
  337. package/dist/src/ui/tui/screens/AuthScreen.d.ts +13 -0
  338. package/dist/src/ui/tui/screens/AuthScreen.js +20 -0
  339. package/dist/src/ui/tui/screens/AuthScreen.js.map +1 -0
  340. package/dist/src/ui/tui/screens/IntroScreen.d.ts +16 -0
  341. package/dist/src/ui/tui/screens/IntroScreen.js +63 -0
  342. package/dist/src/ui/tui/screens/IntroScreen.js.map +1 -0
  343. package/dist/src/ui/tui/screens/McpScreen.d.ts +24 -0
  344. package/dist/src/ui/tui/screens/McpScreen.js +112 -0
  345. package/dist/src/ui/tui/screens/McpScreen.js.map +1 -0
  346. package/dist/src/ui/tui/screens/OutageScreen.d.ts +10 -0
  347. package/dist/src/ui/tui/screens/OutageScreen.js +17 -0
  348. package/dist/src/ui/tui/screens/OutageScreen.js.map +1 -0
  349. package/dist/src/ui/tui/screens/OutroScreen.d.ts +11 -0
  350. package/dist/src/ui/tui/screens/OutroScreen.js +22 -0
  351. package/dist/src/ui/tui/screens/OutroScreen.js.map +1 -0
  352. package/dist/src/ui/tui/screens/RunScreen.d.ts +16 -0
  353. package/dist/src/ui/tui/screens/RunScreen.js +73 -0
  354. package/dist/src/ui/tui/screens/RunScreen.js.map +1 -0
  355. package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +10 -0
  356. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +24 -0
  357. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js.map +1 -0
  358. package/dist/src/ui/tui/screens/SetupScreen.d.ts +13 -0
  359. package/dist/src/ui/tui/screens/SetupScreen.js +74 -0
  360. package/dist/src/ui/tui/screens/SetupScreen.js.map +1 -0
  361. package/dist/src/ui/tui/services/mcp-installer.d.ts +21 -0
  362. package/dist/src/ui/tui/services/mcp-installer.js +58 -0
  363. package/dist/src/ui/tui/services/mcp-installer.js.map +1 -0
  364. package/dist/src/ui/tui/start-tui.d.ts +9 -0
  365. package/dist/src/ui/tui/start-tui.js +41 -0
  366. package/dist/src/ui/tui/start-tui.js.map +1 -0
  367. package/dist/src/ui/tui/store.d.ts +132 -0
  368. package/dist/src/ui/tui/store.js +320 -0
  369. package/dist/src/ui/tui/store.js.map +1 -0
  370. package/dist/src/ui/tui/styles.d.ts +31 -0
  371. package/dist/src/ui/tui/styles.js +34 -0
  372. package/dist/src/ui/tui/styles.js.map +1 -0
  373. package/dist/src/ui/wizard-ui.d.ts +64 -0
  374. package/dist/src/ui/wizard-ui.js +19 -0
  375. package/dist/src/ui/wizard-ui.js.map +1 -0
  376. package/dist/src/utils/__tests__/setup-utils.test.d.ts +1 -0
  377. package/dist/src/utils/__tests__/{clack-utils.test.js → setup-utils.test.js} +31 -22
  378. package/dist/src/utils/__tests__/setup-utils.test.js.map +1 -0
  379. package/dist/src/utils/analytics.d.ts +18 -0
  380. package/dist/src/utils/analytics.js +53 -0
  381. package/dist/src/utils/analytics.js.map +1 -1
  382. package/dist/src/utils/anthropic-status.d.ts +1 -12
  383. package/dist/src/utils/anthropic-status.js +4 -56
  384. package/dist/src/utils/anthropic-status.js.map +1 -1
  385. package/dist/src/utils/custom-headers.d.ts +9 -0
  386. package/dist/src/utils/custom-headers.js +24 -0
  387. package/dist/src/utils/custom-headers.js.map +1 -0
  388. package/dist/src/utils/debug.js +2 -2
  389. package/dist/src/utils/debug.js.map +1 -1
  390. package/dist/src/utils/environment.js +4 -2
  391. package/dist/src/utils/environment.js.map +1 -1
  392. package/dist/src/utils/oauth.js +9 -10
  393. package/dist/src/utils/oauth.js.map +1 -1
  394. package/dist/src/utils/package-manager.js +13 -13
  395. package/dist/src/utils/package-manager.js.map +1 -1
  396. package/dist/src/utils/setup-utils.d.ts +76 -0
  397. package/dist/src/utils/setup-utils.js +364 -0
  398. package/dist/src/utils/setup-utils.js.map +1 -0
  399. package/dist/src/utils/wizard-abort.d.ts +13 -0
  400. package/dist/src/utils/wizard-abort.js +57 -0
  401. package/dist/src/utils/wizard-abort.js.map +1 -0
  402. package/package.json +19 -7
  403. package/dist/src/android/android-wizard-agent.js.map +0 -1
  404. package/dist/src/android/utils.js.map +0 -1
  405. package/dist/src/angular/angular-wizard-agent.js.map +0 -1
  406. package/dist/src/angular/utils.js.map +0 -1
  407. package/dist/src/astro/astro-wizard-agent.js.map +0 -1
  408. package/dist/src/astro/utils.js.map +0 -1
  409. package/dist/src/django/django-wizard-agent.js.map +0 -1
  410. package/dist/src/django/utils.js.map +0 -1
  411. package/dist/src/fastapi/fastapi-wizard-agent.d.ts +0 -7
  412. package/dist/src/fastapi/fastapi-wizard-agent.js.map +0 -1
  413. package/dist/src/fastapi/utils.js.map +0 -1
  414. package/dist/src/flask/flask-wizard-agent.js.map +0 -1
  415. package/dist/src/flask/utils.js.map +0 -1
  416. package/dist/src/javascript-node/javascript-node-wizard-agent.js.map +0 -1
  417. package/dist/src/javascript-web/javascript-web-wizard-agent.js.map +0 -1
  418. package/dist/src/javascript-web/utils.js.map +0 -1
  419. package/dist/src/laravel/laravel-wizard-agent.js.map +0 -1
  420. package/dist/src/laravel/utils.js.map +0 -1
  421. package/dist/src/mcp.d.ts +0 -8
  422. package/dist/src/mcp.js +0 -44
  423. package/dist/src/mcp.js.map +0 -1
  424. package/dist/src/nextjs/nextjs-wizard-agent.js.map +0 -1
  425. package/dist/src/nextjs/utils.js.map +0 -1
  426. package/dist/src/nuxt/nuxt-wizard-agent.js.map +0 -1
  427. package/dist/src/python/python-wizard-agent.js.map +0 -1
  428. package/dist/src/python/utils.js.map +0 -1
  429. package/dist/src/rails/rails-wizard-agent.js.map +0 -1
  430. package/dist/src/rails/utils.js.map +0 -1
  431. package/dist/src/react-native/react-native-wizard-agent.js.map +0 -1
  432. package/dist/src/react-native/utils.js.map +0 -1
  433. package/dist/src/react-router/react-router-wizard-agent.js.map +0 -1
  434. package/dist/src/react-router/utils.d.ts +0 -19
  435. package/dist/src/react-router/utils.js.map +0 -1
  436. package/dist/src/ruby/ruby-wizard-agent.js.map +0 -1
  437. package/dist/src/ruby/utils.js.map +0 -1
  438. package/dist/src/steps/__tests__/add-editor-rules.test.js +0 -208
  439. package/dist/src/steps/__tests__/add-editor-rules.test.js.map +0 -1
  440. package/dist/src/steps/add-editor-rules.d.ts +0 -8
  441. package/dist/src/steps/add-editor-rules.js +0 -71
  442. package/dist/src/steps/add-editor-rules.js.map +0 -1
  443. package/dist/src/svelte/svelte-wizard-agent.js.map +0 -1
  444. package/dist/src/swift/swift-wizard-agent.js.map +0 -1
  445. package/dist/src/swift/utils.js.map +0 -1
  446. package/dist/src/tanstack-router/tanstack-router-wizard-agent.js.map +0 -1
  447. package/dist/src/tanstack-router/utils.d.ts +0 -17
  448. package/dist/src/tanstack-router/utils.js.map +0 -1
  449. package/dist/src/tanstack-start/tanstack-start-wizard-agent.js.map +0 -1
  450. package/dist/src/tanstack-start/utils.js.map +0 -1
  451. package/dist/src/utils/__tests__/clack-utils.test.js.map +0 -1
  452. package/dist/src/utils/clack-utils.d.ts +0 -188
  453. package/dist/src/utils/clack-utils.js +0 -705
  454. package/dist/src/utils/clack-utils.js.map +0 -1
  455. package/dist/src/utils/clack.d.ts +0 -2
  456. package/dist/src/utils/clack.js +0 -9
  457. package/dist/src/utils/clack.js.map +0 -1
  458. package/dist/src/vue/vue-wizard-agent.js.map +0 -1
  459. /package/dist/src/{steps/__tests__/add-editor-rules.test.d.ts → __tests__/wizard-abort.test.d.ts} +0 -0
  460. /package/dist/src/{angular → frameworks/angular}/utils.d.ts +0 -0
  461. /package/dist/src/{python → frameworks/python}/utils.js +0 -0
  462. /package/dist/src/{swift → frameworks/swift}/utils.js +0 -0
  463. /package/dist/src/{tanstack-start → frameworks/tanstack-start}/utils.d.ts +0 -0
  464. /package/dist/src/{utils/__tests__/clack-utils.test.d.ts → ui/tui/__tests__/layout-helpers.test.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-checks.test.js","sourceRoot":"","sources":["../../../../../src/lib/health-checks/__tests__/health-checks.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tests for health-checks.ts\n *\n * Mock data is modelled on live Statuspage.io v2 API responses.\n * Statuspage docs: https://metastatuspage.com/api\n *\n * status.json – page-level rollup with indicator (none | minor | major | critical)\n * summary.json – same rollup plus component list; component statuses:\n * operational | degraded_performance | partial_outage | major_outage | under_maintenance\n * https://support.atlassian.com/statuspage/docs/show-service-status-with-components\n *\n * LLM Gateway – FastAPI service, GET /_liveness returns {\"status\":\"alive\"} (200)\n * Source: posthog/services/llm-gateway/src/llm_gateway/api/health.py\n *\n * MCP – Cloudflare Worker, GET / returns an HTML landing page (200)\n * Source: posthog/services/mcp/src/index.ts\n */\n\nimport {\n checkAllExternalServices,\n checkAnthropicHealth,\n checkCloudflareComponentHealth,\n checkCloudflareOverallHealth,\n checkGithubHealth,\n checkLlmGatewayHealth,\n checkMcpHealth,\n checkNpmComponentHealth,\n checkNpmOverallHealth,\n checkPosthogComponentHealth,\n checkPosthogOverallHealth,\n DEFAULT_WIZARD_READINESS_CONFIG,\n evaluateWizardReadiness,\n ServiceHealthStatus,\n WizardReadiness,\n} from '../index';\n\n// ---------------------------------------------------------------------------\n// Real-world Statuspage.io v2 response factories\n// https://metastatuspage.com/api\n// ---------------------------------------------------------------------------\n\nfunction makeStatuspageStatus(opts: {\n pageId: string;\n pageName: string;\n pageUrl: string;\n indicator: 'none' | 'minor' | 'major' | 'critical';\n description: string;\n}) {\n return {\n page: {\n id: opts.pageId,\n name: opts.pageName,\n url: opts.pageUrl,\n time_zone: 'Etc/UTC',\n updated_at: '2026-03-05T16:03:38.861Z',\n },\n status: {\n indicator: opts.indicator,\n description: opts.description,\n },\n };\n}\n\nfunction makeStatuspageSummary(opts: {\n pageId: string;\n pageName: string;\n pageUrl: string;\n indicator: 'none' | 'minor' | 'major' | 'critical';\n description: string;\n components: {\n id: string;\n name: string;\n status: string;\n position: number;\n description: string | null;\n }[];\n}) {\n return {\n page: {\n id: opts.pageId,\n name: opts.pageName,\n url: opts.pageUrl,\n time_zone: 'Etc/UTC',\n updated_at: '2026-03-05T16:03:38.861Z',\n },\n status: {\n indicator: opts.indicator,\n description: opts.description,\n },\n components: opts.components.map((c) => ({\n ...c,\n page_id: opts.pageId,\n created_at: '2023-07-11T17:52:24.275Z',\n updated_at: '2026-03-04T17:01:29.960Z',\n showcase: true,\n start_date: '2023-07-11',\n group_id: null,\n group: false,\n only_show_if_degraded: false,\n })),\n incidents: [],\n scheduled_maintenances: [],\n };\n}\n\n// Shapes taken from live GET on 2026-03-05\nconst ANTHROPIC_STATUS_HEALTHY = makeStatuspageStatus({\n pageId: 'tymt9n04zgry',\n pageName: 'Claude',\n pageUrl: 'https://status.claude.com',\n indicator: 'none',\n description: 'All Systems Operational',\n});\n\nconst GITHUB_STATUS_HEALTHY = makeStatuspageStatus({\n pageId: 'kctbh9vrtdwd',\n pageName: 'GitHub',\n pageUrl: 'https://www.githubstatus.com',\n indicator: 'none',\n description: 'All Systems Operational',\n});\n\nconst NPM_STATUS_HEALTHY = makeStatuspageStatus({\n pageId: 'wyvgptkd90hm',\n pageName: 'npm',\n pageUrl: 'https://status.npmjs.org',\n indicator: 'none',\n description: 'All Systems Operational',\n});\n\nconst NPM_SUMMARY_HEALTHY = makeStatuspageSummary({\n pageId: 'wyvgptkd90hm',\n pageName: 'npm',\n pageUrl: 'https://status.npmjs.org',\n indicator: 'none',\n description: 'All Systems Operational',\n components: [\n {\n id: 'mvm98gtxvb9b',\n name: 'www.npmjs.com website',\n status: 'operational',\n position: 1,\n description:\n 'The ability for users to navigate to or interact with the npm website.',\n },\n {\n id: 'k1wj10x6gmph',\n name: 'Package installation',\n status: 'operational',\n position: 2,\n description:\n 'The ability for users to read from the registry so that they can install packages.',\n },\n ],\n});\n\nconst CLOUDFLARE_STATUS_HEALTHY = makeStatuspageStatus({\n pageId: 'yh6f0r4529hb',\n pageName: 'Cloudflare',\n pageUrl: 'https://www.cloudflarestatus.com',\n indicator: 'none',\n description: 'All Systems Operational',\n});\n\nconst CLOUDFLARE_SUMMARY_HEALTHY = makeStatuspageSummary({\n pageId: 'yh6f0r4529hb',\n pageName: 'Cloudflare',\n pageUrl: 'https://www.cloudflarestatus.com',\n indicator: 'none',\n description: 'All Systems Operational',\n components: [\n {\n id: '1km35smx8p41',\n name: 'Cloudflare Sites and Services',\n status: 'operational',\n position: 1,\n description:\n 'Sites and services that Cloudflare customers use to interact with the Cloudflare Network',\n },\n ],\n});\n\nconst POSTHOG_STATUS_HEALTHY = makeStatuspageStatus({\n pageId: 'qf5jlnph3bcy',\n pageName: 'PostHog',\n pageUrl: 'https://status.posthog.com',\n indicator: 'none',\n description: 'All Systems Operational',\n});\n\nconst POSTHOG_SUMMARY_HEALTHY = makeStatuspageSummary({\n pageId: 'qf5jlnph3bcy',\n pageName: 'PostHog',\n pageUrl: 'https://status.posthog.com',\n indicator: 'none',\n description: 'All Systems Operational',\n components: [\n {\n id: 'us-cloud',\n name: 'US Cloud',\n status: 'operational',\n position: 1,\n description: null,\n },\n {\n id: 'eu-cloud',\n name: 'EU Cloud',\n status: 'operational',\n position: 2,\n description: null,\n },\n {\n id: 'posthog-com',\n name: 'PostHog.com',\n status: 'operational',\n position: 3,\n description: null,\n },\n ],\n});\n\n// LLM Gateway /_liveness response (from posthog/services/llm-gateway/src/llm_gateway/api/health.py)\nconst LLM_GATEWAY_LIVENESS_BODY = JSON.stringify({ status: 'alive' });\n\n// MCP / landing page (from posthog/services/mcp/src/index.ts + src/static/landing.html)\nconst MCP_LANDING_HTML =\n '<!doctype html><html lang=\"en\"><head><title>PostHog MCP Server</title></head><body></body></html>';\n\n// ---------------------------------------------------------------------------\n// URL constants (must match health-checks.ts)\n// ---------------------------------------------------------------------------\n\nconst URLS = {\n anthropicStatus: 'https://status.claude.com/api/v2/status.json',\n posthogStatus: 'https://www.posthogstatus.com/api/v2/status.json',\n posthogSummary: 'https://www.posthogstatus.com/api/v2/summary.json',\n githubStatus: 'https://www.githubstatus.com/api/v2/status.json',\n npmStatus: 'https://status.npmjs.org/api/v2/status.json',\n npmSummary: 'https://status.npmjs.org/api/v2/summary.json',\n cloudflareStatus: 'https://www.cloudflarestatus.com/api/v2/status.json',\n cloudflareSummary: 'https://www.cloudflarestatus.com/api/v2/summary.json',\n llmGatewayLiveness: 'https://gateway.us.posthog.com/_liveness',\n mcpLanding: 'https://mcp.posthog.com/',\n} as const;\n\n// ---------------------------------------------------------------------------\n// Helper to build a default \"all healthy\" fetch mock\n// ---------------------------------------------------------------------------\n\nconst HEALTHY_RESPONSES: Record<string, { body: string; contentType: string }> =\n {\n [URLS.anthropicStatus]: {\n body: JSON.stringify(ANTHROPIC_STATUS_HEALTHY),\n contentType: 'application/json',\n },\n [URLS.posthogStatus]: {\n body: JSON.stringify(POSTHOG_STATUS_HEALTHY),\n contentType: 'application/json',\n },\n [URLS.posthogSummary]: {\n body: JSON.stringify(POSTHOG_SUMMARY_HEALTHY),\n contentType: 'application/json',\n },\n [URLS.githubStatus]: {\n body: JSON.stringify(GITHUB_STATUS_HEALTHY),\n contentType: 'application/json',\n },\n [URLS.npmStatus]: {\n body: JSON.stringify(NPM_STATUS_HEALTHY),\n contentType: 'application/json',\n },\n [URLS.npmSummary]: {\n body: JSON.stringify(NPM_SUMMARY_HEALTHY),\n contentType: 'application/json',\n },\n [URLS.cloudflareStatus]: {\n body: JSON.stringify(CLOUDFLARE_STATUS_HEALTHY),\n contentType: 'application/json',\n },\n [URLS.cloudflareSummary]: {\n body: JSON.stringify(CLOUDFLARE_SUMMARY_HEALTHY),\n contentType: 'application/json',\n },\n [URLS.llmGatewayLiveness]: {\n body: LLM_GATEWAY_LIVENESS_BODY,\n contentType: 'application/json',\n },\n [URLS.mcpLanding]: {\n body: MCP_LANDING_HTML,\n contentType: 'text/html; charset=utf-8',\n },\n };\n\nfunction allHealthyFetchMock(url: string | URL | Request): Promise<Response> {\n const urlStr =\n typeof url === 'string'\n ? url\n : url instanceof URL\n ? url.toString()\n : url.url;\n const entry = HEALTHY_RESPONSES[urlStr];\n if (entry) {\n return Promise.resolve(\n new Response(entry.body, {\n status: 200,\n headers: { 'Content-Type': entry.contentType },\n }),\n );\n }\n return Promise.resolve(new Response('Not found', { status: 404 }));\n}\n\nfunction overrideFetch(overrides: Record<string, () => Promise<Response>>) {\n return (url: string | URL | Request): Promise<Response> => {\n const urlStr =\n typeof url === 'string'\n ? url\n : url instanceof URL\n ? url.toString()\n : url.url;\n if (overrides[urlStr]) return overrides[urlStr]();\n return allHealthyFetchMock(urlStr);\n };\n}\n\n// ---------------------------------------------------------------------------\n// Tests\n// ---------------------------------------------------------------------------\n\ndescribe('health-checks', () => {\n const originalFetch = global.fetch;\n\n beforeEach(() => {\n jest.restoreAllMocks();\n (global as any).fetch = jest.fn(allHealthyFetchMock);\n });\n\n afterAll(() => {\n (global as any).fetch = originalFetch;\n });\n\n // -----------------------------------------------------------------------\n // Statuspage status.json checks (indicator-based)\n // -----------------------------------------------------------------------\n\n describe('checkAnthropicHealth', () => {\n it('returns healthy for indicator=none (\"All Systems Operational\")', async () => {\n const result = await checkAnthropicHealth();\n expect(result.status).toBe(ServiceHealthStatus.Healthy);\n expect(result.rawIndicator).toBe('none');\n });\n\n it('returns degraded for indicator=minor (\"Minor Service Outage\")', async () => {\n const body = makeStatuspageStatus({\n pageId: 'tymt9n04zgry',\n pageName: 'Claude',\n pageUrl: 'https://status.claude.com',\n indicator: 'minor',\n description: 'Minor Service Outage',\n });\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.anthropicStatus]: () =>\n Promise.resolve(\n new Response(JSON.stringify(body), { status: 200 }),\n ),\n }),\n );\n const result = await checkAnthropicHealth();\n expect(result.status).toBe(ServiceHealthStatus.Degraded);\n expect(result.rawIndicator).toBe('minor');\n });\n\n it('returns down for indicator=major (\"Partial System Outage\")', async () => {\n const body = makeStatuspageStatus({\n pageId: 'tymt9n04zgry',\n pageName: 'Claude',\n pageUrl: 'https://status.claude.com',\n indicator: 'major',\n description: 'Partial System Outage',\n });\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.anthropicStatus]: () =>\n Promise.resolve(\n new Response(JSON.stringify(body), { status: 200 }),\n ),\n }),\n );\n const result = await checkAnthropicHealth();\n expect(result.status).toBe(ServiceHealthStatus.Down);\n });\n\n it('returns down for indicator=critical (\"Major Service Outage\")', async () => {\n const body = makeStatuspageStatus({\n pageId: 'tymt9n04zgry',\n pageName: 'Claude',\n pageUrl: 'https://status.claude.com',\n indicator: 'critical',\n description: 'Major Service Outage',\n });\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.anthropicStatus]: () =>\n Promise.resolve(\n new Response(JSON.stringify(body), { status: 200 }),\n ),\n }),\n );\n const result = await checkAnthropicHealth();\n expect(result.status).toBe(ServiceHealthStatus.Down);\n });\n\n it('returns degraded when statuspage returns HTTP 500', async () => {\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.anthropicStatus]: () =>\n Promise.resolve(\n new Response('Internal Server Error', { status: 500 }),\n ),\n }),\n );\n const result = await checkAnthropicHealth();\n expect(result.status).toBe(ServiceHealthStatus.Degraded);\n expect(result.error).toBe('HTTP 500');\n });\n\n it('returns degraded when fetch throws (network failure)', async () => {\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.anthropicStatus]: () =>\n Promise.reject(\n new Error('getaddrinfo ENOTFOUND status.claude.com'),\n ),\n }),\n );\n const result = await checkAnthropicHealth();\n expect(result.status).toBe(ServiceHealthStatus.Degraded);\n expect(result.error).toBe('getaddrinfo ENOTFOUND status.claude.com');\n });\n });\n\n describe('checkPosthogOverallHealth', () => {\n it('returns healthy for indicator=none', async () => {\n const result = await checkPosthogOverallHealth();\n expect(result.status).toBe(ServiceHealthStatus.Healthy);\n expect(result.rawIndicator).toBe('none');\n });\n });\n\n describe('checkGithubHealth', () => {\n it('returns healthy for indicator=none', async () => {\n const result = await checkGithubHealth();\n expect(result.status).toBe(ServiceHealthStatus.Healthy);\n });\n });\n\n describe('checkNpmOverallHealth', () => {\n it('returns healthy for indicator=none', async () => {\n const result = await checkNpmOverallHealth();\n expect(result.status).toBe(ServiceHealthStatus.Healthy);\n });\n });\n\n describe('checkCloudflareOverallHealth', () => {\n it('returns healthy for indicator=none', async () => {\n const result = await checkCloudflareOverallHealth();\n expect(result.status).toBe(ServiceHealthStatus.Healthy);\n });\n\n it('returns degraded for indicator=minor', async () => {\n const body = makeStatuspageStatus({\n pageId: 'yh6f0r4529hb',\n pageName: 'Cloudflare',\n pageUrl: 'https://www.cloudflarestatus.com',\n indicator: 'minor',\n description: 'Minor Service Outage',\n });\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.cloudflareStatus]: () =>\n Promise.resolve(\n new Response(JSON.stringify(body), { status: 200 }),\n ),\n }),\n );\n const result = await checkCloudflareOverallHealth();\n expect(result.status).toBe(ServiceHealthStatus.Degraded);\n });\n });\n\n // -----------------------------------------------------------------------\n // Statuspage summary.json checks (component-based)\n // -----------------------------------------------------------------------\n\n describe('checkPosthogComponentHealth', () => {\n it('reports all operational when every component is operational', async () => {\n const result = await checkPosthogComponentHealth();\n expect(result.status).toBe(ServiceHealthStatus.Healthy);\n expect(result.degradedOrDownComponents).toBeUndefined();\n });\n\n it('reports degraded when a component has partial_outage', async () => {\n const body = makeStatuspageSummary({\n pageId: 'qf5jlnph3bcy',\n pageName: 'PostHog',\n pageUrl: 'https://status.posthog.com',\n indicator: 'major',\n description: 'Partial System Outage',\n components: [\n {\n id: 'us-cloud',\n name: 'US Cloud',\n status: 'partial_outage',\n position: 1,\n description: null,\n },\n {\n id: 'eu-cloud',\n name: 'EU Cloud',\n status: 'operational',\n position: 2,\n description: null,\n },\n ],\n });\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.posthogSummary]: () =>\n Promise.resolve(\n new Response(JSON.stringify(body), { status: 200 }),\n ),\n }),\n );\n const result = await checkPosthogComponentHealth();\n expect(result.status).toBe(ServiceHealthStatus.Degraded);\n expect(result.degradedOrDownComponents).toHaveLength(1);\n expect(result.degradedOrDownComponents![0].name).toBe('US Cloud');\n expect(result.degradedOrDownComponents![0].rawStatus).toBe(\n 'partial_outage',\n );\n expect(result.degradedOrDownComponents![0].status).toBe(\n ServiceHealthStatus.Down,\n );\n });\n\n it('reports degraded when a component has degraded_performance', async () => {\n const body = makeStatuspageSummary({\n pageId: 'qf5jlnph3bcy',\n pageName: 'PostHog',\n pageUrl: 'https://status.posthog.com',\n indicator: 'minor',\n description: 'Degraded System Performance',\n components: [\n {\n id: 'us-cloud',\n name: 'US Cloud',\n status: 'degraded_performance',\n position: 1,\n description: null,\n },\n {\n id: 'eu-cloud',\n name: 'EU Cloud',\n status: 'operational',\n position: 2,\n description: null,\n },\n ],\n });\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.posthogSummary]: () =>\n Promise.resolve(\n new Response(JSON.stringify(body), { status: 200 }),\n ),\n }),\n );\n const result = await checkPosthogComponentHealth();\n expect(result.status).toBe(ServiceHealthStatus.Degraded);\n expect(result.degradedOrDownComponents![0].rawStatus).toBe(\n 'degraded_performance',\n );\n expect(result.degradedOrDownComponents![0].status).toBe(\n ServiceHealthStatus.Degraded,\n );\n });\n\n it('reports degraded when a component has major_outage', async () => {\n const body = makeStatuspageSummary({\n pageId: 'qf5jlnph3bcy',\n pageName: 'PostHog',\n pageUrl: 'https://status.posthog.com',\n indicator: 'critical',\n description: 'Major Service Outage',\n components: [\n {\n id: 'us-cloud',\n name: 'US Cloud',\n status: 'major_outage',\n position: 1,\n description: null,\n },\n {\n id: 'eu-cloud',\n name: 'EU Cloud',\n status: 'major_outage',\n position: 2,\n description: null,\n },\n ],\n });\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.posthogSummary]: () =>\n Promise.resolve(\n new Response(JSON.stringify(body), { status: 200 }),\n ),\n }),\n );\n const result = await checkPosthogComponentHealth();\n expect(result.status).toBe(ServiceHealthStatus.Degraded);\n expect(result.degradedOrDownComponents).toHaveLength(2);\n expect(result.degradedOrDownComponents![0].status).toBe(\n ServiceHealthStatus.Down,\n );\n });\n\n it('handles under_maintenance as degraded', async () => {\n const body = makeStatuspageSummary({\n pageId: 'qf5jlnph3bcy',\n pageName: 'PostHog',\n pageUrl: 'https://status.posthog.com',\n indicator: 'minor',\n description: 'Scheduled Maintenance',\n components: [\n {\n id: 'us-cloud',\n name: 'US Cloud',\n status: 'under_maintenance',\n position: 1,\n description: null,\n },\n ],\n });\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.posthogSummary]: () =>\n Promise.resolve(\n new Response(JSON.stringify(body), { status: 200 }),\n ),\n }),\n );\n const result = await checkPosthogComponentHealth();\n expect(result.status).toBe(ServiceHealthStatus.Degraded);\n expect(result.degradedOrDownComponents![0].status).toBe(\n ServiceHealthStatus.Degraded,\n );\n });\n });\n\n describe('checkNpmComponentHealth', () => {\n it('reports healthy when all npm components operational', async () => {\n const result = await checkNpmComponentHealth();\n expect(result.status).toBe(ServiceHealthStatus.Healthy);\n });\n\n it('reports degraded when \"Package installation\" has partial_outage', async () => {\n const body = makeStatuspageSummary({\n pageId: 'wyvgptkd90hm',\n pageName: 'npm',\n pageUrl: 'https://status.npmjs.org',\n indicator: 'major',\n description: 'Partial System Outage',\n components: [\n {\n id: 'mvm98gtxvb9b',\n name: 'www.npmjs.com website',\n status: 'operational',\n position: 1,\n description: null,\n },\n {\n id: 'k1wj10x6gmph',\n name: 'Package installation',\n status: 'partial_outage',\n position: 2,\n description: null,\n },\n ],\n });\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.npmSummary]: () =>\n Promise.resolve(\n new Response(JSON.stringify(body), { status: 200 }),\n ),\n }),\n );\n const result = await checkNpmComponentHealth();\n expect(result.status).toBe(ServiceHealthStatus.Degraded);\n expect(result.degradedOrDownComponents![0].name).toBe(\n 'Package installation',\n );\n });\n });\n\n describe('checkCloudflareComponentHealth', () => {\n it('reports healthy when Cloudflare components operational', async () => {\n const result = await checkCloudflareComponentHealth();\n expect(result.status).toBe(ServiceHealthStatus.Healthy);\n });\n });\n\n // -----------------------------------------------------------------------\n // LLM Gateway (fetchEndpointHealth – /_liveness)\n // -----------------------------------------------------------------------\n\n describe('checkLlmGatewayHealth', () => {\n it('returns healthy when gateway responds 200 with {\"status\":\"alive\"}', async () => {\n const result = await checkLlmGatewayHealth();\n expect(result.status).toBe(ServiceHealthStatus.Healthy);\n expect(result.rawIndicator).toBe('HTTP 200');\n expect(global.fetch).toHaveBeenCalledWith(\n URLS.llmGatewayLiveness,\n expect.objectContaining({ signal: expect.any(AbortSignal) }),\n );\n });\n\n it('returns down when gateway responds 503 (e.g. deploying)', async () => {\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.llmGatewayLiveness]: () =>\n Promise.resolve(\n new Response('Service Unavailable', { status: 503 }),\n ),\n }),\n );\n const result = await checkLlmGatewayHealth();\n expect(result.status).toBe(ServiceHealthStatus.Down);\n expect(result.error).toBe('HTTP 503');\n });\n\n it('returns down when gateway responds 502 (bad gateway)', async () => {\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.llmGatewayLiveness]: () =>\n Promise.resolve(new Response('Bad Gateway', { status: 502 })),\n }),\n );\n const result = await checkLlmGatewayHealth();\n expect(result.status).toBe(ServiceHealthStatus.Down);\n expect(result.error).toBe('HTTP 502');\n });\n\n it('returns down on DNS resolution failure', async () => {\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.llmGatewayLiveness]: () =>\n Promise.reject(\n new Error('getaddrinfo ENOTFOUND gateway.us.posthog.com'),\n ),\n }),\n );\n const result = await checkLlmGatewayHealth();\n expect(result.status).toBe(ServiceHealthStatus.Down);\n expect(result.error).toBe('getaddrinfo ENOTFOUND gateway.us.posthog.com');\n });\n\n it('returns down on timeout (AbortError)', async () => {\n const abortError = new Error('The operation was aborted.');\n abortError.name = 'AbortError';\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.llmGatewayLiveness]: () => Promise.reject(abortError),\n }),\n );\n const result = await checkLlmGatewayHealth();\n expect(result.status).toBe(ServiceHealthStatus.Down);\n expect(result.error).toBe('Request timed out');\n });\n });\n\n // -----------------------------------------------------------------------\n // MCP (fetchEndpointHealth – / landing)\n // -----------------------------------------------------------------------\n\n describe('checkMcpHealth', () => {\n it('returns healthy when MCP worker responds 200 with landing HTML', async () => {\n const result = await checkMcpHealth();\n expect(result.status).toBe(ServiceHealthStatus.Healthy);\n expect(result.rawIndicator).toBe('HTTP 200');\n expect(global.fetch).toHaveBeenCalledWith(\n URLS.mcpLanding,\n expect.objectContaining({ signal: expect.any(AbortSignal) }),\n );\n });\n\n it('returns down when worker responds 500', async () => {\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.mcpLanding]: () =>\n Promise.resolve(\n new Response('Internal Server Error', { status: 500 }),\n ),\n }),\n );\n const result = await checkMcpHealth();\n expect(result.status).toBe(ServiceHealthStatus.Down);\n expect(result.error).toBe('HTTP 500');\n });\n\n it('returns down when Cloudflare returns 522 (connection timed out)', async () => {\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.mcpLanding]: () =>\n Promise.resolve(new Response('', { status: 522 })),\n }),\n );\n const result = await checkMcpHealth();\n expect(result.status).toBe(ServiceHealthStatus.Down);\n expect(result.error).toBe('HTTP 522');\n });\n\n it('returns down on network failure', async () => {\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.mcpLanding]: () => Promise.reject(new Error('fetch failed')),\n }),\n );\n const result = await checkMcpHealth();\n expect(result.status).toBe(ServiceHealthStatus.Down);\n expect(result.error).toBe('fetch failed');\n });\n });\n\n // -----------------------------------------------------------------------\n // checkAllExternalServices\n // -----------------------------------------------------------------------\n\n describe('checkAllExternalServices', () => {\n it('returns all 10 service keys when everything is healthy', async () => {\n const health = await checkAllExternalServices();\n const keys = Object.keys(health);\n expect(keys).toEqual(\n expect.arrayContaining([\n 'anthropic',\n 'posthogOverall',\n 'posthogComponents',\n 'github',\n 'npmOverall',\n 'npmComponents',\n 'cloudflareOverall',\n 'cloudflareComponents',\n 'llmGateway',\n 'mcp',\n ]),\n );\n expect(keys).toHaveLength(10);\n for (const val of Object.values(health)) {\n expect(val.status).toBe(ServiceHealthStatus.Healthy);\n }\n });\n\n it('fires all 10 fetch calls in parallel', async () => {\n await checkAllExternalServices();\n const calledUrls = (global.fetch as jest.Mock).mock.calls.map(\n (c: unknown[]) =>\n typeof c[0] === 'string' ? c[0] : (c[0] as URL).toString(),\n );\n expect(calledUrls).toHaveLength(10);\n expect(calledUrls).toContain(URLS.llmGatewayLiveness);\n expect(calledUrls).toContain(URLS.mcpLanding);\n });\n });\n\n // -----------------------------------------------------------------------\n // evaluateWizardReadiness\n // -----------------------------------------------------------------------\n\n describe('evaluateWizardReadiness', () => {\n it('returns Yes when all services are healthy', async () => {\n const result = await evaluateWizardReadiness(\n DEFAULT_WIZARD_READINESS_CONFIG,\n );\n expect(result.decision).toBe(WizardReadiness.Yes);\n });\n\n it('returns No when Anthropic is degraded (degradedBlocksRun)', async () => {\n const body = makeStatuspageStatus({\n pageId: 'tymt9n04zgry',\n pageName: 'Claude',\n pageUrl: 'https://status.claude.com',\n indicator: 'minor',\n description: 'Minor Service Outage',\n });\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.anthropicStatus]: () =>\n Promise.resolve(\n new Response(JSON.stringify(body), { status: 200 }),\n ),\n }),\n );\n const result = await evaluateWizardReadiness(\n DEFAULT_WIZARD_READINESS_CONFIG,\n );\n expect(result.decision).toBe(WizardReadiness.No);\n expect(result.health.anthropic.status).toBe(ServiceHealthStatus.Degraded);\n });\n\n it('returns No when LLM Gateway is down (downBlocksRun)', async () => {\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.llmGatewayLiveness]: () =>\n Promise.resolve(\n new Response('Service Unavailable', { status: 503 }),\n ),\n }),\n );\n const result = await evaluateWizardReadiness(\n DEFAULT_WIZARD_READINESS_CONFIG,\n );\n expect(result.decision).toBe(WizardReadiness.No);\n expect(result.health.llmGateway.status).toBe(ServiceHealthStatus.Down);\n });\n\n it('returns No when MCP is down (downBlocksRun)', async () => {\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.mcpLanding]: () =>\n Promise.resolve(new Response('Bad Gateway', { status: 502 })),\n }),\n );\n const result = await evaluateWizardReadiness(\n DEFAULT_WIZARD_READINESS_CONFIG,\n );\n expect(result.decision).toBe(WizardReadiness.No);\n expect(result.health.mcp.status).toBe(ServiceHealthStatus.Down);\n });\n\n it('returns No when npm overall is down (downBlocksRun)', async () => {\n const body = makeStatuspageStatus({\n pageId: 'wyvgptkd90hm',\n pageName: 'npm',\n pageUrl: 'https://status.npmjs.org',\n indicator: 'critical',\n description: 'Major Service Outage',\n });\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.npmStatus]: () =>\n Promise.resolve(\n new Response(JSON.stringify(body), { status: 200 }),\n ),\n }),\n );\n const result = await evaluateWizardReadiness(\n DEFAULT_WIZARD_READINESS_CONFIG,\n );\n expect(result.decision).toBe(WizardReadiness.No);\n expect(result.health.npmOverall.status).toBe(ServiceHealthStatus.Down);\n });\n\n it('returns YesWithWarnings when a non-blocking service is degraded', async () => {\n const body = makeStatuspageStatus({\n pageId: 'yh6f0r4529hb',\n pageName: 'Cloudflare',\n pageUrl: 'https://www.cloudflarestatus.com',\n indicator: 'minor',\n description: 'Minor Service Outage',\n });\n (global.fetch as jest.Mock).mockImplementation(\n overrideFetch({\n [URLS.cloudflareStatus]: () =>\n Promise.resolve(\n new Response(JSON.stringify(body), { status: 200 }),\n ),\n }),\n );\n const result = await evaluateWizardReadiness(\n DEFAULT_WIZARD_READINESS_CONFIG,\n );\n expect(result.decision).toBe(WizardReadiness.YesWithWarnings);\n });\n\n it('includes human-readable reasons for every service', async () => {\n const result = await evaluateWizardReadiness(\n DEFAULT_WIZARD_READINESS_CONFIG,\n );\n expect(result.reasons.length).toBeGreaterThan(0);\n expect(result.reasons.some((r) => r.includes('Anthropic'))).toBe(true);\n expect(result.reasons.some((r) => r.includes('PostHog'))).toBe(true);\n expect(result.reasons.some((r) => r.includes('GitHub'))).toBe(true);\n expect(result.reasons.some((r) => r.includes('npm'))).toBe(true);\n expect(result.reasons.some((r) => r.includes('Cloudflare'))).toBe(true);\n expect(result.reasons.some((r) => r.includes('LLM Gateway'))).toBe(true);\n expect(result.reasons.some((r) => r.includes('MCP'))).toBe(true);\n });\n });\n});\n"]}
@@ -0,0 +1,3 @@
1
+ import { type BaseHealthResult } from './types';
2
+ export declare const checkLlmGatewayHealth: () => Promise<BaseHealthResult>;
3
+ export declare const checkMcpHealth: () => Promise<BaseHealthResult>;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkMcpHealth = exports.checkLlmGatewayHealth = void 0;
4
+ const types_1 = require("./types");
5
+ // ---------------------------------------------------------------------------
6
+ // Direct endpoint health checks
7
+ //
8
+ // These ping PostHog-owned services directly (no Statuspage intermediary).
9
+ // A non-expected HTTP status or any network error is treated as Down.
10
+ //
11
+ // LLM Gateway – FastAPI service
12
+ // Source: posthog/services/llm-gateway/src/llm_gateway/api/health.py
13
+ // GET /_liveness → 200 {"status":"alive"}
14
+ //
15
+ // MCP – Cloudflare Worker
16
+ // Source: posthog/services/mcp/src/index.ts
17
+ // GET / → 200 (HTML landing page)
18
+ // ---------------------------------------------------------------------------
19
+ function downResult(error) {
20
+ return { status: types_1.ServiceHealthStatus.Down, error };
21
+ }
22
+ async function fetchEndpointHealth(url, timeoutMs = 5000, expectedStatus = 200) {
23
+ try {
24
+ const controller = new AbortController();
25
+ const tid = setTimeout(() => controller.abort(), timeoutMs);
26
+ const res = await fetch(url, { signal: controller.signal });
27
+ clearTimeout(tid);
28
+ if (res.status === expectedStatus) {
29
+ return {
30
+ status: types_1.ServiceHealthStatus.Healthy,
31
+ rawIndicator: `HTTP ${res.status}`,
32
+ };
33
+ }
34
+ return downResult(`HTTP ${res.status}`);
35
+ }
36
+ catch (e) {
37
+ if (e instanceof Error && e.name === 'AbortError')
38
+ return downResult('Request timed out');
39
+ return downResult(e instanceof Error ? e.message : 'Unknown error');
40
+ }
41
+ }
42
+ const checkLlmGatewayHealth = () => fetchEndpointHealth('https://gateway.us.posthog.com/_liveness');
43
+ exports.checkLlmGatewayHealth = checkLlmGatewayHealth;
44
+ const checkMcpHealth = () => fetchEndpointHealth('https://mcp.posthog.com/');
45
+ exports.checkMcpHealth = checkMcpHealth;
46
+ //# sourceMappingURL=endpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../../../src/lib/health-checks/endpoints.ts"],"names":[],"mappings":";;;AAAA,mCAAqE;AAErE,8EAA8E;AAC9E,gCAAgC;AAChC,EAAE;AACF,2EAA2E;AAC3E,sEAAsE;AACtE,EAAE;AACF,gCAAgC;AAChC,uEAAuE;AACvE,4CAA4C;AAC5C,EAAE;AACF,0BAA0B;AAC1B,8CAA8C;AAC9C,oCAAoC;AACpC,8EAA8E;AAE9E,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,EAAE,MAAM,EAAE,2BAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,GAAW,EACX,SAAS,GAAG,IAAI,EAChB,cAAc,GAAG,GAAG;IAEpB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,YAAY,CAAC,GAAG,CAAC,CAAC;QAElB,IAAI,GAAG,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;YAClC,OAAO;gBACL,MAAM,EAAE,2BAAmB,CAAC,OAAO;gBACnC,YAAY,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE;aACnC,CAAC;QACJ,CAAC;QACD,OAAO,UAAU,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY;YAC/C,OAAO,UAAU,CAAC,mBAAmB,CAAC,CAAC;QACzC,OAAO,UAAU,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAEM,MAAM,qBAAqB,GAAG,GAA8B,EAAE,CACnE,mBAAmB,CAAC,0CAA0C,CAAC,CAAC;AADrD,QAAA,qBAAqB,yBACgC;AAE3D,MAAM,cAAc,GAAG,GAA8B,EAAE,CAC5D,mBAAmB,CAAC,0BAA0B,CAAC,CAAC;AADrC,QAAA,cAAc,kBACuB","sourcesContent":["import { ServiceHealthStatus, type BaseHealthResult } from './types';\n\n// ---------------------------------------------------------------------------\n// Direct endpoint health checks\n//\n// These ping PostHog-owned services directly (no Statuspage intermediary).\n// A non-expected HTTP status or any network error is treated as Down.\n//\n// LLM Gateway – FastAPI service\n// Source: posthog/services/llm-gateway/src/llm_gateway/api/health.py\n// GET /_liveness → 200 {\"status\":\"alive\"}\n//\n// MCP – Cloudflare Worker\n// Source: posthog/services/mcp/src/index.ts\n// GET / → 200 (HTML landing page)\n// ---------------------------------------------------------------------------\n\nfunction downResult(error: string): BaseHealthResult {\n return { status: ServiceHealthStatus.Down, error };\n}\n\nasync function fetchEndpointHealth(\n url: string,\n timeoutMs = 5000,\n expectedStatus = 200,\n): Promise<BaseHealthResult> {\n try {\n const controller = new AbortController();\n const tid = setTimeout(() => controller.abort(), timeoutMs);\n const res = await fetch(url, { signal: controller.signal });\n clearTimeout(tid);\n\n if (res.status === expectedStatus) {\n return {\n status: ServiceHealthStatus.Healthy,\n rawIndicator: `HTTP ${res.status}`,\n };\n }\n return downResult(`HTTP ${res.status}`);\n } catch (e) {\n if (e instanceof Error && e.name === 'AbortError')\n return downResult('Request timed out');\n return downResult(e instanceof Error ? e.message : 'Unknown error');\n }\n}\n\nexport const checkLlmGatewayHealth = (): Promise<BaseHealthResult> =>\n fetchEndpointHealth('https://gateway.us.posthog.com/_liveness');\n\nexport const checkMcpHealth = (): Promise<BaseHealthResult> =>\n fetchEndpointHealth('https://mcp.posthog.com/');\n"]}
@@ -0,0 +1,4 @@
1
+ export { ServiceHealthStatus, type BaseHealthResult, type ComponentStatus, type ComponentHealthResult, type AllServicesHealth, type HealthCheckKey, } from './types';
2
+ export { checkAnthropicHealth, checkPosthogOverallHealth, checkPosthogComponentHealth, checkGithubHealth, checkNpmOverallHealth, checkNpmComponentHealth, checkCloudflareOverallHealth, checkCloudflareComponentHealth, } from './statuspage';
3
+ export { checkLlmGatewayHealth, checkMcpHealth } from './endpoints';
4
+ export { type WizardReadinessConfig, DEFAULT_WIZARD_READINESS_CONFIG, checkAllExternalServices, WizardReadiness, type WizardReadinessResult, evaluateWizardReadiness, } from './readiness';
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.evaluateWizardReadiness = exports.WizardReadiness = exports.checkAllExternalServices = exports.DEFAULT_WIZARD_READINESS_CONFIG = exports.checkMcpHealth = exports.checkLlmGatewayHealth = exports.checkCloudflareComponentHealth = exports.checkCloudflareOverallHealth = exports.checkNpmComponentHealth = exports.checkNpmOverallHealth = exports.checkGithubHealth = exports.checkPosthogComponentHealth = exports.checkPosthogOverallHealth = exports.checkAnthropicHealth = exports.ServiceHealthStatus = void 0;
4
+ var types_1 = require("./types");
5
+ Object.defineProperty(exports, "ServiceHealthStatus", { enumerable: true, get: function () { return types_1.ServiceHealthStatus; } });
6
+ var statuspage_1 = require("./statuspage");
7
+ Object.defineProperty(exports, "checkAnthropicHealth", { enumerable: true, get: function () { return statuspage_1.checkAnthropicHealth; } });
8
+ Object.defineProperty(exports, "checkPosthogOverallHealth", { enumerable: true, get: function () { return statuspage_1.checkPosthogOverallHealth; } });
9
+ Object.defineProperty(exports, "checkPosthogComponentHealth", { enumerable: true, get: function () { return statuspage_1.checkPosthogComponentHealth; } });
10
+ Object.defineProperty(exports, "checkGithubHealth", { enumerable: true, get: function () { return statuspage_1.checkGithubHealth; } });
11
+ Object.defineProperty(exports, "checkNpmOverallHealth", { enumerable: true, get: function () { return statuspage_1.checkNpmOverallHealth; } });
12
+ Object.defineProperty(exports, "checkNpmComponentHealth", { enumerable: true, get: function () { return statuspage_1.checkNpmComponentHealth; } });
13
+ Object.defineProperty(exports, "checkCloudflareOverallHealth", { enumerable: true, get: function () { return statuspage_1.checkCloudflareOverallHealth; } });
14
+ Object.defineProperty(exports, "checkCloudflareComponentHealth", { enumerable: true, get: function () { return statuspage_1.checkCloudflareComponentHealth; } });
15
+ var endpoints_1 = require("./endpoints");
16
+ Object.defineProperty(exports, "checkLlmGatewayHealth", { enumerable: true, get: function () { return endpoints_1.checkLlmGatewayHealth; } });
17
+ Object.defineProperty(exports, "checkMcpHealth", { enumerable: true, get: function () { return endpoints_1.checkMcpHealth; } });
18
+ var readiness_1 = require("./readiness");
19
+ Object.defineProperty(exports, "DEFAULT_WIZARD_READINESS_CONFIG", { enumerable: true, get: function () { return readiness_1.DEFAULT_WIZARD_READINESS_CONFIG; } });
20
+ Object.defineProperty(exports, "checkAllExternalServices", { enumerable: true, get: function () { return readiness_1.checkAllExternalServices; } });
21
+ Object.defineProperty(exports, "WizardReadiness", { enumerable: true, get: function () { return readiness_1.WizardReadiness; } });
22
+ Object.defineProperty(exports, "evaluateWizardReadiness", { enumerable: true, get: function () { return readiness_1.evaluateWizardReadiness; } });
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/health-checks/index.ts"],"names":[],"mappings":";;;AAAA,iCAOiB;AANf,4GAAA,mBAAmB,OAAA;AAQrB,2CASsB;AARpB,kHAAA,oBAAoB,OAAA;AACpB,uHAAA,yBAAyB,OAAA;AACzB,yHAAA,2BAA2B,OAAA;AAC3B,+GAAA,iBAAiB,OAAA;AACjB,mHAAA,qBAAqB,OAAA;AACrB,qHAAA,uBAAuB,OAAA;AACvB,0HAAA,4BAA4B,OAAA;AAC5B,4HAAA,8BAA8B,OAAA;AAGhC,yCAAoE;AAA3D,kHAAA,qBAAqB,OAAA;AAAE,2GAAA,cAAc,OAAA;AAE9C,yCAOqB;AALnB,4HAAA,+BAA+B,OAAA;AAC/B,qHAAA,wBAAwB,OAAA;AACxB,4GAAA,eAAe,OAAA;AAEf,oHAAA,uBAAuB,OAAA","sourcesContent":["export {\n ServiceHealthStatus,\n type BaseHealthResult,\n type ComponentStatus,\n type ComponentHealthResult,\n type AllServicesHealth,\n type HealthCheckKey,\n} from './types';\n\nexport {\n checkAnthropicHealth,\n checkPosthogOverallHealth,\n checkPosthogComponentHealth,\n checkGithubHealth,\n checkNpmOverallHealth,\n checkNpmComponentHealth,\n checkCloudflareOverallHealth,\n checkCloudflareComponentHealth,\n} from './statuspage';\n\nexport { checkLlmGatewayHealth, checkMcpHealth } from './endpoints';\n\nexport {\n type WizardReadinessConfig,\n DEFAULT_WIZARD_READINESS_CONFIG,\n checkAllExternalServices,\n WizardReadiness,\n type WizardReadinessResult,\n evaluateWizardReadiness,\n} from './readiness';\n"]}
@@ -0,0 +1,24 @@
1
+ import { type AllServicesHealth, type HealthCheckKey } from './types';
2
+ export interface WizardReadinessConfig {
3
+ /** Services where status=Down blocks the run (readiness=No). */
4
+ downBlocksRun: HealthCheckKey[];
5
+ /** Services where status=Degraded (or worse) blocks the run (readiness=No). */
6
+ degradedBlocksRun?: HealthCheckKey[];
7
+ }
8
+ /**
9
+ * See README section "Health checks" for the full rationale.
10
+ * Adjust these arrays to change what blocks a wizard run.
11
+ */
12
+ export declare const DEFAULT_WIZARD_READINESS_CONFIG: WizardReadinessConfig;
13
+ export declare function checkAllExternalServices(): Promise<AllServicesHealth>;
14
+ export declare enum WizardReadiness {
15
+ Yes = "yes",
16
+ No = "no",
17
+ YesWithWarnings = "yes_with_warnings"
18
+ }
19
+ export interface WizardReadinessResult {
20
+ decision: WizardReadiness;
21
+ health: AllServicesHealth;
22
+ reasons: string[];
23
+ }
24
+ export declare function evaluateWizardReadiness(config?: WizardReadinessConfig): Promise<WizardReadinessResult>;
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WizardReadiness = exports.DEFAULT_WIZARD_READINESS_CONFIG = void 0;
4
+ exports.checkAllExternalServices = checkAllExternalServices;
5
+ exports.evaluateWizardReadiness = evaluateWizardReadiness;
6
+ const types_1 = require("./types");
7
+ const statuspage_1 = require("./statuspage");
8
+ const endpoints_1 = require("./endpoints");
9
+ // ---------------------------------------------------------------------------
10
+ // Service labels (used in human-readable reason strings)
11
+ // ---------------------------------------------------------------------------
12
+ const SERVICE_LABELS = {
13
+ anthropic: 'Anthropic',
14
+ posthogOverall: 'PostHog',
15
+ posthogComponents: 'PostHog (components)',
16
+ github: 'GitHub',
17
+ npmOverall: 'npm',
18
+ npmComponents: 'npm (components)',
19
+ cloudflareOverall: 'Cloudflare',
20
+ cloudflareComponents: 'Cloudflare (components)',
21
+ llmGateway: 'LLM Gateway',
22
+ mcp: 'MCP',
23
+ };
24
+ /**
25
+ * See README section "Health checks" for the full rationale.
26
+ * Adjust these arrays to change what blocks a wizard run.
27
+ */
28
+ exports.DEFAULT_WIZARD_READINESS_CONFIG = {
29
+ downBlocksRun: [
30
+ 'anthropic',
31
+ 'posthogOverall',
32
+ 'npmOverall',
33
+ 'llmGateway',
34
+ 'mcp',
35
+ ],
36
+ degradedBlocksRun: ['anthropic'],
37
+ };
38
+ // ---------------------------------------------------------------------------
39
+ // Aggregate check
40
+ // ---------------------------------------------------------------------------
41
+ async function checkAllExternalServices() {
42
+ const [anthropic, posthogOverall, posthogComponents, github, npmOverall, npmComponents, cloudflareOverall, cloudflareComponents, llmGateway, mcp,] = await Promise.all([
43
+ (0, statuspage_1.checkAnthropicHealth)(),
44
+ (0, statuspage_1.checkPosthogOverallHealth)(),
45
+ (0, statuspage_1.checkPosthogComponentHealth)(),
46
+ (0, statuspage_1.checkGithubHealth)(),
47
+ (0, statuspage_1.checkNpmOverallHealth)(),
48
+ (0, statuspage_1.checkNpmComponentHealth)(),
49
+ (0, statuspage_1.checkCloudflareOverallHealth)(),
50
+ (0, statuspage_1.checkCloudflareComponentHealth)(),
51
+ (0, endpoints_1.checkLlmGatewayHealth)(),
52
+ (0, endpoints_1.checkMcpHealth)(),
53
+ ]);
54
+ return {
55
+ anthropic,
56
+ posthogOverall,
57
+ posthogComponents,
58
+ github,
59
+ npmOverall,
60
+ npmComponents,
61
+ cloudflareOverall,
62
+ cloudflareComponents,
63
+ llmGateway,
64
+ mcp,
65
+ };
66
+ }
67
+ // ---------------------------------------------------------------------------
68
+ // Wizard readiness evaluation
69
+ // ---------------------------------------------------------------------------
70
+ var WizardReadiness;
71
+ (function (WizardReadiness) {
72
+ WizardReadiness["Yes"] = "yes";
73
+ WizardReadiness["No"] = "no";
74
+ WizardReadiness["YesWithWarnings"] = "yes_with_warnings";
75
+ })(WizardReadiness || (exports.WizardReadiness = WizardReadiness = {}));
76
+ function describeResult(label, h) {
77
+ const parts = [`${label}: ${h.status}`];
78
+ if (h.rawIndicator)
79
+ parts.push(`indicator=${h.rawIndicator}`);
80
+ if (h.error)
81
+ parts.push(h.error);
82
+ return parts.join(' — ');
83
+ }
84
+ const MAX_COMPONENT_NAMES = 8;
85
+ function describeComponents(label, h) {
86
+ const affected = h.degradedOrDownComponents;
87
+ if (!affected || affected.length === 0)
88
+ return `${label} components: all operational`;
89
+ const shown = affected
90
+ .slice(0, MAX_COMPONENT_NAMES)
91
+ .map((c) => `${c.name} (${c.status})`);
92
+ const suffix = affected.length > MAX_COMPONENT_NAMES
93
+ ? `, +${affected.length - MAX_COMPONENT_NAMES} more`
94
+ : '';
95
+ return `${label} components impacted: ${shown.join(', ')}${suffix}`;
96
+ }
97
+ async function evaluateWizardReadiness(config = exports.DEFAULT_WIZARD_READINESS_CONFIG) {
98
+ const health = await checkAllExternalServices();
99
+ const reasons = [];
100
+ for (const key of Object.keys(health)) {
101
+ const result = health[key];
102
+ const label = SERVICE_LABELS[key];
103
+ reasons.push(describeResult(label, result));
104
+ if ('degradedOrDownComponents' in result) {
105
+ reasons.push(describeComponents(label, result));
106
+ }
107
+ }
108
+ const blocked = config.downBlocksRun.some((k) => health[k].status === types_1.ServiceHealthStatus.Down) ||
109
+ (config.degradedBlocksRun ?? []).some((k) => health[k].status !== types_1.ServiceHealthStatus.Healthy);
110
+ if (blocked) {
111
+ return { decision: WizardReadiness.No, health, reasons };
112
+ }
113
+ const hasWarnings = Object.values(health).some((h) => h.status !== types_1.ServiceHealthStatus.Healthy);
114
+ if (hasWarnings) {
115
+ return { decision: WizardReadiness.YesWithWarnings, health, reasons };
116
+ }
117
+ return { decision: WizardReadiness.Yes, health, reasons };
118
+ }
119
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.js","sourceRoot":"","sources":["../../../../src/lib/health-checks/readiness.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ServiceHealthStatus,\n type AllServicesHealth,\n type BaseHealthResult,\n type ComponentHealthResult,\n type HealthCheckKey,\n} from './types';\nimport {\n checkAnthropicHealth,\n checkPosthogOverallHealth,\n checkPosthogComponentHealth,\n checkGithubHealth,\n checkNpmOverallHealth,\n checkNpmComponentHealth,\n checkCloudflareOverallHealth,\n checkCloudflareComponentHealth,\n} from './statuspage';\nimport { checkLlmGatewayHealth, checkMcpHealth } from './endpoints';\n\n// ---------------------------------------------------------------------------\n// Service labels (used in human-readable reason strings)\n// ---------------------------------------------------------------------------\n\nconst SERVICE_LABELS: Record<HealthCheckKey, string> = {\n anthropic: 'Anthropic',\n posthogOverall: 'PostHog',\n posthogComponents: 'PostHog (components)',\n github: 'GitHub',\n npmOverall: 'npm',\n npmComponents: 'npm (components)',\n cloudflareOverall: 'Cloudflare',\n cloudflareComponents: 'Cloudflare (components)',\n llmGateway: 'LLM Gateway',\n mcp: 'MCP',\n};\n\n// ---------------------------------------------------------------------------\n// Readiness config\n// ---------------------------------------------------------------------------\n\nexport interface WizardReadinessConfig {\n /** Services where status=Down blocks the run (readiness=No). */\n downBlocksRun: HealthCheckKey[];\n /** Services where status=Degraded (or worse) blocks the run (readiness=No). */\n degradedBlocksRun?: HealthCheckKey[];\n}\n\n/**\n * See README section \"Health checks\" for the full rationale.\n * Adjust these arrays to change what blocks a wizard run.\n */\nexport const DEFAULT_WIZARD_READINESS_CONFIG: WizardReadinessConfig = {\n downBlocksRun: [\n 'anthropic',\n 'posthogOverall',\n 'npmOverall',\n 'llmGateway',\n 'mcp',\n ],\n degradedBlocksRun: ['anthropic'],\n};\n\n// ---------------------------------------------------------------------------\n// Aggregate check\n// ---------------------------------------------------------------------------\n\nexport async function checkAllExternalServices(): Promise<AllServicesHealth> {\n const [\n anthropic,\n posthogOverall,\n posthogComponents,\n github,\n npmOverall,\n npmComponents,\n cloudflareOverall,\n cloudflareComponents,\n llmGateway,\n mcp,\n ] = await Promise.all([\n checkAnthropicHealth(),\n checkPosthogOverallHealth(),\n checkPosthogComponentHealth(),\n checkGithubHealth(),\n checkNpmOverallHealth(),\n checkNpmComponentHealth(),\n checkCloudflareOverallHealth(),\n checkCloudflareComponentHealth(),\n checkLlmGatewayHealth(),\n checkMcpHealth(),\n ]);\n return {\n anthropic,\n posthogOverall,\n posthogComponents,\n github,\n npmOverall,\n npmComponents,\n cloudflareOverall,\n cloudflareComponents,\n llmGateway,\n mcp,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Wizard readiness evaluation\n// ---------------------------------------------------------------------------\n\nexport enum WizardReadiness {\n Yes = 'yes',\n No = 'no',\n YesWithWarnings = 'yes_with_warnings',\n}\n\nexport interface WizardReadinessResult {\n decision: WizardReadiness;\n health: AllServicesHealth;\n reasons: string[];\n}\n\nfunction describeResult(label: string, h: BaseHealthResult): string {\n const parts = [`${label}: ${h.status}`];\n if (h.rawIndicator) parts.push(`indicator=${h.rawIndicator}`);\n if (h.error) parts.push(h.error);\n return parts.join(' — ');\n}\n\nconst MAX_COMPONENT_NAMES = 8;\n\nfunction describeComponents(label: string, h: ComponentHealthResult): string {\n const affected = h.degradedOrDownComponents;\n if (!affected || affected.length === 0)\n return `${label} components: all operational`;\n const shown = affected\n .slice(0, MAX_COMPONENT_NAMES)\n .map((c) => `${c.name} (${c.status})`);\n const suffix =\n affected.length > MAX_COMPONENT_NAMES\n ? `, +${affected.length - MAX_COMPONENT_NAMES} more`\n : '';\n return `${label} components impacted: ${shown.join(', ')}${suffix}`;\n}\n\nexport async function evaluateWizardReadiness(\n config: WizardReadinessConfig = DEFAULT_WIZARD_READINESS_CONFIG,\n): Promise<WizardReadinessResult> {\n const health = await checkAllExternalServices();\n const reasons: string[] = [];\n\n for (const key of Object.keys(health) as HealthCheckKey[]) {\n const result = health[key];\n const label = SERVICE_LABELS[key];\n\n reasons.push(describeResult(label, result));\n\n if ('degradedOrDownComponents' in result) {\n reasons.push(describeComponents(label, result));\n }\n }\n\n const blocked =\n config.downBlocksRun.some(\n (k) => health[k].status === ServiceHealthStatus.Down,\n ) ||\n (config.degradedBlocksRun ?? []).some(\n (k) => health[k].status !== ServiceHealthStatus.Healthy,\n );\n\n if (blocked) {\n return { decision: WizardReadiness.No, health, reasons };\n }\n\n const hasWarnings = Object.values(health).some(\n (h) => h.status !== ServiceHealthStatus.Healthy,\n );\n\n if (hasWarnings) {\n return { decision: WizardReadiness.YesWithWarnings, health, reasons };\n }\n\n return { decision: WizardReadiness.Yes, health, reasons };\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { type BaseHealthResult, type ComponentHealthResult } from './types';
2
+ export declare const checkAnthropicHealth: () => Promise<BaseHealthResult>;
3
+ export declare const checkPosthogOverallHealth: () => Promise<BaseHealthResult>;
4
+ export declare const checkPosthogComponentHealth: () => Promise<ComponentHealthResult>;
5
+ export declare const checkGithubHealth: () => Promise<BaseHealthResult>;
6
+ export declare const checkNpmOverallHealth: () => Promise<BaseHealthResult>;
7
+ export declare const checkNpmComponentHealth: () => Promise<ComponentHealthResult>;
8
+ export declare const checkCloudflareOverallHealth: () => Promise<BaseHealthResult>;
9
+ export declare const checkCloudflareComponentHealth: () => Promise<ComponentHealthResult>;
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkCloudflareComponentHealth = exports.checkCloudflareOverallHealth = exports.checkNpmComponentHealth = exports.checkNpmOverallHealth = exports.checkGithubHealth = exports.checkPosthogComponentHealth = exports.checkPosthogOverallHealth = exports.checkAnthropicHealth = void 0;
4
+ const types_1 = require("./types");
5
+ function mapIndicator(v) {
6
+ switch (v) {
7
+ case 'none':
8
+ return types_1.ServiceHealthStatus.Healthy;
9
+ case 'minor':
10
+ return types_1.ServiceHealthStatus.Degraded;
11
+ case 'major':
12
+ case 'critical':
13
+ return types_1.ServiceHealthStatus.Down;
14
+ default:
15
+ return types_1.ServiceHealthStatus.Degraded;
16
+ }
17
+ }
18
+ function mapComponentRaw(v) {
19
+ switch (v) {
20
+ case 'operational':
21
+ return types_1.ServiceHealthStatus.Healthy;
22
+ case 'degraded_performance':
23
+ case 'under_maintenance':
24
+ return types_1.ServiceHealthStatus.Degraded;
25
+ case 'partial_outage':
26
+ case 'major_outage':
27
+ return types_1.ServiceHealthStatus.Down;
28
+ default:
29
+ return types_1.ServiceHealthStatus.Degraded;
30
+ }
31
+ }
32
+ function errResult(error) {
33
+ return { status: types_1.ServiceHealthStatus.Degraded, error };
34
+ }
35
+ async function fetchStatuspageIndicator(url, timeoutMs = 5000) {
36
+ try {
37
+ const controller = new AbortController();
38
+ const tid = setTimeout(() => controller.abort(), timeoutMs);
39
+ const res = await fetch(url, { signal: controller.signal });
40
+ clearTimeout(tid);
41
+ if (!res.ok)
42
+ return errResult(`HTTP ${res.status}`);
43
+ const data = (await res.json());
44
+ const indicator = data.status?.indicator ?? null;
45
+ return {
46
+ status: mapIndicator(indicator),
47
+ rawIndicator: indicator ?? undefined,
48
+ };
49
+ }
50
+ catch (e) {
51
+ if (e instanceof Error && e.name === 'AbortError')
52
+ return errResult('Request timed out');
53
+ return errResult(e instanceof Error ? e.message : 'Unknown error');
54
+ }
55
+ }
56
+ async function fetchStatuspageSummary(url, timeoutMs = 5000) {
57
+ try {
58
+ const controller = new AbortController();
59
+ const tid = setTimeout(() => controller.abort(), timeoutMs);
60
+ const res = await fetch(url, { signal: controller.signal });
61
+ clearTimeout(tid);
62
+ if (!res.ok)
63
+ return errResult(`HTTP ${res.status}`);
64
+ const data = (await res.json());
65
+ const indicator = data.status?.indicator ?? null;
66
+ const overall = mapIndicator(indicator);
67
+ const affected = (data.components ?? [])
68
+ .map((c) => ({
69
+ name: c.name,
70
+ status: mapComponentRaw(c.status),
71
+ rawStatus: c.status,
72
+ }))
73
+ .filter((c) => c.status !== types_1.ServiceHealthStatus.Healthy);
74
+ return {
75
+ status: affected.length > 0 ? types_1.ServiceHealthStatus.Degraded : overall,
76
+ rawIndicator: indicator ?? undefined,
77
+ degradedOrDownComponents: affected.length > 0 ? affected : undefined,
78
+ };
79
+ }
80
+ catch (e) {
81
+ if (e instanceof Error && e.name === 'AbortError')
82
+ return errResult('Request timed out');
83
+ return errResult(e instanceof Error ? e.message : 'Unknown error');
84
+ }
85
+ }
86
+ // ---------------------------------------------------------------------------
87
+ // Individual statuspage-backed checks
88
+ // ---------------------------------------------------------------------------
89
+ const checkAnthropicHealth = () => fetchStatuspageIndicator('https://status.claude.com/api/v2/status.json');
90
+ exports.checkAnthropicHealth = checkAnthropicHealth;
91
+ const checkPosthogOverallHealth = () => fetchStatuspageIndicator('https://www.posthogstatus.com/api/v2/status.json');
92
+ exports.checkPosthogOverallHealth = checkPosthogOverallHealth;
93
+ const checkPosthogComponentHealth = () => fetchStatuspageSummary('https://www.posthogstatus.com/api/v2/summary.json');
94
+ exports.checkPosthogComponentHealth = checkPosthogComponentHealth;
95
+ const checkGithubHealth = () => fetchStatuspageIndicator('https://www.githubstatus.com/api/v2/status.json');
96
+ exports.checkGithubHealth = checkGithubHealth;
97
+ const checkNpmOverallHealth = () => fetchStatuspageIndicator('https://status.npmjs.org/api/v2/status.json');
98
+ exports.checkNpmOverallHealth = checkNpmOverallHealth;
99
+ const checkNpmComponentHealth = () => fetchStatuspageSummary('https://status.npmjs.org/api/v2/summary.json');
100
+ exports.checkNpmComponentHealth = checkNpmComponentHealth;
101
+ const checkCloudflareOverallHealth = () => fetchStatuspageIndicator('https://www.cloudflarestatus.com/api/v2/status.json');
102
+ exports.checkCloudflareOverallHealth = checkCloudflareOverallHealth;
103
+ const checkCloudflareComponentHealth = () => fetchStatuspageSummary('https://www.cloudflarestatus.com/api/v2/summary.json');
104
+ exports.checkCloudflareComponentHealth = checkCloudflareComponentHealth;
105
+ //# sourceMappingURL=statuspage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statuspage.js","sourceRoot":"","sources":["../../../../src/lib/health-checks/statuspage.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ServiceHealthStatus,\n type BaseHealthResult,\n type ComponentHealthResult,\n} from './types';\n\n// ---------------------------------------------------------------------------\n// Statuspage.io v2 API helpers\n// https://metastatuspage.com/api\n//\n// status.json – page-level rollup; indicator is one of: none | minor | major | critical\n// summary.json – same rollup + component list; component status is one of:\n// operational | degraded_performance | partial_outage | major_outage | under_maintenance\n// https://support.atlassian.com/statuspage/docs/show-service-status-with-components\n// ---------------------------------------------------------------------------\n\ninterface StatuspageStatusResponse {\n status?: { indicator?: string; description?: string };\n}\n\ninterface StatuspageSummaryResponse extends StatuspageStatusResponse {\n components?: { id: string; name: string; status: string }[];\n}\n\nfunction mapIndicator(v: string | null | undefined): ServiceHealthStatus {\n switch (v) {\n case 'none':\n return ServiceHealthStatus.Healthy;\n case 'minor':\n return ServiceHealthStatus.Degraded;\n case 'major':\n case 'critical':\n return ServiceHealthStatus.Down;\n default:\n return ServiceHealthStatus.Degraded;\n }\n}\n\nfunction mapComponentRaw(v: string | null | undefined): ServiceHealthStatus {\n switch (v) {\n case 'operational':\n return ServiceHealthStatus.Healthy;\n case 'degraded_performance':\n case 'under_maintenance':\n return ServiceHealthStatus.Degraded;\n case 'partial_outage':\n case 'major_outage':\n return ServiceHealthStatus.Down;\n default:\n return ServiceHealthStatus.Degraded;\n }\n}\n\nfunction errResult(error: string): BaseHealthResult {\n return { status: ServiceHealthStatus.Degraded, error };\n}\n\nasync function fetchStatuspageIndicator(\n url: string,\n timeoutMs = 5000,\n): Promise<BaseHealthResult> {\n try {\n const controller = new AbortController();\n const tid = setTimeout(() => controller.abort(), timeoutMs);\n const res = await fetch(url, { signal: controller.signal });\n clearTimeout(tid);\n\n if (!res.ok) return errResult(`HTTP ${res.status}`);\n\n const data = (await res.json()) as StatuspageStatusResponse;\n const indicator = data.status?.indicator ?? null;\n return {\n status: mapIndicator(indicator),\n rawIndicator: indicator ?? undefined,\n };\n } catch (e) {\n if (e instanceof Error && e.name === 'AbortError')\n return errResult('Request timed out');\n return errResult(e instanceof Error ? e.message : 'Unknown error');\n }\n}\n\nasync function fetchStatuspageSummary(\n url: string,\n timeoutMs = 5000,\n): Promise<ComponentHealthResult> {\n try {\n const controller = new AbortController();\n const tid = setTimeout(() => controller.abort(), timeoutMs);\n const res = await fetch(url, { signal: controller.signal });\n clearTimeout(tid);\n\n if (!res.ok) return errResult(`HTTP ${res.status}`);\n\n const data = (await res.json()) as StatuspageSummaryResponse;\n const indicator = data.status?.indicator ?? null;\n const overall = mapIndicator(indicator);\n\n const affected = (data.components ?? [])\n .map((c) => ({\n name: c.name,\n status: mapComponentRaw(c.status),\n rawStatus: c.status,\n }))\n .filter((c) => c.status !== ServiceHealthStatus.Healthy);\n\n return {\n status: affected.length > 0 ? ServiceHealthStatus.Degraded : overall,\n rawIndicator: indicator ?? undefined,\n degradedOrDownComponents: affected.length > 0 ? affected : undefined,\n };\n } catch (e) {\n if (e instanceof Error && e.name === 'AbortError')\n return errResult('Request timed out');\n return errResult(e instanceof Error ? e.message : 'Unknown error');\n }\n}\n\n// ---------------------------------------------------------------------------\n// Individual statuspage-backed checks\n// ---------------------------------------------------------------------------\n\nexport const checkAnthropicHealth = (): Promise<BaseHealthResult> =>\n fetchStatuspageIndicator('https://status.claude.com/api/v2/status.json');\n\nexport const checkPosthogOverallHealth = (): Promise<BaseHealthResult> =>\n fetchStatuspageIndicator('https://www.posthogstatus.com/api/v2/status.json');\n\nexport const checkPosthogComponentHealth = (): Promise<ComponentHealthResult> =>\n fetchStatuspageSummary('https://www.posthogstatus.com/api/v2/summary.json');\n\nexport const checkGithubHealth = (): Promise<BaseHealthResult> =>\n fetchStatuspageIndicator('https://www.githubstatus.com/api/v2/status.json');\n\nexport const checkNpmOverallHealth = (): Promise<BaseHealthResult> =>\n fetchStatuspageIndicator('https://status.npmjs.org/api/v2/status.json');\n\nexport const checkNpmComponentHealth = (): Promise<ComponentHealthResult> =>\n fetchStatuspageSummary('https://status.npmjs.org/api/v2/summary.json');\n\nexport const checkCloudflareOverallHealth = (): Promise<BaseHealthResult> =>\n fetchStatuspageIndicator(\n 'https://www.cloudflarestatus.com/api/v2/status.json',\n );\n\nexport const checkCloudflareComponentHealth =\n (): Promise<ComponentHealthResult> =>\n fetchStatuspageSummary(\n 'https://www.cloudflarestatus.com/api/v2/summary.json',\n );\n"]}
@@ -0,0 +1,31 @@
1
+ export declare enum ServiceHealthStatus {
2
+ Healthy = "healthy",
3
+ Degraded = "degraded",
4
+ Down = "down"
5
+ }
6
+ export interface BaseHealthResult {
7
+ status: ServiceHealthStatus;
8
+ rawIndicator?: string;
9
+ error?: string;
10
+ }
11
+ export interface ComponentStatus {
12
+ name: string;
13
+ status: ServiceHealthStatus;
14
+ rawStatus: string;
15
+ }
16
+ export interface ComponentHealthResult extends BaseHealthResult {
17
+ degradedOrDownComponents?: ComponentStatus[];
18
+ }
19
+ export interface AllServicesHealth {
20
+ anthropic: BaseHealthResult;
21
+ posthogOverall: BaseHealthResult;
22
+ posthogComponents: ComponentHealthResult;
23
+ github: BaseHealthResult;
24
+ npmOverall: BaseHealthResult;
25
+ npmComponents: ComponentHealthResult;
26
+ cloudflareOverall: BaseHealthResult;
27
+ cloudflareComponents: ComponentHealthResult;
28
+ llmGateway: BaseHealthResult;
29
+ mcp: BaseHealthResult;
30
+ }
31
+ export type HealthCheckKey = keyof AllServicesHealth;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServiceHealthStatus = void 0;
4
+ var ServiceHealthStatus;
5
+ (function (ServiceHealthStatus) {
6
+ ServiceHealthStatus["Healthy"] = "healthy";
7
+ ServiceHealthStatus["Degraded"] = "degraded";
8
+ ServiceHealthStatus["Down"] = "down";
9
+ })(ServiceHealthStatus || (exports.ServiceHealthStatus = ServiceHealthStatus = {}));
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/lib/health-checks/types.ts"],"names":[],"mappings":";;;AAAA,IAAY,mBAIX;AAJD,WAAY,mBAAmB;IAC7B,0CAAmB,CAAA;IACnB,4CAAqB,CAAA;IACrB,oCAAa,CAAA;AACf,CAAC,EAJW,mBAAmB,mCAAnB,mBAAmB,QAI9B","sourcesContent":["export enum ServiceHealthStatus {\n Healthy = 'healthy',\n Degraded = 'degraded',\n Down = 'down',\n}\n\nexport interface BaseHealthResult {\n status: ServiceHealthStatus;\n rawIndicator?: string;\n error?: string;\n}\n\nexport interface ComponentStatus {\n name: string;\n status: ServiceHealthStatus;\n rawStatus: string;\n}\n\nexport interface ComponentHealthResult extends BaseHealthResult {\n degradedOrDownComponents?: ComponentStatus[];\n}\n\nexport interface AllServicesHealth {\n anthropic: BaseHealthResult;\n posthogOverall: BaseHealthResult;\n posthogComponents: ComponentHealthResult;\n github: BaseHealthResult;\n npmOverall: BaseHealthResult;\n npmComponents: ComponentHealthResult;\n cloudflareOverall: BaseHealthResult;\n cloudflareComponents: ComponentHealthResult;\n llmGateway: BaseHealthResult;\n mcp: BaseHealthResult;\n}\n\nexport type HealthCheckKey = keyof AllServicesHealth;\n"]}
@@ -6,7 +6,7 @@
6
6
  * pipeline.onMessage(message);
7
7
  * pipeline.finalize(resultMessage, durationMs);
8
8
  */
9
- import clack from '../../utils/clack';
9
+ import { type SpinnerHandle } from '../../ui';
10
10
  import { MiddlewarePipeline } from './pipeline';
11
11
  import type { BenchmarkConfig } from './config';
12
12
  import type { WizardOptions } from '../../utils/types';
@@ -51,4 +51,4 @@ export interface BenchmarkData {
51
51
  * Create a middleware pipeline configured for benchmarking.
52
52
  * Loads .benchmark-config.json from the install dir, falls back to defaults.
53
53
  */
54
- export declare function createBenchmarkPipeline(spinner: ReturnType<typeof clack.spinner>, options: WizardOptions, configOverride?: BenchmarkConfig): MiddlewarePipeline;
54
+ export declare function createBenchmarkPipeline(spinner: SpinnerHandle, options: WizardOptions, configOverride?: BenchmarkConfig): MiddlewarePipeline;