@midscene/test 1.12.4-beta-20260903111111.0 → 1.12.4
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/es/android/index.mjs +50 -106
- package/dist/es/android/index.mjs.map +1 -1
- package/dist/es/cli/index.mjs +99 -149
- package/dist/es/cli/index.mjs.map +1 -1
- package/dist/es/harmony/index.mjs +119 -0
- package/dist/es/harmony/index.mjs.map +1 -0
- package/dist/es/index.mjs +36 -87
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/ios/index.mjs +51 -101
- package/dist/es/ios/index.mjs.map +1 -1
- package/dist/es/midscene/index.mjs +37 -235
- package/dist/es/midscene/index.mjs.map +1 -1
- package/dist/es/playwright/index.mjs +14 -10
- package/dist/es/playwright/index.mjs.map +1 -1
- package/dist/es/test-cli.mjs +102 -150
- package/dist/es/test-cli.mjs.map +1 -1
- package/dist/lib/android/index.js +151 -178
- package/dist/lib/android/index.js.map +1 -1
- package/dist/lib/cli/index.js +99 -149
- package/dist/lib/cli/index.js.map +1 -1
- package/dist/lib/harmony/index.js +188 -0
- package/dist/lib/harmony/index.js.map +1 -0
- package/dist/lib/index.js +37 -100
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/ios/index.js +152 -173
- package/dist/lib/ios/index.js.map +1 -1
- package/dist/lib/midscene/index.js +264 -412
- package/dist/lib/midscene/index.js.map +1 -1
- package/dist/lib/playwright/index.js +14 -10
- package/dist/lib/playwright/index.js.map +1 -1
- package/dist/lib/test-cli.js +102 -150
- package/dist/lib/test-cli.js.map +1 -1
- package/dist/types/android/index.d.ts +27 -101
- package/dist/types/cli/index.d.ts +9 -32
- package/dist/types/harmony/index.d.ts +124 -0
- package/dist/types/index.d.ts +18 -45
- package/dist/types/ios/index.d.ts +28 -107
- package/dist/types/midscene/index.d.ts +54 -153
- package/dist/types/playwright/index.d.ts +9 -63
- package/package.json +25 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli/index.mjs","sources":["../../../src/errors.ts","../../../src/node/define-node.ts","../../../src/engine/registry.ts","../../../src/cli/test-project.ts","../../../src/engine/project-runtime.ts","../../../src/parser/normalize.ts","../../../src/engine/history.ts","../../../src/engine/execute-step.ts","../../../src/engine/scope-teardown.ts","../../../src/engine/document-runtime.ts","../../../src/engine/run-collected-case.ts","../../../src/engine/run-workflow-document.ts","../../../src/parser/variables.ts","../../../src/parser/collect.ts","../../../src/cli/result-store.ts","../../../src/cli/test-project-runner.ts"],"sourcesContent":["import type { z } from 'zod/v4';\n\nexport interface WorkflowErrorOptions {\n code?: string;\n details?: unknown;\n cause?: unknown;\n}\n\nexport class WorkflowError extends Error {\n readonly code: string;\n readonly details?: unknown;\n\n constructor(message: string, options: WorkflowErrorOptions = {}) {\n super(message, { cause: options.cause });\n this.name = new.target.name;\n this.code = options.code ?? 'WORKFLOW_ERROR';\n this.details = options.details;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n ...(this.details === undefined ? {} : { details: this.details }),\n };\n }\n}\n\nexport class WorkflowParseError extends WorkflowError {\n constructor(message: string, details?: unknown, cause?: unknown) {\n super(message, { code: 'WORKFLOW_PARSE_ERROR', details, cause });\n }\n}\n\nexport class NodeDefinitionError extends WorkflowError {\n constructor(message: string, details?: unknown) {\n super(message, { code: 'NODE_DEFINITION_ERROR', details });\n }\n}\n\nexport class DuplicateNodeError extends WorkflowError {\n readonly node: string;\n\n constructor(node: string) {\n super(`Node \"${node}\" is already registered.`, {\n code: 'DUPLICATE_NODE',\n details: { node },\n });\n this.node = node;\n }\n}\n\nexport class NodeNotFoundError extends WorkflowError {\n readonly node: string;\n\n constructor(node: string) {\n super(`Node \"${node}\" is not registered.`, {\n code: 'NODE_NOT_FOUND',\n details: { node },\n });\n this.node = node;\n }\n}\n\nexport class NodeInputValidationError extends WorkflowError {\n constructor(message: string, details?: unknown) {\n super(message, { code: 'NODE_INPUT_VALIDATION_ERROR', details });\n }\n\n static fromZod(node: string, error: z.ZodError): NodeInputValidationError {\n const issues = error.issues.map((issue) => ({\n code: issue.code,\n path: issue.path.map(String).join('.'),\n message: issue.message,\n }));\n const firstIssue = issues[0];\n const path = firstIssue?.path || '<root>';\n const message = firstIssue?.message ?? 'invalid input';\n return new NodeInputValidationError(\n `Node \"${node}\" input validation failed at \"${path}\": ${message}`,\n { node, issues },\n );\n }\n}\n\nexport class StepTimeoutError extends WorkflowError {\n readonly timeoutMs: number;\n readonly node?: string;\n\n constructor(timeoutMs: number, node?: string) {\n super(\n node\n ? `Node \"${node}\" timed out after ${timeoutMs}ms.`\n : `Step timed out after ${timeoutMs}ms.`,\n {\n code: 'STEP_TIMEOUT',\n details: { timeoutMs, ...(node === undefined ? {} : { node }) },\n },\n );\n this.timeoutMs = timeoutMs;\n this.node = node;\n }\n}\n\nexport class NodeExecutionError extends WorkflowError {\n readonly node: string;\n\n constructor(node: string, cause: unknown) {\n const causeMessage =\n cause instanceof Error ? cause.message : String(cause ?? 'Unknown error');\n super(`Node \"${node}\" failed: ${causeMessage}`, {\n code: 'NODE_EXECUTION_ERROR',\n details: { node },\n cause,\n });\n this.node = node;\n }\n}\n\nexport class WorkflowLifecycleError extends WorkflowError {\n constructor(message: string, details?: unknown) {\n super(message, { code: 'WORKFLOW_LIFECYCLE_ERROR', details });\n }\n}\n\nexport class ProjectSetupError extends WorkflowError {\n constructor(cause: unknown, details: { projectName: string }) {\n const causeMessage =\n cause instanceof Error ? cause.message : String(cause ?? 'Unknown error');\n super(`Project \"${details.projectName}\" setup failed: ${causeMessage}`, {\n code: 'PROJECT_SETUP_ERROR',\n details,\n cause,\n });\n }\n}\n\nexport class ProjectTeardownError extends WorkflowError {\n constructor(\n cause: unknown,\n details: { projectName: string; registrationIndex: number },\n ) {\n const causeMessage =\n cause instanceof Error ? cause.message : String(cause ?? 'Unknown error');\n super(`Project \"${details.projectName}\" teardown failed: ${causeMessage}`, {\n code: 'PROJECT_TEARDOWN_ERROR',\n details,\n cause,\n });\n }\n}\n\nexport class NodeScopeTeardownError extends WorkflowError {\n constructor(\n cause: unknown,\n details: {\n scope: 'case' | 'document';\n scopeId: string;\n node: string;\n registrationIndex: number;\n },\n ) {\n const causeMessage =\n cause instanceof Error ? cause.message : String(cause ?? 'Unknown error');\n super(\n `${details.scope === 'case' ? 'Case attempt' : 'Workflow document'} node teardown failed for \"${details.node}\": ${causeMessage}`,\n { code: 'NODE_SCOPE_TEARDOWN_ERROR', details, cause },\n );\n }\n}\n\nexport class FatalDeviceError extends WorkflowError {\n constructor(message: string, cause?: unknown) {\n super(message, { code: 'FATAL_DEVICE_ERROR', cause });\n }\n}\n\nexport const isFatalDeviceError = (error: unknown): boolean => {\n if (error instanceof FatalDeviceError) return true;\n if (error instanceof WorkflowError && error.code === 'FATAL_DEVICE_ERROR') {\n return true;\n }\n if (\n error instanceof Error &&\n /device offline|device not found|(?:adb|bdc|device) connection (?:was )?closed/i.test(\n error.message,\n )\n ) {\n return true;\n }\n return error instanceof Error && error.cause !== undefined\n ? isFatalDeviceError(error.cause)\n : false;\n};\n\nexport class CaseExecutionError extends WorkflowError {\n readonly result: import('./engine/types').CaseRunResult;\n\n constructor(result: import('./engine/types').CaseRunResult) {\n super(`Case \"${result.name}\" failed.`, {\n code: 'CASE_EXECUTION_FAILED',\n details: { caseId: result.caseId, runId: result.runId },\n });\n this.result = result;\n }\n}\n\nexport class WorkflowDocumentExecutionError extends WorkflowError {\n readonly result: import('./engine/types').WorkflowDocumentRunResult;\n\n constructor(result: import('./engine/types').WorkflowDocumentRunResult) {\n super(`Workflow document \"${result.sourcePath}\" failed.`, {\n code: 'WORKFLOW_DOCUMENT_EXECUTION_FAILED',\n details: {\n documentId: result.documentId,\n documentRunId: result.documentRunId,\n },\n });\n this.result = result;\n }\n}\n\nexport function normalizeNodeExecutionError(\n error: unknown,\n node: string,\n): WorkflowError {\n return error instanceof WorkflowError\n ? error\n : new NodeExecutionError(node, error);\n}\n","import { z } from 'zod/v4';\nimport { NodeDefinitionError } from '../errors';\nimport type {\n DefineNodeOptions,\n DefineNodeWithSchemaOptions,\n NodeDefinition,\n NodeDefinitionWithSchema,\n NodeInputSchema,\n} from './types';\n\nconst validateOptionalText = (\n value: unknown,\n field: 'title' | 'description',\n node: string,\n): void => {\n if (\n value !== undefined &&\n (typeof value !== 'string' || value.trim().length === 0)\n ) {\n throw new NodeDefinitionError(\n `Node \"${node}\" ${field} must be a non-empty string.`,\n { node, field },\n );\n }\n};\n\nconst validateInputSchema = (schema: unknown, node: string): void => {\n if (schema === undefined) return;\n if (!(schema instanceof z.ZodObject)) {\n throw new NodeDefinitionError(\n `Node \"${node}\" inputSchema must be a Zod object schema.`,\n { node, field: 'inputSchema' },\n );\n }\n if ('$' in schema.shape) {\n throw new NodeDefinitionError(\n `Node \"${node}\" inputSchema must not declare \"$\" as an input property.`,\n { node, field: 'inputSchema.$' },\n );\n }\n};\n\nconst validateDefinition = (options: {\n name: string;\n title?: unknown;\n description?: unknown;\n inputSchema?: unknown;\n execute: unknown;\n}): void => {\n if (!options || typeof options !== 'object') {\n throw new NodeDefinitionError('Node definition must be an object.');\n }\n\n if (typeof options.name !== 'string' || options.name.trim().length === 0) {\n throw new NodeDefinitionError('Node name must be a non-empty string.');\n }\n\n validateOptionalText(options.title, 'title', options.name);\n validateOptionalText(options.description, 'description', options.name);\n validateInputSchema(options.inputSchema, options.name);\n\n if (typeof options.execute !== 'function') {\n throw new NodeDefinitionError(\n `Node \"${options.name}\" must provide an execute function.`,\n { node: options.name },\n );\n }\n};\n\nexport function defineNode<\n TSchema extends NodeInputSchema,\n TData = unknown,\n TContext = unknown,\n>(\n options: DefineNodeWithSchemaOptions<TSchema, TData, TContext>,\n): NodeDefinitionWithSchema<TSchema, TData, TContext>;\n\nexport function defineNode<\n TInput = unknown,\n TData = unknown,\n TContext = unknown,\n>(\n options: DefineNodeOptions<TInput, TData, TContext>,\n): NodeDefinition<TInput, TData, TContext>;\n\nexport function defineNode(\n options: DefineNodeOptions<any, any, any>,\n): NodeDefinition<any, any, any> {\n validateDefinition(options);\n return options;\n}\n","import { DuplicateNodeError, NodeNotFoundError } from '../errors';\nimport { defineNode } from '../node/define-node';\nimport type { NodeDefinition } from '../node/types';\n\nexport class NodeRegistry {\n readonly #nodes = new Map<string, NodeDefinition<any, any, any>>();\n\n constructor(nodes: readonly NodeDefinition<any, any>[] = []) {\n for (const node of nodes) {\n this.register(node);\n }\n }\n\n register<TInput, TData>(node: NodeDefinition<TInput, TData>): this {\n defineNode(node);\n\n if (this.#nodes.has(node.name)) {\n throw new DuplicateNodeError(node.name);\n }\n\n this.#nodes.set(node.name, node);\n return this;\n }\n\n get(name: string): NodeDefinition<any, any> | undefined {\n return this.#nodes.get(name);\n }\n\n require(name: string): NodeDefinition<any, any> {\n const node = this.get(name);\n if (!node) {\n throw new NodeNotFoundError(name);\n }\n return node;\n }\n\n has(name: string): boolean {\n return this.#nodes.has(name);\n }\n\n names(): string[] {\n return [...this.#nodes.keys()];\n }\n\n definitions(): readonly NodeDefinition<any, any, any>[] {\n return [...this.#nodes.values()];\n }\n}\n","import { dirname, isAbsolute, resolve, sep } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { require as tsxRequire } from 'tsx/cjs/api';\nimport { tsImport } from 'tsx/esm/api';\nimport { NodeRegistry } from '../engine/registry';\nimport type { Awaitable } from '../engine/types';\nimport type { WorkflowError } from '../errors';\nimport type { NodeDefinition } from '../node/types';\n\nexport type TestPlatform = 'web' | 'android' | 'ios' | 'computer';\n\nexport type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue =\n | JsonPrimitive\n | readonly JsonValue[]\n | { readonly [key: string]: JsonValue };\n\nexport interface TestFileSelection {\n include: readonly string[];\n exclude?: readonly string[];\n}\n\nexport interface TestTagSelection {\n include?: readonly string[];\n exclude?: readonly string[];\n}\n\nexport interface TestOptions {\n maxConcurrency?: number;\n bail?: number;\n testTimeout?: number;\n}\n\nexport interface ResolvedTestOptions {\n maxConcurrency: number;\n bail: number;\n testTimeout: number;\n}\n\nexport interface TestOutputDefinition {\n reportDir?: string;\n}\n\nexport interface ResolvedTestOutputDefinition {\n reportDir: string;\n}\n\nexport interface ExecutionProjectDefinition<TProjectContext = unknown> {\n name: string;\n platform: TestPlatform;\n setup?: ProjectSetupDefinition<TProjectContext>;\n files?: TestFileSelection;\n tags?: TestTagSelection;\n retry?: number;\n variables?: Readonly<Record<string, JsonValue>>;\n}\n\nexport interface ResolvedExecutionProject<TProjectContext = unknown> {\n readonly projectId: string;\n readonly name: string;\n readonly platform: TestPlatform;\n readonly setup?: ProjectSetupDefinition<TProjectContext>;\n readonly files?: TestFileSelection;\n readonly tags: Readonly<Required<TestTagSelection>>;\n readonly retry: number;\n readonly variables: Readonly<Record<string, JsonValue>>;\n}\n\nconst projectIdFromIndex = (index: number): string => `project-${index}`;\n\nexport interface ProjectSetupContext<TProjectContext = unknown> {\n readonly project: ResolvedExecutionProject<TProjectContext>;\n readonly env: Readonly<NodeJS.ProcessEnv>;\n readonly signal: AbortSignal;\n onTeardown(teardown: ProjectTeardown<TProjectContext>): void;\n}\n\nexport interface ProjectTeardownContext<TProjectContext = unknown> {\n readonly project: ResolvedExecutionProject<TProjectContext>;\n readonly context: TProjectContext | undefined;\n readonly status: 'success' | 'failed';\n readonly setupError?: WorkflowError;\n}\n\nexport type ProjectTeardown<TProjectContext = unknown> = (\n ctx: ProjectTeardownContext<TProjectContext>,\n) => Awaitable<void>;\n\nexport interface ProjectSetupDefinition<TProjectContext = unknown> {\n name: string;\n platform?: TestPlatform | readonly TestPlatform[];\n setup(ctx: ProjectSetupContext<TProjectContext>): Awaitable<TProjectContext>;\n}\n\nexport interface TestProjectDefinition<TContext = undefined> {\n setup?: ProjectSetupDefinition<TContext>;\n projects?: readonly ExecutionProjectDefinition<TContext>[];\n test?: TestOptions;\n output?: TestOutputDefinition;\n nodes: readonly NodeDefinition<any, any, TContext>[];\n}\n\nexport interface LoadedTestProject<TContext = undefined> {\n projects: readonly ResolvedExecutionProject<TContext>[];\n hasExplicitProjects: boolean;\n test: ResolvedTestOptions;\n output: ResolvedTestOutputDefinition;\n nodes: NodeRegistry;\n resolveNode(name: string): NodeDefinition<any, any, TContext> | undefined;\n}\n\nexport const defineTestProject = <TContext = undefined>(\n definition: TestProjectDefinition<TContext>,\n): TestProjectDefinition<TContext> => definition;\n\nexport const defineProjectSetup = <TProjectContext>(\n definition: ProjectSetupDefinition<TProjectContext>,\n): ProjectSetupDefinition<TProjectContext> => definition;\n\nconst getDefaultExport = (loaded: unknown, absolutePath: string): unknown => {\n if (typeof loaded === 'object' && loaded !== null && 'default' in loaded) {\n const defaultExport = (loaded as { default: unknown }).default;\n if (\n typeof defaultExport === 'object' &&\n defaultExport !== null &&\n '__esModule' in defaultExport\n ) {\n if ('default' in defaultExport) {\n return (defaultExport as { default: unknown }).default;\n }\n throw new TypeError(\n `Midscene config \"${absolutePath}\" must have a default export.`,\n );\n }\n return defaultExport;\n }\n throw new TypeError(\n `Midscene config \"${absolutePath}\" must have a default export.`,\n );\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst rejectUnknownKeys = (\n value: Record<string, unknown>,\n allowedKeys: readonly string[],\n label: string,\n): void => {\n const allowed = new Set(allowedKeys);\n const unknown = Object.keys(value).find((key) => !allowed.has(key));\n if (unknown) {\n throw new TypeError(\n `Midscene config ${label}.${unknown} is not supported.`,\n );\n }\n};\n\nconst isAbsolutePattern = (pattern: string): boolean =>\n isAbsolute(pattern) ||\n /^[A-Za-z]:[\\\\/]/.test(pattern) ||\n pattern.startsWith('\\\\\\\\');\n\nconst validatePatterns = (\n value: unknown,\n field: 'include' | 'exclude',\n label = 'files',\n allowEmptyInclude = false,\n): readonly string[] => {\n if (!Array.isArray(value)) {\n throw new TypeError(`Midscene config ${label}.${field} must be an array.`);\n }\n if (field === 'include' && value.length === 0 && !allowEmptyInclude) {\n throw new TypeError(\n `Midscene config ${label}.include must be a non-empty array.`,\n );\n }\n\n return value.map((pattern, index) => {\n if (typeof pattern !== 'string' || pattern.trim().length === 0) {\n throw new TypeError(\n `Midscene config ${label}.${field}[${index}] must be a non-empty string.`,\n );\n }\n if (isAbsolutePattern(pattern)) {\n throw new TypeError(\n `Midscene config ${label}.${field}[${index}] must be relative to the project root.`,\n );\n }\n if (pattern.split(/[\\\\/]/).includes('..')) {\n throw new TypeError(\n `Midscene config ${label}.${field}[${index}] must not contain a \"..\" path segment.`,\n );\n }\n if (pattern.includes('\\\\')) {\n throw new TypeError(\n `Midscene config ${label}.${field}[${index}] must use POSIX path separators (/).`,\n );\n }\n if (pattern.startsWith('!')) {\n if (field === 'include') {\n throw new TypeError(\n `Midscene config ${label}.include[${index}] must not be a negated pattern. Use files.exclude instead.`,\n );\n }\n throw new TypeError(\n `Midscene config ${label}.exclude[${index}] must not be a negated pattern.`,\n );\n }\n return pattern;\n });\n};\n\nexport const validateTestFileSelection = (\n value: unknown,\n label = 'files',\n): TestFileSelection | undefined => {\n if (value === undefined) return undefined;\n if (!isRecord(value)) {\n throw new TypeError(`Midscene config ${label} must be an object.`);\n }\n const include = validatePatterns(value.include, 'include', label);\n const exclude =\n value.exclude === undefined\n ? undefined\n : validatePatterns(value.exclude, 'exclude', label);\n return Object.freeze({\n include: Object.freeze(include),\n ...(exclude ? { exclude: Object.freeze(exclude) } : {}),\n });\n};\n\nconst validateTagList = (\n value: unknown,\n field: 'include' | 'exclude',\n label: string,\n): readonly string[] => {\n if (value === undefined) return [];\n if (!Array.isArray(value)) {\n throw new TypeError(`Midscene config ${label}.${field} must be an array.`);\n }\n return value.map((tag, index) => {\n if (typeof tag !== 'string' || tag.trim().length === 0) {\n throw new TypeError(\n `Midscene config ${label}.${field}[${index}] must be a non-empty string.`,\n );\n }\n return tag;\n });\n};\n\nconst validateTagSelection = (\n value: unknown,\n label: string,\n): Readonly<Required<TestTagSelection>> => {\n if (value === undefined) return Object.freeze({ include: [], exclude: [] });\n if (!isRecord(value)) {\n throw new TypeError(`Midscene config ${label} must be an object.`);\n }\n return Object.freeze({\n include: Object.freeze(validateTagList(value.include, 'include', label)),\n exclude: Object.freeze(validateTagList(value.exclude, 'exclude', label)),\n });\n};\n\nfunction assertJsonValue(\n value: unknown,\n path: string,\n seen: Set<unknown>,\n): asserts value is JsonValue {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean'\n ) {\n return;\n }\n if (typeof value === 'number') {\n if (Number.isFinite(value)) return;\n throw new TypeError(`Midscene config ${path} must be JSON-compatible.`);\n }\n if (typeof value !== 'object' || value === undefined) {\n throw new TypeError(`Midscene config ${path} must be JSON-compatible.`);\n }\n if (\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) !== Object.prototype &&\n Object.getPrototypeOf(value) !== null\n ) {\n throw new TypeError(`Midscene config ${path} must be JSON-compatible.`);\n }\n if (seen.has(value)) {\n throw new TypeError(`Midscene config ${path} must not contain cycles.`);\n }\n seen.add(value);\n if (Array.isArray(value)) {\n value.forEach((item, index) =>\n assertJsonValue(item, `${path}[${index}]`, seen),\n );\n } else {\n for (const [key, child] of Object.entries(value)) {\n assertJsonValue(child, `${path}.${key}`, seen);\n }\n }\n seen.delete(value);\n}\n\nconst deepFreezeJson = <T extends JsonValue>(value: T): T => {\n if (typeof value === 'object' && value !== null) {\n for (const child of Object.values(value)) deepFreezeJson(child);\n Object.freeze(value);\n }\n return value;\n};\n\nconst validateVariables = (\n value: unknown,\n label: string,\n): Readonly<Record<string, JsonValue>> => {\n if (value === undefined) return Object.freeze({});\n if (!isRecord(value)) {\n throw new TypeError(`Midscene config ${label} must be an object.`);\n }\n assertJsonValue(value, label, new Set());\n return deepFreezeJson(value as Record<string, JsonValue>);\n};\n\nconst platforms = new Set<TestPlatform>(['web', 'android', 'ios', 'computer']);\n\nconst validatePlatform = (value: unknown, label: string): TestPlatform => {\n if (typeof value !== 'string' || !platforms.has(value as TestPlatform)) {\n throw new TypeError(\n `Midscene config ${label} must be one of web, android, ios, computer.`,\n );\n }\n return value as TestPlatform;\n};\n\nconst validateProjectSetup = <TProjectContext>(\n value: unknown,\n projectPlatform: TestPlatform,\n label: string,\n): ProjectSetupDefinition<TProjectContext> | undefined => {\n if (value === undefined) return undefined;\n if (!isRecord(value)) {\n throw new TypeError(`Midscene config ${label} must be an object.`);\n }\n if (typeof value.name !== 'string' || value.name.trim().length === 0) {\n throw new TypeError(`Midscene config ${label}.name must be non-empty.`);\n }\n if (typeof value.setup !== 'function') {\n throw new TypeError(`Midscene config ${label}.setup must be a function.`);\n }\n const supported =\n value.platform === undefined\n ? undefined\n : Array.isArray(value.platform)\n ? value.platform.map((item, index) =>\n validatePlatform(item, `${label}.platform[${index}]`),\n )\n : [validatePlatform(value.platform, `${label}.platform`)];\n if (supported && !supported.includes(projectPlatform)) {\n throw new TypeError(\n `Midscene config ${label} does not support project platform \"${projectPlatform}\".`,\n );\n }\n return value as unknown as ProjectSetupDefinition<TProjectContext>;\n};\n\nconst validatePositiveInteger = (\n value: unknown,\n fallback: number,\n label: string,\n): number => {\n if (value === undefined) return fallback;\n if (!Number.isInteger(value) || (value as number) <= 0) {\n throw new TypeError(`Midscene config ${label} must be a positive integer.`);\n }\n return value as number;\n};\n\nconst validateNonNegativeInteger = (\n value: unknown,\n fallback: number,\n label: string,\n): number => {\n if (value === undefined) return fallback;\n if (!Number.isInteger(value) || (value as number) < 0) {\n throw new TypeError(\n `Midscene config ${label} must be a non-negative integer.`,\n );\n }\n return value as number;\n};\n\nconst validateExecutionProjects = <TProjectContext>(\n value: unknown,\n defaultSetup: unknown,\n): {\n projects: readonly ResolvedExecutionProject<TProjectContext>[];\n hasExplicitProjects: boolean;\n} => {\n if (value === undefined) {\n let platform: TestPlatform = 'web';\n if (defaultSetup !== undefined) {\n if (!isRecord(defaultSetup)) {\n throw new TypeError('Midscene config setup must be an object.');\n }\n if (Array.isArray(defaultSetup.platform)) {\n if (defaultSetup.platform.length !== 1) {\n throw new TypeError(\n 'Midscene config setup.platform must select exactly one platform when projects is omitted.',\n );\n }\n platform = validatePlatform(\n defaultSetup.platform[0],\n 'setup.platform[0]',\n );\n } else if (defaultSetup.platform !== undefined) {\n platform = validatePlatform(defaultSetup.platform, 'setup.platform');\n }\n }\n const setup = validateProjectSetup<TProjectContext>(\n defaultSetup,\n platform,\n 'setup',\n );\n return {\n hasExplicitProjects: false,\n projects: Object.freeze([\n Object.freeze({\n projectId: projectIdFromIndex(0),\n name: 'default',\n platform,\n ...(setup ? { setup } : {}),\n tags: Object.freeze({ include: [], exclude: [] }),\n retry: 0,\n variables: Object.freeze({}),\n }),\n ]),\n };\n }\n if (defaultSetup !== undefined) {\n throw new TypeError(\n 'Midscene config setup cannot be used together with projects. Move setup to projects[].setup.',\n );\n }\n if (!Array.isArray(value) || value.length === 0) {\n throw new TypeError(\n 'Midscene config projects must be a non-empty array when declared.',\n );\n }\n const names = new Set<string>();\n const projects = value.map((candidate, index) => {\n const label = `projects[${index}]`;\n if (!isRecord(candidate)) {\n throw new TypeError(`Midscene config ${label} must be an object.`);\n }\n rejectUnknownKeys(\n candidate,\n ['name', 'platform', 'setup', 'files', 'tags', 'retry', 'variables'],\n label,\n );\n if (\n typeof candidate.name !== 'string' ||\n candidate.name.trim().length === 0\n ) {\n throw new TypeError(`Midscene config ${label}.name must be non-empty.`);\n }\n if (names.has(candidate.name)) {\n throw new TypeError(\n `Midscene config project name \"${candidate.name}\" must be unique.`,\n );\n }\n names.add(candidate.name);\n const platform = validatePlatform(candidate.platform, `${label}.platform`);\n const files = validateTestFileSelection(candidate.files, `${label}.files`);\n return Object.freeze({\n projectId: projectIdFromIndex(index),\n name: candidate.name,\n platform,\n ...(files ? { files } : {}),\n tags: validateTagSelection(candidate.tags, `${label}.tags`),\n retry: validateNonNegativeInteger(candidate.retry, 0, `${label}.retry`),\n variables: validateVariables(candidate.variables, `${label}.variables`),\n ...(candidate.setup === undefined\n ? {}\n : {\n setup: validateProjectSetup<TProjectContext>(\n candidate.setup,\n platform,\n `${label}.setup`,\n )!,\n }),\n });\n });\n return { projects: Object.freeze(projects), hasExplicitProjects: true };\n};\n\nconst validateTestOptions = (value: unknown): ResolvedTestOptions => {\n if (value !== undefined && !isRecord(value)) {\n throw new TypeError('Midscene config test must be an object.');\n }\n const candidate = value ?? {};\n return Object.freeze({\n maxConcurrency: validatePositiveInteger(\n (candidate as Record<string, unknown>).maxConcurrency,\n 1,\n 'test.maxConcurrency',\n ),\n bail: validateNonNegativeInteger(\n (candidate as Record<string, unknown>).bail,\n 0,\n 'test.bail',\n ),\n testTimeout: validatePositiveInteger(\n (candidate as Record<string, unknown>).testTimeout,\n 120_000,\n 'test.testTimeout',\n ),\n });\n};\n\nconst validateOutputPath = (\n value: unknown,\n fallback: string,\n label: string,\n): string => {\n if (value === undefined) return fallback;\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new TypeError(`Midscene config ${label} must be non-empty.`);\n }\n return value;\n};\n\nconst validateOutput = (value: unknown): ResolvedTestOutputDefinition => {\n if (value !== undefined && !isRecord(value)) {\n throw new TypeError('Midscene config output must be an object.');\n }\n const candidate = (value ?? {}) as Record<string, unknown>;\n rejectUnknownKeys(candidate, ['reportDir'], 'output');\n return Object.freeze({\n reportDir: validateOutputPath(\n candidate.reportDir,\n './midscene_run/report',\n 'output.reportDir',\n ),\n });\n};\n\nconst validateTestProjectDefinition = <TContext>(\n definition: unknown,\n): LoadedTestProject<TContext> => {\n if (\n !isRecord(definition) ||\n !('nodes' in definition) ||\n !Array.isArray(definition.nodes)\n ) {\n throw new TypeError(\n 'Midscene config must default export an object with a nodes array.',\n );\n }\n if ('setupWorkflow' in definition) {\n throw new TypeError(\n 'Midscene config setupWorkflow is no longer supported. Use setup or projects[].setup instead.',\n );\n }\n if ('setupDocument' in definition) {\n throw new TypeError(\n 'Midscene config setupDocument is not supported. Use setup or projects[].setup for resources, and beforeAll/afterAll for document lifecycle steps.',\n );\n }\n if ('root' in definition) {\n throw new TypeError(\n 'Midscene config root is not supported. Pass the Test Project directory to midscene-test instead.',\n );\n }\n if ('files' in definition) {\n throw new TypeError(\n 'Midscene config files is not supported at the root. Move it to projects[].files.',\n );\n }\n if ('testRunner' in definition) {\n throw new TypeError(\n 'Midscene config testRunner is not supported. Rename it to test.',\n );\n }\n rejectUnknownKeys(\n definition,\n ['setup', 'projects', 'test', 'output', 'nodes'],\n 'root',\n );\n const resolvedProjects = validateExecutionProjects<TContext>(\n definition.projects,\n definition.setup,\n );\n const nodes = new NodeRegistry(definition.nodes as NodeDefinition[]);\n return {\n ...resolvedProjects,\n test: validateTestOptions(definition.test),\n output: validateOutput(definition.output),\n nodes,\n resolveNode: (name) =>\n nodes.get(name) as NodeDefinition<any, any, TContext> | undefined,\n };\n};\n\nconst assertTypeScriptConfig = (absolutePath: string): void => {\n if (!absolutePath.endsWith('.ts')) {\n const extension = absolutePath.match(/(\\.[^./\\\\]+)$/)?.[1] ?? '(none)';\n throw new TypeError(\n `Unsupported Midscene config extension: ${extension}. Supported extension: .ts.`,\n );\n }\n};\n\nconst canRetryWithCjsLoader = (error: unknown): error is Error => {\n if (!(error instanceof Error)) return false;\n const errorCode = (error as Error & { code?: string }).code;\n return (\n (error instanceof SyntaxError &&\n /^Unexpected (?:identifier|reserved word|token)/.test(error.message)) ||\n errorCode === 'ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX' ||\n (errorCode === 'ERR_UNKNOWN_FILE_EXTENSION' &&\n /^Unknown file extension\\b/.test(error.message))\n );\n};\n\nexport async function loadTestProject<TContext = undefined>(\n configPath?: string,\n): Promise<LoadedTestProject<TContext>> {\n if (!configPath) {\n return validateTestProjectDefinition<TContext>({\n nodes: [],\n });\n }\n\n const absolutePath = resolve(configPath);\n assertTypeScriptConfig(absolutePath);\n let loaded: unknown;\n try {\n loaded = await tsImport(pathToFileURL(absolutePath).href, {\n parentURL: pathToFileURL(`${dirname(absolutePath)}${sep}`).href,\n tsconfig: false,\n });\n } catch (error) {\n try {\n if (!canRetryWithCjsLoader(error)) throw error;\n loaded = tsxRequire(absolutePath, pathToFileURL(absolutePath));\n } catch (fallbackError) {\n const message =\n fallbackError instanceof Error ? `: ${fallbackError.message}` : '';\n throw new Error(\n `Failed to load Midscene config \"${absolutePath}\"${message}`,\n { cause: fallbackError },\n );\n }\n }\n\n return validateTestProjectDefinition<TContext>(\n getDefaultExport(loaded, absolutePath),\n );\n}\n","import {\n ProjectSetupError,\n ProjectTeardownError,\n WorkflowLifecycleError,\n} from '../errors';\nimport type {\n ProjectRuntime,\n ProjectRuntimeOptions,\n ProjectRuntimeResult,\n} from './types';\n\nexport const createProjectRuntime = <TProjectContext = unknown>(\n options: ProjectRuntimeOptions<TProjectContext>,\n): ProjectRuntime<TProjectContext> => {\n const startedAt = new Date();\n const controller = new AbortController();\n const parentSignal = options.signal;\n const abortFromParent = () => controller.abort(parentSignal?.reason);\n if (parentSignal?.aborted) abortFromParent();\n else parentSignal?.addEventListener('abort', abortFromParent, { once: true });\n\n const teardownStack: Array<{\n registrationIndex: number;\n teardown: Parameters<\n Parameters<NonNullable<typeof options.setup>['setup']>[0]['onTeardown']\n >[0];\n }> = [];\n let context: TProjectContext | undefined;\n let setupError: ProjectSetupError | undefined;\n let started = false;\n let acceptingTeardowns = options.setup !== undefined;\n let finishedResult: ProjectRuntimeResult<TProjectContext> | undefined;\n\n const createResult = (\n requestedStatus: 'success' | 'failed',\n teardownErrors: readonly ProjectTeardownError[] = [],\n ): ProjectRuntimeResult<TProjectContext> => {\n const endedAt = new Date();\n return {\n projectName: options.project.name,\n platform: options.project.platform,\n status:\n requestedStatus === 'failed' || setupError || teardownErrors.length > 0\n ? 'failed'\n : 'success',\n ...(setupError ? { setupError } : {}),\n ...(teardownErrors.length > 0 ? { teardownErrors } : {}),\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: Math.max(0, endedAt.getTime() - startedAt.getTime()),\n };\n };\n\n const onTeardown = (\n teardown: (typeof teardownStack)[number]['teardown'],\n ): void => {\n if (!acceptingTeardowns) {\n throw new WorkflowLifecycleError(\n 'onTeardown() can only be called while Project setup is running.',\n { projectName: options.project.name },\n );\n }\n if (typeof teardown !== 'function') {\n throw new WorkflowLifecycleError(\n 'Project onTeardown() requires a teardown function.',\n { projectName: options.project.name },\n );\n }\n teardownStack.push({\n registrationIndex: teardownStack.length,\n teardown,\n });\n };\n\n return {\n get context() {\n return context;\n },\n get signal() {\n return controller.signal;\n },\n get canRun() {\n return started && !setupError && !controller.signal.aborted;\n },\n async start() {\n if (started) {\n throw new WorkflowLifecycleError(\n 'Project runtime has already started.',\n {\n projectName: options.project.name,\n },\n );\n }\n started = true;\n if (controller.signal.aborted) {\n acceptingTeardowns = false;\n return createResult('failed');\n }\n if (options.setup) {\n try {\n context = await options.setup.setup({\n project: options.project,\n env: Object.freeze({ ...process.env }),\n signal: controller.signal,\n onTeardown,\n });\n } catch (error) {\n setupError = new ProjectSetupError(error, {\n projectName: options.project.name,\n });\n } finally {\n acceptingTeardowns = false;\n }\n }\n return createResult(setupError ? 'failed' : 'success');\n },\n async finish(requestedStatus = 'success') {\n if (finishedResult) return finishedResult;\n if (!started) {\n throw new WorkflowLifecycleError(\n 'Project runtime must start before it can finish.',\n { projectName: options.project.name },\n );\n }\n const statusBeforeTeardown = createResult(requestedStatus).status;\n const teardownErrors: ProjectTeardownError[] = [];\n for (const { registrationIndex, teardown } of teardownStack.reverse()) {\n try {\n await teardown({\n project: options.project,\n context,\n status: statusBeforeTeardown,\n ...(setupError ? { setupError } : {}),\n });\n } catch (error) {\n teardownErrors.push(\n new ProjectTeardownError(error, {\n projectName: options.project.name,\n registrationIndex,\n }),\n );\n }\n }\n parentSignal?.removeEventListener('abort', abortFromParent);\n finishedResult = createResult(requestedStatus, teardownErrors);\n return finishedResult;\n },\n abort(reason) {\n controller.abort(reason);\n },\n };\n};\n","import { WorkflowParseError } from '../errors';\nimport type {\n CommonNodeInput,\n NormalizedStep,\n NormalizedStepMeta,\n} from './types';\n\nconst supportedMetaKeys = new Set(['timeout', 'continue-on-error']);\n\nfunction isMapping(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n (Object.getPrototypeOf(value) === Object.prototype ||\n Object.getPrototypeOf(value) === null)\n );\n}\n\nfunction formatStep(index: number): string {\n return `step ${index + 1}`;\n}\n\nfunction normalizeMeta(value: unknown, index: number): NormalizedStepMeta {\n if (value === undefined) {\n return { continueOnError: false };\n }\n\n if (!isMapping(value)) {\n throw new WorkflowParseError(\n `${formatStep(index)} \"$\" must be a mapping.`,\n { index },\n );\n }\n\n for (const key of Object.keys(value)) {\n if (!supportedMetaKeys.has(key)) {\n throw new WorkflowParseError(\n `${formatStep(index)} has unsupported engine metadata \"${key}\".`,\n { index, key },\n );\n }\n }\n\n const timeout = value.timeout;\n if (\n timeout !== undefined &&\n (typeof timeout !== 'number' || !Number.isFinite(timeout) || timeout <= 0)\n ) {\n throw new WorkflowParseError(\n `${formatStep(index)} \"$.timeout\" must be a positive number of milliseconds.`,\n { index, timeout },\n );\n }\n\n const continueOnError = value['continue-on-error'];\n if (continueOnError !== undefined && typeof continueOnError !== 'boolean') {\n throw new WorkflowParseError(\n `${formatStep(index)} \"$.continue-on-error\" must be a boolean.`,\n { index, continueOnError },\n );\n }\n\n return {\n ...(timeout === undefined ? {} : { timeoutMs: timeout }),\n continueOnError: continueOnError ?? false,\n };\n}\n\nexport function validateCommonNodeInput(\n input: Record<string, unknown>,\n index: number,\n): asserts input is Record<string, unknown> & CommonNodeInput {\n if (input.prompt !== undefined && typeof input.prompt !== 'string') {\n throw new WorkflowParseError(\n `${formatStep(index)} \"prompt\" must be a string.`,\n { index, prompt: input.prompt },\n );\n }\n}\n\nexport function normalizeStep(value: unknown, index = 0): NormalizedStep {\n if (!isMapping(value)) {\n throw new WorkflowParseError(`${formatStep(index)} must be a mapping.`, {\n index,\n });\n }\n\n const entries = Object.entries(value);\n if (entries.length !== 1) {\n throw new WorkflowParseError(\n `${formatStep(index)} must contain exactly one node.`,\n { index, nodes: Object.keys(value) },\n );\n }\n\n const [node, rawValue] = entries[0];\n if (node.trim().length === 0) {\n throw new WorkflowParseError(\n `${formatStep(index)} node name must not be empty.`,\n { index },\n );\n }\n\n if (typeof rawValue === 'string') {\n return {\n node,\n input: { prompt: rawValue },\n meta: { continueOnError: false },\n };\n }\n\n if (!isMapping(rawValue)) {\n throw new WorkflowParseError(\n `${formatStep(index)} value must be a string shorthand or a mapping.`,\n { index, node },\n );\n }\n\n const { $: rawMeta, ...input } = rawValue;\n validateCommonNodeInput(input, index);\n\n return {\n node,\n input,\n meta: normalizeMeta(rawMeta, index),\n };\n}\n\nexport function normalizeSteps(steps: unknown): NormalizedStep[] {\n if (!Array.isArray(steps)) {\n throw new WorkflowParseError('Steps must be an array.');\n }\n return steps.map((step, index) => normalizeStep(step, index));\n}\n","import { NodeExecutionError } from '../errors';\nimport type { NodeHistoryEntry, StepRunResult } from './types';\n\nexport const assertJsonSerializable = (\n value: unknown,\n label: string,\n node: string,\n): void => {\n const visit = (\n candidate: unknown,\n path: string,\n seen: Set<unknown>,\n ): void => {\n if (\n candidate === null ||\n typeof candidate === 'string' ||\n typeof candidate === 'boolean'\n ) {\n return;\n }\n if (typeof candidate === 'number') {\n if (Number.isFinite(candidate)) return;\n throw new TypeError(`${path} contains a non-finite number.`);\n }\n if (candidate === undefined) {\n throw new TypeError(`${path} contains undefined.`);\n }\n if (typeof candidate !== 'object') {\n throw new TypeError(`${path} is not JSON-serializable.`);\n }\n if (\n !Array.isArray(candidate) &&\n Object.getPrototypeOf(candidate) !== Object.prototype &&\n Object.getPrototypeOf(candidate) !== null\n ) {\n throw new TypeError(`${path} must contain only plain objects.`);\n }\n if (seen.has(candidate)) throw new TypeError(`${path} contains a cycle.`);\n seen.add(candidate);\n if (Array.isArray(candidate)) {\n candidate.forEach((child, index) =>\n visit(child, `${path}[${index}]`, seen),\n );\n } else {\n for (const [key, child] of Object.entries(candidate)) {\n visit(child, `${path}.${key}`, seen);\n }\n }\n seen.delete(candidate);\n };\n\n try {\n visit(value, label, new Set());\n } catch (error) {\n throw new NodeExecutionError(node, error);\n }\n};\n\nconst cloneAndFreezeJson = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return Object.freeze(value.map(cloneAndFreezeJson));\n }\n if (typeof value === 'object' && value !== null) {\n return Object.freeze(\n Object.fromEntries(\n Object.entries(value).map(([key, child]) => [\n key,\n cloneAndFreezeJson(child),\n ]),\n ),\n );\n }\n return value;\n};\n\nexport const toHistoryEntry = (\n result: StepRunResult,\n scope: NodeHistoryEntry['scope'],\n): NodeHistoryEntry => {\n assertJsonSerializable(result.input, 'input', result.node);\n if (result.output?.data !== undefined) {\n assertJsonSerializable(result.output.data, 'output.data', result.node);\n }\n return Object.freeze({\n scope,\n phase: result.phase,\n stepIndex: result.stepIndex,\n node: result.node,\n input: cloneAndFreezeJson(result.input),\n ...(typeof (result.input as { prompt?: unknown })?.prompt === 'string'\n ? { intent: (result.input as { prompt: string }).prompt }\n : {}),\n status: result.status === 'success' ? 'passed' : 'failed',\n ...(result.output?.summary === undefined\n ? {}\n : { summary: result.output.summary }),\n ...(result.output?.data === undefined\n ? {}\n : { data: cloneAndFreezeJson(result.output.data) }),\n ...(result.error\n ? {\n error: Object.freeze({\n name: result.error.name,\n message: result.error.message,\n }),\n }\n : {}),\n });\n};\n\nexport const createHistory = (\n prefix: readonly NodeHistoryEntry[],\n results: readonly StepRunResult[],\n scope: NodeHistoryEntry['scope'],\n): readonly NodeHistoryEntry[] =>\n Object.freeze([\n ...prefix,\n ...results.map((result) => toHistoryEntry(result, scope)),\n ]);\n","import {\n NodeExecutionError,\n NodeInputValidationError,\n StepTimeoutError,\n normalizeNodeExecutionError,\n} from '../errors';\nimport type { NodeDefinition, NodeResult } from '../node/types';\nimport { validateCommonNodeInput } from '../parser/normalize';\nimport type { CommonNodeInput, NormalizedStep } from '../parser/types';\nimport { assertJsonSerializable } from './history';\nimport type {\n NodeCaseContext,\n NodeDocumentContext,\n NodeExecutionPhase,\n NodeHistoryEntry,\n NodeScopeTeardown,\n StepRunResult,\n} from './types';\n\nfunction validateNodeOutput<TData>(\n output: unknown,\n node: string,\n): NodeResult<TData> | undefined {\n if (output === undefined) {\n return undefined;\n }\n\n if (typeof output !== 'object' || output === null || Array.isArray(output)) {\n throw new NodeExecutionError(\n node,\n new TypeError('Node output must be an object or undefined.'),\n );\n }\n\n if (\n 'summary' in output &&\n output.summary !== undefined &&\n typeof output.summary !== 'string'\n ) {\n throw new NodeExecutionError(\n node,\n new TypeError('Node output summary must be a string.'),\n );\n }\n\n if ('data' in output && output.data !== undefined) {\n assertJsonSerializable(output.data, 'output.data', node);\n }\n\n return output as NodeResult<TData>;\n}\n\nfunction createStepResultBase(\n step: NormalizedStep,\n startedAt: Date,\n phase: NodeExecutionPhase,\n stepIndex: number,\n) {\n const endedAt = new Date();\n return {\n node: step.node,\n phase,\n stepIndex,\n input: step.input,\n meta: step.meta,\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: Math.max(0, endedAt.getTime() - startedAt.getTime()),\n };\n}\n\nasync function executeNode<TOutputData>(\n step: NormalizedStep,\n execute: (signal: AbortSignal) => unknown,\n phase: NodeExecutionPhase,\n stepIndex: number,\n options: { parentSignal?: AbortSignal; defaultTimeoutMs?: number },\n): Promise<StepRunResult<TOutputData>> {\n validateCommonNodeInput(step.input, stepIndex);\n\n const startedAt = new Date();\n const abortController = new AbortController();\n const parentSignal = options.parentSignal;\n const abortFromParent = () => abortController.abort(parentSignal?.reason);\n if (parentSignal?.aborted) abortFromParent();\n else parentSignal?.addEventListener('abort', abortFromParent, { once: true });\n const timeoutMs = step.meta.timeoutMs ?? options.defaultTimeoutMs;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let abortGraceTimeout: ReturnType<typeof setTimeout> | undefined;\n const execution = Promise.resolve().then(() => {\n abortController.signal.throwIfAborted();\n return execute(abortController.signal);\n });\n let settleOnAbort: (() => void) | undefined;\n const abortedExecution = new Promise<never>((_, reject) => {\n settleOnAbort = () => {\n // Abort listeners run synchronously. Wait one task before rejecting so a\n // cooperative node can settle in response to the forwarded abort first.\n abortGraceTimeout = setTimeout(() => {\n reject(abortController.signal.reason);\n }, 0);\n };\n if (abortController.signal.aborted) settleOnAbort();\n else\n abortController.signal.addEventListener('abort', settleOnAbort, {\n once: true,\n });\n });\n const timeoutExecution =\n timeoutMs === undefined\n ? undefined\n : new Promise<never>((_, reject) => {\n timeout = setTimeout(() => {\n if (abortController.signal.aborted) {\n reject(abortController.signal.reason);\n return;\n }\n const timeoutError = new StepTimeoutError(timeoutMs, step.node);\n abortController.abort(timeoutError);\n reject(timeoutError);\n }, timeoutMs);\n });\n const settledExecution = Promise.race([\n execution,\n abortedExecution,\n ...(timeoutExecution === undefined ? [] : [timeoutExecution]),\n ]);\n\n try {\n const output = validateNodeOutput<TOutputData>(\n await settledExecution,\n step.node,\n );\n return {\n ...createStepResultBase(step, startedAt, phase, stepIndex),\n status: 'success',\n continuedAfterError: false,\n ...(output === undefined ? {} : { output }),\n };\n } catch (error) {\n return {\n ...createStepResultBase(step, startedAt, phase, stepIndex),\n status: 'failed',\n continuedAfterError: step.meta.continueOnError,\n error: normalizeNodeExecutionError(error, step.node),\n };\n } finally {\n if (timeout !== undefined) clearTimeout(timeout);\n if (abortGraceTimeout !== undefined) clearTimeout(abortGraceTimeout);\n if (settleOnAbort !== undefined) {\n abortController.signal.removeEventListener('abort', settleOnAbort);\n }\n parentSignal?.removeEventListener('abort', abortFromParent);\n }\n}\n\ntype StepExecutionTarget =\n | { scope: 'case'; case: NodeCaseContext }\n | { scope: 'document'; document: NodeDocumentContext };\n\nasync function parseNodeInput<TInput, TData, TContext>(\n node: NodeDefinition<TInput, TData, TContext>,\n input: Record<string, unknown>,\n): Promise<TInput & CommonNodeInput> {\n if (!node.inputSchema) {\n return input as TInput & CommonNodeInput;\n }\n\n const parsed = await node.inputSchema.safeParseAsync(input);\n if (!parsed.success) {\n throw NodeInputValidationError.fromZod(node.name, parsed.error);\n }\n return parsed.data as TInput & CommonNodeInput;\n}\n\nexport async function executeStep<\n TInput = unknown,\n TOutputData = unknown,\n TContext = unknown,\n>(\n step: NormalizedStep,\n node: NodeDefinition<TInput, TOutputData, TContext>,\n target: StepExecutionTarget,\n context: TContext,\n execution: {\n history?: readonly NodeHistoryEntry[];\n signal?: AbortSignal;\n defaultTimeoutMs?: number;\n onTeardown?(node: string, teardown: NodeScopeTeardown): void;\n } = {},\n): Promise<StepRunResult<TOutputData>> {\n const phase =\n target.scope === 'case' ? target.case.phase : target.document.phase;\n const stepIndex =\n target.scope === 'case' ? target.case.stepIndex : target.document.stepIndex;\n\n return executeNode<TOutputData>(\n step,\n async (signal) => {\n const input = await parseNodeInput(node, step.input);\n signal.throwIfAborted();\n const common = {\n input,\n $: step.meta,\n signal,\n context,\n history: execution.history ?? Object.freeze([]),\n onTeardown: (teardown: NodeScopeTeardown) => {\n if (!execution.onTeardown) {\n throw new NodeExecutionError(\n step.node,\n new Error(\n 'The current execution scope cannot register teardown.',\n ),\n );\n }\n execution.onTeardown(step.node, teardown);\n },\n };\n return target.scope === 'case'\n ? node.execute({ ...common, scope: 'case', case: target.case })\n : node.execute({\n ...common,\n scope: 'document',\n document: target.document,\n });\n },\n phase,\n stepIndex,\n {\n parentSignal: execution.signal,\n defaultTimeoutMs: execution.defaultTimeoutMs,\n },\n );\n}\n","import { isAbsolute } from 'node:path';\nimport type { NodeScopeTeardownResult } from './types';\n\nexport const reportPathsFromTeardown = (\n // biome-ignore lint/suspicious/noConfusingVoidType: this consumes the intentional void teardown return.\n result: NodeScopeTeardownResult | void,\n): readonly string[] => {\n if (result === undefined) return [];\n if (typeof result !== 'object' || result === null || Array.isArray(result)) {\n throw new TypeError('Node teardown result must be an object or undefined.');\n }\n const paths = result.reportPaths;\n if (paths === undefined) return [];\n if (!Array.isArray(paths)) {\n throw new TypeError('Node teardown reportPaths must be an array.');\n }\n return paths.map((path, index) => {\n if (typeof path !== 'string' || path.trim().length === 0) {\n throw new TypeError(\n `Node teardown reportPaths[${index}] must be a non-empty string.`,\n );\n }\n if (!isAbsolute(path)) {\n throw new TypeError(\n `Node teardown reportPaths[${index}] must be an absolute path.`,\n );\n }\n return path;\n });\n};\n","import { randomUUID } from 'node:crypto';\nimport {\n NodeScopeTeardownError,\n type WorkflowError,\n WorkflowLifecycleError,\n} from '../errors';\nimport type { CollectedWorkflowDocument } from '../parser/types';\nimport { executeStep } from './execute-step';\nimport { createHistory } from './history';\nimport { reportPathsFromTeardown } from './scope-teardown';\nimport type {\n CreateDocumentRuntimeOptions,\n DocumentNodePhase,\n NodeDocumentContext,\n NodeScopeTeardown,\n StepRunResult,\n WorkflowDocumentRunResult,\n WorkflowDocumentRuntime,\n} from './types';\n\nexport function createDocumentRuntime<TContext = undefined>(\n document: CollectedWorkflowDocument,\n options: CreateDocumentRuntimeOptions<TContext>,\n): WorkflowDocumentRuntime<TContext> {\n const documentRunId = options.createDocumentRunId?.() ?? randomUUID();\n const startedAt = new Date();\n const beforeAll: StepRunResult[] = [];\n const afterAll: StepRunResult[] = [];\n const completedNodes: StepRunResult[] = [];\n const nodes = {\n beforeAll: document.lifecycle.beforeAll.map((step) =>\n options.resolveNode(step.node),\n ),\n afterAll: document.lifecycle.afterAll.map((step) =>\n options.resolveNode(step.node),\n ),\n };\n const project =\n options.project ??\n Object.freeze({\n projectId: document.projectId,\n name: document.projectId,\n platform: 'web' as const,\n tags: Object.freeze({ include: [], exclude: [] }),\n retry: 0,\n variables: Object.freeze({}),\n });\n const context = options.projectContext as TContext;\n const signal = options.signal ?? new AbortController().signal;\n const nodeTeardownStack: Array<{\n registrationIndex: number;\n node: string;\n teardown: NodeScopeTeardown;\n }> = [];\n let acceptingNodeTeardowns = true;\n let started = false;\n let finishedResult: WorkflowDocumentRunResult | undefined;\n const reportPaths = new Set<string>();\n\n const createResult = (\n teardownErrors: WorkflowError[] = [],\n ): WorkflowDocumentRunResult => {\n const endedAt = new Date();\n return {\n documentId: document.documentId,\n documentRunId,\n projectId: document.projectId,\n projectName: project.name,\n sourcePath: document.sourcePath,\n status:\n completedNodes.some((step) => step.status === 'failed') ||\n teardownErrors.length > 0\n ? 'failed'\n : 'success',\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: Math.max(0, endedAt.getTime() - startedAt.getTime()),\n beforeAll: [...beforeAll],\n afterAll: [...afterAll],\n ...(teardownErrors.length > 0 ? { teardownErrors } : {}),\n ...(reportPaths.size > 0 ? { reportPaths: [...reportPaths] } : {}),\n };\n };\n\n const runPhase = async (\n phase: DocumentNodePhase,\n results: StepRunResult[],\n executionSignal = signal,\n ): Promise<void> => {\n for (const [stepIndex, step] of document.lifecycle[phase].entries()) {\n const documentContext: NodeDocumentContext = {\n documentId: document.documentId,\n documentRunId,\n projectId: document.projectId,\n projectName: project.name,\n sourcePath: document.sourcePath,\n phase,\n stepIndex,\n completedNodes: Object.freeze([...completedNodes]),\n };\n const stepInfo = {\n scope: 'document' as const,\n node: step.node,\n stepCount: document.lifecycle[phase].length,\n document: documentContext,\n };\n await options.onStepStart?.(stepInfo);\n const result = await executeStep(\n step,\n nodes[phase][stepIndex],\n { scope: 'document', document: documentContext },\n context,\n {\n history: createHistory([], completedNodes, 'document'),\n signal: executionSignal,\n defaultTimeoutMs: options.defaultTimeoutMs,\n onTeardown(node, teardown) {\n if (!acceptingNodeTeardowns) {\n throw new WorkflowLifecycleError(\n 'Node teardown can only be registered while a workflow document is running.',\n { documentId: document.documentId, documentRunId, node },\n );\n }\n if (typeof teardown !== 'function') {\n throw new WorkflowLifecycleError(\n 'Node onTeardown() requires a teardown function.',\n { documentId: document.documentId, documentRunId, node },\n );\n }\n nodeTeardownStack.push({\n registrationIndex: nodeTeardownStack.length,\n node,\n teardown,\n });\n },\n },\n );\n await options.onStepResult?.(stepInfo, result);\n results.push(result);\n completedNodes.push(result);\n if (result.status === 'failed' && !result.continuedAfterError) break;\n }\n };\n\n return {\n get context() {\n return context;\n },\n get history() {\n return createHistory([], completedNodes, 'document');\n },\n get canRunCases() {\n return (\n started &&\n !signal.aborted &&\n !beforeAll.some((step) => step.status === 'failed')\n );\n },\n async start() {\n if (started) {\n throw new WorkflowLifecycleError(\n 'Workflow document runtime has already started.',\n { documentId: document.documentId, documentRunId },\n );\n }\n started = true;\n if (!signal.aborted) await runPhase('beforeAll', beforeAll);\n return createResult();\n },\n async finish() {\n if (finishedResult) return finishedResult;\n if (!started) {\n throw new WorkflowLifecycleError(\n 'Workflow document runtime must start before it can finish.',\n { documentId: document.documentId, documentRunId },\n );\n }\n let finishError: unknown;\n try {\n await runPhase(\n 'afterAll',\n afterAll,\n signal.aborted ? new AbortController().signal : signal,\n );\n } catch (error) {\n finishError = error;\n }\n\n acceptingNodeTeardowns = false;\n const teardownErrors: WorkflowError[] = [];\n for (const {\n registrationIndex,\n node,\n teardown,\n } of nodeTeardownStack.reverse()) {\n try {\n for (const path of reportPathsFromTeardown(await teardown())) {\n reportPaths.add(path);\n }\n } catch (error) {\n teardownErrors.push(\n new NodeScopeTeardownError(error, {\n scope: 'document',\n scopeId: documentRunId,\n node,\n registrationIndex,\n }),\n );\n }\n }\n finishedResult = createResult(teardownErrors);\n if (finishError) throw finishError;\n await options.onResult?.(finishedResult);\n return finishedResult;\n },\n };\n}\n","import { randomUUID } from 'node:crypto';\nimport { NodeScopeTeardownError, WorkflowLifecycleError } from '../errors';\nimport type { CollectedCase, NormalizedStep } from '../parser/types';\nimport { executeStep } from './execute-step';\nimport { createHistory } from './history';\nimport { reportPathsFromTeardown } from './scope-teardown';\nimport type {\n CaseNodePhase,\n CaseRunResult,\n NodeCaseContext,\n NodeScopeTeardown,\n RunCollectedCaseOptions,\n StepRunResult,\n} from './types';\n\nexport async function runCollectedCase<TContext = undefined>(\n collectedCase: CollectedCase,\n options: RunCollectedCaseOptions<TContext>,\n): Promise<CaseRunResult> {\n const phases: Record<CaseNodePhase, readonly NormalizedStep[]> = {\n beforeEach: options.beforeEach ?? [],\n steps: collectedCase.definition.steps,\n afterEach: options.afterEach ?? [],\n };\n const nodes = {\n beforeEach: phases.beforeEach.map((step) => options.resolveNode(step.node)),\n steps: phases.steps.map((step) => options.resolveNode(step.node)),\n afterEach: phases.afterEach.map((step) => options.resolveNode(step.node)),\n };\n const runId = options.createRunId?.() ?? randomUUID();\n const startedAt = new Date();\n const beforeEach: StepRunResult[] = [];\n const steps: StepRunResult[] = [];\n const afterEach: StepRunResult[] = [];\n const completedNodes: StepRunResult[] = [];\n const teardownStack: Array<{\n registrationIndex: number;\n node: string;\n teardown: NodeScopeTeardown;\n }> = [];\n let acceptingTeardowns = true;\n\n const onTeardown = (node: string, teardown: NodeScopeTeardown): void => {\n if (!acceptingTeardowns) {\n throw new WorkflowLifecycleError(\n 'Node teardown can only be registered while a case attempt is running.',\n { runId, node },\n );\n }\n if (typeof teardown !== 'function') {\n throw new WorkflowLifecycleError(\n 'Node onTeardown() requires a teardown function.',\n { runId, node },\n );\n }\n teardownStack.push({\n registrationIndex: teardownStack.length,\n node,\n teardown,\n });\n };\n\n const runPhase = async (\n phase: CaseNodePhase,\n results: StepRunResult[],\n signal = options.signal,\n ): Promise<void> => {\n for (const [stepIndex, step] of phases[phase].entries()) {\n const caseContext: NodeCaseContext = {\n caseId: collectedCase.caseId,\n runId,\n projectName: options.projectName ?? collectedCase.projectId,\n attemptIndex: options.attemptIndex ?? 0,\n name: collectedCase.definition.name,\n sourcePath: collectedCase.sourcePath,\n caseIndex: collectedCase.caseIndex,\n phase,\n stepIndex,\n completedSteps: Object.freeze([...steps]),\n completedNodes: Object.freeze([...completedNodes]),\n };\n const stepInfo = {\n scope: 'case' as const,\n node: step.node,\n stepCount: phases[phase].length,\n case: caseContext,\n };\n await options.onStepStart?.(stepInfo);\n const result = await executeStep(\n step,\n nodes[phase][stepIndex],\n { scope: 'case', case: caseContext },\n options.context as TContext,\n {\n history: createHistory(\n options.documentHistory ?? [],\n completedNodes,\n 'case',\n ),\n signal,\n defaultTimeoutMs: options.defaultTimeoutMs,\n onTeardown,\n },\n );\n await options.onStepResult?.(stepInfo, result);\n results.push(result);\n completedNodes.push(result);\n if (result.status === 'failed' && !result.continuedAfterError) break;\n }\n };\n\n let executionError: unknown;\n try {\n await runPhase('beforeEach', beforeEach);\n if (!beforeEach.some((step) => step.status === 'failed')) {\n await runPhase('steps', steps);\n }\n } catch (error) {\n executionError = error;\n }\n try {\n const cleanupSignal = options.signal?.aborted\n ? new AbortController().signal\n : options.signal;\n await runPhase('afterEach', afterEach, cleanupSignal);\n } catch (error) {\n executionError ??= error;\n }\n\n acceptingTeardowns = false;\n const teardownErrors: NodeScopeTeardownError[] = [];\n const reportPaths = new Set<string>();\n for (const { registrationIndex, node, teardown } of teardownStack.reverse()) {\n try {\n for (const path of reportPathsFromTeardown(await teardown())) {\n reportPaths.add(path);\n }\n } catch (error) {\n teardownErrors.push(\n new NodeScopeTeardownError(error, {\n scope: 'case',\n scopeId: runId,\n node,\n registrationIndex,\n }),\n );\n }\n }\n if (executionError) throw executionError;\n\n const endedAt = new Date();\n const result: CaseRunResult = {\n caseId: collectedCase.caseId,\n runId,\n projectName: options.projectName ?? collectedCase.projectId,\n attemptIndex: options.attemptIndex ?? 0,\n name: collectedCase.definition.name,\n sourcePath: collectedCase.sourcePath,\n caseIndex: collectedCase.caseIndex,\n status:\n completedNodes.some((step) => step.status === 'failed') ||\n teardownErrors.length > 0\n ? 'failed'\n : 'success',\n beforeEach,\n steps,\n afterEach,\n ...(teardownErrors.length > 0 ? { teardownErrors } : {}),\n ...(reportPaths.size > 0 ? { reportPaths: [...reportPaths] } : {}),\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: Math.max(0, endedAt.getTime() - startedAt.getTime()),\n };\n\n await options.onResult?.(result);\n return result;\n}\n","import type { CollectedCase, CollectedWorkflowDocument } from '../parser/types';\nimport { createDocumentRuntime } from './document-runtime';\nimport { runCollectedCase } from './run-collected-case';\nimport type {\n CaseRunOutcome,\n RunWorkflowDocumentOptions,\n WorkflowDocumentExecutionResult,\n WorkflowDocumentRunResult,\n} from './types';\n\nconst asNotRun = (\n collectedCase: CollectedCase,\n projectName: string,\n reason: NonNullable<CaseRunOutcome['notRunReason']>,\n): CaseRunOutcome => ({\n caseId: collectedCase.caseId,\n projectName,\n name: collectedCase.definition.name,\n sourcePath: collectedCase.sourcePath,\n caseIndex: collectedCase.caseIndex,\n status: 'not-run',\n notRunReason: reason,\n});\n\nexport async function runWorkflowDocument<TContext = undefined>(\n document: CollectedWorkflowDocument,\n options: RunWorkflowDocumentOptions<TContext>,\n): Promise<WorkflowDocumentExecutionResult> {\n const createDocumentRunId = options.createDocumentRunId;\n const createCaseRunId = options.createCaseRunId;\n const projectName = options.project?.name ?? document.projectId;\n const retry = options.retry ?? options.project?.retry ?? 0;\n if (!Number.isInteger(retry) || retry < 0) {\n throw new TypeError(\n 'Workflow document retry must be a non-negative integer.',\n );\n }\n const runtime = createDocumentRuntime(document, {\n resolveNode: options.resolveNode,\n project: options.project,\n projectContext: options.projectContext,\n signal: options.signal,\n defaultTimeoutMs: options.defaultTimeoutMs,\n onStepStart: options.onStepStart,\n onStepResult: options.onStepResult,\n onResult: options.onDocumentResult,\n createDocumentRunId: createDocumentRunId\n ? () => createDocumentRunId(document)\n : undefined,\n });\n const cases: CaseRunOutcome[] = [];\n let runtimeStarted = false;\n let documentResult: WorkflowDocumentRunResult | undefined;\n let executionError: unknown;\n let fatalError = false;\n\n try {\n runtimeStarted = true;\n await runtime.start();\n\n if (!runtime.canRunCases) {\n const reason = options.signal?.aborted\n ? (options.stopReason?.() ?? 'interrupted')\n : 'document-start-failed';\n cases.push(\n ...document.cases.map((collectedCase) =>\n asNotRun(collectedCase, projectName, reason),\n ),\n );\n } else {\n for (const collectedCase of document.cases) {\n if (fatalError || options.shouldStop?.()) {\n const outcome = asNotRun(\n collectedCase,\n projectName,\n fatalError\n ? 'fatal-error'\n : (options.stopReason?.() ?? 'interrupted'),\n );\n cases.push(outcome);\n await options.onCaseOutcome?.(outcome);\n continue;\n }\n\n await options.onCaseStart?.(collectedCase);\n const attempts = [];\n for (let attemptIndex = 0; attemptIndex <= retry; attemptIndex += 1) {\n const run = await runCollectedCase(collectedCase, {\n resolveNode: options.resolveNode,\n beforeEach: document.lifecycle.beforeEach,\n afterEach: document.lifecycle.afterEach,\n context: runtime.context,\n projectName,\n attemptIndex,\n documentHistory: runtime.history,\n signal: options.signal,\n defaultTimeoutMs: options.defaultTimeoutMs,\n onStepStart: options.onStepStart,\n onStepResult: options.onStepResult,\n onResult: options.onCaseResult,\n createRunId: createCaseRunId\n ? () => createCaseRunId(collectedCase, attemptIndex)\n : undefined,\n });\n attempts.push(run);\n fatalError = options.isFatalError?.(run) ?? false;\n if (run.status === 'success' || fatalError) break;\n }\n const run = attempts.at(-1)!;\n const outcome: CaseRunOutcome = {\n caseId: collectedCase.caseId,\n projectName,\n name: collectedCase.definition.name,\n sourcePath: collectedCase.sourcePath,\n caseIndex: collectedCase.caseIndex,\n status: run.status,\n run,\n attempts,\n };\n cases.push(outcome);\n await options.onCaseOutcome?.(outcome);\n }\n }\n } catch (error) {\n executionError = error;\n } finally {\n if (runtimeStarted) {\n try {\n documentResult = await runtime.finish();\n } catch (error) {\n executionError ??= error;\n }\n }\n }\n\n if (executionError) throw executionError;\n if (!documentResult) {\n throw new Error(\n `Workflow document \"${document.sourcePath}\" did not produce a result.`,\n );\n }\n return { document: documentResult, cases };\n}\n","import type { JsonValue } from '../cli/test-project';\nimport { WorkflowParseError } from '../errors';\n\nexport interface VariableResolutionLocation {\n projectName: string;\n sourcePath: string;\n phase: 'beforeAll' | 'beforeEach' | 'steps' | 'afterEach' | 'afterAll';\n stepIndex: number;\n caseIndex?: number;\n}\n\nexport interface ResolveWorkflowVariablesOptions {\n variables?: Readonly<Record<string, JsonValue>>;\n env?: Readonly<NodeJS.ProcessEnv>;\n location: VariableResolutionLocation;\n}\n\nconst interpolationExpression =\n /\\$\\{\\{([A-Za-z_][A-Za-z0-9_]*)\\}\\}|\\$\\{([^{}]+)\\}/g;\nconst exactEnvExpression = /^\\$\\{\\{([A-Za-z_][A-Za-z0-9_]*)\\}\\}$/;\nconst exactProjectExpression = /^\\$\\{([^{}]+)\\}$/;\n\nconst missingVariable = (\n kind: 'environment' | 'project',\n name: string,\n options: ResolveWorkflowVariablesOptions,\n): never => {\n throw new WorkflowParseError(\n `Undefined ${kind} variable \"${name}\" in ${options.location.sourcePath}.`,\n { ...options.location, variable: name, variableKind: kind },\n );\n};\n\nconst projectVariable = (\n name: string,\n options: ResolveWorkflowVariablesOptions,\n): JsonValue => {\n if (!Object.hasOwn(options.variables ?? {}, name)) {\n return missingVariable('project', name, options);\n }\n return options.variables![name];\n};\n\nconst environmentVariable = (\n name: string,\n options: ResolveWorkflowVariablesOptions,\n): string => {\n const value = options.env?.[name];\n if (value === undefined) return missingVariable('environment', name, options);\n return value;\n};\n\nconst interpolationValue = (\n name: string,\n value: JsonValue,\n options: ResolveWorkflowVariablesOptions,\n): string => {\n if (typeof value === 'object' && value !== null) {\n throw new WorkflowParseError(\n `Project variable \"${name}\" must be a primitive when embedded in a string.`,\n {\n ...options.location,\n variable: name,\n variableKind: 'project',\n },\n );\n }\n return String(value);\n};\n\nconst resolveString = (\n value: string,\n options: ResolveWorkflowVariablesOptions,\n): JsonValue => {\n const exactEnv = exactEnvExpression.exec(value);\n if (exactEnv) return environmentVariable(exactEnv[1], options);\n const exactProject = exactProjectExpression.exec(value);\n if (exactProject) return projectVariable(exactProject[1], options);\n\n return value.replace(\n interpolationExpression,\n (_match, environmentName: string | undefined, projectName: string) =>\n environmentName\n ? environmentVariable(environmentName, options)\n : interpolationValue(\n projectName,\n projectVariable(projectName, options),\n options,\n ),\n );\n};\n\nexport const resolveWorkflowVariables = (\n value: unknown,\n options: ResolveWorkflowVariablesOptions,\n): unknown => {\n if (typeof value === 'string') return resolveString(value, options);\n if (Array.isArray(value)) {\n return value.map((child) => resolveWorkflowVariables(child, options));\n }\n if (typeof value === 'object' && value !== null) {\n return Object.fromEntries(\n Object.entries(value).map(([key, child]) => [\n key,\n resolveWorkflowVariables(child, options),\n ]),\n );\n }\n return value;\n};\n","import { createHash } from 'node:crypto';\nimport { readFileSync } from 'node:fs';\nimport { sep } from 'node:path';\nimport { JSON_SCHEMA, load as loadYaml } from 'js-yaml';\nimport type { JsonValue } from '../cli/test-project';\nimport { WorkflowParseError } from '../errors';\nimport type { NodeDefinition } from '../node/types';\nimport { normalizeSteps } from './normalize';\nimport type {\n CollectedCase,\n CollectedWorkflowDocument,\n WorkflowDocumentSource,\n} from './types';\nimport { resolveWorkflowVariables } from './variables';\n\nexport interface CollectWorkflowDocumentOptions {\n resolveNode(name: string): NodeDefinition<any, any> | undefined;\n variables?: Readonly<Record<string, JsonValue>>;\n env?: Readonly<NodeJS.ProcessEnv>;\n}\n\nconst isMapping = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst rejectUnknownKeys = (\n value: Record<string, unknown>,\n allowed: readonly string[],\n label: string,\n) => {\n const allowedSet = new Set(allowed);\n const unknown = Object.keys(value).filter((key) => !allowedSet.has(key));\n if (unknown.length) {\n throw new WorkflowParseError(\n `${label} has unsupported field \"${unknown[0]}\".`,\n { field: unknown[0] },\n );\n }\n};\n\nexport const createCaseId = (\n projectId: string,\n sourcePath: string,\n caseIndex: number,\n): string =>\n createHash('sha256')\n .update(JSON.stringify([projectId, sourcePath, caseIndex]))\n .digest('hex');\n\nexport const createWorkflowDocumentId = (\n projectId: string,\n sourcePath: string,\n): string =>\n createHash('sha256')\n .update(JSON.stringify([projectId, sourcePath]))\n .digest('hex');\n\nexport function collectWorkflowDocument(\n source: WorkflowDocumentSource,\n options: CollectWorkflowDocumentOptions,\n): CollectedWorkflowDocument {\n let parsed: unknown;\n try {\n parsed = loadYaml(readFileSync(source.absolutePath, 'utf8'), {\n schema: JSON_SCHEMA,\n });\n } catch (error) {\n throw new WorkflowParseError(\n `Failed to parse workflow document \"${source.sourcePath}\".`,\n { sourcePath: source.sourcePath },\n error,\n );\n }\n\n if (!isMapping(parsed)) {\n throw new WorkflowParseError('Workflow document must be a mapping.');\n }\n rejectUnknownKeys(\n parsed,\n ['beforeAll', 'beforeEach', 'cases', 'afterEach', 'afterAll'],\n 'Workflow document',\n );\n if (!Array.isArray(parsed.cases) || parsed.cases.length === 0) {\n throw new WorkflowParseError(\n 'Workflow document must contain a non-empty cases array.',\n );\n }\n\n const sourcePath = source.sourcePath.split(sep).join('/');\n const resolveStepVariables = (\n step: ReturnType<typeof normalizeSteps>[number],\n phase: 'beforeAll' | 'beforeEach' | 'steps' | 'afterEach' | 'afterAll',\n stepIndex: number,\n caseIndex?: number,\n ) => ({\n ...step,\n input: resolveWorkflowVariables(step.input, {\n variables: options.variables,\n env: options.env ?? process.env,\n location: {\n projectName: source.projectName ?? source.projectId,\n sourcePath,\n phase,\n stepIndex,\n ...(caseIndex === undefined ? {} : { caseIndex }),\n },\n }) as typeof step.input,\n });\n const normalizeLifecycle = (\n phase: 'beforeAll' | 'beforeEach' | 'afterEach' | 'afterAll',\n ) => {\n const value = parsed[phase];\n if (value === undefined) return [];\n if (!Array.isArray(value)) {\n throw new WorkflowParseError(\n `Workflow document ${phase} must be an array.`,\n { phase },\n );\n }\n return normalizeSteps(value).map((normalized, stepIndex) => {\n const resolved = options.resolveNode(normalized.node);\n if (!resolved) {\n throw new WorkflowParseError(\n `Workflow document ${phase} step ${stepIndex + 1} references unknown node \"${normalized.node}\".`,\n { phase, stepIndex, node: normalized.node },\n );\n }\n return resolveStepVariables(normalized, phase, stepIndex);\n });\n };\n const lifecycle = {\n beforeAll: normalizeLifecycle('beforeAll'),\n beforeEach: normalizeLifecycle('beforeEach'),\n afterEach: normalizeLifecycle('afterEach'),\n afterAll: normalizeLifecycle('afterAll'),\n };\n const ids = new Set<string>();\n const cases: CollectedCase[] = parsed.cases.map((definition, caseIndex) => {\n if (!isMapping(definition)) {\n throw new WorkflowParseError(`Case ${caseIndex + 1} must be a mapping.`, {\n caseIndex,\n });\n }\n rejectUnknownKeys(\n definition,\n ['name', 'tags', 'steps'],\n `Case ${caseIndex + 1}`,\n );\n if (\n typeof definition.name !== 'string' ||\n definition.name.trim().length === 0\n ) {\n throw new WorkflowParseError(\n `Case ${caseIndex + 1} name must be a non-empty string.`,\n { caseIndex },\n );\n }\n if (!Array.isArray(definition.steps) || definition.steps.length === 0) {\n throw new WorkflowParseError(\n `Case ${caseIndex + 1} steps must be a non-empty array.`,\n { caseIndex },\n );\n }\n const tags = definition.tags ?? [];\n if (\n !Array.isArray(tags) ||\n tags.some((tag) => typeof tag !== 'string' || tag.trim().length === 0)\n ) {\n throw new WorkflowParseError(\n `Case ${caseIndex + 1} tags must be an array of non-empty strings.`,\n { caseIndex },\n );\n }\n\n const steps = normalizeSteps(definition.steps).map(\n (normalized, stepIndex) => {\n if (!options.resolveNode(normalized.node)) {\n throw new WorkflowParseError(\n `Case ${caseIndex + 1} step ${stepIndex + 1} references unknown node \"${normalized.node}\".`,\n { caseIndex, stepIndex, node: normalized.node },\n );\n }\n return resolveStepVariables(normalized, 'steps', stepIndex, caseIndex);\n },\n );\n const caseId = createCaseId(source.projectId, sourcePath, caseIndex);\n if (ids.has(caseId)) {\n throw new WorkflowParseError(`Case id collision: ${caseId}.`, {\n caseId,\n });\n }\n ids.add(caseId);\n\n return {\n caseId,\n projectId: source.projectId,\n sourcePath,\n caseIndex,\n definition: {\n name: definition.name,\n tags: tags as string[],\n steps,\n },\n };\n });\n\n return {\n documentId: createWorkflowDocumentId(source.projectId, sourcePath),\n projectId: source.projectId,\n sourcePath,\n lifecycle,\n cases,\n } satisfies CollectedWorkflowDocument;\n}\n","import { createHash } from 'node:crypto';\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, join, relative, sep } from 'node:path';\nimport type { CaseRunResult, WorkflowDocumentRunResult } from '../engine/types';\nimport type { TestProjectCollectionError, TestProjectRunResult } from './types';\n\nconst writeJson = (path: string, value: unknown) => {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(value, null, 2));\n};\n\nconst toPosix = (value: string): string => value.split(sep).join('/');\n\nexport const caseAttemptResultPath = (\n projectId: string,\n documentId: string,\n result: CaseRunResult,\n): string =>\n toPosix(\n join(\n projectId,\n 'documents',\n documentId,\n 'cases',\n result.caseId,\n `${result.runId}.json`,\n ),\n );\n\nexport const workflowDocumentResultPath = (\n result: WorkflowDocumentRunResult,\n): string =>\n toPosix(\n join(result.projectId, 'documents', result.documentId, 'document.json'),\n );\n\nexport const collectionErrorPath = (\n projectId: string,\n sourcePath: string,\n): string => {\n const id = createHash('sha256')\n .update(JSON.stringify([projectId, sourcePath]))\n .digest('hex');\n return toPosix(join(projectId, 'collection-errors', `${id}.json`));\n};\n\nexport const writeWorkflowDocumentResult = (\n runDir: string,\n result: WorkflowDocumentRunResult,\n) => {\n const { documentRunId: _documentRunId, ...persistedResult } = result;\n writeJson(join(runDir, workflowDocumentResultPath(result)), persistedResult);\n};\n\nexport const writeCaseAttemptResult = (\n runDir: string,\n projectId: string,\n documentId: string,\n result: CaseRunResult,\n) => {\n const { runId: attemptId, ...persistedResult } = result;\n writeJson(\n join(runDir, caseAttemptResultPath(projectId, documentId, result)),\n {\n ...persistedResult,\n attemptId,\n },\n );\n};\n\nexport const writeCollectionError = (\n runDir: string,\n collectionError: TestProjectCollectionError,\n) => {\n writeJson(\n join(\n runDir,\n collectionErrorPath(\n collectionError.projectId,\n collectionError.sourcePath,\n ),\n ),\n { kind: 'collection-error', ...collectionError },\n );\n};\n\nconst relativeToSummary = (summaryPath: string, target: string): string => {\n const value = relative(dirname(summaryPath), target);\n return toPosix(value || '.');\n};\n\nconst errorJson = (error: unknown) =>\n error instanceof Error && 'toJSON' in error\n ? (error as Error & { toJSON(): unknown }).toJSON()\n : error;\n\nexport interface TestProjectResultFileOptions {\n projectRoot: string;\n configPath?: string;\n result: TestProjectRunResult;\n}\n\nexport const writeTestProjectRunResult = (\n options: TestProjectResultFileOptions,\n) => {\n const { result } = options;\n const fact = (path: string) => toPosix(path);\n\n writeJson(result.summaryPath, {\n schemaVersion: result.schemaVersion,\n runId: result.runId,\n startedAt: result.startedAt,\n endedAt: result.endedAt,\n durationMs: result.durationMs,\n status: result.status,\n exitCode: result.exitCode,\n projectRoot: options.projectRoot,\n ...(options.configPath ? { configPath: options.configPath } : {}),\n factsRoot: '.',\n reportDir: relativeToSummary(result.summaryPath, result.reportDir),\n summary: result.summary,\n projects: result.projects.map((project) => ({\n projectId: project.projectId,\n name: project.name,\n platform: project.platform,\n status: project.status,\n retry: project.retry,\n fileSelection: project.fileSelection,\n tagSelection: project.tagSelection,\n sourceCount: project.sourceCount,\n selectedCaseCount: project.selectedCaseCount,\n filteredCaseCount: project.filteredCaseCount,\n ...(project.lifecycle\n ? {\n lifecycle: {\n status: project.lifecycle.status,\n startedAt: project.lifecycle.startedAt,\n endedAt: project.lifecycle.endedAt,\n durationMs: project.lifecycle.durationMs,\n ...(project.lifecycle.setupError\n ? { setupError: errorJson(project.lifecycle.setupError) }\n : {}),\n ...(project.lifecycle.teardownErrors\n ? {\n teardownErrors:\n project.lifecycle.teardownErrors.map(errorJson),\n }\n : {}),\n },\n }\n : {}),\n cases: project.cases.map((outcome) => ({\n documentId: outcome.documentId,\n caseId: outcome.caseId,\n sourcePath: outcome.sourcePath,\n caseIndex: outcome.caseIndex,\n name: outcome.name,\n status: outcome.status,\n ...(outcome.notRunReason ? { notRunReason: outcome.notRunReason } : {}),\n ...(outcome.attempts\n ? {\n attempts: outcome.attempts.map((attempt) => ({\n attemptId: attempt.runId,\n attemptIndex: attempt.attemptIndex,\n status: attempt.status,\n resultFile: fact(\n caseAttemptResultPath(\n project.projectId,\n outcome.documentId,\n attempt,\n ),\n ),\n ...(attempt.reportPaths?.length\n ? {\n reports: attempt.reportPaths.map((path) =>\n relativeToSummary(result.summaryPath, path),\n ),\n }\n : {}),\n })),\n }\n : {}),\n })),\n documents: project.documents.map((document) => ({\n documentId: document.documentId,\n sourcePath: document.sourcePath,\n status: document.status,\n resultFile: fact(workflowDocumentResultPath(document)),\n ...(document.reportPaths?.length\n ? {\n reports: document.reportPaths.map((path) =>\n relativeToSummary(result.summaryPath, path),\n ),\n }\n : {}),\n })),\n collectionErrors: project.collectionErrors.map((error) => ({\n sourcePath: error.sourcePath,\n errorFile: fact(collectionErrorPath(error.projectId, error.sourcePath)),\n })),\n })),\n });\n};\n","import { randomUUID } from 'node:crypto';\nimport { setMaxListeners } from 'node:events';\nimport { existsSync, mkdirSync, readdirSync, statSync } from 'node:fs';\nimport { join, relative, resolve, sep } from 'node:path';\nimport { globSync } from 'tinyglobby';\nimport { createProjectRuntime } from '../engine/project-runtime';\nimport { runWorkflowDocument } from '../engine/run-workflow-document';\nimport type {\n CaseRunOutcome,\n StepExecutionInfo,\n StepRunResult,\n WorkflowDocumentRunResult,\n} from '../engine/types';\nimport {\n WorkflowError,\n WorkflowParseError,\n isFatalDeviceError,\n} from '../errors';\nimport { collectWorkflowDocument } from '../parser/collect';\nimport type {\n CollectedCase,\n CollectedWorkflowDocument,\n WorkflowDocumentSource,\n} from '../parser/types';\nimport {\n writeCaseAttemptResult,\n writeCollectionError,\n writeTestProjectRunResult,\n writeWorkflowDocumentResult,\n} from './result-store';\nimport {\n type ResolvedExecutionProject,\n type TestFileSelection,\n loadTestProject,\n validateTestFileSelection,\n} from './test-project';\nimport type {\n TestExecutionProjectRunResult,\n TestProjectCaseRunResult,\n TestProjectCollectionError,\n TestProjectRunResult,\n TestProjectRunSummary,\n} from './types';\n\nconst CONFIG_NAME = 'midscene.config.ts';\nconst CONFIG_PREFIX = 'midscene.config.';\nconst ALWAYS_IGNORED_PATTERNS = [\n '.git/**',\n '.midscene/**',\n 'midscene_run/**',\n 'node_modules/**',\n '**/.git/**',\n '**/.midscene/**',\n '**/midscene_run/**',\n '**/node_modules/**',\n];\n\nexport const DEFAULT_TEST_FILE_SELECTION: TestFileSelection = {\n include: ['**/*.{yaml,yml}'],\n};\n\nconst toPosix = (value: string): string => value.split(sep).join('/');\n\nexport interface TestProjectRunOptions {\n cwd?: string;\n projectRoot?: string;\n configPath?: string;\n resultDir?: string;\n projectNames?: readonly string[];\n onProgress?(message: string): void;\n}\n\ninterface PreparedExecutionProject<TProjectContext = unknown> {\n project: ResolvedExecutionProject<TProjectContext>;\n fileSelection: TestFileSelection;\n sources: readonly WorkflowDocumentSource[];\n documents: readonly CollectedWorkflowDocument[];\n collectionErrors: readonly TestProjectCollectionError[];\n selectedCaseCount: number;\n filteredCaseCount: number;\n}\n\nexport const discoverTestFiles = (\n projectRoot: string,\n selection: TestFileSelection = DEFAULT_TEST_FILE_SELECTION,\n): string[] => {\n const root = resolve(projectRoot);\n const normalized = validateTestFileSelection(selection);\n if (!normalized) throw new TypeError('Test file selection is required.');\n\n const files = globSync(normalized.include, {\n absolute: true,\n caseSensitiveMatch: false,\n cwd: root,\n dot: true,\n expandDirectories: false,\n followSymbolicLinks: false,\n ignore: [...ALWAYS_IGNORED_PATTERNS, ...(normalized.exclude ?? [])],\n onlyFiles: true,\n }).filter((file) => /\\.ya?ml$/i.test(file));\n\n return [...new Set(files.map((file) => resolve(file)))].sort((a, b) => {\n const relativeA = toPosix(relative(root, a));\n const relativeB = toPosix(relative(root, b));\n return relativeA < relativeB ? -1 : relativeA > relativeB ? 1 : 0;\n });\n};\n\nexport const discoverTestConfig = (projectRoot: string): string | undefined => {\n const root = resolve(projectRoot);\n const candidates = readdirSync(root)\n .filter((name) => name.startsWith(CONFIG_PREFIX))\n .sort();\n const unsupported = candidates.filter((name) => name !== CONFIG_NAME);\n if (unsupported.length > 0) {\n throw new Error(\n [\n `Unsupported or conflicting Midscene configs found in ${root}:`,\n ...candidates.map((name) => `- ${name}`),\n `Only ${CONFIG_NAME} is supported.`,\n ].join('\\n'),\n );\n }\n return candidates.includes(CONFIG_NAME) ? join(root, CONFIG_NAME) : undefined;\n};\n\nconst defaultResultDir = (projectRoot: string): string =>\n join(projectRoot, '.midscene', 'test-results');\n\nconst padDatePart = (value: number): string => String(value).padStart(2, '0');\n\nexport const createTestRunId = (\n date = new Date(),\n uuid = randomUUID(),\n): string => {\n const timestamp = [\n date.getFullYear(),\n padDatePart(date.getMonth() + 1),\n padDatePart(date.getDate()),\n padDatePart(date.getHours()),\n padDatePart(date.getMinutes()),\n padDatePart(date.getSeconds()),\n ].join('');\n return `${timestamp}-${uuid.slice(0, 8)}`;\n};\n\nconst assertDirectory = (path: string, label: string): void => {\n if (!existsSync(path) || !statSync(path).isDirectory()) {\n throw new Error(`${label} does not exist or is not a directory: ${path}`);\n }\n};\n\nconst asCollectionError = (\n projectId: string,\n projectName: string,\n sourcePath: string,\n error: unknown,\n): TestProjectCollectionError => ({\n projectId,\n projectName,\n sourcePath,\n error:\n error instanceof WorkflowError\n ? error\n : new WorkflowParseError(\n `Failed to collect workflow document \"${sourcePath}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n { projectName, sourcePath },\n error,\n ),\n});\n\nconst matchesTags = (\n tags: readonly string[],\n selection: ResolvedExecutionProject['tags'],\n): boolean => {\n if (selection.exclude.some((tag) => tags.includes(tag))) return false;\n return (\n selection.include.length === 0 ||\n selection.include.some((tag) => tags.includes(tag))\n );\n};\n\nconst filterDocumentCases = (\n document: CollectedWorkflowDocument,\n project: ResolvedExecutionProject,\n): { document?: CollectedWorkflowDocument; filtered: number } => {\n const cases = document.cases.filter((item) =>\n matchesTags(item.definition.tags ?? [], project.tags),\n );\n const filtered = document.cases.length - cases.length;\n return cases.length === 0\n ? { filtered }\n : { document: { ...document, cases }, filtered };\n};\n\nconst asNotRun = (\n documentId: string,\n collectedCase: CollectedCase,\n projectName: string,\n reason: NonNullable<TestProjectCaseRunResult['notRunReason']>,\n): TestProjectCaseRunResult => ({\n documentId,\n caseId: collectedCase.caseId,\n projectName,\n name: collectedCase.definition.name,\n sourcePath: collectedCase.sourcePath,\n caseIndex: collectedCase.caseIndex,\n status: 'not-run',\n notRunReason: reason,\n});\n\nconst summarize = (\n projects: readonly TestExecutionProjectRunResult[],\n): TestProjectRunSummary => {\n const cases = projects.flatMap((project) => project.cases);\n const documents = projects.flatMap((project) => project.documents);\n return {\n total: cases.length,\n passed: cases.filter((item) => item.status === 'success').length,\n failed: cases.filter((item) => item.status === 'failed').length,\n notRun: cases.filter((item) => item.status === 'not-run').length,\n filtered: projects.reduce(\n (total, project) => total + project.filteredCaseCount,\n 0,\n ),\n collectionErrors: projects.reduce(\n (total, project) => total + project.collectionErrors.length,\n 0,\n ),\n documentFailures: documents.filter(\n (document) => document.status === 'failed',\n ).length,\n projectFailures: projects.filter((project) => project.status === 'failed')\n .length,\n };\n};\n\nconst stepPosition = (info: StepExecutionInfo) =>\n info.scope === 'case' ? info.case : info.document;\n\nconst formatStep = (info: StepExecutionInfo): string => {\n const position = stepPosition(info);\n const phase = position.phase === 'steps' ? 'step' : position.phase;\n return `${phase} ${position.stepIndex + 1}/${info.stepCount}: ${info.node}`;\n};\n\nconst formatStepResult = (\n info: StepExecutionInfo,\n result: StepRunResult,\n): string => {\n const indent = info.scope === 'case' ? ' ' : ' ';\n const symbol = result.status === 'success' ? '✓' : '✗';\n const error = result.error ? ` — ${result.error.message}` : '';\n const continuation = result.continuedAfterError ? '; continuing' : '';\n return `${indent}${symbol} ${formatStep(info)} (${result.durationMs} ms)${error}${continuation}`;\n};\n\nconst caseHasFatalError = (outcome: CaseRunOutcome): boolean =>\n (outcome.attempts ?? []).some(\n (attempt) =>\n [...attempt.beforeEach, ...attempt.steps, ...attempt.afterEach].some(\n (step) => step.error && isFatalDeviceError(step.error),\n ) || (attempt.teardownErrors ?? []).some(isFatalDeviceError),\n );\n\nconst documentHasFatalError = (result: WorkflowDocumentRunResult): boolean =>\n [...result.beforeAll, ...result.afterAll].some(\n (step) => step.error && isFatalDeviceError(step.error),\n ) || (result.teardownErrors ?? []).some(isFatalDeviceError);\n\nconst selectProjects = <TProjectContext>(\n projects: readonly ResolvedExecutionProject<TProjectContext>[],\n names: readonly string[] | undefined,\n): readonly ResolvedExecutionProject<TProjectContext>[] => {\n if (!names || names.length === 0) return projects;\n const requested = new Set(names);\n if (requested.size !== names.length) {\n throw new Error('Each --project name may only be specified once.');\n }\n const known = new Set(projects.map((project) => project.name));\n const unknown = names.find((name) => !known.has(name));\n if (unknown) throw new Error(`Unknown Midscene project: ${unknown}`);\n return projects.filter((project) => requested.has(project.name));\n};\n\nconst prepareProject = <TProjectContext>(\n project: ResolvedExecutionProject<TProjectContext>,\n projectRoot: string,\n resolveNode: Parameters<typeof collectWorkflowDocument>[1]['resolveNode'],\n runDir: string,\n): PreparedExecutionProject<TProjectContext> => {\n const fileSelection = project.files ?? DEFAULT_TEST_FILE_SELECTION;\n const files = discoverTestFiles(projectRoot, fileSelection);\n const sources = files.map((absolutePath) => ({\n projectId: project.projectId,\n projectName: project.name,\n sourcePath: toPosix(relative(projectRoot, absolutePath)),\n absolutePath,\n }));\n const collectionErrors: TestProjectCollectionError[] = [];\n const documents: CollectedWorkflowDocument[] = [];\n let filteredCaseCount = 0;\n\n if (sources.length === 0) {\n const error = asCollectionError(\n project.projectId,\n project.name,\n '<project>',\n new WorkflowParseError(\n `No workflow YAML files found for project \"${project.name}\" in ${projectRoot}.`,\n { projectName: project.name, projectRoot },\n ),\n );\n collectionErrors.push(error);\n writeCollectionError(runDir, error);\n }\n\n for (const source of sources) {\n try {\n const collected = collectWorkflowDocument(source, {\n resolveNode,\n variables: project.variables,\n env: process.env,\n });\n const filtered = filterDocumentCases(collected, project);\n filteredCaseCount += filtered.filtered;\n if (filtered.document) documents.push(filtered.document);\n } catch (error) {\n const collectionError = asCollectionError(\n project.projectId,\n project.name,\n source.sourcePath,\n error,\n );\n collectionErrors.push(collectionError);\n writeCollectionError(runDir, collectionError);\n }\n }\n\n return {\n project,\n fileSelection,\n sources,\n documents,\n collectionErrors,\n selectedCaseCount: documents.reduce(\n (total, document) => total + document.cases.length,\n 0,\n ),\n filteredCaseCount,\n };\n};\n\nconst notRunSuite = (\n prepared: PreparedExecutionProject,\n reason: NonNullable<TestProjectCaseRunResult['notRunReason']>,\n): TestProjectCaseRunResult[] =>\n prepared.documents.flatMap((document) =>\n document.cases.map((item) =>\n asNotRun(document.documentId, item, prepared.project.name, reason),\n ),\n );\n\nexport async function runTestProject(\n options: TestProjectRunOptions = {},\n): Promise<TestProjectRunResult> {\n const startedAt = new Date();\n const runId = createTestRunId(startedAt);\n const cwd = resolve(options.cwd ?? process.cwd());\n assertDirectory(cwd, 'Test working directory');\n const cliProjectRoot = options.projectRoot\n ? resolve(cwd, options.projectRoot)\n : undefined;\n if (cliProjectRoot) assertDirectory(cliProjectRoot, 'Test project directory');\n const configSearchRoot = cliProjectRoot ?? cwd;\n const configPath = options.configPath\n ? resolve(configSearchRoot, options.configPath)\n : discoverTestConfig(configSearchRoot);\n if (options.configPath && (!configPath || !existsSync(configPath))) {\n throw new Error(`Midscene config does not exist: ${configPath}`);\n }\n\n const definition = await loadTestProject(configPath);\n const projectRoot = cliProjectRoot ?? cwd;\n\n const resultDir = options.resultDir\n ? resolve(cwd, options.resultDir)\n : defaultResultDir(projectRoot);\n const runDir = join(resultDir, runId);\n const summaryPath = join(runDir, 'summary.json');\n const reportDir = resolve(projectRoot, definition.output.reportDir);\n mkdirSync(resultDir, { recursive: true });\n mkdirSync(runDir);\n const selectedProjects = selectProjects(\n definition.projects,\n options.projectNames,\n );\n const preparedProjects = selectedProjects.map((project) =>\n prepareProject(project, projectRoot, definition.resolveNode, runDir),\n );\n const progress = options.onProgress ?? (() => {});\n const totalDocuments = preparedProjects.reduce(\n (total, prepared) => total + prepared.documents.length,\n 0,\n );\n const totalCases = preparedProjects.reduce(\n (total, prepared) => total + prepared.selectedCaseCount,\n 0,\n );\n const totalErrors = preparedProjects.reduce(\n (total, prepared) => total + prepared.collectionErrors.length,\n 0,\n );\n progress(\n `midscene-test: preflighted ${preparedProjects.length} projects, ${totalDocuments} documents, ${totalCases} cases, ${totalErrors} collection errors`,\n );\n\n const effectiveConcurrency = Math.min(\n definition.test.maxConcurrency,\n preparedProjects.length,\n );\n const rootController = new AbortController();\n setMaxListeners(\n Math.max(10, effectiveConcurrency + 1),\n rootController.signal,\n );\n const handleSignal = (signal: NodeJS.Signals) => {\n rootController.abort(new Error(`Workflow interrupted by ${signal}.`));\n };\n const sigint = () => handleSignal('SIGINT');\n const sigterm = () => handleSignal('SIGTERM');\n process.on('SIGINT', sigint);\n process.on('SIGTERM', sigterm);\n\n let failedCaseCount = 0;\n const bailReached = () =>\n definition.test.bail > 0 && failedCaseCount >= definition.test.bail;\n let hasInfrastructureError = false;\n let firstInfrastructureError: unknown;\n const recordInfrastructureError = (error: unknown) => {\n if (hasInfrastructureError) return;\n hasInfrastructureError = true;\n firstInfrastructureError = error;\n rootController.abort(error);\n };\n const runInfrastructureCallback = <T>(callback: () => T): T => {\n try {\n return callback();\n } catch (error) {\n recordInfrastructureError(error);\n throw error;\n }\n };\n type PreparedProject = (typeof preparedProjects)[number];\n const announceProject = (prepared: PreparedProject, projectIndex: number) => {\n const { project } = prepared;\n runInfrastructureCallback(() =>\n progress(\n `[project ${projectIndex + 1}/${preparedProjects.length}] ${project.name} (${project.platform})`,\n ),\n );\n };\n const buildProjectResult = (\n prepared: PreparedProject,\n cases: readonly TestProjectCaseRunResult[],\n documents: readonly WorkflowDocumentRunResult[],\n lifecycle?: TestExecutionProjectRunResult['lifecycle'],\n ): TestExecutionProjectRunResult => {\n const { project } = prepared;\n const projectFailed =\n prepared.collectionErrors.length > 0 ||\n cases.some((item) => item.status !== 'success') ||\n documents.some((item) => item.status === 'failed') ||\n lifecycle?.status === 'failed';\n return {\n projectId: project.projectId,\n name: project.name,\n platform: project.platform,\n status: projectFailed ? 'failed' : 'success',\n retry: project.retry,\n fileSelection: prepared.fileSelection,\n tagSelection: project.tags,\n sourceCount: prepared.sources.length,\n selectedCaseCount: prepared.selectedCaseCount,\n filteredCaseCount: prepared.filteredCaseCount,\n ...(lifecycle ? { lifecycle } : {}),\n cases,\n documents,\n collectionErrors: prepared.collectionErrors,\n };\n };\n const buildSkippedProjectResult = (\n prepared: PreparedProject,\n projectIndex: number,\n reason: NonNullable<TestProjectCaseRunResult['notRunReason']>,\n ): TestExecutionProjectRunResult => {\n announceProject(prepared, projectIndex);\n return buildProjectResult(prepared, notRunSuite(prepared, reason), []);\n };\n const runPreparedProject = async (\n prepared: PreparedProject,\n projectIndex: number,\n ): Promise<TestExecutionProjectRunResult> => {\n const { project } = prepared;\n announceProject(prepared, projectIndex);\n const projectProgress = (message: string) =>\n runInfrastructureCallback(() =>\n progress(\n effectiveConcurrency > 1 ? `[${project.name}]${message}` : message,\n ),\n );\n const cases: TestProjectCaseRunResult[] = [];\n const documents: WorkflowDocumentRunResult[] = [];\n let lifecycle: TestExecutionProjectRunResult['lifecycle'];\n let projectFatal = false;\n\n if (prepared.collectionErrors.length > 0) {\n cases.push(...notRunSuite(prepared, 'project-preflight-failed'));\n } else if (rootController.signal.aborted) {\n cases.push(...notRunSuite(prepared, 'interrupted'));\n } else if (bailReached()) {\n cases.push(...notRunSuite(prepared, 'bail'));\n } else {\n const runtime = createProjectRuntime({\n project,\n setup: project.setup,\n signal: rootController.signal,\n });\n let hasProjectExecutionError = false;\n let projectExecutionError: unknown;\n try {\n await runtime.start();\n if (!runtime.canRun) {\n cases.push(\n ...notRunSuite(\n prepared,\n rootController.signal.aborted\n ? 'interrupted'\n : 'project-setup-failed',\n ),\n );\n } else {\n for (const [\n documentIndex,\n document,\n ] of prepared.documents.entries()) {\n if (\n rootController.signal.aborted ||\n bailReached() ||\n projectFatal\n ) {\n const reason = rootController.signal.aborted\n ? 'interrupted'\n : projectFatal\n ? 'fatal-error'\n : 'bail';\n cases.push(\n ...document.cases.map((item) =>\n asNotRun(document.documentId, item, project.name, reason),\n ),\n );\n continue;\n }\n projectProgress(\n ` [document ${documentIndex + 1}/${prepared.documents.length}] ${document.sourcePath}`,\n );\n const execution = await runWorkflowDocument(document, {\n resolveNode: definition.nodes.require.bind(definition.nodes),\n project,\n projectContext: runtime.context,\n retry: project.retry,\n signal: runtime.signal,\n defaultTimeoutMs: definition.test.testTimeout,\n shouldStop: () =>\n rootController.signal.aborted || bailReached() || projectFatal,\n stopReason: () =>\n rootController.signal.aborted\n ? 'interrupted'\n : projectFatal\n ? 'fatal-error'\n : 'bail',\n isFatalError: (run) =>\n [...run.beforeEach, ...run.steps, ...run.afterEach].some(\n (step) => step.error && isFatalDeviceError(step.error),\n ) || (run.teardownErrors ?? []).some(isFatalDeviceError),\n onCaseStart: (collectedCase) => {\n projectProgress(\n ` [case ${collectedCase.caseIndex + 1}/${document.cases.length}] ${collectedCase.definition.name}`,\n );\n },\n onStepStart: (info) => {\n const indent = info.scope === 'case' ? ' ' : ' ';\n projectProgress(`${indent}→ ${formatStep(info)}`);\n },\n onStepResult: (info, result) =>\n projectProgress(formatStepResult(info, result)),\n onCaseResult: (attempt) => {\n runInfrastructureCallback(() =>\n writeCaseAttemptResult(\n runDir,\n project.projectId,\n document.documentId,\n attempt,\n ),\n );\n projectProgress(\n ` ${attempt.status === 'success' ? '✓' : '✗'} attempt ${attempt.attemptIndex + 1}/${project.retry + 1}: ${attempt.name} (${attempt.durationMs} ms)`,\n );\n },\n onCaseOutcome: (outcome) => {\n if (outcome.status === 'failed') failedCaseCount += 1;\n if (caseHasFatalError(outcome)) projectFatal = true;\n },\n onDocumentResult: (documentResult) =>\n runInfrastructureCallback(() =>\n writeWorkflowDocumentResult(runDir, documentResult),\n ),\n });\n cases.push(\n ...execution.cases.map((outcome) => ({\n ...outcome,\n documentId: document.documentId,\n })),\n );\n if (documentHasFatalError(execution.document)) {\n projectFatal = true;\n }\n documents.push(execution.document);\n }\n }\n } catch (error) {\n hasProjectExecutionError = true;\n projectExecutionError = error;\n recordInfrastructureError(error);\n } finally {\n const hasFailure =\n hasProjectExecutionError ||\n cases.some((item) => item.status !== 'success') ||\n documents.some((item) => item.status === 'failed') ||\n projectFatal ||\n rootController.signal.aborted;\n lifecycle = await runtime.finish(hasFailure ? 'failed' : 'success');\n }\n if (hasProjectExecutionError) throw projectExecutionError;\n }\n\n return buildProjectResult(prepared, cases, documents, lifecycle);\n };\n\n const projectResults: Array<TestExecutionProjectRunResult | undefined> =\n new Array(preparedProjects.length);\n let nextProjectIndex = 0;\n const claimNextProject = (): number | undefined => {\n if (\n hasInfrastructureError ||\n rootController.signal.aborted ||\n bailReached() ||\n nextProjectIndex >= preparedProjects.length\n ) {\n return undefined;\n }\n const projectIndex = nextProjectIndex;\n nextProjectIndex += 1;\n return projectIndex;\n };\n const worker = async () => {\n try {\n while (true) {\n const projectIndex = claimNextProject();\n if (projectIndex === undefined) return;\n projectResults[projectIndex] = await runPreparedProject(\n preparedProjects[projectIndex],\n projectIndex,\n );\n }\n } catch (error) {\n recordInfrastructureError(error);\n }\n };\n\n try {\n await Promise.allSettled(\n Array.from({ length: effectiveConcurrency }, () => worker()),\n );\n } finally {\n process.off('SIGINT', sigint);\n process.off('SIGTERM', sigterm);\n }\n if (hasInfrastructureError) throw firstInfrastructureError;\n\n const completedProjectResults = preparedProjects.map(\n (prepared, projectIndex) => {\n const result = projectResults[projectIndex];\n if (result) return result;\n const reason = prepared.collectionErrors.length\n ? 'project-preflight-failed'\n : rootController.signal.aborted\n ? 'interrupted'\n : bailReached()\n ? 'bail'\n : undefined;\n if (!reason) {\n throw new Error(\n `Project scheduler did not produce a result for \"${prepared.project.name}\".`,\n );\n }\n return buildSkippedProjectResult(prepared, projectIndex, reason);\n },\n );\n\n const summary = summarize(completedProjectResults);\n const failed =\n rootController.signal.aborted ||\n summary.failed > 0 ||\n summary.notRun > 0 ||\n summary.collectionErrors > 0 ||\n summary.documentFailures > 0 ||\n summary.projectFailures > 0;\n const endedAt = new Date();\n const result: TestProjectRunResult = {\n schemaVersion: 3,\n runId,\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: Math.max(0, endedAt.getTime() - startedAt.getTime()),\n status: failed ? 'failed' : 'success',\n exitCode: failed ? 1 : 0,\n resultDir,\n summaryPath,\n reportDir,\n summary,\n projects: completedProjectResults,\n cases: completedProjectResults.flatMap((project) => project.cases),\n documents: completedProjectResults.flatMap((project) => project.documents),\n collectionErrors: completedProjectResults.flatMap(\n (project) => project.collectionErrors,\n ),\n };\n writeTestProjectRunResult({\n projectRoot,\n ...(configPath ? { configPath } : {}),\n result,\n });\n return result;\n}\n"],"names":["WorkflowError","Error","undefined","message","options","WorkflowParseError","details","cause","NodeDefinitionError","DuplicateNodeError","node","NodeNotFoundError","NodeInputValidationError","error","issues","issue","String","firstIssue","path","StepTimeoutError","timeoutMs","NodeExecutionError","causeMessage","WorkflowLifecycleError","ProjectSetupError","ProjectTeardownError","NodeScopeTeardownError","FatalDeviceError","isFatalDeviceError","normalizeNodeExecutionError","validateOptionalText","value","field","validateInputSchema","schema","z","validateDefinition","defineNode","_nodes","NodeRegistry","name","nodes","Map","projectIdFromIndex","index","defineTestProject","definition","defineProjectSetup","getDefaultExport","loaded","absolutePath","defaultExport","TypeError","isRecord","Array","rejectUnknownKeys","allowedKeys","label","allowed","Set","unknown","Object","key","isAbsolutePattern","pattern","isAbsolute","validatePatterns","allowEmptyInclude","validateTestFileSelection","include","exclude","validateTagList","tag","validateTagSelection","assertJsonValue","seen","Number","item","child","deepFreezeJson","validateVariables","platforms","validatePlatform","validateProjectSetup","projectPlatform","supported","validatePositiveInteger","fallback","validateNonNegativeInteger","validateExecutionProjects","defaultSetup","platform","setup","names","projects","candidate","files","validateTestOptions","validateOutputPath","validateOutput","validateTestProjectDefinition","resolvedProjects","assertTypeScriptConfig","extension","canRetryWithCjsLoader","errorCode","SyntaxError","loadTestProject","configPath","resolve","tsImport","pathToFileURL","dirname","sep","tsxRequire","fallbackError","createProjectRuntime","startedAt","Date","controller","AbortController","parentSignal","abortFromParent","teardownStack","context","setupError","started","acceptingTeardowns","finishedResult","createResult","requestedStatus","teardownErrors","endedAt","Math","onTeardown","teardown","process","statusBeforeTeardown","registrationIndex","reason","supportedMetaKeys","isMapping","formatStep","normalizeMeta","timeout","continueOnError","validateCommonNodeInput","input","normalizeStep","entries","rawValue","rawMeta","normalizeSteps","steps","step","assertJsonSerializable","visit","cloneAndFreezeJson","toHistoryEntry","result","scope","createHistory","prefix","results","validateNodeOutput","output","createStepResultBase","phase","stepIndex","executeNode","execute","abortController","abortGraceTimeout","execution","Promise","settleOnAbort","abortedExecution","_","reject","setTimeout","timeoutExecution","timeoutError","settledExecution","clearTimeout","parseNodeInput","parsed","executeStep","target","signal","common","reportPathsFromTeardown","paths","createDocumentRuntime","document","documentRunId","randomUUID","beforeAll","afterAll","completedNodes","project","nodeTeardownStack","acceptingNodeTeardowns","reportPaths","runPhase","executionSignal","documentContext","stepInfo","finishError","runCollectedCase","collectedCase","phases","runId","beforeEach","afterEach","caseContext","executionError","cleanupSignal","asNotRun","projectName","runWorkflowDocument","createDocumentRunId","createCaseRunId","retry","runtime","cases","runtimeStarted","documentResult","fatalError","outcome","attempts","attemptIndex","run","interpolationExpression","exactEnvExpression","exactProjectExpression","missingVariable","kind","projectVariable","environmentVariable","interpolationValue","resolveString","exactEnv","exactProject","_match","environmentName","resolveWorkflowVariables","allowedSet","createCaseId","projectId","sourcePath","caseIndex","createHash","JSON","createWorkflowDocumentId","collectWorkflowDocument","source","loadYaml","readFileSync","JSON_SCHEMA","resolveStepVariables","normalizeLifecycle","normalized","resolved","lifecycle","ids","tags","caseId","writeJson","mkdirSync","writeFileSync","toPosix","caseAttemptResultPath","documentId","join","workflowDocumentResultPath","collectionErrorPath","id","writeWorkflowDocumentResult","runDir","_documentRunId","persistedResult","writeCaseAttemptResult","attemptId","writeCollectionError","collectionError","relativeToSummary","summaryPath","relative","errorJson","writeTestProjectRunResult","fact","attempt","CONFIG_NAME","CONFIG_PREFIX","ALWAYS_IGNORED_PATTERNS","DEFAULT_TEST_FILE_SELECTION","discoverTestFiles","projectRoot","selection","root","globSync","file","a","b","relativeA","relativeB","discoverTestConfig","candidates","readdirSync","unsupported","defaultResultDir","padDatePart","createTestRunId","date","uuid","timestamp","assertDirectory","existsSync","statSync","asCollectionError","matchesTags","filterDocumentCases","filtered","summarize","documents","total","stepPosition","info","position","formatStepResult","indent","symbol","continuation","caseHasFatalError","documentHasFatalError","selectProjects","requested","known","prepareProject","resolveNode","fileSelection","sources","collectionErrors","filteredCaseCount","collected","notRunSuite","prepared","runTestProject","cwd","cliProjectRoot","configSearchRoot","resultDir","reportDir","selectedProjects","preparedProjects","progress","totalDocuments","totalCases","totalErrors","effectiveConcurrency","rootController","setMaxListeners","handleSignal","sigint","sigterm","failedCaseCount","bailReached","hasInfrastructureError","firstInfrastructureError","recordInfrastructureError","runInfrastructureCallback","callback","announceProject","projectIndex","buildProjectResult","projectFailed","buildSkippedProjectResult","runPreparedProject","projectProgress","projectFatal","hasProjectExecutionError","projectExecutionError","documentIndex","hasFailure","projectResults","nextProjectIndex","claimNextProject","worker","completedProjectResults","summary","failed"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli/index.mjs","sources":["../../../src/errors.ts","../../../src/node/define-node.ts","../../../src/engine/registry.ts","../../../src/cli/test-project.ts","../../../src/engine/project-runtime.ts","../../../src/engine/execute-step.ts","../../../src/engine/scope-teardown.ts","../../../src/engine/document-runtime.ts","../../../src/engine/run-collected-case.ts","../../../src/engine/run-workflow-document.ts","../../../src/parser/normalize.ts","../../../src/parser/variables.ts","../../../src/parser/collect.ts","../../../src/cli/result-store.ts","../../../src/cli/test-project-runner.ts"],"sourcesContent":["import type { z } from 'zod/v4';\n\nexport interface WorkflowErrorOptions {\n code?: string;\n details?: unknown;\n cause?: unknown;\n}\n\nexport class WorkflowError extends Error {\n readonly code: string;\n readonly details?: unknown;\n\n constructor(message: string, options: WorkflowErrorOptions = {}) {\n super(message, { cause: options.cause });\n this.name = new.target.name;\n this.code = options.code ?? 'WORKFLOW_ERROR';\n this.details = options.details;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n ...(this.details === undefined ? {} : { details: this.details }),\n };\n }\n}\n\nexport class WorkflowParseError extends WorkflowError {\n constructor(message: string, details?: unknown, cause?: unknown) {\n super(message, { code: 'WORKFLOW_PARSE_ERROR', details, cause });\n }\n}\n\nexport class NodeDefinitionError extends WorkflowError {\n constructor(message: string, details?: unknown) {\n super(message, { code: 'NODE_DEFINITION_ERROR', details });\n }\n}\n\nexport class DuplicateNodeError extends WorkflowError {\n readonly node: string;\n\n constructor(node: string) {\n super(`Node \"${node}\" is already registered.`, {\n code: 'DUPLICATE_NODE',\n details: { node },\n });\n this.node = node;\n }\n}\n\nexport class NodeNotFoundError extends WorkflowError {\n readonly node: string;\n\n constructor(node: string) {\n super(`Node \"${node}\" is not registered.`, {\n code: 'NODE_NOT_FOUND',\n details: { node },\n });\n this.node = node;\n }\n}\n\nexport class NodeInputValidationError extends WorkflowError {\n constructor(message: string, details?: unknown) {\n super(message, { code: 'NODE_INPUT_VALIDATION_ERROR', details });\n }\n\n static fromZod(node: string, error: z.ZodError): NodeInputValidationError {\n const issues = error.issues.map((issue) => ({\n code: issue.code,\n path: issue.path.map(String).join('.'),\n message: issue.message,\n }));\n const firstIssue = issues[0];\n const path = firstIssue?.path || '<root>';\n const message = firstIssue?.message ?? 'invalid input';\n return new NodeInputValidationError(\n `Node \"${node}\" input validation failed at \"${path}\": ${message}`,\n { node, issues },\n );\n }\n}\n\nexport class StepTimeoutError extends WorkflowError {\n readonly timeoutMs: number;\n readonly node?: string;\n\n constructor(timeoutMs: number, node?: string) {\n super(\n node\n ? `Node \"${node}\" timed out after ${timeoutMs}ms.`\n : `Step timed out after ${timeoutMs}ms.`,\n {\n code: 'STEP_TIMEOUT',\n details: { timeoutMs, ...(node === undefined ? {} : { node }) },\n },\n );\n this.timeoutMs = timeoutMs;\n this.node = node;\n }\n}\n\nexport class NodeExecutionError extends WorkflowError {\n readonly node: string;\n\n constructor(node: string, cause: unknown) {\n const causeMessage =\n cause instanceof Error ? cause.message : String(cause ?? 'Unknown error');\n super(`Node \"${node}\" failed: ${causeMessage}`, {\n code: 'NODE_EXECUTION_ERROR',\n details: { node },\n cause,\n });\n this.node = node;\n }\n}\n\nexport class WorkflowLifecycleError extends WorkflowError {\n constructor(message: string, details?: unknown) {\n super(message, { code: 'WORKFLOW_LIFECYCLE_ERROR', details });\n }\n}\n\nexport class ProjectSetupError extends WorkflowError {\n constructor(cause: unknown, details: { projectName: string }) {\n const causeMessage =\n cause instanceof Error ? cause.message : String(cause ?? 'Unknown error');\n super(`Project \"${details.projectName}\" setup failed: ${causeMessage}`, {\n code: 'PROJECT_SETUP_ERROR',\n details,\n cause,\n });\n }\n}\n\nexport class ProjectTeardownError extends WorkflowError {\n constructor(\n cause: unknown,\n details: { projectName: string; registrationIndex: number },\n ) {\n const causeMessage =\n cause instanceof Error ? cause.message : String(cause ?? 'Unknown error');\n super(`Project \"${details.projectName}\" teardown failed: ${causeMessage}`, {\n code: 'PROJECT_TEARDOWN_ERROR',\n details,\n cause,\n });\n }\n}\n\nexport class NodeScopeTeardownError extends WorkflowError {\n constructor(\n cause: unknown,\n details: {\n scope: 'case' | 'document';\n scopeId: string;\n node: string;\n registrationIndex: number;\n },\n ) {\n const causeMessage =\n cause instanceof Error ? cause.message : String(cause ?? 'Unknown error');\n super(\n `${details.scope === 'case' ? 'Case attempt' : 'Workflow document'} node teardown failed for \"${details.node}\": ${causeMessage}`,\n { code: 'NODE_SCOPE_TEARDOWN_ERROR', details, cause },\n );\n }\n}\n\nexport class FatalDeviceError extends WorkflowError {\n constructor(message: string, cause?: unknown) {\n super(message, { code: 'FATAL_DEVICE_ERROR', cause });\n }\n}\n\nexport const isFatalDeviceError = (error: unknown): boolean => {\n if (error instanceof FatalDeviceError) return true;\n if (error instanceof WorkflowError && error.code === 'FATAL_DEVICE_ERROR') {\n return true;\n }\n if (\n error instanceof Error &&\n /device offline|device not found|(?:adb|bdc|device) connection (?:was )?closed/i.test(\n error.message,\n )\n ) {\n return true;\n }\n return error instanceof Error && error.cause !== undefined\n ? isFatalDeviceError(error.cause)\n : false;\n};\n\nexport class CaseExecutionError extends WorkflowError {\n readonly result: import('./engine/types').CaseRunResult;\n\n constructor(result: import('./engine/types').CaseRunResult) {\n super(`Case \"${result.name}\" failed.`, {\n code: 'CASE_EXECUTION_FAILED',\n details: { caseId: result.caseId, runId: result.runId },\n });\n this.result = result;\n }\n}\n\nexport class WorkflowDocumentExecutionError extends WorkflowError {\n readonly result: import('./engine/types').WorkflowDocumentRunResult;\n\n constructor(result: import('./engine/types').WorkflowDocumentRunResult) {\n super(`Workflow document \"${result.sourcePath}\" failed.`, {\n code: 'WORKFLOW_DOCUMENT_EXECUTION_FAILED',\n details: {\n documentId: result.documentId,\n documentRunId: result.documentRunId,\n },\n });\n this.result = result;\n }\n}\n\nexport function normalizeNodeExecutionError(\n error: unknown,\n node: string,\n): WorkflowError {\n return error instanceof WorkflowError\n ? error\n : new NodeExecutionError(node, error);\n}\n","import { z } from 'zod/v4';\nimport { NodeDefinitionError } from '../errors';\nimport type {\n DefineNodeOptions,\n DefineNodeWithSchemaOptions,\n NodeDefinition,\n NodeDefinitionWithSchema,\n NodeInputSchema,\n} from './types';\n\nconst validateOptionalText = (\n value: unknown,\n field: 'title' | 'description',\n node: string,\n): void => {\n if (\n value !== undefined &&\n (typeof value !== 'string' || value.trim().length === 0)\n ) {\n throw new NodeDefinitionError(\n `Node \"${node}\" ${field} must be a non-empty string.`,\n { node, field },\n );\n }\n};\n\nconst validateInputSchema = (schema: unknown, node: string): void => {\n if (schema === undefined) return;\n if (!(schema instanceof z.ZodObject)) {\n throw new NodeDefinitionError(\n `Node \"${node}\" inputSchema must be a Zod object schema.`,\n { node, field: 'inputSchema' },\n );\n }\n if ('$' in schema.shape) {\n throw new NodeDefinitionError(\n `Node \"${node}\" inputSchema must not declare \"$\" as an input property.`,\n { node, field: 'inputSchema.$' },\n );\n }\n};\n\nconst validateDefinition = (options: {\n name: string;\n title?: unknown;\n description?: unknown;\n stringInputKey?: unknown;\n inputSchema?: unknown;\n execute: unknown;\n}): void => {\n if (!options || typeof options !== 'object') {\n throw new NodeDefinitionError('Node definition must be an object.');\n }\n\n if (typeof options.name !== 'string' || options.name.trim().length === 0) {\n throw new NodeDefinitionError('Node name must be a non-empty string.');\n }\n\n validateOptionalText(options.title, 'title', options.name);\n validateOptionalText(options.description, 'description', options.name);\n if (\n options.stringInputKey !== undefined &&\n options.stringInputKey !== false &&\n (typeof options.stringInputKey !== 'string' ||\n options.stringInputKey.trim().length === 0)\n ) {\n throw new NodeDefinitionError(\n `Node \"${options.name}\" stringInputKey must be a non-empty string or false.`,\n { node: options.name, field: 'stringInputKey' },\n );\n }\n validateInputSchema(options.inputSchema, options.name);\n\n if (\n typeof options.stringInputKey === 'string' &&\n options.inputSchema instanceof z.ZodObject &&\n !(options.stringInputKey in options.inputSchema.shape)\n ) {\n throw new NodeDefinitionError(\n `Node \"${options.name}\" stringInputKey must reference a field in inputSchema.`,\n { node: options.name, field: 'stringInputKey' },\n );\n }\n\n if (typeof options.execute !== 'function') {\n throw new NodeDefinitionError(\n `Node \"${options.name}\" must provide an execute function.`,\n { node: options.name },\n );\n }\n};\n\nexport function defineNode<\n TSchema extends NodeInputSchema,\n TData = unknown,\n TContext = unknown,\n>(\n options: DefineNodeWithSchemaOptions<TSchema, TData, TContext>,\n): NodeDefinitionWithSchema<TSchema, TData, TContext>;\n\nexport function defineNode<\n TInput = unknown,\n TData = unknown,\n TContext = unknown,\n>(\n options: DefineNodeOptions<TInput, TData, TContext>,\n): NodeDefinition<TInput, TData, TContext>;\n\nexport function defineNode(\n options: DefineNodeOptions<any, any, any>,\n): NodeDefinition<any, any, any> {\n validateDefinition(options);\n return options;\n}\n","import { DuplicateNodeError, NodeNotFoundError } from '../errors';\nimport { defineNode } from '../node/define-node';\nimport type { NodeDefinition } from '../node/types';\n\nexport class NodeRegistry {\n readonly #nodes = new Map<string, NodeDefinition<any, any, any>>();\n\n constructor(nodes: readonly NodeDefinition<any, any>[] = []) {\n for (const node of nodes) {\n this.register(node);\n }\n }\n\n register<TInput, TData>(node: NodeDefinition<TInput, TData>): this {\n defineNode(node);\n\n if (this.#nodes.has(node.name)) {\n throw new DuplicateNodeError(node.name);\n }\n\n this.#nodes.set(node.name, node);\n return this;\n }\n\n get(name: string): NodeDefinition<any, any> | undefined {\n return this.#nodes.get(name);\n }\n\n require(name: string): NodeDefinition<any, any> {\n const node = this.get(name);\n if (!node) {\n throw new NodeNotFoundError(name);\n }\n return node;\n }\n\n has(name: string): boolean {\n return this.#nodes.has(name);\n }\n\n names(): string[] {\n return [...this.#nodes.keys()];\n }\n\n definitions(): readonly NodeDefinition<any, any, any>[] {\n return [...this.#nodes.values()];\n }\n}\n","import { dirname, isAbsolute, resolve, sep } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { require as tsxRequire } from 'tsx/cjs/api';\nimport { tsImport } from 'tsx/esm/api';\nimport { NodeRegistry } from '../engine/registry';\nimport type { Awaitable } from '../engine/types';\nimport type { WorkflowError } from '../errors';\nimport type { NodeDefinition } from '../node/types';\n\nexport type TestPlatform = 'web' | 'android' | 'ios' | 'harmony' | 'computer';\n\nexport type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue =\n | JsonPrimitive\n | readonly JsonValue[]\n | { readonly [key: string]: JsonValue };\n\nexport interface TestFileSelection {\n include: readonly string[];\n exclude?: readonly string[];\n}\n\nexport interface TestTagSelection {\n include?: readonly string[];\n exclude?: readonly string[];\n}\n\nexport interface TestOptions {\n maxConcurrency?: number;\n bail?: number;\n testTimeout?: number;\n}\n\nexport interface ResolvedTestOptions {\n maxConcurrency: number;\n bail: number;\n testTimeout: number;\n}\n\nexport interface TestOutputDefinition {\n reportDir?: string;\n}\n\nexport interface ResolvedTestOutputDefinition {\n reportDir: string;\n}\n\nexport interface ExecutionProjectDefinition<TProjectContext = unknown> {\n name: string;\n platform: TestPlatform;\n setup?: ProjectSetupDefinition<TProjectContext>;\n files?: TestFileSelection;\n tags?: TestTagSelection;\n retry?: number;\n variables?: Readonly<Record<string, JsonValue>>;\n}\n\nexport interface ResolvedExecutionProject<TProjectContext = unknown> {\n readonly projectId: string;\n readonly name: string;\n readonly platform: TestPlatform;\n readonly setup?: ProjectSetupDefinition<TProjectContext>;\n readonly files?: TestFileSelection;\n readonly tags: Readonly<Required<TestTagSelection>>;\n readonly retry: number;\n readonly variables: Readonly<Record<string, JsonValue>>;\n}\n\nconst projectIdFromIndex = (index: number): string => `project-${index}`;\n\nexport interface ProjectSetupContext<TProjectContext = unknown> {\n readonly project: ResolvedExecutionProject<TProjectContext>;\n readonly env: Readonly<NodeJS.ProcessEnv>;\n readonly signal: AbortSignal;\n onTeardown(teardown: ProjectTeardown<TProjectContext>): void;\n}\n\nexport interface ProjectTeardownContext<TProjectContext = unknown> {\n readonly project: ResolvedExecutionProject<TProjectContext>;\n readonly context: TProjectContext | undefined;\n readonly status: 'success' | 'failed';\n readonly setupError?: WorkflowError;\n}\n\nexport type ProjectTeardown<TProjectContext = unknown> = (\n ctx: ProjectTeardownContext<TProjectContext>,\n) => Awaitable<void>;\n\nexport interface ProjectSetupDefinition<TProjectContext = unknown> {\n name: string;\n platform?: TestPlatform | readonly TestPlatform[];\n setup(ctx: ProjectSetupContext<TProjectContext>): Awaitable<TProjectContext>;\n}\n\nexport interface TestProjectDefinition<TContext = undefined> {\n setup?: ProjectSetupDefinition<TContext>;\n projects?: readonly ExecutionProjectDefinition<TContext>[];\n test?: TestOptions;\n output?: TestOutputDefinition;\n nodes: readonly NodeDefinition<any, any, TContext>[];\n}\n\nexport interface LoadedTestProject<TContext = undefined> {\n projects: readonly ResolvedExecutionProject<TContext>[];\n hasExplicitProjects: boolean;\n test: ResolvedTestOptions;\n output: ResolvedTestOutputDefinition;\n nodes: NodeRegistry;\n resolveNode(name: string): NodeDefinition<any, any, TContext> | undefined;\n}\n\nexport const defineTestProject = <TContext = undefined>(\n definition: TestProjectDefinition<TContext>,\n): TestProjectDefinition<TContext> => definition;\n\nexport const defineProjectSetup = <TProjectContext>(\n definition: ProjectSetupDefinition<TProjectContext>,\n): ProjectSetupDefinition<TProjectContext> => definition;\n\nconst getDefaultExport = (loaded: unknown, absolutePath: string): unknown => {\n if (typeof loaded === 'object' && loaded !== null && 'default' in loaded) {\n const defaultExport = (loaded as { default: unknown }).default;\n if (\n typeof defaultExport === 'object' &&\n defaultExport !== null &&\n '__esModule' in defaultExport\n ) {\n if ('default' in defaultExport) {\n return (defaultExport as { default: unknown }).default;\n }\n throw new TypeError(\n `Midscene config \"${absolutePath}\" must have a default export.`,\n );\n }\n return defaultExport;\n }\n throw new TypeError(\n `Midscene config \"${absolutePath}\" must have a default export.`,\n );\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst rejectUnknownKeys = (\n value: Record<string, unknown>,\n allowedKeys: readonly string[],\n label: string,\n): void => {\n const allowed = new Set(allowedKeys);\n const unknown = Object.keys(value).find((key) => !allowed.has(key));\n if (unknown) {\n throw new TypeError(\n `Midscene config ${label}.${unknown} is not supported.`,\n );\n }\n};\n\nconst isAbsolutePattern = (pattern: string): boolean =>\n isAbsolute(pattern) ||\n /^[A-Za-z]:[\\\\/]/.test(pattern) ||\n pattern.startsWith('\\\\\\\\');\n\nconst validatePatterns = (\n value: unknown,\n field: 'include' | 'exclude',\n label = 'files',\n allowEmptyInclude = false,\n): readonly string[] => {\n if (!Array.isArray(value)) {\n throw new TypeError(`Midscene config ${label}.${field} must be an array.`);\n }\n if (field === 'include' && value.length === 0 && !allowEmptyInclude) {\n throw new TypeError(\n `Midscene config ${label}.include must be a non-empty array.`,\n );\n }\n\n return value.map((pattern, index) => {\n if (typeof pattern !== 'string' || pattern.trim().length === 0) {\n throw new TypeError(\n `Midscene config ${label}.${field}[${index}] must be a non-empty string.`,\n );\n }\n if (isAbsolutePattern(pattern)) {\n throw new TypeError(\n `Midscene config ${label}.${field}[${index}] must be relative to the project root.`,\n );\n }\n if (pattern.split(/[\\\\/]/).includes('..')) {\n throw new TypeError(\n `Midscene config ${label}.${field}[${index}] must not contain a \"..\" path segment.`,\n );\n }\n if (pattern.includes('\\\\')) {\n throw new TypeError(\n `Midscene config ${label}.${field}[${index}] must use POSIX path separators (/).`,\n );\n }\n if (pattern.startsWith('!')) {\n if (field === 'include') {\n throw new TypeError(\n `Midscene config ${label}.include[${index}] must not be a negated pattern. Use files.exclude instead.`,\n );\n }\n throw new TypeError(\n `Midscene config ${label}.exclude[${index}] must not be a negated pattern.`,\n );\n }\n return pattern;\n });\n};\n\nexport const validateTestFileSelection = (\n value: unknown,\n label = 'files',\n): TestFileSelection | undefined => {\n if (value === undefined) return undefined;\n if (!isRecord(value)) {\n throw new TypeError(`Midscene config ${label} must be an object.`);\n }\n const include = validatePatterns(value.include, 'include', label);\n const exclude =\n value.exclude === undefined\n ? undefined\n : validatePatterns(value.exclude, 'exclude', label);\n return Object.freeze({\n include: Object.freeze(include),\n ...(exclude ? { exclude: Object.freeze(exclude) } : {}),\n });\n};\n\nconst validateTagList = (\n value: unknown,\n field: 'include' | 'exclude',\n label: string,\n): readonly string[] => {\n if (value === undefined) return [];\n if (!Array.isArray(value)) {\n throw new TypeError(`Midscene config ${label}.${field} must be an array.`);\n }\n return value.map((tag, index) => {\n if (typeof tag !== 'string' || tag.trim().length === 0) {\n throw new TypeError(\n `Midscene config ${label}.${field}[${index}] must be a non-empty string.`,\n );\n }\n return tag;\n });\n};\n\nconst validateTagSelection = (\n value: unknown,\n label: string,\n): Readonly<Required<TestTagSelection>> => {\n if (value === undefined) return Object.freeze({ include: [], exclude: [] });\n if (!isRecord(value)) {\n throw new TypeError(`Midscene config ${label} must be an object.`);\n }\n return Object.freeze({\n include: Object.freeze(validateTagList(value.include, 'include', label)),\n exclude: Object.freeze(validateTagList(value.exclude, 'exclude', label)),\n });\n};\n\nfunction assertJsonValue(\n value: unknown,\n path: string,\n seen: Set<unknown>,\n): asserts value is JsonValue {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean'\n ) {\n return;\n }\n if (typeof value === 'number') {\n if (Number.isFinite(value)) return;\n throw new TypeError(`Midscene config ${path} must be JSON-compatible.`);\n }\n if (typeof value !== 'object' || value === undefined) {\n throw new TypeError(`Midscene config ${path} must be JSON-compatible.`);\n }\n if (\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) !== Object.prototype &&\n Object.getPrototypeOf(value) !== null\n ) {\n throw new TypeError(`Midscene config ${path} must be JSON-compatible.`);\n }\n if (seen.has(value)) {\n throw new TypeError(`Midscene config ${path} must not contain cycles.`);\n }\n seen.add(value);\n if (Array.isArray(value)) {\n value.forEach((item, index) =>\n assertJsonValue(item, `${path}[${index}]`, seen),\n );\n } else {\n for (const [key, child] of Object.entries(value)) {\n assertJsonValue(child, `${path}.${key}`, seen);\n }\n }\n seen.delete(value);\n}\n\nconst deepFreezeJson = <T extends JsonValue>(value: T): T => {\n if (typeof value === 'object' && value !== null) {\n for (const child of Object.values(value)) deepFreezeJson(child);\n Object.freeze(value);\n }\n return value;\n};\n\nconst validateVariables = (\n value: unknown,\n label: string,\n): Readonly<Record<string, JsonValue>> => {\n if (value === undefined) return Object.freeze({});\n if (!isRecord(value)) {\n throw new TypeError(`Midscene config ${label} must be an object.`);\n }\n assertJsonValue(value, label, new Set());\n return deepFreezeJson(value as Record<string, JsonValue>);\n};\n\nconst platforms = new Set<TestPlatform>([\n 'web',\n 'android',\n 'ios',\n 'harmony',\n 'computer',\n]);\n\nconst validatePlatform = (value: unknown, label: string): TestPlatform => {\n if (typeof value !== 'string' || !platforms.has(value as TestPlatform)) {\n throw new TypeError(\n `Midscene config ${label} must be one of web, android, ios, harmony, computer.`,\n );\n }\n return value as TestPlatform;\n};\n\nconst validateProjectSetup = <TProjectContext>(\n value: unknown,\n projectPlatform: TestPlatform,\n label: string,\n): ProjectSetupDefinition<TProjectContext> | undefined => {\n if (value === undefined) return undefined;\n if (!isRecord(value)) {\n throw new TypeError(`Midscene config ${label} must be an object.`);\n }\n if (typeof value.name !== 'string' || value.name.trim().length === 0) {\n throw new TypeError(`Midscene config ${label}.name must be non-empty.`);\n }\n if (typeof value.setup !== 'function') {\n throw new TypeError(`Midscene config ${label}.setup must be a function.`);\n }\n const supported =\n value.platform === undefined\n ? undefined\n : Array.isArray(value.platform)\n ? value.platform.map((item, index) =>\n validatePlatform(item, `${label}.platform[${index}]`),\n )\n : [validatePlatform(value.platform, `${label}.platform`)];\n if (supported && !supported.includes(projectPlatform)) {\n throw new TypeError(\n `Midscene config ${label} does not support project platform \"${projectPlatform}\".`,\n );\n }\n return value as unknown as ProjectSetupDefinition<TProjectContext>;\n};\n\nconst validatePositiveInteger = (\n value: unknown,\n fallback: number,\n label: string,\n): number => {\n if (value === undefined) return fallback;\n if (!Number.isInteger(value) || (value as number) <= 0) {\n throw new TypeError(`Midscene config ${label} must be a positive integer.`);\n }\n return value as number;\n};\n\nconst validateNonNegativeInteger = (\n value: unknown,\n fallback: number,\n label: string,\n): number => {\n if (value === undefined) return fallback;\n if (!Number.isInteger(value) || (value as number) < 0) {\n throw new TypeError(\n `Midscene config ${label} must be a non-negative integer.`,\n );\n }\n return value as number;\n};\n\nconst validateExecutionProjects = <TProjectContext>(\n value: unknown,\n defaultSetup: unknown,\n): {\n projects: readonly ResolvedExecutionProject<TProjectContext>[];\n hasExplicitProjects: boolean;\n} => {\n if (value === undefined) {\n let platform: TestPlatform = 'web';\n if (defaultSetup !== undefined) {\n if (!isRecord(defaultSetup)) {\n throw new TypeError('Midscene config setup must be an object.');\n }\n if (Array.isArray(defaultSetup.platform)) {\n if (defaultSetup.platform.length !== 1) {\n throw new TypeError(\n 'Midscene config setup.platform must select exactly one platform when projects is omitted.',\n );\n }\n platform = validatePlatform(\n defaultSetup.platform[0],\n 'setup.platform[0]',\n );\n } else if (defaultSetup.platform !== undefined) {\n platform = validatePlatform(defaultSetup.platform, 'setup.platform');\n }\n }\n const setup = validateProjectSetup<TProjectContext>(\n defaultSetup,\n platform,\n 'setup',\n );\n return {\n hasExplicitProjects: false,\n projects: Object.freeze([\n Object.freeze({\n projectId: projectIdFromIndex(0),\n name: 'default',\n platform,\n ...(setup ? { setup } : {}),\n tags: Object.freeze({ include: [], exclude: [] }),\n retry: 0,\n variables: Object.freeze({}),\n }),\n ]),\n };\n }\n if (defaultSetup !== undefined) {\n throw new TypeError(\n 'Midscene config setup cannot be used together with projects. Move setup to projects[].setup.',\n );\n }\n if (!Array.isArray(value) || value.length === 0) {\n throw new TypeError(\n 'Midscene config projects must be a non-empty array when declared.',\n );\n }\n const names = new Set<string>();\n const projects = value.map((candidate, index) => {\n const label = `projects[${index}]`;\n if (!isRecord(candidate)) {\n throw new TypeError(`Midscene config ${label} must be an object.`);\n }\n rejectUnknownKeys(\n candidate,\n ['name', 'platform', 'setup', 'files', 'tags', 'retry', 'variables'],\n label,\n );\n if (\n typeof candidate.name !== 'string' ||\n candidate.name.trim().length === 0\n ) {\n throw new TypeError(`Midscene config ${label}.name must be non-empty.`);\n }\n if (names.has(candidate.name)) {\n throw new TypeError(\n `Midscene config project name \"${candidate.name}\" must be unique.`,\n );\n }\n names.add(candidate.name);\n const platform = validatePlatform(candidate.platform, `${label}.platform`);\n const files = validateTestFileSelection(candidate.files, `${label}.files`);\n return Object.freeze({\n projectId: projectIdFromIndex(index),\n name: candidate.name,\n platform,\n ...(files ? { files } : {}),\n tags: validateTagSelection(candidate.tags, `${label}.tags`),\n retry: validateNonNegativeInteger(candidate.retry, 0, `${label}.retry`),\n variables: validateVariables(candidate.variables, `${label}.variables`),\n ...(candidate.setup === undefined\n ? {}\n : {\n setup: validateProjectSetup<TProjectContext>(\n candidate.setup,\n platform,\n `${label}.setup`,\n )!,\n }),\n });\n });\n return { projects: Object.freeze(projects), hasExplicitProjects: true };\n};\n\nconst validateTestOptions = (value: unknown): ResolvedTestOptions => {\n if (value !== undefined && !isRecord(value)) {\n throw new TypeError('Midscene config test must be an object.');\n }\n const candidate = value ?? {};\n return Object.freeze({\n maxConcurrency: validatePositiveInteger(\n (candidate as Record<string, unknown>).maxConcurrency,\n 1,\n 'test.maxConcurrency',\n ),\n bail: validateNonNegativeInteger(\n (candidate as Record<string, unknown>).bail,\n 0,\n 'test.bail',\n ),\n testTimeout: validatePositiveInteger(\n (candidate as Record<string, unknown>).testTimeout,\n 120_000,\n 'test.testTimeout',\n ),\n });\n};\n\nconst validateOutputPath = (\n value: unknown,\n fallback: string,\n label: string,\n): string => {\n if (value === undefined) return fallback;\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new TypeError(`Midscene config ${label} must be non-empty.`);\n }\n return value;\n};\n\nconst validateOutput = (value: unknown): ResolvedTestOutputDefinition => {\n if (value !== undefined && !isRecord(value)) {\n throw new TypeError('Midscene config output must be an object.');\n }\n const candidate = (value ?? {}) as Record<string, unknown>;\n rejectUnknownKeys(candidate, ['reportDir'], 'output');\n return Object.freeze({\n reportDir: validateOutputPath(\n candidate.reportDir,\n './midscene_run/report',\n 'output.reportDir',\n ),\n });\n};\n\nconst validateTestProjectDefinition = <TContext>(\n definition: unknown,\n): LoadedTestProject<TContext> => {\n if (\n !isRecord(definition) ||\n !('nodes' in definition) ||\n !Array.isArray(definition.nodes)\n ) {\n throw new TypeError(\n 'Midscene config must default export an object with a nodes array.',\n );\n }\n if ('setupWorkflow' in definition) {\n throw new TypeError(\n 'Midscene config setupWorkflow is no longer supported. Use setup or projects[].setup instead.',\n );\n }\n if ('setupDocument' in definition) {\n throw new TypeError(\n 'Midscene config setupDocument is not supported. Use setup or projects[].setup for resources, and beforeAll/afterAll for document lifecycle steps.',\n );\n }\n if ('root' in definition) {\n throw new TypeError(\n 'Midscene config root is not supported. Pass the Test Project directory to midscene-test instead.',\n );\n }\n if ('files' in definition) {\n throw new TypeError(\n 'Midscene config files is not supported at the root. Move it to projects[].files.',\n );\n }\n if ('testRunner' in definition) {\n throw new TypeError(\n 'Midscene config testRunner is not supported. Rename it to test.',\n );\n }\n rejectUnknownKeys(\n definition,\n ['setup', 'projects', 'test', 'output', 'nodes'],\n 'root',\n );\n const resolvedProjects = validateExecutionProjects<TContext>(\n definition.projects,\n definition.setup,\n );\n const nodes = new NodeRegistry(definition.nodes as NodeDefinition[]);\n return {\n ...resolvedProjects,\n test: validateTestOptions(definition.test),\n output: validateOutput(definition.output),\n nodes,\n resolveNode: (name) =>\n nodes.get(name) as NodeDefinition<any, any, TContext> | undefined,\n };\n};\n\nconst assertTypeScriptConfig = (absolutePath: string): void => {\n if (!absolutePath.endsWith('.ts')) {\n const extension = absolutePath.match(/(\\.[^./\\\\]+)$/)?.[1] ?? '(none)';\n throw new TypeError(\n `Unsupported Midscene config extension: ${extension}. Supported extension: .ts.`,\n );\n }\n};\n\nconst canRetryWithCjsLoader = (error: unknown): error is Error => {\n if (!(error instanceof Error)) return false;\n const errorCode = (error as Error & { code?: string }).code;\n return (\n (error instanceof SyntaxError &&\n /^Unexpected (?:identifier|reserved word|token)/.test(error.message)) ||\n errorCode === 'ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX' ||\n (errorCode === 'ERR_UNKNOWN_FILE_EXTENSION' &&\n /^Unknown file extension\\b/.test(error.message))\n );\n};\n\nexport async function loadTestProject<TContext = undefined>(\n configPath?: string,\n): Promise<LoadedTestProject<TContext>> {\n if (!configPath) {\n return validateTestProjectDefinition<TContext>({\n nodes: [],\n });\n }\n\n const absolutePath = resolve(configPath);\n assertTypeScriptConfig(absolutePath);\n let loaded: unknown;\n try {\n loaded = await tsImport(pathToFileURL(absolutePath).href, {\n parentURL: pathToFileURL(`${dirname(absolutePath)}${sep}`).href,\n tsconfig: false,\n });\n } catch (error) {\n try {\n if (!canRetryWithCjsLoader(error)) throw error;\n loaded = tsxRequire(absolutePath, pathToFileURL(absolutePath));\n } catch (fallbackError) {\n const message =\n fallbackError instanceof Error ? `: ${fallbackError.message}` : '';\n throw new Error(\n `Failed to load Midscene config \"${absolutePath}\"${message}`,\n { cause: fallbackError },\n );\n }\n }\n\n return validateTestProjectDefinition<TContext>(\n getDefaultExport(loaded, absolutePath),\n );\n}\n","import {\n ProjectSetupError,\n ProjectTeardownError,\n WorkflowLifecycleError,\n} from '../errors';\nimport type {\n ProjectRuntime,\n ProjectRuntimeOptions,\n ProjectRuntimeResult,\n} from './types';\n\nexport const createProjectRuntime = <TProjectContext = unknown>(\n options: ProjectRuntimeOptions<TProjectContext>,\n): ProjectRuntime<TProjectContext> => {\n const startedAt = new Date();\n const controller = new AbortController();\n const parentSignal = options.signal;\n const abortFromParent = () => controller.abort(parentSignal?.reason);\n if (parentSignal?.aborted) abortFromParent();\n else parentSignal?.addEventListener('abort', abortFromParent, { once: true });\n\n const teardownStack: Array<{\n registrationIndex: number;\n teardown: Parameters<\n Parameters<NonNullable<typeof options.setup>['setup']>[0]['onTeardown']\n >[0];\n }> = [];\n let context: TProjectContext | undefined;\n let setupError: ProjectSetupError | undefined;\n let started = false;\n let acceptingTeardowns = options.setup !== undefined;\n let finishedResult: ProjectRuntimeResult<TProjectContext> | undefined;\n\n const createResult = (\n requestedStatus: 'success' | 'failed',\n teardownErrors: readonly ProjectTeardownError[] = [],\n ): ProjectRuntimeResult<TProjectContext> => {\n const endedAt = new Date();\n return {\n projectName: options.project.name,\n platform: options.project.platform,\n status:\n requestedStatus === 'failed' || setupError || teardownErrors.length > 0\n ? 'failed'\n : 'success',\n ...(setupError ? { setupError } : {}),\n ...(teardownErrors.length > 0 ? { teardownErrors } : {}),\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: Math.max(0, endedAt.getTime() - startedAt.getTime()),\n };\n };\n\n const onTeardown = (\n teardown: (typeof teardownStack)[number]['teardown'],\n ): void => {\n if (!acceptingTeardowns) {\n throw new WorkflowLifecycleError(\n 'onTeardown() can only be called while Project setup is running.',\n { projectName: options.project.name },\n );\n }\n if (typeof teardown !== 'function') {\n throw new WorkflowLifecycleError(\n 'Project onTeardown() requires a teardown function.',\n { projectName: options.project.name },\n );\n }\n teardownStack.push({\n registrationIndex: teardownStack.length,\n teardown,\n });\n };\n\n return {\n get context() {\n return context;\n },\n get signal() {\n return controller.signal;\n },\n get canRun() {\n return started && !setupError && !controller.signal.aborted;\n },\n async start() {\n if (started) {\n throw new WorkflowLifecycleError(\n 'Project runtime has already started.',\n {\n projectName: options.project.name,\n },\n );\n }\n started = true;\n if (controller.signal.aborted) {\n acceptingTeardowns = false;\n return createResult('failed');\n }\n if (options.setup) {\n try {\n context = await options.setup.setup({\n project: options.project,\n env: Object.freeze({ ...process.env }),\n signal: controller.signal,\n onTeardown,\n });\n } catch (error) {\n setupError = new ProjectSetupError(error, {\n projectName: options.project.name,\n });\n } finally {\n acceptingTeardowns = false;\n }\n }\n return createResult(setupError ? 'failed' : 'success');\n },\n async finish(requestedStatus = 'success') {\n if (finishedResult) return finishedResult;\n if (!started) {\n throw new WorkflowLifecycleError(\n 'Project runtime must start before it can finish.',\n { projectName: options.project.name },\n );\n }\n const statusBeforeTeardown = createResult(requestedStatus).status;\n const teardownErrors: ProjectTeardownError[] = [];\n for (const { registrationIndex, teardown } of teardownStack.reverse()) {\n try {\n await teardown({\n project: options.project,\n context,\n status: statusBeforeTeardown,\n ...(setupError ? { setupError } : {}),\n });\n } catch (error) {\n teardownErrors.push(\n new ProjectTeardownError(error, {\n projectName: options.project.name,\n registrationIndex,\n }),\n );\n }\n }\n parentSignal?.removeEventListener('abort', abortFromParent);\n finishedResult = createResult(requestedStatus, teardownErrors);\n return finishedResult;\n },\n abort(reason) {\n controller.abort(reason);\n },\n };\n};\n","import {\n NodeExecutionError,\n NodeInputValidationError,\n StepTimeoutError,\n normalizeNodeExecutionError,\n} from '../errors';\nimport type { NodeDefinition, NodeResult } from '../node/types';\nimport type { NormalizedStep } from '../parser/types';\nimport type {\n NodeCaseContext,\n NodeDocumentContext,\n NodeExecutionPhase,\n NodeScopeTeardown,\n StepRunResult,\n} from './types';\n\nconst assertJsonSerializable = (\n value: unknown,\n label: string,\n node: string,\n): void => {\n const visit = (\n candidate: unknown,\n path: string,\n seen: Set<unknown>,\n ): void => {\n if (\n candidate === null ||\n typeof candidate === 'string' ||\n typeof candidate === 'boolean'\n ) {\n return;\n }\n if (typeof candidate === 'number') {\n if (Number.isFinite(candidate)) return;\n throw new TypeError(`${path} contains a non-finite number.`);\n }\n if (candidate === undefined) {\n throw new TypeError(`${path} contains undefined.`);\n }\n if (typeof candidate !== 'object') {\n throw new TypeError(`${path} is not JSON-serializable.`);\n }\n if (\n !Array.isArray(candidate) &&\n Object.getPrototypeOf(candidate) !== Object.prototype &&\n Object.getPrototypeOf(candidate) !== null\n ) {\n throw new TypeError(`${path} must contain only plain objects.`);\n }\n if (seen.has(candidate)) throw new TypeError(`${path} contains a cycle.`);\n seen.add(candidate);\n if (Array.isArray(candidate)) {\n candidate.forEach((child, index) =>\n visit(child, `${path}[${index}]`, seen),\n );\n } else {\n for (const [key, child] of Object.entries(candidate)) {\n visit(child, `${path}.${key}`, seen);\n }\n }\n seen.delete(candidate);\n };\n\n try {\n visit(value, label, new Set());\n } catch (error) {\n throw new NodeExecutionError(node, error);\n }\n};\n\nfunction validateNodeOutput<TData>(\n output: unknown,\n node: string,\n): NodeResult<TData> | undefined {\n if (output === undefined) {\n return undefined;\n }\n\n if (typeof output !== 'object' || output === null || Array.isArray(output)) {\n throw new NodeExecutionError(\n node,\n new TypeError('Node output must be an object or undefined.'),\n );\n }\n\n if (\n 'summary' in output &&\n output.summary !== undefined &&\n typeof output.summary !== 'string'\n ) {\n throw new NodeExecutionError(\n node,\n new TypeError('Node output summary must be a string.'),\n );\n }\n\n if ('data' in output && output.data !== undefined) {\n assertJsonSerializable(output.data, 'output.data', node);\n }\n\n return output as NodeResult<TData>;\n}\n\nfunction createStepResultBase(\n step: NormalizedStep,\n startedAt: Date,\n phase: NodeExecutionPhase,\n stepIndex: number,\n) {\n const endedAt = new Date();\n return {\n node: step.node,\n phase,\n stepIndex,\n input: step.input,\n meta: step.meta,\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: Math.max(0, endedAt.getTime() - startedAt.getTime()),\n };\n}\n\nasync function executeNode<TOutputData>(\n step: NormalizedStep,\n execute: (signal: AbortSignal) => unknown,\n phase: NodeExecutionPhase,\n stepIndex: number,\n options: { parentSignal?: AbortSignal; defaultTimeoutMs?: number },\n): Promise<StepRunResult<TOutputData>> {\n const startedAt = new Date();\n const abortController = new AbortController();\n const parentSignal = options.parentSignal;\n const abortFromParent = () => abortController.abort(parentSignal?.reason);\n if (parentSignal?.aborted) abortFromParent();\n else parentSignal?.addEventListener('abort', abortFromParent, { once: true });\n const timeoutMs = step.meta.timeoutMs ?? options.defaultTimeoutMs;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let abortGraceTimeout: ReturnType<typeof setTimeout> | undefined;\n const execution = Promise.resolve().then(() => {\n abortController.signal.throwIfAborted();\n return execute(abortController.signal);\n });\n let settleOnAbort: (() => void) | undefined;\n const abortedExecution = new Promise<never>((_, reject) => {\n settleOnAbort = () => {\n // Abort listeners run synchronously. Wait one task before rejecting so a\n // cooperative node can settle in response to the forwarded abort first.\n abortGraceTimeout = setTimeout(() => {\n reject(abortController.signal.reason);\n }, 0);\n };\n if (abortController.signal.aborted) settleOnAbort();\n else\n abortController.signal.addEventListener('abort', settleOnAbort, {\n once: true,\n });\n });\n const timeoutExecution =\n timeoutMs === undefined\n ? undefined\n : new Promise<never>((_, reject) => {\n timeout = setTimeout(() => {\n if (abortController.signal.aborted) {\n reject(abortController.signal.reason);\n return;\n }\n const timeoutError = new StepTimeoutError(timeoutMs, step.node);\n abortController.abort(timeoutError);\n reject(timeoutError);\n }, timeoutMs);\n });\n const settledExecution = Promise.race([\n execution,\n abortedExecution,\n ...(timeoutExecution === undefined ? [] : [timeoutExecution]),\n ]);\n\n try {\n const output = validateNodeOutput<TOutputData>(\n await settledExecution,\n step.node,\n );\n return {\n ...createStepResultBase(step, startedAt, phase, stepIndex),\n status: 'success',\n continuedAfterError: false,\n ...(output === undefined ? {} : { output }),\n };\n } catch (error) {\n return {\n ...createStepResultBase(step, startedAt, phase, stepIndex),\n status: 'failed',\n continuedAfterError: step.meta.continueOnError,\n error: normalizeNodeExecutionError(error, step.node),\n };\n } finally {\n if (timeout !== undefined) clearTimeout(timeout);\n if (abortGraceTimeout !== undefined) clearTimeout(abortGraceTimeout);\n if (settleOnAbort !== undefined) {\n abortController.signal.removeEventListener('abort', settleOnAbort);\n }\n parentSignal?.removeEventListener('abort', abortFromParent);\n }\n}\n\ntype StepExecutionTarget =\n | { scope: 'case'; case: NodeCaseContext }\n | { scope: 'document'; document: NodeDocumentContext };\n\nasync function parseNodeInput<TInput, TData, TContext>(\n node: NodeDefinition<TInput, TData, TContext>,\n input: Record<string, unknown>,\n): Promise<TInput> {\n if (!node.inputSchema) {\n return input as TInput;\n }\n\n const parsed = await node.inputSchema.safeParseAsync(input);\n if (!parsed.success) {\n throw NodeInputValidationError.fromZod(node.name, parsed.error);\n }\n return parsed.data as TInput;\n}\n\nexport async function executeStep<\n TInput = unknown,\n TOutputData = unknown,\n TContext = unknown,\n>(\n step: NormalizedStep,\n node: NodeDefinition<TInput, TOutputData, TContext>,\n target: StepExecutionTarget,\n context: TContext,\n execution: {\n signal?: AbortSignal;\n defaultTimeoutMs?: number;\n onTeardown?(node: string, teardown: NodeScopeTeardown): void;\n } = {},\n): Promise<StepRunResult<TOutputData>> {\n const phase =\n target.scope === 'case' ? target.case.phase : target.document.phase;\n const stepIndex =\n target.scope === 'case' ? target.case.stepIndex : target.document.stepIndex;\n\n return executeNode<TOutputData>(\n step,\n async (signal) => {\n const input = await parseNodeInput(node, step.input);\n signal.throwIfAborted();\n const common = {\n input,\n $: step.meta,\n signal,\n context,\n onTeardown: (teardown: NodeScopeTeardown) => {\n if (!execution.onTeardown) {\n throw new NodeExecutionError(\n step.node,\n new Error(\n 'The current execution scope cannot register teardown.',\n ),\n );\n }\n execution.onTeardown(step.node, teardown);\n },\n };\n return target.scope === 'case'\n ? node.execute({ ...common, scope: 'case', case: target.case })\n : node.execute({\n ...common,\n scope: 'document',\n document: target.document,\n });\n },\n phase,\n stepIndex,\n {\n parentSignal: execution.signal,\n defaultTimeoutMs: execution.defaultTimeoutMs,\n },\n );\n}\n","import { isAbsolute } from 'node:path';\nimport type { NodeScopeTeardownResult } from './types';\n\nexport const reportPathsFromTeardown = (\n // biome-ignore lint/suspicious/noConfusingVoidType: this consumes the intentional void teardown return.\n result: NodeScopeTeardownResult | void,\n): readonly string[] => {\n if (result === undefined) return [];\n if (typeof result !== 'object' || result === null || Array.isArray(result)) {\n throw new TypeError('Node teardown result must be an object or undefined.');\n }\n const paths = result.reportPaths;\n if (paths === undefined) return [];\n if (!Array.isArray(paths)) {\n throw new TypeError('Node teardown reportPaths must be an array.');\n }\n return paths.map((path, index) => {\n if (typeof path !== 'string' || path.trim().length === 0) {\n throw new TypeError(\n `Node teardown reportPaths[${index}] must be a non-empty string.`,\n );\n }\n if (!isAbsolute(path)) {\n throw new TypeError(\n `Node teardown reportPaths[${index}] must be an absolute path.`,\n );\n }\n return path;\n });\n};\n","import { randomUUID } from 'node:crypto';\nimport {\n NodeScopeTeardownError,\n type WorkflowError,\n WorkflowLifecycleError,\n} from '../errors';\nimport type { CollectedWorkflowDocument } from '../parser/types';\nimport { executeStep } from './execute-step';\nimport { reportPathsFromTeardown } from './scope-teardown';\nimport type {\n CreateDocumentRuntimeOptions,\n DocumentNodePhase,\n NodeDocumentContext,\n NodeScopeTeardown,\n StepRunResult,\n WorkflowDocumentRunResult,\n WorkflowDocumentRuntime,\n} from './types';\n\nexport function createDocumentRuntime<TContext = undefined>(\n document: CollectedWorkflowDocument,\n options: CreateDocumentRuntimeOptions<TContext>,\n): WorkflowDocumentRuntime<TContext> {\n const documentRunId = options.createDocumentRunId?.() ?? randomUUID();\n const startedAt = new Date();\n const beforeAll: StepRunResult[] = [];\n const afterAll: StepRunResult[] = [];\n const nodes = {\n beforeAll: document.lifecycle.beforeAll.map((step) =>\n options.resolveNode(step.node),\n ),\n afterAll: document.lifecycle.afterAll.map((step) =>\n options.resolveNode(step.node),\n ),\n };\n const project =\n options.project ??\n Object.freeze({\n projectId: document.projectId,\n name: document.projectId,\n platform: 'web' as const,\n tags: Object.freeze({ include: [], exclude: [] }),\n retry: 0,\n variables: Object.freeze({}),\n });\n const context = options.projectContext as TContext;\n const signal = options.signal ?? new AbortController().signal;\n const nodeTeardownStack: Array<{\n registrationIndex: number;\n node: string;\n teardown: NodeScopeTeardown;\n }> = [];\n let acceptingNodeTeardowns = true;\n let started = false;\n let finishedResult: WorkflowDocumentRunResult | undefined;\n const reportPaths = new Set<string>();\n\n const createResult = (\n teardownErrors: WorkflowError[] = [],\n ): WorkflowDocumentRunResult => {\n const endedAt = new Date();\n return {\n documentId: document.documentId,\n documentRunId,\n projectId: document.projectId,\n projectName: project.name,\n sourcePath: document.sourcePath,\n status:\n beforeAll.some((step) => step.status === 'failed') ||\n afterAll.some((step) => step.status === 'failed') ||\n teardownErrors.length > 0\n ? 'failed'\n : 'success',\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: Math.max(0, endedAt.getTime() - startedAt.getTime()),\n beforeAll: [...beforeAll],\n afterAll: [...afterAll],\n ...(teardownErrors.length > 0 ? { teardownErrors } : {}),\n ...(reportPaths.size > 0 ? { reportPaths: [...reportPaths] } : {}),\n };\n };\n\n const runPhase = async (\n phase: DocumentNodePhase,\n results: StepRunResult[],\n executionSignal = signal,\n ): Promise<void> => {\n for (const [stepIndex, step] of document.lifecycle[phase].entries()) {\n const documentContext: NodeDocumentContext = {\n documentId: document.documentId,\n documentRunId,\n projectId: document.projectId,\n projectName: project.name,\n sourcePath: document.sourcePath,\n phase,\n stepIndex,\n };\n const stepInfo = {\n scope: 'document' as const,\n node: step.node,\n stepCount: document.lifecycle[phase].length,\n document: documentContext,\n };\n await options.onStepStart?.(stepInfo);\n const result = await executeStep(\n step,\n nodes[phase][stepIndex],\n { scope: 'document', document: documentContext },\n context,\n {\n signal: executionSignal,\n defaultTimeoutMs: options.defaultTimeoutMs,\n onTeardown(node, teardown) {\n if (!acceptingNodeTeardowns) {\n throw new WorkflowLifecycleError(\n 'Node teardown can only be registered while a workflow document is running.',\n { documentId: document.documentId, documentRunId, node },\n );\n }\n if (typeof teardown !== 'function') {\n throw new WorkflowLifecycleError(\n 'Node onTeardown() requires a teardown function.',\n { documentId: document.documentId, documentRunId, node },\n );\n }\n nodeTeardownStack.push({\n registrationIndex: nodeTeardownStack.length,\n node,\n teardown,\n });\n },\n },\n );\n await options.onStepResult?.(stepInfo, result);\n results.push(result);\n if (result.status === 'failed' && !result.continuedAfterError) break;\n }\n };\n\n return {\n get context() {\n return context;\n },\n get canRunCases() {\n return (\n started &&\n !signal.aborted &&\n !beforeAll.some((step) => step.status === 'failed')\n );\n },\n async start() {\n if (started) {\n throw new WorkflowLifecycleError(\n 'Workflow document runtime has already started.',\n { documentId: document.documentId, documentRunId },\n );\n }\n started = true;\n if (!signal.aborted) await runPhase('beforeAll', beforeAll);\n return createResult();\n },\n async finish() {\n if (finishedResult) return finishedResult;\n if (!started) {\n throw new WorkflowLifecycleError(\n 'Workflow document runtime must start before it can finish.',\n { documentId: document.documentId, documentRunId },\n );\n }\n let finishError: unknown;\n try {\n await runPhase(\n 'afterAll',\n afterAll,\n signal.aborted ? new AbortController().signal : signal,\n );\n } catch (error) {\n finishError = error;\n }\n\n acceptingNodeTeardowns = false;\n const teardownErrors: WorkflowError[] = [];\n for (const {\n registrationIndex,\n node,\n teardown,\n } of nodeTeardownStack.reverse()) {\n try {\n for (const path of reportPathsFromTeardown(await teardown())) {\n reportPaths.add(path);\n }\n } catch (error) {\n teardownErrors.push(\n new NodeScopeTeardownError(error, {\n scope: 'document',\n scopeId: documentRunId,\n node,\n registrationIndex,\n }),\n );\n }\n }\n finishedResult = createResult(teardownErrors);\n if (finishError) throw finishError;\n await options.onResult?.(finishedResult);\n return finishedResult;\n },\n };\n}\n","import { randomUUID } from 'node:crypto';\nimport { NodeScopeTeardownError, WorkflowLifecycleError } from '../errors';\nimport type { CollectedCase, NormalizedStep } from '../parser/types';\nimport { executeStep } from './execute-step';\nimport { reportPathsFromTeardown } from './scope-teardown';\nimport type {\n CaseNodePhase,\n CaseRunResult,\n NodeCaseContext,\n NodeScopeTeardown,\n RunCollectedCaseOptions,\n StepRunResult,\n} from './types';\n\nexport async function runCollectedCase<TContext = undefined>(\n collectedCase: CollectedCase,\n options: RunCollectedCaseOptions<TContext>,\n): Promise<CaseRunResult> {\n const phases: Record<CaseNodePhase, readonly NormalizedStep[]> = {\n beforeEach: options.beforeEach ?? [],\n steps: collectedCase.definition.steps,\n afterEach: options.afterEach ?? [],\n };\n const nodes = {\n beforeEach: phases.beforeEach.map((step) => options.resolveNode(step.node)),\n steps: phases.steps.map((step) => options.resolveNode(step.node)),\n afterEach: phases.afterEach.map((step) => options.resolveNode(step.node)),\n };\n const runId = options.createRunId?.() ?? randomUUID();\n const startedAt = new Date();\n const beforeEach: StepRunResult[] = [];\n const steps: StepRunResult[] = [];\n const afterEach: StepRunResult[] = [];\n const teardownStack: Array<{\n registrationIndex: number;\n node: string;\n teardown: NodeScopeTeardown;\n }> = [];\n let acceptingTeardowns = true;\n\n const onTeardown = (node: string, teardown: NodeScopeTeardown): void => {\n if (!acceptingTeardowns) {\n throw new WorkflowLifecycleError(\n 'Node teardown can only be registered while a case attempt is running.',\n { runId, node },\n );\n }\n if (typeof teardown !== 'function') {\n throw new WorkflowLifecycleError(\n 'Node onTeardown() requires a teardown function.',\n { runId, node },\n );\n }\n teardownStack.push({\n registrationIndex: teardownStack.length,\n node,\n teardown,\n });\n };\n\n const runPhase = async (\n phase: CaseNodePhase,\n results: StepRunResult[],\n signal = options.signal,\n ): Promise<void> => {\n for (const [stepIndex, step] of phases[phase].entries()) {\n const caseContext: NodeCaseContext = {\n caseId: collectedCase.caseId,\n runId,\n projectName: options.projectName ?? collectedCase.projectId,\n attemptIndex: options.attemptIndex ?? 0,\n name: collectedCase.definition.name,\n sourcePath: collectedCase.sourcePath,\n caseIndex: collectedCase.caseIndex,\n phase,\n stepIndex,\n };\n const stepInfo = {\n scope: 'case' as const,\n node: step.node,\n stepCount: phases[phase].length,\n case: caseContext,\n };\n await options.onStepStart?.(stepInfo);\n const result = await executeStep(\n step,\n nodes[phase][stepIndex],\n { scope: 'case', case: caseContext },\n options.context as TContext,\n {\n signal,\n defaultTimeoutMs: options.defaultTimeoutMs,\n onTeardown,\n },\n );\n await options.onStepResult?.(stepInfo, result);\n results.push(result);\n if (result.status === 'failed' && !result.continuedAfterError) break;\n }\n };\n\n let executionError: unknown;\n try {\n await runPhase('beforeEach', beforeEach);\n if (!beforeEach.some((step) => step.status === 'failed')) {\n await runPhase('steps', steps);\n }\n } catch (error) {\n executionError = error;\n }\n try {\n const cleanupSignal = options.signal?.aborted\n ? new AbortController().signal\n : options.signal;\n await runPhase('afterEach', afterEach, cleanupSignal);\n } catch (error) {\n executionError ??= error;\n }\n\n acceptingTeardowns = false;\n const teardownErrors: NodeScopeTeardownError[] = [];\n const reportPaths = new Set<string>();\n for (const { registrationIndex, node, teardown } of teardownStack.reverse()) {\n try {\n for (const path of reportPathsFromTeardown(await teardown())) {\n reportPaths.add(path);\n }\n } catch (error) {\n teardownErrors.push(\n new NodeScopeTeardownError(error, {\n scope: 'case',\n scopeId: runId,\n node,\n registrationIndex,\n }),\n );\n }\n }\n if (executionError) throw executionError;\n\n const endedAt = new Date();\n const result: CaseRunResult = {\n caseId: collectedCase.caseId,\n runId,\n projectName: options.projectName ?? collectedCase.projectId,\n attemptIndex: options.attemptIndex ?? 0,\n name: collectedCase.definition.name,\n sourcePath: collectedCase.sourcePath,\n caseIndex: collectedCase.caseIndex,\n status:\n beforeEach.some((step) => step.status === 'failed') ||\n steps.some((step) => step.status === 'failed') ||\n afterEach.some((step) => step.status === 'failed') ||\n teardownErrors.length > 0\n ? 'failed'\n : 'success',\n beforeEach,\n steps,\n afterEach,\n ...(teardownErrors.length > 0 ? { teardownErrors } : {}),\n ...(reportPaths.size > 0 ? { reportPaths: [...reportPaths] } : {}),\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: Math.max(0, endedAt.getTime() - startedAt.getTime()),\n };\n\n await options.onResult?.(result);\n return result;\n}\n","import type { CollectedCase, CollectedWorkflowDocument } from '../parser/types';\nimport { createDocumentRuntime } from './document-runtime';\nimport { runCollectedCase } from './run-collected-case';\nimport type {\n CaseRunOutcome,\n RunWorkflowDocumentOptions,\n WorkflowDocumentExecutionResult,\n WorkflowDocumentRunResult,\n} from './types';\n\nconst asNotRun = (\n collectedCase: CollectedCase,\n projectName: string,\n reason: NonNullable<CaseRunOutcome['notRunReason']>,\n): CaseRunOutcome => ({\n caseId: collectedCase.caseId,\n projectName,\n name: collectedCase.definition.name,\n sourcePath: collectedCase.sourcePath,\n caseIndex: collectedCase.caseIndex,\n status: 'not-run',\n notRunReason: reason,\n});\n\nexport async function runWorkflowDocument<TContext = undefined>(\n document: CollectedWorkflowDocument,\n options: RunWorkflowDocumentOptions<TContext>,\n): Promise<WorkflowDocumentExecutionResult> {\n const createDocumentRunId = options.createDocumentRunId;\n const createCaseRunId = options.createCaseRunId;\n const projectName = options.project?.name ?? document.projectId;\n const retry = options.retry ?? options.project?.retry ?? 0;\n if (!Number.isInteger(retry) || retry < 0) {\n throw new TypeError(\n 'Workflow document retry must be a non-negative integer.',\n );\n }\n const runtime = createDocumentRuntime(document, {\n resolveNode: options.resolveNode,\n project: options.project,\n projectContext: options.projectContext,\n signal: options.signal,\n defaultTimeoutMs: options.defaultTimeoutMs,\n onStepStart: options.onStepStart,\n onStepResult: options.onStepResult,\n onResult: options.onDocumentResult,\n createDocumentRunId: createDocumentRunId\n ? () => createDocumentRunId(document)\n : undefined,\n });\n const cases: CaseRunOutcome[] = [];\n let runtimeStarted = false;\n let documentResult: WorkflowDocumentRunResult | undefined;\n let executionError: unknown;\n let fatalError = false;\n\n try {\n runtimeStarted = true;\n await runtime.start();\n\n if (!runtime.canRunCases) {\n const reason = options.signal?.aborted\n ? (options.stopReason?.() ?? 'interrupted')\n : 'document-start-failed';\n cases.push(\n ...document.cases.map((collectedCase) =>\n asNotRun(collectedCase, projectName, reason),\n ),\n );\n } else {\n for (const collectedCase of document.cases) {\n if (fatalError || options.shouldStop?.()) {\n const outcome = asNotRun(\n collectedCase,\n projectName,\n fatalError\n ? 'fatal-error'\n : (options.stopReason?.() ?? 'interrupted'),\n );\n cases.push(outcome);\n await options.onCaseOutcome?.(outcome);\n continue;\n }\n\n await options.onCaseStart?.(collectedCase);\n const attempts = [];\n for (let attemptIndex = 0; attemptIndex <= retry; attemptIndex += 1) {\n const run = await runCollectedCase(collectedCase, {\n resolveNode: options.resolveNode,\n beforeEach: document.lifecycle.beforeEach,\n afterEach: document.lifecycle.afterEach,\n context: runtime.context,\n projectName,\n attemptIndex,\n signal: options.signal,\n defaultTimeoutMs: options.defaultTimeoutMs,\n onStepStart: options.onStepStart,\n onStepResult: options.onStepResult,\n onResult: options.onCaseResult,\n createRunId: createCaseRunId\n ? () => createCaseRunId(collectedCase, attemptIndex)\n : undefined,\n });\n attempts.push(run);\n fatalError = options.isFatalError?.(run) ?? false;\n if (run.status === 'success' || fatalError) break;\n }\n const run = attempts.at(-1)!;\n const outcome: CaseRunOutcome = {\n caseId: collectedCase.caseId,\n projectName,\n name: collectedCase.definition.name,\n sourcePath: collectedCase.sourcePath,\n caseIndex: collectedCase.caseIndex,\n status: run.status,\n run,\n attempts,\n };\n cases.push(outcome);\n await options.onCaseOutcome?.(outcome);\n }\n }\n } catch (error) {\n executionError = error;\n } finally {\n if (runtimeStarted) {\n try {\n documentResult = await runtime.finish();\n } catch (error) {\n executionError ??= error;\n }\n }\n }\n\n if (executionError) throw executionError;\n if (!documentResult) {\n throw new Error(\n `Workflow document \"${document.sourcePath}\" did not produce a result.`,\n );\n }\n return { document: documentResult, cases };\n}\n","import { WorkflowParseError } from '../errors';\nimport type { NormalizedStep, NormalizedStepMeta } from './types';\n\ninterface StringInputNodeDefinition {\n stringInputKey?: string | false;\n}\n\nexport type ResolveNodeForNormalization = (\n name: string,\n) => StringInputNodeDefinition | undefined;\n\nconst supportedMetaKeys = new Set(['timeout', 'continue-on-error']);\n\nfunction isMapping(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n (Object.getPrototypeOf(value) === Object.prototype ||\n Object.getPrototypeOf(value) === null)\n );\n}\n\nfunction formatStep(index: number): string {\n return `step ${index + 1}`;\n}\n\nfunction normalizeMeta(value: unknown, index: number): NormalizedStepMeta {\n if (value === undefined) {\n return { continueOnError: false };\n }\n\n if (!isMapping(value)) {\n throw new WorkflowParseError(\n `${formatStep(index)} \"$\" must be a mapping.`,\n { index },\n );\n }\n\n for (const key of Object.keys(value)) {\n if (!supportedMetaKeys.has(key)) {\n throw new WorkflowParseError(\n `${formatStep(index)} has unsupported engine metadata \"${key}\".`,\n { index, key },\n );\n }\n }\n\n const timeout = value.timeout;\n if (\n timeout !== undefined &&\n (typeof timeout !== 'number' || !Number.isFinite(timeout) || timeout <= 0)\n ) {\n throw new WorkflowParseError(\n `${formatStep(index)} \"$.timeout\" must be a positive number of milliseconds.`,\n { index, timeout },\n );\n }\n\n const continueOnError = value['continue-on-error'];\n if (continueOnError !== undefined && typeof continueOnError !== 'boolean') {\n throw new WorkflowParseError(\n `${formatStep(index)} \"$.continue-on-error\" must be a boolean.`,\n { index, continueOnError },\n );\n }\n\n return {\n ...(timeout === undefined ? {} : { timeoutMs: timeout }),\n continueOnError: continueOnError ?? false,\n };\n}\n\nexport function normalizeStep(\n value: unknown,\n index = 0,\n resolveNode?: ResolveNodeForNormalization,\n): NormalizedStep {\n if (!isMapping(value)) {\n throw new WorkflowParseError(`${formatStep(index)} must be a mapping.`, {\n index,\n });\n }\n\n const entries = Object.entries(value);\n if (entries.length !== 1) {\n throw new WorkflowParseError(\n `${formatStep(index)} must contain exactly one node.`,\n { index, nodes: Object.keys(value) },\n );\n }\n\n const [node, rawValue] = entries[0];\n if (node.trim().length === 0) {\n throw new WorkflowParseError(\n `${formatStep(index)} node name must not be empty.`,\n { index },\n );\n }\n\n if (typeof rawValue === 'string') {\n const resolvedNode = resolveNode?.(node);\n const stringInputKey = resolvedNode\n ? resolvedNode.stringInputKey\n : 'prompt';\n if (stringInputKey === false || stringInputKey === undefined) {\n throw new WorkflowParseError(\n `${formatStep(index)} node \"${node}\" does not accept string shorthand.`,\n { index, node },\n );\n }\n return {\n node,\n input: { [stringInputKey]: rawValue },\n meta: { continueOnError: false },\n };\n }\n\n if (!isMapping(rawValue)) {\n throw new WorkflowParseError(\n `${formatStep(index)} value must be a string shorthand or a mapping.`,\n { index, node },\n );\n }\n\n const { $: rawMeta, ...input } = rawValue;\n\n return {\n node,\n input,\n meta: normalizeMeta(rawMeta, index),\n };\n}\n\nexport function normalizeSteps(\n steps: unknown,\n resolveNode?: ResolveNodeForNormalization,\n): NormalizedStep[] {\n if (!Array.isArray(steps)) {\n throw new WorkflowParseError('Steps must be an array.');\n }\n return steps.map((step, index) => normalizeStep(step, index, resolveNode));\n}\n","import type { JsonValue } from '../cli/test-project';\nimport { WorkflowParseError } from '../errors';\n\nexport interface VariableResolutionLocation {\n projectName: string;\n sourcePath: string;\n phase: 'beforeAll' | 'beforeEach' | 'steps' | 'afterEach' | 'afterAll';\n stepIndex: number;\n caseIndex?: number;\n}\n\nexport interface ResolveWorkflowVariablesOptions {\n variables?: Readonly<Record<string, JsonValue>>;\n env?: Readonly<NodeJS.ProcessEnv>;\n location: VariableResolutionLocation;\n}\n\nconst interpolationExpression =\n /\\$\\{\\{([A-Za-z_][A-Za-z0-9_]*)\\}\\}|\\$\\{([^{}]+)\\}/g;\nconst exactEnvExpression = /^\\$\\{\\{([A-Za-z_][A-Za-z0-9_]*)\\}\\}$/;\nconst exactProjectExpression = /^\\$\\{([^{}]+)\\}$/;\n\nconst missingVariable = (\n kind: 'environment' | 'project',\n name: string,\n options: ResolveWorkflowVariablesOptions,\n): never => {\n throw new WorkflowParseError(\n `Undefined ${kind} variable \"${name}\" in ${options.location.sourcePath}.`,\n { ...options.location, variable: name, variableKind: kind },\n );\n};\n\nconst projectVariable = (\n name: string,\n options: ResolveWorkflowVariablesOptions,\n): JsonValue => {\n if (!Object.hasOwn(options.variables ?? {}, name)) {\n return missingVariable('project', name, options);\n }\n return options.variables![name];\n};\n\nconst environmentVariable = (\n name: string,\n options: ResolveWorkflowVariablesOptions,\n): string => {\n const value = options.env?.[name];\n if (value === undefined) return missingVariable('environment', name, options);\n return value;\n};\n\nconst interpolationValue = (\n name: string,\n value: JsonValue,\n options: ResolveWorkflowVariablesOptions,\n): string => {\n if (typeof value === 'object' && value !== null) {\n throw new WorkflowParseError(\n `Project variable \"${name}\" must be a primitive when embedded in a string.`,\n {\n ...options.location,\n variable: name,\n variableKind: 'project',\n },\n );\n }\n return String(value);\n};\n\nconst resolveString = (\n value: string,\n options: ResolveWorkflowVariablesOptions,\n): JsonValue => {\n const exactEnv = exactEnvExpression.exec(value);\n if (exactEnv) return environmentVariable(exactEnv[1], options);\n const exactProject = exactProjectExpression.exec(value);\n if (exactProject) return projectVariable(exactProject[1], options);\n\n return value.replace(\n interpolationExpression,\n (_match, environmentName: string | undefined, projectName: string) =>\n environmentName\n ? environmentVariable(environmentName, options)\n : interpolationValue(\n projectName,\n projectVariable(projectName, options),\n options,\n ),\n );\n};\n\nexport const resolveWorkflowVariables = (\n value: unknown,\n options: ResolveWorkflowVariablesOptions,\n): unknown => {\n if (typeof value === 'string') return resolveString(value, options);\n if (Array.isArray(value)) {\n return value.map((child) => resolveWorkflowVariables(child, options));\n }\n if (typeof value === 'object' && value !== null) {\n return Object.fromEntries(\n Object.entries(value).map(([key, child]) => [\n key,\n resolveWorkflowVariables(child, options),\n ]),\n );\n }\n return value;\n};\n","import { createHash } from 'node:crypto';\nimport { readFileSync } from 'node:fs';\nimport { sep } from 'node:path';\nimport { JSON_SCHEMA, load as loadYaml } from 'js-yaml';\nimport type { JsonValue } from '../cli/test-project';\nimport { WorkflowParseError } from '../errors';\nimport type { NodeDefinition } from '../node/types';\nimport { normalizeSteps } from './normalize';\nimport type {\n CollectedCase,\n CollectedWorkflowDocument,\n WorkflowDocumentSource,\n} from './types';\nimport { resolveWorkflowVariables } from './variables';\n\nexport interface CollectWorkflowDocumentOptions {\n resolveNode(name: string): NodeDefinition<any, any> | undefined;\n variables?: Readonly<Record<string, JsonValue>>;\n env?: Readonly<NodeJS.ProcessEnv>;\n}\n\nconst isMapping = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst rejectUnknownKeys = (\n value: Record<string, unknown>,\n allowed: readonly string[],\n label: string,\n) => {\n const allowedSet = new Set(allowed);\n const unknown = Object.keys(value).filter((key) => !allowedSet.has(key));\n if (unknown.length) {\n throw new WorkflowParseError(\n `${label} has unsupported field \"${unknown[0]}\".`,\n { field: unknown[0] },\n );\n }\n};\n\nexport const createCaseId = (\n projectId: string,\n sourcePath: string,\n caseIndex: number,\n): string =>\n createHash('sha256')\n .update(JSON.stringify([projectId, sourcePath, caseIndex]))\n .digest('hex');\n\nexport const createWorkflowDocumentId = (\n projectId: string,\n sourcePath: string,\n): string =>\n createHash('sha256')\n .update(JSON.stringify([projectId, sourcePath]))\n .digest('hex');\n\nexport function collectWorkflowDocument(\n source: WorkflowDocumentSource,\n options: CollectWorkflowDocumentOptions,\n): CollectedWorkflowDocument {\n let parsed: unknown;\n try {\n parsed = loadYaml(readFileSync(source.absolutePath, 'utf8'), {\n schema: JSON_SCHEMA,\n });\n } catch (error) {\n throw new WorkflowParseError(\n `Failed to parse workflow document \"${source.sourcePath}\".`,\n { sourcePath: source.sourcePath },\n error,\n );\n }\n\n if (!isMapping(parsed)) {\n throw new WorkflowParseError('Workflow document must be a mapping.');\n }\n rejectUnknownKeys(\n parsed,\n ['beforeAll', 'beforeEach', 'cases', 'afterEach', 'afterAll'],\n 'Workflow document',\n );\n if (!Array.isArray(parsed.cases) || parsed.cases.length === 0) {\n throw new WorkflowParseError(\n 'Workflow document must contain a non-empty cases array.',\n );\n }\n\n const sourcePath = source.sourcePath.split(sep).join('/');\n const resolveStepVariables = (\n step: ReturnType<typeof normalizeSteps>[number],\n phase: 'beforeAll' | 'beforeEach' | 'steps' | 'afterEach' | 'afterAll',\n stepIndex: number,\n caseIndex?: number,\n ) => ({\n ...step,\n input: resolveWorkflowVariables(step.input, {\n variables: options.variables,\n env: options.env ?? process.env,\n location: {\n projectName: source.projectName ?? source.projectId,\n sourcePath,\n phase,\n stepIndex,\n ...(caseIndex === undefined ? {} : { caseIndex }),\n },\n }) as typeof step.input,\n });\n const normalizeLifecycle = (\n phase: 'beforeAll' | 'beforeEach' | 'afterEach' | 'afterAll',\n ) => {\n const value = parsed[phase];\n if (value === undefined) return [];\n if (!Array.isArray(value)) {\n throw new WorkflowParseError(\n `Workflow document ${phase} must be an array.`,\n { phase },\n );\n }\n return normalizeSteps(value, options.resolveNode).map(\n (normalized, stepIndex) => {\n const resolved = options.resolveNode(normalized.node);\n if (!resolved) {\n throw new WorkflowParseError(\n `Workflow document ${phase} step ${stepIndex + 1} references unknown node \"${normalized.node}\".`,\n { phase, stepIndex, node: normalized.node },\n );\n }\n return resolveStepVariables(normalized, phase, stepIndex);\n },\n );\n };\n const lifecycle = {\n beforeAll: normalizeLifecycle('beforeAll'),\n beforeEach: normalizeLifecycle('beforeEach'),\n afterEach: normalizeLifecycle('afterEach'),\n afterAll: normalizeLifecycle('afterAll'),\n };\n const ids = new Set<string>();\n const cases: CollectedCase[] = parsed.cases.map((definition, caseIndex) => {\n if (!isMapping(definition)) {\n throw new WorkflowParseError(`Case ${caseIndex + 1} must be a mapping.`, {\n caseIndex,\n });\n }\n rejectUnknownKeys(\n definition,\n ['name', 'tags', 'steps'],\n `Case ${caseIndex + 1}`,\n );\n if (\n typeof definition.name !== 'string' ||\n definition.name.trim().length === 0\n ) {\n throw new WorkflowParseError(\n `Case ${caseIndex + 1} name must be a non-empty string.`,\n { caseIndex },\n );\n }\n if (!Array.isArray(definition.steps) || definition.steps.length === 0) {\n throw new WorkflowParseError(\n `Case ${caseIndex + 1} steps must be a non-empty array.`,\n { caseIndex },\n );\n }\n const tags = definition.tags ?? [];\n if (\n !Array.isArray(tags) ||\n tags.some((tag) => typeof tag !== 'string' || tag.trim().length === 0)\n ) {\n throw new WorkflowParseError(\n `Case ${caseIndex + 1} tags must be an array of non-empty strings.`,\n { caseIndex },\n );\n }\n\n const steps = normalizeSteps(definition.steps, options.resolveNode).map(\n (normalized, stepIndex) => {\n if (!options.resolveNode(normalized.node)) {\n throw new WorkflowParseError(\n `Case ${caseIndex + 1} step ${stepIndex + 1} references unknown node \"${normalized.node}\".`,\n { caseIndex, stepIndex, node: normalized.node },\n );\n }\n return resolveStepVariables(normalized, 'steps', stepIndex, caseIndex);\n },\n );\n const caseId = createCaseId(source.projectId, sourcePath, caseIndex);\n if (ids.has(caseId)) {\n throw new WorkflowParseError(`Case id collision: ${caseId}.`, {\n caseId,\n });\n }\n ids.add(caseId);\n\n return {\n caseId,\n projectId: source.projectId,\n sourcePath,\n caseIndex,\n definition: {\n name: definition.name,\n tags: tags as string[],\n steps,\n },\n };\n });\n\n return {\n documentId: createWorkflowDocumentId(source.projectId, sourcePath),\n projectId: source.projectId,\n sourcePath,\n lifecycle,\n cases,\n } satisfies CollectedWorkflowDocument;\n}\n","import { createHash } from 'node:crypto';\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, join, relative, sep } from 'node:path';\nimport type { CaseRunResult, WorkflowDocumentRunResult } from '../engine/types';\nimport type { TestProjectCollectionError, TestProjectRunResult } from './types';\n\nconst writeJson = (path: string, value: unknown) => {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(value, null, 2));\n};\n\nconst toPosix = (value: string): string => value.split(sep).join('/');\n\nexport const caseAttemptResultPath = (\n projectId: string,\n documentId: string,\n result: CaseRunResult,\n): string =>\n toPosix(\n join(\n projectId,\n 'documents',\n documentId,\n 'cases',\n result.caseId,\n `${result.runId}.json`,\n ),\n );\n\nexport const workflowDocumentResultPath = (\n result: WorkflowDocumentRunResult,\n): string =>\n toPosix(\n join(result.projectId, 'documents', result.documentId, 'document.json'),\n );\n\nexport const collectionErrorPath = (\n projectId: string,\n sourcePath: string,\n): string => {\n const id = createHash('sha256')\n .update(JSON.stringify([projectId, sourcePath]))\n .digest('hex');\n return toPosix(join(projectId, 'collection-errors', `${id}.json`));\n};\n\nexport const writeWorkflowDocumentResult = (\n runDir: string,\n result: WorkflowDocumentRunResult,\n) => {\n const { documentRunId: _documentRunId, ...persistedResult } = result;\n writeJson(join(runDir, workflowDocumentResultPath(result)), persistedResult);\n};\n\nexport const writeCaseAttemptResult = (\n runDir: string,\n projectId: string,\n documentId: string,\n result: CaseRunResult,\n) => {\n const { runId: attemptId, ...persistedResult } = result;\n writeJson(\n join(runDir, caseAttemptResultPath(projectId, documentId, result)),\n {\n ...persistedResult,\n attemptId,\n },\n );\n};\n\nexport const writeCollectionError = (\n runDir: string,\n collectionError: TestProjectCollectionError,\n) => {\n writeJson(\n join(\n runDir,\n collectionErrorPath(\n collectionError.projectId,\n collectionError.sourcePath,\n ),\n ),\n { kind: 'collection-error', ...collectionError },\n );\n};\n\nconst relativeToSummary = (summaryPath: string, target: string): string => {\n const value = relative(dirname(summaryPath), target);\n return toPosix(value || '.');\n};\n\nconst errorJson = (error: unknown) =>\n error instanceof Error && 'toJSON' in error\n ? (error as Error & { toJSON(): unknown }).toJSON()\n : error;\n\nexport interface TestProjectResultFileOptions {\n projectRoot: string;\n configPath?: string;\n result: TestProjectRunResult;\n}\n\nexport const writeTestProjectRunResult = (\n options: TestProjectResultFileOptions,\n) => {\n const { result } = options;\n const fact = (path: string) => toPosix(path);\n\n writeJson(result.summaryPath, {\n schemaVersion: result.schemaVersion,\n runId: result.runId,\n startedAt: result.startedAt,\n endedAt: result.endedAt,\n durationMs: result.durationMs,\n status: result.status,\n exitCode: result.exitCode,\n projectRoot: options.projectRoot,\n ...(options.configPath ? { configPath: options.configPath } : {}),\n factsRoot: '.',\n reportDir: relativeToSummary(result.summaryPath, result.reportDir),\n summary: result.summary,\n projects: result.projects.map((project) => ({\n projectId: project.projectId,\n name: project.name,\n platform: project.platform,\n status: project.status,\n retry: project.retry,\n fileSelection: project.fileSelection,\n tagSelection: project.tagSelection,\n sourceCount: project.sourceCount,\n selectedCaseCount: project.selectedCaseCount,\n filteredCaseCount: project.filteredCaseCount,\n ...(project.lifecycle\n ? {\n lifecycle: {\n status: project.lifecycle.status,\n startedAt: project.lifecycle.startedAt,\n endedAt: project.lifecycle.endedAt,\n durationMs: project.lifecycle.durationMs,\n ...(project.lifecycle.setupError\n ? { setupError: errorJson(project.lifecycle.setupError) }\n : {}),\n ...(project.lifecycle.teardownErrors\n ? {\n teardownErrors:\n project.lifecycle.teardownErrors.map(errorJson),\n }\n : {}),\n },\n }\n : {}),\n cases: project.cases.map((outcome) => ({\n documentId: outcome.documentId,\n caseId: outcome.caseId,\n sourcePath: outcome.sourcePath,\n caseIndex: outcome.caseIndex,\n name: outcome.name,\n status: outcome.status,\n ...(outcome.notRunReason ? { notRunReason: outcome.notRunReason } : {}),\n ...(outcome.attempts\n ? {\n attempts: outcome.attempts.map((attempt) => ({\n attemptId: attempt.runId,\n attemptIndex: attempt.attemptIndex,\n status: attempt.status,\n resultFile: fact(\n caseAttemptResultPath(\n project.projectId,\n outcome.documentId,\n attempt,\n ),\n ),\n ...(attempt.reportPaths?.length\n ? {\n reports: attempt.reportPaths.map((path) =>\n relativeToSummary(result.summaryPath, path),\n ),\n }\n : {}),\n })),\n }\n : {}),\n })),\n documents: project.documents.map((document) => ({\n documentId: document.documentId,\n sourcePath: document.sourcePath,\n status: document.status,\n resultFile: fact(workflowDocumentResultPath(document)),\n ...(document.reportPaths?.length\n ? {\n reports: document.reportPaths.map((path) =>\n relativeToSummary(result.summaryPath, path),\n ),\n }\n : {}),\n })),\n collectionErrors: project.collectionErrors.map((error) => ({\n sourcePath: error.sourcePath,\n errorFile: fact(collectionErrorPath(error.projectId, error.sourcePath)),\n })),\n })),\n });\n};\n","import { randomUUID } from 'node:crypto';\nimport { setMaxListeners } from 'node:events';\nimport { existsSync, mkdirSync, readdirSync, statSync } from 'node:fs';\nimport { join, relative, resolve, sep } from 'node:path';\nimport { globSync } from 'tinyglobby';\nimport { createProjectRuntime } from '../engine/project-runtime';\nimport { runWorkflowDocument } from '../engine/run-workflow-document';\nimport type {\n CaseRunOutcome,\n StepExecutionInfo,\n StepRunResult,\n WorkflowDocumentRunResult,\n} from '../engine/types';\nimport {\n WorkflowError,\n WorkflowParseError,\n isFatalDeviceError,\n} from '../errors';\nimport { collectWorkflowDocument } from '../parser/collect';\nimport type {\n CollectedCase,\n CollectedWorkflowDocument,\n WorkflowDocumentSource,\n} from '../parser/types';\nimport {\n writeCaseAttemptResult,\n writeCollectionError,\n writeTestProjectRunResult,\n writeWorkflowDocumentResult,\n} from './result-store';\nimport {\n type ResolvedExecutionProject,\n type TestFileSelection,\n loadTestProject,\n validateTestFileSelection,\n} from './test-project';\nimport type {\n TestExecutionProjectRunResult,\n TestProjectCaseRunResult,\n TestProjectCollectionError,\n TestProjectRunResult,\n TestProjectRunSummary,\n} from './types';\n\nconst CONFIG_NAME = 'midscene.config.ts';\nconst CONFIG_PREFIX = 'midscene.config.';\nconst ALWAYS_IGNORED_PATTERNS = [\n '.git/**',\n '.midscene/**',\n 'midscene_run/**',\n 'node_modules/**',\n '**/.git/**',\n '**/.midscene/**',\n '**/midscene_run/**',\n '**/node_modules/**',\n];\n\nexport const DEFAULT_TEST_FILE_SELECTION: TestFileSelection = {\n include: ['**/*.{yaml,yml}'],\n};\n\nconst toPosix = (value: string): string => value.split(sep).join('/');\n\nexport interface TestProjectRunOptions {\n cwd?: string;\n projectRoot?: string;\n configPath?: string;\n resultDir?: string;\n projectNames?: readonly string[];\n onProgress?(message: string): void;\n}\n\ninterface PreparedExecutionProject<TProjectContext = unknown> {\n project: ResolvedExecutionProject<TProjectContext>;\n fileSelection: TestFileSelection;\n sources: readonly WorkflowDocumentSource[];\n documents: readonly CollectedWorkflowDocument[];\n collectionErrors: readonly TestProjectCollectionError[];\n selectedCaseCount: number;\n filteredCaseCount: number;\n}\n\nexport const discoverTestFiles = (\n projectRoot: string,\n selection: TestFileSelection = DEFAULT_TEST_FILE_SELECTION,\n): string[] => {\n const root = resolve(projectRoot);\n const normalized = validateTestFileSelection(selection);\n if (!normalized) throw new TypeError('Test file selection is required.');\n\n const files = globSync(normalized.include, {\n absolute: true,\n caseSensitiveMatch: false,\n cwd: root,\n dot: true,\n expandDirectories: false,\n followSymbolicLinks: false,\n ignore: [...ALWAYS_IGNORED_PATTERNS, ...(normalized.exclude ?? [])],\n onlyFiles: true,\n }).filter((file) => /\\.ya?ml$/i.test(file));\n\n return [...new Set(files.map((file) => resolve(file)))].sort((a, b) => {\n const relativeA = toPosix(relative(root, a));\n const relativeB = toPosix(relative(root, b));\n return relativeA < relativeB ? -1 : relativeA > relativeB ? 1 : 0;\n });\n};\n\nexport const discoverTestConfig = (projectRoot: string): string | undefined => {\n const root = resolve(projectRoot);\n const candidates = readdirSync(root)\n .filter((name) => name.startsWith(CONFIG_PREFIX))\n .sort();\n const unsupported = candidates.filter((name) => name !== CONFIG_NAME);\n if (unsupported.length > 0) {\n throw new Error(\n [\n `Unsupported or conflicting Midscene configs found in ${root}:`,\n ...candidates.map((name) => `- ${name}`),\n `Only ${CONFIG_NAME} is supported.`,\n ].join('\\n'),\n );\n }\n return candidates.includes(CONFIG_NAME) ? join(root, CONFIG_NAME) : undefined;\n};\n\nconst defaultResultDir = (projectRoot: string): string =>\n join(projectRoot, '.midscene', 'test-results');\n\nconst padDatePart = (value: number): string => String(value).padStart(2, '0');\n\nexport const createTestRunId = (\n date = new Date(),\n uuid = randomUUID(),\n): string => {\n const timestamp = [\n date.getFullYear(),\n padDatePart(date.getMonth() + 1),\n padDatePart(date.getDate()),\n padDatePart(date.getHours()),\n padDatePart(date.getMinutes()),\n padDatePart(date.getSeconds()),\n ].join('');\n return `${timestamp}-${uuid.slice(0, 8)}`;\n};\n\nconst assertDirectory = (path: string, label: string): void => {\n if (!existsSync(path) || !statSync(path).isDirectory()) {\n throw new Error(`${label} does not exist or is not a directory: ${path}`);\n }\n};\n\nconst asCollectionError = (\n projectId: string,\n projectName: string,\n sourcePath: string,\n error: unknown,\n): TestProjectCollectionError => ({\n projectId,\n projectName,\n sourcePath,\n error:\n error instanceof WorkflowError\n ? error\n : new WorkflowParseError(\n `Failed to collect workflow document \"${sourcePath}\": ${\n error instanceof Error ? error.message : String(error)\n }`,\n { projectName, sourcePath },\n error,\n ),\n});\n\nconst matchesTags = (\n tags: readonly string[],\n selection: ResolvedExecutionProject['tags'],\n): boolean => {\n if (selection.exclude.some((tag) => tags.includes(tag))) return false;\n return (\n selection.include.length === 0 ||\n selection.include.some((tag) => tags.includes(tag))\n );\n};\n\nconst filterDocumentCases = (\n document: CollectedWorkflowDocument,\n project: ResolvedExecutionProject,\n): { document?: CollectedWorkflowDocument; filtered: number } => {\n const cases = document.cases.filter((item) =>\n matchesTags(item.definition.tags ?? [], project.tags),\n );\n const filtered = document.cases.length - cases.length;\n return cases.length === 0\n ? { filtered }\n : { document: { ...document, cases }, filtered };\n};\n\nconst asNotRun = (\n documentId: string,\n collectedCase: CollectedCase,\n projectName: string,\n reason: NonNullable<TestProjectCaseRunResult['notRunReason']>,\n): TestProjectCaseRunResult => ({\n documentId,\n caseId: collectedCase.caseId,\n projectName,\n name: collectedCase.definition.name,\n sourcePath: collectedCase.sourcePath,\n caseIndex: collectedCase.caseIndex,\n status: 'not-run',\n notRunReason: reason,\n});\n\nconst summarize = (\n projects: readonly TestExecutionProjectRunResult[],\n): TestProjectRunSummary => {\n const cases = projects.flatMap((project) => project.cases);\n const documents = projects.flatMap((project) => project.documents);\n return {\n total: cases.length,\n passed: cases.filter((item) => item.status === 'success').length,\n failed: cases.filter((item) => item.status === 'failed').length,\n notRun: cases.filter((item) => item.status === 'not-run').length,\n filtered: projects.reduce(\n (total, project) => total + project.filteredCaseCount,\n 0,\n ),\n collectionErrors: projects.reduce(\n (total, project) => total + project.collectionErrors.length,\n 0,\n ),\n documentFailures: documents.filter(\n (document) => document.status === 'failed',\n ).length,\n projectFailures: projects.filter((project) => project.status === 'failed')\n .length,\n };\n};\n\nconst stepPosition = (info: StepExecutionInfo) =>\n info.scope === 'case' ? info.case : info.document;\n\nconst formatStep = (info: StepExecutionInfo): string => {\n const position = stepPosition(info);\n const phase = position.phase === 'steps' ? 'step' : position.phase;\n return `${phase} ${position.stepIndex + 1}/${info.stepCount}: ${info.node}`;\n};\n\nconst formatStepResult = (\n info: StepExecutionInfo,\n result: StepRunResult,\n): string => {\n const indent = info.scope === 'case' ? ' ' : ' ';\n const symbol = result.status === 'success' ? '✓' : '✗';\n const error = result.error ? ` — ${result.error.message}` : '';\n const continuation = result.continuedAfterError ? '; continuing' : '';\n return `${indent}${symbol} ${formatStep(info)} (${result.durationMs} ms)${error}${continuation}`;\n};\n\nconst caseHasFatalError = (outcome: CaseRunOutcome): boolean =>\n (outcome.attempts ?? []).some(\n (attempt) =>\n [...attempt.beforeEach, ...attempt.steps, ...attempt.afterEach].some(\n (step) => step.error && isFatalDeviceError(step.error),\n ) || (attempt.teardownErrors ?? []).some(isFatalDeviceError),\n );\n\nconst documentHasFatalError = (result: WorkflowDocumentRunResult): boolean =>\n [...result.beforeAll, ...result.afterAll].some(\n (step) => step.error && isFatalDeviceError(step.error),\n ) || (result.teardownErrors ?? []).some(isFatalDeviceError);\n\nconst selectProjects = <TProjectContext>(\n projects: readonly ResolvedExecutionProject<TProjectContext>[],\n names: readonly string[] | undefined,\n): readonly ResolvedExecutionProject<TProjectContext>[] => {\n if (!names || names.length === 0) return projects;\n const requested = new Set(names);\n if (requested.size !== names.length) {\n throw new Error('Each --project name may only be specified once.');\n }\n const known = new Set(projects.map((project) => project.name));\n const unknown = names.find((name) => !known.has(name));\n if (unknown) throw new Error(`Unknown Midscene project: ${unknown}`);\n return projects.filter((project) => requested.has(project.name));\n};\n\nconst prepareProject = <TProjectContext>(\n project: ResolvedExecutionProject<TProjectContext>,\n projectRoot: string,\n resolveNode: Parameters<typeof collectWorkflowDocument>[1]['resolveNode'],\n runDir: string,\n): PreparedExecutionProject<TProjectContext> => {\n const fileSelection = project.files ?? DEFAULT_TEST_FILE_SELECTION;\n const files = discoverTestFiles(projectRoot, fileSelection);\n const sources = files.map((absolutePath) => ({\n projectId: project.projectId,\n projectName: project.name,\n sourcePath: toPosix(relative(projectRoot, absolutePath)),\n absolutePath,\n }));\n const collectionErrors: TestProjectCollectionError[] = [];\n const documents: CollectedWorkflowDocument[] = [];\n let filteredCaseCount = 0;\n\n if (sources.length === 0) {\n const error = asCollectionError(\n project.projectId,\n project.name,\n '<project>',\n new WorkflowParseError(\n `No workflow YAML files found for project \"${project.name}\" in ${projectRoot}.`,\n { projectName: project.name, projectRoot },\n ),\n );\n collectionErrors.push(error);\n writeCollectionError(runDir, error);\n }\n\n for (const source of sources) {\n try {\n const collected = collectWorkflowDocument(source, {\n resolveNode,\n variables: project.variables,\n env: process.env,\n });\n const filtered = filterDocumentCases(collected, project);\n filteredCaseCount += filtered.filtered;\n if (filtered.document) documents.push(filtered.document);\n } catch (error) {\n const collectionError = asCollectionError(\n project.projectId,\n project.name,\n source.sourcePath,\n error,\n );\n collectionErrors.push(collectionError);\n writeCollectionError(runDir, collectionError);\n }\n }\n\n return {\n project,\n fileSelection,\n sources,\n documents,\n collectionErrors,\n selectedCaseCount: documents.reduce(\n (total, document) => total + document.cases.length,\n 0,\n ),\n filteredCaseCount,\n };\n};\n\nconst notRunSuite = (\n prepared: PreparedExecutionProject,\n reason: NonNullable<TestProjectCaseRunResult['notRunReason']>,\n): TestProjectCaseRunResult[] =>\n prepared.documents.flatMap((document) =>\n document.cases.map((item) =>\n asNotRun(document.documentId, item, prepared.project.name, reason),\n ),\n );\n\nexport async function runTestProject(\n options: TestProjectRunOptions = {},\n): Promise<TestProjectRunResult> {\n const startedAt = new Date();\n const runId = createTestRunId(startedAt);\n const cwd = resolve(options.cwd ?? process.cwd());\n assertDirectory(cwd, 'Test working directory');\n const cliProjectRoot = options.projectRoot\n ? resolve(cwd, options.projectRoot)\n : undefined;\n if (cliProjectRoot) assertDirectory(cliProjectRoot, 'Test project directory');\n const configSearchRoot = cliProjectRoot ?? cwd;\n const configPath = options.configPath\n ? resolve(configSearchRoot, options.configPath)\n : discoverTestConfig(configSearchRoot);\n if (options.configPath && (!configPath || !existsSync(configPath))) {\n throw new Error(`Midscene config does not exist: ${configPath}`);\n }\n\n const definition = await loadTestProject(configPath);\n const projectRoot = cliProjectRoot ?? cwd;\n\n const resultDir = options.resultDir\n ? resolve(cwd, options.resultDir)\n : defaultResultDir(projectRoot);\n const runDir = join(resultDir, runId);\n const summaryPath = join(runDir, 'summary.json');\n const reportDir = resolve(projectRoot, definition.output.reportDir);\n mkdirSync(resultDir, { recursive: true });\n mkdirSync(runDir);\n const selectedProjects = selectProjects(\n definition.projects,\n options.projectNames,\n );\n const preparedProjects = selectedProjects.map((project) =>\n prepareProject(project, projectRoot, definition.resolveNode, runDir),\n );\n const progress = options.onProgress ?? (() => {});\n const totalDocuments = preparedProjects.reduce(\n (total, prepared) => total + prepared.documents.length,\n 0,\n );\n const totalCases = preparedProjects.reduce(\n (total, prepared) => total + prepared.selectedCaseCount,\n 0,\n );\n const totalErrors = preparedProjects.reduce(\n (total, prepared) => total + prepared.collectionErrors.length,\n 0,\n );\n progress(\n `midscene-test: preflighted ${preparedProjects.length} projects, ${totalDocuments} documents, ${totalCases} cases, ${totalErrors} collection errors`,\n );\n\n const effectiveConcurrency = Math.min(\n definition.test.maxConcurrency,\n preparedProjects.length,\n );\n const rootController = new AbortController();\n setMaxListeners(\n Math.max(10, effectiveConcurrency + 1),\n rootController.signal,\n );\n const handleSignal = (signal: NodeJS.Signals) => {\n rootController.abort(new Error(`Workflow interrupted by ${signal}.`));\n };\n const sigint = () => handleSignal('SIGINT');\n const sigterm = () => handleSignal('SIGTERM');\n process.on('SIGINT', sigint);\n process.on('SIGTERM', sigterm);\n\n let failedCaseCount = 0;\n const bailReached = () =>\n definition.test.bail > 0 && failedCaseCount >= definition.test.bail;\n let hasInfrastructureError = false;\n let firstInfrastructureError: unknown;\n const recordInfrastructureError = (error: unknown) => {\n if (hasInfrastructureError) return;\n hasInfrastructureError = true;\n firstInfrastructureError = error;\n rootController.abort(error);\n };\n const runInfrastructureCallback = <T>(callback: () => T): T => {\n try {\n return callback();\n } catch (error) {\n recordInfrastructureError(error);\n throw error;\n }\n };\n type PreparedProject = (typeof preparedProjects)[number];\n const announceProject = (prepared: PreparedProject, projectIndex: number) => {\n const { project } = prepared;\n runInfrastructureCallback(() =>\n progress(\n `[project ${projectIndex + 1}/${preparedProjects.length}] ${project.name} (${project.platform})`,\n ),\n );\n };\n const buildProjectResult = (\n prepared: PreparedProject,\n cases: readonly TestProjectCaseRunResult[],\n documents: readonly WorkflowDocumentRunResult[],\n lifecycle?: TestExecutionProjectRunResult['lifecycle'],\n ): TestExecutionProjectRunResult => {\n const { project } = prepared;\n const projectFailed =\n prepared.collectionErrors.length > 0 ||\n cases.some((item) => item.status !== 'success') ||\n documents.some((item) => item.status === 'failed') ||\n lifecycle?.status === 'failed';\n return {\n projectId: project.projectId,\n name: project.name,\n platform: project.platform,\n status: projectFailed ? 'failed' : 'success',\n retry: project.retry,\n fileSelection: prepared.fileSelection,\n tagSelection: project.tags,\n sourceCount: prepared.sources.length,\n selectedCaseCount: prepared.selectedCaseCount,\n filteredCaseCount: prepared.filteredCaseCount,\n ...(lifecycle ? { lifecycle } : {}),\n cases,\n documents,\n collectionErrors: prepared.collectionErrors,\n };\n };\n const buildSkippedProjectResult = (\n prepared: PreparedProject,\n projectIndex: number,\n reason: NonNullable<TestProjectCaseRunResult['notRunReason']>,\n ): TestExecutionProjectRunResult => {\n announceProject(prepared, projectIndex);\n return buildProjectResult(prepared, notRunSuite(prepared, reason), []);\n };\n const runPreparedProject = async (\n prepared: PreparedProject,\n projectIndex: number,\n ): Promise<TestExecutionProjectRunResult> => {\n const { project } = prepared;\n announceProject(prepared, projectIndex);\n const projectProgress = (message: string) =>\n runInfrastructureCallback(() =>\n progress(\n effectiveConcurrency > 1 ? `[${project.name}]${message}` : message,\n ),\n );\n const cases: TestProjectCaseRunResult[] = [];\n const documents: WorkflowDocumentRunResult[] = [];\n let lifecycle: TestExecutionProjectRunResult['lifecycle'];\n let projectFatal = false;\n\n if (prepared.collectionErrors.length > 0) {\n cases.push(...notRunSuite(prepared, 'project-preflight-failed'));\n } else if (rootController.signal.aborted) {\n cases.push(...notRunSuite(prepared, 'interrupted'));\n } else if (bailReached()) {\n cases.push(...notRunSuite(prepared, 'bail'));\n } else {\n const runtime = createProjectRuntime({\n project,\n setup: project.setup,\n signal: rootController.signal,\n });\n let hasProjectExecutionError = false;\n let projectExecutionError: unknown;\n try {\n await runtime.start();\n if (!runtime.canRun) {\n cases.push(\n ...notRunSuite(\n prepared,\n rootController.signal.aborted\n ? 'interrupted'\n : 'project-setup-failed',\n ),\n );\n } else {\n for (const [\n documentIndex,\n document,\n ] of prepared.documents.entries()) {\n if (\n rootController.signal.aborted ||\n bailReached() ||\n projectFatal\n ) {\n const reason = rootController.signal.aborted\n ? 'interrupted'\n : projectFatal\n ? 'fatal-error'\n : 'bail';\n cases.push(\n ...document.cases.map((item) =>\n asNotRun(document.documentId, item, project.name, reason),\n ),\n );\n continue;\n }\n projectProgress(\n ` [document ${documentIndex + 1}/${prepared.documents.length}] ${document.sourcePath}`,\n );\n const execution = await runWorkflowDocument(document, {\n resolveNode: definition.nodes.require.bind(definition.nodes),\n project,\n projectContext: runtime.context,\n retry: project.retry,\n signal: runtime.signal,\n defaultTimeoutMs: definition.test.testTimeout,\n shouldStop: () =>\n rootController.signal.aborted || bailReached() || projectFatal,\n stopReason: () =>\n rootController.signal.aborted\n ? 'interrupted'\n : projectFatal\n ? 'fatal-error'\n : 'bail',\n isFatalError: (run) =>\n [...run.beforeEach, ...run.steps, ...run.afterEach].some(\n (step) => step.error && isFatalDeviceError(step.error),\n ) || (run.teardownErrors ?? []).some(isFatalDeviceError),\n onCaseStart: (collectedCase) => {\n projectProgress(\n ` [case ${collectedCase.caseIndex + 1}/${document.cases.length}] ${collectedCase.definition.name}`,\n );\n },\n onStepStart: (info) => {\n const indent = info.scope === 'case' ? ' ' : ' ';\n projectProgress(`${indent}→ ${formatStep(info)}`);\n },\n onStepResult: (info, result) =>\n projectProgress(formatStepResult(info, result)),\n onCaseResult: (attempt) => {\n runInfrastructureCallback(() =>\n writeCaseAttemptResult(\n runDir,\n project.projectId,\n document.documentId,\n attempt,\n ),\n );\n projectProgress(\n ` ${attempt.status === 'success' ? '✓' : '✗'} attempt ${attempt.attemptIndex + 1}/${project.retry + 1}: ${attempt.name} (${attempt.durationMs} ms)`,\n );\n },\n onCaseOutcome: (outcome) => {\n if (outcome.status === 'failed') failedCaseCount += 1;\n if (caseHasFatalError(outcome)) projectFatal = true;\n },\n onDocumentResult: (documentResult) =>\n runInfrastructureCallback(() =>\n writeWorkflowDocumentResult(runDir, documentResult),\n ),\n });\n cases.push(\n ...execution.cases.map((outcome) => ({\n ...outcome,\n documentId: document.documentId,\n })),\n );\n if (documentHasFatalError(execution.document)) {\n projectFatal = true;\n }\n documents.push(execution.document);\n }\n }\n } catch (error) {\n hasProjectExecutionError = true;\n projectExecutionError = error;\n recordInfrastructureError(error);\n } finally {\n const hasFailure =\n hasProjectExecutionError ||\n cases.some((item) => item.status !== 'success') ||\n documents.some((item) => item.status === 'failed') ||\n projectFatal ||\n rootController.signal.aborted;\n lifecycle = await runtime.finish(hasFailure ? 'failed' : 'success');\n }\n if (hasProjectExecutionError) throw projectExecutionError;\n }\n\n return buildProjectResult(prepared, cases, documents, lifecycle);\n };\n\n const projectResults: Array<TestExecutionProjectRunResult | undefined> =\n new Array(preparedProjects.length);\n let nextProjectIndex = 0;\n const claimNextProject = (): number | undefined => {\n if (\n hasInfrastructureError ||\n rootController.signal.aborted ||\n bailReached() ||\n nextProjectIndex >= preparedProjects.length\n ) {\n return undefined;\n }\n const projectIndex = nextProjectIndex;\n nextProjectIndex += 1;\n return projectIndex;\n };\n const worker = async () => {\n try {\n while (true) {\n const projectIndex = claimNextProject();\n if (projectIndex === undefined) return;\n projectResults[projectIndex] = await runPreparedProject(\n preparedProjects[projectIndex],\n projectIndex,\n );\n }\n } catch (error) {\n recordInfrastructureError(error);\n }\n };\n\n try {\n await Promise.allSettled(\n Array.from({ length: effectiveConcurrency }, () => worker()),\n );\n } finally {\n process.off('SIGINT', sigint);\n process.off('SIGTERM', sigterm);\n }\n if (hasInfrastructureError) throw firstInfrastructureError;\n\n const completedProjectResults = preparedProjects.map(\n (prepared, projectIndex) => {\n const result = projectResults[projectIndex];\n if (result) return result;\n const reason = prepared.collectionErrors.length\n ? 'project-preflight-failed'\n : rootController.signal.aborted\n ? 'interrupted'\n : bailReached()\n ? 'bail'\n : undefined;\n if (!reason) {\n throw new Error(\n `Project scheduler did not produce a result for \"${prepared.project.name}\".`,\n );\n }\n return buildSkippedProjectResult(prepared, projectIndex, reason);\n },\n );\n\n const summary = summarize(completedProjectResults);\n const failed =\n rootController.signal.aborted ||\n summary.failed > 0 ||\n summary.notRun > 0 ||\n summary.collectionErrors > 0 ||\n summary.documentFailures > 0 ||\n summary.projectFailures > 0;\n const endedAt = new Date();\n const result: TestProjectRunResult = {\n schemaVersion: 3,\n runId,\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n durationMs: Math.max(0, endedAt.getTime() - startedAt.getTime()),\n status: failed ? 'failed' : 'success',\n exitCode: failed ? 1 : 0,\n resultDir,\n summaryPath,\n reportDir,\n summary,\n projects: completedProjectResults,\n cases: completedProjectResults.flatMap((project) => project.cases),\n documents: completedProjectResults.flatMap((project) => project.documents),\n collectionErrors: completedProjectResults.flatMap(\n (project) => project.collectionErrors,\n ),\n };\n writeTestProjectRunResult({\n projectRoot,\n ...(configPath ? { configPath } : {}),\n result,\n });\n return result;\n}\n"],"names":["WorkflowError","Error","undefined","message","options","WorkflowParseError","details","cause","NodeDefinitionError","DuplicateNodeError","node","NodeNotFoundError","NodeInputValidationError","error","issues","issue","String","firstIssue","path","StepTimeoutError","timeoutMs","NodeExecutionError","causeMessage","WorkflowLifecycleError","ProjectSetupError","ProjectTeardownError","NodeScopeTeardownError","FatalDeviceError","isFatalDeviceError","normalizeNodeExecutionError","validateOptionalText","value","field","validateInputSchema","schema","z","validateDefinition","defineNode","_nodes","NodeRegistry","name","nodes","Map","projectIdFromIndex","index","defineTestProject","definition","defineProjectSetup","getDefaultExport","loaded","absolutePath","defaultExport","TypeError","isRecord","Array","rejectUnknownKeys","allowedKeys","label","allowed","Set","unknown","Object","key","isAbsolutePattern","pattern","isAbsolute","validatePatterns","allowEmptyInclude","validateTestFileSelection","include","exclude","validateTagList","tag","validateTagSelection","assertJsonValue","seen","Number","item","child","deepFreezeJson","validateVariables","platforms","validatePlatform","validateProjectSetup","projectPlatform","supported","validatePositiveInteger","fallback","validateNonNegativeInteger","validateExecutionProjects","defaultSetup","platform","setup","names","projects","candidate","files","validateTestOptions","validateOutputPath","validateOutput","validateTestProjectDefinition","resolvedProjects","assertTypeScriptConfig","extension","canRetryWithCjsLoader","errorCode","SyntaxError","loadTestProject","configPath","resolve","tsImport","pathToFileURL","dirname","sep","tsxRequire","fallbackError","createProjectRuntime","startedAt","Date","controller","AbortController","parentSignal","abortFromParent","teardownStack","context","setupError","started","acceptingTeardowns","finishedResult","createResult","requestedStatus","teardownErrors","endedAt","Math","onTeardown","teardown","process","statusBeforeTeardown","registrationIndex","reason","assertJsonSerializable","visit","validateNodeOutput","output","createStepResultBase","step","phase","stepIndex","executeNode","execute","abortController","timeout","abortGraceTimeout","execution","Promise","settleOnAbort","abortedExecution","_","reject","setTimeout","timeoutExecution","timeoutError","settledExecution","clearTimeout","parseNodeInput","input","parsed","executeStep","target","signal","common","reportPathsFromTeardown","result","paths","createDocumentRuntime","document","documentRunId","randomUUID","beforeAll","afterAll","project","nodeTeardownStack","acceptingNodeTeardowns","reportPaths","runPhase","results","executionSignal","documentContext","stepInfo","finishError","runCollectedCase","collectedCase","phases","runId","beforeEach","steps","afterEach","caseContext","executionError","cleanupSignal","asNotRun","projectName","runWorkflowDocument","createDocumentRunId","createCaseRunId","retry","runtime","cases","runtimeStarted","documentResult","fatalError","outcome","attempts","attemptIndex","run","supportedMetaKeys","isMapping","formatStep","normalizeMeta","continueOnError","normalizeStep","resolveNode","entries","rawValue","resolvedNode","stringInputKey","rawMeta","normalizeSteps","interpolationExpression","exactEnvExpression","exactProjectExpression","missingVariable","kind","projectVariable","environmentVariable","interpolationValue","resolveString","exactEnv","exactProject","_match","environmentName","resolveWorkflowVariables","allowedSet","createCaseId","projectId","sourcePath","caseIndex","createHash","JSON","createWorkflowDocumentId","collectWorkflowDocument","source","loadYaml","readFileSync","JSON_SCHEMA","resolveStepVariables","normalizeLifecycle","normalized","resolved","lifecycle","ids","tags","caseId","writeJson","mkdirSync","writeFileSync","toPosix","caseAttemptResultPath","documentId","join","workflowDocumentResultPath","collectionErrorPath","id","writeWorkflowDocumentResult","runDir","_documentRunId","persistedResult","writeCaseAttemptResult","attemptId","writeCollectionError","collectionError","relativeToSummary","summaryPath","relative","errorJson","writeTestProjectRunResult","fact","attempt","CONFIG_NAME","CONFIG_PREFIX","ALWAYS_IGNORED_PATTERNS","DEFAULT_TEST_FILE_SELECTION","discoverTestFiles","projectRoot","selection","root","globSync","file","a","b","relativeA","relativeB","discoverTestConfig","candidates","readdirSync","unsupported","defaultResultDir","padDatePart","createTestRunId","date","uuid","timestamp","assertDirectory","existsSync","statSync","asCollectionError","matchesTags","filterDocumentCases","filtered","summarize","documents","total","stepPosition","info","position","formatStepResult","indent","symbol","continuation","caseHasFatalError","documentHasFatalError","selectProjects","requested","known","prepareProject","fileSelection","sources","collectionErrors","filteredCaseCount","collected","notRunSuite","prepared","runTestProject","cwd","cliProjectRoot","configSearchRoot","resultDir","reportDir","selectedProjects","preparedProjects","progress","totalDocuments","totalCases","totalErrors","effectiveConcurrency","rootController","setMaxListeners","handleSignal","sigint","sigterm","failedCaseCount","bailReached","hasInfrastructureError","firstInfrastructureError","recordInfrastructureError","runInfrastructureCallback","callback","announceProject","projectIndex","buildProjectResult","projectFailed","buildSkippedProjectResult","runPreparedProject","projectProgress","projectFatal","hasProjectExecutionError","projectExecutionError","documentIndex","hasFailure","projectResults","nextProjectIndex","claimNextProject","worker","completedProjectResults","summary","failed"],"mappings":"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"}
|