@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,752 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for health-checks.ts
4
+ *
5
+ * Mock data is modelled on live Statuspage.io v2 API responses.
6
+ * Statuspage docs: https://metastatuspage.com/api
7
+ *
8
+ * status.json – page-level rollup with indicator (none | minor | major | critical)
9
+ * summary.json – same rollup plus component list; component statuses:
10
+ * operational | degraded_performance | partial_outage | major_outage | under_maintenance
11
+ * https://support.atlassian.com/statuspage/docs/show-service-status-with-components
12
+ *
13
+ * LLM Gateway – FastAPI service, GET /_liveness returns {"status":"alive"} (200)
14
+ * Source: posthog/services/llm-gateway/src/llm_gateway/api/health.py
15
+ *
16
+ * MCP – Cloudflare Worker, GET / returns an HTML landing page (200)
17
+ * Source: posthog/services/mcp/src/index.ts
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ const index_1 = require("../index");
21
+ // ---------------------------------------------------------------------------
22
+ // Real-world Statuspage.io v2 response factories
23
+ // https://metastatuspage.com/api
24
+ // ---------------------------------------------------------------------------
25
+ function makeStatuspageStatus(opts) {
26
+ return {
27
+ page: {
28
+ id: opts.pageId,
29
+ name: opts.pageName,
30
+ url: opts.pageUrl,
31
+ time_zone: 'Etc/UTC',
32
+ updated_at: '2026-03-05T16:03:38.861Z',
33
+ },
34
+ status: {
35
+ indicator: opts.indicator,
36
+ description: opts.description,
37
+ },
38
+ };
39
+ }
40
+ function makeStatuspageSummary(opts) {
41
+ return {
42
+ page: {
43
+ id: opts.pageId,
44
+ name: opts.pageName,
45
+ url: opts.pageUrl,
46
+ time_zone: 'Etc/UTC',
47
+ updated_at: '2026-03-05T16:03:38.861Z',
48
+ },
49
+ status: {
50
+ indicator: opts.indicator,
51
+ description: opts.description,
52
+ },
53
+ components: opts.components.map((c) => ({
54
+ ...c,
55
+ page_id: opts.pageId,
56
+ created_at: '2023-07-11T17:52:24.275Z',
57
+ updated_at: '2026-03-04T17:01:29.960Z',
58
+ showcase: true,
59
+ start_date: '2023-07-11',
60
+ group_id: null,
61
+ group: false,
62
+ only_show_if_degraded: false,
63
+ })),
64
+ incidents: [],
65
+ scheduled_maintenances: [],
66
+ };
67
+ }
68
+ // Shapes taken from live GET on 2026-03-05
69
+ const ANTHROPIC_STATUS_HEALTHY = makeStatuspageStatus({
70
+ pageId: 'tymt9n04zgry',
71
+ pageName: 'Claude',
72
+ pageUrl: 'https://status.claude.com',
73
+ indicator: 'none',
74
+ description: 'All Systems Operational',
75
+ });
76
+ const GITHUB_STATUS_HEALTHY = makeStatuspageStatus({
77
+ pageId: 'kctbh9vrtdwd',
78
+ pageName: 'GitHub',
79
+ pageUrl: 'https://www.githubstatus.com',
80
+ indicator: 'none',
81
+ description: 'All Systems Operational',
82
+ });
83
+ const NPM_STATUS_HEALTHY = makeStatuspageStatus({
84
+ pageId: 'wyvgptkd90hm',
85
+ pageName: 'npm',
86
+ pageUrl: 'https://status.npmjs.org',
87
+ indicator: 'none',
88
+ description: 'All Systems Operational',
89
+ });
90
+ const NPM_SUMMARY_HEALTHY = makeStatuspageSummary({
91
+ pageId: 'wyvgptkd90hm',
92
+ pageName: 'npm',
93
+ pageUrl: 'https://status.npmjs.org',
94
+ indicator: 'none',
95
+ description: 'All Systems Operational',
96
+ components: [
97
+ {
98
+ id: 'mvm98gtxvb9b',
99
+ name: 'www.npmjs.com website',
100
+ status: 'operational',
101
+ position: 1,
102
+ description: 'The ability for users to navigate to or interact with the npm website.',
103
+ },
104
+ {
105
+ id: 'k1wj10x6gmph',
106
+ name: 'Package installation',
107
+ status: 'operational',
108
+ position: 2,
109
+ description: 'The ability for users to read from the registry so that they can install packages.',
110
+ },
111
+ ],
112
+ });
113
+ const CLOUDFLARE_STATUS_HEALTHY = makeStatuspageStatus({
114
+ pageId: 'yh6f0r4529hb',
115
+ pageName: 'Cloudflare',
116
+ pageUrl: 'https://www.cloudflarestatus.com',
117
+ indicator: 'none',
118
+ description: 'All Systems Operational',
119
+ });
120
+ const CLOUDFLARE_SUMMARY_HEALTHY = makeStatuspageSummary({
121
+ pageId: 'yh6f0r4529hb',
122
+ pageName: 'Cloudflare',
123
+ pageUrl: 'https://www.cloudflarestatus.com',
124
+ indicator: 'none',
125
+ description: 'All Systems Operational',
126
+ components: [
127
+ {
128
+ id: '1km35smx8p41',
129
+ name: 'Cloudflare Sites and Services',
130
+ status: 'operational',
131
+ position: 1,
132
+ description: 'Sites and services that Cloudflare customers use to interact with the Cloudflare Network',
133
+ },
134
+ ],
135
+ });
136
+ const POSTHOG_STATUS_HEALTHY = makeStatuspageStatus({
137
+ pageId: 'qf5jlnph3bcy',
138
+ pageName: 'PostHog',
139
+ pageUrl: 'https://status.posthog.com',
140
+ indicator: 'none',
141
+ description: 'All Systems Operational',
142
+ });
143
+ const POSTHOG_SUMMARY_HEALTHY = makeStatuspageSummary({
144
+ pageId: 'qf5jlnph3bcy',
145
+ pageName: 'PostHog',
146
+ pageUrl: 'https://status.posthog.com',
147
+ indicator: 'none',
148
+ description: 'All Systems Operational',
149
+ components: [
150
+ {
151
+ id: 'us-cloud',
152
+ name: 'US Cloud',
153
+ status: 'operational',
154
+ position: 1,
155
+ description: null,
156
+ },
157
+ {
158
+ id: 'eu-cloud',
159
+ name: 'EU Cloud',
160
+ status: 'operational',
161
+ position: 2,
162
+ description: null,
163
+ },
164
+ {
165
+ id: 'posthog-com',
166
+ name: 'PostHog.com',
167
+ status: 'operational',
168
+ position: 3,
169
+ description: null,
170
+ },
171
+ ],
172
+ });
173
+ // LLM Gateway /_liveness response (from posthog/services/llm-gateway/src/llm_gateway/api/health.py)
174
+ const LLM_GATEWAY_LIVENESS_BODY = JSON.stringify({ status: 'alive' });
175
+ // MCP / landing page (from posthog/services/mcp/src/index.ts + src/static/landing.html)
176
+ const MCP_LANDING_HTML = '<!doctype html><html lang="en"><head><title>PostHog MCP Server</title></head><body></body></html>';
177
+ // ---------------------------------------------------------------------------
178
+ // URL constants (must match health-checks.ts)
179
+ // ---------------------------------------------------------------------------
180
+ const URLS = {
181
+ anthropicStatus: 'https://status.claude.com/api/v2/status.json',
182
+ posthogStatus: 'https://www.posthogstatus.com/api/v2/status.json',
183
+ posthogSummary: 'https://www.posthogstatus.com/api/v2/summary.json',
184
+ githubStatus: 'https://www.githubstatus.com/api/v2/status.json',
185
+ npmStatus: 'https://status.npmjs.org/api/v2/status.json',
186
+ npmSummary: 'https://status.npmjs.org/api/v2/summary.json',
187
+ cloudflareStatus: 'https://www.cloudflarestatus.com/api/v2/status.json',
188
+ cloudflareSummary: 'https://www.cloudflarestatus.com/api/v2/summary.json',
189
+ llmGatewayLiveness: 'https://gateway.us.posthog.com/_liveness',
190
+ mcpLanding: 'https://mcp.posthog.com/',
191
+ };
192
+ // ---------------------------------------------------------------------------
193
+ // Helper to build a default "all healthy" fetch mock
194
+ // ---------------------------------------------------------------------------
195
+ const HEALTHY_RESPONSES = {
196
+ [URLS.anthropicStatus]: {
197
+ body: JSON.stringify(ANTHROPIC_STATUS_HEALTHY),
198
+ contentType: 'application/json',
199
+ },
200
+ [URLS.posthogStatus]: {
201
+ body: JSON.stringify(POSTHOG_STATUS_HEALTHY),
202
+ contentType: 'application/json',
203
+ },
204
+ [URLS.posthogSummary]: {
205
+ body: JSON.stringify(POSTHOG_SUMMARY_HEALTHY),
206
+ contentType: 'application/json',
207
+ },
208
+ [URLS.githubStatus]: {
209
+ body: JSON.stringify(GITHUB_STATUS_HEALTHY),
210
+ contentType: 'application/json',
211
+ },
212
+ [URLS.npmStatus]: {
213
+ body: JSON.stringify(NPM_STATUS_HEALTHY),
214
+ contentType: 'application/json',
215
+ },
216
+ [URLS.npmSummary]: {
217
+ body: JSON.stringify(NPM_SUMMARY_HEALTHY),
218
+ contentType: 'application/json',
219
+ },
220
+ [URLS.cloudflareStatus]: {
221
+ body: JSON.stringify(CLOUDFLARE_STATUS_HEALTHY),
222
+ contentType: 'application/json',
223
+ },
224
+ [URLS.cloudflareSummary]: {
225
+ body: JSON.stringify(CLOUDFLARE_SUMMARY_HEALTHY),
226
+ contentType: 'application/json',
227
+ },
228
+ [URLS.llmGatewayLiveness]: {
229
+ body: LLM_GATEWAY_LIVENESS_BODY,
230
+ contentType: 'application/json',
231
+ },
232
+ [URLS.mcpLanding]: {
233
+ body: MCP_LANDING_HTML,
234
+ contentType: 'text/html; charset=utf-8',
235
+ },
236
+ };
237
+ function allHealthyFetchMock(url) {
238
+ const urlStr = typeof url === 'string'
239
+ ? url
240
+ : url instanceof URL
241
+ ? url.toString()
242
+ : url.url;
243
+ const entry = HEALTHY_RESPONSES[urlStr];
244
+ if (entry) {
245
+ return Promise.resolve(new Response(entry.body, {
246
+ status: 200,
247
+ headers: { 'Content-Type': entry.contentType },
248
+ }));
249
+ }
250
+ return Promise.resolve(new Response('Not found', { status: 404 }));
251
+ }
252
+ function overrideFetch(overrides) {
253
+ return (url) => {
254
+ const urlStr = typeof url === 'string'
255
+ ? url
256
+ : url instanceof URL
257
+ ? url.toString()
258
+ : url.url;
259
+ if (overrides[urlStr])
260
+ return overrides[urlStr]();
261
+ return allHealthyFetchMock(urlStr);
262
+ };
263
+ }
264
+ // ---------------------------------------------------------------------------
265
+ // Tests
266
+ // ---------------------------------------------------------------------------
267
+ describe('health-checks', () => {
268
+ const originalFetch = global.fetch;
269
+ beforeEach(() => {
270
+ jest.restoreAllMocks();
271
+ global.fetch = jest.fn(allHealthyFetchMock);
272
+ });
273
+ afterAll(() => {
274
+ global.fetch = originalFetch;
275
+ });
276
+ // -----------------------------------------------------------------------
277
+ // Statuspage status.json checks (indicator-based)
278
+ // -----------------------------------------------------------------------
279
+ describe('checkAnthropicHealth', () => {
280
+ it('returns healthy for indicator=none ("All Systems Operational")', async () => {
281
+ const result = await (0, index_1.checkAnthropicHealth)();
282
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Healthy);
283
+ expect(result.rawIndicator).toBe('none');
284
+ });
285
+ it('returns degraded for indicator=minor ("Minor Service Outage")', async () => {
286
+ const body = makeStatuspageStatus({
287
+ pageId: 'tymt9n04zgry',
288
+ pageName: 'Claude',
289
+ pageUrl: 'https://status.claude.com',
290
+ indicator: 'minor',
291
+ description: 'Minor Service Outage',
292
+ });
293
+ global.fetch.mockImplementation(overrideFetch({
294
+ [URLS.anthropicStatus]: () => Promise.resolve(new Response(JSON.stringify(body), { status: 200 })),
295
+ }));
296
+ const result = await (0, index_1.checkAnthropicHealth)();
297
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Degraded);
298
+ expect(result.rawIndicator).toBe('minor');
299
+ });
300
+ it('returns down for indicator=major ("Partial System Outage")', async () => {
301
+ const body = makeStatuspageStatus({
302
+ pageId: 'tymt9n04zgry',
303
+ pageName: 'Claude',
304
+ pageUrl: 'https://status.claude.com',
305
+ indicator: 'major',
306
+ description: 'Partial System Outage',
307
+ });
308
+ global.fetch.mockImplementation(overrideFetch({
309
+ [URLS.anthropicStatus]: () => Promise.resolve(new Response(JSON.stringify(body), { status: 200 })),
310
+ }));
311
+ const result = await (0, index_1.checkAnthropicHealth)();
312
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Down);
313
+ });
314
+ it('returns down for indicator=critical ("Major Service Outage")', async () => {
315
+ const body = makeStatuspageStatus({
316
+ pageId: 'tymt9n04zgry',
317
+ pageName: 'Claude',
318
+ pageUrl: 'https://status.claude.com',
319
+ indicator: 'critical',
320
+ description: 'Major Service Outage',
321
+ });
322
+ global.fetch.mockImplementation(overrideFetch({
323
+ [URLS.anthropicStatus]: () => Promise.resolve(new Response(JSON.stringify(body), { status: 200 })),
324
+ }));
325
+ const result = await (0, index_1.checkAnthropicHealth)();
326
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Down);
327
+ });
328
+ it('returns degraded when statuspage returns HTTP 500', async () => {
329
+ global.fetch.mockImplementation(overrideFetch({
330
+ [URLS.anthropicStatus]: () => Promise.resolve(new Response('Internal Server Error', { status: 500 })),
331
+ }));
332
+ const result = await (0, index_1.checkAnthropicHealth)();
333
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Degraded);
334
+ expect(result.error).toBe('HTTP 500');
335
+ });
336
+ it('returns degraded when fetch throws (network failure)', async () => {
337
+ global.fetch.mockImplementation(overrideFetch({
338
+ [URLS.anthropicStatus]: () => Promise.reject(new Error('getaddrinfo ENOTFOUND status.claude.com')),
339
+ }));
340
+ const result = await (0, index_1.checkAnthropicHealth)();
341
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Degraded);
342
+ expect(result.error).toBe('getaddrinfo ENOTFOUND status.claude.com');
343
+ });
344
+ });
345
+ describe('checkPosthogOverallHealth', () => {
346
+ it('returns healthy for indicator=none', async () => {
347
+ const result = await (0, index_1.checkPosthogOverallHealth)();
348
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Healthy);
349
+ expect(result.rawIndicator).toBe('none');
350
+ });
351
+ });
352
+ describe('checkGithubHealth', () => {
353
+ it('returns healthy for indicator=none', async () => {
354
+ const result = await (0, index_1.checkGithubHealth)();
355
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Healthy);
356
+ });
357
+ });
358
+ describe('checkNpmOverallHealth', () => {
359
+ it('returns healthy for indicator=none', async () => {
360
+ const result = await (0, index_1.checkNpmOverallHealth)();
361
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Healthy);
362
+ });
363
+ });
364
+ describe('checkCloudflareOverallHealth', () => {
365
+ it('returns healthy for indicator=none', async () => {
366
+ const result = await (0, index_1.checkCloudflareOverallHealth)();
367
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Healthy);
368
+ });
369
+ it('returns degraded for indicator=minor', async () => {
370
+ const body = makeStatuspageStatus({
371
+ pageId: 'yh6f0r4529hb',
372
+ pageName: 'Cloudflare',
373
+ pageUrl: 'https://www.cloudflarestatus.com',
374
+ indicator: 'minor',
375
+ description: 'Minor Service Outage',
376
+ });
377
+ global.fetch.mockImplementation(overrideFetch({
378
+ [URLS.cloudflareStatus]: () => Promise.resolve(new Response(JSON.stringify(body), { status: 200 })),
379
+ }));
380
+ const result = await (0, index_1.checkCloudflareOverallHealth)();
381
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Degraded);
382
+ });
383
+ });
384
+ // -----------------------------------------------------------------------
385
+ // Statuspage summary.json checks (component-based)
386
+ // -----------------------------------------------------------------------
387
+ describe('checkPosthogComponentHealth', () => {
388
+ it('reports all operational when every component is operational', async () => {
389
+ const result = await (0, index_1.checkPosthogComponentHealth)();
390
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Healthy);
391
+ expect(result.degradedOrDownComponents).toBeUndefined();
392
+ });
393
+ it('reports degraded when a component has partial_outage', async () => {
394
+ const body = makeStatuspageSummary({
395
+ pageId: 'qf5jlnph3bcy',
396
+ pageName: 'PostHog',
397
+ pageUrl: 'https://status.posthog.com',
398
+ indicator: 'major',
399
+ description: 'Partial System Outage',
400
+ components: [
401
+ {
402
+ id: 'us-cloud',
403
+ name: 'US Cloud',
404
+ status: 'partial_outage',
405
+ position: 1,
406
+ description: null,
407
+ },
408
+ {
409
+ id: 'eu-cloud',
410
+ name: 'EU Cloud',
411
+ status: 'operational',
412
+ position: 2,
413
+ description: null,
414
+ },
415
+ ],
416
+ });
417
+ global.fetch.mockImplementation(overrideFetch({
418
+ [URLS.posthogSummary]: () => Promise.resolve(new Response(JSON.stringify(body), { status: 200 })),
419
+ }));
420
+ const result = await (0, index_1.checkPosthogComponentHealth)();
421
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Degraded);
422
+ expect(result.degradedOrDownComponents).toHaveLength(1);
423
+ expect(result.degradedOrDownComponents[0].name).toBe('US Cloud');
424
+ expect(result.degradedOrDownComponents[0].rawStatus).toBe('partial_outage');
425
+ expect(result.degradedOrDownComponents[0].status).toBe(index_1.ServiceHealthStatus.Down);
426
+ });
427
+ it('reports degraded when a component has degraded_performance', async () => {
428
+ const body = makeStatuspageSummary({
429
+ pageId: 'qf5jlnph3bcy',
430
+ pageName: 'PostHog',
431
+ pageUrl: 'https://status.posthog.com',
432
+ indicator: 'minor',
433
+ description: 'Degraded System Performance',
434
+ components: [
435
+ {
436
+ id: 'us-cloud',
437
+ name: 'US Cloud',
438
+ status: 'degraded_performance',
439
+ position: 1,
440
+ description: null,
441
+ },
442
+ {
443
+ id: 'eu-cloud',
444
+ name: 'EU Cloud',
445
+ status: 'operational',
446
+ position: 2,
447
+ description: null,
448
+ },
449
+ ],
450
+ });
451
+ global.fetch.mockImplementation(overrideFetch({
452
+ [URLS.posthogSummary]: () => Promise.resolve(new Response(JSON.stringify(body), { status: 200 })),
453
+ }));
454
+ const result = await (0, index_1.checkPosthogComponentHealth)();
455
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Degraded);
456
+ expect(result.degradedOrDownComponents[0].rawStatus).toBe('degraded_performance');
457
+ expect(result.degradedOrDownComponents[0].status).toBe(index_1.ServiceHealthStatus.Degraded);
458
+ });
459
+ it('reports degraded when a component has major_outage', async () => {
460
+ const body = makeStatuspageSummary({
461
+ pageId: 'qf5jlnph3bcy',
462
+ pageName: 'PostHog',
463
+ pageUrl: 'https://status.posthog.com',
464
+ indicator: 'critical',
465
+ description: 'Major Service Outage',
466
+ components: [
467
+ {
468
+ id: 'us-cloud',
469
+ name: 'US Cloud',
470
+ status: 'major_outage',
471
+ position: 1,
472
+ description: null,
473
+ },
474
+ {
475
+ id: 'eu-cloud',
476
+ name: 'EU Cloud',
477
+ status: 'major_outage',
478
+ position: 2,
479
+ description: null,
480
+ },
481
+ ],
482
+ });
483
+ global.fetch.mockImplementation(overrideFetch({
484
+ [URLS.posthogSummary]: () => Promise.resolve(new Response(JSON.stringify(body), { status: 200 })),
485
+ }));
486
+ const result = await (0, index_1.checkPosthogComponentHealth)();
487
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Degraded);
488
+ expect(result.degradedOrDownComponents).toHaveLength(2);
489
+ expect(result.degradedOrDownComponents[0].status).toBe(index_1.ServiceHealthStatus.Down);
490
+ });
491
+ it('handles under_maintenance as degraded', async () => {
492
+ const body = makeStatuspageSummary({
493
+ pageId: 'qf5jlnph3bcy',
494
+ pageName: 'PostHog',
495
+ pageUrl: 'https://status.posthog.com',
496
+ indicator: 'minor',
497
+ description: 'Scheduled Maintenance',
498
+ components: [
499
+ {
500
+ id: 'us-cloud',
501
+ name: 'US Cloud',
502
+ status: 'under_maintenance',
503
+ position: 1,
504
+ description: null,
505
+ },
506
+ ],
507
+ });
508
+ global.fetch.mockImplementation(overrideFetch({
509
+ [URLS.posthogSummary]: () => Promise.resolve(new Response(JSON.stringify(body), { status: 200 })),
510
+ }));
511
+ const result = await (0, index_1.checkPosthogComponentHealth)();
512
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Degraded);
513
+ expect(result.degradedOrDownComponents[0].status).toBe(index_1.ServiceHealthStatus.Degraded);
514
+ });
515
+ });
516
+ describe('checkNpmComponentHealth', () => {
517
+ it('reports healthy when all npm components operational', async () => {
518
+ const result = await (0, index_1.checkNpmComponentHealth)();
519
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Healthy);
520
+ });
521
+ it('reports degraded when "Package installation" has partial_outage', async () => {
522
+ const body = makeStatuspageSummary({
523
+ pageId: 'wyvgptkd90hm',
524
+ pageName: 'npm',
525
+ pageUrl: 'https://status.npmjs.org',
526
+ indicator: 'major',
527
+ description: 'Partial System Outage',
528
+ components: [
529
+ {
530
+ id: 'mvm98gtxvb9b',
531
+ name: 'www.npmjs.com website',
532
+ status: 'operational',
533
+ position: 1,
534
+ description: null,
535
+ },
536
+ {
537
+ id: 'k1wj10x6gmph',
538
+ name: 'Package installation',
539
+ status: 'partial_outage',
540
+ position: 2,
541
+ description: null,
542
+ },
543
+ ],
544
+ });
545
+ global.fetch.mockImplementation(overrideFetch({
546
+ [URLS.npmSummary]: () => Promise.resolve(new Response(JSON.stringify(body), { status: 200 })),
547
+ }));
548
+ const result = await (0, index_1.checkNpmComponentHealth)();
549
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Degraded);
550
+ expect(result.degradedOrDownComponents[0].name).toBe('Package installation');
551
+ });
552
+ });
553
+ describe('checkCloudflareComponentHealth', () => {
554
+ it('reports healthy when Cloudflare components operational', async () => {
555
+ const result = await (0, index_1.checkCloudflareComponentHealth)();
556
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Healthy);
557
+ });
558
+ });
559
+ // -----------------------------------------------------------------------
560
+ // LLM Gateway (fetchEndpointHealth – /_liveness)
561
+ // -----------------------------------------------------------------------
562
+ describe('checkLlmGatewayHealth', () => {
563
+ it('returns healthy when gateway responds 200 with {"status":"alive"}', async () => {
564
+ const result = await (0, index_1.checkLlmGatewayHealth)();
565
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Healthy);
566
+ expect(result.rawIndicator).toBe('HTTP 200');
567
+ expect(global.fetch).toHaveBeenCalledWith(URLS.llmGatewayLiveness, expect.objectContaining({ signal: expect.any(AbortSignal) }));
568
+ });
569
+ it('returns down when gateway responds 503 (e.g. deploying)', async () => {
570
+ global.fetch.mockImplementation(overrideFetch({
571
+ [URLS.llmGatewayLiveness]: () => Promise.resolve(new Response('Service Unavailable', { status: 503 })),
572
+ }));
573
+ const result = await (0, index_1.checkLlmGatewayHealth)();
574
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Down);
575
+ expect(result.error).toBe('HTTP 503');
576
+ });
577
+ it('returns down when gateway responds 502 (bad gateway)', async () => {
578
+ global.fetch.mockImplementation(overrideFetch({
579
+ [URLS.llmGatewayLiveness]: () => Promise.resolve(new Response('Bad Gateway', { status: 502 })),
580
+ }));
581
+ const result = await (0, index_1.checkLlmGatewayHealth)();
582
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Down);
583
+ expect(result.error).toBe('HTTP 502');
584
+ });
585
+ it('returns down on DNS resolution failure', async () => {
586
+ global.fetch.mockImplementation(overrideFetch({
587
+ [URLS.llmGatewayLiveness]: () => Promise.reject(new Error('getaddrinfo ENOTFOUND gateway.us.posthog.com')),
588
+ }));
589
+ const result = await (0, index_1.checkLlmGatewayHealth)();
590
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Down);
591
+ expect(result.error).toBe('getaddrinfo ENOTFOUND gateway.us.posthog.com');
592
+ });
593
+ it('returns down on timeout (AbortError)', async () => {
594
+ const abortError = new Error('The operation was aborted.');
595
+ abortError.name = 'AbortError';
596
+ global.fetch.mockImplementation(overrideFetch({
597
+ [URLS.llmGatewayLiveness]: () => Promise.reject(abortError),
598
+ }));
599
+ const result = await (0, index_1.checkLlmGatewayHealth)();
600
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Down);
601
+ expect(result.error).toBe('Request timed out');
602
+ });
603
+ });
604
+ // -----------------------------------------------------------------------
605
+ // MCP (fetchEndpointHealth – / landing)
606
+ // -----------------------------------------------------------------------
607
+ describe('checkMcpHealth', () => {
608
+ it('returns healthy when MCP worker responds 200 with landing HTML', async () => {
609
+ const result = await (0, index_1.checkMcpHealth)();
610
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Healthy);
611
+ expect(result.rawIndicator).toBe('HTTP 200');
612
+ expect(global.fetch).toHaveBeenCalledWith(URLS.mcpLanding, expect.objectContaining({ signal: expect.any(AbortSignal) }));
613
+ });
614
+ it('returns down when worker responds 500', async () => {
615
+ global.fetch.mockImplementation(overrideFetch({
616
+ [URLS.mcpLanding]: () => Promise.resolve(new Response('Internal Server Error', { status: 500 })),
617
+ }));
618
+ const result = await (0, index_1.checkMcpHealth)();
619
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Down);
620
+ expect(result.error).toBe('HTTP 500');
621
+ });
622
+ it('returns down when Cloudflare returns 522 (connection timed out)', async () => {
623
+ global.fetch.mockImplementation(overrideFetch({
624
+ [URLS.mcpLanding]: () => Promise.resolve(new Response('', { status: 522 })),
625
+ }));
626
+ const result = await (0, index_1.checkMcpHealth)();
627
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Down);
628
+ expect(result.error).toBe('HTTP 522');
629
+ });
630
+ it('returns down on network failure', async () => {
631
+ global.fetch.mockImplementation(overrideFetch({
632
+ [URLS.mcpLanding]: () => Promise.reject(new Error('fetch failed')),
633
+ }));
634
+ const result = await (0, index_1.checkMcpHealth)();
635
+ expect(result.status).toBe(index_1.ServiceHealthStatus.Down);
636
+ expect(result.error).toBe('fetch failed');
637
+ });
638
+ });
639
+ // -----------------------------------------------------------------------
640
+ // checkAllExternalServices
641
+ // -----------------------------------------------------------------------
642
+ describe('checkAllExternalServices', () => {
643
+ it('returns all 10 service keys when everything is healthy', async () => {
644
+ const health = await (0, index_1.checkAllExternalServices)();
645
+ const keys = Object.keys(health);
646
+ expect(keys).toEqual(expect.arrayContaining([
647
+ 'anthropic',
648
+ 'posthogOverall',
649
+ 'posthogComponents',
650
+ 'github',
651
+ 'npmOverall',
652
+ 'npmComponents',
653
+ 'cloudflareOverall',
654
+ 'cloudflareComponents',
655
+ 'llmGateway',
656
+ 'mcp',
657
+ ]));
658
+ expect(keys).toHaveLength(10);
659
+ for (const val of Object.values(health)) {
660
+ expect(val.status).toBe(index_1.ServiceHealthStatus.Healthy);
661
+ }
662
+ });
663
+ it('fires all 10 fetch calls in parallel', async () => {
664
+ await (0, index_1.checkAllExternalServices)();
665
+ const calledUrls = global.fetch.mock.calls.map((c) => typeof c[0] === 'string' ? c[0] : c[0].toString());
666
+ expect(calledUrls).toHaveLength(10);
667
+ expect(calledUrls).toContain(URLS.llmGatewayLiveness);
668
+ expect(calledUrls).toContain(URLS.mcpLanding);
669
+ });
670
+ });
671
+ // -----------------------------------------------------------------------
672
+ // evaluateWizardReadiness
673
+ // -----------------------------------------------------------------------
674
+ describe('evaluateWizardReadiness', () => {
675
+ it('returns Yes when all services are healthy', async () => {
676
+ const result = await (0, index_1.evaluateWizardReadiness)(index_1.DEFAULT_WIZARD_READINESS_CONFIG);
677
+ expect(result.decision).toBe(index_1.WizardReadiness.Yes);
678
+ });
679
+ it('returns No when Anthropic is degraded (degradedBlocksRun)', async () => {
680
+ const body = makeStatuspageStatus({
681
+ pageId: 'tymt9n04zgry',
682
+ pageName: 'Claude',
683
+ pageUrl: 'https://status.claude.com',
684
+ indicator: 'minor',
685
+ description: 'Minor Service Outage',
686
+ });
687
+ global.fetch.mockImplementation(overrideFetch({
688
+ [URLS.anthropicStatus]: () => Promise.resolve(new Response(JSON.stringify(body), { status: 200 })),
689
+ }));
690
+ const result = await (0, index_1.evaluateWizardReadiness)(index_1.DEFAULT_WIZARD_READINESS_CONFIG);
691
+ expect(result.decision).toBe(index_1.WizardReadiness.No);
692
+ expect(result.health.anthropic.status).toBe(index_1.ServiceHealthStatus.Degraded);
693
+ });
694
+ it('returns No when LLM Gateway is down (downBlocksRun)', async () => {
695
+ global.fetch.mockImplementation(overrideFetch({
696
+ [URLS.llmGatewayLiveness]: () => Promise.resolve(new Response('Service Unavailable', { status: 503 })),
697
+ }));
698
+ const result = await (0, index_1.evaluateWizardReadiness)(index_1.DEFAULT_WIZARD_READINESS_CONFIG);
699
+ expect(result.decision).toBe(index_1.WizardReadiness.No);
700
+ expect(result.health.llmGateway.status).toBe(index_1.ServiceHealthStatus.Down);
701
+ });
702
+ it('returns No when MCP is down (downBlocksRun)', async () => {
703
+ global.fetch.mockImplementation(overrideFetch({
704
+ [URLS.mcpLanding]: () => Promise.resolve(new Response('Bad Gateway', { status: 502 })),
705
+ }));
706
+ const result = await (0, index_1.evaluateWizardReadiness)(index_1.DEFAULT_WIZARD_READINESS_CONFIG);
707
+ expect(result.decision).toBe(index_1.WizardReadiness.No);
708
+ expect(result.health.mcp.status).toBe(index_1.ServiceHealthStatus.Down);
709
+ });
710
+ it('returns No when npm overall is down (downBlocksRun)', async () => {
711
+ const body = makeStatuspageStatus({
712
+ pageId: 'wyvgptkd90hm',
713
+ pageName: 'npm',
714
+ pageUrl: 'https://status.npmjs.org',
715
+ indicator: 'critical',
716
+ description: 'Major Service Outage',
717
+ });
718
+ global.fetch.mockImplementation(overrideFetch({
719
+ [URLS.npmStatus]: () => Promise.resolve(new Response(JSON.stringify(body), { status: 200 })),
720
+ }));
721
+ const result = await (0, index_1.evaluateWizardReadiness)(index_1.DEFAULT_WIZARD_READINESS_CONFIG);
722
+ expect(result.decision).toBe(index_1.WizardReadiness.No);
723
+ expect(result.health.npmOverall.status).toBe(index_1.ServiceHealthStatus.Down);
724
+ });
725
+ it('returns YesWithWarnings when a non-blocking service is degraded', async () => {
726
+ const body = makeStatuspageStatus({
727
+ pageId: 'yh6f0r4529hb',
728
+ pageName: 'Cloudflare',
729
+ pageUrl: 'https://www.cloudflarestatus.com',
730
+ indicator: 'minor',
731
+ description: 'Minor Service Outage',
732
+ });
733
+ global.fetch.mockImplementation(overrideFetch({
734
+ [URLS.cloudflareStatus]: () => Promise.resolve(new Response(JSON.stringify(body), { status: 200 })),
735
+ }));
736
+ const result = await (0, index_1.evaluateWizardReadiness)(index_1.DEFAULT_WIZARD_READINESS_CONFIG);
737
+ expect(result.decision).toBe(index_1.WizardReadiness.YesWithWarnings);
738
+ });
739
+ it('includes human-readable reasons for every service', async () => {
740
+ const result = await (0, index_1.evaluateWizardReadiness)(index_1.DEFAULT_WIZARD_READINESS_CONFIG);
741
+ expect(result.reasons.length).toBeGreaterThan(0);
742
+ expect(result.reasons.some((r) => r.includes('Anthropic'))).toBe(true);
743
+ expect(result.reasons.some((r) => r.includes('PostHog'))).toBe(true);
744
+ expect(result.reasons.some((r) => r.includes('GitHub'))).toBe(true);
745
+ expect(result.reasons.some((r) => r.includes('npm'))).toBe(true);
746
+ expect(result.reasons.some((r) => r.includes('Cloudflare'))).toBe(true);
747
+ expect(result.reasons.some((r) => r.includes('LLM Gateway'))).toBe(true);
748
+ expect(result.reasons.some((r) => r.includes('MCP'))).toBe(true);
749
+ });
750
+ });
751
+ });
752
+ //# sourceMappingURL=health-checks.test.js.map