@midscene/test 1.16.1 → 1.16.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"test-cli.mjs","sources":["webpack/runtime/define_property_getters","webpack/runtime/ensure_chunk","webpack/runtime/get javascript chunk filename","webpack/runtime/has_own_property","webpack/runtime/module_chunk_loading","../../src/cli/error-format.ts","../../src/cli/node-spec.ts","../../src/engine/registry.ts","../../src/cli/test-project.ts","../../src/parser/identifiers.ts","../../src/parser/normalize.ts","../../src/parser/source.ts","../../src/parser/variables.ts","../../src/parser/collect.ts","../../src/cli/result-store.ts","../../src/cli/project-preparation.ts","../../src/cli/prepare-test-run.ts","../../src/report/result-markdown.ts","../../src/cli/document-invocation.ts","../../src/cli/file-scheduler.ts","../../src/cli/operation-journal.ts","../../src/cli/run-prepared-project.ts","../../src/cli/test-project-runner.ts","../../src/cli/test-command.ts","../../src/test-cli.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(\n\t\tObject.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t\t__webpack_require__.f[key](chunkId, promises);\n\t\t\treturn promises;\n\t\t}, [])\n\t);\n};","// This function allow to reference chunks\n__webpack_require__.u = (chunkId) => {\n // return url for filenames not based on template\n \n // return url for filenames based on template\n return \"1~\" + chunkId + \".mjs\"\n}","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// no BaseURI\n // object to store loaded and loading chunks\n // undefined = chunk not loaded, null = chunk preloaded/prefetched\n // [resolve, Promise] = chunk loading, 0 = chunk loaded\n var installedChunks = {\"443\": 0,};\n var installChunk = (data) => {\n var __rspack_esm_ids = data.__rspack_esm_ids;\n var __webpack_modules__ = data.__webpack_modules__;\n var __rspack_esm_runtime = data.__rspack_esm_runtime;\n // add \"modules\" to the modules object,\n // then flag all \"ids\" as loaded and fire callback\n var moduleId, chunkId, i = 0;\n for (moduleId in __webpack_modules__) {\n if (__webpack_require__.o(__webpack_modules__, moduleId)) {\n __webpack_require__.m[moduleId] = __webpack_modules__[moduleId];\n }\n }\n if (__rspack_esm_runtime) __rspack_esm_runtime(__webpack_require__);\n for (; i < __rspack_esm_ids.length; i++) {\n chunkId = __rspack_esm_ids[i];\n if (__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n installedChunks[chunkId][0]();\n }\n installedChunks[__rspack_esm_ids[i]] = 0;\n }\n \n};\n __webpack_require__.f.j = function (chunkId, promises) {\n // import() chunk loading for javascript\nvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\nif (installedChunkData !== 0) { // 0 means \"already installed\".'\n // a Promise means \"currently loading\".\n if (installedChunkData) {\n promises.push(installedChunkData[1]);\n } else {\n if (true) {\n // setup Promise in chunk cache\n var promise = import(\"./\" + __webpack_require__.u(chunkId)).then(installChunk, (e) => {\n if (installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined;\n throw e;\n });\n var promise = Promise.race([promise, new Promise((resolve) => {\n installedChunkData = installedChunks[chunkId] = [resolve];\n })]);\n promises.push(installedChunkData[1] = promise);\n }\n \n }\n}\n }\n // no external install chunk\n// no on chunks loaded\n// no HMR\n// no HMR manifest\n","import { inspect } from 'node:util';\n\n/** Keep native Error stacks, causes, and aggregate errors in CLI diagnostics. */\nexport const formatCliError = (error: unknown): string =>\n typeof error === 'string'\n ? error\n : inspect(error, { colors: false, depth: null, customInspect: false });\n","import { z } from 'zod/v4';\nimport type { NodeDefinition } from '../node/types';\nimport type { TestFileSelection } from './test-project';\n\nexport interface NodeSpecDocument {\n markdown: string;\n warnings: readonly string[];\n}\n\nconst GENERATED_COMMENT =\n '<!-- Generated by `midscene-test nodes`. Do not edit directly. -->';\n\nexport const sortNodesForSpec = (\n nodes: readonly NodeDefinition<any, any, any>[],\n): NodeDefinition<any, any, any>[] => {\n const priority = (name: string) =>\n name === 'aiAct' ? 0 : name === 'aiAssert' ? 1 : 2;\n return [...nodes].sort(\n (left, right) =>\n priority(left.name) - priority(right.name) ||\n (left.name < right.name ? -1 : left.name > right.name ? 1 : 0),\n );\n};\n\nconst escapeTableCell = (value: string): string =>\n value\n .trim()\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\|/g, '\\\\|')\n .replace(/\\r\\n|\\r|\\n/g, '<br>');\n\nconst renderNodeOverview = (\n nodes: readonly NodeDefinition<any, any, any>[],\n): string => {\n const heading = '## Available Nodes';\n if (nodes.length === 0) {\n return `${heading}\\n\\nNo nodes are registered by the current Test Project.`;\n }\n const rows = nodes.map(\n (node) =>\n `| ${escapeTableCell(node.name)} | ${escapeTableCell(node.description || 'Description not declared.')} |`,\n );\n return `${heading}\\n\\nThis table lists all available Nodes. See [Node Details](#node-details) below for each Node's usage and input schema.\\n\\n${['| Node | Description |', '| --- | --- |', ...rows].join('\\n')}`;\n};\n\ninterface NodeSpecLocation {\n configPath?: string;\n projects: readonly { name: string; files: TestFileSelection }[];\n}\n\nconst renderWorkflowLocations = (location?: NodeSpecLocation): string => {\n const sections = [\n '## Where to use these Nodes',\n 'Use these Nodes in Workflow Documents (`.yaml` or `.yml` files) selected by an Execution Project. Case file patterns and the config file path below are relative to this spec file. Case file patterns use glob syntax. A custom `--config` path does not change where case files are selected.',\n 'Projects created by `midscene-test create` select `cases/**/*.{yaml,yml}` by default, so you can write test cases in `cases/example.yaml` or subdirectories of `cases/`. If an Execution Project has no `files` configuration, Midscene Test searches `**/*.{yaml,yml}` recursively instead. Check `projects[].files` in your configuration before choosing a file location.',\n ];\n if (location) {\n sections.push(\n `**Config file:** ${location.configPath ? `\\`${location.configPath}\\`` : 'No config file loaded.'}`,\n );\n for (const project of location.projects) {\n const patterns = project.files.include\n .map((pattern) => `\\`${pattern}\\``)\n .join(', ');\n const projectLabel =\n location.projects.length > 1 || project.name !== 'default'\n ? ` (Execution Project: ${project.name})`\n : '';\n const excludes = project.files.exclude?.length\n ? `; excludes: ${project.files.exclude.map((pattern) => `\\`${pattern}\\``).join(', ')}`\n : '';\n sections.push(`**Case files:** ${patterns}${projectLabel}${excludes}`);\n }\n }\n sections.push(\n 'Files matching `files.exclude` are not selected. Midscene Test always ignores `.git/`, `.midscene/`, `midscene_run/`, and `node_modules/` directories, including nested ones.',\n 'Call a Node in `cases[].steps`, or in the Workflow Document lifecycle steps `beforeAll`, `beforeEach`, `afterEach`, and `afterAll`. Root Nodes are shared defaults; `projects[].nodes` adds local Nodes and overrides same-named root Nodes only within that Execution Project. Each Execution Project supplies its own runtime environment.',\n );\n return sections.join('\\n\\n');\n};\n\nconst WORKFLOW_STEP_CONTRACT = `## Workflow Step Contract\n\nEach step uses a node name as its key. The \\`$\\` object contains engine metadata and is not part of the node input.\n\n\\`\\`\\`yaml\ncases:\n - name: Example case\n steps:\n - node.name:\n prompt: Describe the task.\n $:\n timeout: 30000\n continue-on-error: false\n\\`\\`\\`\n\nA Node may map a string step value to one declared input field. Each Node section states whether it supports this shorthand and names the target field.\n\nEach Node's returned \\`data\\` is saved on that Step's result. Results are not named or automatically passed to later Steps. A failed Case does not stop later Cases by default; \\`test.bail\\` controls early stopping across the run.`;\n\nconst sortJsonValue = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(sortJsonValue);\n if (typeof value !== 'object' || value === null) return value;\n\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))\n .map(([key, child]) => [key, sortJsonValue(child)]),\n );\n};\n\nconst assertSelfContainedRefs = (value: unknown, node: string): void => {\n if (Array.isArray(value)) {\n for (const child of value) assertSelfContainedRefs(child, node);\n return;\n }\n if (typeof value !== 'object' || value === null) return;\n\n for (const [key, child] of Object.entries(value)) {\n if (key === '$ref' && typeof child === 'string' && !child.startsWith('#')) {\n throw new Error(\n `Cannot describe node \"${node}\": inputSchema generated an external $ref.`,\n );\n }\n assertSelfContainedRefs(child, node);\n }\n};\n\nconst toJsonSchema = (node: NodeDefinition<any, any, any>): unknown => {\n try {\n const schema = z.toJSONSchema(node.inputSchema!, {\n target: 'draft-2020-12',\n io: 'input',\n unrepresentable: 'throw',\n cycles: 'ref',\n reused: 'ref',\n });\n assertSelfContainedRefs(schema, node.name);\n return sortJsonValue(schema);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.startsWith(`Cannot describe node \"${node.name}\":`)\n ) {\n throw error;\n }\n throw new Error(\n `Cannot describe node \"${node.name}\": inputSchema contains a Zod type that cannot be represented as JSON Schema.`,\n { cause: error },\n );\n }\n};\n\nconst renderNode = (\n node: NodeDefinition<any, any, any>,\n warnings: string[],\n): string => {\n const sections = [`### \\`${node.name}\\``];\n\n if (node.title) sections.push(`**Title:** ${node.title.trim()}`);\n if (node.description) {\n sections.push(node.description.trim());\n } else {\n warnings.push(`node \"${node.name}\" has no description`);\n sections.push(\n `> Description not declared. Do not infer this node's behavior.`,\n );\n }\n\n if (node.stringInputKey === false || node.stringInputKey === undefined) {\n sections.push('**String shorthand:** Not supported by this Node.');\n } else {\n sections.push(\n `**String shorthand:** Maps to \\`{ ${node.stringInputKey}: value }\\`.`,\n );\n }\n\n sections.push('#### Input Schema');\n if (node.inputSchema) {\n sections.push(\n `\\`\\`\\`json\\n${JSON.stringify(toJsonSchema(node), null, 2)}\\n\\`\\`\\``,\n );\n } else {\n warnings.push(`node \"${node.name}\" has no inputSchema`);\n sections.push(\n '> Input schema not declared. Do not invent input fields for this node.',\n );\n }\n\n return sections.join('\\n\\n');\n};\n\nexport const renderNodeSpec = (\n nodes: readonly NodeDefinition<any, any, any>[],\n location?: NodeSpecLocation,\n): NodeSpecDocument => {\n const warnings: string[] = [];\n const sortedNodes = sortNodesForSpec(nodes);\n const sections = [\n GENERATED_COMMENT,\n '# Midscene Test Node Spec',\n 'This document describes the Nodes available in YAML test files (`.yaml` or `.yml`) for the Midscene Test framework (`@midscene/test`). It lists the Nodes registered by the current Test Project, their inputs, and how to call them in test steps and lifecycle hooks.',\n [\n 'Learn about the framework and YAML test authoring:',\n '',\n '- [Midscene Test overview](https://midscenejs.com/midscene-test/overview): framework concepts and the role of Nodes.',\n '- [Create and use test projects](https://midscenejs.com/midscene-test/use): write YAML cases, run tests, and inspect results.',\n '- [Configure test projects](https://midscenejs.com/midscene-test/configuration): register Nodes, select case files, and manage runtime resources.',\n ].join('\\n'),\n renderNodeOverview(sortedNodes),\n renderWorkflowLocations(location),\n WORKFLOW_STEP_CONTRACT,\n ];\n\n if (sortedNodes.length > 0) {\n sections.push('## Node Details');\n for (const node of sortedNodes) sections.push(renderNode(node, warnings));\n }\n\n return {\n markdown: `${sections.join('\\n\\n')}\\n`,\n warnings,\n };\n};\n","import { NodeRegistry as CoreNodeRegistry } from '@midscene/core/internal/test-runner';\nimport type { NodeDefinition } from '../node/types';\n\nexport type NodeRegistry = Omit<\n CoreNodeRegistry,\n 'get' | 'require' | 'register' | 'definitions'\n> & {\n get(name: string): NodeDefinition<any, any> | undefined;\n require(name: string): NodeDefinition<any, any>;\n register<TInput, TData>(node: NodeDefinition<TInput, TData>): NodeRegistry;\n definitions(): readonly NodeDefinition<any, any, any>[];\n};\nexport const NodeRegistry: {\n new (nodes?: readonly NodeDefinition<any, any>[]): NodeRegistry;\n} = CoreNodeRegistry;\n","import { dirname, isAbsolute, resolve, sep } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { require as tsxRequire } from 'tsx/cjs/api';\nimport { NodeRegistry } from '../engine/registry';\nimport type { NodeDefinition } from '../node/types';\n\nimport type {\n FileSetupDefinition,\n JsonValue,\n ProjectSetupDefinition,\n ResolvedExecutionProject,\n TestFileSelection,\n TestTagSelection,\n} from '@midscene/core/internal/test-runner';\nexport type {\n FileSetupContext,\n FileSetupDefinition,\n JsonPrimitive,\n JsonValue,\n ProjectSetupContext,\n ProjectSetupDefinition,\n ProjectTeardown,\n ProjectTeardownContext,\n ResolvedExecutionProject,\n TestFileSelection,\n TestTagSelection,\n} from '@midscene/core/internal/test-runner';\nimport type { ExecutionProjectDefinition as CoreExecutionProjectDefinition } from '@midscene/core/internal/test-runner';\n\nexport type ExecutionProjectDefinition<\n TContext = unknown,\n TProjectContext = TContext,\n> = Omit<\n CoreExecutionProjectDefinition<TProjectContext>,\n 'nodes' | 'fileSetup'\n> & {\n fileSetup?: FileSetupDefinition<TContext, TProjectContext>;\n nodes?: readonly NodeDefinition<any, any, TContext>[];\n};\n\nexport interface TestOptions {\n /** Global active files, including preparation and cleanup. Default 1; null is unlimited. */\n maxConcurrentFiles?: number | null;\n /** Projects from setup through completed cleanup. Default 1; null is unlimited. */\n maxConcurrentProjects?: number | null;\n /** Milliseconds for each Project setup/fileSetup, including device waits. */\n setupTimeout?: number;\n /** Milliseconds per cleanup scope; shared deadline during abnormal shutdown. */\n teardownTimeout?: number;\n bail?: number;\n testTimeout?: number;\n}\n\nexport interface ResolvedTestOptions {\n maxConcurrentFiles: number | null;\n maxConcurrentProjects: number | null;\n setupTimeout: number;\n teardownTimeout: 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\nconst projectIdFromIndex = (index: number): string => `project-${index}`;\n\nexport interface TestProjectDefinition<\n TContext = undefined,\n TProjectContext = TContext,\n> {\n setup?: ProjectSetupDefinition<TProjectContext>;\n fileSetup?: FileSetupDefinition<TContext, TProjectContext>;\n projects?: readonly ExecutionProjectDefinition<TContext, TProjectContext>[];\n test?: TestOptions;\n output?: TestOutputDefinition;\n nodes?: readonly NodeDefinition<any, any, TContext>[];\n}\n\nexport interface LoadedExecutionProject<\n TContext = unknown,\n TProjectContext = TContext,\n> extends ResolvedExecutionProject<TProjectContext> {\n readonly fileSetup?: FileSetupDefinition<TContext, TProjectContext>;\n /** Effective Nodes: globals plus project-local overrides. */\n readonly nodes: NodeRegistry;\n}\n\nexport interface LoadedTestProject<\n TContext = undefined,\n TProjectContext = TContext,\n> {\n projects: readonly LoadedExecutionProject<TContext, TProjectContext>[];\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 = <\n TContext = undefined,\n TProjectContext = TContext,\n>(\n definition: TestProjectDefinition<TContext, TProjectContext>,\n): TestProjectDefinition<TContext, TProjectContext> => definition;\n\nexport const defineProjectSetup = <TProjectContext>(\n definition: ProjectSetupDefinition<TProjectContext>,\n): ProjectSetupDefinition<TProjectContext> => definition;\n\nexport const defineFileSetup = <TContext, TProjectContext = unknown>(\n definition: FileSetupDefinition<TContext, TProjectContext>,\n): FileSetupDefinition<TContext, 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 rejectUnknownKeys(value, ['include', 'exclude'], label);\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 validateSetup = <TSetup>(\n value: unknown,\n label: string,\n): TSetup | undefined => {\n if (value === undefined) return undefined;\n if (!isRecord(value)) {\n throw new TypeError(`Midscene config ${label} must be an object.`);\n }\n rejectUnknownKeys(value, ['name', 'setup'], label);\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 return value as unknown as TSetup;\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 validateConcurrency = (value: unknown, label: string): number | null => {\n if (value === null) return null;\n return validatePositiveInteger(value, 1, label);\n};\n\nconst validateFileConcurrency = (\n maxConcurrentFiles: number,\n fileSetup: unknown,\n label: string,\n): void => {\n if (maxConcurrentFiles > 1 && !fileSetup) {\n throw new TypeError(\n `Midscene config ${label}.fileSetup is required when the effective maxConcurrentFiles is greater than 1.`,\n );\n }\n};\n\nconst validateExecutionProjects = <TContext, TProjectContext>(\n value: unknown,\n defaultSetup: unknown,\n defaultFileSetup: unknown,\n globalNodes: NodeRegistry,\n test: ResolvedTestOptions,\n): {\n projects: readonly LoadedExecutionProject<TContext, TProjectContext>[];\n hasExplicitProjects: boolean;\n} => {\n if (value === undefined) {\n const setup = validateSetup<ProjectSetupDefinition<TProjectContext>>(\n defaultSetup,\n 'setup',\n );\n const fileSetup = validateSetup<\n FileSetupDefinition<TContext, TProjectContext>\n >(defaultFileSetup, 'fileSetup');\n const maxConcurrentFiles =\n test.maxConcurrentFiles ?? Number.POSITIVE_INFINITY;\n validateFileConcurrency(maxConcurrentFiles, fileSetup, 'default');\n return {\n hasExplicitProjects: false,\n projects: Object.freeze([\n Object.freeze({\n projectId: projectIdFromIndex(0),\n name: 'default',\n ...(setup ? { setup } : {}),\n ...(fileSetup ? { fileSetup } : {}),\n maxConcurrentFiles,\n tags: Object.freeze({ include: [], exclude: [] }),\n retry: 0,\n variables: Object.freeze({}),\n nodes: new NodeRegistry(globalNodes.definitions()),\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 (defaultFileSetup !== undefined) {\n throw new TypeError(\n 'Midscene config fileSetup cannot be used together with projects. Move fileSetup to projects[].fileSetup.',\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 [\n 'name',\n 'setup',\n 'fileSetup',\n 'maxConcurrentFiles',\n 'nodes',\n 'files',\n 'tags',\n 'retry',\n 'variables',\n ],\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 files = validateTestFileSelection(candidate.files, `${label}.files`);\n if (candidate.nodes !== undefined && !Array.isArray(candidate.nodes)) {\n throw new TypeError(`Midscene config ${label}.nodes must be an array.`);\n }\n const localNodes = new NodeRegistry(\n candidate.nodes as NodeDefinition[] | undefined,\n );\n const nodes = new NodeRegistry([\n ...globalNodes.definitions().filter((node) => !localNodes.has(node.name)),\n ...localNodes.definitions(),\n ]);\n const fileSetup = validateSetup<\n FileSetupDefinition<TContext, TProjectContext>\n >(candidate.fileSetup, `${label}.fileSetup`);\n const globalFileLimit = test.maxConcurrentFiles ?? Number.POSITIVE_INFINITY;\n const maxConcurrentFiles = Math.min(\n globalFileLimit,\n validatePositiveInteger(\n candidate.maxConcurrentFiles,\n globalFileLimit,\n `${label}.maxConcurrentFiles`,\n ),\n );\n validateFileConcurrency(maxConcurrentFiles, fileSetup, label);\n return Object.freeze({\n projectId: projectIdFromIndex(index),\n name: candidate.name,\n nodes,\n ...(fileSetup ? { fileSetup } : {}),\n maxConcurrentFiles,\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: validateSetup<ProjectSetupDefinition<TProjectContext>>(\n candidate.setup,\n `${label}.setup`,\n )!,\n }),\n });\n });\n return { projects: Object.freeze(projects), hasExplicitProjects: true };\n};\n\nconst validateTestOptions = (\n value: unknown,\n hasExplicitProjects: boolean,\n): ResolvedTestOptions => {\n if (value !== undefined && !isRecord(value)) {\n throw new TypeError('Midscene config test must be an object.');\n }\n const candidate = (value ?? {}) as Record<string, unknown>;\n if (candidate.maxConcurrency !== undefined) {\n const limit =\n typeof candidate.maxConcurrency === 'number' &&\n Number.isInteger(candidate.maxConcurrency) &&\n candidate.maxConcurrency > 0\n ? candidate.maxConcurrency\n : 1;\n throw new TypeError(\n [\n 'Midscene config test.maxConcurrency is no longer supported.',\n 'It controlled project concurrency, not file concurrency. Remove it and use:',\n ` test: { maxConcurrentProjects: ${limit}, maxConcurrentFiles: ${hasExplicitProjects ? limit : 1} }`,\n hasExplicitProjects\n ? ' Set projects[].maxConcurrentFiles to 1 to keep files sequential within each project.'\n : ' The implicit default project keeps running files sequentially.',\n hasExplicitProjects\n ? 'For parallel files, configure fileSetup and raise both test.maxConcurrentFiles and projects[].maxConcurrentFiles.'\n : 'For parallel files, configure fileSetup and raise test.maxConcurrentFiles.',\n 'Migration guide: https://midscenejs.com/midscene-test/configuration.html#existing-configurations',\n ].join('\\n'),\n );\n }\n return Object.freeze({\n maxConcurrentFiles: validateConcurrency(\n candidate.maxConcurrentFiles,\n 'test.maxConcurrentFiles',\n ),\n maxConcurrentProjects: validateConcurrency(\n candidate.maxConcurrentProjects,\n 'test.maxConcurrentProjects',\n ),\n setupTimeout: validatePositiveInteger(\n candidate.setupTimeout,\n 120_000,\n 'test.setupTimeout',\n ),\n teardownTimeout: validatePositiveInteger(\n candidate.teardownTimeout,\n 30_000,\n 'test.teardownTimeout',\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, TProjectContext = TContext>(\n definition: unknown,\n): LoadedTestProject<TContext, TProjectContext> => {\n if (!isRecord(definition)) {\n throw new TypeError('Midscene config must default export an object.');\n }\n if (definition.nodes !== undefined && !Array.isArray(definition.nodes)) {\n throw new TypeError('Midscene config nodes must be an array.');\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', 'fileSetup', 'projects', 'test', 'output', 'nodes'],\n 'root',\n );\n const nodes = new NodeRegistry(\n definition.nodes as NodeDefinition[] | undefined,\n );\n const test = validateTestOptions(\n definition.test,\n definition.projects !== undefined,\n );\n const resolvedProjects = validateExecutionProjects<TContext, TProjectContext>(\n definition.projects,\n definition.setup,\n definition.fileSetup,\n nodes,\n test,\n );\n return {\n ...resolvedProjects,\n 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 assertSupportedConfig = (absolutePath: string): '.ts' | '.mjs' => {\n if (!absolutePath.endsWith('.ts') && !absolutePath.endsWith('.mjs')) {\n const extension = absolutePath.match(/(\\.[^./\\\\]+)$/)?.[1] ?? '(none)';\n throw new TypeError(\n `Unsupported Midscene config extension: ${extension}. Supported extensions: .ts, .mjs.`,\n );\n }\n return absolutePath.endsWith('.mjs') ? '.mjs' : '.ts';\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<\n TContext = undefined,\n TProjectContext = TContext,\n>(configPath?: string): Promise<LoadedTestProject<TContext, TProjectContext>> {\n if (!configPath) {\n return validateTestProjectDefinition<TContext, TProjectContext>({\n nodes: [],\n });\n }\n\n const absolutePath = resolve(configPath);\n const extension = assertSupportedConfig(absolutePath);\n let loaded: unknown;\n try {\n if (extension === '.mjs') {\n loaded = await import(pathToFileURL(absolutePath).href);\n } else {\n // Select tsx's ESM entry even when this loader is built as CommonJS.\n // Its CommonJS entry can resolve the async loader relative to the wrong directory.\n const { tsImport } = await import('tsx/esm/api');\n loaded = await tsImport(pathToFileURL(absolutePath).href, {\n parentURL: pathToFileURL(`${dirname(absolutePath)}${sep}`).href,\n tsconfig: false,\n });\n }\n } catch (error) {\n try {\n if (extension === '.mjs' || !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, TProjectContext>(\n getDefaultExport(loaded, absolutePath),\n );\n}\n","import { createHash } from 'node:crypto';\n\n/** Internal invocation identity keeps repeated legacy files distinct. */\nexport const createCaseInvocationId = (\n projectId: string,\n sourcePath: string,\n caseIndex: number,\n invocationIndex = 0,\n): string =>\n createHash('sha256')\n .update(\n JSON.stringify([\n projectId,\n sourcePath,\n caseIndex,\n ...(invocationIndex ? [invocationIndex] : []),\n ]),\n )\n .digest('hex');\n\nexport const createDocumentInvocationId = (\n projectId: string,\n sourcePath: string,\n invocationIndex = 0,\n): string =>\n createHash('sha256')\n .update(\n JSON.stringify([\n projectId,\n sourcePath,\n ...(invocationIndex ? [invocationIndex] : []),\n ]),\n )\n .digest('hex');\n","import {\n type ResolveNodeForNormalization,\n normalizeStep as coreNormalizeStep,\n normalizeSteps as coreNormalizeSteps,\n} from '@midscene/core/internal/test-runner';\nimport type { NormalizedStep } from './types';\nexport type { ResolveNodeForNormalization } from '@midscene/core/internal/test-runner';\n\nexport const normalizeStep: (\n value: unknown,\n index?: number,\n resolveNode?: ResolveNodeForNormalization,\n) => NormalizedStep = coreNormalizeStep;\nexport const normalizeSteps: (\n values: unknown,\n resolveNode?: ResolveNodeForNormalization,\n) => NormalizedStep[] = coreNormalizeSteps;\n","import type { TestRunReportValue } from '@midscene/core';\nimport {\n isReportSecretKey,\n sanitizeReportText,\n} from '@midscene/core/internal/test-runner';\nimport { JSON_SCHEMA, load } from 'js-yaml';\n\ninterface SourceNode {\n start: number;\n end: number;\n value: unknown;\n children: SourceNode[];\n}\n\n/** Keep author formatting while redacting values by parsed YAML keys, including aliases. */\nexport function parseWorkflowSource(source: string): {\n parsed: unknown;\n sourceYaml: TestRunReportValue;\n} {\n const stack: SourceNode[] = [];\n const nodes: SourceNode[] = [];\n const sensitiveNodes = new Set<SourceNode>();\n const sensitiveValues = new Set<unknown>();\n const redactedPaths = new Set<string>();\n // js-yaml removes the BOM before reporting source positions.\n const sourceOffset = source.charCodeAt(0) === 0xfeff ? 1 : 0;\n const parsed = load(source, {\n schema: JSON_SCHEMA,\n listener(event, state) {\n if (event === 'open') {\n stack.push({\n start: state.position + sourceOffset,\n end: 0,\n value: null,\n children: [],\n });\n return;\n }\n const node = stack.pop()!;\n node.end = state.position + sourceOffset;\n node.value = state.result;\n stack.at(-1)?.children.push(node);\n nodes.push(node);\n if (state.kind !== 'mapping') return;\n for (let index = 0; index < node.children.length; index += 2) {\n const key = node.children[index].value;\n const value = node.children[index + 1];\n if (typeof key !== 'string' || !isReportSecretKey(key) || !value)\n continue;\n sensitiveNodes.add(value);\n if (value.value !== null) sensitiveValues.add(value.value);\n redactedPaths.add(`$..[${JSON.stringify(key)}]`);\n }\n },\n });\n // Redact the definition as well when a secret value refers to a YAML anchor.\n const ranges = nodes\n .filter(\n (node) => sensitiveNodes.has(node) || sensitiveValues.has(node.value),\n )\n .sort((left, right) => left.start - right.start || right.end - left.end);\n let offset = 0;\n let redacted = '';\n for (const range of ranges) {\n if (range.start < offset) continue;\n const text = source.slice(range.start, range.end);\n const leading = text.match(/^\\s*/)?.[0] ?? '';\n const trailing = text.slice(leading.length).match(/\\s*$/)?.[0] ?? '';\n redacted += `${source.slice(offset, range.start)}${leading}\"[REDACTED]\"${trailing}`;\n offset = range.end;\n }\n redacted += source.slice(offset);\n const value = sanitizeReportText(redacted, 64 * 1024);\n return {\n parsed,\n sourceYaml: {\n value,\n ...(redactedPaths.size ? { redactedPaths: [...redactedPaths] } : {}),\n ...(value !== redacted ? { truncatedPaths: ['$'] } : {}),\n },\n };\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 { readFileSync } from 'node:fs';\nimport { sep } from 'node:path';\nimport { classifyWorkflowDocumentFormat } from '@midscene/core/internal/test-runner';\nimport type { JsonValue } from '../cli/test-project';\nimport { WorkflowParseError } from '../errors';\nimport type { NodeDefinition } from '../node/types';\nimport {\n createCaseInvocationId,\n createDocumentInvocationId,\n} from './identifiers';\nimport { normalizeSteps } from './normalize';\nimport { parseWorkflowSource } from './source';\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\nexport class NativeWorkflowFormatError extends WorkflowParseError {\n readonly actualFormat: 'legacy' | 'legacy-batch' | 'mixed';\n\n constructor(\n actualFormat: 'legacy' | 'legacy-batch' | 'mixed',\n sourcePath: string,\n ) {\n super(\n actualFormat === 'legacy'\n ? `Legacy tasks/flow YAML is not supported by midscene-test: ${sourcePath}. Run it with \\`midscene ${sourcePath}\\`, or migrate the file to cases/steps.`\n : actualFormat === 'legacy-batch'\n ? `Legacy YAML batch configuration is not a midscene-test workflow document: ${sourcePath}. Run it with \\`midscene --config ${sourcePath}\\`, or migrate it to a native project config.`\n : `A workflow file cannot mix legacy tasks/flow with native cases/steps or lifecycle hooks: ${sourcePath}. Keep the formats in separate files and run each file with its matching command.`,\n { sourcePath, actualFormat, expectedFormat: 'native' },\n );\n this.actualFormat = actualFormat;\n }\n}\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 => createCaseInvocationId(projectId, sourcePath, caseIndex);\n\nexport const createWorkflowDocumentId = (\n projectId: string,\n sourcePath: string,\n): string => createDocumentInvocationId(projectId, sourcePath);\n\nexport function collectWorkflowDocument(\n source: WorkflowDocumentSource,\n options: CollectWorkflowDocumentOptions,\n): CollectedWorkflowDocument {\n let snapshot: ReturnType<typeof parseWorkflowSource>;\n try {\n snapshot = parseWorkflowSource(readFileSync(source.absolutePath, 'utf8'));\n } catch (error) {\n throw new WorkflowParseError(\n `Failed to parse workflow document \"${source.sourcePath}\".`,\n { sourcePath: source.sourcePath },\n error,\n );\n }\n const { parsed, sourceYaml } = snapshot;\n\n if (!isMapping(parsed)) {\n throw new WorkflowParseError('Workflow document must be a mapping.');\n }\n const format = classifyWorkflowDocumentFormat(parsed);\n if (format === 'legacy' || format === 'legacy-batch' || format === 'mixed') {\n throw new NativeWorkflowFormatError(format, source.sourcePath);\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 templateInput: step.input,\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 sourceYaml,\n lifecycle,\n cases,\n } satisfies CollectedWorkflowDocument;\n}\n","import { createHash } from 'node:crypto';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join, relative, sep } from 'node:path';\nimport {\n WorkflowPublicationError,\n sanitizeReportError,\n} from '@midscene/core/internal/test-runner';\nimport type { CaseRunResult, WorkflowDocumentRunResult } from '../engine/types';\nimport type { PreparedExecutionProject } from './execution-plan';\nimport type { TestProjectCollectionError, TestProjectRunResult } from './types';\n\nconst writeJson = async (path: string, value: unknown) => {\n try {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, JSON.stringify(value, null, 2));\n } catch (error) {\n throw new WorkflowPublicationError('write-result', path, error);\n }\n};\n\nexport const writeTestRunPlan = (\n runDir: string,\n projects: readonly PreparedExecutionProject[],\n) =>\n writeJson(join(runDir, 'plan.json'), {\n schemaVersion: 1,\n createdAt: new Date().toISOString(),\n projects: projects.map((item) => ({\n projectId: item.project.projectId,\n name: item.project.name,\n documents: item.plans ?? [],\n })),\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(\n result.projectId,\n 'documents',\n result.documentId,\n result.attemptIndex === undefined\n ? 'document.json'\n : `${result.documentRunId}.json`,\n ),\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 return writeJson(\n join(runDir, workflowDocumentResultPath(result)),\n persistedResult,\n );\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 return 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 return 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 = sanitizeReportError;\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 return 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 ...(result.errors?.length ? { errors: result.errors.map(errorJson) } : {}),\n projectRoot: options.projectRoot,\n ...(options.configPath ? { configPath: options.configPath } : {}),\n factsRoot: '.',\n plan: 'plan.json',\n ...(result.operationLog\n ? {\n operationLog: {\n ...result.operationLog,\n path: relativeToSummary(\n result.summaryPath,\n result.operationLog.path,\n ),\n },\n }\n : {}),\n reportDir: relativeToSummary(result.summaryPath, result.reportDir),\n ...(result.reportPath\n ? { report: relativeToSummary(result.summaryPath, result.reportPath) }\n : {}),\n ...(result.markdownPath\n ? { markdown: relativeToSummary(result.summaryPath, result.markdownPath) }\n : {}),\n summary: result.summary,\n projects: result.projects.map((project) => ({\n projectId: project.projectId,\n name: project.name,\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.cleanup\n ? { cleanup: project.lifecycle.cleanup }\n : {}),\n ...(project.lifecycle.pendingOperations\n ? { pendingOperations: project.lifecycle.pendingOperations }\n : {}),\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 ...(outcome.documentRunId\n ? { documentRunId: outcome.documentRunId }\n : {}),\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 ...(attempt.cleanup ? { cleanup: attempt.cleanup } : {}),\n ...(attempt.pendingOperations\n ? { pendingOperations: attempt.pendingOperations }\n : {}),\n ...(attempt.executionStatus\n ? { executionStatus: attempt.executionStatus }\n : {}),\n ...(attempt.retryDecision\n ? { retryDecision: attempt.retryDecision }\n : {}),\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 ...(document.attemptIndex === undefined\n ? {}\n : {\n attemptIndex: document.attemptIndex,\n documentRunId: document.documentRunId,\n }),\n sourcePath: document.sourcePath,\n status: document.status,\n ...(document.cleanup ? { cleanup: document.cleanup } : {}),\n ...(document.pendingOperations\n ? { pendingOperations: document.pendingOperations }\n : {}),\n ...(document.executionStatus\n ? { executionStatus: document.executionStatus }\n : {}),\n ...(document.retryDecision\n ? { retryDecision: document.retryDecision }\n : {}),\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 { readdirSync } from 'node:fs';\nimport { join, relative, resolve, sep } from 'node:path';\nimport type { CollectedWorkflowDocument } from '@midscene/core/internal/test-runner';\nimport { buildTestRunReportPlan } from '@midscene/core/internal/test-runner';\nimport { globSync } from 'tinyglobby';\nimport { WorkflowError, WorkflowParseError } from '../errors';\nimport { collectWorkflowDocument } from '../parser/collect';\nimport type {\n PreparedDocumentInvocation,\n PreparedExecutionProject,\n ProjectPreparationOptions,\n} from './execution-plan';\nimport { writeCollectionError } from './result-store';\nimport type { LoadedExecutionProject, TestFileSelection } from './test-project';\nimport { validateTestFileSelection } from './test-project';\nimport type { TestProjectCollectionError } from './types';\n\nexport const CONFIG_NAMES = [\n 'midscene.config.ts',\n 'midscene.config.mjs',\n] as const;\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\nconst discoverResolvedTestFiles = (\n projectRoot: string,\n selection: TestFileSelection,\n): string[] => {\n const root = resolve(projectRoot);\n const match = (patterns: readonly string[]) =>\n globSync(patterns, {\n absolute: true,\n caseSensitiveMatch: false,\n cwd: root,\n dot: true,\n expandDirectories: false,\n followSymbolicLinks: false,\n ignore: [...ALWAYS_IGNORED_PATTERNS, ...(selection.exclude ?? [])],\n onlyFiles: true,\n }).filter((file) => /\\.ya?ml$/i.test(file));\n const files = match(selection.include);\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 discoverTestFiles = (\n projectRoot: string,\n selection: TestFileSelection = DEFAULT_TEST_FILE_SELECTION,\n): string[] => {\n const normalized = validateTestFileSelection(selection);\n if (!normalized) throw new TypeError('Test file selection is required.');\n return discoverResolvedTestFiles(projectRoot, normalized);\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 supported = candidates.filter((name) =>\n CONFIG_NAMES.includes(name as (typeof CONFIG_NAMES)[number]),\n );\n const unsupported = candidates.filter(\n (name) => !CONFIG_NAMES.includes(name as (typeof CONFIG_NAMES)[number]),\n );\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_NAMES.join(' and ')} are supported.`,\n ].join('\\n'),\n );\n }\n if (supported.length > 1) {\n throw new Error(\n [\n `Multiple Midscene configs found in ${root}:`,\n ...supported.map((name) => `- ${name}`),\n 'Pass --config <path> to select one explicitly.',\n ].join('\\n'),\n );\n }\n return supported[0] ? join(root, supported[0]) : undefined;\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\nexport const matchesTags = (\n tags: readonly string[],\n selection: LoadedExecutionProject['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: LoadedExecutionProject,\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\nexport const selectProjects = <TProjectContext>(\n projects: readonly LoadedExecutionProject<TProjectContext>[],\n names: readonly string[] | undefined,\n): readonly LoadedExecutionProject<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\n/** Prepare and validate every document before any Project resource is acquired. */\nexport async function prepareProject(\n project: LoadedExecutionProject,\n projectRoot: string,\n runDir: string,\n defaultTimeoutMs: number,\n options: ProjectPreparationOptions = {},\n): Promise<PreparedExecutionProject> {\n const platform = options.platform?.trim();\n const fileSelection = project.files ?? DEFAULT_TEST_FILE_SELECTION;\n const prerequisiteFile = options.prerequisiteFile\n ? resolve(options.prerequisiteFile)\n : undefined;\n const mainFiles =\n options.files ?? discoverResolvedTestFiles(projectRoot, fileSelection);\n const files = [\n ...(prerequisiteFile ? [prerequisiteFile] : []),\n ...mainFiles.filter((file) => file !== prerequisiteFile),\n ];\n const occurrences = new Map<string, number>();\n const sources = files.map((absolutePath) => {\n const invocationIndex = occurrences.get(absolutePath) ?? 0;\n occurrences.set(absolutePath, invocationIndex + 1);\n return {\n projectId: project.projectId,\n projectName: project.name,\n sourcePath: toPosix(relative(projectRoot, absolutePath)),\n absolutePath,\n invocationIndex,\n };\n });\n const collectionErrors: TestProjectCollectionError[] = [];\n const invocations: PreparedDocumentInvocation[] = [];\n const plans: import('@midscene/core').TestRunReportDocumentPlan[] = [];\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 await writeCollectionError(runDir, error);\n }\n\n for (const source of sources) {\n try {\n const collected = await options.collectDocument?.(source, project);\n if (collected) {\n filteredCaseCount += collected.filteredCaseCount;\n if (collected.invocation) {\n const plan = buildTestRunReportPlan(collected.invocation.document, {\n defaultTimeoutMs: collected.invocation.defaultTimeoutMs,\n retry: collected.invocation.retry,\n });\n invocations.push({ ...collected.invocation, plan });\n plans.push(plan);\n }\n continue;\n }\n const document = collectWorkflowDocument(source, {\n resolveNode: project.nodes.get.bind(project.nodes),\n variables: project.variables,\n env: process.env,\n });\n const filtered =\n source.absolutePath === prerequisiteFile\n ? { document, filtered: 0 }\n : filterDocumentCases(document, project);\n const plan = buildTestRunReportPlan(document, {\n selectedCaseIds:\n filtered.document?.cases.map((item) => item.caseId) ?? [],\n defaultTimeoutMs,\n retry: { scope: 'case', count: project.retry },\n });\n plans.push(plan);\n filteredCaseCount += filtered.filtered;\n if (filtered.document)\n invocations.push({\n plan,\n document: filtered.document,\n retry: { scope: 'case', count: project.retry },\n defaultTimeoutMs,\n reportEnabled: true,\n bindings: {\n resolveNode: project.nodes.require.bind(project.nodes),\n ...(project.fileSetup\n ? {\n documentSetup: {\n name: project.fileSetup.name,\n setup({ projectContext, document, signal, onTeardown }) {\n return project.fileSetup!.setup({\n project,\n projectContext,\n file: document,\n env: Object.freeze({ ...process.env }),\n signal,\n onTeardown,\n });\n },\n },\n }\n : {}),\n },\n });\n } catch (error) {\n const collectionError = asCollectionError(\n project.projectId,\n project.name,\n source.sourcePath,\n error,\n );\n collectionErrors.push(collectionError);\n await writeCollectionError(runDir, collectionError);\n }\n }\n\n const documents = invocations.map((invocation) => invocation.document);\n const prerequisiteSource = sources.find(\n (source) => source.absolutePath === prerequisiteFile,\n );\n const prerequisiteDocument = documents.find(\n (document) => document.sourcePath === prerequisiteSource?.sourcePath,\n );\n return {\n project,\n ...(platform ? { platform } : {}),\n documentConcurrency: options.documentConcurrency ?? 1,\n ...(prerequisiteDocument\n ? { prerequisiteDocumentId: prerequisiteDocument.documentId }\n : {}),\n fileSelection,\n sources,\n documents,\n invocations,\n plans,\n collectionErrors,\n selectedCaseCount: documents.reduce(\n (total, document) => total + document.cases.length,\n 0,\n ),\n filteredCaseCount,\n };\n}\n","import { randomUUID } from 'node:crypto';\nimport { existsSync, mkdirSync, statSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { NativeWorkflowFormatError } from '../parser/collect';\nimport type {\n PreparedExecutionProject,\n PreparedTestRunPlan,\n TestProjectRunOptions,\n TestRunInput,\n} from './execution-plan';\nimport {\n discoverTestConfig,\n prepareProject,\n selectProjects,\n} from './project-preparation';\nimport { loadTestProject } from './test-project';\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 resolveRunInput = (options: TestProjectRunOptions): TestRunInput => {\n const cwd = resolve(options.cwd ?? process.cwd());\n assertDirectory(cwd, 'Test working directory');\n const inputPath = options.projectRoot\n ? resolve(cwd, options.projectRoot)\n : undefined;\n const singleFile =\n inputPath && existsSync(inputPath) && statSync(inputPath).isFile()\n ? inputPath\n : undefined;\n if (singleFile && !/\\.ya?ml$/i.test(singleFile))\n throw new Error(\n `Test input must be a YAML file or project directory: ${singleFile}`,\n );\n const cliProjectRoot = singleFile ? dirname(singleFile) : inputPath;\n if (cliProjectRoot) assertDirectory(cliProjectRoot, 'Test project directory');\n const projectRoot = cliProjectRoot ?? cwd;\n return {\n cwd,\n projectRoot,\n configSearchRoot: projectRoot,\n ...(singleFile ? { singleFile } : {}),\n };\n};\n\n/** Composition boundary only: execution receives no raw input syntax or host options. */\nexport async function prepareTestRun(\n options: TestProjectRunOptions,\n): Promise<PreparedTestRunPlan> {\n const startedAt = new Date();\n const runId = createTestRunId(startedAt);\n const input = resolveRunInput(options);\n const configPath = options.configPath\n ? resolve(input.configSearchRoot, options.configPath)\n : discoverTestConfig(input.configSearchRoot);\n if (options.configPath && /\\.ya?ml$/i.test(configPath!)) {\n throw new Error(\n `midscene-test --config only accepts a native TypeScript or JavaScript project config: ${configPath}. Run legacy batch YAML with \\`midscene --config ${options.configPath}\\`.`,\n );\n }\n if (options.configPath && !existsSync(configPath!))\n throw new Error(`Midscene config does not exist: ${configPath}`);\n const definition = await loadTestProject<unknown>(configPath);\n const resultDir = options.resultDir\n ? resolve(input.cwd, options.resultDir)\n : join(input.projectRoot, '.midscene', 'test-results');\n const runDir = join(resultDir, runId);\n const summaryPath = join(runDir, 'summary.json');\n const reportDir = resolve(input.projectRoot, definition.output.reportDir);\n mkdirSync(resultDir, { recursive: true });\n mkdirSync(runDir);\n const projects: PreparedExecutionProject[] = [];\n for (const project of selectProjects(\n definition.projects,\n options.projectNames,\n ))\n projects.push(\n await prepareProject(\n project,\n input.projectRoot,\n runDir,\n definition.test.testTimeout,\n input.singleFile ? { files: [input.singleFile] } : undefined,\n ),\n );\n const hasFormatMismatch = projects.some((project) =>\n project.collectionErrors.some(\n ({ error }) => error instanceof NativeWorkflowFormatError,\n ),\n );\n return {\n startedAt,\n runId,\n projectRoot: input.projectRoot,\n ...(configPath ? { configPath } : {}),\n resultDir,\n runDir,\n summaryPath,\n reportDir,\n definition,\n projects,\n // A wrong-format file invalidates the complete command invocation. Other\n // native collection failures retain the existing per-Project isolation.\n preflightScope: hasFormatMismatch ? 'run' : 'project',\n reportEnabled: true,\n publications: [],\n onProgress: options.onProgress ?? (() => {}),\n };\n}\n","import { writeFile } from 'node:fs/promises';\nimport { dirname, join, relative, sep } from 'node:path';\nimport type {\n TestRunReportDump,\n TestRunReportSourceIndex,\n TestRunReportStep,\n} from '@midscene/core';\nimport type { TestProjectRunResult } from '../cli/types';\nimport { buildTestRunReportDump } from './test-run-report';\n\nconst text = (value: string): string =>\n value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll('|', '&#124;')\n .replaceAll('[', '&#91;')\n .replaceAll(']', '&#93;')\n .replaceAll('*', '&#42;')\n .replaceAll('_', '&#95;')\n .replaceAll('`', '&#96;')\n .replaceAll('\\\\', '&#92;')\n .replace(/[\\r\\n]+/g, ' ');\n\nconst duration = (ms: number): string => {\n const seconds = Math.round(ms / 1000);\n return seconds < 60\n ? `${seconds}s`\n : `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n};\nconst href = (from: string, target: string): string =>\n relative(dirname(from), target).split(sep).map(encodeURIComponent).join('/');\n\nexport interface TestResultMarkdownOptions {\n /** Relative or hosted URL of the HTML report. */\n reportHref?: string;\n}\n\n/** Render the same sanitized execution facts used by the HTML report. */\nexport function renderTestResultMarkdown(\n dump: TestRunReportDump,\n options: TestResultMarkdownOptions = {},\n): string {\n const { summary } = dump;\n const outcome =\n dump.status === 'success'\n ? `✅ **${summary.passed}/${summary.total} passed**`\n : `❌ **${summary.failed} failed** · ${summary.passed} passed · ${summary.notRun} not run`;\n const lines = [\n '## Midscene Test',\n '',\n `${outcome} · ${duration(dump.durationMs)}`,\n '',\n ];\n if (summary.filtered) lines.push(`**Filtered:** ${summary.filtered}`, '');\n const infrastructure = [\n summary.collectionErrors\n ? `${summary.collectionErrors} collection errors`\n : '',\n summary.documentFailures\n ? `${summary.documentFailures} document failures`\n : '',\n summary.projectFailures\n ? `${summary.projectFailures} project failures`\n : '',\n ].filter(Boolean);\n if (infrastructure.length)\n lines.push(`**Infrastructure:** ${infrastructure.join(' · ')}`, '');\n const groups: { name: string; rows: string[] }[] = [];\n const errors: string[] = [];\n const recordSteps = (label: string, steps: readonly TestRunReportStep[]) => {\n for (const step of steps) {\n if (step.status === 'failed')\n errors.push(\n `${label} / ${step.node}: ${step.error?.message ?? 'Step failed'}`,\n );\n }\n };\n for (const project of dump.projects) {\n if (project.lifecycle?.setupError)\n errors.push(`${project.name}: ${project.lifecycle.setupError.message}`);\n for (const error of project.lifecycle?.teardownErrors ?? [])\n errors.push(`${project.name}: ${error.message}`);\n for (const error of project.collectionErrors)\n errors.push(\n `${project.name} / ${error.sourcePath}: ${error.error.message}`,\n );\n for (const document of project.documents) {\n const name = document.sourcePath\n .replace(/\\\\/g, '/')\n .replace(/\\.(?:yaml|yml)$/, '');\n const group = {\n name: dump.projects.length > 1 ? `${project.name} / ${name}` : name,\n rows: [] as string[],\n };\n groups.push(group);\n recordSteps(`${project.name} / ${document.sourcePath}`, [\n ...document.beforeAll,\n ...document.afterAll,\n ]);\n for (const error of document.teardownErrors ?? [])\n errors.push(`${document.sourcePath}: ${error.message}`);\n for (const failure of document.hostErrors ?? [])\n errors.push(\n `${document.sourcePath} / ${failure.phase}: ${failure.error.message}`,\n );\n for (const testCase of document.cases) {\n group.rows.push(\n ` - ${testCase.status === 'success' ? '✅' : testCase.status === 'not-run' ? '⏭️' : '❌'} ${text(testCase.name)}`,\n );\n }\n }\n }\n for (const diagnostic of dump.diagnostics ?? []) {\n if (diagnostic.level === 'error') errors.push(diagnostic.message);\n }\n if (errors.length)\n lines.push(\n '### Execution errors',\n '',\n ...errors.map((error) => `- ${text(error)}`),\n '',\n );\n for (const group of groups) {\n if (group.rows.length) lines.push(`- ${text(group.name)}`, ...group.rows);\n }\n if (!groups.some((group) => group.rows.length))\n lines.push('No cases were reported.');\n if (options.reportHref)\n lines.push(\n '',\n `[Open the Midscene Test report ↗](<${options.reportHref}>)`,\n );\n return `${lines.join('\\n')}\\n`;\n}\n\nconst emptyIndex = (): TestRunReportSourceIndex => ({\n sources: [],\n metrics: {\n modelCallCount: 0,\n modelTimeMs: 0,\n promptTokens: 0,\n cachedInputTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n },\n});\n\n/** Write a per-run Markdown artifact even when HTML publication fails or is disabled. */\nexport async function writeTestResultMarkdown(\n result: TestProjectRunResult,\n index: TestRunReportSourceIndex = emptyIndex(),\n): Promise<string> {\n const output = join(dirname(result.summaryPath), 'result.md');\n const dump = buildTestRunReportDump(result, index);\n await writeFile(\n output,\n renderTestResultMarkdown(dump, {\n ...(result.reportPath\n ? { reportHref: href(output, result.reportPath) }\n : {}),\n }),\n );\n return output;\n}\n","import {\n WorkflowExecutionFailure,\n decideRetry,\n isResourceRecoveryError,\n runDocumentAttempts,\n runWorkflowDocument,\n} from '@midscene/core/internal/test-runner';\nimport type {\n CaseRunOutcome,\n StepExecutionInfo,\n StepRunResult,\n WorkflowDocumentExecutionResult,\n WorkflowDocumentRunResult,\n} from '@midscene/core/internal/test-runner';\nimport { isFatalDeviceError } from '../errors';\nimport type { PreparedDocumentInvocation } from './execution-plan';\nimport {\n writeCaseAttemptResult,\n writeWorkflowDocumentResult,\n} from './result-store';\nimport type { LoadedExecutionProject } from './test-project';\nimport type { TestProjectCaseRunResult } from './types';\n\ninterface DocumentInvocationSinks {\n cases: TestProjectCaseRunResult[];\n documents: WorkflowDocumentRunResult[];\n}\n\ninterface ExecuteDocumentInvocationOptions {\n isolatedContext?: boolean;\n setupTimeoutMs?: number;\n teardownTimeoutMs?: () => number;\n onUnresolvedResources?(): void;\n /** Classify failures by resource ownership, independently of notifications. */\n isProjectResourceFailure?(error: unknown): boolean;\n invocation: PreparedDocumentInvocation;\n project: LoadedExecutionProject<unknown>;\n projectContext: unknown;\n runDir: string;\n signal: AbortSignal;\n rootSignal: AbortSignal;\n shouldBail(): boolean;\n isProjectFatal(): boolean;\n markProjectFatal(): void;\n addFailedCases(count: number): void;\n onProgress(message: string): void;\n onDocumentResult?(result: WorkflowDocumentRunResult): Promise<void>;\n sinks: DocumentInvocationSinks;\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 if (result.status === 'not-run')\n return `${indent}– ${formatStep(info)} (not run: ${result.notRunReason})`;\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 ) ||\n (attempt.teardownErrors ?? []).some(isFatalDeviceError) ||\n !!attempt.executionErrors?.some(isResourceRecoveryError),\n );\n\nconst documentHasFatalError = (result: WorkflowDocumentRunResult): boolean =>\n [...result.beforeAll, ...result.afterAll].some(\n (step) => step.error && isFatalDeviceError(step.error),\n ) ||\n (result.teardownErrors ?? []).some(isFatalDeviceError) ||\n !!result.executionErrors?.some(isResourceRecoveryError);\n\n// Only an explicit ownership signal can establish a Project-wide failure.\nexport const isSharedResourceFailure = (error: unknown): boolean => {\n const seen = new Set<object>();\n const pending: unknown[] = [error];\n while (pending.length && seen.size < 50) {\n const item = pending.pop();\n if (typeof item !== 'object' || item === null || seen.has(item)) continue;\n seen.add(item);\n const failure = item as {\n code?: string;\n cause?: unknown;\n errors?: unknown[];\n };\n if (failure.code === 'PROJECT_RESOURCE_ERROR') return true;\n if (failure.cause) pending.push(failure.cause);\n if (Array.isArray(failure.errors))\n pending.push(...failure.errors.slice(0, 50));\n }\n return false;\n};\n\n/** Execute prepared document policies through the shared retry boundary. */\nexport async function executeDocumentInvocation(\n options: ExecuteDocumentInvocationOptions,\n): Promise<void> {\n const { invocation, project, sinks } = options;\n const isProjectResourceFailure =\n options.isProjectResourceFailure ?? (() => false);\n const { document } = invocation;\n const documentRetry = invocation.retry.scope === 'document';\n const attempts: WorkflowDocumentExecutionResult[] = [];\n const fileSetup = invocation.bindings.documentSetup;\n const documentSetup =\n options.isProjectResourceFailure && fileSetup\n ? {\n ...fileSetup,\n async setup(ctx: Parameters<typeof fileSetup.setup>[0]) {\n try {\n return await fileSetup.setup(ctx);\n } catch (error) {\n if (isProjectResourceFailure(error)) options.markProjectFatal();\n throw error;\n }\n },\n }\n : fileSetup;\n\n await runDocumentAttempts(\n {\n retry: documentRetry ? invocation.retry.count : 0,\n signal: options.signal,\n shouldStop: () => options.shouldBail() || options.isProjectFatal(),\n },\n async (documentAttemptIndex) => {\n if (documentRetry)\n options.onProgress(\n ` file attempt ${documentAttemptIndex + 1}/${invocation.retry.count + 1}: ${document.sourcePath}`,\n );\n const execution = await runWorkflowDocument(document, {\n plan: invocation.plan,\n documentAttemptIndex: documentRetry ? documentAttemptIndex : undefined,\n ...invocation.bindings,\n documentSetup,\n setupTimeoutMs: options.setupTimeoutMs,\n teardownTimeoutMs: options.teardownTimeoutMs,\n project,\n projectContext: options.projectContext,\n retry: documentRetry ? 0 : invocation.retry.count,\n signal: options.signal,\n defaultTimeoutMs: invocation.defaultTimeoutMs,\n shouldStop: () =>\n options.rootSignal.aborted ||\n options.shouldBail() ||\n options.isProjectFatal(),\n stopReason: () =>\n options.rootSignal.aborted\n ? 'interrupted'\n : options.isProjectFatal()\n ? 'fatal-error'\n : 'bail',\n isFatalError: (run) =>\n [...run.beforeEach, ...run.steps, ...run.afterEach].some(\n (step) =>\n step.error &&\n (isFatalDeviceError(step.error) ||\n isProjectResourceFailure(step.error)),\n ) ||\n (run.teardownErrors ?? []).some(\n (error) =>\n isFatalDeviceError(error) || isProjectResourceFailure(error),\n ),\n onCaseStart: (collectedCase) => {\n options.onProgress(\n ` [case ${collectedCase.caseIndex + 1}/${document.cases.length}] ${collectedCase.definition.name}`,\n );\n },\n onStepStart: (info) => {\n const indent = info.scope === 'case' ? ' ' : ' ';\n options.onProgress(`${indent}→ ${formatStep(info)}`);\n },\n onStepResult: async (info, result) => {\n if (isProjectResourceFailure(result.error))\n options.markProjectFatal();\n await invocation.bindings.onStepResult?.(info, result);\n options.onProgress(formatStepResult(info, result));\n },\n onCaseResult: async (attempt) => {\n await writeCaseAttemptResult(\n options.runDir,\n project.projectId,\n document.documentId,\n attempt,\n );\n options.onProgress(\n ` ${attempt.status === 'success' ? '✓' : '✗'} attempt ${attempt.attemptIndex + 1}/${documentRetry ? 1 : invocation.retry.count + 1}: ${attempt.name} (${attempt.durationMs} ms)`,\n );\n },\n onCaseOutcome: (outcome) => {\n if (\n outcome.attempts?.some(\n (attempt) =>\n [\n ...attempt.beforeEach,\n ...attempt.steps,\n ...attempt.afterEach,\n ].some((step) => isProjectResourceFailure(step.error)) ||\n attempt.teardownErrors?.some(isProjectResourceFailure),\n )\n )\n options.markProjectFatal();\n if (!options.isolatedContext && caseHasFatalError(outcome))\n options.markProjectFatal();\n if (!documentRetry && outcome.status === 'failed')\n options.addFailedCases(1);\n },\n onDocumentResult: options.onDocumentResult,\n }).catch(async (error: unknown) => {\n if (error instanceof WorkflowExecutionFailure) {\n const partial = error.result as WorkflowDocumentExecutionResult;\n const resourceOnly =\n error.errors.length > 0 &&\n error.errors.every(\n (failure) =>\n isResourceRecoveryError(failure) ||\n partial.document.hostErrors?.some(\n (host) =>\n host.phase === 'cleanup' &&\n (host.error === failure ||\n (host.error instanceof Error &&\n host.error.cause === failure)),\n ),\n );\n // Legacy recovery failures stop context reuse. Isolated file failures\n // are checked for unresolved resources below; publication still throws.\n if (resourceOnly) {\n if (\n !options.isolatedContext &&\n error.errors.some(isResourceRecoveryError)\n )\n options.markProjectFatal();\n return partial;\n }\n if (documentRetry)\n partial.document.retryDecision = decideRetry({\n scope: 'document',\n retryCount: invocation.retry.count,\n attemptIndex: documentAttemptIndex,\n status: 'failed',\n infrastructureError: true,\n });\n attempts.push(partial);\n sinks.documents.push(partial.document);\n sinks.cases.push(\n ...partial.cases.map((outcome) => ({\n ...outcome,\n documentId: document.documentId,\n documentRunId: partial.document.documentRunId,\n })),\n );\n try {\n for (const outcome of partial.cases)\n for (const attempt of outcome.attempts ?? [])\n await writeCaseAttemptResult(\n options.runDir,\n project.projectId,\n document.documentId,\n attempt,\n );\n await writeWorkflowDocumentResult(options.runDir, partial.document);\n } catch (publicationError) {\n throw new WorkflowExecutionFailure(partial, [\n ...error.errors,\n publicationError,\n ]);\n }\n }\n throw error;\n });\n\n if (!options.isolatedContext && documentHasFatalError(execution.document))\n options.markProjectFatal();\n if (\n [\n ...execution.document.beforeAll,\n ...execution.document.afterAll,\n ...(execution.document.hostErrors ?? []).map(({ error }) => ({\n error,\n })),\n ...(execution.document.teardownErrors ?? []).map((error) => ({\n error,\n })),\n ].some(({ error }) => isProjectResourceFailure(error))\n )\n options.markProjectFatal();\n const owners = [\n execution.document,\n ...execution.cases.flatMap((outcome) => outcome.attempts ?? []),\n ];\n const cleanupPending = owners.some(\n (owner) => owner.cleanup?.status === 'pending',\n );\n const operationPending = owners.some(\n (owner) => !!owner.pendingOperations?.length,\n );\n const cleanupFailed = owners.some(\n (owner) =>\n owner.cleanup?.status === 'failed' ||\n !!owner.teardownErrors?.length ||\n ('hostErrors' in owner &&\n owner.hostErrors?.some(({ phase }) => phase === 'cleanup')),\n );\n // Legacy files reuse their Project context. Isolated files may continue\n // after settled local cleanup failure; unresolved ownership stops dispatch.\n if (cleanupPending || operationPending) {\n options.markProjectFatal();\n options.onUnresolvedResources?.();\n } else if (cleanupFailed && !options.isolatedContext)\n options.markProjectFatal();\n const failed =\n execution.document.status === 'failed' ||\n execution.cases.some((item) => item.status !== 'success');\n const decision = decideRetry({\n scope: 'document',\n retryCount: invocation.retry.count,\n attemptIndex: documentAttemptIndex,\n status: failed ? 'failed' : 'success',\n cleanupPending,\n cleanupFailed,\n operationPending,\n fatalError: options.isProjectFatal(),\n interrupted: options.signal.aborted || options.rootSignal.aborted,\n shouldStop: options.shouldBail(),\n });\n if (documentRetry) execution.document.retryDecision = decision;\n attempts.push(execution);\n sinks.cases.push(\n ...execution.cases.map((outcome) => ({\n ...outcome,\n documentId: document.documentId,\n documentRunId: execution.document.documentRunId,\n })),\n );\n sinks.documents.push(execution.document);\n // Per-attempt callbacks publish incremental facts; seal the final retry\n // decision after callback-driven interruption/bail has been observed.\n try {\n for (const outcome of execution.cases)\n for (const attempt of outcome.attempts ?? [])\n await writeCaseAttemptResult(\n options.runDir,\n project.projectId,\n document.documentId,\n attempt,\n );\n await writeWorkflowDocumentResult(options.runDir, execution.document);\n } catch (error) {\n execution.document.status = 'failed';\n execution.document.hostErrors = [\n ...(execution.document.hostErrors ?? []),\n { phase: 'publication', error },\n ];\n if (documentRetry)\n execution.document.retryDecision = decideRetry({\n scope: 'document',\n retryCount: invocation.retry.count,\n attemptIndex: documentAttemptIndex,\n status: 'failed',\n infrastructureError: true,\n });\n throw new WorkflowExecutionFailure(execution, [error]);\n }\n return decision.decision === 'retry' ? 'failed' : undefined;\n },\n );\n\n const final = attempts.at(-1);\n if (!final) return;\n const failedCases = final.cases.filter(\n (item) => item.status === 'failed',\n ).length;\n if (documentRetry && failedCases) options.addFailedCases(failedCases);\n else if (final.document.status === 'failed' && failedCases === 0)\n options.addFailedCases(Math.max(1, failedCases));\n}\n","import type {\n ProjectRuntime,\n WorkflowDocumentRunResult,\n} from '@midscene/core/internal/test-runner';\nimport {\n WorkflowError,\n getPendingScopeOperations,\n getResourceCleanupCompletion,\n trackResourceOperation,\n waitForScopeOperations,\n} from '@midscene/core/internal/test-runner';\nimport { createProjectRuntime } from '../engine/project-runtime';\nimport {\n executeDocumentInvocation,\n isSharedResourceFailure,\n} from './document-invocation';\nimport type { PreparedExecutionProject } from './execution-plan';\nimport type {\n TestExecutionProjectRunResult,\n TestProjectCaseRunResult,\n} from './types';\n\ninterface FileProjectState {\n prepared: PreparedExecutionProject;\n cases: TestProjectCaseRunResult[];\n documents: WorkflowDocumentRunResult[];\n runtime?: ProjectRuntime;\n lifecycle?: TestExecutionProjectRunResult['lifecycle'];\n cursor: number;\n active: number;\n initializing: boolean;\n finished: boolean;\n fatal: boolean;\n setupFailed: boolean;\n}\n\ninterface FileSchedulerOptions {\n projects: readonly PreparedExecutionProject[];\n maxConcurrentFiles: number;\n maxConcurrentProjects: number;\n setupTimeoutMs: number;\n teardownTimeoutMs(): number;\n signal: AbortSignal;\n runDir: string;\n preflightFailed: boolean;\n shouldBail(): boolean;\n addFailedCases(count: number): void;\n announceProject(project: PreparedExecutionProject, index: number): void;\n onProgress(project: PreparedExecutionProject, message: string): void;\n onInfrastructureError(error: unknown): void;\n}\n\n/** Round-robin files within global file and live Project limits. */\nexport async function runPreparedFiles(\n options: FileSchedulerOptions,\n): Promise<FileProjectState[]> {\n const states: FileProjectState[] = options.projects.map((prepared) => ({\n prepared,\n cases: [],\n documents: [],\n cursor: 0,\n active: 0,\n initializing: false,\n finished: false,\n fatal: false,\n setupFailed: false,\n }));\n let nextProject = 0;\n let resourcesUnresolved = false;\n let occupied = 0;\n let occupiedProjects = 0;\n const cleanupQueue: Array<() => void> = [];\n const release = () => {\n occupied--;\n while (occupied < options.maxConcurrentFiles && cleanupQueue.length) {\n occupied++;\n cleanupQueue.shift()!();\n }\n wake?.();\n };\n let wake: (() => void) | undefined;\n const running = new Set<Promise<void>>();\n const stopped = (state: FileProjectState) =>\n options.signal.aborted || options.shouldBail() || state.fatal;\n const invalid = (state: FileProjectState) =>\n options.preflightFailed || state.prepared.collectionErrors.length > 0;\n const unresolved = () => {\n if (resourcesUnresolved) return;\n resourcesUnresolved = true;\n options.onInfrastructureError(\n new WorkflowError(\n 'Resources are still running or cleanup is pending. No new test files will start.',\n { code: 'UNRESOLVED_FILE_RESOURCES' },\n ),\n );\n };\n const finishProject = async (state: FileProjectState) => {\n if (!state.runtime || state.finished) return;\n state.finished = true;\n const failed =\n state.fatal ||\n options.signal.aborted ||\n state.cases.some((item) => item.status !== 'success') ||\n state.documents.some((item) => item.status !== 'success');\n state.lifecycle = await state.runtime.finish(failed ? 'failed' : 'success');\n const releaseProject = () => {\n occupiedProjects--;\n wake?.();\n };\n if (\n state.lifecycle.cleanup?.status === 'pending' ||\n state.lifecycle.pendingOperations?.length\n ) {\n unresolved();\n // A result snapshot can precede actual resource release.\n void Promise.all([\n waitForScopeOperations(state.runtime.signal),\n getResourceCleanupCompletion(state.runtime.signal),\n ]).then(releaseProject, (error) => {\n options.onInfrastructureError(error);\n releaseProject();\n });\n } else releaseProject();\n };\n\n const admit = () => {\n for (let offset = 0; offset < states.length; offset++) {\n const index = (nextProject + offset) % states.length;\n const state = states[index];\n if (invalid(state) || state.finished || state.initializing) continue;\n if (!state.runtime && occupiedProjects >= options.maxConcurrentProjects)\n continue;\n const cleanupOnly =\n !!state.runtime &&\n state.active === 0 &&\n (stopped(state) || state.cursor === state.prepared.invocations.length);\n if (\n !cleanupOnly &&\n (stopped(state) ||\n state.cursor >= state.prepared.invocations.length ||\n state.active >=\n (state.prepared.project.maxConcurrentFiles ??\n options.maxConcurrentFiles))\n )\n continue;\n nextProject = (index + 1) % states.length;\n occupied++;\n state.active++;\n if (!state.runtime && !cleanupOnly) {\n // Claim both budgets before setup so idle Projects are not pre-created.\n occupiedProjects++;\n state.initializing = true;\n }\n const invocationIndex = cleanupOnly ? -1 : state.cursor++;\n return { state, index, invocationIndex };\n }\n };\n\n const run = async ({\n state,\n index,\n invocationIndex,\n }: NonNullable<ReturnType<typeof admit>>) => {\n const { prepared } = state;\n const { project } = prepared;\n let fileResourcesPending = false;\n try {\n if (invocationIndex < 0) {\n await finishProject(state);\n return;\n }\n if (!state.runtime) {\n state.runtime = createProjectRuntime({\n project,\n setup: project.setup,\n signal: options.signal,\n setupTimeoutMs: options.setupTimeoutMs,\n teardownTimeoutMs: options.teardownTimeoutMs,\n });\n setMaxListeners(\n Math.max(\n 10,\n Math.min(\n prepared.invocations.length,\n project.maxConcurrentFiles ?? options.maxConcurrentFiles,\n ) + 1,\n ),\n state.runtime.signal,\n );\n options.announceProject(prepared, index);\n await state.runtime.start();\n state.initializing = false;\n if (!state.runtime.canRun) {\n state.fatal = true;\n state.setupFailed = true;\n }\n wake?.();\n }\n if (stopped(state)) return;\n const invocation = prepared.invocations[invocationIndex];\n options.onProgress(\n prepared,\n ` [document ${invocationIndex + 1}/${prepared.invocations.length}] ${invocation.document.sourcePath}`,\n );\n await executeDocumentInvocation({\n invocation,\n project,\n projectContext: state.runtime.context,\n runDir: options.runDir,\n signal: state.runtime.signal,\n rootSignal: options.signal,\n shouldBail: options.shouldBail,\n isProjectFatal: () => state.fatal,\n markProjectFatal: () => {\n if (state.fatal) return;\n state.fatal = true;\n state.runtime?.abort(\n new WorkflowError(\n `Project \"${project.name}\" shared execution environment is unavailable.`,\n { code: 'PROJECT_RESOURCE_ERROR' },\n ),\n );\n },\n addFailedCases: options.addFailedCases,\n onProgress: (message) => options.onProgress(prepared, message),\n sinks: state,\n isolatedContext: project.fileSetup !== undefined,\n isProjectResourceFailure: isSharedResourceFailure,\n setupTimeoutMs: options.setupTimeoutMs,\n teardownTimeoutMs: options.teardownTimeoutMs,\n onUnresolvedResources: () => {\n fileResourcesPending = true;\n unresolved();\n },\n });\n } catch (error) {\n state.fatal = true;\n fileResourcesPending =\n !!state.runtime &&\n getPendingScopeOperations(state.runtime.signal).length > 0;\n options.onInfrastructureError(error);\n } finally {\n state.initializing = false;\n try {\n // The last file retains its global/local admission through shared cleanup.\n if (\n state.active === 1 &&\n (stopped(state) || state.cursor === prepared.invocations.length)\n )\n await finishProject(state);\n } catch (error) {\n options.onInfrastructureError(error);\n }\n state.active--;\n if (\n state.runtime &&\n (fileResourcesPending || state.lifecycle?.cleanup?.status === 'pending')\n ) {\n // A returned pending snapshot does not release the actual admission.\n // At shutdown this may conservatively wait for siblings in the Project.\n void waitForScopeOperations(state.runtime.signal).then(\n release,\n (error) => {\n options.onInfrastructureError(error);\n release();\n },\n );\n } else release();\n wake?.();\n }\n };\n\n while (true) {\n const changed = new Promise<void>((resolve) => {\n wake = resolve;\n });\n while (occupied < options.maxConcurrentFiles) {\n const job = admit();\n if (!job) break;\n const task = run(job);\n running.add(task);\n const settled = () => {\n running.delete(task);\n wake?.();\n };\n void task.then(settled, (error) => {\n options.onInfrastructureError(error);\n settled();\n });\n }\n if (!running.size) break;\n await changed;\n }\n wake = undefined;\n\n // Pending acquisitions/disposers retain their admissions after the result\n // deadline. Idle initialized Projects queue actual cleanup behind those\n // admissions; their snapshots still return within the shared shutdown limit.\n await Promise.all(\n states.map(async (state) => {\n if (!state.runtime || state.finished) return;\n const admission = new Promise<void>((resolve) => {\n cleanupQueue.push(resolve);\n });\n trackResourceOperation({}, admission, state.runtime.signal);\n while (occupied < options.maxConcurrentFiles && cleanupQueue.length) {\n occupied++;\n cleanupQueue.shift()!();\n }\n try {\n await finishProject(state);\n } catch (error) {\n options.onInfrastructureError(error);\n } finally {\n void Promise.all([\n admission,\n getResourceCleanupCompletion(state.runtime.signal),\n ]).then(release, (error) => {\n options.onInfrastructureError(error);\n release();\n });\n }\n }),\n );\n\n for (const state of states) {\n const { prepared } = state;\n if (!state.runtime)\n options.announceProject(prepared, states.indexOf(state));\n const completed = new Set(state.cases.map((item) => item.caseId));\n const reason = invalid(state)\n ? 'project-preflight-failed'\n : state.setupFailed\n ? 'project-setup-failed'\n : options.signal.aborted\n ? 'interrupted'\n : state.fatal\n ? 'fatal-error'\n : 'bail';\n for (const document of prepared.documents) {\n for (const item of document.cases) {\n if (completed.has(item.caseId)) continue;\n state.cases.push({\n documentId: document.documentId,\n caseId: item.caseId,\n projectName: prepared.project.name,\n name: item.definition.name,\n sourcePath: item.sourcePath,\n caseIndex: item.caseIndex,\n status: 'not-run',\n notRunReason: reason,\n });\n }\n }\n const order = new Map(\n prepared.documents.map((document, i) => [document.documentId, i]),\n );\n const position = (id: string) => order.get(id) ?? Number.MAX_SAFE_INTEGER;\n state.cases.sort(\n (a, b) =>\n position(a.documentId) - position(b.documentId) ||\n a.caseIndex - b.caseIndex,\n );\n state.documents.sort(\n (a, b) => position(a.documentId) - position(b.documentId),\n );\n }\n return states;\n}\nimport { setMaxListeners } from 'node:events';\n","import { appendFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { TestRunReportOperationEvent } from '@midscene/core';\n\n/** Registered operations keep this sink after the report has been sealed.\n * Each small, bounded event is written before returning to the operation. No\n * open file descriptor or mutable report object is retained by the journal.\n */\nexport function createOperationJournal(runDir: string) {\n const path = join(runDir, 'operations.jsonl');\n writeFileSync(path, '', { flag: 'wx' });\n return {\n path,\n append(event: Readonly<TestRunReportOperationEvent>) {\n appendFileSync(path, `${JSON.stringify(event)}\\n`);\n },\n };\n}\n","import { setMaxListeners } from 'node:events';\nimport { dirname, join } from 'node:path';\nimport type { TestRunReportSourceIndex } from '@midscene/core';\nimport {\n WorkflowExecutionFailure,\n WorkflowPublicationError,\n asExecutionError,\n observeResourceOperations,\n} from '@midscene/core/internal/test-runner';\nimport type {\n CollectedCase,\n WorkflowDocumentRunResult,\n} from '@midscene/core/internal/test-runner';\nimport {\n TestRunReportAssembler,\n calculateTestRunHealth,\n} from '@midscene/core/report';\nimport { getDebug } from '@midscene/shared/logger';\nimport { writeTestResultMarkdown } from '../report/result-markdown';\nimport {\n buildTestRunReportDump,\n collectTestRunReportSources,\n} from '../report/test-run-report';\nimport type {\n PreparedExecutionProject,\n PreparedTestRunPlan,\n} from './execution-plan';\nimport { runPreparedFiles } from './file-scheduler';\nimport { createOperationJournal } from './operation-journal';\nimport { writeTestProjectRunResult, writeTestRunPlan } from './result-store';\nimport type {\n TestExecutionProjectRunResult,\n TestProjectCaseRunResult,\n TestProjectRunResult,\n TestProjectRunSummary,\n} from './types';\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 healthCases = projects.flatMap((project) => {\n const documentAttemptByRunId = new Map(\n project.documents.map((document) => [\n document.documentRunId,\n document.attemptIndex ?? 0,\n ]),\n );\n return latestById(project.cases, (item) => item.caseId).map((item) => {\n return {\n status: item.status,\n ...(item.run ? { run: item.run } : {}),\n ...(item.attempts ? { attempts: item.attempts } : {}),\n retryCount: item.documentRunId\n ? (documentAttemptByRunId.get(item.documentRunId) ?? 0)\n : 0,\n };\n });\n });\n const documents = projects.flatMap((project) =>\n latestById(project.documents, (item) => item.documentId),\n );\n const health = calculateTestRunHealth(healthCases);\n return {\n total: health.total,\n passed: health.passed,\n failed: health.failed,\n notRun: health.notRun,\n passedAfterRetry: health.passedAfterRetry,\n finalPassRate: health.finalPassRate,\n firstPassRate: health.firstPassRate,\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 latestById = <T>(items: readonly T[], id: (item: T) => string): T[] => [\n ...new Map(items.map((item) => [id(item), item])).values(),\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\n/** The executor sees prepared policies and bindings, never source-language rules. */\nexport async function runPreparedTestProject(\n plan: PreparedTestRunPlan,\n): Promise<TestProjectRunResult> {\n const {\n startedAt,\n runId,\n projectRoot,\n configPath,\n resultDir,\n runDir,\n summaryPath,\n reportDir,\n definition,\n projects: preparedProjects,\n } = plan;\n const progress = plan.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.maxConcurrentFiles ?? Number.POSITIVE_INFINITY,\n Math.max(1, totalDocuments),\n );\n await writeTestRunPlan(runDir, preparedProjects);\n const journal = createOperationJournal(runDir);\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 shutdownDeadline: number | undefined;\n const beginShutdown = () => {\n shutdownDeadline ??= Date.now() + definition.test.teardownTimeout;\n };\n rootController.signal.addEventListener('abort', beginShutdown, {\n once: true,\n });\n const addFailedCases = (count: number) => {\n failedCaseCount += count;\n if (bailReached()) beginShutdown();\n };\n const teardownTimeoutMs = () =>\n Math.max(\n 0,\n Math.min(\n definition.test.teardownTimeout,\n shutdownDeadline === undefined\n ? Number.POSITIVE_INFINITY\n : shutdownDeadline - Date.now(),\n ),\n );\n let hasInfrastructureError = false;\n const infrastructureErrors: unknown[] = [];\n const recordInfrastructureError = (error: unknown) => {\n const errors =\n error instanceof WorkflowExecutionFailure ? error.errors : [error];\n for (const item of errors)\n if (!infrastructureErrors.includes(item)) infrastructureErrors.push(item);\n hasInfrastructureError = true;\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 const stopObservingOperations = observeResourceOperations(\n rootController.signal,\n (event) => {\n try {\n journal.append(event);\n } catch (error) {\n recordInfrastructureError(\n new WorkflowPublicationError('write-result', journal.path, error),\n );\n getDebug('test-runner:operations', { console: true })(\n `Could not persist operation event: ${String(error)}`,\n );\n }\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}`,\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 latestById(cases, (item) => item.caseId).some(\n (item) => item.status !== 'success',\n ) ||\n latestById(documents, (item) => item.documentId).some(\n (item) => item.status === 'failed',\n ) ||\n lifecycle?.status === 'failed';\n return {\n projectId: project.projectId,\n name: project.name,\n ...(prepared.platform ? { platform: prepared.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 plans: prepared.plans,\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 projectResults: Array<TestExecutionProjectRunResult | undefined> =\n new Array(preparedProjects.length);\n\n try {\n const states = await runPreparedFiles({\n projects: preparedProjects,\n maxConcurrentFiles: effectiveConcurrency,\n maxConcurrentProjects:\n definition.test.maxConcurrentProjects ?? Number.POSITIVE_INFINITY,\n setupTimeoutMs: definition.test.setupTimeout,\n teardownTimeoutMs,\n signal: rootController.signal,\n runDir,\n preflightFailed: plan.preflightScope === 'run' && totalErrors > 0,\n shouldBail: bailReached,\n addFailedCases,\n announceProject,\n onProgress: (prepared, message) =>\n runInfrastructureCallback(() =>\n progress(\n effectiveConcurrency > 1\n ? `[${prepared.project.name}]${message}`\n : message,\n ),\n ),\n onInfrastructureError: recordInfrastructureError,\n });\n states.forEach((state, index) => {\n projectResults[index] = buildProjectResult(\n state.prepared,\n state.cases,\n state.documents,\n state.lifecycle,\n );\n });\n } catch (error) {\n recordInfrastructureError(error);\n } finally {\n stopObservingOperations();\n process.off('SIGINT', sigint);\n process.off('SIGTERM', sigterm);\n }\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 hasInfrastructureError ||\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 operationLog: { path: journal.path, snapshotAt: endedAt.toISOString() },\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 ...(hasInfrastructureError\n ? { errors: infrastructureErrors.map(asExecutionError) }\n : {}),\n };\n let completedResult = result;\n let reportIndex: TestRunReportSourceIndex | undefined;\n const publish = async (\n operation: 'write-result' | 'write-report',\n path: string,\n callback: () => unknown | Promise<unknown>,\n ): Promise<boolean> => {\n try {\n await callback();\n return true;\n } catch (error) {\n recordInfrastructureError(\n error instanceof WorkflowPublicationError ||\n error instanceof WorkflowExecutionFailure\n ? error\n : new WorkflowPublicationError(operation, path, error),\n );\n completedResult = {\n ...completedResult,\n status: 'failed',\n exitCode: 1,\n errors: infrastructureErrors.map(asExecutionError),\n };\n return false;\n }\n };\n const writeSummary = () =>\n publish('write-result', summaryPath, () =>\n writeTestProjectRunResult({\n projectRoot,\n ...(configPath ? { configPath } : {}),\n result: completedResult,\n }),\n );\n const writeReport = () =>\n publish('write-report', reportDir, async () => {\n if (!plan.reportEnabled) return;\n const reportPath = await new TestRunReportAssembler().assembleAsync({\n outputDir: reportDir,\n reportFileName: `midscene-e2e-${runId}`,\n overwrite: false,\n sources: collectTestRunReportSources(completedResult),\n buildRunnerDump: (index) => {\n reportIndex = index;\n const dump = buildTestRunReportDump(completedResult, index);\n const warn = getDebug('test-runner:report-assembler', {\n console: true,\n });\n for (const diagnostic of dump.diagnostics ?? [])\n warn(diagnostic.message);\n return dump;\n },\n });\n completedResult = { ...completedResult, reportPath };\n });\n // Publish each artifact once. The summary includes the report path or its\n // failure. If the summary itself fails, the thrown result remains authoritative;\n // do not rebuild an already-published execution report to backfill that error.\n await writeReport();\n for (const publication of plan.publications)\n await publish(publication.operation, publication.path, async () => {\n await publication.publish(completedResult);\n });\n await publish(\n 'write-result',\n join(dirname(summaryPath), 'result.md'),\n async () => {\n const markdownPath = await writeTestResultMarkdown(\n completedResult,\n reportIndex,\n );\n completedResult = { ...completedResult, markdownPath };\n },\n );\n await writeSummary();\n if (hasInfrastructureError)\n throw new WorkflowExecutionFailure(completedResult, infrastructureErrors);\n return completedResult;\n}\n","import type { TestProjectRunOptions } from './execution-plan';\nimport { prepareTestRun } from './prepare-test-run';\nimport { runPreparedTestProject } from './run-prepared-project';\nimport type { TestProjectRunResult } from './types';\n\nexport type { TestProjectRunOptions } from './execution-plan';\nexport { createTestRunId } from './prepare-test-run';\nexport {\n DEFAULT_TEST_FILE_SELECTION,\n discoverTestConfig,\n discoverTestFiles,\n} from './project-preparation';\n\n/** Native Test entry for cases/steps workflow documents. */\nexport async function runTestProject(\n options: TestProjectRunOptions = {},\n): Promise<TestProjectRunResult> {\n return runPreparedTestProject(await prepareTestRun(options));\n}\n","import { existsSync, statSync, writeFileSync } from 'node:fs';\nimport { relative, resolve, sep } from 'node:path';\nimport { WorkflowExecutionFailure } from '@midscene/core/internal/test-runner';\nimport { version } from '../../package.json';\nimport { formatCliError } from './error-format';\nimport { renderNodeSpec, sortNodesForSpec } from './node-spec';\nimport { loadTestProject } from './test-project';\nimport {\n DEFAULT_TEST_FILE_SELECTION,\n discoverTestConfig,\n runTestProject,\n} from './test-project-runner';\nimport type { TestProjectRunResult } from './types';\n\nexport interface TestCliIO {\n log(message: string): void;\n error(message: string): void;\n write?(message: string): void;\n}\n\ninterface ParsedTestArgs {\n command?: 'nodes';\n cwd: string;\n projectRoot?: string;\n configPath?: string;\n resultDir?: string;\n projectNames?: string[];\n}\n\nexport const parseTestCliArgs = (\n args: string[],\n cwd = process.cwd(),\n): ParsedTestArgs => {\n const command = args[0] === 'nodes' ? args[0] : undefined;\n const commandOffset = command ? 1 : 0;\n let projectRoot: string | undefined;\n let configPath: string | undefined;\n let resultDir: string | undefined;\n const projectNames: string[] = [];\n\n for (let index = commandOffset; index < args.length; index += 1) {\n const token = args[index];\n const equal = token.startsWith('-') ? token.indexOf('=') : -1;\n const arg = equal < 0 ? token : token.slice(0, equal);\n const inlineValue = equal < 0 ? undefined : token.slice(equal + 1);\n if (!arg.startsWith('-')) {\n if (projectRoot)\n throw new Error('Only one test project directory is allowed.');\n projectRoot = resolve(cwd, arg);\n continue;\n }\n if (arg === '--config' || arg === '--result-dir' || arg === '--project') {\n const value = inlineValue ?? args[index + 1];\n if (!value || value.startsWith('--'))\n throw new Error(`${arg} requires a value.`);\n if (arg === '--config') configPath = value;\n else if (arg === '--result-dir') resultDir = resolve(cwd, value);\n else projectNames.push(value);\n if (inlineValue === undefined) index += 1;\n } else {\n throw new Error(`Unknown option: ${token}`);\n }\n }\n\n if (command === 'nodes' && resultDir) {\n throw new Error('--result-dir is not supported by nodes.');\n }\n if (command === 'nodes' && projectNames.length > 1) {\n throw new Error('nodes accepts only one --project name.');\n }\n return {\n ...(command ? { command } : {}),\n cwd,\n projectRoot,\n configPath,\n resultDir,\n ...(projectNames.length > 0 ? { projectNames } : {}),\n };\n};\n\nconst defaultCliIO: TestCliIO = {\n log: console.log,\n error: console.error,\n write: (message) => process.stdout.write(message),\n};\n\nconst testCliHelp = `Midscene Test: run native cases/steps Test projects.\n\nUsage:\n midscene-test [file.yaml | directory] [options]\n midscene-test --config <midscene.config.ts> [options]\n midscene-test nodes [directory] [--config midscene.config.ts]\n midscene-test create --help\n midscene-test model verify Check model connectivity and Midscene compatibility\n\nOptions:\n --config <path> Native TypeScript or JavaScript Test config\n --project <name> Select a native execution Project (repeatable)\n --result-dir <path> Store Test result files in this directory\n --help, -h Show this help\n --version Show the package version\n\nLegacy tasks/flow YAML and its CLI options belong to the midscene command.\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 runNodesCommand = async (\n options: ParsedTestArgs,\n io: TestCliIO,\n): Promise<void> => {\n const cwd = resolve(options.cwd);\n assertDirectory(cwd, 'Test working directory');\n const projectRoot = options.projectRoot\n ? resolve(cwd, options.projectRoot)\n : undefined;\n if (projectRoot) assertDirectory(projectRoot, 'Test project directory');\n\n const configSearchRoot = projectRoot ?? cwd;\n const configPath = options.configPath\n ? resolve(configSearchRoot, options.configPath)\n : discoverTestConfig(configSearchRoot);\n if (options.configPath && /\\.ya?ml$/i.test(configPath!)) {\n throw new Error(\n `midscene-test nodes --config only accepts a native TypeScript or JavaScript project config: ${configPath}.`,\n );\n }\n if (options.configPath && (!configPath || !existsSync(configPath))) {\n throw new Error(`Midscene config does not exist: ${configPath}`);\n }\n\n const project = await loadTestProject(configPath);\n const projectName = options.projectNames?.[0];\n const selectedProjects = projectName\n ? project.projects.filter((candidate) => candidate.name === projectName)\n : project.projects;\n if (selectedProjects.length === 0) {\n throw new Error(`Unknown Midscene project: ${projectName}`);\n }\n // Check every Project before writing, including when only one is selected.\n const filenames = new Map<string, string>();\n const owners = new Map<string, string>();\n for (const executionProject of project.projects) {\n const safeName = executionProject.name\n .normalize('NFC')\n // biome-ignore lint/suspicious/noControlCharactersInRegex: filenames cannot contain control characters.\n .replace(/[<>:\"/\\\\|?*\\u0000-\\u001f]/g, '-')\n .replace(/[. ]+$/g, '-');\n const filename = project.hasExplicitProjects\n ? `midscene-node-spec.${safeName}.md`\n : 'midscene-node-spec.md';\n const key = filename.toLowerCase();\n const owner = owners.get(key);\n if (owner !== undefined) {\n throw new Error(\n `Projects \"${owner}\" and \"${executionProject.name}\" generate the same Node Spec filename: ${filename}`,\n );\n }\n owners.set(key, executionProject.name);\n filenames.set(executionProject.name, filename);\n }\n const specs = selectedProjects.map((executionProject) => {\n const nodes = sortNodesForSpec(executionProject.nodes.definitions());\n const document = renderNodeSpec(nodes, {\n configPath: configPath\n ? relative(configSearchRoot, configPath).split(sep).join('/')\n : undefined,\n projects: [\n {\n name: executionProject.name,\n files: executionProject.files ?? DEFAULT_TEST_FILE_SELECTION,\n },\n ],\n });\n return { executionProject, nodes, document };\n });\n for (const { executionProject, nodes, document } of specs) {\n for (const warning of document.warnings) {\n io.error(`midscene-test nodes: ${warning}`);\n }\n const specPath = resolve(\n configSearchRoot,\n filenames.get(executionProject.name)!,\n );\n writeFileSync(specPath, document.markdown);\n if (project.hasExplicitProjects || projectName) {\n io.log(`Execution Project: ${executionProject.name}`);\n }\n io.log(`Registered Nodes (${nodes.length}):`);\n if (nodes.length === 0) {\n io.log('No nodes are registered by the current Test Project.');\n }\n for (const node of nodes) {\n io.log(\n `- ${node.name}: ${node.description?.trim() || 'Description not declared.'}`,\n );\n }\n io.log(`\\nNode Spec generated: ${specPath}`);\n }\n};\n\nconst reportTestProjectResult = (\n result: TestProjectRunResult,\n io: TestCliIO,\n infrastructureErrors: readonly unknown[] = result.errors ?? [],\n): number => {\n const reportedErrors = new Set<Error>();\n const reportError = (source: string, error: unknown): void => {\n if (error instanceof Error && reportedErrors.has(error)) return;\n io.error(`midscene-test: ${source}: ${formatCliError(error)}`);\n // Infrastructure failures carry raw errors that can also be causes of\n // the contextual errors already printed from the execution result.\n const pending = [error];\n while (pending.length > 0) {\n const current = pending.pop();\n if (!(current instanceof Error) || reportedErrors.has(current)) continue;\n reportedErrors.add(current);\n pending.push(current.cause);\n if (current instanceof AggregateError) pending.push(...current.errors);\n }\n };\n for (const failure of result.collectionErrors) {\n reportError(`${failure.projectName}/${failure.sourcePath}`, failure.error);\n }\n const finalCases = new Map(\n result.cases.map((outcome) => [outcome.caseId, outcome]),\n );\n for (const outcome of finalCases.values()) {\n if (outcome.status !== 'failed' || !outcome.run) continue;\n const run = outcome.run;\n const source = `${run.projectName}/${run.sourcePath} / ${run.name}`;\n for (const step of [...run.beforeEach, ...run.steps, ...run.afterEach]) {\n if (step.error) {\n reportError(\n `${source} / ${step.phase}[${step.stepIndex + 1}] ${step.node}`,\n step.error,\n );\n }\n }\n for (const error of [\n ...(run.executionErrors ?? []),\n ...(run.teardownErrors ?? []),\n ]) {\n reportError(source, error);\n }\n }\n const finalDocuments = new Map(\n result.documents.map((document) => [document.documentId, document]),\n );\n for (const document of finalDocuments.values()) {\n if (document.status !== 'failed') continue;\n const source = `${document.projectName}/${document.sourcePath}`;\n for (const step of [...document.beforeAll, ...document.afterAll]) {\n if (step.error) {\n reportError(\n `${source} / ${step.phase}[${step.stepIndex + 1}] ${step.node}`,\n step.error,\n );\n }\n }\n for (const error of [\n ...(document.executionErrors ?? []),\n ...(document.teardownErrors ?? []),\n ]) {\n reportError(source, error);\n }\n for (const failure of document.hostErrors ?? []) {\n reportError(`${source} / host ${failure.phase}`, failure.error);\n }\n }\n for (const project of result.projects) {\n if (project.lifecycle?.setupError) {\n reportError(`${project.name} / setup`, project.lifecycle.setupError);\n }\n for (const error of project.lifecycle?.teardownErrors ?? []) {\n reportError(`${project.name} / teardown`, error);\n }\n }\n for (const error of infrastructureErrors) {\n reportError('infrastructure', error);\n }\n io.log(\n `midscene-test: ${result.summary.passed}/${result.summary.total} cases passed, ${result.summary.failed} failed, ${result.summary.notRun} not run`,\n );\n io.log(`Results: ${result.resultDir}`);\n io.log(`Summary: ${result.summaryPath}`);\n if (result.markdownPath) io.log(`Markdown: ${result.markdownPath}`);\n if (result.reportPath) io.log(`Report: ${result.reportPath}`);\n return result.exitCode;\n};\n\nexport async function runTestCli(\n args: string[],\n io: TestCliIO = defaultCliIO,\n): Promise<number> {\n try {\n if (args[0] === 'model') {\n const { runModelCommand } = await import('./model-command');\n return runModelCommand(args, undefined, {\n stdout: io.log,\n stderr: io.error,\n });\n }\n if (args[0] === 'create') {\n const { runCreateCommand } = await import('./create-command');\n await runCreateCommand(args.slice(1), io);\n return 0;\n }\n if (args.includes('--help') || args.includes('-h')) {\n io.log(testCliHelp);\n return 0;\n }\n if (args.includes('--version')) {\n io.log(version);\n return 0;\n }\n const options = parseTestCliArgs(args);\n if (options.command === 'nodes') {\n await runNodesCommand(options, io);\n return 0;\n }\n let result: TestProjectRunResult;\n try {\n result = await runTestProject({\n ...options,\n onProgress: (message) => io.log(message),\n });\n } catch (error) {\n if (!(error instanceof WorkflowExecutionFailure)) throw error;\n reportTestProjectResult(error.result, io, error.errors);\n return 1;\n }\n return reportTestProjectResult(result, io);\n } catch (error) {\n io.error(formatCliError(error));\n return 1;\n }\n}\n","import { runTestCli } from './cli/test-command';\n\nvoid runTestCli(process.argv.slice(2)).then((exitCode) => {\n process.exitCode = exitCode;\n});\n"],"names":["__webpack_require__","exports","definition","key","Object","chunkId","Promise","promises","obj","prop","installedChunks","installChunk","data","__rspack_esm_ids","__webpack_modules__","__rspack_esm_runtime","moduleId","i","installedChunkData","promise","e","resolve","formatCliError","error","inspect","GENERATED_COMMENT","sortNodesForSpec","nodes","priority","name","left","right","escapeTableCell","value","renderNodeOverview","heading","rows","node","renderWorkflowLocations","location","sections","project","patterns","pattern","projectLabel","excludes","WORKFLOW_STEP_CONTRACT","sortJsonValue","Array","child","assertSelfContainedRefs","Error","toJsonSchema","schema","z","renderNode","warnings","undefined","JSON","renderNodeSpec","sortedNodes","NodeRegistry","CoreNodeRegistry","projectIdFromIndex","index","getDefaultExport","loaded","absolutePath","defaultExport","TypeError","isRecord","rejectUnknownKeys","allowedKeys","label","allowed","Set","unknown","isAbsolutePattern","isAbsolute","validatePatterns","field","allowEmptyInclude","validateTestFileSelection","include","exclude","validateTagList","tag","validateTagSelection","assertJsonValue","path","seen","Number","item","deepFreezeJson","validateVariables","validateSetup","validatePositiveInteger","fallback","validateNonNegativeInteger","validateConcurrency","validateFileConcurrency","maxConcurrentFiles","fileSetup","validateExecutionProjects","defaultSetup","defaultFileSetup","globalNodes","test","setup","names","projects","candidate","files","localNodes","globalFileLimit","Math","validateTestOptions","hasExplicitProjects","limit","validateOutputPath","validateOutput","validateTestProjectDefinition","resolvedProjects","assertSupportedConfig","extension","canRetryWithCjsLoader","errorCode","SyntaxError","loadTestProject","configPath","pathToFileURL","tsImport","dirname","sep","tsxRequire","fallbackError","message","createCaseInvocationId","projectId","sourcePath","caseIndex","invocationIndex","createHash","createDocumentInvocationId","normalizeSteps","coreNormalizeSteps","parseWorkflowSource","source","stack","sensitiveNodes","sensitiveValues","redactedPaths","sourceOffset","parsed","load","JSON_SCHEMA","event","state","isReportSecretKey","ranges","offset","redacted","range","text","leading","trailing","sanitizeReportText","interpolationExpression","exactEnvExpression","exactProjectExpression","missingVariable","kind","options","WorkflowParseError","projectVariable","environmentVariable","interpolationValue","String","resolveString","exactEnv","exactProject","_match","environmentName","projectName","resolveWorkflowVariables","isMapping","NativeWorkflowFormatError","actualFormat","allowedSet","createCaseId","createWorkflowDocumentId","collectWorkflowDocument","snapshot","readFileSync","sourceYaml","format","classifyWorkflowDocumentFormat","resolveStepVariables","step","phase","stepIndex","process","normalizeLifecycle","normalized","resolved","lifecycle","ids","cases","tags","steps","caseId","writeJson","mkdir","writeFile","WorkflowPublicationError","writeTestRunPlan","runDir","join","Date","toPosix","caseAttemptResultPath","documentId","result","workflowDocumentResultPath","collectionErrorPath","id","writeWorkflowDocumentResult","_documentRunId","persistedResult","writeCaseAttemptResult","attemptId","writeCollectionError","collectionError","relativeToSummary","summaryPath","target","relative","errorJson","sanitizeReportError","writeTestProjectRunResult","fact","outcome","attempt","document","CONFIG_NAMES","CONFIG_PREFIX","ALWAYS_IGNORED_PATTERNS","DEFAULT_TEST_FILE_SELECTION","discoverResolvedTestFiles","projectRoot","selection","root","match","globSync","file","a","b","relativeA","relativeB","discoverTestConfig","candidates","readdirSync","supported","unsupported","asCollectionError","WorkflowError","matchesTags","filterDocumentCases","filtered","selectProjects","requested","known","prepareProject","defaultTimeoutMs","platform","fileSelection","prerequisiteFile","mainFiles","occurrences","Map","sources","collectionErrors","invocations","plans","filteredCaseCount","collected","plan","buildTestRunReportPlan","projectContext","signal","onTeardown","documents","invocation","prerequisiteSource","prerequisiteDocument","total","padDatePart","createTestRunId","date","uuid","randomUUID","timestamp","assertDirectory","existsSync","statSync","resolveRunInput","cwd","inputPath","singleFile","cliProjectRoot","prepareTestRun","startedAt","runId","input","resultDir","reportDir","mkdirSync","hasFormatMismatch","duration","ms","seconds","href","from","encodeURIComponent","renderTestResultMarkdown","dump","summary","lines","infrastructure","Boolean","groups","errors","recordSteps","group","failure","testCase","diagnostic","emptyIndex","writeTestResultMarkdown","output","buildTestRunReportDump","stepPosition","info","formatStep","position","formatStepResult","indent","symbol","continuation","caseHasFatalError","isFatalDeviceError","isResourceRecoveryError","documentHasFatalError","isSharedResourceFailure","pending","executeDocumentInvocation","sinks","isProjectResourceFailure","documentRetry","attempts","documentSetup","ctx","runDocumentAttempts","documentAttemptIndex","execution","runWorkflowDocument","run","collectedCase","WorkflowExecutionFailure","partial","resourceOnly","host","decideRetry","publicationError","owners","cleanupPending","owner","operationPending","cleanupFailed","failed","decision","final","failedCases","runPreparedFiles","states","prepared","nextProject","resourcesUnresolved","occupied","occupiedProjects","cleanupQueue","release","wake","running","stopped","invalid","unresolved","finishProject","releaseProject","waitForScopeOperations","getResourceCleanupCompletion","admit","cleanupOnly","fileResourcesPending","createProjectRuntime","setMaxListeners","getPendingScopeOperations","changed","job","task","settled","admission","trackResourceOperation","completed","reason","order","createOperationJournal","writeFileSync","appendFileSync","asNotRun","summarize","healthCases","documentAttemptByRunId","latestById","health","calculateTestRunHealth","items","notRunSuite","runPreparedTestProject","preparedProjects","progress","totalDocuments","totalCases","totalErrors","effectiveConcurrency","journal","rootController","AbortController","handleSignal","sigint","sigterm","failedCaseCount","bailReached","shutdownDeadline","beginShutdown","addFailedCases","count","teardownTimeoutMs","hasInfrastructureError","infrastructureErrors","recordInfrastructureError","runInfrastructureCallback","callback","stopObservingOperations","observeResourceOperations","getDebug","announceProject","projectIndex","buildProjectResult","projectFailed","buildSkippedProjectResult","projectResults","completedProjectResults","endedAt","asExecutionError","completedResult","reportIndex","publish","operation","writeSummary","writeReport","reportPath","TestRunReportAssembler","collectTestRunReportSources","warn","publication","markdownPath","runTestProject","parseTestCliArgs","args","command","commandOffset","projectNames","token","equal","arg","inlineValue","defaultCliIO","console","testCliHelp","runNodesCommand","io","configSearchRoot","selectedProjects","filenames","executionProject","safeName","filename","specs","warning","specPath","reportTestProjectResult","reportedErrors","reportError","current","AggregateError","finalCases","finalDocuments","runTestCli","runModelCommand","runCreateCommand","version","exitCode"],"mappings":"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"}
1
+ {"version":3,"file":"test-cli.mjs","sources":["webpack/runtime/define_property_getters","webpack/runtime/ensure_chunk","webpack/runtime/get javascript chunk filename","webpack/runtime/has_own_property","webpack/runtime/module_chunk_loading","../../src/cli/error-format.ts","../../src/cli/failure-format.ts","../../src/cli/model-usage.ts","../../src/cli/terminal-progress.ts","../../src/cli/warning-format.ts","../../src/cli/terminal-reporter.ts","../../src/cli/github-reporter.ts","../../src/cli/node-spec.ts","../../src/cli/terminal-output.ts","../../src/engine/registry.ts","../../src/cli/test-project.ts","../../src/parser/identifiers.ts","../../src/parser/normalize.ts","../../src/parser/source.ts","../../src/parser/variables.ts","../../src/parser/collect.ts","../../src/cli/result-store.ts","../../src/cli/project-preparation.ts","../../src/cli/prepare-test-run.ts","../../src/report/result-markdown.ts","../../src/cli/console-scope.ts","../../src/cli/document-invocation.ts","../../src/cli/file-scheduler.ts","../../src/cli/operation-journal.ts","../../src/cli/run-prepared-project.ts","../../src/cli/test-project-runner.ts","../../src/cli/test-command.ts","../../src/test-cli.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(\n\t\tObject.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t\t__webpack_require__.f[key](chunkId, promises);\n\t\t\treturn promises;\n\t\t}, [])\n\t);\n};","// This function allow to reference chunks\n__webpack_require__.u = (chunkId) => {\n // return url for filenames not based on template\n \n // return url for filenames based on template\n return \"1~\" + chunkId + \".mjs\"\n}","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// no BaseURI\n // object to store loaded and loading chunks\n // undefined = chunk not loaded, null = chunk preloaded/prefetched\n // [resolve, Promise] = chunk loading, 0 = chunk loaded\n var installedChunks = {\"443\": 0,};\n var installChunk = (data) => {\n var __rspack_esm_ids = data.__rspack_esm_ids;\n var __webpack_modules__ = data.__webpack_modules__;\n var __rspack_esm_runtime = data.__rspack_esm_runtime;\n // add \"modules\" to the modules object,\n // then flag all \"ids\" as loaded and fire callback\n var moduleId, chunkId, i = 0;\n for (moduleId in __webpack_modules__) {\n if (__webpack_require__.o(__webpack_modules__, moduleId)) {\n __webpack_require__.m[moduleId] = __webpack_modules__[moduleId];\n }\n }\n if (__rspack_esm_runtime) __rspack_esm_runtime(__webpack_require__);\n for (; i < __rspack_esm_ids.length; i++) {\n chunkId = __rspack_esm_ids[i];\n if (__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n installedChunks[chunkId][0]();\n }\n installedChunks[__rspack_esm_ids[i]] = 0;\n }\n \n};\n __webpack_require__.f.j = function (chunkId, promises) {\n // import() chunk loading for javascript\nvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\nif (installedChunkData !== 0) { // 0 means \"already installed\".'\n // a Promise means \"currently loading\".\n if (installedChunkData) {\n promises.push(installedChunkData[1]);\n } else {\n if (true) {\n // setup Promise in chunk cache\n var promise = import(\"./\" + __webpack_require__.u(chunkId)).then(installChunk, (e) => {\n if (installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined;\n throw e;\n });\n var promise = Promise.race([promise, new Promise((resolve) => {\n installedChunkData = installedChunks[chunkId] = [resolve];\n })]);\n promises.push(installedChunkData[1] = promise);\n }\n \n }\n}\n }\n // no external install chunk\n// no on chunks loaded\n// no HMR\n// no HMR manifest\n","import { inspect } from 'node:util';\n\n/** Keep native Error stacks, causes, and aggregate errors in CLI diagnostics. */\nexport const formatCliError = (error: unknown): string =>\n typeof error === 'string'\n ? error\n : inspect(error, { colors: false, depth: null, customInspect: false });\n\n/** Keep actionable messages and distinct causes; verbose output retains full stacks. */\nexport function formatConciseError(error: unknown): string {\n const seen = new Set<unknown>();\n const messages: string[] = [];\n let current = error;\n while (current instanceof Error && !seen.has(current)) {\n seen.add(current);\n // Node wrappers add location already shown by the reporter, sometimes twice.\n if (\n (current as Error & { code?: string }).code === 'NODE_EXECUTION_ERROR' &&\n current.cause !== undefined\n ) {\n current = current.cause;\n continue;\n }\n if (current.message && !messages.includes(current.message))\n messages.push(current.message);\n if (current instanceof AggregateError) {\n for (const nested of current.errors) {\n if (nested === current || seen.has(nested)) continue;\n seen.add(nested);\n messages.push(\n nested instanceof Error ? nested.message : String(nested),\n );\n }\n }\n current = current.cause;\n }\n if (!messages.length)\n return current instanceof Error ? current.message : formatCliError(current);\n return messages.join('\\nCaused by: ');\n}\n","import { isAbsolute, relative, win32 } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { inspect, stripVTControlCharacters } from 'node:util';\nimport {\n sanitizeReportError,\n sanitizeReportValue,\n} from '@midscene/core/internal/test-runner';\nimport type { StepRunResult } from '@midscene/core/internal/test-runner';\nimport { formatConciseError } from './error-format';\n\nexport interface CliFailureContext {\n projectName?: string;\n caseName?: string;\n sourcePath?: string;\n projectRoot?: string;\n phase?: string;\n step?: StepRunResult;\n stepCount?: number;\n attempt?: { index: number; total: number };\n fileAttempt?: { index: number; total: number };\n}\n\nconst oneLine = (value: string): string =>\n stripVTControlCharacters(value).replace(/\\s+/g, ' ').trim();\nconst shorten = (value: string, length: number): string => {\n const text = oneLine(value);\n return text.length <= length ? text : `${text.slice(0, length - 1)}…`;\n};\n\n/** Follow original causes first, retaining only application code frames. */\nexport function firstBusinessFrame(\n error: unknown,\n projectRoot?: string,\n): string | undefined {\n const seen = new Set<object>();\n const frames: string[] = [];\n const visit = (value: unknown, depth = 0) => {\n if (!value || typeof value !== 'object' || seen.has(value) || depth > 12)\n return;\n seen.add(value);\n const detail = value as {\n cause?: unknown;\n errors?: unknown[];\n stack?: unknown;\n };\n visit(detail.cause, depth + 1);\n if (Array.isArray(detail.errors))\n for (const child of detail.errors.slice(0, 10)) visit(child, depth + 1);\n if (typeof detail.stack !== 'string') return;\n for (const line of detail.stack.split('\\n')) {\n if (!line.trim().startsWith('at ')) continue;\n let location = line\n .trim()\n .slice(3)\n .replace(/^async /, '');\n if (location.endsWith(')'))\n location = location.slice(location.lastIndexOf('(') + 1, -1);\n const match = location.match(/^(.*):(\\d+):(\\d+)$/);\n if (!match) continue;\n let file = match[1];\n if (file.startsWith('file://')) {\n try {\n file = fileURLToPath(file);\n } catch {\n continue;\n }\n }\n const normalized = file.replace(/\\\\/g, '/');\n if (\n normalized.startsWith('node:') ||\n normalized.includes('/node_modules/') ||\n /(?:^|\\/)packages\\/(?:core|test|shared|web-integration)\\/(?:dist|src)\\//.test(\n normalized,\n ) ||\n !/\\.[cm]?[jt]sx?$/.test(normalized)\n )\n continue;\n frames.push(`${file}:${match[2]}:${match[3]}`);\n }\n };\n visit(error);\n const chosen = frames[0];\n if (!chosen || !projectRoot) return chosen;\n const match = chosen.match(/^(.*):(\\d+):(\\d+)$/)!;\n const file = match[1];\n const paths = /^[A-Za-z]:[\\\\/]/.test(file) ? win32 : { isAbsolute, relative };\n const display = paths.isAbsolute(file)\n ? paths.relative(projectRoot, file)\n : file;\n return `${display.replace(/\\\\/g, '/')}:${match[2]}:${match[3]}`;\n}\n\n/** A few resolved input fields, with the same redaction policy as saved reports. */\nexport function formatFailureInput(input: unknown): string[] {\n if (input === undefined) return [];\n const value = sanitizeReportValue(input).value;\n const render = (value: unknown) =>\n shorten(\n sanitizeReportError({\n message:\n typeof value === 'string'\n ? value\n : inspect(value, {\n colors: false,\n depth: 2,\n maxArrayLength: 4,\n maxStringLength: 180,\n breakLength: Number.POSITIVE_INFINITY,\n customInspect: false,\n getters: false,\n }),\n }).message,\n 160,\n );\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const entries = Object.entries(value);\n const rows = entries\n .slice(0, 4)\n .map(([key, value]) => `${shorten(key, 48)}: ${render(value)}`);\n if (entries.length > 4)\n rows.push(`… ${entries.length - 4} more fields (see Summary)`);\n return rows;\n }\n return [render(value)];\n}\n\nexport function formatFailureDetails(\n source: string,\n error: unknown,\n context: CliFailureContext = {},\n): { title: string; body: string[] } {\n const title = context.projectName\n ? `[${oneLine(context.projectName)}] ${oneLine(context.caseName ?? context.sourcePath ?? context.phase ?? source)}`\n : oneLine(source);\n const body: string[] = [];\n const field = (label: string, value: string) =>\n body.push(` ${label.padEnd(9)}${value}`);\n const step = context.step;\n if (step) {\n const phase = step.phase === 'steps' ? '' : `${step.phase} `;\n const index = step.stepIndex + 1;\n const position =\n context.stepCount === undefined\n ? String(index)\n : `${index}/${Math.max(index, context.stepCount)}`;\n field('Step', `${phase}${position} · ${oneLine(step.node)}`);\n } else if (context.phase) field('Phase', oneLine(context.phase));\n if (context.sourcePath) {\n const location = step?.meta.sourceLocation;\n field(\n 'Location',\n `${oneLine(context.sourcePath)}${location ? `:${location.line}` : ''}`,\n );\n }\n for (const [label, attempt] of [\n ['Attempt', context.attempt],\n ['File try', context.fileAttempt],\n ] as const)\n if (attempt && (attempt.total > 1 || attempt.index > 0))\n field(label, `${attempt.index + 1}/${attempt.total}`);\n if (body.length) body.push('');\n const safeMessage = sanitizeReportError({\n message: formatConciseError(error),\n }).message;\n const lines = stripVTControlCharacters(safeMessage).split(/\\r?\\n/);\n body.push(\n ` Error: ${shorten(lines[0], 320)}`,\n ...lines.slice(1, 6).map((line) => ` ${shorten(line, 320)}`),\n );\n if (lines.length > 6)\n body.push(' … (use --reporter verbose for details)');\n const input = step ? formatFailureInput(step.input) : [];\n if (input.length) {\n body.push('');\n input.forEach((line, index) => field(index === 0 ? 'Input' : '', line));\n }\n const frame = firstBusinessFrame(error, context.projectRoot);\n if (frame) body.push('', ` at ${oneLine(frame)}`);\n return { title, body };\n}\n","import { stripVTControlCharacters } from 'node:util';\nimport type { TestRunReportMetrics } from '@midscene/core';\nimport { sumTestRunReportMetrics } from '@midscene/core/internal/test-runner';\nimport { globalConfigManager } from '@midscene/shared/env';\nimport type { StepRunResult } from '../engine/types';\n\n/** Names only; do not initialize an Agent or require model credentials for custom Nodes. */\nexport function configuredModelNames(): { name: string; intents: string[] }[] {\n const env = globalConfigManager.getAllEnvConfig();\n const defaultName = env.MIDSCENE_MODEL_NAME;\n const models = new Map<string, string[]>();\n for (const [intent, name] of [\n ['default', defaultName],\n ['planning', env.MIDSCENE_PLANNING_MODEL_NAME || defaultName],\n ['insight', env.MIDSCENE_INSIGHT_MODEL_NAME || defaultName],\n ] as const) {\n if (!name) continue;\n const intents = models.get(name) ?? [];\n intents.push(intent);\n models.set(name, intents);\n }\n return [...models].map(([name, intents]) => ({ name, intents }));\n}\n\n/** Execution snapshots replace earlier snapshots; never add the same execution twice. */\nexport class CliModelUsage {\n private executions = new Map<string, TestRunReportMetrics>();\n private missing = new Set<string>();\n\n add(step: StepRunResult): void {\n for (const trace of step.report?.traces ?? []) {\n if (trace.metrics) {\n this.executions.set(trace.executionId, trace.metrics);\n this.missing.delete(trace.executionId);\n } else if (!this.executions.has(trace.executionId)) {\n this.missing.add(trace.executionId);\n }\n }\n }\n\n snapshot(): TestRunReportMetrics | undefined {\n if (!this.executions.size && !this.missing.size) return undefined;\n return sumTestRunReportMetrics(\n [...this.executions.values()],\n this.missing.size ? ['Some execution usage has not been recorded.'] : [],\n );\n }\n}\n\nexport function formatTokenCount(value: number): string {\n if (value < 1000) return String(Math.round(value));\n if (value < 1_000_000) return `${(value / 1000).toFixed(1)}k`;\n return `${(value / 1_000_000).toFixed(1)}m`;\n}\n\nexport function formatModelUsage(metrics?: TestRunReportMetrics): string[] {\n if (!metrics) return ['—'];\n if (!metrics.models?.length) {\n const name =\n metrics.modelCallCount || metrics.collection?.status === 'unknown'\n ? 'unknown'\n : '—';\n return [`${name} · ${formatTokenUsage(metrics)}`];\n }\n return metrics.models.map((model) => {\n const name =\n stripVTControlCharacters(model.modelName).replace(/\\s+/g, ' ').trim() ||\n 'unknown';\n // Per-model snapshots have no collection state. Retain the run's state\n // conservatively so missing usage never becomes an apparently complete row.\n const usage = formatTokenUsage({\n ...metrics,\n modelCallCount: model.callCount,\n promptTokens: model.promptTokens,\n cachedInputTokens: model.cachedInputTokens,\n completionTokens: model.completionTokens,\n totalTokens: model.totalTokens,\n });\n return `${name} · ${usage}`;\n });\n}\n\nexport function formatTokenUsage(\n metrics?: TestRunReportMetrics,\n includeCached = true,\n): string {\n if (!metrics) return '—';\n const state = (field: 'totalTokens' | 'promptTokens' | 'completionTokens') =>\n metrics.collection?.fields?.[field] ??\n metrics.collection?.status ??\n 'complete';\n if (state('totalTokens') === 'unknown') return '— (usage unavailable)';\n if (\n !metrics.modelCallCount &&\n !metrics.totalTokens &&\n state('totalTokens') === 'complete'\n )\n return '0 (no model calls)';\n const count = (field: 'totalTokens' | 'promptTokens' | 'completionTokens') =>\n state(field) === 'unknown'\n ? '—'\n : `${state(field) === 'partial' ? '≥' : ''}${formatTokenCount(metrics[field])}`;\n return [\n `${count('totalTokens')} total${state('totalTokens') === 'partial' ? ' (partial)' : ''}`,\n `${count('promptTokens')} input${includeCached && metrics.cachedInputTokens ? ` (${formatTokenCount(metrics.cachedInputTokens)} cached)` : ''}`,\n `${count('completionTokens')} output`,\n ].join(' · ');\n}\n","import { stripVTControlCharacters } from 'node:util';\nimport stringWidth from 'string-width';\n\ninterface ProgressIO {\n write?(message: string): void;\n columns?: number;\n rows?: number;\n}\n\nconst graphemes = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\nconst SYNC_START = '\\u001b[?2026h';\nconst SYNC_END = '\\u001b[?2026l';\n\nexport const truncateTerminalLine = (text: string, columns: number): string => {\n if (columns <= 0) return '';\n if (stringWidth(text) <= columns) return text;\n // Never split an ANSI sequence or grapheme when shortening a styled row.\n let output = '';\n let width = 0;\n for (const { segment } of graphemes.segment(stripVTControlCharacters(text))) {\n width += stringWidth(segment);\n if (width > columns - 1) break;\n output += segment;\n }\n return `${output}…`;\n};\n\n/** Owns only the transient block, with the cursor on a blank line below it. */\nexport class TerminalProgress {\n private lines: string[] = [];\n private content: string[] = [];\n private footer: string[] = [];\n\n constructor(private io: ProgressIO) {}\n\n private erase(): string {\n if (!this.lines.length) return '';\n const columns = Math.max(1, this.io.columns ?? 100);\n const occupiedRows = this.lines.reduce(\n (sum, line) => sum + Math.max(1, Math.ceil(stringWidth(line) / columns)),\n 0,\n );\n const rows = Math.min(occupiedRows, Math.max(0, (this.io.rows ?? 24) - 1));\n this.lines = [];\n return `\\r${rows ? `\\u001b[${rows}A` : ''}\\u001b[0J`;\n }\n\n private frame(previousHeight = 0): string {\n const availableRows = Math.max(0, (this.io.rows ?? 24) - 2);\n const columns = Math.max(0, (this.io.columns ?? 100) - 1);\n if (!availableRows || !columns) return '';\n const footer = this.footer.slice(0, availableRows);\n const budget = availableRows - footer.length;\n const overflow = this.content.length > budget;\n const visible = Math.max(0, budget - (overflow ? 1 : 0));\n const body = this.content.slice(0, visible);\n if (overflow && budget > 0)\n body.push(` … ${this.content.length - visible} more rows`);\n const lines = [...body, ...footer].map((line) =>\n truncateTerminalLine(line, columns),\n );\n const blanks = Math.max(\n 0,\n Math.min(previousHeight, availableRows) - lines.length,\n );\n this.lines = [...Array.from({ length: blanks }, () => ''), ...lines];\n return this.lines.length ? `${this.lines.join('\\n')}\\n` : '';\n }\n\n render(content: string[], footer: string[]): void {\n this.update(content, footer);\n const previousHeight = this.lines.length;\n const erase = this.erase();\n this.io.write?.(\n `${SYNC_START}${erase}${this.frame(previousHeight)}${SYNC_END}`,\n );\n }\n\n update(content: string[], footer: string[]): void {\n this.content = content;\n this.footer = footer;\n }\n\n /** Insert permanent output above the live block as one synchronized frame. */\n output(message: string, write: (message: string) => void): void {\n this.io.write?.(SYNC_START);\n try {\n const erase = this.erase();\n if (erase) this.io.write?.(erase);\n write(message.endsWith('\\n') ? message : `${message}\\n`);\n const frame = this.frame();\n if (frame) this.io.write?.(frame);\n } finally {\n this.io.write?.(SYNC_END);\n }\n }\n\n clear(): void {\n const erase = this.erase();\n this.content = [];\n this.footer = [];\n if (erase) this.io.write?.(`${SYNC_START}${erase}${SYNC_END}`);\n }\n}\n","import { stripVTControlCharacters } from 'node:util';\nimport type { ConsoleLogEntry, ConsoleLogScope } from '@midscene/shared/logger';\n\nconst oneLine = (text: string): string =>\n stripVTControlCharacters(text).replace(/\\s+/g, ' ').trim();\n\nexport function formatWarningScope(scope?: ConsoleLogScope): string {\n if (!scope) return '';\n const parts = [`[${oneLine(scope.projectName)}]`];\n if (scope.sourcePath) parts.push(oneLine(scope.sourcePath));\n if (scope.caseName) parts.push(oneLine(scope.caseName));\n if (scope.phase) {\n const phase = scope.phase === 'steps' ? 'step' : scope.phase;\n parts.push(\n `${phase}${scope.stepIndex === undefined ? '' : `[${scope.stepIndex + 1}]`}${scope.node ? ` ${oneLine(scope.node)}` : ''}`,\n );\n }\n return `${parts.join(' › ')} · `;\n}\n\n/** Prefer the underlying provider message, excluding stacks and response dumps. */\nfunction errorMessage(error: unknown): string {\n const seen = new Set<unknown>();\n let current = error;\n let message = '';\n let status: number | undefined;\n while (current && typeof current === 'object' && !seen.has(current)) {\n seen.add(current);\n const detail = current as {\n message?: unknown;\n cause?: unknown;\n status?: unknown;\n };\n if (typeof detail.message === 'string') message = detail.message;\n if (typeof detail.status === 'number') status = detail.status;\n current = detail.cause;\n }\n const firstLine = oneLine((message || String(error)).split(/\\r?\\n/)[0]);\n return status && !firstLine.startsWith(String(status))\n ? `${status}: ${firstLine}`\n : firstLine;\n}\n\nexport function formatWarning(entry: ConsoleLogEntry): string {\n const details = entry.warning;\n let message: string;\n if (details?.kind === 'model-request-retry') {\n message = `model request retry ${details.attempt + 1}/${details.maxAttempts} in ${details.delayMs / 1000}s (${oneLine(details.modelName)}): ${errorMessage(details.error)}`;\n } else {\n const error = entry.args?.find((arg) => arg instanceof Error);\n const prefix =\n typeof entry.args?.[0] === 'string'\n ? oneLine(entry.args[0].split(/\\r?\\n/)[0]).replace(/:\\s*$/, '')\n : '';\n message = error\n ? `${prefix ? `${prefix}: ` : ''}${errorMessage(error)}`\n : oneLine(entry.message.split(/\\r?\\n/)[0]);\n message = message.replace(/^\\[midscene:warning\\]\\s*/, '');\n }\n if (message.startsWith('waitForNetworkIdle is skipped for Playwright.'))\n message = 'Playwright: post-action network-idle wait skipped.';\n return message.length > 240 ? `${message.slice(0, 239)}…` : message;\n}\n\nexport function warningKey(entry: ConsoleLogEntry, message: string): string {\n const details = entry.warning;\n if (details?.kind === 'model-request-retry')\n return `${entry.topic}\\n${JSON.stringify(entry.scope)}\\n${details.callId}\\n${details.attempt}`;\n // Repeated compatibility notices are run-wide; errors retain their owner.\n const scope = entry.args?.some((arg) => arg instanceof Error)\n ? JSON.stringify(entry.scope)\n : '';\n return `${entry.topic}\\n${scope}\\n${message}`;\n}\n","import { stripVTControlCharacters } from 'node:util';\nimport type { TestRunReportMetrics } from '@midscene/core';\nimport type {\n CaseRunOutcome,\n CaseRunResult,\n StepExecutionInfo,\n} from '@midscene/core/internal/test-runner';\nimport type { ConsoleLogEntry } from '@midscene/shared/logger';\nimport chalk from 'chalk';\nimport stringWidth from 'string-width';\nimport { version } from '../../package.json';\nimport { formatCliError } from './error-format';\nimport { type CliFailureContext, formatFailureDetails } from './failure-format';\nimport { CliModelUsage, formatModelUsage } from './model-usage';\nimport type { TestReporterEvent } from './reporter-events';\nimport { TerminalProgress, truncateTerminalLine } from './terminal-progress';\nimport type {\n TestExecutionProjectRunResult,\n TestProjectRunResult,\n} from './types';\nimport {\n formatWarning,\n formatWarningScope,\n warningKey,\n} from './warning-format';\n\nexport type TerminalReporterMode = 'default' | 'verbose';\nexport interface ReporterIO {\n log(message: string): void;\n error(message: string): void;\n write?(message: string): void;\n isTTY?: boolean;\n columns?: number;\n rows?: number;\n onResize?(listener: () => void): () => void;\n}\nconst oneLine = (value: string) =>\n stripVTControlCharacters(value).replace(/\\s+/g, ' ').trim();\nexport const formatDuration = (ms: number): string => {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n return `${Math.floor(ms / 60_000)}m ${Math.floor((ms % 60_000) / 1000)}s`;\n};\nconst identity = (project: string, path: string, name?: string) =>\n `[${oneLine(project)}] ${oneLine(path)}${name ? ` › ${oneLine(name)}` : ''}`;\nconst projectPhaseLabel = (phase: 'setup' | 'teardown') =>\n phase === 'setup' ? 'setting up' : 'cleaning up';\ninterface FileState {\n projectName: string;\n sourcePath: string;\n total: number;\n outcomes: Map<string, CaseRunOutcome>;\n attemptOutcomes: Map<string, CaseRunOutcome>;\n started: boolean;\n printed: boolean;\n status?: 'success' | 'failed' | 'not-run';\n durationMs: number;\n retries: number;\n completionOrder: number;\n}\ninterface ActiveTask {\n file: FileState;\n name?: string;\n step?: string;\n since: number;\n attempt: number;\n maxAttempts?: number;\n runId?: string;\n phase?: string;\n stepIndex?: number;\n caseIndex?: number;\n warning?: string;\n}\ntype LiveChild =\n | { outcome: CaseRunOutcome }\n | { task: ActiveTask }\n | { summary: string; failed: boolean };\ntype LiveMode = 'full' | 'recent' | 'compact' | 'active';\n\n// Document status describes its lifecycle; failed Cases must also fail the file.\nconst fileStatus = (\n status: FileState['status'],\n cases: readonly CaseRunOutcome[],\n): FileState['status'] => {\n if (status === 'failed' || cases.some((item) => item.status === 'failed'))\n return 'failed';\n if (cases.length && cases.every((item) => item.status === 'not-run'))\n return 'not-run';\n if (cases.some((item) => item.status === 'not-run')) return 'failed';\n return status ?? (cases.length ? 'success' : 'not-run');\n};\n\nexport class TerminalReporter {\n private total = 0;\n private completionOrder = 0;\n private totalFiles = 0;\n private files = new Map<string, FileState>();\n private warnings = new Map<string, { scope: string; message: string }>();\n private latestNotice?: string;\n private usage = new CliModelUsage();\n private finalMetrics?: TestRunReportMetrics;\n private attempts = new Map<string, { run: CaseRunResult; max: number }>();\n private active = new Map<string, ActiveTask>();\n private projectPhases = new Map<\n string,\n { phase: 'setup' | 'teardown'; since: number }\n >();\n private failures: {\n source: string;\n error: unknown;\n context?: CliFailureContext;\n }[] = [];\n private lastOutput = Date.now();\n private startedAt = Date.now();\n private timer?: ReturnType<typeof setInterval>;\n private scheduled?: ReturnType<typeof setTimeout>;\n private progressView: TerminalProgress;\n private removeResizeListener?: () => void;\n private color;\n\n constructor(\n private io: ReporterIO,\n readonly mode: TerminalReporterMode = 'default',\n ) {\n this.progressView = new TerminalProgress(io);\n this.color = new chalk.Instance({\n level: io.isTTY && !process.env.NO_COLOR ? 1 : 0,\n });\n }\n private get interactive(): boolean {\n return !!this.io.isTTY && !!this.io.write && this.mode === 'default';\n }\n private log(message: string): void {\n if (this.interactive)\n this.output(`${message}\\n`, (text) => this.io.write!(text));\n else this.io.log(message);\n this.lastOutput = Date.now();\n }\n /** Called only by the standalone CLI's scoped stdout/stderr capture. */\n output(message: string, write: (message: string) => void): void {\n this.renderProgress(false);\n this.progressView.output(message, write);\n this.lastOutput = Date.now();\n }\n progress(message: string): void {\n if (this.mode === 'verbose') this.log(message);\n }\n console(entry: ConsoleLogEntry): void {\n if (entry.type === 'report') {\n if (this.mode === 'verbose') this.log(entry.message);\n return;\n }\n const scope = formatWarningScope(entry.scope);\n if (this.mode === 'verbose') {\n const kind =\n entry.warning?.kind === 'model-request-retry'\n ? 'model request retry · '\n : entry.warning?.kind === 'model-request-detail'\n ? 'model request error · '\n : '';\n this.log(`WARN ${scope}${kind}${entry.message}`);\n return;\n }\n // The request retry notice carries this failure once; terminal failures\n // are presented with their Case result and final failure details.\n if (entry.warning?.kind === 'model-request-detail') return;\n const message = formatWarning(entry);\n const key = warningKey(entry, message);\n if (this.warnings.has(key)) return;\n this.warnings.set(key, { scope, message });\n if (this.interactive) {\n let attached = false;\n if (entry.warning?.kind === 'model-request-retry' && entry.scope) {\n const owner = entry.scope;\n for (const [id, task] of this.active) {\n if (\n task.file.projectName !== owner.projectName ||\n (owner.sourcePath && task.file.sourcePath !== owner.sourcePath) ||\n (owner.caseId && id !== owner.caseId) ||\n (owner.runId && task.runId !== owner.runId) ||\n (owner.phase && task.phase !== owner.phase) ||\n (owner.stepIndex !== undefined &&\n task.stepIndex !== owner.stepIndex)\n )\n continue;\n task.warning = message;\n attached = true;\n }\n }\n if (!attached)\n this.latestNotice = message.startsWith('Playwright:')\n ? 'Playwright: network-idle wait skipped.'\n : `${scope}${message}`;\n this.schedule();\n return;\n }\n this.log(`${this.color.yellow('WARN')} ${this.color.dim(scope)}${message}`);\n }\n\n private file(projectName: string, sourcePath: string, total = 0): FileState {\n const key = `${projectName}\\0${sourcePath}`;\n let file = this.files.get(key);\n if (!file) {\n file = {\n projectName,\n sourcePath,\n total,\n outcomes: new Map(),\n attemptOutcomes: new Map(),\n started: false,\n printed: false,\n durationMs: 0,\n retries: 0,\n completionOrder: 0,\n };\n this.files.set(key, file);\n }\n file.total = Math.max(file.total, total);\n return file;\n }\n\n event(event: TestReporterEvent): void {\n if (event.type === 'run-start') {\n this.total = event.cases;\n this.totalFiles = event.documents;\n this.startedAt = event.startedAt\n ? Date.parse(event.startedAt)\n : Date.now();\n for (const file of event.files ?? [])\n this.file(file.projectName, file.sourcePath, file.cases);\n const c = this.color;\n this.log(\n `\\n ${c.bgGreen.black.bold(' RUN ')} ${c.green(`midscene-test v${version}`)} ${c.dim(oneLine(event.projectRoot ?? process.cwd()))}`,\n );\n this.log(\n ` ${c.dim(`${event.projects} projects · ${event.documents} files · ${event.cases} cases`)}`,\n );\n if (\n event.maxConcurrentProjects !== undefined &&\n event.maxConcurrentFiles !== undefined\n )\n this.log(\n ` ${c.dim(`Concurrency ${event.maxConcurrentProjects ?? 'unlimited'} projects · ${event.maxConcurrentFiles ?? 'unlimited'} files (global limits)`)}`,\n );\n if (event.configPath)\n this.log(` ${c.dim(`Config ${oneLine(event.configPath)}`)}`);\n for (const model of event.configuredModels ?? [])\n this.log(\n ` ${c.dim('Models (env)')} ${oneLine(model.name)} ${c.dim(`· ${model.intents.map(oneLine).join(', ')}`)}`,\n );\n this.log('');\n if (this.mode === 'default') {\n this.timer = setInterval(\n () => this.tick(),\n this.interactive ? 1000 : 30_000,\n );\n this.timer.unref();\n if (this.interactive)\n this.removeResizeListener = this.io.onResize?.(() =>\n this.renderProgress(),\n );\n this.renderProgress();\n }\n } else if (event.type === 'project-end') {\n this.completeProject(event.project);\n this.schedule();\n } else if (event.type === 'project-phase') {\n if (event.phase === 'running')\n this.projectPhases.delete(event.projectName);\n else\n this.projectPhases.set(event.projectName, {\n phase: event.phase,\n since: Date.now(),\n });\n this.schedule();\n } else if (event.type === 'document-start') {\n this.file(event.projectName, event.sourcePath, event.cases).started =\n true;\n this.schedule();\n } else if (event.type === 'document-end') {\n const file = this.file(\n event.document.projectName,\n event.document.sourcePath,\n event.cases.length,\n );\n file.status = fileStatus(event.document.status, event.cases);\n file.started = true;\n file.completionOrder = ++this.completionOrder;\n file.durationMs = event.durationMs;\n file.retries = event.document.attemptIndex ?? 0;\n file.outcomes = new Map(\n event.cases.map((outcome) => [outcome.caseId, outcome]),\n );\n file.attemptOutcomes.clear();\n for (const [key, task] of this.active)\n if (task.file === file) this.active.delete(key);\n if (!this.interactive) this.printFile(file);\n this.schedule();\n } else if (event.type === 'step-start') {\n this.startStep(event.projectName, event.info);\n } else if (event.type === 'step-end') {\n if (event.result) this.usage.add(event.result);\n const key =\n event.info.scope === 'case'\n ? event.info.case.caseId\n : event.info.document.documentId;\n const task = this.active.get(key);\n if (task) {\n if (event.info.scope === 'document') this.active.delete(key);\n else {\n task.step = undefined;\n task.warning = undefined;\n }\n }\n this.schedule();\n } else if (event.type === 'case-attempt-end') {\n this.attempts.set(event.attempt.caseId, {\n run: event.attempt,\n max: event.maxAttempts,\n });\n } else if (event.type === 'case-end' || event.type === 'case-progress') {\n const file = this.file(\n event.outcome.projectName,\n event.outcome.sourcePath,\n );\n if (event.type === 'case-progress') {\n file.attemptOutcomes.set(event.outcome.caseId, event.outcome);\n file.retries = Math.max(file.retries, event.documentAttemptIndex);\n } else {\n file.attemptOutcomes.delete(event.outcome.caseId);\n file.outcomes.set(event.outcome.caseId, event.outcome);\n file.retries = Math.max(file.retries, event.documentRetries ?? 0);\n }\n this.active.delete(event.outcome.caseId);\n this.schedule();\n } else if (event.type === 'document-retry') {\n const file = this.file(\n event.document.projectName,\n event.document.sourcePath,\n );\n file.outcomes.clear();\n file.attemptOutcomes.clear();\n file.status = undefined;\n file.completionOrder = 0;\n for (const [key, task] of this.active)\n if (task.file === file) this.active.delete(key);\n this.log(\n this.color.yellow(\n ` ↻ ${identity(file.projectName, file.sourcePath)} · file retry ${(event.document.attemptIndex ?? 0) + 2}/${event.maxAttempts}`,\n ),\n );\n this.schedule();\n }\n }\n\n private startStep(projectName: string, info: StepExecutionInfo): void {\n const position = info.scope === 'case' ? info.case : info.document;\n const file = this.file(projectName, position.sourcePath);\n file.started = true;\n const key =\n info.scope === 'case' ? info.case.caseId : info.document.documentId;\n const attempt = info.scope === 'case' ? info.case.attemptIndex : 0;\n const previous = this.attempts.get(key);\n if (previous && previous.run.attemptIndex < attempt) {\n this.attempts.delete(key);\n if (this.mode === 'default' && !this.interactive)\n this.log(\n this.color.yellow(\n ` ↻ ${identity(projectName, position.sourcePath, info.scope === 'case' ? info.case.name : undefined)} · case retry · attempt ${attempt + 1}/${previous.max}`,\n ),\n );\n }\n const existing = this.active.get(key);\n const now = Date.now();\n this.active.set(key, {\n file,\n name: info.scope === 'case' ? info.case.name : undefined,\n step: `${position.phase === 'steps' ? 'step' : position.phase} ${position.stepIndex + 1}/${info.stepCount} · ${oneLine(info.node)}`,\n since: existing?.attempt === attempt ? existing.since : now,\n attempt,\n maxAttempts: previous?.max ?? existing?.maxAttempts,\n runId:\n info.scope === 'case' ? info.case.runId : info.document.documentRunId,\n phase: position.phase,\n stepIndex: position.stepIndex,\n caseIndex: info.scope === 'case' ? info.case.caseIndex : undefined,\n });\n this.schedule();\n }\n\n private schedule(): void {\n if (!this.interactive || !this.timer || this.scheduled) return;\n this.scheduled = setTimeout(() => {\n this.scheduled = undefined;\n this.renderProgress();\n }, 100);\n this.scheduled.unref();\n }\n private counts(items: readonly { status?: string }[], total: number): string {\n const failed = items.filter((item) => item.status === 'failed').length;\n const passed = items.filter((item) => item.status === 'success').length;\n const notRun = items.filter((item) => item.status === 'not-run').length;\n return this.stateCounts(passed, failed, notRun, total);\n }\n private stateCounts(\n passed: number,\n failed: number,\n notRun: number,\n total: number,\n ): string {\n const c = this.color;\n return (\n [\n failed ? c.red.bold(`${failed} failed`) : '',\n c.green.bold(`${passed} passed`),\n notRun ? c.yellow(`${notRun} not run`) : '',\n ]\n .filter(Boolean)\n .join(c.dim(' | ')) + c.dim(` (${total})`)\n );\n }\n private footer(\n durationMs = Date.now() - this.startedAt,\n result?: TestProjectRunResult,\n ): string[] {\n const files = [...this.files.values()];\n const cases = files.flatMap((file) => [...file.outcomes.values()]);\n const c = this.color;\n const metrics = result ? this.finalMetrics : this.usage.snapshot();\n return [\n ` ${c.dim('Test Files')} ${this.counts(files, this.totalFiles)}`,\n ` ${c.dim(' Cases')} ${result ? this.stateCounts(result.summary.passed, result.summary.failed, result.summary.notRun, result.summary.total) : this.counts(cases, this.total)}`,\n ` ${c.dim(' Start at')} ${new Date(this.startedAt).toLocaleTimeString('en-GB', { hour12: false })}`,\n ` ${c.dim(' Duration')} ${formatDuration(durationMs)}`,\n ...formatModelUsage(metrics).map(\n (model, index) =>\n ` ${c.dim(index ? ' ' : ' Models:')} ${model}`,\n ),\n ...(!result || this.warnings.size\n ? [\n ` ${c.dim(' Warnings')} ${this.warnings.size ? c.yellow(String(this.warnings.size)) : c.dim('0')}${!result && this.latestNotice ? c.dim(` · ${this.latestNotice}`) : ''}`,\n ]\n : []),\n ];\n }\n private renderProgress(render = true): void {\n if (!this.interactive || !this.timer) return;\n const projects = new Map<string, FileState[]>();\n const files = [...this.files.values()]\n .filter((file) => file.started && !file.printed)\n .sort(\n (a, b) =>\n a.projectName.localeCompare(b.projectName) ||\n a.sourcePath.localeCompare(b.sourcePath),\n );\n for (const file of files) {\n const group = projects.get(file.projectName) ?? [];\n group.push(file);\n projects.set(file.projectName, group);\n }\n for (const projectName of this.projectPhases.keys())\n if (!projects.has(projectName)) projects.set(projectName, []);\n const footer = this.footer();\n const budget = Math.max(0, (this.io.rows ?? 24) - 2 - footer.length - 1);\n let lines = this.liveTree(projects, 'full');\n if (lines.length > budget) lines = this.liveTree(projects, 'recent');\n if (lines.length > budget) lines = this.liveTree(projects, 'compact');\n if (lines.length > budget) lines = this.liveTree(projects, 'active');\n if (lines.length) lines.push('');\n if (render) this.progressView.render(lines, footer);\n else this.progressView.update(lines, footer);\n }\n\n private liveTree(\n projects: Map<string, FileState[]>,\n mode: LiveMode,\n ): string[] {\n const c = this.color;\n const lines: string[] = [];\n const groups = [...projects];\n const isActive = ([projectName, files]: [string, FileState[]]) =>\n this.projectPhases.has(projectName) || files.some((file) => !file.status);\n if (mode !== 'full')\n groups.sort((a, b) => Number(isActive(b)) - Number(isActive(a)));\n for (const [projectName, files] of groups) {\n const phase = this.projectPhases.get(projectName);\n const running = files.filter((file) => !file.status);\n const completed = files.filter((file) => file.status);\n const recent = [...completed]\n .sort((a, b) => b.completionOrder - a.completionOrder)\n .slice(0, mode === 'recent' ? 1 : 0);\n const visible = mode === 'full' ? files : [...running, ...recent];\n const hidden = completed.filter((file) => !visible.includes(file));\n const hiddenFailures = hidden.filter(\n (file) => file.status === 'failed',\n ).length;\n const details = [\n phase\n ? c.yellow(\n `${projectPhaseLabel(phase.phase)} ${formatDuration(Date.now() - phase.since)}`,\n )\n : '',\n c.yellow(\n `${running.length} ${running.length === 1 ? 'file' : 'files'} running`,\n ),\n completed.length ? c.dim(`${completed.length} completed`) : '',\n mode === 'active' && hiddenFailures\n ? c.red(`${hiddenFailures} failed`)\n : '',\n ].filter(Boolean);\n lines.push(\n this.liveRow(\n ` ${c.yellow('❯')} ${c.bold(oneLine(projectName))}`,\n c.dim(' · ') + details.join(c.dim(' · ')),\n ),\n );\n for (const [fileIndex, file] of visible.entries()) {\n const lastFile =\n fileIndex === visible.length - 1 &&\n (!hidden.length || mode === 'active');\n const stem = lastFile ? ' ' : ` ${c.dim('│')} `;\n const outcomes = [\n ...new Map([...file.attemptOutcomes, ...file.outcomes]).values(),\n ].sort((a, b) => a.caseIndex - b.caseIndex);\n const failedCases = outcomes.filter(\n (outcome) => outcome.status === 'failed',\n ).length;\n lines.push(\n this.liveRow(\n ` ${c.dim(lastFile ? '└─' : '├─')} ${file.status ? `${this.statusSymbol(file.status)} ` : ''}${oneLine(file.sourcePath)}`,\n ` ${c.dim(`${outcomes.length}/${file.total} cases`)}${file.status ? c.dim(` ${formatDuration(file.durationMs)}`) : ''}${mode === 'active' && failedCases ? c.red(` · ${failedCases} failed`) : ''}`,\n ),\n );\n const tasks = [...this.active.values()].filter(\n (task) => task.file === file,\n );\n const shown =\n mode === 'full'\n ? outcomes\n : mode === 'recent'\n ? outcomes.slice(-1)\n : [];\n const children: LiveChild[] = [\n ...tasks.map((task) => ({ task })),\n ...shown.map((outcome) => ({ outcome })),\n ];\n if (mode === 'full')\n children.sort(\n (a, b) => this.liveChildIndex(a) - this.liveChildIndex(b),\n );\n const hiddenCases = outcomes.filter(\n (outcome) => !shown.includes(outcome),\n );\n if (hiddenCases.length && mode !== 'active') {\n const failed = hiddenCases.filter(\n (outcome) => outcome.status === 'failed',\n ).length;\n children.push({\n summary: `… ${hiddenCases.length} completed ${hiddenCases.length === 1 ? 'case' : 'cases'}${failed ? ` · ${failed} failed` : ''}`,\n failed: failed > 0,\n });\n }\n for (const [index, child] of children.entries()) {\n const last = index === children.length - 1;\n const prefix = `${stem}${c.dim(last ? '└─' : '├─')} `;\n if ('outcome' in child) {\n lines.push(\n this.liveRow(\n `${prefix}${this.formatCaseResult(child.outcome, file.retries)}`,\n '',\n ),\n );\n continue;\n }\n if ('summary' in child) {\n lines.push(\n this.liveRow(\n `${prefix}${child.failed ? c.red(child.summary) : c.dim(child.summary)}`,\n '',\n ),\n );\n continue;\n }\n const { task } = child;\n const hint =\n task.name && task.step\n ? truncateTerminalLine(\n ` · ${task.step}`,\n Math.floor(Math.max(0, (this.io.columns ?? 100) - 1) / 2),\n )\n : '';\n const retry = task.attempt\n ? ` · attempt ${task.attempt + 1}${task.maxAttempts ? `/${task.maxAttempts}` : ''}`\n : '';\n lines.push(\n this.liveRow(\n `${prefix}${oneLine(task.name ?? task.step ?? 'file lifecycle')}`,\n `${c.dim(hint)} ${c.yellow(formatDuration(Date.now() - task.since))}${c.yellow(retry)}`,\n ),\n );\n if (task.warning)\n lines.push(\n this.liveRow(\n `${stem}${last ? ' ' : `${c.dim('│')} `}${c.dim('└─')} ${c.yellow(`⚠ ${task.warning}`)}`,\n '',\n ),\n );\n }\n }\n if (hidden.length && mode !== 'active') {\n const summary = `… ${hidden.length} completed ${hidden.length === 1 ? 'file' : 'files'}${hiddenFailures ? ` · ${hiddenFailures} failed` : ''}`;\n lines.push(\n this.liveRow(\n ` ${c.dim('└─')} ${hiddenFailures ? c.red(summary) : c.dim(summary)}`,\n '',\n ),\n );\n }\n }\n return lines;\n }\n\n private liveChildIndex(child: LiveChild): number {\n if ('outcome' in child) return child.outcome.caseIndex;\n if ('summary' in child) return Number.MAX_SAFE_INTEGER;\n return (\n child.task.caseIndex ??\n (child.task.phase === 'beforeAll' ? -1 : Number.MAX_SAFE_INTEGER)\n );\n }\n\n private liveRow(label: string, suffix: string): string {\n const columns = Math.max(0, (this.io.columns ?? 100) - 1);\n const tail = truncateTerminalLine(suffix, columns);\n return truncateTerminalLine(label, columns - stringWidth(tail)) + tail;\n }\n private tick(): void {\n if (this.interactive) {\n this.renderProgress();\n return;\n }\n if (\n (this.active.size || this.projectPhases.size) &&\n Date.now() - this.lastOutput >= 30_000\n )\n this.log(\n `… Still running: ${[\n ...[...this.projectPhases].map(\n ([projectName, phase]) =>\n `[${oneLine(projectName)}] · ${projectPhaseLabel(phase.phase)} (${formatDuration(Date.now() - phase.since)})`,\n ),\n ...[...this.active.values()].map(\n (task) =>\n `${identity(task.file.projectName, task.file.sourcePath, task.name)} · ${task.step ?? 'between steps'} (${formatDuration(Date.now() - task.since)})`,\n ),\n ].join(' | ')}`,\n );\n }\n\n private formatCaseResult(\n outcome: CaseRunOutcome,\n documentRetries: number,\n ): string {\n const c = this.color;\n const attempts = outcome.attempts ?? (outcome.run ? [outcome.run] : []);\n const retries = Math.max(\n attempts.length - 1,\n outcome.run?.attemptIndex ?? 0,\n );\n const duration = formatDuration(\n attempts.reduce((sum, attempt) => sum + attempt.durationMs, 0),\n );\n const symbol =\n outcome.status === 'success'\n ? c.green('✓')\n : outcome.status === 'failed'\n ? c.red('×')\n : c.yellow('–');\n const detail =\n outcome.status === 'not-run'\n ? c.dim(` · ${outcome.notRunReason ?? 'not run'}`)\n : ` ${c.dim(duration)}${retries ? c.yellow(` · ${outcome.status === 'success' ? 'passed after retry' : 'failed after retries'} (${retries + 1} attempts)`) : documentRetries ? c.yellow(` · file retried ${documentRetries}x`) : ''}`;\n return `${symbol} ${oneLine(outcome.name)}${detail}`;\n }\n private statusSymbol(status: FileState['status']): string {\n return status === 'failed'\n ? this.color.red('×')\n : status === 'not-run'\n ? this.color.yellow('–')\n : this.color.green('✓');\n }\n\n private resultFileLines(file: FileState, lastFile: boolean): string[] {\n const c = this.color;\n const stem = lastFile ? ' ' : ` ${c.dim('│')} `;\n const cases = [...file.outcomes.values()].sort(\n (a, b) => a.caseIndex - b.caseIndex,\n );\n const failed = cases.filter((item) => item.status === 'failed').length;\n const notRun = cases.filter((item) => item.status === 'not-run').length;\n const stats = `(${cases.length} cases${failed ? ` | ${failed} failed` : ''}${notRun ? ` | ${notRun} not run` : ''})`;\n return [\n ` ${c.dim(lastFile ? '└─' : '├─')} ${this.statusSymbol(file.status)} ${c.bold(oneLine(file.sourcePath))} ${c.dim(stats)} ${c.dim(formatDuration(file.durationMs))}`,\n ...cases.map(\n (item, caseIndex) =>\n `${stem}${c.dim(caseIndex === cases.length - 1 ? '└─' : '├─')} ${this.formatCaseResult(item, file.retries)}`,\n ),\n ];\n }\n\n private printFile(file: FileState): void {\n if (file.printed) return;\n file.printed = true;\n this.log(\n [\n '',\n ` ${this.color.bold(oneLine(file.projectName))}`,\n ...this.resultFileLines(file, true),\n ].join('\\n'),\n );\n }\n\n private printProject(\n projectName: string,\n files: readonly FileState[],\n failed: boolean,\n ): void {\n if (!files.length || files.every((file) => file.printed)) return;\n const c = this.color;\n const status =\n failed || files.some((file) => file.status === 'failed')\n ? 'failed'\n : files.every((file) => file.status === 'not-run')\n ? 'not-run'\n : files.some((file) => file.status === 'not-run')\n ? 'failed'\n : 'success';\n const lines = [\n '',\n ` ${this.statusSymbol(status)} ${c.bold(oneLine(projectName))} ${c.dim(`(${files.length} ${files.length === 1 ? 'file' : 'files'})`)}`,\n ];\n for (const [index, file] of files.entries()) {\n if (file.printed) continue;\n file.printed = true;\n lines.push(...this.resultFileLines(file, index === files.length - 1));\n }\n this.log(lines.join('\\n'));\n }\n\n failure(source: string, error: unknown, context?: CliFailureContext): void {\n this.failures.push({ source, error, context });\n }\n\n private completeProject(project: TestExecutionProjectRunResult): void {\n this.projectPhases.delete(project.name);\n const projectFiles = new Set<FileState>();\n const documents = new Map(\n project.documents.map((document) => [document.documentId, document]),\n );\n const resultSources = new Set([\n ...project.cases.map((outcome) => outcome.sourcePath),\n ...project.documents.map((document) => document.sourcePath),\n ...project.collectionErrors.map((error) => error.sourcePath),\n ]);\n // Preserve plan order for selected files and actual results, excluding\n // files whose Cases were all filtered out before execution.\n for (const plan of project.plans ?? []) {\n const selected = plan.cases.filter((item) => item.selected).length;\n if (selected || resultSources.has(plan.sourcePath))\n projectFiles.add(this.file(project.name, plan.sourcePath, selected));\n }\n for (const outcome of project.cases)\n this.file(project.name, outcome.sourcePath).outcomes.set(\n outcome.caseId,\n outcome,\n );\n for (const document of documents.values()) {\n const file = this.file(project.name, document.sourcePath);\n file.status = document.status;\n file.retries = document.attemptIndex ?? 0;\n file.durationMs = project.documents\n .filter((item) => item.documentId === document.documentId)\n .reduce((sum, item) => sum + item.durationMs, 0);\n }\n for (const error of project.collectionErrors)\n this.file(project.name, error.sourcePath).status = 'failed';\n for (const file of this.files.values())\n if (file.projectName === project.name) {\n file.attemptOutcomes.clear();\n const cases = [...file.outcomes.values()];\n file.status = fileStatus(file.status, cases);\n projectFiles.add(file);\n }\n for (const [key, task] of this.active)\n if (task.file.projectName === project.name) this.active.delete(key);\n if (this.interactive)\n this.printProject(\n project.name,\n [...projectFiles],\n project.status === 'failed',\n );\n else for (const file of projectFiles) this.printFile(file);\n }\n\n finish(result: TestProjectRunResult): void {\n this.dispose();\n this.finalMetrics = result.metrics ?? this.usage.snapshot();\n if (result.startedAt) this.startedAt = Date.parse(result.startedAt);\n for (const project of result.projects) this.completeProject(project);\n this.total = result.summary.total;\n this.totalFiles = this.files.size;\n }\n\n private sectionHeading(label: string, kind: 'warning' | 'failure'): void {\n const c = this.color;\n const width = Math.max(0, (this.io.columns ?? 80) - 2);\n const title = truncateTerminalLine(` ${label} `, width);\n const padding = Math.max(0, width - stringWidth(title));\n const left = Math.floor(padding / 2);\n const line = kind === 'warning' ? c.yellow : c.red;\n const badge =\n kind === 'warning' ? c.bgYellow.black.bold : c.bgRed.white.bold;\n this.log(\n `\\n ${line('─'.repeat(left))}${badge(title)}${line('─'.repeat(padding - left))}\\n`,\n );\n }\n\n summary(result: TestProjectRunResult): void {\n const c = this.color;\n if (this.interactive && this.warnings.size) {\n this.sectionHeading(`Warnings ${this.warnings.size}`, 'warning');\n for (const warning of [...this.warnings.values()].slice(0, 5))\n this.log(\n ` ${c.yellow('WARN')} ${c.dim(warning.scope)}${warning.message}`,\n );\n if (this.warnings.size > 5)\n this.log(\n c.dim(\n ` … ${this.warnings.size - 5} more warnings; see debug logs or --reporter verbose.`,\n ),\n );\n }\n if (this.failures.length) {\n this.sectionHeading(`Failures ${this.failures.length}`, 'failure');\n for (const failure of this.failures) {\n if (this.mode === 'default') {\n const detail = formatFailureDetails(\n failure.source,\n failure.error,\n failure.context,\n );\n const body = detail.body\n .map((line) => {\n if (line.startsWith(' Error:')) return c.red(line);\n if (line.startsWith(' at ')) return c.dim(line);\n return line.replace(\n /^ {2}(?:Step|Location|Attempt|File try|Phase|Input)\\s+/,\n (label) => c.dim(label),\n );\n })\n .join('\\n');\n const block = `${c.bgRed.white.bold(' FAIL ')} ${c.bold(detail.title)}\\n${body}\\n`;\n if (this.interactive) this.log(block);\n else\n this.io.error(`FAIL ${detail.title}\\n${detail.body.join('\\n')}\\n`);\n continue;\n }\n const message = formatCliError(failure.error);\n this.io.error(\n `FAIL midscene-test: ${failure.source}:\\n${message\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n')}\\n`,\n );\n }\n }\n this.log(`\\n${this.footer(result.durationMs, result).join('\\n')}`);\n this.log('');\n this.failures = [];\n }\n\n dispose(): void {\n if (this.timer) clearInterval(this.timer);\n if (this.scheduled) clearTimeout(this.scheduled);\n this.timer = undefined;\n this.scheduled = undefined;\n this.removeResizeListener?.();\n this.removeResizeListener = undefined;\n this.progressView.clear();\n }\n}\n","import { appendFileSync } from 'node:fs';\nimport { relative, resolve, sep } from 'node:path';\nimport { formatDuration } from './terminal-reporter';\nimport type { TestProjectRunResult } from './types';\n\nconst escapeData = (text: string) =>\n text.replace(/%/g, '%25').replace(/\\r/g, '%0D').replace(/\\n/g, '%0A');\nconst escapeProperty = (text: string) =>\n escapeData(text).replace(/:/g, '%3A').replace(/,/g, '%2C');\nconst markdown = (text: string) =>\n text.replace(\n /[&<>`\\r\\n]/g,\n (char) =>\n ({\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '`': '&#96;',\n '\\r': ' ',\n '\\n': ' ',\n })[char]!,\n );\n\n/** Annotations use real source files. Step positions remain in the title when no source line is available. */\nexport function githubFailureAnnotation(\n source: string,\n message: string,\n file?: string,\n): string | undefined {\n if (process.env.GITHUB_ACTIONS !== 'true') return;\n const workspace = process.env.GITHUB_WORKSPACE ?? process.cwd();\n const path = file\n ? relative(workspace, resolve(file)).split(sep).join('/')\n : undefined;\n return `::error ${path ? `file=${escapeProperty(path)},` : ''}title=${escapeProperty(source)}::${escapeData(message)}`;\n}\n\nexport function writeGitHubSummary(result: TestProjectRunResult): void {\n const output = process.env.GITHUB_STEP_SUMMARY;\n if (process.env.GITHUB_ACTIONS !== 'true' || !output) return;\n const failedCases = [\n ...new Map(result.cases.map((item) => [item.caseId, item])).values(),\n ].filter((item) => item.status === 'failed');\n const summary = [\n '## Midscene Test',\n '',\n '| Passed | Failed | Not run | Passed after retry | Duration |',\n '| ---: | ---: | ---: | ---: | ---: |',\n `| ${result.summary.passed} | ${result.summary.failed} | ${result.summary.notRun} | ${result.summary.passedAfterRetry} | ${formatDuration(result.durationMs)} |`,\n '',\n 'Passed after retry is included in Passed.',\n '',\n ...failedCases.map(\n (item) =>\n `- Failed: **${markdown(item.name)}** — ${markdown(item.projectName)}/\\`${markdown(item.sourcePath)}\\``,\n ),\n ...(result.summary.collectionErrors\n ? [`- Collection errors: ${result.summary.collectionErrors}`]\n : []),\n ...(result.summary.documentFailures\n ? [`- Failed files: ${result.summary.documentFailures}`]\n : []),\n ...(result.summary.projectFailures\n ? [`- Failed projects: ${result.summary.projectFailures}`]\n : []),\n '',\n ...(result.reportPath\n ? [`Report artifact entry: \\`${markdown(result.reportPath)}\\``]\n : []),\n `Structured results: \\`${markdown(result.summaryPath)}\\``,\n '',\n ].join('\\n');\n appendFileSync(output, `${summary}\\n`);\n}\n","import { z } from 'zod/v4';\nimport type { NodeDefinition } from '../node/types';\nimport type { TestFileSelection } from './test-project';\n\nexport interface NodeSpecDocument {\n markdown: string;\n warnings: readonly string[];\n}\n\nconst GENERATED_COMMENT =\n '<!-- Generated by `midscene-test nodes`. Do not edit directly. -->';\n\nexport const sortNodesForSpec = (\n nodes: readonly NodeDefinition<any, any, any>[],\n): NodeDefinition<any, any, any>[] => {\n const priority = (name: string) =>\n name === 'aiAct' ? 0 : name === 'aiAssert' ? 1 : 2;\n return [...nodes].sort(\n (left, right) =>\n priority(left.name) - priority(right.name) ||\n (left.name < right.name ? -1 : left.name > right.name ? 1 : 0),\n );\n};\n\nconst escapeTableCell = (value: string): string =>\n value\n .trim()\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\|/g, '\\\\|')\n .replace(/\\r\\n|\\r|\\n/g, '<br>');\n\nconst renderNodeOverview = (\n nodes: readonly NodeDefinition<any, any, any>[],\n): string => {\n const heading = '## Available Nodes';\n if (nodes.length === 0) {\n return `${heading}\\n\\nNo nodes are registered by the current Test Project.`;\n }\n const rows = nodes.map(\n (node) =>\n `| ${escapeTableCell(node.name)} | ${escapeTableCell(node.description || 'Description not declared.')} |`,\n );\n return `${heading}\\n\\nThis table lists all available Nodes. See [Node Details](#node-details) below for each Node's usage and input schema.\\n\\n${['| Node | Description |', '| --- | --- |', ...rows].join('\\n')}`;\n};\n\ninterface NodeSpecLocation {\n configPath?: string;\n projects: readonly { name: string; files: TestFileSelection }[];\n}\n\nconst renderWorkflowLocations = (location?: NodeSpecLocation): string => {\n const sections = [\n '## Where to use these Nodes',\n 'Use these Nodes in Workflow Documents (`.yaml` or `.yml` files) selected by an Execution Project. Case file patterns and the config file path below are relative to this spec file. Case file patterns use glob syntax. A custom `--config` path does not change where case files are selected.',\n 'Projects created by `midscene-test create` select `cases/**/*.{yaml,yml}` by default, so you can write test cases in `cases/example.yaml` or subdirectories of `cases/`. If an Execution Project has no `files` configuration, Midscene Test searches `**/*.{yaml,yml}` recursively instead. Check `projects[].files` in your configuration before choosing a file location.',\n ];\n if (location) {\n sections.push(\n `**Config file:** ${location.configPath ? `\\`${location.configPath}\\`` : 'No config file loaded.'}`,\n );\n for (const project of location.projects) {\n const patterns = project.files.include\n .map((pattern) => `\\`${pattern}\\``)\n .join(', ');\n const projectLabel =\n location.projects.length > 1 || project.name !== 'default'\n ? ` (Execution Project: ${project.name})`\n : '';\n const excludes = project.files.exclude?.length\n ? `; excludes: ${project.files.exclude.map((pattern) => `\\`${pattern}\\``).join(', ')}`\n : '';\n sections.push(`**Case files:** ${patterns}${projectLabel}${excludes}`);\n }\n }\n sections.push(\n 'Files matching `files.exclude` are not selected. Midscene Test always ignores `.git/`, `.midscene/`, `midscene_run/`, and `node_modules/` directories, including nested ones.',\n 'Call a Node in `cases[].steps`, or in the Workflow Document lifecycle steps `beforeAll`, `beforeEach`, `afterEach`, and `afterAll`. Root Nodes are shared defaults; `projects[].nodes` adds local Nodes and overrides same-named root Nodes only within that Execution Project. Each Execution Project supplies its own runtime environment.',\n );\n return sections.join('\\n\\n');\n};\n\nconst WORKFLOW_STEP_CONTRACT = `## Workflow Step Contract\n\nEach step uses a node name as its key. The \\`$\\` object contains engine metadata and is not part of the node input.\n\n\\`\\`\\`yaml\ncases:\n - name: Example case\n steps:\n - node.name:\n prompt: Describe the task.\n $:\n timeout: 30000\n continue-on-error: false\n\\`\\`\\`\n\nA Node may map a string step value to one declared input field. Each Node section states whether it supports this shorthand and names the target field.\n\nEach Node's returned \\`data\\` is saved on that Step's result. Results are not named or automatically passed to later Steps. A failed Case does not stop later Cases by default; \\`test.bail\\` controls early stopping across the run.`;\n\nconst sortJsonValue = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(sortJsonValue);\n if (typeof value !== 'object' || value === null) return value;\n\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))\n .map(([key, child]) => [key, sortJsonValue(child)]),\n );\n};\n\nconst assertSelfContainedRefs = (value: unknown, node: string): void => {\n if (Array.isArray(value)) {\n for (const child of value) assertSelfContainedRefs(child, node);\n return;\n }\n if (typeof value !== 'object' || value === null) return;\n\n for (const [key, child] of Object.entries(value)) {\n if (key === '$ref' && typeof child === 'string' && !child.startsWith('#')) {\n throw new Error(\n `Cannot describe node \"${node}\": inputSchema generated an external $ref.`,\n );\n }\n assertSelfContainedRefs(child, node);\n }\n};\n\nconst toJsonSchema = (node: NodeDefinition<any, any, any>): unknown => {\n try {\n const schema = z.toJSONSchema(node.inputSchema!, {\n target: 'draft-2020-12',\n io: 'input',\n unrepresentable: 'throw',\n cycles: 'ref',\n reused: 'ref',\n });\n assertSelfContainedRefs(schema, node.name);\n return sortJsonValue(schema);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.startsWith(`Cannot describe node \"${node.name}\":`)\n ) {\n throw error;\n }\n throw new Error(\n `Cannot describe node \"${node.name}\": inputSchema contains a Zod type that cannot be represented as JSON Schema.`,\n { cause: error },\n );\n }\n};\n\nconst renderNode = (\n node: NodeDefinition<any, any, any>,\n warnings: string[],\n): string => {\n const sections = [`### \\`${node.name}\\``];\n\n if (node.title) sections.push(`**Title:** ${node.title.trim()}`);\n if (node.description) {\n sections.push(node.description.trim());\n } else {\n warnings.push(`node \"${node.name}\" has no description`);\n sections.push(\n `> Description not declared. Do not infer this node's behavior.`,\n );\n }\n\n if (node.stringInputKey === false || node.stringInputKey === undefined) {\n sections.push('**String shorthand:** Not supported by this Node.');\n } else {\n sections.push(\n `**String shorthand:** Maps to \\`{ ${node.stringInputKey}: value }\\`.`,\n );\n }\n\n sections.push('#### Input Schema');\n if (node.inputSchema) {\n sections.push(\n `\\`\\`\\`json\\n${JSON.stringify(toJsonSchema(node), null, 2)}\\n\\`\\`\\``,\n );\n } else {\n warnings.push(`node \"${node.name}\" has no inputSchema`);\n sections.push(\n '> Input schema not declared. Do not invent input fields for this node.',\n );\n }\n\n return sections.join('\\n\\n');\n};\n\nexport const renderNodeSpec = (\n nodes: readonly NodeDefinition<any, any, any>[],\n location?: NodeSpecLocation,\n): NodeSpecDocument => {\n const warnings: string[] = [];\n const sortedNodes = sortNodesForSpec(nodes);\n const sections = [\n GENERATED_COMMENT,\n '# Midscene Test Node Spec',\n 'This document describes the Nodes available in YAML test files (`.yaml` or `.yml`) for the Midscene Test framework (`@midscene/test`). It lists the Nodes registered by the current Test Project, their inputs, and how to call them in test steps and lifecycle hooks.',\n [\n 'Learn about the framework and YAML test authoring:',\n '',\n '- [Midscene Test overview](https://midscenejs.com/midscene-test/overview): framework concepts and the role of Nodes.',\n '- [Create and use test projects](https://midscenejs.com/midscene-test/use): write YAML cases, run tests, and inspect results.',\n '- [Configure test projects](https://midscenejs.com/midscene-test/configuration): register Nodes, select case files, and manage runtime resources.',\n ].join('\\n'),\n renderNodeOverview(sortedNodes),\n renderWorkflowLocations(location),\n WORKFLOW_STEP_CONTRACT,\n ];\n\n if (sortedNodes.length > 0) {\n sections.push('## Node Details');\n for (const node of sortedNodes) sections.push(renderNode(node, warnings));\n }\n\n return {\n markdown: `${sections.join('\\n\\n')}\\n`,\n warnings,\n };\n};\n","/** CLI-only interception. SDK consumers never have their streams patched. */\nexport function captureTerminalOutput(\n output: (message: string, write: (message: string) => void) => void,\n streams: readonly Pick<NodeJS.WritableStream, 'write'>[] = [\n process.stdout,\n process.stderr,\n ],\n): () => void {\n const cleanups: (() => void)[] = [];\n for (const stream of streams) {\n const original = stream.write;\n const forward = original.bind(stream);\n const intercepted: typeof stream.write = (\n chunk: string | Uint8Array,\n encoding?: BufferEncoding | ((error?: Error | null) => void),\n callback?: (error?: Error | null) => void,\n ): boolean => {\n const done = typeof encoding === 'function' ? encoding : callback;\n const message =\n typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString();\n let accepted = true;\n output(message, (text) => {\n accepted = forward(text, done);\n });\n return accepted;\n };\n stream.write = intercepted;\n cleanups.push(() => {\n if (stream.write === intercepted) stream.write = original;\n });\n }\n return () => {\n for (const cleanup of cleanups) cleanup();\n };\n}\n","import { NodeRegistry as CoreNodeRegistry } from '@midscene/core/internal/test-runner';\nimport type { NodeDefinition } from '../node/types';\n\nexport type NodeRegistry = Omit<\n CoreNodeRegistry,\n 'get' | 'require' | 'register' | 'definitions'\n> & {\n get(name: string): NodeDefinition<any, any> | undefined;\n require(name: string): NodeDefinition<any, any>;\n register<TInput, TData>(node: NodeDefinition<TInput, TData>): NodeRegistry;\n definitions(): readonly NodeDefinition<any, any, any>[];\n};\nexport const NodeRegistry: {\n new (nodes?: readonly NodeDefinition<any, any>[]): NodeRegistry;\n} = CoreNodeRegistry;\n","import { dirname, isAbsolute, resolve, sep } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { require as tsxRequire } from 'tsx/cjs/api';\nimport { NodeRegistry } from '../engine/registry';\nimport type { NodeDefinition } from '../node/types';\n\nimport type {\n FileSetupDefinition,\n JsonValue,\n ProjectSetupDefinition,\n ResolvedExecutionProject,\n TestFileSelection,\n TestTagSelection,\n} from '@midscene/core/internal/test-runner';\nexport type {\n FileSetupContext,\n FileSetupDefinition,\n JsonPrimitive,\n JsonValue,\n ProjectSetupContext,\n ProjectSetupDefinition,\n ProjectTeardown,\n ProjectTeardownContext,\n ResolvedExecutionProject,\n TestFileSelection,\n TestTagSelection,\n} from '@midscene/core/internal/test-runner';\nimport type { ExecutionProjectDefinition as CoreExecutionProjectDefinition } from '@midscene/core/internal/test-runner';\n\nexport type ExecutionProjectDefinition<\n TContext = unknown,\n TProjectContext = TContext,\n> = Omit<\n CoreExecutionProjectDefinition<TProjectContext>,\n 'nodes' | 'fileSetup'\n> & {\n fileSetup?: FileSetupDefinition<TContext, TProjectContext>;\n nodes?: readonly NodeDefinition<any, any, TContext>[];\n};\n\nexport interface TestOptions {\n /** Global active files, including preparation and cleanup. Default 1; null is unlimited. */\n maxConcurrentFiles?: number | null;\n /** Projects from setup through completed cleanup. Default 1; null is unlimited. */\n maxConcurrentProjects?: number | null;\n /** Milliseconds for each Project setup/fileSetup, including device waits. */\n setupTimeout?: number;\n /** Milliseconds per cleanup scope; shared deadline during abnormal shutdown. */\n teardownTimeout?: number;\n bail?: number;\n testTimeout?: number;\n}\n\nexport interface ResolvedTestOptions {\n maxConcurrentFiles: number | null;\n maxConcurrentProjects: number | null;\n setupTimeout: number;\n teardownTimeout: 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\nconst projectIdFromIndex = (index: number): string => `project-${index}`;\n\nexport interface TestProjectDefinition<\n TContext = undefined,\n TProjectContext = TContext,\n> {\n setup?: ProjectSetupDefinition<TProjectContext>;\n fileSetup?: FileSetupDefinition<TContext, TProjectContext>;\n projects?: readonly ExecutionProjectDefinition<TContext, TProjectContext>[];\n test?: TestOptions;\n output?: TestOutputDefinition;\n nodes?: readonly NodeDefinition<any, any, TContext>[];\n}\n\nexport interface LoadedExecutionProject<\n TContext = unknown,\n TProjectContext = TContext,\n> extends ResolvedExecutionProject<TProjectContext> {\n readonly fileSetup?: FileSetupDefinition<TContext, TProjectContext>;\n /** Effective Nodes: globals plus project-local overrides. */\n readonly nodes: NodeRegistry;\n}\n\nexport interface LoadedTestProject<\n TContext = undefined,\n TProjectContext = TContext,\n> {\n projects: readonly LoadedExecutionProject<TContext, TProjectContext>[];\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 = <\n TContext = undefined,\n TProjectContext = TContext,\n>(\n definition: TestProjectDefinition<TContext, TProjectContext>,\n): TestProjectDefinition<TContext, TProjectContext> => definition;\n\nexport const defineProjectSetup = <TProjectContext>(\n definition: ProjectSetupDefinition<TProjectContext>,\n): ProjectSetupDefinition<TProjectContext> => definition;\n\nexport const defineFileSetup = <TContext, TProjectContext = unknown>(\n definition: FileSetupDefinition<TContext, TProjectContext>,\n): FileSetupDefinition<TContext, 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 rejectUnknownKeys(value, ['include', 'exclude'], label);\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 validateSetup = <TSetup>(\n value: unknown,\n label: string,\n): TSetup | undefined => {\n if (value === undefined) return undefined;\n if (!isRecord(value)) {\n throw new TypeError(`Midscene config ${label} must be an object.`);\n }\n rejectUnknownKeys(value, ['name', 'setup'], label);\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 return value as unknown as TSetup;\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 validateConcurrency = (value: unknown, label: string): number | null => {\n if (value === null) return null;\n return validatePositiveInteger(value, 1, label);\n};\n\nconst validateFileConcurrency = (\n maxConcurrentFiles: number,\n fileSetup: unknown,\n label: string,\n): void => {\n if (maxConcurrentFiles > 1 && !fileSetup) {\n throw new TypeError(\n `Midscene config ${label}.fileSetup is required when the effective maxConcurrentFiles is greater than 1.`,\n );\n }\n};\n\nconst validateExecutionProjects = <TContext, TProjectContext>(\n value: unknown,\n defaultSetup: unknown,\n defaultFileSetup: unknown,\n globalNodes: NodeRegistry,\n test: ResolvedTestOptions,\n): {\n projects: readonly LoadedExecutionProject<TContext, TProjectContext>[];\n hasExplicitProjects: boolean;\n} => {\n if (value === undefined) {\n const setup = validateSetup<ProjectSetupDefinition<TProjectContext>>(\n defaultSetup,\n 'setup',\n );\n const fileSetup = validateSetup<\n FileSetupDefinition<TContext, TProjectContext>\n >(defaultFileSetup, 'fileSetup');\n const maxConcurrentFiles =\n test.maxConcurrentFiles ?? Number.POSITIVE_INFINITY;\n validateFileConcurrency(maxConcurrentFiles, fileSetup, 'default');\n return {\n hasExplicitProjects: false,\n projects: Object.freeze([\n Object.freeze({\n projectId: projectIdFromIndex(0),\n name: 'default',\n ...(setup ? { setup } : {}),\n ...(fileSetup ? { fileSetup } : {}),\n maxConcurrentFiles,\n tags: Object.freeze({ include: [], exclude: [] }),\n retry: 0,\n variables: Object.freeze({}),\n nodes: new NodeRegistry(globalNodes.definitions()),\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 (defaultFileSetup !== undefined) {\n throw new TypeError(\n 'Midscene config fileSetup cannot be used together with projects. Move fileSetup to projects[].fileSetup.',\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 [\n 'name',\n 'setup',\n 'fileSetup',\n 'maxConcurrentFiles',\n 'nodes',\n 'files',\n 'tags',\n 'retry',\n 'variables',\n ],\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 files = validateTestFileSelection(candidate.files, `${label}.files`);\n if (candidate.nodes !== undefined && !Array.isArray(candidate.nodes)) {\n throw new TypeError(`Midscene config ${label}.nodes must be an array.`);\n }\n const localNodes = new NodeRegistry(\n candidate.nodes as NodeDefinition[] | undefined,\n );\n const nodes = new NodeRegistry([\n ...globalNodes.definitions().filter((node) => !localNodes.has(node.name)),\n ...localNodes.definitions(),\n ]);\n const fileSetup = validateSetup<\n FileSetupDefinition<TContext, TProjectContext>\n >(candidate.fileSetup, `${label}.fileSetup`);\n const globalFileLimit = test.maxConcurrentFiles ?? Number.POSITIVE_INFINITY;\n const maxConcurrentFiles = Math.min(\n globalFileLimit,\n validatePositiveInteger(\n candidate.maxConcurrentFiles,\n globalFileLimit,\n `${label}.maxConcurrentFiles`,\n ),\n );\n validateFileConcurrency(maxConcurrentFiles, fileSetup, label);\n return Object.freeze({\n projectId: projectIdFromIndex(index),\n name: candidate.name,\n nodes,\n ...(fileSetup ? { fileSetup } : {}),\n maxConcurrentFiles,\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: validateSetup<ProjectSetupDefinition<TProjectContext>>(\n candidate.setup,\n `${label}.setup`,\n )!,\n }),\n });\n });\n return { projects: Object.freeze(projects), hasExplicitProjects: true };\n};\n\nconst validateTestOptions = (\n value: unknown,\n hasExplicitProjects: boolean,\n): ResolvedTestOptions => {\n if (value !== undefined && !isRecord(value)) {\n throw new TypeError('Midscene config test must be an object.');\n }\n const candidate = (value ?? {}) as Record<string, unknown>;\n if (candidate.maxConcurrency !== undefined) {\n const limit =\n typeof candidate.maxConcurrency === 'number' &&\n Number.isInteger(candidate.maxConcurrency) &&\n candidate.maxConcurrency > 0\n ? candidate.maxConcurrency\n : 1;\n throw new TypeError(\n [\n 'Midscene config test.maxConcurrency is no longer supported.',\n 'It controlled project concurrency, not file concurrency. Remove it and use:',\n ` test: { maxConcurrentProjects: ${limit}, maxConcurrentFiles: ${hasExplicitProjects ? limit : 1} }`,\n hasExplicitProjects\n ? ' Set projects[].maxConcurrentFiles to 1 to keep files sequential within each project.'\n : ' The implicit default project keeps running files sequentially.',\n hasExplicitProjects\n ? 'For parallel files, configure fileSetup and raise both test.maxConcurrentFiles and projects[].maxConcurrentFiles.'\n : 'For parallel files, configure fileSetup and raise test.maxConcurrentFiles.',\n 'Migration guide: https://midscenejs.com/midscene-test/configuration.html#existing-configurations',\n ].join('\\n'),\n );\n }\n return Object.freeze({\n maxConcurrentFiles: validateConcurrency(\n candidate.maxConcurrentFiles,\n 'test.maxConcurrentFiles',\n ),\n maxConcurrentProjects: validateConcurrency(\n candidate.maxConcurrentProjects,\n 'test.maxConcurrentProjects',\n ),\n setupTimeout: validatePositiveInteger(\n candidate.setupTimeout,\n 120_000,\n 'test.setupTimeout',\n ),\n teardownTimeout: validatePositiveInteger(\n candidate.teardownTimeout,\n 30_000,\n 'test.teardownTimeout',\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, TProjectContext = TContext>(\n definition: unknown,\n): LoadedTestProject<TContext, TProjectContext> => {\n if (!isRecord(definition)) {\n throw new TypeError('Midscene config must default export an object.');\n }\n if (definition.nodes !== undefined && !Array.isArray(definition.nodes)) {\n throw new TypeError('Midscene config nodes must be an array.');\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', 'fileSetup', 'projects', 'test', 'output', 'nodes'],\n 'root',\n );\n const nodes = new NodeRegistry(\n definition.nodes as NodeDefinition[] | undefined,\n );\n const test = validateTestOptions(\n definition.test,\n definition.projects !== undefined,\n );\n const resolvedProjects = validateExecutionProjects<TContext, TProjectContext>(\n definition.projects,\n definition.setup,\n definition.fileSetup,\n nodes,\n test,\n );\n return {\n ...resolvedProjects,\n 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 assertSupportedConfig = (absolutePath: string): '.ts' | '.mjs' => {\n if (!absolutePath.endsWith('.ts') && !absolutePath.endsWith('.mjs')) {\n const extension = absolutePath.match(/(\\.[^./\\\\]+)$/)?.[1] ?? '(none)';\n throw new TypeError(\n `Unsupported Midscene config extension: ${extension}. Supported extensions: .ts, .mjs.`,\n );\n }\n return absolutePath.endsWith('.mjs') ? '.mjs' : '.ts';\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<\n TContext = undefined,\n TProjectContext = TContext,\n>(configPath?: string): Promise<LoadedTestProject<TContext, TProjectContext>> {\n if (!configPath) {\n return validateTestProjectDefinition<TContext, TProjectContext>({\n nodes: [],\n });\n }\n\n const absolutePath = resolve(configPath);\n const extension = assertSupportedConfig(absolutePath);\n let loaded: unknown;\n try {\n if (extension === '.mjs') {\n loaded = await import(pathToFileURL(absolutePath).href);\n } else {\n // Select tsx's ESM entry even when this loader is built as CommonJS.\n // Its CommonJS entry can resolve the async loader relative to the wrong directory.\n const { tsImport } = await import('tsx/esm/api');\n loaded = await tsImport(pathToFileURL(absolutePath).href, {\n parentURL: pathToFileURL(`${dirname(absolutePath)}${sep}`).href,\n tsconfig: false,\n });\n }\n } catch (error) {\n try {\n if (extension === '.mjs' || !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, TProjectContext>(\n getDefaultExport(loaded, absolutePath),\n );\n}\n","import { createHash } from 'node:crypto';\n\n/** Internal invocation identity keeps repeated legacy files distinct. */\nexport const createCaseInvocationId = (\n projectId: string,\n sourcePath: string,\n caseIndex: number,\n invocationIndex = 0,\n): string =>\n createHash('sha256')\n .update(\n JSON.stringify([\n projectId,\n sourcePath,\n caseIndex,\n ...(invocationIndex ? [invocationIndex] : []),\n ]),\n )\n .digest('hex');\n\nexport const createDocumentInvocationId = (\n projectId: string,\n sourcePath: string,\n invocationIndex = 0,\n): string =>\n createHash('sha256')\n .update(\n JSON.stringify([\n projectId,\n sourcePath,\n ...(invocationIndex ? [invocationIndex] : []),\n ]),\n )\n .digest('hex');\n","import {\n type ResolveNodeForNormalization,\n normalizeStep as coreNormalizeStep,\n normalizeSteps as coreNormalizeSteps,\n} from '@midscene/core/internal/test-runner';\nimport type { NormalizedStep } from './types';\nexport type { ResolveNodeForNormalization } from '@midscene/core/internal/test-runner';\n\nexport const normalizeStep: (\n value: unknown,\n index?: number,\n resolveNode?: ResolveNodeForNormalization,\n) => NormalizedStep = coreNormalizeStep;\nexport const normalizeSteps: (\n values: unknown,\n resolveNode?: ResolveNodeForNormalization,\n) => NormalizedStep[] = coreNormalizeSteps;\n","import type { TestRunReportValue } from '@midscene/core';\nimport {\n isReportSecretKey,\n sanitizeReportText,\n} from '@midscene/core/internal/test-runner';\nimport { JSON_SCHEMA, load } from 'js-yaml';\n\ninterface SourceNode {\n start: number;\n end: number;\n value: unknown;\n children: SourceNode[];\n kind: string | null;\n}\n\n/** Keep author formatting while redacting values by parsed YAML keys, including aliases. */\nexport function parseWorkflowSource(source: string): {\n parsed: unknown;\n sourceYaml: TestRunReportValue;\n locate(\n path: readonly (string | number)[],\n ): { line: number; column: number } | undefined;\n} {\n const stack: SourceNode[] = [];\n const nodes: SourceNode[] = [];\n const sensitiveNodes = new Set<SourceNode>();\n const sensitiveValues = new Set<unknown>();\n const redactedPaths = new Set<string>();\n // js-yaml removes the BOM before reporting source positions.\n const sourceOffset = source.charCodeAt(0) === 0xfeff ? 1 : 0;\n const parsed = load(source, {\n schema: JSON_SCHEMA,\n listener(event, state) {\n if (event === 'open') {\n stack.push({\n start: state.position + sourceOffset,\n end: 0,\n value: null,\n children: [],\n kind: null,\n });\n return;\n }\n const node = stack.pop()!;\n node.end = state.position + sourceOffset;\n node.value = state.result;\n node.kind = state.kind;\n stack.at(-1)?.children.push(node);\n nodes.push(node);\n if (state.kind !== 'mapping') return;\n for (let index = 0; index < node.children.length; index += 2) {\n const key = node.children[index].value;\n const value = node.children[index + 1];\n if (typeof key !== 'string' || !isReportSecretKey(key) || !value)\n continue;\n sensitiveNodes.add(value);\n if (value.value !== null) sensitiveValues.add(value.value);\n redactedPaths.add(`$..[${JSON.stringify(key)}]`);\n }\n },\n });\n // Redact the definition as well when a secret value refers to a YAML anchor.\n const ranges = nodes\n .filter(\n (node) => sensitiveNodes.has(node) || sensitiveValues.has(node.value),\n )\n .sort((left, right) => left.start - right.start || right.end - left.end);\n let offset = 0;\n let redacted = '';\n for (const range of ranges) {\n if (range.start < offset) continue;\n const text = source.slice(range.start, range.end);\n const leading = text.match(/^\\s*/)?.[0] ?? '';\n const trailing = text.slice(leading.length).match(/\\s*$/)?.[0] ?? '';\n redacted += `${source.slice(offset, range.start)}${leading}\"[REDACTED]\"${trailing}`;\n offset = range.end;\n }\n redacted += source.slice(offset);\n const value = sanitizeReportText(redacted, 64 * 1024);\n return {\n parsed,\n locate(path) {\n let node = nodes.at(-1);\n for (const part of path) {\n if (!node) return undefined;\n // js-yaml can emit a wrapper around a block collection.\n while (\n node.children.length === 1 &&\n node.children[0].value === node.value\n )\n node = node.children[0];\n if (typeof part === 'number' && node.kind === 'sequence')\n node = node.children[part];\n else if (typeof part === 'string' && node.kind === 'mapping') {\n const children = node.children;\n node = undefined;\n for (let index = 0; index < children.length; index += 2)\n if (children[index].value === part) {\n node = children[index + 1];\n break;\n }\n } else return undefined;\n }\n if (!node) return undefined;\n let start = node.start;\n while (start < node.end) {\n if (/\\s/.test(source[start])) start++;\n else if (source[start] === '#') {\n const end = source.indexOf('\\n', start);\n if (end < 0) return undefined;\n start = end + 1;\n } else break;\n }\n const prefix = source.slice(0, start).split(/\\r\\n|\\r|\\n/);\n return { line: prefix.length, column: prefix.at(-1)!.length + 1 };\n },\n sourceYaml: {\n value,\n ...(redactedPaths.size ? { redactedPaths: [...redactedPaths] } : {}),\n ...(value !== redacted ? { truncatedPaths: ['$'] } : {}),\n },\n };\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 { readFileSync } from 'node:fs';\nimport { sep } from 'node:path';\nimport { classifyWorkflowDocumentFormat } from '@midscene/core/internal/test-runner';\nimport type { JsonValue } from '../cli/test-project';\nimport { WorkflowParseError } from '../errors';\nimport type { NodeDefinition } from '../node/types';\nimport {\n createCaseInvocationId,\n createDocumentInvocationId,\n} from './identifiers';\nimport { normalizeSteps } from './normalize';\nimport { parseWorkflowSource } from './source';\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\nexport class NativeWorkflowFormatError extends WorkflowParseError {\n readonly actualFormat: 'legacy' | 'legacy-batch' | 'mixed';\n\n constructor(\n actualFormat: 'legacy' | 'legacy-batch' | 'mixed',\n sourcePath: string,\n ) {\n super(\n actualFormat === 'legacy'\n ? `Legacy tasks/flow YAML is not supported by midscene-test: ${sourcePath}. Run it with \\`midscene ${sourcePath}\\`, or migrate the file to cases/steps.`\n : actualFormat === 'legacy-batch'\n ? `Legacy YAML batch configuration is not a midscene-test workflow document: ${sourcePath}. Run it with \\`midscene --config ${sourcePath}\\`, or migrate it to a native project config.`\n : `A workflow file cannot mix legacy tasks/flow with native cases/steps or lifecycle hooks: ${sourcePath}. Keep the formats in separate files and run each file with its matching command.`,\n { sourcePath, actualFormat, expectedFormat: 'native' },\n );\n this.actualFormat = actualFormat;\n }\n}\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 => createCaseInvocationId(projectId, sourcePath, caseIndex);\n\nexport const createWorkflowDocumentId = (\n projectId: string,\n sourcePath: string,\n): string => createDocumentInvocationId(projectId, sourcePath);\n\nexport function collectWorkflowDocument(\n source: WorkflowDocumentSource,\n options: CollectWorkflowDocumentOptions,\n): CollectedWorkflowDocument {\n let snapshot: ReturnType<typeof parseWorkflowSource>;\n try {\n snapshot = parseWorkflowSource(readFileSync(source.absolutePath, 'utf8'));\n } catch (error) {\n throw new WorkflowParseError(\n `Failed to parse workflow document \"${source.sourcePath}\".`,\n { sourcePath: source.sourcePath },\n error,\n );\n }\n const { parsed, sourceYaml } = snapshot;\n\n if (!isMapping(parsed)) {\n throw new WorkflowParseError('Workflow document must be a mapping.');\n }\n const format = classifyWorkflowDocumentFormat(parsed);\n if (format === 'legacy' || format === 'legacy-batch' || format === 'mixed') {\n throw new NativeWorkflowFormatError(format, source.sourcePath);\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 meta: {\n ...step.meta,\n sourceLocation: snapshot.locate(\n phase === 'steps'\n ? ['cases', caseIndex!, 'steps', stepIndex]\n : [phase, stepIndex],\n ),\n },\n templateInput: step.input,\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 sourceYaml,\n lifecycle,\n cases,\n } satisfies CollectedWorkflowDocument;\n}\n","import { createHash } from 'node:crypto';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join, relative, sep } from 'node:path';\nimport {\n WorkflowPublicationError,\n sanitizeReportError,\n} from '@midscene/core/internal/test-runner';\nimport type { CaseRunResult, WorkflowDocumentRunResult } from '../engine/types';\nimport type { PreparedExecutionProject } from './execution-plan';\nimport type { TestProjectCollectionError, TestProjectRunResult } from './types';\n\nconst writeJson = async (path: string, value: unknown) => {\n try {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, JSON.stringify(value, null, 2));\n } catch (error) {\n throw new WorkflowPublicationError('write-result', path, error);\n }\n};\n\nexport const writeTestRunPlan = (\n runDir: string,\n projects: readonly PreparedExecutionProject[],\n) =>\n writeJson(join(runDir, 'plan.json'), {\n schemaVersion: 1,\n createdAt: new Date().toISOString(),\n projects: projects.map((item) => ({\n projectId: item.project.projectId,\n name: item.project.name,\n documents: item.plans ?? [],\n })),\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(\n result.projectId,\n 'documents',\n result.documentId,\n result.attemptIndex === undefined\n ? 'document.json'\n : `${result.documentRunId}.json`,\n ),\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 return writeJson(\n join(runDir, workflowDocumentResultPath(result)),\n persistedResult,\n );\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 return 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 return 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 = sanitizeReportError;\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 return 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 ...(result.errors?.length ? { errors: result.errors.map(errorJson) } : {}),\n projectRoot: options.projectRoot,\n ...(options.configPath ? { configPath: options.configPath } : {}),\n factsRoot: '.',\n plan: 'plan.json',\n ...(result.operationLog\n ? {\n operationLog: {\n ...result.operationLog,\n path: relativeToSummary(\n result.summaryPath,\n result.operationLog.path,\n ),\n },\n }\n : {}),\n reportDir: relativeToSummary(result.summaryPath, result.reportDir),\n ...(result.reportPath\n ? { report: relativeToSummary(result.summaryPath, result.reportPath) }\n : {}),\n ...(result.markdownPath\n ? { markdown: relativeToSummary(result.summaryPath, result.markdownPath) }\n : {}),\n summary: result.summary,\n ...(result.metrics ? { metrics: result.metrics } : {}),\n projects: result.projects.map((project) => ({\n projectId: project.projectId,\n name: project.name,\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.cleanup\n ? { cleanup: project.lifecycle.cleanup }\n : {}),\n ...(project.lifecycle.pendingOperations\n ? { pendingOperations: project.lifecycle.pendingOperations }\n : {}),\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 ...(outcome.documentRunId\n ? { documentRunId: outcome.documentRunId }\n : {}),\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 ...(attempt.cleanup ? { cleanup: attempt.cleanup } : {}),\n ...(attempt.pendingOperations\n ? { pendingOperations: attempt.pendingOperations }\n : {}),\n ...(attempt.executionStatus\n ? { executionStatus: attempt.executionStatus }\n : {}),\n ...(attempt.retryDecision\n ? { retryDecision: attempt.retryDecision }\n : {}),\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 ...(document.attemptIndex === undefined\n ? {}\n : {\n attemptIndex: document.attemptIndex,\n documentRunId: document.documentRunId,\n }),\n sourcePath: document.sourcePath,\n status: document.status,\n ...(document.cleanup ? { cleanup: document.cleanup } : {}),\n ...(document.pendingOperations\n ? { pendingOperations: document.pendingOperations }\n : {}),\n ...(document.executionStatus\n ? { executionStatus: document.executionStatus }\n : {}),\n ...(document.retryDecision\n ? { retryDecision: document.retryDecision }\n : {}),\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 { readdirSync } from 'node:fs';\nimport { join, relative, resolve, sep } from 'node:path';\nimport type { CollectedWorkflowDocument } from '@midscene/core/internal/test-runner';\nimport { buildTestRunReportPlan } from '@midscene/core/internal/test-runner';\nimport { globSync } from 'tinyglobby';\nimport { WorkflowError, WorkflowParseError } from '../errors';\nimport { collectWorkflowDocument } from '../parser/collect';\nimport type {\n PreparedDocumentInvocation,\n PreparedExecutionProject,\n ProjectPreparationOptions,\n} from './execution-plan';\nimport { writeCollectionError } from './result-store';\nimport type { LoadedExecutionProject, TestFileSelection } from './test-project';\nimport { validateTestFileSelection } from './test-project';\nimport type { TestProjectCollectionError } from './types';\n\nexport const CONFIG_NAMES = [\n 'midscene.config.ts',\n 'midscene.config.mjs',\n] as const;\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\nconst discoverResolvedTestFiles = (\n projectRoot: string,\n selection: TestFileSelection,\n): string[] => {\n const root = resolve(projectRoot);\n const match = (patterns: readonly string[]) =>\n globSync(patterns, {\n absolute: true,\n caseSensitiveMatch: false,\n cwd: root,\n dot: true,\n expandDirectories: false,\n followSymbolicLinks: false,\n ignore: [...ALWAYS_IGNORED_PATTERNS, ...(selection.exclude ?? [])],\n onlyFiles: true,\n }).filter((file) => /\\.ya?ml$/i.test(file));\n const files = match(selection.include);\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 discoverTestFiles = (\n projectRoot: string,\n selection: TestFileSelection = DEFAULT_TEST_FILE_SELECTION,\n): string[] => {\n const normalized = validateTestFileSelection(selection);\n if (!normalized) throw new TypeError('Test file selection is required.');\n return discoverResolvedTestFiles(projectRoot, normalized);\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 supported = candidates.filter((name) =>\n CONFIG_NAMES.includes(name as (typeof CONFIG_NAMES)[number]),\n );\n const unsupported = candidates.filter(\n (name) => !CONFIG_NAMES.includes(name as (typeof CONFIG_NAMES)[number]),\n );\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_NAMES.join(' and ')} are supported.`,\n ].join('\\n'),\n );\n }\n if (supported.length > 1) {\n throw new Error(\n [\n `Multiple Midscene configs found in ${root}:`,\n ...supported.map((name) => `- ${name}`),\n 'Pass --config <path> to select one explicitly.',\n ].join('\\n'),\n );\n }\n return supported[0] ? join(root, supported[0]) : undefined;\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\nexport const matchesTags = (\n tags: readonly string[],\n selection: LoadedExecutionProject['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: LoadedExecutionProject,\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\nexport const selectProjects = <TProjectContext>(\n projects: readonly LoadedExecutionProject<TProjectContext>[],\n names: readonly string[] | undefined,\n): readonly LoadedExecutionProject<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\n/** Prepare and validate every document before any Project resource is acquired. */\nexport async function prepareProject(\n project: LoadedExecutionProject,\n projectRoot: string,\n runDir: string,\n defaultTimeoutMs: number,\n options: ProjectPreparationOptions = {},\n): Promise<PreparedExecutionProject> {\n const platform = options.platform?.trim();\n const fileSelection = project.files ?? DEFAULT_TEST_FILE_SELECTION;\n const prerequisiteFile = options.prerequisiteFile\n ? resolve(options.prerequisiteFile)\n : undefined;\n const mainFiles =\n options.files ?? discoverResolvedTestFiles(projectRoot, fileSelection);\n const files = [\n ...(prerequisiteFile ? [prerequisiteFile] : []),\n ...mainFiles.filter((file) => file !== prerequisiteFile),\n ];\n const occurrences = new Map<string, number>();\n const sources = files.map((absolutePath) => {\n const invocationIndex = occurrences.get(absolutePath) ?? 0;\n occurrences.set(absolutePath, invocationIndex + 1);\n return {\n projectId: project.projectId,\n projectName: project.name,\n sourcePath: toPosix(relative(projectRoot, absolutePath)),\n absolutePath,\n invocationIndex,\n };\n });\n const collectionErrors: TestProjectCollectionError[] = [];\n const invocations: PreparedDocumentInvocation[] = [];\n const plans: import('@midscene/core').TestRunReportDocumentPlan[] = [];\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 await writeCollectionError(runDir, error);\n }\n\n for (const source of sources) {\n try {\n const collected = await options.collectDocument?.(source, project);\n if (collected) {\n filteredCaseCount += collected.filteredCaseCount;\n if (collected.invocation) {\n const plan = buildTestRunReportPlan(collected.invocation.document, {\n defaultTimeoutMs: collected.invocation.defaultTimeoutMs,\n retry: collected.invocation.retry,\n });\n invocations.push({ ...collected.invocation, plan });\n plans.push(plan);\n }\n continue;\n }\n const document = collectWorkflowDocument(source, {\n resolveNode: project.nodes.get.bind(project.nodes),\n variables: project.variables,\n env: process.env,\n });\n const filtered =\n source.absolutePath === prerequisiteFile\n ? { document, filtered: 0 }\n : filterDocumentCases(document, project);\n const plan = buildTestRunReportPlan(document, {\n selectedCaseIds:\n filtered.document?.cases.map((item) => item.caseId) ?? [],\n defaultTimeoutMs,\n retry: { scope: 'case', count: project.retry },\n });\n plans.push(plan);\n filteredCaseCount += filtered.filtered;\n if (filtered.document)\n invocations.push({\n plan,\n document: filtered.document,\n retry: { scope: 'case', count: project.retry },\n defaultTimeoutMs,\n reportEnabled: true,\n bindings: {\n resolveNode: project.nodes.require.bind(project.nodes),\n ...(project.fileSetup\n ? {\n documentSetup: {\n name: project.fileSetup.name,\n setup({ projectContext, document, signal, onTeardown }) {\n return project.fileSetup!.setup({\n project,\n projectContext,\n file: document,\n env: Object.freeze({ ...process.env }),\n signal,\n onTeardown,\n });\n },\n },\n }\n : {}),\n },\n });\n } catch (error) {\n const collectionError = asCollectionError(\n project.projectId,\n project.name,\n source.sourcePath,\n error,\n );\n collectionErrors.push(collectionError);\n await writeCollectionError(runDir, collectionError);\n }\n }\n\n const documents = invocations.map((invocation) => invocation.document);\n const prerequisiteSource = sources.find(\n (source) => source.absolutePath === prerequisiteFile,\n );\n const prerequisiteDocument = documents.find(\n (document) => document.sourcePath === prerequisiteSource?.sourcePath,\n );\n return {\n project,\n ...(platform ? { platform } : {}),\n documentConcurrency: options.documentConcurrency ?? 1,\n ...(prerequisiteDocument\n ? { prerequisiteDocumentId: prerequisiteDocument.documentId }\n : {}),\n fileSelection,\n sources,\n documents,\n invocations,\n plans,\n collectionErrors,\n selectedCaseCount: documents.reduce(\n (total, document) => total + document.cases.length,\n 0,\n ),\n filteredCaseCount,\n };\n}\n","import { randomUUID } from 'node:crypto';\nimport { existsSync, mkdirSync, statSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { NativeWorkflowFormatError } from '../parser/collect';\nimport type {\n PreparedExecutionProject,\n PreparedTestRunPlan,\n TestProjectRunOptions,\n TestRunInput,\n} from './execution-plan';\nimport {\n discoverTestConfig,\n prepareProject,\n selectProjects,\n} from './project-preparation';\nimport { loadTestProject } from './test-project';\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 resolveRunInput = (options: TestProjectRunOptions): TestRunInput => {\n const cwd = resolve(options.cwd ?? process.cwd());\n assertDirectory(cwd, 'Test working directory');\n const inputPath = options.projectRoot\n ? resolve(cwd, options.projectRoot)\n : undefined;\n const singleFile =\n inputPath && existsSync(inputPath) && statSync(inputPath).isFile()\n ? inputPath\n : undefined;\n if (singleFile && !/\\.ya?ml$/i.test(singleFile))\n throw new Error(\n `Test input must be a YAML file or project directory: ${singleFile}`,\n );\n const cliProjectRoot = singleFile ? dirname(singleFile) : inputPath;\n if (cliProjectRoot) assertDirectory(cliProjectRoot, 'Test project directory');\n const projectRoot = cliProjectRoot ?? cwd;\n return {\n cwd,\n projectRoot,\n configSearchRoot: projectRoot,\n ...(singleFile ? { singleFile } : {}),\n };\n};\n\n/** Composition boundary only: execution receives no raw input syntax or host options. */\nexport async function prepareTestRun(\n options: TestProjectRunOptions,\n): Promise<PreparedTestRunPlan> {\n const startedAt = new Date();\n const runId = createTestRunId(startedAt);\n const input = resolveRunInput(options);\n const configPath = options.configPath\n ? resolve(input.configSearchRoot, options.configPath)\n : discoverTestConfig(input.configSearchRoot);\n if (options.configPath && /\\.ya?ml$/i.test(configPath!)) {\n throw new Error(\n `midscene-test --config only accepts a native TypeScript or JavaScript project config: ${configPath}. Run legacy batch YAML with \\`midscene --config ${options.configPath}\\`.`,\n );\n }\n if (options.configPath && !existsSync(configPath!))\n throw new Error(`Midscene config does not exist: ${configPath}`);\n const definition = await loadTestProject<unknown>(configPath);\n const resultDir = options.resultDir\n ? resolve(input.cwd, options.resultDir)\n : join(input.projectRoot, '.midscene', 'test-results');\n const runDir = join(resultDir, runId);\n const summaryPath = join(runDir, 'summary.json');\n const reportDir = resolve(input.projectRoot, definition.output.reportDir);\n mkdirSync(resultDir, { recursive: true });\n mkdirSync(runDir);\n const projects: PreparedExecutionProject[] = [];\n for (const project of selectProjects(\n definition.projects,\n options.projectNames,\n ))\n projects.push(\n await prepareProject(\n project,\n input.projectRoot,\n runDir,\n definition.test.testTimeout,\n input.singleFile ? { files: [input.singleFile] } : undefined,\n ),\n );\n const hasFormatMismatch = projects.some((project) =>\n project.collectionErrors.some(\n ({ error }) => error instanceof NativeWorkflowFormatError,\n ),\n );\n return {\n startedAt,\n runId,\n projectRoot: input.projectRoot,\n ...(configPath ? { configPath } : {}),\n resultDir,\n runDir,\n summaryPath,\n reportDir,\n definition,\n projects,\n // A wrong-format file invalidates the complete command invocation. Other\n // native collection failures retain the existing per-Project isolation.\n preflightScope: hasFormatMismatch ? 'run' : 'project',\n reportEnabled: true,\n publications: [],\n onProgress: options.onProgress ?? (() => {}),\n onEvent: options.onEvent,\n };\n}\n","import { writeFile } from 'node:fs/promises';\nimport { dirname, join, relative, sep } from 'node:path';\nimport type {\n TestRunReportDump,\n TestRunReportSourceIndex,\n TestRunReportStep,\n} from '@midscene/core';\nimport type { TestProjectRunResult } from '../cli/types';\nimport { buildTestRunReportDump } from './test-run-report';\n\nconst text = (value: string): string =>\n value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll('|', '&#124;')\n .replaceAll('[', '&#91;')\n .replaceAll(']', '&#93;')\n .replaceAll('*', '&#42;')\n .replaceAll('_', '&#95;')\n .replaceAll('`', '&#96;')\n .replaceAll('\\\\', '&#92;')\n .replace(/[\\r\\n]+/g, ' ');\n\nconst duration = (ms: number): string => {\n const seconds = Math.round(ms / 1000);\n return seconds < 60\n ? `${seconds}s`\n : `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n};\nconst href = (from: string, target: string): string =>\n relative(dirname(from), target).split(sep).map(encodeURIComponent).join('/');\n\nexport interface TestResultMarkdownOptions {\n /** Relative or hosted URL of the HTML report. */\n reportHref?: string;\n}\n\n/** Render the same sanitized execution facts used by the HTML report. */\nexport function renderTestResultMarkdown(\n dump: TestRunReportDump,\n options: TestResultMarkdownOptions = {},\n): string {\n const { summary } = dump;\n const outcome =\n dump.status === 'success'\n ? `✅ **${summary.passed}/${summary.total} passed**`\n : `❌ **${summary.failed} failed** · ${summary.passed} passed · ${summary.notRun} not run`;\n const lines = [\n '## Midscene Test',\n '',\n `${outcome} · ${duration(dump.durationMs)}`,\n '',\n ];\n if (summary.filtered) lines.push(`**Filtered:** ${summary.filtered}`, '');\n const infrastructure = [\n summary.collectionErrors\n ? `${summary.collectionErrors} collection errors`\n : '',\n summary.documentFailures\n ? `${summary.documentFailures} document failures`\n : '',\n summary.projectFailures\n ? `${summary.projectFailures} project failures`\n : '',\n ].filter(Boolean);\n if (infrastructure.length)\n lines.push(`**Infrastructure:** ${infrastructure.join(' · ')}`, '');\n const groups: { name: string; rows: string[] }[] = [];\n const errors: string[] = [];\n const recordSteps = (label: string, steps: readonly TestRunReportStep[]) => {\n for (const step of steps) {\n if (step.status === 'failed')\n errors.push(\n `${label} / ${step.node}: ${step.error?.message ?? 'Step failed'}`,\n );\n }\n };\n for (const project of dump.projects) {\n if (project.lifecycle?.setupError)\n errors.push(`${project.name}: ${project.lifecycle.setupError.message}`);\n for (const error of project.lifecycle?.teardownErrors ?? [])\n errors.push(`${project.name}: ${error.message}`);\n for (const error of project.collectionErrors)\n errors.push(\n `${project.name} / ${error.sourcePath}: ${error.error.message}`,\n );\n for (const document of project.documents) {\n const name = document.sourcePath\n .replace(/\\\\/g, '/')\n .replace(/\\.(?:yaml|yml)$/, '');\n const group = {\n name: dump.projects.length > 1 ? `${project.name} / ${name}` : name,\n rows: [] as string[],\n };\n groups.push(group);\n recordSteps(`${project.name} / ${document.sourcePath}`, [\n ...document.beforeAll,\n ...document.afterAll,\n ]);\n for (const error of document.teardownErrors ?? [])\n errors.push(`${document.sourcePath}: ${error.message}`);\n for (const failure of document.hostErrors ?? [])\n errors.push(\n `${document.sourcePath} / ${failure.phase}: ${failure.error.message}`,\n );\n for (const testCase of document.cases) {\n group.rows.push(\n ` - ${testCase.status === 'success' ? '✅' : testCase.status === 'not-run' ? '⏭️' : '❌'} ${text(testCase.name)}`,\n );\n }\n }\n }\n for (const diagnostic of dump.diagnostics ?? []) {\n if (diagnostic.level === 'error') errors.push(diagnostic.message);\n }\n if (errors.length)\n lines.push(\n '### Execution errors',\n '',\n ...errors.map((error) => `- ${text(error)}`),\n '',\n );\n for (const group of groups) {\n if (group.rows.length) lines.push(`- ${text(group.name)}`, ...group.rows);\n }\n if (!groups.some((group) => group.rows.length))\n lines.push('No cases were reported.');\n if (options.reportHref)\n lines.push(\n '',\n `[Open the Midscene Test report ↗](<${options.reportHref}>)`,\n );\n return `${lines.join('\\n')}\\n`;\n}\n\nconst emptyIndex = (): TestRunReportSourceIndex => ({\n sources: [],\n metrics: {\n modelCallCount: 0,\n modelTimeMs: 0,\n promptTokens: 0,\n cachedInputTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n },\n});\n\n/** Write a per-run Markdown artifact even when HTML publication fails or is disabled. */\nexport async function writeTestResultMarkdown(\n result: TestProjectRunResult,\n index: TestRunReportSourceIndex = emptyIndex(),\n): Promise<string> {\n const output = join(dirname(result.summaryPath), 'result.md');\n const dump = buildTestRunReportDump(result, index);\n await writeFile(\n output,\n renderTestResultMarkdown(dump, {\n ...(result.reportPath\n ? { reportHref: href(output, result.reportPath) }\n : {}),\n }),\n );\n return output;\n}\n","import type { NodeDefinition } from '@midscene/core/internal/test-runner';\nimport { runWithConsoleLogScope } from '@midscene/shared/logger';\n\n/** Bind logs to the Node that emitted them, rather than the latest live row. */\nexport function scopeNodeConsole<TInput, TData, TContext>(\n node: NodeDefinition<TInput, TData, TContext>,\n): NodeDefinition<TInput, TData, TContext> {\n return {\n ...node,\n execute(ctx) {\n const position = ctx.scope === 'case' ? ctx.case : ctx.document;\n const scope = {\n projectName: position.projectName,\n sourcePath: position.sourcePath,\n ...(ctx.scope === 'case'\n ? {\n caseId: ctx.case.caseId,\n caseName: ctx.case.name,\n runId: ctx.case.runId,\n }\n : { runId: ctx.document.documentRunId }),\n phase: position.phase,\n stepIndex: position.stepIndex,\n node: node.name,\n };\n return runWithConsoleLogScope(scope, () =>\n node.execute({\n ...ctx,\n onTeardown(teardown) {\n ctx.onTeardown(() =>\n runWithConsoleLogScope(\n { ...scope, phase: 'teardown', stepIndex: undefined },\n teardown,\n ),\n );\n },\n }),\n );\n },\n };\n}\n","import {\n WorkflowExecutionFailure,\n decideRetry,\n isResourceRecoveryError,\n runDocumentAttempts,\n runWorkflowDocument,\n} from '@midscene/core/internal/test-runner';\nimport type {\n CaseRunOutcome,\n StepExecutionInfo,\n StepRunResult,\n WorkflowDocumentExecutionResult,\n WorkflowDocumentRunResult,\n} from '@midscene/core/internal/test-runner';\nimport { runWithConsoleLogScope } from '@midscene/shared/logger';\nimport { isFatalDeviceError } from '../errors';\nimport { scopeNodeConsole } from './console-scope';\nimport type { PreparedDocumentInvocation } from './execution-plan';\nimport type { TestReporterEvent } from './reporter-events';\nimport {\n writeCaseAttemptResult,\n writeWorkflowDocumentResult,\n} from './result-store';\nimport type { LoadedExecutionProject } from './test-project';\nimport type { TestProjectCaseRunResult } from './types';\n\ninterface DocumentInvocationSinks {\n cases: TestProjectCaseRunResult[];\n documents: WorkflowDocumentRunResult[];\n}\n\ninterface ExecuteDocumentInvocationOptions {\n isolatedContext?: boolean;\n setupTimeoutMs?: number;\n teardownTimeoutMs?: () => number;\n onUnresolvedResources?(): void;\n /** Classify failures by resource ownership, independently of notifications. */\n isProjectResourceFailure?(error: unknown): boolean;\n invocation: PreparedDocumentInvocation;\n project: LoadedExecutionProject<unknown>;\n projectContext: unknown;\n runDir: string;\n signal: AbortSignal;\n rootSignal: AbortSignal;\n shouldBail(): boolean;\n isProjectFatal(): boolean;\n markProjectFatal(): void;\n addFailedCases(count: number): void;\n onProgress(message: string): void;\n onEvent?(event: TestReporterEvent): void;\n onDocumentResult?(result: WorkflowDocumentRunResult): Promise<void>;\n sinks: DocumentInvocationSinks;\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 if (result.status === 'not-run')\n return `${indent}– ${formatStep(info)} (not run: ${result.notRunReason})`;\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 ) ||\n (attempt.teardownErrors ?? []).some(isFatalDeviceError) ||\n !!attempt.executionErrors?.some(isResourceRecoveryError),\n );\n\nconst documentHasFatalError = (result: WorkflowDocumentRunResult): boolean =>\n [...result.beforeAll, ...result.afterAll].some(\n (step) => step.error && isFatalDeviceError(step.error),\n ) ||\n (result.teardownErrors ?? []).some(isFatalDeviceError) ||\n !!result.executionErrors?.some(isResourceRecoveryError);\n\n// Only an explicit ownership signal can establish a Project-wide failure.\nexport const isSharedResourceFailure = (error: unknown): boolean => {\n const seen = new Set<object>();\n const pending: unknown[] = [error];\n while (pending.length && seen.size < 50) {\n const item = pending.pop();\n if (typeof item !== 'object' || item === null || seen.has(item)) continue;\n seen.add(item);\n const failure = item as {\n code?: string;\n cause?: unknown;\n errors?: unknown[];\n };\n if (failure.code === 'PROJECT_RESOURCE_ERROR') return true;\n if (failure.cause) pending.push(failure.cause);\n if (Array.isArray(failure.errors))\n pending.push(...failure.errors.slice(0, 50));\n }\n return false;\n};\n\n/** Execute prepared document policies through the shared retry boundary. */\nexport async function executeDocumentInvocation(\n options: ExecuteDocumentInvocationOptions,\n): Promise<void> {\n const { invocation, project, sinks } = options;\n const isProjectResourceFailure =\n options.isProjectResourceFailure ?? (() => false);\n const { document } = invocation;\n const documentRetry = invocation.retry.scope === 'document';\n const attempts: WorkflowDocumentExecutionResult[] = [];\n const fileSetup = invocation.bindings.documentSetup;\n const documentSetup = fileSetup\n ? {\n ...fileSetup,\n setup(ctx: Parameters<typeof fileSetup.setup>[0]) {\n const scope = {\n projectName: project.name,\n sourcePath: document.sourcePath,\n runId: ctx.document.documentRunId,\n phase: 'fileSetup',\n };\n return runWithConsoleLogScope(scope, async () => {\n try {\n return await fileSetup.setup({\n ...ctx,\n onTeardown(teardown) {\n ctx.onTeardown(() =>\n runWithConsoleLogScope(\n { ...scope, phase: 'teardown' },\n teardown,\n ),\n );\n },\n });\n } catch (error) {\n if (isProjectResourceFailure(error)) options.markProjectFatal();\n throw error;\n }\n });\n },\n }\n : undefined;\n\n options.onEvent?.({\n type: 'document-start',\n documentId: document.documentId,\n projectName: project.name,\n sourcePath: document.sourcePath,\n cases: document.cases.length,\n });\n\n await runDocumentAttempts(\n {\n retry: documentRetry ? invocation.retry.count : 0,\n signal: options.signal,\n shouldStop: () => options.shouldBail() || options.isProjectFatal(),\n },\n async (documentAttemptIndex) => {\n if (documentRetry)\n options.onProgress(\n ` file attempt ${documentAttemptIndex + 1}/${invocation.retry.count + 1}: ${document.sourcePath}`,\n );\n const execution = await runWithConsoleLogScope(\n { projectName: project.name, sourcePath: document.sourcePath },\n () =>\n runWorkflowDocument(document, {\n plan: invocation.plan,\n documentAttemptIndex: documentRetry\n ? documentAttemptIndex\n : undefined,\n ...invocation.bindings,\n resolveNode: (name) =>\n scopeNodeConsole(invocation.bindings.resolveNode(name)),\n documentSetup,\n setupTimeoutMs: options.setupTimeoutMs,\n teardownTimeoutMs: options.teardownTimeoutMs,\n project,\n projectContext: options.projectContext,\n retry: documentRetry ? 0 : invocation.retry.count,\n signal: options.signal,\n defaultTimeoutMs: invocation.defaultTimeoutMs,\n shouldStop: () =>\n options.rootSignal.aborted ||\n options.shouldBail() ||\n options.isProjectFatal(),\n stopReason: () =>\n options.rootSignal.aborted\n ? 'interrupted'\n : options.isProjectFatal()\n ? 'fatal-error'\n : 'bail',\n isFatalError: (run) =>\n [...run.beforeEach, ...run.steps, ...run.afterEach].some(\n (step) =>\n step.error &&\n (isFatalDeviceError(step.error) ||\n isProjectResourceFailure(step.error)),\n ) ||\n (run.teardownErrors ?? []).some(\n (error) =>\n isFatalDeviceError(error) || isProjectResourceFailure(error),\n ),\n onCaseStart: (collectedCase) => {\n options.onProgress(\n ` [case ${collectedCase.caseIndex + 1}/${document.cases.length}] ${collectedCase.definition.name}`,\n );\n },\n onStepStart: (info) => {\n options.onEvent?.({\n type: 'step-start',\n projectName: project.name,\n info,\n });\n const indent = info.scope === 'case' ? ' ' : ' ';\n options.onProgress(`${indent}→ ${formatStep(info)}`);\n },\n onStepResult: async (info, result) => {\n if (isProjectResourceFailure(result.error))\n options.markProjectFatal();\n await invocation.bindings.onStepResult?.(info, result);\n options.onProgress(formatStepResult(info, result));\n options.onEvent?.({\n type: 'step-end',\n projectName: project.name,\n info,\n result,\n });\n },\n onCaseResult: async (attempt) => {\n await writeCaseAttemptResult(\n options.runDir,\n project.projectId,\n document.documentId,\n attempt,\n );\n options.onProgress(\n ` ${attempt.status === 'success' ? '✓' : '✗'} case attempt ${attempt.attemptIndex + 1}/${documentRetry ? 1 : invocation.retry.count + 1}: ${attempt.name} (${attempt.durationMs} ms)`,\n );\n if (!documentRetry)\n options.onEvent?.({\n type: 'case-attempt-end',\n attempt,\n maxAttempts: invocation.retry.count + 1,\n });\n },\n onCaseOutcome: (outcome) => {\n if (documentRetry)\n options.onEvent?.({\n type: 'case-progress',\n outcome,\n documentAttemptIndex,\n });\n else options.onEvent?.({ type: 'case-end', outcome });\n if (\n outcome.attempts?.some(\n (attempt) =>\n [\n ...attempt.beforeEach,\n ...attempt.steps,\n ...attempt.afterEach,\n ].some((step) => isProjectResourceFailure(step.error)) ||\n attempt.teardownErrors?.some(isProjectResourceFailure),\n )\n )\n options.markProjectFatal();\n if (!options.isolatedContext && caseHasFatalError(outcome))\n options.markProjectFatal();\n if (!documentRetry && outcome.status === 'failed')\n options.addFailedCases(1);\n },\n onDocumentResult: options.onDocumentResult,\n }),\n ).catch(async (error: unknown) => {\n if (error instanceof WorkflowExecutionFailure) {\n const partial = error.result as WorkflowDocumentExecutionResult;\n const resourceOnly =\n error.errors.length > 0 &&\n error.errors.every(\n (failure) =>\n isResourceRecoveryError(failure) ||\n partial.document.hostErrors?.some(\n (host) =>\n host.phase === 'cleanup' &&\n (host.error === failure ||\n (host.error instanceof Error &&\n host.error.cause === failure)),\n ),\n );\n // Legacy recovery failures stop context reuse. Isolated file failures\n // are checked for unresolved resources below; publication still throws.\n if (resourceOnly) {\n if (\n !options.isolatedContext &&\n error.errors.some(isResourceRecoveryError)\n )\n options.markProjectFatal();\n return partial;\n }\n if (documentRetry)\n partial.document.retryDecision = decideRetry({\n scope: 'document',\n retryCount: invocation.retry.count,\n attemptIndex: documentAttemptIndex,\n status: 'failed',\n infrastructureError: true,\n });\n attempts.push(partial);\n sinks.documents.push(partial.document);\n sinks.cases.push(\n ...partial.cases.map((outcome) => ({\n ...outcome,\n documentId: document.documentId,\n documentRunId: partial.document.documentRunId,\n })),\n );\n try {\n for (const outcome of partial.cases)\n for (const attempt of outcome.attempts ?? [])\n await writeCaseAttemptResult(\n options.runDir,\n project.projectId,\n document.documentId,\n attempt,\n );\n await writeWorkflowDocumentResult(options.runDir, partial.document);\n } catch (publicationError) {\n throw new WorkflowExecutionFailure(partial, [\n ...error.errors,\n publicationError,\n ]);\n }\n }\n throw error;\n });\n\n if (!options.isolatedContext && documentHasFatalError(execution.document))\n options.markProjectFatal();\n if (\n [\n ...execution.document.beforeAll,\n ...execution.document.afterAll,\n ...(execution.document.hostErrors ?? []).map(({ error }) => ({\n error,\n })),\n ...(execution.document.teardownErrors ?? []).map((error) => ({\n error,\n })),\n ].some(({ error }) => isProjectResourceFailure(error))\n )\n options.markProjectFatal();\n const owners = [\n execution.document,\n ...execution.cases.flatMap((outcome) => outcome.attempts ?? []),\n ];\n const cleanupPending = owners.some(\n (owner) => owner.cleanup?.status === 'pending',\n );\n const operationPending = owners.some(\n (owner) => !!owner.pendingOperations?.length,\n );\n const cleanupFailed = owners.some(\n (owner) =>\n owner.cleanup?.status === 'failed' ||\n !!owner.teardownErrors?.length ||\n ('hostErrors' in owner &&\n owner.hostErrors?.some(({ phase }) => phase === 'cleanup')),\n );\n // Legacy files reuse their Project context. Isolated files may continue\n // after settled local cleanup failure; unresolved ownership stops dispatch.\n if (cleanupPending || operationPending) {\n options.markProjectFatal();\n options.onUnresolvedResources?.();\n } else if (cleanupFailed && !options.isolatedContext)\n options.markProjectFatal();\n const failed =\n execution.document.status === 'failed' ||\n execution.cases.some((item) => item.status !== 'success');\n const decision = decideRetry({\n scope: 'document',\n retryCount: invocation.retry.count,\n attemptIndex: documentAttemptIndex,\n status: failed ? 'failed' : 'success',\n cleanupPending,\n cleanupFailed,\n operationPending,\n fatalError: options.isProjectFatal(),\n interrupted: options.signal.aborted || options.rootSignal.aborted,\n shouldStop: options.shouldBail(),\n });\n if (documentRetry) execution.document.retryDecision = decision;\n if (documentRetry && decision.decision === 'retry')\n options.onEvent?.({\n type: 'document-retry',\n document: execution.document,\n maxAttempts: invocation.retry.count + 1,\n });\n attempts.push(execution);\n sinks.cases.push(\n ...execution.cases.map((outcome) => ({\n ...outcome,\n documentId: document.documentId,\n documentRunId: execution.document.documentRunId,\n })),\n );\n sinks.documents.push(execution.document);\n // Per-attempt callbacks publish incremental facts; seal the final retry\n // decision after callback-driven interruption/bail has been observed.\n try {\n for (const outcome of execution.cases)\n for (const attempt of outcome.attempts ?? [])\n await writeCaseAttemptResult(\n options.runDir,\n project.projectId,\n document.documentId,\n attempt,\n );\n await writeWorkflowDocumentResult(options.runDir, execution.document);\n } catch (error) {\n execution.document.status = 'failed';\n execution.document.hostErrors = [\n ...(execution.document.hostErrors ?? []),\n { phase: 'publication', error },\n ];\n if (documentRetry)\n execution.document.retryDecision = decideRetry({\n scope: 'document',\n retryCount: invocation.retry.count,\n attemptIndex: documentAttemptIndex,\n status: 'failed',\n infrastructureError: true,\n });\n throw new WorkflowExecutionFailure(execution, [error]);\n }\n return decision.decision === 'retry' ? 'failed' : undefined;\n },\n );\n\n const final = attempts.at(-1);\n if (!final) return;\n if (documentRetry)\n for (const outcome of final.cases)\n options.onEvent?.({\n type: 'case-end',\n outcome,\n documentRetries: attempts.length - 1,\n });\n const failedCases = final.cases.filter(\n (item) => item.status === 'failed',\n ).length;\n options.onEvent?.({\n type: 'document-end',\n document: final.document,\n cases: final.cases,\n durationMs: attempts.reduce(\n (total, attempt) => total + attempt.document.durationMs,\n 0,\n ),\n });\n if (documentRetry && failedCases) options.addFailedCases(failedCases);\n else if (final.document.status === 'failed' && failedCases === 0)\n options.addFailedCases(Math.max(1, failedCases));\n}\n","import type {\n ProjectRuntime,\n WorkflowDocumentRunResult,\n} from '@midscene/core/internal/test-runner';\nimport {\n WorkflowError,\n getPendingScopeOperations,\n getResourceCleanupCompletion,\n trackResourceOperation,\n waitForScopeOperations,\n} from '@midscene/core/internal/test-runner';\nimport { runWithConsoleLogScope } from '@midscene/shared/logger';\nimport { createProjectRuntime } from '../engine/project-runtime';\nimport {\n executeDocumentInvocation,\n isSharedResourceFailure,\n} from './document-invocation';\nimport type { PreparedExecutionProject } from './execution-plan';\nimport type { TestReporterEvent } from './reporter-events';\nimport type {\n TestExecutionProjectRunResult,\n TestProjectCaseRunResult,\n} from './types';\n\ninterface FileProjectState {\n prepared: PreparedExecutionProject;\n cases: TestProjectCaseRunResult[];\n documents: WorkflowDocumentRunResult[];\n runtime?: ProjectRuntime;\n lifecycle?: TestExecutionProjectRunResult['lifecycle'];\n cursor: number;\n active: number;\n initializing: boolean;\n finished: boolean;\n fatal: boolean;\n setupFailed: boolean;\n}\n\ninterface FileSchedulerOptions {\n projects: readonly PreparedExecutionProject[];\n maxConcurrentFiles: number;\n maxConcurrentProjects: number;\n setupTimeoutMs: number;\n teardownTimeoutMs(): number;\n signal: AbortSignal;\n runDir: string;\n preflightFailed: boolean;\n shouldBail(): boolean;\n addFailedCases(count: number): void;\n announceProject(project: PreparedExecutionProject, index: number): void;\n onProgress(project: PreparedExecutionProject, message: string): void;\n onInfrastructureError(error: unknown): void;\n onEvent?(event: TestReporterEvent): void;\n onProjectEnd?(state: FileProjectState): void;\n}\n\n/** Round-robin files within global file and live Project limits. */\nexport async function runPreparedFiles(\n options: FileSchedulerOptions,\n): Promise<FileProjectState[]> {\n const states: FileProjectState[] = options.projects.map((prepared) => ({\n prepared,\n cases: [],\n documents: [],\n cursor: 0,\n active: 0,\n initializing: false,\n finished: false,\n fatal: false,\n setupFailed: false,\n }));\n let nextProject = 0;\n let resourcesUnresolved = false;\n let occupied = 0;\n let occupiedProjects = 0;\n const cleanupQueue: Array<() => void> = [];\n const release = () => {\n occupied--;\n while (occupied < options.maxConcurrentFiles && cleanupQueue.length) {\n occupied++;\n cleanupQueue.shift()!();\n }\n wake?.();\n };\n let wake: (() => void) | undefined;\n const running = new Set<Promise<void>>();\n const stopped = (state: FileProjectState) =>\n options.signal.aborted || options.shouldBail() || state.fatal;\n const invalid = (state: FileProjectState) =>\n options.preflightFailed || state.prepared.collectionErrors.length > 0;\n const unresolved = () => {\n if (resourcesUnresolved) return;\n resourcesUnresolved = true;\n options.onInfrastructureError(\n new WorkflowError(\n 'Resources are still running or cleanup is pending. No new test files will start.',\n { code: 'UNRESOLVED_FILE_RESOURCES' },\n ),\n );\n };\n const finalizeProject = (state: FileProjectState) => {\n const { prepared } = state;\n const completed = new Set(state.cases.map((item) => item.caseId));\n const reason = invalid(state)\n ? 'project-preflight-failed'\n : state.setupFailed\n ? 'project-setup-failed'\n : options.signal.aborted\n ? 'interrupted'\n : state.fatal\n ? 'fatal-error'\n : 'bail';\n for (const document of prepared.documents)\n for (const item of document.cases) {\n if (completed.has(item.caseId)) continue;\n state.cases.push({\n documentId: document.documentId,\n caseId: item.caseId,\n projectName: prepared.project.name,\n name: item.definition.name,\n sourcePath: item.sourcePath,\n caseIndex: item.caseIndex,\n status: 'not-run',\n notRunReason: reason,\n });\n }\n const order = new Map(\n prepared.documents.map((document, i) => [document.documentId, i]),\n );\n const position = (id: string) => order.get(id) ?? Number.MAX_SAFE_INTEGER;\n state.cases.sort(\n (a, b) =>\n position(a.documentId) - position(b.documentId) ||\n a.caseIndex - b.caseIndex,\n );\n state.documents.sort(\n (a, b) => position(a.documentId) - position(b.documentId),\n );\n };\n const finishProject = async (state: FileProjectState) => {\n if (!state.runtime || state.finished) return;\n state.finished = true;\n try {\n options.onEvent?.({\n type: 'project-phase',\n projectName: state.prepared.project.name,\n phase: 'teardown',\n });\n } catch (error) {\n // A presentation failure must not prevent releasing owned resources.\n options.onInfrastructureError(error);\n }\n const failed =\n state.fatal ||\n options.signal.aborted ||\n state.cases.some((item) => item.status !== 'success') ||\n state.documents.some((item) => item.status !== 'success');\n state.lifecycle = await runWithConsoleLogScope(\n { projectName: state.prepared.project.name, phase: 'teardown' },\n () => state.runtime!.finish(failed ? 'failed' : 'success'),\n );\n const releaseProject = () => {\n occupiedProjects--;\n wake?.();\n };\n if (\n state.lifecycle.cleanup?.status === 'pending' ||\n state.lifecycle.pendingOperations?.length\n ) {\n unresolved();\n // A result snapshot can precede actual resource release.\n void Promise.all([\n waitForScopeOperations(state.runtime.signal),\n getResourceCleanupCompletion(state.runtime.signal),\n ]).then(releaseProject, (error) => {\n options.onInfrastructureError(error);\n releaseProject();\n });\n } else {\n releaseProject();\n finalizeProject(state);\n options.onProjectEnd?.(state);\n }\n };\n\n const admit = () => {\n for (let offset = 0; offset < states.length; offset++) {\n const index = (nextProject + offset) % states.length;\n const state = states[index];\n if (invalid(state) || state.finished || state.initializing) continue;\n if (!state.runtime && occupiedProjects >= options.maxConcurrentProjects)\n continue;\n const cleanupOnly =\n !!state.runtime &&\n state.active === 0 &&\n (stopped(state) || state.cursor === state.prepared.invocations.length);\n if (\n !cleanupOnly &&\n (stopped(state) ||\n state.cursor >= state.prepared.invocations.length ||\n state.active >=\n (state.prepared.project.maxConcurrentFiles ??\n options.maxConcurrentFiles))\n )\n continue;\n nextProject = (index + 1) % states.length;\n occupied++;\n state.active++;\n if (!state.runtime && !cleanupOnly) {\n // Claim both budgets before setup so idle Projects are not pre-created.\n occupiedProjects++;\n state.initializing = true;\n }\n const invocationIndex = cleanupOnly ? -1 : state.cursor++;\n return { state, index, invocationIndex };\n }\n };\n\n const run = async ({\n state,\n index,\n invocationIndex,\n }: NonNullable<ReturnType<typeof admit>>) => {\n const { prepared } = state;\n const { project } = prepared;\n let fileResourcesPending = false;\n try {\n if (invocationIndex < 0) {\n await finishProject(state);\n return;\n }\n if (!state.runtime) {\n state.runtime = createProjectRuntime({\n project,\n setup: project.setup,\n signal: options.signal,\n setupTimeoutMs: options.setupTimeoutMs,\n teardownTimeoutMs: options.teardownTimeoutMs,\n });\n setMaxListeners(\n Math.max(\n 10,\n Math.min(\n prepared.invocations.length,\n project.maxConcurrentFiles ?? options.maxConcurrentFiles,\n ) + 1,\n ),\n state.runtime.signal,\n );\n options.announceProject(prepared, index);\n options.onEvent?.({\n type: 'project-phase',\n projectName: project.name,\n phase: 'setup',\n });\n await runWithConsoleLogScope(\n { projectName: project.name, phase: 'setup' },\n () => state.runtime!.start(),\n );\n options.onEvent?.({\n type: 'project-phase',\n projectName: project.name,\n phase: 'running',\n });\n state.initializing = false;\n if (!state.runtime.canRun) {\n state.fatal = true;\n state.setupFailed = true;\n }\n wake?.();\n }\n if (stopped(state)) return;\n const invocation = prepared.invocations[invocationIndex];\n options.onProgress(\n prepared,\n ` [document ${invocationIndex + 1}/${prepared.invocations.length}] ${invocation.document.sourcePath}`,\n );\n await executeDocumentInvocation({\n invocation,\n project,\n projectContext: state.runtime.context,\n runDir: options.runDir,\n signal: state.runtime.signal,\n rootSignal: options.signal,\n shouldBail: options.shouldBail,\n isProjectFatal: () => state.fatal,\n markProjectFatal: () => {\n if (state.fatal) return;\n state.fatal = true;\n state.runtime?.abort(\n new WorkflowError(\n `Project \"${project.name}\" shared execution environment is unavailable.`,\n { code: 'PROJECT_RESOURCE_ERROR' },\n ),\n );\n },\n addFailedCases: options.addFailedCases,\n onProgress: (message) =>\n options.onProgress(\n prepared,\n options.maxConcurrentFiles > 1\n ? ` [${invocation.document.sourcePath}]${message}`\n : message,\n ),\n sinks: state,\n onEvent: options.onEvent,\n isolatedContext: project.fileSetup !== undefined,\n isProjectResourceFailure: isSharedResourceFailure,\n setupTimeoutMs: options.setupTimeoutMs,\n teardownTimeoutMs: options.teardownTimeoutMs,\n onUnresolvedResources: () => {\n fileResourcesPending = true;\n unresolved();\n },\n });\n } catch (error) {\n state.fatal = true;\n fileResourcesPending =\n !!state.runtime &&\n getPendingScopeOperations(state.runtime.signal).length > 0;\n options.onInfrastructureError(error);\n } finally {\n state.initializing = false;\n try {\n // The last file retains its global/local admission through shared cleanup.\n if (\n state.active === 1 &&\n (stopped(state) || state.cursor === prepared.invocations.length)\n )\n await finishProject(state);\n } catch (error) {\n options.onInfrastructureError(error);\n }\n state.active--;\n if (\n state.runtime &&\n (fileResourcesPending || state.lifecycle?.cleanup?.status === 'pending')\n ) {\n // A returned pending snapshot does not release the actual admission.\n // At shutdown this may conservatively wait for siblings in the Project.\n void waitForScopeOperations(state.runtime.signal).then(\n release,\n (error) => {\n options.onInfrastructureError(error);\n release();\n },\n );\n } else release();\n wake?.();\n }\n };\n\n while (true) {\n const changed = new Promise<void>((resolve) => {\n wake = resolve;\n });\n while (occupied < options.maxConcurrentFiles) {\n const job = admit();\n if (!job) break;\n const task = run(job);\n running.add(task);\n const settled = () => {\n running.delete(task);\n wake?.();\n };\n void task.then(settled, (error) => {\n options.onInfrastructureError(error);\n settled();\n });\n }\n if (!running.size) break;\n await changed;\n }\n wake = undefined;\n\n // Pending acquisitions/disposers retain their admissions after the result\n // deadline. Idle initialized Projects queue actual cleanup behind those\n // admissions; their snapshots still return within the shared shutdown limit.\n await Promise.all(\n states.map(async (state) => {\n if (!state.runtime || state.finished) return;\n const admission = new Promise<void>((resolve) => {\n cleanupQueue.push(resolve);\n });\n trackResourceOperation({}, admission, state.runtime.signal);\n while (occupied < options.maxConcurrentFiles && cleanupQueue.length) {\n occupied++;\n cleanupQueue.shift()!();\n }\n try {\n await finishProject(state);\n } catch (error) {\n options.onInfrastructureError(error);\n } finally {\n void Promise.all([\n admission,\n getResourceCleanupCompletion(state.runtime.signal),\n ]).then(release, (error) => {\n options.onInfrastructureError(error);\n release();\n });\n }\n }),\n );\n\n for (const state of states) {\n const { prepared } = state;\n if (!state.runtime)\n options.announceProject(prepared, states.indexOf(state));\n finalizeProject(state);\n }\n return states;\n}\nimport { setMaxListeners } from 'node:events';\n","import { appendFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { TestRunReportOperationEvent } from '@midscene/core';\n\n/** Registered operations keep this sink after the report has been sealed.\n * Each small, bounded event is written before returning to the operation. No\n * open file descriptor or mutable report object is retained by the journal.\n */\nexport function createOperationJournal(runDir: string) {\n const path = join(runDir, 'operations.jsonl');\n writeFileSync(path, '', { flag: 'wx' });\n return {\n path,\n append(event: Readonly<TestRunReportOperationEvent>) {\n appendFileSync(path, `${JSON.stringify(event)}\\n`);\n },\n };\n}\n","import { setMaxListeners } from 'node:events';\nimport { dirname, join } from 'node:path';\nimport type { TestRunReportSourceIndex } from '@midscene/core';\nimport {\n WorkflowExecutionFailure,\n WorkflowPublicationError,\n asExecutionError,\n observeResourceOperations,\n sumTestRunReportMetrics,\n} from '@midscene/core/internal/test-runner';\nimport type {\n CollectedCase,\n WorkflowDocumentRunResult,\n} from '@midscene/core/internal/test-runner';\nimport {\n TestRunReportAssembler,\n calculateTestRunHealth,\n} from '@midscene/core/report';\nimport { getDebug } from '@midscene/shared/logger';\nimport { writeTestResultMarkdown } from '../report/result-markdown';\nimport {\n buildTestRunReportDump,\n collectTestRunReportSources,\n} from '../report/test-run-report';\nimport type {\n PreparedExecutionProject,\n PreparedTestRunPlan,\n} from './execution-plan';\nimport { runPreparedFiles } from './file-scheduler';\nimport { configuredModelNames } from './model-usage';\nimport { createOperationJournal } from './operation-journal';\nimport { writeTestProjectRunResult, writeTestRunPlan } from './result-store';\nimport type {\n TestExecutionProjectRunResult,\n TestProjectCaseRunResult,\n TestProjectRunResult,\n TestProjectRunSummary,\n} from './types';\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 healthCases = projects.flatMap((project) => {\n const documentAttemptByRunId = new Map(\n project.documents.map((document) => [\n document.documentRunId,\n document.attemptIndex ?? 0,\n ]),\n );\n return latestById(project.cases, (item) => item.caseId).map((item) => {\n return {\n status: item.status,\n ...(item.run ? { run: item.run } : {}),\n ...(item.attempts ? { attempts: item.attempts } : {}),\n retryCount: item.documentRunId\n ? (documentAttemptByRunId.get(item.documentRunId) ?? 0)\n : 0,\n };\n });\n });\n const documents = projects.flatMap((project) =>\n latestById(project.documents, (item) => item.documentId),\n );\n const health = calculateTestRunHealth(healthCases);\n return {\n total: health.total,\n passed: health.passed,\n failed: health.failed,\n notRun: health.notRun,\n passedAfterRetry: health.passedAfterRetry,\n finalPassRate: health.finalPassRate,\n firstPassRate: health.firstPassRate,\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 latestById = <T>(items: readonly T[], id: (item: T) => string): T[] => [\n ...new Map(items.map((item) => [id(item), item])).values(),\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\n/** The executor sees prepared policies and bindings, never source-language rules. */\nexport async function runPreparedTestProject(\n plan: PreparedTestRunPlan,\n): Promise<TestProjectRunResult> {\n const {\n startedAt,\n runId,\n projectRoot,\n configPath,\n resultDir,\n runDir,\n summaryPath,\n reportDir,\n definition,\n projects: preparedProjects,\n } = plan;\n const progress = plan.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 plan.onEvent?.({\n type: 'run-start',\n configuredModels: configuredModelNames(),\n projects: preparedProjects.length,\n documents: totalDocuments + totalErrors,\n cases: totalCases,\n projectRoot,\n configPath,\n startedAt: startedAt.toISOString(),\n maxConcurrentProjects: definition.test.maxConcurrentProjects,\n maxConcurrentFiles: definition.test.maxConcurrentFiles,\n files: preparedProjects.flatMap((prepared) => [\n ...prepared.documents.map((document) => ({\n documentId: document.documentId,\n projectName: prepared.project.name,\n sourcePath: document.sourcePath,\n cases: document.cases.length,\n })),\n ...prepared.collectionErrors.map((error) => ({\n documentId: error.sourcePath,\n projectName: prepared.project.name,\n sourcePath: error.sourcePath,\n cases: 0,\n })),\n ]),\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.maxConcurrentFiles ?? Number.POSITIVE_INFINITY,\n Math.max(1, totalDocuments),\n );\n await writeTestRunPlan(runDir, preparedProjects);\n const journal = createOperationJournal(runDir);\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 shutdownDeadline: number | undefined;\n const beginShutdown = () => {\n shutdownDeadline ??= Date.now() + definition.test.teardownTimeout;\n };\n rootController.signal.addEventListener('abort', beginShutdown, {\n once: true,\n });\n const addFailedCases = (count: number) => {\n failedCaseCount += count;\n if (bailReached()) beginShutdown();\n };\n const teardownTimeoutMs = () =>\n Math.max(\n 0,\n Math.min(\n definition.test.teardownTimeout,\n shutdownDeadline === undefined\n ? Number.POSITIVE_INFINITY\n : shutdownDeadline - Date.now(),\n ),\n );\n let hasInfrastructureError = false;\n const infrastructureErrors: unknown[] = [];\n const recordInfrastructureError = (error: unknown) => {\n const errors =\n error instanceof WorkflowExecutionFailure ? error.errors : [error];\n for (const item of errors)\n if (!infrastructureErrors.includes(item)) infrastructureErrors.push(item);\n hasInfrastructureError = true;\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 const stopObservingOperations = observeResourceOperations(\n rootController.signal,\n (event) => {\n try {\n journal.append(event);\n } catch (error) {\n recordInfrastructureError(\n new WorkflowPublicationError('write-result', journal.path, error),\n );\n getDebug('test-runner:operations', { console: true })(\n `Could not persist operation event: ${String(error)}`,\n );\n }\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}`,\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 latestById(cases, (item) => item.caseId).some(\n (item) => item.status !== 'success',\n ) ||\n latestById(documents, (item) => item.documentId).some(\n (item) => item.status === 'failed',\n ) ||\n lifecycle?.status === 'failed';\n return {\n projectId: project.projectId,\n name: project.name,\n ...(prepared.platform ? { platform: prepared.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 plans: prepared.plans,\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 projectResults: Array<TestExecutionProjectRunResult | undefined> =\n new Array(preparedProjects.length);\n\n try {\n const states = await runPreparedFiles({\n projects: preparedProjects,\n maxConcurrentFiles: effectiveConcurrency,\n maxConcurrentProjects:\n definition.test.maxConcurrentProjects ?? Number.POSITIVE_INFINITY,\n setupTimeoutMs: definition.test.setupTimeout,\n teardownTimeoutMs,\n signal: rootController.signal,\n runDir,\n preflightFailed: plan.preflightScope === 'run' && totalErrors > 0,\n shouldBail: bailReached,\n addFailedCases,\n announceProject,\n onProgress: (prepared, message) =>\n runInfrastructureCallback(() =>\n progress(\n preparedProjects.length > 1 || effectiveConcurrency > 1\n ? `[${prepared.project.name}]${message}`\n : message,\n ),\n ),\n onEvent: (event) =>\n runInfrastructureCallback(() => plan.onEvent?.(event)),\n onProjectEnd: (state) =>\n runInfrastructureCallback(() =>\n plan.onEvent?.({\n type: 'project-end',\n project: buildProjectResult(\n state.prepared,\n state.cases,\n state.documents,\n state.lifecycle,\n ),\n }),\n ),\n onInfrastructureError: recordInfrastructureError,\n });\n states.forEach((state, index) => {\n projectResults[index] = buildProjectResult(\n state.prepared,\n state.cases,\n state.documents,\n state.lifecycle,\n );\n });\n } catch (error) {\n recordInfrastructureError(error);\n } finally {\n stopObservingOperations();\n process.off('SIGINT', sigint);\n process.off('SIGTERM', sigterm);\n }\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 hasInfrastructureError ||\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 operationLog: { path: journal.path, snapshotAt: endedAt.toISOString() },\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 ...(hasInfrastructureError\n ? { errors: infrastructureErrors.map(asExecutionError) }\n : {}),\n };\n let completedResult = result;\n let reportIndex: TestRunReportSourceIndex | undefined;\n const publish = async (\n operation: 'write-result' | 'write-report',\n path: string,\n callback: () => unknown | Promise<unknown>,\n ): Promise<boolean> => {\n try {\n await callback();\n return true;\n } catch (error) {\n recordInfrastructureError(\n error instanceof WorkflowPublicationError ||\n error instanceof WorkflowExecutionFailure\n ? error\n : new WorkflowPublicationError(operation, path, error),\n );\n completedResult = {\n ...completedResult,\n status: 'failed',\n exitCode: 1,\n errors: infrastructureErrors.map(asExecutionError),\n };\n return false;\n }\n };\n const writeSummary = () =>\n publish('write-result', summaryPath, () =>\n writeTestProjectRunResult({\n projectRoot,\n ...(configPath ? { configPath } : {}),\n result: completedResult,\n }),\n );\n const writeReport = () =>\n publish('write-report', reportDir, async () => {\n if (!plan.reportEnabled) return;\n const reportPath = await new TestRunReportAssembler().assembleAsync({\n outputDir: reportDir,\n reportFileName: `midscene-e2e-${runId}`,\n overwrite: false,\n sources: collectTestRunReportSources(completedResult),\n buildRunnerDump: (index) => {\n reportIndex = index;\n const dump = buildTestRunReportDump(completedResult, index);\n completedResult = { ...completedResult, metrics: dump.metrics };\n const warn = getDebug('test-runner:report-assembler', {\n console: true,\n });\n for (const diagnostic of dump.diagnostics ?? [])\n warn(diagnostic.message);\n return dump;\n },\n });\n completedResult = { ...completedResult, reportPath };\n });\n // Publish each artifact once. The summary includes the report path or its\n // failure. If the summary itself fails, the thrown result remains authoritative;\n // do not rebuild an already-published execution report to backfill that error.\n await writeReport();\n for (const publication of plan.publications)\n await publish(publication.operation, publication.path, async () => {\n await publication.publish(completedResult);\n });\n await publish(\n 'write-result',\n join(dirname(summaryPath), 'result.md'),\n async () => {\n if (!completedResult.metrics) {\n const dump = buildTestRunReportDump(\n completedResult,\n reportIndex ?? {\n sources: [],\n metrics: sumTestRunReportMetrics([]),\n },\n );\n completedResult = { ...completedResult, metrics: dump.metrics };\n }\n const markdownPath = await writeTestResultMarkdown(\n completedResult,\n reportIndex,\n );\n completedResult = { ...completedResult, markdownPath };\n },\n );\n await writeSummary();\n if (hasInfrastructureError)\n throw new WorkflowExecutionFailure(completedResult, infrastructureErrors);\n return completedResult;\n}\n","import type { TestProjectRunOptions } from './execution-plan';\nimport { prepareTestRun } from './prepare-test-run';\nimport { runPreparedTestProject } from './run-prepared-project';\nimport type { TestProjectRunResult } from './types';\n\nexport type { TestProjectRunOptions } from './execution-plan';\nexport { createTestRunId } from './prepare-test-run';\nexport {\n DEFAULT_TEST_FILE_SELECTION,\n discoverTestConfig,\n discoverTestFiles,\n} from './project-preparation';\n\n/** Native Test entry for cases/steps workflow documents. */\nexport async function runTestProject(\n options: TestProjectRunOptions = {},\n): Promise<TestProjectRunResult> {\n return runPreparedTestProject(await prepareTestRun(options));\n}\n","import { existsSync, realpathSync, statSync, writeFileSync } from 'node:fs';\nimport { dirname, relative, resolve, sep } from 'node:path';\nimport { WorkflowExecutionFailure } from '@midscene/core/internal/test-runner';\nimport { runWithConsoleLogHandler } from '@midscene/shared/logger';\nimport { version } from '../../package.json';\nimport { formatCliError, formatConciseError } from './error-format';\nimport type { CliFailureContext } from './failure-format';\nimport { githubFailureAnnotation, writeGitHubSummary } from './github-reporter';\nimport { renderNodeSpec, sortNodesForSpec } from './node-spec';\nimport { captureTerminalOutput } from './terminal-output';\nimport {\n TerminalReporter,\n type TerminalReporterMode,\n} from './terminal-reporter';\nimport { loadTestProject } from './test-project';\nimport {\n DEFAULT_TEST_FILE_SELECTION,\n discoverTestConfig,\n runTestProject,\n} from './test-project-runner';\nimport type { TestProjectRunResult } from './types';\n\nexport interface TestCliIO {\n log(message: string): void;\n error(message: string): void;\n write?(message: string): void;\n isTTY?: boolean;\n columns?: number;\n rows?: number;\n onResize?(listener: () => void): () => void;\n}\n\ninterface ParsedTestArgs {\n command?: 'nodes';\n cwd: string;\n projectRoot?: string;\n configPath?: string;\n resultDir?: string;\n projectNames?: string[];\n reporter?: TerminalReporterMode;\n}\n\nexport const parseTestCliArgs = (\n args: string[],\n cwd = process.cwd(),\n): ParsedTestArgs => {\n const command = args[0] === 'nodes' ? args[0] : undefined;\n const commandOffset = command ? 1 : 0;\n let projectRoot: string | undefined;\n let configPath: string | undefined;\n let resultDir: string | undefined;\n const projectNames: string[] = [];\n let reporter: TerminalReporterMode | undefined;\n\n for (let index = commandOffset; index < args.length; index += 1) {\n const token = args[index];\n const equal = token.startsWith('-') ? token.indexOf('=') : -1;\n const arg = equal < 0 ? token : token.slice(0, equal);\n const inlineValue = equal < 0 ? undefined : token.slice(equal + 1);\n if (!arg.startsWith('-')) {\n if (projectRoot)\n throw new Error('Only one test project directory is allowed.');\n projectRoot = resolve(cwd, arg);\n continue;\n }\n if (\n arg === '--config' ||\n arg === '--result-dir' ||\n arg === '--project' ||\n arg === '--reporter'\n ) {\n const value = inlineValue ?? args[index + 1];\n if (!value || value.startsWith('--'))\n throw new Error(`${arg} requires a value.`);\n if (arg === '--config') configPath = value;\n else if (arg === '--result-dir') resultDir = resolve(cwd, value);\n else if (arg === '--project') projectNames.push(value);\n else {\n if (value !== 'default' && value !== 'verbose')\n throw new Error(\n `Unknown reporter: ${value}. Expected default or verbose.`,\n );\n reporter = value;\n }\n if (inlineValue === undefined) index += 1;\n } else {\n throw new Error(`Unknown option: ${token}`);\n }\n }\n\n if (command === 'nodes' && resultDir) {\n throw new Error('--result-dir is not supported by nodes.');\n }\n if (command === 'nodes' && reporter)\n throw new Error('--reporter is not supported by nodes.');\n if (command === 'nodes' && projectNames.length > 1) {\n throw new Error('nodes accepts only one --project name.');\n }\n return {\n ...(command ? { command } : {}),\n cwd,\n projectRoot,\n configPath,\n resultDir,\n ...(projectNames.length > 0 ? { projectNames } : {}),\n ...(reporter ? { reporter } : {}),\n };\n};\n\nconst defaultCliIO: TestCliIO = {\n log: console.log,\n error: console.error,\n write: process.stdout.write.bind(process.stdout),\n isTTY: Boolean(process.stdout.isTTY && !process.env.CI),\n get columns() {\n return process.stdout.columns;\n },\n get rows() {\n return process.stdout.rows;\n },\n onResize(listener) {\n process.stdout.on('resize', listener);\n return () => process.stdout.off('resize', listener);\n },\n};\n\nconst testCliHelp = `Midscene Test: run native cases/steps Test projects.\n\nUsage:\n midscene-test [file.yaml | directory] [options]\n midscene-test --config <midscene.config.ts> [options]\n midscene-test nodes [directory] [--config midscene.config.ts]\n midscene-test create --help\n midscene-test model verify Check model connectivity and Midscene compatibility\n\nOptions:\n --config <path> Native TypeScript or JavaScript Test config\n --project <name> Select a native execution Project (repeatable)\n --result-dir <path> Store Test result files in this directory\n --reporter <default|verbose> Concise Case results or full step diagnostics\n --help, -h Show this help\n --version Show the package version\n\nLegacy tasks/flow YAML and its CLI options belong to the midscene command.\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 runNodesCommand = async (\n options: ParsedTestArgs,\n io: TestCliIO,\n): Promise<void> => {\n const cwd = resolve(options.cwd);\n assertDirectory(cwd, 'Test working directory');\n const projectRoot = options.projectRoot\n ? resolve(cwd, options.projectRoot)\n : undefined;\n if (projectRoot) assertDirectory(projectRoot, 'Test project directory');\n\n const configSearchRoot = projectRoot ?? cwd;\n const configPath = options.configPath\n ? resolve(configSearchRoot, options.configPath)\n : discoverTestConfig(configSearchRoot);\n if (options.configPath && /\\.ya?ml$/i.test(configPath!)) {\n throw new Error(\n `midscene-test nodes --config only accepts a native TypeScript or JavaScript project config: ${configPath}.`,\n );\n }\n if (options.configPath && (!configPath || !existsSync(configPath))) {\n throw new Error(`Midscene config does not exist: ${configPath}`);\n }\n\n const project = await loadTestProject(configPath);\n const projectName = options.projectNames?.[0];\n const selectedProjects = projectName\n ? project.projects.filter((candidate) => candidate.name === projectName)\n : project.projects;\n if (selectedProjects.length === 0) {\n throw new Error(`Unknown Midscene project: ${projectName}`);\n }\n // Check every Project before writing, including when only one is selected.\n const filenames = new Map<string, string>();\n const owners = new Map<string, string>();\n for (const executionProject of project.projects) {\n const safeName = executionProject.name\n .normalize('NFC')\n // biome-ignore lint/suspicious/noControlCharactersInRegex: filenames cannot contain control characters.\n .replace(/[<>:\"/\\\\|?*\\u0000-\\u001f]/g, '-')\n .replace(/[. ]+$/g, '-');\n const filename = project.hasExplicitProjects\n ? `midscene-node-spec.${safeName}.md`\n : 'midscene-node-spec.md';\n const key = filename.toLowerCase();\n const owner = owners.get(key);\n if (owner !== undefined) {\n throw new Error(\n `Projects \"${owner}\" and \"${executionProject.name}\" generate the same Node Spec filename: ${filename}`,\n );\n }\n owners.set(key, executionProject.name);\n filenames.set(executionProject.name, filename);\n }\n const specs = selectedProjects.map((executionProject) => {\n const nodes = sortNodesForSpec(executionProject.nodes.definitions());\n const document = renderNodeSpec(nodes, {\n configPath: configPath\n ? relative(configSearchRoot, configPath).split(sep).join('/')\n : undefined,\n projects: [\n {\n name: executionProject.name,\n files: executionProject.files ?? DEFAULT_TEST_FILE_SELECTION,\n },\n ],\n });\n return { executionProject, nodes, document };\n });\n for (const { executionProject, nodes, document } of specs) {\n for (const warning of document.warnings) {\n io.error(`midscene-test nodes: ${warning}`);\n }\n const specPath = resolve(\n configSearchRoot,\n filenames.get(executionProject.name)!,\n );\n writeFileSync(specPath, document.markdown);\n if (project.hasExplicitProjects || projectName) {\n io.log(`Execution Project: ${executionProject.name}`);\n }\n io.log(`Registered Nodes (${nodes.length}):`);\n if (nodes.length === 0) {\n io.log('No nodes are registered by the current Test Project.');\n }\n for (const node of nodes) {\n io.log(\n `- ${node.name}: ${node.description?.trim() || 'Description not declared.'}`,\n );\n }\n io.log(`\\nNode Spec generated: ${specPath}`);\n }\n};\n\nconst reportTestProjectResult = (\n result: TestProjectRunResult,\n io: TestCliIO,\n reporter: TerminalReporter,\n projectRoot: string,\n infrastructureErrors: readonly unknown[] = result.errors ?? [],\n): number => {\n reporter.finish(result);\n const reportedErrors = new Set<Error>();\n const reportError = (\n source: string,\n error: unknown,\n sourcePath?: string,\n context?: CliFailureContext,\n ): void => {\n if (error instanceof Error && reportedErrors.has(error)) return;\n reporter.failure(source, error, { projectRoot, ...context });\n const annotation = githubFailureAnnotation(\n source,\n formatConciseError(error),\n sourcePath ? resolve(projectRoot, sourcePath) : undefined,\n );\n if (annotation) io.log(annotation);\n // Infrastructure failures carry raw errors that can also be causes of\n // the contextual errors already printed from the execution result.\n const pending = [error];\n while (pending.length > 0) {\n const current = pending.pop();\n if (!(current instanceof Error) || reportedErrors.has(current)) continue;\n reportedErrors.add(current);\n pending.push(current.cause);\n if (current instanceof AggregateError) pending.push(...current.errors);\n }\n };\n for (const failure of result.collectionErrors) {\n reportError(\n `${failure.projectName}/${failure.sourcePath}`,\n failure.error,\n failure.sourcePath,\n {\n projectName: failure.projectName,\n sourcePath: failure.sourcePath,\n phase: 'collection',\n },\n );\n }\n const finalDocuments = new Map(\n result.documents.map((document) => [document.documentId, document]),\n );\n const documentContext = (\n projectName: string,\n documentId: string,\n sourcePath: string,\n ) => {\n const project = result.projects.find(\n (project) => project.name === projectName,\n );\n const document = finalDocuments.get(documentId);\n const plan =\n document?.plan ??\n project?.plans?.find((plan) => plan.documentId === documentId);\n const fileIndex = document?.attemptIndex ?? 0;\n return {\n plan,\n projectName,\n sourcePath,\n ...(plan?.retry.scope === 'document'\n ? {\n fileAttempt: {\n index: fileIndex,\n total: Math.max(fileIndex + 1, plan.retry.count + 1),\n },\n }\n : {}),\n caseAttempts:\n plan?.retry.scope === 'document'\n ? 1\n : (plan?.retry.count ?? project?.retry ?? 0) + 1,\n };\n };\n const finalCases = new Map(\n result.cases.map((outcome) => [outcome.caseId, outcome]),\n );\n for (const outcome of finalCases.values()) {\n if (outcome.status !== 'failed' || !outcome.run) continue;\n const run = outcome.run;\n const source = `${run.projectName}/${run.sourcePath} / ${run.name}`;\n const { caseAttempts, plan, ...scope } = documentContext(\n run.projectName,\n outcome.documentId,\n run.sourcePath,\n );\n const context: CliFailureContext = {\n ...scope,\n caseName: run.name,\n attempt: {\n index: run.attemptIndex,\n total: Math.max(caseAttempts, run.attemptIndex + 1),\n },\n };\n const casePlan = plan?.cases.find((item) => item.caseId === outcome.caseId);\n for (const [phase, steps] of [\n ['beforeEach', run.beforeEach],\n ['steps', run.steps],\n ['afterEach', run.afterEach],\n ] as const) {\n for (const step of steps) {\n if (step.error) {\n reportError(\n `${source} / ${step.phase}[${step.stepIndex + 1}] ${step.node}${run.attemptIndex ? ` (failed after ${run.attemptIndex + 1} attempts)` : ''}`,\n step.error,\n run.sourcePath,\n { ...context, step, stepCount: casePlan?.[phase].length },\n );\n }\n }\n }\n for (const [phase, errors] of [\n ['execution', run.executionErrors],\n ['teardown', run.teardownErrors],\n ] as const) {\n for (const error of errors ?? [])\n reportError(source, error, run.sourcePath, { ...context, phase });\n }\n }\n for (const document of finalDocuments.values()) {\n if (document.status !== 'failed') continue;\n const source = `${document.projectName}/${document.sourcePath}`;\n const {\n caseAttempts: _,\n plan,\n ...context\n } = documentContext(\n document.projectName,\n document.documentId,\n document.sourcePath,\n );\n for (const [phase, steps] of [\n ['beforeAll', document.beforeAll],\n ['afterAll', document.afterAll],\n ] as const) {\n for (const step of steps) {\n if (step.error) {\n reportError(\n `${source} / ${step.phase}[${step.stepIndex + 1}] ${step.node}`,\n step.error,\n document.sourcePath,\n { ...context, step, stepCount: plan?.[phase].length },\n );\n }\n }\n }\n for (const [phase, errors] of [\n ['execution', document.executionErrors],\n ['teardown', document.teardownErrors],\n ] as const) {\n for (const error of errors ?? [])\n reportError(source, error, document.sourcePath, { ...context, phase });\n }\n for (const failure of document.hostErrors ?? []) {\n reportError(\n `${source} / host ${failure.phase}`,\n failure.error,\n document.sourcePath,\n { ...context, phase: `host ${failure.phase}` },\n );\n }\n }\n for (const project of result.projects) {\n if (project.lifecycle?.setupError) {\n reportError(\n `${project.name} / setup`,\n project.lifecycle.setupError,\n undefined,\n { projectName: project.name, phase: 'setup' },\n );\n }\n for (const error of project.lifecycle?.teardownErrors ?? []) {\n reportError(`${project.name} / teardown`, error, undefined, {\n projectName: project.name,\n phase: 'teardown',\n });\n }\n }\n for (const error of infrastructureErrors) {\n reportError('infrastructure', error);\n }\n reporter.summary(result);\n if (reporter.mode === 'verbose') io.log(`Results: ${result.resultDir}`);\n io.log(`Summary: ${result.summaryPath}`);\n if (result.markdownPath && reporter.mode === 'verbose')\n io.log(`Markdown: ${result.markdownPath}`);\n if (result.reportPath) io.log(`Report: ${result.reportPath}`);\n writeGitHubSummary(result);\n return result.exitCode;\n};\n\nexport async function runTestCli(\n args: string[],\n io: TestCliIO = defaultCliIO,\n): Promise<number> {\n try {\n if (args[0] === 'model') {\n const { runModelCommand } = await import('./model-command');\n return runModelCommand(args, undefined, {\n stdout: io.log,\n stderr: io.error,\n });\n }\n if (args[0] === 'create') {\n const { runCreateCommand } = await import('./create-command');\n await runCreateCommand(args.slice(1), io);\n return 0;\n }\n if (args.includes('--help') || args.includes('-h')) {\n io.log(testCliHelp);\n return 0;\n }\n if (args.includes('--version')) {\n io.log(version);\n return 0;\n }\n const options = parseTestCliArgs(args);\n if (options.command === 'nodes') {\n await runNodesCommand(options, io);\n return 0;\n }\n const reporter = new TerminalReporter(io, options.reporter);\n const restoreOutput =\n io === defaultCliIO && io.isTTY && options.reporter !== 'verbose'\n ? captureTerminalOutput((message, write) =>\n reporter.output(message, write),\n )\n : undefined;\n const projectRoot = realpathSync(\n options.projectRoot &&\n existsSync(options.projectRoot) &&\n statSync(options.projectRoot).isFile()\n ? dirname(options.projectRoot)\n : (options.projectRoot ?? options.cwd),\n );\n try {\n return await runWithConsoleLogHandler(\n (entry) => reporter.console(entry),\n async () => {\n let result: TestProjectRunResult;\n try {\n result = await runTestProject({\n ...options,\n onProgress: (message) => reporter.progress(message),\n onEvent: (event) => reporter.event(event),\n });\n } catch (error) {\n if (!(error instanceof WorkflowExecutionFailure)) throw error;\n reportTestProjectResult(\n error.result,\n io,\n reporter,\n projectRoot,\n error.errors,\n );\n return 1;\n }\n return reportTestProjectResult(result, io, reporter, projectRoot);\n },\n );\n } finally {\n try {\n reporter.dispose();\n } finally {\n restoreOutput?.();\n }\n }\n } catch (error) {\n io.error(formatCliError(error));\n return 1;\n }\n}\n","import { runTestCli } from './cli/test-command';\n\nvoid runTestCli(process.argv.slice(2)).then((exitCode) => {\n process.exitCode = exitCode;\n});\n"],"names":["__webpack_require__","exports","definition","key","Object","chunkId","Promise","promises","obj","prop","installedChunks","installChunk","data","__rspack_esm_ids","__webpack_modules__","__rspack_esm_runtime","moduleId","i","installedChunkData","promise","e","resolve","formatCliError","error","inspect","formatConciseError","seen","Set","messages","current","Error","undefined","AggregateError","nested","String","oneLine","value","stripVTControlCharacters","shorten","length","text","firstBusinessFrame","projectRoot","frames","visit","depth","detail","Array","child","line","location","match","file","fileURLToPath","normalized","chosen","paths","win32","isAbsolute","relative","display","formatFailureInput","input","sanitizeReportValue","render","sanitizeReportError","Number","entries","rows","formatFailureDetails","source","context","title","body","field","label","step","phase","index","position","Math","attempt","safeMessage","lines","frame","configuredModelNames","env","globalConfigManager","defaultName","models","Map","intent","name","intents","CliModelUsage","trace","sumTestRunReportMetrics","formatTokenCount","formatModelUsage","metrics","formatTokenUsage","model","usage","includeCached","state","count","graphemes","Intl","SYNC_START","SYNC_END","truncateTerminalLine","columns","stringWidth","output","width","segment","TerminalProgress","occupiedRows","sum","previousHeight","availableRows","footer","budget","overflow","visible","blanks","content","erase","message","write","io","formatWarningScope","scope","parts","errorMessage","status","firstLine","formatWarning","entry","details","arg","prefix","warningKey","JSON","formatDuration","ms","identity","project","path","projectPhaseLabel","fileStatus","cases","item","TerminalReporter","Date","kind","attached","owner","id","task","projectName","sourcePath","total","event","c","version","process","setInterval","outcome","info","previous","existing","now","setTimeout","items","failed","passed","notRun","Boolean","durationMs","result","files","projects","a","b","group","mode","groups","isActive","running","completed","recent","hidden","hiddenFailures","fileIndex","lastFile","stem","outcomes","failedCases","tasks","shown","children","hiddenCases","last","hint","retry","summary","suffix","tail","documentRetries","attempts","retries","duration","symbol","stats","caseIndex","projectFiles","documents","document","resultSources","plan","selected","padding","left","badge","warning","failure","block","clearInterval","clearTimeout","chalk","escapeData","escapeProperty","markdown","char","githubFailureAnnotation","workspace","sep","writeGitHubSummary","appendFileSync","GENERATED_COMMENT","sortNodesForSpec","nodes","priority","right","escapeTableCell","renderNodeOverview","heading","node","renderWorkflowLocations","sections","patterns","pattern","projectLabel","excludes","WORKFLOW_STEP_CONTRACT","sortJsonValue","assertSelfContainedRefs","toJsonSchema","schema","z","renderNode","warnings","renderNodeSpec","sortedNodes","captureTerminalOutput","streams","cleanups","stream","original","forward","intercepted","chunk","encoding","callback","done","Buffer","accepted","cleanup","NodeRegistry","CoreNodeRegistry","projectIdFromIndex","getDefaultExport","loaded","absolutePath","defaultExport","TypeError","isRecord","rejectUnknownKeys","allowedKeys","allowed","unknown","isAbsolutePattern","validatePatterns","allowEmptyInclude","validateTestFileSelection","include","exclude","validateTagList","tag","validateTagSelection","assertJsonValue","deepFreezeJson","validateVariables","validateSetup","validatePositiveInteger","fallback","validateNonNegativeInteger","validateConcurrency","validateFileConcurrency","maxConcurrentFiles","fileSetup","validateExecutionProjects","defaultSetup","defaultFileSetup","globalNodes","test","setup","names","candidate","localNodes","globalFileLimit","validateTestOptions","hasExplicitProjects","limit","validateOutputPath","validateOutput","validateTestProjectDefinition","resolvedProjects","assertSupportedConfig","extension","canRetryWithCjsLoader","errorCode","SyntaxError","loadTestProject","configPath","pathToFileURL","tsImport","dirname","tsxRequire","fallbackError","createCaseInvocationId","projectId","invocationIndex","createHash","createDocumentInvocationId","normalizeSteps","coreNormalizeSteps","parseWorkflowSource","stack","sensitiveNodes","sensitiveValues","redactedPaths","sourceOffset","parsed","load","JSON_SCHEMA","isReportSecretKey","ranges","offset","redacted","range","leading","trailing","sanitizeReportText","part","start","end","interpolationExpression","exactEnvExpression","exactProjectExpression","missingVariable","options","WorkflowParseError","projectVariable","environmentVariable","interpolationValue","resolveString","exactEnv","exactProject","_match","environmentName","resolveWorkflowVariables","isMapping","NativeWorkflowFormatError","actualFormat","allowedSet","createCaseId","createWorkflowDocumentId","collectWorkflowDocument","snapshot","readFileSync","sourceYaml","format","classifyWorkflowDocumentFormat","resolveStepVariables","stepIndex","normalizeLifecycle","resolved","lifecycle","ids","tags","steps","caseId","writeJson","mkdir","writeFile","WorkflowPublicationError","writeTestRunPlan","runDir","join","toPosix","caseAttemptResultPath","documentId","workflowDocumentResultPath","collectionErrorPath","writeWorkflowDocumentResult","_documentRunId","persistedResult","writeCaseAttemptResult","attemptId","writeCollectionError","collectionError","relativeToSummary","summaryPath","target","errorJson","writeTestProjectRunResult","fact","CONFIG_NAMES","CONFIG_PREFIX","ALWAYS_IGNORED_PATTERNS","DEFAULT_TEST_FILE_SELECTION","discoverResolvedTestFiles","selection","root","globSync","relativeA","relativeB","discoverTestConfig","candidates","readdirSync","supported","unsupported","asCollectionError","WorkflowError","matchesTags","filterDocumentCases","filtered","selectProjects","requested","known","prepareProject","defaultTimeoutMs","platform","fileSelection","prerequisiteFile","mainFiles","occurrences","sources","collectionErrors","invocations","plans","filteredCaseCount","collected","buildTestRunReportPlan","projectContext","signal","onTeardown","invocation","prerequisiteSource","prerequisiteDocument","padDatePart","createTestRunId","date","uuid","randomUUID","timestamp","assertDirectory","existsSync","statSync","resolveRunInput","cwd","inputPath","singleFile","cliProjectRoot","prepareTestRun","startedAt","runId","resultDir","reportDir","mkdirSync","hasFormatMismatch","seconds","href","from","encodeURIComponent","renderTestResultMarkdown","dump","infrastructure","errors","recordSteps","testCase","diagnostic","emptyIndex","writeTestResultMarkdown","buildTestRunReportDump","scopeNodeConsole","ctx","runWithConsoleLogScope","teardown","stepPosition","formatStep","formatStepResult","indent","continuation","caseHasFatalError","isFatalDeviceError","isResourceRecoveryError","documentHasFatalError","isSharedResourceFailure","pending","executeDocumentInvocation","sinks","isProjectResourceFailure","documentRetry","documentSetup","runDocumentAttempts","documentAttemptIndex","execution","runWorkflowDocument","run","collectedCase","WorkflowExecutionFailure","partial","resourceOnly","host","decideRetry","publicationError","owners","cleanupPending","operationPending","cleanupFailed","decision","final","runPreparedFiles","states","prepared","nextProject","resourcesUnresolved","occupied","occupiedProjects","cleanupQueue","release","wake","stopped","invalid","unresolved","finalizeProject","reason","order","finishProject","releaseProject","waitForScopeOperations","getResourceCleanupCompletion","admit","cleanupOnly","fileResourcesPending","createProjectRuntime","setMaxListeners","getPendingScopeOperations","changed","job","settled","admission","trackResourceOperation","createOperationJournal","writeFileSync","asNotRun","summarize","healthCases","documentAttemptByRunId","latestById","health","calculateTestRunHealth","notRunSuite","runPreparedTestProject","preparedProjects","progress","totalDocuments","totalCases","totalErrors","effectiveConcurrency","journal","rootController","AbortController","handleSignal","sigint","sigterm","failedCaseCount","bailReached","shutdownDeadline","beginShutdown","addFailedCases","teardownTimeoutMs","hasInfrastructureError","infrastructureErrors","recordInfrastructureError","runInfrastructureCallback","stopObservingOperations","observeResourceOperations","getDebug","announceProject","projectIndex","buildProjectResult","projectFailed","buildSkippedProjectResult","projectResults","completedProjectResults","endedAt","asExecutionError","completedResult","reportIndex","publish","operation","writeSummary","writeReport","reportPath","TestRunReportAssembler","collectTestRunReportSources","warn","publication","markdownPath","runTestProject","parseTestCliArgs","args","command","commandOffset","projectNames","reporter","token","equal","inlineValue","defaultCliIO","console","listener","testCliHelp","runNodesCommand","configSearchRoot","selectedProjects","filenames","executionProject","safeName","filename","specs","specPath","reportTestProjectResult","reportedErrors","reportError","annotation","finalDocuments","documentContext","finalCases","caseAttempts","casePlan","_","runTestCli","runModelCommand","runCreateCommand","restoreOutput","realpathSync","runWithConsoleLogHandler","exitCode"],"mappings":"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"}