@posthog/wizard 2.2.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.
- package/dist/src/lib/agent-runner.js +4 -4
- package/dist/src/lib/agent-runner.js.map +1 -1
- package/dist/src/lib/constants.d.ts +1 -1
- package/dist/src/lib/health-checks/__tests__/health-checks.test.js +11 -4
- package/dist/src/lib/health-checks/__tests__/health-checks.test.js.map +1 -1
- package/dist/src/lib/health-checks/endpoints.d.ts +1 -0
- package/dist/src/lib/health-checks/endpoints.js +3 -1
- package/dist/src/lib/health-checks/endpoints.js.map +1 -1
- package/dist/src/lib/health-checks/index.d.ts +1 -1
- package/dist/src/lib/health-checks/index.js +2 -1
- package/dist/src/lib/health-checks/index.js.map +1 -1
- package/dist/src/lib/health-checks/readiness.js +12 -3
- package/dist/src/lib/health-checks/readiness.js.map +1 -1
- package/dist/src/lib/health-checks/types.d.ts +1 -0
- package/dist/src/lib/health-checks/types.js.map +1 -1
- package/dist/src/lib/version.d.ts +1 -1
- package/dist/src/lib/version.js +1 -1
- package/dist/src/lib/version.js.map +1 -1
- package/dist/src/lib/wizard-tools.d.ts +22 -0
- package/dist/src/lib/wizard-tools.js +71 -39
- package/dist/src/lib/wizard-tools.js.map +1 -1
- package/dist/src/ui/tui/playground/demos/HealthCheckDemo.js +1 -0
- package/dist/src/ui/tui/playground/demos/HealthCheckDemo.js.map +1 -1
- package/dist/src/ui/tui/screens/health/HealthCheckScreen.js +50 -5
- package/dist/src/ui/tui/screens/health/HealthCheckScreen.js.map +1 -1
- package/dist/src/utils/__tests__/semver.test.js +45 -3
- package/dist/src/utils/__tests__/semver.test.js.map +1 -1
- package/dist/src/utils/semver.js +25 -0
- package/dist/src/utils/semver.js.map +1 -1
- package/package.json +1 -1
|
@@ -97,6 +97,10 @@ async function runAgentWizard(config, session) {
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
|
+
// Compute skills server URL (needed for agent tool calls)
|
|
101
|
+
const skillsBaseUrl = session.localMcp
|
|
102
|
+
? 'http://localhost:8765'
|
|
103
|
+
: 'https://github.com/PostHog/context-mill/releases/latest/download';
|
|
100
104
|
// Check all external service health (skip if TUI already ran it in bin.ts)
|
|
101
105
|
if (!session.readinessResult) {
|
|
102
106
|
(0, debug_1.logToFile)('[agent-runner] evaluating wizard readiness');
|
|
@@ -185,10 +189,6 @@ async function runAgentWizard(config, session) {
|
|
|
185
189
|
(cloudRegion === 'eu'
|
|
186
190
|
? 'https://mcp-eu.posthog.com/mcp'
|
|
187
191
|
: 'https://mcp.posthog.com/mcp');
|
|
188
|
-
// Skills server URL (context-mill dev server or GitHub releases)
|
|
189
|
-
const skillsBaseUrl = session.localMcp
|
|
190
|
-
? 'http://localhost:8765'
|
|
191
|
-
: 'https://github.com/PostHog/context-mill/releases/latest/download';
|
|
192
192
|
const restoreSettings = () => (0, agent_interface_1.restoreClaudeSettings)(session.installDir);
|
|
193
193
|
(0, ui_1.getUI)().onEnterScreen('outro', restoreSettings);
|
|
194
194
|
// Register YARA report as cleanup so it fires on any exit path (including wizardAbort)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../../src/lib/agent-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DEFAULT_PACKAGE_INSTALLATION,\n SPINNER_MESSAGE,\n type FrameworkConfig,\n} from './framework-config';\nimport { type WizardSession, OutroKind } from './wizard-session';\nimport {\n tryGetPackageJson,\n isUsingTypeScript,\n getOrAskForProjectData,\n} from '../utils/setup-utils';\nimport type { PackageDotJson } from '../utils/package-json';\nimport type { WizardOptions } from '../utils/types';\nimport { WIZARD_INTERACTION_EVENT_NAME } from './constants';\nimport { analytics } from '../utils/analytics';\nimport { getUI } from '../ui';\nimport {\n initializeAgent,\n runAgent,\n AgentSignals,\n AgentErrorType,\n buildWizardMetadata,\n checkClaudeSettingsOverrides,\n backupAndFixClaudeSettings,\n restoreClaudeSettings,\n} from './agent-interface';\nimport { getCloudUrlFromRegion } from '../utils/urls';\n\nimport * as semver from 'semver';\nimport {\n evaluateWizardReadiness,\n WizardReadiness,\n} from './health-checks/readiness';\nimport { enableDebugLogs, initLogFile, logToFile } from '../utils/debug';\nimport { createBenchmarkPipeline } from './middleware/benchmark';\nimport {\n wizardAbort,\n WizardError,\n registerCleanup,\n} from '../utils/wizard-abort';\nimport { formatScanReport, writeScanReport } from './yara-hooks';\n\n/**\n * Build a WizardOptions bag from a WizardSession (for code that still expects WizardOptions).\n */\nfunction sessionToOptions(session: WizardSession): WizardOptions {\n return {\n installDir: session.installDir,\n debug: session.debug,\n forceInstall: session.forceInstall,\n default: false,\n signup: session.signup,\n localMcp: session.localMcp,\n ci: session.ci,\n menu: session.menu,\n benchmark: session.benchmark,\n projectId: session.projectId,\n apiKey: session.apiKey,\n yaraReport: session.yaraReport,\n };\n}\n\n/**\n * Universal agent-powered wizard runner.\n * Handles the complete flow for any framework using PostHog MCP integration.\n *\n * All user decisions come from the session — no UI prompts.\n */\nexport async function runAgentWizard(\n config: FrameworkConfig,\n session: WizardSession,\n): Promise<void> {\n initLogFile();\n logToFile(`[agent-runner] START integration=${config.metadata.integration}`);\n\n if (session.debug) {\n enableDebugLogs();\n }\n\n // Version check\n if (config.detection.minimumVersion && config.detection.getInstalledVersion) {\n logToFile('[agent-runner] checking version');\n const version = await config.detection.getInstalledVersion(\n sessionToOptions(session),\n );\n if (version) {\n logToFile(\n `[agent-runner] version=${version} minimum=${config.detection.minimumVersion}`,\n );\n const coerced = semver.coerce(version);\n if (coerced && semver.lt(coerced, config.detection.minimumVersion)) {\n const docsUrl =\n config.metadata.unsupportedVersionDocsUrl ?? config.metadata.docsUrl;\n await wizardAbort({\n message:\n `Sorry: the wizard can't help you with ${config.metadata.name} ${version}. ` +\n `Upgrade to ${config.metadata.name} ${config.detection.minimumVersion} or later, ` +\n `or check out the manual setup guide.\\n\\n` +\n `Setup ${config.metadata.name} manually: ${docsUrl}`,\n });\n }\n }\n }\n\n // Check all external service health (skip if TUI already ran it in bin.ts)\n if (!session.readinessResult) {\n logToFile('[agent-runner] evaluating wizard readiness');\n const readiness = await evaluateWizardReadiness();\n logToFile(`[agent-runner] readiness=${readiness.decision}`);\n if (readiness.decision === WizardReadiness.No) {\n await getUI().showBlockingOutage(readiness);\n } else if (readiness.decision === WizardReadiness.YesWithWarnings) {\n getUI().setReadinessWarnings(readiness);\n }\n }\n\n // Check for blocking env overrides in .claude/settings.json before login.\n const blockingOverrideKeys = checkClaudeSettingsOverrides(session.installDir);\n logToFile(\n `[agent-runner] settings overrides: ${\n blockingOverrideKeys.length > 0 ? blockingOverrideKeys.join(', ') : 'none'\n }`,\n );\n if (blockingOverrideKeys.length > 0) {\n await getUI().showSettingsOverride(blockingOverrideKeys, () =>\n backupAndFixClaudeSettings(session.installDir),\n );\n logToFile('[agent-runner] settings override resolved');\n }\n\n const typeScriptDetected = isUsingTypeScript({\n installDir: session.installDir,\n });\n session.typescript = typeScriptDetected;\n\n // Framework detection and version\n const usesPackageJson = config.detection.usesPackageJson !== false;\n let packageJson: PackageDotJson | null = null;\n let frameworkVersion: string | undefined;\n\n if (usesPackageJson) {\n packageJson = await tryGetPackageJson({ installDir: session.installDir });\n if (packageJson) {\n const { hasPackageInstalled } = await import('../utils/package-json.js');\n if (!hasPackageInstalled(config.detection.packageName, packageJson)) {\n getUI().log.warn(\n `${config.detection.packageDisplayName} does not seem to be installed. Continuing anyway — the agent will handle it.`,\n );\n }\n frameworkVersion = config.detection.getVersion(packageJson);\n } else {\n getUI().log.warn(\n 'Could not find package.json. Continuing anyway — the agent will handle it.',\n );\n }\n } else {\n frameworkVersion = config.detection.getVersion(null);\n }\n\n // Set analytics tags for framework version\n if (frameworkVersion && config.detection.getVersionBucket) {\n const versionBucket = config.detection.getVersionBucket(frameworkVersion);\n analytics.setTag(`${config.metadata.integration}-version`, versionBucket);\n }\n\n analytics.wizardCapture('agent started', {\n integration: config.metadata.integration,\n });\n\n // Get PostHog credentials (region auto-detected from token)\n logToFile('[agent-runner] starting OAuth');\n const { projectApiKey, host, accessToken, projectId, cloudRegion } =\n await getOrAskForProjectData({\n signup: session.signup,\n ci: session.ci,\n apiKey: session.apiKey,\n projectId: session.projectId,\n });\n\n session.credentials = { accessToken, projectApiKey, host, projectId };\n\n // Notify TUI that credentials are available (resolves past AuthScreen)\n getUI().setCredentials(session.credentials);\n\n // Framework context was already gathered by SetupScreen + detection\n const frameworkContext = session.frameworkContext;\n\n // Set analytics tags from framework context\n const contextTags = config.analytics.getTags(frameworkContext);\n Object.entries(contextTags).forEach(([key, value]) => {\n analytics.setTag(key, value);\n });\n\n const integrationPrompt = buildIntegrationPrompt(\n config,\n {\n frameworkVersion: frameworkVersion || 'latest',\n typescript: typeScriptDetected,\n projectApiKey,\n host,\n projectId,\n },\n frameworkContext,\n );\n\n // Initialize and run agent\n const spinner = getUI().spinner();\n\n // Evaluate all feature flags at the start of the run so they can be sent to the LLM gateway\n const wizardFlags = await analytics.getAllFlagsForWizard();\n const wizardMetadata = buildWizardMetadata(wizardFlags);\n\n // Determine MCP URL: CLI flag > env var > production default\n const mcpUrl = session.localMcp\n ? 'http://localhost:8787/mcp'\n : process.env.MCP_URL ||\n (cloudRegion === 'eu'\n ? 'https://mcp-eu.posthog.com/mcp'\n : 'https://mcp.posthog.com/mcp');\n\n // Skills server URL (context-mill dev server or GitHub releases)\n const skillsBaseUrl = session.localMcp\n ? 'http://localhost:8765'\n : 'https://github.com/PostHog/context-mill/releases/latest/download';\n\n const restoreSettings = () => restoreClaudeSettings(session.installDir);\n getUI().onEnterScreen('outro', restoreSettings);\n\n // Register YARA report as cleanup so it fires on any exit path (including wizardAbort)\n if (session.yaraReport) {\n registerCleanup(() => {\n const reportPath = writeScanReport();\n if (reportPath) {\n const summary = formatScanReport();\n getUI().log.info(`YARA scan report: ${reportPath}${summary ?? ''}`);\n }\n });\n }\n\n getUI().startRun();\n\n const agent = await initializeAgent(\n {\n workingDirectory: session.installDir,\n posthogMcpUrl: mcpUrl,\n posthogApiKey: accessToken,\n posthogApiHost: host,\n additionalMcpServers: config.metadata.additionalMcpServers,\n detectPackageManager: config.detection.detectPackageManager,\n skillsBaseUrl,\n wizardFlags,\n wizardMetadata,\n },\n sessionToOptions(session),\n );\n\n const middleware = session.benchmark\n ? createBenchmarkPipeline(spinner, sessionToOptions(session))\n : undefined;\n\n const agentResult = await runAgent(\n agent,\n integrationPrompt,\n sessionToOptions(session),\n spinner,\n {\n estimatedDurationMinutes: config.ui.estimatedDurationMinutes,\n spinnerMessage: SPINNER_MESSAGE,\n successMessage: config.ui.successMessage,\n errorMessage: 'Integration failed',\n additionalFeatureQueue: session.additionalFeatureQueue,\n },\n middleware,\n );\n\n // Handle error cases detected in agent output\n if (agentResult.error === AgentErrorType.MCP_MISSING) {\n await wizardAbort({\n message: `Could not access the PostHog MCP server\\n\\nThe wizard was unable to connect to the PostHog MCP server.\\nThis could be due to a network issue or a configuration problem.\\n\\nPlease try again, or set up ${config.metadata.name} manually by following our documentation:\\n${config.metadata.docsUrl}`,\n error: new WizardError('Agent could not access PostHog MCP server', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.MCP_MISSING,\n signal: AgentSignals.ERROR_MCP_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.RESOURCE_MISSING) {\n await wizardAbort({\n message: `Could not access the setup resource\\n\\nThe wizard could not access the setup resource. This may indicate a version mismatch or a temporary service issue.\\n\\nPlease try again, or set up ${config.metadata.name} manually by following our documentation:\\n${config.metadata.docsUrl}`,\n error: new WizardError('Agent could not access setup resource', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.RESOURCE_MISSING,\n signal: AgentSignals.ERROR_RESOURCE_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.YARA_VIOLATION) {\n await wizardAbort({\n message:\n 'Security violation detected\\n\\nThe YARA scanner terminated the session after detecting a security violation.\\nThis may indicate prompt injection, poisoned skill files, or a policy breach.\\n\\nPlease report this to: wizard@posthog.com',\n error: new WizardError('YARA scanner terminated session', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.YARA_VIOLATION,\n }),\n });\n }\n\n if (\n agentResult.error === AgentErrorType.RATE_LIMIT ||\n agentResult.error === AgentErrorType.API_ERROR\n ) {\n analytics.wizardCapture('agent api error', {\n integration: config.metadata.integration,\n error_type: agentResult.error,\n error_message: agentResult.message,\n });\n\n await wizardAbort({\n message: `API Error\\n\\n${\n agentResult.message || 'Unknown error'\n }\\n\\nPlease report this error to: wizard@posthog.com`,\n error: new WizardError(`API error: ${agentResult.message}`, {\n integration: config.metadata.integration,\n error_type: agentResult.error,\n }),\n });\n }\n\n // Build environment variables from OAuth credentials\n const envVars = config.environment.getEnvVars(projectApiKey, host);\n\n // Upload environment variables to hosting providers (auto-accept)\n let uploadedEnvVars: string[] = [];\n if (config.environment.uploadToHosting) {\n const { uploadEnvironmentVariablesStep } = await import(\n '../steps/index.js'\n );\n uploadedEnvVars = await uploadEnvironmentVariablesStep(envVars, {\n integration: config.metadata.integration,\n session,\n });\n if (uploadedEnvVars.length > 0) {\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'wizard_env_vars_uploaded',\n integration: config.metadata.integration,\n variable_count: uploadedEnvVars.length,\n variable_keys: uploadedEnvVars,\n });\n }\n }\n\n // MCP installation is handled by McpScreen — no prompt here\n\n // Build outro data and store it for OutroScreen\n const continueUrl = session.signup\n ? `${getCloudUrlFromRegion(cloudRegion)}/products?source=wizard`\n : undefined;\n\n const changes = [\n ...config.ui.getOutroChanges(frameworkContext),\n Object.keys(envVars).length > 0\n ? `Added environment variables to .env file`\n : '',\n uploadedEnvVars.length > 0\n ? `Uploaded environment variables to your hosting provider`\n : '',\n ].filter(Boolean);\n\n session.outroData = {\n kind: OutroKind.Success,\n changes,\n docsUrl: config.metadata.docsUrl,\n continueUrl,\n };\n\n getUI().outro(`Successfully installed PostHog!`);\n\n await analytics.shutdown('success');\n}\n\n/**\n * Build the integration prompt for the agent.\n */\nfunction buildIntegrationPrompt(\n config: FrameworkConfig,\n context: {\n frameworkVersion: string;\n typescript: boolean;\n projectApiKey: string;\n host: string;\n projectId: number;\n },\n frameworkContext: Record<string, unknown>,\n): string {\n const additionalLines = config.prompts.getAdditionalContextLines\n ? config.prompts.getAdditionalContextLines(frameworkContext)\n : [];\n\n const additionalContext =\n additionalLines.length > 0\n ? '\\n' + additionalLines.map((line) => `- ${line}`).join('\\n')\n : '';\n\n return `You have access to the PostHog MCP server which provides skills to integrate PostHog into this ${\n config.metadata.name\n } project.\n\nProject context:\n- PostHog Project ID: ${context.projectId}\n- Framework: ${config.metadata.name} ${context.frameworkVersion}\n- TypeScript: ${context.typescript ? 'Yes' : 'No'}\n- PostHog public token: ${context.projectApiKey}\n- PostHog Host: ${context.host}\n- Project type: ${config.prompts.projectTypeDetection}\n- Package installation: ${\n config.prompts.packageInstallation ?? DEFAULT_PACKAGE_INSTALLATION\n }${additionalContext}\n\nInstructions (follow these steps IN ORDER - do not skip or reorder):\n\nSTEP 1: Call load_skill_menu (from the wizard-tools MCP server) to see available skills.\n If the tool fails, emit: ${\n AgentSignals.ERROR_MCP_MISSING\n } Could not load skill menu and halt.\n\n Choose a skill from the \\`integration\\` category that matches this project's framework. Do NOT pick skills from other categories (llm-analytics, error-tracking, feature-flags, omnibus, etc.) — those are handled separately.\n If no suitable integration skill is found, emit: ${\n AgentSignals.ERROR_RESOURCE_MISSING\n } Could not find a suitable skill for this project.\n\nSTEP 2: Call install_skill (from the wizard-tools MCP server) with the chosen skill ID (e.g., \"integration-nextjs-app-router\").\n Do NOT run any shell commands to install skills.\n\nSTEP 3: Load the installed skill's SKILL.md file to understand what references are available.\n\nSTEP 4: Follow the skill's workflow files in sequence. Look for numbered workflow files in the references (e.g., files with patterns like \"1.0-\", \"1.1-\", \"1.2-\"). Start with the first one and proceed through each step until completion. Each workflow file will tell you what to do and which file comes next. Never directly write PostHog tokens directly to code files; always use environment variables.\n\nSTEP 5: Set up environment variables for PostHog using the wizard-tools MCP server (this runs locally — secret values never leave the machine):\n - Use check_env_keys to see which keys already exist in the project's .env file (e.g. .env.local or .env).\n - Use set_env_values to create or update the PostHog public token and host, using the appropriate environment variable naming convention for ${\n config.metadata.name\n }, which you'll find in example code. The tool will also ensure .gitignore coverage. Don't assume the presence of keys means the value is up to date. Write the correct value each time.\n - Reference these environment variables in the code files you create instead of hardcoding the public token and host.\n\nImportant: Use the detect_package_manager tool (from the wizard-tools MCP server) to determine which package manager the project uses. Do not manually search for lockfiles or config files. Always install packages as a background task. Don't await completion; proceed with other work immediately after starting the installation. You must read a file immediately before attempting to write it, even if you have previously read it; failure to do so will cause a tool failure.\n\n\n`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../../src/lib/agent-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DEFAULT_PACKAGE_INSTALLATION,\n SPINNER_MESSAGE,\n type FrameworkConfig,\n} from './framework-config';\nimport { type WizardSession, OutroKind } from './wizard-session';\nimport {\n tryGetPackageJson,\n isUsingTypeScript,\n getOrAskForProjectData,\n} from '../utils/setup-utils';\nimport type { PackageDotJson } from '../utils/package-json';\nimport type { WizardOptions } from '../utils/types';\nimport { WIZARD_INTERACTION_EVENT_NAME } from './constants';\nimport { analytics } from '../utils/analytics';\nimport { getUI } from '../ui';\nimport {\n initializeAgent,\n runAgent,\n AgentSignals,\n AgentErrorType,\n buildWizardMetadata,\n checkClaudeSettingsOverrides,\n backupAndFixClaudeSettings,\n restoreClaudeSettings,\n} from './agent-interface';\nimport { getCloudUrlFromRegion } from '../utils/urls';\n\nimport * as semver from 'semver';\nimport {\n evaluateWizardReadiness,\n WizardReadiness,\n} from './health-checks/readiness';\nimport { enableDebugLogs, initLogFile, logToFile } from '../utils/debug';\nimport { createBenchmarkPipeline } from './middleware/benchmark';\nimport {\n wizardAbort,\n WizardError,\n registerCleanup,\n} from '../utils/wizard-abort';\nimport { formatScanReport, writeScanReport } from './yara-hooks';\n\n/**\n * Build a WizardOptions bag from a WizardSession (for code that still expects WizardOptions).\n */\nfunction sessionToOptions(session: WizardSession): WizardOptions {\n return {\n installDir: session.installDir,\n debug: session.debug,\n forceInstall: session.forceInstall,\n default: false,\n signup: session.signup,\n localMcp: session.localMcp,\n ci: session.ci,\n menu: session.menu,\n benchmark: session.benchmark,\n projectId: session.projectId,\n apiKey: session.apiKey,\n yaraReport: session.yaraReport,\n };\n}\n\n/**\n * Universal agent-powered wizard runner.\n * Handles the complete flow for any framework using PostHog MCP integration.\n *\n * All user decisions come from the session — no UI prompts.\n */\nexport async function runAgentWizard(\n config: FrameworkConfig,\n session: WizardSession,\n): Promise<void> {\n initLogFile();\n logToFile(`[agent-runner] START integration=${config.metadata.integration}`);\n\n if (session.debug) {\n enableDebugLogs();\n }\n\n // Version check\n if (config.detection.minimumVersion && config.detection.getInstalledVersion) {\n logToFile('[agent-runner] checking version');\n const version = await config.detection.getInstalledVersion(\n sessionToOptions(session),\n );\n if (version) {\n logToFile(\n `[agent-runner] version=${version} minimum=${config.detection.minimumVersion}`,\n );\n const coerced = semver.coerce(version);\n if (coerced && semver.lt(coerced, config.detection.minimumVersion)) {\n const docsUrl =\n config.metadata.unsupportedVersionDocsUrl ?? config.metadata.docsUrl;\n await wizardAbort({\n message:\n `Sorry: the wizard can't help you with ${config.metadata.name} ${version}. ` +\n `Upgrade to ${config.metadata.name} ${config.detection.minimumVersion} or later, ` +\n `or check out the manual setup guide.\\n\\n` +\n `Setup ${config.metadata.name} manually: ${docsUrl}`,\n });\n }\n }\n }\n\n // Compute skills server URL (needed for agent tool calls)\n const skillsBaseUrl = session.localMcp\n ? 'http://localhost:8765'\n : 'https://github.com/PostHog/context-mill/releases/latest/download';\n\n // Check all external service health (skip if TUI already ran it in bin.ts)\n if (!session.readinessResult) {\n logToFile('[agent-runner] evaluating wizard readiness');\n const readiness = await evaluateWizardReadiness();\n logToFile(`[agent-runner] readiness=${readiness.decision}`);\n if (readiness.decision === WizardReadiness.No) {\n await getUI().showBlockingOutage(readiness);\n } else if (readiness.decision === WizardReadiness.YesWithWarnings) {\n getUI().setReadinessWarnings(readiness);\n }\n }\n\n // Check for blocking env overrides in .claude/settings.json before login.\n const blockingOverrideKeys = checkClaudeSettingsOverrides(session.installDir);\n logToFile(\n `[agent-runner] settings overrides: ${\n blockingOverrideKeys.length > 0 ? blockingOverrideKeys.join(', ') : 'none'\n }`,\n );\n if (blockingOverrideKeys.length > 0) {\n await getUI().showSettingsOverride(blockingOverrideKeys, () =>\n backupAndFixClaudeSettings(session.installDir),\n );\n logToFile('[agent-runner] settings override resolved');\n }\n\n const typeScriptDetected = isUsingTypeScript({\n installDir: session.installDir,\n });\n session.typescript = typeScriptDetected;\n\n // Framework detection and version\n const usesPackageJson = config.detection.usesPackageJson !== false;\n let packageJson: PackageDotJson | null = null;\n let frameworkVersion: string | undefined;\n\n if (usesPackageJson) {\n packageJson = await tryGetPackageJson({ installDir: session.installDir });\n if (packageJson) {\n const { hasPackageInstalled } = await import('../utils/package-json.js');\n if (!hasPackageInstalled(config.detection.packageName, packageJson)) {\n getUI().log.warn(\n `${config.detection.packageDisplayName} does not seem to be installed. Continuing anyway — the agent will handle it.`,\n );\n }\n frameworkVersion = config.detection.getVersion(packageJson);\n } else {\n getUI().log.warn(\n 'Could not find package.json. Continuing anyway — the agent will handle it.',\n );\n }\n } else {\n frameworkVersion = config.detection.getVersion(null);\n }\n\n // Set analytics tags for framework version\n if (frameworkVersion && config.detection.getVersionBucket) {\n const versionBucket = config.detection.getVersionBucket(frameworkVersion);\n analytics.setTag(`${config.metadata.integration}-version`, versionBucket);\n }\n\n analytics.wizardCapture('agent started', {\n integration: config.metadata.integration,\n });\n\n // Get PostHog credentials (region auto-detected from token)\n logToFile('[agent-runner] starting OAuth');\n const { projectApiKey, host, accessToken, projectId, cloudRegion } =\n await getOrAskForProjectData({\n signup: session.signup,\n ci: session.ci,\n apiKey: session.apiKey,\n projectId: session.projectId,\n });\n\n session.credentials = { accessToken, projectApiKey, host, projectId };\n\n // Notify TUI that credentials are available (resolves past AuthScreen)\n getUI().setCredentials(session.credentials);\n\n // Framework context was already gathered by SetupScreen + detection\n const frameworkContext = session.frameworkContext;\n\n // Set analytics tags from framework context\n const contextTags = config.analytics.getTags(frameworkContext);\n Object.entries(contextTags).forEach(([key, value]) => {\n analytics.setTag(key, value);\n });\n\n const integrationPrompt = buildIntegrationPrompt(\n config,\n {\n frameworkVersion: frameworkVersion || 'latest',\n typescript: typeScriptDetected,\n projectApiKey,\n host,\n projectId,\n },\n frameworkContext,\n );\n\n // Initialize and run agent\n const spinner = getUI().spinner();\n\n // Evaluate all feature flags at the start of the run so they can be sent to the LLM gateway\n const wizardFlags = await analytics.getAllFlagsForWizard();\n const wizardMetadata = buildWizardMetadata(wizardFlags);\n\n // Determine MCP URL: CLI flag > env var > production default\n const mcpUrl = session.localMcp\n ? 'http://localhost:8787/mcp'\n : process.env.MCP_URL ||\n (cloudRegion === 'eu'\n ? 'https://mcp-eu.posthog.com/mcp'\n : 'https://mcp.posthog.com/mcp');\n\n const restoreSettings = () => restoreClaudeSettings(session.installDir);\n getUI().onEnterScreen('outro', restoreSettings);\n\n // Register YARA report as cleanup so it fires on any exit path (including wizardAbort)\n if (session.yaraReport) {\n registerCleanup(() => {\n const reportPath = writeScanReport();\n if (reportPath) {\n const summary = formatScanReport();\n getUI().log.info(`YARA scan report: ${reportPath}${summary ?? ''}`);\n }\n });\n }\n\n getUI().startRun();\n\n const agent = await initializeAgent(\n {\n workingDirectory: session.installDir,\n posthogMcpUrl: mcpUrl,\n posthogApiKey: accessToken,\n posthogApiHost: host,\n additionalMcpServers: config.metadata.additionalMcpServers,\n detectPackageManager: config.detection.detectPackageManager,\n skillsBaseUrl,\n wizardFlags,\n wizardMetadata,\n },\n sessionToOptions(session),\n );\n\n const middleware = session.benchmark\n ? createBenchmarkPipeline(spinner, sessionToOptions(session))\n : undefined;\n\n const agentResult = await runAgent(\n agent,\n integrationPrompt,\n sessionToOptions(session),\n spinner,\n {\n estimatedDurationMinutes: config.ui.estimatedDurationMinutes,\n spinnerMessage: SPINNER_MESSAGE,\n successMessage: config.ui.successMessage,\n errorMessage: 'Integration failed',\n additionalFeatureQueue: session.additionalFeatureQueue,\n },\n middleware,\n );\n\n // Handle error cases detected in agent output\n if (agentResult.error === AgentErrorType.MCP_MISSING) {\n await wizardAbort({\n message: `Could not access the PostHog MCP server\\n\\nThe wizard was unable to connect to the PostHog MCP server.\\nThis could be due to a network issue or a configuration problem.\\n\\nPlease try again, or set up ${config.metadata.name} manually by following our documentation:\\n${config.metadata.docsUrl}`,\n error: new WizardError('Agent could not access PostHog MCP server', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.MCP_MISSING,\n signal: AgentSignals.ERROR_MCP_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.RESOURCE_MISSING) {\n await wizardAbort({\n message: `Could not access the setup resource\\n\\nThe wizard could not access the setup resource. This may indicate a version mismatch or a temporary service issue.\\n\\nPlease try again, or set up ${config.metadata.name} manually by following our documentation:\\n${config.metadata.docsUrl}`,\n error: new WizardError('Agent could not access setup resource', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.RESOURCE_MISSING,\n signal: AgentSignals.ERROR_RESOURCE_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.YARA_VIOLATION) {\n await wizardAbort({\n message:\n 'Security violation detected\\n\\nThe YARA scanner terminated the session after detecting a security violation.\\nThis may indicate prompt injection, poisoned skill files, or a policy breach.\\n\\nPlease report this to: wizard@posthog.com',\n error: new WizardError('YARA scanner terminated session', {\n integration: config.metadata.integration,\n error_type: AgentErrorType.YARA_VIOLATION,\n }),\n });\n }\n\n if (\n agentResult.error === AgentErrorType.RATE_LIMIT ||\n agentResult.error === AgentErrorType.API_ERROR\n ) {\n analytics.wizardCapture('agent api error', {\n integration: config.metadata.integration,\n error_type: agentResult.error,\n error_message: agentResult.message,\n });\n\n await wizardAbort({\n message: `API Error\\n\\n${\n agentResult.message || 'Unknown error'\n }\\n\\nPlease report this error to: wizard@posthog.com`,\n error: new WizardError(`API error: ${agentResult.message}`, {\n integration: config.metadata.integration,\n error_type: agentResult.error,\n }),\n });\n }\n\n // Build environment variables from OAuth credentials\n const envVars = config.environment.getEnvVars(projectApiKey, host);\n\n // Upload environment variables to hosting providers (auto-accept)\n let uploadedEnvVars: string[] = [];\n if (config.environment.uploadToHosting) {\n const { uploadEnvironmentVariablesStep } = await import(\n '../steps/index.js'\n );\n uploadedEnvVars = await uploadEnvironmentVariablesStep(envVars, {\n integration: config.metadata.integration,\n session,\n });\n if (uploadedEnvVars.length > 0) {\n analytics.capture(WIZARD_INTERACTION_EVENT_NAME, {\n action: 'wizard_env_vars_uploaded',\n integration: config.metadata.integration,\n variable_count: uploadedEnvVars.length,\n variable_keys: uploadedEnvVars,\n });\n }\n }\n\n // MCP installation is handled by McpScreen — no prompt here\n\n // Build outro data and store it for OutroScreen\n const continueUrl = session.signup\n ? `${getCloudUrlFromRegion(cloudRegion)}/products?source=wizard`\n : undefined;\n\n const changes = [\n ...config.ui.getOutroChanges(frameworkContext),\n Object.keys(envVars).length > 0\n ? `Added environment variables to .env file`\n : '',\n uploadedEnvVars.length > 0\n ? `Uploaded environment variables to your hosting provider`\n : '',\n ].filter(Boolean);\n\n session.outroData = {\n kind: OutroKind.Success,\n changes,\n docsUrl: config.metadata.docsUrl,\n continueUrl,\n };\n\n getUI().outro(`Successfully installed PostHog!`);\n\n await analytics.shutdown('success');\n}\n\n/**\n * Build the integration prompt for the agent.\n */\nfunction buildIntegrationPrompt(\n config: FrameworkConfig,\n context: {\n frameworkVersion: string;\n typescript: boolean;\n projectApiKey: string;\n host: string;\n projectId: number;\n },\n frameworkContext: Record<string, unknown>,\n): string {\n const additionalLines = config.prompts.getAdditionalContextLines\n ? config.prompts.getAdditionalContextLines(frameworkContext)\n : [];\n\n const additionalContext =\n additionalLines.length > 0\n ? '\\n' + additionalLines.map((line) => `- ${line}`).join('\\n')\n : '';\n\n return `You have access to the PostHog MCP server which provides skills to integrate PostHog into this ${\n config.metadata.name\n } project.\n\nProject context:\n- PostHog Project ID: ${context.projectId}\n- Framework: ${config.metadata.name} ${context.frameworkVersion}\n- TypeScript: ${context.typescript ? 'Yes' : 'No'}\n- PostHog public token: ${context.projectApiKey}\n- PostHog Host: ${context.host}\n- Project type: ${config.prompts.projectTypeDetection}\n- Package installation: ${\n config.prompts.packageInstallation ?? DEFAULT_PACKAGE_INSTALLATION\n }${additionalContext}\n\nInstructions (follow these steps IN ORDER - do not skip or reorder):\n\nSTEP 1: Call load_skill_menu (from the wizard-tools MCP server) to see available skills.\n If the tool fails, emit: ${\n AgentSignals.ERROR_MCP_MISSING\n } Could not load skill menu and halt.\n\n Choose a skill from the \\`integration\\` category that matches this project's framework. Do NOT pick skills from other categories (llm-analytics, error-tracking, feature-flags, omnibus, etc.) — those are handled separately.\n If no suitable integration skill is found, emit: ${\n AgentSignals.ERROR_RESOURCE_MISSING\n } Could not find a suitable skill for this project.\n\nSTEP 2: Call install_skill (from the wizard-tools MCP server) with the chosen skill ID (e.g., \"integration-nextjs-app-router\").\n Do NOT run any shell commands to install skills.\n\nSTEP 3: Load the installed skill's SKILL.md file to understand what references are available.\n\nSTEP 4: Follow the skill's workflow files in sequence. Look for numbered workflow files in the references (e.g., files with patterns like \"1.0-\", \"1.1-\", \"1.2-\"). Start with the first one and proceed through each step until completion. Each workflow file will tell you what to do and which file comes next. Never directly write PostHog tokens directly to code files; always use environment variables.\n\nSTEP 5: Set up environment variables for PostHog using the wizard-tools MCP server (this runs locally — secret values never leave the machine):\n - Use check_env_keys to see which keys already exist in the project's .env file (e.g. .env.local or .env).\n - Use set_env_values to create or update the PostHog public token and host, using the appropriate environment variable naming convention for ${\n config.metadata.name\n }, which you'll find in example code. The tool will also ensure .gitignore coverage. Don't assume the presence of keys means the value is up to date. Write the correct value each time.\n - Reference these environment variables in the code files you create instead of hardcoding the public token and host.\n\nImportant: Use the detect_package_manager tool (from the wizard-tools MCP server) to determine which package manager the project uses. Do not manually search for lockfiles or config files. Always install packages as a background task. Don't await completion; proceed with other work immediately after starting the installation. You must read a file immediately before attempting to write it, even if you have previously read it; failure to do so will cause a tool failure.\n\n\n`;\n}\n"]}
|
|
@@ -53,7 +53,7 @@ export declare const WIZARD_VARIANT_FLAG_KEY = "wizard-variant";
|
|
|
53
53
|
/** Variant key -> metadata for wizard run (VARIANT flag selects which entry to use). */
|
|
54
54
|
export declare const WIZARD_VARIANTS: Record<string, Record<string, string>>;
|
|
55
55
|
/** User-Agent for wizard HTTP requests and MCP server identification. */
|
|
56
|
-
export declare const WIZARD_USER_AGENT = "posthog/wizard; version: 2.
|
|
56
|
+
export declare const WIZARD_USER_AGENT = "posthog/wizard; version: 2.3.0";
|
|
57
57
|
/** Header prefix for PostHog properties (e.g. X-POSTHOG-PROPERTY-VARIANT). */
|
|
58
58
|
export declare const POSTHOG_PROPERTY_HEADER_PREFIX = "X-POSTHOG-PROPERTY-";
|
|
59
59
|
/** Header prefix for PostHog feature flags. */
|
|
@@ -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
|
|
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(
|
|
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
|
|
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(
|
|
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":";AAAA;;;;;;;;;;;;;;;;GAgBG;;AAEH,oCAgBkB;AAElB,8EAA8E;AAC9E,iDAAiD;AACjD,iCAAiC;AACjC,8EAA8E;AAE9E,SAAS,oBAAoB,CAAC,IAM7B;IACC,OAAO;QACL,IAAI,EAAE;YACJ,EAAE,EAAE,IAAI,CAAC,MAAM;YACf,IAAI,EAAE,IAAI,CAAC,QAAQ;YACnB,GAAG,EAAE,IAAI,CAAC,OAAO;YACjB,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,0BAA0B;SACvC;QACD,MAAM,EAAE;YACN,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B;KACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,IAa9B;IACC,OAAO;QACL,IAAI,EAAE;YACJ,EAAE,EAAE,IAAI,CAAC,MAAM;YACf,IAAI,EAAE,IAAI,CAAC,QAAQ;YACnB,GAAG,EAAE,IAAI,CAAC,OAAO;YACjB,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,0BAA0B;SACvC;QACD,MAAM,EAAE;YACN,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B;QACD,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,GAAG,CAAC;YACJ,OAAO,EAAE,IAAI,CAAC,MAAM;YACpB,UAAU,EAAE,0BAA0B;YACtC,UAAU,EAAE,0BAA0B;YACtC,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,YAAY;YACxB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,KAAK;YACZ,qBAAqB,EAAE,KAAK;SAC7B,CAAC,CAAC;QACH,SAAS,EAAE,EAAE;QACb,sBAAsB,EAAE,EAAE;KAC3B,CAAC;AACJ,CAAC;AAED,2CAA2C;AAC3C,MAAM,wBAAwB,GAAG,oBAAoB,CAAC;IACpD,MAAM,EAAE,cAAc;IACtB,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,2BAA2B;IACpC,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,yBAAyB;CACvC,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,oBAAoB,CAAC;IACjD,MAAM,EAAE,cAAc;IACtB,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,8BAA8B;IACvC,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,yBAAyB;CACvC,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;IAC9C,MAAM,EAAE,cAAc;IACtB,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,0BAA0B;IACnC,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,yBAAyB;CACvC,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;IAChD,MAAM,EAAE,cAAc;IACtB,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,0BAA0B;IACnC,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,yBAAyB;IACtC,UAAU,EAAE;QACV;YACE,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,uBAAuB;YAC7B,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,CAAC;YACX,WAAW,EACT,wEAAwE;SAC3E;QACD;YACE,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,sBAAsB;YAC5B,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,CAAC;YACX,WAAW,EACT,oFAAoF;SACvF;KACF;CACF,CAAC,CAAC;AAEH,MAAM,yBAAyB,GAAG,oBAAoB,CAAC;IACrD,MAAM,EAAE,cAAc;IACtB,QAAQ,EAAE,YAAY;IACtB,OAAO,EAAE,kCAAkC;IAC3C,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,yBAAyB;CACvC,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAAG,qBAAqB,CAAC;IACvD,MAAM,EAAE,cAAc;IACtB,QAAQ,EAAE,YAAY;IACtB,OAAO,EAAE,kCAAkC;IAC3C,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,yBAAyB;IACtC,UAAU,EAAE;QACV;YACE,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,+BAA+B;YACrC,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,CAAC;YACX,WAAW,EACT,0FAA0F;SAC7F;KACF;CACF,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;IAClD,MAAM,EAAE,cAAc;IACtB,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,4BAA4B;IACrC,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,yBAAyB;CACvC,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;IACpD,MAAM,EAAE,cAAc;IACtB,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,4BAA4B;IACrC,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,yBAAyB;IACtC,UAAU,EAAE;QACV;YACE,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,CAAC;YACX,WAAW,EAAE,IAAI;SAClB;QACD;YACE,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,CAAC;YACX,WAAW,EAAE,IAAI;SAClB;QACD;YACE,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,CAAC;YACX,WAAW,EAAE,IAAI;SAClB;KACF;CACF,CAAC,CAAC;AAEH,oGAAoG;AACpG,MAAM,yBAAyB,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AAEtE,wFAAwF;AACxF,MAAM,gBAAgB,GACpB,mGAAmG,CAAC;AAEtG,8EAA8E;AAC9E,8CAA8C;AAC9C,8EAA8E;AAE9E,MAAM,IAAI,GAAG;IACX,eAAe,EAAE,8CAA8C;IAC/D,aAAa,EAAE,kDAAkD;IACjE,cAAc,EAAE,mDAAmD;IACnE,YAAY,EAAE,iDAAiD;IAC/D,SAAS,EAAE,6CAA6C;IACxD,UAAU,EAAE,8CAA8C;IAC1D,gBAAgB,EAAE,qDAAqD;IACvE,iBAAiB,EAAE,sDAAsD;IACzE,kBAAkB,EAAE,0CAA0C;IAC9D,UAAU,EAAE,0BAA0B;IACtC,uBAAuB,EACrB,kFAAkF;CAC5E,CAAC;AAEX,8EAA8E;AAC9E,qDAAqD;AACrD,8EAA8E;AAE9E,MAAM,iBAAiB,GACrB;IACE,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE;QACtB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAC;QAC9C,WAAW,EAAE,kBAAkB;KAChC;IACD,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;QACpB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC;QAC5C,WAAW,EAAE,kBAAkB;KAChC;IACD,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;QACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC;QAC7C,WAAW,EAAE,kBAAkB;KAChC;IACD,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;QACnB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC;QAC3C,WAAW,EAAE,kBAAkB;KAChC;IACD,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;QAChB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;QACxC,WAAW,EAAE,kBAAkB;KAChC;IACD,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;QACjB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC;QACzC,WAAW,EAAE,kBAAkB;KAChC;IACD,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE;QACvB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC;QAC/C,WAAW,EAAE,kBAAkB;KAChC;IACD,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE;QACxB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,0BAA0B,CAAC;QAChD,WAAW,EAAE,kBAAkB;KAChC;IACD,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE;QACzB,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EAAE,kBAAkB;KAChC;IACD,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;QACjB,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,0BAA0B;KACxC;IACD,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE;QAC9B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC;QACzD,WAAW,EAAE,kBAAkB;KAChC;CACF,CAAC;AAEJ,SAAS,mBAAmB,CAAC,GAA2B;IACtD,MAAM,MAAM,GACV,OAAO,GAAG,KAAK,QAAQ;QACrB,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,GAAG,YAAY,GAAG;YACpB,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE;YAChB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACd,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,OAAO,CAAC,OAAO,CACpB,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE;YACvB,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,cAAc,EAAE,KAAK,CAAC,WAAW,EAAE;SAC/C,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,aAAa,CAAC,SAAkD;IACvE,OAAO,CAAC,GAA2B,EAAqB,EAAE;QACxD,MAAM,MAAM,GACV,OAAO,GAAG,KAAK,QAAQ;YACrB,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,GAAG,YAAY,GAAG;gBACpB,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE;gBAChB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QACd,IAAI,SAAS,CAAC,MAAM,CAAC;YAAE,OAAO,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;IAEnC,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,eAAe,EAAE,CAAC;QACtB,MAAc,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACX,MAAc,CAAC,KAAK,GAAG,aAAa,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,kDAAkD;IAClD,0EAA0E;IAE1E,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC9E,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,GAAE,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC7E,MAAM,IAAI,GAAG,oBAAoB,CAAC;gBAChC,MAAM,EAAE,cAAc;gBACtB,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,2BAA2B;gBACpC,SAAS,EAAE,OAAO;gBAClB,WAAW,EAAE,sBAAsB;aACpC,CAAC,CAAC;YACF,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,CAC3B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACpD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,GAAE,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,MAAM,IAAI,GAAG,oBAAoB,CAAC;gBAChC,MAAM,EAAE,cAAc;gBACtB,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,2BAA2B;gBACpC,SAAS,EAAE,OAAO;gBAClB,WAAW,EAAE,uBAAuB;aACrC,CAAC,CAAC;YACF,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,CAC3B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACpD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,GAAE,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,IAAI,GAAG,oBAAoB,CAAC;gBAChC,MAAM,EAAE,cAAc;gBACtB,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,2BAA2B;gBACpC,SAAS,EAAE,UAAU;gBACrB,WAAW,EAAE,sBAAsB;aACpC,CAAC,CAAC;YACF,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,CAC3B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACpD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,GAAE,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,CAC3B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACvD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,GAAE,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,CAC3B,OAAO,CAAC,MAAM,CACZ,IAAI,KAAK,CAAC,yCAAyC,CAAC,CACrD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,GAAE,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,MAAM,GAAG,MAAM,IAAA,iCAAyB,GAAE,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAiB,GAAE,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,MAAM,GAAG,MAAM,IAAA,6BAAqB,GAAE,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,MAAM,GAAG,MAAM,IAAA,oCAA4B,GAAE,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,IAAI,GAAG,oBAAoB,CAAC;gBAChC,MAAM,EAAE,cAAc;gBACtB,QAAQ,EAAE,YAAY;gBACtB,OAAO,EAAE,kCAAkC;gBAC3C,SAAS,EAAE,OAAO;gBAClB,WAAW,EAAE,sBAAsB;aACpC,CAAC,CAAC;YACF,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAC5B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACpD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,oCAA4B,GAAE,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,QAAQ,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,mDAAmD;IACnD,0EAA0E;IAE1E,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,MAAM,GAAG,MAAM,IAAA,mCAA2B,GAAE,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,aAAa,EAAE,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,IAAI,GAAG,qBAAqB,CAAC;gBACjC,MAAM,EAAE,cAAc;gBACtB,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,4BAA4B;gBACrC,SAAS,EAAE,OAAO;gBAClB,WAAW,EAAE,uBAAuB;gBACpC,UAAU,EAAE;oBACV;wBACE,EAAE,EAAE,UAAU;wBACd,IAAI,EAAE,UAAU;wBAChB,MAAM,EAAE,gBAAgB;wBACxB,QAAQ,EAAE,CAAC;wBACX,WAAW,EAAE,IAAI;qBAClB;oBACD;wBACE,EAAE,EAAE,UAAU;wBACd,IAAI,EAAE,UAAU;wBAChB,MAAM,EAAE,aAAa;wBACrB,QAAQ,EAAE,CAAC;wBACX,WAAW,EAAE,IAAI;qBAClB;iBACF;aACF,CAAC,CAAC;YACF,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,CAC1B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACpD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,mCAA2B,GAAE,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,wBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,wBAAyB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CACxD,gBAAgB,CACjB,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,wBAAyB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CACrD,2BAAmB,CAAC,IAAI,CACzB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,MAAM,IAAI,GAAG,qBAAqB,CAAC;gBACjC,MAAM,EAAE,cAAc;gBACtB,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,4BAA4B;gBACrC,SAAS,EAAE,OAAO;gBAClB,WAAW,EAAE,6BAA6B;gBAC1C,UAAU,EAAE;oBACV;wBACE,EAAE,EAAE,UAAU;wBACd,IAAI,EAAE,UAAU;wBAChB,MAAM,EAAE,sBAAsB;wBAC9B,QAAQ,EAAE,CAAC;wBACX,WAAW,EAAE,IAAI;qBAClB;oBACD;wBACE,EAAE,EAAE,UAAU;wBACd,IAAI,EAAE,UAAU;wBAChB,MAAM,EAAE,aAAa;wBACrB,QAAQ,EAAE,CAAC;wBACX,WAAW,EAAE,IAAI;qBAClB;iBACF;aACF,CAAC,CAAC;YACF,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,CAC1B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACpD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,mCAA2B,GAAE,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,wBAAyB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CACxD,sBAAsB,CACvB,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,wBAAyB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CACrD,2BAAmB,CAAC,QAAQ,CAC7B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,IAAI,GAAG,qBAAqB,CAAC;gBACjC,MAAM,EAAE,cAAc;gBACtB,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,4BAA4B;gBACrC,SAAS,EAAE,UAAU;gBACrB,WAAW,EAAE,sBAAsB;gBACnC,UAAU,EAAE;oBACV;wBACE,EAAE,EAAE,UAAU;wBACd,IAAI,EAAE,UAAU;wBAChB,MAAM,EAAE,cAAc;wBACtB,QAAQ,EAAE,CAAC;wBACX,WAAW,EAAE,IAAI;qBAClB;oBACD;wBACE,EAAE,EAAE,UAAU;wBACd,IAAI,EAAE,UAAU;wBAChB,MAAM,EAAE,cAAc;wBACtB,QAAQ,EAAE,CAAC;wBACX,WAAW,EAAE,IAAI;qBAClB;iBACF;aACF,CAAC,CAAC;YACF,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,CAC1B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACpD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,mCAA2B,GAAE,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,wBAAyB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CACrD,2BAAmB,CAAC,IAAI,CACzB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,IAAI,GAAG,qBAAqB,CAAC;gBACjC,MAAM,EAAE,cAAc;gBACtB,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,4BAA4B;gBACrC,SAAS,EAAE,OAAO;gBAClB,WAAW,EAAE,uBAAuB;gBACpC,UAAU,EAAE;oBACV;wBACE,EAAE,EAAE,UAAU;wBACd,IAAI,EAAE,UAAU;wBAChB,MAAM,EAAE,mBAAmB;wBAC3B,QAAQ,EAAE,CAAC;wBACX,WAAW,EAAE,IAAI;qBAClB;iBACF;aACF,CAAC,CAAC;YACF,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,CAC1B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACpD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,mCAA2B,GAAE,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,wBAAyB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CACrD,2BAAmB,CAAC,QAAQ,CAC7B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAuB,GAAE,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,IAAI,GAAG,qBAAqB,CAAC;gBACjC,MAAM,EAAE,cAAc;gBACtB,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,0BAA0B;gBACnC,SAAS,EAAE,OAAO;gBAClB,WAAW,EAAE,uBAAuB;gBACpC,UAAU,EAAE;oBACV;wBACE,EAAE,EAAE,cAAc;wBAClB,IAAI,EAAE,uBAAuB;wBAC7B,MAAM,EAAE,aAAa;wBACrB,QAAQ,EAAE,CAAC;wBACX,WAAW,EAAE,IAAI;qBAClB;oBACD;wBACE,EAAE,EAAE,cAAc;wBAClB,IAAI,EAAE,sBAAsB;wBAC5B,MAAM,EAAE,gBAAgB;wBACxB,QAAQ,EAAE,CAAC;wBACX,WAAW,EAAE,IAAI;qBAClB;iBACF;aACF,CAAC,CAAC;YACF,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CACtB,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACpD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAuB,GAAE,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,wBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACnD,sBAAsB,CACvB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC9C,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,MAAM,GAAG,MAAM,IAAA,sCAA8B,GAAE,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,iDAAiD;IACjD,0EAA0E;IAE1E,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;YACjF,MAAM,MAAM,GAAG,MAAM,IAAA,6BAAqB,GAAE,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CACvC,IAAI,CAAC,kBAAkB,EACvB,MAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAC7D,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,CAC9B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACrD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,6BAAqB,GAAE,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,CAC9B,OAAO,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;aAChE,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,6BAAqB,GAAE,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,CAC9B,OAAO,CAAC,MAAM,CACZ,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAC1D;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,6BAAqB,GAAE,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC3D,UAAU,CAAC,IAAI,GAAG,YAAY,CAAC;YAC9B,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;aAC5D,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,6BAAqB,GAAE,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,wCAAwC;IACxC,0EAA0E;IAE1E,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC9E,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,GAAE,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CACvC,IAAI,CAAC,UAAU,EACf,MAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAC7D,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CACtB,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACvD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,GAAE,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC9E,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CACtB,OAAO,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;aACrD,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,GAAE,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;aACnE,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAc,GAAE,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,2BAA2B;IAC3B,0EAA0E;IAE1E,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAwB,GAAE,CAAC;YAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAClB,MAAM,CAAC,eAAe,CAAC;gBACrB,WAAW;gBACX,gBAAgB;gBAChB,mBAAmB;gBACnB,QAAQ;gBACR,YAAY;gBACZ,eAAe;gBACf,mBAAmB;gBACnB,sBAAsB;gBACtB,YAAY;gBACZ,KAAK;gBACL,gBAAgB;aACjB,CAAC,CACH,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAC9B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,OAAO,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,IAAA,gCAAwB,GAAE,CAAC;YACjC,MAAM,UAAU,GAAI,MAAM,CAAC,KAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAC3D,CAAC,CAAY,EAAE,EAAE,CACf,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAS,CAAC,QAAQ,EAAE,CAC7D,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACpC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACtD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,0BAA0B;IAC1B,0EAA0E;IAE1E,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAuB,EAC1C,uCAA+B,CAChC,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,uBAAe,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,IAAI,GAAG,oBAAoB,CAAC;gBAChC,MAAM,EAAE,cAAc;gBACtB,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,2BAA2B;gBACpC,SAAS,EAAE,OAAO;gBAClB,WAAW,EAAE,sBAAsB;aACpC,CAAC,CAAC;YACF,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,CAC3B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACpD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAuB,EAC1C,uCAA+B,CAChC,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,uBAAe,CAAC,EAAE,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,QAAQ,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,CAC9B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACrD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAuB,EAC1C,uCAA+B,CAChC,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,uBAAe,CAAC,EAAE,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,IAAI,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CACtB,OAAO,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;aAChE,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAuB,EAC1C,uCAA+B,CAChC,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,uBAAe,CAAC,EAAE,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,IAAI,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,IAAI,GAAG,oBAAoB,CAAC;gBAChC,MAAM,EAAE,cAAc;gBACtB,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,0BAA0B;gBACnC,SAAS,EAAE,UAAU;gBACrB,WAAW,EAAE,sBAAsB;aACpC,CAAC,CAAC;YACF,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CACrB,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACpD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAuB,EAC1C,uCAA+B,CAChC,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,uBAAe,CAAC,EAAE,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAAmB,CAAC,IAAI,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,IAAI,GAAG,oBAAoB,CAAC;gBAChC,MAAM,EAAE,cAAc;gBACtB,QAAQ,EAAE,YAAY;gBACtB,OAAO,EAAE,kCAAkC;gBAC3C,SAAS,EAAE,OAAO;gBAClB,WAAW,EAAE,sBAAsB;aACpC,CAAC,CAAC;YACF,MAAM,CAAC,KAAmB,CAAC,kBAAkB,CAC5C,aAAa,CAAC;gBACZ,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAC5B,OAAO,CAAC,OAAO,CACb,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CACpD;aACJ,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAuB,EAC1C,uCAA+B,CAChC,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,uBAAe,CAAC,eAAe,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAuB,EAC1C,uCAA+B,CAChC,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","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; } });
|