@canaryai/cli 0.1.1-alpha.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/runner/common.ts","../src/run.ts","../src/local-run.ts","../src/auth.ts","../src/tunnel.ts","../src/login.ts","../src/run-local.ts","../src/mcp.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport process from \"node:process\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { makeRequire, resolveRunner } from \"./runner/common\";\nimport { run as runCanary } from \"./run\";\nimport { runLocalTest } from \"./local-run\";\nimport { runTunnel } from \"./tunnel\";\nimport { runLogin } from \"./login\";\nimport { runLocalSession } from \"./run-local\";\nimport { runMcp } from \"./mcp\";\n\nexport const canary = { run: runCanary };\nexport { runCanary as run };\n\nconst baseDir =\n typeof __dirname !== \"undefined\" ? __dirname : path.dirname(fileURLToPath(import.meta.url));\nconst preloadPath = path.join(baseDir, \"runner\", \"preload.js\");\nconst requireFn = makeRequire();\n\nfunction runPlaywrightTests(args: string[]) {\n // Resolve the local @playwright/test CLI directly (drop-in replacement)\n const playwrightCli = requireFn.resolve(\"@playwright/test/cli\");\n const { runnerBin, preloadFlag } = resolveRunner(preloadPath);\n\n const nodeOptions =\n process.env.NODE_OPTIONS && preloadFlag\n ? `${process.env.NODE_OPTIONS} ${preloadFlag}`\n : preloadFlag ?? process.env.NODE_OPTIONS;\n\n const env = {\n ...process.env,\n CANARY_ENABLED: process.env.CANARY_ENABLED ?? \"1\",\n CANARY_RUNNER: \"canary\",\n ...(nodeOptions ? { NODE_OPTIONS: nodeOptions } : {}),\n };\n\n const result = spawnSync(runnerBin, [playwrightCli, \"test\", ...args], {\n env,\n stdio: \"inherit\",\n cwd: process.cwd(),\n });\n\n if (result.error) {\n console.error(\"canary failed to launch Playwright:\", result.error);\n process.exit(1);\n }\n\n process.exit(result.status ?? 1);\n}\n\nexport async function main(argv: string[]) {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n console.log(\n \"canary: Playwright AI healer runner (scaffold).\\n\" +\n \"Usage: canary test [playwright options]\\n\" +\n \" canary local-run --tunnel-url <url> [options]\\n\" +\n \" canary tunnel --port <localPort> [options]\\n\" +\n \" canary run --port <localPort> [options]\\n\" +\n \" canary mcp\\n\" +\n \" canary login [--app-url https://app.trycanary.ai] [--api-url http://localhost:3000] [--no-open]\\n\" +\n \"Plan: see ai-healer-runner-plan.md\"\n );\n return;\n }\n\n const [command, ...rest] = argv;\n if (!command || command === \"test\") {\n runPlaywrightTests(rest);\n return;\n }\n\n if (command === \"local-run\") {\n await runLocalTest(rest);\n return;\n }\n\n if (command === \"run\") {\n await runLocalSession(rest);\n return;\n }\n\n if (command === \"mcp\") {\n await runMcp(rest);\n return;\n }\n\n if (command === \"tunnel\") {\n await runTunnel(rest);\n return;\n }\n\n if (command === \"login\") {\n await runLogin(rest);\n return;\n }\n\n console.log(`Unknown command \"${command}\". Try \"canary test\" or \"--help\".`);\n process.exit(1);\n}\n\nif (import.meta.url === pathToFileURL(process.argv[1]).href) {\n void main(process.argv.slice(2));\n}\n","import { spawnSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport { pathToFileURL } from \"node:url\";\n\nexport function makeRequire() {\n try {\n return createRequire(import.meta.url);\n } catch {\n try {\n return createRequire(process.cwd());\n } catch {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return typeof require !== \"undefined\" ? (require as any) : createRequire(\".\");\n }\n }\n}\n\nexport function resolveRunner(preloadPath?: string): { runnerBin: string; preloadFlag?: string } {\n const { bin, version } = pickNodeBinary();\n const supportsImport = typeof version === \"number\" && version >= 18;\n\n if (supportsImport && preloadPath && fs.existsSync(preloadPath)) {\n return { runnerBin: bin, preloadFlag: `--import=${pathToFileURL(preloadPath).href}` };\n }\n\n if (preloadPath) {\n console.warn(\"[canary] Warning: no preload module found; instrumentation may be disabled.\");\n }\n\n return { runnerBin: bin };\n}\n\nexport function pickNodeBinary(): { bin: string; version?: number } {\n const candidates = collectNodeCandidates();\n\n // Prefer the first viable candidate with version >=18; otherwise pick highest version found.\n let best: { bin: string; version?: number } | undefined;\n let fallback: { bin: string; version?: number } | undefined;\n\n for (const bin of candidates) {\n const version = getNodeMajor(bin);\n if (!version) continue;\n const current = { bin, version };\n if (version >= 18 && !fallback) {\n fallback = current;\n }\n if (!best || version > (best.version ?? 0)) {\n best = current;\n }\n }\n\n if (fallback) return fallback;\n if (best) return best;\n\n // Last resort\n return { bin: candidates[0] ?? \"node\" };\n}\n\nexport function collectNodeCandidates(): string[] {\n const seen = new Set<string>();\n const push = (value?: string) => {\n if (!value) return;\n if (seen.has(value)) return;\n seen.add(value);\n };\n\n const isBun = path.basename(process.execPath).includes(\"bun\");\n\n push(process.env.CANARY_NODE_BIN);\n push(isBun ? undefined : process.execPath);\n push(\"node\"); // default PATH lookup\n\n // Collect from `which -a node` if available.\n try {\n const which = spawnSync(\"which\", [\"-a\", \"node\"], { encoding: \"utf-8\" });\n which.stdout\n ?.toString()\n .split(\"\\n\")\n .map((line) => line.trim())\n .forEach((line) => push(line));\n } catch {\n // ignore\n }\n\n // NVM installations (grab highest versions)\n const nvmDir = process.env.NVM_DIR || (process.env.HOME ? path.join(process.env.HOME, \".nvm\") : undefined);\n if (nvmDir) {\n const versionsDir = path.join(nvmDir, \"versions\", \"node\");\n if (fs.existsSync(versionsDir)) {\n try {\n const versions = fs.readdirSync(versionsDir);\n versions\n .sort((a, b) => (a > b ? -1 : 1))\n .forEach((v) => push(path.join(versionsDir, v, \"bin\", \"node\")));\n } catch {\n // ignore\n }\n }\n }\n\n return Array.from(seen);\n}\n\nexport function getNodeMajor(bin: string): number | undefined {\n try {\n const result = spawnSync(bin, [\"-v\"], { encoding: \"utf-8\" });\n const output = (result.stdout || result.stderr || \"\").toString().trim();\n const match = output.match(/^v(\\d+)/);\n if (match) return Number(match[1]);\n } catch {\n // ignore\n }\n return undefined;\n}\n","import { spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { makeRequire, resolveRunner } from \"./runner/common\";\n\nexport type HealingOptions = {\n apiKey?: string;\n provider?: string;\n model?: string;\n timeoutMs?: number;\n maxActions?: number;\n vision?: boolean;\n dryRun?: boolean;\n warnOnly?: boolean;\n debug?: boolean;\n readOnly?: boolean;\n allowEvaluate?: boolean;\n allowRunCode?: boolean;\n maxPayloadBytes?: number;\n};\n\nexport type RunRequest = {\n projectRoot?: string;\n testDir?: string | string[];\n configFile?: string;\n cliArgs?: string[];\n env?: Record<string, string>;\n healing?: HealingOptions;\n reporter?: \"default\" | \"json\" | string;\n timeoutMs?: number;\n nodeBin?: string;\n stdio?: \"inherit\" | \"pipe\";\n};\n\nexport type RunResult = {\n ok: boolean;\n exitCode: number;\n summary: {\n total: number;\n passed: number;\n failed: number;\n flaky: number;\n skipped: number;\n healed?: number;\n warned?: number;\n durationMs: number;\n };\n artifactsDir?: string;\n rawOutput?: string;\n error?: Error;\n};\n\ntype JsonReport = {\n suites?: JsonSuite[];\n duration?: number;\n};\n\ntype JsonSuite = {\n suites?: JsonSuite[];\n tests?: Array<{\n title: string;\n results: Array<{\n status: \"passed\" | \"failed\" | \"timedOut\" | \"skipped\" | \"interrupted\";\n duration: number;\n errors?: unknown[];\n }>;\n }>;\n};\n\nexport async function run(request: RunRequest = {}): Promise<RunResult> {\n const cwd = request.projectRoot ?? process.cwd();\n const stdio = request.stdio ?? \"inherit\";\n const requireFn = makeRequire();\n const playwrightCli = requireFn.resolve(\"@playwright/test/cli\");\n const baseDir = path.dirname(fileURLToPath(import.meta.url));\n const preloadPath = path.join(baseDir, \"runner\", \"preload.js\");\n const { runnerBin, preloadFlag } = resolveRunner(preloadPath);\n\n const { jsonReportPath, eventLogPath, artifactsDir } = prepareArtifactsDir(cwd);\n const reporter = buildReporterArgs(request.reporter, jsonReportPath);\n const args = buildArgs({\n testDir: request.testDir,\n configFile: request.configFile,\n cliArgs: request.cliArgs,\n reporter,\n });\n\n const nodeOptions =\n process.env.NODE_OPTIONS && preloadFlag\n ? `${process.env.NODE_OPTIONS} ${preloadFlag}`\n : preloadFlag ?? process.env.NODE_OPTIONS;\n\n const env = buildEnv({\n base: process.env,\n overrides: request.env,\n healing: request.healing,\n eventLogPath,\n nodeOptions,\n });\n\n const runResult = await spawnPlaywright({\n bin: request.nodeBin ?? runnerBin,\n args: [playwrightCli, ...args],\n cwd,\n env,\n stdio,\n timeoutMs: request.timeoutMs,\n });\n\n const summary = summarize(jsonReportPath, eventLogPath, runResult.durationMs);\n\n return {\n ok: runResult.exitCode === 0,\n exitCode: runResult.exitCode,\n summary,\n artifactsDir,\n rawOutput: runResult.output,\n error: runResult.error,\n };\n}\n\nfunction buildArgs(opts: {\n testDir?: string | string[];\n configFile?: string;\n cliArgs?: string[];\n reporter: string;\n}): string[] {\n const args = [\"test\"];\n\n if (opts.testDir) {\n const dirs = Array.isArray(opts.testDir) ? opts.testDir : [opts.testDir];\n args.push(...dirs);\n }\n\n if (opts.configFile) {\n args.push(\"--config\", opts.configFile);\n }\n\n args.push(\"--reporter\", opts.reporter);\n\n if (opts.cliArgs?.length) {\n args.push(...opts.cliArgs);\n }\n\n return args;\n}\n\nfunction buildReporterArgs(requested: RunRequest[\"reporter\"], jsonReportPath: string): string {\n if (requested === \"json\") return `json=${jsonReportPath}`;\n if (requested && requested !== \"default\") return requested;\n // Default: keep list output plus JSON for programmatic summary\n return `list,json=${jsonReportPath}`;\n}\n\nfunction prepareArtifactsDir(cwd: string): { jsonReportPath: string; eventLogPath: string; artifactsDir: string } {\n const dir = fs.mkdtempSync(path.join(os.tmpdir(), \"canary-run-\"));\n const jsonReportPath = path.join(dir, \"report.json\");\n const eventLogPath = path.join(dir, \"events-worker-0.jsonl\");\n const artifactsDir = path.join(cwd, \"test-results\", \"ai-healer\");\n return { jsonReportPath, eventLogPath, artifactsDir: dir };\n}\n\nfunction buildEnv(params: {\n base: NodeJS.ProcessEnv;\n overrides?: Record<string, string>;\n healing?: HealingOptions;\n eventLogPath: string;\n nodeOptions?: string;\n}): NodeJS.ProcessEnv {\n const healing = params.healing ?? {};\n const env: NodeJS.ProcessEnv = {\n ...params.base,\n CANARY_ENABLED: params.base.CANARY_ENABLED ?? \"1\",\n CANARY_RUNNER: \"canary\",\n CANARY_EVENT_LOG: params.eventLogPath,\n ...(params.nodeOptions ? { NODE_OPTIONS: params.nodeOptions } : {}),\n ...(healing.apiKey ? { AI_API_KEY: healing.apiKey } : {}),\n ...(healing.provider ? { AI_PROVIDER: healing.provider } : {}),\n ...(healing.model ? { AI_MODEL: healing.model } : {}),\n ...(healing.timeoutMs ? { AI_TIMEOUT_MS: String(healing.timeoutMs) } : {}),\n ...(healing.maxActions ? { CANARY_MAX_ACTIONS: String(healing.maxActions) } : {}),\n ...(healing.vision ? { CANARY_VISION: \"1\" } : {}),\n ...(healing.dryRun ? { CANARY_DRY_RUN: \"1\" } : {}),\n ...(healing.warnOnly ? { CANARY_WARN_ONLY: \"1\" } : {}),\n ...(healing.debug ? { CANARY_DEBUG: \"1\" } : {}),\n ...(healing.readOnly ? { CANARY_READ_ONLY: \"1\" } : {}),\n ...(healing.allowEvaluate === false ? { CANARY_ALLOW_EVALUATE: \"0\" } : {}),\n ...(healing.allowRunCode ? { CANARY_ALLOW_RUN_CODE: \"1\" } : {}),\n ...(healing.maxPayloadBytes ? { CANARY_MAX_PAYLOAD_BYTES: String(healing.maxPayloadBytes) } : {}),\n ...params.overrides,\n };\n return env;\n}\n\nasync function spawnPlaywright(opts: {\n bin: string;\n args: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n stdio: \"inherit\" | \"pipe\";\n timeoutMs?: number;\n}): Promise<{ exitCode: number; output?: string; durationMs: number; error?: Error }> {\n return new Promise((resolve) => {\n const started = Date.now();\n const child = spawn(opts.bin, opts.args, {\n cwd: opts.cwd,\n env: opts.env,\n stdio: opts.stdio === \"inherit\" ? \"inherit\" : [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let timer: NodeJS.Timeout | undefined;\n let output = \"\";\n let error: Error | undefined;\n\n if (opts.stdio === \"pipe\") {\n child.stdout?.on(\"data\", (chunk) => {\n output += chunk.toString();\n });\n child.stderr?.on(\"data\", (chunk) => {\n output += chunk.toString();\n });\n }\n\n if (opts.timeoutMs && opts.timeoutMs > 0) {\n timer = setTimeout(() => {\n error = new Error(`canary.run timed out after ${opts.timeoutMs}ms`);\n child.kill(\"SIGKILL\");\n }, opts.timeoutMs);\n }\n\n child.on(\"close\", (code) => {\n if (timer) clearTimeout(timer);\n resolve({ exitCode: code ?? 1, output: output || undefined, durationMs: Date.now() - started, error });\n });\n });\n}\n\nfunction summarize(jsonReportPath: string, eventLogPath: string, durationMs: number): RunResult[\"summary\"] {\n const base = {\n total: 0,\n passed: 0,\n failed: 0,\n flaky: 0,\n skipped: 0,\n durationMs,\n };\n\n const jsonReport = readJsonReport(jsonReportPath);\n if (jsonReport) {\n const counts = countTests(jsonReport);\n base.total = counts.total;\n base.passed = counts.passed;\n base.failed = counts.failed;\n base.flaky = counts.flaky;\n base.skipped = counts.skipped;\n base.durationMs = jsonReport.duration ?? durationMs;\n }\n\n const healed = countHealed(eventLogPath);\n if (healed) {\n return { ...base, healed };\n }\n return base;\n}\n\nfunction readJsonReport(reportPath: string): JsonReport | undefined {\n try {\n if (fs.existsSync(reportPath)) {\n const raw = fs.readFileSync(reportPath, \"utf-8\");\n return JSON.parse(raw) as JsonReport;\n }\n } catch {\n // ignore parse issues\n }\n return undefined;\n}\n\nfunction countTests(report: JsonReport): {\n total: number;\n passed: number;\n failed: number;\n flaky: number;\n skipped: number;\n} {\n let total = 0;\n let passed = 0;\n let failed = 0;\n let flaky = 0;\n let skipped = 0;\n\n const visitSuite = (suite?: JsonSuite) => {\n if (!suite) return;\n suite.tests?.forEach((test) => {\n total += 1;\n const statuses = test.results.map((r) => r.status);\n const hasFailed = statuses.includes(\"failed\") || statuses.includes(\"interrupted\");\n const hasPassed = statuses.includes(\"passed\");\n const hasTimedOut = statuses.includes(\"timedOut\");\n const allSkipped = statuses.every((s) => s === \"skipped\");\n\n if (allSkipped) {\n skipped += 1;\n } else if ((hasFailed || hasTimedOut) && hasPassed) {\n flaky += 1;\n } else if (hasFailed || hasTimedOut) {\n failed += 1;\n } else if (hasPassed && statuses.length > 1) {\n flaky += 1;\n } else if (hasPassed) {\n passed += 1;\n }\n });\n\n suite.suites?.forEach(visitSuite);\n };\n\n report.suites?.forEach(visitSuite);\n\n return { total, passed, failed, flaky, skipped };\n}\n\nfunction countHealed(eventLogPath: string): number | undefined {\n try {\n if (!fs.existsSync(eventLogPath)) return undefined;\n const raw = fs.readFileSync(eventLogPath, \"utf-8\").trim();\n if (!raw) return undefined;\n const lines = raw.split(\"\\n\");\n let healed = 0;\n for (const line of lines) {\n try {\n const event = JSON.parse(line);\n if (event?.healed === true) healed += 1;\n } catch {\n // ignore bad lines\n }\n }\n return healed;\n } catch {\n return undefined;\n }\n}\n\nexport const __internals = {\n buildArgs,\n buildReporterArgs,\n buildEnv,\n countTests,\n countHealed,\n summarize,\n};\n","import process from \"node:process\";\nimport { readStoredToken } from \"./auth\";\n\ntype LocalRunOptions = {\n apiUrl: string;\n token?: string;\n title?: string;\n featureSpec?: string;\n startUrl?: string;\n tunnelUrl?: string;\n};\n\ntype LocalRunResponse = {\n ok: boolean;\n runId?: string;\n watchUrl?: string;\n error?: string;\n};\n\nfunction getArgValue(argv: string[], key: string): string | undefined {\n const index = argv.indexOf(key);\n if (index === -1) return undefined;\n return argv[index + 1];\n}\n\nexport async function runLocalTest(argv: string[]) {\n const apiUrl = getArgValue(argv, \"--api-url\") ?? process.env.CANARY_API_URL ?? \"https://api.trycanary.ai\";\n const token =\n getArgValue(argv, \"--token\") ??\n process.env.CANARY_API_TOKEN ??\n (await readStoredToken());\n const title = getArgValue(argv, \"--title\");\n const featureSpec = getArgValue(argv, \"--feature\");\n const startUrl = getArgValue(argv, \"--start-url\");\n const tunnelUrl = getArgValue(argv, \"--tunnel-url\");\n\n if (!tunnelUrl && !startUrl) {\n console.error(\"Missing --tunnel-url or --start-url\");\n process.exit(1);\n }\n\n if (!token) {\n console.error(\"Missing token. Run `canary login` first or set CANARY_API_TOKEN.\");\n process.exit(1);\n }\n\n const result = await createLocalRun({\n apiUrl,\n token,\n title,\n featureSpec,\n startUrl,\n tunnelUrl,\n });\n\n console.log(`Local test queued: ${result.runId}`);\n if (result.watchUrl) {\n console.log(`Watch: ${result.watchUrl}`);\n }\n}\n\nexport async function createLocalRun(input: {\n apiUrl: string;\n token: string;\n title?: string;\n featureSpec?: string;\n startUrl?: string;\n tunnelUrl?: string;\n}): Promise<{ runId: string; watchUrl?: string }> {\n const body = {\n title: input.title ?? null,\n featureSpec: input.featureSpec ?? null,\n startUrl: input.startUrl ?? null,\n tunnelPublicUrl: input.tunnelUrl ?? null,\n };\n\n const response = await fetch(`${input.apiUrl}/local-tests/runs`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${input.token}`,\n },\n body: JSON.stringify(body),\n });\n\n const json = (await response.json()) as LocalRunResponse;\n if (!response.ok || !json.ok || !json.runId) {\n throw new Error(json.error ?? response.statusText);\n }\n\n return { runId: json.runId, watchUrl: json.watchUrl };\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\ntype StoredAuth = {\n token?: string;\n};\n\nexport async function readStoredToken(): Promise<string | null> {\n try {\n const filePath = path.join(os.homedir(), \".config\", \"canary-cli\", \"auth.json\");\n const content = await fs.readFile(filePath, \"utf8\");\n const parsed = JSON.parse(content) as StoredAuth;\n return typeof parsed.token === \"string\" ? parsed.token : null;\n } catch {\n return null;\n }\n}\n","import { createHash } from \"node:crypto\";\nimport os from \"node:os\";\nimport process from \"node:process\";\nimport { readStoredToken } from \"./auth\";\n\nexport type CreateTunnelResponse = {\n ok: boolean;\n tunnelId?: string;\n publicUrl?: string;\n token?: string;\n error?: string;\n};\n\ntype ProxyRequest = {\n type: \"http_request\";\n id: string;\n method: string;\n path: string;\n headers: Record<string, string>;\n bodyBase64?: string | null;\n};\n\ntype ProxyResponse = {\n type: \"http_response\";\n id: string;\n status: number;\n headers?: Record<string, string>;\n bodyBase64?: string | null;\n};\n\nfunction getArgValue(argv: string[], key: string): string | undefined {\n const index = argv.indexOf(key);\n if (index === -1) return undefined;\n return argv[index + 1];\n}\n\nfunction toWebSocketUrl(apiUrl: string): string {\n const url = new URL(apiUrl);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n return url.toString();\n}\n\nfunction createFingerprint(): string {\n const raw = `${os.hostname()}-${os.userInfo().username}-${process.version}`;\n return createHash(\"sha256\").update(raw).digest(\"hex\").slice(0, 16);\n}\n\nexport async function runTunnel(argv: string[]) {\n const apiUrl = getArgValue(argv, \"--api-url\") ?? process.env.CANARY_API_URL ?? \"https://api.trycanary.ai\";\n const token =\n getArgValue(argv, \"--token\") ??\n process.env.CANARY_API_TOKEN ??\n (await readStoredToken());\n const portRaw = getArgValue(argv, \"--port\") ?? process.env.CANARY_LOCAL_PORT;\n\n if (!portRaw) {\n console.error(\"Missing --port\");\n process.exit(1);\n }\n\n const port = Number(portRaw);\n if (Number.isNaN(port) || port <= 0) {\n console.error(\"Invalid --port value\");\n process.exit(1);\n }\n\n if (!token) {\n console.error(\"Missing token. Run `canary login` first or set CANARY_API_TOKEN.\");\n process.exit(1);\n }\n\n const data = await createTunnel({\n apiUrl,\n token,\n port,\n });\n\n const ws = connectTunnel({\n apiUrl,\n tunnelId: data.tunnelId,\n token: data.token,\n port,\n });\n\n ws.onopen = () => {\n console.log(`Tunnel connected: ${data.publicUrl ?? data.tunnelId}`);\n if (data.publicUrl) {\n console.log(`Public URL: ${data.publicUrl}`);\n }\n };\n\n await new Promise<void>(() => undefined);\n}\n\nexport async function createTunnel(input: {\n apiUrl: string;\n token: string;\n port: number;\n}): Promise<{ tunnelId: string; publicUrl?: string; token: string }> {\n const response = await fetch(`${input.apiUrl}/local-tests/tunnels`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${input.token}`,\n },\n body: JSON.stringify({\n requestedPort: input.port,\n clientFingerprint: createFingerprint(),\n }),\n });\n\n const data = (await response.json()) as CreateTunnelResponse;\n if (!response.ok || !data.ok || !data.tunnelId || !data.token) {\n throw new Error(data.error ?? response.statusText);\n }\n\n return { tunnelId: data.tunnelId, publicUrl: data.publicUrl, token: data.token };\n}\n\nexport function connectTunnel(input: {\n apiUrl: string;\n tunnelId: string;\n token: string;\n port: number;\n onReady?: () => void;\n}): WebSocket {\n const wsUrl = toWebSocketUrl(\n `${input.apiUrl}/local-tests/tunnels/${input.tunnelId}/connect?token=${input.token}`\n );\n const ws = new WebSocket(wsUrl);\n\n ws.onopen = () => {\n input.onReady?.();\n };\n\n ws.onerror = (event) => {\n console.error(\"Tunnel error\", event);\n };\n\n ws.onclose = () => {\n console.log(\"Tunnel closed\");\n };\n\n ws.onmessage = async (event) => {\n try {\n const raw =\n typeof event.data === \"string\"\n ? event.data\n : Buffer.from(event.data as ArrayBuffer).toString();\n const payload = JSON.parse(raw) as ProxyRequest | { type: string };\n if (payload.type === \"http_request\") {\n const request = payload as ProxyRequest;\n const targetUrl = `http://localhost:${input.port}${\n request.path.startsWith(\"/\") ? request.path : `/${request.path}`\n }`;\n const body = request.bodyBase64 ? Buffer.from(request.bodyBase64, \"base64\") : undefined;\n const headers = { ...request.headers };\n delete headers.host;\n delete headers[\"content-length\"];\n\n try {\n const res = await fetch(targetUrl, {\n method: request.method,\n headers,\n body: body ?? undefined,\n });\n\n const resBody = await res.arrayBuffer();\n const responsePayload: ProxyResponse = {\n type: \"http_response\",\n id: request.id,\n status: res.status,\n headers: Object.fromEntries(res.headers.entries()),\n bodyBase64: resBody.byteLength ? Buffer.from(resBody).toString(\"base64\") : null,\n };\n\n ws.send(JSON.stringify(responsePayload));\n } catch (error) {\n const responsePayload: ProxyResponse = {\n type: \"http_response\",\n id: request.id,\n status: 502,\n headers: { \"content-type\": \"text/plain\" },\n bodyBase64: Buffer.from(`Tunnel error: ${String(error)}`).toString(\"base64\"),\n };\n ws.send(JSON.stringify(responsePayload));\n }\n }\n if (payload.type === \"health_ping\") {\n ws.send(JSON.stringify({ type: \"health_pong\" }));\n }\n } catch (error) {\n console.error(\"Tunnel message error\", error);\n }\n };\n\n return ws;\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { spawn } from \"node:child_process\";\n\ntype StartResponse = {\n ok: boolean;\n deviceCode?: string;\n userCode?: string;\n verificationUrl?: string;\n expiresAt?: string;\n intervalSeconds?: number;\n error?: string;\n};\n\ntype PollResponse = {\n ok: boolean;\n status?: \"pending\" | \"approved\" | \"rejected\" | \"expired\";\n accessToken?: string;\n error?: string;\n};\n\nconst DEFAULT_APP_URL = \"https://app.trycanary.ai\";\n\nfunction getArgValue(argv: string[], key: string): string | undefined {\n const index = argv.indexOf(key);\n if (index === -1) return undefined;\n return argv[index + 1];\n}\n\nfunction shouldOpenBrowser(argv: string[]): boolean {\n return !argv.includes(\"--no-open\");\n}\n\nfunction openUrl(url: string) {\n const platform = process.platform;\n if (platform === \"darwin\") {\n spawn(\"open\", [url], { stdio: \"ignore\" });\n return;\n }\n if (platform === \"win32\") {\n spawn(\"cmd\", [\"/c\", \"start\", \"\", url], { stdio: \"ignore\" });\n return;\n }\n spawn(\"xdg-open\", [url], { stdio: \"ignore\" });\n}\n\nasync function writeToken(token: string) {\n const dir = path.join(os.homedir(), \".config\", \"canary-cli\");\n const filePath = path.join(dir, \"auth.json\");\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(filePath, JSON.stringify({ token }, null, 2), \"utf8\");\n return filePath;\n}\n\nexport async function runLogin(argv: string[]) {\n const apiUrl = getArgValue(argv, \"--api-url\") ?? process.env.CANARY_API_URL ?? \"https://api.trycanary.ai\";\n const appUrl = getArgValue(argv, \"--app-url\") ?? process.env.CANARY_APP_URL ?? DEFAULT_APP_URL;\n\n const startRes = await fetch(`${apiUrl}/cli-login/start`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ appUrl }),\n });\n\n const startJson = (await startRes.json()) as StartResponse;\n if (!startRes.ok || !startJson.ok || !startJson.deviceCode || !startJson.userCode) {\n console.error(\"Login start failed\", startJson.error ?? startRes.statusText);\n process.exit(1);\n }\n\n console.log(\"Login required.\");\n console.log(`User code: ${startJson.userCode}`);\n if (startJson.verificationUrl) {\n console.log(`Open: ${startJson.verificationUrl}`);\n if (shouldOpenBrowser(argv)) {\n try {\n openUrl(startJson.verificationUrl);\n } catch {\n console.log(\"Unable to open browser automatically. Please open the URL manually.\");\n }\n }\n }\n\n const intervalMs = (startJson.intervalSeconds ?? 3) * 1000;\n const expiresAt = startJson.expiresAt ? new Date(startJson.expiresAt).getTime() : null;\n\n while (true) {\n if (expiresAt && Date.now() > expiresAt) {\n console.error(\"Login code expired.\");\n process.exit(1);\n }\n\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n\n const pollRes = await fetch(`${apiUrl}/cli-login/poll`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ deviceCode: startJson.deviceCode }),\n });\n\n const pollJson = (await pollRes.json()) as PollResponse;\n if (!pollRes.ok || !pollJson.ok) {\n console.error(\"Login poll failed\", pollJson.error ?? pollRes.statusText);\n process.exit(1);\n }\n\n if (pollJson.status === \"approved\" && pollJson.accessToken) {\n const filePath = await writeToken(pollJson.accessToken);\n console.log(`Login successful. Token saved to ${filePath}`);\n console.log(\"Set CANARY_API_TOKEN to use the CLI without re-login.\");\n return;\n }\n\n if (pollJson.status === \"rejected\") {\n console.error(\"Login rejected.\");\n process.exit(1);\n }\n\n if (pollJson.status === \"expired\") {\n console.error(\"Login expired.\");\n process.exit(1);\n }\n }\n}\n","import process from \"node:process\";\nimport { readStoredToken } from \"./auth\";\nimport { createLocalRun } from \"./local-run\";\nimport { connectTunnel, createTunnel } from \"./tunnel\";\n\nfunction getArgValue(argv: string[], key: string): string | undefined {\n const index = argv.indexOf(key);\n if (index === -1) return undefined;\n return argv[index + 1];\n}\n\nexport async function runLocalSession(argv: string[]) {\n const apiUrl = getArgValue(argv, \"--api-url\") ?? process.env.CANARY_API_URL ?? \"https://api.trycanary.ai\";\n const token =\n getArgValue(argv, \"--token\") ??\n process.env.CANARY_API_TOKEN ??\n (await readStoredToken());\n\n if (!token) {\n console.error(\"Missing token. Run `canary login` first or set CANARY_API_TOKEN.\");\n process.exit(1);\n }\n\n const portRaw = getArgValue(argv, \"--port\") ?? process.env.CANARY_LOCAL_PORT;\n const tunnelUrl = getArgValue(argv, \"--tunnel-url\");\n const title = getArgValue(argv, \"--title\");\n const featureSpec = getArgValue(argv, \"--feature\");\n const startUrl = getArgValue(argv, \"--start-url\");\n\n if (!tunnelUrl && !portRaw) {\n console.error(\"Missing --port or --tunnel-url\");\n process.exit(1);\n }\n\n let publicUrl = tunnelUrl;\n let ws: WebSocket | null = null;\n\n if (!publicUrl && portRaw) {\n const port = Number(portRaw);\n if (Number.isNaN(port) || port <= 0) {\n console.error(\"Invalid --port value\");\n process.exit(1);\n }\n\n const tunnel = await createTunnel({ apiUrl, token, port });\n publicUrl = tunnel.publicUrl;\n\n ws = connectTunnel({\n apiUrl,\n tunnelId: tunnel.tunnelId,\n token: tunnel.token,\n port,\n onReady: () => {\n console.log(`Tunnel connected: ${publicUrl ?? tunnel.tunnelId}`);\n },\n });\n }\n\n if (!publicUrl) {\n console.error(\"Failed to resolve tunnel URL\");\n process.exit(1);\n }\n\n const run = await createLocalRun({\n apiUrl,\n token,\n title,\n featureSpec,\n startUrl,\n tunnelUrl: publicUrl,\n });\n\n console.log(`Local test queued: ${run.runId}`);\n if (run.watchUrl) {\n console.log(`Watch: ${run.watchUrl}`);\n }\n\n if (ws) {\n console.log(\"Tunnel active. Press Ctrl+C to stop.\");\n process.on(\"SIGINT\", () => {\n ws?.close();\n process.exit(0);\n });\n await new Promise<void>(() => undefined);\n }\n}\n","import process from \"node:process\";\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { CallToolRequestSchema, ListToolsRequestSchema } from \"@modelcontextprotocol/sdk/types.js\";\nimport { createParser, type ParsedEvent, type ReconnectInterval } from \"eventsource-parser\";\nimport { readStoredToken } from \"./auth\";\nimport { createLocalRun } from \"./local-run\";\nimport { connectTunnel, createTunnel } from \"./tunnel\";\n\ntype RunLocalInput = {\n port: number;\n instructions: string;\n title?: string;\n};\n\ntype WaitForRunInput = {\n runId: string;\n};\n\nconst DEFAULT_API_URL = \"https://api.trycanary.ai\";\n\nfunction resolveApiUrl(input?: string): string {\n return input ?? process.env.CANARY_API_URL ?? DEFAULT_API_URL;\n}\n\nasync function resolveToken(): Promise<string> {\n const token = process.env.CANARY_API_TOKEN ?? (await readStoredToken());\n if (!token) {\n throw new Error(\"Missing token. Run `canary login` first or set CANARY_API_TOKEN.\");\n }\n return token;\n}\n\nfunction toolText(text: string) {\n return { content: [{ type: \"text\", text }] };\n}\n\nfunction toolJson(data: unknown) {\n return { content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }] };\n}\n\nexport async function runMcp(argv: string[]) {\n const server = new Server(\n { name: \"canary-cli\", version: \"0.1.0\" },\n { capabilities: { tools: {} } }\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [\n {\n name: \"local_run_tests\",\n description:\n \"Start an async local test run. A tunnel is opened automatically. Returns runId and watchUrl.\",\n inputSchema: {\n type: \"object\",\n properties: {\n port: { type: \"number\" },\n instructions: { type: \"string\" },\n title: { type: \"string\" },\n },\n required: [\"port\", \"instructions\"],\n },\n },\n {\n name: \"local_wait_for_results\",\n description:\n \"Wait for a local test run to complete. Streams until completion and returns a compact report.\",\n inputSchema: {\n type: \"object\",\n properties: {\n runId: { type: \"string\" },\n },\n required: [\"runId\"],\n },\n },\n ],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (req) => {\n const token = await resolveToken();\n const tool = req.params.name;\n\n if (tool === \"local_run_tests\") {\n const input = req.params.arguments as RunLocalInput;\n const apiUrl = resolveApiUrl();\n const tunnel = await createTunnel({ apiUrl, token, port: input.port });\n connectTunnel({\n apiUrl,\n tunnelId: tunnel.tunnelId,\n token: tunnel.token,\n port: input.port,\n });\n const tunnelUrl = tunnel.publicUrl;\n\n const run = await createLocalRun({\n apiUrl,\n token,\n title: input.title ?? \"Local MCP run\",\n featureSpec: input.instructions,\n startUrl: null,\n tunnelUrl,\n });\n\n return toolJson({\n runId: run.runId,\n watchUrl: run.watchUrl,\n tunnelUrl,\n note:\n \"Testing is asynchronous. Use local_wait_for_results with the runId to wait for completion.\",\n });\n }\n\n if (tool === \"local_wait_for_results\") {\n const input = req.params.arguments as WaitForRunInput;\n const apiUrl = resolveApiUrl();\n const report = await waitForResult({ apiUrl, token, runId: input.runId });\n return toolJson(report);\n }\n\n return toolText(`Unknown tool: ${tool}`);\n });\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n return new Promise<void>(() => undefined);\n}\n\nasync function waitForResult(input: { apiUrl: string; token: string; runId: string }) {\n await streamUntilComplete(input);\n const response = await fetch(`${input.apiUrl}/local-tests/runs/${input.runId}`, {\n credentials: \"include\",\n headers: { authorization: `Bearer ${input.token}` },\n });\n const data = await response.json();\n const run = data?.data?.run ?? data?.run ?? data?.data;\n const summary = run?.summaryJson;\n return formatReport({ run, summary });\n}\n\nasync function streamUntilComplete(input: { apiUrl: string; token: string; runId: string }) {\n const response = await fetch(`${input.apiUrl}/local-tests/runs/${input.runId}/stream`, {\n headers: { authorization: `Bearer ${input.token}` },\n });\n\n if (!response.body) return;\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const parser = createParser((event: ParsedEvent | ReconnectInterval) => {\n if (event.type !== \"event\") return;\n if (event.event === \"status\") {\n try {\n const payload = JSON.parse(event.data);\n if (payload?.status === \"completed\" || payload?.status === \"failed\") {\n reader.cancel().catch(() => undefined);\n }\n } catch {}\n }\n if (event.event === \"complete\" || event.event === \"error\") {\n reader.cancel().catch(() => undefined);\n }\n });\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.feed(decoder.decode(value, { stream: true }));\n }\n}\n\nfunction formatReport(input: { run: any; summary: any }) {\n if (!input.summary) {\n return {\n runId: input.run?.id,\n status: input.run?.status ?? \"unknown\",\n summary: \"No final report available.\",\n };\n }\n\n const tested = Array.isArray(input.summary.testedItems) ? input.summary.testedItems : [];\n const status = input.summary.status ?? input.run?.status ?? \"unknown\";\n const issues =\n status === \"issues_found\"\n ? (input.summary.notes ? [input.summary.notes] : [\"Issues reported.\"])\n : [];\n\n return {\n runId: input.run?.id,\n status,\n summary: input.summary.summary ?? \"Run completed.\",\n testedItems: tested,\n issues,\n notes: input.summary.notes ?? null,\n };\n}\n"],"mappings":"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","names":["spawnSync","process","path","fileURLToPath","pathToFileURL","preloadPath","fs","path","requireFn","baseDir","path","preloadPath","fs","process","fs","os","path","process","os","process","getArgValue","os","process","fs","os","path","process","spawn","getArgValue","process","getArgValue","process","run","process","process","run","path","fileURLToPath","process","spawnSync","pathToFileURL"]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }