@canaryai/cli 0.1.6 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +52 -1
  2. package/dist/bin.js +1 -6
  3. package/dist/bin.js.map +1 -1
  4. package/dist/{chunk-7OCVIDC7.js → chunk-DGUM43GV.js} +1 -2
  5. package/dist/{chunk-55MFLJD7.js → chunk-G2X3H7AM.js} +1 -3
  6. package/dist/{chunk-55MFLJD7.js.map → chunk-G2X3H7AM.js.map} +1 -1
  7. package/dist/chunk-HJ2JWIJ7.js +91 -0
  8. package/dist/chunk-HJ2JWIJ7.js.map +1 -0
  9. package/dist/{chunk-7AP5KRVU.js → chunk-ROTCL5WO.js} +1 -3
  10. package/dist/{chunk-7AP5KRVU.js.map → chunk-ROTCL5WO.js.map} +1 -1
  11. package/dist/{chunk-Z6I3ZXZL.js → chunk-VYBCH4ZP.js} +2 -3
  12. package/dist/{chunk-Z6I3ZXZL.js.map → chunk-VYBCH4ZP.js.map} +1 -1
  13. package/dist/feature-flag-PN5IFFQR.js +226 -0
  14. package/dist/feature-flag-PN5IFFQR.js.map +1 -0
  15. package/dist/index.js +1207 -8
  16. package/dist/index.js.map +1 -1
  17. package/dist/knobs-DAG7HD2F.js +286 -0
  18. package/dist/knobs-DAG7HD2F.js.map +1 -0
  19. package/dist/{local-browser-5LJ7UPOH.js → local-browser-VOBIUIGT.js} +4 -5
  20. package/dist/{local-browser-5LJ7UPOH.js.map → local-browser-VOBIUIGT.js.map} +1 -1
  21. package/dist/{mcp-P2B24MTM.js → mcp-I6FCGDDR.js} +5 -6
  22. package/dist/{mcp-P2B24MTM.js.map → mcp-I6FCGDDR.js.map} +1 -1
  23. package/dist/psql-A3BADRQN.js +124 -0
  24. package/dist/psql-A3BADRQN.js.map +1 -0
  25. package/dist/redis-N2DSDDQU.js +130 -0
  26. package/dist/redis-N2DSDDQU.js.map +1 -0
  27. package/dist/runner/preload.js +2 -3
  28. package/dist/runner/preload.js.map +1 -1
  29. package/dist/test.js +2 -3
  30. package/dist/test.js.map +1 -1
  31. package/package.json +3 -4
  32. package/dist/bin.d.ts +0 -2
  33. package/dist/chunk-UBYYNMML.js +0 -21
  34. package/dist/chunk-UBYYNMML.js.map +0 -1
  35. package/dist/chunk-YA43CE6P.js +0 -781
  36. package/dist/chunk-YA43CE6P.js.map +0 -1
  37. /package/dist/{chunk-7OCVIDC7.js.map → chunk-DGUM43GV.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../src/runner/common.ts","../src/run.ts","../src/login.ts","../src/run-local.ts","../src/remote-test.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 { runRemoteTest } from \"./remote-test\";\n\n// Lazy-load playwright-dependent modules\nconst loadMcp = () => import(\"./mcp\").then((m) => m.runMcp);\nconst loadLocalBrowser = () => import(\"./local-browser/index\").then((m) => m.runLocalBrowser);\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\nfunction printHelp() {\n console.log(\n [\n \"canary: Local and remote testing CLI\",\n \"\",\n \"Usage:\",\n \" canary test [playwright options] Run local Playwright tests\",\n \" canary test --remote [options] Run remote workflow tests\",\n \" canary local-run --tunnel-url <url> [options]\",\n \" canary tunnel --port <localPort> [options]\",\n \" canary run --port <localPort> [options]\",\n \" canary mcp\",\n \" canary browser [--mode playwright|cdp] [--cdp-url <url>] [--no-headless]\",\n \" canary login [--app-url https://app.trycanary.ai] [--no-open]\",\n \" canary help\",\n \"\",\n \"Remote test options:\",\n \" --token <key> API key (or set CANARY_API_TOKEN)\",\n \" --api-url <url> API URL (default: https://api.trycanary.ai)\",\n \" --tag <tag> Filter workflows by tag\",\n \" --name-pattern <pat> Filter workflows by name pattern\",\n \" --verbose, -v Show all events\",\n \"\",\n \"Browser options:\",\n \" --mode <playwright|cdp> Browser mode (default: playwright)\",\n \" --cdp-url <url> CDP endpoint for existing Chrome\",\n \" --no-headless Run browser with visible UI\",\n \" --storage-state <path> Path to storage state JSON\",\n \" --instructions <text> Instructions for the cloud agent\",\n \"\",\n \"Flags:\",\n \" -h, --help Show help\",\n ].join(\"\\n\")\n );\n}\n\nexport async function main(argv: string[]) {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n printHelp();\n return;\n }\n\n const [command, ...rest] = argv;\n if (!command || command === \"help\") {\n printHelp();\n return;\n }\n\n if (command === \"test\") {\n // Check for --remote flag to run remote workflow tests\n if (rest.includes(\"--remote\")) {\n const remoteArgs = rest.filter((arg) => arg !== \"--remote\");\n await runRemoteTest(remoteArgs);\n return;\n }\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 const runMcp = await loadMcp();\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 if (command === \"browser\") {\n const runLocalBrowser = await loadLocalBrowser();\n await runLocalBrowser(rest);\n return;\n }\n\n console.log(`Unknown command \"${command}\".`);\n printHelp();\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 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","/**\n * Remote Test Command\n *\n * Triggers workflow tests on the Canary platform and streams results via SSE.\n * Designed for CI/CD pipelines - exits with code 0 on success, 1 on failure.\n *\n * Usage:\n * canary test --remote [options]\n *\n * Options:\n * --token <key> API key (or set CANARY_API_TOKEN env var)\n * --api-url <url> API URL (default: https://api.trycanary.ai)\n * --tag <tag> Filter workflows by tag\n * --name-pattern <pat> Filter workflows by name pattern\n * --verbose, -v Show all events (not just results)\n */\n\nimport process from \"node:process\";\nimport { createParser, type EventSourceMessage } from \"eventsource-parser\";\nimport { readStoredToken } from \"./auth\";\n\ntype WorkflowTestStatus = \"queued\" | \"running\" | \"waiting\" | \"success\" | \"failed\";\n\ntype WorkflowTestEvent = {\n type: \"workflow-test\";\n suiteId: string;\n workflowId: string;\n testRunId: string;\n workflowRunId: string | null;\n status: WorkflowTestStatus;\n startedAt: string | null;\n finishedAt: string | null;\n durationMs: number | null;\n errorMessage?: string | null;\n linkedIssueId?: string | null;\n message?: string;\n resumeAt?: string | null;\n segmentIndex?: number | null;\n totalSegments?: number | null;\n};\n\ntype WorkflowTestSuiteEvent = {\n type: \"workflow-test-suite\";\n suiteId: string;\n status: \"running\" | \"completed\";\n startedAt: string;\n finishedAt: string | null;\n durationMs: number | null;\n totalWorkflows: number;\n completedWorkflows: number;\n failedWorkflows: number;\n successfulWorkflows: number;\n errorMessage?: string | null;\n message?: string;\n};\n\ntype TriggerResponse = {\n ok: boolean;\n jobId?: string;\n suiteId?: string;\n startedAt?: string;\n error?: string;\n};\n\nfunction getArgValue(argv: string[], key: string): string | undefined {\n const index = argv.indexOf(key);\n if (index === -1 || index >= argv.length - 1) return undefined;\n return argv[index + 1];\n}\n\nfunction hasFlag(argv: string[], ...flags: string[]): boolean {\n return flags.some((flag) => argv.includes(flag));\n}\n\nfunction buildQueryParams(tag?: string, namePattern?: string): string {\n const params = new URLSearchParams();\n if (tag) params.set(\"tag\", tag);\n if (namePattern) params.set(\"namePattern\", namePattern);\n return params.toString();\n}\n\nfunction extractWorkflowName(message: string | undefined, workflowId: string): string {\n if (!message) return workflowId;\n const match = message.match(/^Flow \"(.+?)\" /);\n return match ? match[1] : workflowId;\n}\n\nfunction formatSummary(stats: {\n totalWorkflows: number;\n successfulWorkflows: number;\n failedWorkflows: number;\n completedWorkflows: number;\n}): { message: string; exitCode: number } {\n const { totalWorkflows, successfulWorkflows, failedWorkflows, completedWorkflows } = stats;\n\n if (totalWorkflows === 0) {\n return { message: \"No workflows found matching the filter criteria.\", exitCode: 0 };\n }\n\n const passRate = Math.round((successfulWorkflows / totalWorkflows) * 100);\n const waitingWorkflows = totalWorkflows - completedWorkflows;\n\n let message: string;\n let exitCode: number;\n\n if (failedWorkflows > 0) {\n message = `FAILED: ${failedWorkflows} of ${totalWorkflows} workflows failed (${passRate}% pass rate)`;\n exitCode = 1;\n } else {\n message = `PASSED: ${successfulWorkflows} of ${totalWorkflows} workflows passed`;\n exitCode = 0;\n }\n\n if (waitingWorkflows > 0) {\n message += `\\nNote: ${waitingWorkflows} workflow(s) are still waiting (scheduled for later)`;\n }\n\n return { message, exitCode };\n}\n\n// Export internals for testing\nexport const __internals = {\n getArgValue,\n hasFlag,\n buildQueryParams,\n extractWorkflowName,\n formatSummary,\n};\n\nexport async function runRemoteTest(argv: string[]): Promise<void> {\n const apiUrl =\n getArgValue(argv, \"--api-url\") ??\n process.env.CANARY_API_URL ??\n \"https://api.trycanary.ai\";\n\n const token =\n getArgValue(argv, \"--token\") ??\n process.env.CANARY_API_TOKEN ??\n (await readStoredToken());\n\n const tag = getArgValue(argv, \"--tag\");\n const namePattern = getArgValue(argv, \"--name-pattern\");\n const verbose = hasFlag(argv, \"--verbose\", \"-v\");\n\n if (!token) {\n console.error(\"Error: No API token found.\");\n console.error(\"\");\n console.error(\"Set CANARY_API_TOKEN environment variable or run:\");\n console.error(\" canary login\");\n console.error(\"\");\n console.error(\"Or create an API key in Settings > API Keys and pass it:\");\n console.error(\" canary test --remote --token cnry_...\");\n process.exit(1);\n }\n\n console.log(\"Starting remote workflow tests...\");\n if (tag) console.log(` Filtering by tag: ${tag}`);\n if (namePattern) console.log(` Filtering by name pattern: ${namePattern}`);\n console.log(\"\");\n\n // 1. Trigger test run\n const queryParams = new URLSearchParams();\n if (tag) queryParams.set(\"tag\", tag);\n if (namePattern) queryParams.set(\"namePattern\", namePattern);\n\n const triggerUrl = `${apiUrl}/workflows/test-runs${queryParams.toString() ? `?${queryParams}` : \"\"}`;\n\n let triggerRes: Response;\n try {\n triggerRes = await fetch(triggerUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n });\n } catch (err) {\n console.error(`Failed to connect to API: ${err}`);\n process.exit(1);\n }\n\n if (!triggerRes.ok) {\n const errorText = await triggerRes.text();\n console.error(`Failed to start tests: ${triggerRes.status}`);\n console.error(errorText);\n process.exit(1);\n }\n\n const triggerData = (await triggerRes.json()) as TriggerResponse;\n if (!triggerData.ok || !triggerData.suiteId) {\n console.error(`Failed to start tests: ${triggerData.error ?? \"Unknown error\"}`);\n process.exit(1);\n }\n\n const { suiteId, jobId } = triggerData;\n if (verbose) {\n console.log(`Suite ID: ${suiteId}`);\n console.log(`Job ID: ${jobId}`);\n console.log(\"\");\n }\n\n // 2. Subscribe to SSE stream\n const streamUrl = `${apiUrl}/workflows/test-runs/stream?suiteId=${suiteId}`;\n\n let streamRes: Response;\n try {\n streamRes = await fetch(streamUrl, {\n headers: {\n Authorization: `Bearer ${token}`,\n Accept: \"text/event-stream\",\n },\n });\n } catch (err) {\n console.error(`Failed to connect to event stream: ${err}`);\n process.exit(1);\n }\n\n if (!streamRes.ok || !streamRes.body) {\n console.error(`Failed to connect to event stream: ${streamRes.status}`);\n process.exit(1);\n }\n\n // Track state\n let exitCode = 0;\n let hasCompleted = false;\n const workflowNames = new Map<string, string>();\n let totalWorkflows = 0;\n let completedWorkflows = 0;\n let failedWorkflows = 0;\n let successfulWorkflows = 0;\n\n // 3. Parse SSE events\n const parser = createParser({\n onEvent: (event: EventSourceMessage) => {\n if (!event.data) return;\n\n try {\n const data = JSON.parse(event.data) as\n | WorkflowTestEvent\n | WorkflowTestSuiteEvent\n | { error?: string };\n\n if (verbose) {\n console.log(`[${event.event}] ${JSON.stringify(data)}`);\n }\n\n if (event.event === \"workflow-test\") {\n const testEvent = data as WorkflowTestEvent;\n const { status, workflowId, message, errorMessage } = testEvent;\n const name = workflowNames.get(workflowId) || message?.replace(/^Flow \"(.+)\" .*$/, \"$1\") || workflowId;\n\n if (message?.startsWith('Flow \"')) {\n const match = message.match(/^Flow \"(.+?)\" /);\n if (match) workflowNames.set(workflowId, match[1]);\n }\n\n if (!verbose) {\n if (status === \"success\") {\n console.log(` \\u2713 ${name}`);\n } else if (status === \"failed\") {\n console.log(` \\u2717 ${name}`);\n if (errorMessage) {\n console.log(` Error: ${errorMessage.slice(0, 200)}`);\n }\n exitCode = 1;\n } else if (status === \"running\") {\n // Don't log running status in non-verbose mode\n } else if (status === \"waiting\") {\n console.log(` \\u23F3 ${name} (waiting for scheduled time)`);\n }\n }\n }\n\n if (event.event === \"workflow-test-suite\") {\n const suiteEvent = data as WorkflowTestSuiteEvent;\n totalWorkflows = suiteEvent.totalWorkflows;\n completedWorkflows = suiteEvent.completedWorkflows;\n failedWorkflows = suiteEvent.failedWorkflows;\n successfulWorkflows = suiteEvent.successfulWorkflows;\n\n if (suiteEvent.status === \"completed\") {\n hasCompleted = true;\n }\n }\n\n if (event.event === \"error\") {\n const errorData = data as { error?: string };\n console.error(`Stream error: ${errorData.error ?? \"Unknown error\"}`);\n exitCode = 1;\n }\n } catch {\n // Ignore parse errors for keepalive, etc.\n }\n },\n });\n\n const reader = streamRes.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (!hasCompleted) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.feed(decoder.decode(value, { stream: true }));\n }\n } finally {\n reader.releaseLock();\n }\n\n // 4. Print summary\n console.log(\"\");\n console.log(\"─\".repeat(50));\n\n if (totalWorkflows === 0) {\n console.log(\"No workflows found matching the filter criteria.\");\n process.exit(0);\n }\n\n const passRate = totalWorkflows > 0 ? Math.round((successfulWorkflows / totalWorkflows) * 100) : 0;\n\n if (failedWorkflows > 0) {\n console.log(`FAILED: ${failedWorkflows} of ${totalWorkflows} workflows failed (${passRate}% pass rate)`);\n exitCode = 1;\n } else {\n console.log(`PASSED: ${successfulWorkflows} of ${totalWorkflows} workflows passed`);\n }\n\n const waitingWorkflows = totalWorkflows - completedWorkflows;\n if (waitingWorkflows > 0) {\n console.log(`Note: ${waitingWorkflows} workflow(s) are still waiting (scheduled for later)`);\n }\n\n process.exit(exitCode);\n}\n"],"mappings":"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","names":["spawnSync","process","path","fileURLToPath","pathToFileURL","preloadPath","fs","path","requireFn","baseDir","path","preloadPath","fs","fs","os","path","process","spawn","process","getArgValue","process","run","process","getArgValue","getArgValue","process","path","fileURLToPath","process","spawnSync","pathToFileURL"]}