@posthog/wizard 2.1.0 → 2.3.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 (93) hide show
  1. package/dist/bin.js +5 -0
  2. package/dist/bin.js.map +1 -1
  3. package/dist/src/__tests__/run.test.js +4 -2
  4. package/dist/src/__tests__/run.test.js.map +1 -1
  5. package/dist/src/lib/__tests__/agent-interface.test.js +2 -1
  6. package/dist/src/lib/__tests__/agent-interface.test.js.map +1 -1
  7. package/dist/src/lib/agent-interface.d.ts +2 -1
  8. package/dist/src/lib/agent-interface.js +35 -13
  9. package/dist/src/lib/agent-interface.js.map +1 -1
  10. package/dist/src/lib/agent-runner.js +26 -22
  11. package/dist/src/lib/agent-runner.js.map +1 -1
  12. package/dist/src/lib/commandments.js +2 -1
  13. package/dist/src/lib/commandments.js.map +1 -1
  14. package/dist/src/lib/constants.d.ts +1 -1
  15. package/dist/src/lib/health-checks/__tests__/health-checks.test.js +11 -4
  16. package/dist/src/lib/health-checks/__tests__/health-checks.test.js.map +1 -1
  17. package/dist/src/lib/health-checks/endpoints.d.ts +1 -0
  18. package/dist/src/lib/health-checks/endpoints.js +3 -1
  19. package/dist/src/lib/health-checks/endpoints.js.map +1 -1
  20. package/dist/src/lib/health-checks/index.d.ts +1 -1
  21. package/dist/src/lib/health-checks/index.js +2 -1
  22. package/dist/src/lib/health-checks/index.js.map +1 -1
  23. package/dist/src/lib/health-checks/readiness.d.ts +5 -0
  24. package/dist/src/lib/health-checks/readiness.js +89 -20
  25. package/dist/src/lib/health-checks/readiness.js.map +1 -1
  26. package/dist/src/lib/health-checks/types.d.ts +1 -0
  27. package/dist/src/lib/health-checks/types.js.map +1 -1
  28. package/dist/src/lib/version.d.ts +1 -1
  29. package/dist/src/lib/version.js +1 -1
  30. package/dist/src/lib/version.js.map +1 -1
  31. package/dist/src/lib/wizard-session.d.ts +3 -4
  32. package/dist/src/lib/wizard-session.js +2 -1
  33. package/dist/src/lib/wizard-session.js.map +1 -1
  34. package/dist/src/lib/wizard-tools.d.ts +24 -0
  35. package/dist/src/lib/wizard-tools.js +151 -2
  36. package/dist/src/lib/wizard-tools.js.map +1 -1
  37. package/dist/src/ui/logging-ui.d.ts +2 -4
  38. package/dist/src/ui/logging-ui.js +12 -4
  39. package/dist/src/ui/logging-ui.js.map +1 -1
  40. package/dist/src/ui/tui/__tests__/store.test.js +81 -29
  41. package/dist/src/ui/tui/__tests__/store.test.js.map +1 -1
  42. package/dist/src/ui/tui/components/ServiceHealthList.d.ts +15 -0
  43. package/dist/src/ui/tui/components/ServiceHealthList.js +57 -0
  44. package/dist/src/ui/tui/components/ServiceHealthList.js.map +1 -0
  45. package/dist/src/ui/tui/flows.d.ts +1 -0
  46. package/dist/src/ui/tui/flows.js +12 -0
  47. package/dist/src/ui/tui/flows.js.map +1 -1
  48. package/dist/src/ui/tui/ink-ui.d.ts +2 -4
  49. package/dist/src/ui/tui/ink-ui.js +8 -4
  50. package/dist/src/ui/tui/ink-ui.js.map +1 -1
  51. package/dist/src/ui/tui/playground/PlaygroundApp.js +12 -0
  52. package/dist/src/ui/tui/playground/PlaygroundApp.js.map +1 -1
  53. package/dist/src/ui/tui/playground/demos/HealthCheckDemo.d.ts +11 -0
  54. package/dist/src/ui/tui/playground/demos/HealthCheckDemo.js +57 -0
  55. package/dist/src/ui/tui/playground/demos/HealthCheckDemo.js.map +1 -0
  56. package/dist/src/ui/tui/playground/demos/ModalDemo.d.ts +6 -0
  57. package/dist/src/ui/tui/playground/demos/ModalDemo.js +13 -0
  58. package/dist/src/ui/tui/playground/demos/ModalDemo.js.map +1 -0
  59. package/dist/src/ui/tui/primitives/ModalOverlay.d.ts +25 -0
  60. package/dist/src/ui/tui/primitives/ModalOverlay.js +7 -0
  61. package/dist/src/ui/tui/primitives/ModalOverlay.js.map +1 -0
  62. package/dist/src/ui/tui/primitives/ProgressList.js +3 -1
  63. package/dist/src/ui/tui/primitives/ProgressList.js.map +1 -1
  64. package/dist/src/ui/tui/primitives/index.d.ts +1 -0
  65. package/dist/src/ui/tui/primitives/index.js +1 -0
  66. package/dist/src/ui/tui/primitives/index.js.map +1 -1
  67. package/dist/src/ui/tui/router.d.ts +0 -1
  68. package/dist/src/ui/tui/router.js +0 -1
  69. package/dist/src/ui/tui/router.js.map +1 -1
  70. package/dist/src/ui/tui/screen-registry.js +2 -2
  71. package/dist/src/ui/tui/screen-registry.js.map +1 -1
  72. package/dist/src/ui/tui/screens/PortConflictScreen.js +13 -13
  73. package/dist/src/ui/tui/screens/PortConflictScreen.js.map +1 -1
  74. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +8 -8
  75. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js.map +1 -1
  76. package/dist/src/ui/tui/screens/health/HealthCheckScreen.d.ts +14 -0
  77. package/dist/src/ui/tui/screens/health/HealthCheckScreen.js +77 -0
  78. package/dist/src/ui/tui/screens/health/HealthCheckScreen.js.map +1 -0
  79. package/dist/src/ui/tui/store.d.ts +15 -5
  80. package/dist/src/ui/tui/store.js +47 -3
  81. package/dist/src/ui/tui/store.js.map +1 -1
  82. package/dist/src/ui/wizard-ui.d.ts +4 -5
  83. package/dist/src/ui/wizard-ui.js.map +1 -1
  84. package/dist/src/utils/__tests__/semver.test.js +45 -3
  85. package/dist/src/utils/__tests__/semver.test.js.map +1 -1
  86. package/dist/src/utils/__tests__/setup-utils.test.js +2 -1
  87. package/dist/src/utils/__tests__/setup-utils.test.js.map +1 -1
  88. package/dist/src/utils/semver.js +25 -0
  89. package/dist/src/utils/semver.js.map +1 -1
  90. package/package.json +2 -2
  91. package/dist/src/ui/tui/screens/OutageScreen.d.ts +0 -10
  92. package/dist/src/ui/tui/screens/OutageScreen.js +0 -17
  93. package/dist/src/ui/tui/screens/OutageScreen.js.map +0 -1
@@ -188,6 +188,7 @@ const URLS = {
188
188
  cloudflareSummary: 'https://www.cloudflarestatus.com/api/v2/summary.json',
189
189
  llmGatewayLiveness: 'https://gateway.us.posthog.com/_liveness',
190
190
  mcpLanding: 'https://mcp.posthog.com/',
191
+ githubReleasesSkillMenu: 'https://github.com/PostHog/context-mill/releases/latest/download/skill-menu.json',
191
192
  };
192
193
  // ---------------------------------------------------------------------------
193
194
  // Helper to build a default "all healthy" fetch mock
@@ -233,6 +234,10 @@ const HEALTHY_RESPONSES = {
233
234
  body: MCP_LANDING_HTML,
234
235
  contentType: 'text/html; charset=utf-8',
235
236
  },
237
+ [URLS.githubReleasesSkillMenu]: {
238
+ body: JSON.stringify({ categories: { integration: [] } }),
239
+ contentType: 'application/json',
240
+ },
236
241
  };
237
242
  function allHealthyFetchMock(url) {
238
243
  const urlStr = typeof url === 'string'
@@ -640,7 +645,7 @@ describe('health-checks', () => {
640
645
  // checkAllExternalServices
641
646
  // -----------------------------------------------------------------------
642
647
  describe('checkAllExternalServices', () => {
643
- it('returns all 10 service keys when everything is healthy', async () => {
648
+ it('returns all 11 service keys when everything is healthy', async () => {
644
649
  const health = await (0, index_1.checkAllExternalServices)();
645
650
  const keys = Object.keys(health);
646
651
  expect(keys).toEqual(expect.arrayContaining([
@@ -654,18 +659,20 @@ describe('health-checks', () => {
654
659
  'cloudflareComponents',
655
660
  'llmGateway',
656
661
  'mcp',
662
+ 'githubReleases',
657
663
  ]));
658
- expect(keys).toHaveLength(10);
664
+ expect(keys).toHaveLength(11);
659
665
  for (const val of Object.values(health)) {
660
666
  expect(val.status).toBe(index_1.ServiceHealthStatus.Healthy);
661
667
  }
662
668
  });
663
- it('fires all 10 fetch calls in parallel', async () => {
669
+ it('fires all 11 fetch calls in parallel', async () => {
664
670
  await (0, index_1.checkAllExternalServices)();
665
671
  const calledUrls = global.fetch.mock.calls.map((c) => typeof c[0] === 'string' ? c[0] : c[0].toString());
666
- expect(calledUrls).toHaveLength(10);
672
+ expect(calledUrls).toHaveLength(11);
667
673
  expect(calledUrls).toContain(URLS.llmGatewayLiveness);
668
674
  expect(calledUrls).toContain(URLS.mcpLanding);
675
+ expect(calledUrls).toContain(URLS.githubReleasesSkillMenu);
669
676
  });
670
677
  });
671
678
  // -----------------------------------------------------------------------
@@ -1 +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"]}
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 githubReleasesSkillMenu:\n 'https://github.com/PostHog/context-mill/releases/latest/download/skill-menu.json',\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 [URLS.githubReleasesSkillMenu]: {\n body: JSON.stringify({ categories: { integration: [] } }),\n contentType: 'application/json',\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 11 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 'githubReleases',\n ]),\n );\n expect(keys).toHaveLength(11);\n for (const val of Object.values(health)) {\n expect(val.status).toBe(ServiceHealthStatus.Healthy);\n }\n });\n\n it('fires all 11 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(11);\n expect(calledUrls).toContain(URLS.llmGatewayLiveness);\n expect(calledUrls).toContain(URLS.mcpLanding);\n expect(calledUrls).toContain(URLS.githubReleasesSkillMenu);\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"]}
@@ -1,3 +1,4 @@
1
1
  import { type BaseHealthResult } from './types';
2
2
  export declare const checkLlmGatewayHealth: () => Promise<BaseHealthResult>;
3
3
  export declare const checkMcpHealth: () => Promise<BaseHealthResult>;
4
+ export declare const checkGithubReleasesHealth: () => Promise<BaseHealthResult>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.checkMcpHealth = exports.checkLlmGatewayHealth = void 0;
3
+ exports.checkGithubReleasesHealth = exports.checkMcpHealth = exports.checkLlmGatewayHealth = void 0;
4
4
  const types_1 = require("./types");
5
5
  // ---------------------------------------------------------------------------
6
6
  // Direct endpoint health checks
@@ -43,4 +43,6 @@ const checkLlmGatewayHealth = () => fetchEndpointHealth('https://gateway.us.post
43
43
  exports.checkLlmGatewayHealth = checkLlmGatewayHealth;
44
44
  const checkMcpHealth = () => fetchEndpointHealth('https://mcp.posthog.com/');
45
45
  exports.checkMcpHealth = checkMcpHealth;
46
+ const checkGithubReleasesHealth = () => fetchEndpointHealth('https://github.com/PostHog/context-mill/releases/latest/download/skill-menu.json');
47
+ exports.checkGithubReleasesHealth = checkGithubReleasesHealth;
46
48
  //# sourceMappingURL=endpoints.js.map
@@ -1 +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"]}
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;AAE3C,MAAM,yBAAyB,GAAG,GAA8B,EAAE,CACvE,mBAAmB,CACjB,kFAAkF,CACnF,CAAC;AAHS,QAAA,yBAAyB,6BAGlC","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\nexport const checkGithubReleasesHealth = (): Promise<BaseHealthResult> =>\n fetchEndpointHealth(\n 'https://github.com/PostHog/context-mill/releases/latest/download/skill-menu.json',\n );\n"]}
@@ -1,4 +1,4 @@
1
1
  export { ServiceHealthStatus, type BaseHealthResult, type ComponentStatus, type ComponentHealthResult, type AllServicesHealth, type HealthCheckKey, } from './types';
2
2
  export { checkAnthropicHealth, checkPosthogOverallHealth, checkPosthogComponentHealth, checkGithubHealth, checkNpmOverallHealth, checkNpmComponentHealth, checkCloudflareOverallHealth, checkCloudflareComponentHealth, } from './statuspage';
3
- export { checkLlmGatewayHealth, checkMcpHealth } from './endpoints';
3
+ export { checkLlmGatewayHealth, checkMcpHealth, checkGithubReleasesHealth, } from './endpoints';
4
4
  export { type WizardReadinessConfig, DEFAULT_WIZARD_READINESS_CONFIG, checkAllExternalServices, WizardReadiness, type WizardReadinessResult, evaluateWizardReadiness, } from './readiness';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
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;
3
+ exports.evaluateWizardReadiness = exports.WizardReadiness = exports.checkAllExternalServices = exports.DEFAULT_WIZARD_READINESS_CONFIG = exports.checkGithubReleasesHealth = 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
4
  var types_1 = require("./types");
5
5
  Object.defineProperty(exports, "ServiceHealthStatus", { enumerable: true, get: function () { return types_1.ServiceHealthStatus; } });
6
6
  var statuspage_1 = require("./statuspage");
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "checkCloudflareComponentHealth", { enumerable: t
15
15
  var endpoints_1 = require("./endpoints");
16
16
  Object.defineProperty(exports, "checkLlmGatewayHealth", { enumerable: true, get: function () { return endpoints_1.checkLlmGatewayHealth; } });
17
17
  Object.defineProperty(exports, "checkMcpHealth", { enumerable: true, get: function () { return endpoints_1.checkMcpHealth; } });
18
+ Object.defineProperty(exports, "checkGithubReleasesHealth", { enumerable: true, get: function () { return endpoints_1.checkGithubReleasesHealth; } });
18
19
  var readiness_1 = require("./readiness");
19
20
  Object.defineProperty(exports, "DEFAULT_WIZARD_READINESS_CONFIG", { enumerable: true, get: function () { return readiness_1.DEFAULT_WIZARD_READINESS_CONFIG; } });
20
21
  Object.defineProperty(exports, "checkAllExternalServices", { enumerable: true, get: function () { return readiness_1.checkAllExternalServices; } });
@@ -1 +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"]}
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,yCAIqB;AAHnB,kHAAA,qBAAqB,OAAA;AACrB,2GAAA,cAAc,OAAA;AACd,sHAAA,yBAAyB,OAAA;AAG3B,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 {\n checkLlmGatewayHealth,\n checkMcpHealth,\n checkGithubReleasesHealth,\n} 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"]}
@@ -1,4 +1,5 @@
1
1
  import { type AllServicesHealth, type HealthCheckKey } from './types';
2
+ export declare const SERVICE_LABELS: Record<HealthCheckKey, string>;
2
3
  export interface WizardReadinessConfig {
3
4
  /** Services where status=Down blocks the run (readiness=No). */
4
5
  downBlocksRun: HealthCheckKey[];
@@ -22,3 +23,7 @@ export interface WizardReadinessResult {
22
23
  reasons: string[];
23
24
  }
24
25
  export declare function evaluateWizardReadiness(config?: WizardReadinessConfig): Promise<WizardReadinessResult>;
26
+ /**
27
+ * Get the keys of services that would block a wizard run per the given config.
28
+ */
29
+ export declare function getBlockingServiceKeys(health: AllServicesHealth, config?: WizardReadinessConfig): HealthCheckKey[];
@@ -1,15 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WizardReadiness = exports.DEFAULT_WIZARD_READINESS_CONFIG = void 0;
3
+ exports.WizardReadiness = exports.DEFAULT_WIZARD_READINESS_CONFIG = exports.SERVICE_LABELS = void 0;
4
4
  exports.checkAllExternalServices = checkAllExternalServices;
5
5
  exports.evaluateWizardReadiness = evaluateWizardReadiness;
6
+ exports.getBlockingServiceKeys = getBlockingServiceKeys;
6
7
  const types_1 = require("./types");
7
8
  const statuspage_1 = require("./statuspage");
8
9
  const endpoints_1 = require("./endpoints");
10
+ const debug_1 = require("../../utils/debug");
9
11
  // ---------------------------------------------------------------------------
10
12
  // Service labels (used in human-readable reason strings)
11
13
  // ---------------------------------------------------------------------------
12
- const SERVICE_LABELS = {
14
+ exports.SERVICE_LABELS = {
13
15
  anthropic: 'Anthropic',
14
16
  posthogOverall: 'PostHog',
15
17
  posthogComponents: 'PostHog (components)',
@@ -20,6 +22,7 @@ const SERVICE_LABELS = {
20
22
  cloudflareComponents: 'Cloudflare (components)',
21
23
  llmGateway: 'LLM Gateway',
22
24
  mcp: 'MCP',
25
+ githubReleases: 'GitHub Releases',
23
26
  };
24
27
  /**
25
28
  * See README section "Health checks" for the full rationale.
@@ -32,6 +35,7 @@ exports.DEFAULT_WIZARD_READINESS_CONFIG = {
32
35
  'npmOverall',
33
36
  'llmGateway',
34
37
  'mcp',
38
+ 'githubReleases',
35
39
  ],
36
40
  degradedBlocksRun: ['anthropic'],
37
41
  };
@@ -39,7 +43,7 @@ exports.DEFAULT_WIZARD_READINESS_CONFIG = {
39
43
  // Aggregate check
40
44
  // ---------------------------------------------------------------------------
41
45
  async function checkAllExternalServices() {
42
- const [anthropic, posthogOverall, posthogComponents, github, npmOverall, npmComponents, cloudflareOverall, cloudflareComponents, llmGateway, mcp,] = await Promise.all([
46
+ const [anthropic, posthogOverall, posthogComponents, github, npmOverall, npmComponents, cloudflareOverall, cloudflareComponents, llmGateway, mcp, githubReleases,] = await Promise.all([
43
47
  (0, statuspage_1.checkAnthropicHealth)(),
44
48
  (0, statuspage_1.checkPosthogOverallHealth)(),
45
49
  (0, statuspage_1.checkPosthogComponentHealth)(),
@@ -50,6 +54,7 @@ async function checkAllExternalServices() {
50
54
  (0, statuspage_1.checkCloudflareComponentHealth)(),
51
55
  (0, endpoints_1.checkLlmGatewayHealth)(),
52
56
  (0, endpoints_1.checkMcpHealth)(),
57
+ (0, endpoints_1.checkGithubReleasesHealth)(),
53
58
  ]);
54
59
  return {
55
60
  anthropic,
@@ -62,6 +67,7 @@ async function checkAllExternalServices() {
62
67
  cloudflareComponents,
63
68
  llmGateway,
64
69
  mcp,
70
+ githubReleases,
65
71
  };
66
72
  }
67
73
  // ---------------------------------------------------------------------------
@@ -94,26 +100,89 @@ function describeComponents(label, h) {
94
100
  : '';
95
101
  return `${label} components impacted: ${shown.join(', ')}${suffix}`;
96
102
  }
103
+ const READINESS_TIMEOUT_MS = 10_000;
97
104
  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));
105
+ try {
106
+ const health = await Promise.race([
107
+ checkAllExternalServices(),
108
+ new Promise((resolve) => setTimeout(() => resolve(allUnknown('Health check timed out')), READINESS_TIMEOUT_MS)),
109
+ ]);
110
+ const reasons = [];
111
+ for (const key of Object.keys(health)) {
112
+ const result = health[key];
113
+ const label = exports.SERVICE_LABELS[key];
114
+ reasons.push(describeResult(label, result));
115
+ if ('degradedOrDownComponents' in result) {
116
+ reasons.push(describeComponents(label, result));
117
+ }
106
118
  }
119
+ const blockingKeys = getBlockingServiceKeys(health, config);
120
+ if (blockingKeys.length > 0) {
121
+ (0, debug_1.logToFile)(`[health-checks] blocked by: ${blockingKeys.join(', ')}`);
122
+ return { decision: WizardReadiness.No, health, reasons };
123
+ }
124
+ const hasWarnings = Object.values(health).some((h) => h.status !== types_1.ServiceHealthStatus.Healthy);
125
+ if (hasWarnings) {
126
+ return { decision: WizardReadiness.YesWithWarnings, health, reasons };
127
+ }
128
+ return { decision: WizardReadiness.Yes, health, reasons };
107
129
  }
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 };
130
+ catch (err) {
131
+ (0, debug_1.logToFile)(`[health-checks] error: ${err instanceof Error ? err.message : err}`);
132
+ // Health checks must never block the wizard run
133
+ return {
134
+ decision: WizardReadiness.Yes,
135
+ health: allUnknown('Unexpected error'),
136
+ reasons: ['Health check failed unexpectedly — proceeding anyway'],
137
+ };
116
138
  }
117
- return { decision: WizardReadiness.Yes, health, reasons };
139
+ }
140
+ // ---------------------------------------------------------------------------
141
+ // Blocking service detection
142
+ // ---------------------------------------------------------------------------
143
+ /** Keys that are component-level detail, not top-level services. */
144
+ const COMPONENT_KEYS = [
145
+ 'posthogComponents',
146
+ 'npmComponents',
147
+ 'cloudflareComponents',
148
+ ];
149
+ /**
150
+ * Get the keys of services that would block a wizard run per the given config.
151
+ */
152
+ function getBlockingServiceKeys(health, config = exports.DEFAULT_WIZARD_READINESS_CONFIG) {
153
+ return Object.keys(health).filter((key) => {
154
+ if (COMPONENT_KEYS.includes(key))
155
+ return false;
156
+ const result = health[key];
157
+ if (config.downBlocksRun.includes(key) &&
158
+ result.status === types_1.ServiceHealthStatus.Down) {
159
+ return true;
160
+ }
161
+ if ((config.degradedBlocksRun ?? []).includes(key) &&
162
+ result.status !== types_1.ServiceHealthStatus.Healthy) {
163
+ return true;
164
+ }
165
+ return false;
166
+ });
167
+ }
168
+ /** Build an AllServicesHealth where every service is Degraded with the given error. */
169
+ function allUnknown(error) {
170
+ const base = {
171
+ status: types_1.ServiceHealthStatus.Degraded,
172
+ error,
173
+ };
174
+ return {
175
+ anthropic: base,
176
+ posthogOverall: base,
177
+ posthogComponents: { ...base },
178
+ github: base,
179
+ npmOverall: base,
180
+ npmComponents: { ...base },
181
+ cloudflareOverall: base,
182
+ cloudflareComponents: { ...base },
183
+ llmGateway: base,
184
+ mcp: base,
185
+ githubReleases: base,
186
+ };
118
187
  }
119
188
  //# sourceMappingURL=readiness.js.map